{"version":3,"file":"governance.mjs","names":[],"sources":["../../../src/tools/governance.ts"],"sourcesContent":["/**\n * Governance Tool — DAO proposals, voting, and delegation.\n *\n * Actions:\n *   proposals       — List proposals from a Snapshot space or on-chain Governor\n *   vote            — Vote on a proposal (Snapshot off-chain or on-chain Governor)\n *   delegate        — Delegate voting power to another address\n *   voting_power    — Check voting power on a space/protocol\n *   spaces          — Search Snapshot spaces\n *   governors       — List known on-chain Governors\n *\n * Uses Snapshot GraphQL API (off-chain) and direct Governor contract calls (on-chain).\n */\n\nimport { Type } from '@sinclair/typebox';\nimport { stringEnum, jsonResult, errorResult, readStringParam, readNumberParam } from '../lib/tool-helpers.js';\nimport {\n  getWalletState,\n  requireWalletClient,\n  requirePublicClient,\n} from '../services/walletconnect-service.js';\nimport { getGovernanceService } from '../services/governance-service.js';\nimport { resolveAddressOrEns, isEnsName } from '../lib/ens-resolver.js';\n\nconst ACTIONS = ['proposals', 'vote', 'delegate', 'voting_power', 'spaces', 'governors'] as const;\n\nconst GovernanceSchema = Type.Object({\n  action: stringEnum(ACTIONS, {\n    description:\n      'proposals: list active proposals. vote: cast vote. delegate: delegate voting power. ' +\n      'voting_power: check VP. spaces: search Snapshot spaces. governors: list on-chain Governors.',\n  }),\n  space: Type.Optional(Type.String({\n    description: 'Snapshot space ID (e.g. \"aave.eth\", \"uniswap\") or on-chain governor name.',\n  })),\n  proposal_id: Type.Optional(Type.String({\n    description: 'Proposal ID for voting or viewing. Required for vote.',\n  })),\n  choice: Type.Optional(Type.String({\n    description: 'Vote choice: \"for\" (1), \"against\" (0), \"abstain\" (2), or choice number. Required for vote.',\n  })),\n  reason: Type.Optional(Type.String({\n    description: 'Reason for vote (on-chain voting with reason).',\n  })),\n  delegatee: Type.Optional(Type.String({\n    description: 'Address or ENS to delegate voting power to. Required for delegate.',\n  })),\n  state: Type.Optional(Type.String({\n    description: 'Filter proposals by state: \"active\" (default), \"closed\", \"all\".',\n  })),\n  address: Type.Optional(Type.String({\n    description: 'Address to check voting power for. Defaults to connected wallet.',\n  })),\n  limit: Type.Optional(Type.Number({\n    description: 'Max proposals to return. Default: 10.',\n  })),\n});\n\nexport function createGovernanceTool() {\n  return {\n    name: 'governance',\n    label: 'Governance',\n    ownerOnly: true,\n    description:\n      'DAO governance: browse proposals, vote (Snapshot off-chain or on-chain Governor), ' +\n      'delegate voting power, and check VP. Supports Snapshot spaces (Aave, Uniswap, ENS, etc.) ' +\n      'and on-chain Governors on Ethereum and Base.',\n    parameters: GovernanceSchema,\n    execute: async (_toolCallId: string, args: unknown) => {\n      const params = args as Record<string, unknown>;\n      const action = readStringParam(params, 'action', { required: true })!;\n\n      switch (action) {\n        case 'proposals':\n          return handleProposals(params);\n        case 'vote':\n          return handleVote(params);\n        case 'delegate':\n          return handleDelegate(params);\n        case 'voting_power':\n          return handleVotingPower(params);\n        case 'spaces':\n          return handleSpaces(params);\n        case 'governors':\n          return handleGovernors();\n        default:\n          return errorResult(`Unknown action: ${action}. Use: proposals, vote, delegate, voting_power, spaces, governors`);\n      }\n    },\n  };\n}\n\n// ── Action Handlers ─────────────────────────────────────────────────────\n\nasync function handleProposals(params: Record<string, unknown>) {\n  const space = readStringParam(params, 'space');\n  if (!space) {\n    return errorResult('space is required (e.g. \"aave.eth\", \"uniswap\", \"ens.eth\").');\n  }\n\n  const stateInput = readStringParam(params, 'state') ?? 'active';\n  const state = stateInput === 'all' ? 'all' : stateInput === 'closed' ? 'closed' : 'active';\n  const limit = readNumberParam(params, 'limit') ?? 10;\n\n  try {\n    const service = getGovernanceService();\n    const proposals = await service.getSnapshotProposals(space, state as any, limit);\n\n    if (proposals.length === 0) {\n      return jsonResult({\n        space,\n        state,\n        proposals: [],\n        message: `No ${state} proposals found for ${space}.`,\n      });\n    }\n\n    return jsonResult({\n      space,\n      state,\n      count: proposals.length,\n      proposals: proposals.map(p => ({\n        id: p.id,\n        title: p.title,\n        state: p.state,\n        choices: p.choices,\n        scores: p.scores.map(s => Math.round(s)),\n        totalVotes: p.votes,\n        quorum: p.quorum,\n        endsAt: new Date(p.end * 1000).toISOString(),\n        link: p.link,\n      })),\n    });\n  } catch (err) {\n    return errorResult(`Proposals fetch failed: ${err instanceof Error ? err.message : String(err)}`);\n  }\n}\n\nasync function handleVote(params: Record<string, unknown>) {\n  const space = readStringParam(params, 'space');\n  const proposalId = readStringParam(params, 'proposal_id');\n  const choiceInput = readStringParam(params, 'choice');\n  if (!space || !proposalId || !choiceInput) {\n    return errorResult('space, proposal_id, and choice are required for voting.');\n  }\n\n  const state = getWalletState();\n  if (!state.connected || !state.address) {\n    return errorResult('No wallet connected. Connect a wallet first.');\n  }\n\n  // Check if this is an on-chain Governor vote\n  const service = getGovernanceService();\n  const governor = service.resolveGovernor(space);\n\n  if (governor) {\n    return handleOnchainVote(governor, proposalId, choiceInput, params);\n  }\n\n  // Off-chain Snapshot vote — return guidance (signing happens in Snapshot UI)\n  const choice = resolveChoice(choiceInput);\n  return jsonResult({\n    status: 'snapshot_vote',\n    space,\n    proposalId,\n    choice: choiceInput,\n    choiceIndex: choice,\n    voter: state.address,\n    note: 'Snapshot votes require signing via the Snapshot UI. ' +\n      `Visit: https://snapshot.org/#/${space}/proposal/${proposalId}`,\n    tip: 'For on-chain Governor votes (Uniswap, Aave, ENS), this tool submits the transaction directly.',\n  });\n}\n\nasync function handleOnchainVote(\n  governor: { address: `0x${string}`; chainId: number; name: string },\n  proposalId: string,\n  choiceInput: string,\n  params: Record<string, unknown>,\n) {\n  // Validate proposalId is a valid integer before BigInt conversion\n  if (!/^\\d+$/.test(proposalId)) {\n    return errorResult(`Invalid proposal_id \"${proposalId}\". Must be a numeric ID.`);\n  }\n\n  const support = resolveChoice(choiceInput);\n  const reason = readStringParam(params, 'reason') ?? undefined;\n\n  try {\n    const service = getGovernanceService();\n    const wallet = requireWalletClient();\n    const publicClient = requirePublicClient();\n\n    const result = await service.castVote(\n      governor.address as `0x${string}`,\n      BigInt(proposalId),\n      support,\n      reason,\n      wallet,\n      publicClient,\n    );\n\n    const supportLabel = support === 1 ? 'For' : support === 0 ? 'Against' : 'Abstain';\n\n    return jsonResult({\n      status: 'success',\n      action: 'vote',\n      governor: governor.name,\n      governorAddress: governor.address,\n      proposalId,\n      support: supportLabel,\n      reason: reason ?? undefined,\n      txHash: result.hash,\n    });\n  } catch (err) {\n    return errorResult(`On-chain vote failed: ${err instanceof Error ? err.message : String(err)}`);\n  }\n}\n\nasync function handleDelegate(params: Record<string, unknown>) {\n  const space = readStringParam(params, 'space');\n  const delegateeInput = readStringParam(params, 'delegatee');\n  if (!space || !delegateeInput) {\n    return errorResult('space (governor name) and delegatee (address or ENS) are required for delegate.');\n  }\n\n  const state = getWalletState();\n  if (!state.connected || !state.address) {\n    return errorResult('No wallet connected. Connect a wallet first.');\n  }\n\n  const service = getGovernanceService();\n  const governor = service.resolveGovernor(space);\n  if (!governor || !governor.tokenAddress) {\n    return errorResult(\n      `Unknown governor or no governance token for \"${space}\". ` +\n      `Known governors: ${service.getKnownGovernors().map(g => g.id).join(', ')}`,\n    );\n  }\n\n  try {\n    // Resolve ENS if needed\n    let delegatee = delegateeInput;\n    if (isEnsName(delegateeInput)) {\n      const publicClient = requirePublicClient();\n      const resolved = await resolveAddressOrEns(delegateeInput, publicClient);\n      delegatee = resolved.address;\n    }\n\n    const wallet = requireWalletClient();\n    const publicClient = requirePublicClient();\n\n    const result = await service.delegate(\n      governor.tokenAddress as `0x${string}`,\n      delegatee as `0x${string}`,\n      wallet,\n      publicClient,\n    );\n\n    return jsonResult({\n      status: 'success',\n      action: 'delegate',\n      governor: governor.name,\n      token: governor.tokenAddress,\n      delegatee,\n      ensName: isEnsName(delegateeInput) ? delegateeInput : undefined,\n      txHash: result.hash,\n    });\n  } catch (err) {\n    return errorResult(`Delegate failed: ${err instanceof Error ? err.message : String(err)}`);\n  }\n}\n\nasync function handleVotingPower(params: Record<string, unknown>) {\n  const space = readStringParam(params, 'space');\n  if (!space) {\n    return errorResult('space is required (Snapshot space ID or on-chain governor name).');\n  }\n\n  const state = getWalletState();\n  const addressInput = readStringParam(params, 'address') ?? state.address;\n  if (!addressInput) {\n    return errorResult('No wallet connected and no address provided.');\n  }\n\n  const service = getGovernanceService();\n  const governor = service.resolveGovernor(space);\n\n  try {\n    if (governor && governor.tokenAddress) {\n      // On-chain voting power\n      const publicClient = requirePublicClient();\n      const vp = await service.getOnchainVotingPower(\n        governor.tokenAddress as `0x${string}`,\n        addressInput as `0x${string}`,\n        publicClient,\n      );\n\n      return jsonResult({\n        type: 'on-chain',\n        governor: governor.name,\n        address: addressInput,\n        votingPower: vp.votes,\n        tokenBalance: vp.balance,\n        delegatedTo: vp.delegate,\n        note: vp.votes === '0.0' && vp.balance !== '0.0'\n          ? 'You hold tokens but have not delegated. Delegate to yourself to activate voting power.'\n          : undefined,\n      });\n    }\n\n    // Snapshot voting power\n    const vp = await service.getSnapshotVotingPower(space, addressInput);\n    return jsonResult({\n      type: 'snapshot',\n      space,\n      address: addressInput,\n      votingPower: vp.vp,\n      vpByStrategy: vp.vpByStrategy,\n      vpState: vp.vpState,\n    });\n  } catch (err) {\n    return errorResult(`Voting power check failed: ${err instanceof Error ? err.message : String(err)}`);\n  }\n}\n\nasync function handleSpaces(params: Record<string, unknown>) {\n  // Return well-known Snapshot spaces + on-chain governors\n  const service = getGovernanceService();\n  const governors = service.getKnownGovernors();\n\n  const snapshotSpaces = [\n    { id: 'aave.eth', name: 'Aave', members: '~230K' },\n    { id: 'uniswapgovernance.eth', name: 'Uniswap', members: '~330K' },\n    { id: 'ens.eth', name: 'ENS', members: '~80K' },\n    { id: 'safe.eth', name: 'Safe', members: '~50K' },\n    { id: 'opcollective.eth', name: 'Optimism Collective', members: '~135K' },\n    { id: 'arbitrumfoundation.eth', name: 'Arbitrum', members: '~680K' },\n    { id: 'lido-snapshot.eth', name: 'Lido', members: '~25K' },\n    { id: 'balancer.eth', name: 'Balancer', members: '~20K' },\n    { id: 'gitcoindao.eth', name: 'Gitcoin', members: '~20K' },\n    { id: 'aerodromefi.eth', name: 'Aerodrome (Base)', members: '~10K' },\n  ];\n\n  return jsonResult({\n    snapshotSpaces: snapshotSpaces.map(s => ({\n      id: s.id,\n      name: s.name,\n      members: s.members,\n      link: `https://snapshot.org/#/${s.id}`,\n    })),\n    onchainGovernors: governors.map(g => ({\n      id: g.id,\n      name: g.name,\n      address: g.address,\n      chain: g.chainId === 1 ? 'ethereum' : g.chainId === 8453 ? 'base' : String(g.chainId),\n    })),\n    tip: 'Use action=proposals with a space ID to see active proposals.',\n  });\n}\n\nfunction handleGovernors() {\n  const service = getGovernanceService();\n  const governors = service.getKnownGovernors();\n\n  return jsonResult({\n    governors: governors.map(g => ({\n      id: g.id,\n      name: g.name,\n      address: g.address,\n      chain: g.chainId === 1 ? 'ethereum' : g.chainId === 8453 ? 'base' : String(g.chainId),\n    })),\n    note: 'On-chain Governors support direct voting and delegation via this tool.',\n  });\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────\n\nfunction resolveChoice(input: string): number {\n  const lower = input.toLowerCase();\n  if (lower === 'for' || lower === 'yes' || lower === '1') return 1;\n  if (lower === 'against' || lower === 'no' || lower === '0') return 0;\n  if (lower === 'abstain' || lower === '2') return 2;\n  // Try parsing as number (for Snapshot multi-choice)\n  const num = parseInt(input, 10);\n  return isNaN(num) ? 1 : num;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0BA,MAAM,mBAAmB,KAAK,OAAO;CACnC,QAAQ,WAHM;EAAC;EAAa;EAAQ;EAAY;EAAgB;EAAU;EAAY,EAG1D,EAC1B,aACE,mLAEH,CAAC;CACF,OAAO,KAAK,SAAS,KAAK,OAAO,EAC/B,aAAa,iFACd,CAAC,CAAC;CACH,aAAa,KAAK,SAAS,KAAK,OAAO,EACrC,aAAa,yDACd,CAAC,CAAC;CACH,QAAQ,KAAK,SAAS,KAAK,OAAO,EAChC,aAAa,oGACd,CAAC,CAAC;CACH,QAAQ,KAAK,SAAS,KAAK,OAAO,EAChC,aAAa,kDACd,CAAC,CAAC;CACH,WAAW,KAAK,SAAS,KAAK,OAAO,EACnC,aAAa,sEACd,CAAC,CAAC;CACH,OAAO,KAAK,SAAS,KAAK,OAAO,EAC/B,aAAa,yEACd,CAAC,CAAC;CACH,SAAS,KAAK,SAAS,KAAK,OAAO,EACjC,aAAa,oEACd,CAAC,CAAC;CACH,OAAO,KAAK,SAAS,KAAK,OAAO,EAC/B,aAAa,yCACd,CAAC,CAAC;CACJ,CAAC;AAEF,SAAgB,uBAAuB;AACrC,QAAO;EACL,MAAM;EACN,OAAO;EACP,WAAW;EACX,aACE;EAGF,YAAY;EACZ,SAAS,OAAO,aAAqB,SAAkB;GACrD,MAAM,SAAS;GACf,MAAM,SAAS,gBAAgB,QAAQ,UAAU,EAAE,UAAU,MAAM,CAAC;AAEpE,WAAQ,QAAR;IACE,KAAK,YACH,QAAO,gBAAgB,OAAO;IAChC,KAAK,OACH,QAAO,WAAW,OAAO;IAC3B,KAAK,WACH,QAAO,eAAe,OAAO;IAC/B,KAAK,eACH,QAAO,kBAAkB,OAAO;IAClC,KAAK,SACH,QAAO,aAAa,OAAO;IAC7B,KAAK,YACH,QAAO,iBAAiB;IAC1B,QACE,QAAO,YAAY,mBAAmB,OAAO,mEAAmE;;;EAGvH;;AAKH,eAAe,gBAAgB,QAAiC;CAC9D,MAAM,QAAQ,gBAAgB,QAAQ,QAAQ;AAC9C,KAAI,CAAC,MACH,QAAO,YAAY,mEAA6D;CAGlF,MAAM,aAAa,gBAAgB,QAAQ,QAAQ,IAAI;CACvD,MAAM,QAAQ,eAAe,QAAQ,QAAQ,eAAe,WAAW,WAAW;CAClF,MAAM,QAAQ,gBAAgB,QAAQ,QAAQ,IAAI;AAElD,KAAI;EAEF,MAAM,YAAY,MADF,sBAAsB,CACN,qBAAqB,OAAO,OAAc,MAAM;AAEhF,MAAI,UAAU,WAAW,EACvB,QAAO,WAAW;GAChB;GACA;GACA,WAAW,EAAE;GACb,SAAS,MAAM,MAAM,uBAAuB,MAAM;GACnD,CAAC;AAGJ,SAAO,WAAW;GAChB;GACA;GACA,OAAO,UAAU;GACjB,WAAW,UAAU,KAAI,OAAM;IAC7B,IAAI,EAAE;IACN,OAAO,EAAE;IACT,OAAO,EAAE;IACT,SAAS,EAAE;IACX,QAAQ,EAAE,OAAO,KAAI,MAAK,KAAK,MAAM,EAAE,CAAC;IACxC,YAAY,EAAE;IACd,QAAQ,EAAE;IACV,yBAAQ,IAAI,KAAK,EAAE,MAAM,IAAK,EAAC,aAAa;IAC5C,MAAM,EAAE;IACT,EAAE;GACJ,CAAC;UACK,KAAK;AACZ,SAAO,YAAY,2BAA2B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;;AAIrG,eAAe,WAAW,QAAiC;CACzD,MAAM,QAAQ,gBAAgB,QAAQ,QAAQ;CAC9C,MAAM,aAAa,gBAAgB,QAAQ,cAAc;CACzD,MAAM,cAAc,gBAAgB,QAAQ,SAAS;AACrD,KAAI,CAAC,SAAS,CAAC,cAAc,CAAC,YAC5B,QAAO,YAAY,0DAA0D;CAG/E,MAAM,QAAQ,gBAAgB;AAC9B,KAAI,CAAC,MAAM,aAAa,CAAC,MAAM,QAC7B,QAAO,YAAY,+CAA+C;CAKpE,MAAM,WADU,sBAAsB,CACb,gBAAgB,MAAM;AAE/C,KAAI,SACF,QAAO,kBAAkB,UAAU,YAAY,aAAa,OAAO;AAKrE,QAAO,WAAW;EAChB,QAAQ;EACR;EACA;EACA,QAAQ;EACR,aANa,cAAc,YAAY;EAOvC,OAAO,MAAM;EACb,MAAM,qFAC6B,MAAM,YAAY;EACrD,KAAK;EACN,CAAC;;AAGJ,eAAe,kBACb,UACA,YACA,aACA,QACA;AAEA,KAAI,CAAC,QAAQ,KAAK,WAAW,CAC3B,QAAO,YAAY,wBAAwB,WAAW,0BAA0B;CAGlF,MAAM,UAAU,cAAc,YAAY;CAC1C,MAAM,SAAS,gBAAgB,QAAQ,SAAS,IAAI,KAAA;AAEpD,KAAI;EACF,MAAM,UAAU,sBAAsB;EACtC,MAAM,SAAS,qBAAqB;EACpC,MAAM,eAAe,qBAAqB;EAE1C,MAAM,SAAS,MAAM,QAAQ,SAC3B,SAAS,SACT,OAAO,WAAW,EAClB,SACA,QACA,QACA,aACD;EAED,MAAM,eAAe,YAAY,IAAI,QAAQ,YAAY,IAAI,YAAY;AAEzE,SAAO,WAAW;GAChB,QAAQ;GACR,QAAQ;GACR,UAAU,SAAS;GACnB,iBAAiB,SAAS;GAC1B;GACA,SAAS;GACT,QAAQ,UAAU,KAAA;GAClB,QAAQ,OAAO;GAChB,CAAC;UACK,KAAK;AACZ,SAAO,YAAY,yBAAyB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;;AAInG,eAAe,eAAe,QAAiC;CAC7D,MAAM,QAAQ,gBAAgB,QAAQ,QAAQ;CAC9C,MAAM,iBAAiB,gBAAgB,QAAQ,YAAY;AAC3D,KAAI,CAAC,SAAS,CAAC,eACb,QAAO,YAAY,kFAAkF;CAGvG,MAAM,QAAQ,gBAAgB;AAC9B,KAAI,CAAC,MAAM,aAAa,CAAC,MAAM,QAC7B,QAAO,YAAY,+CAA+C;CAGpE,MAAM,UAAU,sBAAsB;CACtC,MAAM,WAAW,QAAQ,gBAAgB,MAAM;AAC/C,KAAI,CAAC,YAAY,CAAC,SAAS,aACzB,QAAO,YACL,gDAAgD,MAAM,sBAClC,QAAQ,mBAAmB,CAAC,KAAI,MAAK,EAAE,GAAG,CAAC,KAAK,KAAK,GAC1E;AAGH,KAAI;EAEF,IAAI,YAAY;AAChB,MAAI,UAAU,eAAe,CAG3B,cADiB,MAAM,oBAAoB,gBADtB,qBAAqB,CAC8B,EACnD;EAGvB,MAAM,SAAS,qBAAqB;EACpC,MAAM,eAAe,qBAAqB;EAE1C,MAAM,SAAS,MAAM,QAAQ,SAC3B,SAAS,cACT,WACA,QACA,aACD;AAED,SAAO,WAAW;GAChB,QAAQ;GACR,QAAQ;GACR,UAAU,SAAS;GACnB,OAAO,SAAS;GAChB;GACA,SAAS,UAAU,eAAe,GAAG,iBAAiB,KAAA;GACtD,QAAQ,OAAO;GAChB,CAAC;UACK,KAAK;AACZ,SAAO,YAAY,oBAAoB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;;AAI9F,eAAe,kBAAkB,QAAiC;CAChE,MAAM,QAAQ,gBAAgB,QAAQ,QAAQ;AAC9C,KAAI,CAAC,MACH,QAAO,YAAY,mEAAmE;CAGxF,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,eAAe,gBAAgB,QAAQ,UAAU,IAAI,MAAM;AACjE,KAAI,CAAC,aACH,QAAO,YAAY,+CAA+C;CAGpE,MAAM,UAAU,sBAAsB;CACtC,MAAM,WAAW,QAAQ,gBAAgB,MAAM;AAE/C,KAAI;AACF,MAAI,YAAY,SAAS,cAAc;GAErC,MAAM,eAAe,qBAAqB;GAC1C,MAAM,KAAK,MAAM,QAAQ,sBACvB,SAAS,cACT,cACA,aACD;AAED,UAAO,WAAW;IAChB,MAAM;IACN,UAAU,SAAS;IACnB,SAAS;IACT,aAAa,GAAG;IAChB,cAAc,GAAG;IACjB,aAAa,GAAG;IAChB,MAAM,GAAG,UAAU,SAAS,GAAG,YAAY,QACvC,2FACA,KAAA;IACL,CAAC;;EAIJ,MAAM,KAAK,MAAM,QAAQ,uBAAuB,OAAO,aAAa;AACpE,SAAO,WAAW;GAChB,MAAM;GACN;GACA,SAAS;GACT,aAAa,GAAG;GAChB,cAAc,GAAG;GACjB,SAAS,GAAG;GACb,CAAC;UACK,KAAK;AACZ,SAAO,YAAY,8BAA8B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;;AAIxG,eAAe,aAAa,QAAiC;CAG3D,MAAM,YADU,sBAAsB,CACZ,mBAAmB;AAe7C,QAAO,WAAW;EAChB,gBAdqB;GACrB;IAAE,IAAI;IAAY,MAAM;IAAQ,SAAS;IAAS;GAClD;IAAE,IAAI;IAAyB,MAAM;IAAW,SAAS;IAAS;GAClE;IAAE,IAAI;IAAW,MAAM;IAAO,SAAS;IAAQ;GAC/C;IAAE,IAAI;IAAY,MAAM;IAAQ,SAAS;IAAQ;GACjD;IAAE,IAAI;IAAoB,MAAM;IAAuB,SAAS;IAAS;GACzE;IAAE,IAAI;IAA0B,MAAM;IAAY,SAAS;IAAS;GACpE;IAAE,IAAI;IAAqB,MAAM;IAAQ,SAAS;IAAQ;GAC1D;IAAE,IAAI;IAAgB,MAAM;IAAY,SAAS;IAAQ;GACzD;IAAE,IAAI;IAAkB,MAAM;IAAW,SAAS;IAAQ;GAC1D;IAAE,IAAI;IAAmB,MAAM;IAAoB,SAAS;IAAQ;GACrE,CAGgC,KAAI,OAAM;GACvC,IAAI,EAAE;GACN,MAAM,EAAE;GACR,SAAS,EAAE;GACX,MAAM,0BAA0B,EAAE;GACnC,EAAE;EACH,kBAAkB,UAAU,KAAI,OAAM;GACpC,IAAI,EAAE;GACN,MAAM,EAAE;GACR,SAAS,EAAE;GACX,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,YAAY,OAAO,SAAS,OAAO,EAAE,QAAQ;GACtF,EAAE;EACH,KAAK;EACN,CAAC;;AAGJ,SAAS,kBAAkB;AAIzB,QAAO,WAAW;EAChB,WAJc,sBAAsB,CACZ,mBAAmB,CAGtB,KAAI,OAAM;GAC7B,IAAI,EAAE;GACN,MAAM,EAAE;GACR,SAAS,EAAE;GACX,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,YAAY,OAAO,SAAS,OAAO,EAAE,QAAQ;GACtF,EAAE;EACH,MAAM;EACP,CAAC;;AAKJ,SAAS,cAAc,OAAuB;CAC5C,MAAM,QAAQ,MAAM,aAAa;AACjC,KAAI,UAAU,SAAS,UAAU,SAAS,UAAU,IAAK,QAAO;AAChE,KAAI,UAAU,aAAa,UAAU,QAAQ,UAAU,IAAK,QAAO;AACnE,KAAI,UAAU,aAAa,UAAU,IAAK,QAAO;CAEjD,MAAM,MAAM,SAAS,OAAO,GAAG;AAC/B,QAAO,MAAM,IAAI,GAAG,IAAI"}