@net-protocol/cli 0.1.48 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.mjs +436 -28
- package/dist/cli/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/cli/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/shared.ts","../../src/shared/urls.ts","../../src/commands/storage/storage/check.ts","../../src/commands/storage/utils.ts","../../src/commands/storage/transactions/prep.ts","../../src/commands/storage/transactions/filter.ts","../../src/commands/storage/transactions/send.ts","../../src/commands/storage/core/upload.ts","../../src/commands/storage/relay/recheckStorage.ts","../../src/commands/storage/relay/retry.ts","../../src/commands/storage/core/uploadRelay.ts","../../src/commands/storage/core/preview.ts","../../src/shared/output.ts","../../src/commands/storage/core/read.ts","../../src/shared/encode.ts","../../src/commands/storage/core/encode.ts","../../src/commands/storage/index.ts","../../src/shared/client.ts","../../src/commands/message/send.ts","../../src/commands/message/types.ts","../../src/commands/message/read.ts","../../src/commands/message/count.ts","../../src/commands/message/index.ts","../../src/commands/chains/index.ts","../../src/commands/info/index.ts","../../src/commands/token/deploy.ts","../../src/commands/token/info.ts","../../src/commands/token/index.ts","../../src/commands/profile/get.ts","../../src/commands/profile/set-picture.ts","../../src/commands/profile/utils.ts","../../src/commands/profile/set-username.ts","../../src/commands/profile/set-bio.ts","../../src/commands/profile/set-display-name.ts","../../src/commands/profile/set-token-address.ts","../../src/commands/profile/set-canvas.ts","../../src/commands/profile/get-canvas.ts","../../src/commands/profile/set-css.ts","../../src/commands/profile/get-css.ts","../../src/commands/profile/css-prompt.ts","../../src/commands/profile/index.ts","../../src/commands/bazaar/format.ts","../../src/commands/bazaar/list-listings.ts","../../src/commands/bazaar/list-offers.ts","../../src/commands/bazaar/list-sales.ts","../../src/commands/bazaar/create-listing.ts","../../src/commands/bazaar/create-offer.ts","../../src/commands/bazaar/submit-listing.ts","../../src/commands/bazaar/submit-offer.ts","../../src/commands/bazaar/buy-listing.ts","../../src/commands/bazaar/accept-offer.ts","../../src/commands/bazaar/owned-nfts.ts","../../src/commands/bazaar/list-erc20-listings.ts","../../src/commands/bazaar/list-erc20-offers.ts","../../src/commands/bazaar/create-erc20-listing.ts","../../src/commands/bazaar/create-erc20-offer.ts","../../src/commands/bazaar/submit-erc20-listing.ts","../../src/commands/bazaar/submit-erc20-offer.ts","../../src/commands/bazaar/buy-erc20-listing.ts","../../src/commands/bazaar/accept-erc20-offer.ts","../../src/commands/bazaar/index.ts","../../src/commands/feed/format.ts","../../src/commands/feed/list.ts","../../src/shared/state.ts","../../src/commands/feed/types.ts","../../src/commands/feed/read.ts","../../src/shared/wallet.ts","../../src/shared/messageIndex.ts","../../src/commands/feed/post.ts","../../src/shared/postId.ts","../../src/commands/feed/comment-write.ts","../../src/commands/feed/comment-read.ts","../../src/commands/feed/register.ts","../../src/commands/feed/replies.ts","../../src/commands/feed/posts.ts","../../src/commands/feed/confirm.ts","../../src/commands/feed/config.ts","../../src/commands/feed/history.ts","../../src/commands/feed/register-agent.ts","../../src/commands/feed/list-agents.ts","../../src/commands/feed/verify-claim.ts","../../src/commands/feed/index.ts","../../src/commands/upvote/upvote-token.ts","../../src/commands/upvote/get-upvotes.ts","../../src/commands/upvote/upvote-user.ts","../../src/commands/upvote/get-user-upvotes.ts","../../src/commands/upvote/index.ts","../../src/commands/agent/shared.ts","../../src/commands/agent/create.ts","../../src/commands/agent/list.ts","../../src/commands/agent/update.ts","../../src/commands/agent/hide.ts","../../src/commands/agent/run.ts","../../src/commands/agent/info.ts","../../src/commands/agent/dm.ts","../../src/commands/agent/session.ts","../../src/commands/agent/index.ts","../../src/commands/relay/index.ts","../../src/utils/update-check.ts","../../src/cli/index.ts"],"names":["chalk","base","hexToString","STORAGE_CONTRACT","StorageClient","getStorageKeyBytes","retryFailedTransactionsPackage","failedIndexes","backendWalletAddress","readFileSync","detectFileTypeFromBase64","base64ToDataUri","privateKeyToAccount","getPublicClient","getChainRpcUrls","createWalletClient","http","getBaseDataSuffix","shouldSuggestXmlStorage","stringToHex","fs","program","storageUrl","NetClient","Command","executeEncodeOnly","encodeFunctionData","isNetrSupportedChain","NetrClient","PROFILE_METADATA_STORAGE_KEY","parseProfileMetadata","publicActions","getProfileMetadataStorageArgs","fs2","PROFILE_CANVAS_STORAGE_KEY","CHUNKED_STORAGE_CONTRACT","path2","fs3","path3","fs4","PROFILE_CSS_STORAGE_KEY","path4","fs5","DEMO_THEMES","BazaarClient","parseEther","executeKeylessMode","bigintReplacer","calldata","stripFeedPrefix","path5","senderNote","getNetContract","client","txConfig","MAX_MESSAGE_LENGTH","resolve","decodeEventLog","PURE_ALPHA_STRATEGY","UNIV234_POOLS_STRATEGY","DYNAMIC_SPLIT_STRATEGY","getTokenScoreKey","NULL_ADDRESS","UserUpvoteClient","formatEther","createRelaySession","isAddress","AgentClient","NET_API_URL","createPublicClient","fundBackendWallet","RELAY_ACCESS_KEY","checkBackendWalletBalance","join","homedir","existsSync","mkdirSync","writeFileSync","require"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAM,gBAAA,GAAmB,IAAA;AAKhC,SAAS,mBAAmB,WAAA,EAA8B;AACxD,EAAA,MAAM,OAAA,GACJ,WAAA,KACC,OAAA,CAAQ,GAAA,CAAI,YAAA,GACT,SAAS,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,EAAE,CAAA,GACrC,MAAA,CAAA;AAEN,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,CAAQ,KAAA;AAAA,MACNA,MAAA,CAAM,GAAA;AAAA,QACJ;AAAA;AACF,KACF;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAO,OAAA;AACT;AAMA,SAAS,sBAAsB,WAAA,EAA8B;AAC3D,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GACJ,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,QAAQ,GAAA,CAAI,YAAA;AAE9C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,QAAA,CAAS,YAAY,EAAE,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,gBAAA;AACT;AAKA,SAAS,UAAU,WAAA,EAA0C;AAC3D,EAAA,OAAO,WAAA,IAAe,QAAQ,GAAA,CAAI,WAAA;AACpC;AAMA,SAAS,6BAA6B,WAAA,EAA0C;AAC9E,EAAA,OAAO,WAAA,IAAe,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,QAAQ,GAAA,CAAI,WAAA;AACnE;AAQO,SAAS,kBAAA,CACd,OAAA,EAKA,kBAAA,GAAqB,KAAA,EACN;AACf,EAAA,MAAM,aACJ,OAAA,CAAQ,UAAA,IACR,QAAQ,GAAA,CAAI,eAAA,IACZ,QAAQ,GAAA,CAAI,WAAA;AAEd,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,cAAA,GAAiB,qBACnB,sEAAA,GACA,EAAA;AACJ,IAAA,OAAA,CAAQ,KAAA;AAAA,MACNA,MAAA,CAAM,GAAA;AAAA,QACJ,qHAAqH,cAAc,CAAA;AAAA;AACrI,KACF;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,IAAK,UAAA,CAAW,WAAW,EAAA,EAAI;AAC5D,IAAA,OAAA,CAAQ,KAAA;AAAA,MACNA,MAAA,CAAM,GAAA;AAAA,QACJ;AAAA;AACF,KACF;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACNA,MAAA,CAAM,MAAA;AAAA,QACJ;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,OAAA,EAAS,kBAAA,CAAmB,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC3C,MAAA,EAAQ,SAAA,CAAU,OAAA,CAAQ,MAAM;AAAA,GAClC;AACF;AAMO,SAAS,qBAAqB,OAAA,EAGjB;AAClB,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,kBAAA,CAAmB,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC3C,MAAA,EAAQ,SAAA,CAAU,OAAA,CAAQ,MAAM;AAAA,GAClC;AACF;AAOO,SAAS,gCAAgC,OAAA,EAG5B;AAClB,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,qBAAA,CAAsB,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC9C,MAAA,EAAQ,4BAAA,CAA6B,OAAA,CAAQ,MAAM;AAAA,GACrD;AACF;AAOO,SAAS,6BAAA,CACd,OAAA,EAKA,kBAAA,GAAqB,KAAA,EACN;AACf,EAAA,MAAM,UAAA,GACJ,OAAA,CAAQ,UAAA,IACR,OAAA,CAAQ,GAAA,CAAI,uBACZ,OAAA,CAAQ,GAAA,CAAI,eAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,WAAA;AAEd,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,cAAA,GAAiB,qBACnB,sEAAA,GACA,EAAA;AACJ,IAAA,OAAA,CAAQ,KAAA;AAAA,MACNA,MAAA,CAAM,GAAA;AAAA,QACJ,6HAA6H,cAAc,CAAA;AAAA;AAC7I,KACF;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,IAAK,UAAA,CAAW,WAAW,EAAA,EAAI;AAC5D,IAAA,OAAA,CAAQ,KAAA;AAAA,MACNA,MAAA,CAAM,GAAA;AAAA,QACJ;AAAA;AACF,KACF;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,OAAA,CAAQ,IAAA;AAAA,MACNA,MAAA,CAAM,MAAA;AAAA,QACJ;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,OAAA,EAAS,qBAAA,CAAsB,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC9C,MAAA,EAAQ,4BAAA,CAA6B,OAAA,CAAQ,MAAM;AAAA,GACrD;AACF;ACtLA,IAAM,YAAA,GAAe,yBAAA;AACrB,IAAM,YAAA,GAAe,sBAAA;AAEd,SAAS,UAAU,OAAA,EAAgC;AACxD,EAAA,OAAO,YAAA,CAAa,EAAE,OAAA,EAAS,CAAA,IAAK,IAAA;AACtC;AAMA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAChC,EAAA,OAAO,MAAM,UAAA,CAAW,OAAO,IAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AACtD;AAMO,SAAS,OAAA,CAAQ,SAAiB,QAAA,EAAiC;AACxE,EAAA,MAAM,IAAA,GAAO,UAAU,OAAO,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,OAAO,GAAG,YAAY,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA,EAAI,eAAA,CAAgB,QAAQ,CAAC,CAAA,CAAA;AACtE;AAKO,SAAS,SAAA,CAAU,SAAiB,OAAA,EAAgC;AACzE,EAAA,MAAM,IAAA,GAAO,UAAU,OAAO,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,OAAO,GAAG,YAAY,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,aAAa,CAAA,CAAA;AAClE;AAKO,SAAS,UAAA,CAAW,SAAiB,OAAA,EAAgC;AAC1E,EAAA,MAAM,IAAA,GAAO,UAAU,OAAO,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,OAAO,GAAG,YAAY,CAAA,aAAA,EAAgB,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,aAAa,CAAA,CAAA;AACrE;AAgBO,SAAS,QAAA,CACd,SACA,YAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,UAAU,OAAO,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,OAAO,GAAG,YAAY,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA,EAAI,YAAA,CAAa,aAAa,CAAA,CAAA;AACxE;AAgCO,SAAS,UAAA,CACd,OAAA,EACA,eAAA,EACA,GAAA,EACQ;AACR,EAAA,OAAO,CAAA,EAAG,YAAY,CAAA,KAAA,EAAQ,OAAO,iBAAiB,eAAA,CAAgB,WAAA,EAAa,CAAA,CAAA,EAAI,sBAAA;AAAA,IACrF;AAAA,GACD,CAAA,CAAA;AACH;AAEO,SAAS,aAAA,CACd,SACA,MAAA,EACe;AACf,EAAA,MAAMC,KAAAA,GAAO,qBAAA,CAAsB,EAAE,OAAA,EAAS,CAAA,EAAG,GAAA;AACjD,EAAA,IAAI,CAACA,OAAM,OAAO,IAAA;AAClB,EAAA,OAAO,CAAA,EAAGA,KAAI,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA;AAC7B;AAEO,SAAS,kBAAA,CACd,SACA,OAAA,EACe;AACf,EAAA,MAAMA,KAAAA,GAAO,qBAAA,CAAsB,EAAE,OAAA,EAAS,CAAA,EAAG,GAAA;AACjD,EAAA,IAAI,CAACA,OAAM,OAAO,IAAA;AAClB,EAAA,OAAO,CAAA,EAAGA,KAAI,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA;AACnC;AAUO,SAAS,qBAAqB,MAAA,EAAwB;AAC3D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAChC,EAAA,IAAI,KAAA,KAAU,IAAI,OAAO,MAAA;AACzB,EAAA,OAAO,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA;AAC7D;AA2BO,SAAS,aAAA,CACd,SACA,IAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,UAAU,OAAO,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,EAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,IAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,EAC9C,WAAW,IAAA,CAAK,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,cAAc,IAAA,EAAM;AACxD,IAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAC,CAAA;AAC/C,IAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EAC7C,WAAW,IAAA,CAAK,IAAA,IAAQ,IAAA,IAAQ,IAAA,CAAK,aAAa,IAAA,EAAM;AACtD,IAAA,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA;AAC1C,IAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EAC5C,CAAA,MAAO;AACL,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,oBAAA,CAAqB,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,GAAG,YAAY,CAAA,UAAA,EAAa,IAAI,CAAA,MAAA,EAAS,MAAA,CAAO,UAAU,CAAA,CAAA;AACnE;AClMA,eAAsB,yBACpB,MAAA,EAC6B;AAC7B,EAAA,MAAM,EAAE,aAAA,EAAe,UAAA,EAAY,eAAA,EAAiB,iBAAgB,GAAI,MAAA;AACxE,EAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,GAAA,CAAI;AAAA,IACvC,GAAA,EAAK,UAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EACzB;AAGA,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,QAAA,CAAS,KAAsB,CAAA;AACjE,EAAA,MAAM,UAAU,aAAA,KAAkB,eAAA;AAElC,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ;AACjC;AAOA,eAAsB,0BACpB,MAAA,EACkB;AAClB,EAAA,MAAM,EAAE,aAAA,EAAe,WAAA,EAAa,eAAA,EAAgB,GAAI,MAAA;AACxD,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,kBAAA,CAAmB;AAAA,IAClD,GAAA,EAAK,WAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,OAAO,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,UAAA,GAAa,CAAA;AAC5C;AAQA,eAAsB,oBACpB,MAAA,EACsB;AACtB,EAAA,MAAM,EAAE,aAAA,EAAe,aAAA,EAAe,eAAA,EAAgB,GAAI,MAAA;AAC1D,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAGjC,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,aAAA,CAAc,GAAA,CAAI,OAAO,IAAA,KAAS;AAChC,MAAA,MAAM,MAAA,GAAS,MAAM,yBAAA,CAA0B;AAAA,QAC7C,aAAA;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb;AAAA,OACD,CAAA;AACD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,QAAA,CAAS,IAAI,IAAI,CAAA;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,GACH;AAEA,EAAA,OAAO,QAAA;AACT;AAOA,eAAsB,uBACpB,MAAA,EAC6B;AAC7B,EAAA,MAAM,EAAE,aAAA,EAAe,UAAA,EAAY,eAAA,EAAiB,kBAAiB,GAAI,MAAA;AACzE,EAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,GAAA,CAAI;AAAA,IACvC,GAAA,EAAK,UAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EACzB;AAEA,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,QAAA,CAAS,KAAsB,CAAA;AAClE,EAAA,MAAM,UAAU,cAAA,KAAmB,gBAAA;AAEnC,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ;AACjC;;;ACrFO,SAAS,iBACd,IAAA,EACoB;AACpB,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,SAAS,UAAA,EAAY;AACtD,IAAA,OAAO,CAAC,KAAK,IAAA,CAAK,GAAA,EAAK,KAAK,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,EACxD,CAAA,MAAO;AACL,IAAA,OAAO,CAAC,KAAK,IAAA,CAAK,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,EAC1D;AACF;AAKO,SAAS,+BAAA,CACd,IACA,IAAA,EACwB;AACxB,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,UAAA,EAAY;AAC5C,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,GAAA,EAAK,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,QACd,IAAA,EAAM,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,QACf,KAAA,EAAO,EAAA,CAAG,IAAA,CAAK,CAAC;AAAA;AAClB,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,QACf,IAAA,EAAM,EAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,QACf,MAAA,EAAQ,EAAA,CAAG,IAAA,CAAK,CAAC;AAAA;AACnB,KACF;AAAA,EACF;AACF;AAyBO,SAAS,kBAAA,CACd,eAAA,EACA,OAAA,EACA,UAAA,EACoB;AACpB,EAAA,IAAI,CAAC,iBAAiB,OAAO,MAAA;AAC7B,EAAA,OAAO,UAAA,CAAW,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAA;AACxD;AAOA,eAAsB,uBACpB,MAAA,EACkB;AAClB,EAAA,MAAM,EAAE,aAAA,EAAe,EAAA,EAAI,eAAA,EAAgB,GAAI,MAAA;AAC/C,EAAA,IAAI,EAAA,CAAG,SAAS,QAAA,EAAU;AAExB,IAAA,IAAI,EAAA,CAAG,SAAA,CAAU,IAAA,KAAS,QAAA,EAAU;AAClC,MAAA,MAAM,eAAA,GAAkBC,WAAAA,CAAY,EAAA,CAAG,SAAA,CAAU,KAAK,KAAK,CAAA;AAC3D,MAAA,MAAM,KAAA,GAAQ,MAAM,wBAAA,CAAyB;AAAA,QAC3C,aAAA;AAAA,QACA,YAAY,EAAA,CAAG,EAAA;AAAA,QACf,eAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,OAAO,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,OAAA,KAAY,IAAA;AAAA,IAC3C;AAAA,EACF,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,SAAA,EAAW;AAEhC,IAAA,OAAO,MAAM,yBAAA,CAA0B;AAAA,MACrC,aAAA;AAAA,MACA,aAAa,EAAA,CAAG,EAAA;AAAA,MAChB;AAAA,KACD,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,UAAA,EAAY;AAEjC,IAAA,IAAI,EAAA,CAAG,SAAA,CAAU,IAAA,KAAS,UAAA,EAAY;AACpC,MAAA,MAAM,gBAAA,GAAmBA,WAAAA,CAAY,EAAA,CAAG,SAAA,CAAU,KAAK,KAAK,CAAA;AAC5D,MAAA,MAAM,KAAA,GAAQ,MAAM,sBAAA,CAAuB;AAAA,QACzC,aAAA;AAAA,QACA,YAAY,EAAA,CAAG,EAAA;AAAA,QACf,eAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,OAAO,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,OAAA,KAAY,IAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;;;ACnHO,SAAS,+BAAA,CACd,aAAA,EACA,IAAA,EACA,kBAAA,EACmB;AAGnB,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAEtC,EAAA,MAAM,WAAA,GAAc,cAAc,UAAA,CAAW;AAAA,IAC3C,GAAA,EAAK,kBAAA;AAAA,IACL,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,IAAA,EAAM,QAAA;AAAA,IACN;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,GAAA;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAQO,SAAS,8BACd,MAAA,EACqB;AACrB,EAAA,MAAM,EAAE,aAAA,EAAe,UAAA,EAAY,MAAM,OAAA,EAAS,eAAA,EAAiB,WAAU,GAAI,MAAA;AACjF,EAAA,MAAM,eAAA,GAAkB,mBAAmB,UAAU,CAAA;AAKrD,EAAA,MAAM,MAAA,GAAS,cAAc,iBAAA,CAAkB;AAAA,IAC7C,IAAA,EAAM,OAAA;AAAA,IACN,eAAA;AAAA,IACA,UAAA;AAAA;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,wBAAA,EAA0B,IAAA;AAAA;AAAA,IAC1B;AAAA,GACD,CAAA;AAID,EAAA,MAAM,YAAA,GAAoC,OAAO,kBAAA,CAAmB,GAAA;AAAA,IAClE,CAAC,IAAI,KAAA,KAAU;AACb,MAAA,IAAI,UAAU,CAAA,EAAG;AAEf,QAAA,MAAM,SAAA,GAAY,+BAAA,CAAgC,EAAA,EAAI,UAAU,CAAA;AAChE,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,eAAA;AAAA,UACJ,IAAA,EAAM,UAAA;AAAA,UACN,WAAA,EAAa,EAAA;AAAA,UACb;AAAA,SACF;AAAA,MACF,CAAA,MAAO;AAGL,QAAA,MAAM,SAAA,GAAY,+BAAA,CAAgC,EAAA,EAAI,SAAS,CAAA;AAC/D,QAAA,IAAI,SAAA,CAAU,SAAS,SAAA,EAAW;AAChC,UAAA,MAAM,WAAA,GAAc,UAAU,IAAA,CAAK,IAAA;AACnC,UAAA,OAAO;AAAA,YACL,EAAA,EAAI,WAAA;AAAA,YACJ,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa,EAAA;AAAA,YACb;AAAA,WACF;AAAA,QACF;AAEA,QAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,YAAA;AACT;AC1EA,eAAsB,2BACpB,MAAA,EAIC;AACD,EAAA,MAAM,EAAE,aAAA,EAAe,YAAA,EAAc,eAAA,EAAiB,iBAAgB,GACpE,MAAA;AACF,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,MAAM,UAA+B,EAAC;AAEtC,EAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,IAAA,IAAI,MAAA,GAAS,KAAA;AAEb,IAAA,IAAI,EAAA,CAAG,SAAS,QAAA,EAAU;AAExB,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAM,KAAA,GAAQ,MAAM,wBAAA,CAAyB;AAAA,UAC3C,aAAA;AAAA,UACA,YAAY,EAAA,CAAG,EAAA;AAAA,UACf,eAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,OAAA,KAAY,IAAA;AAAA,MAC7C,CAAA,MAAO;AAEL,QAAA,IAAI,EAAA,CAAG,SAAA,CAAU,IAAA,KAAS,QAAA,EAAU;AAClC,UAAA,MAAM,aAAA,GAAgBA,WAAAA,CAAY,EAAA,CAAG,SAAA,CAAU,KAAK,KAAK,CAAA;AACzD,UAAA,MAAM,KAAA,GAAQ,MAAM,wBAAA,CAAyB;AAAA,YAC3C,aAAA;AAAA,YACA,YAAY,EAAA,CAAG,EAAA;AAAA,YACf,eAAA;AAAA,YACA,eAAA,EAAiB;AAAA,WAClB,CAAA;AACD,UAAA,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,OAAA,KAAY,IAAA;AAAA,QAC7C;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,SAAA,EAAW;AAEhC,MAAA,MAAA,GAAS,MAAM,yBAAA,CAA0B;AAAA,QACvC,aAAA;AAAA,QACA,aAAa,EAAA,CAAG,EAAA;AAAA,QAChB;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,UAAA,EAAY;AAGjC,MAAA,IAAI,EAAA,CAAG,SAAA,CAAU,IAAA,KAAS,UAAA,EAAY;AACpC,QAAA,MAAM,gBAAA,GAAmBA,WAAAA,CAAY,EAAA,CAAG,SAAA,CAAU,KAAK,KAAK,CAAA;AAC5D,QAAA,MAAM,KAAA,GAAQ,MAAM,sBAAA,CAAuB;AAAA,UACzC,aAAA;AAAA,UACA,YAAY,EAAA,CAAG,EAAA;AAAA,UACf,eAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,OAAA,KAAY,IAAA;AAAA,MAC7C;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAQ,OAAA,EAAQ;AAC3B;AAQA,eAAsB,6BACpB,MAAA,EAIC;AACD,EAAA,MAAM,EAAE,aAAA,EAAe,YAAA,EAAc,eAAA,EAAgB,GAAI,MAAA;AAGzD,EAAA,MAAM,aAAa,YAAA,CAAa,IAAA;AAAA,IAC9B,CAAC,OAAO,EAAA,CAAG,EAAA,CAAG,aAAY,KAAMC,kBAAA,CAAiB,QAAQ,WAAA;AAAY,GACvE;AACA,EAAA,MAAM,WAAW,YAAA,CAAa,MAAA;AAAA,IAC5B,CAAC,OAAO,EAAA,CAAG,EAAA,CAAG,aAAY,KAAM,wBAAA,CAAyB,QAAQ,WAAA;AAAY,GAC/E;AAGA,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,MAAM,SAAA,GAAY,+BAAA,CAAgC,EAAA,EAAI,SAAS,CAAA;AAC/D,IAAA,IAAI,SAAA,CAAU,SAAS,SAAA,EAAW;AAChC,MAAA,aAAA,CAAc,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,MAAM,UAAoC,EAAC;AAG3C,EAAA,MAAM,cAAA,GAAiB,MAAM,mBAAA,CAAoB;AAAA,IAC/C,aAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,MAAM,SAAA,GAAY,+BAAA,CAAgC,EAAA,EAAI,SAAS,CAAA;AAC/D,IAAA,IAAI,SAAA,CAAU,SAAS,SAAA,EAAW;AAChC,MAAA,MAAM,IAAA,GAAO,UAAU,IAAA,CAAK,IAAA;AAC5B,MAAA,IAAI,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAG;AAC9B,QAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,MAAA,GAAS,CAAA,IAAK,aAAA,CAAc,KAAA;AAAA,MAAM,CAAC,IAAA,KACtE,cAAA,CAAe,GAAA,CAAI,IAAI;AAAA,KACzB;AACA,IAAA,IAAI,cAAA,EAAgB;AAElB,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,+BAAA,CAAgC,UAAA,EAAY,UAAU,CAAA;AACxE,QAAA,IAAI,SAAA,CAAU,SAAS,UAAA,EAAY;AACjC,UAAA,MAAM,gBAAA,GAAmBD,WAAAA,CAAY,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAC3D,UAAA,MAAM,KAAA,GAAQ,MAAM,sBAAA,CAAuB;AAAA,YACzC,aAAA;AAAA,YACE,UAAA,EAAY,UAAU,IAAA,CAAK,GAAA;AAAA,YAC7B,eAAA;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,OAAA,EAAS;AACjC,YAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,UACzB,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,QAAQ,UAAU,CAAA;AAAA,UAC3B;AAAA,QACA;AAAA,MACF,CAAA,CAAA,MAAQ;AAEN,QAAA,MAAA,CAAO,QAAQ,UAAU,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,QAAQ,UAAU,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAQ,OAAA,EAAQ;AAC3B;AClKO,SAAS,iCACd,MAAA,EAKA;AACA,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,MAAA,EAAO,GAAI,MAAA;AACxC,EAAA,MAAM,OAAA,GAAU,oBAAoB,UAAU,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,EAAE,OAAA,EAAS,QAAQ,CAAA;AAGxD,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,EAAE,OAAA,EAAS,QAAQ,CAAA;AAGnD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,GACvB,WAAA,CAAY;AAAA,IACV,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,aAAa,KAAA,CAAM,IAAA;AAAA,IACzB,cAAA,EAAgB,aAAa,KAAA,CAAM,cAAA;AAAA,IACnC,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACzB,MAAA,EAAQ,EAAE,IAAA,EAAM,OAAA;AAAQ,KAC1B;AAAA,IACA,cAAA,EAAgB,aAAa,KAAA,CAAM;AAAA,GACpC,IACD,WAAA,CAAY;AAAA,IACV,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,SAAS,OAAO,CAAA,CAAA;AAAA,IACtB,gBAAgB,EAAE,IAAA,EAAM,SAAS,MAAA,EAAQ,KAAA,EAAO,UAAU,EAAA,EAAG;AAAA,IAC7D,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACzB,MAAA,EAAQ,EAAE,IAAA,EAAM,OAAA;AAAQ;AAC1B,GACD,CAAA;AAEL,EAAA,MAAM,eAAe,kBAAA,CAAmB;AAAA,IACtC,OAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAW,IAAA,EAAK;AAAA,IAChB,UAAA,EAAY,kBAAkB,OAAO;AAAA,GACtC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAiB,OAAA,CAAQ;AAAA,GAC3B;AACF;AAOA,eAAsB,gCACpB,MAAA,EACuB;AACvB,EAAA,MAAM,EAAE,aAAA,EAAe,YAAA,EAAc,YAAA,EAAc,YAAA,EAAc,iBAAgB,GAAI,MAAA;AACrF,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,SAAA;AACJ,EAAA,MAAM,gBAA0B,EAAC;AAEjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,EAAA,GAAK,aAAa,CAAC,CAAA;AAEzB,IAAA,IAAI;AAGF,MAAA,MAAM,MAAA,GAAS,MAAM,sBAAA,CAAuB;AAAA,QAC1C,aAAA;AAAA,QACA,EAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,0BAAA,EAAmB,IAAI,CAAC,CAAA,CAAA,EACtB,aAAa,MACf,CAAA,2BAAA,EAA8B,GAAG,EAAE,CAAA;AAAA,SACrC;AACA,QAAA,OAAA,EAAA;AACA,QAAA;AAAA,MACF;AAGA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,8BAAA,EAA0B,IAAI,CAAC,CAAA,CAAA,EAAI,aAAa,MAAM,CAAA,EAAA,EAAK,GAAG,EAAE,CAAA;AAAA,OAClE;AAEA,MAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,EAAA,CAAG,SAAS,CAAA;AAC1C,MAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,aAAA,CAAc;AAAA,QAC5C,SAAS,YAAA,CAAa,OAAA;AAAA,QACtB,OAAA,EAAS,GAAG,WAAA,CAAY,EAAA;AAAA,QACxB,GAAA,EAAK,GAAG,WAAA,CAAY,GAAA;AAAA,QACpB,YAAA,EAAc,GAAG,WAAA,CAAY,YAAA;AAAA,QAC7B,IAAA;AAAA,QACA,KAAA,EAAO,GAAG,WAAA,CAAY,KAAA;AAAA,QACtB,KAAA,EAAO;AAAA,OACR,CAAA;AAGD,MAAA,MAAM,UAAU,MAAM,YAAA,CAAa,yBAAA,CAA0B,EAAE,MAAM,CAAA;AACrE,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,sBAAiB,CAAA,GAAI,CAAC,uBACpB,OAAA,CAAQ,WACV,WAAW,IAAI,CAAA,CAAA;AAAA,OACjB;AAEA,MAAA,IAAA,EAAA;AACA,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,WACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,OAAA,CAAQ,MAAM,CAAA,mBAAA,EAAiB,CAAA,GAAI,CAAC,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAE,CAAA;AAC1D,MAAA,aAAA,CAAc,KAAK,QAAQ,CAAA;AAC3B,MAAA,MAAA,EAAA;AAAA,IAEF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,KAAW,CAAA;AAAA,IACpB,SAAS,OAAA,GAAU,CAAA;AAAA,IACnB,gBAAA,EAAkB,IAAA;AAAA,IAClB,mBAAA,EAAqB,OAAA;AAAA,IACrB,kBAAA,EAAoB,MAAA;AAAA,IACpB,SAAA;AAAA,IACA,OAAO,aAAA,CAAc,MAAA,GAAS,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,GAAI;AAAA,GAC/D;AACF;;;AC5HA,eAAsB,WACpB,OAAA,EACuB;AAGvB,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AAIhD,EAAA,MAAM,WAAW,UAAA,CAAW,IAAA;AAAA,IAC1B,CAAC,IAAA,KACC,IAAA,KAAS,CAAA,IAAM,IAAA,GAAO,MAAM,IAAA,KAAS,CAAA,IAAK,IAAA,KAAS,EAAA,IAAM,IAAA,KAAS;AAAA,GACtE;AAGA,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,QAAA,EAAU;AAEZ,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA;AAGjD,IAAA,MAAM,YAAA,GAAe,yBAAyB,YAAY,CAAA;AAC1D,IAAA,IAAI,YAAA,EAAc;AAGhB,MAAA,WAAA,GAAc,gBAAgB,YAAY,CAAA;AAAA,IAC5C,CAAA,MAAO;AAEL,MAAA,WAAA,GAAc,YAAA;AAAA,IAChB;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,WAAA,GAAc,UAAA,CAAW,SAAS,OAAO,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,aAAA,GAAgB,IAAIE,aAAAA,CAAc;AAAA,IACtC,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AAGD,EAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAc,eAAA,KAClC,gCAAA,CAAiC;AAAA,IAC/B,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAGH,EAAA,MAAM,aAAA,GAAgB,wBAAwB,WAAW,CAAA;AACzD,EAAA,MAAM,WAAA,GAAgC,gBAAgB,KAAA,GAAQ,QAAA;AAG9D,EAAA,IAAI,YAAA;AAEJ,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,YAAA,GAAe,6BAAA,CAA8B;AAAA,MAC3C,aAAA;AAAA,MACA,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAA,EAAS,WAAA;AAAA,MACT,eAAA;AAAA,MACA,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAAA,EAEH,CAAA,MAAO;AAEL,IAAA,MAAM,eAAA,GAAkBC,kBAAAA;AAAA,MACtB,OAAA,CAAQ;AAAA,KACV;AACA,IAAA,MAAM,SAAA,GAA+B;AAAA,MACnC,GAAA,EAAK,eAAA;AAAA,MACL,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,KAAA,EAAO,YAAY,WAAW;AAAA,KAChC;AAEA,IAAA,YAAA,GAAe;AAAA,MACb,+BAAA;AAAA,QACE,aAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA,CAAQ;AAAA;AAAA;AACV,KACF;AAAA,EACF;AAGA,EAAA,IAAI,kBAAA;AACJ,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,IAAI,aAAA,EAAe;AAGjB,IAAA,MAAM,iBAAA,GAAoB,YAAA,CACvB,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS,SAAS,CAAA,CACpC,GAAA,CAAI,CAAC,EAAA,KAAO,GAAG,WAAW,CAAA;AAG7B,IAAA,MAAM,qBAAqB,IAAI,GAAA;AAAA,MAC7B,YAAA,CACG,MAAA,CAAO,CAAC,EAAA,KAAO,GAAG,IAAA,KAAS,SAAS,CAAA,CACpC,GAAA,CAAI,CAAC,EAAA,KAAO,CAAC,EAAA,CAAG,WAAA,EAAa,EAAE,CAAC;AAAA,KACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,4BAAA,CAA6B;AAAA,MAClD,aAAA;AAAA,MACA,YAAA,EAAc,iBAAA;AAAA;AAAA,MACd;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,cAAA,GAAsC,QAAA,CAAS,MAAA,CAClD,GAAA,CAAI,CAAC,QAAA,KAAa,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAC,CAAA,CAClD,MAAA,CAAO,CAAC,EAAA,KAAgC,OAAO,MAAS,CAAA;AAE3D,IAAA,MAAM,eAAA,GAAuC,QAAA,CAAS,OAAA,CACnD,GAAA,CAAI,CAAC,QAAA,KAAa,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAC,CAAA,CAClD,MAAA,CAAO,CAAC,EAAA,KAAgC,OAAO,MAAS,CAAA;AAG3D,IAAA,MAAM,aAAa,YAAA,CAAa,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,UAAU,CAAA;AACnE,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,cAAA,CAAe,QAAQ,UAAU,CAAA;AAAA,IACnC;AAEA,IAAA,kBAAA,GAAqB,cAAA;AACrB,IAAA,YAAA,GAAe,eAAA,CAAgB,MAAA;AAAA,EACjC,CAAA,MAAO;AACL,IAAA,MAAM,QAAA,GAAW,MAAM,0BAAA,CAA2B;AAAA,MAChD,aAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA,EAAiB;AAAA,KAClB,CAAA;AACD,IAAA,kBAAA,GAAqB,QAAA,CAAS,MAAA;AAC9B,IAAA,YAAA,GAAe,SAAS,OAAA,CAAQ,MAAA;AAAA,EAClC;AAGA,EAAA,IAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AACnC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,IAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,mBAAA,EAAqB,YAAA;AAAA,MACrB,kBAAA,EAAoB,CAAA;AAAA,MACpB,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,MAAM,+BAAA,CAAgC;AAAA,IACnD,aAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA,EAAc,kBAAA;AAAA,IACd;AAAA,GACD,CAAA;AAGD,EAAA,MAAA,CAAO,mBAAA,IAAuB,YAAA;AAG9B,EAAA,MAAA,CAAO,eAAA,GAAkB,eAAA;AACzB,EAAA,MAAA,CAAO,WAAA,GAAc,WAAA;AAErB,EAAA,OAAO,MAAA;AACT;;;ACpLA,eAAsB,gCAAA,CACpB,aAAA,EACA,YAAA,EACA,aAAA,EACA,oBAAA,EACmB;AACnB,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAC;AAAA,EACV;AAGA,EAAA,MAAM,qBAAqB,aAAA,CAAc,GAAA,CAAI,CAAC,GAAA,KAAQ,YAAA,CAAa,GAAG,CAAC,CAAA;AACvE,EAAA,MAAM,gBAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,MAAM,kBAAA,EAAoB;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,+BAAA,CAAgC,EAAA,EAAI,SAAS,CAAA;AAC/D,MAAA,IAAI,SAAA,CAAU,SAAS,SAAA,EAAW;AAChC,QAAA,aAAA,CAAc,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,MACxC;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAE9B,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,MAAM,cAAA,GAAiB,MAAM,mBAAA,CAAoB;AAAA,IAC/C,aAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA,EAAiB;AAAA,GAClB,CAAA;AAGD,EAAA,MAAM,cAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,MAAM,EAAA,GAAK,aAAa,SAAS,CAAA;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,+BAAA,CAAgC,EAAA,EAAI,SAAS,CAAA;AAC/D,MAAA,IAAI,SAAA,CAAU,SAAS,SAAA,EAAW;AAChC,QAAA,MAAM,IAAA,GAAO,UAAU,IAAA,CAAK,IAAA;AAC5B,QAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAG;AAE7B,UAAA,WAAA,CAAY,KAAK,SAAS,CAAA;AAAA,QAC5B;AAAA,MAEF,CAAA,MAAO;AAEL,QAAA,WAAA,CAAY,KAAK,SAAS,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA,CAAA,MAAQ;AAEN,MAAA,WAAA,CAAY,KAAK,SAAS,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;;;ACjEA,eAAsB,wBACpB,MAAA,EAC4B;AAC5B,EAAA,MAAM;AAAA,IACJ,aAAA;AAAA,IACA,oBAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,oBAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,GAAI,MAAA;AAGJ,EAAA,OAAOC,yBAAA,CAA+B;AAAA,IACpC,MAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,oBAAA;AAAA,IACA,oBAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA,EAAiB,OACfC,cAAAA,EACA,YAAA,EACAC,qBAAAA,KACG;AACH,MAAA,OAAO,gCAAA;AAAA,QACLD,cAAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACAC;AAAA,OACF;AAAA,IACF;AAAA,GACD,CAAA;AACH;;;ACXA,eAAsB,oBACpB,OAAA,EACgC;AAChC,EAAA,MAAM,SAAkB,EAAC;AAGzB,EAAA,MAAM,UAAA,GAAaC,YAAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AAGhD,EAAA,MAAM,WAAW,UAAA,CAAW,IAAA;AAAA,IAC1B,CAAC,IAAA,KACC,IAAA,KAAS,CAAA,IAAM,IAAA,GAAO,MAAM,IAAA,KAAS,CAAA,IAAK,IAAA,KAAS,EAAA,IAAM,IAAA,KAAS;AAAA,GACtE;AAGA,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA;AACjD,IAAA,MAAM,YAAA,GAAeC,yBAAyB,YAAY,CAAA;AAC1D,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,WAAA,GAAcC,gBAAgB,YAAY,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,WAAA,GAAc,YAAA;AAAA,IAChB;AAAA,EACF,CAAA,MAAO;AACL,IAAA,WAAA,GAAc,UAAA,CAAW,SAAS,OAAO,CAAA;AAAA,EAC3C;AAKA,EAAA,MAAM,aAAA,GAAgB,IAAIP,aAAAA,CAAc;AAAA,IACtC,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AAGD,EAAA,MAAM,WAAA,GAAcQ,mBAAAA,CAAoB,OAAA,CAAQ,UAAU,CAAA;AAC1D,EAAA,MAAM,cAAc,WAAA,CAAY,OAAA;AAChC,EAAA,MAAM,eAAeC,eAAAA,CAAgB;AAAA,IACnC,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,UAAUC,eAAAA,CAAgB;AAAA,IAC9B,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,mBAAmBC,kBAAAA,CAAmB;AAAA,IAC1C,OAAA,EAAS,WAAA;AAAA,IACT,OAAO,YAAA,CAAa,KAAA;AAAA,IACpB,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA;AAAA,IAC1B,UAAA,EAAYC,iBAAAA,CAAkB,OAAA,CAAQ,OAAO;AAAA,GAC9C,CAAA;AAGD,EAAA,MAAM,EAAE,gBAAA,EAAkB,UAAA,EAAW,GAAI,qBAAA;AAAA,IACvC,WAAA;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AAIA,EAAA,MAAM,aAAA,GAAgB,MAAM,kBAAA,CAAmB;AAAA,IAC7C,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,eAAA,EAAiB,WAAA;AAAA,IACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,OAAA,EAAS,WAAA;AAAA,IACT,SAAA,EAAW;AAAA;AAAA,GACZ,CAAA;AACD,EAAA,MAAM,eAAe,aAAA,CAAc,YAAA;AACnC,EAAA,OAAA,CAAQ,IAAI,iDAA4C,CAAA;AAIxD,EAAA,IAAI,oBAAA;AACJ,EAAA,IAAI,UAAA,GAAa,IAAA;AAEjB,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,MAAM,yBAAA,CAA0B;AAAA,MACpD,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,eAAA,EAAiB,WAAA;AAAA,MACjB,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AACD,IAAA,oBAAA,GAAuB,aAAA,CAAc,oBAAA;AAGrC,IAAA,UAAA,GAAa,CAAC,aAAA,CAAc,iBAAA;AAAA,EAC9B,SAAS,KAAA,EAAO;AAGd,IAAA,UAAA,GAAa,IAAA;AAAA,EACf;AAIA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB;AAAA,MACzC,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,eAAA,EAAiB,WAAA;AAAA,MACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,gBAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,oBAAA,GAAuB,UAAA,CAAW,oBAAA;AAAA,EACpC;AAIA,EAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,IAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,EAC9D;AAMA,EAAA,MAAM,kBAAA,GAAqB,cAAc,iBAAA,CAAkB;AAAA,IACzD,IAAA,EAAM,WAAA;AAAA,IACN,eAAA,EAAiB,oBAAA;AAAA,IACjB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,UAAU,OAAA,CAAQ,IAAA;AAAA,IAClB,wBAAA,EAA0B,IAAA;AAAA,IAC1B,WAAW,OAAA,CAAQ;AAAA,GACpB,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,kBAAA,CAAmB,KAAA,CAAM,CAAC,CAAA;AAC9D,EAAA,MAAM,eAAe,kBAAA,CAAmB,YAAA;AACxC,EAAA,MAAM,gBAAgB,kBAAA,CAAmB,QAAA;AAKzC,EAAA,MAAM,UAAA,GAAa,cAAc,UAAA,CAAW;AAAA,IAC1C,GAAA,EAAK,YAAA;AAAA,IACL,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,KAAA,EAAO;AAAA;AAAA,GACR,CAAA;AAGD,EAAA,MAAM,cAAA,GAAiB,MAAM,4BAAA,CAA6B;AAAA,IACxD,aAAA;AAAA,IACA,YAAA,EAAc,QAAA;AAAA,IACd,eAAA,EAAiB;AAAA,GAClB,CAAA;AAED,EAAA,MAAM,eAAe,cAAA,CAAe,MAAA;AACpC,EAAA,MAAM,aAAA,GAAgB,eAAe,OAAA,CAAQ,MAAA;AAI7C,EAAA,MAAM,kBAAA,GAAqB,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA;AAC5C,EAAA,MAAM,gBAAA,GAAmBf,WAAAA,CAAY,UAAA,CAAW,IAAA,CAAK,CAAC,CAAkB,CAAA;AACxE,EAAA,IAAI,uBAAA,GAA0B,IAAA;AAE9B,EAAA,MAAM,aAAA,GAAgB,MAAM,sBAAA,CAAuB;AAAA,IACjD,aAAA;AAAA,IACA,UAAA,EAAY,kBAAA;AAAA,IACZ,eAAA,EAAiB,WAAA;AAAA;AAAA,IACjB;AAAA,GACD,CAAA;AACD,EAAA,IAAI,aAAA,CAAc,MAAA,IAAU,aAAA,CAAc,OAAA,EAAS;AACjD,IAAA,uBAAA,GAA0B,KAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,yBAAiC,EAAC;AACtC,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAU,kBAAkB,YAAY,CAAA;AAC9C,MAAA,MAAM,eAAe,OAAA,CAAQ,MAAA;AAE7B,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,oBAAA,EAAgB,YAAA,CAAa,MAAM,CAAA,aAAA,EAAgB,YAAY,CAAA,UAAA;AAAA,SACjE;AAAA,MACF;AAGA,MAAA,KAAA,IAAS,UAAA,GAAa,CAAA,EAAG,UAAA,GAAa,OAAA,CAAQ,QAAQ,UAAA,EAAA,EAAc;AAClE,QAAA,MAAM,KAAA,GAAQ,QAAQ,UAAU,CAAA;AAEhC,QAAA,IAAI,eAAe,CAAA,EAAG;AACpB,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,2BAAoB,UAAA,GAAa,CAAC,IAAI,YAAY,CAAA,EAAA,EAChD,MAAM,MACR,CAAA,iBAAA;AAAA,WACF;AAAA,QACF;AAEA,QAAA,MAAM,YAAA,GAAe,MAAM,0BAAA,CAA2B;AAAA,UACpD,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,eAAA,EAAiB,WAAA;AAAA,UACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,UACnB,YAAA,EAAc,KAAA;AAAA,UACd;AAAA,SACD,CAAA;AAED,QAAA,sBAAA,CAAuB,IAAA,CAAK,GAAG,YAAA,CAAa,iBAAiB,CAAA;AAC7D,QAAA,UAAA,IAAc,aAAa,iBAAA,CAAkB,MAAA;AAG7C,QAAA,IAAI,YAAA,CAAa,aAAA,CAAc,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ;AAGtD,UAAA,MAAM,eACJ,CAAA,MAAA,EAAS,UAAA,GAAa,CAAC,CAAA,MAAA,EACrB,MAAM,MACR,CAAA,+IAAA,CAAA;AAIF,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,YAAY,CAAA,CAAE,CAAA;AACjC,UAAA,MAAA,CAAO,IAAA,CAAK,IAAI,KAAA,CAAM,YAAY,CAAC,CAAA;AAGnC,UAAA;AAAA,QACF;AAGA,QAAA,IACE,aAAa,aAAA,CAAc,MAAA,GAAS,KACpC,YAAA,CAAa,iBAAA,CAAkB,SAAS,CAAA,EACxC;AAEA,UAAA,MAAM,SAAA,GAAY,aAAa,aAAA,CAAc,GAAA,CAAI,CAAC,GAAA,KAAQ,KAAA,CAAM,GAAG,CAAC,CAAA;AAEpE,UAAA,IAAI;AACF,YAAA,MAAM,WAAA,GAAc,MAAM,uBAAA,CAAwB;AAAA,cAChD,QAAQ,OAAA,CAAQ,MAAA;AAAA,cAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,cACjB,eAAA,EAAiB,WAAA;AAAA,cACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,cACnB,eAAe,YAAA,CAAa,aAAA;AAAA,cAC5B,oBAAA,EAAsB,SAAA;AAAA,cACtB,aAAA;AAAA,cACA,oBAAA;AAAA,cACA;AAAA,aACD,CAAA;AAGD,YAAA,sBAAA,CAAuB,IAAA,CAAK,GAAG,WAAA,CAAY,iBAAiB,CAAA;AAC5D,YAAA,UAAA,IAAc,YAAY,iBAAA,CAAkB,MAAA;AAE5C,YAAA,IAAI,WAAA,CAAY,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACxC,cAAA,MAAA,CAAO,IAAA;AAAA,gBACL,IAAI,KAAA;AAAA,kBACF,SAAS,UAAA,GAAa,CAAC,CAAA,EAAA,EACrB,WAAA,CAAY,cAAc,MAC5B,CAAA,kCAAA;AAAA;AACF,eACF;AAAA,YACF;AAAA,UACF,SAAS,UAAA,EAAY;AACnB,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,UAAA,YAAsB,KAAA,GAClB,UAAA,GACA,IAAI,KAAA;AAAA,gBACF,CAAA,MAAA,EAAS,UAAA,GAAa,CAAC,CAAA,eAAA,EAAkB,MAAA;AAAA,kBACvC;AAAA,iBACD,CAAA;AAAA;AACH,aACN;AAAA,UACF;AAAA,QACF;AAIA,QAAA,IACE,aAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,IAC9B,sBAAA,CAAuB,SAAS,CAAA,EAChC;AAEA,UAAA,MAAM,cAAc,sBAAA,CAAuB,KAAA;AAAA,YACzC,CAAC,aAAa,iBAAA,CAAkB;AAAA,WAClC;AACA,UAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,YAAA,IAAI;AACF,cAAA,MAAM,oBAAA,CAAqB;AAAA,gBACzB,YAAA;AAAA,gBACA,iBAAA,EAAmB,WAAA;AAAA,gBACnB,aAAA,EAAe,CAAA;AAAA;AAAA,gBACf,OAAA,EAAS;AAAA;AAAA,eACV,CAAA;AAAA,YACH,SAAS,iBAAA,EAAmB;AAE1B,cAAA,OAAA,CAAQ,IAAA;AAAA,gBACN,CAAA,oBAAA,EACE,aAAa,CACf,CAAA,qCAAA;AAAA,eACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,WAAA,EAAa;AACpB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,WAAA,YAAuB,QACnB,WAAA,GACA,IAAI,MAAM,CAAA,yBAAA,EAA4B,MAAA,CAAO,WAAW,CAAC,CAAA,CAAE;AAAA,OACjE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,sBAAA,CAAuB,SAAS,CAAA,EAAG;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,oBAAA,CAAqB;AAAA,QACzB,YAAA;AAAA,QACA,iBAAA,EAAmB,sBAAA;AAAA,QACnB,aAAA,EAAe,CAAA;AAAA,QACf,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,iBAAA,EAAmB;AAC1B,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,iBAAA,YAA6B,QACzB,iBAAA,GACA,IAAI,MAAM,CAAA,2BAAA,EAA8B,MAAA,CAAO,iBAAiB,CAAC,CAAA,CAAE;AAAA,OACzE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,uBAAA;AACJ,EAAA,IAAI,uBAAA,EAAyB;AAC3B,IAAA,IAAI;AACF,MAAA,uBAAA,GAA0B,MAAM,iBAAiB,aAAA,CAAc;AAAA,QAC7D,SAAS,UAAA,CAAW,EAAA;AAAA,QACpB,KAAK,UAAA,CAAW,GAAA;AAAA,QAChB,cAAc,UAAA,CAAW,YAAA;AAAA,QACzB,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,KAAA,EACE,UAAA,CAAW,KAAA,KAAU,KAAA,CAAA,IAAa,UAAA,CAAW,QAAQ,MAAA,CAAO,CAAC,CAAA,GACzD,UAAA,CAAW,KAAA,GACX,KAAA;AAAA,OACP,CAAA;AAGD,MAAA,MAAM,oBAAA,CAAqB;AAAA,QACzB,YAAA;AAAA,QACA,iBAAA,EAAmB,CAAC,uBAAuB,CAAA;AAAA,QAC3C,aAAA,EAAe,CAAA;AAAA,QACf,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,aAAA,EAAe;AACtB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,aAAA,YAAyB,QACrB,aAAA,GACA,IAAI,MAAM,CAAA,4BAAA,EAA+B,MAAA,CAAO,aAAa,CAAC,CAAA,CAAE;AAAA,OACtE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,YAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA,EACE,2BAA2B,uBAAA,KAA4B,MAAA;AAAA,IACzD,sBAAA;AAAA,IACA,uBAAA;AAAA,IACA,oBAAA;AAAA,IACA,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS;AAAA,GACvC;AACF;ACrYA,eAAsB,YACpB,OAAA,EACwB;AAGxB,EAAA,MAAM,UAAA,GAAaO,YAAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AAIhD,EAAA,MAAM,WAAW,UAAA,CAAW,IAAA;AAAA,IAC1B,CAAC,IAAA,KACC,IAAA,KAAS,CAAA,IAAM,IAAA,GAAO,MAAM,IAAA,KAAS,CAAA,IAAK,IAAA,KAAS,EAAA,IAAM,IAAA,KAAS;AAAA,GACtE;AAGA,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,QAAA,EAAU;AAEZ,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA;AAGjD,IAAA,MAAM,YAAA,GAAeC,yBAAyB,YAAY,CAAA;AAC1D,IAAA,IAAI,YAAA,EAAc;AAGhB,MAAA,WAAA,GAAcC,gBAAgB,YAAY,CAAA;AAAA,IAC5C,CAAA,MAAO;AAEL,MAAA,WAAA,GAAc,YAAA;AAAA,IAChB;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,WAAA,GAAc,UAAA,CAAW,SAAS,OAAO,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,aAAA,GAAgB,IAAIP,aAAAA,CAAc;AAAA,IACtC,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AAGD,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,gCAAA,CAAiC;AAAA,IAC3D,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAGD,EAAA,MAAM,aAAA,GAAgBc,wBAAwB,WAAW,CAAA;AAIzD,EAAA,IAAI,YAAA;AAEJ,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,YAAA,GAAe,6BAAA,CAA8B;AAAA,MAC3C,aAAA;AAAA,MACA,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAA,EAAS,WAAA;AAAA,MACT,eAAA;AAAA,MACA,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAAA,EAEH,CAAA,MAAO;AAEL,IAAA,MAAM,eAAA,GAAkBb,kBAAAA;AAAA,MACtB,OAAA,CAAQ;AAAA,KACV;AACA,IAAA,MAAM,SAAA,GAA+B;AAAA,MACnC,GAAA,EAAK,eAAA;AAAA,MACL,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,KAAA,EAAOc,YAAY,WAAW;AAAA,KAChC;AAEA,IAAA,YAAA,GAAe;AAAA,MACb,+BAAA;AAAA,QACE,aAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA,CAAQ;AAAA;AAAA;AACV,KACF;AAAA,EACF;AAGA,EAAA,IAAI,kBAAA;AACJ,EAAA,IAAI,mBAAA;AAEJ,EAAA,IAAI,aAAA,EAAe;AAGjB,IAAA,MAAM,iBAAA,GAAoB,YAAA,CACvB,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS,SAAS,CAAA,CACpC,GAAA,CAAI,CAAC,EAAA,KAAO,GAAG,WAAW,CAAA;AAG7B,IAAA,MAAM,qBAAqB,IAAI,GAAA;AAAA,MAC7B,YAAA,CACG,MAAA,CAAO,CAAC,EAAA,KAAO,GAAG,IAAA,KAAS,SAAS,CAAA,CACpC,GAAA,CAAI,CAAC,EAAA,KAAO,CAAC,EAAA,CAAG,WAAA,EAAa,EAAE,CAAC;AAAA,KACrC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,4BAAA,CAA6B;AAAA,MAClD,aAAA;AAAA,MACA,YAAA,EAAc,iBAAA;AAAA;AAAA,MACd;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,cAAA,GAAsC,QAAA,CAAS,MAAA,CAClD,GAAA,CAAI,CAAC,QAAA,KAAa,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAC,CAAA,CAClD,MAAA,CAAO,CAAC,EAAA,KAAgC,OAAO,MAAS,CAAA;AAE3D,IAAA,MAAM,eAAA,GAAuC,QAAA,CAAS,OAAA,CACnD,GAAA,CAAI,CAAC,QAAA,KAAa,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAC,CAAA,CAClD,MAAA,CAAO,CAAC,EAAA,KAAgC,OAAO,MAAS,CAAA;AAG3D,IAAA,MAAM,aAAa,YAAA,CAAa,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,UAAU,CAAA;AACnE,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,cAAA,CAAe,QAAQ,UAAU,CAAA;AAAA,IACnC;AAEA,IAAA,kBAAA,GAAqB,cAAA;AACrB,IAAA,mBAAA,GAAsB,eAAA;AAAA,EACxB,CAAA,MAAO;AACL,IAAA,MAAM,QAAA,GAAW,MAAM,0BAAA,CAA2B;AAAA,MAChD,aAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA,EAAiB;AAAA,KAClB,CAAA;AACD,IAAA,kBAAA,GAAqB,QAAA,CAAS,MAAA;AAC9B,IAAA,mBAAA,GAAsB,QAAA,CAAS,OAAA;AAAA,EACjC;AAGA,EAAA,IAAI,aAAA,EAAe;AAEjB,IAAA,MAAM,oBAAoB,YAAA,CAAa,MAAA;AAAA,MACrC,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS;AAAA,KACtB;AACA,IAAA,MAAM,sBAAsB,YAAA,CAAa,IAAA;AAAA,MACvC,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS;AAAA,KACtB;AAEA,IAAA,MAAM,cAAc,iBAAA,CAAkB,MAAA;AACtC,IAAA,MAAM,sBAAsB,mBAAA,CAAoB,MAAA;AAAA,MAC9C,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS;AAAA,KACtB,CAAE,MAAA;AACF,IAAA,MAAM,oBAAoB,kBAAA,CAAmB,MAAA;AAAA,MAC3C,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS;AAAA,KACtB,CAAE,MAAA;AACF,IAAA,MAAM,oBAAA,GAAuB,sBACzB,kBAAA,CAAmB,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS,UAAU,CAAA,GACtD,KAAA;AAEJ,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,KAAA;AAAA,MACb,WAAA;AAAA,MACA,mBAAA;AAAA,MACA,iBAAA;AAAA,MACA,oBAAA;AAAA,MACA,eAAA;AAAA,MACA,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,mBAAmB,YAAA,CAAa,MAAA;AAAA,MAChC,oBAAoB,kBAAA,CAAmB,MAAA;AAAA,MACvC,qBAAqB,mBAAA,CAAoB;AAAA,KAC3C;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,WAAA,GAAc,CAAA;AACpB,IAAA,MAAM,sBAAsB,mBAAA,CAAoB,MAAA;AAChD,IAAA,MAAM,oBAAoB,kBAAA,CAAmB,MAAA;AAE7C,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,QAAA;AAAA,MACb,WAAA;AAAA,MACA,mBAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,mBAAmB,YAAA,CAAa,MAAA;AAAA,MAChC,oBAAoB,kBAAA,CAAmB,MAAA;AAAA,MACvC,qBAAqB,mBAAA,CAAoB;AAAA,KAC3C;AAAA,EACF;AACF;ACpNO,SAAS,aAAA,CACd,SACA,KAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,SAAS,CAAA,GAAI,GAAI,CAAA,CAAE,WAAA,EAAY;AACzE,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZnB,MAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,IAAI,CAAA,CAAA,EAAIA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA;AAAA,IACpD,KAAKA,MAAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA,EAAI,QAAQ,MAAM,CAAA,CAAA;AAAA,IAC7C,KAAKA,MAAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAA;AAAA,GACzC;AAEA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,KAAA,CAAM,IAAA,CAAK,KAAKA,MAAAA,CAAM,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AAAA,EAC1D;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,KAAKA,MAAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAEtD,EAAA,IAAI,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,IAAA,KAAS,IAAA,EAAM;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,KAAKA,MAAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,aAAA,CACd,SACA,KAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAAA,IACnC,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,MAAM,OAAA,CAAQ;AAAA,GAChB;AACF;AAKO,SAAS,aAAA,CACd,QAAA,EACA,UAAA,EACA,IAAA,EACM;AACN,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,aAAA,CAAc,GAAA,EAAK,UAAA,GAAa,CAAC,CAAC,CAAA;AAC1E,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EAC7C,CAAA,MAAO;AACL,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,mBAAmB,CAAC,CAAA;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AAC3B,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,GAAA,EAAK,UAAA,GAAa,CAAC,CAAC,CAAA;AAC9C,MAAA,IAAI,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC3B,QAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,MACd;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;AAKO,SAAS,UAAA,CACd,KAAA,EACA,KAAA,EACA,IAAA,EACM;AACN,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,SAAA,CAAU,EAAE,OAAM,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EAChD,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAGA,MAAAA,CAAM,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA,EAAIA,MAAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAC1D;AACF;AAKO,SAAS,cAAc,OAAA,EAAwB;AACpD,EAAA,OAAA,CAAQ,MAAMA,MAAAA,CAAM,GAAA,CAAI,CAAA,OAAA,EAAU,OAAO,EAAE,CAAC,CAAA;AAC5C,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB;;;AC3EA,eAAsB,mBACpB,OAAA,EACe;AACf,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAII,aAAAA,CAAc;AAAA,IAC/B,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AAED,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,UAAA,EAAY,UAAA;AAAA,UACV,eAAA,CAAgB,OAAA;AAAA,UAChB,OAAA,CAAQ,QAAA;AAAA,UACR,OAAA,CAAQ;AAAA,SACV;AAAA,QACA,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,IAAA,EAAM,OAAA,CAAQ,GAAA,GAAM,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA;AAAA,QACzC,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,GAAI,OAAA,CAAQ,KAAA,KAAU,UAAa,EAAE,KAAA,EAAO,QAAQ,KAAA;AAAM,OAC5D;AACA,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIJ,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAClD,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,CAAE,CAAA;AACpD,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAC9D,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,eAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AACrE,IAAA,IAAI,OAAA,CAAQ,UAAU,KAAA,CAAA,EAAW;AAC/B,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1D;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,IAAQ,SAAS,CAAA,CAAE,CAAA;AAClE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,GAAQ,KAAA,GAAQ,IAAI,CAAA,CAAE,CAAA;AAGvE,IAAA,MAAM,WAAA,GACJ,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,GAAA,GACjB,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,GAAI,iBAAA,GAChC,MAAA,CAAO,IAAA;AAEb,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AACtC,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,IACzE,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AAAA,IACvC;AACA,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAEvD,IAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,IAAA,CAAK,SAAA;AAAA,YACH;AAAA,cACE,KAAK,OAAA,CAAQ,GAAA;AAAA,cACb,UAAU,OAAA,CAAQ,QAAA;AAAA,cAClB,SAAS,eAAA,CAAgB,OAAA;AAAA,cACzB,KAAA,EAAO;AAAA,aACT;AAAA,YACA,IAAA;AAAA,YACA;AAAA;AACF,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,aAAA;AAAA,QACE,CAAA,uBAAA,EAA0B,OAAA,CAAQ,GAAG,CAAA,gBAAA,EAAmB,QAAQ,QAAQ,CAAA,CAAA;AAAA,OAC1E;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,CAAA,wBAAA,EAA2B,YAAY,CAAA,CAAE,CAAA;AAAA,EACzD;AACF;ACpGO,SAAS,iBAAA,CACd,QACA,OAAA,EACoB;AACpB,EAAA,MAAM,WAAW,kBAAA,CAAmB;AAAA,IAClC,KAAK,MAAA,CAAO,GAAA;AAAA,IACZ,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,MAAM,MAAA,CAAO;AAAA,GACd,CAAA;AAED,EAAA,MAAM,MAAA,GAASiB,kBAAkB,OAAO,CAAA;AACxC,EAAA,MAAM,OAAO,MAAA,GAAS,MAAA,CAAO,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA,GAAI,QAAA;AAEnD,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,CAAO,EAAA;AAAA,IACX,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,QAAA,EAAS,IAAK;AAAA,GACrC;AACF;;;ACJA,IAAM,wBAAwB,EAAA,GAAK,IAAA;AAKnC,eAAsB,oBACpB,OAAA,EAC+B;AAC/B,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAGD,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,OAAA,GAAUL,mBAAAA,CAAoB,OAAA,CAAQ,UAA2B,CAAA;AACvE,IAAA,eAAA,GAAkB,OAAA,CAAQ,OAAA;AAAA,EAC5B,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,eAAA,GAAkB,OAAA,CAAQ,OAAA;AAAA,EAC5B,CAAA,MAAO;AAEL,IAAA,eAAA,GAAkB,4CAAA;AAAA,EACpB;AAGA,EAAA,MAAM,WAAA,GAAiBQ,GAAA,CAAA,YAAA,CAAa,OAAA,CAAQ,QAAA,EAAU,OAAO,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,WAAA,EAAa,OAAO,CAAA;AAEvD,EAAA,MAAM,MAAA,GAAS,IAAIhB,aAAAA,CAAc;AAAA,IAC/B,SAAS,eAAA,CAAgB;AAAA,GAC1B,CAAA;AAGD,EAAA,MAAM,gBAAgB,QAAA,GAAW,qBAAA;AAEjC,EAAA,IAAI,aAAA,EAAe;AAEjB,IAAA,MAAM,EAAE,kBAAA,EAAoB,YAAA,EAAc,QAAA,EAAS,GACjD,OAAO,iBAAA,CAAkB;AAAA,MACvB,IAAA,EAAM,WAAA;AAAA,MACN,eAAA;AAAA,MACA,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,UAAU,OAAA,CAAQ,IAAA;AAAA,MAClB,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAEH,IAAA,MAAM,sBAAsB,kBAAA,CAAmB,GAAA;AAAA,MAAI,CAAC,MAAA,KAClD,iBAAA,CAAkB,MAAA,EAAQ,gBAAgB,OAAO;AAAA,KACnD;AAEA,IAAA,OAAO;AAAA,MACL,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,WAAA,EAAa,KAAA;AAAA,MACb,eAAA;AAAA,MACA,YAAA,EAAc,mBAAA;AAAA,MACd;AAAA,KACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,MAAA,GAAS,OAAO,UAAA,CAAW;AAAA,MAC/B,KAAK,OAAA,CAAQ,UAAA;AAAA,MACb,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,MAAM,kBAAA,GAAqB,iBAAA;AAAA,MACzB,MAAA;AAAA,MACA,eAAA,CAAgB;AAAA,KAClB;AAEA,IAAA,OAAO;AAAA,MACL,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,WAAA,EAAa,QAAA;AAAA,MACb,eAAA;AAAA,MACA,YAAA,EAAc,CAAC,kBAAkB;AAAA,KACnC;AAAA,EACF;AACF;ACxFO,SAAS,uBAAuBiB,QAAAA,EAAwB;AAE7D,EAAA,MAAM,iBAAiBA,QAAAA,CACpB,OAAA,CAAQ,SAAS,CAAA,CACjB,YAAY,oBAAoB,CAAA;AAGnC,EAAA,MAAM,gBAAgB,IAAI,OAAA,CAAQ,QAAQ,CAAA,CACvC,WAAA,CAAY,6BAA6B,CAAA,CACzC,cAAA,CAAe,iBAAiB,wBAAwB,CAAA,CACxD,eAAe,aAAA,EAAe,mCAAmC,EACjE,cAAA,CAAe,eAAA,EAAiB,2BAA2B,CAAA,CAC3D,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,0FAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,sBAAA;AAAA,IACA,+DAA+D,kBAAkB,CAAA,CAAA,CAAA;AAAA,IACjF,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AAEzB,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB;AAAA,UACvC,UAAU,OAAA,CAAQ,IAAA;AAAA,UAClB,YAAY,OAAA,CAAQ,GAAA;AAAA,UACpB,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,YAAY,OAAA,CAAQ,UAAA;AAAA,UACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,WAAW,OAAA,CAAQ;AAAA,SACpB,CAAA;AACD,QAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA;AAAA,UACNrB,MAAAA,CAAM,GAAA;AAAA,YACJ,kBACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA;AACF,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,MACpB;AAAA,QACE,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,QAAQ,OAAA,CAAQ;AAAA,OAClB;AAAA,MACA;AAAA;AAAA,KACF;AAEA,IAAA,MAAM,aAAA,GAA+B;AAAA,MACnC,UAAU,OAAA,CAAQ,IAAA;AAAA,MAClB,YAAY,OAAA,CAAQ,GAAA;AAAA,MACpB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,YAAY,aAAA,CAAc,UAAA;AAAA,MAC1B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc,MAAA;AAAA,MACtB,WAAW,OAAA,CAAQ;AAAA,KACrB;AAEA,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,2BAAoB,OAAA,CAAQ,IAAI,EAAE,CAAC,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,aAAa,CAAA;AAG7C,MAAA,MAAMsB,WAAAA,GAAa,kBAAA;AAAA,QACjB,MAAA,CAAO,eAAA;AAAA,QACP,aAAA,CAAc,OAAA;AAAA,QACd,OAAA,CAAQ;AAAA,OACV;AAEA,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,gBAAA,KAAqB,CAAA,EAAG;AACnD,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNtB,MAAAA,CAAM,KAAA;AAAA,YACJ,CAAA;AAAA,eAAA,EACE,QAAQ,GACV;AAAA,WAAA,EAAgB,MAAA,CAAO,mBAAmB,CAAA,eAAA,EACxCsB,WAAAA,GAAa;AAAA,eAAA,EAAoBtB,MAAAA,CAAM,IAAA,CAAKsB,WAAU,CAAC,KAAK,EAC9D,CAAA;AAAA;AACF,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNtB,MAAAA,CAAM,KAAA;AAAA,YACJ,CAAA;AAAA,eAAA,EACE,QAAQ,GACV;AAAA,gBAAA,EACE,MAAA,CAAO,WAAA,KAAgB,KAAA,GAAQ,KAAA,GAAQ,QACzC;AAAA,qBAAA,EACE,OAAO,gBACT;AAAA,wBAAA,EACE,OAAO,mBACT;AAAA,0BAAA,EAA+B,MAAA,CAAO,SAAA,IAAa,KAAK,CAAA,EACtDsB,WAAAA,GAAa;AAAA,eAAA,EAAoBtB,MAAAA,CAAM,IAAA,CAAKsB,WAAU,CAAC,KAAK,EAC9D,CAAA;AAAA;AACF,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAA;AAAA,UACNtB,MAAAA,CAAM,GAAA;AAAA,YACJ,CAAA;AAAA,qBAAA,EACE,OAAO,gBACT;AAAA,wBAAA,EACE,OAAO,mBACT;AAAA,uBAAA,EACE,OAAO,kBACT;AAAA,SAAA,EAAc,MAAA,CAAO,SAAS,eAAe,CAAA;AAAA;AAC/C,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA;AAAA,QACNA,MAAAA,CAAM,GAAA;AAAA,UACJ,kBACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA;AACF,OACF;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AAGH,EAAA,MAAM,iBAAiB,IAAI,OAAA,CAAQ,SAAS,CAAA,CACzC,WAAA,CAAY,wDAAwD,CAAA,CACpE,cAAA,CAAe,iBAAiB,yBAAyB,CAAA,CACzD,eAAe,aAAA,EAAe,mCAAmC,EACjE,cAAA,CAAe,eAAA,EAAiB,2BAA2B,CAAA,CAC3D,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,0FAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,sBAAA;AAAA,IACA,+DAA+D,kBAAkB,CAAA,CAAA,CAAA;AAAA,IACjF,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AAEzB,IAAA,MAAM,gBAAgB,kBAAA,CAAmB;AAAA,MACvC,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,MAAM,cAAA,GAAgC;AAAA,MACpC,UAAU,OAAA,CAAQ,IAAA;AAAA,MAClB,YAAY,OAAA,CAAQ,GAAA;AAAA,MACpB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,YAAY,aAAA,CAAc,UAAA;AAAA,MAC1B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc,MAAA;AAAA,MACtB,WAAW,OAAA,CAAQ;AAAA,KACrB;AAEA,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,2BAAoB,OAAA,CAAQ,IAAI,EAAE,CAAC,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,cAAc,CAAA;AAG/C,MAAA,MAAMsB,WAAAA,GAAa,kBAAA;AAAA,QACjB,MAAA,CAAO,eAAA;AAAA,QACP,aAAA,CAAc,OAAA;AAAA,QACd,OAAA,CAAQ;AAAA,OACV;AAGA,MAAA,OAAA,CAAQ,GAAA,CAAItB,MAAAA,CAAM,IAAA,CAAK,8BAAuB,CAAC,CAAA;AAC/C,MAAA,OAAA,CAAQ,IAAI,CAAA,eAAA,EAAkBA,MAAAA,CAAM,MAAM,MAAA,CAAO,UAAU,CAAC,CAAA,CAAE,CAAA;AAC9D,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,mBAAmBA,MAAAA,CAAM,KAAA;AAAA,UACvB,MAAA,CAAO,WAAA,KAAgB,KAAA,GAAQ,KAAA,GAAQ;AAAA,SACxC,CAAA;AAAA,OACH;AACA,MAAA,OAAA,CAAQ,IAAI,CAAA,gBAAA,EAAmBA,MAAAA,CAAM,MAAM,MAAA,CAAO,WAAW,CAAC,CAAA,CAAE,CAAA;AAChE,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,kBAAA,EAAqBA,MAAAA,CAAM,KAAA,CAAM,MAAA,CAAO,mBAAmB,CAAC,CAAA;AAAA,OAC9D;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,iBAAA,EAAoBA,MAAAA,CAAM,MAAA,CAAO,MAAA,CAAO,iBAAiB,CAAC,CAAA;AAAA,OAC5D;AAEA,MAAA,IAAI,MAAA,CAAO,WAAA,KAAgB,KAAA,IAAS,MAAA,CAAO,oBAAA,EAAsB;AAC/D,QAAA,OAAA,CAAQ,IAAI,CAAA,YAAA,EAAeA,MAAAA,CAAM,MAAA,CAAO,eAAe,CAAC,CAAA,CAAE,CAAA;AAAA,MAC5D,CAAA,MAAA,IAAW,MAAA,CAAO,WAAA,KAAgB,KAAA,EAAO;AACvC,QAAA,OAAA,CAAQ,IAAI,CAAA,YAAA,EAAeA,MAAAA,CAAM,KAAA,CAAM,gBAAgB,CAAC,CAAA,CAAE,CAAA;AAAA,MAC5D;AAEA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,sBAAA,EAAyBA,MAAAA,CAAM,KAAA,CAAM,MAAA,CAAO,iBAAiB,CAAC,CAAA;AAAA,OAChE;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,wBAAA,EAA2BA,MAAAA,CAAM,MAAA,CAAO,MAAA,CAAO,kBAAkB,CAAC,CAAA;AAAA,OACpE;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,wBAAA,EAA2BA,MAAAA,CAAM,KAAA,CAAM,MAAA,CAAO,mBAAmB,CAAC,CAAA;AAAA,OACpE;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,oBAAA,EAAuBA,MAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,eAAe,CAAC,CAAA;AAAA,OAC3D;AAEA,MAAA,IAAIsB,WAAAA,EAAY;AACd,QAAA,OAAA,CAAQ,IAAI,CAAA,eAAA,EAAkBtB,MAAAA,CAAM,IAAA,CAAKsB,WAAU,CAAC,CAAA,CAAE,CAAA;AAAA,MACxD;AAEA,MAAA,IAAI,MAAA,CAAO,iBAAA,KAAsB,CAAA,IAAK,CAAC,OAAO,oBAAA,EAAsB;AAClE,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNtB,MAAAA,CAAM,MAAM,wDAAmD;AAAA,SACjE;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNA,MAAAA,CAAM,MAAA;AAAA,YACJ;AAAA,OAAA,EAAO,OAAO,kBAAkB,CAAA,6BAAA;AAAA;AAClC,SACF;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA;AAAA,QACNA,MAAAA,CAAM,GAAA;AAAA,UACJ,mBACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA;AACF,OACF;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AAGH,EAAA,MAAM,qBAAqB,IAAI,OAAA,CAAQ,cAAc,CAAA,CAClD,WAAA,CAAY,0EAA0E,CAAA,CACtF,cAAA,CAAe,iBAAiB,wBAAwB,CAAA,CACxD,eAAe,aAAA,EAAe,mCAAmC,EACjE,cAAA,CAAe,eAAA,EAAiB,2BAA2B,CAAA,CAC3D,cAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,cAAA;AAAA,IACC,oBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,0FAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,sBAAA;AAAA,IACA,+DAA+D,kBAAkB,CAAA,CAAA,CAAA;AAAA,IACjF,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AAEzB,IAAA,MAAM,gBAAgB,kBAAA,CAAmB;AAAA,MACvC,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAGD,IAAA,MAAM,SAAA,GACJ,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,GAAA,CAAI,eAAA;AACnC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAA,CAAQ,KAAA;AAAA,QACNA,MAAAA,CAAM,GAAA;AAAA,UACJ;AAAA;AACF,OACF;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,MAAM,kBAAA,GAA6C;AAAA,MACjD,UAAU,OAAA,CAAQ,IAAA;AAAA,MAClB,YAAY,OAAA,CAAQ,GAAA;AAAA,MACpB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,YAAY,aAAA,CAAc,UAAA;AAAA,MAC1B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc,MAAA;AAAA,MACtB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAA;AAAA,MACA,WAAW,OAAA,CAAQ;AAAA,KACrB;AAEA,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,2BAAoB,OAAA,CAAQ,IAAI,EAAE,CAAC,CAAA;AAC1D,MAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,8BAAuB,OAAA,CAAQ,MAAM,EAAE,CAAC,CAAA;AAC/D,MAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,kBAAkB,CAAA;AAG3D,MAAA,MAAM,EAAE,mBAAA,EAAAY,qBAAAA,EAAoB,GAAI,MAAM,OAAO,eAAe,CAAA;AAC5D,MAAA,MAAM,WAAA,GAAcA,qBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAChE,MAAA,MAAMU,WAAAA,GAAa,kBAAA;AAAA,QACjB,WAAA,CAAY,OAAA;AAAA,QACZ,aAAA,CAAc,OAAA;AAAA,QACd,OAAA,CAAQ;AAAA,OACV;AAEA,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNtB,MAAAA,CAAM,KAAA;AAAA,YACJ,CAAA;AAAA,eAAA,EACE,QAAQ,GACV;AAAA,kBAAA,EAAuB,OAAO,YAAY;AAAA,eAAA,EACxC,OAAO,UACT;AAAA,kBAAA,EACE,OAAO,aACT;AAAA,sBAAA,EACE,MAAA,CAAO,iBAAA,GAAoB,KAAA,GAAQ,qBACrC;AAAA,kBAAA,EAAuB,OAAO,oBAAoB;AAAA,4BAAA,EAChD,MAAA,CAAO,sBAAA,CAAuB,MAAA,GAAS,CAAA,GACnC,MAAA,CAAO,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA,GACvC,MACN,CAAA,EACE,MAAA,CAAO,uBAAA,GACH;AAAA,6BAAA,EAAkC,MAAA,CAAO,uBAAuB,CAAA,CAAA,GAChE,EACN,GACEsB,WAAAA,GAAa;AAAA,eAAA,EAAoBtB,MAAAA,CAAM,IAAA,CAAKsB,WAAU,CAAC,KAAK,EAC9D,CAAA;AAAA;AACF,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAA;AAAA,UACNtB,MAAAA,CAAM,GAAA;AAAA,YACJ,CAAA;AAAA,eAAA,EACE,OAAO,UACT;AAAA,kBAAA,EACE,OAAO,aACT;AAAA,sBAAA,EACE,MAAA,CAAO,iBAAA,GAAoB,KAAA,GAAQ,IACrC;AAAA,UAAA,EACE,MAAA,CAAO,MAAA,GACH,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,IAC7C,eACN,CAAA;AAAA;AACF,SACF;AACA,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA;AAAA,QACNA,MAAAA,CAAM,GAAA;AAAA,UACJ,4BACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA;AACF,OACF;AACA,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AAGH,EAAA,MAAM,WAAA,GAAc,IAAI,OAAA,CAAQ,MAAM,EACnC,WAAA,CAAY,4BAA4B,CAAA,CACxC,cAAA,CAAe,eAAe,qBAAqB,CAAA,CACnD,cAAA,CAAe,sBAAA,EAAwB,gDAAgD,CAAA,CACvF,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,aAAA;AAAA,IACA,yDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAA,EAAS,sDAAsD,CAAA,CACtE,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,kBAAA,CAAmB;AAAA,MACvB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,KAAK,OAAA,CAAQ;AAAA,KACd,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,cAAA,CAAe,WAAW,aAAa,CAAA;AACvC,EAAA,cAAA,CAAe,WAAW,cAAc,CAAA;AACxC,EAAA,cAAA,CAAe,WAAW,kBAAkB,CAAA;AAC5C,EAAA,cAAA,CAAe,WAAW,WAAW,CAAA;AACvC;AChcO,SAAS,iBAAiB,OAAA,EAAsC;AACrE,EAAA,OAAO,IAAI,UAAA,CAAW;AAAA,IACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AACH;AAKO,SAAS,yBACd,OAAA,EACoB;AACpB,EAAA,OAAO,IAAI,kBAAA,CAAmB;AAAA,IAC5B,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AACH;AAeO,SAAS,gBAAgB,OAAA,EAAqC;AACnE,EAAA,OAAO,IAAI,SAAA,CAAU;AAAA,IACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AACH;AAKO,SAAS,0BACd,OAAA,EACqB;AACrB,EAAA,OAAO,IAAI,mBAAA,CAAoB;AAAA,IAC7B,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AACH;;;AChDA,SAAS,oBAAA,CAAqB,QAAmB,OAAA,EAA6B;AAC5E,EAAA,OAAO,OAAO,kBAAA,CAAmB;AAAA,IAC/B,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,IACxB,MAAM,OAAA,CAAQ;AAAA,GACf,CAAA;AACH;AAKA,eAAsB,YAAY,OAAA,EAA4C;AAC5E,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,iBAAA,CAAkB,OAAO,CAAA;AACzB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,gBAAgB,aAAa,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,MAAA,EAAQ,OAAO,CAAA;AAErD,EAAA,MAAM,OAAA,GAAUY,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAC5D,EAAA,MAAM,UAAUE,eAAAA,CAAgB;AAAA,IAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,IACtC,OAAA;AAAA,IACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,GACpD,CAAA;AAED,EAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAE5C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,aAAA,CAAc;AAAA,MAC5C,SAAS,QAAA,CAAS,EAAA;AAAA,MAClB,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,GAAQ;AAAA,SAAA,EAAc,OAAA,CAAQ,KAAK,CAAA,CAAA,GAAK,EAAA;AAClE,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAA8C,IAAI;AAAA,QAAA,EAAa,OAAA,CAAQ,IAAI,CAAA,EAAG,SAAS,CAAA;AAAA;AACzF,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;AAKA,SAAS,kBAAkB,OAAA,EAAmC;AAC5D,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,SAAS,IAAIuB,SAAAA,CAAU,EAAE,OAAA,EAAS,eAAA,CAAgB,SAAS,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,MAAA,EAAQ,OAAO,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,QAAA,EAAU,eAAA,CAAgB,OAAO,CAAA;AAEnE,EAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC9C;ACxCO,SAAS,YAAY,OAAA,EAAsD;AAChF,EAAA,IAAI,CAAC,QAAQ,GAAA,EAAK;AAChB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,YAAY,OAAA,CAAQ,GAAA;AAAA,IACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,OAAO,OAAA,CAAQ;AAAA,GACjB;AACF;AAKO,SAAS,mBAAmB,OAAA,EAA8B;AAC/D,EAAA,IAAI,QAAQ,GAAA,IAAQ,CAAC,QAAQ,KAAA,IAAS,CAAC,QAAQ,MAAA,EAAS;AACtD,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AACzC,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAE3C,EAAA,OAAA,CAAQ,IAAA;AAAA,IACNvB,MAAAA,CAAM,MAAA;AAAA,MACJ,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA,gDAAA;AAAA;AACnC,GACF;AACF;;;ACzEA,SAAS,gBAAA,CAAiB,SAAiB,IAAA,EAAqB;AAC9D,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,EAAC,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EACzC,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EACnC;AACF;AAKA,eAAsB,YAAY,OAAA,EAA4C;AAC5E,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,gBAAgB,eAAe,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,YAAY,OAAO,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,KAAA;AAE7B,EAAA,kBAAA,CAAmB,OAAO,CAAA;AAE1B,EAAA,IAAI;AAEF,IAAA,IAAI,OAAA,CAAQ,UAAU,KAAA,CAAA,EAAW;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,iBAAA,CAAkB;AAAA,QAC7C,cAAc,OAAA,CAAQ,KAAA;AAAA,QACtB,YAAY,MAAA,EAAQ,UAAA;AAAA,QACpB,OAAO,MAAA,EAAQ,KAAA;AAAA,QACf,OAAO,MAAA,EAAQ;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,aAAA,CAAc,CAAA,0BAAA,EAA6B,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5D;AAEA,MAAA,aAAA,CAAc,CAAC,OAAO,CAAA,EAAG,OAAA,CAAQ,OAAO,IAAI,CAAA;AAC5C,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAQ,MAAM,MAAA,CAAO,eAAA,CAAgB,EAAE,QAAQ,CAAA;AAErD,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,gBAAA,CAAiB,qBAAqB,IAAI,CAAA;AAC1C,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,KAAA,KAAU,KAAA,CAAA,IAAa,QAAQ,GAAA,KAAQ,KAAA,CAAA;AACxE,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,UAAA,GAAa,QAAQ,KAAA,IAAS,CAAA;AAC9B,MAAA,QAAA,GAAW,QAAQ,GAAA,IAAO,KAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,MAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,KAAK,CAAA;AACtC,MAAA,QAAA,GAAW,KAAA;AAAA,IACb;AAGA,IAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAA;AACnC,IAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AAEnC,IAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,MAAA,gBAAA,CAAiB,kCAAkC,IAAI,CAAA;AACvD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,gBAAA,CAAiB;AAAA,MAC7C,MAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,aAAA,CAAc,QAAA,EAAU,YAAY,IAAI,CAAA;AAAA,EAC1C,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,4BACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;;;ACtFA,SAAS,gBAAgB,MAAA,EAA8C;AACrE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,iBAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,OAAO,UAAA,EAAY,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAC5D,EAAA,IAAI,OAAO,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,CAAA,CAAG,CAAA;AACtD,EAAA,IAAI,OAAO,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAErD,EAAA,OAAO,CAAA,UAAA,EAAa,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAA;AACtC;AAKA,eAAsB,aAAa,OAAA,EAA6C;AAC9E,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,gBAAgB,eAAe,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,YAAY,OAAO,CAAA;AAElC,EAAA,kBAAA,CAAmB,OAAO,CAAA;AAE1B,EAAA,IAAI;AACF,IAAA,MAAM,QAAQ,MAAM,MAAA,CAAO,eAAA,CAAgB,EAAE,QAAQ,CAAA;AACrD,IAAA,UAAA,CAAW,OAAO,eAAA,CAAgB,MAAM,CAAA,EAAG,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAAA,EAClE,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,gCACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;;;ACpCO,SAAS,uBAAuBqB,QAAAA,EAAwB;AAC7D,EAAA,MAAM,iBAAiBA,QAAAA,CACpB,OAAA,CAAQ,SAAS,CAAA,CACjB,YAAY,oBAAoB,CAAA;AAGnC,EAAA,MAAM,WAAA,GAAc,IAAIG,OAAAA,CAAQ,MAAM,EACnC,WAAA,CAAY,gCAAgC,EAC5C,cAAA,CAAe,eAAA,EAAiB,cAAc,CAAA,CAC9C,MAAA,CAAO,mBAAmB,eAAA,EAAiB,EAAE,EAC7C,MAAA,CAAO,cAAA,EAAgB,qBAAqB,CAAA,CAC5C,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,WAAA,CAAY;AAAA,MAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,cAAc,IAAIA,OAAAA,CAAQ,MAAM,CAAA,CACnC,WAAA,CAAY,iCAAiC,CAAA,CAC7C,MAAA,CAAO,mBAAmB,uBAAuB,CAAA,CACjD,OAAO,iBAAA,EAAmB,iBAAiB,EAC3C,MAAA,CAAO,oBAAA,EAAsB,0BAA0B,CAAA,CACvD,MAAA;AAAA,IACC,aAAA;AAAA,IACA,yBAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,WAAA;AAAA,IACA,uBAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,aAAA;AAAA,IACA,yBAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,aAAA;AAAA,IACA,yCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,WAAA,CAAY;AAAA,MAChB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,eAAe,IAAIA,OAAAA,CAAQ,OAAO,CAAA,CACrC,WAAA,CAAY,qCAAqC,CAAA,CACjD,MAAA,CAAO,mBAAmB,uBAAuB,CAAA,CACjD,OAAO,iBAAA,EAAmB,iBAAiB,EAC3C,MAAA,CAAO,oBAAA,EAAsB,0BAA0B,CAAA,CACvD,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,YAAA,CAAa;AAAA,MACjB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,cAAA,CAAe,WAAW,WAAW,CAAA;AACrC,EAAA,cAAA,CAAe,WAAW,WAAW,CAAA;AACrC,EAAA,cAAA,CAAe,WAAW,YAAY,CAAA;AACxC;ACtHO,SAAS,sBAAsBH,QAAAA,EAAwB;AAC5D,EAAAA,QAAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,uBAAuB,CAAA,CACnC,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,CAAC,OAAA,KAAY;AACnB,IAAA,MAAM,SAAS,kBAAA,EAAmB;AAElC,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIrB,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAEnD,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA;AACnC,IAAA,MAAA,CACG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA,CAClC,OAAA,CAAQ,CAAC,KAAA,KAAU;AAClB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAA,EAAKA,MAAAA,CAAM,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,EAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,GAAG,CAAC,CAAA;AAAA,OAClE;AAAA,IACF,CAAC,CAAA;AAEH,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACrC,IAAA,MAAA,CACG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA,CAClC,OAAA,CAAQ,CAAC,KAAA,KAAU;AAClB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAA,EAAKA,MAAAA,CAAM,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,EAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,GAAG,CAAC,CAAA;AAAA,OAClE;AAAA,IACF,CAAC,CAAA;AAAA,EACL,CAAC,CAAA;AACL;AC5BO,SAAS,oBAAoBqB,QAAAA,EAAwB;AAC1D,EAAAA,SACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,8BAA8B,CAAA,CAC1C,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAyB;AACtC,IAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,gBAAgB,eAAe,CAAA;AAE9C,MAAA,MAAM,QAAA,GAAW,cAAA,CAAe,eAAA,CAAgB,OAAO,CAAA;AACvD,MAAA,MAAM,YAAY,YAAA,CAAa,EAAE,OAAA,EAAS,eAAA,CAAgB,SAAS,CAAA;AACnE,MAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,eAAA,CAAgB,EAAE,CAAA;AAErD,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,KAAA,EAAO;AAAA,UACL,IAAI,eAAA,CAAgB,OAAA;AAAA,UACpB,MAAM,SAAA,IAAa;AAAA,SACrB;AAAA,QACA,QAAA,EAAU;AAAA,UACR,SAAS,QAAA,CAAS;AAAA,SACpB;AAAA,QACA,KAAA,EAAO;AAAA,UACL;AAAA;AACF,OACF;AAEA,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AACzC,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAIrB,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AACnD,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA;AAChC,MAAA,OAAA,CAAQ,GAAA,CAAI,WAAWA,MAAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,IAAI,CAAC,CAAA,CAAE,CAAA;AACrD,MAAA,OAAA,CAAQ,GAAA,CAAI,SAASA,MAAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,CAAA;AACjD,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACrC,MAAA,OAAA,CAAQ,GAAA,CAAI,cAAcA,MAAAA,CAAM,KAAA,CAAM,KAAK,QAAA,CAAS,OAAO,CAAC,CAAA,CAAE,CAAA;AAC9D,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAClC,MAAA,OAAA,CAAQ,GAAA,CAAI,qBAAqBA,MAAAA,CAAM,KAAA,CAAM,KAAK,KAAA,CAAM,aAAa,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1E,SAAS,KAAA,EAAO;AACd,MAAA,aAAA;AAAA,QACE,uBACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACL;ACnDA,eAAeyB,mBAAkB,OAAA,EAA4C;AAC3E,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,IAAI,CAAC,oBAAA,CAAqB,eAAA,CAAgB,OAAO,CAAA,EAAG;AAClD,IAAA,aAAA;AAAA,MACE,CAAA,MAAA,EAAS,gBAAgB,OAAO,CAAA,sCAAA;AAAA,KAClC;AAAA,EACF;AAGA,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,OAAA,GAAUb,mBAAAA,CAAoB,OAAA,CAAQ,UAA2B,CAAA;AACvE,IAAA,eAAA,GAAkB,OAAA,CAAQ,OAAA;AAAA,EAC5B,CAAA,MAAO;AAEL,IAAA,eAAA,GAAkB,4CAAA;AAAA,EACpB;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW;AAAA,IAC5B,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AAGD,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,IAC3C,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,QAAA,EAAU,eAAA;AAAA,IACV,KAAK,OAAA,CAAQ,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AAAA,IACzC,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,iBAAiB,OAAA,CAAQ;AAAA,GAC1B,CAAA;AAED,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,aAAA,CAAc,8CAA8C,CAAA;AAC5D,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,WAAW,MAAA,CAAO,iBAAA;AAAA,IACtB;AAAA,MACE,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,QAAA,EAAU,eAAA;AAAA,MACV,KAAK,OAAA,CAAQ,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AAAA,MACzC,WAAW,OAAA,CAAQ,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,GAAI,MAAA;AAAA,MAC3D,kBAAkB,OAAA,CAAQ,gBAAA,GACtB,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,GAC/B,MAAA;AAAA,MACJ,eAAe,OAAA,CAAQ,aAAA,GACnB,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,GAC5B,MAAA;AAAA,MACJ,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,YAAY,OAAA,CAAQ,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,GAAI;AAAA,KACpE;AAAA,IACA,UAAA,CAAW;AAAA,GACb;AAGA,EAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,IACd;AAAA,MACE,IAAI,QAAA,CAAS,OAAA;AAAA,MACb,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,OAAO,QAAA,CAAS;AAAA,KAClB;AAAA,IACA,eAAA,CAAgB;AAAA,GAClB;AAEA,EAAA,MAAM,MAAA,GAA8B;AAAA,IAClC,kBAAkB,UAAA,CAAW,gBAAA;AAAA,IAC7B,MAAM,UAAA,CAAW,IAAA;AAAA,IACjB,WAAA,EAAa,OAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAA,EAAU,eAAA;AAAA,MACV,GAAI,OAAA,CAAQ,UAAA,IAAc,EAAE,UAAA,EAAY,QAAQ,UAAA;AAAW;AAC7D,GACF;AAEA,EAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC7C;AAKA,eAAsB,mBACpB,OAAA,EACe;AACf,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAMa,mBAAkB,OAAO,CAAA;AAC/B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,IAAI,CAAC,oBAAA,CAAqB,aAAA,CAAc,OAAO,CAAA,EAAG;AAChD,IAAA,aAAA;AAAA,MACE,CAAA,MAAA,EAAS,cAAc,OAAO,CAAA,0GAAA;AAAA,KAChC;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAUb,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW;AAAA,IAC5B,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,SAAA,EAAW,cAAc,MAAA,GACrB,EAAE,SAAS,CAAC,aAAA,CAAc,MAAM,CAAA,EAAE,GAClC;AAAA,GACL,CAAA;AAED,EAAA,OAAA,CAAQ,GAAA,CAAIZ,MAAAA,CAAM,IAAA,CAAK,iDAAiD,CAAC,CAAA;AAGzE,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,IAC3C,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,UAAU,OAAA,CAAQ,OAAA;AAAA,IAClB,KAAK,OAAA,CAAQ,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AAAA,IACzC,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,iBAAiB,OAAA,CAAQ;AAAA,GAC1B,CAAA;AAED,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,aAAA,CAAc,8CAA8C,CAAA;AAC5D,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,GAAA;AAAA,IACNA,MAAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAA4B,UAAA,CAAW,gBAAgB,CAAA,CAAE;AAAA,GACtE;AAGA,EAAA,MAAM,WAAW,MAAA,CAAO,iBAAA;AAAA,IACtB;AAAA,MACE,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,UAAU,OAAA,CAAQ,OAAA;AAAA,MAClB,KAAK,OAAA,CAAQ,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AAAA,MACzC,WAAW,OAAA,CAAQ,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,GAAI,MAAA;AAAA,MAC3D,kBAAkB,OAAA,CAAQ,gBAAA,GACtB,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,GAC/B,MAAA;AAAA,MACJ,eAAe,OAAA,CAAQ,aAAA,GACnB,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,GAC5B,MAAA;AAAA,MACJ,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,YAAY,OAAA,CAAQ,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,GAAI;AAAA,KACpE;AAAA,IACA,UAAA,CAAW;AAAA,GACb;AAEA,EAAA,MAAM,UAAUc,eAAAA,CAAgB;AAAA,IAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,IACtC,OAAA;AAAA,IACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,GACpD,CAAA;AAED,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,OAAA,CAAQ,IAAIjB,MAAAA,CAAM,IAAA,CAAK,wBAAwB,OAAA,CAAQ,UAAU,qBAAqB,CAAC,CAAA;AAAA,EACzF,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,MAClC,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,MAAM,QAAA,CAAS;AAAA,KAChB,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,IAAI,QAAA,CAAS,OAAA;AAAA,MACb,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,OAAO,QAAA,CAAS;AAAA,KACjB,CAAA;AAED,IAAA,MAAM,cAAA,GAAiB,QAAQ,UAAA,GAC3B;AAAA,eAAA,EAAoB,OAAA,CAAQ,UAAU,CAAA,IAAA,CAAA,GACtC,EAAA;AAEJ,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN1B,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAAgD,IAAI;AAAA,iBAAA,EAAsB,WAAW,gBAAgB;AAAA,QAAA,EAAa,QAAQ,IAAI;AAAA,UAAA,EAAe,OAAA,CAAQ,MAAM,CAAA,EAAG,cAAc,CAAA;AAAA;AAC9K,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;AC5OA,eAAsB,iBAAiB,OAAA,EAA0C;AAC/E,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,IAAI,CAAC2B,oBAAAA,CAAqB,eAAA,CAAgB,OAAO,CAAA,EAAG;AAClD,IAAA,aAAA;AAAA,MACE,CAAA,MAAA,EAAS,gBAAgB,OAAO,CAAA,iCAAA;AAAA,KAClC;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,IAAIC,UAAAA,CAAW;AAAA,IAC5B,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AAED,EAAA,MAAM,eAAe,OAAA,CAAQ,OAAA;AAE7B,EAAA,IAAI;AAEF,IAAA,MAAM,CAAC,KAAA,EAAO,WAAA,EAAa,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACpD,MAAA,CAAO,SAAS,YAAY,CAAA;AAAA,MAC5B,MAAA,CAAO,eAAe,YAAY,CAAA;AAAA,MAClC,MAAA,CAAO,SAAS,YAAY;AAAA,KAC7B,CAAA;AAED,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,aAAA,CAAc,CAAA,2BAAA,EAA8B,YAAY,CAAA,CAAE,CAAA;AAC1D,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,MAAA,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,CAAU,WAAA,CAAY,aAAa,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,OAAA,EAAS,YAAA;AAAA,QACT,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,QAAA,EAAU,QAAA,CAAc,eAAA,CAAgB,OAAA,EAAS,YAAY,CAAA;AAAA,QAC7D,kBAAA,EAAoB,kBAAA;AAAA,UAClB,eAAA,CAAgB,OAAA;AAAA,UAChB;AAAA,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,kBAAA,EAAoB,UAAA;AAAA,YAClB,eAAA,CAAgB,OAAA;AAAA,YAChB,KAAA,CAAM;AAAA,WACR;AAAA,UACA,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,UAC9B,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,UACxB,WAAA,EAAa,KAAA,CAAM,WAAA,CAAY,QAAA,EAAS;AAAA,UACxC,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,eAAA,EAAiB,MAAM,eAAA,IAAmB;AAAA,SAC5C;AAAA,QACA,IAAA,EAAM,aAAa,WAAA,IAAe,IAAA;AAAA,QAClC,MAAA,EAAQ,aAAa,aAAA,IAAiB,IAAA;AAAA,QACtC,OAAO,KAAA,GACH;AAAA,UACE,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,MAAM,KAAA,CAAM;AAAA,SACd,GACA,IAAA;AAAA,QACJ,YAAY,MAAA,GACR;AAAA,UACE,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,QAAA,EAAS;AAAA,UACnC,YAAA,EAAc,MAAA,CAAO,YAAA,CAAa,QAAA,EAAS;AAAA,UAC3C,SAAS,MAAA,CAAO;AAAA,SAClB,GACA;AAAA,OACN;AACA,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAI5B,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK,iBAAiB,CAAC,CAAA;AAC/C,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AACzD,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,eAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AACrE,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AACpD,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AACxD,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,CAAA,CAAE,CAAA;AAC5D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,CAAA,CAAE,CAAA;AAC7D,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACtD,IAAA,IAAI,MAAM,SAAA,EAAW;AACnB,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,MAAM,eAAA,EAAiB;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,eAAe,CAAA,CAAE,CAAA;AAAA,IACvE;AAEA,IAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,WAAW,CAAA,CAAE,CAAA;AAAA,IACnE;AAEA,IAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,aAAa,CAAA,CAAE,CAAA;AAAA,IACvE;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,CAAA,IAAA,CAAM,CAAA;AAAA,IACjE;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,UAAU,IAAI,IAAA,CAAK,OAAO,MAAA,CAAO,YAAY,IAAI,GAAI,CAAA;AAC3D,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAA,EAAKA,OAAM,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,oBAAoB,CAAA;AAAA,OAC/D;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,6BACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;;;ACtIO,SAAS,qBAAqBqB,QAAAA,EAAwB;AAC3D,EAAA,MAAM,eAAeA,QAAAA,CAClB,OAAA,CAAQ,OAAO,CAAA,CACf,YAAY,gCAAgC,CAAA;AAG/C,EAAA,MAAM,aAAA,GAAgB,IAAIG,OAAAA,CAAQ,QAAQ,CAAA,CACvC,WAAA,CAAY,yBAAyB,CAAA,CACrC,cAAA,CAAe,eAAA,EAAiB,YAAY,CAAA,CAC5C,cAAA,CAAe,mBAAA,EAAqB,cAAc,CAAA,CAClD,cAAA,CAAe,eAAA,EAAiB,iBAAiB,CAAA,CACjD,MAAA,CAAO,mBAAA,EAAqB,qBAAqB,CAAA,CACjD,MAAA,CAAO,gBAAA,EAAkB,cAAc,CAAA,CACvC,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,oBAAA,EAAsB,gCAAgC,CAAA,CAC7D,MAAA,CAAO,kCAAA,EAAoC,kCAAkC,CAAA,CAC7E,MAAA,CAAO,4BAAA,EAA8B,kCAAkC,CAAA,CACvE,MAAA,CAAO,8BAAA,EAAgC,mCAAmC,CAAA,CAC1E,MAAA,CAAO,4BAAA,EAA8B,uCAAuC,CAAA,CAC5E,MAAA,CAAO,qBAAA,EAAuB,yDAAyD,CAAA,CACvF,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,kBAAA,CAAmB;AAAA,MACvB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,MAC1B,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,WAAA,GAAc,IAAIA,OAAAA,CAAQ,MAAM,CAAA,CACnC,WAAA,CAAY,oCAAoC,CAAA,CAChD,cAAA,CAAe,qBAAA,EAAuB,eAAe,CAAA,CACrD,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,gBAAA,CAAiB;AAAA,MACrB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,YAAA,CAAa,WAAW,aAAa,CAAA;AACrC,EAAA,YAAA,CAAa,WAAW,WAAW,CAAA;AACrC;ACnEA,eAAsB,kBACpB,OAAA,EACe;AACf,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAIpB,aAAAA,CAAc;AAAA,IAC/B,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AAED,EAAA,IAAI;AAEF,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,QACjD,GAAA,EAAK,2BAAA;AAAA,QACL,UAAU,OAAA,CAAQ;AAAA,OACnB,CAAA;AACD,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,cAAA,GAAiB,aAAA,CAAc,IAAA;AAAA,MACjC;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAGA,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,QAClD,GAAA,EAAK,4BAAA;AAAA,QACL,UAAU,OAAA,CAAQ;AAAA,OACnB,CAAA;AACD,MAAA,IAAI,eAAe,IAAA,EAAM;AACvB,QAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,cAAA,CAAe,IAAI,CAAA;AACzD,QAAA,SAAA,GAAY,QAAA,EAAU,UAAA;AACtB,QAAA,GAAA,GAAM,QAAA,EAAU,GAAA;AAChB,QAAA,WAAA,GAAc,QAAA,EAAU,YAAA;AACxB,QAAA,YAAA,GAAe,QAAA,EAAU,aAAA;AAAA,MAC3B;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAGA,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,kBAAA,CAAmB;AAAA,QACnD,GAAA,EAAK,0BAAA;AAAA,QACL,UAAU,OAAA,CAAQ;AAAA,OACnB,CAAA;AACD,MAAA,IAAI,aAAa,IAAA,EAAM;AACrB,QAAA,UAAA,GAAa,aAAa,IAAA,CAAK,MAAA;AAC/B,QAAA,eAAA,GAAkB,YAAA,CAAa,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA;AAAA,MACxD;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,IACE,iBAAiB,mCAAA,IACjB,CAAC,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA,EAClC;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAGA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,QAC7C,GAAA,EAAK,uBAAA;AAAA,QACL,UAAU,OAAA,CAAQ;AAAA,OACnB,CAAA;AACD,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,OAAA,GAAU,UAAU,IAAA,CAAK,MAAA;AAAA,MAC3B;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,MAAM,aAAa,cAAA,IAAkB,SAAA,IAAa,GAAA,IAAO,WAAA,IAAe,gBAAgB,UAAA,IAAc,OAAA;AAEtG,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,UAAA,EAAY,UAAA,CAAgB,eAAA,CAAgB,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,QACpE,SAAA,EAAW,SAAA,CAAe,eAAA,CAAgB,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,QAClE,gBAAgB,cAAA,IAAkB,IAAA;AAAA,QAClC,aAAa,WAAA,IAAe,IAAA;AAAA,QAC5B,WAAW,SAAA,IAAa,IAAA;AAAA,QACxB,KAAK,GAAA,IAAO,IAAA;AAAA,QACZ,cAAc,YAAA,IAAgB,IAAA;AAAA,QAC9B,QAAQ,UAAA,GACJ,EAAE,MAAM,UAAA,EAAY,SAAA,EAAW,iBAAgB,GAC/C,IAAA;AAAA,QACJ,GAAA,EAAK,OAAA,GAAU,EAAE,IAAA,EAAM,SAAQ,GAAI,IAAA;AAAA,QACnC;AAAA,OACF;AACA,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIJ,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK,cAAc,CAAC,CAAA;AAC5C,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAC5D,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,eAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AACrE,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,eAAe,CAAC,IAC9B,WAAA,IAAeA,MAAAA,CAAM,IAAA,CAAK,WAAW,CACvC,CAAA;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAC,IACjC,cAAA,IAAkBA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAC1C,CAAA;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAC5B,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAKA,MAAAA,CAAM,IAAA,CAAK,WAAW,CACtD,CAAA;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,MAAM,CAAC,IAAI,GAAA,IAAOA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,KAC3D;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAC,IAC/B,YAAA,IAAgBA,MAAAA,CAAM,IAAA,CAAK,WAAW,CACxC,CAAA;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,KAAKA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,IACxB,UAAA,GACI,CAAA,EAAG,UAAU,CAAA,MAAA,EAAS,kBAAkB,aAAA,GAAgB,EAAE,KAC1DA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAC5B,CAAA;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAC5B,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,MAAA,CAAA,GAAWA,MAAAA,CAAM,IAAA,CAAK,WAAW,CACvD,CAAA;AAAA,KACF;AAEA,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,6CAA6C,CAAC,CAAA;AAAA,IACzE;AACA,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;AClLA,eAAsB,yBACpB,OAAA,EACe;AAEf,EAAA,IAAI,CAAC,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC5B,IAAA,aAAA;AAAA,MACE,CAAA,cAAA,EAAiB,QAAQ,GAAG,CAAA,mEAAA;AAAA,KAC9B;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,4BAAA,CAA6B,OAAA,CAAQ,GAAG,CAAA;AAG5D,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,MACd;AAAA,QACE,IAAIG,gBAAAA,CAAiB,OAAA;AAAA,QACrB,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,QACtB,YAAA,EAAc,KAAA;AAAA,QACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,OACxE;AAAA,MACA,eAAA,CAAgB;AAAA,KAClB;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAUS,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAC5D,IAAA,MAAM,UAAUE,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,SAASC,kBAAAA,CAAmB;AAAA,MAChC,OAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA;AAAA,MACP,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA,CAAE,MAAA,CAAO,aAAa,CAAA;AAEvB,IAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,CAAA,oCAAA,CAA+B,CAAC,CAAA;AACvD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,WAAW,OAAA,CAAQ,GAAG,EAAE,CAAC,CAAA;AAChD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,eAAe,OAAA,CAAQ,OAAO,EAAE,CAAC,CAAA;AAGxD,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,aAAA,CAAc;AAAA,MACtC,SAASG,gBAAAA,CAAiB,OAAA;AAAA,MAC1B,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,MACtB,YAAA,EAAc,KAAA;AAAA,MACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,KACvE,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIH,MAAAA,CAAM,IAAA,CAAK,CAAA,kCAAA,CAA+B,CAAC,CAAA;AAGvD,IAAA,MAAM,UAAU,MAAM,MAAA,CAAO,yBAAA,CAA0B,EAAE,MAAM,CAAA;AAE/D,IAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW;AAChC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAA;AAAA,UACJ;AAAA;AAAA,eAAA,EAA6D,IAAI;AAAA,OAAA,EAAY,QAAQ,GAAG,CAAA;AAAA;AAC1F,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,kCACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;AC3FA,eAAsB,oBAAA,CACpB,SACA,MAAA,EAC2B;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAClD,GAAA,EAAK6B,4BAAAA;AAAA,MACL,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,IAAI,eAAe,IAAA,EAAM;AACvB,MAAA,MAAM,QAAA,GAAWC,oBAAAA,CAAqB,cAAA,CAAe,IAAI,CAAA;AACzD,MAAA,OAAO;AAAA,QACL,YAAY,QAAA,EAAU,UAAA;AAAA,QACtB,KAAK,QAAA,EAAU,GAAA;AAAA,QACf,cAAc,QAAA,EAAU,YAAA;AAAA,QACxB,eAAe,QAAA,EAAU;AAAA,OAC3B;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,IAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;;;ACvBA,eAAsB,0BACpB,OAAA,EACe;AAEf,EAAA,IAAI,CAAC,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACvC,IAAA,aAAA;AAAA,MACE,CAAA,qBAAA,EAAwB,QAAQ,QAAQ,CAAA,wEAAA;AAAA,KAC1C;AAAA,EACF;AAGA,EAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,GACtD,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,GACxB,OAAA,CAAQ,QAAA;AACZ,EAAA,MAAM,eAAA,GAAkB,IAAI,kBAAkB,CAAA,CAAA;AAG9C,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAGD,IAAA,IAAI,WAA6D,EAAC;AAClE,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,aAAA,GAAgB,IAAI1B,aAAAA,CAAc;AAAA,QACtC,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,SAAA,EAAW,QAAQ,MAAA,GACf,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAC5B;AAAA,OACL,CAAA;AACD,MAAA,QAAA,GAAW,MAAM,oBAAA,CAAqB,OAAA,CAAQ,OAAA,EAAS,aAAa,CAAA;AAAA,IACtE;AAEA,IAAA,MAAM,cAAc,6BAAA,CAA8B;AAAA,MAChD,UAAA,EAAY,kBAAA;AAAA,MACZ,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,eAAe,QAAA,CAAS;AAAA,KACzB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,MACd;AAAA,QACE,IAAID,gBAAAA,CAAiB,OAAA;AAAA,QACrB,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,QACtB,YAAA,EAAc,KAAA;AAAA,QACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,OACxE;AAAA,MACA,eAAA,CAAgB;AAAA,KAClB;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAUS,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAC5D,IAAA,MAAM,UAAUE,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,SAASC,kBAAAA,CAAmB;AAAA,MAChC,OAAA;AAAA,MACA,KAAA,EAAOd,IAAAA;AAAA;AAAA,MACP,SAAA,EAAWe,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA,CAAE,MAAA,CAAOc,aAAa,CAAA;AAEvB,IAAA,OAAA,CAAQ,GAAA,CAAI/B,MAAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,CAAuB,CAAC,CAAA;AAC/C,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,eAAe,EAAE,CAAC,CAAA;AACzD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,eAAe,OAAA,CAAQ,OAAO,EAAE,CAAC,CAAA;AAGxD,IAAA,MAAM,aAAA,GAAgB,IAAII,aAAAA,CAAc;AAAA,MACtC,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,SAAA,EAAW,cAAc,MAAA,GACrB,EAAE,SAAS,CAAC,aAAA,CAAc,MAAM,CAAA,EAAE,GAClC,KAAA;AAAA,KACL,CAAA;AACD,IAAA,MAAM,WAAW,MAAM,oBAAA;AAAA,MACrB,OAAA,CAAQ,OAAA;AAAA,MACR;AAAA,KACF;AAGA,IAAA,MAAM,cAAc,6BAAA,CAA8B;AAAA,MAChD,UAAA,EAAY,kBAAA;AAAA,MACZ,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,eAAe,QAAA,CAAS;AAAA,KACzB,CAAA;AAGD,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,aAAA,CAAc;AAAA,MACtC,SAASD,gBAAAA,CAAiB,OAAA;AAAA,MAC1B,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,MACtB,YAAA,EAAc,KAAA;AAAA,MACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,KACvE,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIH,MAAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,CAA6B,CAAC,CAAA;AAGrD,IAAA,MAAM,UAAU,MAAM,MAAA,CAAO,yBAAA,CAA0B,EAAE,MAAM,CAAA;AAE/D,IAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW;AAChC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAA;AAAA,UACJ;AAAA;AAAA,eAAA,EAAsD,IAAI;AAAA,YAAA,EAAiB,eAAe,CAAA;AAAA;AAC5F,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,6BACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;ACpIA,eAAsB,qBACpB,OAAA,EACe;AAEf,EAAA,IAAI,CAAC,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC5B,IAAA,aAAA;AAAA,MACE,CAAA,cAAA,EAAiB,QAAQ,GAAG,CAAA,sEAAA;AAAA,KAC9B;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAGD,IAAA,IAAI,WAA6D,EAAC;AAClE,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,aAAA,GAAgB,IAAII,aAAAA,CAAc;AAAA,QACtC,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,SAAA,EAAW,QAAQ,MAAA,GACf,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAC5B;AAAA,OACL,CAAA;AACD,MAAA,QAAA,GAAW,MAAM,oBAAA,CAAqB,OAAA,CAAQ,OAAA,EAAS,aAAa,CAAA;AAAA,IACtE;AAEA,IAAA,MAAM,cAAc4B,6BAAAA,CAA8B;AAAA,MAChD,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,eAAe,QAAA,CAAS;AAAA,KACzB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,MACd;AAAA,QACE,IAAI7B,gBAAAA,CAAiB,OAAA;AAAA,QACrB,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,QACtB,YAAA,EAAc,KAAA;AAAA,QACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,OACxE;AAAA,MACA,eAAA,CAAgB;AAAA,KAClB;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAUS,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAC5D,IAAA,MAAM,UAAUE,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,SAASC,kBAAAA,CAAmB;AAAA,MAChC,OAAA;AAAA,MACA,KAAA,EAAOd,IAAAA;AAAA;AAAA,MACP,SAAA,EAAWe,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA,CAAE,MAAA,CAAOc,aAAa,CAAA;AAEvB,IAAA,OAAA,CAAQ,GAAA,CAAI/B,MAAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,CAAwB,CAAC,CAAA;AAChD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,WAAW,OAAA,CAAQ,GAAG,EAAE,CAAC,CAAA;AAChD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,eAAe,OAAA,CAAQ,OAAO,EAAE,CAAC,CAAA;AAGxD,IAAA,MAAM,aAAA,GAAgB,IAAII,aAAAA,CAAc;AAAA,MACtC,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,SAAA,EAAW,cAAc,MAAA,GACrB,EAAE,SAAS,CAAC,aAAA,CAAc,MAAM,CAAA,EAAE,GAClC,KAAA;AAAA,KACL,CAAA;AACD,IAAA,MAAM,WAAW,MAAM,oBAAA;AAAA,MACrB,OAAA,CAAQ,OAAA;AAAA,MACR;AAAA,KACF;AAGA,IAAA,MAAM,cAAc4B,6BAAAA,CAA8B;AAAA,MAChD,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,eAAe,QAAA,CAAS;AAAA,KACzB,CAAA;AAGD,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,aAAA,CAAc;AAAA,MACtC,SAAS7B,gBAAAA,CAAiB,OAAA;AAAA,MAC1B,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,MACtB,YAAA,EAAc,KAAA;AAAA,MACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,KACvE,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIH,MAAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,CAA6B,CAAC,CAAA;AAGrD,IAAA,MAAM,UAAU,MAAM,MAAA,CAAO,yBAAA,CAA0B,EAAE,MAAM,CAAA;AAE/D,IAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW;AAChC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAA;AAAA,UACJ;AAAA;AAAA,eAAA,EAA+C,IAAI;AAAA,OAAA,EAAY,QAAQ,GAAG,CAAA;AAAA;AAC5E,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,sBACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;AC9HA,eAAsB,6BACpB,OAAA,EACe;AAEf,EAAA,IAAI,CAAC,kBAAA,CAAmB,OAAA,CAAQ,IAAI,CAAA,EAAG;AACrC,IAAA,aAAA;AAAA,MACE,CAAA,uBAAA,EAA0B,QAAQ,IAAI,CAAA,8EAAA;AAAA,KACxC;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAGD,IAAA,IAAI,WAA6D,EAAC;AAClE,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,aAAA,GAAgB,IAAII,aAAAA,CAAc;AAAA,QACtC,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,SAAA,EAAW,QAAQ,MAAA,GACf,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAC5B;AAAA,OACL,CAAA;AACD,MAAA,QAAA,GAAW,MAAM,oBAAA,CAAqB,OAAA,CAAQ,OAAA,EAAS,aAAa,CAAA;AAAA,IACtE;AAEA,IAAA,MAAM,cAAc4B,6BAAAA,CAA8B;AAAA,MAChD,cAAc,OAAA,CAAQ,IAAA;AAAA,MACtB,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,eAAe,QAAA,CAAS;AAAA,KACzB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,MACd;AAAA,QACE,IAAI7B,gBAAAA,CAAiB,OAAA;AAAA,QACrB,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,QACtB,YAAA,EAAc,KAAA;AAAA,QACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,OACxE;AAAA,MACA,eAAA,CAAgB;AAAA,KAClB;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAUS,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAC5D,IAAA,MAAM,UAAUE,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,SAASC,kBAAAA,CAAmB;AAAA,MAChC,OAAA;AAAA,MACA,KAAA,EAAOd,IAAAA;AAAA;AAAA,MACP,SAAA,EAAWe,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA,CAAE,MAAA,CAAOc,aAAa,CAAA;AAEvB,IAAA,OAAA,CAAQ,GAAA,CAAI/B,MAAAA,CAAM,IAAA,CAAK,CAAA,uBAAA,CAAyB,CAAC,CAAA;AACjD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,YAAY,OAAA,CAAQ,IAAI,EAAE,CAAC,CAAA;AAClD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,eAAe,OAAA,CAAQ,OAAO,EAAE,CAAC,CAAA;AAGxD,IAAA,MAAM,aAAA,GAAgB,IAAII,aAAAA,CAAc;AAAA,MACtC,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,SAAA,EAAW,cAAc,MAAA,GACrB,EAAE,SAAS,CAAC,aAAA,CAAc,MAAM,CAAA,EAAE,GAClC,KAAA;AAAA,KACL,CAAA;AACD,IAAA,MAAM,WAAW,MAAM,oBAAA;AAAA,MACrB,OAAA,CAAQ,OAAA;AAAA,MACR;AAAA,KACF;AAGA,IAAA,MAAM,cAAc4B,6BAAAA,CAA8B;AAAA,MAChD,cAAc,OAAA,CAAQ,IAAA;AAAA,MACtB,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,eAAe,QAAA,CAAS;AAAA,KACzB,CAAA;AAGD,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,aAAA,CAAc;AAAA,MACtC,SAAS7B,gBAAAA,CAAiB,OAAA;AAAA,MAC1B,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,MACtB,YAAA,EAAc,KAAA;AAAA,MACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,KACvE,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIH,MAAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,CAA6B,CAAC,CAAA;AAGrD,IAAA,MAAM,UAAU,MAAM,MAAA,CAAO,yBAAA,CAA0B,EAAE,MAAM,CAAA;AAE/D,IAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW;AAChC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAA;AAAA,UACJ;AAAA;AAAA,eAAA,EAAwD,IAAI;AAAA,QAAA,EAAa,QAAQ,IAAI,CAAA;AAAA;AACvF,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,+BACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;AC9HA,eAAsB,8BACpB,OAAA,EACe;AAEf,EAAA,IAAI,CAAC,mBAAA,CAAoB,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC9C,IAAA,aAAA;AAAA,MACE,CAAA,wBAAA,EAA2B,QAAQ,YAAY,CAAA,gEAAA;AAAA,KACjD;AAAA,EACF;AAGA,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,YAAA,CAAa,WAAA,EAAY;AAG3D,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAGD,IAAA,IAAI,WAA6D,EAAC;AAClE,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,aAAA,GAAgB,IAAII,aAAAA,CAAc;AAAA,QACtC,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,SAAA,EAAW,QAAQ,MAAA,GACf,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAC5B;AAAA,OACL,CAAA;AACD,MAAA,QAAA,GAAW,MAAM,oBAAA,CAAqB,OAAA,CAAQ,OAAA,EAAS,aAAa,CAAA;AAAA,IACtE;AAEA,IAAA,MAAM,cAAc4B,6BAAAA,CAA8B;AAAA,MAChD,aAAA,EAAe,iBAAA;AAAA,MACf,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS;AAAA,KACxB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,MACd;AAAA,QACE,IAAI7B,gBAAAA,CAAiB,OAAA;AAAA,QACrB,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,QACtB,YAAA,EAAc,KAAA;AAAA,QACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,OACxE;AAAA,MACA,eAAA,CAAgB;AAAA,KAClB;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAUS,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAC5D,IAAA,MAAM,UAAUE,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,SAASC,kBAAAA,CAAmB;AAAA,MAChC,OAAA;AAAA,MACA,KAAA,EAAOd,IAAAA;AAAA;AAAA,MACP,SAAA,EAAWe,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA,CAAE,MAAA,CAAOc,aAAa,CAAA;AAEvB,IAAA,OAAA,CAAQ,GAAA,CAAI/B,MAAAA,CAAM,IAAA,CAAK,CAAA,gCAAA,CAAkC,CAAC,CAAA;AAC1D,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,iBAAiB,EAAE,CAAC,CAAA;AAChE,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,eAAe,OAAA,CAAQ,OAAO,EAAE,CAAC,CAAA;AAGxD,IAAA,MAAM,aAAA,GAAgB,IAAII,aAAAA,CAAc;AAAA,MACtC,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,SAAA,EAAW,cAAc,MAAA,GACrB,EAAE,SAAS,CAAC,aAAA,CAAc,MAAM,CAAA,EAAE,GAClC,KAAA;AAAA,KACL,CAAA;AACD,IAAA,MAAM,WAAW,MAAM,oBAAA;AAAA,MACrB,OAAA,CAAQ,OAAA;AAAA,MACR;AAAA,KACF;AAGA,IAAA,MAAM,cAAc4B,6BAAAA,CAA8B;AAAA,MAChD,aAAA,EAAe,iBAAA;AAAA,MACf,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS;AAAA,KACxB,CAAA;AAGD,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,aAAA,CAAc;AAAA,MACtC,SAAS7B,gBAAAA,CAAiB,OAAA;AAAA,MAC1B,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,MACtB,YAAA,EAAc,KAAA;AAAA,MACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,KACvE,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIH,MAAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,CAA6B,CAAC,CAAA;AAGrD,IAAA,MAAM,UAAU,MAAM,MAAA,CAAO,yBAAA,CAA0B,EAAE,MAAM,CAAA;AAE/D,IAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW;AAChC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAA;AAAA,UACJ;AAAA;AAAA,eAAA,EAAyD,IAAI;AAAA,iBAAA,EAAsB,iBAAiB,CAAA;AAAA;AACtG,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,gCACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;AChIA,IAAM,kBAAkB,EAAA,GAAK,IAAA;AAC7B,IAAM,eAAA,GAAkB,yBAAA;AAKxB,SAAS,gBAAgB,MAAA,EAAyB;AAEhD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AAC/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AAErB,IAAA,IAAI,IAAA,KAAS,GAAG,OAAO,IAAA;AAEvB,IAAA,IAAI,IAAA,GAAO,MAAM,IAAA,KAAS,CAAA,IAAK,SAAS,EAAA,IAAM,IAAA,KAAS,IAAI,OAAO,IAAA;AAAA,EACpE;AACA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,YAAY,QAAA,EAA0B;AAC7C,EAAA,MAAM,GAAA,GAAW,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAC/C,EAAA,MAAM,SAAA,GAAoC;AAAA,IACxC,MAAA,EAAQ,WAAA;AAAA,IACR,MAAA,EAAQ,YAAA;AAAA,IACR,OAAA,EAAS,YAAA;AAAA,IACT,MAAA,EAAQ,WAAA;AAAA,IACR,OAAA,EAAS,YAAA;AAAA,IACT,MAAA,EAAQ,eAAA;AAAA,IACR,MAAA,EAAQ,iBAAA;AAAA,IACR,OAAA,EAAS,WAAA;AAAA,IACT,MAAA,EAAQ,WAAA;AAAA,IACR,MAAA,EAAQ,UAAA;AAAA,IACR,KAAA,EAAO,wBAAA;AAAA,IACP,OAAA,EAAS,kBAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,OAAO,SAAA,CAAU,GAAG,CAAA,IAAK,0BAAA;AAC3B;AAKA,SAAS,eAAA,CAAgB,QAAgB,QAAA,EAA0B;AACjE,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AACvC,EAAA,OAAO,CAAA,KAAA,EAAQ,QAAQ,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AAC1C;AAKA,eAAsB,wBACpB,OAAA,EACe;AAEf,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,IAAQ,CAAC,QAAQ,OAAA,EAAS;AACrC,IAAA,aAAA;AAAA,MACE;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,OAAA,EAAS;AACnC,IAAA,aAAA,CAAc,uDAAuD,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,aAAA;AAGJ,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,QAAA,GAAgB,IAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAG1C,IAAA,IAAI,CAAIiC,GAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,aAAA,CAAc,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC7C;AAGA,IAAA,MAAM,MAAA,GAAYA,iBAAa,QAAQ,CAAA;AAGvC,IAAA,IAAI,MAAA,CAAO,SAAS,eAAA,EAAiB;AACnC,MAAA,aAAA;AAAA,QACE,CAAA,gBAAA,EAAmB,MAAA,CAAO,MAAM,CAAA,0BAAA,EAA6B,eAAe,CAAA,cAAA;AAAA,OAC9E;AAAA,IACF;AAGA,IAAA,IAAI,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC3B,MAAA,MAAM,QAAA,GAAW,YAAY,QAAQ,CAAA;AACrC,MAAA,aAAA,GAAgB,eAAA,CAAgB,QAAQ,QAAQ,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,aAAA,GAAgB,MAAA,CAAO,SAAS,OAAO,CAAA;AAAA,IACzC;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,aAAA,GAAgB,OAAA,CAAQ,OAAA;AAGxB,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,aAAA,EAAe,OAAO,CAAA;AAC5D,IAAA,IAAI,cAAc,eAAA,EAAiB;AACjC,MAAA,aAAA;AAAA,QACE,CAAA,mBAAA,EAAsB,WAAW,CAAA,0BAAA,EAA6B,eAAe,CAAA,cAAA;AAAA,OAC/E;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,UAAUC,0BAA0B,CAAA;AAGrD,EAAA,MAAM,MAAA,GAAS,oBAAoB,aAAa,CAAA;AAGhD,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,MACd;AAAA,QACE,IAAIC,wBAAAA,CAAyB,OAAA;AAAA,QAC7B,KAAKA,wBAAAA,CAAyB,GAAA;AAAA,QAC9B,YAAA,EAAc,KAAA;AAAA,QACd,IAAA,EAAM,CAAC,QAAA,EAAU,eAAA,EAAiB,MAAM;AAAA,OAC1C;AAAA,MACA,eAAA,CAAgB;AAAA,KAClB;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAUvB,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAC5D,IAAA,MAAM,UAAUE,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,SAASC,kBAAAA,CAAmB;AAAA,MAChC,OAAA;AAAA,MACA,KAAA,EAAOd,IAAAA;AAAA;AAAA,MACP,SAAA,EAAWe,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA,CAAE,MAAA,CAAOc,aAAa,CAAA;AAEvB,IAAA,OAAA,CAAQ,GAAA,CAAI/B,MAAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,CAA2B,CAAC,CAAA;AACnD,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,OAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,OAAO,UAAA,CAAW,aAAa,CAAC,CAAA,MAAA,CAAQ;AAAA,KACzE;AACA,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,cAAc,MAAA,CAAO,MAAM,EAAE,CAAC,CAAA;AACrD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,eAAe,OAAA,CAAQ,OAAO,EAAE,CAAC,CAAA;AAGxD,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,aAAA,CAAc;AAAA,MACtC,SAASmC,wBAAAA,CAAyB,OAAA;AAAA,MAClC,KAAKA,wBAAAA,CAAyB,GAAA;AAAA,MAC9B,YAAA,EAAc,KAAA;AAAA,MACd,IAAA,EAAM,CAAC,QAAA,EAAU,eAAA,EAAiB,MAAM;AAAA,KACzC,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAInC,MAAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,CAA6B,CAAC,CAAA;AAGrD,IAAA,MAAM,UAAU,MAAM,MAAA,CAAO,yBAAA,CAA0B,EAAE,MAAM,CAAA;AAE/D,IAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW;AAChC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAA;AAAA,UACJ;AAAA;AAAA,eAAA,EAAkD,IAAI;AAAA,gBAAA,EAAqB,MAAA,CAAO,UAAA,CAAW,aAAa,CAAC,CAAA;AAAA,UAAA,EAAqB,OAAO,MAAM,CAAA;AAAA;AAC/I,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,yBACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;AC3MA,SAAS,UAAU,OAAA,EAA0B;AAC3C,EAAA,OAAO,OAAA,CAAQ,WAAW,OAAO,CAAA;AACnC;AAKA,SAAS,aAAa,OAAA,EAAuD;AAC3E,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,4BAA4B,CAAA;AACxD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,EAC3C;AACA,EAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,EAAA,MAAM,UAAA,GAAa,MAAM,CAAC,CAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAC/C,EAAA,OAAO,EAAE,QAAQ,QAAA,EAAS;AAC5B;AAKA,SAAS,yBAAyB,QAAA,EAA0B;AAC1D,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,WAAA,EAAa,MAAA;AAAA,IACb,YAAA,EAAc,MAAA;AAAA,IACd,WAAA,EAAa,MAAA;AAAA,IACb,YAAA,EAAc,OAAA;AAAA,IACd,eAAA,EAAiB,MAAA;AAAA,IACjB,iBAAA,EAAmB,MAAA;AAAA,IACnB,WAAA,EAAa,OAAA;AAAA,IACb,UAAA,EAAY,MAAA;AAAA,IACZ,wBAAA,EAA0B,KAAA;AAAA,IAC1B,kBAAA,EAAoB,OAAA;AAAA,IACpB,YAAA,EAAc,MAAA;AAAA,IACd,0BAAA,EAA4B;AAAA,GAC9B;AACA,EAAA,OAAO,UAAA,CAAW,QAAQ,CAAA,IAAK,MAAA;AACjC;AAKA,eAAsB,wBACpB,OAAA,EACe;AACf,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAII,aAAAA,CAAc;AAAA,IAC/B,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AAED,EAAA,IAAI;AAEF,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,kBAAA,CAAmB;AAAA,QAC7C,GAAA,EAAK8B,0BAAAA;AAAA,QACL,UAAU,OAAA,CAAQ;AAAA,OACnB,CAAA;AAED,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,aAAA,GAAgB,MAAA,CAAO,IAAA;AACvB,QAAA,UAAA,GAAa,MAAA,CAAO,IAAA;AAAA,MACtB;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,IACE,iBAAiB,mCAAA,IACjB,CAAC,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA,EAClC;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IAEF;AAGA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,QAAQ,aAAA,IAAiB,IAAA;AAAA,QACzB,UAAU,UAAA,IAAc,IAAA;AAAA,QACxB,SAAA,EAAW,CAAC,CAAC,aAAA;AAAA,QACb,SAAA,EAAW,aAAA,GAAgB,SAAA,CAAU,aAAa,CAAA,GAAI,KAAA;AAAA,QACtD,aAAA,EAAe,aAAA,GAAgB,aAAA,CAAc,MAAA,GAAS;AAAA,OACxD;AACA,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,aAAA,CAAc,CAAA,6BAAA,EAAgC,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,IACjE;AAGA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,UAAA,GAAkBE,IAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAG9C,MAAA,IAAI,SAAA,CAAU,aAAa,CAAA,EAAG;AAC5B,QAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,aAAa,aAAa,CAAA;AAGvD,QAAA,IAAI,SAAA,GAAY,UAAA;AAChB,QAAA,IAAI,CAAMA,IAAA,CAAA,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC7B,UAAA,SAAA,GAAY,UAAA,GAAa,yBAAyB,QAAQ,CAAA;AAAA,QAC5D;AAEA,QAAGC,GAAA,CAAA,aAAA,CAAc,WAAW,MAAM,CAAA;AAClC,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNrC,OAAM,KAAA,CAAM,CAAA,mBAAA,EAAsB,SAAS,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,OAAA,CAAS;AAAA,SACxE;AAAA,MACF,CAAA,MAAO;AAEL,QAAGqC,GAAA,CAAA,aAAA,CAAc,UAAA,EAAY,aAAA,EAAe,OAAO,CAAA;AACnD,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNrC,MAAAA,CAAM,KAAA;AAAA,YACJ,CAAA,mBAAA,EAAsB,UAAU,CAAA,EAAA,EAAK,aAAA,CAAc,MAAM,CAAA,OAAA;AAAA;AAC3D,SACF;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAIA,IAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,0BACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;ACrIA,eAAsB,qBACpB,OAAA,EACe;AAEf,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,CAAQ,IAAA,EAAM,QAAQ,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAA;AAAA,IACjE;AAAA,GACF,CAAE,MAAA;AACF,EAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,IAAA,aAAA;AAAA,MACE;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,aAAA,CAAc,6DAA6D,CAAA;AAAA,EAC7E;AAEA,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI,QAAQ,KAAA,EAAO;AAEjB,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,OAAA,CAAQ,KAAK,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,YAAY,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,CACzC,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,GAAG,CAAA,KAAM,CAAA,EAAA,EAAK,GAAG,CAAA,QAAA,EAAM,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA,CAC5C,KAAK,IAAI,CAAA;AACZ,MAAA,aAAA;AAAA,QACE,CAAA,gBAAA,EAAmB,QAAQ,KAAK,CAAA;;AAAA;AAAA,EAA2B,SAAS,CAAA;AAAA,OACtE;AAAA,IACF;AACA,IAAA,UAAA,GAAa,KAAA,CAAM,GAAA;AACnB,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,mBAAmB,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA;AAAA,EACzD,CAAA,MAAA,IAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,MAAM,QAAA,GAAgBsC,IAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAIC,GAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,aAAA,CAAc,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC7C;AACA,IAAA,MAAM,MAAA,GAAYA,iBAAa,QAAQ,CAAA;AACvC,IAAA,IAAI,MAAA,CAAO,SAAS,YAAA,EAAc;AAChC,MAAA,aAAA;AAAA,QACE,CAAA,gBAAA,EAAmB,MAAA,CAAO,MAAM,CAAA,0BAAA,EAA6B,YAAY,CAAA,cAAA;AAAA,OAC3E;AAAA,IACF;AACA,IAAA,UAAA,GAAa,MAAA,CAAO,SAAS,OAAO,CAAA;AAAA,EACtC,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,OAAA,CAAQ,OAAA;AACrB,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,UAAA,EAAY,OAAO,CAAA;AACzD,IAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,MAAA,aAAA;AAAA,QACE,CAAA,mBAAA,EAAsB,WAAW,CAAA,0BAAA,EAA6B,YAAY,CAAA,cAAA;AAAA,OAC5E;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,UAAA,CAAW,UAAU,CAAA,EAAG;AAC3B,IAAA,aAAA;AAAA,MACE;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,yBAAyB,UAAU,CAAA;AAGvD,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,MACd;AAAA,QACE,IAAIpC,gBAAAA,CAAiB,OAAA;AAAA,QACrB,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,QACtB,YAAA,EAAc,KAAA;AAAA,QACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,OACxE;AAAA,MACA,eAAA,CAAgB;AAAA,KAClB;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAUS,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAC5D,IAAA,MAAM,UAAUE,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,SAASC,kBAAAA,CAAmB;AAAA,MAChC,OAAA;AAAA,MACA,KAAA,EAAOd,IAAAA;AAAA,MACP,SAAA,EAAWe,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA,CAAE,MAAA,CAAOc,aAAa,CAAA;AAEvB,IAAA,OAAA,CAAQ,GAAA,CAAI/B,MAAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,CAAwB,CAAC,CAAA;AAChD,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,MAAAA,CAAM,IAAA;AAAA,QACJ,CAAA,iBAAA,EAAoB,MAAA,CAAO,UAAA,CAAW,UAAA,EAAY,OAAO,CAAC,CAAA,MAAA;AAAA;AAC5D,KACF;AACA,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,eAAe,OAAA,CAAQ,OAAO,EAAE,CAAC,CAAA;AAExD,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,aAAA,CAAc;AAAA,MACtC,SAASG,gBAAAA,CAAiB,OAAA;AAAA,MAC1B,KAAKA,gBAAAA,CAAiB,GAAA;AAAA,MACtB,YAAA,EAAc,KAAA;AAAA,MACd,MAAM,CAAC,WAAA,CAAY,UAAU,WAAA,CAAY,KAAA,EAAO,YAAY,UAAU;AAAA,KACvE,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIH,MAAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,CAA6B,CAAC,CAAA;AAErD,IAAA,MAAM,UAAU,MAAM,MAAA,CAAO,yBAAA,CAA0B,EAAE,MAAM,CAAA;AAE/D,IAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW;AAChC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAA;AAAA,UACJ;AAAA;AAAA,eAAA,EAA+C,IAAI;AAAA,gBAAA,EAAqB,MAAA,CAAO,UAAA,CAAW,UAAA,EAAY,OAAO,CAAC,CAAA,MAAA;AAAA;AAChH,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7C;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,sBACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;ACvJA,eAAsB,qBACpB,OAAA,EACe;AACf,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAII,aAAAA,CAAc;AAAA,IAC/B,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,SAAA,EAAW,QAAQ,MAAA,GAAS,EAAE,SAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,EAAE,GAAI;AAAA,GAC7D,CAAA;AAED,EAAA,IAAI;AACF,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,QAC1C,GAAA,EAAKoC,uBAAAA;AAAA,QACL,UAAU,OAAA,CAAQ;AAAA,OACnB,CAAA;AAED,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,UAAA,GAAa,MAAA,CAAO,IAAA;AAAA,MACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,KAAK,UAAA,IAAc,IAAA;AAAA,QACnB,MAAA,EAAQ,CAAC,CAAC,UAAA;AAAA,QACV,aAAA,EAAe,UAAA,GAAa,UAAA,CAAW,MAAA,GAAS;AAAA,OAClD;AACA,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,aAAA,CAAc,CAAA,iCAAA,EAAoC,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,IACrE;AAGA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,UAAA,GAAkBC,IAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAC9C,MAAGC,GAAA,CAAA,aAAA,CAAc,UAAA,EAAY,UAAA,EAAY,OAAO,CAAA;AAChD,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN1C,MAAAA,CAAM,KAAA;AAAA,UACJ,CAAA,gBAAA,EAAmB,UAAU,CAAA,EAAA,EAAK,UAAA,CAAW,MAAM,CAAA,OAAA;AAAA;AACrD,OACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,IAAI,UAAU,CAAA;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,uBACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,KACF;AAAA,EACF;AACF;AC/EA,eAAsB,wBAAwB,OAAA,EAE5B;AAChB,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AACtC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ2C,WAAW,CAAA,EAAG;AACtD,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,QAAA,EAAM,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,IACxC;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN;AAAA,KACF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAC9B;;;ACJO,SAAS,uBAAuBtB,QAAAA,EAAwB;AAE7D,EAAA,MAAM,iBAAiBA,QAAAA,CACpB,OAAA,CAAQ,SAAS,CAAA,CACjB,YAAY,yBAAyB,CAAA;AAGxC,EAAA,MAAM,UAAA,GAAa,IAAIG,OAAAA,CAAQ,KAAK,CAAA,CACjC,WAAA,CAAY,iCAAiC,CAAA,CAC7C,cAAA,CAAe,qBAAA,EAAuB,mCAAmC,CAAA,CACzE,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,iBAAA,CAAkB;AAAA,MACtB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,iBAAA,GAAoB,IAAIA,OAAAA,CAAQ,aAAa,CAAA,CAChD,WAAA,CAAY,8BAA8B,CAAA,CAC1C,cAAA,CAAe,aAAA,EAAe,+BAA+B,CAAA,CAC7D,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,wBAAA,CAAyB;AAAA,MAC7B,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,qBAAqB,IAAIA,OAAAA,CAAQ,gBAAgB,CAAA,CACpD,WAAA,CAAY,gDAAgD,CAAA,CAC5D,cAAA;AAAA,IACC,uBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,yBAAA,CAA0B;AAAA,MAC9B,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,aAAA,GAAgB,IAAIA,OAAAA,CAAQ,SAAS,CAAA,CACxC,WAAA,CAAY,sBAAsB,CAAA,CAClC,cAAA,CAAe,aAAA,EAAe,uCAAuC,CAAA,CACrE,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,oBAAA,CAAqB;AAAA,MACzB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,qBAAA,GAAwB,IAAIA,OAAAA,CAAQ,kBAAkB,CAAA,CACzD,WAAA,CAAY,+BAA+B,CAAA,CAC3C,cAAA,CAAe,eAAA,EAAiB,uCAAuC,CAAA,CACvE,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,4BAAA,CAA6B;AAAA,MACjC,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,yBAAyB,IAAIA,OAAAA,CAAQ,mBAAmB,CAAA,CAC3D,WAAA,CAAY,mEAAmE,CAAA,CAC/E,cAAA;AAAA,IACC,2BAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,6BAAA,CAA8B;AAAA,MAClC,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,gBAAA,GAAmB,IAAIA,OAAAA,CAAQ,YAAY,EAC9C,WAAA,CAAY,wCAAwC,CAAA,CACpD,MAAA,CAAO,iBAAiB,wCAAwC,CAAA,CAChE,MAAA,CAAO,kBAAA,EAAoB,kCAAkC,CAAA,CAC7D,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,uBAAA,CAAwB;AAAA,MAC5B,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,gBAAA,GAAmB,IAAIA,OAAAA,CAAQ,YAAY,EAC9C,WAAA,CAAY,mCAAmC,CAAA,CAC/C,cAAA,CAAe,uBAAuB,kCAAkC,CAAA,CACxE,MAAA,CAAO,iBAAA,EAAmB,gDAAgD,CAAA,CAC1E,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,uBAAA,CAAwB;AAAA,MAC5B,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,gBAAgB,IAAIA,OAAAA,CAAQ,SAAS,CAAA,CACxC,WAAA,CAAY,mCAAmC,CAAA,CAC/C,MAAA,CAAO,iBAAiB,kBAAkB,CAAA,CAC1C,OAAO,iBAAA,EAAmB,sBAAsB,EAChD,MAAA,CAAO,gBAAA,EAAkB,2EAA2E,CAAA,CACpG,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,oBAAA,CAAqB;AAAA,MACzB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,aAAA,GAAgB,IAAIA,OAAAA,CAAQ,SAAS,EACxC,WAAA,CAAY,uCAAuC,CAAA,CACnD,cAAA,CAAe,uBAAuB,+BAA+B,CAAA,CACrE,MAAA,CAAO,iBAAA,EAAmB,6CAA6C,CAAA,CACvE,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,oBAAA,CAAqB;AAAA,MACzB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAGH,EAAA,MAAM,gBAAA,GAAmB,IAAIA,OAAAA,CAAQ,YAAY,EAC9C,WAAA,CAAY,uDAAuD,CAAA,CACnE,MAAA,CAAO,eAAA,EAAiB,kDAAkD,CAAA,CAC1E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,uBAAA,CAAwB;AAAA,MAC5B,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,cAAA,CAAe,WAAW,UAAU,CAAA;AACpC,EAAA,cAAA,CAAe,WAAW,iBAAiB,CAAA;AAC3C,EAAA,cAAA,CAAe,WAAW,kBAAkB,CAAA;AAC5C,EAAA,cAAA,CAAe,WAAW,aAAa,CAAA;AACvC,EAAA,cAAA,CAAe,WAAW,qBAAqB,CAAA;AAC/C,EAAA,cAAA,CAAe,WAAW,sBAAsB,CAAA;AAChD,EAAA,cAAA,CAAe,WAAW,gBAAgB,CAAA;AAC1C,EAAA,cAAA,CAAe,WAAW,gBAAgB,CAAA;AAC1C,EAAA,cAAA,CAAe,WAAW,aAAa,CAAA;AACvC,EAAA,cAAA,CAAe,WAAW,aAAa,CAAA;AACvC,EAAA,cAAA,CAAe,WAAW,gBAAgB,CAAA;AAC5C;;;AC1WO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,OAAO,MAAM,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AAC9C;;;ACEA,eAAsB,oBAAoB,OAAA,EAA6C;AACrF,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,WAAA,CAAY;AAAA,MAC9C,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAClC,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,YAAY,CAAA,CAAE,UAAA;AAAA,QACd,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,QAAA,EAAS;AAAA,QAC9B,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,gBAAgB,CAAA,CAAE,cAAA;AAAA,QAClB,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,GAAI,EAAE,eAAA,GAAkB,EAAE,iBAAiB,CAAA,CAAE,eAAA,KAAoB;AAAC,OACpE,CAAE,CAAA;AACF,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAIxB,MAAAA,CAAM,MAAA,CAAO,0BAA0B,CAAC,CAAA;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK;AAAA,UAAA,EAAe,SAAS,MAAM,CAAA;AAAA,CAAM,CAAC,CAAA;AAElE,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,SAAS,IAAI,IAAA,CAAK,QAAQ,cAAA,GAAiB,GAAI,EAAE,cAAA,EAAe;AACtE,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AACjE,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AACzD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,UAAU,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAC/E,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAa,CAAA,CAAE,CAAA;AAC1G,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AACnD,MAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,eAAe,CAAA,CAAE,CAAA;AAAA,MAC5E;AACA,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACrF;AAAA,EACF;AACF;ACzDA,eAAsB,kBAAkB,OAAA,EAA2C;AACjF,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAI4C,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,mBAAA,CAAoB;AAAA,MACpD,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAChC,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,YAAY,CAAA,CAAE,UAAA;AAAA,QACd,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,QAAA,EAAS;AAAA,QAC9B,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,gBAAgB,CAAA,CAAE,cAAA;AAAA,QAClB,aAAa,CAAA,CAAE;AAAA,OACjB,CAAE,CAAA;AACF,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,GAAA,CAAI5C,MAAAA,CAAM,MAAA,CAAO,mCAAmC,CAAC,CAAA;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK;AAAA,mBAAA,EAAwB,OAAO,MAAM,CAAA;AAAA,CAAM,CAAC,CAAA;AAEzE,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,SAAS,IAAI,IAAA,CAAK,MAAM,cAAA,GAAiB,GAAI,EAAE,cAAA,EAAe;AACpE,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAC/D,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACtD,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,CAAA,CAAE,CAAA;AAChE,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,cAAA,CAAe,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAA,CAAS,WAAA,EAAa,CAAA,CAAE,CAAA;AACtG,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AACnD,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACF;ACpDA,eAAsB,iBAAiB,OAAA,EAA0C;AAC/E,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAI4C,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,QAAA,CAAS;AAAA,MACxC,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC/B,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,cAAc,CAAA,CAAE,YAAA;AAAA,QAChB,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,QAAA,EAAS;AAAA,QAC1B,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,QAAA,EAAS;AAAA,QAC9B,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,WAAW,CAAA,CAAE;AAAA,OACf,CAAE,CAAA;AACF,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAI5C,MAAAA,CAAM,MAAA,CAAO,gBAAgB,CAAC,CAAA;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK;AAAA,OAAA,EAAY,MAAM,MAAM,CAAA;AAAA,CAAM,CAAC,CAAA;AAE5D,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAO,IAAI,IAAA,CAAK,KAAK,SAAA,GAAY,GAAI,EAAE,cAAA,EAAe;AAC5D,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAC9D,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AACvD,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AACrD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,YAAY,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC7E,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,cAAA,CAAe,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,QAAA,CAAS,WAAA,EAAa,CAAA,CAAE,CAAA;AACpG,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAC9C,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,0BAA0B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAClF;AAAA,EACF;AACF;AChDA,eAAsB,qBAAqB,OAAA,EAA8C;AAEvF,EAAA,MAAM,aAAA,GAAgB,CAAC,EACrB,OAAA,CAAQ,cACR,OAAA,CAAQ,GAAA,CAAI,eAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAA;AAGd,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,mBAAmB,OAAO,CAAA;AAChC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,gBAAgB,kBAAA,CAAmB;AAAA,IACvC,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,OAAA,GAAUY,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,QAAA,GAAWC,UAAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AAEzC,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI7C,MAAAA,CAAM,IAAA,CAAK,sBAAsB,CAAC,CAAA;AAE9C,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,oBAAA,CAAqB;AAAA,MACvD,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAA;AAAA,MACA,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,iBAAiB,OAAA,CAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,UAAUc,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAGD,IAAA,KAAA,MAAW,QAAA,IAAY,SAAS,SAAA,EAAW;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,iCAAiC,CAAC,CAAA;AACzD,MAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,QAClC,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,cAAc,QAAA,CAAS,YAAA;AAAA,QACvB,MAAM,QAAA,CAAS;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,QACtD,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,OAAO,QAAA,CAAS;AAAA,OACjB,CAAA;AACD,MAAA,OAAA,CAAQ,IAAI1B,MAAAA,CAAM,KAAA,CAAM,CAAA,aAAA,EAAgB,YAAY,EAAE,CAAC,CAAA;AAAA,IACzD;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,aAAA,CAAc;AAAA,MACjD,MAAA,EAAQ,SAAS,MAAA,CAAO,MAAA;AAAA,MACxB,KAAA,EAAO,SAAS,MAAA,CAAO,KAAA;AAAA,MACvB,WAAA,EAAa,SAAS,MAAA,CAAO,WAAA;AAAA,MAC7B,OAAA,EAAS,SAAS,MAAA,CAAO;AAAA,KAC1B,CAAA;AAGD,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,uBAAuB,CAAC,CAAA;AAC/C,IAAA,MAAM,WAAW,YAAA,CAAa,oBAAA;AAAA,MAC5B,SAAS,MAAA,CAAO,eAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA,KACF;AAEA,IAAA,MAAM,iBAAiB0B,kBAAAA,CAAmB;AAAA,MACxC,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,MAAM,QAAA,CAAS;AAAA,KAChB,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,OAAO,QAAA,CAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN1B,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAAiD,IAAI;AAAA,OAAA,EAAY,OAAA,CAAQ,UAAU,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO;AAAA,SAAA,EAAc,QAAQ,KAAK,CAAA,IAAA;AAAA;AACpI,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACrF;AAAA,EACF;AACF;AAEA,eAAe,mBAAmB,OAAA,EAA8C;AAC9E,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,aAAA,CAAc,wDAAwD,CAAA;AAAA,EACxE;AAEA,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAI4C,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,QAAA,GAAWC,UAAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AAEzC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,oBAAA,CAAqB;AAAA,MACvD,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAA;AAAA,MACA,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,iBAAiB,OAAA,CAAQ;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,SAAS,MAAA,CAAO,MAAA;AAAA,QACxB,KAAA,EAAO,SAAS,MAAA,CAAO,KAAA;AAAA,QACvB,WAAA,EAAa,SAAS,MAAA,CAAO,WAAA;AAAA,QAC7B,OAAA,EAAS,SAAS,MAAA,CAAO;AAAA,OAC3B;AAAA,MACA,eAAA,EAAiB,SAAS,MAAA,CAAO,eAAA;AAAA,MACjC,OAAA,EAAS,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAS;AAAA,MAC1C,SAAA,EAAW,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACxC,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAMnB,kBAAAA,CAAmB;AAAA,UACvB,KAAK,CAAA,CAAE,GAAA;AAAA,UACP,cAAc,CAAA,CAAE,YAAA;AAAA,UAChB,MAAM,CAAA,CAAE;AAAA,SACT,CAAA;AAAA,QACD,WAAA,EAAa,CAAA,QAAA,EAAW,CAAA,CAAE,YAAY,CAAA;AAAA,OACxC,CAAE;AAAA,KACJ;AAEA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,cAAA,EAAgB,CAAC,CAAC,CAAA;AAAA,EACvD,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,8BAA8B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACtF;AAAA,EACF;AACF;AAEA,SAAS,cAAA,CAAe,MAAc,KAAA,EAAyB;AAC7D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB;AACA,EAAA,OAAO,KAAA;AACT;ACxKA,eAAsB,mBAAmB,OAAA,EAA4C;AACnF,EAAA,MAAM,aAAA,GAAgB,CAAC,EACrB,OAAA,CAAQ,cACR,OAAA,CAAQ,GAAA,CAAI,eAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAA;AAGd,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAMoB,oBAAmB,OAAO,CAAA;AAChC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,gBAAgB,kBAAA,CAAmB;AAAA,IACvC,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,OAAA,GAAUlC,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,QAAA,GAAWC,UAAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AAEzC,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI7C,MAAAA,CAAM,IAAA,CAAK,+BAA+B,CAAC,CAAA;AAEvD,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,4BAAA,CAA6B;AAAA,MAC/D,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,QAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,UAAUc,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAGD,IAAA,KAAA,MAAW,QAAA,IAAY,SAAS,SAAA,EAAW;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,iCAAiC,CAAC,CAAA;AACzD,MAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,QAClC,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,cAAc,QAAA,CAAS,YAAA;AAAA,QACvB,MAAM,QAAA,CAAS;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,QACtD,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,OAAO,QAAA,CAAS;AAAA,OACjB,CAAA;AACD,MAAA,OAAA,CAAQ,IAAI1B,MAAAA,CAAM,KAAA,CAAM,CAAA,aAAA,EAAgB,YAAY,EAAE,CAAC,CAAA;AAAA,IACzD;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,aAAA,CAAc;AAAA,MACjD,MAAA,EAAQ,SAAS,MAAA,CAAO,MAAA;AAAA,MACxB,KAAA,EAAO,SAAS,MAAA,CAAO,KAAA;AAAA,MACvB,WAAA,EAAa,SAAS,MAAA,CAAO,WAAA;AAAA,MAC7B,OAAA,EAAS,SAAS,MAAA,CAAO;AAAA,KAC1B,CAAA;AAGD,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAC7C,IAAA,MAAM,WAAW,YAAA,CAAa,4BAAA;AAAA,MAC5B,SAAS,MAAA,CAAO,eAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA,KACF;AAEA,IAAA,MAAM,iBAAiB0B,kBAAAA,CAAmB;AAAA,MACxC,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,MAAM,QAAA,CAAS;AAAA,KAChB,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,OAAO,QAAA,CAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN1B,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAA0D,IAAI;AAAA,cAAA,EAAmB,QAAQ,UAAU;AAAA,SAAA,EAAc,QAAQ,KAAK,CAAA,IAAA;AAAA;AAChI,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACF;AAEA,eAAe8C,oBAAmB,OAAA,EAA4C;AAC5E,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,aAAA,CAAc,wDAAwD,CAAA;AAAA,EACxE;AAEA,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAIF,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,QAAA,GAAWC,UAAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AAEzC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,4BAAA,CAA6B;AAAA,MAC/D,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,QAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,SAAS,MAAA,CAAO,MAAA;AAAA,QACxB,KAAA,EAAO,SAAS,MAAA,CAAO,KAAA;AAAA,QACvB,WAAA,EAAa,SAAS,MAAA,CAAO,WAAA;AAAA,QAC7B,OAAA,EAAS,SAAS,MAAA,CAAO;AAAA,OAC3B;AAAA,MACA,eAAA,EAAiB,SAAS,MAAA,CAAO,eAAA;AAAA,MACjC,OAAA,EAAS,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAS;AAAA,MAC1C,SAAA,EAAW,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACxC,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAMnB,kBAAAA,CAAmB;AAAA,UACvB,KAAK,CAAA,CAAE,GAAA;AAAA,UACP,cAAc,CAAA,CAAE,YAAA;AAAA,UAChB,MAAM,CAAA,CAAE;AAAA,SACT,CAAA;AAAA,QACD,WAAA,EAAa,CAAA,QAAA,EAAW,CAAA,CAAE,YAAY,CAAA;AAAA,OACxC,CAAE;AAAA,KACJ;AAEA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQqB,eAAAA,EAAgB,CAAC,CAAC,CAAA;AAAA,EACvD,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,4BAA4B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACpF;AAAA,EACF;AACF;AAEA,SAASA,eAAAA,CAAe,MAAc,KAAA,EAAyB;AAC7D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB;AACA,EAAA,OAAO,KAAA;AACT;ACtKA,eAAsB,qBAAqB,OAAA,EAA8C;AAEvF,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMtC,YAAAA,CAAa,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AACnD,IAAA,SAAA,GAAY,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,mCAAmC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC3F;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAMgB,kBAAAA,CAAkB,SAAS,SAAS,CAAA;AAC1C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAUb,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,YAAA,CAAa,oBAAA;AAAA,MAC5B,SAAA,CAAU,eAAA;AAAA,MACV,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,MACxB,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,MAAM,UAAU9B,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,uBAAuB,CAAC,CAAA;AAE/C,IAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,MAClC,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,MAAM,QAAA,CAAS;AAAA,KAChB,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,OAAO,QAAA,CAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI1B,OAAM,KAAA,CAAM,CAAA;AAAA,eAAA,EAAmD,IAAI,EAAE,CAAC,CAAA;AAAA,EACpF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACrF;AAAA,EACF;AACF;AAEA,eAAeyB,kBAAAA,CACb,SACA,SAAA,EACe;AACf,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAImB,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,WAAW,YAAA,CAAa,oBAAA;AAAA,IAC5B,SAAA,CAAU,eAAA;AAAA,IACV,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,IACxB,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,IACd,EAAE,EAAA,EAAI,QAAA,CAAS,EAAA,EAAI,cAAc,QAAA,CAAS,YAAA,EAAc,IAAA,EAAM,QAAA,CAAS,MAAM,GAAA,EAAK,QAAA,CAAS,GAAA,EAAK,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACtH,eAAA,CAAgB;AAAA,GAClB;AACA,EAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC9C;ACnGA,eAAsB,mBAAmB,OAAA,EAA4C;AAEnF,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMnC,YAAAA,CAAa,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AACnD,IAAA,SAAA,GAAY,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,mCAAmC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC3F;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAMgB,kBAAAA,CAAkB,SAAS,SAAS,CAAA;AAC1C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAUb,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,YAAA,CAAa,4BAAA;AAAA,MAC5B,SAAA,CAAU,eAAA;AAAA,MACV,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,MACxB,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,MAAM,UAAU9B,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAE7C,IAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,MAClC,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,MAAM,QAAA,CAAS;AAAA,KAChB,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,OAAO,QAAA,CAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI1B,OAAM,KAAA,CAAM,CAAA;AAAA,eAAA,EAAiD,IAAI,EAAE,CAAC,CAAA;AAAA,EAClF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACF;AAEA,eAAeyB,kBAAAA,CACb,SACA,SAAA,EACe;AACf,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAImB,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,WAAW,YAAA,CAAa,4BAAA;AAAA,IAC5B,SAAA,CAAU,eAAA;AAAA,IACV,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,IACxB,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,IACd,EAAE,EAAA,EAAI,QAAA,CAAS,EAAA,EAAI,cAAc,QAAA,CAAS,YAAA,EAAc,IAAA,EAAM,QAAA,CAAS,MAAM,GAAA,EAAK,QAAA,CAAS,GAAA,EAAK,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACtH,eAAA,CAAgB;AAAA,GAClB;AACA,EAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC9C;ACpGA,eAAsB,kBAAkB,OAAA,EAA2C;AACjF,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAMnB,mBAAkB,OAAO,CAAA;AAC/B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAUb,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI5C,MAAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAE7C,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,WAAA,CAAY;AAAA,MAC9C,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAED,IAAA,MAAM,UAAU,QAAA,CAAS,IAAA;AAAA,MACvB,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,aAAY,KAAM,OAAA,CAAQ,UAAU,WAAA;AAAY,KACrE;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,aAAA,CAAc,CAAA,wBAAA,EAA2B,OAAA,CAAQ,SAAS,CAAA,8BAAA,CAAgC,CAAA;AAAA,IAC5F;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAElD,IAAA,MAAM,WAAW,MAAM,YAAA,CAAa,qBAAA,CAAsB,OAAA,EAAS,QAAQ,OAAO,CAAA;AAElF,IAAA,MAAM,UAAUc,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAGD,IAAA,KAAA,MAAW,QAAA,IAAY,SAAS,SAAA,EAAW;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,iCAAiC,CAAC,CAAA;AACzD,MAAA,MAAMgD,YAAWtB,kBAAAA,CAAmB;AAAA,QAClC,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,cAAc,QAAA,CAAS,YAAA;AAAA,QACvB,MAAM,QAAA,CAAS;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,QACtD,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,IAAA,EAAMsB,SAAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,OAAO,QAAA,CAAS;AAAA,OACjB,CAAA;AACD,MAAA,OAAA,CAAQ,IAAIhD,MAAAA,CAAM,KAAA,CAAM,CAAA,aAAA,EAAgB,YAAY,EAAE,CAAC,CAAA;AAAA,IACzD;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,oCAAoC,CAAC,CAAA;AAC5D,IAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,MAClC,GAAA,EAAK,SAAS,WAAA,CAAY,GAAA;AAAA,MAC1B,YAAA,EAAc,SAAS,WAAA,CAAY,YAAA;AAAA,MACnC,IAAA,EAAM,SAAS,WAAA,CAAY;AAAA,KAC5B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,EAAA,EAAI,SAAS,WAAA,CAAY,EAAA;AAAA,MACzB,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO,SAAS,WAAA,CAAY;AAAA,KAC7B,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN1B,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAAmD,IAAI;AAAA,OAAA,EAAY,OAAA,CAAQ,UAAU,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO;AAAA,SAAA,EAAc,QAAQ,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA;AAAA;AACxK,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,0BAA0B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAClF;AAAA,EACF;AACF;AAEA,eAAeyB,mBAAkB,OAAA,EAA2C;AAC1E,EAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,IAAA,aAAA,CAAc,oEAAoE,CAAA;AAAA,EACpF;AAEA,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,eAAe,OAAA,CAAQ,KAAA;AAE7B,EAAA,MAAM,YAAA,GAAe,IAAImB,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,WAAA,CAAY;AAAA,MAC9C,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAED,IAAA,MAAM,UAAU,QAAA,CAAS,IAAA;AAAA,MACvB,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,aAAY,KAAM,OAAA,CAAQ,UAAU,WAAA;AAAY,KACrE;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,aAAA,CAAc,CAAA,wBAAA,EAA2B,OAAA,CAAQ,SAAS,CAAA,8BAAA,CAAgC,CAAA;AAAA,IAC5F;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,qBAAA,CAAsB,SAAS,YAAY,CAAA;AAE/E,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,SAAA,EAAW,SAAS,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,CAAA,KACjC,iBAAA;AAAA,UACE,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,cAAc,CAAA,CAAE,YAAA,EAAc,IAAA,EAAM,CAAA,CAAE,MAAM,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,UACnF,eAAA,CAAgB;AAAA;AAClB,OACF;AAAA,MACA,WAAA,EAAa,iBAAA;AAAA,QACX;AAAA,UACE,EAAA,EAAI,SAAS,WAAA,CAAY,EAAA;AAAA,UACzB,YAAA,EAAc,SAAS,WAAA,CAAY,YAAA;AAAA,UACnC,IAAA,EAAM,SAAS,WAAA,CAAY,IAAA;AAAA,UAC3B,GAAA,EAAK,SAAS,WAAA,CAAY,GAAA;AAAA,UAC1B,KAAA,EAAO,SAAS,WAAA,CAAY;AAAA,SAC9B;AAAA,QACA,eAAA,CAAgB;AAAA;AAClB,KACF;AAEA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EAC7C,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACzF;AAAA,EACF;AACF;ACzJA,eAAsB,mBAAmB,OAAA,EAA4C;AACnF,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAMnB,mBAAkB,OAAO,CAAA;AAC/B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAUb,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI5C,MAAAA,CAAM,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAE5C,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,mBAAA,CAAoB;AAAA,MACpD,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAED,IAAA,MAAM,QAAQ,MAAA,CAAO,IAAA;AAAA,MACnB,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,aAAY,KAAM,OAAA,CAAQ,UAAU,WAAA;AAAY,KACrE;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,aAAA,CAAc,CAAA,sBAAA,EAAyB,OAAA,CAAQ,SAAS,CAAA,8BAAA,CAAgC,CAAA;AAAA,IAC1F;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAElD,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,6BAAA;AAAA,MAClC,KAAA;AAAA,MACA,OAAA,CAAQ,OAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,MAAM,UAAUc,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAGD,IAAA,KAAA,MAAW,QAAA,IAAY,SAAS,SAAA,EAAW;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,iCAAiC,CAAC,CAAA;AACzD,MAAA,MAAMgD,YAAWtB,kBAAAA,CAAmB;AAAA,QAClC,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,cAAc,QAAA,CAAS,YAAA;AAAA,QACvB,MAAM,QAAA,CAAS;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,QACtD,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,IAAA,EAAMsB,SAAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,OAAO,QAAA,CAAS;AAAA,OACjB,CAAA;AACD,MAAA,OAAA,CAAQ,IAAIhD,MAAAA,CAAM,KAAA,CAAM,CAAA,aAAA,EAAgB,YAAY,EAAE,CAAC,CAAA;AAAA,IACzD;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,oCAAoC,CAAC,CAAA;AAC5D,IAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,MAClC,GAAA,EAAK,SAAS,WAAA,CAAY,GAAA;AAAA,MAC1B,YAAA,EAAc,SAAS,WAAA,CAAY,YAAA;AAAA,MACnC,IAAA,EAAM,SAAS,WAAA,CAAY;AAAA,KAC5B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,EAAA,EAAI,SAAS,WAAA,CAAY,EAAA;AAAA,MACzB,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO,SAAS,WAAA,CAAY;AAAA,KAC7B,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN1B,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAAgD,IAAI;AAAA,OAAA,EAAY,OAAA,CAAQ,UAAU,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO;AAAA,SAAA,EAAc,MAAM,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA;AAAA;AACjK,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACF;AAEA,eAAeyB,mBAAkB,OAAA,EAA4C;AAC3E,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,aAAA,CAAc,qEAAqE,CAAA;AAAA,EACrF;AAEA,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,gBAAgB,OAAA,CAAQ,MAAA;AAE9B,EAAA,MAAM,YAAA,GAAe,IAAImB,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,mBAAA,CAAoB;AAAA,MACpD,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAED,IAAA,MAAM,QAAQ,MAAA,CAAO,IAAA;AAAA,MACnB,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,aAAY,KAAM,OAAA,CAAQ,UAAU,WAAA;AAAY,KACrE;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,aAAA,CAAc,CAAA,sBAAA,EAAyB,OAAA,CAAQ,SAAS,CAAA,8BAAA,CAAgC,CAAA;AAAA,IAC1F;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,6BAAA;AAAA,MAClC,KAAA;AAAA,MACA,OAAA,CAAQ,OAAA;AAAA,MACR;AAAA,KACF;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,SAAA,EAAW,SAAS,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,CAAA,KACjC,iBAAA;AAAA,UACE,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,cAAc,CAAA,CAAE,YAAA,EAAc,IAAA,EAAM,CAAA,CAAE,MAAM,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,UACnF,eAAA,CAAgB;AAAA;AAClB,OACF;AAAA,MACA,WAAA,EAAa,iBAAA;AAAA,QACX;AAAA,UACE,EAAA,EAAI,SAAS,WAAA,CAAY,EAAA;AAAA,UACzB,YAAA,EAAc,SAAS,WAAA,CAAY,YAAA;AAAA,UACnC,IAAA,EAAM,SAAS,WAAA,CAAY,IAAA;AAAA,UAC3B,GAAA,EAAK,SAAS,WAAA,CAAY,GAAA;AAAA,UAC1B,KAAA,EAAO,SAAS,WAAA,CAAY;AAAA,SAC9B;AAAA,QACA,eAAA,CAAgB;AAAA;AAClB,KACF;AAEA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EAC7C,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,kCAAkC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC1F;AAAA,EACF;AACF;ACrKA,eAAsB,iBAAiB,OAAA,EAA0C;AAC/E,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAIA,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,GAAI,MAAA;AAC3E,EAAA,MAAM,aAAa,OAAA,CAAQ,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,GAAI,MAAA;AAErE,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,cAAA,CAAe;AAAA,MACjD,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,cAAc,OAAA,CAAQ,KAAA;AAAA,MACtB,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,UAAU,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,UAAU,CAAA;AAAA,QAC5C,OAAO,QAAA,CAAS;AAAA,OAClB;AACA,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAI5C,MAAAA,CAAM,MAAA,CAAO,8CAA8C,CAAC,CAAA;AACxE,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK;AAAA,cAAA,EAAmB,SAAS,MAAM,CAAA;AAAA,CAAM,CAAC,CAAA;AACtE,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,UAAU,CAAA,CAAE,CAAA;AAClE,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AACxD,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,KAAK,YAAY,CAAC,IAAI,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,GAAG,QAAA,EAAU,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC7F,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,EACd,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACzF;AAAA,EACF;AACF;AC/CA,eAAsB,yBAAyB,OAAA,EAAkD;AAC/F,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAI4C,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,gBAAA,CAAiB;AAAA,MACnD,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAClC,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,cAAc,CAAA,CAAE,YAAA;AAAA,QAChB,WAAA,EAAa,CAAA,CAAE,WAAA,CAAY,QAAA,EAAS;AAAA,QACpC,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,QAAA,EAAS;AAAA,QAC9B,eAAe,CAAA,CAAE,aAAA;AAAA,QACjB,gBAAA,EAAkB,CAAA,CAAE,gBAAA,CAAiB,QAAA,EAAS;AAAA,QAC9C,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,gBAAgB,CAAA,CAAE,cAAA;AAAA,QAClB,aAAa,CAAA,CAAE;AAAA,OACjB,CAAE,CAAA;AACF,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAI5C,MAAAA,CAAM,MAAA,CAAO,iCAAiC,CAAC,CAAA;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK;AAAA,iBAAA,EAAsB,SAAS,MAAM,CAAA;AAAA,CAAM,CAAC,CAAA;AAEzE,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,SAAS,IAAI,IAAA,CAAK,QAAQ,cAAA,GAAiB,GAAI,EAAE,cAAA,EAAe;AACtE,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AACjE,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AACzD,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,YAAY,CAAA,CAAE,CAAA;AAC/D,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,WAAA,CAAY,QAAA,EAAU,CAAA,CAAE,CAAA;AAC1E,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAa,CAAA,CAAE,CAAA;AAC1G,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA,EAAI,cAAA,CAAe,OAAA,CAAQ,aAAa,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAa,CAAA,CAAE,CAAA;AACxH,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AACnD,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,oCAAoC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC5F;AAAA,EACF;AACF;ACzDA,eAAsB,uBAAuB,OAAA,EAAgD;AAC3F,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAI4C,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,cAAA,CAAe;AAAA,MAC/C,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAChC,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,cAAc,CAAA,CAAE,YAAA;AAAA,QAChB,WAAA,EAAa,CAAA,CAAE,WAAA,CAAY,QAAA,EAAS;AAAA,QACpC,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,QAAA,EAAS;AAAA,QAC9B,eAAe,CAAA,CAAE,aAAA;AAAA,QACjB,gBAAA,EAAkB,CAAA,CAAE,gBAAA,CAAiB,QAAA,EAAS;AAAA,QAC9C,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,gBAAgB,CAAA,CAAE,cAAA;AAAA,QAClB,aAAa,CAAA,CAAE;AAAA,OACjB,CAAE,CAAA;AACF,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,GAAA,CAAI5C,MAAAA,CAAM,MAAA,CAAO,+BAA+B,CAAC,CAAA;AACzD,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK;AAAA,eAAA,EAAoB,OAAO,MAAM,CAAA;AAAA,CAAM,CAAC,CAAA;AAErE,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,SAAS,IAAI,IAAA,CAAK,MAAM,cAAA,GAAiB,GAAI,EAAE,cAAA,EAAe;AACpE,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAC/D,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACtD,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,YAAY,CAAA,CAAE,CAAA;AAC7D,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,WAAA,CAAY,QAAA,EAAU,CAAA,CAAE,CAAA;AACxE,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,cAAA,CAAe,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAA,CAAS,WAAA,EAAa,CAAA,CAAE,CAAA;AACtG,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA,EAAI,cAAA,CAAe,KAAA,CAAM,aAAa,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAA,CAAS,WAAA,EAAa,CAAA,CAAE,CAAA;AACpH,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AACnD,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,kCAAkC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC1F;AAAA,EACF;AACF;AClDA,eAAsB,0BAA0B,OAAA,EAAmD;AACjG,EAAA,MAAM,aAAA,GAAgB,CAAC,EACrB,OAAA,CAAQ,cACR,OAAA,CAAQ,GAAA,CAAI,eAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAA;AAGd,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM8C,oBAAmB,OAAO,CAAA;AAChC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,gBAAgB,kBAAA,CAAmB;AAAA,IACvC,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,OAAA,GAAUlC,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,QAAA,GAAWC,UAAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AAE9C,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI7C,MAAAA,CAAM,IAAA,CAAK,6BAA6B,CAAC,CAAA;AAErD,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,yBAAA,CAA0B;AAAA,MAC5D,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,WAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,UAAUc,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAGD,IAAA,KAAA,MAAW,QAAA,IAAY,SAAS,SAAA,EAAW;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,iCAAiC,CAAC,CAAA;AACzD,MAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,QAClC,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,cAAc,QAAA,CAAS,YAAA;AAAA,QACvB,MAAM,QAAA,CAAS;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,QACtD,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,OAAO,QAAA,CAAS;AAAA,OACjB,CAAA;AACD,MAAA,OAAA,CAAQ,IAAI1B,MAAAA,CAAM,KAAA,CAAM,CAAA,aAAA,EAAgB,YAAY,EAAE,CAAC,CAAA;AAAA,IACzD;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,aAAA,CAAc;AAAA,MACjD,MAAA,EAAQ,SAAS,MAAA,CAAO,MAAA;AAAA,MACxB,KAAA,EAAO,SAAS,MAAA,CAAO,KAAA;AAAA,MACvB,WAAA,EAAa,SAAS,MAAA,CAAO,WAAA;AAAA,MAC7B,OAAA,EAAS,SAAS,MAAA,CAAO;AAAA,KAC1B,CAAA;AAGD,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,8BAA8B,CAAC,CAAA;AACtD,IAAA,MAAM,WAAW,YAAA,CAAa,yBAAA;AAAA,MAC5B,SAAS,MAAA,CAAO,eAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA,KACF;AAEA,IAAA,MAAM,iBAAiB0B,kBAAAA,CAAmB;AAAA,MACxC,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,MAAM,QAAA,CAAS;AAAA,KAChB,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,OAAO,QAAA,CAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN1B,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAAwD,IAAI;AAAA,SAAA,EAAc,QAAQ,YAAY;AAAA,UAAA,EAAe,QAAQ,WAAW;AAAA,SAAA,EAAc,QAAQ,KAAK,CAAA,IAAA;AAAA;AAC7J,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,oCAAoC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC5F;AAAA,EACF;AACF;AAEA,eAAe8C,oBAAmB,OAAA,EAAmD;AACnF,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,aAAA,CAAc,wDAAwD,CAAA;AAAA,EACxE;AAEA,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAIF,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,QAAA,GAAWC,UAAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AAE9C,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,yBAAA,CAA0B;AAAA,MAC5D,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,WAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,SAAS,MAAA,CAAO,MAAA;AAAA,QACxB,KAAA,EAAO,SAAS,MAAA,CAAO,KAAA;AAAA,QACvB,WAAA,EAAa,SAAS,MAAA,CAAO,WAAA;AAAA,QAC7B,OAAA,EAAS,SAAS,MAAA,CAAO;AAAA,OAC3B;AAAA,MACA,eAAA,EAAiB,SAAS,MAAA,CAAO,eAAA;AAAA,MACjC,OAAA,EAAS,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAS;AAAA,MAC1C,SAAA,EAAW,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACxC,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAMnB,kBAAAA,CAAmB;AAAA,UACvB,KAAK,CAAA,CAAE,GAAA;AAAA,UACP,cAAc,CAAA,CAAE,YAAA;AAAA,UAChB,MAAM,CAAA,CAAE;AAAA,SACT,CAAA;AAAA,QACD,WAAA,EAAa,CAAA,QAAA,EAAW,CAAA,CAAE,YAAY,CAAA;AAAA,OACxC,CAAE;AAAA,KACJ;AAEA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQqB,eAAAA,EAAgB,CAAC,CAAC,CAAA;AAAA,EACvD,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,qCAAqC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC7F;AAAA,EACF;AACF;AAEA,SAASA,eAAAA,CAAe,MAAc,KAAA,EAAyB;AAC7D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB;AACA,EAAA,OAAO,KAAA;AACT;ACvKA,eAAsB,wBAAwB,OAAA,EAAiD;AAC7F,EAAA,MAAM,aAAA,GAAgB,CAAC,EACrB,OAAA,CAAQ,cACR,OAAA,CAAQ,GAAA,CAAI,eAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAA;AAGd,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAMD,oBAAmB,OAAO,CAAA;AAChC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,gBAAgB,kBAAA,CAAmB;AAAA,IACvC,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,OAAA,GAAUlC,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,QAAA,GAAWC,UAAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AAE9C,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI7C,MAAAA,CAAM,IAAA,CAAK,2BAA2B,CAAC,CAAA;AAEnD,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,uBAAA,CAAwB;AAAA,MAC1D,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,WAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,UAAUc,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAGD,IAAA,KAAA,MAAW,QAAA,IAAY,SAAS,SAAA,EAAW;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,iCAAiC,CAAC,CAAA;AACzD,MAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,QAClC,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,cAAc,QAAA,CAAS,YAAA;AAAA,QACvB,MAAM,QAAA,CAAS;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,QACtD,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,OAAO,QAAA,CAAS;AAAA,OACjB,CAAA;AACD,MAAA,OAAA,CAAQ,IAAI1B,MAAAA,CAAM,KAAA,CAAM,CAAA,aAAA,EAAgB,YAAY,EAAE,CAAC,CAAA;AAAA,IACzD;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,aAAA,CAAc;AAAA,MACjD,MAAA,EAAQ,SAAS,MAAA,CAAO,MAAA;AAAA,MACxB,KAAA,EAAO,SAAS,MAAA,CAAO,KAAA;AAAA,MACvB,WAAA,EAAa,SAAS,MAAA,CAAO,WAAA;AAAA,MAC7B,OAAA,EAAS,SAAS,MAAA,CAAO;AAAA,KAC1B,CAAA;AAGD,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,4BAA4B,CAAC,CAAA;AACpD,IAAA,MAAM,WAAW,YAAA,CAAa,uBAAA;AAAA,MAC5B,SAAS,MAAA,CAAO,eAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA,KACF;AAEA,IAAA,MAAM,iBAAiB0B,kBAAAA,CAAmB;AAAA,MACxC,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,MAAM,QAAA,CAAS;AAAA,KAChB,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,OAAO,QAAA,CAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN1B,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAAsD,IAAI;AAAA,SAAA,EAAc,QAAQ,YAAY;AAAA,UAAA,EAAe,QAAQ,WAAW;AAAA,SAAA,EAAc,QAAQ,KAAK,CAAA,IAAA;AAAA;AAC3J,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,kCAAkC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC1F;AAAA,EACF;AACF;AAEA,eAAe8C,oBAAmB,OAAA,EAAiD;AACjF,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,aAAA,CAAc,wDAAwD,CAAA;AAAA,EACxE;AAEA,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAIF,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,QAAA,GAAWC,UAAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AAE9C,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,uBAAA,CAAwB;AAAA,MAC1D,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,WAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,SAAS,MAAA,CAAO,MAAA;AAAA,QACxB,KAAA,EAAO,SAAS,MAAA,CAAO,KAAA;AAAA,QACvB,WAAA,EAAa,SAAS,MAAA,CAAO,WAAA;AAAA,QAC7B,OAAA,EAAS,SAAS,MAAA,CAAO;AAAA,OAC3B;AAAA,MACA,eAAA,EAAiB,SAAS,MAAA,CAAO,eAAA;AAAA,MACjC,OAAA,EAAS,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAS;AAAA,MAC1C,SAAA,EAAW,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACxC,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAMnB,kBAAAA,CAAmB;AAAA,UACvB,KAAK,CAAA,CAAE,GAAA;AAAA,UACP,cAAc,CAAA,CAAE,YAAA;AAAA,UAChB,MAAM,CAAA,CAAE;AAAA,SACT,CAAA;AAAA,QACD,WAAA,EAAa,CAAA,QAAA,EAAW,CAAA,CAAE,YAAY,CAAA;AAAA,OACxC,CAAE;AAAA,KACJ;AAEA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQqB,eAAAA,EAAgB,CAAC,CAAC,CAAA;AAAA,EACvD,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,mCAAmC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC3F;AAAA,EACF;AACF;AAEA,SAASA,eAAAA,CAAe,MAAc,KAAA,EAAyB;AAC7D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB;AACA,EAAA,OAAO,KAAA;AACT;AC1KA,eAAsB,0BAA0B,OAAA,EAAmD;AAEjG,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMtC,YAAAA,CAAa,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AACnD,IAAA,SAAA,GAAY,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,mCAAmC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC3F;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAMgB,kBAAAA,CAAkB,SAAS,SAAS,CAAA;AAC1C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAUb,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,YAAA,CAAa,yBAAA;AAAA,MAC5B,SAAA,CAAU,eAAA;AAAA,MACV,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,MACxB,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,MAAM,UAAU9B,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,8BAA8B,CAAC,CAAA;AAEtD,IAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,MAClC,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,MAAM,QAAA,CAAS;AAAA,KAChB,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,OAAO,QAAA,CAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI1B,OAAM,KAAA,CAAM,CAAA;AAAA,eAAA,EAA0D,IAAI,EAAE,CAAC,CAAA;AAAA,EAC3F,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,oCAAoC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC5F;AAAA,EACF;AACF;AAEA,eAAeyB,kBAAAA,CACb,SACA,SAAA,EACe;AACf,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAImB,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,WAAW,YAAA,CAAa,yBAAA;AAAA,IAC5B,SAAA,CAAU,eAAA;AAAA,IACV,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,IACxB,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,IACd,EAAE,EAAA,EAAI,QAAA,CAAS,EAAA,EAAI,cAAc,QAAA,CAAS,YAAA,EAAc,IAAA,EAAM,QAAA,CAAS,MAAM,GAAA,EAAK,QAAA,CAAS,GAAA,EAAK,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACtH,eAAA,CAAgB;AAAA,GAClB;AACA,EAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC9C;ACnGA,eAAsB,wBAAwB,OAAA,EAAiD;AAE7F,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMnC,YAAAA,CAAa,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AACnD,IAAA,SAAA,GAAY,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,mCAAmC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC3F;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAMgB,kBAAAA,CAAkB,SAAS,SAAS,CAAA;AAC1C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAUb,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,YAAA,CAAa,uBAAA;AAAA,MAC5B,SAAA,CAAU,eAAA;AAAA,MACV,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,MACxB,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,MAAM,UAAU9B,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,4BAA4B,CAAC,CAAA;AAEpD,IAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,MAClC,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,MAAM,QAAA,CAAS;AAAA,KAChB,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,OAAO,QAAA,CAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI1B,OAAM,KAAA,CAAM,CAAA;AAAA,eAAA,EAAwD,IAAI,EAAE,CAAC,CAAA;AAAA,EACzF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,kCAAkC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC1F;AAAA,EACF;AACF;AAEA,eAAeyB,kBAAAA,CACb,SACA,SAAA,EACe;AACf,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,IAAImB,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,WAAW,YAAA,CAAa,uBAAA;AAAA,IAC5B,SAAA,CAAU,eAAA;AAAA,IACV,MAAA,CAAO,UAAU,OAAO,CAAA;AAAA,IACxB,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,OAAA,GAAU,iBAAA;AAAA,IACd,EAAE,EAAA,EAAI,QAAA,CAAS,EAAA,EAAI,cAAc,QAAA,CAAS,YAAA,EAAc,IAAA,EAAM,QAAA,CAAS,MAAM,GAAA,EAAK,QAAA,CAAS,GAAA,EAAK,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACtH,eAAA,CAAgB;AAAA,GAClB;AACA,EAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC9C;ACpGA,eAAsB,uBAAuB,OAAA,EAAgD;AAC3F,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAMnB,mBAAkB,OAAO,CAAA;AAC/B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAUb,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI5C,MAAAA,CAAM,IAAA,CAAK,4BAA4B,CAAC,CAAA;AAEpD,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,gBAAA,CAAiB;AAAA,MACnD,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,UAAU,QAAA,CAAS,IAAA;AAAA,MACvB,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,aAAY,KAAM,OAAA,CAAQ,UAAU,WAAA;AAAY,KACrE;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,aAAA,CAAc,CAAA,+BAAA,EAAkC,OAAA,CAAQ,SAAS,CAAA,8BAAA,CAAgC,CAAA;AAAA,IACnG;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAElD,IAAA,MAAM,WAAW,MAAM,YAAA,CAAa,0BAAA,CAA2B,OAAA,EAAS,QAAQ,OAAO,CAAA;AAEvF,IAAA,MAAM,UAAUc,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAGD,IAAA,KAAA,MAAW,QAAA,IAAY,SAAS,SAAA,EAAW;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,iCAAiC,CAAC,CAAA;AACzD,MAAA,MAAMgD,YAAWtB,kBAAAA,CAAmB;AAAA,QAClC,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,cAAc,QAAA,CAAS,YAAA;AAAA,QACvB,MAAM,QAAA,CAAS;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,QACtD,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,IAAA,EAAMsB,SAAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,OAAO,QAAA,CAAS;AAAA,OACjB,CAAA;AACD,MAAA,OAAA,CAAQ,IAAIhD,MAAAA,CAAM,KAAA,CAAM,CAAA,aAAA,EAAgB,YAAY,EAAE,CAAC,CAAA;AAAA,IACzD;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,oCAAoC,CAAC,CAAA;AAC5D,IAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,MAClC,GAAA,EAAK,SAAS,WAAA,CAAY,GAAA;AAAA,MAC1B,YAAA,EAAc,SAAS,WAAA,CAAY,YAAA;AAAA,MACnC,IAAA,EAAM,SAAS,WAAA,CAAY;AAAA,KAC5B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,EAAA,EAAI,SAAS,WAAA,CAAY,EAAA;AAAA,MACzB,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO,SAAS,WAAA,CAAY;AAAA,KAC7B,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN1B,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAA0D,IAAI;AAAA,SAAA,EAAc,QAAQ,YAAY;AAAA,UAAA,EAAe,OAAA,CAAQ,WAAA,CAAY,QAAA,EAAU;AAAA,SAAA,EAAc,QAAQ,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA;AAAA;AAC5M,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACzF;AAAA,EACF;AACF;AAEA,eAAeyB,mBAAkB,OAAA,EAAgD;AAC/E,EAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,IAAA,aAAA,CAAc,oEAAoE,CAAA;AAAA,EACpF;AAEA,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,eAAe,OAAA,CAAQ,KAAA;AAE7B,EAAA,MAAM,YAAA,GAAe,IAAImB,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,gBAAA,CAAiB;AAAA,MACnD,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,UAAU,QAAA,CAAS,IAAA;AAAA,MACvB,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,aAAY,KAAM,OAAA,CAAQ,UAAU,WAAA;AAAY,KACrE;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,aAAA,CAAc,CAAA,+BAAA,EAAkC,OAAA,CAAQ,SAAS,CAAA,8BAAA,CAAgC,CAAA;AAAA,IACnG;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,0BAAA,CAA2B,SAAS,YAAY,CAAA;AAEpF,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,SAAA,EAAW,SAAS,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,CAAA,KACjC,iBAAA;AAAA,UACE,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,cAAc,CAAA,CAAE,YAAA,EAAc,IAAA,EAAM,CAAA,CAAE,MAAM,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,UACnF,eAAA,CAAgB;AAAA;AAClB,OACF;AAAA,MACA,WAAA,EAAa,iBAAA;AAAA,QACX;AAAA,UACE,EAAA,EAAI,SAAS,WAAA,CAAY,EAAA;AAAA,UACzB,YAAA,EAAc,SAAS,WAAA,CAAY,YAAA;AAAA,UACnC,IAAA,EAAM,SAAS,WAAA,CAAY,IAAA;AAAA,UAC3B,GAAA,EAAK,SAAS,WAAA,CAAY,GAAA;AAAA,UAC1B,KAAA,EAAO,SAAS,WAAA,CAAY;AAAA,SAC9B;AAAA,QACA,eAAA,CAAgB;AAAA;AAClB,KACF;AAEA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EAC7C,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,wCAAwC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAChG;AAAA,EACF;AACF;ACzJA,eAAsB,wBAAwB,OAAA,EAAiD;AAC7F,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAMnB,oBAAkB,OAAO,CAAA;AAC/B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,kBAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAUb,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAIgC,YAAAA,CAAa;AAAA,IACpC,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,QAAQ,aAAA,CAAc;AAAA,GACvB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI5C,MAAAA,CAAM,IAAA,CAAK,2BAA2B,CAAC,CAAA;AAEnD,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,cAAA,CAAe;AAAA,MAC/C,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,QAAQ,MAAA,CAAO,IAAA;AAAA,MACnB,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,aAAY,KAAM,OAAA,CAAQ,UAAU,WAAA;AAAY,KACrE;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,aAAA,CAAc,CAAA,6BAAA,EAAgC,OAAA,CAAQ,SAAS,CAAA,8BAAA,CAAgC,CAAA;AAAA,IACjG;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAElD,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,wBAAA;AAAA,MAClC,KAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,MAAM,UAAUc,eAAAA,CAAgB;AAAA,MAC9B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,QAAQ,aAAA,CAAc;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,eAAeC,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAYC,iBAAAA,CAAkB,aAAA,CAAc,OAAO;AAAA,KACpD,CAAA;AAGD,IAAA,KAAA,MAAW,QAAA,IAAY,SAAS,SAAA,EAAW;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAIjB,MAAAA,CAAM,IAAA,CAAK,iCAAiC,CAAC,CAAA;AACzD,MAAA,MAAMgD,YAAWtB,kBAAAA,CAAmB;AAAA,QAClC,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,cAAc,QAAA,CAAS,YAAA;AAAA,QACvB,MAAM,QAAA,CAAS;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,QACtD,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,IAAA,EAAMsB,SAAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,OAAO,QAAA,CAAS;AAAA,OACjB,CAAA;AACD,MAAA,OAAA,CAAQ,IAAIhD,MAAAA,CAAM,KAAA,CAAM,CAAA,aAAA,EAAgB,YAAY,EAAE,CAAC,CAAA;AAAA,IACzD;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,oCAAoC,CAAC,CAAA;AAC5D,IAAA,MAAM,WAAW0B,kBAAAA,CAAmB;AAAA,MAClC,GAAA,EAAK,SAAS,WAAA,CAAY,GAAA;AAAA,MAC1B,YAAA,EAAc,SAAS,WAAA,CAAY,YAAA;AAAA,MACnC,IAAA,EAAM,SAAS,WAAA,CAAY;AAAA,KAC5B,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,eAAA,CAAgB;AAAA,MAC9C,EAAA,EAAI,SAAS,WAAA,CAAY,EAAA;AAAA,MACzB,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO,SAAS,WAAA,CAAY;AAAA,KAC7B,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN1B,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAAuD,IAAI;AAAA,SAAA,EAAc,MAAM,YAAY;AAAA,UAAA,EAAe,KAAA,CAAM,WAAA,CAAY,QAAA,EAAU;AAAA,SAAA,EAAc,MAAM,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA;AAAA;AACjM,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,kCAAkC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC1F;AAAA,EACF;AACF;AAEA,eAAeyB,oBAAkB,OAAA,EAAiD;AAChF,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,aAAA,CAAc,qEAAqE,CAAA;AAAA,EACrF;AAEA,EAAA,MAAM,kBAAkB,oBAAA,CAAqB;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,gBAAgB,OAAA,CAAQ,MAAA;AAE9B,EAAA,MAAM,YAAA,GAAe,IAAImB,YAAAA,CAAa;AAAA,IACpC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,cAAA,CAAe;AAAA,MAC/C,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,QAAQ,MAAA,CAAO,IAAA;AAAA,MACnB,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,aAAY,KAAM,OAAA,CAAQ,UAAU,WAAA;AAAY,KACrE;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,aAAA,CAAc,CAAA,6BAAA,EAAgC,OAAA,CAAQ,SAAS,CAAA,8BAAA,CAAgC,CAAA;AAAA,IACjG;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,wBAAA;AAAA,MAClC,KAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,SAAA,EAAW,SAAS,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,CAAA,KACjC,iBAAA;AAAA,UACE,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,cAAc,CAAA,CAAE,YAAA,EAAc,IAAA,EAAM,CAAA,CAAE,MAAM,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,UACnF,eAAA,CAAgB;AAAA;AAClB,OACF;AAAA,MACA,WAAA,EAAa,iBAAA;AAAA,QACX;AAAA,UACE,EAAA,EAAI,SAAS,WAAA,CAAY,EAAA;AAAA,UACzB,YAAA,EAAc,SAAS,WAAA,CAAY,YAAA;AAAA,UACnC,IAAA,EAAM,SAAS,WAAA,CAAY,IAAA;AAAA,UAC3B,GAAA,EAAK,SAAS,WAAA,CAAY,GAAA;AAAA,UAC1B,KAAA,EAAO,SAAS,WAAA,CAAY;AAAA,SAC9B;AAAA,QACA,eAAA,CAAgB;AAAA;AAClB,KACF;AAEA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EAC7C,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,yCAAyC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACjG;AAAA,EACF;AACF;;;ACrJA,IAAM,aAAA,GAAgB;AAAA,EACpB,iBAAA;AAAA,EACA,oDAAA;AAAA,EACA,CAAC,KAAA,KAAkB,QAAA,CAAS,KAAA,EAAO,EAAE;AACvC,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,iBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,gBAAA,GAAmB;AAAA,EACvB,qBAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,sBAAsBvB,QAAAA,EAAwB;AAC5D,EAAA,MAAM,gBAAgBA,QAAAA,CACnB,OAAA,CAAQ,QAAQ,CAAA,CAChB,YAAY,+BAA+B,CAAA;AAE9C,EAAA,MAAM,mBAAA,GAAsB,IAAIG,OAAAA,CAAQ,eAAe,CAAA,CACpD,WAAA,CAAY,0BAA0B,CAAA,CACtC,MAAA,CAAO,yBAAA,EAA2B,sDAAsD,CAAA,CACxF,MAAA,CAAO,GAAG,aAAa,CAAA,CACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,mBAAA,CAAoB;AAAA,MACxB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,iBAAA,GAAoB,IAAIA,OAAAA,CAAQ,aAAa,CAAA,CAChD,WAAA,CAAY,+BAA+B,CAAA,CAC3C,cAAA,CAAe,yBAAA,EAA2B,sBAAsB,CAAA,CAChE,MAAA,CAAO,GAAG,aAAa,CAAA,CACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,iBAAA,CAAkB;AAAA,MACtB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,gBAAA,GAAmB,IAAIA,OAAAA,CAAQ,YAAY,CAAA,CAC9C,WAAA,CAAY,mBAAmB,CAAA,CAC/B,cAAA,CAAe,yBAAA,EAA2B,sBAAsB,CAAA,CAChE,MAAA,CAAO,GAAG,aAAa,CAAA,CACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,gBAAA,CAAiB;AAAA,MACrB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,uBAAuB,IAAIA,OAAAA,CAAQ,gBAAgB,CAAA,CACtD,WAAA,CAAY,qFAAqF,CAAA,CACjG,cAAA,CAAe,2BAA2B,sBAAsB,CAAA,CAChE,eAAe,iBAAA,EAAmB,kBAAkB,EACpD,cAAA,CAAe,eAAA,EAAiB,0BAA0B,CAAA,CAC1D,MAAA,CAAO,8BAAA,EAAgC,yCAAyC,EAChF,MAAA,CAAO,qBAAA,EAAuB,kDAAkD,CAAA,CAChF,MAAA,CAAO,GAAG,gBAAgB,CAAA,CAC1B,OAAO,GAAG,aAAa,EACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,oBAAA,CAAqB;AAAA,MACzB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,kBAAA,GAAqB,IAAIA,OAAAA,CAAQ,cAAc,EAClD,WAAA,CAAY,yFAAyF,CAAA,CACrG,cAAA,CAAe,2BAA2B,sBAAsB,CAAA,CAChE,cAAA,CAAe,eAAA,EAAiB,gCAAgC,CAAA,CAChE,MAAA,CAAO,qBAAA,EAAuB,kDAAkD,CAAA,CAChF,MAAA,CAAO,GAAG,gBAAgB,EAC1B,MAAA,CAAO,GAAG,aAAa,CAAA,CACvB,OAAO,GAAG,YAAY,CAAA,CACtB,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,kBAAA,CAAmB;AAAA,MACvB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,oBAAA,GAAuB,IAAIA,OAAAA,CAAQ,gBAAgB,EACtD,WAAA,CAAY,6EAA6E,CAAA,CACzF,cAAA,CAAe,uBAAuB,oDAAoD,CAAA,CAC1F,cAAA,CAAe,mBAAA,EAAqB,iCAAiC,CAAA,CACrE,MAAA,CAAO,GAAG,gBAAgB,CAAA,CAC1B,MAAA,CAAO,GAAG,aAAa,EACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,OAAO,eAAA,EAAiB,sDAAsD,CAAA,CAC9E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,oBAAA,CAAqB;AAAA,MACzB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,kBAAA,GAAqB,IAAIA,OAAAA,CAAQ,cAAc,EAClD,WAAA,CAAY,yEAAyE,CAAA,CACrF,cAAA,CAAe,uBAAuB,kDAAkD,CAAA,CACxF,cAAA,CAAe,mBAAA,EAAqB,iCAAiC,CAAA,CACrE,MAAA,CAAO,GAAG,gBAAgB,CAAA,CAC1B,MAAA,CAAO,GAAG,aAAa,EACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,OAAO,eAAA,EAAiB,sDAAsD,CAAA,CAC9E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,kBAAA,CAAmB;AAAA,MACvB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,oBAAoB,IAAIA,OAAAA,CAAQ,aAAa,CAAA,CAChD,YAAY,oBAAoB,CAAA,CAChC,cAAA,CAAe,qBAAA,EAAuB,kCAAkC,CAAA,CACxE,cAAA,CAAe,2BAA2B,sBAAsB,CAAA,CAChE,OAAO,mBAAA,EAAqB,6CAA6C,CAAA,CACzE,MAAA,CAAO,GAAG,gBAAgB,CAAA,CAC1B,MAAA,CAAO,GAAG,aAAa,CAAA,CACvB,MAAA,CAAO,GAAG,YAAY,EACtB,MAAA,CAAO,eAAA,EAAiB,sDAAsD,CAAA,CAC9E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,iBAAA,CAAkB;AAAA,MACtB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,qBAAqB,IAAIA,OAAAA,CAAQ,cAAc,CAAA,CAClD,WAAA,CAAY,+CAA+C,CAAA,CAC3D,cAAA,CAAe,uBAAuB,mCAAmC,CAAA,CACzE,eAAe,yBAAA,EAA2B,sBAAsB,EAChE,cAAA,CAAe,iBAAA,EAAmB,kBAAkB,CAAA,CACpD,MAAA,CAAO,oBAAA,EAAsB,8CAA8C,EAC3E,MAAA,CAAO,GAAG,gBAAgB,CAAA,CAC1B,MAAA,CAAO,GAAG,aAAa,CAAA,CACvB,OAAO,GAAG,YAAY,EACtB,MAAA,CAAO,eAAA,EAAiB,sDAAsD,CAAA,CAC9E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,kBAAA,CAAmB;AAAA,MACvB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,mBAAmB,IAAIA,OAAAA,CAAQ,YAAY,CAAA,CAC9C,YAAY,+BAA+B,CAAA,CAC3C,cAAA,CAAe,yBAAA,EAA2B,sBAAsB,CAAA,CAChE,cAAA,CAAe,qBAAqB,wBAAwB,CAAA,CAC5D,OAAO,GAAG,aAAa,CAAA,CACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,uBAAA,EAAyB,sCAAsC,EACtE,MAAA,CAAO,qBAAA,EAAuB,wCAAwC,CAAA,CACtE,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,gBAAA,CAAiB;AAAA,MACrB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAIH,EAAA,MAAM,wBAAA,GAA2B,IAAIA,OAAAA,CAAQ,qBAAqB,CAAA,CAC/D,WAAA,CAAY,mCAAmC,CAAA,CAC/C,cAAA,CAAe,2BAAA,EAA6B,+BAA+B,CAAA,CAC3E,MAAA,CAAO,GAAG,aAAa,CAAA,CACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,wBAAA,CAAyB;AAAA,MAC7B,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,sBAAA,GAAyB,IAAIA,OAAAA,CAAQ,mBAAmB,CAAA,CAC3D,WAAA,CAAY,iCAAiC,CAAA,CAC7C,cAAA,CAAe,2BAAA,EAA6B,+BAA+B,CAAA,CAC3E,MAAA,CAAO,GAAG,aAAa,CAAA,CACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,sBAAA,CAAuB;AAAA,MAC3B,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,4BAA4B,IAAIA,OAAAA,CAAQ,sBAAsB,CAAA,CACjE,YAAY,8FAA8F,CAAA,CAC1G,cAAA,CAAe,2BAAA,EAA6B,+BAA+B,CAAA,CAC3E,cAAA,CAAe,2BAA2B,2CAA2C,CAAA,CACrF,eAAe,eAAA,EAAiB,yCAAyC,CAAA,CACzE,MAAA,CAAO,uBAAuB,kDAAkD,CAAA,CAChF,MAAA,CAAO,GAAG,gBAAgB,CAAA,CAC1B,MAAA,CAAO,GAAG,aAAa,EACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,yBAAA,CAA0B;AAAA,MAC9B,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,0BAA0B,IAAIA,OAAAA,CAAQ,oBAAoB,CAAA,CAC7D,YAAY,4FAA4F,CAAA,CACxG,cAAA,CAAe,2BAAA,EAA6B,+BAA+B,CAAA,CAC3E,cAAA,CAAe,2BAA2B,2CAA2C,CAAA,CACrF,eAAe,eAAA,EAAiB,yCAAyC,CAAA,CACzE,MAAA,CAAO,uBAAuB,kDAAkD,CAAA,CAChF,MAAA,CAAO,GAAG,gBAAgB,CAAA,CAC1B,MAAA,CAAO,GAAG,aAAa,EACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,uBAAA,CAAwB;AAAA,MAC5B,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,yBAAA,GAA4B,IAAIA,OAAAA,CAAQ,sBAAsB,EACjE,WAAA,CAAY,0FAA0F,CAAA,CACtG,cAAA,CAAe,uBAAuB,0DAA0D,CAAA,CAChG,cAAA,CAAe,mBAAA,EAAqB,iCAAiC,CAAA,CACrE,MAAA,CAAO,GAAG,gBAAgB,CAAA,CAC1B,MAAA,CAAO,GAAG,aAAa,EACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,OAAO,eAAA,EAAiB,sDAAsD,CAAA,CAC9E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,yBAAA,CAA0B;AAAA,MAC9B,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,uBAAA,GAA0B,IAAIA,OAAAA,CAAQ,oBAAoB,EAC7D,WAAA,CAAY,sFAAsF,CAAA,CAClG,cAAA,CAAe,uBAAuB,wDAAwD,CAAA,CAC9F,cAAA,CAAe,mBAAA,EAAqB,iCAAiC,CAAA,CACrE,MAAA,CAAO,GAAG,gBAAgB,CAAA,CAC1B,MAAA,CAAO,GAAG,aAAa,EACvB,MAAA,CAAO,GAAG,YAAY,CAAA,CACtB,OAAO,eAAA,EAAiB,sDAAsD,CAAA,CAC9E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,uBAAA,CAAwB;AAAA,MAC5B,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,yBAAyB,IAAIA,OAAAA,CAAQ,mBAAmB,CAAA,CAC3D,YAAY,6BAA6B,CAAA,CACzC,cAAA,CAAe,qBAAA,EAAuB,kCAAkC,CAAA,CACxE,cAAA,CAAe,6BAA6B,+BAA+B,CAAA,CAC3E,OAAO,mBAAA,EAAqB,6CAA6C,CAAA,CACzE,MAAA,CAAO,GAAG,gBAAgB,CAAA,CAC1B,MAAA,CAAO,GAAG,aAAa,CAAA,CACvB,MAAA,CAAO,GAAG,YAAY,EACtB,MAAA,CAAO,eAAA,EAAiB,sDAAsD,CAAA,CAC9E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,sBAAA,CAAuB;AAAA,MAC3B,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,MAAM,0BAA0B,IAAIA,OAAAA,CAAQ,oBAAoB,CAAA,CAC7D,YAAY,qDAAqD,CAAA,CACjE,cAAA,CAAe,qBAAA,EAAuB,mCAAmC,CAAA,CACzE,cAAA,CAAe,6BAA6B,+BAA+B,CAAA,CAC3E,OAAO,oBAAA,EAAsB,8CAA8C,CAAA,CAC3E,MAAA,CAAO,GAAG,gBAAgB,CAAA,CAC1B,MAAA,CAAO,GAAG,aAAa,CAAA,CACvB,MAAA,CAAO,GAAG,YAAY,EACtB,MAAA,CAAO,eAAA,EAAiB,sDAAsD,CAAA,CAC9E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,uBAAA,CAAwB;AAAA,MAC5B,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAC,CAAA;AAEH,EAAA,aAAA,CAAc,WAAW,mBAAmB,CAAA;AAC5C,EAAA,aAAA,CAAc,WAAW,iBAAiB,CAAA;AAC1C,EAAA,aAAA,CAAc,WAAW,gBAAgB,CAAA;AACzC,EAAA,aAAA,CAAc,WAAW,oBAAoB,CAAA;AAC7C,EAAA,aAAA,CAAc,WAAW,kBAAkB,CAAA;AAC3C,EAAA,aAAA,CAAc,WAAW,oBAAoB,CAAA;AAC7C,EAAA,aAAA,CAAc,WAAW,kBAAkB,CAAA;AAC3C,EAAA,aAAA,CAAc,WAAW,iBAAiB,CAAA;AAC1C,EAAA,aAAA,CAAc,WAAW,kBAAkB,CAAA;AAC3C,EAAA,aAAA,CAAc,WAAW,gBAAgB,CAAA;AACzC,EAAA,aAAA,CAAc,WAAW,wBAAwB,CAAA;AACjD,EAAA,aAAA,CAAc,WAAW,sBAAsB,CAAA;AAC/C,EAAA,aAAA,CAAc,WAAW,yBAAyB,CAAA;AAClD,EAAA,aAAA,CAAc,WAAW,uBAAuB,CAAA;AAChD,EAAA,aAAA,CAAc,WAAW,yBAAyB,CAAA;AAClD,EAAA,aAAA,CAAc,WAAW,uBAAuB,CAAA;AAChD,EAAA,aAAA,CAAc,WAAW,sBAAsB,CAAA;AAC/C,EAAA,aAAA,CAAc,WAAW,uBAAuB,CAAA;AAClD;ACvYO,SAAS,gBAAgB,OAAA,EAAyB;AACvD,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,EAAA,EAAI,OAAO,OAAA;AACjC,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AACtD;AAKO,SAAS,gBAAgB,SAAA,EAAoC;AAClE,EAAA,OAAO,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,IAAI,GAAI,CAAA,CAAE,WAAA,EAAY,CAAE,QAAQ,GAAA,EAAK,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACvF;AAGA,SAAS,WAAW,KAAA,EAAyD;AAC3E,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,CAAM,kBAAkB,CAAA;AACnD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,EAAE,QAAA,EAAU,YAAA,CAAa,CAAC,CAAA,EAAG,WAAW,IAAA,EAAK;AAAA,EACtD;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,KAAA,EAAM;AAC7C;AAUO,SAAS,UAAA,CACd,IAAA,EACA,KAAA,EACA,OAAA,GAA6B,EAAC,EACtB;AACR,EAAA,MAAM,EAAE,YAAA,EAAc,SAAA,EAAU,GAAI,OAAA;AACpC,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZxB,MAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,IAAI,CAAA,CAAA,EAAIA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA;AAAA,IACpD,KAAKA,MAAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,CAAA;AAAA,IAC1C,KAAKA,MAAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA;AAAA,GACxC;AAEA,EAAA,IAAI,SAAA,IAAa,KAAK,KAAA,EAAO;AAC3B,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,UAAA,CAAW,KAAK,KAAK,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,YAAY,YAAA,GAAe,MAAA;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAKA,MAAAA,CAAM,KAAA,CAAM,MAAA,GAAS,GAAG,CAAC,CAAA,CAAA,EAAIA,MAAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,KAAKA,MAAAA,CAAM,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AAAA,EAC5D;AAEA,EAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,IAAA,EAAM;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,KAAKA,MAAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,UAAA,CAAW,MAAsB,KAAA,EAAuB;AACtE,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZA,MAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA,GAAI,CAAA,CAAA,EAAIA,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA;AAAA,IACzD,OAAOA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAA,EAAI,KAAK,UAAU,CAAA,CAAA;AAAA,IACnD,OAAOA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,IAAI,SAAS,CAAA;AAAA,GAC/C;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,aAAA,CACd,SACA,KAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AACpC,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,OAAA,CAAQ,SAAS,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,EAAG,MAAM,CAAA,EAAGA,MAAAA,CAAM,KAAK,SAAS,CAAC,CAAA,CAAA,EAAIA,MAAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,MAAM,CAAC,CAAC,CAAA,CAAA;AAAA,IAChF,CAAA,EAAG,MAAM,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA;AAAA,GAC1B;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAASiD,iBAAgB,KAAA,EAAuB;AAC9C,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,kBAAkB,CAAA;AAC5C,EAAA,MAAMhD,KAAAA,GAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AAChC,EAAA,OAAOA,KAAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AACnC;AA4BO,SAAS,UAAA,CACd,MACA,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAY,SAAA,EAAW,WAAA,EAAa,cAAa,GAAI,OAAA;AACtE,EAAA,MAAM,QAAA,GAAWgD,gBAAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAC3C,EAAA,MAAM,SAAS,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,KAAK,SAAS,CAAA,CAAA;AAE/C,EAAA,MAAM,SAAA,GAAY,cAAc,OAAA,EAAS;AAAA,IACvC,WAAA;AAAA,IACA,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,UAAA;AAAA,IACA,IAAA,EAAM,SAAA,KAAc,MAAA,GAAY,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,IAC9C;AAAA,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,MAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,gBAAA,EAAkB,UAAA,CAAgB,OAAA,EAAS,IAAA,CAAK,MAAM,CAAA;AAAA,IACtD,eAAA,EAAiB,SAAA,CAAe,OAAA,EAAS,IAAA,CAAK,MAAM,CAAA;AAAA,IACpD,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IAChC,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,OAAA,CAAa,OAAA,EAAS,QAAQ,CAAA;AAAA,IACvC,OAAO,IAAA,CAAK;AAAA,GACd;AAEA,EAAA,IAAI,UAAA,KAAe,MAAA,EAAW,MAAA,CAAO,UAAA,GAAa,UAAA;AAClD,EAAA,IAAI,SAAA,KAAc,MAAA,EAAW,MAAA,CAAO,SAAA,GAAY,SAAA;AAChD,EAAA,IAAI,WAAA,KAAgB,MAAA,EAAW,MAAA,CAAO,WAAA,GAAc,WAAA;AACpD,EAAA,IAAI,YAAA,KAAiB,MAAA,EAAW,MAAA,CAAO,YAAA,GAAe,YAAA;AACtD,EAAA,IAAI,KAAK,IAAA,IAAQ,IAAA,CAAK,SAAS,IAAA,EAAM,MAAA,CAAO,OAAO,IAAA,CAAK,IAAA;AAExD,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,UAAA,CACd,IAAA,EACA,KAAA,EACA,OAAA,EACyB;AACzB,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,KAAA;AAAA,IACA,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,WAAW,IAAA,CAAK;AAAA,GAClB;AACA,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAA,CAAO,OAAA,GAAU,OAAA,CAAa,OAAA,EAAS,IAAA,CAAK,QAAQ,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,MAAA;AACT;AAgBO,SAAS,aAAA,CACd,SACA,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,aAAA,EAAc,GAAI,OAAA;AAC1C,EAAA,MAAM,eAAe,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,aAAA,GACd,CAAA,EAAG,aAAa,CAAA,EAAG,aAAA,CAAc,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,UAAA,EAAa,YAAY,CAAA,CAAA,GACnF,IAAA;AAEJ,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,WAAW,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,CAAA;AAAA,IACjD,SAAA;AAAA,IACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,gBAAA,EAAkB,UAAA,CAAgB,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAA;AAAA,IACzD,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAAA,IACnC;AAAA,GACF;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,IAAA,EAAM;AACzB,IAAA,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA;AAAA,EACxB;AACA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,WAAA,CAAY,OAAwB,KAAA,EAAuB;AACzE,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZjD,MAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA,GAAI,CAAA,CAAA,EAAIA,MAAAA,CAAM,KAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA;AAAA,IACzD,OAAOA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,IAAI,SAAS,CAAA;AAAA,GAC/C;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,WAAA,CACd,KAAA,EACA,KAAA,EACA,OAAA,EACyB;AACzB,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,KAAA;AAAA,IACA,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,WAAW,KAAA,CAAM;AAAA,GACnB;AACA,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAA,CAAO,UAAA,GAAa,UAAA,CAAgB,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA;AAC1D,IAAA,MAAA,CAAO,SAAA,GAAY,SAAA,CAAe,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,UAAU,IAAA,EAAqB;AAC7C,EAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C;;;AC9PA,eAAe,gBAAgB,OAAA,EAAqC;AAClE,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,yBAAyB,eAAe,CAAA;AAEvD,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,kBAAA,CAAmB;AAAA,MAC5C,QAAA,EAAU,QAAQ,KAAA,IAAS;AAAA,KAC5B,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA;AAAA,QACE,KAAA,CAAM,GAAA;AAAA,UAAI,CAAC,IAAA,EAAsB,CAAA,KAC/B,WAAW,IAAA,EAAM,CAAA,EAAG,gBAAgB,OAAO;AAAA;AAC7C,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,2BAA2B,CAAC,CAAA;AACrD,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,MAAA,EAAS,MAAM,MAAM,CAAA;AAAA,CAAwB,CAAC,CAAA;AACtE,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAsB,CAAA,KAAc;AACjD,QAAA,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,CAAC,CAAC,CAAA;AAC/B,QAAA,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACxB,UAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,QACd;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,0BAA0B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAClF;AAAA,EACF;AACF;AAKO,SAAS,uBAAA,CAAwB,MAAA,EAAiB,WAAA,GAAc,MAAA,EAAc;AACnF,EAAA,MAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,uBAAuB,CAAA,CACnC,MAAA;AAAA,IACC,aAAA;AAAA,IACA,oCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,mCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,gBAAgB,OAAO,CAAA;AAAA,EAC/B,CAAC,CAAA;AACL;ACrDA,IAAM,mBAAA,GAAsB,GAAA;AAG5B,IAAM,SAAA,GAAiBkD,IAAA,CAAA,IAAA,CAAQ,EAAA,CAAA,OAAA,EAAQ,EAAG,UAAU,CAAA;AACpD,IAAM,UAAA,GAAkBA,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,YAAY,CAAA;AAEpD,SAAS,cAAA,GAAuB;AAC9B,EAAA,IAAI,CAAI,GAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,IAAG,GAAA,CAAA,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC7C;AACF;AAEA,SAAS,SAAA,GAAsB;AAC7B,EAAA,IAAI;AACF,IAAA,IAAO,GAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAA,GAAU,GAAA,CAAA,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AAChD,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAE;AACrB;AAEA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,cAAA,EAAe;AAEf,EAAA,MAAM,QAAA,GAAW,GAAG,UAAU,CAAA,IAAA,CAAA;AAC9B,EAAG,kBAAc,QAAA,EAAU,IAAA,CAAK,UAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,CAAA;AACzD,EAAG,GAAA,CAAA,UAAA,CAAW,UAAU,UAAU,CAAA;AACpC;AAKO,SAAS,qBAAqB,QAAA,EAAiC;AACpE,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAG,iBAAA,IAAqB,IAAA;AACrD;AAKO,SAAS,oBAAA,CAAqB,UAAkB,SAAA,EAAyB;AAC9E,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC1B,IAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,GAAI,EAAE,mBAAmB,SAAA,EAAU;AAAA,EACzD,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,CAAE,iBAAA,GAAoB,SAAA;AAAA,EAC5C;AACA,EAAA,SAAA,CAAU,KAAK,CAAA;AACjB;AAKO,SAAS,YAAA,CAAa,UAAkB,KAAA,EAAsC;AACnF,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAGxB,EAAA,MAAM,eAAe,KAAA,CAAM,MAAA;AAAA,IACzB,CAAC,GAAA,EAAK,IAAA,KAAU,KAAK,SAAA,GAAY,GAAA,GAAM,KAAK,SAAA,GAAY,GAAA;AAAA,IACxD,KAAA,CAAM,CAAC,CAAA,CAAE;AAAA,GACX;AAEA,EAAA,oBAAA,CAAqB,QAAA,EAAU,MAAA,CAAO,YAAY,CAAC,CAAA;AACrD;AAKO,SAAS,YAAA,GAA8B;AAC5C,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,OAAO,MAAM,SAAA,IAAa,IAAA;AAC5B;AAKO,SAAS,aAAa,OAAA,EAAuB;AAClD,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,KAAA,CAAM,SAAA,GAAY,QAAQ,WAAA,EAAY;AACtC,EAAA,SAAA,CAAU,KAAK,CAAA;AACjB;AAKO,SAAS,cAAA,GAAuB;AACrC,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,OAAO,KAAA,CAAM,SAAA;AACb,EAAA,SAAA,CAAU,KAAK,CAAA;AACjB;AAKO,SAAS,YAAA,GAAyB;AACvC,EAAA,OAAO,SAAA,EAAU;AACnB;AAKO,SAAS,UAAA,GAAmB;AACjC,EAAA,IAAO,GAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7B,IAAG,eAAW,UAAU,CAAA;AAAA,EAC1B;AACF;AAKO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAO,UAAA;AACT;AAMO,SAAS,gBAAgB,KAAA,EAA8C;AAC5E,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAElC,EAAA,MAAM,QAAA,GAAyB;AAAA,IAC7B,GAAG,KAAA;AAAA,IACH,WAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA,GACzC;AAGA,EAAA,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AAGxB,EAAA,IAAI,OAAA,CAAQ,SAAS,mBAAA,EAAqB;AACxC,IAAA,OAAA,CAAQ,MAAA,GAAS,mBAAA;AAAA,EACnB;AAEA,EAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,EAAA,SAAA,CAAU,KAAK,CAAA;AACjB;AAMO,SAAS,WAAW,KAAA,EAAgC;AACzD,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,EAAC;AAClC,EAAA,OAAO,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,OAAA;AAC3C;AAKO,SAAS,gBAAA,CACd,MACA,KAAA,EACgB;AAChB,EAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,EAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,IAAI,CAAA;AAC9D,EAAA,OAAO,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,QAAA;AAC5C;AAKO,SAAS,YAAA,GAAqB;AACnC,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,KAAA,CAAM,UAAU,EAAC;AACjB,EAAA,SAAA,CAAU,KAAK,CAAA;AACjB;AAKO,SAAS,eAAA,GAA0B;AACxC,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,OAAO,KAAA,CAAM,SAAS,MAAA,IAAU,CAAA;AAClC;AAKO,SAAS,gBAAgB,IAAA,EAAuB;AACrD,EAAA,OAAO,qBAAA,CAAsB,KAAK,IAAI,CAAA;AACxC;AAgBO,SAAS,WAAA,GAAyB;AACvC,EAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAqB;AAG5C,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,MAAM,IAAA,KAAS,MAAA,IAAU,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA,EAAG;AACxD,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,WAAA,EAAY;AACvC,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAEvC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,gBAAA,EAAA;AAET,QAAA,IAAI,KAAA,CAAM,SAAA,GAAY,QAAA,CAAS,eAAA,EAAiB;AAC9C,UAAA,QAAA,CAAS,kBAAkB,KAAA,CAAM,SAAA;AAAA,QACnC;AACA,QAAA,IAAI,KAAA,CAAM,SAAA,GAAY,QAAA,CAAS,gBAAA,EAAkB;AAC/C,UAAA,QAAA,CAAS,mBAAmB,KAAA,CAAM,SAAA;AAAA,QACpC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,IAAI,OAAA,EAAS;AAAA,UACtB,OAAA;AAAA,UACA,iBAAiB,KAAA,CAAM,SAAA;AAAA,UACvB,kBAAkB,KAAA,CAAM,SAAA;AAAA,UACxB,gBAAA,EAAkB;AAAA,SACnB,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,IACrC,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,kBAAkB,CAAA,CAAE;AAAA,GAClC;AACF;AAkBO,SAAS,cAAA,GAAiC;AAC/C,EAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAE9C,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAE3B,IAAA,IAAI,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA,EAAG;AAEjC,IAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAE/B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAErC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ,QAAA,CAAS,SAAA,EAAA;AACpC,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,SAAA,EAAW,QAAA,CAAS,YAAA,EAAA;AACvC,MAAA,IAAI,KAAA,CAAM,SAAA,GAAY,QAAA,CAAS,YAAA,EAAc;AAC3C,QAAA,QAAA,CAAS,eAAe,KAAA,CAAM,SAAA;AAAA,MAChC;AACA,MAAA,IAAI,KAAA,CAAM,SAAA,GAAY,QAAA,CAAS,aAAA,EAAe;AAC5C,QAAA,QAAA,CAAS,gBAAgB,KAAA,CAAM,SAAA;AAAA,MACjC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,QAAA,EAAU;AAAA,QACpB,IAAA,EAAM,QAAA;AAAA,QACN,SAAA,EAAW,KAAA,CAAM,IAAA,KAAS,MAAA,GAAS,CAAA,GAAI,CAAA;AAAA,QACvC,YAAA,EAAc,KAAA,CAAM,IAAA,KAAS,SAAA,GAAY,CAAA,GAAI,CAAA;AAAA,QAC7C,cAAc,KAAA,CAAM,SAAA;AAAA,QACpB,eAAe,KAAA,CAAM;AAAA,OACtB,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,IAClC,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,eAAe,CAAA,CAAE;AAAA,GAC/B;AACF;;;AC3TO,SAAS,kBAAkB,IAAA,EAAsB;AACtD,EAAA,OAAO,KAAK,WAAA,EAAY;AAC1B;;;ACkBA,eAAe,eAAA,CAAgB,MAAc,OAAA,EAAqC;AAChF,EAAA,MAAM,cAAA,GAAiB,kBAAkB,IAAI,CAAA;AAC7C,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,iBAAiB,eAAe,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAE/B,EAAA,IAAI;AAEF,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,gBAAA,CAAiB,cAAc,CAAA;AAE1D,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,SAAA,CAAU,EAAE,CAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAIlD,MAAAA,CAAM,MAAA,CAAO,CAAA,wBAAA,EAA2B,cAAc,GAAG,CAAC,CAAA;AAAA,MACxE;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,GAAS,IAAA,CAAK,IAAI,KAAA,GAAQ,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAE/D,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,qBAAA,CAAsB;AAAA,MACjD,KAAA,EAAO,cAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,IAAI,iBACF,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,CAAA,MAAO;AAAA,MACjC,IAAA;AAAA,MACA,UAAA,EAAY,QAAQ,UAAA,GAAa;AAAA,KACnC,CAAE,CAAA;AAGJ,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,WAAA,EAAY;AAC/C,MAAA,cAAA,GAAiB,cAAA,CAAe,MAAA;AAAA,QAC9B,CAAC,EAAE,IAAA,OAAW,IAAA,CAAK,MAAA,CAAO,aAAY,KAAM;AAAA,OAC9C;AAEA,MAAA,cAAA,GAAiB,cAAA,CAAe,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,IAChD;AAGA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,QAAA,GAAW,qBAAqB,cAAc,CAAA;AACpD,MAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,MAAA,cAAA,GAAiB,cAAA,CAAe,MAAA,CAAO,CAAC,EAAE,MAAK,KAAM;AAEnD,QAAA,MAAM,QAAQ,QAAA,KAAa,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,GAAI,QAAA;AAE5D,QAAA,MAAM,cAAc,CAAC,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,aAAY,KAAM,SAAA;AAChE,QAAA,OAAO,KAAA,IAAS,WAAA;AAAA,MAClB,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,QAAQ,cAAA,CAAe,GAAA,CAAI,CAAC,EAAE,IAAA,OAAW,IAAI,CAAA;AAInD,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,QACzC,KAAA,EAAO,cAAA;AAAA,QACP,QAAA,EAAU;AAAA;AAAA,OACX,CAAA;AACD,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,YAAA,CAAa,gBAAgB,QAAQ,CAAA;AAAA,MACvC;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,GAAA;AAAA,MAClC,MAAM,GAAA,CAAI,CAAC,SAAqB,MAAA,CAAO,eAAA,CAAgB,IAAI,CAAC;AAAA,KAC9D;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA;AAAA,QACE,cAAA,CAAe,GAAA;AAAA,UAAI,CAAC,EAAE,IAAA,EAAM,YAAW,EAAG,CAAA,KACxC,WAAW,IAAA,EAAM;AAAA,YACf,SAAS,eAAA,CAAgB,OAAA;AAAA,YACzB,UAAA;AAAA,YACA,YAAA,EAAc,cAAc,CAAC;AAAA,WAC9B;AAAA;AACH,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,MAAMmD,cAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,CAAA,GAAK,EAAA;AAC9D,QAAA,OAAA,CAAQ,GAAA,CAAInD,OAAM,MAAA,CAAO,CAAA,wBAAA,EAA2B,cAAc,CAAA,CAAA,EAAImD,WAAU,EAAE,CAAC,CAAA;AACnF,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,aAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,CAAA,GAAK,EAAA;AAC9D,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNnD,MAAAA,CAAM,MAAM,CAAA,MAAA,EAAS,KAAA,CAAM,MAAM,CAAA,kBAAA,EAAqB,cAAc,IAAI,UAAU,CAAA;AAAA,CAAK;AAAA,OACzF;AACA,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAkB,CAAA,KAAc;AAC7C,QAAA,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,CAAA,EAAG,EAAE,cAAc,aAAA,CAAc,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,QAAA,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACxB,UAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,QACd;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,wBAAwB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAChF;AAAA,EACF;AACF;AAKO,SAAS,wBAAwB,MAAA,EAAuB;AAC7D,EAAA,MAAA,CACG,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,mEAAmE,CAAA,CAC/E,MAAA;AAAA,IACC,aAAA;AAAA,IACA,oCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,mCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,OAAO,oBAAA,EAAsB,gCAAgC,CAAA,CAC7D,MAAA,CAAO,UAAA,EAAY,4DAA4D,EAC/E,MAAA,CAAO,aAAA,EAAe,6CAA6C,CAAA,CACnE,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,IAAA,EAAM,OAAA,KAAY;AAC/B,IAAA,MAAM,eAAA,CAAgB,MAAM,OAAO,CAAA;AAAA,EACrC,CAAC,CAAA;AACL;AC5JO,SAAS,YAAA,CACd,UAAA,EACA,OAAA,EACA,MAAA,EACA;AACA,EAAA,MAAM,OAAA,GAAUY,oBAAoB,UAAU,CAAA;AAC9C,EAAA,MAAM,UAAUE,eAAAA,CAAgB;AAAA,IAC9B,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAOC,kBAAAA,CAAmB;AAAA,IACxB,OAAA;AAAA,IACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IAC1B,UAAA,EAAYC,kBAAkB,OAAO;AAAA,GACtC,CAAA;AACH;AAKA,eAAsB,kBAAA,CACpB,cACA,QAAA,EACwB;AACxB,EAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,aAAA,CAAc;AAAA,IAC5C,SAAS,QAAA,CAAS,EAAA;AAAA,IAClB,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,cAAc,QAAA,CAAS,YAAA;AAAA,IACvB,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GAC4C,CAAA;AAErD,EAAA,OAAO,IAAA;AACT;AC5BA,eAAsB,wBAAwB,MAAA,EAIxB;AACpB,EAAA,MAAM,eAAeJ,eAAAA,CAAgB;AAAA,IACnC,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAQ,MAAA,CAAO;AAAA,GAChB,CAAA;AACD,EAAA,MAAM,WAAA,GAAcuC,cAAAA,CAAe,MAAA,CAAO,OAAO,CAAA;AACjD,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,OAAA,CAAQ,WAAA,EAAY;AAExD,EAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,yBAAA,CAA0B;AAAA,IAC3D,MAAM,MAAA,CAAO;AAAA,GACd,CAAA;AAED,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,IAAA,EAAM;AAC9B,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAY,KAAM,eAAA,EAAiB;AACnD,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,cAAA,CAAe;AAAA,QAC7B,KAAK,WAAA,CAAY,GAAA;AAAA,QACjB,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,QAAQ,GAAA,CAAI;AAAA,OACb,CAAA;AACD,MAAA,IAAI,OAAA,CAAQ,cAAc,aAAA,EAAe;AACvC,QAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AAGrB,QAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,MACxC;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;ACvBA,IAAM,kBAAA,GAAqB,GAAA;AAK3B,eAAe,eAAA,CACb,IAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,cAAA,GAAiB,kBAAkB,IAAI,CAAA;AAE7C,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,aAAA,CAAc,yBAAyB,CAAA;AAAA,EACzC;AAIA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,GACxB,CAAA,EAAG,OAAO;;AAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,CAAA,GAC7B,OAAA;AAEJ,EAAA,IAAI,WAAA,CAAY,SAAS,kBAAA,EAAoB;AAC3C,IAAA,aAAA;AAAA,MACE,CAAA,kBAAA,EAAqB,WAAA,CAAY,MAAM,CAAA,oBAAA,EAAuB,kBAAkB,CAAA,YAAA;AAAA,KAClF;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,MACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,MAAMC,OAAAA,GAAS,iBAAiB,eAAe,CAAA;AAC/C,IAAA,MAAMC,SAAAA,GAAWD,QAAO,iBAAA,CAAkB;AAAA,MACxC,KAAA,EAAO,cAAA;AAAA,MACP,IAAA,EAAM,WAAA;AAAA,MACN,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkBC,SAAAA,EAAU,eAAA,CAAgB,OAAO,CAAA;AAEnE,IAAA,SAAA,CAAU,OAAO,CAAA;AACjB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,6BAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,iBAAiB,aAAa,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,OAAO,iBAAA,CAAkB;AAAA,IACxC,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,MAAM,OAAA,CAAQ;AAAA,GACf,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,YAAA;AAAA,IACnB,aAAA,CAAc,UAAA;AAAA,IACd,aAAA,CAAc,OAAA;AAAA,IACd,aAAA,CAAc;AAAA,GAChB;AAEA,EAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,IAAA,OAAA,CAAQ,IAAItD,MAAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,cAAc,MAAM,CAAC,CAAA;AAAA,EAClE;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,YAAA,EAAc,QAAQ,CAAA;AAC5D,IAAA,MAAM,aAAA,GAAgB,aAAa,OAAA,CAAQ,OAAA;AAI3C,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,uBAAA,CAAwB;AAAA,QAC5C,SAAS,aAAA,CAAc,OAAA;AAAA,QACvB,QAAQ,aAAA,CAAc,MAAA;AAAA,QACtB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,WAAA,GAAc,QAAQ,CAAC,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,QACtC,KAAA,EAAO,cAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,MAAM,UAAU,KAAA,CAAM,IAAA;AAAA,QACpB,CAAC,CAAA,KACC,CAAA,CAAE,MAAA,CAAO,WAAA,OAAkB,aAAA,CAAc,WAAA,EAAY,IACrD,CAAA,CAAE,IAAA,KAAS;AAAA,OACf;AACA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,CAAA;AAAA,MACjD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,eAAA,CAAgB;AAAA,MACd,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,IAAA;AAAA,MACR,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,IAAA,EAAM,cAAA;AAAA,MACN,MAAA,EAAQ,aAAA;AAAA,MACR,IAAA,EAAM,WAAA;AAAA,MACN;AAAA,KACD,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,aAAA,CAAc,OAAA,EAAS;AAAA,MACrD;AAAA,KACD,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA,CAAU;AAAA,QACR,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,IAAA;AAAA,QACR,aAAA,EAAe,aAAA,CAAc,aAAA,CAAc,OAAA,EAAS,IAAI,CAAA;AAAA,QACxD,MAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,EAAS,OAAA,CAAa,aAAA,CAAc,OAAA,EAAS,cAAc,CAAA;AAAA,QAC3D,MAAA,EAAQ,aAAA;AAAA,QACR,gBAAA,EAAkB,UAAA,CAAgB,aAAA,CAAc,OAAA,EAAS,aAAa,CAAA;AAAA,QACtE,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,GACxB,CAAA,EAAG,OAAO,CAAA,SAAA,CAAA,GACV,OAAA;AAEJ,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,CAAA,4BAAA,CAAA;AAAA,MACA,kBAAkB,IAAI,CAAA,CAAA;AAAA,MACtB,WAAW,cAAc,CAAA;AAAA,KAC3B;AACA,IAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,CAAA;AAC7C,IAAA,IAAI,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAE,CAAA;AACrD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,WAAW,CAAA,CAAE,CAAA;AAEnC,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,MAAM,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3C,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACF;AAKO,SAAS,wBAAwB,MAAA,EAAuB;AAC7D,EAAA,MAAA,CACG,OAAA,CAAQ,uBAAuB,CAAA,CAC/B,WAAA,CAAY,qEAAqE,CAAA,CACjF,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,mCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,OAAO,iBAAA,EAAmB,gBAAgB,EAC1C,MAAA,CAAO,qBAAA,EAAuB,2BAA2B,CAAA,CACzD,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,OAAO,eAAA,EAAiB,qCAAqC,EAC7D,MAAA,CAAO,eAAA,EAAiB,uCAAuC,CAAA,CAC/D,MAAA;AAAA,IACC,QAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,IAAA,EAAM,SAAS,OAAA,KAAY;AACxC,IAAA,MAAM,eAAA,CAAgB,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAAA,EAC9C,CAAC,CAAA;AACL;;;AClNO,SAAS,aAAa,IAAA,EAA0B;AACrD,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,KAAK,SAAS,CAAA,CAAA;AACzC;AAOO,SAAS,YAAY,MAAA,EAG1B;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,+DAA+D,MAAM,CAAA;AAAA,KACvE;AAAA,EACF;AAEA,EAAA,MAAM,CAAC,MAAA,EAAQ,YAAY,CAAA,GAAI,KAAA;AAE/B,EAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,IAAK,MAAA,CAAO,WAAW,EAAA,EAAI;AACpD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,MAAM,CAAA,CAAE,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,YAAY,CAAA,CAAE,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACdA,IAAMuD,mBAAAA,GAAqB,GAAA;AAK3B,eAAe,uBAAA,CACb,IAAA,EACA,MAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,cAAA,GAAiB,kBAAkB,IAAI,CAAA;AAE7C,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,aAAA,CAAc,yBAAyB,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,OAAA,CAAQ,SAASA,mBAAAA,EAAoB;AACvC,IAAA,aAAA;AAAA,MACE,CAAA,kBAAA,EAAqB,OAAA,CAAQ,MAAM,CAAA,oBAAA,EAAuBA,mBAAkB,CAAA,YAAA;AAAA,KAC9E;AAAA,EACF;AAGA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,YAAY,MAAM,CAAA;AAAA,EAC/B,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAC3C;AAAA,EACF;AAGA,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,iBAAiB,eAAe,CAAA;AAG/C,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,gBAAA,CAAiB,cAAc,CAAA;AAE1D,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,aAAA;AAAA,MACE,CAAA,MAAA,EAAS,cAAc,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAA;AAAA,KACnE;AAAA,EACF;AAKA,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,qBAAA,CAAsB;AAAA,IACjD,KAAA,EAAO,cAAA;AAAA,IACP,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,CAAS,SAAA;AAAA,IACnC,CAAC,CAAA,KACC,CAAA,CAAE,MAAA,CAAO,WAAA,EAAY,KAAM,QAAA,CAAS,MAAA,CAAO,WAAA,EAAY,IACvD,CAAA,CAAE,SAAA,KAAc,QAAA,CAAS;AAAA,GAC7B;AACA,EAAA,MAAM,aAAa,WAAA,IAAe,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,GAAI,MAAA;AACtE,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,aAAA;AAAA,MACE,CAAA,uBAAA,EAA0B,MAAM,CAAA,UAAA,EAAa,cAAc,CAAA,kDAAA;AAAA,KAC7D;AAAA,EACF;AACA,EAAA,MAAM,gBAAA,GAAmB,QAAQ,UAAA,GAAa,WAAA;AAE9C,EAAA,MAAM,QAAA,GAAW,OAAO,cAAA,CAAe;AAAA,IACrC,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACP,CAAA;AAGD,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,QAAA,EAAU,eAAA,CAAgB,OAAO,CAAA;AACnE,IAAA,SAAA,CAAU,OAAO,CAAA;AACjB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,6BAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA;AAAA,IACnB,aAAA,CAAc,UAAA;AAAA,IACd,aAAA,CAAc,OAAA;AAAA,IACd,aAAA,CAAc;AAAA,GAChB;AAEA,EAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,IAAA,OAAA,CAAQ,IAAIvD,MAAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,MAAM,KAAK,CAAC,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,YAAA,EAAc,QAAQ,CAAA;AAC5D,IAAA,MAAM,aAAA,GAAgB,aAAa,OAAA,CAAQ,OAAA;AAE3C,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,uBAAA,CAAwB;AAAA,QAC5C,SAAS,aAAA,CAAc,OAAA;AAAA,QACvB,QAAQ,aAAA,CAAc,MAAA;AAAA,QACtB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,WAAA,GAAc,QAAQ,CAAC,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AAAA,IAER;AAMA,IAAA,IAAI,gBAAA;AACJ,IAAA,IAAI,gBAAgB,KAAA,CAAA,EAAW;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,gBAAgB,aAAa,CAAA;AAC/C,QAAA,MAAM,cAAA,GAAiB,MAAM,SAAA,CAAU,iBAAA,CAAkB;AAAA,UACvD,YAAA,EAAc;AAAA,SACf,CAAA;AACD,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,gBAAA,GAAmB,MAAA,CAAO,eAAe,SAAS,CAAA;AAAA,QACpD;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB;AAAA,MACd,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,IAAA;AAAA,MACR,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,IAAA,EAAM,cAAA;AAAA,MACN,MAAA,EAAQ,aAAA;AAAA,MACR,IAAA,EAAM,OAAA;AAAA,MACN;AAAA,KACD,CAAA;AASD,IAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,aAAA,CAAc,OAAA,EAAS;AAAA,MACzD,KAAA,EAAO,cAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACb,CAAA;AACD,IAAA,MAAM,gBAAA,GACJ,gBAAA,KAAqB,KAAA,CAAA,GACjB,aAAA,CAAc,cAAc,OAAA,EAAS;AAAA,MACnC,KAAA,EAAO,cAAA;AAAA,MACP,UAAA,EAAY,gBAAA;AAAA,MACZ,SAAA,EAAW,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,gBAAgB,CAAA;AAAA,KAChD,CAAA,GACD,aAAA,CAAc,cAAc,OAAA,EAAS,EAAE,aAAa,CAAA;AAE1D,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA,CAAU;AAAA,QACR,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,IAAA;AAAA,QACR,aAAA,EAAe,aAAA,CAAc,aAAA,CAAc,OAAA,EAAS,IAAI,CAAA;AAAA,QACxD,WAAA;AAAA,QACA,SAAA,EAAW,gBAAA;AAAA,QACX,YAAA,EAAc,MAAA;AAAA,QACd,aAAA;AAAA,QACA,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,EAAS,OAAA,CAAa,aAAA,CAAc,OAAA,EAAS,cAAc,CAAA;AAAA,QAC3D,MAAA,EAAQ,aAAA;AAAA,QACR,gBAAA,EAAkB,UAAA,CAAgB,aAAA,CAAc,OAAA,EAAS,aAAa,CAAA;AAAA,QACtE,IAAA,EAAM,OAAA;AAAA,QACN,GAAI,qBAAqB,KAAA,CAAA,IAAa;AAAA,UACpC,SAAA,EAAW,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,gBAAgB,CAAA;AAAA;AACjD,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,CAAA,4BAAA,CAAA;AAAA,MACA,kBAAkB,IAAI,CAAA,CAAA;AAAA,MACtB,WAAW,MAAM,CAAA;AAAA,KACnB;AACA,IAAA,IAAI,gBAAA,EAAkB,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,gBAAgB,CAAA,CAAE,CAAA;AACnE,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,OAAO,CAAA,CAAE,CAAA;AAElC,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,MAAM,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3C,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACF;AAKO,SAAS,gCAAgC,MAAA,EAAuB;AACrE,EAAA,MAAA,CACG,OAAA,CAAQ,oCAAoC,CAAA,CAC5C,WAAA;AAAA,IACC;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,mCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,OAAO,iBAAA,EAAmB,gBAAgB,EAC1C,MAAA,CAAO,qBAAA,EAAuB,2BAA2B,CAAA,CACzD,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,QAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,OAAO,IAAA,EAAM,MAAA,EAAQ,SAAS,OAAA,KAAY;AAChD,IAAA,MAAM,uBAAA,CAAwB,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,EAC9D,CAAC,CAAA;AACL;AC9OA,eAAe,sBAAA,CACb,IAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,cAAA,GAAiB,kBAAkB,IAAI,CAAA;AAC7C,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,iBAAiB,eAAe,CAAA;AAG/C,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,YAAY,MAAM,CAAA;AAAA,EAC/B,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAC3C;AAAA,EACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,gBAAA,CAAiB,cAAc,CAAA;AAE1D,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,aAAA;AAAA,QACE,CAAA,MAAA,EAAS,cAAc,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAA;AAAA,OACnE;AAAA,IACF;AAIA,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,qBAAA,CAAsB;AAAA,MACjD,KAAA,EAAO,cAAA;AAAA,MACP,QAAA,EAAU;AAAA;AAAA,KACX,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,QAAQ,QAAA,CAAS,SAAA;AAAA,MAClC,CAAC,CAAA,KACC,CAAA,CAAE,MAAA,CAAO,WAAA,EAAY,KAAM,QAAA,CAAS,MAAA,CAAO,WAAA,EAAY,IACvD,CAAA,CAAE,SAAA,KAAc,QAAA,CAAS;AAAA,KAC7B;AACA,IAAA,MAAM,aACJ,UAAA,IAAc,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,GAAI,KAAA,CAAA;AACnD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,aAAA;AAAA,QACE,CAAA,uBAAA,EAA0B,MAAM,CAAA,UAAA,EAAa,cAAc,CAAA,kDAAA;AAAA,OAC7D;AAAA,IACF;AACA,IAAA,MAAM,gBAAA,GAAmB,QAAQ,UAAA,GAAa,UAAA;AAC9C,IAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,eAAA,CAAgB,OAAA,EAAS;AAAA,MAC3D,KAAA,EAAO,cAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACb,CAAA;AAGD,IAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,eAAA,CAAgB,UAAU,CAAA;AAE5D,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,SAAA,CAAU,EAAE,CAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,MAAA,CAAO,CAAA,2BAAA,EAA8B,MAAM,EAAE,CAAC,CAAA;AAAA,MAClE;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,WAAA,CAAY;AAAA,MACxC,IAAA,EAAM,UAAA;AAAA,MACN,WAAA,EAAa,QAAQ,KAAA,IAAS;AAAA,KAC/B,CAAA;AAID,IAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAyB;AAAA,MAC/D,OAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT,CAAE,CAAA;AAEF,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA;AAAA,QACE,iBAAA,CAAkB,GAAA;AAAA,UAAI,CAAC,EAAE,OAAA,EAAS,KAAA,EAAM,KACtC,cAAc,OAAA,EAAS;AAAA,YACrB,SAAS,eAAA,CAAgB,OAAA;AAAA,YACzB,KAAA;AAAA,YACA;AAAA,WACD;AAAA;AACH,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,MAAA,CAAO,CAAA,2BAAA,EAA8B,MAAM,EAAE,CAAC,CAAA;AAChE,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,OAAM,KAAA,CAAM,CAAA,MAAA,EAAS,QAAA,CAAS,MAAM,wBAAwB,MAAM,CAAA;AAAA,CAAK;AAAA,OACzE;AACA,MAAA,iBAAA,CAAkB,QAAQ,CAAC,EAAE,OAAA,EAAS,KAAA,IAAS,CAAA,KAAM;AACnD,QAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,OAAA,EAAS,KAAK,CAAC,CAAA;AACzC,QAAA,IAAI,CAAA,GAAI,iBAAA,CAAkB,MAAA,GAAS,CAAA,EAAG;AACpC,UAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,QACd;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAK,KAAA,CAAgB,OAAA,EAAS,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACxD,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,aAAA;AAAA,MACE,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACrF;AAAA,EACF;AACF;AAKO,SAAS,+BAA+B,MAAA,EAAuB;AACpE,EAAA,MAAA,CACG,OAAA,CAAQ,2BAA2B,CAAA,CACnC,WAAA;AAAA,IACC;AAAA,GACF,CACC,MAAA;AAAA,IACC,aAAA;AAAA,IACA,uCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,mCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,IAAA,EAAM,QAAQ,OAAA,KAAY;AACvC,IAAA,MAAM,sBAAA,CAAuB,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,EACpD,CAAC,CAAA;AACL;AChJA,eAAe,mBAAA,CACb,UACA,OAAA,EACe;AAEf,EAAA,IAAI,QAAA,CAAS,SAAS,EAAA,EAAI;AACxB,IAAA,aAAA,CAAc,uCAAuC,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,aAAA,CAAc,2BAA2B,CAAA;AAAA,EAC3C;AAGA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,MACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,MAAMqD,OAAAA,GAAS,yBAAyB,eAAe,CAAA;AACvD,IAAA,MAAMC,SAAAA,GAAWD,OAAAA,CAAO,mBAAA,CAAoB,EAAE,UAAU,CAAA;AACxD,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkBC,SAAAA,EAAU,eAAA,CAAgB,OAAO,CAAA;AAEnE,IAAA,SAAA,CAAU,OAAO,CAAA;AACjB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,6BAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,yBAAyB,aAAa,CAAA;AAGrD,EAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,gBAAA,CAAiB,QAAQ,CAAA;AAC3D,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,aAAA,CAAc,CAAA,MAAA,EAAS,QAAQ,CAAA,uBAAA,CAAyB,CAAA;AAAA,EAC1D;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,mBAAA,CAAoB,EAAE,UAAU,CAAA;AACxD,EAAA,MAAM,YAAA,GAAe,YAAA;AAAA,IACnB,aAAA,CAAc,UAAA;AAAA,IACd,aAAA,CAAc,OAAA;AAAA,IACd,aAAA,CAAc;AAAA,GAChB;AAEA,EAAA,OAAA,CAAQ,IAAItD,MAAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,QAAQ,MAAM,CAAC,CAAA;AAE3D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,YAAA,EAAc,QAAQ,CAAA;AAG5D,IAAA,eAAA,CAAgB;AAAA,MACd,IAAA,EAAM,UAAA;AAAA,MACN,MAAA,EAAQ,IAAA;AAAA,MACR,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,aAAa,OAAA,CAAQ;AAAA,KAC9B,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAAiD,IAAI;AAAA,QAAA,EAAa,QAAQ,CAAA;AAAA;AAC5E,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,4BAA4B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACpF;AAAA,EACF;AACF;AAKO,SAAS,4BAA4B,MAAA,EAAuB;AACjE,EAAA,MAAA,CACG,OAAA,CAAQ,sBAAsB,CAAA,CAC9B,WAAA,CAAY,qBAAqB,CAAA,CACjC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,mCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,OAAO,iBAAA,EAAmB,gBAAgB,EAC1C,MAAA,CAAO,qBAAA,EAAuB,2BAA2B,CAAA,CACzD,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,QAAA,EAAU,OAAA,KAAY;AACnC,IAAA,MAAM,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAAA,EAC7C,CAAC,CAAA;AACL;AClFA,SAAS,YAAA,CAAa,MAAc,MAAA,EAAwB;AAC1D,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,MAAA,EAAQ,OAAO,IAAA;AAClC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,GAAI,KAAA;AACjC;AAKA,eAAe,mBAAmB,OAAA,EAAwC;AAExE,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,MAAA,EAAQ,OAAA,CAAQ,SAAS,EAAE,CAAA;AAChE,EAAA,MAAM,eAAe,WAAA,CAAY,MAAA;AAAA,IAC/B,CAAC,KAAA,KAAsD,CAAC,CAAC,KAAA,CAAM;AAAA,GACjE;AAEA,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA,CAAU,EAAE,CAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,+CAA+C,CAAC,CAAA;AACvE,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAK,oDAAoD;AAAA,OACjE;AAAA,IACF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,iBAAiB,eAAe,CAAA;AAE/C,EAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,aAAa,MAAM,CAAA;AAAA,CAAa,CAAC,CAAA;AAAA,EACjF;AAEA,EAAA,MAAM,UAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,IAAA,IAAI;AAEF,MAAA,MAAM,CAAC,MAAA,EAAQ,YAAY,IAAI,KAAA,CAAM,MAAA,CAAO,MAAM,GAAG,CAAA;AACrD,MAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AAIrC,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,MAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,QACpB,OAAO,KAAA,CAAM,IAAA;AAAA,QACb,GAAA,EAAK,EAAA;AAAA,QACL,IAAA,EAAM;AAAA,OACR;AACA,MAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,eAAA,CAAgB,OAAO,CAAA;AAKzD,MAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,uBAAA,CAAwB;AAAA,UAC5C,SAAS,eAAA,CAAgB,OAAA;AAAA,UACzB,QAAQ,eAAA,CAAgB,MAAA;AAAA,UACxB,QAAQ,KAAA,CAAM;AAAA,SACf,CAAA;AACD,QAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,KAAA,CAAA,EAAW;AAC5B,UAAA,SAAA,GAAY,aAAA,CAAc,gBAAgB,OAAA,EAAS;AAAA,YACjD,WAAA,EAAa,QAAQ,CAAC;AAAA,WACvB,CAAA;AAAA,QACH;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,QACpB,UAAU,KAAA,CAAM,SAAA;AAAA,QAChB,YAAA,EAAc,OAAO,YAAY,CAAA;AAAA,QACjC,SAAA;AAAA,QACA,OAAA,EAAS,OAAA,CAAa,eAAA,CAAgB,OAAA,EAAS,MAAM,IAAI,CAAA;AAAA,QACzD,gBAAA,EAAkB,MAAM,MAAA,GACpB,UAAA,CAAgB,gBAAgB,OAAA,EAAS,KAAA,CAAM,MAAM,CAAA,GACrD,IAAA;AAAA,QACJ,aAAA,EAAe,aAAA,CAAc,eAAA,CAAgB,OAAA,EAAS,MAAM,MAAM,CAAA;AAAA,QAClE,QAAQ,KAAA,CAAM;AAAA,OACf,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,SAAA,CAAU,OAAO,CAAA;AACjB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,mBAAmB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAuB,CAAA,CAAE,eAAe,CAAC,CAAA;AAClF,EAAA,MAAM,YAAA,GAAe,QAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,YAAA,EAAc,CAAC,CAAA;AAEvE,EAAA,OAAA,CAAQ,GAAA;AAAA,IACNA,MAAAA,CAAM,IAAA;AAAA,MACJ,CAAA,MAAA,EAAS,YAAY,CAAA,sBAAA,EAAyB,gBAAA,CAAiB,MAAM,CAAA;AAAA;AAAA;AACvE,GACF;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,4BAA4B,CAAC,CAAA;AACpD,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAoB,MAAuB,CAAA,CAAE,YAAA,GAAe,EAAE,YAAY,CAAA;AAExF,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA;AAC7C,IAAA,MAAM,SAAA,GACJ,KAAK,YAAA,KAAiB,CAAA,GAClBA,OAAM,IAAA,CAAK,YAAY,IACvB,IAAA,CAAK,YAAA,KAAiB,IACpBA,MAAAA,CAAM,KAAA,CAAM,SAAS,CAAA,GACrBA,MAAAA,CAAM,MAAM,CAAA,EAAG,IAAA,CAAK,YAAY,CAAA,QAAA,CAAU,CAAA;AAElD,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,GAAGA,MAAAA,CAAM,KAAA,CAAM,KAAK,IAAI,CAAC,IAAIA,MAAAA,CAAM,IAAA,CAAK,QAAG,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAIA,MAAAA,CAAM,KAAK,CAAA,OAAA,EAAK,OAAO,EAAE,CAAC,CAAA;AAAA,KACzF;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,YAAA,CAAa,KAAK,IAAA,EAAM,EAAE,CAAC,CAAC,CAAA,CAAE,CAAA;AAE1D,IAAA,IAAI,IAAA,CAAK,eAAe,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAK,CAAA,4BAAA,EAA0B,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,CAAE;AAAA,OACjE;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AACF;AAKO,SAAS,2BAA2B,MAAA,EAAuB;AAChE,EAAA,MAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,wCAAwC,CAAA,CACpD,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,mCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,MAAA;AAAA,IAAO,aAAA;AAAA,IAAe,+CAAA;AAAA,IAAiD,CAAC,KAAA,KACvE,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,IAEnB,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,mBAAmB,OAAO,CAAA;AAAA,EAClC,CAAC,CAAA;AACL;ACrLA,eAAe,gBAAA,CACb,SACA,OAAA,EACe;AAEf,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,OAAA,CAAQ,WAAW,EAAA,EAAI;AACtD,IAAA,aAAA,CAAc,4DAA4D,CAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,gBAAgB,eAAe,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAE/B,EAAA,IAAI;AAEF,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MACzC,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,YAAA;AAAA,QACZ,KAAA,EAAO;AAAA;AACT,KACD,CAAA;AAED,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,SAAA,CAAU,EAAE,CAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,MAAA,CAAO,CAAA,2BAAA,EAA8B,OAAO,EAAE,CAAC,CAAA;AAAA,MACnE;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,KAAA,GAAQ,KAAA,GAAQ,KAAA,GAAQ,CAAA;AAEnD,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,WAAA,CAAY;AAAA,MACxC,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,YAAA;AAAA,QACZ,KAAA,EAAO;AAAA,OACT;AAAA,MACA,UAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA;AAAA,QACE,QAAA,CAAS,GAAA;AAAA,UAAI,CAAC,GAAA,EAAiB,CAAA,KAC7B,UAAA,CAAW,GAAA,EAAK;AAAA,YACd,SAAS,eAAA,CAAgB,OAAA;AAAA,YACzB,WAAW,UAAA,GAAa;AAAA,WACzB;AAAA;AACH,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,OAAM,KAAA,CAAM,CAAA,MAAA,EAAS,QAAA,CAAS,MAAM,eAAe,OAAO,CAAA;AAAA,CAAK;AAAA,OACjE;AACA,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAA,EAAiB,CAAA,KAAc;AAC/C,QAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,GAAA,EAAK,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AACnD,QAAA,IAAI,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC3B,UAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,QACd;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,0BAA0B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAClF;AAAA,EACF;AACF;AAKO,SAAS,yBAAyB,MAAA,EAAuB;AAC9D,EAAA,MAAA,CACG,OAAA,CAAQ,iBAAiB,CAAA,CACzB,WAAA,CAAY,0BAA0B,CAAA,CACtC,MAAA;AAAA,IACC,aAAA;AAAA,IACA,oCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,mCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,EAAS,OAAA,KAAY;AAClC,IAAA,MAAM,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAAA,EACzC,CAAC,CAAA;AACL;AC9GA,eAAsB,QAAQ,OAAA,EAAmC;AAC/D,EAAA,MAAM,KAAc,QAAA,CAAA,eAAA,CAAgB;AAAA,IAClC,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACwD,QAAAA,KAAY;AAC9B,IAAA,EAAA,CAAG,QAAA,CAAS,CAAA,EAAG,OAAO,CAAA,QAAA,CAAA,EAAY,CAAC,MAAA,KAAW;AAC5C,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAAA,QAAAA,CAAQ,OAAO,WAAA,EAAY,KAAM,OAAO,MAAA,CAAO,WAAA,OAAkB,KAAK,CAAA;AAAA,IACxE,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;;;ACUA,eAAe,kBAAkB,OAAA,EAAuC;AAEtE,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAM,YAAY,gBAAA,EAAiB;AACnC,IAAA,OAAA,CAAQ,GAAA,CAAIxD,MAAAA,CAAM,MAAA,CAAO,CAAA,qCAAA,CAAuC,CAAC,CAAA;AACjE,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,EAAA,EAAK,SAAS,EAAE,CAAC,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAM,MAAA,CAAO;AAAA,cAAA,CAAkB,CAAC,CAAA;AAC5C,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,wCAAA,CAA0C,CAAC,CAAA;AACnE,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,2BAAA,CAA6B,CAAC,CAAA;AACtD,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,yBAAA,CAA2B,CAAC,CAAA;AAEpD,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,MAAM,YAAY,MAAM,OAAA,CAAQA,MAAAA,CAAM,GAAA,CAAI,mCAAmC,CAAC,CAAA;AAC9E,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AACpC,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,UAAA,EAAW;AACX,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,2BAA2B,CAAC,CAAA;AACpD,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,SAAA,EAAW;AAErB,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,qBAAqB,CAAA,EAAG;AACnD,MAAA,OAAA,CAAQ,KAAA,CAAMA,MAAAA,CAAM,GAAA,CAAI,oEAAoE,CAAC,CAAA;AAC7F,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,YAAA,CAAa,QAAQ,SAAS,CAAA;AAC9B,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,sBAAsB,OAAA,CAAQ,SAAS,EAAE,CAAC,CAAA;AAClE,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,cAAA,EAAe;AACf,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,qBAAqB,CAAC,CAAA;AAC9C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,EAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,EAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,sBAAsB,CAAC,CAAA;AAC9C,EAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,eAAe,gBAAA,EAAkB,EAAE,CAAC,CAAA;AAC5D,EAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,YAAA,EAAe,SAAA,IAAaA,OAAM,IAAA,CAAK,WAAW,CAAC,CAAA,CAAE,CAAC,CAAA;AAE9E,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA;AAC3C,EAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,eAAA,EAAkB,SAAS,EAAE,CAAC,CAAA;AAEtD,EAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,EAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,iBAAA,EAAoB,YAAY,EAAE,CAAC,CAAA;AAE3D,EAAA,IAAI,SAAA,GAAY,CAAA,IAAK,SAAA,IAAa,EAAA,EAAI;AACpC,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,yBAAyB,CAAC,CAAA;AACjD,IAAA,KAAA,MAAW,CAAC,MAAM,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AACtD,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,CAAK,oBAAoB,GAAI,CAAA;AACnD,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,KAAK,IAAA,CAAK,cAAA,EAAgB,CAAA,CAAE,CAAC,CAAA;AAAA,IAC/D;AAAA,EACF,CAAA,MAAA,IAAW,YAAY,EAAA,EAAI;AACzB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAM,IAAA,CAAK;AAAA,CAAA,EAAM,SAAS,2CAA2C,CAAC,CAAA;AAAA,EACpF;AAGA,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,iBAAiB,CAAC,CAAA;AACzC,IAAA,MAAM,YAAA,GAAe,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC5C,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAM,WAAW,EAAC;AAClB,MAAA,IAAI,IAAA,CAAK,SAAA,GAAY,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAA,KAAc,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAChG,MAAA,IAAI,IAAA,CAAK,YAAA,GAAe,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,EAAG,IAAA,CAAK,YAAY,CAAA,QAAA,EAAW,IAAA,CAAK,YAAA,KAAiB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAC5G,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,IAAA,CAAK,YAAY,CAAA;AACpD,MAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,KAAK,IAAA,CAAK,IAAI,EAAE,CAAA,GAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAM,SAAS,IAAA,CAAK,IAAI,CAAC,CAAA,QAAA,EAAM,UAAU,EAAE,CAAC,CAAA;AAAA,IACrG;AACA,IAAA,IAAI,WAAA,CAAY,SAAS,EAAA,EAAI;AAC3B,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAM,IAAA,CAAK,CAAA,UAAA,EAAa,YAAY,MAAA,GAAS,EAAE,OAAO,CAAC,CAAA;AAAA,IACrE;AAAA,EACF;AAGA,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAClD,IAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC5C,IAAA,KAAA,MAAW,WAAW,eAAA,EAAiB;AACrC,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAC/E,MAAA,MAAM,WAAW,OAAA,CAAQ,gBAAA;AACzB,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,OAAA,CAAQ,eAAe,CAAA;AAC1D,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,OAAM,KAAA,CAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,IAC5BA,MAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAM,QAAQ,WAAW,QAAA,KAAa,CAAA,GAAI,MAAM,EAAE,CAAA,QAAA,EAAM,UAAU,CAAA,CAAE;AAAA,OACjF;AAAA,IACF;AACA,IAAA,IAAI,QAAA,CAAS,SAAS,EAAA,EAAI;AACxB,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAM,IAAA,CAAK,CAAA,UAAA,EAAa,SAAS,MAAA,GAAS,EAAE,OAAO,CAAC,CAAA;AAAA,IAClE;AAAA,EACF;AACF;AAKO,SAAS,0BAA0B,MAAA,EAAuB;AAC/D,EAAA,MAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,mCAAmC,CAAA,CAC/C,MAAA,CAAO,wBAAA,EAA0B,0DAA0D,CAAA,CAC3F,MAAA,CAAO,iBAAA,EAAmB,+BAA+B,CAAA,CACzD,MAAA,CAAO,QAAA,EAAU,sCAAsC,CAAA,CACvD,MAAA,CAAO,SAAA,EAAW,2DAA2D,CAAA,CAC7E,MAAA,CAAO,SAAA,EAAW,sCAAsC,CAAA,CACxD,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,kBAAkB,OAAO,CAAA;AAAA,EACjC,CAAC,CAAA;AACL;ACrHA,SAAS,kBAAA,CAAmB,OAAqB,KAAA,EAAuB;AACtE,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAA;AACjD,EAAA,MAAM,SAAA,GACJ,KAAA,CAAM,IAAA,KAAS,MAAA,GACXA,MAAAA,CAAM,KAAA,GACN,KAAA,CAAM,IAAA,KAAS,SAAA,GACbA,MAAAA,CAAM,IAAA,GACNA,MAAAA,CAAM,MAAA;AAEd,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZA,OAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,IACrB,CAAA,CAAA,EAAIA,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,CAAA,GACzB,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AAAA,IACpC,KAAKA,MAAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,CAAA;AAAA,IACvC,KAAKA,MAAAA,CAAM,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA,EAAI,MAAM,MAAM,CAAA;AAAA,GACzC;AAEA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAKA,MAAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA,EAAI,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3E;AAEA,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,MAAM,aAAA,GACJ,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,EAAA,GAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA,GAAQ,KAAA,CAAM,IAAA;AACnE,IAAA,KAAA,CAAM,IAAA,CAAK,KAAKA,MAAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAAI,aAAa,CAAA,CAAE,CAAA;AAAA,EACzD;AAGA,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,MAAA,EAAQ;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,KAAKA,MAAAA,CAAM,KAAA,CAAM,UAAU,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,EAC3D,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,MAAM,MAAA,EAAQ;AACnD,IAAA,KAAA,CAAM,IAAA,CAAK,KAAKA,MAAAA,CAAM,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,EAC5D;AAGA,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,MAAA,EAAQ;AACzC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,MAAAA,CAAM,KAAK,CAAA,2CAAA,EAAyC,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE;AAAA,KAClF;AAAA,EACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,MAAM,MAAA,EAAQ;AAChD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,MAAAA,CAAM,KAAK,CAAA,mCAAA,EAAiC,KAAA,CAAM,IAAI,CAAA,UAAA,EAAa,KAAA,CAAM,MAAM,CAAA,OAAA,CAAS;AAAA,KAC1F;AAAA,EACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,MAAM,MAAA,EAAQ;AACnD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJA,MAAAA,CAAM,KAAK,CAAA,wCAAA,EAAsC,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE;AAAA,KAC/E;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,kBAAA,CACP,OACA,KAAA,EACyB;AAMzB,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,KAAA;AAAA,IACA,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,aAAA,EAAe,aAAA,CAAc,KAAA,CAAM,OAAA,EAAS,MAAM,MAAM,CAAA;AAAA,IACxD,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,OAAA,EAAS,OAAA,CAAa,KAAA,CAAM,OAAA,EAAS,MAAM,IAAI;AAAA,GACjD;AAEA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAA,CAAO,SAAS,KAAA,CAAM,MAAA;AACtB,IAAA,MAAA,CAAO,gBAAA,GAAmB,UAAA,CAAgB,KAAA,CAAM,OAAA,EAAS,MAAM,MAAM,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,MAAA,CAAO,OAAO,KAAA,CAAM,IAAA;AAAA,EACtB;AAEA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAA,CAAO,SAAS,KAAA,CAAM,MAAA;AAAA,EACxB;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,aAAa,IAAA,EAAgC;AACpD,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,EAAQ,SAAA,EAAW,UAAU,CAAA;AACjD,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,KAAA;AAAA,MACNA,MAAAA,CAAM,GAAA;AAAA,QACJ,iBAAiB,IAAI,CAAA,mBAAA,EAAsB,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA;AAClE,KACF;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,IAAA;AACT;AAKA,eAAe,mBAAmB,OAAA,EAAwC;AAExE,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAM,QAAQ,eAAA,EAAgB;AAC9B,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,2BAA2B,CAAC,CAAA;AACnD,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,MAAA,CAAO,CAAA,iBAAA,EAAoB,KAAK,mBAAmB,CAAC,CAAA;AAEtE,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,MAAM,YAAY,MAAM,OAAA;AAAA,QACtBA,MAAAA,CAAM,IAAI,2CAA2C;AAAA,OACvD;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AACpC,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAC3C,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,OAAA,CAAQ,IAAI,CAAA;AAC3C,IAAA,OAAA,GAAU,gBAAA,CAAiB,SAAA,EAAW,OAAA,CAAQ,KAAK,CAAA;AAAA,EACrD,CAAA,MAAO;AACL,IAAA,OAAA,GAAU,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA,CAAU,EAAE,CAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,2BAA2B,CAAC,CAAA;AACnD,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,IAAA;AAAA,UACJ;AAAA;AACF,OACF;AAAA,IACF;AACA,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,KAAA,EAAqB,GAAA,KACpD,kBAAA,CAAmB,OAAO,GAAG;AAAA,KAC/B;AACA,IAAA,SAAA,CAAU,WAAW,CAAA;AAAA,EACvB,CAAA,MAAO;AACL,IAAA,MAAM,aAAa,eAAA,EAAgB;AACnC,IAAA,MAAM,aAAa,OAAA,CAAQ,IAAA,GAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAI,CAAA,CAAA,CAAA,GAAM,EAAA;AAC/D,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,MAAAA,CAAM,KAAK,CAAA,YAAA,EAAe,UAAU,KAAK,OAAA,CAAQ,MAAM,OAAO,UAAU,CAAA;AAAA,CAAK;AAAA,KAC/E;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,OAAA,CAAQ,IAAI,kBAAA,CAAmB,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAC7C,MAAA,IAAI,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC1B,QAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,2BAA2B,MAAA,EAAuB;AAChE,EAAA,MAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,6DAA6D,CAAA,CACzE,MAAA;AAAA,IAAO,aAAA;AAAA,IAAe,yBAAA;AAAA,IAA2B,CAAC,KAAA,KACjD,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,IAEnB,MAAA,CAAO,eAAA,EAAiB,4CAA4C,CAAA,CACpE,MAAA,CAAO,UAAU,gBAAgB,CAAA,CACjC,OAAO,SAAA,EAAW,mBAAmB,EACrC,MAAA,CAAO,SAAA,EAAW,sCAAsC,CAAA,CACxD,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,mBAAmB,OAAO,CAAA;AAAA,EAClC,CAAC,CAAA;AACL;AC/MA,eAAe,qBACb,OAAA,EACe;AAEf,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,MACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,MAAMqD,OAAAA,GAAS,0BAA0B,eAAe,CAAA;AACxD,IAAA,MAAMC,SAAAA,GAAWD,QAAO,oBAAA,EAAqB;AAC7C,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkBC,SAAAA,EAAU,eAAA,CAAgB,OAAO,CAAA;AAEnE,IAAA,SAAA,CAAU,OAAO,CAAA;AACjB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,6BAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,0BAA0B,aAAa,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,YAAA;AAAA,IACnB,aAAA,CAAc,UAAA;AAAA,IACd,aAAA,CAAc,OAAA;AAAA,IACd,aAAA,CAAc;AAAA,GAChB;AAGA,EAAA,MAAM,eAAe,MAAM,MAAA,CAAO,iBAAA,CAAkB,YAAA,CAAa,QAAQ,OAAO,CAAA;AAChF,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,aAAA,CAAc,CAAA,QAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,OAAO,CAAA,kCAAA,CAAoC,CAAA;AAAA,EAC3F;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAItD,OAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,aAAa,OAAA,CAAQ,OAAO,KAAK,CAAC,CAAA;AAE9E,EAAA,MAAM,QAAA,GAAW,OAAO,oBAAA,EAAqB;AAE7C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,YAAA,EAAc,QAAQ,CAAA;AAG5D,IAAA,eAAA,CAAgB;AAAA,MACd,IAAA,EAAM,UAAA;AAAA,MACN,MAAA,EAAQ,IAAA;AAAA,MACR,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,IAAA,EAAM,gBAAA;AAAA,MACN,MAAA,EAAQ,aAAa,OAAA,CAAQ;AAAA,KAC9B,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA;AAAA,eAAA,EAAkD,IAAI;AAAA,WAAA,EAAgB,YAAA,CAAa,QAAQ,OAAO,CAAA;AAAA;AACpG,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACrF;AAAA,EACF;AACF;AAKO,SAAS,6BAA6B,MAAA,EAAuB;AAClE,EAAA,MAAA,CACG,OAAA,CAAQ,gBAAgB,CAAA,CACxB,WAAA,CAAY,gDAAgD,CAAA,CAC5D,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,mCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,OAAO,iBAAA,EAAmB,gBAAgB,EAC1C,MAAA,CAAO,qBAAA,EAAuB,2BAA2B,CAAA,CACzD,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,qBAAqB,OAAO,CAAA;AAAA,EACpC,CAAC,CAAA;AACL;AC5FA,eAAe,kBAAkB,OAAA,EAA2C;AAC1E,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,0BAA0B,eAAe,CAAA;AAExD,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,GAAA;AAC/B,IAAA,MAAM,CAAC,UAAA,EAAY,MAAM,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC7C,OAAO,uBAAA,EAAwB;AAAA,MAC/B,MAAA,CAAO,mBAAA,CAAoB,EAAE,SAAA,EAAW,OAAO;AAAA,KAChD,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA,CAAU;AAAA,QACR,UAAA;AAAA,QACA,QAAQ,MAAA,CAAO,GAAA;AAAA,UAAI,CAAC,KAAA,EAAwB,CAAA,KAC1C,YAAY,KAAA,EAAO,CAAA,EAAG,gBAAgB,OAAO;AAAA;AAC/C,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,4BAA4B,CAAC,CAAA;AACtD,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,OAAM,KAAA,CAAM,CAAA,mBAAA,EAAsB,UAAU,CAAA,qBAAA,EAAwB,OAAO,MAAM,CAAA;AAAA,CAAK;AAAA,OACxF;AACA,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAwB,CAAA,KAAc;AACpD,QAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,KAAA,EAAO,CAAC,CAAC,CAAA;AACjC,QAAA,IAAI,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACzB,UAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,QACd;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACF;AAKO,SAAS,yBAAA,CAA0B,MAAA,EAAiB,WAAA,GAAc,aAAA,EAAqB;AAC5F,EAAA,MAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,gDAAgD,CAAA,CAC5D,MAAA;AAAA,IACC,aAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,mCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,kBAAkB,OAAO,CAAA;AAAA,EACjC,CAAC,CAAA;AACL;AChDA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,MAAM,SAAA,GAAY,eAAe,KAAK,CAAA,GAClC,MAAM,KAAA,CAAM,oBAAoB,CAAA,CAAE,CAAC,CAAA,GACnC,KAAA;AACJ,EAAA,OAAO,SAAA,CAAU,WAAW,iBAAiB,CAAA,GACzC,UAAU,KAAA,CAAM,iBAAA,CAAkB,MAAM,CAAA,GACxC,SAAA;AACN;AAKA,eAAe,sBAAA,CACb,QACA,OAAA,EACe;AACf,EAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,IAAK,MAAA,CAAO,WAAW,EAAA,EAAI;AACpD,IAAA,aAAA;AAAA,MACE;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,eAAea,eAAAA,CAAgB;AAAA,IACnC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AACD,EAAA,MAAM,WAAA,GAAcuC,cAAAA,CAAe,eAAA,CAAgB,OAAO,CAAA;AAC1D,EAAA,MAAM,SAAA,GAAY,gBAAgB,eAAe,CAAA;AAIjD,EAAA,MAAM,kBAAA,GAAqB,YAAW,CAAE,IAAA;AAAA,IACtC,CAAC,KAAA,KAAU,KAAA,CAAM,MAAA,KAAW;AAAA,GAC9B;AAEA,EAAA,IAAI,kBAAA,IAAsB,CAAC,OAAA,CAAQ,IAAA,EAAM;AACvC,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNpD,MAAAA,CAAM,MAAA;AAAA,QACJ;AAAA;AACF,KACF;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CACnB,qBAAA,CAAsB,EAAE,IAAA,EAAM,MAAA,EAAyB,CAAA,CACvD,KAAA;AAAA,IAAM,MACL,aAAA;AAAA,MACE;AAAA;AACF,GACF;AAGF,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,OAAA,CAAQ,WAAA,EAAY;AACxD,EAAA,MAAM,oBACJ,EAAC;AAEH,EAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,IAAA,EAAM;AAC9B,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAY,KAAM,eAAA,EAAiB;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAUyD,cAAAA,CAAe;AAAA,QAC7B,KAAK,WAAA,CAAY,GAAA;AAAA,QACjB,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,QAAQ,GAAA,CAAI;AAAA,OACb,CAAA;AAED,MAAA,IAAI,OAAA,CAAQ,cAAc,aAAA,EAAe;AACvC,QAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AAKrB,QAAA,iBAAA,CAAkB,IAAA,CAAK;AAAA,UACrB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,cAAc,IAAA,CAAK;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAClC,IAAA,aAAA;AAAA,MACE;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNzD,MAAAA,CAAM,IAAA;AAAA,QACJ,CAAA,MAAA,EAAS,kBAAkB,MAAM,CAAA,+CAAA;AAAA;AACnC,KACF;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC7B,iBAAA,CAAkB,GAAA;AAAA,MAAI,CAAC,KAAA,KACrB,SAAA,CAAU,iBAAA,CAAkB;AAAA,QAC1B,YAAA,EAAc,MAAA,CAAO,KAAA,CAAM,YAAY;AAAA,OACxC;AAAA;AACH,GACF;AAGA,EAAA,MAAM,UAA4B,EAAC;AACnC,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNA,MAAAA,CAAM,MAAA;AAAA,YACJ,CAAA,mCAAA,EAAsC,iBAAA,CAAkB,CAAC,CAAA,CAAE,YAAY,CAAA,WAAA;AAAA;AACzE,SACF;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,iBAAA,CAAkB,CAAC,EAAE,YAAY,CAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,OAAA,CAAQ,KAAK,CAAA;AAC9C,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAE9C,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,SAAA,GAA2B,IAAA;AAE/B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,GAAO,SAAA;AACP,MAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,OAAA,CAAQ,IAAI,CAAA;AACjD,MAAA,YAAA,GAAe,cACX,CAAA,EAAG,WAAA,CAAY,YAAY,CAAA,CAAA,EAAI,WAAA,CAAY,eAAe,CAAA,CAAA,GAC1D,MAAA;AACJ,MAAA,MAAM,YAAA,GAAe,GAAG,OAAA,CAAQ,MAAM,IAAI,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAA;AACnE,MAAA,SAAA,GAAY,aAAA,CAAc,gBAAgB,OAAA,EAAS;AAAA,QACjD,WAAA;AAAA,QACA,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,MAAA;AACP,MAAA,MAAA,GAAS,aAAa,OAAO,CAAA;AAC7B,MAAA,SAAA,GAAY,aAAA,CAAc,eAAA,CAAgB,OAAA,EAAS,EAAE,aAAa,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,eAAA,CAAgB;AAAA,QACd,IAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAS,eAAA,CAAgB,OAAA;AAAA,QACzB,IAAA,EAAM,QAAA;AAAA,QACN,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,MAAA,EAAQ,IAAA,KAAS,SAAA,GAAY,YAAA,GAAe;AAAA,OAC7C,CAAA;AACD,MAAA,QAAA,EAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,IAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA,EAAe,aAAA,CAAc,eAAA,CAAgB,OAAA,EAAS,MAAM,CAAA;AAAA,MAC5D,WAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,OAAA,CAAa,eAAA,CAAgB,OAAA,EAAS,QAAQ,CAAA;AAAA,MACvD,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,gBAAA,EAAkB,UAAA;AAAA,QAChB,eAAA,CAAgB,OAAA;AAAA,QAChB,OAAA,CAAQ;AAAA,OACV;AAAA,MACA,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,SAAS;AAAA,KACrC;AACA,IAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,MAAA;AACpC,IAAA,IAAI,IAAA,KAAS,SAAA,EAAW,KAAA,CAAM,YAAA,GAAe,YAAA;AAC7C,IAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAElB,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,MAAA,MAAM,KAAA,GACJ,SAAS,SAAA,GACL,CAAA;AAAA,UAAA,EAAgC,QAAQ;AAAA,YAAA,EAAiB,QAAQ,MAAM;AAAA,UAAA,EAAe,QAAQ,IAAI;AAAA,iBAAA,EAAsB,gBAAgB,SAAS;AAAA,eAAA,EAAoB,aAAa,eAAe;AAAA,QAAA,EAAa,MAAM,CAAA,CAAA,GACpN,CAAA;AAAA,UAAA,EAA6B,QAAQ;AAAA,YAAA,EAAiB,QAAQ,MAAM;AAAA,UAAA,EAAe,QAAQ,IAAI;AAAA,aAAA,EAAkB,MAAM;AAAA,eAAA,EAAoB,aAAa,eAAe;AAAA,QAAA,EAAa,MAAM,CAAA,CAAA;AAChM,MAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,EAAA,EAAK,KAAK,EAAE,CAAC,CAAA;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,SAAA,CAAU,EAAE,eAAA,EAAiB,kBAAA,EAAoB,QAAA,EAAU,SAAS,CAAA;AACpE,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,OAAM,KAAA,CAAM;AAAA,sBAAA,EAA2B,QAAQ,CAAA,oBAAA,CAAsB;AAAA,KACvE;AAAA,EACF;AACF;AAKO,SAAS,+BAA+B,MAAA,EAAuB;AACpE,EAAA,MAAA,CACG,OAAA,CAAQ,wBAAwB,CAAA,CAChC,WAAA;AAAA,IACC;AAAA,GACF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA,mCAAA;AAAA,IACA,CAAC,KAAA,KAAU,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GAC/B,CACC,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,MAAA;AAAA,IACC,QAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,MAAA,EAAQ,OAAA,KAAY;AACjC,IAAA,MAAM,sBAAA,CAAuB,QAAQ,OAAO,CAAA;AAAA,EAC9C,CAAC,CAAA;AACL;;;AC3PO,SAAS,oBAAoBqB,QAAAA,EAAwB;AAC1D,EAAA,MAAM,cAAcA,QAAAA,CACjB,OAAA,CAAQ,MAAM,CAAA,CACd,YAAY,4DAA4D,CAAA;AAE3E,EAAA,uBAAA,CAAwB,WAAW,CAAA;AACnC,EAAA,uBAAA,CAAwB,WAAW,CAAA;AACnC,EAAA,uBAAA,CAAwB,WAAW,CAAA;AACnC,EAAA,+BAAA,CAAgC,WAAW,CAAA;AAC3C,EAAA,8BAAA,CAA+B,WAAW,CAAA;AAC1C,EAAA,2BAAA,CAA4B,WAAW,CAAA;AACvC,EAAA,0BAAA,CAA2B,WAAW,CAAA;AACtC,EAAA,wBAAA,CAAyB,WAAW,CAAA;AACpC,EAAA,yBAAA,CAA0B,WAAW,CAAA;AACrC,EAAA,0BAAA,CAA2B,WAAW,CAAA;AACtC,EAAA,4BAAA,CAA6B,WAAW,CAAA;AACxC,EAAA,yBAAA,CAA0B,WAAW,CAAA;AACrC,EAAA,8BAAA,CAA+B,WAAW,CAAA;AAC5C;ACbA,eAAe,mBAAmB,OAAA,EAA4C;AAC5E,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACxC,EAAA,IAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,IAAS,CAAA,EAAG;AAC9B,IAAA,aAAA,CAAc,kCAAkC,CAAA;AAChD,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,IAAI,CAAC,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA,IAAK,YAAA,CAAa,WAAW,EAAA,EAAI;AAChE,IAAA,aAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAGD,EAAA,MAAM,UAAUP,eAAAA,CAAgB;AAAA,IAC9B,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,QAAQ,eAAA,CAAgB;AAAA,GACzB,CAAA;AACD,EAAA,MAAM,eAAe,kBAAA,CAAmB;AAAA,IACtC,SAAA,EAAWE,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC;AAAA,GAC3B,CAAA;AAED,EAAA,OAAA,CAAQ,GAAA,CAAIhB,MAAAA,CAAM,IAAA,CAAK,uCAAuC,CAAC,CAAA;AAE/D,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,MAAM,iBAAA,CAAkB;AAAA,MACnC,YAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAS,eAAA,CAAgB;AAAA,KAC1B,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,kCAAkC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC1F;AACA,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,aAAA;AAEJ,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,CAAW,OAAA,EAAS;AAEtC,IAAA,eAAA,GAAkB,mBAAA,CAAoB,OAAA;AACtC,IAAA,aAAA,GAAgB,IAAA;AAChB,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,gDAA2C,CAAC,CAAA;AAAA,EACvE,CAAA,MAAA,IAAW,OAAA,CAAQ,SAAA,KAAc,OAAA,EAAS;AAExC,IAAA,eAAA,GAAkB,sBAAA,CAAuB,OAAA;AACzC,IAAA,aAAA,GAAgB,aAAA,CAAc,WAAW,OAAO,CAAA;AAChD,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA,iBAAA,EAAoB,WAAW,GAAG,CAAA,mCAAA;AAAA;AACpC,KACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,eAAA,GAAkB,sBAAA,CAAuB,OAAA;AACzC,IAAA,aAAA,GAAgB,aAAA,CAAc,WAAW,OAAO,CAAA;AAChD,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,MAAAA,CAAM,KAAA;AAAA,QACJ,CAAA,iBAAA,EAAoB,WAAW,GAAG,CAAA,qCAAA;AAAA;AACpC,KACF;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,iBAAiB,YAAY,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ6C,UAAAA,CAAAA,CAAY,KAAA,GAAQ,gBAAA,EAAkB,UAAU,CAAA;AAE9D,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,IAAI,UAAA,CAAW,OAAA;AAAA,IACf,KAAK,UAAA,CAAW,GAAA;AAAA,IAChB,YAAA,EAAc,QAAA;AAAA,IACd,MAAM,CAAC,eAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,eAAe,IAAI,CAAA;AAAA,IAC5D;AAAA,GACF;AAEA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,QAAA,EAAU,eAAA,CAAgB,OAAO,CAAA;AACnE,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,6BAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA;AAAA,IACnB,aAAA,CAAc,UAAA;AAAA,IACd,aAAA,CAAc,OAAA;AAAA,IACd,aAAA,CAAc;AAAA,GAChB;AAEA,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN7C,OAAM,IAAA,CAAK,CAAA,WAAA,EAAc,KAAK,CAAA,eAAA,EAAkB,YAAY,CAAA,GAAA,CAAK;AAAA,GACnE;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,YAAA,EAAc,QAAQ,CAAA;AAE5D,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,8BAAA,CAAgC,CAAC,CAAA;AACzD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAI,EAAE,CAAC,CAAA;AACjD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,SAAA,EAAY,YAAY,EAAE,CAAC,CAAA;AACnD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,SAAA,EAAY,KAAK,EAAE,CAAC,CAAA;AAC5C,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,MAAAA,CAAM,MAAM,CAAA,SAAA,EAAA,CAAa,KAAA,GAAQ,kBAAkB,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAAM;AAAA,KACrE;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,4BAA4B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACpF;AAAA,EACF;AACF;AAEO,SAAS,0BAAA,CACd,MAAA,EACA,WAAA,GAAc,OAAA,EACR;AACN,EAAA,MAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,gCAAgC,CAAA,CAC5C,cAAA;AAAA,IACC,2BAAA;AAAA,IACA;AAAA,GACF,CACC,cAAA,CAAe,aAAA,EAAe,mBAAmB,CAAA,CACjD,MAAA;AAAA,IACC,qBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IAAO,iBAAA;AAAA,IAAmB,mCAAA;AAAA,IAAqC,CAAC,KAAA,KAC/D,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GACpB,CACC,OAAO,iBAAA,EAAmB,gBAAgB,EAC1C,MAAA,CAAO,qBAAA,EAAuB,2BAA2B,CAAA,CACzD,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,mBAAmB,OAAO,CAAA;AAAA,EAClC,CAAC,CAAA;AACL;ACtKA,SAAS,gBAAgB,OAAA,EAAyB;AAChD,EAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAClC,EAAA,IAAI,KAAA,KAAU0D,mBAAAA,CAAoB,OAAA,CAAQ,WAAA,IAAe,OAAO,YAAA;AAChE,EAAA,IAAI,KAAA,KAAUC,sBAAAA,CAAuB,OAAA,CAAQ,WAAA,EAAY;AACvD,IAAA,OAAO,aAAA;AACT,EAAA,IAAI,KAAA,KAAUC,sBAAAA,CAAuB,OAAA,CAAQ,WAAA,EAAY;AACvD,IAAA,OAAO,eAAA;AACT,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,kBAAkB,OAAA,EAA2C;AAC1E,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,IAAI,CAAC,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA,IAAK,YAAA,CAAa,WAAW,EAAA,EAAI;AAChE,IAAA,aAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY;AAAA,IAC7B,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,SAAA,EAAW,gBAAgB,MAAA,GACvB,EAAE,SAAS,CAAC,eAAA,CAAgB,MAAM,CAAA,EAAE,GACpC;AAAA,GACL,CAAA;AAED,EAAA,MAAM,QAAA,GAAWC,iBAAiB,YAAY,CAAA;AAE9C,EAAA,IAAI;AAIF,IAAA,MAAM,CAAC,WAAA,EAAa,GAAG,iBAAiB,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC5D,OAAO,oBAAA,CAAqB;AAAA,QAC1B,SAAA,EAAW,CAAC,QAAQ,CAAA;AAAA,QACpB,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,MACD,GAAG,sBAAA,CAAuB,GAAA;AAAA,QAAI,CAAC,QAAA,KAC7B,MAAA,CAAO,oBAAA,CAAqB;AAAA,UAC1B,QAAA;AAAA,UACA,SAAA,EAAW,CAAC,QAAQ;AAAA,SACrB;AAAA;AACH,KACD,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAChC,IAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,GAAA,CAAI,CAAC,MAAM,CAAA,MAAO;AAAA,MAC9D,QAAA,EAAU,gBAAgB,IAAI,CAAA;AAAA,MAC9B,OAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAO,iBAAA,CAAkB,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK;AAAA,KACtC,CAAE,CAAA;AAEF,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,IAAA,CAAK,SAAA;AAAA,UACH;AAAA,YACE,YAAA;AAAA,YACA,QAAA,EAAU,QAAA,CAAc,eAAA,CAAgB,OAAA,EAAS,YAAY,CAAA;AAAA,YAC7D,QAAA;AAAA,YACA,KAAA;AAAA,YACA,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,cACrC,MAAM,CAAA,CAAE,QAAA;AAAA,cACR,SAAS,CAAA,CAAE,OAAA;AAAA,cACX,OAAO,CAAA,CAAE;AAAA,aACX,CAAE;AAAA,WACJ;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI7D,MAAAA,CAAM,KAAA,CAAM,CAAA,YAAA,EAAe,YAAY,GAAG,CAAC,CAAA;AACvD,MAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,KAAK,EAAE,CAAC,CAAA;AAC3C,MAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,MAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,QAAA,IAAI,CAAA,CAAE,QAAQ,CAAA,EAAG;AACf,UAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,EAAA,EAAK,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAE,CAAC,CAAA;AAAA,QACxD;AAAA,MACF;AACA,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,oBAAoB,CAAC,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,4BAA4B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACpF;AAAA,EACF;AACF;AAEO,SAAS,yBAAA,CACd,MAAA,EACA,WAAA,GAAc,MAAA,EACR;AACN,EAAA,MAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,+BAA+B,CAAA,CAC3C,cAAA,CAAe,2BAAA,EAA6B,wBAAwB,CAAA,CACpE,MAAA;AAAA,IAAO,iBAAA;AAAA,IAAmB,mCAAA;AAAA,IAAqC,CAAC,KAAA,KAC/D,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GACpB,CACC,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,kBAAkB,OAAO,CAAA;AAAA,EACjC,CAAC,CAAA;AACL;AC5GA,eAAsB,kBACpB,OAAA,EACe;AACf,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACxC,EAAA,IAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,IAAS,CAAA,EAAG;AAC9B,IAAA,aAAA,CAAc,kCAAkC,CAAA;AAChD,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,cAAc,OAAA,CAAQ,OAAA;AAC5B,EAAA,IAAI,CAAC,WAAA,CAAY,UAAA,CAAW,IAAI,CAAA,IAAK,WAAA,CAAY,WAAW,EAAA,EAAI;AAC9D,IAAA,aAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAS,QAAQ,KAAA,IAAS8D,cAAAA;AAChC,EAAA,MAAM,UAAU,OAAA,CAAQ,OAAA,GAAU,SAAS,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,GAAI,CAAA;AAElE,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,CAAiB;AAAA,IAClC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,SAAA,EAAW,gBAAgB,MAAA,GACvB,EAAE,SAAS,CAAC,eAAA,CAAgB,MAAM,CAAA,EAAE,GACpC;AAAA,GACL,CAAA;AAGD,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI;AACF,IAAA,WAAA,GAAc,MAAM,OAAO,cAAA,EAAe;AAAA,EAC5C,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACzF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,KAAA,EAAO,WAAW,CAAA;AAExD,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,IAAI,oBAAA,CAAqB,OAAA;AAAA,MACzB,KAAK,oBAAA,CAAqB,GAAA;AAAA,MAC1B,YAAA,EAAc,YAAA;AAAA,MACd,IAAA,EAAM,CAAC,WAAA,EAA8B,KAAA,EAAO,OAAO,KAAK,CAAA,EAAG,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MAC1E,KAAA,EAAO;AAAA,KACT;AACA,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,QAAA,EAAU,eAAA,CAAgB,OAAO,CAAA;AACnE,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,6BAAA;AAAA,IACpB;AAAA,MACE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA;AAAA,IACnB,aAAA,CAAc,UAAA;AAAA,IACd,aAAA,CAAc,OAAA;AAAA,IACd,aAAA,CAAc;AAAA,GAChB;AAEA,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN9D,OAAM,IAAA,CAAK,CAAA,WAAA,EAAc,KAAK,CAAA,uBAAA,EAA0B,WAAW,CAAA,GAAA,CAAK;AAAA,GAC1E;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW;AAAA,MACnC,YAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,KAAA;AAAA,MACA,UAAA,EAAY,KAAA;AAAA,MACZ,OAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,wCAAwC,CAAC,CAAA;AACjE,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAI,EAAE,CAAC,CAAA;AACjD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,QAAA,EAAW,WAAW,EAAE,CAAC,CAAA;AACjD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,SAAA,EAAY,KAAK,EAAE,CAAC,CAAA;AAC5C,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAM,KAAA,CAAM,CAAA,SAAA,EAAY,YAAY,SAAS,CAAC,MAAM,CAAC,CAAA;AACjE,IAAA,IAAI,UAAU8D,cAAAA,EAAc;AAC1B,MAAA,OAAA,CAAQ,IAAI9D,MAAAA,CAAM,KAAA,CAAM,CAAA,SAAA,EAAY,KAAK,EAAE,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,oCAAoC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC5F;AAAA,EACF;AACF;AAEO,SAAS,yBAAA,CACd,MAAA,EACA,WAAA,GAAc,MAAA,EACR;AACN,EAAA,MAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,yCAAyC,CAAA,CACrD,cAAA,CAAe,uBAAuB,wBAAwB,CAAA,CAC9D,eAAe,aAAA,EAAe,mBAAmB,EACjD,MAAA,CAAO,mBAAA,EAAqB,uCAAuC,CAAA,CACnE,MAAA,CAAO,mBAAA,EAAqB,uBAAuB,CAAA,CACnD,MAAA;AAAA,IAAO,iBAAA;AAAA,IAAmB,mCAAA;AAAA,IAAqC,CAAC,KAAA,KAC/D,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GACpB,CACC,OAAO,iBAAA,EAAmB,gBAAgB,EAC1C,MAAA,CAAO,qBAAA,EAAuB,2BAA2B,CAAA,CACzD,MAAA;AAAA,IACC,eAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,kBAAkB,OAAO,CAAA;AAAA,EACjC,CAAC,CAAA;AACL;ACnIA,eAAsB,sBACpB,OAAA,EACe;AACf,EAAA,MAAM,cAAc,OAAA,CAAQ,OAAA;AAC5B,EAAA,IAAI,CAAC,WAAA,CAAY,UAAA,CAAW,IAAI,CAAA,IAAK,WAAA,CAAY,WAAW,EAAA,EAAI;AAC9D,IAAA,aAAA;AAAA,MACE;AAAA,KACF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,+BAAA,CAAgC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAI+D,gBAAAA,CAAiB;AAAA,IAClC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,SAAA,EAAW,gBAAgB,MAAA,GACvB,EAAE,SAAS,CAAC,eAAA,CAAgB,MAAM,CAAA,EAAE,GACpC;AAAA,GACL,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,CAAC,KAAA,EAAO,QAAA,EAAU,WAAW,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACvD,OAAO,mBAAA,CAAoB;AAAA,QACzB,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,MACD,OAAO,sBAAA,CAAuB;AAAA,QAC5B,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,MACD,OAAO,cAAA;AAAe,KACvB,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,IAAA,CAAK,SAAA;AAAA,UACH;AAAA,YACE,OAAA,EAAS,WAAA;AAAA,YACT,SAAS,eAAA,CAAgB,OAAA;AAAA,YACzB,UAAA,EAAY,UAAA,CAAgB,eAAA,CAAgB,OAAA,EAAS,WAAW,CAAA;AAAA,YAChE,SAAA,EAAW,SAAA,CAAe,eAAA,CAAgB,OAAA,EAAS,WAAW,CAAA;AAAA,YAC9D,YAAA,EAAc,OAAO,KAAK,CAAA;AAAA,YAC1B,eAAA,EAAiB,OAAO,QAAQ,CAAA;AAAA,YAChC,cAAA,EAAgB,YAAY,QAAA,EAAS;AAAA,YACrC,cAAA,EAAgBC,YAAY,WAAW;AAAA,WACzC;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAIhE,MAAAA,CAAM,KAAA,CAAM,CAAA,oBAAA,EAAuB,WAAW,GAAG,CAAC,CAAA;AAC9D,MAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,KAAK,EAAE,CAAC,CAAA;AACtD,MAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,QAAQ,EAAE,CAAC,CAAA;AACzD,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,OAAM,KAAA,CAAM,CAAA,oBAAA,EAAuBgE,WAAAA,CAAY,WAAW,CAAC,CAAA,IAAA,CAAM;AAAA,OACnE;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACzF;AAAA,EACF;AACF;AAEO,SAAS,6BAAA,CACd,MAAA,EACA,WAAA,GAAc,WAAA,EACR;AACN,EAAA,MAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,qCAAqC,CAAA,CACjD,cAAA,CAAe,qBAAA,EAAuB,yBAAyB,CAAA,CAC/D,MAAA;AAAA,IAAO,iBAAA;AAAA,IAAmB,mCAAA;AAAA,IAAqC,CAAC,KAAA,KAC/D,QAAA,CAAS,KAAA,EAAO,EAAE;AAAA,GACpB,CACC,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,MAAA,CAAO,QAAA,EAAU,uBAAuB,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,sBAAsB,OAAO,CAAA;AAAA,EACrC,CAAC,CAAA;AACL;;;ACxFO,SAAS,sBAAsB3C,QAAAA,EAAwB;AAC5D,EAAA,MAAM,gBAAgBA,QAAAA,CACnB,OAAA,CAAQ,QAAQ,CAAA,CAChB,YAAY,yCAAyC,CAAA;AAExD,EAAA,0BAAA,CAA2B,aAAa,CAAA;AACxC,EAAA,yBAAA,CAA0B,aAAa,CAAA;AACvC,EAAA,yBAAA,CAA0B,aAAa,CAAA;AACvC,EAAA,6BAAA,CAA8B,aAAa,CAAA;AAC7C;ACkEO,IAAM,eAAA,GAAkB,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAUjD,SAAS,eAAe,GAAA,EAAuB;AACpD,EAAA,OAAO,iBAAiB,GAAG,CAAA,CACxB,MAAA,CAAO,qBAAA,EAAuB,2BAA2B,CAAA,CACzD,MAAA;AAAA,IACC,yBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA;AAAA,IACC,sBAAA;AAAA,IACA;AAAA,GACF;AACJ;AAGO,SAAS,iBAAiB,GAAA,EAAuB;AACtD,EAAA,OAAO,IACJ,MAAA,CAAO,iBAAA,EAAmB,0BAAA,EAA4B,CAAC,MAAM,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,EAC5E,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,MAAA,CAAO,mBAAmB,sBAAsB,CAAA;AACrD;AAKO,SAAS,iBAAiB,GAAA,EAAuB;AACtD,EAAA,OAAO,GAAA,CACJ,MAAA,CAAO,6BAAA,EAA+B,iCAAiC,EACvE,MAAA,CAAO,6BAAA,EAA+B,kCAAkC,CAAA,CACxE,OAAO,+BAAA,EAAiC,2BAA2B,CAAA,CACnE,MAAA,CAAO,2BAA2B,+BAA+B,CAAA;AACtE;AAGO,SAAS,kBAAkB,GAAA,EAAuB;AACvD,EAAA,OAAO,IACJ,MAAA,CAAO,uBAAA,EAAyB,oBAAoB,CAAA,CACpD,MAAA,CAAO,gBAAgB,WAAW,CAAA;AACvC;AAOO,SAAS,aAAa,OAAA,EAAuD;AAClF,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,IAAI,OAAA,CAAQ,WAAA,EAAa,MAAA,EAAQ,OAAA,CAAQ,sBAAsB,OAAA,CAAQ,WAAA;AACvE,EAAA,IAAI,OAAA,CAAQ,WAAA,EAAa,MAAA,EAAQ,OAAA,CAAQ,sBAAsB,OAAA,CAAQ,WAAA;AACvE,EAAA,IAAI,OAAA,CAAQ,aAAA,EAAe,MAAA,EAAQ,OAAA,CAAQ,wBAAwB,OAAA,CAAQ,aAAA;AAC3E,EAAA,IAAI,OAAA,CAAQ,SAAA,EAAW,MAAA,EAAQ,OAAA,CAAQ,sBAAsB,OAAA,CAAQ,SAAA;AACrE,EAAA,OAAO,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IAAI,OAAA,GAAU,MAAA;AACrD;AAGO,SAAS,aAAa,OAAA,EAA6D;AACxF,EAAA,MAAM,UAA6B,EAAC;AACpC,EAAA,IAAI,OAAA,CAAQ,WAAA,EAAa,OAAA,CAAQ,WAAA,GAAc,OAAA,CAAQ,WAAA;AACvD,EAAA,IAAI,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,GAAA;AACvC,EAAA,OAAO,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IAAI,OAAA,GAAU,MAAA;AACrD;AAGO,SAAS,aAAa,GAAA,EAAuC;AAClE,EAAA,MAAM,OAAQ,GAAA,IAAO,MAAA;AACrB,EAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,IAAwC,CAAA,EAAG;AACvE,IAAA,aAAA,CAAc,iBAAiB,IAAI,CAAA,mBAAA,EAAsB,gBAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACvF;AACA,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,gBAAgB,OAAA,EAI9B;AACA,EAAA,MAAM,WAAW,+BAAA,CAAgC;AAAA,IAC/C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,WAAA,IAAe,WAAA;AAE5D,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,IAAI,CAAC,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAChC,MAAA,aAAA,CAAc,CAAA,0BAAA,EAA6B,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC/D;AACA,IAAA,QAAA,GAAW,OAAA,CAAQ,QAAA;AAAA,EACrB;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,QAAA,CAAS,OAAA,EAAS,QAAQ,QAAA,EAAS;AACvD;AAKA,eAAsB,YAAY,OAAA,EAAoD;AACpF,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,GAAA,CAAI,iBAAA;AACzD,EAAA,MAAM,aACJ,OAAA,CAAQ,UAAA,IAAc,QAAQ,GAAA,CAAI,eAAA,IAAmB,QAAQ,GAAA,CAAI,WAAA;AAEnE,EAAA,IAAI,YAAA,IAAgB,QAAQ,UAAA,EAAY;AACtC,IAAA,aAAA,CAAc,8DAA8D,CAAA;AAAA,EAC9E;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,WAAA,IAAe,WAAA;AAE5D,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,MAAA,aAAA;AAAA,QACE;AAAA,OAEF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,SAAA,CAAU,OAAA,CAAQ,QAAS,CAAA,EAAG;AACjC,MAAA,aAAA,CAAc,CAAA,0BAAA,EAA6B,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,WAAW,+BAAA,CAAgC;AAAA,MAC/C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AACD,IAAA,MAAMgC,OAAAA,GAAS,IAAI,WAAA,CAAY,EAAE,QAAQ,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA;AAEpE,IAAA,OAAO;AAAA,MACL,MAAA,EAAAA,OAAAA;AAAA,MACA,YAAA;AAAA,MACA,iBAAiB,OAAA,CAAQ,QAAA;AAAA,MACzB,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,aAAA;AAAA,MACE;AAAA,KAGF;AAAA,EACF;AAMA,EAAA,MAAM,gBAAgB,6BAAA,CAA8B;AAAA,IAClD,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,OAAA,GAAUzC,mBAAAA,CAAoB,aAAA,CAAc,UAAU,CAAA;AAG5D,EAAA,OAAA,CAAQ,KAAA,CAAMZ,MAAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAC/C,EAAA,MAAM,EAAE,YAAA,EAAc,KAAA,EAAM,GAAI,MAAMiE,kBAAAA,CAAmB;AAAA,IACvD,MAAA;AAAA,IACA,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB,iBAAiB,OAAA,CAAQ,OAAA;AAAA,IACzB,SAAA,EAAW,gBAAA;AAAA,IACX;AAAA,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,EAAE,QAAQ,OAAA,EAAS,aAAA,CAAc,SAAS,CAAA;AAEzE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,YAAA,EAAc,KAAA;AAAA,IACd,OAAA;AAAA,IACA,iBAAiB,OAAA,CAAQ,OAAA;AAAA,IACzB,SAAS,aAAA,CAAc,OAAA;AAAA,IACvB;AAAA,GACF;AACF;AAOO,SAASlB,eAAAA,CAAe,MAAc,KAAA,EAAyB;AACpE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,UAAS,GAAI,KAAA;AACxD;AAGO,SAAS,aAAA,CAAc,GAAA,EAAc,MAAA,GAAS,CAAA,EAAW;AAC9D,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,EAAKA,eAAAA,EAAgB,MAAM,CAAA;AACnD;;;AClQA,eAAe,aAAA,CAAc,MAAc,OAAA,EAAuC;AAChF,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,OAAO,CAAA;AAEtC,IAAA,MAAM,MAAA,GAA2B;AAAA,MAC/B,IAAA;AAAA,MACA,cAAc,OAAA,CAAQ;AAAA,KACxB;AACA,IAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,CAAO,kBAAA,GAAqB,OAAA,CAAQ,QAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,aAAa,OAAO,CAAA;AACpC,IAAA,IAAI,OAAA,SAAgB,OAAA,GAAU,OAAA;AAE9B,IAAA,MAAM,OAAA,GAAU,aAAa,OAAO,CAAA;AAEpC,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,IAAI/C,MAAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAI,MAAM,CAAC,CAAA;AAAA,IACvD;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY;AAAA,MAC3C,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AACjC,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAC,CAAA;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,aAAA,CAAc,MAAA,CAAO,SAAS,wBAAwB,CAAA;AAAA,IACxD;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,6BAA6B,CAAC,CAAA;AACtD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,MAAA,CAAO,kBAAkB,CAAA,CAAE,CAAA;AACtD,IAAA,IAAI,OAAO,aAAA,EAAe;AAKxB,MAAA,MAAM,WAAW,uCAAA,CAAwC,IAAA;AAAA,QACvD,MAAA,CAAO;AAAA,OACT;AACA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAA,CAAQ,GAAA;AAAA,UACNA,MAAAA,CAAM,MAAA;AAAA,YACJ,CAAA,qDAAA,EACM,OAAO,kBAAkB,CAAA,qIAAA;AAAA;AAGjC,SACF;AACA,QAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,CAAsB,CAAC,CAAA;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,CAAA,4BAAA,CAA8B,CAAC,CAAA;AAAA,MAC1D;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,KAAK,CAAA,IAAA,EAAO,MAAA,CAAO,cAAc,OAAA,CAAQ,KAAA,EAAO,QAAQ,CAAC,CAAA,CAAE;AAAA,OACnE;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACF;AAEO,SAAS,2BAA2B,MAAA,EAAuB;AAChE,EAAA,MAAM,GAAA,GAAM,MAAA,CACT,OAAA,CAAQ,eAAe,CAAA,CACvB,YAAY,4BAA4B,CAAA,CACxC,cAAA,CAAe,0BAAA,EAA4B,mCAAmC,CAAA,CAC9E,OAAO,sBAAA,EAAwB,8BAAA,EAAgC,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA,CACrF,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA;AACpC,EAAA,cAAA,CAAe,GAAG,CAAA;AAClB,EAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,EAAA,iBAAA,CAAkB,GAAG,CAAA;AACrB,EAAA,GAAA,CAAI,MAAA,CAAO,OAAO,IAAA,EAAM,OAAA,KAAY;AAClC,IAAA,MAAM,aAAA,CAAc,MAAM,OAAO,CAAA;AAAA,EACnC,CAAC,CAAA;AACH;ACzFA,eAAe,YAAY,OAAA,EAAqC;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,OAAO,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,WAAW,EAAE,YAAA,EAAc,IAAA,CAAK,YAAA,EAAc,CAAA;AAE/E,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,aAAA,CAAc,MAAA,CAAO,SAAS,uBAAuB,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,EAAC;AACjC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,GAAa,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AAEnF,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAC,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,kBAAkB,CAAC,CAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,QAAQ,MAAM,CAAA;AAAA,CAAM,CAAC,CAAA;AAEvD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAc,GAAI,KAAA;AAClC,MAAA,MAAM,WAAW,MAAA,CAAO,kBAAA,GACpB,CAAA,MAAA,EAAS,MAAA,CAAO,kBAAkB,CAAA,CAAA,CAAA,GAClC,QAAA;AACJ,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA,GAASA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAAA,GAAI,EAAA;AACzD,MAAA,MAAM,aAAA,GACJ,MAAA,CAAO,YAAA,CAAa,MAAA,GAAS,EAAA,GACzB,CAAA,EAAG,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,QACnC,MAAA,CAAO,YAAA;AAEb,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,OAAO,IAAI,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AACnD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,MAAA,CAAO,EAAE,CAAA,CAAE,CAAA;AACxC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,aAAa,CAAA,CAAE,CAAA;AAC5C,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,CAAA;AACvC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,aAAa,CAAA,CAAE,CAAA;AAC5C,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,0BAA0B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAClF;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB,MAAA,EAAuB;AAC9D,EAAA,MAAM,GAAA,GAAM,MAAA,CACT,OAAA,CAAQ,MAAM,EACd,WAAA,CAAY,0BAA0B,CAAA,CACtC,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,iBAAiB,uBAAuB,CAAA;AAClD,EAAA,cAAA,CAAe,GAAG,CAAA;AAClB,EAAA,GAAA,CAAI,MAAA,CAAO,OAAO,OAAA,KAAY;AAC5B,IAAA,MAAM,YAAY,OAAO,CAAA;AAAA,EAC3B,CAAC,CAAA;AACH;ACjDA,eAAe,aAAA,CAAc,SAAiB,OAAA,EAAuC;AACnF,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,OAAO,CAAA;AAEtC,IAAA,MAAM,SAA2B,EAAC;AAClC,IAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA;AACtB,MAAA,gBAAA,GAAmB,IAAA;AAAA,IACrB;AACA,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,MAAA,CAAO,eAAe,OAAA,CAAQ,YAAA;AAC9B,MAAA,gBAAA,GAAmB,IAAA;AAAA,IACrB;AACA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,MAAA,CAAO,qBAAqB,OAAA,CAAQ,QAAA;AACpC,MAAA,gBAAA,GAAmB,IAAA;AAAA,IACrB;AACA,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,MAAA,CAAO,kBAAA,GAAqB,CAAA;AAC5B,MAAA,gBAAA,GAAmB,IAAA;AAAA,IACrB;AAEA,IAAA,MAAM,OAAA,GAAU,aAAa,OAAO,CAAA;AACpC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,OAAA,GAAU,OAAA;AACjB,MAAA,gBAAA,GAAmB,IAAA;AAAA,IACrB;AAEA,IAAA,MAAM,OAAA,GAAU,aAAa,OAAO,CAAA;AAEpC,IAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,OAAA,EAAS;AACjC,MAAA,aAAA;AAAA,QACE;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,OAAO,KAAK,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY;AAAA,MAC3C,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,OAAA;AAAA,MACA,MAAA,EAAQ,mBAAmB,MAAA,GAAS,KAAA,CAAA;AAAA,MACpC;AAAA,KACD,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AACjC,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAC,CAAA;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,aAAA,CAAc,MAAA,CAAO,SAAS,wBAAwB,CAAA;AAAA,IACxD;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,KAAA,CAAM,6BAA6B,CAAC,CAAA;AACtD,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,MAAA,CAAO,sBAAsB,MAAA,CAAO,YAAY,EAAE,CAAC,CAAA;AAAA,IACvE;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACF;AAEO,SAAS,2BAA2B,MAAA,EAAuB;AAChE,EAAA,MAAM,GAAA,GAAM,MAAA,CACT,OAAA,CAAQ,kBAAkB,EAC1B,WAAA,CAAY,0BAA0B,CAAA,CACtC,MAAA,CAAO,eAAA,EAAiB,gBAAgB,CAAA,CACxC,MAAA,CAAO,4BAA4B,mBAAmB,CAAA,CACtD,MAAA,CAAO,sBAAA,EAAwB,8BAAA,EAAgC,CAAC,CAAA,KAAM,QAAA,CAAS,GAAG,EAAE,CAAC,CAAA,CACrF,MAAA,CAAO,oBAAA,EAAsB,8BAA8B,CAAA,CAC3D,MAAA,CAAO,UAAU,gBAAgB,CAAA;AACpC,EAAA,cAAA,CAAe,GAAG,CAAA;AAClB,EAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,EAAA,iBAAA,CAAkB,GAAG,CAAA;AACrB,EAAA,GAAA,CAAI,MAAA,CAAO,OAAO,OAAA,EAAS,OAAA,KAAY;AACrC,IAAA,MAAM,aAAA,CAAc,SAAS,OAAO,CAAA;AAAA,EACtC,CAAC,CAAA;AACH;ACxGA,eAAe,mBAAA,CACb,OAAA,EACA,OAAA,EACA,IAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,OAAO,QAAA,GAAW,UAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,OAAO,QAAA,GAAW,UAAA;AAC/B,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,OAAO,CAAA;AACtC,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,OAAA,EAAU,OAAO,KAAK,CAAC,CAAA;AACvD,IAAA,MAAM,SAAS,IAAA,GACX,MAAM,IAAA,CAAK,MAAA,CAAO,UAAU,IAAA,CAAK,YAAA,EAAc,OAAO,CAAA,GACtD,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,cAAc,OAAO,CAAA;AAE5D,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,aAAA,CAAc,OAAO,KAAA,IAAS,CAAA,UAAA,EAAa,IAAA,GAAO,MAAA,GAAS,QAAQ,CAAA,MAAA,CAAQ,CAAA;AAAA,IAC7E;AACA,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,CAAA,MAAA,EAAS,IAAI,gBAAgB,CAAC,CAAA;AAAA,EACxD,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,CAAA,UAAA,EAAa,IAAA,GAAO,MAAA,GAAS,QAAQ,CAAA,QAAA,EAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACxG;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB,MAAA,EAAuB;AAC9D,EAAA,MAAM,MAAM,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,CAAE,YAAY,6BAA6B,CAAA;AACtF,EAAA,cAAA,CAAe,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,SAAS,OAAA,KAAY;AACrD,IAAA,MAAM,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAAA,EAClD,CAAC,CAAA;AACH;AAEO,SAAS,2BAA2B,MAAA,EAAuB;AAChE,EAAA,MAAM,MAAM,MAAA,CACT,OAAA,CAAQ,kBAAkB,CAAA,CAC1B,YAAY,kCAAkC,CAAA;AACjD,EAAA,cAAA,CAAe,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,SAAS,OAAA,KAAY;AACrD,IAAA,MAAM,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,KAAK,CAAA;AAAA,EACnD,CAAC,CAAA;AACH;AC5BA,eAAe,UAAA,CAAW,SAAiB,OAAA,EAAoC;AAC7E,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,OAAO,CAAA;AACtC,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,CAAQ,IAAI,CAAA;AAEtC,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAO,CAAA,QAAA,EAAW,IAAI,MAAM,CAAC,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS;AAAA,MACxC,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AACjC,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAC,CAAA;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,aAAA,CAAc,MAAA,CAAO,SAAS,kBAAkB,CAAA;AAAA,IAClD;AAEA,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,uBAAuB,MAAA,CAAO,MAAM,EAAE,CAAC,CAAA;AAE/D,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AACxB,MAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,QAAA,MAAM,WAAA,GACJ,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,EAAA,GAAK,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,QAAQ,MAAA,CAAO,IAAA;AACtE,QAAA,OAAA,CAAQ,GAAA,CAAI,SAAS,MAAA,CAAO,IAAI,OAAO,MAAA,CAAO,KAAK,CAAA,GAAA,EAAM,WAAW,CAAA,CAAA,CAAG,CAAA;AACvE,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,MAAA,CAAO,eAAe,CAAA,CAAE,CAAA;AAAA,MACnD;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,IAAA;AAAA,UACJ,CAAA,gBAAA,EAAmB,MAAA,CAAO,UAAA,CAAW,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,KAAA;AAAA;AAC3F,OACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,oBAAoB,KAAA,CAAA,EAAW;AACxC,MAAA,OAAA,CAAQ,IAAI,CAAA,kBAAA,EAAqB,MAAA,CAAO,gBAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IACtE;AACA,IAAA,IAAI,MAAA,CAAO,mBAAmB,KAAA,CAAA,EAAW;AACvC,MAAA,OAAA,CAAQ,IAAI,CAAA,oBAAA,EAAuB,MAAA,CAAO,eAAe,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IACvE;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,wBAAwB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAChF;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,MAAA,EAAuB;AAC7D,EAAA,MAAM,GAAA,GAAM,MAAA,CACT,OAAA,CAAQ,eAAe,EACvB,WAAA,CAAY,yBAAyB,CAAA,CACrC,MAAA,CAAO,eAAA,EAAiB,iDAAiD,CAAA,CACzE,MAAA,CAAO,UAAU,gBAAgB,CAAA;AACpC,EAAA,cAAA,CAAe,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,SAAS,OAAA,KAAY;AACrD,IAAA,MAAM,UAAA,CAAW,SAAS,OAAO,CAAA;AAAA,EACnC,CAAC,CAAA;AACH;ACxEA,eAAe,WAAA,CAAY,SAAiB,OAAA,EAAqC;AAC/E,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,OAAO,CAAA;AACtC,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,OAAO,QAAA,CAAS,IAAA,CAAK,cAAc,OAAO,CAAA;AAEnE,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,aAAA,CAAc,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,KAAK,CAAC,CAAA;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAc,GAAI,KAAA;AAClC,IAAA,MAAM,WAAW,MAAA,CAAO,kBAAA,GACpB,CAAA,MAAA,EAAS,MAAA,CAAO,kBAAkB,CAAA,QAAA,CAAA,GAClC,aAAA;AAEJ,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,MAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,IAAK,OAAO,MAAA,GAASA,MAAAA,CAAM,IAAA,CAAK,WAAW,CAAA,GAAI,EAAA;AAAA,KACvE;AACA,IAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,MAAA,CAAO,EAAE,CAAA,CAAE,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,aAAa,CAAA,CAAE,CAAA;AAC9C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,MAAA,CAAO,YAAY,CAAA,CAAE,CAAA;AACpD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,mBAAmB,IAAI,IAAA,CAAK,OAAO,SAAS,CAAA,CAAE,cAAA,EAAgB,CAAA,CAAE,CAAA;AAC5E,IAAA,OAAA,CAAQ,GAAA,CAAI,mBAAmB,IAAI,IAAA,CAAK,OAAO,SAAS,CAAA,CAAE,cAAA,EAAgB,CAAA,CAAE,CAAA;AAC5E,IAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,IAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,MAAA,CAAO,YAAY,CAAA,CAAE,CAAA;AAExC,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,MAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AACxB,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,mBAAA,EAAqB,MAAA,EAAQ;AAC9C,QAAA,OAAA,CAAQ,GAAA,CAAI,sBAAsB,MAAA,CAAO,OAAA,CAAQ,oBAAoB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACnF;AACA,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,mBAAA,EAAqB,MAAA,EAAQ;AAC9C,QAAA,OAAA,CAAQ,GAAA,CAAI,sBAAsB,MAAA,CAAO,OAAA,CAAQ,oBAAoB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACnF;AACA,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,qBAAA,EAAuB,MAAA,EAAQ;AAChD,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,wBAAwB,MAAA,CAAO,OAAA,CAAQ,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SACzE;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,mBAAA,EAAqB,MAAA,EAAQ;AAC9C,QAAA,OAAA,CAAQ,GAAA,CAAI,oBAAoB,MAAA,CAAO,OAAA,CAAQ,oBAAoB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACjF;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACrF;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB,MAAA,EAAuB;AAC9D,EAAA,MAAM,GAAA,GAAM,MAAA,CACT,OAAA,CAAQ,gBAAgB,CAAA,CACxB,YAAY,iCAAiC,CAAA,CAC7C,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA;AACpC,EAAA,cAAA,CAAe,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,SAAS,OAAA,KAAY;AACrD,IAAA,MAAM,WAAA,CAAY,SAAS,OAAO,CAAA;AAAA,EACpC,CAAC,CAAA;AACH;AChCA,eAAe,SAAA,CACb,YAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,IAAI;AACF,IAAA,IAAI,CAACkE,SAAAA,CAAU,YAAY,CAAA,EAAG;AAC5B,MAAA,aAAA,CAAc,CAAA,uBAAA,EAA0B,YAAY,CAAA,CAAE,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,OAAA,CAAQ,cAAA,IAAkB,CAAC,OAAA,CAAQ,KAAA,EAAO;AAC5C,MAAA,aAAA;AAAA,QACE;AAAA,OACF;AAAA,IACF;AAKA,IAAA,MAAM,oBAAoB,CAAC,EACzB,OAAA,CAAQ,YAAA,IAAgB,QAAQ,GAAA,CAAI,iBAAA,CAAA;AAEtC,IAAA,IAAI,sBAAsB,CAAC,OAAA,CAAQ,KAAA,IAAS,CAAC,QAAQ,cAAA,CAAA,EAAiB;AACpE,MAAA,aAAA;AAAA,QACE;AAAA,OAOF;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,OAAO,CAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,sBAAA,CAAuB,YAAuB,CAAA;AAC7E,IAAA,MAAM,iBAAA,GAAoB,CAAC,OAAA,CAAQ,KAAA;AAEnC,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNlE,MAAAA,CAAM,IAAA;AAAA,UACJ,iBAAA,GACI,CAAA,+BAAA,EAAkC,YAAY,CAAA,GAAA,CAAA,GAC9C,2BAA2B,KAAK,CAAA,GAAA;AAAA;AACtC,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA;AAAA,MAC/B;AAAA,QACE,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,YAAA;AAAA,QACA,KAAA;AAAA,QACA,OAAA;AAAA,QACA,eAAe,OAAA,CAAQ;AAAA,OACzB;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AACjC,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAC,CAAA;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAInB,MAAA,aAAA,CAAc,MAAA,CAAO,SAAS,mBAAmB,CAAA;AAAA,IACnD;AAEA,IAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,OAAO,IAAI,OAAO,CAAA;AACzC,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,KAAA,CAAM,SAAS,CAAA,GAAI,OAAO,SAAS,CAAA;AACrD,IAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,YAAY,MAAA,CAAO,KAAK,EAAE,CAAC,CAAA;AAClD,IAAA,OAAA,CAAQ,IAAIA,MAAAA,CAAM,IAAA,CAAK,SAAS,MAAA,CAAO,eAAe,EAAE,CAAC,CAAA;AACzD,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACNA,MAAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,MAAA,CAAO,KAAK,CAAA,+BAAA,CAAiC;AAAA,OAC5E;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,sBAAsB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAC9E;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,MAAA,EAAuB;AAC5D,EAAA,MAAM,GAAA,GAAM,MAAA,CACT,OAAA,CAAQ,6BAA6B,CAAA,CACrC,WAAA,CAAY,+BAA+B,CAAA,CAC3C,MAAA,CAAO,iBAAA,EAAmB,mCAAmC,CAAA,CAC7D,MAAA;AAAA,IACC,yBAAA;AAAA,IACA;AAAA,GAEF,CACC,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA;AACpC,EAAA,cAAA,CAAe,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,YAAA,EAAc,SAAS,OAAA,KAAY;AACnE,IAAA,MAAM,SAAA,CAAU,YAAA,EAAc,OAAA,EAAS,OAAO,CAAA;AAAA,EAChD,CAAC,CAAA;AACH;AAMA,eAAe,cAAc,OAAA,EAAuC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAS,GAAI,gBAAgB,OAAO,CAAA;AAC7D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,aAAA;AAAA,QACE;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,IAAImE,WAAAA,CAAY,EAAE,MAAA,EAAQ,SAAS,CAAA;AAClD,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,GAAA,CAAInE,MAAAA,CAAM,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,iBAAA,CAAkB,QAAA,EAAW;AAAA,MAC9D,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AACD,IAAA,MAAM,kBAAA,GAAqB,cAAc,MAAA,CAAO,CAAC,MAAM,gBAAA,CAAiB,CAAA,CAAE,KAAK,CAAC,CAAA;AAEhF,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,kBAAkB,CAAC,CAAA;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AACnC,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,+BAA+B,CAAC,CAAA;AACzD,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAwB,mBAAmB,MAAM,CAAA;AAAA,CAAM,CAAC,CAAA;AAE/E,IAAA,KAAA,MAAW,QAAQ,kBAAA,EAAoB;AACrC,MAAA,MAAM,SAAA,GAAY,0BAAA,CAA2B,IAAA,CAAK,KAAK,CAAA;AACvD,MAAA,MAAM,YAAY,IAAA,CAAK,WAAA,GAAcA,MAAAA,CAAM,MAAA,CAAO,cAAc,CAAA,GAAI,EAAA;AACpE,MAAA,MAAM,OAAO,IAAI,IAAA,CAAK,KAAK,oBAAA,GAAuB,GAAI,EAAE,cAAA,EAAe;AACvE,MAAA,MAAM,UAAU,IAAA,CAAK,WAAA,GACjB,IAAA,CAAK,WAAA,CAAY,SAAS,EAAA,GACxB,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAA,GAChC,KAAK,WAAA,GACP,IAAA;AAEJ,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,MAAAA,CAAM,IAAA,CAAK,aAAa,SAAS,CAAC,CAAA,EAAG,SAAS,CAAA,CAAE,CAAA;AACjE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,IAAA,CAAK,YAAY,CAAA,CAAE,CAAA;AAChD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAE,CAAA;AACnC,MAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAE,CAAA;AACnD,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACzF;AAAA,EACF;AACF;AAEO,SAAS,2BAA2B,MAAA,EAAuB;AAChE,EAAA,MAAM,GAAA,GAAM,MAAA,CACT,OAAA,CAAQ,SAAS,CAAA,CACjB,YAAY,0DAA0D,CAAA,CACtE,cAAA,CAAe,sBAAA,EAAwB,qBAAqB,CAAA,CAC5D,OAAO,aAAA,EAAe,4BAAA,EAA8B,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA,CAC1E,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA;AACpC,EAAA,gBAAA,CAAiB,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,OAAA,KAAY;AAC9C,IAAA,MAAM,cAAc,OAAO,CAAA;AAAA,EAC7B,CAAC,CAAA;AACH;AAMA,eAAe,gBAAA,CAAiB,OAAe,OAAA,EAA0C;AACvF,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAS,GAAI,gBAAgB,OAAO,CAAA;AAC7D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,aAAA;AAAA,QACE;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,IAAImE,WAAAA,CAAY,EAAE,MAAA,EAAQ,SAAS,CAAA;AAClD,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,GAAA,CAAInE,MAAAA,CAAM,IAAA,CAAK,iCAAiC,CAAC,CAAA;AAAA,IAC3D;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,sBAAA,CAAuB,UAAW,KAAA,EAAO;AAAA,MACrE,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AAED,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAC,CAAA;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,oBAAoB,CAAC,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,2BAA2B,KAAK,CAAA;AAClD,IAAA,OAAA,CAAQ,GAAA;AAAA,MACNA,MAAAA,CAAM,IAAA;AAAA,QACJ,CAAA,kBAAA,EAAqB,SAAA,IAAa,KAAK,CAAA,EAAA,EAAK,SAAS,MAAM,CAAA;AAAA;AAAA;AAC7D,KACF;AAEA,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,OAAO,IAAI,IAAA,CAAK,IAAI,SAAA,GAAY,GAAI,EAAE,cAAA,EAAe;AAC3D,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,KAAW,MAAA,GAASA,MAAAA,CAAM,KAAK,KAAK,CAAA,GAAIA,MAAAA,CAAM,KAAA,CAAM,OAAO,CAAA;AAC9E,MAAA,MAAM,YAAY,GAAA,CAAI,SAAA,GAAYA,MAAAA,CAAM,MAAA,CAAO,cAAc,CAAA,GAAI,EAAA;AACjE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,MAAM,CAAA,EAAG,SAAS,KAAKA,MAAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAI,CAAA;AAC5D,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAC7B,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,2BAA2B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACF;AAEO,SAAS,8BAA8B,MAAA,EAAuB;AACnE,EAAA,MAAM,MAAM,MAAA,CACT,OAAA,CAAQ,oBAAoB,CAAA,CAC5B,WAAA,CAAY,gDAAgD,CAAA,CAC5D,cAAA;AAAA,IACC,sBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,aAAA,EAAe,8BAAA,EAAgC,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA,CAC5E,MAAA,CAAO,UAAU,gBAAgB,CAAA;AACpC,EAAA,gBAAA,CAAiB,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,OAAO,OAAA,KAAY;AACrD,IAAA,MAAM,gBAAA,CAAiB,OAAO,OAAO,CAAA;AAAA,EACvC,CAAC,CAAA;AACH;AAMA,eAAe,oBAAoB,OAAA,EAA6C;AAC9E,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,+BAAA,CAAgC;AAAA,MAClD,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAED,IAAA,IAAI,QAAQ,OAAA,CAAQ,KAAA;AACpB,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AACzB,QAAA,aAAA;AAAA,UACE;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,CAACkE,SAAAA,CAAU,OAAA,CAAQ,YAAa,CAAA,EAAG;AACrC,QAAA,aAAA,CAAc,CAAA,uBAAA,EAA0B,OAAA,CAAQ,YAAY,CAAA,CAAE,CAAA;AAAA,MAChE;AACA,MAAA,KAAA,GAAQ,sBAAA,CAAuB,QAAQ,YAAwB,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,MAAA,GAAS,8BAAA,CAA+B,EAAE,KAAA,EAAO,SAAS,CAAA;AAChE,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,EACnC,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,0BAA0B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAClF;AAAA,EACF;AACF;AAEO,SAAS,iCAAiC,MAAA,EAAuB;AACtE,EAAA,MAAA,CACG,OAAA,CAAQ,gBAAgB,CAAA,CACxB,WAAA;AAAA,IACC;AAAA,GAGF,CACC,MAAA;AAAA,IACC,iBAAA;AAAA,IACA;AAAA,GAEF,CACC,MAAA;AAAA,IACC,2BAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,iBAAA,EAAmB,0BAAA,EAA4B,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA,CAC5E,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,oBAAoB,OAAO,CAAA;AAAA,EACnC,CAAC,CAAA;AACL;ACrTA,eAAe,qBAAqB,OAAA,EAA8C;AAChF,EAAA,IAAI;AACF,IAAA,IAAI,CAACA,SAAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAChC,MAAA,aAAA,CAAc,CAAA,0BAAA,EAA6B,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,+BAAA,CAAgC;AAAA,MAClD,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,SAAS,qBAAA,CAAsB;AAAA,MACnC,iBAAiB,OAAA,CAAQ,QAAA;AAAA,MACzB,OAAA;AAAA,MACA,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,EACnC,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,0BAA0B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAClF;AAAA,EACF;AACF;AAEO,SAAS,kCAAkC,MAAA,EAAuB;AACvE,EAAA,MAAA,CACG,OAAA,CAAQ,gBAAgB,CAAA,CACxB,WAAA;AAAA,IACC;AAAA,GAGF,CACC,cAAA;AAAA,IACC,sBAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,iBAAA,EAAmB,0BAAA,EAA4B,CAAC,MAAM,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA,CAC5E,MAAA;AAAA,IACC,wBAAA;AAAA,IACA,yDAAA;AAAA,IACA,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,EAAG,EAAE;AAAA,GACvB,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,qBAAqB,OAAO,CAAA;AAAA,EACpC,CAAC,CAAA;AACL;AAEA,eAAe,qBAAqB,OAAA,EAA8C;AAChF,EAAA,IAAI;AACF,IAAA,IAAI,CAACA,SAAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAChC,MAAA,aAAA,CAAc,CAAA,0BAAA,EAA6B,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA,EAAG;AACvC,MAAA,aAAA,CAAc,8CAA8C,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,CAAC,QAAQ,SAAA,IAAa,CAAC,OAAO,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC7D,MAAA,aAAA,CAAc,iDAAiD,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,+BAAA,CAAgC;AAAA,MAClD,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,WAAA,IAAeE,WAAAA;AAE5D,IAAA,MAAM,MAAA,GAAS,MAAM,wBAAA,CAAyB;AAAA,MAC5C,MAAA;AAAA,MACA,OAAA;AAAA,MACA,iBAAiB,OAAA,CAAQ,QAAA;AAAA,MACzB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,EACnC,SAAS,KAAA,EAAO;AACd,IAAA,aAAA;AAAA,MACE,0BAA0B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAClF;AAAA,EACF;AACF;AAEO,SAAS,kCAAkC,MAAA,EAAuB;AACvE,EAAA,MAAA,CACG,OAAA,CAAQ,gBAAgB,CAAA,CACxB,WAAA;AAAA,IACC;AAAA,GAEF,CACC,cAAA;AAAA,IACC,sBAAA;AAAA,IACA;AAAA,GACF,CACC,cAAA,CAAe,mBAAA,EAAqB,+CAA+C,CAAA,CACnF,cAAA;AAAA,IACC,0BAAA;AAAA,IACA,oDAAA;AAAA,IACA,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,EAAG,EAAE;AAAA,GACvB,CACC,MAAA,CAAO,iBAAA,EAAmB,0BAAA,EAA4B,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA,CAC5E,MAAA,CAAO,iBAAA,EAAmB,sBAAsB,CAAA,CAChD,MAAA;AAAA,IACC,QAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,qBAAqB,OAAO,CAAA;AAAA,EACpC,CAAC,CAAA;AACL;;;ACzHO,SAAS,qBAAqB/C,QAAAA,EAAwB;AAC3D,EAAA,MAAM,eAAeA,QAAAA,CAClB,OAAA,CAAQ,OAAO,CAAA,CACf,YAAY,oDAAoD,CAAA;AAGnE,EAAA,0BAAA,CAA2B,YAAY,CAAA;AACvC,EAAA,wBAAA,CAAyB,YAAY,CAAA;AACrC,EAAA,0BAAA,CAA2B,YAAY,CAAA;AACvC,EAAA,wBAAA,CAAyB,YAAY,CAAA;AACrC,EAAA,0BAAA,CAA2B,YAAY,CAAA;AACvC,EAAA,uBAAA,CAAwB,YAAY,CAAA;AACpC,EAAA,wBAAA,CAAyB,YAAY,CAAA;AAGrC,EAAA,sBAAA,CAAuB,YAAY,CAAA;AACnC,EAAA,0BAAA,CAA2B,YAAY,CAAA;AACvC,EAAA,6BAAA,CAA8B,YAAY,CAAA;AAG1C,EAAA,iCAAA,CAAkC,YAAY,CAAA;AAC9C,EAAA,iCAAA,CAAkC,YAAY,CAAA;AAC9C,EAAA,gCAAA,CAAiC,YAAY,CAAA;AAC/C;AC1BA,IAAM,MAAA,GAAsC;AAAA,EAC1C,IAAA,EAAMpB,IAAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,UAAU,OAAA,EAAyB;AAC1C,EAAA,OAAO,OAAA,KAAY,QAAQ,mBAAA,GAAsBmE,WAAAA;AACnD;AAKO,SAAS,qBAAqB/C,QAAAA,EAAwB;AAC3D,EAAA,MAAM,eAAeA,QAAAA,CAClB,OAAA,CAAQ,OAAO,CAAA,CACf,YAAY,gDAAgD,CAAA;AAG/D,EAAA,YAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,uCAAuC,CAAA,CACnD,MAAA,CAAO,gBAAA,EAAkB,uCAAA,EAAyC,MAAM,CAAA,CACxE,MAAA,CAAO,iBAAA,EAAmB,0BAA0B,CAAA,CACpD,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,MAAA,CAAO,qBAAA,EAAuB,2BAA2B,CAAA,CACzD,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,MAAA,KAAW,6BAAA,CAA8B;AAAA,MACpE,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA,GAAU,SAAS,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,GAAI,MAAA;AAAA,MAC3D,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA;AACxC,IAAA,IAAI,KAAA,CAAM,MAAM,CAAA,IAAK,MAAA,IAAU,CAAA,EAAG;AAChC,MAAA,aAAA,CAAc,4CAA4C,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAO,OAAO,CAAA;AAC5B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,aAAA;AAAA,QACE,SAAS,OAAO,CAAA,0EAAA;AAAA,OAClB;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAUT,oBAAoB,UAAU,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAUE,eAAAA,CAAgB,EAAE,OAAA,EAAS,QAAQ,CAAA;AAEnD,IAAA,MAAM,eAAeuD,kBAAAA,CAAmB;AAAA,MACtC,KAAA;AAAA,MACA,SAAA,EAAWrD,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC;AAAA,KAC3B,CAAA;AAED,IAAA,MAAM,eAAeD,kBAAAA,CAAmB;AAAA,MACtC,OAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAWC,IAAAA,CAAK,OAAA,CAAQ,CAAC,CAAC;AAAA,KAC3B,CAAA;AAGD,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,aAAA,EAAe,CAAC,GAAA,KACd,YAAA,CAAa,cAAc,GAAG,CAAA;AAAA,MAChC,YAAA,EAAc,CAAC,IAAA,KACb,YAAA,CAAa,aAAa,IAAI,CAAA;AAAA,MAChC,eAAA,EAAiB,CACf,IAAA,KACG,YAAA,CAAa,gBAAgB,IAAI;AAAA,KACxC;AAGA,IAAA,MAAM,EAAE,UAAA,EAAY,oBAAA,EAAsB,gBAAe,GACvD,MAAM,OAAO,aAAa,CAAA;AAC5B,IAAA,MAAM,EAAE,sBAAA,EAAuB,GAAI,MAAM,OACvC,wBACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,sBAAA,CAAuB,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA;AACzC,IAAA,MAAM,gBAAA,GAAmB,oBAAA,CAAqB,KAAA,EAAO,MAAM,CAAA;AAC3D,IAAA,MAAM,UAAA,GAAa,IAAI,cAAA,CAAe,MAAM,CAAA;AAE5C,IAAA,MAAM,MAAA,GAAS,UAAU,OAAO,CAAA;AAEhC,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,YAAY,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,2BAA2B,OAAO,CAAA,GAAA;AAAA,OACjE;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAMsD,iBAAAA,CAAkB;AAAA,QACrC,MAAA;AAAA,QACA,OAAA;AAAA,QACA,iBAAiB,OAAA,CAAQ,OAAA;AAAA,QACzB,SAAA,EAAWC,gBAAAA;AAAA,QACX,gBAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,IAAA,CAAK,SAAA;AAAA,YACH;AAAA,cACE,OAAA,EAAS,IAAA;AAAA,cACT,eAAe,MAAA,CAAO,aAAA;AAAA,cACtB,sBAAsB,MAAA,CAAO,oBAAA;AAAA,cAC7B,SAAA,EAAW;AAAA,aACb;AAAA,YACA,IAAA;AAAA,YACA;AAAA;AACF,SACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAIvE,OAAM,KAAA,CAAM;AAAA,eAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,eAAe,CAAC,CAAA;AACxE,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AACnD,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,kBAAA,EAAqB,OAAO,oBAAoB,CAAA;AAAA,SAClD;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,MACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,GAAA,EAAI,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AACnE,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,aAAA,CAAc,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAE,CAAA;AAAA,IACxC;AAAA,EACF,CAAC,CAAA;AAGH,EAAA,YAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,oCAAoC,CAAA,CAChD,MAAA,CAAO,mBAAmB,0BAA0B,CAAA,CACpD,OAAO,qBAAA,EAAuB,2BAA2B,EACzD,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAQ,GAAI,6BAAA,CAA8B;AAAA,MAC5D,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAS,OAAA,CAAQ,OAAA,GAAU,SAAS,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,GAAI;AAAA,KAC5D,CAAA;AAED,IAAA,MAAM,OAAA,GAAUY,oBAAoB,UAAU,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,UAAU,OAAO,CAAA;AAEhC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM4D,yBAAAA,CAA0B;AAAA,QAC7C,MAAA;AAAA,QACA,OAAA;AAAA,QACA,iBAAiB,OAAA,CAAQ,OAAA;AAAA,QACzB,SAAA,EAAWD;AAAA,OACZ,CAAA;AAED,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAI,CAAA,aAAA,CAAe,CAAA;AAC3B,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,MAAA,CAAO,oBAAoB,CAAA,CAAE,CAAA;AAC9D,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,MAAA,CAAO,UAAU,CAAA,IAAA,CAAM,CAAA;AACjD,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,cAAA,EAAiB,MAAA,CAAO,iBAAA,GAAoBvE,MAAAA,CAAM,KAAA,CAAM,KAAK,CAAA,GAAIA,MAAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA,OAAA,EAAU,OAAO,cAAc,CAAA,KAAA;AAAA,SACjH;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,MACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,GAAA,EAAI,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AACnE,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AACA,MAAA,aAAA,CAAc,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAE,CAAA;AAAA,IAC9C;AAAA,EACF,CAAC,CAAA;AACL;AC9LA,IAAM,SAAA,GAAYyE,IAAAA,CAAKC,OAAAA,EAAQ,EAAG,OAAO,CAAA;AACzC,IAAM,UAAA,GAAaD,IAAAA,CAAK,SAAA,EAAW,mBAAmB,CAAA;AACtD,IAAM,iBAAA,GAAoB,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,GAAA;AACxC,IAAM,gBAAA,GAAmB,GAAA;AAWzB,SAAS,cAAA,CAAe,QAAgB,OAAA,EAA0B;AAChE,EAAA,MAAM,IAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACtC,EAAA,MAAM,IAAI,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,KAAM,EAAE,CAAC,CAAA,IAAK,IAAI,OAAO,IAAA;AACtC,IAAA,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,KAAM,EAAE,CAAC,CAAA,IAAK,IAAI,OAAO,KAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAA,GAAgC;AACvC,EAAA,IAAI;AACF,IAAA,IAAIE,UAAAA,CAAW,UAAU,CAAA,EAAG;AAC1B,MAAA,OAAO,IAAA,CAAK,KAAA,CAAMlE,YAAAA,CAAa,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAA0B;AAC5C,EAAA,IAAI;AACF,IAAA,IAAI,CAACkE,UAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAAC,SAAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC1C;AACA,IAAAC,aAAAA,CAAc,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,eAAe,mBAAmB,GAAA,EAAqC;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,UAAU,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,gBAAgB,CAAA;AACrE,IAAA,MAAM,MAAM,MAAM,KAAA;AAAA,MAChB,8BAA8B,kBAAA,CAAmB,GAAG,EAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA,OAAA,CAAA;AAAA,MACzE,EAAE,MAAA,EAAQ,UAAA,CAAW,MAAA;AAAO,KAC9B;AACA,IAAA,YAAA,CAAa,OAAO,CAAA;AACpB,IAAA,IAAI,IAAI,EAAA,EAAI;AACV,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACd;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;AAOA,eAAsB,cACpB,cAAA,EAC4B;AAC5B,EAAA,MAAM,QAAQ,SAAA,EAAU;AAGxB,EAAA,IAAI,SAAS,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,YAAY,iBAAA,EAAmB;AAC7D,IAAA,IACE,MAAM,aAAA,IACN,cAAA,CAAe,KAAA,CAAM,aAAA,EAAe,cAAc,CAAA,EAClD;AACA,MAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,aAAA,EAAc;AAAA,IACvC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,mBAAmB,CAAA;AAE3D,EAAA,UAAA,CAAW;AAAA,IACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,aAAA,EAAe;AAAA,GAChB,CAAA;AAED,EAAA,IAAI,MAAA,IAAU,cAAA,CAAe,MAAA,EAAQ,cAAc,CAAA,EAAG;AACpD,IAAA,OAAO,EAAE,MAAA,EAAO;AAAA,EAClB;AAEA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,iBAAA,CAAkB,SAAiB,MAAA,EAAsB;AACvE,EAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAChB,EAAA,OAAA,CAAQ,KAAA;AAAA,IACN7E,MAAAA,CAAM,MAAA;AAAA,MACJ,CAAA,oBAAA,EAAuBA,OAAM,IAAA,CAAK,OAAO,CAAC,CAAA,QAAA,EAAMA,MAAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA;AACrE,GACF;AACA,EAAA,OAAA,CAAQ,KAAA;AAAA,IACNA,MAAAA,CAAM,MAAA;AAAA,MACJ,CAAA,MAAA,EAASA,MAAAA,CAAM,IAAA,CAAK,yCAAyC,CAAC,CAAA,UAAA;AAAA;AAChE,GACF;AACA,EAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAClB;;;ACrHA,IAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,WAAA,IAAe,QAAQ,GAAA,CAAI,WAAA;AACxD,IAAI,QAAA,EAAU;AACZ,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,QAAQ,CAAA;AACrC,EAAA,mBAAA,CAAoB,KAAK,CAAA;AAC3B;AAmBA,IAAM8E,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC7C,IAAM,EAAE,OAAA,EAAQ,GAAIA,QAAAA,CAAQ,oBAAoB,CAAA;AAEhD,IAAM,OAAA,GAAU,IAAItD,OAAAA,EAAQ;AAE5B,OAAA,CACG,KAAK,MAAM,CAAA,CACX,YAAY,2BAA2B,CAAA,CACvC,QAAQ,OAAO,CAAA;AAGlB,sBAAA,CAAuB,OAAO,CAAA;AAC9B,sBAAA,CAAuB,OAAO,CAAA;AAC9B,qBAAA,CAAsB,OAAO,CAAA;AAC7B,mBAAA,CAAoB,OAAO,CAAA;AAC3B,oBAAA,CAAqB,OAAO,CAAA;AAC5B,sBAAA,CAAuB,OAAO,CAAA;AAC9B,qBAAA,CAAsB,OAAO,CAAA;AAC7B,mBAAA,CAAoB,OAAO,CAAA;AAC3B,qBAAA,CAAsB,OAAO,CAAA;AAC7B,oBAAA,CAAqB,OAAO,CAAA;AAC5B,oBAAA,CAAqB,OAAO,CAAA;AAG5B,OAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,mCAAmC,CAAA,CAC/C,OAAO,YAAY;AAClB,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,eAAe,CAAA;AAEjD,EAAA,OAAA,CAAQ,IAAI,+BAA+B,CAAA;AAC3C,EAAA,IAAI;AACF,IAAA,QAAA,CAAS,yCAAA,EAA2C;AAAA,MAClD,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAIxB,MAAAA,CAAM,KAAA,CAAM,oCAA+B,CAAC,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,KAAA;AAAA,MACNA,MAAAA,CAAM,GAAA;AAAA,QACJ;AAAA;AACF,KACF;AAAA,EACF;AACF,CAAC,CAAA;AAGH,IAAM,gBAAgB,aAAA,CAAc,OAAO,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAE7D,MAAM,QAAQ,UAAA,EAAW;AAGzB,IAAI;AACF,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,IACpC,aAAA;AAAA,IACA,IAAI,OAAA,CAAc,CAACwD,QAAAA,KAAY,UAAA,CAAW,MAAMA,QAAAA,CAAQ,IAAI,CAAA,EAAG,IAAI,CAAC;AAAA,GACrE,CAAA;AACD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,iBAAA,CAAkB,OAAA,EAAS,WAAW,MAAM,CAAA;AAAA,EAC9C;AACF,CAAA,CAAA,MAAQ;AAER","file":"index.mjs","sourcesContent":["import chalk from \"chalk\";\nimport type { CommonOptions, ReadOnlyOptions } from \"../shared/types\";\n\n/**\n * Default chain ID (Base mainnet) - used by feed commands\n */\nexport const DEFAULT_CHAIN_ID = 8453;\n\n/**\n * Get chain ID from option or environment variable, exit if not found\n */\nfunction getRequiredChainId(optionValue?: number): number {\n const chainId =\n optionValue ||\n (process.env.NET_CHAIN_ID\n ? parseInt(process.env.NET_CHAIN_ID, 10)\n : undefined);\n\n if (!chainId) {\n console.error(\n chalk.red(\n \"Error: Chain ID is required. Provide via --chain-id flag or NET_CHAIN_ID environment variable\"\n )\n );\n process.exit(1);\n }\n\n return chainId;\n}\n\n/**\n * Get chain ID from option or environment variable, defaulting to Base (8453)\n * Also checks BOTCHAN_* env vars for backward compat\n */\nfunction getChainIdWithDefault(optionValue?: number): number {\n if (optionValue) {\n return optionValue;\n }\n\n const envChainId =\n process.env.BOTCHAN_CHAIN_ID || process.env.NET_CHAIN_ID;\n\n if (envChainId) {\n return parseInt(envChainId, 10);\n }\n\n return DEFAULT_CHAIN_ID;\n}\n\n/**\n * Get RPC URL from option or environment variable\n */\nfunction getRpcUrl(optionValue?: string): string | undefined {\n return optionValue || process.env.NET_RPC_URL;\n}\n\n/**\n * Get RPC URL from option or environment variable, also checking BOTCHAN_* env vars.\n * Used only by feed commands for backward compat.\n */\nfunction getRpcUrlWithBotchanFallback(optionValue?: string): string | undefined {\n return optionValue || process.env.BOTCHAN_RPC_URL || process.env.NET_RPC_URL;\n}\n\n/**\n * Parse and validate common options shared across all commands.\n * Extracts private key, chain ID, and RPC URL from command options or environment variables.\n * @param options - Command options\n * @param supportsEncodeOnly - If true, mention --encode-only in error messages as an alternative\n */\nexport function parseCommonOptions(\n options: {\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n },\n supportsEncodeOnly = false\n): CommonOptions {\n const privateKey =\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY;\n\n if (!privateKey) {\n const encodeOnlyHint = supportsEncodeOnly\n ? \", or use --encode-only to output transaction data without submitting\"\n : \"\";\n console.error(\n chalk.red(\n `Error: Private key is required. Provide via --private-key flag or NET_PRIVATE_KEY/PRIVATE_KEY environment variable${encodeOnlyHint}`\n )\n );\n process.exit(1);\n }\n\n if (!privateKey.startsWith(\"0x\") || privateKey.length !== 66) {\n console.error(\n chalk.red(\n \"Error: Invalid private key format (must be 0x-prefixed, 66 characters)\"\n )\n );\n process.exit(1);\n }\n\n if (options.privateKey) {\n console.warn(\n chalk.yellow(\n \"Warning: Private key provided via command line. Consider using NET_PRIVATE_KEY environment variable instead.\"\n )\n );\n }\n\n return {\n privateKey: privateKey as `0x${string}`,\n chainId: getRequiredChainId(options.chainId),\n rpcUrl: getRpcUrl(options.rpcUrl),\n };\n}\n\n/**\n * Parse and validate read-only options for commands that don't need a private key.\n * Extracts chain ID and RPC URL from command options or environment variables.\n */\nexport function parseReadOnlyOptions(options: {\n chainId?: number;\n rpcUrl?: string;\n}): ReadOnlyOptions {\n return {\n chainId: getRequiredChainId(options.chainId),\n rpcUrl: getRpcUrl(options.rpcUrl),\n };\n}\n\n/**\n * Parse read-only options with a default chain ID (8453/Base).\n * Used by feed commands where chain ID is optional.\n * Also checks BOTCHAN_* env vars for backward compat.\n */\nexport function parseReadOnlyOptionsWithDefault(options: {\n chainId?: number;\n rpcUrl?: string;\n}): ReadOnlyOptions {\n return {\n chainId: getChainIdWithDefault(options.chainId),\n rpcUrl: getRpcUrlWithBotchanFallback(options.rpcUrl),\n };\n}\n\n/**\n * Parse common options with a default chain ID (8453/Base).\n * Used by feed write commands where chain ID is optional.\n * Also checks BOTCHAN_* env vars for backward compat.\n */\nexport function parseCommonOptionsWithDefault(\n options: {\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n },\n supportsEncodeOnly = false\n): CommonOptions {\n const privateKey =\n options.privateKey ||\n process.env.BOTCHAN_PRIVATE_KEY ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY;\n\n if (!privateKey) {\n const encodeOnlyHint = supportsEncodeOnly\n ? \", or use --encode-only to output transaction data without submitting\"\n : \"\";\n console.error(\n chalk.red(\n `Error: Private key is required. Provide via --private-key flag or NET_PRIVATE_KEY/BOTCHAN_PRIVATE_KEY environment variable${encodeOnlyHint}`\n )\n );\n process.exit(1);\n }\n\n if (!privateKey.startsWith(\"0x\") || privateKey.length !== 66) {\n console.error(\n chalk.red(\n \"Error: Invalid private key format (must be 0x-prefixed, 66 characters)\"\n )\n );\n process.exit(1);\n }\n\n if (options.privateKey) {\n console.warn(\n chalk.yellow(\n \"Warning: Private key provided via command line. Consider using NET_PRIVATE_KEY environment variable instead.\"\n )\n );\n }\n\n return {\n privateKey: privateKey as `0x${string}`,\n chainId: getChainIdWithDefault(options.chainId),\n rpcUrl: getRpcUrlWithBotchanFallback(options.rpcUrl),\n };\n}\n","/**\n * URL builders for Net Protocol web pages and external services.\n *\n * These helpers exist so callers (and AI agents reading CLI JSON output) never\n * need to construct URLs by hand. URL grammar quirks (the \"feed-\" topic\n * prefix, hyphen-vs-colon separators in comment IDs, lowercased addresses,\n * etc.) all live here in one place.\n *\n * Chain slugs and block-explorer base URLs come from\n * `@net-protocol/core`'s chain config — this module deliberately holds no\n * per-chain tables of its own.\n */\n\nimport {\n getChainBlockExplorer,\n getChainSlug,\n} from \"@net-protocol/core\";\nimport { encodeStorageKeyForUrl } from \"@net-protocol/storage\";\n\nconst WEBSITE_BASE = \"https://netprotocol.app\";\nconst STORAGE_BASE = \"https://storedon.net\";\n\nexport function chainSlug(chainId: number): string | null {\n return getChainSlug({ chainId }) ?? null;\n}\n\n/**\n * Strip the \"feed-\" prefix from a topic if present (case-insensitive).\n * Used when converting an on-chain topic to the URL path/query form.\n */\nfunction stripFeedPrefix(topic: string): string {\n const lower = topic.toLowerCase();\n return lower.startsWith(\"feed-\") ? lower.slice(5) : lower;\n}\n\n/**\n * URL of a feed page. `feedName` may be passed with or without the \"feed-\"\n * prefix; either way the URL form is stripped+lowercased.\n */\nexport function feedUrl(chainId: number, feedName: string): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/feed/${slug}/${stripFeedPrefix(feedName)}`;\n}\n\n/**\n * URL of an address's wall (their personal feed at `feed-{lower(address)}`).\n */\nexport function walletUrl(chainId: number, address: string): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/feed/${slug}/${address.toLowerCase()}`;\n}\n\n/**\n * URL of a user/agent profile page.\n */\nexport function profileUrl(chainId: number, address: string): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/profile/${slug}/${address.toLowerCase()}`;\n}\n\n/**\n * URL of a group chat page.\n */\nexport function chatUrl(chainId: number, chatName: string): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/chat/${slug}/${encodeURIComponent(\n chatName.toLowerCase()\n )}`;\n}\n\n/**\n * URL of a Netr token page.\n */\nexport function tokenUrl(\n chainId: number,\n tokenAddress: string\n): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/token/${slug}/${tokenAddress.toLowerCase()}`;\n}\n\n/**\n * URL of a Bazaar NFT collection page.\n */\nexport function bazaarUrl(\n chainId: number,\n nftAddress: string\n): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/bazaar/${slug}/${nftAddress.toLowerCase()}`;\n}\n\n/**\n * URL of an onchain agent detail page.\n */\nexport function agentUrl(chainId: number, agentId: string): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/agents/${slug}/${encodeURIComponent(agentId)}`;\n}\n\n/**\n * Public storage retrieval URL via storedon.net. Works on any chain with Net\n * Storage deployed (returns a URL even when chainSlug is unknown — storedon\n * uses numeric chain IDs).\n *\n * Uses `encodeStorageKeyForUrl` from `@net-protocol/storage` so the encoder\n * stays in sync with the storage SDK if it ever needs to handle binary keys\n * or other special characters differently from `encodeURIComponent`.\n */\nexport function storageUrl(\n chainId: number,\n operatorAddress: string,\n key: string\n): string {\n return `${STORAGE_BASE}/net/${chainId}/storage/load/${operatorAddress.toLowerCase()}/${encodeStorageKeyForUrl(\n key\n )}`;\n}\n\nexport function explorerTxUrl(\n chainId: number,\n txHash: string\n): string | null {\n const base = getChainBlockExplorer({ chainId })?.url;\n if (!base) return null;\n return `${base}/tx/${txHash}`;\n}\n\nexport function explorerAddressUrl(\n chainId: number,\n address: string\n): string | null {\n const base = getChainBlockExplorer({ chainId })?.url;\n if (!base) return null;\n return `${base}/address/${address}`;\n}\n\n/**\n * Convert a post ID (`{sender}:{timestamp}`) into the comment-permalink form\n * used by the web's `?commentId=` query parameter (`{sender}-{timestamp}`).\n *\n * The two formats are intentionally documented separately because the website\n * scrolls to the DOM id `comment-{sender}-{timestamp}` and matches against the\n * raw query value (see CommentThread.tsx in the Net repo).\n */\nexport function postIdToCommentParam(postId: string): string {\n const colon = postId.indexOf(\":\");\n if (colon === -1) return postId;\n return `${postId.slice(0, colon)}-${postId.slice(colon + 1)}`;\n}\n\nexport interface PostPermalinkOptions {\n /**\n * Global message index from the contract's MessageSent event. Most reliable\n * when available — works regardless of how the post was queried.\n */\n globalIndex?: number;\n /** Topic-filtered absolute index (from a topic-scoped read). */\n topic?: string;\n topicIndex?: number;\n /** Maker-filtered absolute index (from a sender-scoped read). */\n user?: string;\n userIndex?: number;\n /**\n * Optional comment to deep-link. Pass either a post-ID-style string\n * (`{sender}:{timestamp}` — colon will be normalized to hyphen) or the\n * already-converted form.\n */\n commentId?: string;\n}\n\n/**\n * Build a permalink to the dedicated post page. Picks the most reliable URL\n * form available, in priority order: global -> topic -> user. Returns null\n * when no usable index is provided or chain is unknown.\n */\nexport function postPermalink(\n chainId: number,\n opts: PostPermalinkOptions\n): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n\n const params = new URLSearchParams();\n\n if (opts.globalIndex != null) {\n params.set(\"index\", String(opts.globalIndex));\n } else if (opts.topic != null && opts.topicIndex != null) {\n params.set(\"topic\", stripFeedPrefix(opts.topic));\n params.set(\"index\", String(opts.topicIndex));\n } else if (opts.user != null && opts.userIndex != null) {\n params.set(\"user\", opts.user.toLowerCase());\n params.set(\"index\", String(opts.userIndex));\n } else {\n return null;\n }\n\n if (opts.commentId) {\n params.set(\"commentId\", postIdToCommentParam(opts.commentId));\n }\n\n return `${WEBSITE_BASE}/app/feed/${slug}/post?${params.toString()}`;\n}\n\n/**\n * URL of the canonical hosted skill (proxies to net-public/SKILL.md).\n */\nexport const HOSTED_SKILL_URL = `${WEBSITE_BASE}/skill.md`;\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport type {\n StorageCheckResult,\n CheckNormalStorageExistsParams,\n CheckChunkedStorageExistsParams,\n CheckXmlChunksExistParams,\n CheckXmlMetadataExistsParams,\n} from \"../types\";\n\n/**\n * Check if normal storage data exists and matches content\n * Pure function - uses StorageClient, no side effects\n * Accepts JSON object as parameter\n */\nexport async function checkNormalStorageExists(\n params: CheckNormalStorageExistsParams\n): Promise<StorageCheckResult> {\n const { storageClient, storageKey, operatorAddress, expectedContent } = params;\n const existing = await storageClient.get({\n key: storageKey,\n operator: operatorAddress,\n });\n\n if (!existing) {\n return { exists: false };\n }\n\n // Compare content\n const storedContent = hexToString(existing.value as `0x${string}`);\n const matches = storedContent === expectedContent;\n\n return { exists: true, matches };\n}\n\n/**\n * Check if ChunkedStorage data exists\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkChunkedStorageExists(\n params: CheckChunkedStorageExistsParams\n): Promise<boolean> {\n const { storageClient, chunkedHash, operatorAddress } = params;\n const meta = await storageClient.getChunkedMetadata({\n key: chunkedHash,\n operator: operatorAddress,\n });\n\n return meta !== null && meta.chunkCount > 0;\n}\n\n/**\n * Check which XML chunks already exist in ChunkedStorage\n * Returns Set of chunkedStorage hashes that exist\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkXmlChunksExist(\n params: CheckXmlChunksExistParams\n): Promise<Set<string>> {\n const { storageClient, chunkedHashes, operatorAddress } = params;\n const existing = new Set<string>();\n\n // Check each chunk in parallel for efficiency\n await Promise.all(\n chunkedHashes.map(async (hash) => {\n const exists = await checkChunkedStorageExists({\n storageClient,\n chunkedHash: hash,\n operatorAddress,\n });\n if (exists) {\n existing.add(hash);\n }\n })\n );\n\n return existing;\n}\n\n/**\n * Check if XML metadata exists and matches expected metadata\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkXmlMetadataExists(\n params: CheckXmlMetadataExistsParams\n): Promise<StorageCheckResult> {\n const { storageClient, storageKey, operatorAddress, expectedMetadata } = params;\n const existing = await storageClient.get({\n key: storageKey,\n operator: operatorAddress,\n });\n\n if (!existing) {\n return { exists: false };\n }\n\n const storedMetadata = hexToString(existing.value as `0x${string}`);\n const matches = storedMetadata === expectedMetadata;\n\n return { exists: true, matches };\n}\n\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { WriteTransactionConfig } from \"@net-protocol/core\";\nimport { storageUrl } from \"../../shared/urls\";\nimport {\n checkNormalStorageExists,\n checkChunkedStorageExists,\n checkXmlMetadataExists,\n} from \"./storage/check\";\nimport type {\n TransactionWithId,\n StorageTransactionArgs,\n CheckTransactionExistsParams,\n} from \"./types\";\n\n/**\n * Convert typed args to array (for viem compatibility)\n */\nexport function typedArgsToArray(\n args: StorageTransactionArgs\n): readonly unknown[] {\n if (args.type === \"normal\" || args.type === \"metadata\") {\n return [args.args.key, args.args.text, args.args.value];\n } else {\n return [args.args.hash, args.args.text, args.args.chunks];\n }\n}\n\n/**\n * Extract typed args from WriteTransactionConfig\n */\nexport function extractTypedArgsFromTransaction(\n tx: WriteTransactionConfig,\n type: \"normal\" | \"chunked\" | \"metadata\"\n): StorageTransactionArgs {\n if (type === \"normal\" || type === \"metadata\") {\n return {\n type,\n args: {\n key: tx.args[0] as `0x${string}`,\n text: tx.args[1] as string,\n value: tx.args[2] as `0x${string}`,\n },\n };\n } else {\n return {\n type: \"chunked\",\n args: {\n hash: tx.args[0] as `0x${string}`,\n text: tx.args[1] as string,\n chunks: tx.args[2] as `0x${string}`[],\n },\n };\n }\n}\n\n/**\n * Extract content string from transaction typed args\n * Helper to eliminate duplication of hexToString pattern\n */\nexport function extractContentFromTransaction(\n tx: TransactionWithId\n): string {\n if (tx.typedArgs.type === \"normal\" || tx.typedArgs.type === \"metadata\") {\n return hexToString(tx.typedArgs.args.value);\n } else {\n // For chunked transactions, return empty string (no content to extract)\n return \"\";\n }\n}\n\n/**\n * Generate storage URL for displaying to user.\n *\n * Thin wrapper around the canonical builder in `shared/urls.ts` so the CLI\n * has exactly one place where storage URLs are produced. The wrapper exists\n * to preserve this function's \"undefined when operator is missing\" contract,\n * which several call sites rely on.\n */\nexport function generateStorageUrl(\n operatorAddress: string | undefined,\n chainId: number,\n storageKey: string\n): string | undefined {\n if (!operatorAddress) return undefined;\n return storageUrl(chainId, operatorAddress, storageKey);\n}\n\n/**\n * Check if a transaction's data already exists (idempotency check)\n * Consolidates existence check logic used in both filtering and sending\n * Accepts JSON object as parameter\n */\nexport async function checkTransactionExists(\n params: CheckTransactionExistsParams\n): Promise<boolean> {\n const { storageClient, tx, operatorAddress } = params;\n if (tx.type === \"normal\") {\n // Extract expected content from typed args\n if (tx.typedArgs.type === \"normal\") {\n const expectedContent = hexToString(tx.typedArgs.args.value);\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent,\n });\n return check.exists && check.matches === true;\n }\n } else if (tx.type === \"chunked\") {\n // ChunkedStorage: hash existence = content match (deterministic hash)\n return await checkChunkedStorageExists({\n storageClient,\n chunkedHash: tx.id,\n operatorAddress,\n });\n } else if (tx.type === \"metadata\") {\n // XML metadata: extract and compare content\n if (tx.typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(tx.typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedMetadata,\n });\n return check.exists && check.matches === true;\n }\n }\n return false;\n}\n\n","import { WriteTransactionConfig } from \"@net-protocol/core\";\nimport { StorageClient, getStorageKeyBytes } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport type {\n TransactionWithId,\n NormalStorageArgs,\n PrepareXmlStorageTransactionsParams,\n} from \"../types\";\nimport { extractTypedArgsFromTransaction, typedArgsToArray } from \"../utils\";\n\n/**\n * Prepare normal storage transaction with ID\n * Uses StorageClient.preparePut() from net-public\n * Accepts typed JSON args object instead of individual parameters\n */\nexport function prepareNormalStorageTransaction(\n storageClient: StorageClient,\n args: NormalStorageArgs,\n originalStorageKey: string // Original string key needed for preparePut\n): TransactionWithId {\n // Use StorageClient.preparePut() from net-public\n // preparePut needs the original string key, not bytes32\n const content = hexToString(args.value);\n \n const transaction = storageClient.preparePut({\n key: originalStorageKey,\n text: args.text,\n value: content,\n });\n\n const typedArgs = {\n type: \"normal\" as const,\n args,\n };\n\n return {\n id: args.key,\n type: \"normal\",\n transaction,\n typedArgs,\n };\n}\n\n/**\n * Prepare XML storage transactions with IDs\n * Returns array: [metadata transaction, ...chunk transactions]\n * Uses StorageClient.prepareXmlStorage() from net-public\n * Accepts JSON object as parameter\n */\nexport function prepareXmlStorageTransactions(\n params: PrepareXmlStorageTransactionsParams\n): TransactionWithId[] {\n const { storageClient, storageKey, text, content, operatorAddress, chunkSize } = params;\n const storageKeyBytes = getStorageKeyBytes(storageKey) as `0x${string}`;\n\n // Use StorageClient.prepareXmlStorage() from net-public\n // This handles all the chunking, ChunkedStorage preparation, and metadata generation\n // Pass storageKey as string - prepareXmlStorage will convert it internally\n const result = storageClient.prepareXmlStorage({\n data: content,\n operatorAddress: operatorAddress as `0x${string}`,\n storageKey: storageKey, // Pass as string, not bytes32\n filename: text,\n useChunkedStorageBackend: true, // Use ChunkedStorage backend (default)\n chunkSize,\n });\n\n // Map WriteTransactionConfig[] to TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const transactions: TransactionWithId[] = result.transactionConfigs.map(\n (tx, index) => {\n if (index === 0) {\n // First transaction is metadata - use our storageKeyBytes for ID\n const typedArgs = extractTypedArgsFromTransaction(tx, \"metadata\");\n return {\n id: storageKeyBytes,\n type: \"metadata\",\n transaction: tx,\n typedArgs,\n };\n } else {\n // Rest are ChunkedStorage transactions\n // Extract typed args and get hash from typed args\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const chunkedHash = typedArgs.args.hash;\n return {\n id: chunkedHash,\n type: \"chunked\",\n transaction: tx,\n typedArgs,\n };\n }\n // This should never happen, but TypeScript needs it\n throw new Error(\"Invalid chunked transaction\");\n }\n }\n );\n\n return transactions;\n}\n\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { WriteTransactionConfig } from \"@net-protocol/core\";\nimport {\n STORAGE_CONTRACT,\n CHUNKED_STORAGE_CONTRACT,\n} from \"@net-protocol/storage\";\nimport {\n checkNormalStorageExists,\n checkChunkedStorageExists,\n checkXmlChunksExist,\n checkXmlMetadataExists,\n} from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\nimport type {\n TransactionWithId,\n FilterExistingTransactionsParams,\n FilterXmlStorageTransactionsParams,\n} from \"../types\";\n\n/**\n * Filter transactions to only those that need to be sent\n * Checks existence for each transaction and filters out already-stored ones\n * Pure function - uses StorageClient, no side effects\n * Accepts JSON object as parameter\n */\nexport async function filterExistingTransactions(\n params: FilterExistingTransactionsParams\n): Promise<{\n toSend: TransactionWithId[];\n skipped: TransactionWithId[];\n}> {\n const { storageClient, transactions, operatorAddress, expectedContent } =\n params;\n const toSend: TransactionWithId[] = [];\n const skipped: TransactionWithId[] = [];\n\n for (const tx of transactions) {\n let exists = false;\n\n if (tx.type === \"normal\") {\n // Normal storage: always check if exists AND matches content\n if (expectedContent) {\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent,\n });\n exists = check.exists && check.matches === true;\n } else {\n // Extract content from typed args if not provided\n if (tx.typedArgs.type === \"normal\") {\n const storedContent = hexToString(tx.typedArgs.args.value);\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent: storedContent,\n });\n exists = check.exists && check.matches === true;\n }\n }\n } else if (tx.type === \"chunked\") {\n // ChunkedStorage: check if metadata exists\n exists = await checkChunkedStorageExists({\n storageClient,\n chunkedHash: tx.id,\n operatorAddress,\n });\n } else if (tx.type === \"metadata\") {\n // XML metadata: check if exists\n // Extract expected metadata from typed args (it's hex-encoded)\n if (tx.typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(tx.typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedMetadata,\n });\n exists = check.exists && check.matches === true;\n }\n }\n\n if (exists) {\n skipped.push(tx);\n } else {\n toSend.push(tx);\n }\n }\n\n return { toSend, skipped };\n}\n\n/**\n * Filter XML storage transactions more efficiently\n * Checks all chunks in parallel, then filters\n * Accepts WriteTransactionConfig[] directly and derives chunkedHashes internally\n * Accepts JSON object as parameter\n */\nexport async function filterXmlStorageTransactions(\n params: FilterXmlStorageTransactionsParams\n): Promise<{\n toSend: WriteTransactionConfig[];\n skipped: WriteTransactionConfig[];\n}> {\n const { storageClient, transactions, operatorAddress } = params;\n\n // Separate metadata and chunk transactions by contract address\n const metadataTx = transactions.find(\n (tx) => tx.to.toLowerCase() === STORAGE_CONTRACT.address.toLowerCase()\n );\n const chunkTxs = transactions.filter(\n (tx) => tx.to.toLowerCase() === CHUNKED_STORAGE_CONTRACT.address.toLowerCase()\n );\n\n // Derive chunkedHashes internally from WriteTransactionConfig[] args\n const chunkedHashes: string[] = [];\n for (const tx of chunkTxs) {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n chunkedHashes.push(typedArgs.args.hash); // Content-based hash (keccak256(xmlChunk))\n }\n }\n\n const toSend: WriteTransactionConfig[] = [];\n const skipped: WriteTransactionConfig[] = [];\n\n // Check which chunks exist (parallel check)\n const existingChunks = await checkXmlChunksExist({\n storageClient,\n chunkedHashes,\n operatorAddress,\n });\n\n // Filter chunk transactions\n for (const tx of chunkTxs) {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const hash = typedArgs.args.hash;\n if (existingChunks.has(hash)) {\n skipped.push(tx);\n } else {\n toSend.push(tx);\n }\n }\n }\n\n // Check metadata (if all chunks exist and match, skip metadata too)\n if (metadataTx) {\n const allChunksExist = chunkedHashes.length > 0 && chunkedHashes.every((hash) =>\n existingChunks.has(hash)\n );\n if (allChunksExist) {\n // Verify metadata matches\n try {\n const typedArgs = extractTypedArgsFromTransaction(metadataTx, \"metadata\");\n if (typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: typedArgs.args.key,\n operatorAddress,\n expectedMetadata,\n });\n if (check.exists && check.matches) {\n skipped.push(metadataTx);\n } else {\n toSend.unshift(metadataTx); // Metadata first\n }\n }\n } catch {\n // If we can't extract metadata args, include in toSend\n toSend.unshift(metadataTx);\n }\n } else {\n toSend.unshift(metadataTx); // Metadata first\n }\n }\n\n return { toSend, skipped };\n}\n","import { createWalletClient, http, WalletClient, defineChain, PublicClient } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport {\n getPublicClient,\n getChainRpcUrls,\n getBaseDataSuffix,\n} from \"@net-protocol/core\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { checkTransactionExists, typedArgsToArray } from \"../utils\";\nimport type {\n TransactionWithId,\n UploadResult,\n CreateWalletClientParams,\n SendTransactionsParams,\n} from \"../types\";\n\n/**\n * Create wallet client from private key\n * Accepts JSON object as parameter\n */\nexport function createWalletClientFromPrivateKey(\n params: CreateWalletClientParams\n): {\n walletClient: WalletClient;\n publicClient: PublicClient;\n operatorAddress: `0x${string}`;\n} {\n const { privateKey, chainId, rpcUrl } = params;\n const account = privateKeyToAccount(privateKey);\n const publicClient = getPublicClient({ chainId, rpcUrl });\n\n // Get RPC URLs for the chain\n const rpcUrls = getChainRpcUrls({ chainId, rpcUrl });\n\n // Create wallet client with the same chain configuration\n const chain = publicClient.chain\n ? defineChain({\n id: chainId,\n name: publicClient.chain.name,\n nativeCurrency: publicClient.chain.nativeCurrency,\n rpcUrls: {\n default: { http: rpcUrls },\n public: { http: rpcUrls },\n },\n blockExplorers: publicClient.chain.blockExplorers,\n })\n : defineChain({\n id: chainId,\n name: `Chain ${chainId}`,\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: { http: rpcUrls },\n public: { http: rpcUrls },\n },\n });\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport: http(),\n dataSuffix: getBaseDataSuffix(chainId),\n });\n\n return {\n walletClient,\n publicClient,\n operatorAddress: account.address,\n };\n}\n\n/**\n * Send transactions sequentially with idempotency checks\n * Checks existence before each transaction (handles partial retries)\n * Accepts JSON object as parameter\n */\nexport async function sendTransactionsWithIdempotency(\n params: SendTransactionsParams\n): Promise<UploadResult> {\n const { storageClient, walletClient, publicClient, transactions, operatorAddress } = params;\n let sent = 0;\n let skipped = 0;\n let failed = 0;\n let finalHash: string | undefined;\n const errorMessages: string[] = [];\n\n for (let i = 0; i < transactions.length; i++) {\n const tx = transactions[i];\n\n try {\n // Check if this transaction's data already exists (idempotency)\n // Always compare content, not just check existence\n const exists = await checkTransactionExists({\n storageClient,\n tx,\n operatorAddress,\n });\n\n if (exists) {\n console.log(\n `⏭️ Transaction ${i + 1}/${\n transactions.length\n } skipped (already stored): ${tx.id}`\n );\n skipped++;\n continue;\n }\n\n // Send transaction\n console.log(\n `📤 Sending transaction ${i + 1}/${transactions.length}: ${tx.id}`\n );\n // Convert typed args to array for viem compatibility\n const args = typedArgsToArray(tx.typedArgs);\n if (!walletClient.account) {\n throw new Error(\"Wallet client must have an account\");\n }\n const hash = await walletClient.writeContract({\n account: walletClient.account,\n address: tx.transaction.to as `0x${string}`,\n abi: tx.transaction.abi,\n functionName: tx.transaction.functionName as string,\n args,\n value: tx.transaction.value,\n chain: null,\n });\n\n // Wait for confirmation\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n console.log(\n `✓ Transaction ${i + 1} confirmed in block ${\n receipt.blockNumber\n } (hash: ${hash})`\n );\n\n sent++;\n finalHash = hash;\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : String(error);\n console.error(`✗ Transaction ${i + 1} failed: ${errorMsg}`);\n errorMessages.push(errorMsg);\n failed++;\n // Continue with remaining transactions (don't fail entire upload)\n }\n }\n\n return {\n success: failed === 0,\n skipped: skipped > 0,\n transactionsSent: sent,\n transactionsSkipped: skipped,\n transactionsFailed: failed,\n finalHash,\n error: errorMessages.length > 0 ? errorMessages.join(\"; \") : undefined,\n };\n}\n\n","import { readFileSync } from \"fs\";\nimport {\n shouldSuggestXmlStorage,\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { stringToHex } from \"viem\";\nimport {\n prepareNormalStorageTransaction,\n prepareXmlStorageTransactions,\n} from \"../transactions/prep\";\nimport {\n filterExistingTransactions,\n filterXmlStorageTransactions,\n} from \"../transactions/filter\";\nimport {\n createWalletClientFromPrivateKey,\n sendTransactionsWithIdempotency,\n} from \"../transactions/send\";\nimport type {\n UploadOptions,\n UploadResult,\n TransactionWithId,\n NormalStorageArgs,\n} from \"../types\";\n\n/**\n * Main upload function - orchestrates the entire upload process\n */\nexport async function uploadFile(\n options: UploadOptions\n): Promise<UploadResult> {\n // 1. Read file\n // Read file as buffer (binary) first\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n // Check for null bytes or non-text characters (excluding common whitespace)\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n // Convert binary file to base64 string (valid UTF-8)\n const base64String = fileBuffer.toString(\"base64\");\n\n // Detect file type and add data URI prefix if detected\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n // Include data URI prefix for better type preservation\n // Format: \"data:audio/mpeg;base64,SUQz...\"\n fileContent = base64ToDataUri(base64String);\n } else {\n // Fallback to raw base64 if detection fails\n fileContent = base64String;\n }\n } else {\n // Read as UTF-8 for text files\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 3. Create wallet client\n const { walletClient, publicClient, operatorAddress } =\n createWalletClientFromPrivateKey({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // 4. Determine storage type\n const useXmlStorage = shouldSuggestXmlStorage(fileContent);\n const storageType: \"normal\" | \"xml\" = useXmlStorage ? \"xml\" : \"normal\";\n\n // 5. Prepare transactions\n let transactions: TransactionWithId[];\n\n if (useXmlStorage) {\n transactions = prepareXmlStorageTransactions({\n storageClient,\n storageKey: options.storageKey,\n text: options.text,\n content: fileContent,\n operatorAddress,\n chunkSize: options.chunkSize,\n });\n // No need to extract chunkedHashes - filterXmlStorageTransactions derives them internally\n } else {\n // Build typed args JSON object\n const storageKeyBytes = getStorageKeyBytes(\n options.storageKey\n ) as `0x${string}`;\n const typedArgs: NormalStorageArgs = {\n key: storageKeyBytes,\n text: options.text,\n value: stringToHex(fileContent),\n };\n\n transactions = [\n prepareNormalStorageTransaction(\n storageClient,\n typedArgs,\n options.storageKey // Pass original string key for preparePut\n ),\n ];\n }\n\n // 6. Filter existing transactions (idempotency)\n let transactionsToSend: TransactionWithId[];\n let skippedCount = 0;\n\n if (useXmlStorage) {\n // Extract WriteTransactionConfig[] from TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const chunkTransactions = transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => tx.transaction);\n\n // Create a map from WriteTransactionConfig to TransactionWithId for easy lookup\n const txConfigToTxWithId = new Map(\n transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => [tx.transaction, tx])\n );\n\n const filtered = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTransactions, // Only chunk transactions\n operatorAddress,\n });\n\n // Map filtered WriteTransactionConfig[] back to TransactionWithId[]\n const filteredToSend: TransactionWithId[] = filtered.toSend\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n const filteredSkipped: TransactionWithId[] = filtered.skipped\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n // Metadata is handled separately - check if it needs to be sent\n const metadataTx = transactions.find((tx) => tx.type === \"metadata\");\n if (metadataTx) {\n // For now, always include metadata in toSend (caller should check separately)\n filteredToSend.unshift(metadataTx);\n }\n\n transactionsToSend = filteredToSend;\n skippedCount = filteredSkipped.length;\n } else {\n const filtered = await filterExistingTransactions({\n storageClient,\n transactions,\n operatorAddress,\n expectedContent: fileContent,\n });\n transactionsToSend = filtered.toSend;\n skippedCount = filtered.skipped.length;\n }\n\n // 7. Check if all transactions were skipped\n if (transactionsToSend.length === 0) {\n return {\n success: true,\n skipped: true,\n transactionsSent: 0,\n transactionsSkipped: skippedCount,\n transactionsFailed: 0,\n operatorAddress,\n storageType,\n };\n }\n\n // 8. Send transactions\n const result = await sendTransactionsWithIdempotency({\n storageClient,\n walletClient,\n publicClient,\n transactions: transactionsToSend,\n operatorAddress,\n });\n\n // Add skipped count from filtering step\n result.transactionsSkipped += skippedCount;\n\n // Add operator address and storage type to result\n result.operatorAddress = operatorAddress;\n result.storageType = storageType;\n\n return result;\n}\n","import type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { StorageClient } from \"@net-protocol/storage\";\nimport type { Address } from \"viem\";\nimport { checkXmlChunksExist } from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\n\n/**\n * Storage-specific recheck function for retry logic\n *\n * Re-checks failed transactions on-chain before retry to filter out\n * transactions that have succeeded since the last attempt.\n *\n * This is storage-specific because it uses checkXmlChunksExist and\n * extractTypedArgsFromTransaction which understand storage transaction types.\n *\n * @param failedIndexes - Indexes of failed transactions\n * @param transactions - Original transaction configs\n * @param backendWalletAddress - Backend wallet address (operator for storage checks)\n * @returns Array of transaction indexes that still need to be retried\n */\nexport async function recheckFailedTransactionsStorage(\n failedIndexes: number[],\n transactions: WriteTransactionConfig[],\n storageClient: StorageClient,\n backendWalletAddress: Address\n): Promise<number[]> {\n if (failedIndexes.length === 0) {\n return [];\n }\n\n // Extract chunked hashes from failed transactions\n const failedTransactions = failedIndexes.map((idx) => transactions[idx]);\n const chunkedHashes: string[] = [];\n\n for (const tx of failedTransactions) {\n try {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n chunkedHashes.push(typedArgs.args.hash);\n }\n } catch {\n // Not a chunked transaction, skip\n }\n }\n\n if (chunkedHashes.length === 0) {\n // No chunked transactions to check, return all failed indexes\n return failedIndexes;\n }\n\n // Check which chunks exist on-chain\n const existingChunks = await checkXmlChunksExist({\n storageClient,\n chunkedHashes,\n operatorAddress: backendWalletAddress,\n });\n\n // Filter out indexes where the transaction has succeeded\n const stillFailed: number[] = [];\n\n for (const failedIdx of failedIndexes) {\n const tx = transactions[failedIdx];\n try {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const hash = typedArgs.args.hash;\n if (!existingChunks.has(hash)) {\n // Transaction still hasn't succeeded\n stillFailed.push(failedIdx);\n }\n // If hash exists, transaction succeeded, skip retry\n } else {\n // Non-chunked transaction, always retry\n stillFailed.push(failedIdx);\n }\n } catch {\n // Can't determine type, retry to be safe\n stillFailed.push(failedIdx);\n }\n }\n\n return stillFailed;\n}\n\n","import type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { StorageClient } from \"@net-protocol/storage\";\nimport type { Address } from \"viem\";\nimport type { RetryConfig, RelaySubmitResult } from \"@net-protocol/relay\";\nimport type { RetryFailedTransactionsParams } from \"./types\";\nimport { retryFailedTransactions as retryFailedTransactionsPackage } from \"@net-protocol/relay\";\nimport { recheckFailedTransactionsStorage } from \"./recheckStorage\";\n\n/**\n * Retry failed transactions with exponential backoff\n *\n * This is a wrapper around the package retryFailedTransactions that adds\n * storage-specific recheck logic.\n *\n * @param params - Retry parameters\n * @returns Final success/failure status after retries\n */\nexport async function retryFailedTransactions(\n params: RetryFailedTransactionsParams\n): Promise<RelaySubmitResult> {\n const {\n storageClient,\n backendWalletAddress,\n apiUrl,\n chainId,\n operatorAddress,\n secretKey,\n failedIndexes,\n originalTransactions,\n config,\n sessionToken,\n } = params;\n\n // Use storage-specific recheck function\n return retryFailedTransactionsPackage({\n apiUrl,\n chainId,\n operatorAddress,\n secretKey,\n failedIndexes,\n originalTransactions,\n backendWalletAddress,\n config,\n sessionToken,\n recheckFunction: async (\n failedIndexes: number[],\n transactions: WriteTransactionConfig[],\n backendWalletAddress: Address\n ) => {\n return recheckFailedTransactionsStorage(\n failedIndexes,\n transactions,\n storageClient,\n backendWalletAddress\n );\n },\n });\n}\n","import { readFileSync } from \"fs\";\nimport {\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { http, createWalletClient } from \"viem\";\nimport { getPublicClient, getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport type { Address, Hash } from \"viem\";\nimport { filterXmlStorageTransactions } from \"../transactions/filter\";\nimport { checkXmlMetadataExists } from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\nimport {\n createRelayX402Client,\n fundBackendWallet,\n checkBackendWalletBalance,\n submitTransactionsViaRelay,\n waitForConfirmations,\n createRelaySession,\n batchTransactions,\n} from \"@net-protocol/relay\";\nimport { retryFailedTransactions } from \"../relay/retry\";\nimport type {\n UploadWithRelayOptions,\n UploadWithRelayResult,\n} from \"../relay/types\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\n\n/**\n * Main upload function with relay - orchestrates the entire relay upload process\n *\n * Flow:\n * 1. Read file\n * 2. Fund backend wallet (x402 payment)\n * 3. Prepare transactions with backendWalletAddress as operator\n * 4. Split transactions (metadata vs chunks)\n * 5. Filter existing transactions (idempotency)\n * 6. Submit chunks via relay (backend wallet pays gas)\n * 7. Retry failed chunks\n * 8. Submit metadata directly (user pays gas)\n * 9. Wait for confirmations\n * 10. Return result\n */\nexport async function uploadFileWithRelay(\n options: UploadWithRelayOptions\n): Promise<UploadWithRelayResult> {\n const errors: Error[] = [];\n\n // 1. Read file\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n const base64String = fileBuffer.toString(\"base64\");\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n fileContent = base64ToDataUri(base64String);\n } else {\n fileContent = base64String;\n }\n } else {\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n // Note: Relay upload always uses XML storage format, regardless of file size\n // prepareXmlStorage() handles small files by creating a single chunk with XML metadata\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 4. Create user wallet client\n const userAccount = privateKeyToAccount(options.privateKey);\n const userAddress = userAccount.address;\n const publicClient = getPublicClient({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const rpcUrls = getChainRpcUrls({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const userWalletClient = createWalletClient({\n account: userAccount,\n chain: publicClient.chain!,\n transport: http(rpcUrls[0]), // Use first RPC URL\n dataSuffix: getBaseDataSuffix(options.chainId),\n });\n\n // 5. Setup x402 client\n const { fetchWithPayment, httpClient } = createRelayX402Client(\n userAccount,\n options.chainId\n );\n\n // 5.5. Create relay session token (sign once, reuse for all batches)\n // Session token is required for all submit requests\n const sessionResult = await createRelaySession({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n account: userAccount,\n expiresIn: 3600, // 1 hour - should be enough for most uploads\n });\n const sessionToken = sessionResult.sessionToken;\n console.log(\"✓ Session token created (valid for 1 hour)\");\n\n // 6. Check backend wallet balance and fund if needed\n // Check balance first to avoid unnecessary payments\n let backendWalletAddress: Address | undefined;\n let shouldFund = true;\n\n try {\n const balanceResult = await checkBackendWalletBalance({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n });\n backendWalletAddress = balanceResult.backendWalletAddress;\n\n // Only fund if balance is insufficient\n shouldFund = !balanceResult.sufficientBalance;\n } catch (error) {\n // If balance check fails, fall back to funding (for backwards compatibility)\n // This handles cases where the balance endpoint might not be available\n shouldFund = true;\n }\n\n // Fund backend wallet only if balance is insufficient\n // This ensures backendWalletAddress is always set\n if (shouldFund) {\n const fundResult = await fundBackendWallet({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n fetchWithPayment,\n httpClient,\n });\n backendWalletAddress = fundResult.backendWalletAddress;\n }\n\n // TypeScript assertion: backendWalletAddress is guaranteed to be set at this point\n // (either from balance check or fund call)\n if (!backendWalletAddress) {\n throw new Error(\"Failed to determine backend wallet address\");\n }\n\n // backendWalletAddress is now guaranteed to be set (either from balance check or fund call)\n\n // 7. Prepare chunks with backendWalletAddress as operator (chunks submitted via relay)\n // Use StorageClient.prepareXmlStorage() to get chunk transactions\n const chunkPrepareResult = storageClient.prepareXmlStorage({\n data: fileContent,\n operatorAddress: backendWalletAddress,\n storageKey: options.storageKey,\n filename: options.text,\n useChunkedStorageBackend: true,\n chunkSize: options.chunkSize,\n });\n\n const chunkTxs = chunkPrepareResult.transactionConfigs.slice(1); // Skip metadata, get chunks\n const topLevelHash = chunkPrepareResult.topLevelHash;\n const chunkMetadata = chunkPrepareResult.metadata; // XML metadata referencing backend wallet chunks\n\n // 8. Prepare metadata transaction separately with userAddress as operator\n // Metadata is submitted directly by user, so it should use userAddress\n // We use the same XML metadata string (which references chunks stored by backend wallet)\n const metadataTx = storageClient.preparePut({\n key: topLevelHash,\n text: options.text,\n value: chunkMetadata, // Use the XML metadata from chunk preparation\n });\n\n // 9. Filter existing chunks (idempotency check with backendWalletAddress)\n const filteredChunks = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTxs,\n operatorAddress: backendWalletAddress,\n });\n\n const chunksToSend = filteredChunks.toSend;\n const chunksSkipped = filteredChunks.skipped.length;\n\n // 10. Check if metadata already exists (with userAddress as operator)\n // Extract metadata args from the prepared transaction\n const metadataStorageKey = metadataTx.args[0] as `0x${string}`;\n const expectedMetadata = hexToString(metadataTx.args[2] as `0x${string}`);\n let metadataNeedsSubmission = true;\n\n const metadataCheck = await checkXmlMetadataExists({\n storageClient,\n storageKey: metadataStorageKey,\n operatorAddress: userAddress, // User is operator for metadata\n expectedMetadata,\n });\n if (metadataCheck.exists && metadataCheck.matches) {\n metadataNeedsSubmission = false;\n }\n\n // 11. Batch and submit chunks via relay (if any)\n let chunkTransactionHashes: Hash[] = [];\n let chunksSent = 0;\n\n if (chunksToSend.length > 0) {\n try {\n // Batch chunks to respect server limits (100 transactions, 1MB per request)\n const batches = batchTransactions(chunksToSend);\n const totalBatches = batches.length;\n\n if (totalBatches > 1) {\n console.log(\n `📦 Splitting ${chunksToSend.length} chunks into ${totalBatches} batch(es)`\n );\n }\n\n // Submit batches sequentially\n for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) {\n const batch = batches[batchIndex];\n\n if (totalBatches > 1) {\n console.log(\n `📤 Sending batch ${batchIndex + 1}/${totalBatches} (${\n batch.length\n } transactions)...`\n );\n }\n\n const submitResult = await submitTransactionsViaRelay({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n transactions: batch,\n sessionToken,\n });\n\n chunkTransactionHashes.push(...submitResult.transactionHashes);\n chunksSent += submitResult.successfulIndexes.length;\n\n // Check if ALL transactions in this batch failed\n if (submitResult.failedIndexes.length === batch.length) {\n // All transactions failed - likely due to insufficient funds or network issues\n // Don't retry (would waste app fees) and stop processing subsequent batches\n const errorMessage =\n `Batch ${batchIndex + 1}: All ${\n batch.length\n } transactions failed. ` +\n `Likely due to insufficient backend wallet balance or network issues. ` +\n `Stopping batch processing to avoid wasting app fees.`;\n\n console.error(`❌ ${errorMessage}`);\n errors.push(new Error(errorMessage));\n\n // Stop processing subsequent batches\n break;\n }\n\n // 12. Retry failed chunks in this batch if any (only if some succeeded - partial failure)\n if (\n submitResult.failedIndexes.length > 0 &&\n submitResult.successfulIndexes.length > 0\n ) {\n // Map failed indexes to actual transactions from this batch\n const failedTxs = submitResult.failedIndexes.map((idx) => batch[idx]);\n\n try {\n const retryResult = await retryFailedTransactions({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n failedIndexes: submitResult.failedIndexes,\n originalTransactions: failedTxs,\n storageClient,\n backendWalletAddress,\n sessionToken,\n });\n\n // Merge retry results\n chunkTransactionHashes.push(...retryResult.transactionHashes);\n chunksSent += retryResult.successfulIndexes.length;\n\n if (retryResult.failedIndexes.length > 0) {\n errors.push(\n new Error(\n `Batch ${batchIndex + 1}: ${\n retryResult.failedIndexes.length\n } transactions failed after retries`\n )\n );\n }\n } catch (retryError) {\n errors.push(\n retryError instanceof Error\n ? retryError\n : new Error(\n `Batch ${batchIndex + 1} retry failed: ${String(\n retryError\n )}`\n )\n );\n }\n }\n\n // Optional: Wait for batch confirmations before next batch\n // This ensures we don't overwhelm the network and provides progress feedback\n if (\n batchIndex < batches.length - 1 &&\n chunkTransactionHashes.length > 0\n ) {\n // Get the hashes from this batch\n const batchHashes = chunkTransactionHashes.slice(\n -submitResult.successfulIndexes.length\n );\n if (batchHashes.length > 0) {\n try {\n await waitForConfirmations({\n publicClient,\n transactionHashes: batchHashes,\n confirmations: 1, // Just 1 confirmation between batches\n timeout: 30000, // 30 second timeout per batch\n });\n } catch (confirmationError) {\n // Log but don't fail - we'll wait for all confirmations later\n console.warn(\n `⚠️ Batch ${\n batchIndex + 1\n } confirmation timeout (continuing...)`\n );\n }\n }\n }\n }\n } catch (submitError) {\n errors.push(\n submitError instanceof Error\n ? submitError\n : new Error(`Chunk submission failed: ${String(submitError)}`)\n );\n }\n }\n\n // 13. Wait for chunk transaction confirmations\n if (chunkTransactionHashes.length > 0) {\n try {\n await waitForConfirmations({\n publicClient,\n transactionHashes: chunkTransactionHashes,\n confirmations: 1,\n timeout: 60000,\n });\n } catch (confirmationError) {\n errors.push(\n confirmationError instanceof Error\n ? confirmationError\n : new Error(`Chunk confirmation failed: ${String(confirmationError)}`)\n );\n }\n }\n\n // 14. Submit metadata directly (user pays gas)\n let metadataTransactionHash: Hash | undefined;\n if (metadataNeedsSubmission) {\n try {\n metadataTransactionHash = await userWalletClient.writeContract({\n address: metadataTx.to as Address,\n abi: metadataTx.abi,\n functionName: metadataTx.functionName,\n args: metadataTx.args,\n value:\n metadataTx.value !== undefined && metadataTx.value > BigInt(0)\n ? metadataTx.value\n : undefined,\n });\n\n // Wait for metadata confirmation\n await waitForConfirmations({\n publicClient,\n transactionHashes: [metadataTransactionHash],\n confirmations: 1,\n timeout: 60000,\n });\n } catch (metadataError) {\n errors.push(\n metadataError instanceof Error\n ? metadataError\n : new Error(`Metadata submission failed: ${String(metadataError)}`)\n );\n }\n }\n\n // 15. Return result\n return {\n success: errors.length === 0,\n topLevelHash,\n chunksSent,\n chunksSkipped,\n metadataSubmitted:\n metadataNeedsSubmission && metadataTransactionHash !== undefined,\n chunkTransactionHashes,\n metadataTransactionHash,\n backendWalletAddress,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n","import { readFileSync } from \"fs\";\nimport {\n shouldSuggestXmlStorage,\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { stringToHex } from \"viem\";\nimport {\n prepareNormalStorageTransaction,\n prepareXmlStorageTransactions,\n} from \"../transactions/prep\";\nimport {\n filterExistingTransactions,\n filterXmlStorageTransactions,\n} from \"../transactions/filter\";\nimport { createWalletClientFromPrivateKey } from \"../transactions/send\";\nimport type {\n UploadOptions,\n PreviewResult,\n TransactionWithId,\n NormalStorageArgs,\n} from \"../types\";\n\n/**\n * Preview function - performs all prep steps but doesn't submit transactions\n * Returns statistics about what would be uploaded\n */\nexport async function previewFile(\n options: UploadOptions\n): Promise<PreviewResult> {\n // 1. Read file\n // Read file as buffer (binary) first\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n // Check for null bytes or non-text characters (excluding common whitespace)\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n // Convert binary file to base64 string (valid UTF-8)\n const base64String = fileBuffer.toString(\"base64\");\n\n // Detect file type and add data URI prefix if detected\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n // Include data URI prefix for better type preservation\n // Format: \"data:audio/mpeg;base64,SUQz...\"\n fileContent = base64ToDataUri(base64String);\n } else {\n // Fallback to raw base64 if detection fails\n fileContent = base64String;\n }\n } else {\n // Read as UTF-8 for text files\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 3. Create wallet client (needed for operator address)\n const { operatorAddress } = createWalletClientFromPrivateKey({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // 4. Determine storage type\n const useXmlStorage = shouldSuggestXmlStorage(fileContent);\n const storageType: \"normal\" | \"xml\" = useXmlStorage ? \"xml\" : \"normal\";\n\n // 5. Prepare transactions\n let transactions: TransactionWithId[];\n\n if (useXmlStorage) {\n transactions = prepareXmlStorageTransactions({\n storageClient,\n storageKey: options.storageKey,\n text: options.text,\n content: fileContent,\n operatorAddress,\n chunkSize: options.chunkSize,\n });\n // No need to extract chunkedHashes - filterXmlStorageTransactions derives them internally\n } else {\n // Build typed args JSON object\n const storageKeyBytes = getStorageKeyBytes(\n options.storageKey\n ) as `0x${string}`;\n const typedArgs: NormalStorageArgs = {\n key: storageKeyBytes,\n text: options.text,\n value: stringToHex(fileContent),\n };\n\n transactions = [\n prepareNormalStorageTransaction(\n storageClient,\n typedArgs,\n options.storageKey // Pass original string key for preparePut\n ),\n ];\n }\n\n // 6. Filter existing transactions (idempotency)\n let transactionsToSend: TransactionWithId[];\n let transactionsSkipped: TransactionWithId[];\n\n if (useXmlStorage) {\n // Extract WriteTransactionConfig[] from TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const chunkTransactions = transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => tx.transaction);\n\n // Create a map from WriteTransactionConfig to TransactionWithId for easy lookup\n const txConfigToTxWithId = new Map(\n transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => [tx.transaction, tx])\n );\n\n const filtered = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTransactions, // Only chunk transactions\n operatorAddress,\n });\n\n // Map filtered WriteTransactionConfig[] back to TransactionWithId[]\n const filteredToSend: TransactionWithId[] = filtered.toSend\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n const filteredSkipped: TransactionWithId[] = filtered.skipped\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n // Metadata is handled separately - check if it needs to be sent\n const metadataTx = transactions.find((tx) => tx.type === \"metadata\");\n if (metadataTx) {\n // For now, always include metadata in toSend (caller should check separately)\n filteredToSend.unshift(metadataTx);\n }\n\n transactionsToSend = filteredToSend;\n transactionsSkipped = filteredSkipped;\n } else {\n const filtered = await filterExistingTransactions({\n storageClient,\n transactions,\n operatorAddress,\n expectedContent: fileContent,\n });\n transactionsToSend = filtered.toSend;\n transactionsSkipped = filtered.skipped;\n }\n\n // Calculate statistics\n if (useXmlStorage) {\n // XML storage: separate chunks from metadata\n const chunkTransactions = transactions.filter(\n (tx) => tx.type === \"chunked\"\n );\n const metadataTransaction = transactions.find(\n (tx) => tx.type === \"metadata\"\n );\n\n const totalChunks = chunkTransactions.length;\n const alreadyStoredChunks = transactionsSkipped.filter(\n (tx) => tx.type === \"chunked\"\n ).length;\n const needToStoreChunks = transactionsToSend.filter(\n (tx) => tx.type === \"chunked\"\n ).length;\n const metadataNeedsStorage = metadataTransaction\n ? transactionsToSend.some((tx) => tx.type === \"metadata\")\n : false;\n\n return {\n storageType: \"xml\",\n totalChunks,\n alreadyStoredChunks,\n needToStoreChunks,\n metadataNeedsStorage,\n operatorAddress,\n storageKey: options.storageKey,\n totalTransactions: transactions.length,\n transactionsToSend: transactionsToSend.length,\n transactionsSkipped: transactionsSkipped.length,\n };\n } else {\n // Normal storage: single transaction counts as 1 chunk\n const totalChunks = 1;\n const alreadyStoredChunks = transactionsSkipped.length;\n const needToStoreChunks = transactionsToSend.length;\n\n return {\n storageType: \"normal\",\n totalChunks,\n alreadyStoredChunks,\n needToStoreChunks,\n operatorAddress,\n storageKey: options.storageKey,\n totalTransactions: transactions.length,\n transactionsToSend: transactionsToSend.length,\n transactionsSkipped: transactionsSkipped.length,\n };\n }\n}\n","import chalk from \"chalk\";\nimport type { NetMessage } from \"@net-protocol/core\";\n\n/**\n * Format a message for human-readable output\n */\nexport function formatMessage(\n message: NetMessage,\n index: number\n): string {\n const timestamp = new Date(Number(message.timestamp) * 1000).toISOString();\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.gray(timestamp)}`,\n ` ${chalk.white(\"Sender:\")} ${message.sender}`,\n ` ${chalk.white(\"App:\")} ${message.app}`,\n ];\n\n if (message.topic) {\n lines.push(` ${chalk.white(\"Topic:\")} ${message.topic}`);\n }\n\n lines.push(` ${chalk.white(\"Text:\")} ${message.text}`);\n\n if (message.data && message.data !== \"0x\") {\n lines.push(` ${chalk.white(\"Data:\")} ${message.data}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a message for JSON output\n */\nexport function messageToJson(\n message: NetMessage,\n index: number\n): Record<string, unknown> {\n return {\n index,\n sender: message.sender,\n app: message.app,\n timestamp: Number(message.timestamp),\n text: message.text,\n topic: message.topic,\n data: message.data,\n };\n}\n\n/**\n * Print messages in human-readable or JSON format\n */\nexport function printMessages(\n messages: NetMessage[],\n startIndex: number,\n json: boolean\n): void {\n if (json) {\n const output = messages.map((msg, i) => messageToJson(msg, startIndex + i));\n console.log(JSON.stringify(output, null, 2));\n } else {\n if (messages.length === 0) {\n console.log(chalk.yellow(\"No messages found\"));\n return;\n }\n\n messages.forEach((msg, i) => {\n console.log(formatMessage(msg, startIndex + i));\n if (i < messages.length - 1) {\n console.log(); // Empty line between messages\n }\n });\n }\n}\n\n/**\n * Print a count result\n */\nexport function printCount(\n count: number,\n label: string,\n json: boolean\n): void {\n if (json) {\n console.log(JSON.stringify({ count }, null, 2));\n } else {\n console.log(`${chalk.white(label)} ${chalk.cyan(count)}`);\n }\n}\n\n/**\n * Print an error message and exit\n */\nexport function exitWithError(message: string): never {\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { parseReadOnlyOptions } from \"../../../cli/shared\";\nimport { exitWithError } from \"../../../shared/output\";\nimport { storageUrl } from \"../../../shared/urls\";\n\nexport interface StorageReadOptions {\n key: string;\n operator: string;\n chainId?: number;\n rpcUrl?: string;\n index?: number;\n json?: boolean;\n raw?: boolean;\n}\n\n/**\n * Execute the storage read command\n */\nexport async function executeStorageRead(\n options: StorageReadOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Use readStorageData which handles XML resolution\n const result = await client.readStorageData({\n key: options.key,\n operator: options.operator,\n index: options.index,\n });\n\n if (options.json) {\n const output = {\n key: options.key,\n operator: options.operator,\n chainId: readOnlyOptions.chainId,\n storageUrl: storageUrl(\n readOnlyOptions.chainId,\n options.operator,\n options.key\n ),\n text: result.text,\n data: options.raw ? result.data : result.data,\n isXml: result.isXml,\n ...(options.index !== undefined && { index: options.index }),\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nStorage Value:\\n\"));\n console.log(` ${chalk.cyan(\"Key:\")} ${options.key}`);\n console.log(` ${chalk.cyan(\"Operator:\")} ${options.operator}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n if (options.index !== undefined) {\n console.log(` ${chalk.cyan(\"Index:\")} ${options.index}`);\n }\n console.log(` ${chalk.cyan(\"Text:\")} ${result.text || \"(empty)\"}`);\n console.log(` ${chalk.cyan(\"Is XML:\")} ${result.isXml ? \"Yes\" : \"No\"}`);\n\n // For data, show a preview if it's long\n const dataPreview =\n result.data.length > 500\n ? result.data.substring(0, 500) + \"... (truncated)\"\n : result.data;\n\n console.log(` ${chalk.cyan(\"Data:\")}`);\n if (result.data) {\n console.log(chalk.gray(` ${dataPreview.split(\"\\n\").join(\"\\n \")}`));\n } else {\n console.log(chalk.gray(\" (empty)\"));\n }\n console.log();\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (errorMessage === \"StoredDataNotFound\") {\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n key: options.key,\n operator: options.operator,\n chainId: readOnlyOptions.chainId,\n error: \"Not found\",\n },\n null,\n 2\n )\n );\n process.exit(1);\n }\n exitWithError(\n `No data found for key \"${options.key}\" and operator \"${options.operator}\"`\n );\n }\n\n exitWithError(`Failed to read storage: ${errorMessage}`);\n }\n}\n","import { encodeFunctionData, concat } from \"viem\";\nimport { getBaseDataSuffix } from \"@net-protocol/core\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { EncodedTransaction } from \"./types\";\n\nexport type { EncodedTransaction };\n\n/**\n * Encode a write transaction config into transaction data\n * Used for --encode-only mode where we output transaction data instead of executing\n */\nexport function encodeTransaction(\n config: WriteTransactionConfig,\n chainId: number\n): EncodedTransaction {\n const calldata = encodeFunctionData({\n abi: config.abi,\n functionName: config.functionName,\n args: config.args,\n });\n\n const suffix = getBaseDataSuffix(chainId);\n const data = suffix ? concat([calldata, suffix]) : calldata;\n\n return {\n to: config.to,\n data,\n chainId,\n value: config.value?.toString() ?? \"0\",\n };\n}\n","import * as fs from \"fs\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { parseReadOnlyOptions, parseCommonOptions } from \"../../../cli/shared\";\nimport { encodeTransaction } from \"../../../shared/encode\";\nimport type { EncodedTransaction } from \"../../../shared/types\";\n\nexport interface StorageEncodeOptions {\n filePath: string;\n storageKey: string;\n text: string;\n privateKey?: string;\n address?: string;\n chainId?: number;\n rpcUrl?: string;\n chunkSize?: number;\n}\n\ninterface EncodedStorageResult {\n storageKey: string;\n storageType: \"normal\" | \"xml\";\n operatorAddress: string;\n transactions: EncodedTransaction[];\n topLevelHash?: string;\n}\n\nconst XML_STORAGE_THRESHOLD = 20 * 1024; // 20KB\n\n/**\n * Encode storage upload transactions without executing them\n */\nexport async function encodeStorageUpload(\n options: StorageEncodeOptions\n): Promise<EncodedStorageResult> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Get operator address from private key, --address flag, or default to zero address\n let operatorAddress: `0x${string}`;\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey as `0x${string}`);\n operatorAddress = account.address;\n } else if (options.address) {\n operatorAddress = options.address as `0x${string}`;\n } else {\n // Use a zero address placeholder when no private key or address is provided\n operatorAddress = \"0x0000000000000000000000000000000000000000\";\n }\n\n // Read file\n const fileContent = fs.readFileSync(options.filePath, \"utf-8\");\n const fileSize = Buffer.byteLength(fileContent, \"utf-8\");\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n });\n\n // Determine storage type based on size\n const useXmlStorage = fileSize > XML_STORAGE_THRESHOLD;\n\n if (useXmlStorage) {\n // XML Storage - multiple transactions\n const { transactionConfigs, topLevelHash, metadata } =\n client.prepareXmlStorage({\n data: fileContent,\n operatorAddress,\n storageKey: options.storageKey,\n filename: options.text,\n chunkSize: options.chunkSize,\n });\n\n const encodedTransactions = transactionConfigs.map((config) =>\n encodeTransaction(config, readOnlyOptions.chainId)\n );\n\n return {\n storageKey: options.storageKey,\n storageType: \"xml\",\n operatorAddress,\n transactions: encodedTransactions,\n topLevelHash,\n };\n } else {\n // Normal Storage - single transaction\n const config = client.preparePut({\n key: options.storageKey,\n text: options.text,\n value: fileContent,\n });\n\n const encodedTransaction = encodeTransaction(\n config,\n readOnlyOptions.chainId\n );\n\n return {\n storageKey: options.storageKey,\n storageType: \"normal\",\n operatorAddress,\n transactions: [encodedTransaction],\n };\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { uploadFile } from \"./core/upload\";\nimport { uploadFileWithRelay } from \"./core/uploadRelay\";\nimport { previewFile } from \"./core/preview\";\nimport { executeStorageRead } from \"./core/read\";\nimport { encodeStorageUpload } from \"./core/encode\";\nimport { generateStorageUrl } from \"./utils\";\nimport { OPTIMAL_CHUNK_SIZE } from \"@net-protocol/storage\";\nimport type { UploadOptions } from \"./types\";\nimport type { UploadWithRelayOptions } from \"./relay/types\";\n\n/**\n * Register the storage command with the commander program\n */\nexport function registerStorageCommand(program: Command): void {\n // Command group - no options, no action\n const storageCommand = program\n .command(\"storage\")\n .description(\"Storage operations\");\n\n // Upload subcommand (current storage functionality)\n const uploadCommand = new Command(\"upload\")\n .description(\"Upload files to Net Storage\")\n .requiredOption(\"--file <path>\", \"Path to file to upload\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--address <address>\",\n \"Operator address (0x-prefixed). Used with --encode-only when no private key is provided\"\n )\n .option(\n \"--chunk-size <bytes>\",\n `Max chunk size in bytes for splitting large files (default: ${OPTIMAL_CHUNK_SIZE})`,\n (value) => parseInt(value, 10)\n )\n .action(async (options) => {\n // Handle encode-only mode\n if (options.encodeOnly) {\n try {\n const result = await encodeStorageUpload({\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: options.privateKey,\n address: options.address,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n chunkSize: options.chunkSize,\n });\n console.log(JSON.stringify(result, null, 2));\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red(\n `Encode failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n return;\n }\n\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const uploadOptions: UploadOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n chunkSize: options.chunkSize,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n const result = await uploadFile(uploadOptions);\n\n // Generate storage URL\n const storageUrl = generateStorageUrl(\n result.operatorAddress,\n commonOptions.chainId,\n options.key\n );\n\n if (result.skipped && result.transactionsSent === 0) {\n console.log(\n chalk.green(\n `✓ All data already stored - skipping upload\\n Storage Key: ${\n options.key\n }\\n Skipped: ${result.transactionsSkipped} transaction(s)${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n }\n\n if (result.success) {\n console.log(\n chalk.green(\n `✓ File uploaded successfully!\\n Storage Key: ${\n options.key\n }\\n Storage Type: ${\n result.storageType === \"xml\" ? \"XML\" : \"Normal\"\n }\\n Transactions Sent: ${\n result.transactionsSent\n }\\n Transactions Skipped: ${\n result.transactionsSkipped\n }\\n Final Transaction Hash: ${result.finalHash || \"N/A\"}${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n } else {\n console.error(\n chalk.red(\n `✗ Upload completed with errors\\n Transactions Sent: ${\n result.transactionsSent\n }\\n Transactions Skipped: ${\n result.transactionsSkipped\n }\\n Transactions Failed: ${\n result.transactionsFailed\n }\\n Error: ${result.error || \"Unknown error\"}`\n )\n );\n process.exit(1);\n }\n } catch (error) {\n console.error(\n chalk.red(\n `Upload failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Preview subcommand\n const previewCommand = new Command(\"preview\")\n .description(\"Preview storage upload without submitting transactions\")\n .requiredOption(\"--file <path>\", \"Path to file to preview\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .option(\n \"--chunk-size <bytes>\",\n `Max chunk size in bytes for splitting large files (default: ${OPTIMAL_CHUNK_SIZE})`,\n (value) => parseInt(value, 10)\n )\n .action(async (options) => {\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const previewOptions: UploadOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n chunkSize: options.chunkSize,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n const result = await previewFile(previewOptions);\n\n // Generate storage URL\n const storageUrl = generateStorageUrl(\n result.operatorAddress,\n commonOptions.chainId,\n options.key\n );\n\n // Display preview results\n console.log(chalk.cyan(\"\\n📊 Storage Preview:\"));\n console.log(` Storage Key: ${chalk.white(result.storageKey)}`);\n console.log(\n ` Storage Type: ${chalk.white(\n result.storageType === \"xml\" ? \"XML\" : \"Normal\"\n )}`\n );\n console.log(` Total Chunks: ${chalk.white(result.totalChunks)}`);\n console.log(\n ` Already Stored: ${chalk.green(result.alreadyStoredChunks)}`\n );\n console.log(\n ` Need to Store: ${chalk.yellow(result.needToStoreChunks)}`\n );\n\n if (result.storageType === \"xml\" && result.metadataNeedsStorage) {\n console.log(` Metadata: ${chalk.yellow(\"Needs Storage\")}`);\n } else if (result.storageType === \"xml\") {\n console.log(` Metadata: ${chalk.green(\"Already Stored\")}`);\n }\n\n console.log(\n ` Total Transactions: ${chalk.white(result.totalTransactions)}`\n );\n console.log(\n ` Transactions to Send: ${chalk.yellow(result.transactionsToSend)}`\n );\n console.log(\n ` Transactions Skipped: ${chalk.green(result.transactionsSkipped)}`\n );\n console.log(\n ` Operator Address: ${chalk.gray(result.operatorAddress)}`\n );\n\n if (storageUrl) {\n console.log(` Storage URL: ${chalk.cyan(storageUrl)}`);\n }\n\n if (result.needToStoreChunks === 0 && !result.metadataNeedsStorage) {\n console.log(\n chalk.green(\"\\n✓ All data is already stored - no upload needed\")\n );\n } else {\n console.log(\n chalk.yellow(\n `\\n⚠ ${result.transactionsToSend} transaction(s) would be sent`\n )\n );\n }\n\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red(\n `Preview failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Upload-relay subcommand (relay upload via x402)\n const uploadRelayCommand = new Command(\"upload-relay\")\n .description(\"Upload files to Net Storage via x402 relay (backend pays gas for chunks)\")\n .requiredOption(\"--file <path>\", \"Path to file to upload\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .requiredOption(\n \"--api-url <url>\",\n \"Backend API URL (e.g., http://localhost:3000)\"\n )\n .requiredOption(\n \"--secret-key <key>\",\n \"Secret key for backend wallet derivation. Can also be set via X402_SECRET_KEY env var\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .option(\n \"--chunk-size <bytes>\",\n `Max chunk size in bytes for splitting large files (default: ${OPTIMAL_CHUNK_SIZE})`,\n (value) => parseInt(value, 10)\n )\n .action(async (options) => {\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Parse secret key from options or env\n const secretKey =\n options.secretKey || process.env.X402_SECRET_KEY;\n if (!secretKey) {\n console.error(\n chalk.red(\n \"Error: --secret-key is required or set X402_SECRET_KEY environment variable\"\n )\n );\n process.exit(1);\n }\n\n const uploadRelayOptions: UploadWithRelayOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n apiUrl: options.apiUrl,\n secretKey,\n chunkSize: options.chunkSize,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n console.log(chalk.blue(`🔗 Using relay API: ${options.apiUrl}`));\n const result = await uploadFileWithRelay(uploadRelayOptions);\n\n // Generate storage URL (using user address, not backend wallet)\n const { privateKeyToAccount } = await import(\"viem/accounts\");\n const userAccount = privateKeyToAccount(commonOptions.privateKey);\n const storageUrl = generateStorageUrl(\n userAccount.address,\n commonOptions.chainId,\n options.key\n );\n\n if (result.success) {\n console.log(\n chalk.green(\n `✓ File uploaded successfully via relay!\\n Storage Key: ${\n options.key\n }\\n Top-Level Hash: ${result.topLevelHash}\\n Chunks Sent: ${\n result.chunksSent\n }\\n Chunks Skipped: ${\n result.chunksSkipped\n }\\n Metadata Submitted: ${\n result.metadataSubmitted ? \"Yes\" : \"No (already exists)\"\n }\\n Backend Wallet: ${result.backendWalletAddress}\\n Chunk Transaction Hashes: ${\n result.chunkTransactionHashes.length > 0\n ? result.chunkTransactionHashes.join(\", \")\n : \"None\"\n }${\n result.metadataTransactionHash\n ? `\\n Metadata Transaction Hash: ${result.metadataTransactionHash}`\n : \"\"\n }${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n } else {\n console.error(\n chalk.red(\n `✗ Upload completed with errors\\n Chunks Sent: ${\n result.chunksSent\n }\\n Chunks Skipped: ${\n result.chunksSkipped\n }\\n Metadata Submitted: ${\n result.metadataSubmitted ? \"Yes\" : \"No\"\n }\\n Errors: ${\n result.errors\n ? result.errors.map((e) => e.message).join(\", \")\n : \"Unknown error\"\n }`\n )\n );\n process.exit(1);\n }\n } catch (error) {\n console.error(\n chalk.red(\n `Upload via relay failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Read subcommand\n const readCommand = new Command(\"read\")\n .description(\"Read data from Net Storage\")\n .requiredOption(\"--key <key>\", \"Storage key to read\")\n .requiredOption(\"--operator <address>\", \"Operator address (wallet that stored the data)\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--index <n>\",\n \"Historical version index (0 = oldest). Omit for latest.\",\n (value) => parseInt(value, 10)\n )\n .option(\"--json\", \"Output in JSON format\")\n .option(\"--raw\", \"Output raw data without truncation (use with --json)\")\n .action(async (options) => {\n await executeStorageRead({\n key: options.key,\n operator: options.operator,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n index: options.index,\n json: options.json,\n raw: options.raw,\n });\n });\n\n storageCommand.addCommand(uploadCommand);\n storageCommand.addCommand(previewCommand);\n storageCommand.addCommand(uploadRelayCommand);\n storageCommand.addCommand(readCommand);\n}\n","import { FeedClient, FeedRegistryClient, AgentRegistryClient } from \"@net-protocol/feeds\";\nimport { ChatClient } from \"@net-protocol/chats\";\nimport { NetClient } from \"@net-protocol/core\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport type { ReadOnlyOptions } from \"./types\";\n\n/**\n * Create a FeedClient from read-only options\n */\nexport function createFeedClient(options: ReadOnlyOptions): FeedClient {\n return new FeedClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a FeedRegistryClient from read-only options\n */\nexport function createFeedRegistryClient(\n options: ReadOnlyOptions\n): FeedRegistryClient {\n return new FeedRegistryClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a ChatClient from read-only options\n */\nexport function createChatClient(options: ReadOnlyOptions): ChatClient {\n return new ChatClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a NetClient from read-only options\n */\nexport function createNetClient(options: ReadOnlyOptions): NetClient {\n return new NetClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create an AgentRegistryClient from read-only options\n */\nexport function createAgentRegistryClient(\n options: ReadOnlyOptions\n): AgentRegistryClient {\n return new AgentRegistryClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a StorageClient from read-only options\n */\nexport function createStorageClient(options: ReadOnlyOptions): StorageClient {\n return new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { NetClient, getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { MessageSendOptions } from \"./types\";\n\nfunction prepareMessageConfig(client: NetClient, options: MessageSendOptions) {\n return client.prepareSendMessage({\n text: options.text,\n topic: options.topic ?? \"\",\n data: options.data as `0x${string}` | undefined,\n });\n}\n\n/**\n * Execute the message send command\n */\nexport async function executeSend(options: MessageSendOptions): Promise<void> {\n if (options.encodeOnly) {\n executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createNetClient(commonOptions);\n const txConfig = prepareMessageConfig(client, options);\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n console.log(chalk.blue(\"Sending message...\"));\n\n try {\n const hash = await walletClient.writeContract({\n address: txConfig.to,\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n chain: null,\n });\n\n const topicLine = options.topic ? `\\n Topic: ${options.topic}` : \"\";\n console.log(\n chalk.green(\n `Message sent successfully!\\n Transaction: ${hash}\\n Text: ${options.text}${topicLine}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to send message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n\n/**\n * Execute encode-only mode - output transaction data as JSON\n */\nfunction executeEncodeOnly(options: MessageSendOptions): void {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new NetClient({ chainId: readOnlyOptions.chainId });\n const txConfig = prepareMessageConfig(client, options);\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport type { NetMessageFilter } from \"@net-protocol/core\";\n\n/**\n * Common filter options shared by read and count commands\n */\nexport interface FilterOptions {\n app?: string;\n topic?: string;\n sender?: string;\n}\n\n/**\n * Options for the message send command\n */\nexport interface MessageSendOptions {\n text: string;\n topic?: string;\n data?: string;\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n encodeOnly?: boolean;\n}\n\n/**\n * Options for the message read command\n */\nexport interface MessageReadOptions extends FilterOptions {\n start?: number;\n end?: number;\n index?: number;\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Options for the message count command\n */\nexport interface MessageCountOptions extends FilterOptions {\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Build a NetMessageFilter from command options.\n * Returns undefined if no app address is provided.\n */\nexport function buildFilter(options: FilterOptions): NetMessageFilter | undefined {\n if (!options.app) {\n return undefined;\n }\n\n return {\n appAddress: options.app as `0x${string}`,\n topic: options.topic,\n maker: options.sender as `0x${string}` | undefined,\n };\n}\n\n/**\n * Warn if topic/sender filters are provided without --app\n */\nexport function warnIgnoredFilters(options: FilterOptions): void {\n if (options.app || (!options.topic && !options.sender)) {\n return;\n }\n\n const ignored: string[] = [];\n if (options.topic) ignored.push(\"--topic\");\n if (options.sender) ignored.push(\"--sender\");\n\n console.warn(\n chalk.yellow(\n `Warning: ${ignored.join(\" and \")} ignored because --app is required for filtering`\n )\n );\n}\n","import chalk from \"chalk\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { printMessages, exitWithError } from \"../../shared/output\";\nimport type { MessageReadOptions } from \"./types\";\nimport { buildFilter, warnIgnoredFilters } from \"./types\";\n\nfunction printEmptyResult(message: string, json: boolean): void {\n if (json) {\n console.log(JSON.stringify([], null, 2));\n } else {\n console.log(chalk.yellow(message));\n }\n}\n\n/**\n * Execute the message read command\n */\nexport async function executeRead(options: MessageReadOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const filter = buildFilter(options);\n const json = options.json ?? false;\n\n warnIgnoredFilters(options);\n\n try {\n // Handle single message by index\n if (options.index !== undefined) {\n const message = await client.getMessageAtIndex({\n messageIndex: options.index,\n appAddress: filter?.appAddress,\n topic: filter?.topic,\n maker: filter?.maker,\n });\n\n if (!message) {\n exitWithError(`No message found at index ${options.index}`);\n }\n\n printMessages([message], options.index, json);\n return;\n }\n\n // Get total count for range calculation\n const count = await client.getMessageCount({ filter });\n\n if (count === 0) {\n printEmptyResult(\"No messages found\", json);\n return;\n }\n\n // Determine range\n const hasExplicitRange = options.start !== undefined || options.end !== undefined;\n let startIndex: number;\n let endIndex: number;\n\n if (hasExplicitRange) {\n startIndex = options.start ?? 0;\n endIndex = options.end ?? count;\n } else {\n const limit = options.limit ?? 10;\n startIndex = Math.max(0, count - limit);\n endIndex = count;\n }\n\n // Clamp to valid range\n startIndex = Math.max(0, startIndex);\n endIndex = Math.min(endIndex, count);\n\n if (startIndex >= endIndex) {\n printEmptyResult(\"No messages in specified range\", json);\n return;\n }\n\n const messages = await client.getMessagesBatch({\n filter,\n startIndex,\n endIndex,\n });\n\n printMessages(messages, startIndex, json);\n } catch (error) {\n exitWithError(\n `Failed to read messages: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { printCount, exitWithError } from \"../../shared/output\";\nimport type { MessageCountOptions } from \"./types\";\nimport { buildFilter, warnIgnoredFilters } from \"./types\";\nimport type { NetMessageFilter } from \"@net-protocol/core\";\n\nfunction buildCountLabel(filter: NetMessageFilter | undefined): string {\n if (!filter) {\n return \"Total messages:\";\n }\n\n const parts: string[] = [];\n if (filter.appAddress) parts.push(`app=${filter.appAddress}`);\n if (filter.topic) parts.push(`topic=\"${filter.topic}\"`);\n if (filter.maker) parts.push(`sender=${filter.maker}`);\n\n return `Messages (${parts.join(\", \")}):`;\n}\n\n/**\n * Execute the message count command\n */\nexport async function executeCount(options: MessageCountOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const filter = buildFilter(options);\n\n warnIgnoredFilters(options);\n\n try {\n const count = await client.getMessageCount({ filter });\n printCount(count, buildCountLabel(filter), options.json ?? false);\n } catch (error) {\n exitWithError(\n `Failed to get message count: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeSend } from \"./send\";\nimport { executeRead } from \"./read\";\nimport { executeCount } from \"./count\";\n\n/**\n * Register the message command with the commander program\n */\nexport function registerMessageCommand(program: Command): void {\n const messageCommand = program\n .command(\"message\")\n .description(\"Message operations\");\n\n // Send subcommand\n const sendCommand = new Command(\"send\")\n .description(\"Send a message to Net Protocol\")\n .requiredOption(\"--text <text>\", \"Message text\")\n .option(\"--topic <topic>\", \"Message topic\", \"\")\n .option(\"--data <hex>\", \"Additional hex data\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeSend({\n text: options.text,\n topic: options.topic,\n data: options.data,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Read subcommand\n const readCommand = new Command(\"read\")\n .description(\"Read messages from Net Protocol\")\n .option(\"--app <address>\", \"Filter by app address\")\n .option(\"--topic <topic>\", \"Filter by topic\")\n .option(\"--sender <address>\", \"Filter by sender address\")\n .option(\n \"--start <n>\",\n \"Start index (inclusive)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--end <n>\",\n \"End index (exclusive)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--index <n>\",\n \"Single message at index\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--limit <n>\",\n \"Number of latest messages (default: 10)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeRead({\n app: options.app,\n topic: options.topic,\n sender: options.sender,\n start: options.start,\n end: options.end,\n index: options.index,\n limit: options.limit,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // Count subcommand\n const countCommand = new Command(\"count\")\n .description(\"Get message count from Net Protocol\")\n .option(\"--app <address>\", \"Filter by app address\")\n .option(\"--topic <topic>\", \"Filter by topic\")\n .option(\"--sender <address>\", \"Filter by sender address\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeCount({\n app: options.app,\n topic: options.topic,\n sender: options.sender,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n messageCommand.addCommand(sendCommand);\n messageCommand.addCommand(readCommand);\n messageCommand.addCommand(countCommand);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getSupportedChains } from \"@net-protocol/core\";\n\n/**\n * Register the chains command with the commander program.\n *\n * The chain list is sourced from `@net-protocol/core`'s chain config — the\n * single source of truth for supported chains, names, and mainnet/testnet\n * classification.\n */\nexport function registerChainsCommand(program: Command): void {\n program\n .command(\"chains\")\n .description(\"List supported chains\")\n .option(\"--json\", \"Output in JSON format\")\n .action((options) => {\n const chains = getSupportedChains();\n\n if (options.json) {\n console.log(JSON.stringify(chains, null, 2));\n return;\n }\n\n console.log(chalk.white.bold(\"Supported Chains:\\n\"));\n\n console.log(chalk.cyan(\"Mainnets:\"));\n chains\n .filter((c) => c.type === \"mainnet\")\n .forEach((chain) => {\n console.log(\n ` ${chalk.white(chain.name)} ${chalk.gray(`(${chain.chainId})`)}`\n );\n });\n\n console.log(chalk.cyan(\"\\nTestnets:\"));\n chains\n .filter((c) => c.type === \"testnet\")\n .forEach((chain) => {\n console.log(\n ` ${chalk.white(chain.name)} ${chalk.gray(`(${chain.chainId})`)}`\n );\n });\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getNetContract, getChainName } from \"@net-protocol/core\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\n\ninterface InfoOptions {\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Register the info command with the commander program\n */\nexport function registerInfoCommand(program: Command): void {\n program\n .command(\"info\")\n .description(\"Show contract info and stats\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options: InfoOptions) => {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n try {\n const client = createNetClient(readOnlyOptions);\n\n const contract = getNetContract(readOnlyOptions.chainId);\n const chainName = getChainName({ chainId: readOnlyOptions.chainId });\n const totalMessages = await client.getMessageCount({});\n\n const info = {\n chain: {\n id: readOnlyOptions.chainId,\n name: chainName || \"Unknown\",\n },\n contract: {\n address: contract.address,\n },\n stats: {\n totalMessages,\n },\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log(chalk.white.bold(\"Net Protocol Info\\n\"));\n console.log(chalk.cyan(\"Chain:\"));\n console.log(` Name: ${chalk.white(info.chain.name)}`);\n console.log(` ID: ${chalk.white(info.chain.id)}`);\n console.log(chalk.cyan(\"\\nContract:\"));\n console.log(` Address: ${chalk.white(info.contract.address)}`);\n console.log(chalk.cyan(\"\\nStats:\"));\n console.log(` Total Messages: ${chalk.white(info.stats.totalMessages)}`);\n } catch (error) {\n exitWithError(\n `Failed to get info: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n });\n}\n","import chalk from \"chalk\";\nimport { encodeFunctionData, createWalletClient, http, parseEther } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { NetrClient, isNetrSupportedChain } from \"@net-protocol/netr\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { encodeTransaction, type EncodedTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { TokenDeployOptions } from \"./types\";\n\ninterface EncodedDeployResult {\n predictedAddress: string;\n salt: string;\n transaction: EncodedTransaction;\n config: {\n name: string;\n symbol: string;\n image: string;\n deployer: string;\n initialBuy?: string;\n };\n}\n\n/**\n * Execute encode-only mode - output deployment transaction data as JSON\n */\nasync function executeEncodeOnly(options: TokenDeployOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n if (!isNetrSupportedChain(readOnlyOptions.chainId)) {\n exitWithError(\n `Chain ${readOnlyOptions.chainId} is not supported for token deployment`\n );\n }\n\n // Get deployer address from private key if provided\n let deployerAddress: `0x${string}`;\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey as `0x${string}`);\n deployerAddress = account.address;\n } else {\n // Use a placeholder address when no private key is provided\n deployerAddress = \"0x0000000000000000000000000000000000000000\";\n }\n\n const client = new NetrClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // Generate salt and predict address\n const saltResult = await client.generateSalt({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: deployerAddress,\n fid: options.fid ? BigInt(options.fid) : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n });\n\n if (!saltResult) {\n exitWithError(\"Failed to generate salt for token deployment\");\n return;\n }\n\n // Build deploy config\n const txConfig = client.buildDeployConfig(\n {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: deployerAddress,\n fid: options.fid ? BigInt(options.fid) : undefined,\n mintPrice: options.mintPrice ? BigInt(options.mintPrice) : undefined,\n mintEndTimestamp: options.mintEndTimestamp\n ? BigInt(options.mintEndTimestamp)\n : undefined,\n maxMintSupply: options.maxMintSupply\n ? BigInt(options.maxMintSupply)\n : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy ? parseEther(options.initialBuy) : undefined,\n },\n saltResult.salt\n );\n\n // Encode the transaction (includes Base builder code suffix when on Base)\n const encoded = encodeTransaction(\n {\n to: txConfig.address,\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n value: txConfig.value,\n },\n readOnlyOptions.chainId\n );\n\n const result: EncodedDeployResult = {\n predictedAddress: saltResult.predictedAddress,\n salt: saltResult.salt,\n transaction: encoded,\n config: {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n deployer: deployerAddress,\n ...(options.initialBuy && { initialBuy: options.initialBuy }),\n },\n };\n\n console.log(JSON.stringify(result, null, 2));\n}\n\n/**\n * Execute the token deploy command\n */\nexport async function executeTokenDeploy(\n options: TokenDeployOptions\n): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n if (!isNetrSupportedChain(commonOptions.chainId)) {\n exitWithError(\n `Chain ${commonOptions.chainId} is not supported for token deployment. Supported: Base (8453), Plasma (9745), Monad (143), HyperEVM (999)`\n );\n }\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const client = new NetrClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n\n console.log(chalk.blue(\"Generating salt and predicting token address...\"));\n\n // Generate salt and predict address\n const saltResult = await client.generateSalt({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: account.address,\n fid: options.fid ? BigInt(options.fid) : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n });\n\n if (!saltResult) {\n exitWithError(\"Failed to generate salt for token deployment\");\n return;\n }\n\n console.log(\n chalk.cyan(`Predicted token address: ${saltResult.predictedAddress}`)\n );\n\n // Build deploy config\n const txConfig = client.buildDeployConfig(\n {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: account.address,\n fid: options.fid ? BigInt(options.fid) : undefined,\n mintPrice: options.mintPrice ? BigInt(options.mintPrice) : undefined,\n mintEndTimestamp: options.mintEndTimestamp\n ? BigInt(options.mintEndTimestamp)\n : undefined,\n maxMintSupply: options.maxMintSupply\n ? BigInt(options.maxMintSupply)\n : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy ? parseEther(options.initialBuy) : undefined,\n },\n saltResult.salt\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n if (options.initialBuy) {\n console.log(chalk.blue(`Deploying token with ${options.initialBuy} ETH initial buy...`));\n } else {\n console.log(chalk.blue(\"Deploying token...\"));\n }\n\n try {\n // Use sendTransaction with encoded calldata to support payable functions\n const calldata = encodeFunctionData({\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: txConfig.address,\n data: calldata,\n chain: null,\n value: txConfig.value,\n });\n\n const initialBuyLine = options.initialBuy\n ? `\\n Initial Buy: ${options.initialBuy} ETH`\n : \"\";\n\n console.log(\n chalk.green(\n `Token deployed successfully!\\n Transaction: ${hash}\\n Token Address: ${saltResult.predictedAddress}\\n Name: ${options.name}\\n Symbol: ${options.symbol}${initialBuyLine}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to deploy token: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { NetrClient, isNetrSupportedChain } from \"@net-protocol/netr\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport {\n explorerAddressUrl,\n profileUrl as buildProfileUrl,\n tokenUrl as buildTokenUrl,\n} from \"../../shared/urls\";\nimport type { TokenInfoOptions } from \"./types\";\n\n/**\n * Execute the token info command\n */\nexport async function executeTokenInfo(options: TokenInfoOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n if (!isNetrSupportedChain(readOnlyOptions.chainId)) {\n exitWithError(\n `Chain ${readOnlyOptions.chainId} is not supported for Netr tokens`\n );\n }\n\n const client = new NetrClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n const tokenAddress = options.address as `0x${string}`;\n\n try {\n // Fetch token data in parallel\n const [token, storageData, price] = await Promise.all([\n client.getToken(tokenAddress),\n client.getStorageData(tokenAddress),\n client.getPrice(tokenAddress),\n ]);\n\n if (!token) {\n exitWithError(`Token not found at address ${tokenAddress}`);\n return;\n }\n\n // Fetch locker data if available\n let locker = null;\n if (storageData?.lockerAddress) {\n locker = await client.getLocker(storageData.lockerAddress);\n }\n\n if (options.json) {\n const output = {\n address: tokenAddress,\n chainId: readOnlyOptions.chainId,\n tokenUrl: buildTokenUrl(readOnlyOptions.chainId, tokenAddress),\n explorerAddressUrl: explorerAddressUrl(\n readOnlyOptions.chainId,\n tokenAddress\n ),\n token: {\n name: token.name,\n symbol: token.symbol,\n deployer: token.deployer,\n deployerProfileUrl: buildProfileUrl(\n readOnlyOptions.chainId,\n token.deployer\n ),\n image: token.image,\n animation: token.animation || null,\n fid: token.fid.toString(),\n totalSupply: token.totalSupply.toString(),\n decimals: token.decimals,\n extraStringData: token.extraStringData || null,\n },\n pool: storageData?.poolAddress || null,\n locker: storageData?.lockerAddress || null,\n price: price\n ? {\n priceInEth: price.priceInEth,\n priceInWeth: price.priceInWeth,\n tick: price.tick,\n }\n : null,\n lockerInfo: locker\n ? {\n owner: locker.owner,\n duration: locker.duration.toString(),\n endTimestamp: locker.endTimestamp.toString(),\n version: locker.version,\n }\n : null,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nToken Info:\\n\"));\n console.log(` ${chalk.cyan(\"Address:\")} ${tokenAddress}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n console.log(` ${chalk.cyan(\"Name:\")} ${token.name}`);\n console.log(` ${chalk.cyan(\"Symbol:\")} ${token.symbol}`);\n console.log(` ${chalk.cyan(\"Deployer:\")} ${token.deployer}`);\n console.log(` ${chalk.cyan(\"FID:\")} ${token.fid.toString()}`);\n console.log(` ${chalk.cyan(\"Image:\")} ${token.image}`);\n if (token.animation) {\n console.log(` ${chalk.cyan(\"Animation:\")} ${token.animation}`);\n }\n if (token.extraStringData) {\n console.log(` ${chalk.cyan(\"Extra Data:\")} ${token.extraStringData}`);\n }\n\n if (storageData?.poolAddress) {\n console.log(` ${chalk.cyan(\"Pool:\")} ${storageData.poolAddress}`);\n }\n\n if (storageData?.lockerAddress) {\n console.log(` ${chalk.cyan(\"Locker:\")} ${storageData.lockerAddress}`);\n }\n\n if (price) {\n console.log(` ${chalk.cyan(\"Price:\")} ${price.priceInEth} ETH`);\n }\n\n if (locker) {\n const endDate = new Date(Number(locker.endTimestamp) * 1000);\n console.log(\n ` ${chalk.cyan(\"Lock Ends:\")} ${endDate.toLocaleDateString()}`\n );\n }\n\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to get token info: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeTokenDeploy } from \"./deploy\";\nimport { executeTokenInfo } from \"./info\";\n\n/**\n * Register the token command with the commander program\n */\nexport function registerTokenCommand(program: Command): void {\n const tokenCommand = program\n .command(\"token\")\n .description(\"Token operations (Netr/Banger)\");\n\n // Deploy subcommand\n const deployCommand = new Command(\"deploy\")\n .description(\"Deploy a new Netr token\")\n .requiredOption(\"--name <name>\", \"Token name\")\n .requiredOption(\"--symbol <symbol>\", \"Token symbol\")\n .requiredOption(\"--image <url>\", \"Token image URL\")\n .option(\"--animation <url>\", \"Token animation URL\")\n .option(\"--fid <number>\", \"Farcaster ID\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\"--mint-price <wei>\", \"Mint price in wei for NFT drop\")\n .option(\"--mint-end-timestamp <timestamp>\", \"Unix timestamp when minting ends\")\n .option(\"--max-mint-supply <amount>\", \"Maximum mint supply for NFT drop\")\n .option(\"--metadata-address <address>\", \"Dynamic metadata contract address\")\n .option(\"--extra-string-data <data>\", \"Extra string data to store with token\")\n .option(\"--initial-buy <eth>\", \"ETH amount to swap for tokens on deploy (e.g., '0.001')\")\n .action(async (options) => {\n await executeTokenDeploy({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n fid: options.fid,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n mintPrice: options.mintPrice,\n mintEndTimestamp: options.mintEndTimestamp,\n maxMintSupply: options.maxMintSupply,\n metadataAddress: options.metadataAddress,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy,\n });\n });\n\n // Info subcommand\n const infoCommand = new Command(\"info\")\n .description(\"Get information about a Netr token\")\n .requiredOption(\"--address <address>\", \"Token address\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeTokenInfo({\n address: options.address,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n tokenCommand.addCommand(deployCommand);\n tokenCommand.addCommand(infoCommand);\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport {\n PROFILE_PICTURE_STORAGE_KEY,\n PROFILE_METADATA_STORAGE_KEY,\n PROFILE_CANVAS_STORAGE_KEY,\n PROFILE_CSS_STORAGE_KEY,\n parseProfileMetadata,\n} from \"@net-protocol/profiles\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport {\n profileUrl as buildProfileUrl,\n walletUrl as buildWalletUrl,\n} from \"../../shared/urls\";\nimport type { ProfileGetOptions } from \"./types\";\n\n/**\n * Execute the profile get command - reads profile data for an address\n */\nexport async function executeProfileGet(\n options: ProfileGetOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Fetch profile picture\n let profilePicture: string | undefined;\n try {\n const pictureResult = await client.readStorageData({\n key: PROFILE_PICTURE_STORAGE_KEY,\n operator: options.address,\n });\n if (pictureResult.data) {\n profilePicture = pictureResult.data;\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n // Fetch profile metadata (X username, bio, display name, token address)\n let xUsername: string | undefined;\n let bio: string | undefined;\n let displayName: string | undefined;\n let tokenAddress: string | undefined;\n try {\n const metadataResult = await client.readStorageData({\n key: PROFILE_METADATA_STORAGE_KEY,\n operator: options.address,\n });\n if (metadataResult.data) {\n const metadata = parseProfileMetadata(metadataResult.data);\n xUsername = metadata?.x_username;\n bio = metadata?.bio;\n displayName = metadata?.display_name;\n tokenAddress = metadata?.token_address;\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n // Fetch profile canvas\n let canvasSize: number | undefined;\n let canvasIsDataUri = false;\n try {\n const canvasResult = await client.readChunkedStorage({\n key: PROFILE_CANVAS_STORAGE_KEY,\n operator: options.address,\n });\n if (canvasResult.data) {\n canvasSize = canvasResult.data.length;\n canvasIsDataUri = canvasResult.data.startsWith(\"data:\");\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage !== \"ChunkedStorage metadata not found\" &&\n !errorMessage.includes(\"not found\")\n ) {\n throw error;\n }\n }\n\n // Fetch profile CSS\n let cssSize: number | undefined;\n try {\n const cssResult = await client.readStorageData({\n key: PROFILE_CSS_STORAGE_KEY,\n operator: options.address,\n });\n if (cssResult.data) {\n cssSize = cssResult.data.length;\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n const hasProfile = profilePicture || xUsername || bio || displayName || tokenAddress || canvasSize || cssSize;\n\n if (options.json) {\n const output = {\n address: options.address,\n chainId: readOnlyOptions.chainId,\n profileUrl: buildProfileUrl(readOnlyOptions.chainId, options.address),\n walletUrl: buildWalletUrl(readOnlyOptions.chainId, options.address),\n profilePicture: profilePicture || null,\n displayName: displayName || null,\n xUsername: xUsername || null,\n bio: bio || null,\n tokenAddress: tokenAddress || null,\n canvas: canvasSize\n ? { size: canvasSize, isDataUri: canvasIsDataUri }\n : null,\n css: cssSize ? { size: cssSize } : null,\n hasProfile,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nProfile:\\n\"));\n console.log(` ${chalk.cyan(\"Address:\")} ${options.address}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n console.log(\n ` ${chalk.cyan(\"Display Name:\")} ${\n displayName || chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Profile Picture:\")} ${\n profilePicture || chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"X Username:\")} ${\n xUsername ? `@${xUsername}` : chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Bio:\")} ${bio || chalk.gray(\"(not set)\")}`\n );\n console.log(\n ` ${chalk.cyan(\"Token Address:\")} ${\n tokenAddress || chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Canvas:\")} ${\n canvasSize\n ? `${canvasSize} bytes${canvasIsDataUri ? \" (data URI)\" : \"\"}`\n : chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Custom CSS:\")} ${\n cssSize ? `${cssSize} bytes` : chalk.gray(\"(not set)\")\n }`\n );\n\n if (!hasProfile) {\n console.log(chalk.yellow(\"\\n No profile data found for this address.\"));\n }\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to read profile: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfilePictureStorageArgs,\n isValidUrl,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { ProfileSetPictureOptions } from \"./types\";\n\n/**\n * Execute the profile set-picture command\n */\nexport async function executeProfileSetPicture(\n options: ProfileSetPictureOptions\n): Promise<void> {\n // Validate URL\n if (!isValidUrl(options.url)) {\n exitWithError(\n `Invalid URL: \"${options.url}\". Please provide a valid URL (e.g., https://example.com/image.jpg)`\n );\n }\n\n // Get storage args\n const storageArgs = getProfilePictureStorageArgs(options.url);\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`📷 Setting profile picture...`));\n console.log(chalk.gray(` URL: ${options.url}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`⏳ Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\n✓ Profile picture updated successfully!\\n Transaction: ${hash}\\n URL: ${options.url}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set profile picture: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { StorageClient } from \"@net-protocol/storage\";\nimport {\n PROFILE_METADATA_STORAGE_KEY,\n parseProfileMetadata,\n} from \"@net-protocol/profiles\";\n\ninterface ExistingMetadata {\n x_username?: string;\n bio?: string;\n display_name?: string;\n token_address?: string;\n}\n\n/**\n * Read existing profile metadata for an address.\n * Returns parsed metadata fields, or empty object if not found.\n */\nexport async function readExistingMetadata(\n address: string,\n client: StorageClient\n): Promise<ExistingMetadata> {\n try {\n const metadataResult = await client.readStorageData({\n key: PROFILE_METADATA_STORAGE_KEY,\n operator: address,\n });\n if (metadataResult.data) {\n const metadata = parseProfileMetadata(metadataResult.data);\n return {\n x_username: metadata?.x_username,\n bio: metadata?.bio,\n display_name: metadata?.display_name,\n token_address: metadata?.token_address,\n };\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n return {};\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidXUsername,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetUsernameOptions } from \"./types\";\n\n/**\n * Execute the profile set-username command\n */\nexport async function executeProfileSetUsername(\n options: ProfileSetUsernameOptions\n): Promise<void> {\n // Validate username\n if (!isValidXUsername(options.username)) {\n exitWithError(\n `Invalid X username: \"${options.username}\". Usernames must be 1-15 characters, alphanumeric and underscores only.`\n );\n }\n\n // Normalize username (strip @ if present for storage)\n const usernameForStorage = options.username.startsWith(\"@\")\n ? options.username.slice(1)\n : options.username;\n const displayUsername = `@${usernameForStorage}`;\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // If address provided, read existing metadata to preserve other fields\n let existing: Awaited<ReturnType<typeof readExistingMetadata>> = {};\n if (options.address) {\n const storageClient = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl\n ? { rpcUrls: [options.rpcUrl] }\n : undefined,\n });\n existing = await readExistingMetadata(options.address, storageClient);\n }\n\n const storageArgs = getProfileMetadataStorageArgs({\n x_username: usernameForStorage,\n bio: existing.bio,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting X username...`));\n console.log(chalk.gray(` Username: ${displayUsername}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update x_username, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n x_username: usernameForStorage,\n bio: existing.bio,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nX username updated successfully!\\n Transaction: ${hash}\\n Username: ${displayUsername}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set X username: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidBio,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetBioOptions } from \"./types\";\n\n/**\n * Execute the profile set-bio command\n */\nexport async function executeProfileSetBio(\n options: ProfileSetBioOptions\n): Promise<void> {\n // Validate bio\n if (!isValidBio(options.bio)) {\n exitWithError(\n `Invalid bio: \"${options.bio}\". Bio must be 1-280 characters and cannot contain control characters.`\n );\n }\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // If address provided, read existing metadata to preserve other fields\n let existing: Awaited<ReturnType<typeof readExistingMetadata>> = {};\n if (options.address) {\n const storageClient = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl\n ? { rpcUrls: [options.rpcUrl] }\n : undefined,\n });\n existing = await readExistingMetadata(options.address, storageClient);\n }\n\n const storageArgs = getProfileMetadataStorageArgs({\n bio: options.bio,\n x_username: existing.x_username,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile bio...`));\n console.log(chalk.gray(` Bio: ${options.bio}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update bio, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n bio: options.bio,\n x_username: existing.x_username,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nBio updated successfully!\\n Transaction: ${hash}\\n Bio: ${options.bio}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set bio: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidDisplayName,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetDisplayNameOptions } from \"./types\";\n\n/**\n * Execute the profile set-display-name command\n */\nexport async function executeProfileSetDisplayName(\n options: ProfileSetDisplayNameOptions\n): Promise<void> {\n // Validate display name\n if (!isValidDisplayName(options.name)) {\n exitWithError(\n `Invalid display name: \"${options.name}\". Display name must be 1-25 characters and cannot contain control characters.`\n );\n }\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // If address provided, read existing metadata to preserve other fields\n let existing: Awaited<ReturnType<typeof readExistingMetadata>> = {};\n if (options.address) {\n const storageClient = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl\n ? { rpcUrls: [options.rpcUrl] }\n : undefined,\n });\n existing = await readExistingMetadata(options.address, storageClient);\n }\n\n const storageArgs = getProfileMetadataStorageArgs({\n display_name: options.name,\n bio: existing.bio,\n x_username: existing.x_username,\n token_address: existing.token_address,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting display name...`));\n console.log(chalk.gray(` Name: ${options.name}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update display_name, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n display_name: options.name,\n bio: existing.bio,\n x_username: existing.x_username,\n token_address: existing.token_address,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nDisplay name updated successfully!\\n Transaction: ${hash}\\n Name: ${options.name}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set display name: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidTokenAddress,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetTokenAddressOptions } from \"./types\";\n\n/**\n * Execute the profile set-token-address command\n */\nexport async function executeProfileSetTokenAddress(\n options: ProfileSetTokenAddressOptions\n): Promise<void> {\n // Validate token address\n if (!isValidTokenAddress(options.tokenAddress)) {\n exitWithError(\n `Invalid token address: \"${options.tokenAddress}\". Must be a valid EVM address (0x-prefixed, 40 hex characters).`\n );\n }\n\n // Store as lowercase\n const normalizedAddress = options.tokenAddress.toLowerCase();\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // If address provided, read existing metadata to preserve other fields\n let existing: Awaited<ReturnType<typeof readExistingMetadata>> = {};\n if (options.address) {\n const storageClient = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl\n ? { rpcUrls: [options.rpcUrl] }\n : undefined,\n });\n existing = await readExistingMetadata(options.address, storageClient);\n }\n\n const storageArgs = getProfileMetadataStorageArgs({\n token_address: normalizedAddress,\n x_username: existing.x_username,\n bio: existing.bio,\n display_name: existing.display_name,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile token address...`));\n console.log(chalk.gray(` Token Address: ${normalizedAddress}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update token_address, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n token_address: normalizedAddress,\n x_username: existing.x_username,\n bio: existing.bio,\n display_name: existing.display_name,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nToken address updated successfully!\\n Transaction: ${hash}\\n Token Address: ${normalizedAddress}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set token address: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n PROFILE_CANVAS_STORAGE_KEY,\n PROFILE_CANVAS_TOPIC,\n} from \"@net-protocol/profiles\";\nimport {\n CHUNKED_STORAGE_CONTRACT,\n chunkDataForStorage,\n} from \"@net-protocol/storage\";\nimport { toBytes32 } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { ProfileSetCanvasOptions } from \"./types\";\n\nconst MAX_CANVAS_SIZE = 60 * 1024; // 60KB\nconst CANVAS_FILENAME = \"profile-compressed.html\";\n\n/**\n * Check if a buffer contains binary data (non-text)\n */\nfunction isBinaryContent(buffer: Buffer): boolean {\n // Check for null bytes or other non-text characters in the first 8KB\n const sampleSize = Math.min(buffer.length, 8192);\n for (let i = 0; i < sampleSize; i++) {\n const byte = buffer[i];\n // Null byte is a strong indicator of binary\n if (byte === 0) return true;\n // Control characters (except tab, newline, carriage return)\n if (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) return true;\n }\n return false;\n}\n\n/**\n * Get MIME type from file extension\n */\nfunction getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n const mimeTypes: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".pdf\": \"application/pdf\",\n \".html\": \"text/html\",\n \".htm\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"application/javascript\",\n \".json\": \"application/json\",\n \".txt\": \"text/plain\",\n };\n return mimeTypes[ext] || \"application/octet-stream\";\n}\n\n/**\n * Convert binary buffer to data URI\n */\nfunction bufferToDataUri(buffer: Buffer, mimeType: string): string {\n const base64 = buffer.toString(\"base64\");\n return `data:${mimeType};base64,${base64}`;\n}\n\n/**\n * Execute the profile set-canvas command\n */\nexport async function executeProfileSetCanvas(\n options: ProfileSetCanvasOptions\n): Promise<void> {\n // Validate: must provide --file or --content, but not both\n if (!options.file && !options.content) {\n exitWithError(\n \"Must provide either --file or --content to set canvas content.\"\n );\n }\n\n if (options.file && options.content) {\n exitWithError(\"Cannot provide both --file and --content. Choose one.\");\n }\n\n let canvasContent: string;\n\n // Read content from file or use provided content\n if (options.file) {\n const filePath = path.resolve(options.file);\n\n // Check file exists\n if (!fs.existsSync(filePath)) {\n exitWithError(`File not found: ${filePath}`);\n }\n\n // Read file as buffer to detect binary content\n const buffer = fs.readFileSync(filePath);\n\n // Check file size\n if (buffer.length > MAX_CANVAS_SIZE) {\n exitWithError(\n `File too large: ${buffer.length} bytes exceeds maximum of ${MAX_CANVAS_SIZE} bytes (60KB).`\n );\n }\n\n // Handle binary files (convert to data URI)\n if (isBinaryContent(buffer)) {\n const mimeType = getMimeType(filePath);\n canvasContent = bufferToDataUri(buffer, mimeType);\n } else {\n canvasContent = buffer.toString(\"utf-8\");\n }\n } else {\n // Use provided content\n canvasContent = options.content!;\n\n // Check content size\n const contentSize = Buffer.byteLength(canvasContent, \"utf-8\");\n if (contentSize > MAX_CANVAS_SIZE) {\n exitWithError(\n `Content too large: ${contentSize} bytes exceeds maximum of ${MAX_CANVAS_SIZE} bytes (60KB).`\n );\n }\n }\n\n // Prepare storage key as bytes32\n const bytesKey = toBytes32(PROFILE_CANVAS_STORAGE_KEY) as `0x${string}`;\n\n // Chunk and compress data for storage\n const chunks = chunkDataForStorage(canvasContent);\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const encoded = encodeTransaction(\n {\n to: CHUNKED_STORAGE_CONTRACT.address,\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [bytesKey, CANVAS_FILENAME, chunks],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile canvas...`));\n console.log(\n chalk.gray(` Content size: ${Buffer.byteLength(canvasContent)} bytes`)\n );\n console.log(chalk.gray(` Chunks: ${chunks.length}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Submit transaction to ChunkedStorage\n const hash = await client.writeContract({\n address: CHUNKED_STORAGE_CONTRACT.address as `0x${string}`,\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [bytesKey, CANVAS_FILENAME, chunks],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nCanvas updated successfully!\\n Transaction: ${hash}\\n Content size: ${Buffer.byteLength(canvasContent)} bytes\\n Chunks: ${chunks.length}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set canvas: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { PROFILE_CANVAS_STORAGE_KEY } from \"@net-protocol/profiles\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ProfileGetCanvasOptions } from \"./types\";\n\n/**\n * Check if content is a data URI\n */\nfunction isDataUri(content: string): boolean {\n return content.startsWith(\"data:\");\n}\n\n/**\n * Parse a data URI and return the buffer and mime type\n */\nfunction parseDataUri(dataUri: string): { buffer: Buffer; mimeType: string } {\n const match = dataUri.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n throw new Error(\"Invalid data URI format\");\n }\n const mimeType = match[1];\n const base64Data = match[2];\n const buffer = Buffer.from(base64Data, \"base64\");\n return { buffer, mimeType };\n}\n\n/**\n * Get file extension from mime type\n */\nfunction getExtensionFromMimeType(mimeType: string): string {\n const extensions: Record<string, string> = {\n \"image/png\": \".png\",\n \"image/jpeg\": \".jpg\",\n \"image/gif\": \".gif\",\n \"image/webp\": \".webp\",\n \"image/svg+xml\": \".svg\",\n \"application/pdf\": \".pdf\",\n \"text/html\": \".html\",\n \"text/css\": \".css\",\n \"application/javascript\": \".js\",\n \"application/json\": \".json\",\n \"text/plain\": \".txt\",\n \"application/octet-stream\": \".bin\",\n };\n return extensions[mimeType] || \".bin\";\n}\n\n/**\n * Execute the profile get-canvas command - reads canvas data for an address\n */\nexport async function executeProfileGetCanvas(\n options: ProfileGetCanvasOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Read canvas from chunked storage\n let canvasContent: string | undefined;\n let canvasText: string | undefined;\n\n try {\n const result = await client.readChunkedStorage({\n key: PROFILE_CANVAS_STORAGE_KEY,\n operator: options.address,\n });\n\n if (result.data) {\n canvasContent = result.data;\n canvasText = result.text;\n }\n } catch (error) {\n // Check for \"not found\" type errors\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage !== \"ChunkedStorage metadata not found\" &&\n !errorMessage.includes(\"not found\")\n ) {\n throw error;\n }\n // No canvas exists - that's okay\n }\n\n // Handle JSON output\n if (options.json) {\n const output = {\n address: options.address,\n chainId: readOnlyOptions.chainId,\n canvas: canvasContent || null,\n filename: canvasText || null,\n hasCanvas: !!canvasContent,\n isDataUri: canvasContent ? isDataUri(canvasContent) : false,\n contentLength: canvasContent ? canvasContent.length : 0,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // No canvas found\n if (!canvasContent) {\n exitWithError(`No canvas found for address: ${options.address}`);\n }\n\n // Handle output to file\n if (options.output) {\n const outputPath = path.resolve(options.output);\n\n // Check if content is a data URI (binary)\n if (isDataUri(canvasContent)) {\n const { buffer, mimeType } = parseDataUri(canvasContent);\n\n // If output path doesn't have extension, add one based on mime type\n let finalPath = outputPath;\n if (!path.extname(outputPath)) {\n finalPath = outputPath + getExtensionFromMimeType(mimeType);\n }\n\n fs.writeFileSync(finalPath, buffer);\n console.log(\n chalk.green(`Canvas written to: ${finalPath} (${buffer.length} bytes)`)\n );\n } else {\n // Text content\n fs.writeFileSync(outputPath, canvasContent, \"utf-8\");\n console.log(\n chalk.green(\n `Canvas written to: ${outputPath} (${canvasContent.length} bytes)`\n )\n );\n }\n return;\n }\n\n // Output to stdout\n // For binary content (data URI), output as-is since stdout can't handle raw binary\n console.log(canvasContent);\n } catch (error) {\n exitWithError(\n `Failed to read canvas: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfileCSSStorageArgs,\n isValidCSS,\n MAX_CSS_SIZE,\n STORAGE_CONTRACT,\n DEMO_THEMES,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { ProfileSetCSSOptions } from \"./types\";\n\n/**\n * Execute the profile set-css command\n */\nexport async function executeProfileSetCSS(\n options: ProfileSetCSSOptions\n): Promise<void> {\n // Validate: must provide exactly one of --file, --content, or --theme\n const sourceCount = [options.file, options.content, options.theme].filter(\n Boolean\n ).length;\n if (sourceCount === 0) {\n exitWithError(\n \"Must provide one of --file, --content, or --theme to set CSS.\"\n );\n }\n if (sourceCount > 1) {\n exitWithError(\"Cannot provide more than one of --file, --content, --theme.\");\n }\n\n let cssContent: string;\n\n if (options.theme) {\n // Use a built-in demo theme\n const theme = DEMO_THEMES[options.theme];\n if (!theme) {\n const available = Object.entries(DEMO_THEMES)\n .map(([key, val]) => ` ${key} — ${val.name}`)\n .join(\"\\n\");\n exitWithError(\n `Unknown theme: \"${options.theme}\"\\n\\nAvailable themes:\\n${available}`\n );\n }\n cssContent = theme.css;\n console.log(chalk.gray(` Using theme: ${theme.name}`));\n } else if (options.file) {\n const filePath = path.resolve(options.file);\n if (!fs.existsSync(filePath)) {\n exitWithError(`File not found: ${filePath}`);\n }\n const buffer = fs.readFileSync(filePath);\n if (buffer.length > MAX_CSS_SIZE) {\n exitWithError(\n `File too large: ${buffer.length} bytes exceeds maximum of ${MAX_CSS_SIZE} bytes (15KB).`\n );\n }\n cssContent = buffer.toString(\"utf-8\");\n } else {\n cssContent = options.content!;\n const contentSize = Buffer.byteLength(cssContent, \"utf-8\");\n if (contentSize > MAX_CSS_SIZE) {\n exitWithError(\n `Content too large: ${contentSize} bytes exceeds maximum of ${MAX_CSS_SIZE} bytes (15KB).`\n );\n }\n }\n\n // Validate CSS\n if (!isValidCSS(cssContent)) {\n exitWithError(\n \"Invalid CSS: content is empty, too large, or contains disallowed patterns (script injection).\"\n );\n }\n\n // Prepare storage args\n const storageArgs = getProfileCSSStorageArgs(cssContent);\n\n // Handle encode-only mode\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n try {\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile CSS...`));\n console.log(\n chalk.gray(\n ` Content size: ${Buffer.byteLength(cssContent, \"utf-8\")} bytes`\n )\n );\n console.log(chalk.gray(` Address: ${account.address}`));\n\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nCSS updated successfully!\\n Transaction: ${hash}\\n Content size: ${Buffer.byteLength(cssContent, \"utf-8\")} bytes`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set CSS: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { PROFILE_CSS_STORAGE_KEY } from \"@net-protocol/profiles\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ProfileGetCSSOptions } from \"./types\";\n\n/**\n * Execute the profile get-css command — reads custom CSS for an address\n */\nexport async function executeProfileGetCSS(\n options: ProfileGetCSSOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n let cssContent: string | undefined;\n\n try {\n const result = await client.readStorageData({\n key: PROFILE_CSS_STORAGE_KEY,\n operator: options.address,\n });\n\n if (result.data) {\n cssContent = result.data;\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n // Handle JSON output\n if (options.json) {\n const output = {\n address: options.address,\n chainId: readOnlyOptions.chainId,\n css: cssContent || null,\n hasCSS: !!cssContent,\n contentLength: cssContent ? cssContent.length : 0,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // No CSS found\n if (!cssContent) {\n exitWithError(`No custom CSS found for address: ${options.address}`);\n }\n\n // Handle output to file\n if (options.output) {\n const outputPath = path.resolve(options.output);\n fs.writeFileSync(outputPath, cssContent, \"utf-8\");\n console.log(\n chalk.green(\n `CSS written to: ${outputPath} (${cssContent.length} bytes)`\n )\n );\n return;\n }\n\n // Output to stdout\n console.log(cssContent);\n } catch (error) {\n exitWithError(\n `Failed to read CSS: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { buildCSSPrompt, DEMO_THEMES } from \"@net-protocol/profiles\";\n\n/**\n * Execute the profile css-prompt command — prints the AI prompt for CSS generation\n */\nexport async function executeProfileCSSPrompt(options: {\n listThemes?: boolean;\n}): Promise<void> {\n if (options.listThemes) {\n console.log(\"Available demo themes:\\n\");\n for (const [key, theme] of Object.entries(DEMO_THEMES)) {\n console.log(` ${key} — ${theme.name}`);\n }\n console.log(\n \"\\nUse with: net profile set-css --theme <name>\"\n );\n return;\n }\n\n console.log(buildCSSPrompt());\n}\n","import { Command } from \"commander\";\nimport { executeProfileGet } from \"./get\";\nimport { executeProfileSetPicture } from \"./set-picture\";\nimport { executeProfileSetUsername } from \"./set-username\";\nimport { executeProfileSetBio } from \"./set-bio\";\nimport { executeProfileSetDisplayName } from \"./set-display-name\";\nimport { executeProfileSetTokenAddress } from \"./set-token-address\";\nimport { executeProfileSetCanvas } from \"./set-canvas\";\nimport { executeProfileGetCanvas } from \"./get-canvas\";\nimport { executeProfileSetCSS } from \"./set-css\";\nimport { executeProfileGetCSS } from \"./get-css\";\nimport { executeProfileCSSPrompt } from \"./css-prompt\";\n\n/**\n * Register the profile command with the commander program\n */\nexport function registerProfileCommand(program: Command): void {\n // Command group\n const profileCommand = program\n .command(\"profile\")\n .description(\"User profile operations\");\n\n // Get subcommand (read-only)\n const getCommand = new Command(\"get\")\n .description(\"Get profile data for an address\")\n .requiredOption(\"--address <address>\", \"Wallet address to get profile for\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeProfileGet({\n address: options.address,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // Set-picture subcommand (write)\n const setPictureCommand = new Command(\"set-picture\")\n .description(\"Set your profile picture URL\")\n .requiredOption(\"--url <url>\", \"Image URL for profile picture\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetPicture({\n url: options.url,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Set-x-username subcommand (write)\n const setUsernameCommand = new Command(\"set-x-username\")\n .description(\"Set your X (Twitter) username for your profile\")\n .requiredOption(\n \"--username <username>\",\n \"Your X (Twitter) username (with or without @)\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--address <address>\",\n \"Wallet address to preserve existing metadata for (used with --encode-only)\"\n )\n .action(async (options) => {\n await executeProfileSetUsername({\n username: options.username,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n address: options.address,\n });\n });\n\n // Set-bio subcommand (write)\n const setBioCommand = new Command(\"set-bio\")\n .description(\"Set your profile bio\")\n .requiredOption(\"--bio <bio>\", \"Your profile bio (max 280 characters)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--address <address>\",\n \"Wallet address to preserve existing metadata for (used with --encode-only)\"\n )\n .action(async (options) => {\n await executeProfileSetBio({\n bio: options.bio,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n address: options.address,\n });\n });\n\n // Set-display-name subcommand (write)\n const setDisplayNameCommand = new Command(\"set-display-name\")\n .description(\"Set your profile display name\")\n .requiredOption(\"--name <name>\", \"Your display name (max 25 characters)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--address <address>\",\n \"Wallet address to preserve existing metadata for (used with --encode-only)\"\n )\n .action(async (options) => {\n await executeProfileSetDisplayName({\n name: options.name,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n address: options.address,\n });\n });\n\n // Set-token-address subcommand (write)\n const setTokenAddressCommand = new Command(\"set-token-address\")\n .description(\"Set your profile token address (ERC-20 token that represents you)\")\n .requiredOption(\n \"--token-address <address>\",\n \"ERC-20 token contract address (0x-prefixed)\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--address <address>\",\n \"Wallet address to preserve existing metadata for (used with --encode-only)\"\n )\n .action(async (options) => {\n await executeProfileSetTokenAddress({\n tokenAddress: options.tokenAddress,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n address: options.address,\n });\n });\n\n // Set-canvas subcommand (write)\n const setCanvasCommand = new Command(\"set-canvas\")\n .description(\"Set your profile canvas (HTML content)\")\n .option(\"--file <path>\", \"Path to file containing canvas content\")\n .option(\"--content <html>\", \"HTML content for canvas (inline)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetCanvas({\n file: options.file,\n content: options.content,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Get-canvas subcommand (read-only)\n const getCanvasCommand = new Command(\"get-canvas\")\n .description(\"Get profile canvas for an address\")\n .requiredOption(\"--address <address>\", \"Wallet address to get canvas for\")\n .option(\"--output <path>\", \"Write canvas content to file instead of stdout\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeProfileGetCanvas({\n address: options.address,\n output: options.output,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // Set-css subcommand (write)\n const setCSSCommand = new Command(\"set-css\")\n .description(\"Set your profile custom CSS theme\")\n .option(\"--file <path>\", \"Path to CSS file\")\n .option(\"--content <css>\", \"CSS content (inline)\")\n .option(\"--theme <name>\", \"Use a built-in demo theme (run css-prompt --list-themes to see available)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetCSS({\n file: options.file,\n content: options.content,\n theme: options.theme,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Get-css subcommand (read-only)\n const getCSSCommand = new Command(\"get-css\")\n .description(\"Get profile custom CSS for an address\")\n .requiredOption(\"--address <address>\", \"Wallet address to get CSS for\")\n .option(\"--output <path>\", \"Write CSS content to file instead of stdout\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeProfileGetCSS({\n address: options.address,\n output: options.output,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // CSS-prompt subcommand (read-only, no chain interaction)\n const cssPromptCommand = new Command(\"css-prompt\")\n .description(\"Print the AI prompt for generating profile CSS themes\")\n .option(\"--list-themes\", \"List available demo themes instead of the prompt\")\n .action(async (options) => {\n await executeProfileCSSPrompt({\n listThemes: options.listThemes,\n });\n });\n\n profileCommand.addCommand(getCommand);\n profileCommand.addCommand(setPictureCommand);\n profileCommand.addCommand(setUsernameCommand);\n profileCommand.addCommand(setBioCommand);\n profileCommand.addCommand(setDisplayNameCommand);\n profileCommand.addCommand(setTokenAddressCommand);\n profileCommand.addCommand(setCanvasCommand);\n profileCommand.addCommand(getCanvasCommand);\n profileCommand.addCommand(setCSSCommand);\n profileCommand.addCommand(getCSSCommand);\n profileCommand.addCommand(cssPromptCommand);\n}\n","/**\n * Format a price number for display (removes trailing zeros)\n */\nexport function formatEthPrice(price: number): string {\n return price.toFixed(6).replace(/\\.?0+$/, \"\");\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListListingsOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListListings(options: ListListingsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}` | undefined,\n });\n\n if (options.json) {\n const output = listings.map((l) => ({\n orderHash: l.orderHash,\n maker: l.maker,\n nftAddress: l.nftAddress,\n tokenId: l.tokenId,\n price: l.price,\n priceWei: l.priceWei.toString(),\n currency: l.currency,\n expirationDate: l.expirationDate,\n orderStatus: l.orderStatus,\n ...(l.targetFulfiller ? { targetFulfiller: l.targetFulfiller } : {}),\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (listings.length === 0) {\n console.log(chalk.yellow(\"No active listings found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nListings (${listings.length}):\\n`));\n\n for (const listing of listings) {\n const expiry = new Date(listing.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${listing.orderHash}`);\n console.log(` ${chalk.cyan(\"Seller:\")} ${listing.maker}`);\n console.log(` ${chalk.cyan(\"NFT:\")} ${listing.nftAddress} #${listing.tokenId}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(listing.price)} ${listing.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n if (listing.targetFulfiller) {\n console.log(` ${chalk.cyan(\"Private (for):\")} ${listing.targetFulfiller}`);\n }\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch listings: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListOffersOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListOffers(options: ListOffersOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = offers.map((o) => ({\n orderHash: o.orderHash,\n maker: o.maker,\n nftAddress: o.nftAddress,\n price: o.price,\n priceWei: o.priceWei.toString(),\n currency: o.currency,\n expirationDate: o.expirationDate,\n orderStatus: o.orderStatus,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (offers.length === 0) {\n console.log(chalk.yellow(\"No active collection offers found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nCollection Offers (${offers.length}):\\n`));\n\n for (const offer of offers) {\n const expiry = new Date(offer.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${offer.orderHash}`);\n console.log(` ${chalk.cyan(\"Buyer:\")} ${offer.maker}`);\n console.log(` ${chalk.cyan(\"Collection:\")} ${offer.nftAddress}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(offer.price)} ${offer.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch offers: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListSalesOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListSales(options: ListSalesOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const sales = await bazaarClient.getSales({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = sales.map((s) => ({\n orderHash: s.orderHash,\n seller: s.seller,\n buyer: s.buyer,\n tokenAddress: s.tokenAddress,\n tokenId: s.tokenId,\n amount: s.amount.toString(),\n price: s.price,\n priceWei: s.priceWei.toString(),\n currency: s.currency,\n timestamp: s.timestamp,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (sales.length === 0) {\n console.log(chalk.yellow(\"No sales found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nSales (${sales.length}):\\n`));\n\n for (const sale of sales) {\n const date = new Date(sale.timestamp * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${sale.orderHash}`);\n console.log(` ${chalk.cyan(\"Seller:\")} ${sale.seller}`);\n console.log(` ${chalk.cyan(\"Buyer:\")} ${sale.buyer}`);\n console.log(` ${chalk.cyan(\"Token:\")} ${sale.tokenAddress} #${sale.tokenId}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(sale.price)} ${sale.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Date:\")} ${date}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch sales: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateListingOptions } from \"./types\";\n\nexport async function executeCreateListing(options: CreateListingOptions): Promise<void> {\n // Dual mode: with private key = full flow, without = output EIP-712 data\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n console.log(chalk.blue(\"Preparing listing...\"));\n\n const prepared = await bazaarClient.prepareCreateListing({\n nftAddress: options.nftAddress as `0x${string}`,\n tokenId: options.tokenId,\n priceWei,\n offerer: account.address,\n targetFulfiller: options.targetFulfiller as `0x${string}` | undefined,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if needed\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing order...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the listing\n console.log(chalk.blue(\"Submitting listing...\"));\n const submitTx = bazaarClient.prepareSubmitListing(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `Listing created successfully!\\n Transaction: ${hash}\\n NFT: ${options.nftAddress} #${options.tokenId}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateListingOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n const prepared = await bazaarClient.prepareCreateListing({\n nftAddress: options.nftAddress as `0x${string}`,\n tokenId: options.tokenId,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n targetFulfiller: options.targetFulfiller as `0x${string}` | undefined,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateOfferOptions } from \"./types\";\n\nexport async function executeCreateOffer(options: CreateOfferOptions): Promise<void> {\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n console.log(chalk.blue(\"Preparing collection offer...\"));\n\n const prepared = await bazaarClient.prepareCreateCollectionOffer({\n nftAddress: options.nftAddress as `0x${string}`,\n priceWei,\n offerer: account.address,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if needed (WETH approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing offer...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the offer\n console.log(chalk.blue(\"Submitting offer...\"));\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `Collection offer created successfully!\\n Transaction: ${hash}\\n Collection: ${options.nftAddress}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateOfferOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n const prepared = await bazaarClient.prepareCreateCollectionOffer({\n nftAddress: options.nftAddress as `0x${string}`,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitListingOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitListing(options: SubmitListingOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitListing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitListing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n console.log(chalk.blue(\"Submitting listing...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`Listing submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitListingOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitListing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitListing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitOfferOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitOffer(options: SubmitOfferOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitCollectionOffer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n console.log(chalk.blue(\"Submitting offer...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`Offer submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitOfferOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitCollectionOffer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { BuyListingOptions } from \"./types\";\n\nexport async function executeBuyListing(options: BuyListingOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching listing...\"));\n\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`Listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillListing(listing, account.address);\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if any\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `Listing fulfilled successfully!\\n Transaction: ${hash}\\n NFT: ${listing.nftAddress} #${listing.tokenId}\\n Price: ${listing.price} ${listing.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to buy listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: BuyListingOptions): Promise<void> {\n if (!options.buyer) {\n exitWithError(\"--buyer is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const buyerAddress = options.buyer as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`Listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillListing(listing, buyerAddress);\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode buy listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { AcceptOfferOptions } from \"./types\";\n\nexport async function executeAcceptOffer(options: AcceptOfferOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching offers...\"));\n\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`Offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillCollectionOffer(\n offer,\n options.tokenId,\n account.address\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if any (ERC721 approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `Offer accepted successfully!\\n Transaction: ${hash}\\n NFT: ${options.nftAddress} #${options.tokenId}\\n Price: ${offer.price} ${offer.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to accept offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: AcceptOfferOptions): Promise<void> {\n if (!options.seller) {\n exitWithError(\"--seller is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const sellerAddress = options.seller as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`Offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillCollectionOffer(\n offer,\n options.tokenId,\n sellerAddress\n );\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode accept offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { OwnedNftsOptions } from \"./types\";\n\nexport async function executeOwnedNfts(options: OwnedNftsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const startTokenId = options.startTokenId ? BigInt(options.startTokenId) : undefined;\n const endTokenId = options.endTokenId ? BigInt(options.endTokenId) : undefined;\n\n try {\n const tokenIds = await bazaarClient.getOwnedTokens({\n nftAddress: options.nftAddress as `0x${string}`,\n ownerAddress: options.owner as `0x${string}`,\n startTokenId,\n endTokenId,\n });\n\n if (options.json) {\n const output = {\n nftAddress: options.nftAddress,\n owner: options.owner,\n tokenIds: tokenIds.map((id) => id.toString()),\n count: tokenIds.length,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (tokenIds.length === 0) {\n console.log(chalk.yellow(\"No owned tokens found in the specified range\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nOwned Tokens (${tokenIds.length}):\\n`));\n console.log(` ${chalk.cyan(\"Collection:\")} ${options.nftAddress}`);\n console.log(` ${chalk.cyan(\"Owner:\")} ${options.owner}`);\n console.log(` ${chalk.cyan(\"Token IDs:\")} ${tokenIds.map((id) => id.toString()).join(\", \")}`);\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to fetch owned tokens: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListErc20ListingsOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListErc20Listings(options: ListErc20ListingsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getErc20Listings({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = listings.map((l) => ({\n orderHash: l.orderHash,\n maker: l.maker,\n tokenAddress: l.tokenAddress,\n tokenAmount: l.tokenAmount.toString(),\n price: l.price,\n priceWei: l.priceWei.toString(),\n pricePerToken: l.pricePerToken,\n pricePerTokenWei: l.pricePerTokenWei.toString(),\n currency: l.currency,\n expirationDate: l.expirationDate,\n orderStatus: l.orderStatus,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (listings.length === 0) {\n console.log(chalk.yellow(\"No active ERC-20 listings found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nERC-20 Listings (${listings.length}):\\n`));\n\n for (const listing of listings) {\n const expiry = new Date(listing.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${listing.orderHash}`);\n console.log(` ${chalk.cyan(\"Seller:\")} ${listing.maker}`);\n console.log(` ${chalk.cyan(\"Token:\")} ${listing.tokenAddress}`);\n console.log(` ${chalk.cyan(\"Amount:\")} ${listing.tokenAmount.toString()}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(listing.price)} ${listing.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Price/Token:\")} ${formatEthPrice(listing.pricePerToken)} ${listing.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch ERC-20 listings: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListErc20OffersOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListErc20Offers(options: ListErc20OffersOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getErc20Offers({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = offers.map((o) => ({\n orderHash: o.orderHash,\n maker: o.maker,\n tokenAddress: o.tokenAddress,\n tokenAmount: o.tokenAmount.toString(),\n price: o.price,\n priceWei: o.priceWei.toString(),\n pricePerToken: o.pricePerToken,\n pricePerTokenWei: o.pricePerTokenWei.toString(),\n currency: o.currency,\n expirationDate: o.expirationDate,\n orderStatus: o.orderStatus,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (offers.length === 0) {\n console.log(chalk.yellow(\"No active ERC-20 offers found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nERC-20 Offers (${offers.length}):\\n`));\n\n for (const offer of offers) {\n const expiry = new Date(offer.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${offer.orderHash}`);\n console.log(` ${chalk.cyan(\"Buyer:\")} ${offer.maker}`);\n console.log(` ${chalk.cyan(\"Token:\")} ${offer.tokenAddress}`);\n console.log(` ${chalk.cyan(\"Amount:\")} ${offer.tokenAmount.toString()}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(offer.price)} ${offer.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Price/Token:\")} ${formatEthPrice(offer.pricePerToken)} ${offer.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch ERC-20 offers: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateErc20ListingOptions } from \"./types\";\n\nexport async function executeCreateErc20Listing(options: CreateErc20ListingOptions): Promise<void> {\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n console.log(chalk.blue(\"Preparing ERC-20 listing...\"));\n\n const prepared = await bazaarClient.prepareCreateErc20Listing({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: account.address,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if needed\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing order...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the listing\n console.log(chalk.blue(\"Submitting ERC-20 listing...\"));\n const submitTx = bazaarClient.prepareSubmitErc20Listing(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 listing created successfully!\\n Transaction: ${hash}\\n Token: ${options.tokenAddress}\\n Amount: ${options.tokenAmount}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateErc20ListingOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n const prepared = await bazaarClient.prepareCreateErc20Listing({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateErc20OfferOptions } from \"./types\";\n\nexport async function executeCreateErc20Offer(options: CreateErc20OfferOptions): Promise<void> {\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n console.log(chalk.blue(\"Preparing ERC-20 offer...\"));\n\n const prepared = await bazaarClient.prepareCreateErc20Offer({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: account.address,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if needed (WETH approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing offer...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the offer\n console.log(chalk.blue(\"Submitting ERC-20 offer...\"));\n const submitTx = bazaarClient.prepareSubmitErc20Offer(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 offer created successfully!\\n Transaction: ${hash}\\n Token: ${options.tokenAddress}\\n Amount: ${options.tokenAmount}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateErc20OfferOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n const prepared = await bazaarClient.prepareCreateErc20Offer({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitErc20ListingOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitErc20Listing(options: SubmitErc20ListingOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitErc20Listing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Listing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n console.log(chalk.blue(\"Submitting ERC-20 listing...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`ERC-20 listing submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitErc20ListingOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitErc20Listing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Listing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitErc20OfferOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitErc20Offer(options: SubmitErc20OfferOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitErc20Offer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Offer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n console.log(chalk.blue(\"Submitting ERC-20 offer...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`ERC-20 offer submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitErc20OfferOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitErc20Offer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Offer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { BuyErc20ListingOptions } from \"./types\";\n\nexport async function executeBuyErc20Listing(options: BuyErc20ListingOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching ERC-20 listing...\"));\n\n const listings = await bazaarClient.getErc20Listings({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`ERC-20 listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillErc20Listing(listing, account.address);\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if any\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 listing fulfilled successfully!\\n Transaction: ${hash}\\n Token: ${listing.tokenAddress}\\n Amount: ${listing.tokenAmount.toString()}\\n Price: ${listing.price} ${listing.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to buy ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: BuyErc20ListingOptions): Promise<void> {\n if (!options.buyer) {\n exitWithError(\"--buyer is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const buyerAddress = options.buyer as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getErc20Listings({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`ERC-20 listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillErc20Listing(listing, buyerAddress);\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode buy ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { AcceptErc20OfferOptions } from \"./types\";\n\nexport async function executeAcceptErc20Offer(options: AcceptErc20OfferOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching ERC-20 offers...\"));\n\n const offers = await bazaarClient.getErc20Offers({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`ERC-20 offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillErc20Offer(\n offer,\n account.address\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if any (ERC20 approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 offer accepted successfully!\\n Transaction: ${hash}\\n Token: ${offer.tokenAddress}\\n Amount: ${offer.tokenAmount.toString()}\\n Price: ${offer.price} ${offer.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to accept ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: AcceptErc20OfferOptions): Promise<void> {\n if (!options.seller) {\n exitWithError(\"--seller is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const sellerAddress = options.seller as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getErc20Offers({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`ERC-20 offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillErc20Offer(\n offer,\n sellerAddress\n );\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode accept ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeListListings } from \"./list-listings\";\nimport { executeListOffers } from \"./list-offers\";\nimport { executeListSales } from \"./list-sales\";\nimport { executeCreateListing } from \"./create-listing\";\nimport { executeCreateOffer } from \"./create-offer\";\nimport { executeSubmitListing } from \"./submit-listing\";\nimport { executeSubmitOffer } from \"./submit-offer\";\nimport { executeBuyListing } from \"./buy-listing\";\nimport { executeAcceptOffer } from \"./accept-offer\";\nimport { executeOwnedNfts } from \"./owned-nfts\";\nimport { executeListErc20Listings } from \"./list-erc20-listings\";\nimport { executeListErc20Offers } from \"./list-erc20-offers\";\nimport { executeCreateErc20Listing } from \"./create-erc20-listing\";\nimport { executeCreateErc20Offer } from \"./create-erc20-offer\";\nimport { executeSubmitErc20Listing } from \"./submit-erc20-listing\";\nimport { executeSubmitErc20Offer } from \"./submit-erc20-offer\";\nimport { executeBuyErc20Listing } from \"./buy-erc20-listing\";\nimport { executeAcceptErc20Offer } from \"./accept-erc20-offer\";\n\nconst chainIdOption = [\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value: string) => parseInt(value, 10),\n] as const;\n\nconst rpcUrlOption = [\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\",\n] as const;\n\nconst privateKeyOption = [\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\",\n] as const;\n\nexport function registerBazaarCommand(program: Command): void {\n const bazaarCommand = program\n .command(\"bazaar\")\n .description(\"Bazaar NFT trading operations\");\n\n const listListingsCommand = new Command(\"list-listings\")\n .description(\"List active NFT listings\")\n .option(\"--nft-address <address>\", \"NFT contract address (optional for cross-collection)\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListListings({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const listOffersCommand = new Command(\"list-offers\")\n .description(\"List active collection offers\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListOffers({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const listSalesCommand = new Command(\"list-sales\")\n .description(\"List recent sales\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListSales({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const createListingCommand = new Command(\"create-listing\")\n .description(\"Create an NFT listing (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--token-id <id>\", \"Token ID to list\")\n .requiredOption(\"--price <eth>\", \"Price in ETH (e.g., 0.1)\")\n .option(\"--target-fulfiller <address>\", \"Make a private listing for this address\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateListing({\n nftAddress: options.nftAddress,\n tokenId: options.tokenId,\n price: options.price,\n targetFulfiller: options.targetFulfiller,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const createOfferCommand = new Command(\"create-offer\")\n .description(\"Create a collection offer (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--price <eth>\", \"Offer price in ETH (e.g., 0.1)\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateOffer({\n nftAddress: options.nftAddress,\n price: options.price,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const submitListingCommand = new Command(\"submit-listing\")\n .description(\"Submit a signed listing (follow-up to create-listing without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-listing output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitListing({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const submitOfferCommand = new Command(\"submit-offer\")\n .description(\"Submit a signed offer (follow-up to create-offer without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-offer output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitOffer({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const buyListingCommand = new Command(\"buy-listing\")\n .description(\"Buy an NFT listing\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the listing to buy\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(\"--buyer <address>\", \"Buyer address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeBuyListing({\n orderHash: options.orderHash,\n nftAddress: options.nftAddress,\n buyer: options.buyer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const acceptOfferCommand = new Command(\"accept-offer\")\n .description(\"Accept a collection offer by selling your NFT\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the offer to accept\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--token-id <id>\", \"Token ID to sell\")\n .option(\"--seller <address>\", \"Seller address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeAcceptOffer({\n orderHash: options.orderHash,\n nftAddress: options.nftAddress,\n tokenId: options.tokenId,\n seller: options.seller,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const ownedNftsCommand = new Command(\"owned-nfts\")\n .description(\"List NFTs owned by an address\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--owner <address>\", \"Owner address to check\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .option(\"--start-token-id <id>\", \"Start of token ID range (default: 0)\")\n .option(\"--end-token-id <id>\", \"End of token ID range (default: 10000)\")\n .action(async (options) => {\n await executeOwnedNfts({\n nftAddress: options.nftAddress,\n owner: options.owner,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n startTokenId: options.startTokenId,\n endTokenId: options.endTokenId,\n });\n });\n\n // ERC-20 commands\n\n const listErc20ListingsCommand = new Command(\"list-erc20-listings\")\n .description(\"List active ERC-20 token listings\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListErc20Listings({\n tokenAddress: options.tokenAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const listErc20OffersCommand = new Command(\"list-erc20-offers\")\n .description(\"List active ERC-20 token offers\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListErc20Offers({\n tokenAddress: options.tokenAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const createErc20ListingCommand = new Command(\"create-erc20-listing\")\n .description(\"Create an ERC-20 token listing (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .requiredOption(\"--token-amount <amount>\", \"Token amount in raw units (bigint string)\")\n .requiredOption(\"--price <eth>\", \"Total price in ETH for the token amount\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateErc20Listing({\n tokenAddress: options.tokenAddress,\n tokenAmount: options.tokenAmount,\n price: options.price,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const createErc20OfferCommand = new Command(\"create-erc20-offer\")\n .description(\"Create an ERC-20 token offer (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .requiredOption(\"--token-amount <amount>\", \"Token amount in raw units (bigint string)\")\n .requiredOption(\"--price <eth>\", \"Total price in ETH for the token amount\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateErc20Offer({\n tokenAddress: options.tokenAddress,\n tokenAmount: options.tokenAmount,\n price: options.price,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const submitErc20ListingCommand = new Command(\"submit-erc20-listing\")\n .description(\"Submit a signed ERC-20 listing (follow-up to create-erc20-listing without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-erc20-listing output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitErc20Listing({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const submitErc20OfferCommand = new Command(\"submit-erc20-offer\")\n .description(\"Submit a signed ERC-20 offer (follow-up to create-erc20-offer without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-erc20-offer output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitErc20Offer({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const buyErc20ListingCommand = new Command(\"buy-erc20-listing\")\n .description(\"Buy an ERC-20 token listing\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the listing to buy\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(\"--buyer <address>\", \"Buyer address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeBuyErc20Listing({\n orderHash: options.orderHash,\n tokenAddress: options.tokenAddress,\n buyer: options.buyer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const acceptErc20OfferCommand = new Command(\"accept-erc20-offer\")\n .description(\"Accept an ERC-20 token offer by selling your tokens\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the offer to accept\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(\"--seller <address>\", \"Seller address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeAcceptErc20Offer({\n orderHash: options.orderHash,\n tokenAddress: options.tokenAddress,\n seller: options.seller,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n bazaarCommand.addCommand(listListingsCommand);\n bazaarCommand.addCommand(listOffersCommand);\n bazaarCommand.addCommand(listSalesCommand);\n bazaarCommand.addCommand(createListingCommand);\n bazaarCommand.addCommand(createOfferCommand);\n bazaarCommand.addCommand(submitListingCommand);\n bazaarCommand.addCommand(submitOfferCommand);\n bazaarCommand.addCommand(buyListingCommand);\n bazaarCommand.addCommand(acceptOfferCommand);\n bazaarCommand.addCommand(ownedNftsCommand);\n bazaarCommand.addCommand(listErc20ListingsCommand);\n bazaarCommand.addCommand(listErc20OffersCommand);\n bazaarCommand.addCommand(createErc20ListingCommand);\n bazaarCommand.addCommand(createErc20OfferCommand);\n bazaarCommand.addCommand(submitErc20ListingCommand);\n bazaarCommand.addCommand(submitErc20OfferCommand);\n bazaarCommand.addCommand(buyErc20ListingCommand);\n bazaarCommand.addCommand(acceptErc20OfferCommand);\n}\n","import chalk from \"chalk\";\nimport type { NetMessage, RegisteredFeed, RegisteredAgent } from \"@net-protocol/feeds\";\nimport {\n feedUrl as buildFeedUrl,\n postPermalink,\n profileUrl as buildProfileUrl,\n walletUrl as buildWalletUrl,\n} from \"../../shared/urls\";\n\n/**\n * Truncate an address for display\n */\nexport function truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Format a timestamp as ISO date string\n */\nexport function formatTimestamp(timestamp: number | bigint): string {\n return new Date(Number(timestamp) * 1000).toISOString().replace(\"T\", \" \").slice(0, 19);\n}\n\n/** Parse topic to get clean feed name and whether it's a comment */\nfunction parseTopic(topic: string): { feedName: string; isComment: boolean } {\n const commentMatch = topic.match(/^(.+?):comments:/);\n if (commentMatch) {\n return { feedName: commentMatch[1], isComment: true };\n }\n return { feedName: topic, isComment: false };\n}\n\ninterface FormatPostOptions {\n commentCount?: number;\n showTopic?: boolean;\n}\n\n/**\n * Format a post for human-readable output\n */\nexport function formatPost(\n post: NetMessage,\n index: number,\n options: FormatPostOptions = {}\n): string {\n const { commentCount, showTopic } = options;\n const timestamp = formatTimestamp(post.timestamp);\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.gray(timestamp)}`,\n ` ${chalk.white(\"Sender:\")} ${post.sender}`,\n ` ${chalk.white(\"Text:\")} ${post.text}`,\n ];\n\n if (showTopic && post.topic) {\n const { feedName, isComment } = parseTopic(post.topic);\n const prefix = isComment ? \"Comment on\" : \"Feed\";\n lines.push(` ${chalk.white(prefix + \":\")} ${chalk.magenta(feedName)}`);\n }\n\n if (commentCount !== undefined) {\n lines.push(` ${chalk.white(\"Comments:\")} ${commentCount}`);\n }\n\n if (post.data && post.data !== \"0x\") {\n lines.push(` ${chalk.white(\"Data:\")} ${post.data}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a feed for human-readable output\n */\nexport function formatFeed(feed: RegisteredFeed, index: number): string {\n const timestamp = formatTimestamp(feed.timestamp);\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.white(feed.feedName)}`,\n ` ${chalk.gray(\"Registrant:\")} ${feed.registrant}`,\n ` ${chalk.gray(\"Registered:\")} ${timestamp}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a comment for human-readable output with indentation\n */\nexport function formatComment(\n comment: NetMessage,\n depth: number\n): string {\n const indent = \" \".repeat(depth + 1);\n const timestamp = formatTimestamp(comment.timestamp);\n const lines = [\n `${indent}${chalk.gray(timestamp)} ${chalk.blue(truncateAddress(comment.sender))}`,\n `${indent}${comment.text}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Strip the on-chain \"feed-\" topic prefix to get a display feed name.\n */\nfunction stripFeedPrefix(topic: string): string {\n const match = topic.match(/^(.+?):comments:/);\n const base = match ? match[1] : topic;\n return base.replace(/^feed-/i, \"\");\n}\n\ninterface PostJsonOptions {\n chainId: number;\n /**\n * Absolute index in the topic-filtered stream (when this post was fetched\n * via a topic filter, e.g. `botchan read general`).\n */\n topicIndex?: number;\n /**\n * Absolute index in the maker-filtered stream (when this post was fetched\n * via a sender filter, e.g. `botchan posts <address>`).\n */\n userIndex?: number;\n /**\n * Global Net message index (most reliable URL form when known — typically\n * available after a transaction via the MessageSent log).\n */\n globalIndex?: number;\n commentCount?: number;\n}\n\n/**\n * Convert a post to JSON format with ready-to-use URLs.\n *\n * Every URL field is pre-built using the chainId so AI agents reading this\n * output never need to construct URLs from parts.\n */\nexport function postToJson(\n post: NetMessage,\n options: PostJsonOptions\n): Record<string, unknown> {\n const { chainId, topicIndex, userIndex, globalIndex, commentCount } = options;\n const feedName = stripFeedPrefix(post.topic);\n const postId = `${post.sender}:${post.timestamp}`;\n\n const permalink = postPermalink(chainId, {\n globalIndex,\n topic: post.topic,\n topicIndex,\n user: userIndex !== undefined ? post.sender : undefined,\n userIndex,\n });\n\n const result: Record<string, unknown> = {\n postId,\n permalink,\n sender: post.sender,\n senderProfileUrl: buildProfileUrl(chainId, post.sender),\n senderWalletUrl: buildWalletUrl(chainId, post.sender),\n text: post.text,\n timestamp: Number(post.timestamp),\n feed: feedName,\n feedUrl: buildFeedUrl(chainId, feedName),\n topic: post.topic,\n };\n\n if (topicIndex !== undefined) result.topicIndex = topicIndex;\n if (userIndex !== undefined) result.userIndex = userIndex;\n if (globalIndex !== undefined) result.globalIndex = globalIndex;\n if (commentCount !== undefined) result.commentCount = commentCount;\n if (post.data && post.data !== \"0x\") result.data = post.data;\n\n return result;\n}\n\n/**\n * Convert a feed to JSON format\n */\nexport function feedToJson(\n feed: RegisteredFeed,\n index: number,\n chainId?: number\n): Record<string, unknown> {\n const result: Record<string, unknown> = {\n index,\n feedName: feed.feedName,\n registrant: feed.registrant,\n timestamp: feed.timestamp,\n };\n if (chainId !== undefined) {\n result.feedUrl = buildFeedUrl(chainId, feed.feedName);\n }\n return result;\n}\n\ninterface CommentJsonOptions {\n chainId: number;\n depth: number;\n /**\n * Permalink to the parent post (with `?topic=...&index=...`). When\n * provided, a per-comment `permalink` is built by appending\n * `&commentId={sender}-{timestamp}`.\n */\n parentPostUrl?: string | null;\n}\n\n/**\n * Convert a comment to JSON format with ready-to-use URLs.\n */\nexport function commentToJson(\n comment: NetMessage,\n options: CommentJsonOptions\n): Record<string, unknown> {\n const { chainId, depth, parentPostUrl } = options;\n const commentParam = `${comment.sender}-${comment.timestamp}`;\n const permalink = parentPostUrl\n ? `${parentPostUrl}${parentPostUrl.includes(\"?\") ? \"&\" : \"?\"}commentId=${commentParam}`\n : null;\n\n const result: Record<string, unknown> = {\n commentId: `${comment.sender}:${comment.timestamp}`,\n permalink,\n sender: comment.sender,\n senderProfileUrl: buildProfileUrl(chainId, comment.sender),\n text: comment.text,\n timestamp: Number(comment.timestamp),\n depth,\n };\n if (comment.data !== \"0x\") {\n result.data = comment.data;\n }\n return result;\n}\n\n/**\n * Format an agent for human-readable output\n */\nexport function formatAgent(agent: RegisteredAgent, index: number): string {\n const timestamp = formatTimestamp(agent.timestamp);\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.white(agent.address)}`,\n ` ${chalk.gray(\"Registered:\")} ${timestamp}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Convert an agent to JSON format\n */\nexport function agentToJson(\n agent: RegisteredAgent,\n index: number,\n chainId?: number\n): Record<string, unknown> {\n const result: Record<string, unknown> = {\n index,\n address: agent.address,\n timestamp: agent.timestamp,\n };\n if (chainId !== undefined) {\n result.profileUrl = buildProfileUrl(chainId, agent.address);\n result.walletUrl = buildWalletUrl(chainId, agent.address);\n }\n return result;\n}\n\n/**\n * Print JSON data to stdout\n */\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { RegisteredFeed } from \"@net-protocol/feeds\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedRegistryClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { formatFeed, feedToJson, printJson } from \"./format\";\n\ninterface ListOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the feed list command\n */\nasync function executeFeedList(options: ListOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedRegistryClient(readOnlyOptions);\n\n try {\n const feeds = await client.getRegisteredFeeds({\n maxFeeds: options.limit ?? 50,\n });\n\n if (options.json) {\n printJson(\n feeds.map((feed: RegisteredFeed, i: number) =>\n feedToJson(feed, i, readOnlyOptions.chainId)\n )\n );\n } else {\n if (feeds.length === 0) {\n console.log(chalk.yellow(\"No registered feeds found\"));\n return;\n }\n\n console.log(chalk.white(`Found ${feeds.length} registered feed(s):\\n`));\n feeds.forEach((feed: RegisteredFeed, i: number) => {\n console.log(formatFeed(feed, i));\n if (i < feeds.length - 1) {\n console.log(); // Empty line between feeds\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch feeds: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed list subcommand\n */\nexport function registerFeedListCommand(parent: Command, commandName = \"list\"): void {\n parent\n .command(commandName)\n .description(\"List registered feeds\")\n .option(\n \"--limit <n>\",\n \"Maximum number of feeds to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeFeedList(options);\n });\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\ninterface FeedState {\n lastSeenTimestamp: number;\n}\n\nexport type HistoryEntryType = \"post\" | \"comment\" | \"register\";\n\nexport interface HistoryEntry {\n type: HistoryEntryType;\n timestamp: number; // Unix timestamp (local time when action was taken)\n txHash: string;\n chainId: number;\n feed: string;\n sender?: string; // The agent's address (for constructing post IDs)\n text?: string; // Message content (for posts/comments)\n postId?: string; // For comments, the post being replied to\n}\n\ninterface AppState {\n feeds: Record<string, FeedState>;\n myAddress?: string;\n history?: HistoryEntry[];\n}\n\nconst MAX_HISTORY_ENTRIES = 100;\n\n// Keep state directory as ~/.botchan/ for backward compat\nconst STATE_DIR = path.join(os.homedir(), \".botchan\");\nconst STATE_FILE = path.join(STATE_DIR, \"state.json\");\n\nfunction ensureStateDir(): void {\n if (!fs.existsSync(STATE_DIR)) {\n fs.mkdirSync(STATE_DIR, { recursive: true });\n }\n}\n\nfunction loadState(): AppState {\n try {\n if (fs.existsSync(STATE_FILE)) {\n const data = fs.readFileSync(STATE_FILE, \"utf-8\");\n return JSON.parse(data);\n }\n } catch {\n // If file is corrupted, start fresh\n }\n return { feeds: {} };\n}\n\nfunction saveState(state: AppState): void {\n ensureStateDir();\n // Atomic write: write to temp file, then rename\n const tempFile = `${STATE_FILE}.tmp`;\n fs.writeFileSync(tempFile, JSON.stringify(state, null, 2));\n fs.renameSync(tempFile, STATE_FILE);\n}\n\n/**\n * Get the last seen timestamp for a feed\n */\nexport function getLastSeenTimestamp(feedName: string): number | null {\n const state = loadState();\n return state.feeds[feedName]?.lastSeenTimestamp ?? null;\n}\n\n/**\n * Update the last seen timestamp for a feed\n */\nexport function setLastSeenTimestamp(feedName: string, timestamp: number): void {\n const state = loadState();\n if (!state.feeds[feedName]) {\n state.feeds[feedName] = { lastSeenTimestamp: timestamp };\n } else {\n state.feeds[feedName].lastSeenTimestamp = timestamp;\n }\n saveState(state);\n}\n\n/**\n * Mark a feed as seen up to the latest post timestamp\n */\nexport function markFeedSeen(feedName: string, posts: { timestamp: bigint }[]): void {\n if (posts.length === 0) return;\n\n // Find the max timestamp\n const maxTimestamp = posts.reduce(\n (max, post) => (post.timestamp > max ? post.timestamp : max),\n posts[0].timestamp\n );\n\n setLastSeenTimestamp(feedName, Number(maxTimestamp));\n}\n\n/**\n * Get the configured \"my address\" for filtering own posts\n */\nexport function getMyAddress(): string | null {\n const state = loadState();\n return state.myAddress ?? null;\n}\n\n/**\n * Set the \"my address\" for filtering own posts\n */\nexport function setMyAddress(address: string): void {\n const state = loadState();\n state.myAddress = address.toLowerCase();\n saveState(state);\n}\n\n/**\n * Clear the \"my address\"\n */\nexport function clearMyAddress(): void {\n const state = loadState();\n delete state.myAddress;\n saveState(state);\n}\n\n/**\n * Get full state (for debugging)\n */\nexport function getFullState(): AppState {\n return loadState();\n}\n\n/**\n * Reset all state (delete the state file)\n */\nexport function resetState(): void {\n if (fs.existsSync(STATE_FILE)) {\n fs.unlinkSync(STATE_FILE);\n }\n}\n\n/**\n * Get the state file path (for display purposes)\n */\nexport function getStateFilePath(): string {\n return STATE_FILE;\n}\n\n/**\n * Add an entry to the agent's history\n * Keeps only the most recent MAX_HISTORY_ENTRIES entries\n */\nexport function addHistoryEntry(entry: Omit<HistoryEntry, \"timestamp\">): void {\n const state = loadState();\n const history = state.history ?? [];\n\n const newEntry: HistoryEntry = {\n ...entry,\n timestamp: Math.floor(Date.now() / 1000),\n };\n\n // Add to beginning (most recent first)\n history.unshift(newEntry);\n\n // Trim to max size\n if (history.length > MAX_HISTORY_ENTRIES) {\n history.length = MAX_HISTORY_ENTRIES;\n }\n\n state.history = history;\n saveState(state);\n}\n\n/**\n * Get the agent's history\n * Returns entries in reverse chronological order (most recent first)\n */\nexport function getHistory(limit?: number): HistoryEntry[] {\n const state = loadState();\n const history = state.history ?? [];\n return limit ? history.slice(0, limit) : history;\n}\n\n/**\n * Get history entries of a specific type\n */\nexport function getHistoryByType(\n type: HistoryEntryType,\n limit?: number\n): HistoryEntry[] {\n const history = getHistory();\n const filtered = history.filter((entry) => entry.type === type);\n return limit ? filtered.slice(0, limit) : filtered;\n}\n\n/**\n * Clear all history\n */\nexport function clearHistory(): void {\n const state = loadState();\n state.history = [];\n saveState(state);\n}\n\n/**\n * Get history count\n */\nexport function getHistoryCount(): number {\n const state = loadState();\n return state.history?.length ?? 0;\n}\n\n/**\n * Check if a feed name is a wallet address (i.e., a direct message)\n */\nexport function isWalletAddress(feed: string): boolean {\n return /^0x[a-fA-F0-9]{40}$/.test(feed);\n}\n\n/**\n * Contact info derived from history\n */\nexport interface Contact {\n address: string;\n lastInteraction: number;\n interactionCount: number;\n firstInteraction: number;\n}\n\n/**\n * Get contacts - wallet addresses you've posted to (DMs)\n * Returns contacts sorted by last interaction (most recent first)\n */\nexport function getContacts(): Contact[] {\n const history = getHistory();\n const contactMap = new Map<string, Contact>();\n\n // Only look at posts (not comments) to wallet addresses\n for (const entry of history) {\n if (entry.type === \"post\" && isWalletAddress(entry.feed)) {\n const address = entry.feed.toLowerCase();\n const existing = contactMap.get(address);\n\n if (existing) {\n existing.interactionCount++;\n // Update first/last interaction times\n if (entry.timestamp > existing.lastInteraction) {\n existing.lastInteraction = entry.timestamp;\n }\n if (entry.timestamp < existing.firstInteraction) {\n existing.firstInteraction = entry.timestamp;\n }\n } else {\n contactMap.set(address, {\n address,\n lastInteraction: entry.timestamp,\n firstInteraction: entry.timestamp,\n interactionCount: 1,\n });\n }\n }\n }\n\n // Sort by last interaction (most recent first)\n return Array.from(contactMap.values()).sort(\n (a, b) => b.lastInteraction - a.lastInteraction\n );\n}\n\n/**\n * Feed activity info derived from history\n */\nexport interface FeedActivity {\n feed: string;\n postCount: number;\n commentCount: number;\n lastActivity: number;\n firstActivity: number;\n}\n\n/**\n * Get feeds the agent has been active in\n * Returns feeds sorted by last activity (most recent first)\n * Excludes wallet addresses (those are contacts, not feeds)\n */\nexport function getActiveFeeds(): FeedActivity[] {\n const history = getHistory();\n const feedMap = new Map<string, FeedActivity>();\n\n for (const entry of history) {\n // Skip wallet addresses - those are contacts\n if (isWalletAddress(entry.feed)) continue;\n // Skip feed registrations - only count actual posts/comments\n if (entry.type === \"register\") continue;\n\n const feedName = entry.feed.toLowerCase();\n const existing = feedMap.get(feedName);\n\n if (existing) {\n if (entry.type === \"post\") existing.postCount++;\n if (entry.type === \"comment\") existing.commentCount++;\n if (entry.timestamp > existing.lastActivity) {\n existing.lastActivity = entry.timestamp;\n }\n if (entry.timestamp < existing.firstActivity) {\n existing.firstActivity = entry.timestamp;\n }\n } else {\n feedMap.set(feedName, {\n feed: feedName,\n postCount: entry.type === \"post\" ? 1 : 0,\n commentCount: entry.type === \"comment\" ? 1 : 0,\n lastActivity: entry.timestamp,\n firstActivity: entry.timestamp,\n });\n }\n }\n\n // Sort by last activity (most recent first)\n return Array.from(feedMap.values()).sort(\n (a, b) => b.lastActivity - a.lastActivity\n );\n}\n","/**\n * Normalize a feed name to lowercase for consistency.\n */\nexport function normalizeFeedName(feed: string): string {\n return feed.toLowerCase();\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { NetMessage } from \"@net-protocol/feeds\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { getLastSeenTimestamp, markFeedSeen, getMyAddress } from \"../../shared/state\";\nimport { formatPost, postToJson, printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface ReadOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n sender?: string;\n unseen?: boolean;\n markSeen?: boolean;\n}\n\n/**\n * Execute the feed read command\n */\nasync function executeFeedRead(feed: string, options: ReadOptions): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n const limit = options.limit ?? 20;\n\n try {\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No posts found in feed \"${normalizedFeed}\"`));\n }\n return;\n }\n\n // Fetch more posts if filtering by sender (we need to find enough matches)\n const fetchLimit = options.sender ? Math.max(limit * 5, 100) : limit;\n\n const fetched = await client.getFeedPostsWithIndex({\n topic: normalizedFeed,\n maxPosts: fetchLimit,\n });\n // Pair each post with its absolute topic-stream index so we can build\n // permalinks even after later filtering reorders/removes entries.\n let postsWithIndex: { post: NetMessage; topicIndex: number }[] =\n fetched.messages.map((post, i) => ({\n post,\n topicIndex: fetched.startIndex + i,\n }));\n\n // Filter by sender if specified\n if (options.sender) {\n const senderLower = options.sender.toLowerCase();\n postsWithIndex = postsWithIndex.filter(\n ({ post }) => post.sender.toLowerCase() === senderLower\n );\n // Apply limit after filtering\n postsWithIndex = postsWithIndex.slice(0, limit);\n }\n\n // Filter to unseen posts if --unseen flag is set\n if (options.unseen) {\n const lastSeen = getLastSeenTimestamp(normalizedFeed);\n const myAddress = getMyAddress();\n\n postsWithIndex = postsWithIndex.filter(({ post }) => {\n // Must be newer than last seen (or no last seen = all are unseen)\n const isNew = lastSeen === null || Number(post.timestamp) > lastSeen;\n // Exclude own posts if myAddress is configured\n const isFromOther = !myAddress || post.sender.toLowerCase() !== myAddress;\n return isNew && isFromOther;\n });\n }\n\n const posts = postsWithIndex.map(({ post }) => post);\n\n // Mark feed as seen if --mark-seen flag is set\n // Use the original unfiltered posts to get the true latest timestamp\n if (options.markSeen) {\n const allPosts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: 1, // Just need the latest\n });\n if (allPosts.length > 0) {\n markFeedSeen(normalizedFeed, allPosts);\n }\n }\n\n // Fetch comment counts for each post\n const commentCounts = await Promise.all(\n posts.map((post: NetMessage) => client.getCommentCount(post))\n );\n\n if (options.json) {\n printJson(\n postsWithIndex.map(({ post, topicIndex }, i) =>\n postToJson(post, {\n chainId: readOnlyOptions.chainId,\n topicIndex,\n commentCount: commentCounts[i],\n })\n )\n );\n } else {\n if (posts.length === 0) {\n const senderNote = options.sender ? ` by ${options.sender}` : \"\";\n console.log(chalk.yellow(`No posts found in feed \"${normalizedFeed}\"${senderNote}`));\n return;\n }\n\n const senderNote = options.sender ? ` by ${options.sender}` : \"\";\n console.log(\n chalk.white(`Found ${posts.length} post(s) in feed \"${normalizedFeed}\"${senderNote}:\\n`)\n );\n posts.forEach((post: NetMessage, i: number) => {\n console.log(formatPost(post, i, { commentCount: commentCounts[i] }));\n if (i < posts.length - 1) {\n console.log(); // Empty line between posts\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to read feed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed read subcommand\n */\nexport function registerFeedReadCommand(parent: Command): void {\n parent\n .command(\"read <feed>\")\n .description(\"Read posts from a feed (for group chats, use 'chat read' instead)\")\n .option(\n \"--limit <n>\",\n \"Maximum number of posts to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--sender <address>\", \"Filter posts by sender address\")\n .option(\"--unseen\", \"Only show posts not yet seen (newer than last --mark-seen)\")\n .option(\"--mark-seen\", \"Mark the feed as seen up to the latest post\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (feed, options) => {\n await executeFeedRead(feed, options);\n });\n}\n","import { createWalletClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\n\n/**\n * Create a wallet client from a private key\n */\nexport function createWallet(\n privateKey: `0x${string}`,\n chainId: number,\n rpcUrl?: string\n) {\n const account = privateKeyToAccount(privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId,\n rpcUrl: rpcUrl,\n });\n\n return createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(chainId),\n });\n}\n\n/**\n * Execute a transaction using a wallet client\n */\nexport async function executeTransaction(\n walletClient: ReturnType<typeof createWallet>,\n txConfig: WriteTransactionConfig\n): Promise<`0x${string}`> {\n const hash = await walletClient.writeContract({\n address: txConfig.to,\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n value: txConfig.value,\n chain: null,\n } as Parameters<typeof walletClient.writeContract>[0]);\n\n return hash;\n}\n","import { decodeEventLog } from \"viem\";\nimport {\n getNetContract,\n getPublicClient,\n} from \"@net-protocol/core\";\n\n/**\n * Decode the global Net `MessageSent` indices emitted in a transaction.\n *\n * The Net contract assigns each message a monotonically-increasing global\n * index when the `MessageSent` event fires. That global index is the most\n * reliable input to a permalink (it works regardless of which filter context\n * the post was queried from). This helper waits for the receipt and returns\n * the indices in emission order.\n */\nexport async function getMessageIndicesFromTx(params: {\n chainId: number;\n rpcUrl?: string | string[];\n txHash: `0x${string}`;\n}): Promise<number[]> {\n const publicClient = getPublicClient({\n chainId: params.chainId,\n rpcUrl: params.rpcUrl,\n });\n const netContract = getNetContract(params.chainId);\n const contractAddress = netContract.address.toLowerCase();\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: params.txHash,\n });\n\n const indices: number[] = [];\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() !== contractAddress) continue;\n try {\n const decoded = decodeEventLog({\n abi: netContract.abi,\n data: log.data,\n topics: log.topics,\n });\n if (decoded.eventName === \"MessageSent\") {\n const args = decoded.args as unknown as {\n messageIndex: bigint;\n };\n indices.push(Number(args.messageIndex));\n }\n } catch {\n // Not a MessageSent event — ignore.\n }\n }\n return indices;\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault, parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { addHistoryEntry } from \"../../shared/state\";\nimport { getMessageIndicesFromTx } from \"../../shared/messageIndex\";\nimport {\n explorerTxUrl,\n feedUrl as buildFeedUrl,\n postPermalink,\n profileUrl as buildProfileUrl,\n} from \"../../shared/urls\";\nimport { printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface PostOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n data?: string;\n body?: string;\n json?: boolean;\n}\n\nconst MAX_MESSAGE_LENGTH = 4000;\n\n/**\n * Execute the feed post command\n */\nasync function executeFeedPost(\n feed: string,\n message: string,\n options: PostOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n\n if (message.length === 0) {\n exitWithError(\"Message cannot be empty\");\n }\n\n // If --body is provided, format as title + body\n // The message argument becomes the title, --body becomes the body\n const fullMessage = options.body\n ? `${message}\\n\\n${options.body}`\n : message;\n\n if (fullMessage.length > MAX_MESSAGE_LENGTH) {\n exitWithError(\n `Message too long (${fullMessage.length} chars). Maximum is ${MAX_MESSAGE_LENGTH} characters.`\n );\n }\n\n // For encode-only mode, we don't need a private key\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n const txConfig = client.preparePostToFeed({\n topic: normalizedFeed,\n text: fullMessage,\n data: options.data,\n });\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createFeedClient(commonOptions);\n const txConfig = client.preparePostToFeed({\n topic: normalizedFeed,\n text: fullMessage,\n data: options.data,\n });\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n if (!options.json) {\n console.log(chalk.blue(`Posting to feed \"${normalizedFeed}\"...`));\n }\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n const senderAddress = walletClient.account.address;\n\n // Recover the post ID and the global Net message index from the receipt.\n // The MessageSent event gives us the most reliable index for permalinks.\n let postId: string | undefined;\n let globalIndex: number | undefined;\n try {\n const indices = await getMessageIndicesFromTx({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n txHash: hash,\n });\n globalIndex = indices[0];\n } catch {\n // Non-fatal: we'll still try the legacy fallback below.\n }\n try {\n const posts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: 10,\n });\n const ourPost = posts.find(\n (p) =>\n p.sender.toLowerCase() === senderAddress.toLowerCase() &&\n p.text === fullMessage\n );\n if (ourPost) {\n postId = `${ourPost.sender}:${ourPost.timestamp}`;\n }\n } catch {\n // Non-fatal.\n }\n\n addHistoryEntry({\n type: \"post\",\n txHash: hash,\n chainId: commonOptions.chainId,\n feed: normalizedFeed,\n sender: senderAddress,\n text: fullMessage,\n postId,\n });\n\n const permalink = postPermalink(commonOptions.chainId, {\n globalIndex,\n });\n\n if (options.json) {\n printJson({\n success: true,\n txHash: hash,\n explorerTxUrl: explorerTxUrl(commonOptions.chainId, hash),\n postId,\n globalIndex,\n permalink,\n feed: normalizedFeed,\n feedUrl: buildFeedUrl(commonOptions.chainId, normalizedFeed),\n sender: senderAddress,\n senderProfileUrl: buildProfileUrl(commonOptions.chainId, senderAddress),\n text: fullMessage,\n });\n return;\n }\n\n const displayText = options.body\n ? `${message} (+ body)`\n : message;\n\n const lines = [\n `Message posted successfully!`,\n ` Transaction: ${hash}`,\n ` Feed: ${normalizedFeed}`,\n ];\n if (postId) lines.push(` Post ID: ${postId}`);\n if (permalink) lines.push(` Permalink: ${permalink}`);\n lines.push(` Text: ${displayText}`);\n\n console.log(chalk.green(lines.join(\"\\n\")));\n } catch (error) {\n exitWithError(\n `Failed to post message: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed post subcommand\n */\nexport function registerFeedPostCommand(parent: Command): void {\n parent\n .command(\"post <feed> <message>\")\n .description(\"Post a message to a feed (for group chats, use 'chat send' instead)\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\"--data <data>\", \"Optional data to attach to the post\")\n .option(\"--body <text>\", \"Post body (message becomes the title)\")\n .option(\n \"--json\",\n \"Output structured JSON (includes permalink and other URLs) after submission\"\n )\n .action(async (feed, message, options) => {\n await executeFeedPost(feed, message, options);\n });\n}\n","import type { NetMessage } from \"@net-protocol/feeds\";\n\n/**\n * Create a post ID from a message\n * Format: {sender}:{timestamp}\n */\nexport function createPostId(post: NetMessage): string {\n return `${post.sender}:${post.timestamp}`;\n}\n\n/**\n * Parse a post ID string into sender and timestamp\n * Format: {sender}:{timestamp}\n * @throws Error if the format is invalid\n */\nexport function parsePostId(postId: string): {\n sender: `0x${string}`;\n timestamp: bigint;\n} {\n const parts = postId.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\n `Invalid post ID format. Expected {sender}:{timestamp}, got: ${postId}`\n );\n }\n\n const [sender, timestampStr] = parts;\n\n if (!sender.startsWith(\"0x\") || sender.length !== 42) {\n throw new Error(`Invalid sender address in post ID: ${sender}`);\n }\n\n const timestamp = BigInt(timestampStr);\n if (timestamp <= 0) {\n throw new Error(`Invalid timestamp in post ID: ${timestampStr}`);\n }\n\n return {\n sender: sender as `0x${string}`,\n timestamp,\n };\n}\n\n/**\n * Find a post in a list by its ID components\n */\nexport function findPostByParsedId(\n posts: NetMessage[],\n parsedId: { sender: `0x${string}`; timestamp: bigint }\n): NetMessage | undefined {\n return posts.find(\n (p) =>\n p.sender.toLowerCase() === parsedId.sender.toLowerCase() &&\n p.timestamp === parsedId.timestamp\n );\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault, parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient, createNetClient } from \"../../shared/client\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { parsePostId } from \"../../shared/postId\";\nimport { addHistoryEntry } from \"../../shared/state\";\nimport { getMessageIndicesFromTx } from \"../../shared/messageIndex\";\nimport {\n explorerTxUrl,\n feedUrl as buildFeedUrl,\n postPermalink,\n profileUrl as buildProfileUrl,\n} from \"../../shared/urls\";\nimport { printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface CommentWriteOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n json?: boolean;\n}\n\nconst MAX_MESSAGE_LENGTH = 4000;\n\n/**\n * Execute the feed comment-write command\n */\nasync function executeFeedCommentWrite(\n feed: string,\n postId: string,\n message: string,\n options: CommentWriteOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n\n if (message.length === 0) {\n exitWithError(\"Comment cannot be empty\");\n }\n\n if (message.length > MAX_MESSAGE_LENGTH) {\n exitWithError(\n `Comment too long (${message.length} chars). Maximum is ${MAX_MESSAGE_LENGTH} characters.`\n );\n }\n\n // Parse post ID\n let parsedId: { sender: `0x${string}`; timestamp: bigint };\n try {\n parsedId = parsePostId(postId);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : \"Invalid post ID format\"\n );\n }\n\n // Determine options based on encode-only mode\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n exitWithError(\n `Feed \"${normalizedFeed}\" has no posts. Cannot find post ${postId}.`\n );\n }\n\n // Fetch the target post to get its full data (needed to generate comment\n // topic hash) and its absolute topic-stream index (needed for the parent\n // post permalink we return alongside the comment).\n const fetched = await client.getFeedPostsWithIndex({\n topic: normalizedFeed,\n maxPosts: 100,\n });\n\n const matchOffset = fetched.messages.findIndex(\n (p) =>\n p.sender.toLowerCase() === parsedId.sender.toLowerCase() &&\n p.timestamp === parsedId.timestamp\n );\n const targetPost = matchOffset >= 0 ? fetched.messages[matchOffset] : undefined;\n if (!targetPost) {\n exitWithError(\n `Post not found with ID ${postId} in feed \"${normalizedFeed}\". Make sure the sender and timestamp are correct.`\n );\n }\n const parentTopicIndex = fetched.startIndex + matchOffset;\n\n const txConfig = client.prepareComment({\n post: targetPost,\n text: message,\n });\n\n // For encode-only mode, just output the transaction data\n if (options.encodeOnly) {\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n if (!options.json) {\n console.log(chalk.blue(`Commenting on post ${postId}...`));\n }\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n const senderAddress = walletClient.account.address;\n\n let globalIndex: number | undefined;\n try {\n const indices = await getMessageIndicesFromTx({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n txHash: hash,\n });\n globalIndex = indices[0];\n } catch {\n // Non-fatal.\n }\n\n // Fetch the just-posted comment from chain to get its real on-chain\n // timestamp. We need that exact timestamp to build the deep-link\n // commentId param (`{sender}-{timestamp}`); using local clock time\n // would silently produce a broken URL.\n let commentTimestamp: number | undefined;\n if (globalIndex !== undefined) {\n try {\n const netClient = createNetClient(commonOptions);\n const fetchedComment = await netClient.getMessageAtIndex({\n messageIndex: globalIndex,\n });\n if (fetchedComment) {\n commentTimestamp = Number(fetchedComment.timestamp);\n }\n } catch {\n // Non-fatal — we'll fall back to a permalink without the highlight.\n }\n }\n\n addHistoryEntry({\n type: \"comment\",\n txHash: hash,\n chainId: commonOptions.chainId,\n feed: normalizedFeed,\n sender: senderAddress,\n text: message,\n postId: postId,\n });\n\n // Build permalinks. The parent post URL uses the absolute topic index\n // we recovered from getFeedPostsWithIndex above. The primary `permalink`\n // for the comment is the parent's URL with `&commentId=...` so the\n // deep-link highlights the new comment in context. If we couldn't\n // recover the on-chain timestamp, fall back to `?index={globalIndex}`\n // (which renders the comment as a post — still useful, just no\n // surrounding context).\n const parentPostUrl = postPermalink(commonOptions.chainId, {\n topic: normalizedFeed,\n topicIndex: parentTopicIndex,\n });\n const commentPermalink =\n commentTimestamp !== undefined\n ? postPermalink(commonOptions.chainId, {\n topic: normalizedFeed,\n topicIndex: parentTopicIndex,\n commentId: `${senderAddress}-${commentTimestamp}`,\n })\n : postPermalink(commonOptions.chainId, { globalIndex });\n\n if (options.json) {\n printJson({\n success: true,\n txHash: hash,\n explorerTxUrl: explorerTxUrl(commonOptions.chainId, hash),\n globalIndex,\n permalink: commentPermalink,\n parentPostId: postId,\n parentPostUrl,\n feed: normalizedFeed,\n feedUrl: buildFeedUrl(commonOptions.chainId, normalizedFeed),\n sender: senderAddress,\n senderProfileUrl: buildProfileUrl(commonOptions.chainId, senderAddress),\n text: message,\n ...(commentTimestamp !== undefined && {\n commentId: `${senderAddress}:${commentTimestamp}`,\n }),\n });\n return;\n }\n\n const lines = [\n `Comment posted successfully!`,\n ` Transaction: ${hash}`,\n ` Post: ${postId}`,\n ];\n if (commentPermalink) lines.push(` Permalink: ${commentPermalink}`);\n lines.push(` Comment: ${message}`);\n\n console.log(chalk.green(lines.join(\"\\n\")));\n } catch (error) {\n exitWithError(\n `Failed to post comment: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed comment-write subcommand\n */\nexport function registerFeedCommentWriteCommand(parent: Command): void {\n parent\n .command(\"comment <feed> <post-id> <message>\")\n .description(\n \"Comment on a post. Post ID format: {sender}:{timestamp}\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--json\",\n \"Output structured JSON (includes permalink and other URLs) after submission\"\n )\n .action(async (feed, postId, message, options) => {\n await executeFeedCommentWrite(feed, postId, message, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { NetMessage } from \"@net-protocol/feeds\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { parsePostId } from \"../../shared/postId\";\nimport { postPermalink } from \"../../shared/urls\";\nimport { formatComment, commentToJson, printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface CommentReadOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the feed comment-read command\n */\nasync function executeFeedCommentRead(\n feed: string,\n postId: string,\n options: CommentReadOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n\n // Parse post ID\n let parsedId: { sender: `0x${string}`; timestamp: bigint };\n try {\n parsedId = parsePostId(postId);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : \"Invalid post ID format\"\n );\n }\n\n try {\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n exitWithError(\n `Feed \"${normalizedFeed}\" has no posts. Cannot find post ${postId}.`\n );\n }\n\n // Fetch posts to find the target post (with absolute topic indices so we\n // can build a permalink to the parent post for comment deep-links).\n const fetched = await client.getFeedPostsWithIndex({\n topic: normalizedFeed,\n maxPosts: 100, // Fetch enough to find the post\n });\n\n const matchIndex = fetched.messages.findIndex(\n (p: NetMessage) =>\n p.sender.toLowerCase() === parsedId.sender.toLowerCase() &&\n p.timestamp === parsedId.timestamp\n );\n const targetPost =\n matchIndex >= 0 ? fetched.messages[matchIndex] : undefined;\n if (!targetPost) {\n exitWithError(\n `Post not found with ID ${postId} in feed \"${normalizedFeed}\". Make sure the sender and timestamp are correct.`\n );\n }\n const parentTopicIndex = fetched.startIndex + matchIndex;\n const parentPostUrl = postPermalink(readOnlyOptions.chainId, {\n topic: normalizedFeed,\n topicIndex: parentTopicIndex,\n });\n\n // Check comment count first\n const commentCount = await client.getCommentCount(targetPost);\n\n if (commentCount === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No comments found for post ${postId}`));\n }\n return;\n }\n\n // Fetch comments for the post\n const comments = await client.getComments({\n post: targetPost,\n maxComments: options.limit ?? 50,\n });\n\n // Build a tree structure for nested comments (simplified - flat with depth)\n // For now, we'll display comments flat with depth 0 (top-level)\n const commentsWithDepth = comments.map((comment: NetMessage) => ({\n comment,\n depth: 0,\n }));\n\n if (options.json) {\n printJson(\n commentsWithDepth.map(({ comment, depth }) =>\n commentToJson(comment, {\n chainId: readOnlyOptions.chainId,\n depth,\n parentPostUrl,\n })\n )\n );\n } else {\n if (comments.length === 0) {\n console.log(chalk.yellow(`No comments found for post ${postId}`));\n return;\n }\n\n console.log(\n chalk.white(`Found ${comments.length} comment(s) for post ${postId}:\\n`)\n );\n commentsWithDepth.forEach(({ comment, depth }, i) => {\n console.log(formatComment(comment, depth));\n if (i < commentsWithDepth.length - 1) {\n console.log(); // Empty line between comments\n }\n });\n }\n } catch (error) {\n if ((error as Error).message?.includes(\"Post not found\")) {\n throw error;\n }\n exitWithError(\n `Failed to fetch comments: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed comments subcommand\n */\nexport function registerFeedCommentReadCommand(parent: Command): void {\n parent\n .command(\"comments <feed> <post-id>\")\n .description(\n \"Read comments on a post. Post ID format: {sender}:{timestamp}\"\n )\n .option(\n \"--limit <n>\",\n \"Maximum number of comments to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (feed, postId, options) => {\n await executeFeedCommentRead(feed, postId, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault, parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedRegistryClient } from \"../../shared/client\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { addHistoryEntry } from \"../../shared/state\";\nimport { printJson } from \"./format\";\n\ninterface RegisterOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n}\n\n/**\n * Execute the feed register command\n */\nasync function executeFeedRegister(\n feedName: string,\n options: RegisterOptions\n): Promise<void> {\n // Validate feed name length\n if (feedName.length > 64) {\n exitWithError(\"Feed name cannot exceed 64 characters\");\n }\n\n if (feedName.length === 0) {\n exitWithError(\"Feed name cannot be empty\");\n }\n\n // For encode-only mode, we don't need a private key\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedRegistryClient(readOnlyOptions);\n const txConfig = client.prepareRegisterFeed({ feedName });\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createFeedRegistryClient(commonOptions);\n\n // Check if feed is already registered\n const isRegistered = await client.isFeedRegistered(feedName);\n if (isRegistered) {\n exitWithError(`Feed \"${feedName}\" is already registered`);\n }\n\n const txConfig = client.prepareRegisterFeed({ feedName });\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(`Registering feed \"${feedName}\"...`));\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n\n // Record in history\n addHistoryEntry({\n type: \"register\",\n txHash: hash,\n chainId: commonOptions.chainId,\n feed: feedName,\n sender: walletClient.account.address,\n });\n\n console.log(\n chalk.green(\n `Feed registered successfully!\\n Transaction: ${hash}\\n Feed: ${feedName}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to register feed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed register subcommand\n */\nexport function registerFeedRegisterCommand(parent: Command): void {\n parent\n .command(\"register <feed-name>\")\n .description(\"Register a new feed\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (feedName, options) => {\n await executeFeedRegister(feedName, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { getHistoryByType, type HistoryEntry } from \"../../shared/state\";\nimport { getMessageIndicesFromTx } from \"../../shared/messageIndex\";\nimport {\n explorerTxUrl,\n feedUrl as buildFeedUrl,\n postPermalink,\n profileUrl as buildProfileUrl,\n} from \"../../shared/urls\";\nimport { printJson } from \"./format\";\nimport { formatTimestamp } from \"./format\";\n\ninterface RepliesOptions {\n chainId?: number;\n rpcUrl?: string;\n limit?: number;\n json?: boolean;\n}\n\ninterface PostWithReplies {\n feed: string;\n postId: string;\n text: string;\n postedAt: number;\n commentCount: number;\n permalink: string | null;\n feedUrl: string | null;\n senderProfileUrl: string | null;\n explorerTxUrl: string | null;\n txHash: string;\n}\n\n/**\n * Truncate text for display\n */\nfunction truncateText(text: string, maxLen: number): string {\n if (text.length <= maxLen) return text;\n return text.slice(0, maxLen) + \"...\";\n}\n\n/**\n * Execute the feed replies command\n */\nasync function executeFeedReplies(options: RepliesOptions): Promise<void> {\n // Get recent posts from history that have post IDs\n const postHistory = getHistoryByType(\"post\", options.limit ?? 10);\n const postsWithIds = postHistory.filter(\n (entry): entry is HistoryEntry & { postId: string } => !!entry.postId\n );\n\n if (postsWithIds.length === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.gray(\"No posts with trackable IDs found in history.\"));\n console.log(\n chalk.gray(\"Post IDs are captured when you post with a wallet.\")\n );\n }\n return;\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n\n if (!options.json) {\n console.log(chalk.blue(`Checking replies on ${postsWithIds.length} posts...\\n`));\n }\n\n const results: PostWithReplies[] = [];\n\n for (const entry of postsWithIds) {\n try {\n // Parse post ID to get sender and timestamp\n const [sender, timestampStr] = entry.postId.split(\":\");\n const timestamp = BigInt(timestampStr);\n\n // Get comment count for this post\n // Construct a minimal post object for the comment count query\n const postObj = {\n sender: sender as `0x${string}`,\n timestamp,\n text: entry.text ?? \"\",\n topic: entry.feed,\n app: \"\" as `0x${string}`,\n data: \"0x\" as `0x${string}`,\n };\n const commentCount = await client.getCommentCount(postObj);\n\n // Recover the global Net message index from the original tx so we can\n // emit a stable permalink. One extra RPC call per post in exchange for\n // a URL the AI can hand back to a human.\n let permalink: string | null = null;\n try {\n const indices = await getMessageIndicesFromTx({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n txHash: entry.txHash as `0x${string}`,\n });\n if (indices[0] !== undefined) {\n permalink = postPermalink(readOnlyOptions.chainId, {\n globalIndex: indices[0],\n });\n }\n } catch {\n // Non-fatal — leave permalink null.\n }\n\n results.push({\n feed: entry.feed,\n postId: entry.postId,\n text: entry.text ?? \"\",\n postedAt: entry.timestamp,\n commentCount: Number(commentCount),\n permalink,\n feedUrl: buildFeedUrl(readOnlyOptions.chainId, entry.feed),\n senderProfileUrl: entry.sender\n ? buildProfileUrl(readOnlyOptions.chainId, entry.sender)\n : null,\n explorerTxUrl: explorerTxUrl(readOnlyOptions.chainId, entry.txHash),\n txHash: entry.txHash,\n });\n } catch {\n // Skip posts we can't check (e.g., if feed no longer exists)\n }\n }\n\n if (options.json) {\n printJson(results);\n return;\n }\n\n // Display results\n const postsWithReplies = results.filter((r: PostWithReplies) => r.commentCount > 0);\n const totalReplies = results.reduce((sum, r) => sum + r.commentCount, 0);\n\n console.log(\n chalk.cyan(\n `Found ${totalReplies} total replies across ${postsWithReplies.length} posts\\n`\n )\n );\n\n if (results.length === 0) {\n console.log(chalk.gray(\"Could not check any posts.\"));\n return;\n }\n\n // Sort by comment count (most replies first)\n results.sort((a: PostWithReplies, b: PostWithReplies) => b.commentCount - a.commentCount);\n\n for (const post of results) {\n const timeAgo = formatTimestamp(post.postedAt);\n const replyText =\n post.commentCount === 0\n ? chalk.gray(\"no replies\")\n : post.commentCount === 1\n ? chalk.green(\"1 reply\")\n : chalk.green(`${post.commentCount} replies`);\n\n console.log(\n `${chalk.white(post.feed)} ${chalk.gray(\"•\")} ${replyText} ${chalk.gray(`• ${timeAgo}`)}`\n );\n console.log(` ${chalk.gray(truncateText(post.text, 60))}`);\n\n if (post.commentCount > 0) {\n console.log(\n chalk.blue(` → netp feed comments ${post.feed} ${post.postId}`)\n );\n }\n console.log(\"\");\n }\n}\n\n/**\n * Register the feed replies subcommand\n */\nexport function registerFeedRepliesCommand(parent: Command): void {\n parent\n .command(\"replies\")\n .description(\"Check for replies on your recent posts\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--limit <n>\", \"Number of recent posts to check (default: 10)\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n await executeFeedReplies(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { NULL_ADDRESS } from \"@net-protocol/core\";\nimport type { NetMessage } from \"@net-protocol/feeds\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { formatPost, postToJson, printJson } from \"./format\";\n\ninterface PostsOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the feed posts command\n */\nasync function executeFeedPosts(\n address: string,\n options: PostsOptions\n): Promise<void> {\n // Validate address format\n if (!address.startsWith(\"0x\") || address.length !== 42) {\n exitWithError(\"Invalid address format. Must be 0x-prefixed, 42 characters\");\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const limit = options.limit ?? 20;\n\n try {\n // Get message count for this user from feeds (app = NULL_ADDRESS)\n const count = await client.getMessageCount({\n filter: {\n appAddress: NULL_ADDRESS as `0x${string}`,\n maker: address as `0x${string}`,\n },\n });\n\n if (count === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No posts found for address ${address}`));\n }\n return;\n }\n\n // Calculate range for fetching\n const startIndex = count > limit ? count - limit : 0;\n\n const messages = await client.getMessages({\n filter: {\n appAddress: NULL_ADDRESS as `0x${string}`,\n maker: address as `0x${string}`,\n },\n startIndex,\n endIndex: count,\n });\n\n if (options.json) {\n printJson(\n messages.map((msg: NetMessage, i: number) =>\n postToJson(msg, {\n chainId: readOnlyOptions.chainId,\n userIndex: startIndex + i,\n })\n )\n );\n } else {\n console.log(\n chalk.white(`Found ${messages.length} post(s) by ${address}:\\n`)\n );\n messages.forEach((msg: NetMessage, i: number) => {\n console.log(formatPost(msg, i, { showTopic: true }));\n if (i < messages.length - 1) {\n console.log(); // Empty line between posts\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch posts: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed posts subcommand\n */\nexport function registerFeedPostsCommand(parent: Command): void {\n parent\n .command(\"posts <address>\")\n .description(\"View posts by an address\")\n .option(\n \"--limit <n>\",\n \"Maximum number of posts to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (address, options) => {\n await executeFeedPosts(address, options);\n });\n}\n","import * as readline from \"readline\";\n\n/**\n * Prompt user for confirmation\n */\nexport async function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N): `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n });\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n getMyAddress,\n setMyAddress,\n clearMyAddress,\n getFullState,\n resetState,\n getStateFilePath,\n getHistoryCount,\n getContacts,\n getActiveFeeds,\n} from \"../../shared/state\";\nimport { formatTimestamp } from \"./format\";\nimport { confirm } from \"./confirm\";\n\ninterface ConfigOptions {\n myAddress?: string;\n clearAddress?: boolean;\n show?: boolean;\n reset?: boolean;\n force?: boolean;\n}\n\n/**\n * Execute the feed config command\n */\nasync function executeFeedConfig(options: ConfigOptions): Promise<void> {\n // Handle --reset\n if (options.reset) {\n const statePath = getStateFilePath();\n console.log(chalk.yellow(`This will delete all stored state at:`));\n console.log(chalk.white(` ${statePath}`));\n console.log(chalk.yellow(`\\nThis includes:`));\n console.log(chalk.white(` - All \"last seen\" timestamps for feeds`));\n console.log(chalk.white(` - Your configured address`));\n console.log(chalk.white(` - Your activity history`));\n\n if (!options.force) {\n const confirmed = await confirm(chalk.red(\"\\nAre you sure you want to reset?\"));\n if (!confirmed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n resetState();\n console.log(chalk.green(\"State reset successfully.\"));\n return;\n }\n\n // Handle --my-address\n if (options.myAddress) {\n // Basic validation\n if (!options.myAddress.match(/^0x[a-fA-F0-9]{40}$/)) {\n console.error(chalk.red(\"Invalid address format. Expected 0x followed by 40 hex characters.\"));\n process.exit(1);\n }\n setMyAddress(options.myAddress);\n console.log(chalk.green(`Set my address to: ${options.myAddress}`));\n return;\n }\n\n // Handle --clear-address\n if (options.clearAddress) {\n clearMyAddress();\n console.log(chalk.green(\"Cleared my address.\"));\n return;\n }\n\n // Default: --show (or no options)\n const state = getFullState();\n const myAddress = getMyAddress();\n\n console.log(chalk.cyan(\"Feed Configuration\\n\"));\n console.log(chalk.white(`State file: ${getStateFilePath()}`));\n console.log(chalk.white(`My address: ${myAddress ?? chalk.gray(\"(not set)\")}`));\n\n const feedCount = Object.keys(state.feeds).length;\n console.log(chalk.white(`Tracked feeds: ${feedCount}`));\n\n const historyCount = getHistoryCount();\n console.log(chalk.white(`History entries: ${historyCount}`));\n\n if (feedCount > 0 && feedCount <= 20) {\n console.log(chalk.gray(\"\\nLast seen timestamps:\"));\n for (const [feed, data] of Object.entries(state.feeds)) {\n const date = new Date(data.lastSeenTimestamp * 1000);\n console.log(chalk.gray(` ${feed}: ${date.toLocaleString()}`));\n }\n } else if (feedCount > 20) {\n console.log(chalk.gray(`\\n(${feedCount} feeds tracked, use --json for full list)`));\n }\n\n // Show active feeds (topics the agent has participated in)\n const activeFeeds = getActiveFeeds();\n if (activeFeeds.length > 0) {\n console.log(chalk.cyan(\"\\nActive Feeds:\"));\n const displayFeeds = activeFeeds.slice(0, 10);\n for (const feed of displayFeeds) {\n const activity = [];\n if (feed.postCount > 0) activity.push(`${feed.postCount} post${feed.postCount !== 1 ? \"s\" : \"\"}`);\n if (feed.commentCount > 0) activity.push(`${feed.commentCount} comment${feed.commentCount !== 1 ? \"s\" : \"\"}`);\n const lastActive = formatTimestamp(feed.lastActivity);\n console.log(chalk.white(` ${feed.feed}`) + chalk.gray(` • ${activity.join(\", \")} • ${lastActive}`));\n }\n if (activeFeeds.length > 10) {\n console.log(chalk.gray(` ... and ${activeFeeds.length - 10} more`));\n }\n }\n\n // Show contacts (wallet addresses the agent has DM'd)\n const contacts = getContacts();\n if (contacts.length > 0) {\n console.log(chalk.cyan(\"\\nRecent Contacts (DMs):\"));\n const displayContacts = contacts.slice(0, 10);\n for (const contact of displayContacts) {\n const truncAddr = `${contact.address.slice(0, 6)}...${contact.address.slice(-4)}`;\n const msgCount = contact.interactionCount;\n const lastActive = formatTimestamp(contact.lastInteraction);\n console.log(\n chalk.white(` ${truncAddr}`) +\n chalk.gray(` • ${msgCount} message${msgCount !== 1 ? \"s\" : \"\"} • ${lastActive}`)\n );\n }\n if (contacts.length > 10) {\n console.log(chalk.gray(` ... and ${contacts.length - 10} more`));\n }\n }\n}\n\n/**\n * Register the feed config subcommand\n */\nexport function registerFeedConfigCommand(parent: Command): void {\n parent\n .command(\"config\")\n .description(\"View or modify feed configuration\")\n .option(\"--my-address <address>\", \"Set your address (to filter out own posts with --unseen)\")\n .option(\"--clear-address\", \"Clear your configured address\")\n .option(\"--show\", \"Show current configuration (default)\")\n .option(\"--reset\", \"Reset all state (clears last-seen timestamps and address)\")\n .option(\"--force\", \"Skip confirmation prompt for --reset\")\n .action(async (options) => {\n await executeFeedConfig(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n getHistory,\n getHistoryByType,\n clearHistory,\n getHistoryCount,\n type HistoryEntry,\n type HistoryEntryType,\n} from \"../../shared/state\";\nimport { formatTimestamp, printJson, truncateAddress } from \"./format\";\nimport { confirm } from \"./confirm\";\nimport {\n explorerTxUrl,\n feedUrl as buildFeedUrl,\n profileUrl as buildProfileUrl,\n} from \"../../shared/urls\";\n\ninterface HistoryOptions {\n limit?: number;\n type?: string;\n json?: boolean;\n clear?: boolean;\n force?: boolean;\n}\n\n/**\n * Format a history entry for human-readable output\n */\nfunction formatHistoryEntry(entry: HistoryEntry, index: number): string {\n const timestamp = formatTimestamp(entry.timestamp);\n const typeColor =\n entry.type === \"post\"\n ? chalk.green\n : entry.type === \"comment\"\n ? chalk.blue\n : chalk.yellow;\n\n const lines = [\n chalk.cyan(`[${index}]`) +\n ` ${chalk.gray(timestamp)} ` +\n typeColor(entry.type.toUpperCase()),\n ` ${chalk.white(\"Feed:\")} ${entry.feed}`,\n ` ${chalk.white(\"Tx:\")} ${entry.txHash}`,\n ];\n\n if (entry.sender) {\n lines.push(` ${chalk.white(\"Sender:\")} ${truncateAddress(entry.sender)}`);\n }\n\n if (entry.text) {\n const truncatedText =\n entry.text.length > 80 ? entry.text.slice(0, 80) + \"...\" : entry.text;\n lines.push(` ${chalk.white(\"Text:\")} ${truncatedText}`);\n }\n\n // Show postId context based on entry type\n if (entry.type === \"post\" && entry.postId) {\n lines.push(` ${chalk.white(\"Post ID:\")} ${entry.postId}`);\n } else if (entry.type === \"comment\" && entry.postId) {\n lines.push(` ${chalk.white(\"Reply to:\")} ${entry.postId}`);\n }\n\n // Show follow-up hint\n if (entry.type === \"post\" && entry.postId) {\n lines.push(\n chalk.gray(` → Check replies: netp feed comments ${entry.feed} ${entry.postId}`)\n );\n } else if (entry.type === \"post\" && entry.sender) {\n lines.push(\n chalk.gray(` → Find post: netp feed read ${entry.feed} --sender ${entry.sender} --json`)\n );\n } else if (entry.type === \"comment\" && entry.postId) {\n lines.push(\n chalk.gray(` → See thread: netp feed comments ${entry.feed} ${entry.postId}`)\n );\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Convert a history entry to JSON format\n */\nfunction historyEntryToJson(\n entry: HistoryEntry,\n index: number\n): Record<string, unknown> {\n // History entries don't carry the topic/global index, so we can't build a\n // post permalink without an extra RPC call per entry. Emit the URLs we can\n // build from the data we have (feed, sender, tx hash) and let callers run\n // `botchan verify-claim <txHash> --json` to recover the post permalink\n // when needed.\n const result: Record<string, unknown> = {\n index,\n type: entry.type,\n timestamp: entry.timestamp,\n txHash: entry.txHash,\n explorerTxUrl: explorerTxUrl(entry.chainId, entry.txHash),\n chainId: entry.chainId,\n feed: entry.feed,\n feedUrl: buildFeedUrl(entry.chainId, entry.feed),\n };\n\n if (entry.sender) {\n result.sender = entry.sender;\n result.senderProfileUrl = buildProfileUrl(entry.chainId, entry.sender);\n }\n\n if (entry.text) {\n result.text = entry.text;\n }\n\n if (entry.postId) {\n result.postId = entry.postId;\n }\n\n return result;\n}\n\n/**\n * Validate history type option\n */\nfunction validateType(type: string): HistoryEntryType {\n const validTypes = [\"post\", \"comment\", \"register\"];\n if (!validTypes.includes(type)) {\n console.error(\n chalk.red(\n `Invalid type \"${type}\". Must be one of: ${validTypes.join(\", \")}`\n )\n );\n process.exit(1);\n }\n return type as HistoryEntryType;\n}\n\n/**\n * Execute the feed history command\n */\nasync function executeFeedHistory(options: HistoryOptions): Promise<void> {\n // Handle --clear\n if (options.clear) {\n const count = getHistoryCount();\n if (count === 0) {\n console.log(chalk.gray(\"History is already empty.\"));\n return;\n }\n\n console.log(chalk.yellow(`This will delete ${count} history entries.`));\n\n if (!options.force) {\n const confirmed = await confirm(\n chalk.red(\"\\nAre you sure you want to clear history?\")\n );\n if (!confirmed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n clearHistory();\n console.log(chalk.green(\"History cleared.\"));\n return;\n }\n\n // Get history entries\n let entries: HistoryEntry[];\n if (options.type) {\n const validType = validateType(options.type);\n entries = getHistoryByType(validType, options.limit);\n } else {\n entries = getHistory(options.limit);\n }\n\n if (entries.length === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.gray(\"No history entries found.\"));\n console.log(\n chalk.gray(\n \"History is recorded when you post, comment, or register feeds.\"\n )\n );\n }\n return;\n }\n\n // Output\n if (options.json) {\n const jsonEntries = entries.map((entry: HistoryEntry, idx: number) =>\n historyEntryToJson(entry, idx)\n );\n printJson(jsonEntries);\n } else {\n const totalCount = getHistoryCount();\n const typeFilter = options.type ? ` (type: ${options.type})` : \"\";\n console.log(\n chalk.cyan(`Feed History${typeFilter} (${entries.length} of ${totalCount})\\n`)\n );\n\n for (let i = 0; i < entries.length; i++) {\n console.log(formatHistoryEntry(entries[i], i));\n if (i < entries.length - 1) {\n console.log(\"\");\n }\n }\n }\n}\n\n/**\n * Register the feed history subcommand\n */\nexport function registerFeedHistoryCommand(parent: Command): void {\n parent\n .command(\"history\")\n .description(\"View feed activity history (posts, comments, registrations)\")\n .option(\"--limit <n>\", \"Limit number of entries\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--type <type>\", \"Filter by type: post, comment, or register\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--clear\", \"Clear all history\")\n .option(\"--force\", \"Skip confirmation prompt for --clear\")\n .action(async (options) => {\n await executeFeedHistory(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault, parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { createAgentRegistryClient } from \"../../shared/client\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { addHistoryEntry } from \"../../shared/state\";\nimport { printJson } from \"./format\";\n\ninterface RegisterAgentOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n}\n\n/**\n * Execute the agent register command\n */\nasync function executeRegisterAgent(\n options: RegisterAgentOptions\n): Promise<void> {\n // For encode-only mode, we don't need a private key\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createAgentRegistryClient(readOnlyOptions);\n const txConfig = client.prepareRegisterAgent();\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createAgentRegistryClient(commonOptions);\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n // Check if already registered\n const isRegistered = await client.isAgentRegistered(walletClient.account.address);\n if (isRegistered) {\n exitWithError(`Address ${walletClient.account.address} is already registered as an agent`);\n }\n\n console.log(chalk.blue(`Registering agent ${walletClient.account.address}...`));\n\n const txConfig = client.prepareRegisterAgent();\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n\n // Record in history\n addHistoryEntry({\n type: \"register\",\n txHash: hash,\n chainId: commonOptions.chainId,\n feed: \"agent-registry\",\n sender: walletClient.account.address,\n });\n\n console.log(\n chalk.green(\n `Agent registered successfully!\\n Transaction: ${hash}\\n Address: ${walletClient.account.address}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to register agent: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the register-agent subcommand\n */\nexport function registerAgentRegisterCommand(parent: Command): void {\n parent\n .command(\"register-agent\")\n .description(\"Register your address on the agent leaderboard\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeRegisterAgent(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { RegisteredAgent } from \"@net-protocol/feeds\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createAgentRegistryClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { formatAgent, agentToJson, printJson } from \"./format\";\n\ninterface ListAgentsOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the list-agents command\n */\nasync function executeListAgents(options: ListAgentsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createAgentRegistryClient(readOnlyOptions);\n\n try {\n const limit = options.limit ?? 100;\n const [totalCount, agents] = await Promise.all([\n client.getRegisteredAgentCount(),\n client.getRegisteredAgents({ maxAgents: limit }),\n ]);\n\n if (options.json) {\n printJson({\n totalCount,\n agents: agents.map((agent: RegisteredAgent, i: number) =>\n agentToJson(agent, i, readOnlyOptions.chainId)\n ),\n });\n } else {\n if (agents.length === 0) {\n console.log(chalk.yellow(\"No registered agents found\"));\n return;\n }\n\n console.log(\n chalk.white(`Registered agents: ${totalCount} total, showing last ${agents.length}:\\n`)\n );\n agents.forEach((agent: RegisteredAgent, i: number) => {\n console.log(formatAgent(agent, i));\n if (i < agents.length - 1) {\n console.log(); // Empty line between agents\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch agents: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the list-agents subcommand\n */\nexport function registerListAgentsCommand(parent: Command, commandName = \"list-agents\"): void {\n parent\n .command(commandName)\n .description(\"List registered agents from the agent registry\")\n .option(\n \"--limit <n>\",\n \"Maximum number of agents to display (default: 100)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListAgents(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { decodeEventLog } from \"viem\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { addHistoryEntry, getHistory } from \"../../shared/state\";\nimport { createPostId } from \"../../shared/postId\";\nimport {\n explorerTxUrl,\n feedUrl as buildFeedUrl,\n postPermalink,\n profileUrl as buildProfileUrl,\n} from \"../../shared/urls\";\nimport { printJson } from \"./format\";\nimport {\n getPublicClient,\n getNetContract,\n} from \"@net-protocol/core\";\nimport {\n isCommentTopic,\n parseCommentData,\n COMMENT_TOPIC_SUFFIX,\n FEED_TOPIC_PREFIX,\n} from \"@net-protocol/feeds\";\n\ninterface VerifyClaimOptions {\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Extract feed name from a topic string.\n * For posts: \"feed-crypto\" -> \"crypto\"\n * For comments: \"feed-crypto:comments:0x...\" -> \"crypto\"\n */\nfunction extractFeedName(topic: string): string {\n const baseTopic = isCommentTopic(topic)\n ? topic.split(COMMENT_TOPIC_SUFFIX)[0]\n : topic;\n return baseTopic.startsWith(FEED_TOPIC_PREFIX)\n ? baseTopic.slice(FEED_TOPIC_PREFIX.length)\n : baseTopic;\n}\n\n/**\n * Execute the feed verify-claim command\n */\nasync function executeFeedVerifyClaim(\n txHash: string,\n options: VerifyClaimOptions\n): Promise<void> {\n if (!txHash.startsWith(\"0x\") || txHash.length !== 66) {\n exitWithError(\n \"Invalid transaction hash format (must be 0x-prefixed, 66 characters)\"\n );\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const publicClient = getPublicClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n const netContract = getNetContract(readOnlyOptions.chainId);\n const netClient = createNetClient(readOnlyOptions);\n\n // Re-derive URL fields even if already recorded, so callers that lost the\n // original --json output can still recover the permalink.\n const wasAlreadyRecorded = getHistory().some(\n (entry) => entry.txHash === txHash\n );\n\n if (wasAlreadyRecorded && !options.json) {\n console.log(\n chalk.yellow(\n \"Transaction already in history — re-deriving URLs from on-chain data.\"\n )\n );\n }\n\n // Fetch transaction receipt\n const receipt = await publicClient\n .getTransactionReceipt({ hash: txHash as `0x${string}` })\n .catch(() =>\n exitWithError(\n \"Could not fetch transaction receipt. Make sure the transaction hash is correct and the transaction has been confirmed.\"\n )\n );\n\n // Filter logs from the Net contract and decode MessageSent events\n const contractAddress = netContract.address.toLowerCase();\n const messageSentEvents: { sender: `0x${string}`; messageIndex: bigint }[] =\n [];\n\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() !== contractAddress) {\n continue;\n }\n\n try {\n const decoded = decodeEventLog({\n abi: netContract.abi,\n data: log.data,\n topics: log.topics,\n });\n\n if (decoded.eventName === \"MessageSent\") {\n const args = decoded.args as unknown as {\n sender: `0x${string}`;\n topic: string;\n messageIndex: bigint;\n };\n messageSentEvents.push({\n sender: args.sender,\n messageIndex: args.messageIndex,\n });\n }\n } catch {\n // Not a MessageSent event, skip\n }\n }\n\n if (messageSentEvents.length === 0) {\n exitWithError(\n \"Transaction does not contain any Net protocol messages.\"\n );\n }\n\n if (!options.json) {\n console.log(\n chalk.blue(\n `Found ${messageSentEvents.length} message(s) in transaction. Fetching details...`\n )\n );\n }\n\n // Fetch all messages in parallel\n const messages = await Promise.all(\n messageSentEvents.map((event) =>\n netClient.getMessageAtIndex({\n messageIndex: Number(event.messageIndex),\n })\n )\n );\n\n type RecoveredEntry = Record<string, unknown>;\n const entries: RecoveredEntry[] = [];\n let recorded = 0;\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n if (!message) {\n if (!options.json) {\n console.log(\n chalk.yellow(\n ` Could not fetch message at index ${messageSentEvents[i].messageIndex}. Skipping.`\n )\n );\n }\n continue;\n }\n\n const globalIndex = Number(messageSentEvents[i].messageIndex);\n const feedName = extractFeedName(message.topic);\n const isComment = isCommentTopic(message.topic);\n\n let type: \"post\" | \"comment\";\n let postId: string | undefined;\n let parentPostId: string | undefined;\n let permalink: string | null = null;\n\n if (isComment) {\n type = \"comment\";\n const commentData = parseCommentData(message.data);\n parentPostId = commentData\n ? `${commentData.parentSender}:${commentData.parentTimestamp}`\n : undefined;\n const commentParam = `${message.sender}-${Number(message.timestamp)}`;\n permalink = postPermalink(readOnlyOptions.chainId, {\n globalIndex,\n commentId: commentParam,\n });\n } else {\n type = \"post\";\n postId = createPostId(message);\n permalink = postPermalink(readOnlyOptions.chainId, { globalIndex });\n }\n\n if (!wasAlreadyRecorded) {\n addHistoryEntry({\n type,\n txHash,\n chainId: readOnlyOptions.chainId,\n feed: feedName,\n sender: message.sender,\n text: message.text,\n postId: type === \"comment\" ? parentPostId : postId,\n });\n recorded++;\n }\n\n const entry: RecoveredEntry = {\n type,\n txHash,\n explorerTxUrl: explorerTxUrl(readOnlyOptions.chainId, txHash),\n globalIndex,\n permalink,\n feed: feedName,\n feedUrl: buildFeedUrl(readOnlyOptions.chainId, feedName),\n sender: message.sender,\n senderProfileUrl: buildProfileUrl(\n readOnlyOptions.chainId,\n message.sender\n ),\n text: message.text,\n timestamp: Number(message.timestamp),\n };\n if (type === \"post\") entry.postId = postId;\n if (type === \"comment\") entry.parentPostId = parentPostId;\n entries.push(entry);\n\n if (!options.json) {\n const label =\n type === \"comment\"\n ? `Verified comment:\\n Feed: ${feedName}\\n Sender: ${message.sender}\\n Text: ${message.text}\\n Parent post: ${parentPostId ?? \"unknown\"}\\n Permalink: ${permalink ?? \"(unavailable)\"}\\n Tx: ${txHash}`\n : `Verified post:\\n Feed: ${feedName}\\n Sender: ${message.sender}\\n Text: ${message.text}\\n Post ID: ${postId}\\n Permalink: ${permalink ?? \"(unavailable)\"}\\n Tx: ${txHash}`;\n console.log(chalk.green(` ${label}`));\n }\n }\n\n if (options.json) {\n printJson({ alreadyRecorded: wasAlreadyRecorded, recorded, entries });\n return;\n }\n\n if (recorded > 0) {\n console.log(\n chalk.green(`\\nSuccessfully recorded ${recorded} history entry(ies).`)\n );\n }\n}\n\n/**\n * Register the feed verify-claim subcommand\n */\nexport function registerFeedVerifyClaimCommand(parent: Command): void {\n parent\n .command(\"verify-claim <tx-hash>\")\n .description(\n \"Verify a transaction and add it to history. Recovers post/comment details from on-chain data.\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\n \"--json\",\n \"Output structured JSON (includes permalink and other URLs)\"\n )\n .action(async (txHash, options) => {\n await executeFeedVerifyClaim(txHash, options);\n });\n}\n","import { Command } from \"commander\";\nimport { registerFeedListCommand } from \"./list\";\nimport { registerFeedReadCommand } from \"./read\";\nimport { registerFeedPostCommand } from \"./post\";\nimport { registerFeedCommentWriteCommand } from \"./comment-write\";\nimport { registerFeedCommentReadCommand } from \"./comment-read\";\nimport { registerFeedRegisterCommand } from \"./register\";\nimport { registerFeedRepliesCommand } from \"./replies\";\nimport { registerFeedPostsCommand } from \"./posts\";\nimport { registerFeedConfigCommand } from \"./config\";\nimport { registerFeedHistoryCommand } from \"./history\";\nimport { registerAgentRegisterCommand } from \"./register-agent\";\nimport { registerListAgentsCommand } from \"./list-agents\";\nimport { registerFeedVerifyClaimCommand } from \"./verify-claim\";\n\n/**\n * Register the feed command group with the commander program\n */\nexport function registerFeedCommand(program: Command): void {\n const feedCommand = program\n .command(\"feed\")\n .description(\"Feed operations (read/write posts, comments, manage feeds)\");\n\n registerFeedListCommand(feedCommand);\n registerFeedReadCommand(feedCommand);\n registerFeedPostCommand(feedCommand);\n registerFeedCommentWriteCommand(feedCommand);\n registerFeedCommentReadCommand(feedCommand);\n registerFeedRegisterCommand(feedCommand);\n registerFeedRepliesCommand(feedCommand);\n registerFeedPostsCommand(feedCommand);\n registerFeedConfigCommand(feedCommand);\n registerFeedHistoryCommand(feedCommand);\n registerAgentRegisterCommand(feedCommand);\n registerListAgentsCommand(feedCommand);\n registerFeedVerifyClaimCommand(feedCommand);\n}\n\n// Re-export individual command registrations for botchan wrapper\nexport { registerFeedListCommand } from \"./list\";\nexport { registerFeedReadCommand } from \"./read\";\nexport { registerFeedPostCommand } from \"./post\";\nexport { registerFeedCommentWriteCommand } from \"./comment-write\";\nexport { registerFeedCommentReadCommand } from \"./comment-read\";\nexport { registerFeedRegisterCommand } from \"./register\";\nexport { registerFeedRepliesCommand } from \"./replies\";\nexport { registerFeedPostsCommand } from \"./posts\";\nexport { registerFeedConfigCommand } from \"./config\";\nexport { registerFeedHistoryCommand } from \"./history\";\nexport { registerAgentRegisterCommand } from \"./register-agent\";\nexport { registerListAgentsCommand } from \"./list-agents\";\nexport { registerFeedVerifyClaimCommand } from \"./verify-claim\";\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { createPublicClient, http, parseEther } from \"viem\";\nimport {\n parseReadOnlyOptionsWithDefault,\n parseCommonOptionsWithDefault,\n} from \"../../cli/shared\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n discoverTokenPool,\n getTokenScoreKey,\n encodePoolKey,\n UPVOTE_APP,\n PURE_ALPHA_STRATEGY,\n DYNAMIC_SPLIT_STRATEGY,\n UNIV234_POOLS_STRATEGY,\n UPVOTE_PRICE_ETH,\n} from \"@net-protocol/score\";\nimport type { UpvoteTokenOptions } from \"./types\";\n\nasync function executeUpvoteToken(options: UpvoteTokenOptions): Promise<void> {\n const count = parseInt(options.count, 10);\n if (isNaN(count) || count <= 0) {\n exitWithError(\"Count must be a positive integer\");\n return;\n }\n\n const tokenAddress = options.tokenAddress;\n if (!tokenAddress.startsWith(\"0x\") || tokenAddress.length !== 42) {\n exitWithError(\n \"Invalid token address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n // Read-only options for pool discovery (always needed)\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Create public client for pool discovery\n const rpcUrls = getChainRpcUrls({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n const publicClient = createPublicClient({\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Discovering Uniswap pool for token...\"));\n\n let poolResult;\n try {\n poolResult = await discoverTokenPool({\n publicClient,\n tokenAddress,\n chainId: readOnlyOptions.chainId,\n });\n } catch (error) {\n exitWithError(\n `Failed to discover token pool: ${error instanceof Error ? error.message : String(error)}`\n );\n return;\n }\n\n // Determine strategy\n let strategyAddress: `0x${string}`;\n let storedContext: `0x${string}`;\n\n if (!poolResult || !poolResult.poolKey) {\n // No pool found → pure alpha\n strategyAddress = PURE_ALPHA_STRATEGY.address;\n storedContext = \"0x\";\n console.log(chalk.yellow(\"No pool found — using Pure Alpha strategy\"));\n } else if (options.splitType === \"50/50\") {\n // Pool found + 50/50 override → UNIV234_POOLS_STRATEGY\n strategyAddress = UNIV234_POOLS_STRATEGY.address;\n storedContext = encodePoolKey(poolResult.poolKey);\n console.log(\n chalk.green(\n `Pool found (fee: ${poolResult.fee}) — using 50/50 Pools strategy`\n )\n );\n } else {\n // Pool found + default/dynamic → DYNAMIC_SPLIT_STRATEGY\n strategyAddress = DYNAMIC_SPLIT_STRATEGY.address;\n storedContext = encodePoolKey(poolResult.poolKey);\n console.log(\n chalk.green(\n `Pool found (fee: ${poolResult.fee}) — using Dynamic Split strategy`\n )\n );\n }\n\n // Build transaction config\n const scoreKey = getTokenScoreKey(tokenAddress);\n const value = parseEther((count * UPVOTE_PRICE_ETH).toString());\n\n const txConfig = {\n to: UPVOTE_APP.address,\n abi: UPVOTE_APP.abi,\n functionName: \"upvote\" as const,\n args: [strategyAddress, scoreKey, count, storedContext, \"0x\"],\n value,\n };\n\n if (options.encodeOnly) {\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Execute transaction\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(\n chalk.blue(`Submitting ${count} upvote(s) for ${tokenAddress}...`)\n );\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n\n console.log(chalk.green(`Upvote submitted successfully!`));\n console.log(chalk.white(` Transaction: ${hash}`));\n console.log(chalk.white(` Token: ${tokenAddress}`));\n console.log(chalk.white(` Count: ${count}`));\n console.log(\n chalk.white(` Value: ${(count * UPVOTE_PRICE_ETH).toFixed(6)} ETH`)\n );\n } catch (error) {\n exitWithError(\n `Failed to submit upvote: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerUpvoteTokenCommand(\n parent: Command,\n commandName = \"token\"\n): void {\n parent\n .command(commandName)\n .description(\"Upvote a token on Net Protocol\")\n .requiredOption(\n \"--token-address <address>\",\n \"Token contract address to upvote\"\n )\n .requiredOption(\"--count <n>\", \"Number of upvotes\")\n .option(\n \"--split-type <type>\",\n 'Strategy split type: \"dynamic\" (default) or \"50/50\"'\n )\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeUpvoteToken(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { tokenUrl as buildTokenUrl } from \"../../shared/urls\";\nimport {\n ScoreClient,\n getTokenScoreKey,\n ALL_STRATEGY_ADDRESSES,\n PURE_ALPHA_STRATEGY,\n UNIV234_POOLS_STRATEGY,\n DYNAMIC_SPLIT_STRATEGY,\n} from \"@net-protocol/score\";\nimport type { GetUpvotesOptions } from \"./types\";\n\nfunction getStrategyName(address: string): string {\n const lower = address.toLowerCase();\n if (lower === PURE_ALPHA_STRATEGY.address.toLowerCase()) return \"Pure Alpha\";\n if (lower === UNIV234_POOLS_STRATEGY.address.toLowerCase())\n return \"50/50 Pools\";\n if (lower === DYNAMIC_SPLIT_STRATEGY.address.toLowerCase())\n return \"Dynamic Split\";\n return address;\n}\n\nasync function executeGetUpvotes(options: GetUpvotesOptions): Promise<void> {\n const tokenAddress = options.tokenAddress;\n if (!tokenAddress.startsWith(\"0x\") || tokenAddress.length !== 42) {\n exitWithError(\n \"Invalid token address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new ScoreClient({\n chainId: readOnlyOptions.chainId,\n overrides: readOnlyOptions.rpcUrl\n ? { rpcUrls: [readOnlyOptions.rpcUrl] }\n : undefined,\n });\n\n const scoreKey = getTokenScoreKey(tokenAddress);\n\n try {\n // getUpvotesWithLegacy returns one aggregated count per scoreKey\n // (summing legacy + all specified strategies). To get per-strategy\n // counts, use getStrategyKeyScores for each strategy individually.\n const [totalCounts, ...perStrategyCounts] = await Promise.all([\n client.getUpvotesWithLegacy({\n scoreKeys: [scoreKey],\n strategies: ALL_STRATEGY_ADDRESSES,\n }),\n ...ALL_STRATEGY_ADDRESSES.map((strategy) =>\n client.getStrategyKeyScores({\n strategy,\n scoreKeys: [scoreKey],\n })\n ),\n ]);\n\n const total = totalCounts[0] ?? 0;\n const strategyCounts = ALL_STRATEGY_ADDRESSES.map((addr, i) => ({\n strategy: getStrategyName(addr),\n address: addr,\n count: perStrategyCounts[i]?.[0] ?? 0,\n }));\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n tokenAddress,\n tokenUrl: buildTokenUrl(readOnlyOptions.chainId, tokenAddress),\n scoreKey,\n total,\n strategies: strategyCounts.map((s) => ({\n name: s.strategy,\n address: s.address,\n count: s.count,\n })),\n },\n null,\n 2\n )\n );\n } else {\n console.log(chalk.white(`Upvotes for ${tokenAddress}:`));\n console.log(chalk.cyan(` Total: ${total}`));\n console.log();\n for (const s of strategyCounts) {\n if (s.count > 0) {\n console.log(chalk.white(` ${s.strategy}: ${s.count}`));\n }\n }\n if (total === 0) {\n console.log(chalk.yellow(\" No upvotes found\"));\n }\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch upvotes: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerGetUpvotesCommand(\n parent: Command,\n commandName = \"info\"\n): void {\n parent\n .command(commandName)\n .description(\"Get upvote counts for a token\")\n .requiredOption(\"--token-address <address>\", \"Token contract address\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeGetUpvotes(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { formatEther } from \"viem\";\nimport {\n parseReadOnlyOptionsWithDefault,\n parseCommonOptionsWithDefault,\n} from \"../../cli/shared\";\nimport { createWallet } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport {\n UserUpvoteClient,\n USER_UPVOTE_CONTRACT,\n NULL_ADDRESS,\n calculateUpvoteCost,\n} from \"@net-protocol/score\";\nimport type { UpvoteUserOptions } from \"./types\";\n\nexport async function executeUpvoteUser(\n options: UpvoteUserOptions\n): Promise<void> {\n const count = parseInt(options.count, 10);\n if (isNaN(count) || count <= 0) {\n exitWithError(\"Count must be a positive integer\");\n return;\n }\n\n const userAddress = options.address;\n if (!userAddress.startsWith(\"0x\") || userAddress.length !== 42) {\n exitWithError(\n \"Invalid address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n const token = (options.token ?? NULL_ADDRESS) as `0x${string}`;\n const feeTier = options.feeTier ? parseInt(options.feeTier, 10) : 0;\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new UserUpvoteClient({\n chainId: readOnlyOptions.chainId,\n overrides: readOnlyOptions.rpcUrl\n ? { rpcUrls: [readOnlyOptions.rpcUrl] }\n : undefined,\n });\n\n // Fetch current upvote price from contract\n let upvotePrice: bigint;\n try {\n upvotePrice = await client.getUpvotePrice();\n } catch (error) {\n exitWithError(\n `Failed to fetch upvote price: ${error instanceof Error ? error.message : String(error)}`\n );\n return;\n }\n\n const totalCost = calculateUpvoteCost(count, upvotePrice);\n\n if (options.encodeOnly) {\n const txConfig = {\n to: USER_UPVOTE_CONTRACT.address,\n abi: USER_UPVOTE_CONTRACT.abi,\n functionName: \"upvoteUser\" as const,\n args: [userAddress as `0x${string}`, token, BigInt(count), BigInt(feeTier)],\n value: totalCost,\n };\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(\n chalk.blue(`Submitting ${count} profile upvote(s) for ${userAddress}...`)\n );\n\n try {\n const hash = await client.upvoteUser({\n walletClient,\n userToUpvote: userAddress as `0x${string}`,\n token,\n numUpvotes: count,\n feeTier,\n value: totalCost,\n });\n\n console.log(chalk.green(\"Profile upvote submitted successfully!\"));\n console.log(chalk.white(` Transaction: ${hash}`));\n console.log(chalk.white(` User: ${userAddress}`));\n console.log(chalk.white(` Count: ${count}`));\n console.log(chalk.white(` Value: ${formatEther(totalCost)} ETH`));\n if (token !== NULL_ADDRESS) {\n console.log(chalk.white(` Token: ${token}`));\n }\n } catch (error) {\n exitWithError(\n `Failed to submit profile upvote: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerUpvoteUserCommand(\n parent: Command,\n commandName = \"user\"\n): void {\n parent\n .command(commandName)\n .description(\"Upvote a user's profile on Net Protocol\")\n .requiredOption(\"--address <address>\", \"User address to upvote\")\n .requiredOption(\"--count <n>\", \"Number of upvotes\")\n .option(\"--token <address>\", \"Token address (default: null address)\")\n .option(\"--fee-tier <tier>\", \"Fee tier (default: 0)\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeUpvoteUser(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { formatEther } from \"viem\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { UserUpvoteClient } from \"@net-protocol/score\";\nimport {\n profileUrl as buildProfileUrl,\n walletUrl as buildWalletUrl,\n} from \"../../shared/urls\";\nimport type { GetUserUpvotesOptions } from \"./types\";\n\nexport async function executeGetUserUpvotes(\n options: GetUserUpvotesOptions\n): Promise<void> {\n const userAddress = options.address;\n if (!userAddress.startsWith(\"0x\") || userAddress.length !== 42) {\n exitWithError(\n \"Invalid address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new UserUpvoteClient({\n chainId: readOnlyOptions.chainId,\n overrides: readOnlyOptions.rpcUrl\n ? { rpcUrls: [readOnlyOptions.rpcUrl] }\n : undefined,\n });\n\n try {\n const [given, received, upvotePrice] = await Promise.all([\n client.getUserUpvotesGiven({\n user: userAddress as `0x${string}`,\n }),\n client.getUserUpvotesReceived({\n user: userAddress as `0x${string}`,\n }),\n client.getUpvotePrice(),\n ]);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n address: userAddress,\n chainId: readOnlyOptions.chainId,\n profileUrl: buildProfileUrl(readOnlyOptions.chainId, userAddress),\n walletUrl: buildWalletUrl(readOnlyOptions.chainId, userAddress),\n upvotesGiven: Number(given),\n upvotesReceived: Number(received),\n upvotePriceWei: upvotePrice.toString(),\n upvotePriceEth: formatEther(upvotePrice),\n },\n null,\n 2\n )\n );\n } else {\n console.log(chalk.white(`Profile upvotes for ${userAddress}:`));\n console.log(chalk.cyan(` Upvotes Given: ${given}`));\n console.log(chalk.cyan(` Upvotes Received: ${received}`));\n console.log(\n chalk.white(` Upvote Price: ${formatEther(upvotePrice)} ETH`)\n );\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch user upvotes: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerGetUserUpvotesCommand(\n parent: Command,\n commandName = \"user-info\"\n): void {\n parent\n .command(commandName)\n .description(\"Get profile upvote stats for a user\")\n .requiredOption(\"--address <address>\", \"User address to look up\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeGetUserUpvotes(options);\n });\n}\n","import { Command } from \"commander\";\nimport { registerUpvoteTokenCommand } from \"./upvote-token\";\nimport { registerGetUpvotesCommand } from \"./get-upvotes\";\nimport { registerUpvoteUserCommand } from \"./upvote-user\";\nimport { registerGetUserUpvotesCommand } from \"./get-user-upvotes\";\n\nexport function registerUpvoteCommand(program: Command): void {\n const upvoteCommand = program\n .command(\"upvote\")\n .description(\"Upvote tokens and users on Net Protocol\");\n\n registerUpvoteTokenCommand(upvoteCommand);\n registerGetUpvotesCommand(upvoteCommand);\n registerUpvoteUserCommand(upvoteCommand);\n registerGetUserUpvotesCommand(upvoteCommand);\n}\n\n// Re-exports for botchan\nexport { registerUpvoteTokenCommand } from \"./upvote-token\";\nexport { registerGetUpvotesCommand } from \"./get-upvotes\";\nexport { registerUpvoteUserCommand } from \"./upvote-user\";\nexport { registerGetUserUpvotesCommand } from \"./get-user-upvotes\";\n","/**\n * Shared utilities for agent CLI commands.\n *\n * Two auth modes are supported:\n * - Private key (--private-key or NET_PRIVATE_KEY) — CLI creates session\n * - Pre-existing session token (--session-token or NET_SESSION_TOKEN) —\n * typically obtained via `agent session-encode` + external signer\n * (e.g. Bankr) + `agent session-create`\n */\n\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { privateKeyToAccount, type LocalAccount } from \"viem/accounts\";\nimport { isAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport { createRelaySession } from \"@net-protocol/relay\";\nimport {\n AgentClient,\n NET_API_URL,\n RELAY_ACCESS_KEY,\n type AgentFilters,\n type AgentProfileInput,\n type AgentRunMode,\n} from \"@net-protocol/agents\";\nimport {\n parseCommonOptionsWithDefault,\n parseReadOnlyOptionsWithDefault,\n} from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\n\n// ============================================\n// OPTION INTERFACES\n// ============================================\n\n/** Chain/API options shared by every agent command. */\nexport interface AgentCommonOptions {\n chainId?: number;\n rpcUrl?: string;\n apiUrl?: string;\n}\n\n/** Options for read-only commands that only need a wallet address. */\nexport interface AgentReadOnlyOptions extends AgentCommonOptions {\n operator?: string;\n}\n\n/** Options shared by all agent write commands (CRUD, run, DM). */\nexport interface AgentAuthOptions extends AgentCommonOptions {\n privateKey?: string;\n sessionToken?: string;\n operator?: string;\n}\n\n/** Options for commands that accept filter flags (create, update). */\nexport interface AgentFilterOptions {\n includeFeed?: string[];\n excludeFeed?: string[];\n preferredFeed?: string[];\n chatTopic?: string[];\n}\n\n/** Options for commands that accept profile flags (create, update). */\nexport interface AgentProfileOptions {\n displayName?: string;\n bio?: string;\n}\n\nexport interface AuthResolution {\n client: AgentClient;\n sessionToken: string;\n /** Only set on the --private-key path; session-token callers don't expose it. */\n account?: LocalAccount;\n operatorAddress: Address;\n chainId: number;\n apiUrl: string;\n}\n\n// ============================================\n// CONSTANTS\n// ============================================\n\nexport const VALID_RUN_MODES = [\"auto\", \"feeds\", \"chats\"] as const;\n\n// ============================================\n// COMMAND OPTION HELPERS\n// ============================================\n\n/**\n * Attach the standard auth + common options to a write command.\n * Every write command (create, update, run, etc.) needs the same set.\n */\nexport function addAuthOptions(cmd: Command): Command {\n return addCommonOptions(cmd)\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--session-token <token>\",\n \"Pre-existing session token (alternative to --private-key)\",\n )\n .option(\n \"--operator <address>\",\n \"Operator address (required with --session-token)\",\n );\n}\n\n/** Attach chain/API options (no auth). Used by read-only commands. */\nexport function addCommonOptions(cmd: Command): Command {\n return cmd\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\", (v) => parseInt(v, 10))\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--api-url <url>\", \"Net Protocol API URL\");\n}\n\n/**\n * Attach filter options (create and update both accept these).\n */\nexport function addFilterOptions(cmd: Command): Command {\n return cmd\n .option(\"--include-feed <pattern...>\", \"Only engage with matching feeds\")\n .option(\"--exclude-feed <pattern...>\", \"Never engage with matching feeds\")\n .option(\"--preferred-feed <pattern...>\", \"Prioritize matching feeds\")\n .option(\"--chat-topic <topic...>\", \"Chat topics to participate in\");\n}\n\n/** Attach display-name / bio options (create and update both accept these). */\nexport function addProfileOptions(cmd: Command): Command {\n return cmd\n .option(\"--display-name <name>\", \"Agent display name\")\n .option(\"--bio <text>\", \"Agent bio\");\n}\n\n// ============================================\n// INPUT BUILDERS\n// ============================================\n\n/** Build an AgentFilters object from CLI options, or undefined when no flags are set. */\nexport function buildFilters(options: AgentFilterOptions): AgentFilters | undefined {\n const filters: AgentFilters = {};\n if (options.includeFeed?.length) filters.includeFeedPatterns = options.includeFeed;\n if (options.excludeFeed?.length) filters.excludeFeedPatterns = options.excludeFeed;\n if (options.preferredFeed?.length) filters.preferredFeedPatterns = options.preferredFeed;\n if (options.chatTopic?.length) filters.preferredChatTopics = options.chatTopic;\n return Object.keys(filters).length > 0 ? filters : undefined;\n}\n\n/** Build an AgentProfileInput from CLI options, or undefined when no flags are set. */\nexport function buildProfile(options: AgentProfileOptions): AgentProfileInput | undefined {\n const profile: AgentProfileInput = {};\n if (options.displayName) profile.displayName = options.displayName;\n if (options.bio) profile.bio = options.bio;\n return Object.keys(profile).length > 0 ? profile : undefined;\n}\n\n/** Parse and validate a run-mode flag. Exits the process on invalid input. */\nexport function parseRunMode(raw: string | undefined): AgentRunMode {\n const mode = (raw ?? \"auto\") as AgentRunMode;\n if (!VALID_RUN_MODES.includes(mode as (typeof VALID_RUN_MODES)[number])) {\n exitWithError(`Invalid mode \"${mode}\". Must be one of: ${VALID_RUN_MODES.join(\", \")}`);\n }\n return mode;\n}\n\n// ============================================\n// AUTH RESOLUTION\n// ============================================\n\n/** Resolve chain ID, API URL, and validate operator for a read-only command. */\nexport function resolveReadOnly(options: AgentReadOnlyOptions): {\n chainId: number;\n apiUrl: string;\n operator?: Address;\n} {\n const readOnly = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const apiUrl = options.apiUrl || process.env.NET_API_URL || NET_API_URL;\n\n let operator: Address | undefined;\n if (options.operator) {\n if (!isAddress(options.operator)) {\n exitWithError(`Invalid operator address: ${options.operator}`);\n }\n operator = options.operator as Address;\n }\n\n return { chainId: readOnly.chainId, apiUrl, operator };\n}\n\n/**\n * Resolve auth for a write command using either --private-key or --session-token.\n */\nexport async function resolveAuth(options: AgentAuthOptions): Promise<AuthResolution> {\n const sessionToken = options.sessionToken || process.env.NET_SESSION_TOKEN;\n const privateKey =\n options.privateKey || process.env.NET_PRIVATE_KEY || process.env.PRIVATE_KEY;\n\n if (sessionToken && options.privateKey) {\n exitWithError(\"Cannot use both --session-token and --private-key. Pick one.\");\n }\n\n const apiUrl = options.apiUrl || process.env.NET_API_URL || NET_API_URL;\n\n if (sessionToken) {\n if (!options.operator) {\n exitWithError(\n \"--operator <address> is required when using --session-token. \" +\n \"It must match the address that signed the session.\",\n );\n }\n if (!isAddress(options.operator!)) {\n exitWithError(`Invalid operator address: ${options.operator}`);\n }\n\n const readOnly = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const client = new AgentClient({ apiUrl, chainId: readOnly.chainId });\n\n return {\n client,\n sessionToken,\n operatorAddress: options.operator as Address,\n chainId: readOnly.chainId,\n apiUrl,\n };\n }\n\n if (!privateKey) {\n exitWithError(\n \"No auth provided. Use one of:\\n\" +\n \" --private-key <key> (or NET_PRIVATE_KEY env var)\\n\" +\n \" --session-token <token> + --operator <address> (for Bankr or other external signers)\",\n );\n }\n\n // Pass the original CLI flag value (not the env-resolved key) so the\n // \"Private key provided via command line\" warning inside\n // parseCommonOptionsWithDefault only fires when --private-key was actually\n // used. parseCommonOptionsWithDefault re-resolves env vars internally.\n const commonOptions = parseCommonOptionsWithDefault({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n // Route status to stderr so --json consumers reading stdout get clean JSON.\n console.error(chalk.blue(\"Creating session...\"));\n const { sessionToken: token } = await createRelaySession({\n apiUrl,\n chainId: commonOptions.chainId,\n operatorAddress: account.address,\n secretKey: RELAY_ACCESS_KEY,\n account,\n });\n\n const client = new AgentClient({ apiUrl, chainId: commonOptions.chainId });\n\n return {\n client,\n sessionToken: token,\n account,\n operatorAddress: account.address,\n chainId: commonOptions.chainId,\n apiUrl,\n };\n}\n\n// ============================================\n// OUTPUT HELPERS\n// ============================================\n\n/** JSON.stringify replacer converting bigints to decimal strings. */\nexport function bigintReplacer(_key: string, value: unknown): unknown {\n return typeof value === \"bigint\" ? value.toString() : value;\n}\n\n/** JSON.stringify wrapper that handles bigints. */\nexport function jsonStringify(obj: unknown, indent = 2): string {\n return JSON.stringify(obj, bigintReplacer, indent);\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n addAuthOptions,\n addFilterOptions,\n addProfileOptions,\n buildFilters,\n buildProfile,\n jsonStringify,\n resolveAuth,\n type AgentAuthOptions,\n type AgentFilterOptions,\n type AgentProfileOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateAgentInput } from \"@net-protocol/agents\";\n\ninterface CreateOptions extends AgentAuthOptions, AgentFilterOptions, AgentProfileOptions {\n systemPrompt: string;\n schedule?: number;\n json?: boolean;\n}\n\nasync function executeCreate(name: string, options: CreateOptions): Promise<void> {\n try {\n const auth = await resolveAuth(options);\n\n const config: CreateAgentInput = {\n name,\n systemPrompt: options.systemPrompt,\n };\n if (options.schedule) config.runIntervalMinutes = options.schedule;\n const filters = buildFilters(options);\n if (filters) config.filters = filters;\n\n const profile = buildProfile(options);\n\n if (!options.json) {\n console.log(chalk.blue(`Creating agent \"${name}\"...`));\n }\n const result = await auth.client.createAgent({\n sessionToken: auth.sessionToken,\n config,\n profile,\n });\n\n if (options.json) {\n console.log(jsonStringify(result));\n if (!result.success) process.exit(1);\n return;\n }\n\n if (!result.success) {\n exitWithError(result.error || \"Failed to create agent\");\n }\n\n console.log(chalk.green(\"Agent created successfully!\"));\n console.log(` Agent ID: ${result.agentId}`);\n console.log(` Wallet: ${result.agentWalletAddress}`);\n if (result.scheduleError) {\n // The on-chain follow-up (profile metadata write) commonly reverts\n // because the new agent's wallet starts with 0 ETH for gas. Detect\n // that specific case and prepend an actionable hint, but keep the\n // full underlying error visible so other reverts remain debuggable.\n const isGasOut = /gas required exceeds allowance \\(0\\)/i.test(\n result.scheduleError,\n );\n if (isGasOut) {\n console.log(\n chalk.yellow(\n ` Profile metadata write failed: the agent's wallet ` +\n `(${result.agentWalletAddress}) has 0 ETH for gas. It will ` +\n `be auto-funded on first \\`agent run\\`, or you can transfer ` +\n `a small amount of ETH to the wallet manually.`,\n ),\n );\n console.log(chalk.gray(` Underlying revert:`));\n } else {\n console.log(chalk.yellow(` On-chain follow-up failed:`));\n }\n console.log(\n chalk.gray(` ${result.scheduleError.replace(/\\n/g, \"\\n \")}`),\n );\n }\n } catch (error) {\n exitWithError(\n `Failed to create agent: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentCreateCommand(parent: Command): void {\n const cmd = parent\n .command(\"create <name>\")\n .description(\"Create a new onchain agent\")\n .requiredOption(\"--system-prompt <prompt>\", \"Agent system prompt (personality)\")\n .option(\"--schedule <minutes>\", \"Auto-run interval in minutes\", (v) => parseInt(v, 10))\n .option(\"--json\", \"Output as JSON\");\n addAuthOptions(cmd);\n addFilterOptions(cmd);\n addProfileOptions(cmd);\n cmd.action(async (name, options) => {\n await executeCreate(name, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n addAuthOptions,\n jsonStringify,\n resolveAuth,\n type AgentAuthOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\n\ninterface ListOptions extends AgentAuthOptions {\n json?: boolean;\n showHidden?: boolean;\n}\n\nasync function executeList(options: ListOptions): Promise<void> {\n try {\n const auth = await resolveAuth(options);\n const result = await auth.client.listAgents({ sessionToken: auth.sessionToken });\n\n if (!result.success) {\n exitWithError(result.error || \"Failed to list agents\");\n }\n\n const agents = result.agents || [];\n const visible = options.showHidden ? agents : agents.filter((a) => !a.config.hidden);\n\n if (options.json) {\n console.log(jsonStringify(visible));\n return;\n }\n\n if (visible.length === 0) {\n console.log(chalk.yellow(\"No agents found.\"));\n return;\n }\n\n console.log(chalk.bold(`Agents (${visible.length}):\\n`));\n\n for (const agent of visible) {\n const { config, walletAddress } = agent;\n const schedule = config.runIntervalMinutes\n ? `every ${config.runIntervalMinutes}m`\n : \"manual\";\n const hidden = config.hidden ? chalk.gray(\" [hidden]\") : \"\";\n const promptPreview =\n config.systemPrompt.length > 80\n ? `${config.systemPrompt.slice(0, 80)}...`\n : config.systemPrompt;\n\n console.log(` ${chalk.cyan(config.name)}${hidden}`);\n console.log(` ID: ${config.id}`);\n console.log(` Wallet: ${walletAddress}`);\n console.log(` Schedule: ${schedule}`);\n console.log(` Prompt: ${promptPreview}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to list agents: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentListCommand(parent: Command): void {\n const cmd = parent\n .command(\"list\")\n .description(\"List your onchain agents\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--show-hidden\", \"Include hidden agents\");\n addAuthOptions(cmd);\n cmd.action(async (options) => {\n await executeList(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n addAuthOptions,\n addFilterOptions,\n addProfileOptions,\n buildFilters,\n buildProfile,\n jsonStringify,\n resolveAuth,\n type AgentAuthOptions,\n type AgentFilterOptions,\n type AgentProfileOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { UpdateAgentInput } from \"@net-protocol/agents\";\n\ninterface UpdateOptions extends AgentAuthOptions, AgentFilterOptions, AgentProfileOptions {\n name?: string;\n systemPrompt?: string;\n schedule?: number;\n disableSchedule?: boolean;\n json?: boolean;\n}\n\nasync function executeUpdate(agentId: string, options: UpdateOptions): Promise<void> {\n try {\n const auth = await resolveAuth(options);\n\n const config: UpdateAgentInput = {};\n let hasConfigChanges = false;\n\n if (options.name) {\n config.name = options.name;\n hasConfigChanges = true;\n }\n if (options.systemPrompt) {\n config.systemPrompt = options.systemPrompt;\n hasConfigChanges = true;\n }\n if (options.schedule) {\n config.runIntervalMinutes = options.schedule;\n hasConfigChanges = true;\n }\n if (options.disableSchedule) {\n config.runIntervalMinutes = 0;\n hasConfigChanges = true;\n }\n\n const filters = buildFilters(options);\n if (filters) {\n config.filters = filters;\n hasConfigChanges = true;\n }\n\n const profile = buildProfile(options);\n\n if (!hasConfigChanges && !profile) {\n exitWithError(\n \"No changes specified. Use --name, --system-prompt, --schedule, --display-name, --bio, or filter options.\",\n );\n }\n\n if (!options.json) {\n console.log(chalk.blue(`Updating agent ${agentId}...`));\n }\n const result = await auth.client.updateAgent({\n sessionToken: auth.sessionToken,\n agentId,\n config: hasConfigChanges ? config : undefined,\n profile,\n });\n\n if (options.json) {\n console.log(jsonStringify(result));\n if (!result.success) process.exit(1);\n return;\n }\n\n if (!result.success) {\n exitWithError(result.error || \"Failed to update agent\");\n }\n\n console.log(chalk.green(\"Agent updated successfully!\"));\n if (result.profileError) {\n console.log(chalk.yellow(` Profile warning: ${result.profileError}`));\n }\n } catch (error) {\n exitWithError(\n `Failed to update agent: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentUpdateCommand(parent: Command): void {\n const cmd = parent\n .command(\"update <agentId>\")\n .description(\"Update an existing agent\")\n .option(\"--name <name>\", \"New agent name\")\n .option(\"--system-prompt <prompt>\", \"New system prompt\")\n .option(\"--schedule <minutes>\", \"Auto-run interval in minutes\", (v) => parseInt(v, 10))\n .option(\"--disable-schedule\", \"Disable automatic scheduling\")\n .option(\"--json\", \"Output as JSON\");\n addAuthOptions(cmd);\n addFilterOptions(cmd);\n addProfileOptions(cmd);\n cmd.action(async (agentId, options) => {\n await executeUpdate(agentId, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { addAuthOptions, resolveAuth, type AgentAuthOptions } from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\n\nasync function executeToggleHidden(\n agentId: string,\n options: AgentAuthOptions,\n hide: boolean,\n): Promise<void> {\n const verb = hide ? \"Hiding\" : \"Unhiding\";\n const past = hide ? \"hidden\" : \"unhidden\";\n try {\n const auth = await resolveAuth(options);\n console.error(chalk.blue(`${verb} agent ${agentId}...`));\n const result = hide\n ? await auth.client.hideAgent(auth.sessionToken, agentId)\n : await auth.client.unhideAgent(auth.sessionToken, agentId);\n\n if (!result.success) {\n exitWithError(result.error || `Failed to ${hide ? \"hide\" : \"unhide\"} agent`);\n }\n console.log(chalk.green(`Agent ${past} successfully.`));\n } catch (error) {\n exitWithError(\n `Failed to ${hide ? \"hide\" : \"unhide\"} agent: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentHideCommand(parent: Command): void {\n const cmd = parent.command(\"hide <agentId>\").description(\"Hide an agent (soft-delete)\");\n addAuthOptions(cmd).action(async (agentId, options) => {\n await executeToggleHidden(agentId, options, true);\n });\n}\n\nexport function registerAgentUnhideCommand(parent: Command): void {\n const cmd = parent\n .command(\"unhide <agentId>\")\n .description(\"Unhide a previously hidden agent\");\n addAuthOptions(cmd).action(async (agentId, options) => {\n await executeToggleHidden(agentId, options, false);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n addAuthOptions,\n jsonStringify,\n parseRunMode,\n resolveAuth,\n type AgentAuthOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\n\ninterface RunOptions extends AgentAuthOptions {\n mode?: string;\n json?: boolean;\n}\n\nasync function executeRun(agentId: string, options: RunOptions): Promise<void> {\n try {\n const auth = await resolveAuth(options);\n const mode = parseRunMode(options.mode);\n\n if (!options.json) {\n console.log(chalk.blue(`Running agent ${agentId} (mode: ${mode})...`));\n }\n const result = await auth.client.runAgent({\n sessionToken: auth.sessionToken,\n agentId,\n mode,\n });\n\n if (options.json) {\n console.log(jsonStringify(result));\n if (!result.success) process.exit(1);\n return;\n }\n\n if (!result.success) {\n exitWithError(result.error || \"Agent run failed\");\n }\n\n console.log(chalk.green(`Agent run complete: ${result.action}`));\n\n if (result.summary) {\n console.log(` Summary: ${result.summary}`);\n }\n\n if (result.actions.length > 0) {\n console.log(\" Actions:\");\n for (const action of result.actions) {\n const textPreview =\n action.text.length > 60 ? `${action.text.slice(0, 60)}...` : action.text;\n console.log(` - ${action.type} in ${action.topic}: \"${textPreview}\"`);\n console.log(` tx: ${action.transactionHash}`);\n }\n }\n\n if (result.autoFunded) {\n console.log(\n chalk.blue(\n ` Auto-funded: $${result.autoFunded.amountUsd.toFixed(4)} (${result.autoFunded.amountEth} ETH)`,\n ),\n );\n }\n\n if (result.agentBalanceUsd !== undefined) {\n console.log(` Agent balance: $${result.agentBalanceUsd.toFixed(4)}`);\n }\n if (result.mainBalanceUsd !== undefined) {\n console.log(` Credits balance: $${result.mainBalanceUsd.toFixed(4)}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to run agent: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentRunCommand(parent: Command): void {\n const cmd = parent\n .command(\"run <agentId>\")\n .description(\"Execute one agent cycle\")\n .option(\"--mode <mode>\", \"Run mode: auto, feeds, or chats (default: auto)\")\n .option(\"--json\", \"Output as JSON\");\n addAuthOptions(cmd).action(async (agentId, options) => {\n await executeRun(agentId, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n addAuthOptions,\n jsonStringify,\n resolveAuth,\n type AgentAuthOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\n\ninterface InfoOptions extends AgentAuthOptions {\n json?: boolean;\n}\n\nasync function executeInfo(agentId: string, options: InfoOptions): Promise<void> {\n try {\n const auth = await resolveAuth(options);\n const agent = await auth.client.getAgent(auth.sessionToken, agentId);\n\n if (!agent) {\n exitWithError(`Agent not found: ${agentId}`);\n return;\n }\n\n if (options.json) {\n console.log(jsonStringify(agent));\n return;\n }\n\n const { config, walletAddress } = agent;\n const schedule = config.runIntervalMinutes\n ? `every ${config.runIntervalMinutes} minutes`\n : \"manual only\";\n\n console.log(\n chalk.bold(config.name) + (config.hidden ? chalk.gray(\" [hidden]\") : \"\"),\n );\n console.log();\n console.log(` ID: ${config.id}`);\n console.log(` Wallet: ${walletAddress}`);\n console.log(` Owner: ${config.ownerAddress}`);\n console.log(` Schedule: ${schedule}`);\n console.log(` Created: ${new Date(config.createdAt).toLocaleString()}`);\n console.log(` Updated: ${new Date(config.updatedAt).toLocaleString()}`);\n console.log();\n console.log(\" System Prompt:\");\n console.log(` ${config.systemPrompt}`);\n\n if (config.filters) {\n console.log();\n console.log(\" Filters:\");\n if (config.filters.includeFeedPatterns?.length) {\n console.log(` Include feeds: ${config.filters.includeFeedPatterns.join(\", \")}`);\n }\n if (config.filters.excludeFeedPatterns?.length) {\n console.log(` Exclude feeds: ${config.filters.excludeFeedPatterns.join(\", \")}`);\n }\n if (config.filters.preferredFeedPatterns?.length) {\n console.log(\n ` Preferred feeds: ${config.filters.preferredFeedPatterns.join(\", \")}`,\n );\n }\n if (config.filters.preferredChatTopics?.length) {\n console.log(` Chat topics: ${config.filters.preferredChatTopics.join(\", \")}`);\n }\n }\n } catch (error) {\n exitWithError(\n `Failed to get agent info: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentInfoCommand(parent: Command): void {\n const cmd = parent\n .command(\"info <agentId>\")\n .description(\"Show detailed agent information\")\n .option(\"--json\", \"Output as JSON\");\n addAuthOptions(cmd).action(async (agentId, options) => {\n await executeInfo(agentId, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { isAddress } from \"viem\";\nimport {\n addAuthOptions,\n addCommonOptions,\n jsonStringify,\n resolveAuth,\n resolveReadOnly,\n type AgentAuthOptions,\n type AgentReadOnlyOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport {\n AgentClient,\n buildConversationAuthTypedData,\n generateAgentChatTopic,\n isAgentChatTopic,\n parseAgentAddressFromTopic,\n} from \"@net-protocol/agents\";\n\ninterface DmOptions extends AgentAuthOptions {\n topic?: string;\n topicSignature?: string;\n json?: boolean;\n}\n\ninterface DmListOptions extends AgentReadOnlyOptions {\n json?: boolean;\n limit?: number;\n}\n\ninterface DmHistoryOptions extends AgentReadOnlyOptions {\n json?: boolean;\n limit?: number;\n}\n\ninterface DmAuthEncodeOptions {\n topic?: string;\n agentAddress?: string;\n chainId?: number;\n}\n\n// ============================================================\n// dm (send)\n// ============================================================\n\nasync function executeDm(\n agentAddress: string,\n message: string,\n options: DmOptions,\n): Promise<void> {\n try {\n if (!isAddress(agentAddress)) {\n exitWithError(`Invalid agent address: ${agentAddress}`);\n }\n if (options.topicSignature && !options.topic) {\n exitWithError(\n \"--topic-signature requires --topic (the topic the signature authorizes)\",\n );\n }\n\n // Session-token callers can't sign topics locally, so they must bring\n // --topic and --topic-signature. Catch up-front with actionable guidance\n // rather than falling through to a generic signer-required error.\n const usingSessionToken = !!(\n options.sessionToken || process.env.NET_SESSION_TOKEN\n );\n if (usingSessionToken && (!options.topic || !options.topicSignature)) {\n exitWithError(\n \"When using --session-token, you must also provide --topic and --topic-signature.\\n\" +\n \" Obtain the signature with:\\n\" +\n \" netp agent dm-auth-encode --agent-address <addr> → produces { typedData, topic }\\n\" +\n \" [sign .typedData with your external signer, e.g. Bankr /agent/sign]\\n\" +\n \" Then:\\n\" +\n \" netp agent dm <addr> <message> --session-token <token> --operator <addr> \\\\\\n\" +\n \" --topic <topic> --topic-signature <sig>\",\n );\n }\n\n const auth = await resolveAuth(options);\n const topic = options.topic ?? generateAgentChatTopic(agentAddress as Address);\n const isNewConversation = !options.topic;\n\n if (!options.json) {\n console.log(\n chalk.blue(\n isNewConversation\n ? `Starting new conversation with ${agentAddress}...`\n : `Continuing conversation ${topic}...`,\n ),\n );\n }\n\n const result = await auth.client.sendMessage(\n {\n sessionToken: auth.sessionToken,\n agentAddress: agentAddress as Address,\n topic,\n message,\n userSignature: options.topicSignature as Hex | undefined,\n },\n auth.account,\n );\n\n if (options.json) {\n console.log(jsonStringify(result));\n if (!result.success) process.exit(1);\n return;\n }\n\n if (!result.success) {\n // Surface the underlying error directly. The \"Failed to send DM:\"\n // prefix would just add noise around an already-clear message like\n // \"Insufficient Net credits ($X). Add at least $Y...\".\n exitWithError(result.error || \"Failed to send DM\");\n }\n\n console.log();\n console.log(chalk.cyan(\"You: \") + message);\n console.log(chalk.green(\"Agent: \") + result.aiMessage);\n console.log();\n console.log(chalk.gray(` Topic: ${result.topic}`));\n console.log(chalk.gray(` TX: ${result.transactionHash}`));\n if (isNewConversation) {\n console.log(\n chalk.gray(` (Use --topic ${result.topic} to continue this conversation)`),\n );\n }\n } catch (error) {\n exitWithError(\n `Failed to send DM: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentDmCommand(parent: Command): void {\n const cmd = parent\n .command(\"dm <agentAddress> <message>\")\n .description(\"Send a DM to an onchain agent\")\n .option(\"--topic <topic>\", \"Continue an existing conversation\")\n .option(\n \"--topic-signature <hex>\",\n \"Pre-signed ConversationAuth signature (requires --topic). \" +\n \"Obtain via `agent dm-auth-encode` + external signer.\",\n )\n .option(\"--json\", \"Output as JSON\");\n addAuthOptions(cmd).action(async (agentAddress, message, options) => {\n await executeDm(agentAddress, message, options);\n });\n}\n\n// ============================================================\n// dm-list\n// ============================================================\n\nasync function executeDmList(options: DmListOptions): Promise<void> {\n try {\n const { chainId, apiUrl, operator } = resolveReadOnly(options);\n if (!operator) {\n exitWithError(\n \"--operator <address> is required (user wallet address to list conversations for)\",\n );\n }\n\n const client = new AgentClient({ apiUrl, chainId });\n if (!options.json) {\n console.log(chalk.blue(\"Loading conversations...\"));\n }\n const conversations = await client.listConversations(operator!, {\n limit: options.limit,\n });\n const agentConversations = conversations.filter((c) => isAgentChatTopic(c.topic));\n\n if (options.json) {\n console.log(jsonStringify(agentConversations));\n return;\n }\n\n if (agentConversations.length === 0) {\n console.log(chalk.yellow(\"No agent conversations found.\"));\n return;\n }\n\n console.log(chalk.bold(`Agent Conversations (${agentConversations.length}):\\n`));\n\n for (const conv of agentConversations) {\n const agentAddr = parseAgentAddressFromTopic(conv.topic);\n const encrypted = conv.isEncrypted ? chalk.yellow(\" [encrypted]\") : \"\";\n const date = new Date(conv.lastMessageTimestamp * 1000).toLocaleString();\n const preview = conv.lastMessage\n ? conv.lastMessage.length > 60\n ? `${conv.lastMessage.slice(0, 60)}...`\n : conv.lastMessage\n : null;\n\n console.log(` ${chalk.cyan(agentAddr || \"unknown\")}${encrypted}`);\n console.log(` Topic: ${conv.topic}`);\n console.log(` Messages: ${conv.messageCount}`);\n console.log(` Last: ${date}`);\n if (preview) console.log(` Preview: ${preview}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to list conversations: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentDmListCommand(parent: Command): void {\n const cmd = parent\n .command(\"dm-list\")\n .description(\"List your DM conversations with agents (pure chain read)\")\n .requiredOption(\"--operator <address>\", \"User wallet address\")\n .option(\"--limit <n>\", \"Max conversations to fetch\", (v) => parseInt(v, 10))\n .option(\"--json\", \"Output as JSON\");\n addCommonOptions(cmd).action(async (options) => {\n await executeDmList(options);\n });\n}\n\n// ============================================================\n// dm-history\n// ============================================================\n\nasync function executeDmHistory(topic: string, options: DmHistoryOptions): Promise<void> {\n try {\n const { chainId, apiUrl, operator } = resolveReadOnly(options);\n if (!operator) {\n exitWithError(\n \"--operator <address> is required (user wallet address for this conversation)\",\n );\n }\n\n const client = new AgentClient({ apiUrl, chainId });\n if (!options.json) {\n console.log(chalk.blue(\"Loading conversation history...\"));\n }\n const messages = await client.getConversationHistory(operator!, topic, {\n limit: options.limit,\n });\n\n if (options.json) {\n console.log(jsonStringify(messages));\n return;\n }\n\n if (messages.length === 0) {\n console.log(chalk.yellow(\"No messages found.\"));\n return;\n }\n\n const agentAddr = parseAgentAddressFromTopic(topic);\n console.log(\n chalk.bold(\n `Conversation with ${agentAddr || topic} (${messages.length} messages):\\n`,\n ),\n );\n\n for (const msg of messages) {\n const date = new Date(msg.timestamp * 1000).toLocaleString();\n const prefix = msg.sender === \"user\" ? chalk.cyan(\"You\") : chalk.green(\"Agent\");\n const encrypted = msg.encrypted ? chalk.yellow(\" [encrypted]\") : \"\";\n console.log(` ${prefix}${encrypted} (${chalk.gray(date)}):`);\n console.log(` ${msg.text}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to load history: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentDmHistoryCommand(parent: Command): void {\n const cmd = parent\n .command(\"dm-history <topic>\")\n .description(\"Read DM conversation history (pure chain read)\")\n .requiredOption(\n \"--operator <address>\",\n \"User wallet address for this conversation\",\n )\n .option(\"--limit <n>\", \"Max recent messages to fetch\", (v) => parseInt(v, 10))\n .option(\"--json\", \"Output as JSON\");\n addCommonOptions(cmd).action(async (topic, options) => {\n await executeDmHistory(topic, options);\n });\n}\n\n// ============================================================\n// dm-auth-encode\n// ============================================================\n\nasync function executeDmAuthEncode(options: DmAuthEncodeOptions): Promise<void> {\n try {\n const { chainId } = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n });\n\n let topic = options.topic;\n if (!topic) {\n if (!options.agentAddress) {\n exitWithError(\n \"Must provide either --topic or --agent-address to generate a topic\",\n );\n }\n if (!isAddress(options.agentAddress!)) {\n exitWithError(`Invalid agent address: ${options.agentAddress}`);\n }\n topic = generateAgentChatTopic(options.agentAddress! as Address);\n }\n\n const result = buildConversationAuthTypedData({ topic, chainId });\n console.log(jsonStringify(result));\n } catch (error) {\n exitWithError(\n `dm-auth-encode failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentDmAuthEncodeCommand(parent: Command): void {\n parent\n .command(\"dm-auth-encode\")\n .description(\n \"Emit { typedData, topic } for external signing. \" +\n \"Pipe .typedData to your signer, pass .topic + the resulting \" +\n \"signature to `agent dm --topic ... --topic-signature ...`.\",\n )\n .option(\n \"--topic <topic>\",\n \"Existing topic to authorize (e.g. agent-chat-0x...-nanoid). \" +\n \"If omitted, a new topic is generated from --agent-address.\",\n )\n .option(\n \"--agent-address <address>\",\n \"Agent address — used to generate a new topic when --topic is omitted\",\n )\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\", (v) => parseInt(v, 10))\n .action(async (options) => {\n await executeDmAuthEncode(options);\n });\n}\n","/**\n * Session management commands for the external-signer flow (e.g. Bankr).\n *\n * The private-key flow creates sessions transparently via resolveAuth.\n * These commands expose the two-step flow so external signers can plug in:\n *\n * 1. `session-encode --operator 0x...` → { typedData, expiresAt }\n * 2. sign typedData externally (Bankr /agent/sign)\n * 3. `session-create --signature 0x... --expires-at N` → { sessionToken }\n */\n\nimport { Command } from \"commander\";\nimport { isAddress, type Hex } from \"viem\";\nimport {\n buildSessionTypedData,\n exchangeSessionSignature,\n NET_API_URL,\n} from \"@net-protocol/agents\";\nimport { exitWithError } from \"../../shared/output\";\nimport { jsonStringify } from \"./shared\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\n\ninterface SessionEncodeOptions {\n operator: string;\n chainId?: number;\n expiresIn?: number;\n}\n\ninterface SessionCreateOptions {\n operator: string;\n signature: string;\n expiresAt: number;\n chainId?: number;\n apiUrl?: string;\n}\n\nasync function executeSessionEncode(options: SessionEncodeOptions): Promise<void> {\n try {\n if (!isAddress(options.operator)) {\n exitWithError(`Invalid operator address: ${options.operator}`);\n }\n\n const { chainId } = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n });\n\n const result = buildSessionTypedData({\n operatorAddress: options.operator as `0x${string}`,\n chainId,\n expiresIn: options.expiresIn,\n });\n\n console.log(jsonStringify(result));\n } catch (error) {\n exitWithError(\n `session-encode failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentSessionEncodeCommand(parent: Command): void {\n parent\n .command(\"session-encode\")\n .description(\n \"Emit { typedData, expiresAt } for external signing (e.g., Bankr). \" +\n \"Pipe .typedData to your signer, pass .expiresAt + the resulting \" +\n \"signature to `agent session-create`.\",\n )\n .requiredOption(\n \"--operator <address>\",\n \"Address that will sign the session (must match signer)\",\n )\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\", (v) => parseInt(v, 10))\n .option(\n \"--expires-in <seconds>\",\n \"Session lifetime in seconds (default: 3600, max: 86400)\",\n (v) => parseInt(v, 10),\n )\n .action(async (options) => {\n await executeSessionEncode(options);\n });\n}\n\nasync function executeSessionCreate(options: SessionCreateOptions): Promise<void> {\n try {\n if (!isAddress(options.operator)) {\n exitWithError(`Invalid operator address: ${options.operator}`);\n }\n if (!options.signature.startsWith(\"0x\")) {\n exitWithError(\"--signature must be a 0x-prefixed hex string\");\n }\n if (!options.expiresAt || !Number.isFinite(options.expiresAt)) {\n exitWithError(\"--expires-at must be a unix timestamp (seconds)\");\n }\n\n const { chainId } = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n });\n const apiUrl = options.apiUrl || process.env.NET_API_URL || NET_API_URL;\n\n const result = await exchangeSessionSignature({\n apiUrl,\n chainId,\n operatorAddress: options.operator as `0x${string}`,\n signature: options.signature as Hex,\n expiresAt: options.expiresAt,\n });\n\n console.log(jsonStringify(result));\n } catch (error) {\n exitWithError(\n `session-create failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentSessionCreateCommand(parent: Command): void {\n parent\n .command(\"session-create\")\n .description(\n \"Exchange an externally-produced signature for a session token. \" +\n \"Pair with `agent session-encode`.\",\n )\n .requiredOption(\n \"--operator <address>\",\n \"Address that produced the signature (must match the ecrecover result)\",\n )\n .requiredOption(\"--signature <hex>\", \"EIP-712 signature over the session typed data\")\n .requiredOption(\n \"--expires-at <timestamp>\",\n \"expiresAt value from session-encode (unix seconds)\",\n (v) => parseInt(v, 10),\n )\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\", (v) => parseInt(v, 10))\n .option(\"--api-url <url>\", \"Net Protocol API URL\")\n .option(\n \"--json\",\n \"Output as JSON (default behavior; included for consistency with peer commands)\",\n )\n .action(async (options) => {\n await executeSessionCreate(options);\n });\n}\n","import { Command } from \"commander\";\nimport { registerAgentCreateCommand } from \"./create\";\nimport { registerAgentListCommand } from \"./list\";\nimport { registerAgentUpdateCommand } from \"./update\";\nimport { registerAgentHideCommand, registerAgentUnhideCommand } from \"./hide\";\nimport { registerAgentRunCommand } from \"./run\";\nimport { registerAgentInfoCommand } from \"./info\";\nimport {\n registerAgentDmCommand,\n registerAgentDmListCommand,\n registerAgentDmHistoryCommand,\n registerAgentDmAuthEncodeCommand,\n} from \"./dm\";\nimport {\n registerAgentSessionEncodeCommand,\n registerAgentSessionCreateCommand,\n} from \"./session\";\n\n/**\n * Register the agent command group with the commander program\n */\nexport function registerAgentCommand(program: Command): void {\n const agentCommand = program\n .command(\"agent\")\n .description(\"Onchain agent operations (create, manage, run, DM)\");\n\n // Agent CRUD + run\n registerAgentCreateCommand(agentCommand);\n registerAgentListCommand(agentCommand);\n registerAgentUpdateCommand(agentCommand);\n registerAgentHideCommand(agentCommand);\n registerAgentUnhideCommand(agentCommand);\n registerAgentRunCommand(agentCommand);\n registerAgentInfoCommand(agentCommand);\n\n // DM\n registerAgentDmCommand(agentCommand);\n registerAgentDmListCommand(agentCommand);\n registerAgentDmHistoryCommand(agentCommand);\n\n // External-signer flow (pair with Bankr or any EIP-712 signer)\n registerAgentSessionEncodeCommand(agentCommand);\n registerAgentSessionCreateCommand(agentCommand);\n registerAgentDmAuthEncodeCommand(agentCommand);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { createWalletClient, createPublicClient, http } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n fundBackendWallet,\n checkBackendWalletBalance,\n} from \"@net-protocol/relay\";\nimport {\n RELAY_ACCESS_KEY,\n NET_API_URL,\n NET_TESTNET_API_URL,\n} from \"@net-protocol/agents\";\nimport { parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\n\nconst CHAINS: Record<number, typeof base> = {\n 8453: base,\n 84532: baseSepolia,\n};\n\nfunction getApiUrl(chainId: number): string {\n return chainId === 84532 ? NET_TESTNET_API_URL : NET_API_URL;\n}\n\n/**\n * Register the relay command group with the commander program\n */\nexport function registerRelayCommand(program: Command): void {\n const relayCommand = program\n .command(\"relay\")\n .description(\"Relay operations (fund credits, check balance)\");\n\n // Fund\n relayCommand\n .command(\"fund\")\n .description(\"Add Net credits via x402 USDC payment\")\n .option(\"--amount <usd>\", \"Amount in USD to fund (default: 0.10)\", \"0.10\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\")\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n const { privateKey, chainId, rpcUrl } = parseCommonOptionsWithDefault({\n privateKey: options.privateKey,\n chainId: options.chainId ? parseInt(options.chainId, 10) : undefined,\n rpcUrl: options.rpcUrl,\n });\n\n const amount = parseFloat(options.amount);\n if (isNaN(amount) || amount <= 0) {\n exitWithError(\"Invalid amount. Must be a positive number.\");\n }\n\n const chain = CHAINS[chainId];\n if (!chain) {\n exitWithError(\n `Chain ${chainId} not supported for relay funding. Use Base (8453) or Base Sepolia (84532).`,\n );\n }\n\n const account = privateKeyToAccount(privateKey);\n const rpcUrls = getChainRpcUrls({ chainId, rpcUrl });\n\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrls[0]),\n });\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport: http(rpcUrls[0]),\n });\n\n // Build signer with correct shape for x402\n const signer = {\n address: account.address,\n signTypedData: (msg: Parameters<typeof walletClient.signTypedData>[0]) =>\n walletClient.signTypedData(msg),\n readContract: (args: Parameters<typeof publicClient.readContract>[0]) =>\n publicClient.readContract(args),\n sendTransaction: (\n args: Parameters<typeof walletClient.sendTransaction>[0],\n ) => walletClient.sendTransaction(args),\n };\n\n // Dynamic import x402 (ESM-only packages)\n const { x402Client, wrapFetchWithPayment, x402HTTPClient } =\n await import(\"@x402/fetch\");\n const { registerExactEvmScheme } = await import(\n \"@x402/evm/exact/client\"\n );\n\n const client = new x402Client();\n registerExactEvmScheme(client, { signer });\n const fetchWithPayment = wrapFetchWithPayment(fetch, client);\n const httpClient = new x402HTTPClient(client);\n\n const apiUrl = getApiUrl(chainId);\n\n if (!options.json) {\n console.log(\n `Funding $${amount.toFixed(2)} USDC to relay on chain ${chainId}...`,\n );\n }\n\n try {\n const result = await fundBackendWallet({\n apiUrl,\n chainId,\n operatorAddress: account.address,\n secretKey: RELAY_ACCESS_KEY,\n fetchWithPayment,\n httpClient,\n amount,\n });\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n success: true,\n paymentTxHash: result.paymentTxHash,\n backendWalletAddress: result.backendWalletAddress,\n amountUsd: amount,\n },\n null,\n 2,\n ),\n );\n } else {\n console.log(chalk.green(`\\n✓ Funded $${amount.toFixed(2)} successfully`));\n console.log(` Payment tx: ${result.paymentTxHash}`);\n console.log(\n ` Backend wallet: ${result.backendWalletAddress}`,\n );\n }\n } catch (error) {\n const msg =\n error instanceof Error ? error.message : String(error);\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: msg }, null, 2));\n process.exit(1);\n }\n exitWithError(`Funding failed: ${msg}`);\n }\n });\n\n // Balance\n relayCommand\n .command(\"balance\")\n .description(\"Check relay backend wallet balance\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n const { privateKey, chainId } = parseCommonOptionsWithDefault({\n privateKey: options.privateKey,\n chainId: options.chainId ? parseInt(options.chainId, 10) : undefined,\n });\n\n const account = privateKeyToAccount(privateKey);\n const apiUrl = getApiUrl(chainId);\n\n try {\n const result = await checkBackendWalletBalance({\n apiUrl,\n chainId,\n operatorAddress: account.address,\n secretKey: RELAY_ACCESS_KEY,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`Relay Balance`);\n console.log(` Backend wallet: ${result.backendWalletAddress}`);\n console.log(` Balance: ${result.balanceEth} ETH`);\n console.log(\n ` Sufficient: ${result.sufficientBalance ? chalk.green(\"Yes\") : chalk.red(\"No\")} (min: ${result.minRequiredEth} ETH)`,\n );\n }\n } catch (error) {\n const msg =\n error instanceof Error ? error.message : String(error);\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: msg }, null, 2));\n process.exit(1);\n }\n exitWithError(`Balance check failed: ${msg}`);\n }\n });\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport chalk from \"chalk\";\n\nconst CACHE_DIR = join(homedir(), \".netp\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst CHECK_INTERVAL_MS = 4 * 60 * 60 * 1000; // 4 hours\nconst FETCH_TIMEOUT_MS = 5000;\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion: string | null;\n}\n\nexport interface UpdateInfo {\n latest: string;\n}\n\nfunction isNewerVersion(latest: string, current: string): boolean {\n const l = latest.split(\".\").map(Number);\n const c = current.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((l[i] || 0) > (c[i] || 0)) return true;\n if ((l[i] || 0) < (c[i] || 0)) return false;\n }\n return false;\n}\n\nfunction readCache(): UpdateCache | null {\n try {\n if (existsSync(CACHE_FILE)) {\n return JSON.parse(readFileSync(CACHE_FILE, \"utf-8\"));\n }\n } catch {\n // Ignore corrupt cache\n }\n return null;\n}\n\nfunction writeCache(cache: UpdateCache): void {\n try {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n writeFileSync(CACHE_FILE, JSON.stringify(cache));\n } catch {\n // Ignore cache write failures\n }\n}\n\nasync function fetchLatestVersion(pkg: string): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n const res = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(pkg).replace(\"%40\", \"@\")}/latest`,\n { signal: controller.signal }\n );\n clearTimeout(timeout);\n if (res.ok) {\n const data = (await res.json()) as { version: string };\n return data.version;\n }\n } catch {\n // Network errors are expected (offline, timeout, etc.)\n }\n return null;\n}\n\n/**\n * Check npm registry for a newer version of @net-protocol/cli.\n * Uses a file-based cache to avoid hitting the registry on every invocation.\n * Returns UpdateInfo if an update is available, null otherwise.\n */\nexport async function getUpdateInfo(\n currentVersion: string\n): Promise<UpdateInfo | null> {\n const cache = readCache();\n\n // Use cached result if fresh\n if (cache && Date.now() - cache.lastCheck < CHECK_INTERVAL_MS) {\n if (\n cache.latestVersion &&\n isNewerVersion(cache.latestVersion, currentVersion)\n ) {\n return { latest: cache.latestVersion };\n }\n return null;\n }\n\n const latest = await fetchLatestVersion(\"@net-protocol/cli\");\n\n writeCache({\n lastCheck: Date.now(),\n latestVersion: latest,\n });\n\n if (latest && isNewerVersion(latest, currentVersion)) {\n return { latest };\n }\n\n return null;\n}\n\n/**\n * Print an update notification banner to stderr.\n * Uses stderr to avoid interfering with JSON output or piped commands.\n */\nexport function printUpdateBanner(current: string, latest: string): void {\n console.error(\"\");\n console.error(\n chalk.yellow(\n ` Update available: ${chalk.gray(current)} → ${chalk.green(latest)}`\n )\n );\n console.error(\n chalk.yellow(\n ` Run ${chalk.cyan(\"npm install -g @net-protocol/cli@latest\")} to update`\n )\n );\n console.error(\"\");\n}\n","#!/usr/bin/env node\n\n// Configure proxy support before any network requests\nimport { ProxyAgent, setGlobalDispatcher } from \"undici\";\n\nconst proxyUrl = process.env.https_proxy || process.env.HTTPS_PROXY;\nif (proxyUrl) {\n const agent = new ProxyAgent(proxyUrl);\n setGlobalDispatcher(agent);\n}\n\nimport \"dotenv/config\";\nimport { Command } from \"commander\";\nimport { createRequire } from \"module\";\nimport chalk from \"chalk\";\nimport { registerStorageCommand } from \"../commands/storage\";\nimport { registerMessageCommand } from \"../commands/message\";\nimport { registerChainsCommand } from \"../commands/chains\";\nimport { registerInfoCommand } from \"../commands/info\";\nimport { registerTokenCommand } from \"../commands/token\";\nimport { registerProfileCommand } from \"../commands/profile\";\nimport { registerBazaarCommand } from \"../commands/bazaar\";\nimport { registerFeedCommand } from \"../commands/feed\";\nimport { registerUpvoteCommand } from \"../commands/upvote\";\nimport { registerAgentCommand } from \"../commands/agent\";\nimport { registerRelayCommand } from \"../commands/relay\";\nimport { getUpdateInfo, printUpdateBanner } from \"../utils/update-check\";\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../../package.json\");\n\nconst program = new Command();\n\nprogram\n .name(\"netp\")\n .description(\"CLI tool for Net Protocol\")\n .version(version);\n\n// Register commands\nregisterStorageCommand(program);\nregisterMessageCommand(program);\nregisterChainsCommand(program);\nregisterInfoCommand(program);\nregisterTokenCommand(program);\nregisterProfileCommand(program);\nregisterBazaarCommand(program);\nregisterFeedCommand(program);\nregisterUpvoteCommand(program);\nregisterAgentCommand(program);\nregisterRelayCommand(program);\n\n// Add update command\nprogram\n .command(\"update\")\n .description(\"Update netp to the latest version\")\n .action(async () => {\n const { execSync } = await import(\"child_process\");\n\n console.log(\"Updating @net-protocol/cli...\");\n try {\n execSync(\"npm install -g @net-protocol/cli@latest\", {\n stdio: \"inherit\",\n });\n console.log(chalk.green(\"\\n✓ netp updated successfully\"));\n } catch {\n console.error(\n chalk.red(\n \"Failed to update. Try manually: npm install -g @net-protocol/cli@latest\"\n )\n );\n }\n });\n\n// Start non-blocking update check in parallel with command execution\nconst updatePromise = getUpdateInfo(version).catch(() => null);\n\nawait program.parseAsync();\n\n// Show update notification after command completes (with timeout so we don't hang)\ntry {\n const updateInfo = await Promise.race([\n updatePromise,\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 1500)),\n ]);\n if (updateInfo) {\n printUpdateBanner(version, updateInfo.latest);\n }\n} catch {\n // Never let update check interfere with normal operation\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/shared.ts","../../src/shared/urls.ts","../../src/commands/storage/storage/check.ts","../../src/commands/storage/utils.ts","../../src/commands/storage/transactions/prep.ts","../../src/commands/storage/transactions/filter.ts","../../src/commands/storage/transactions/send.ts","../../src/commands/storage/core/upload.ts","../../src/commands/storage/relay/recheckStorage.ts","../../src/commands/storage/relay/retry.ts","../../src/commands/storage/core/uploadRelay.ts","../../src/commands/storage/core/preview.ts","../../src/shared/output.ts","../../src/commands/storage/core/read.ts","../../src/shared/encode.ts","../../src/commands/storage/core/encode.ts","../../src/commands/storage/index.ts","../../src/shared/client.ts","../../src/commands/message/send.ts","../../src/commands/message/types.ts","../../src/commands/message/read.ts","../../src/commands/message/count.ts","../../src/commands/message/index.ts","../../src/commands/chains/index.ts","../../src/commands/info/index.ts","../../src/commands/token/deploy.ts","../../src/commands/token/info.ts","../../src/commands/token/index.ts","../../src/commands/profile/get.ts","../../src/commands/profile/set-picture.ts","../../src/commands/profile/utils.ts","../../src/commands/profile/set-username.ts","../../src/commands/profile/set-bio.ts","../../src/commands/profile/set-display-name.ts","../../src/commands/profile/set-token-address.ts","../../src/commands/profile/set-canvas.ts","../../src/commands/profile/get-canvas.ts","../../src/commands/profile/set-css.ts","../../src/commands/profile/get-css.ts","../../src/commands/profile/css-prompt.ts","../../src/commands/profile/index.ts","../../src/commands/bazaar/format.ts","../../src/commands/bazaar/list-listings.ts","../../src/commands/bazaar/list-offers.ts","../../src/commands/bazaar/list-sales.ts","../../src/commands/bazaar/create-listing.ts","../../src/commands/bazaar/create-offer.ts","../../src/commands/bazaar/submit-listing.ts","../../src/commands/bazaar/submit-offer.ts","../../src/commands/bazaar/buy-listing.ts","../../src/commands/bazaar/accept-offer.ts","../../src/commands/bazaar/owned-nfts.ts","../../src/commands/bazaar/list-erc20-listings.ts","../../src/commands/bazaar/list-erc20-offers.ts","../../src/commands/bazaar/create-erc20-listing.ts","../../src/commands/bazaar/create-erc20-offer.ts","../../src/commands/bazaar/submit-erc20-listing.ts","../../src/commands/bazaar/submit-erc20-offer.ts","../../src/commands/bazaar/buy-erc20-listing.ts","../../src/commands/bazaar/accept-erc20-offer.ts","../../src/shared/wallet.ts","../../src/commands/bazaar/cancel-listing.ts","../../src/commands/bazaar/cancel-offer.ts","../../src/commands/bazaar/cancel-erc20-listing.ts","../../src/commands/bazaar/cancel-erc20-offer.ts","../../src/commands/bazaar/index.ts","../../src/commands/feed/format.ts","../../src/commands/feed/list.ts","../../src/shared/state.ts","../../src/commands/feed/types.ts","../../src/commands/feed/read.ts","../../src/shared/messageIndex.ts","../../src/commands/feed/post.ts","../../src/shared/postId.ts","../../src/commands/feed/comment-write.ts","../../src/commands/feed/comment-read.ts","../../src/commands/feed/register.ts","../../src/commands/feed/replies.ts","../../src/commands/feed/posts.ts","../../src/commands/feed/confirm.ts","../../src/commands/feed/config.ts","../../src/commands/feed/history.ts","../../src/commands/feed/register-agent.ts","../../src/commands/feed/list-agents.ts","../../src/commands/feed/verify-claim.ts","../../src/commands/feed/index.ts","../../src/commands/upvote/upvote-token.ts","../../src/commands/upvote/get-upvotes.ts","../../src/commands/upvote/upvote-user.ts","../../src/commands/upvote/get-user-upvotes.ts","../../src/commands/upvote/index.ts","../../src/commands/agent/shared.ts","../../src/commands/agent/create.ts","../../src/commands/agent/list.ts","../../src/commands/agent/update.ts","../../src/commands/agent/hide.ts","../../src/commands/agent/run.ts","../../src/commands/agent/info.ts","../../src/commands/agent/dm.ts","../../src/commands/agent/session.ts","../../src/commands/agent/index.ts","../../src/commands/relay/index.ts","../../src/utils/update-check.ts","../../src/cli/index.ts"],"names":["chalk","base","hexToString","STORAGE_CONTRACT","StorageClient","getStorageKeyBytes","retryFailedTransactionsPackage","failedIndexes","backendWalletAddress","readFileSync","detectFileTypeFromBase64","base64ToDataUri","privateKeyToAccount","getPublicClient","getChainRpcUrls","createWalletClient","http","getBaseDataSuffix","shouldSuggestXmlStorage","stringToHex","fs","program","storageUrl","NetClient","Command","executeEncodeOnly","encodeFunctionData","isNetrSupportedChain","NetrClient","PROFILE_METADATA_STORAGE_KEY","parseProfileMetadata","publicActions","getProfileMetadataStorageArgs","fs2","PROFILE_CANVAS_STORAGE_KEY","CHUNKED_STORAGE_CONTRACT","path2","fs3","path3","fs4","PROFILE_CSS_STORAGE_KEY","path4","fs5","DEMO_THEMES","BazaarClient","parseEther","executeKeylessMode","bigintReplacer","calldata","stripFeedPrefix","path5","senderNote","getNetContract","client","txConfig","MAX_MESSAGE_LENGTH","resolve","decodeEventLog","PURE_ALPHA_STRATEGY","UNIV234_POOLS_STRATEGY","DYNAMIC_SPLIT_STRATEGY","getTokenScoreKey","NULL_ADDRESS","UserUpvoteClient","formatEther","createRelaySession","isAddress","AgentClient","NET_API_URL","createPublicClient","fundBackendWallet","RELAY_ACCESS_KEY","checkBackendWalletBalance","join","homedir","existsSync","mkdirSync","writeFileSync","require"],"mappings":"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","file":"index.mjs","sourcesContent":["import chalk from \"chalk\";\nimport type { CommonOptions, ReadOnlyOptions } from \"../shared/types\";\n\n/**\n * Default chain ID (Base mainnet) - used by feed commands\n */\nexport const DEFAULT_CHAIN_ID = 8453;\n\n/**\n * Get chain ID from option or environment variable, exit if not found\n */\nfunction getRequiredChainId(optionValue?: number): number {\n const chainId =\n optionValue ||\n (process.env.NET_CHAIN_ID\n ? parseInt(process.env.NET_CHAIN_ID, 10)\n : undefined);\n\n if (!chainId) {\n console.error(\n chalk.red(\n \"Error: Chain ID is required. Provide via --chain-id flag or NET_CHAIN_ID environment variable\"\n )\n );\n process.exit(1);\n }\n\n return chainId;\n}\n\n/**\n * Get chain ID from option or environment variable, defaulting to Base (8453)\n * Also checks BOTCHAN_* env vars for backward compat\n */\nfunction getChainIdWithDefault(optionValue?: number): number {\n if (optionValue) {\n return optionValue;\n }\n\n const envChainId =\n process.env.BOTCHAN_CHAIN_ID || process.env.NET_CHAIN_ID;\n\n if (envChainId) {\n return parseInt(envChainId, 10);\n }\n\n return DEFAULT_CHAIN_ID;\n}\n\n/**\n * Get RPC URL from option or environment variable\n */\nfunction getRpcUrl(optionValue?: string): string | undefined {\n return optionValue || process.env.NET_RPC_URL;\n}\n\n/**\n * Get RPC URL from option or environment variable, also checking BOTCHAN_* env vars.\n * Used only by feed commands for backward compat.\n */\nfunction getRpcUrlWithBotchanFallback(optionValue?: string): string | undefined {\n return optionValue || process.env.BOTCHAN_RPC_URL || process.env.NET_RPC_URL;\n}\n\n/**\n * Parse and validate common options shared across all commands.\n * Extracts private key, chain ID, and RPC URL from command options or environment variables.\n * @param options - Command options\n * @param supportsEncodeOnly - If true, mention --encode-only in error messages as an alternative\n */\nexport function parseCommonOptions(\n options: {\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n },\n supportsEncodeOnly = false\n): CommonOptions {\n const privateKey =\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY;\n\n if (!privateKey) {\n const encodeOnlyHint = supportsEncodeOnly\n ? \", or use --encode-only to output transaction data without submitting\"\n : \"\";\n console.error(\n chalk.red(\n `Error: Private key is required. Provide via --private-key flag or NET_PRIVATE_KEY/PRIVATE_KEY environment variable${encodeOnlyHint}`\n )\n );\n process.exit(1);\n }\n\n if (!privateKey.startsWith(\"0x\") || privateKey.length !== 66) {\n console.error(\n chalk.red(\n \"Error: Invalid private key format (must be 0x-prefixed, 66 characters)\"\n )\n );\n process.exit(1);\n }\n\n if (options.privateKey) {\n console.warn(\n chalk.yellow(\n \"Warning: Private key provided via command line. Consider using NET_PRIVATE_KEY environment variable instead.\"\n )\n );\n }\n\n return {\n privateKey: privateKey as `0x${string}`,\n chainId: getRequiredChainId(options.chainId),\n rpcUrl: getRpcUrl(options.rpcUrl),\n };\n}\n\n/**\n * Parse and validate read-only options for commands that don't need a private key.\n * Extracts chain ID and RPC URL from command options or environment variables.\n */\nexport function parseReadOnlyOptions(options: {\n chainId?: number;\n rpcUrl?: string;\n}): ReadOnlyOptions {\n return {\n chainId: getRequiredChainId(options.chainId),\n rpcUrl: getRpcUrl(options.rpcUrl),\n };\n}\n\n/**\n * Parse read-only options with a default chain ID (8453/Base).\n * Used by feed commands where chain ID is optional.\n * Also checks BOTCHAN_* env vars for backward compat.\n */\nexport function parseReadOnlyOptionsWithDefault(options: {\n chainId?: number;\n rpcUrl?: string;\n}): ReadOnlyOptions {\n return {\n chainId: getChainIdWithDefault(options.chainId),\n rpcUrl: getRpcUrlWithBotchanFallback(options.rpcUrl),\n };\n}\n\n/**\n * Parse common options with a default chain ID (8453/Base).\n * Used by feed write commands where chain ID is optional.\n * Also checks BOTCHAN_* env vars for backward compat.\n */\nexport function parseCommonOptionsWithDefault(\n options: {\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n },\n supportsEncodeOnly = false\n): CommonOptions {\n const privateKey =\n options.privateKey ||\n process.env.BOTCHAN_PRIVATE_KEY ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY;\n\n if (!privateKey) {\n const encodeOnlyHint = supportsEncodeOnly\n ? \", or use --encode-only to output transaction data without submitting\"\n : \"\";\n console.error(\n chalk.red(\n `Error: Private key is required. Provide via --private-key flag or NET_PRIVATE_KEY/BOTCHAN_PRIVATE_KEY environment variable${encodeOnlyHint}`\n )\n );\n process.exit(1);\n }\n\n if (!privateKey.startsWith(\"0x\") || privateKey.length !== 66) {\n console.error(\n chalk.red(\n \"Error: Invalid private key format (must be 0x-prefixed, 66 characters)\"\n )\n );\n process.exit(1);\n }\n\n if (options.privateKey) {\n console.warn(\n chalk.yellow(\n \"Warning: Private key provided via command line. Consider using NET_PRIVATE_KEY environment variable instead.\"\n )\n );\n }\n\n return {\n privateKey: privateKey as `0x${string}`,\n chainId: getChainIdWithDefault(options.chainId),\n rpcUrl: getRpcUrlWithBotchanFallback(options.rpcUrl),\n };\n}\n","/**\n * URL builders for Net Protocol web pages and external services.\n *\n * These helpers exist so callers (and AI agents reading CLI JSON output) never\n * need to construct URLs by hand. URL grammar quirks (the \"feed-\" topic\n * prefix, hyphen-vs-colon separators in comment IDs, lowercased addresses,\n * etc.) all live here in one place.\n *\n * Chain slugs and block-explorer base URLs come from\n * `@net-protocol/core`'s chain config — this module deliberately holds no\n * per-chain tables of its own.\n */\n\nimport {\n getChainBlockExplorer,\n getChainSlug,\n} from \"@net-protocol/core\";\nimport { encodeStorageKeyForUrl } from \"@net-protocol/storage\";\n\nconst WEBSITE_BASE = \"https://netprotocol.app\";\nconst STORAGE_BASE = \"https://storedon.net\";\n\nexport function chainSlug(chainId: number): string | null {\n return getChainSlug({ chainId }) ?? null;\n}\n\n/**\n * Strip the \"feed-\" prefix from a topic if present (case-insensitive).\n * Used when converting an on-chain topic to the URL path/query form.\n */\nfunction stripFeedPrefix(topic: string): string {\n const lower = topic.toLowerCase();\n return lower.startsWith(\"feed-\") ? lower.slice(5) : lower;\n}\n\n/**\n * URL of a feed page. `feedName` may be passed with or without the \"feed-\"\n * prefix; either way the URL form is stripped+lowercased.\n */\nexport function feedUrl(chainId: number, feedName: string): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/feed/${slug}/${stripFeedPrefix(feedName)}`;\n}\n\n/**\n * URL of an address's wall (their personal feed at `feed-{lower(address)}`).\n */\nexport function walletUrl(chainId: number, address: string): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/feed/${slug}/${address.toLowerCase()}`;\n}\n\n/**\n * URL of a user/agent profile page.\n */\nexport function profileUrl(chainId: number, address: string): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/profile/${slug}/${address.toLowerCase()}`;\n}\n\n/**\n * URL of a group chat page.\n */\nexport function chatUrl(chainId: number, chatName: string): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/chat/${slug}/${encodeURIComponent(\n chatName.toLowerCase()\n )}`;\n}\n\n/**\n * URL of a Netr token page.\n */\nexport function tokenUrl(\n chainId: number,\n tokenAddress: string\n): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/token/${slug}/${tokenAddress.toLowerCase()}`;\n}\n\n/**\n * URL of a Bazaar NFT collection page.\n */\nexport function bazaarUrl(\n chainId: number,\n nftAddress: string\n): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/bazaar/${slug}/${nftAddress.toLowerCase()}`;\n}\n\n/**\n * URL of an onchain agent detail page.\n */\nexport function agentUrl(chainId: number, agentId: string): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n return `${WEBSITE_BASE}/app/agents/${slug}/${encodeURIComponent(agentId)}`;\n}\n\n/**\n * Public storage retrieval URL via storedon.net. Works on any chain with Net\n * Storage deployed (returns a URL even when chainSlug is unknown — storedon\n * uses numeric chain IDs).\n *\n * Uses `encodeStorageKeyForUrl` from `@net-protocol/storage` so the encoder\n * stays in sync with the storage SDK if it ever needs to handle binary keys\n * or other special characters differently from `encodeURIComponent`.\n */\nexport function storageUrl(\n chainId: number,\n operatorAddress: string,\n key: string\n): string {\n return `${STORAGE_BASE}/net/${chainId}/storage/load/${operatorAddress.toLowerCase()}/${encodeStorageKeyForUrl(\n key\n )}`;\n}\n\nexport function explorerTxUrl(\n chainId: number,\n txHash: string\n): string | null {\n const base = getChainBlockExplorer({ chainId })?.url;\n if (!base) return null;\n return `${base}/tx/${txHash}`;\n}\n\nexport function explorerAddressUrl(\n chainId: number,\n address: string\n): string | null {\n const base = getChainBlockExplorer({ chainId })?.url;\n if (!base) return null;\n return `${base}/address/${address}`;\n}\n\n/**\n * Convert a post ID (`{sender}:{timestamp}`) into the comment-permalink form\n * used by the web's `?commentId=` query parameter (`{sender}-{timestamp}`).\n *\n * The two formats are intentionally documented separately because the website\n * scrolls to the DOM id `comment-{sender}-{timestamp}` and matches against the\n * raw query value (see CommentThread.tsx in the Net repo).\n */\nexport function postIdToCommentParam(postId: string): string {\n const colon = postId.indexOf(\":\");\n if (colon === -1) return postId;\n return `${postId.slice(0, colon)}-${postId.slice(colon + 1)}`;\n}\n\nexport interface PostPermalinkOptions {\n /**\n * Global message index from the contract's MessageSent event. Most reliable\n * when available — works regardless of how the post was queried.\n */\n globalIndex?: number;\n /** Topic-filtered absolute index (from a topic-scoped read). */\n topic?: string;\n topicIndex?: number;\n /** Maker-filtered absolute index (from a sender-scoped read). */\n user?: string;\n userIndex?: number;\n /**\n * Optional comment to deep-link. Pass either a post-ID-style string\n * (`{sender}:{timestamp}` — colon will be normalized to hyphen) or the\n * already-converted form.\n */\n commentId?: string;\n}\n\n/**\n * Build a permalink to the dedicated post page. Picks the most reliable URL\n * form available, in priority order: global -> topic -> user. Returns null\n * when no usable index is provided or chain is unknown.\n */\nexport function postPermalink(\n chainId: number,\n opts: PostPermalinkOptions\n): string | null {\n const slug = chainSlug(chainId);\n if (!slug) return null;\n\n const params = new URLSearchParams();\n\n if (opts.globalIndex != null) {\n params.set(\"index\", String(opts.globalIndex));\n } else if (opts.topic != null && opts.topicIndex != null) {\n params.set(\"topic\", stripFeedPrefix(opts.topic));\n params.set(\"index\", String(opts.topicIndex));\n } else if (opts.user != null && opts.userIndex != null) {\n params.set(\"user\", opts.user.toLowerCase());\n params.set(\"index\", String(opts.userIndex));\n } else {\n return null;\n }\n\n if (opts.commentId) {\n params.set(\"commentId\", postIdToCommentParam(opts.commentId));\n }\n\n return `${WEBSITE_BASE}/app/feed/${slug}/post?${params.toString()}`;\n}\n\n/**\n * URL of the canonical hosted skill (proxies to net-public/SKILL.md).\n */\nexport const HOSTED_SKILL_URL = `${WEBSITE_BASE}/skill.md`;\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport type {\n StorageCheckResult,\n CheckNormalStorageExistsParams,\n CheckChunkedStorageExistsParams,\n CheckXmlChunksExistParams,\n CheckXmlMetadataExistsParams,\n} from \"../types\";\n\n/**\n * Check if normal storage data exists and matches content\n * Pure function - uses StorageClient, no side effects\n * Accepts JSON object as parameter\n */\nexport async function checkNormalStorageExists(\n params: CheckNormalStorageExistsParams\n): Promise<StorageCheckResult> {\n const { storageClient, storageKey, operatorAddress, expectedContent } = params;\n const existing = await storageClient.get({\n key: storageKey,\n operator: operatorAddress,\n });\n\n if (!existing) {\n return { exists: false };\n }\n\n // Compare content\n const storedContent = hexToString(existing.value as `0x${string}`);\n const matches = storedContent === expectedContent;\n\n return { exists: true, matches };\n}\n\n/**\n * Check if ChunkedStorage data exists\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkChunkedStorageExists(\n params: CheckChunkedStorageExistsParams\n): Promise<boolean> {\n const { storageClient, chunkedHash, operatorAddress } = params;\n const meta = await storageClient.getChunkedMetadata({\n key: chunkedHash,\n operator: operatorAddress,\n });\n\n return meta !== null && meta.chunkCount > 0;\n}\n\n/**\n * Check which XML chunks already exist in ChunkedStorage\n * Returns Set of chunkedStorage hashes that exist\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkXmlChunksExist(\n params: CheckXmlChunksExistParams\n): Promise<Set<string>> {\n const { storageClient, chunkedHashes, operatorAddress } = params;\n const existing = new Set<string>();\n\n // Check each chunk in parallel for efficiency\n await Promise.all(\n chunkedHashes.map(async (hash) => {\n const exists = await checkChunkedStorageExists({\n storageClient,\n chunkedHash: hash,\n operatorAddress,\n });\n if (exists) {\n existing.add(hash);\n }\n })\n );\n\n return existing;\n}\n\n/**\n * Check if XML metadata exists and matches expected metadata\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkXmlMetadataExists(\n params: CheckXmlMetadataExistsParams\n): Promise<StorageCheckResult> {\n const { storageClient, storageKey, operatorAddress, expectedMetadata } = params;\n const existing = await storageClient.get({\n key: storageKey,\n operator: operatorAddress,\n });\n\n if (!existing) {\n return { exists: false };\n }\n\n const storedMetadata = hexToString(existing.value as `0x${string}`);\n const matches = storedMetadata === expectedMetadata;\n\n return { exists: true, matches };\n}\n\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { WriteTransactionConfig } from \"@net-protocol/core\";\nimport { storageUrl } from \"../../shared/urls\";\nimport {\n checkNormalStorageExists,\n checkChunkedStorageExists,\n checkXmlMetadataExists,\n} from \"./storage/check\";\nimport type {\n TransactionWithId,\n StorageTransactionArgs,\n CheckTransactionExistsParams,\n} from \"./types\";\n\n/**\n * Convert typed args to array (for viem compatibility)\n */\nexport function typedArgsToArray(\n args: StorageTransactionArgs\n): readonly unknown[] {\n if (args.type === \"normal\" || args.type === \"metadata\") {\n return [args.args.key, args.args.text, args.args.value];\n } else {\n return [args.args.hash, args.args.text, args.args.chunks];\n }\n}\n\n/**\n * Extract typed args from WriteTransactionConfig\n */\nexport function extractTypedArgsFromTransaction(\n tx: WriteTransactionConfig,\n type: \"normal\" | \"chunked\" | \"metadata\"\n): StorageTransactionArgs {\n if (type === \"normal\" || type === \"metadata\") {\n return {\n type,\n args: {\n key: tx.args[0] as `0x${string}`,\n text: tx.args[1] as string,\n value: tx.args[2] as `0x${string}`,\n },\n };\n } else {\n return {\n type: \"chunked\",\n args: {\n hash: tx.args[0] as `0x${string}`,\n text: tx.args[1] as string,\n chunks: tx.args[2] as `0x${string}`[],\n },\n };\n }\n}\n\n/**\n * Extract content string from transaction typed args\n * Helper to eliminate duplication of hexToString pattern\n */\nexport function extractContentFromTransaction(\n tx: TransactionWithId\n): string {\n if (tx.typedArgs.type === \"normal\" || tx.typedArgs.type === \"metadata\") {\n return hexToString(tx.typedArgs.args.value);\n } else {\n // For chunked transactions, return empty string (no content to extract)\n return \"\";\n }\n}\n\n/**\n * Generate storage URL for displaying to user.\n *\n * Thin wrapper around the canonical builder in `shared/urls.ts` so the CLI\n * has exactly one place where storage URLs are produced. The wrapper exists\n * to preserve this function's \"undefined when operator is missing\" contract,\n * which several call sites rely on.\n */\nexport function generateStorageUrl(\n operatorAddress: string | undefined,\n chainId: number,\n storageKey: string\n): string | undefined {\n if (!operatorAddress) return undefined;\n return storageUrl(chainId, operatorAddress, storageKey);\n}\n\n/**\n * Check if a transaction's data already exists (idempotency check)\n * Consolidates existence check logic used in both filtering and sending\n * Accepts JSON object as parameter\n */\nexport async function checkTransactionExists(\n params: CheckTransactionExistsParams\n): Promise<boolean> {\n const { storageClient, tx, operatorAddress } = params;\n if (tx.type === \"normal\") {\n // Extract expected content from typed args\n if (tx.typedArgs.type === \"normal\") {\n const expectedContent = hexToString(tx.typedArgs.args.value);\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent,\n });\n return check.exists && check.matches === true;\n }\n } else if (tx.type === \"chunked\") {\n // ChunkedStorage: hash existence = content match (deterministic hash)\n return await checkChunkedStorageExists({\n storageClient,\n chunkedHash: tx.id,\n operatorAddress,\n });\n } else if (tx.type === \"metadata\") {\n // XML metadata: extract and compare content\n if (tx.typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(tx.typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedMetadata,\n });\n return check.exists && check.matches === true;\n }\n }\n return false;\n}\n\n","import { WriteTransactionConfig } from \"@net-protocol/core\";\nimport { StorageClient, getStorageKeyBytes } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport type {\n TransactionWithId,\n NormalStorageArgs,\n PrepareXmlStorageTransactionsParams,\n} from \"../types\";\nimport { extractTypedArgsFromTransaction, typedArgsToArray } from \"../utils\";\n\n/**\n * Prepare normal storage transaction with ID\n * Uses StorageClient.preparePut() from net-public\n * Accepts typed JSON args object instead of individual parameters\n */\nexport function prepareNormalStorageTransaction(\n storageClient: StorageClient,\n args: NormalStorageArgs,\n originalStorageKey: string // Original string key needed for preparePut\n): TransactionWithId {\n // Use StorageClient.preparePut() from net-public\n // preparePut needs the original string key, not bytes32\n const content = hexToString(args.value);\n \n const transaction = storageClient.preparePut({\n key: originalStorageKey,\n text: args.text,\n value: content,\n });\n\n const typedArgs = {\n type: \"normal\" as const,\n args,\n };\n\n return {\n id: args.key,\n type: \"normal\",\n transaction,\n typedArgs,\n };\n}\n\n/**\n * Prepare XML storage transactions with IDs\n * Returns array: [metadata transaction, ...chunk transactions]\n * Uses StorageClient.prepareXmlStorage() from net-public\n * Accepts JSON object as parameter\n */\nexport function prepareXmlStorageTransactions(\n params: PrepareXmlStorageTransactionsParams\n): TransactionWithId[] {\n const { storageClient, storageKey, text, content, operatorAddress, chunkSize } = params;\n const storageKeyBytes = getStorageKeyBytes(storageKey) as `0x${string}`;\n\n // Use StorageClient.prepareXmlStorage() from net-public\n // This handles all the chunking, ChunkedStorage preparation, and metadata generation\n // Pass storageKey as string - prepareXmlStorage will convert it internally\n const result = storageClient.prepareXmlStorage({\n data: content,\n operatorAddress: operatorAddress as `0x${string}`,\n storageKey: storageKey, // Pass as string, not bytes32\n filename: text,\n useChunkedStorageBackend: true, // Use ChunkedStorage backend (default)\n chunkSize,\n });\n\n // Map WriteTransactionConfig[] to TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const transactions: TransactionWithId[] = result.transactionConfigs.map(\n (tx, index) => {\n if (index === 0) {\n // First transaction is metadata - use our storageKeyBytes for ID\n const typedArgs = extractTypedArgsFromTransaction(tx, \"metadata\");\n return {\n id: storageKeyBytes,\n type: \"metadata\",\n transaction: tx,\n typedArgs,\n };\n } else {\n // Rest are ChunkedStorage transactions\n // Extract typed args and get hash from typed args\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const chunkedHash = typedArgs.args.hash;\n return {\n id: chunkedHash,\n type: \"chunked\",\n transaction: tx,\n typedArgs,\n };\n }\n // This should never happen, but TypeScript needs it\n throw new Error(\"Invalid chunked transaction\");\n }\n }\n );\n\n return transactions;\n}\n\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { WriteTransactionConfig } from \"@net-protocol/core\";\nimport {\n STORAGE_CONTRACT,\n CHUNKED_STORAGE_CONTRACT,\n} from \"@net-protocol/storage\";\nimport {\n checkNormalStorageExists,\n checkChunkedStorageExists,\n checkXmlChunksExist,\n checkXmlMetadataExists,\n} from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\nimport type {\n TransactionWithId,\n FilterExistingTransactionsParams,\n FilterXmlStorageTransactionsParams,\n} from \"../types\";\n\n/**\n * Filter transactions to only those that need to be sent\n * Checks existence for each transaction and filters out already-stored ones\n * Pure function - uses StorageClient, no side effects\n * Accepts JSON object as parameter\n */\nexport async function filterExistingTransactions(\n params: FilterExistingTransactionsParams\n): Promise<{\n toSend: TransactionWithId[];\n skipped: TransactionWithId[];\n}> {\n const { storageClient, transactions, operatorAddress, expectedContent } =\n params;\n const toSend: TransactionWithId[] = [];\n const skipped: TransactionWithId[] = [];\n\n for (const tx of transactions) {\n let exists = false;\n\n if (tx.type === \"normal\") {\n // Normal storage: always check if exists AND matches content\n if (expectedContent) {\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent,\n });\n exists = check.exists && check.matches === true;\n } else {\n // Extract content from typed args if not provided\n if (tx.typedArgs.type === \"normal\") {\n const storedContent = hexToString(tx.typedArgs.args.value);\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent: storedContent,\n });\n exists = check.exists && check.matches === true;\n }\n }\n } else if (tx.type === \"chunked\") {\n // ChunkedStorage: check if metadata exists\n exists = await checkChunkedStorageExists({\n storageClient,\n chunkedHash: tx.id,\n operatorAddress,\n });\n } else if (tx.type === \"metadata\") {\n // XML metadata: check if exists\n // Extract expected metadata from typed args (it's hex-encoded)\n if (tx.typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(tx.typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedMetadata,\n });\n exists = check.exists && check.matches === true;\n }\n }\n\n if (exists) {\n skipped.push(tx);\n } else {\n toSend.push(tx);\n }\n }\n\n return { toSend, skipped };\n}\n\n/**\n * Filter XML storage transactions more efficiently\n * Checks all chunks in parallel, then filters\n * Accepts WriteTransactionConfig[] directly and derives chunkedHashes internally\n * Accepts JSON object as parameter\n */\nexport async function filterXmlStorageTransactions(\n params: FilterXmlStorageTransactionsParams\n): Promise<{\n toSend: WriteTransactionConfig[];\n skipped: WriteTransactionConfig[];\n}> {\n const { storageClient, transactions, operatorAddress } = params;\n\n // Separate metadata and chunk transactions by contract address\n const metadataTx = transactions.find(\n (tx) => tx.to.toLowerCase() === STORAGE_CONTRACT.address.toLowerCase()\n );\n const chunkTxs = transactions.filter(\n (tx) => tx.to.toLowerCase() === CHUNKED_STORAGE_CONTRACT.address.toLowerCase()\n );\n\n // Derive chunkedHashes internally from WriteTransactionConfig[] args\n const chunkedHashes: string[] = [];\n for (const tx of chunkTxs) {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n chunkedHashes.push(typedArgs.args.hash); // Content-based hash (keccak256(xmlChunk))\n }\n }\n\n const toSend: WriteTransactionConfig[] = [];\n const skipped: WriteTransactionConfig[] = [];\n\n // Check which chunks exist (parallel check)\n const existingChunks = await checkXmlChunksExist({\n storageClient,\n chunkedHashes,\n operatorAddress,\n });\n\n // Filter chunk transactions\n for (const tx of chunkTxs) {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const hash = typedArgs.args.hash;\n if (existingChunks.has(hash)) {\n skipped.push(tx);\n } else {\n toSend.push(tx);\n }\n }\n }\n\n // Check metadata (if all chunks exist and match, skip metadata too)\n if (metadataTx) {\n const allChunksExist = chunkedHashes.length > 0 && chunkedHashes.every((hash) =>\n existingChunks.has(hash)\n );\n if (allChunksExist) {\n // Verify metadata matches\n try {\n const typedArgs = extractTypedArgsFromTransaction(metadataTx, \"metadata\");\n if (typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: typedArgs.args.key,\n operatorAddress,\n expectedMetadata,\n });\n if (check.exists && check.matches) {\n skipped.push(metadataTx);\n } else {\n toSend.unshift(metadataTx); // Metadata first\n }\n }\n } catch {\n // If we can't extract metadata args, include in toSend\n toSend.unshift(metadataTx);\n }\n } else {\n toSend.unshift(metadataTx); // Metadata first\n }\n }\n\n return { toSend, skipped };\n}\n","import { createWalletClient, http, WalletClient, defineChain, PublicClient } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport {\n getPublicClient,\n getChainRpcUrls,\n getBaseDataSuffix,\n} from \"@net-protocol/core\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { checkTransactionExists, typedArgsToArray } from \"../utils\";\nimport type {\n TransactionWithId,\n UploadResult,\n CreateWalletClientParams,\n SendTransactionsParams,\n} from \"../types\";\n\n/**\n * Create wallet client from private key\n * Accepts JSON object as parameter\n */\nexport function createWalletClientFromPrivateKey(\n params: CreateWalletClientParams\n): {\n walletClient: WalletClient;\n publicClient: PublicClient;\n operatorAddress: `0x${string}`;\n} {\n const { privateKey, chainId, rpcUrl } = params;\n const account = privateKeyToAccount(privateKey);\n const publicClient = getPublicClient({ chainId, rpcUrl });\n\n // Get RPC URLs for the chain\n const rpcUrls = getChainRpcUrls({ chainId, rpcUrl });\n\n // Create wallet client with the same chain configuration\n const chain = publicClient.chain\n ? defineChain({\n id: chainId,\n name: publicClient.chain.name,\n nativeCurrency: publicClient.chain.nativeCurrency,\n rpcUrls: {\n default: { http: rpcUrls },\n public: { http: rpcUrls },\n },\n blockExplorers: publicClient.chain.blockExplorers,\n })\n : defineChain({\n id: chainId,\n name: `Chain ${chainId}`,\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: { http: rpcUrls },\n public: { http: rpcUrls },\n },\n });\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport: http(),\n dataSuffix: getBaseDataSuffix(chainId),\n });\n\n return {\n walletClient,\n publicClient,\n operatorAddress: account.address,\n };\n}\n\n/**\n * Send transactions sequentially with idempotency checks\n * Checks existence before each transaction (handles partial retries)\n * Accepts JSON object as parameter\n */\nexport async function sendTransactionsWithIdempotency(\n params: SendTransactionsParams\n): Promise<UploadResult> {\n const { storageClient, walletClient, publicClient, transactions, operatorAddress } = params;\n let sent = 0;\n let skipped = 0;\n let failed = 0;\n let finalHash: string | undefined;\n const errorMessages: string[] = [];\n\n for (let i = 0; i < transactions.length; i++) {\n const tx = transactions[i];\n\n try {\n // Check if this transaction's data already exists (idempotency)\n // Always compare content, not just check existence\n const exists = await checkTransactionExists({\n storageClient,\n tx,\n operatorAddress,\n });\n\n if (exists) {\n console.log(\n `⏭️ Transaction ${i + 1}/${\n transactions.length\n } skipped (already stored): ${tx.id}`\n );\n skipped++;\n continue;\n }\n\n // Send transaction\n console.log(\n `📤 Sending transaction ${i + 1}/${transactions.length}: ${tx.id}`\n );\n // Convert typed args to array for viem compatibility\n const args = typedArgsToArray(tx.typedArgs);\n if (!walletClient.account) {\n throw new Error(\"Wallet client must have an account\");\n }\n const hash = await walletClient.writeContract({\n account: walletClient.account,\n address: tx.transaction.to as `0x${string}`,\n abi: tx.transaction.abi,\n functionName: tx.transaction.functionName as string,\n args,\n value: tx.transaction.value,\n chain: null,\n });\n\n // Wait for confirmation\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n console.log(\n `✓ Transaction ${i + 1} confirmed in block ${\n receipt.blockNumber\n } (hash: ${hash})`\n );\n\n sent++;\n finalHash = hash;\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : String(error);\n console.error(`✗ Transaction ${i + 1} failed: ${errorMsg}`);\n errorMessages.push(errorMsg);\n failed++;\n // Continue with remaining transactions (don't fail entire upload)\n }\n }\n\n return {\n success: failed === 0,\n skipped: skipped > 0,\n transactionsSent: sent,\n transactionsSkipped: skipped,\n transactionsFailed: failed,\n finalHash,\n error: errorMessages.length > 0 ? errorMessages.join(\"; \") : undefined,\n };\n}\n\n","import { readFileSync } from \"fs\";\nimport {\n shouldSuggestXmlStorage,\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { stringToHex } from \"viem\";\nimport {\n prepareNormalStorageTransaction,\n prepareXmlStorageTransactions,\n} from \"../transactions/prep\";\nimport {\n filterExistingTransactions,\n filterXmlStorageTransactions,\n} from \"../transactions/filter\";\nimport {\n createWalletClientFromPrivateKey,\n sendTransactionsWithIdempotency,\n} from \"../transactions/send\";\nimport type {\n UploadOptions,\n UploadResult,\n TransactionWithId,\n NormalStorageArgs,\n} from \"../types\";\n\n/**\n * Main upload function - orchestrates the entire upload process\n */\nexport async function uploadFile(\n options: UploadOptions\n): Promise<UploadResult> {\n // 1. Read file\n // Read file as buffer (binary) first\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n // Check for null bytes or non-text characters (excluding common whitespace)\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n // Convert binary file to base64 string (valid UTF-8)\n const base64String = fileBuffer.toString(\"base64\");\n\n // Detect file type and add data URI prefix if detected\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n // Include data URI prefix for better type preservation\n // Format: \"data:audio/mpeg;base64,SUQz...\"\n fileContent = base64ToDataUri(base64String);\n } else {\n // Fallback to raw base64 if detection fails\n fileContent = base64String;\n }\n } else {\n // Read as UTF-8 for text files\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 3. Create wallet client\n const { walletClient, publicClient, operatorAddress } =\n createWalletClientFromPrivateKey({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // 4. Determine storage type\n const useXmlStorage = shouldSuggestXmlStorage(fileContent);\n const storageType: \"normal\" | \"xml\" = useXmlStorage ? \"xml\" : \"normal\";\n\n // 5. Prepare transactions\n let transactions: TransactionWithId[];\n\n if (useXmlStorage) {\n transactions = prepareXmlStorageTransactions({\n storageClient,\n storageKey: options.storageKey,\n text: options.text,\n content: fileContent,\n operatorAddress,\n chunkSize: options.chunkSize,\n });\n // No need to extract chunkedHashes - filterXmlStorageTransactions derives them internally\n } else {\n // Build typed args JSON object\n const storageKeyBytes = getStorageKeyBytes(\n options.storageKey\n ) as `0x${string}`;\n const typedArgs: NormalStorageArgs = {\n key: storageKeyBytes,\n text: options.text,\n value: stringToHex(fileContent),\n };\n\n transactions = [\n prepareNormalStorageTransaction(\n storageClient,\n typedArgs,\n options.storageKey // Pass original string key for preparePut\n ),\n ];\n }\n\n // 6. Filter existing transactions (idempotency)\n let transactionsToSend: TransactionWithId[];\n let skippedCount = 0;\n\n if (useXmlStorage) {\n // Extract WriteTransactionConfig[] from TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const chunkTransactions = transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => tx.transaction);\n\n // Create a map from WriteTransactionConfig to TransactionWithId for easy lookup\n const txConfigToTxWithId = new Map(\n transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => [tx.transaction, tx])\n );\n\n const filtered = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTransactions, // Only chunk transactions\n operatorAddress,\n });\n\n // Map filtered WriteTransactionConfig[] back to TransactionWithId[]\n const filteredToSend: TransactionWithId[] = filtered.toSend\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n const filteredSkipped: TransactionWithId[] = filtered.skipped\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n // Metadata is handled separately - check if it needs to be sent\n const metadataTx = transactions.find((tx) => tx.type === \"metadata\");\n if (metadataTx) {\n // For now, always include metadata in toSend (caller should check separately)\n filteredToSend.unshift(metadataTx);\n }\n\n transactionsToSend = filteredToSend;\n skippedCount = filteredSkipped.length;\n } else {\n const filtered = await filterExistingTransactions({\n storageClient,\n transactions,\n operatorAddress,\n expectedContent: fileContent,\n });\n transactionsToSend = filtered.toSend;\n skippedCount = filtered.skipped.length;\n }\n\n // 7. Check if all transactions were skipped\n if (transactionsToSend.length === 0) {\n return {\n success: true,\n skipped: true,\n transactionsSent: 0,\n transactionsSkipped: skippedCount,\n transactionsFailed: 0,\n operatorAddress,\n storageType,\n };\n }\n\n // 8. Send transactions\n const result = await sendTransactionsWithIdempotency({\n storageClient,\n walletClient,\n publicClient,\n transactions: transactionsToSend,\n operatorAddress,\n });\n\n // Add skipped count from filtering step\n result.transactionsSkipped += skippedCount;\n\n // Add operator address and storage type to result\n result.operatorAddress = operatorAddress;\n result.storageType = storageType;\n\n return result;\n}\n","import type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { StorageClient } from \"@net-protocol/storage\";\nimport type { Address } from \"viem\";\nimport { checkXmlChunksExist } from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\n\n/**\n * Storage-specific recheck function for retry logic\n *\n * Re-checks failed transactions on-chain before retry to filter out\n * transactions that have succeeded since the last attempt.\n *\n * This is storage-specific because it uses checkXmlChunksExist and\n * extractTypedArgsFromTransaction which understand storage transaction types.\n *\n * @param failedIndexes - Indexes of failed transactions\n * @param transactions - Original transaction configs\n * @param backendWalletAddress - Backend wallet address (operator for storage checks)\n * @returns Array of transaction indexes that still need to be retried\n */\nexport async function recheckFailedTransactionsStorage(\n failedIndexes: number[],\n transactions: WriteTransactionConfig[],\n storageClient: StorageClient,\n backendWalletAddress: Address\n): Promise<number[]> {\n if (failedIndexes.length === 0) {\n return [];\n }\n\n // Extract chunked hashes from failed transactions\n const failedTransactions = failedIndexes.map((idx) => transactions[idx]);\n const chunkedHashes: string[] = [];\n\n for (const tx of failedTransactions) {\n try {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n chunkedHashes.push(typedArgs.args.hash);\n }\n } catch {\n // Not a chunked transaction, skip\n }\n }\n\n if (chunkedHashes.length === 0) {\n // No chunked transactions to check, return all failed indexes\n return failedIndexes;\n }\n\n // Check which chunks exist on-chain\n const existingChunks = await checkXmlChunksExist({\n storageClient,\n chunkedHashes,\n operatorAddress: backendWalletAddress,\n });\n\n // Filter out indexes where the transaction has succeeded\n const stillFailed: number[] = [];\n\n for (const failedIdx of failedIndexes) {\n const tx = transactions[failedIdx];\n try {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const hash = typedArgs.args.hash;\n if (!existingChunks.has(hash)) {\n // Transaction still hasn't succeeded\n stillFailed.push(failedIdx);\n }\n // If hash exists, transaction succeeded, skip retry\n } else {\n // Non-chunked transaction, always retry\n stillFailed.push(failedIdx);\n }\n } catch {\n // Can't determine type, retry to be safe\n stillFailed.push(failedIdx);\n }\n }\n\n return stillFailed;\n}\n\n","import type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { StorageClient } from \"@net-protocol/storage\";\nimport type { Address } from \"viem\";\nimport type { RetryConfig, RelaySubmitResult } from \"@net-protocol/relay\";\nimport type { RetryFailedTransactionsParams } from \"./types\";\nimport { retryFailedTransactions as retryFailedTransactionsPackage } from \"@net-protocol/relay\";\nimport { recheckFailedTransactionsStorage } from \"./recheckStorage\";\n\n/**\n * Retry failed transactions with exponential backoff\n *\n * This is a wrapper around the package retryFailedTransactions that adds\n * storage-specific recheck logic.\n *\n * @param params - Retry parameters\n * @returns Final success/failure status after retries\n */\nexport async function retryFailedTransactions(\n params: RetryFailedTransactionsParams\n): Promise<RelaySubmitResult> {\n const {\n storageClient,\n backendWalletAddress,\n apiUrl,\n chainId,\n operatorAddress,\n secretKey,\n failedIndexes,\n originalTransactions,\n config,\n sessionToken,\n } = params;\n\n // Use storage-specific recheck function\n return retryFailedTransactionsPackage({\n apiUrl,\n chainId,\n operatorAddress,\n secretKey,\n failedIndexes,\n originalTransactions,\n backendWalletAddress,\n config,\n sessionToken,\n recheckFunction: async (\n failedIndexes: number[],\n transactions: WriteTransactionConfig[],\n backendWalletAddress: Address\n ) => {\n return recheckFailedTransactionsStorage(\n failedIndexes,\n transactions,\n storageClient,\n backendWalletAddress\n );\n },\n });\n}\n","import { readFileSync } from \"fs\";\nimport {\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { http, createWalletClient } from \"viem\";\nimport { getPublicClient, getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport type { Address, Hash } from \"viem\";\nimport { filterXmlStorageTransactions } from \"../transactions/filter\";\nimport { checkXmlMetadataExists } from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\nimport {\n createRelayX402Client,\n fundBackendWallet,\n checkBackendWalletBalance,\n submitTransactionsViaRelay,\n waitForConfirmations,\n createRelaySession,\n batchTransactions,\n} from \"@net-protocol/relay\";\nimport { retryFailedTransactions } from \"../relay/retry\";\nimport type {\n UploadWithRelayOptions,\n UploadWithRelayResult,\n} from \"../relay/types\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\n\n/**\n * Main upload function with relay - orchestrates the entire relay upload process\n *\n * Flow:\n * 1. Read file\n * 2. Fund backend wallet (x402 payment)\n * 3. Prepare transactions with backendWalletAddress as operator\n * 4. Split transactions (metadata vs chunks)\n * 5. Filter existing transactions (idempotency)\n * 6. Submit chunks via relay (backend wallet pays gas)\n * 7. Retry failed chunks\n * 8. Submit metadata directly (user pays gas)\n * 9. Wait for confirmations\n * 10. Return result\n */\nexport async function uploadFileWithRelay(\n options: UploadWithRelayOptions\n): Promise<UploadWithRelayResult> {\n const errors: Error[] = [];\n\n // 1. Read file\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n const base64String = fileBuffer.toString(\"base64\");\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n fileContent = base64ToDataUri(base64String);\n } else {\n fileContent = base64String;\n }\n } else {\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n // Note: Relay upload always uses XML storage format, regardless of file size\n // prepareXmlStorage() handles small files by creating a single chunk with XML metadata\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 4. Create user wallet client\n const userAccount = privateKeyToAccount(options.privateKey);\n const userAddress = userAccount.address;\n const publicClient = getPublicClient({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const rpcUrls = getChainRpcUrls({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const userWalletClient = createWalletClient({\n account: userAccount,\n chain: publicClient.chain!,\n transport: http(rpcUrls[0]), // Use first RPC URL\n dataSuffix: getBaseDataSuffix(options.chainId),\n });\n\n // 5. Setup x402 client\n const { fetchWithPayment, httpClient } = createRelayX402Client(\n userAccount,\n options.chainId\n );\n\n // 5.5. Create relay session token (sign once, reuse for all batches)\n // Session token is required for all submit requests\n const sessionResult = await createRelaySession({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n account: userAccount,\n expiresIn: 3600, // 1 hour - should be enough for most uploads\n });\n const sessionToken = sessionResult.sessionToken;\n console.log(\"✓ Session token created (valid for 1 hour)\");\n\n // 6. Check backend wallet balance and fund if needed\n // Check balance first to avoid unnecessary payments\n let backendWalletAddress: Address | undefined;\n let shouldFund = true;\n\n try {\n const balanceResult = await checkBackendWalletBalance({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n });\n backendWalletAddress = balanceResult.backendWalletAddress;\n\n // Only fund if balance is insufficient\n shouldFund = !balanceResult.sufficientBalance;\n } catch (error) {\n // If balance check fails, fall back to funding (for backwards compatibility)\n // This handles cases where the balance endpoint might not be available\n shouldFund = true;\n }\n\n // Fund backend wallet only if balance is insufficient\n // This ensures backendWalletAddress is always set\n if (shouldFund) {\n const fundResult = await fundBackendWallet({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n fetchWithPayment,\n httpClient,\n });\n backendWalletAddress = fundResult.backendWalletAddress;\n }\n\n // TypeScript assertion: backendWalletAddress is guaranteed to be set at this point\n // (either from balance check or fund call)\n if (!backendWalletAddress) {\n throw new Error(\"Failed to determine backend wallet address\");\n }\n\n // backendWalletAddress is now guaranteed to be set (either from balance check or fund call)\n\n // 7. Prepare chunks with backendWalletAddress as operator (chunks submitted via relay)\n // Use StorageClient.prepareXmlStorage() to get chunk transactions\n const chunkPrepareResult = storageClient.prepareXmlStorage({\n data: fileContent,\n operatorAddress: backendWalletAddress,\n storageKey: options.storageKey,\n filename: options.text,\n useChunkedStorageBackend: true,\n chunkSize: options.chunkSize,\n });\n\n const chunkTxs = chunkPrepareResult.transactionConfigs.slice(1); // Skip metadata, get chunks\n const topLevelHash = chunkPrepareResult.topLevelHash;\n const chunkMetadata = chunkPrepareResult.metadata; // XML metadata referencing backend wallet chunks\n\n // 8. Prepare metadata transaction separately with userAddress as operator\n // Metadata is submitted directly by user, so it should use userAddress\n // We use the same XML metadata string (which references chunks stored by backend wallet)\n const metadataTx = storageClient.preparePut({\n key: topLevelHash,\n text: options.text,\n value: chunkMetadata, // Use the XML metadata from chunk preparation\n });\n\n // 9. Filter existing chunks (idempotency check with backendWalletAddress)\n const filteredChunks = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTxs,\n operatorAddress: backendWalletAddress,\n });\n\n const chunksToSend = filteredChunks.toSend;\n const chunksSkipped = filteredChunks.skipped.length;\n\n // 10. Check if metadata already exists (with userAddress as operator)\n // Extract metadata args from the prepared transaction\n const metadataStorageKey = metadataTx.args[0] as `0x${string}`;\n const expectedMetadata = hexToString(metadataTx.args[2] as `0x${string}`);\n let metadataNeedsSubmission = true;\n\n const metadataCheck = await checkXmlMetadataExists({\n storageClient,\n storageKey: metadataStorageKey,\n operatorAddress: userAddress, // User is operator for metadata\n expectedMetadata,\n });\n if (metadataCheck.exists && metadataCheck.matches) {\n metadataNeedsSubmission = false;\n }\n\n // 11. Batch and submit chunks via relay (if any)\n let chunkTransactionHashes: Hash[] = [];\n let chunksSent = 0;\n\n if (chunksToSend.length > 0) {\n try {\n // Batch chunks to respect server limits (100 transactions, 1MB per request)\n const batches = batchTransactions(chunksToSend);\n const totalBatches = batches.length;\n\n if (totalBatches > 1) {\n console.log(\n `📦 Splitting ${chunksToSend.length} chunks into ${totalBatches} batch(es)`\n );\n }\n\n // Submit batches sequentially\n for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) {\n const batch = batches[batchIndex];\n\n if (totalBatches > 1) {\n console.log(\n `📤 Sending batch ${batchIndex + 1}/${totalBatches} (${\n batch.length\n } transactions)...`\n );\n }\n\n const submitResult = await submitTransactionsViaRelay({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n transactions: batch,\n sessionToken,\n });\n\n chunkTransactionHashes.push(...submitResult.transactionHashes);\n chunksSent += submitResult.successfulIndexes.length;\n\n // Check if ALL transactions in this batch failed\n if (submitResult.failedIndexes.length === batch.length) {\n // All transactions failed - likely due to insufficient funds or network issues\n // Don't retry (would waste app fees) and stop processing subsequent batches\n const errorMessage =\n `Batch ${batchIndex + 1}: All ${\n batch.length\n } transactions failed. ` +\n `Likely due to insufficient backend wallet balance or network issues. ` +\n `Stopping batch processing to avoid wasting app fees.`;\n\n console.error(`❌ ${errorMessage}`);\n errors.push(new Error(errorMessage));\n\n // Stop processing subsequent batches\n break;\n }\n\n // 12. Retry failed chunks in this batch if any (only if some succeeded - partial failure)\n if (\n submitResult.failedIndexes.length > 0 &&\n submitResult.successfulIndexes.length > 0\n ) {\n // Map failed indexes to actual transactions from this batch\n const failedTxs = submitResult.failedIndexes.map((idx) => batch[idx]);\n\n try {\n const retryResult = await retryFailedTransactions({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n failedIndexes: submitResult.failedIndexes,\n originalTransactions: failedTxs,\n storageClient,\n backendWalletAddress,\n sessionToken,\n });\n\n // Merge retry results\n chunkTransactionHashes.push(...retryResult.transactionHashes);\n chunksSent += retryResult.successfulIndexes.length;\n\n if (retryResult.failedIndexes.length > 0) {\n errors.push(\n new Error(\n `Batch ${batchIndex + 1}: ${\n retryResult.failedIndexes.length\n } transactions failed after retries`\n )\n );\n }\n } catch (retryError) {\n errors.push(\n retryError instanceof Error\n ? retryError\n : new Error(\n `Batch ${batchIndex + 1} retry failed: ${String(\n retryError\n )}`\n )\n );\n }\n }\n\n // Optional: Wait for batch confirmations before next batch\n // This ensures we don't overwhelm the network and provides progress feedback\n if (\n batchIndex < batches.length - 1 &&\n chunkTransactionHashes.length > 0\n ) {\n // Get the hashes from this batch\n const batchHashes = chunkTransactionHashes.slice(\n -submitResult.successfulIndexes.length\n );\n if (batchHashes.length > 0) {\n try {\n await waitForConfirmations({\n publicClient,\n transactionHashes: batchHashes,\n confirmations: 1, // Just 1 confirmation between batches\n timeout: 30000, // 30 second timeout per batch\n });\n } catch (confirmationError) {\n // Log but don't fail - we'll wait for all confirmations later\n console.warn(\n `⚠️ Batch ${\n batchIndex + 1\n } confirmation timeout (continuing...)`\n );\n }\n }\n }\n }\n } catch (submitError) {\n errors.push(\n submitError instanceof Error\n ? submitError\n : new Error(`Chunk submission failed: ${String(submitError)}`)\n );\n }\n }\n\n // 13. Wait for chunk transaction confirmations\n if (chunkTransactionHashes.length > 0) {\n try {\n await waitForConfirmations({\n publicClient,\n transactionHashes: chunkTransactionHashes,\n confirmations: 1,\n timeout: 60000,\n });\n } catch (confirmationError) {\n errors.push(\n confirmationError instanceof Error\n ? confirmationError\n : new Error(`Chunk confirmation failed: ${String(confirmationError)}`)\n );\n }\n }\n\n // 14. Submit metadata directly (user pays gas)\n let metadataTransactionHash: Hash | undefined;\n if (metadataNeedsSubmission) {\n try {\n metadataTransactionHash = await userWalletClient.writeContract({\n address: metadataTx.to as Address,\n abi: metadataTx.abi,\n functionName: metadataTx.functionName,\n args: metadataTx.args,\n value:\n metadataTx.value !== undefined && metadataTx.value > BigInt(0)\n ? metadataTx.value\n : undefined,\n });\n\n // Wait for metadata confirmation\n await waitForConfirmations({\n publicClient,\n transactionHashes: [metadataTransactionHash],\n confirmations: 1,\n timeout: 60000,\n });\n } catch (metadataError) {\n errors.push(\n metadataError instanceof Error\n ? metadataError\n : new Error(`Metadata submission failed: ${String(metadataError)}`)\n );\n }\n }\n\n // 15. Return result\n return {\n success: errors.length === 0,\n topLevelHash,\n chunksSent,\n chunksSkipped,\n metadataSubmitted:\n metadataNeedsSubmission && metadataTransactionHash !== undefined,\n chunkTransactionHashes,\n metadataTransactionHash,\n backendWalletAddress,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n","import { readFileSync } from \"fs\";\nimport {\n shouldSuggestXmlStorage,\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { stringToHex } from \"viem\";\nimport {\n prepareNormalStorageTransaction,\n prepareXmlStorageTransactions,\n} from \"../transactions/prep\";\nimport {\n filterExistingTransactions,\n filterXmlStorageTransactions,\n} from \"../transactions/filter\";\nimport { createWalletClientFromPrivateKey } from \"../transactions/send\";\nimport type {\n UploadOptions,\n PreviewResult,\n TransactionWithId,\n NormalStorageArgs,\n} from \"../types\";\n\n/**\n * Preview function - performs all prep steps but doesn't submit transactions\n * Returns statistics about what would be uploaded\n */\nexport async function previewFile(\n options: UploadOptions\n): Promise<PreviewResult> {\n // 1. Read file\n // Read file as buffer (binary) first\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n // Check for null bytes or non-text characters (excluding common whitespace)\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n // Convert binary file to base64 string (valid UTF-8)\n const base64String = fileBuffer.toString(\"base64\");\n\n // Detect file type and add data URI prefix if detected\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n // Include data URI prefix for better type preservation\n // Format: \"data:audio/mpeg;base64,SUQz...\"\n fileContent = base64ToDataUri(base64String);\n } else {\n // Fallback to raw base64 if detection fails\n fileContent = base64String;\n }\n } else {\n // Read as UTF-8 for text files\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 3. Create wallet client (needed for operator address)\n const { operatorAddress } = createWalletClientFromPrivateKey({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // 4. Determine storage type\n const useXmlStorage = shouldSuggestXmlStorage(fileContent);\n const storageType: \"normal\" | \"xml\" = useXmlStorage ? \"xml\" : \"normal\";\n\n // 5. Prepare transactions\n let transactions: TransactionWithId[];\n\n if (useXmlStorage) {\n transactions = prepareXmlStorageTransactions({\n storageClient,\n storageKey: options.storageKey,\n text: options.text,\n content: fileContent,\n operatorAddress,\n chunkSize: options.chunkSize,\n });\n // No need to extract chunkedHashes - filterXmlStorageTransactions derives them internally\n } else {\n // Build typed args JSON object\n const storageKeyBytes = getStorageKeyBytes(\n options.storageKey\n ) as `0x${string}`;\n const typedArgs: NormalStorageArgs = {\n key: storageKeyBytes,\n text: options.text,\n value: stringToHex(fileContent),\n };\n\n transactions = [\n prepareNormalStorageTransaction(\n storageClient,\n typedArgs,\n options.storageKey // Pass original string key for preparePut\n ),\n ];\n }\n\n // 6. Filter existing transactions (idempotency)\n let transactionsToSend: TransactionWithId[];\n let transactionsSkipped: TransactionWithId[];\n\n if (useXmlStorage) {\n // Extract WriteTransactionConfig[] from TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const chunkTransactions = transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => tx.transaction);\n\n // Create a map from WriteTransactionConfig to TransactionWithId for easy lookup\n const txConfigToTxWithId = new Map(\n transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => [tx.transaction, tx])\n );\n\n const filtered = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTransactions, // Only chunk transactions\n operatorAddress,\n });\n\n // Map filtered WriteTransactionConfig[] back to TransactionWithId[]\n const filteredToSend: TransactionWithId[] = filtered.toSend\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n const filteredSkipped: TransactionWithId[] = filtered.skipped\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n // Metadata is handled separately - check if it needs to be sent\n const metadataTx = transactions.find((tx) => tx.type === \"metadata\");\n if (metadataTx) {\n // For now, always include metadata in toSend (caller should check separately)\n filteredToSend.unshift(metadataTx);\n }\n\n transactionsToSend = filteredToSend;\n transactionsSkipped = filteredSkipped;\n } else {\n const filtered = await filterExistingTransactions({\n storageClient,\n transactions,\n operatorAddress,\n expectedContent: fileContent,\n });\n transactionsToSend = filtered.toSend;\n transactionsSkipped = filtered.skipped;\n }\n\n // Calculate statistics\n if (useXmlStorage) {\n // XML storage: separate chunks from metadata\n const chunkTransactions = transactions.filter(\n (tx) => tx.type === \"chunked\"\n );\n const metadataTransaction = transactions.find(\n (tx) => tx.type === \"metadata\"\n );\n\n const totalChunks = chunkTransactions.length;\n const alreadyStoredChunks = transactionsSkipped.filter(\n (tx) => tx.type === \"chunked\"\n ).length;\n const needToStoreChunks = transactionsToSend.filter(\n (tx) => tx.type === \"chunked\"\n ).length;\n const metadataNeedsStorage = metadataTransaction\n ? transactionsToSend.some((tx) => tx.type === \"metadata\")\n : false;\n\n return {\n storageType: \"xml\",\n totalChunks,\n alreadyStoredChunks,\n needToStoreChunks,\n metadataNeedsStorage,\n operatorAddress,\n storageKey: options.storageKey,\n totalTransactions: transactions.length,\n transactionsToSend: transactionsToSend.length,\n transactionsSkipped: transactionsSkipped.length,\n };\n } else {\n // Normal storage: single transaction counts as 1 chunk\n const totalChunks = 1;\n const alreadyStoredChunks = transactionsSkipped.length;\n const needToStoreChunks = transactionsToSend.length;\n\n return {\n storageType: \"normal\",\n totalChunks,\n alreadyStoredChunks,\n needToStoreChunks,\n operatorAddress,\n storageKey: options.storageKey,\n totalTransactions: transactions.length,\n transactionsToSend: transactionsToSend.length,\n transactionsSkipped: transactionsSkipped.length,\n };\n }\n}\n","import chalk from \"chalk\";\nimport type { NetMessage } from \"@net-protocol/core\";\n\n/**\n * Format a message for human-readable output\n */\nexport function formatMessage(\n message: NetMessage,\n index: number\n): string {\n const timestamp = new Date(Number(message.timestamp) * 1000).toISOString();\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.gray(timestamp)}`,\n ` ${chalk.white(\"Sender:\")} ${message.sender}`,\n ` ${chalk.white(\"App:\")} ${message.app}`,\n ];\n\n if (message.topic) {\n lines.push(` ${chalk.white(\"Topic:\")} ${message.topic}`);\n }\n\n lines.push(` ${chalk.white(\"Text:\")} ${message.text}`);\n\n if (message.data && message.data !== \"0x\") {\n lines.push(` ${chalk.white(\"Data:\")} ${message.data}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a message for JSON output\n */\nexport function messageToJson(\n message: NetMessage,\n index: number\n): Record<string, unknown> {\n return {\n index,\n sender: message.sender,\n app: message.app,\n timestamp: Number(message.timestamp),\n text: message.text,\n topic: message.topic,\n data: message.data,\n };\n}\n\n/**\n * Print messages in human-readable or JSON format\n */\nexport function printMessages(\n messages: NetMessage[],\n startIndex: number,\n json: boolean\n): void {\n if (json) {\n const output = messages.map((msg, i) => messageToJson(msg, startIndex + i));\n console.log(JSON.stringify(output, null, 2));\n } else {\n if (messages.length === 0) {\n console.log(chalk.yellow(\"No messages found\"));\n return;\n }\n\n messages.forEach((msg, i) => {\n console.log(formatMessage(msg, startIndex + i));\n if (i < messages.length - 1) {\n console.log(); // Empty line between messages\n }\n });\n }\n}\n\n/**\n * Print a count result\n */\nexport function printCount(\n count: number,\n label: string,\n json: boolean\n): void {\n if (json) {\n console.log(JSON.stringify({ count }, null, 2));\n } else {\n console.log(`${chalk.white(label)} ${chalk.cyan(count)}`);\n }\n}\n\n/**\n * Print an error message and exit\n */\nexport function exitWithError(message: string): never {\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { parseReadOnlyOptions } from \"../../../cli/shared\";\nimport { exitWithError } from \"../../../shared/output\";\nimport { storageUrl } from \"../../../shared/urls\";\n\nexport interface StorageReadOptions {\n key: string;\n operator: string;\n chainId?: number;\n rpcUrl?: string;\n index?: number;\n json?: boolean;\n raw?: boolean;\n}\n\n/**\n * Execute the storage read command\n */\nexport async function executeStorageRead(\n options: StorageReadOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Use readStorageData which handles XML resolution\n const result = await client.readStorageData({\n key: options.key,\n operator: options.operator,\n index: options.index,\n });\n\n if (options.json) {\n const output = {\n key: options.key,\n operator: options.operator,\n chainId: readOnlyOptions.chainId,\n storageUrl: storageUrl(\n readOnlyOptions.chainId,\n options.operator,\n options.key\n ),\n text: result.text,\n data: options.raw ? result.data : result.data,\n isXml: result.isXml,\n ...(options.index !== undefined && { index: options.index }),\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nStorage Value:\\n\"));\n console.log(` ${chalk.cyan(\"Key:\")} ${options.key}`);\n console.log(` ${chalk.cyan(\"Operator:\")} ${options.operator}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n if (options.index !== undefined) {\n console.log(` ${chalk.cyan(\"Index:\")} ${options.index}`);\n }\n console.log(` ${chalk.cyan(\"Text:\")} ${result.text || \"(empty)\"}`);\n console.log(` ${chalk.cyan(\"Is XML:\")} ${result.isXml ? \"Yes\" : \"No\"}`);\n\n // For data, show a preview if it's long\n const dataPreview =\n result.data.length > 500\n ? result.data.substring(0, 500) + \"... (truncated)\"\n : result.data;\n\n console.log(` ${chalk.cyan(\"Data:\")}`);\n if (result.data) {\n console.log(chalk.gray(` ${dataPreview.split(\"\\n\").join(\"\\n \")}`));\n } else {\n console.log(chalk.gray(\" (empty)\"));\n }\n console.log();\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (errorMessage === \"StoredDataNotFound\") {\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n key: options.key,\n operator: options.operator,\n chainId: readOnlyOptions.chainId,\n error: \"Not found\",\n },\n null,\n 2\n )\n );\n process.exit(1);\n }\n exitWithError(\n `No data found for key \"${options.key}\" and operator \"${options.operator}\"`\n );\n }\n\n exitWithError(`Failed to read storage: ${errorMessage}`);\n }\n}\n","import { encodeFunctionData, concat } from \"viem\";\nimport { getBaseDataSuffix } from \"@net-protocol/core\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { EncodedTransaction } from \"./types\";\n\nexport type { EncodedTransaction };\n\n/**\n * Encode a write transaction config into transaction data\n * Used for --encode-only mode where we output transaction data instead of executing\n */\nexport function encodeTransaction(\n config: WriteTransactionConfig,\n chainId: number\n): EncodedTransaction {\n const calldata = encodeFunctionData({\n abi: config.abi,\n functionName: config.functionName,\n args: config.args,\n });\n\n const suffix = getBaseDataSuffix(chainId);\n const data = suffix ? concat([calldata, suffix]) : calldata;\n\n return {\n to: config.to,\n data,\n chainId,\n value: config.value?.toString() ?? \"0\",\n };\n}\n","import * as fs from \"fs\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { parseReadOnlyOptions, parseCommonOptions } from \"../../../cli/shared\";\nimport { encodeTransaction } from \"../../../shared/encode\";\nimport type { EncodedTransaction } from \"../../../shared/types\";\n\nexport interface StorageEncodeOptions {\n filePath: string;\n storageKey: string;\n text: string;\n privateKey?: string;\n address?: string;\n chainId?: number;\n rpcUrl?: string;\n chunkSize?: number;\n}\n\ninterface EncodedStorageResult {\n storageKey: string;\n storageType: \"normal\" | \"xml\";\n operatorAddress: string;\n transactions: EncodedTransaction[];\n topLevelHash?: string;\n}\n\nconst XML_STORAGE_THRESHOLD = 20 * 1024; // 20KB\n\n/**\n * Encode storage upload transactions without executing them\n */\nexport async function encodeStorageUpload(\n options: StorageEncodeOptions\n): Promise<EncodedStorageResult> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Get operator address from private key, --address flag, or default to zero address\n let operatorAddress: `0x${string}`;\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey as `0x${string}`);\n operatorAddress = account.address;\n } else if (options.address) {\n operatorAddress = options.address as `0x${string}`;\n } else {\n // Use a zero address placeholder when no private key or address is provided\n operatorAddress = \"0x0000000000000000000000000000000000000000\";\n }\n\n // Read file\n const fileContent = fs.readFileSync(options.filePath, \"utf-8\");\n const fileSize = Buffer.byteLength(fileContent, \"utf-8\");\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n });\n\n // Determine storage type based on size\n const useXmlStorage = fileSize > XML_STORAGE_THRESHOLD;\n\n if (useXmlStorage) {\n // XML Storage - multiple transactions\n const { transactionConfigs, topLevelHash, metadata } =\n client.prepareXmlStorage({\n data: fileContent,\n operatorAddress,\n storageKey: options.storageKey,\n filename: options.text,\n chunkSize: options.chunkSize,\n });\n\n const encodedTransactions = transactionConfigs.map((config) =>\n encodeTransaction(config, readOnlyOptions.chainId)\n );\n\n return {\n storageKey: options.storageKey,\n storageType: \"xml\",\n operatorAddress,\n transactions: encodedTransactions,\n topLevelHash,\n };\n } else {\n // Normal Storage - single transaction\n const config = client.preparePut({\n key: options.storageKey,\n text: options.text,\n value: fileContent,\n });\n\n const encodedTransaction = encodeTransaction(\n config,\n readOnlyOptions.chainId\n );\n\n return {\n storageKey: options.storageKey,\n storageType: \"normal\",\n operatorAddress,\n transactions: [encodedTransaction],\n };\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { uploadFile } from \"./core/upload\";\nimport { uploadFileWithRelay } from \"./core/uploadRelay\";\nimport { previewFile } from \"./core/preview\";\nimport { executeStorageRead } from \"./core/read\";\nimport { encodeStorageUpload } from \"./core/encode\";\nimport { generateStorageUrl } from \"./utils\";\nimport { OPTIMAL_CHUNK_SIZE } from \"@net-protocol/storage\";\nimport type { UploadOptions } from \"./types\";\nimport type { UploadWithRelayOptions } from \"./relay/types\";\n\n/**\n * Register the storage command with the commander program\n */\nexport function registerStorageCommand(program: Command): void {\n // Command group - no options, no action\n const storageCommand = program\n .command(\"storage\")\n .description(\"Storage operations\");\n\n // Upload subcommand (current storage functionality)\n const uploadCommand = new Command(\"upload\")\n .description(\"Upload files to Net Storage\")\n .requiredOption(\"--file <path>\", \"Path to file to upload\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--address <address>\",\n \"Operator address (0x-prefixed). Used with --encode-only when no private key is provided\"\n )\n .option(\n \"--chunk-size <bytes>\",\n `Max chunk size in bytes for splitting large files (default: ${OPTIMAL_CHUNK_SIZE})`,\n (value) => parseInt(value, 10)\n )\n .action(async (options) => {\n // Handle encode-only mode\n if (options.encodeOnly) {\n try {\n const result = await encodeStorageUpload({\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: options.privateKey,\n address: options.address,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n chunkSize: options.chunkSize,\n });\n console.log(JSON.stringify(result, null, 2));\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red(\n `Encode failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n return;\n }\n\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const uploadOptions: UploadOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n chunkSize: options.chunkSize,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n const result = await uploadFile(uploadOptions);\n\n // Generate storage URL\n const storageUrl = generateStorageUrl(\n result.operatorAddress,\n commonOptions.chainId,\n options.key\n );\n\n if (result.skipped && result.transactionsSent === 0) {\n console.log(\n chalk.green(\n `✓ All data already stored - skipping upload\\n Storage Key: ${\n options.key\n }\\n Skipped: ${result.transactionsSkipped} transaction(s)${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n }\n\n if (result.success) {\n console.log(\n chalk.green(\n `✓ File uploaded successfully!\\n Storage Key: ${\n options.key\n }\\n Storage Type: ${\n result.storageType === \"xml\" ? \"XML\" : \"Normal\"\n }\\n Transactions Sent: ${\n result.transactionsSent\n }\\n Transactions Skipped: ${\n result.transactionsSkipped\n }\\n Final Transaction Hash: ${result.finalHash || \"N/A\"}${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n } else {\n console.error(\n chalk.red(\n `✗ Upload completed with errors\\n Transactions Sent: ${\n result.transactionsSent\n }\\n Transactions Skipped: ${\n result.transactionsSkipped\n }\\n Transactions Failed: ${\n result.transactionsFailed\n }\\n Error: ${result.error || \"Unknown error\"}`\n )\n );\n process.exit(1);\n }\n } catch (error) {\n console.error(\n chalk.red(\n `Upload failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Preview subcommand\n const previewCommand = new Command(\"preview\")\n .description(\"Preview storage upload without submitting transactions\")\n .requiredOption(\"--file <path>\", \"Path to file to preview\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .option(\n \"--chunk-size <bytes>\",\n `Max chunk size in bytes for splitting large files (default: ${OPTIMAL_CHUNK_SIZE})`,\n (value) => parseInt(value, 10)\n )\n .action(async (options) => {\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const previewOptions: UploadOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n chunkSize: options.chunkSize,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n const result = await previewFile(previewOptions);\n\n // Generate storage URL\n const storageUrl = generateStorageUrl(\n result.operatorAddress,\n commonOptions.chainId,\n options.key\n );\n\n // Display preview results\n console.log(chalk.cyan(\"\\n📊 Storage Preview:\"));\n console.log(` Storage Key: ${chalk.white(result.storageKey)}`);\n console.log(\n ` Storage Type: ${chalk.white(\n result.storageType === \"xml\" ? \"XML\" : \"Normal\"\n )}`\n );\n console.log(` Total Chunks: ${chalk.white(result.totalChunks)}`);\n console.log(\n ` Already Stored: ${chalk.green(result.alreadyStoredChunks)}`\n );\n console.log(\n ` Need to Store: ${chalk.yellow(result.needToStoreChunks)}`\n );\n\n if (result.storageType === \"xml\" && result.metadataNeedsStorage) {\n console.log(` Metadata: ${chalk.yellow(\"Needs Storage\")}`);\n } else if (result.storageType === \"xml\") {\n console.log(` Metadata: ${chalk.green(\"Already Stored\")}`);\n }\n\n console.log(\n ` Total Transactions: ${chalk.white(result.totalTransactions)}`\n );\n console.log(\n ` Transactions to Send: ${chalk.yellow(result.transactionsToSend)}`\n );\n console.log(\n ` Transactions Skipped: ${chalk.green(result.transactionsSkipped)}`\n );\n console.log(\n ` Operator Address: ${chalk.gray(result.operatorAddress)}`\n );\n\n if (storageUrl) {\n console.log(` Storage URL: ${chalk.cyan(storageUrl)}`);\n }\n\n if (result.needToStoreChunks === 0 && !result.metadataNeedsStorage) {\n console.log(\n chalk.green(\"\\n✓ All data is already stored - no upload needed\")\n );\n } else {\n console.log(\n chalk.yellow(\n `\\n⚠ ${result.transactionsToSend} transaction(s) would be sent`\n )\n );\n }\n\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red(\n `Preview failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Upload-relay subcommand (relay upload via x402)\n const uploadRelayCommand = new Command(\"upload-relay\")\n .description(\"Upload files to Net Storage via x402 relay (backend pays gas for chunks)\")\n .requiredOption(\"--file <path>\", \"Path to file to upload\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .requiredOption(\n \"--api-url <url>\",\n \"Backend API URL (e.g., http://localhost:3000)\"\n )\n .requiredOption(\n \"--secret-key <key>\",\n \"Secret key for backend wallet derivation. Can also be set via X402_SECRET_KEY env var\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .option(\n \"--chunk-size <bytes>\",\n `Max chunk size in bytes for splitting large files (default: ${OPTIMAL_CHUNK_SIZE})`,\n (value) => parseInt(value, 10)\n )\n .action(async (options) => {\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Parse secret key from options or env\n const secretKey =\n options.secretKey || process.env.X402_SECRET_KEY;\n if (!secretKey) {\n console.error(\n chalk.red(\n \"Error: --secret-key is required or set X402_SECRET_KEY environment variable\"\n )\n );\n process.exit(1);\n }\n\n const uploadRelayOptions: UploadWithRelayOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n apiUrl: options.apiUrl,\n secretKey,\n chunkSize: options.chunkSize,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n console.log(chalk.blue(`🔗 Using relay API: ${options.apiUrl}`));\n const result = await uploadFileWithRelay(uploadRelayOptions);\n\n // Generate storage URL (using user address, not backend wallet)\n const { privateKeyToAccount } = await import(\"viem/accounts\");\n const userAccount = privateKeyToAccount(commonOptions.privateKey);\n const storageUrl = generateStorageUrl(\n userAccount.address,\n commonOptions.chainId,\n options.key\n );\n\n if (result.success) {\n console.log(\n chalk.green(\n `✓ File uploaded successfully via relay!\\n Storage Key: ${\n options.key\n }\\n Top-Level Hash: ${result.topLevelHash}\\n Chunks Sent: ${\n result.chunksSent\n }\\n Chunks Skipped: ${\n result.chunksSkipped\n }\\n Metadata Submitted: ${\n result.metadataSubmitted ? \"Yes\" : \"No (already exists)\"\n }\\n Backend Wallet: ${result.backendWalletAddress}\\n Chunk Transaction Hashes: ${\n result.chunkTransactionHashes.length > 0\n ? result.chunkTransactionHashes.join(\", \")\n : \"None\"\n }${\n result.metadataTransactionHash\n ? `\\n Metadata Transaction Hash: ${result.metadataTransactionHash}`\n : \"\"\n }${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n } else {\n console.error(\n chalk.red(\n `✗ Upload completed with errors\\n Chunks Sent: ${\n result.chunksSent\n }\\n Chunks Skipped: ${\n result.chunksSkipped\n }\\n Metadata Submitted: ${\n result.metadataSubmitted ? \"Yes\" : \"No\"\n }\\n Errors: ${\n result.errors\n ? result.errors.map((e) => e.message).join(\", \")\n : \"Unknown error\"\n }`\n )\n );\n process.exit(1);\n }\n } catch (error) {\n console.error(\n chalk.red(\n `Upload via relay failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Read subcommand\n const readCommand = new Command(\"read\")\n .description(\"Read data from Net Storage\")\n .requiredOption(\"--key <key>\", \"Storage key to read\")\n .requiredOption(\"--operator <address>\", \"Operator address (wallet that stored the data)\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--index <n>\",\n \"Historical version index (0 = oldest). Omit for latest.\",\n (value) => parseInt(value, 10)\n )\n .option(\"--json\", \"Output in JSON format\")\n .option(\"--raw\", \"Output raw data without truncation (use with --json)\")\n .action(async (options) => {\n await executeStorageRead({\n key: options.key,\n operator: options.operator,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n index: options.index,\n json: options.json,\n raw: options.raw,\n });\n });\n\n storageCommand.addCommand(uploadCommand);\n storageCommand.addCommand(previewCommand);\n storageCommand.addCommand(uploadRelayCommand);\n storageCommand.addCommand(readCommand);\n}\n","import { FeedClient, FeedRegistryClient, AgentRegistryClient } from \"@net-protocol/feeds\";\nimport { ChatClient } from \"@net-protocol/chats\";\nimport { NetClient } from \"@net-protocol/core\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport type { ReadOnlyOptions } from \"./types\";\n\n/**\n * Create a FeedClient from read-only options\n */\nexport function createFeedClient(options: ReadOnlyOptions): FeedClient {\n return new FeedClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a FeedRegistryClient from read-only options\n */\nexport function createFeedRegistryClient(\n options: ReadOnlyOptions\n): FeedRegistryClient {\n return new FeedRegistryClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a ChatClient from read-only options\n */\nexport function createChatClient(options: ReadOnlyOptions): ChatClient {\n return new ChatClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a NetClient from read-only options\n */\nexport function createNetClient(options: ReadOnlyOptions): NetClient {\n return new NetClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create an AgentRegistryClient from read-only options\n */\nexport function createAgentRegistryClient(\n options: ReadOnlyOptions\n): AgentRegistryClient {\n return new AgentRegistryClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a StorageClient from read-only options\n */\nexport function createStorageClient(options: ReadOnlyOptions): StorageClient {\n return new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { NetClient, getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { MessageSendOptions } from \"./types\";\n\nfunction prepareMessageConfig(client: NetClient, options: MessageSendOptions) {\n return client.prepareSendMessage({\n text: options.text,\n topic: options.topic ?? \"\",\n data: options.data as `0x${string}` | undefined,\n });\n}\n\n/**\n * Execute the message send command\n */\nexport async function executeSend(options: MessageSendOptions): Promise<void> {\n if (options.encodeOnly) {\n executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createNetClient(commonOptions);\n const txConfig = prepareMessageConfig(client, options);\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n console.log(chalk.blue(\"Sending message...\"));\n\n try {\n const hash = await walletClient.writeContract({\n address: txConfig.to,\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n chain: null,\n });\n\n const topicLine = options.topic ? `\\n Topic: ${options.topic}` : \"\";\n console.log(\n chalk.green(\n `Message sent successfully!\\n Transaction: ${hash}\\n Text: ${options.text}${topicLine}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to send message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n\n/**\n * Execute encode-only mode - output transaction data as JSON\n */\nfunction executeEncodeOnly(options: MessageSendOptions): void {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new NetClient({ chainId: readOnlyOptions.chainId });\n const txConfig = prepareMessageConfig(client, options);\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport type { NetMessageFilter } from \"@net-protocol/core\";\n\n/**\n * Common filter options shared by read and count commands\n */\nexport interface FilterOptions {\n app?: string;\n topic?: string;\n sender?: string;\n}\n\n/**\n * Options for the message send command\n */\nexport interface MessageSendOptions {\n text: string;\n topic?: string;\n data?: string;\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n encodeOnly?: boolean;\n}\n\n/**\n * Options for the message read command\n */\nexport interface MessageReadOptions extends FilterOptions {\n start?: number;\n end?: number;\n index?: number;\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Options for the message count command\n */\nexport interface MessageCountOptions extends FilterOptions {\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Build a NetMessageFilter from command options.\n * Returns undefined if no app address is provided.\n */\nexport function buildFilter(options: FilterOptions): NetMessageFilter | undefined {\n if (!options.app) {\n return undefined;\n }\n\n return {\n appAddress: options.app as `0x${string}`,\n topic: options.topic,\n maker: options.sender as `0x${string}` | undefined,\n };\n}\n\n/**\n * Warn if topic/sender filters are provided without --app\n */\nexport function warnIgnoredFilters(options: FilterOptions): void {\n if (options.app || (!options.topic && !options.sender)) {\n return;\n }\n\n const ignored: string[] = [];\n if (options.topic) ignored.push(\"--topic\");\n if (options.sender) ignored.push(\"--sender\");\n\n console.warn(\n chalk.yellow(\n `Warning: ${ignored.join(\" and \")} ignored because --app is required for filtering`\n )\n );\n}\n","import chalk from \"chalk\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { printMessages, exitWithError } from \"../../shared/output\";\nimport type { MessageReadOptions } from \"./types\";\nimport { buildFilter, warnIgnoredFilters } from \"./types\";\n\nfunction printEmptyResult(message: string, json: boolean): void {\n if (json) {\n console.log(JSON.stringify([], null, 2));\n } else {\n console.log(chalk.yellow(message));\n }\n}\n\n/**\n * Execute the message read command\n */\nexport async function executeRead(options: MessageReadOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const filter = buildFilter(options);\n const json = options.json ?? false;\n\n warnIgnoredFilters(options);\n\n try {\n // Handle single message by index\n if (options.index !== undefined) {\n const message = await client.getMessageAtIndex({\n messageIndex: options.index,\n appAddress: filter?.appAddress,\n topic: filter?.topic,\n maker: filter?.maker,\n });\n\n if (!message) {\n exitWithError(`No message found at index ${options.index}`);\n }\n\n printMessages([message], options.index, json);\n return;\n }\n\n // Get total count for range calculation\n const count = await client.getMessageCount({ filter });\n\n if (count === 0) {\n printEmptyResult(\"No messages found\", json);\n return;\n }\n\n // Determine range\n const hasExplicitRange = options.start !== undefined || options.end !== undefined;\n let startIndex: number;\n let endIndex: number;\n\n if (hasExplicitRange) {\n startIndex = options.start ?? 0;\n endIndex = options.end ?? count;\n } else {\n const limit = options.limit ?? 10;\n startIndex = Math.max(0, count - limit);\n endIndex = count;\n }\n\n // Clamp to valid range\n startIndex = Math.max(0, startIndex);\n endIndex = Math.min(endIndex, count);\n\n if (startIndex >= endIndex) {\n printEmptyResult(\"No messages in specified range\", json);\n return;\n }\n\n const messages = await client.getMessagesBatch({\n filter,\n startIndex,\n endIndex,\n });\n\n printMessages(messages, startIndex, json);\n } catch (error) {\n exitWithError(\n `Failed to read messages: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { printCount, exitWithError } from \"../../shared/output\";\nimport type { MessageCountOptions } from \"./types\";\nimport { buildFilter, warnIgnoredFilters } from \"./types\";\nimport type { NetMessageFilter } from \"@net-protocol/core\";\n\nfunction buildCountLabel(filter: NetMessageFilter | undefined): string {\n if (!filter) {\n return \"Total messages:\";\n }\n\n const parts: string[] = [];\n if (filter.appAddress) parts.push(`app=${filter.appAddress}`);\n if (filter.topic) parts.push(`topic=\"${filter.topic}\"`);\n if (filter.maker) parts.push(`sender=${filter.maker}`);\n\n return `Messages (${parts.join(\", \")}):`;\n}\n\n/**\n * Execute the message count command\n */\nexport async function executeCount(options: MessageCountOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const filter = buildFilter(options);\n\n warnIgnoredFilters(options);\n\n try {\n const count = await client.getMessageCount({ filter });\n printCount(count, buildCountLabel(filter), options.json ?? false);\n } catch (error) {\n exitWithError(\n `Failed to get message count: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeSend } from \"./send\";\nimport { executeRead } from \"./read\";\nimport { executeCount } from \"./count\";\n\n/**\n * Register the message command with the commander program\n */\nexport function registerMessageCommand(program: Command): void {\n const messageCommand = program\n .command(\"message\")\n .description(\"Message operations\");\n\n // Send subcommand\n const sendCommand = new Command(\"send\")\n .description(\"Send a message to Net Protocol\")\n .requiredOption(\"--text <text>\", \"Message text\")\n .option(\"--topic <topic>\", \"Message topic\", \"\")\n .option(\"--data <hex>\", \"Additional hex data\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeSend({\n text: options.text,\n topic: options.topic,\n data: options.data,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Read subcommand\n const readCommand = new Command(\"read\")\n .description(\"Read messages from Net Protocol\")\n .option(\"--app <address>\", \"Filter by app address\")\n .option(\"--topic <topic>\", \"Filter by topic\")\n .option(\"--sender <address>\", \"Filter by sender address\")\n .option(\n \"--start <n>\",\n \"Start index (inclusive)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--end <n>\",\n \"End index (exclusive)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--index <n>\",\n \"Single message at index\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--limit <n>\",\n \"Number of latest messages (default: 10)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeRead({\n app: options.app,\n topic: options.topic,\n sender: options.sender,\n start: options.start,\n end: options.end,\n index: options.index,\n limit: options.limit,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // Count subcommand\n const countCommand = new Command(\"count\")\n .description(\"Get message count from Net Protocol\")\n .option(\"--app <address>\", \"Filter by app address\")\n .option(\"--topic <topic>\", \"Filter by topic\")\n .option(\"--sender <address>\", \"Filter by sender address\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeCount({\n app: options.app,\n topic: options.topic,\n sender: options.sender,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n messageCommand.addCommand(sendCommand);\n messageCommand.addCommand(readCommand);\n messageCommand.addCommand(countCommand);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getSupportedChains } from \"@net-protocol/core\";\n\n/**\n * Register the chains command with the commander program.\n *\n * The chain list is sourced from `@net-protocol/core`'s chain config — the\n * single source of truth for supported chains, names, and mainnet/testnet\n * classification.\n */\nexport function registerChainsCommand(program: Command): void {\n program\n .command(\"chains\")\n .description(\"List supported chains\")\n .option(\"--json\", \"Output in JSON format\")\n .action((options) => {\n const chains = getSupportedChains();\n\n if (options.json) {\n console.log(JSON.stringify(chains, null, 2));\n return;\n }\n\n console.log(chalk.white.bold(\"Supported Chains:\\n\"));\n\n console.log(chalk.cyan(\"Mainnets:\"));\n chains\n .filter((c) => c.type === \"mainnet\")\n .forEach((chain) => {\n console.log(\n ` ${chalk.white(chain.name)} ${chalk.gray(`(${chain.chainId})`)}`\n );\n });\n\n console.log(chalk.cyan(\"\\nTestnets:\"));\n chains\n .filter((c) => c.type === \"testnet\")\n .forEach((chain) => {\n console.log(\n ` ${chalk.white(chain.name)} ${chalk.gray(`(${chain.chainId})`)}`\n );\n });\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getNetContract, getChainName } from \"@net-protocol/core\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\n\ninterface InfoOptions {\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Register the info command with the commander program\n */\nexport function registerInfoCommand(program: Command): void {\n program\n .command(\"info\")\n .description(\"Show contract info and stats\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options: InfoOptions) => {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n try {\n const client = createNetClient(readOnlyOptions);\n\n const contract = getNetContract(readOnlyOptions.chainId);\n const chainName = getChainName({ chainId: readOnlyOptions.chainId });\n const totalMessages = await client.getMessageCount({});\n\n const info = {\n chain: {\n id: readOnlyOptions.chainId,\n name: chainName || \"Unknown\",\n },\n contract: {\n address: contract.address,\n },\n stats: {\n totalMessages,\n },\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log(chalk.white.bold(\"Net Protocol Info\\n\"));\n console.log(chalk.cyan(\"Chain:\"));\n console.log(` Name: ${chalk.white(info.chain.name)}`);\n console.log(` ID: ${chalk.white(info.chain.id)}`);\n console.log(chalk.cyan(\"\\nContract:\"));\n console.log(` Address: ${chalk.white(info.contract.address)}`);\n console.log(chalk.cyan(\"\\nStats:\"));\n console.log(` Total Messages: ${chalk.white(info.stats.totalMessages)}`);\n } catch (error) {\n exitWithError(\n `Failed to get info: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n });\n}\n","import chalk from \"chalk\";\nimport { encodeFunctionData, createWalletClient, http, parseEther } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { NetrClient, isNetrSupportedChain } from \"@net-protocol/netr\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { encodeTransaction, type EncodedTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { TokenDeployOptions } from \"./types\";\n\ninterface EncodedDeployResult {\n predictedAddress: string;\n salt: string;\n transaction: EncodedTransaction;\n config: {\n name: string;\n symbol: string;\n image: string;\n deployer: string;\n initialBuy?: string;\n };\n}\n\n/**\n * Execute encode-only mode - output deployment transaction data as JSON\n */\nasync function executeEncodeOnly(options: TokenDeployOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n if (!isNetrSupportedChain(readOnlyOptions.chainId)) {\n exitWithError(\n `Chain ${readOnlyOptions.chainId} is not supported for token deployment`\n );\n }\n\n // Get deployer address from private key if provided\n let deployerAddress: `0x${string}`;\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey as `0x${string}`);\n deployerAddress = account.address;\n } else {\n // Use a placeholder address when no private key is provided\n deployerAddress = \"0x0000000000000000000000000000000000000000\";\n }\n\n const client = new NetrClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // Generate salt and predict address\n const saltResult = await client.generateSalt({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: deployerAddress,\n fid: options.fid ? BigInt(options.fid) : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n });\n\n if (!saltResult) {\n exitWithError(\"Failed to generate salt for token deployment\");\n return;\n }\n\n // Build deploy config\n const txConfig = client.buildDeployConfig(\n {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: deployerAddress,\n fid: options.fid ? BigInt(options.fid) : undefined,\n mintPrice: options.mintPrice ? BigInt(options.mintPrice) : undefined,\n mintEndTimestamp: options.mintEndTimestamp\n ? BigInt(options.mintEndTimestamp)\n : undefined,\n maxMintSupply: options.maxMintSupply\n ? BigInt(options.maxMintSupply)\n : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy ? parseEther(options.initialBuy) : undefined,\n },\n saltResult.salt\n );\n\n // Encode the transaction (includes Base builder code suffix when on Base)\n const encoded = encodeTransaction(\n {\n to: txConfig.address,\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n value: txConfig.value,\n },\n readOnlyOptions.chainId\n );\n\n const result: EncodedDeployResult = {\n predictedAddress: saltResult.predictedAddress,\n salt: saltResult.salt,\n transaction: encoded,\n config: {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n deployer: deployerAddress,\n ...(options.initialBuy && { initialBuy: options.initialBuy }),\n },\n };\n\n console.log(JSON.stringify(result, null, 2));\n}\n\n/**\n * Execute the token deploy command\n */\nexport async function executeTokenDeploy(\n options: TokenDeployOptions\n): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n if (!isNetrSupportedChain(commonOptions.chainId)) {\n exitWithError(\n `Chain ${commonOptions.chainId} is not supported for token deployment. Supported: Base (8453), Plasma (9745), Monad (143), HyperEVM (999)`\n );\n }\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const client = new NetrClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n\n console.log(chalk.blue(\"Generating salt and predicting token address...\"));\n\n // Generate salt and predict address\n const saltResult = await client.generateSalt({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: account.address,\n fid: options.fid ? BigInt(options.fid) : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n });\n\n if (!saltResult) {\n exitWithError(\"Failed to generate salt for token deployment\");\n return;\n }\n\n console.log(\n chalk.cyan(`Predicted token address: ${saltResult.predictedAddress}`)\n );\n\n // Build deploy config\n const txConfig = client.buildDeployConfig(\n {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: account.address,\n fid: options.fid ? BigInt(options.fid) : undefined,\n mintPrice: options.mintPrice ? BigInt(options.mintPrice) : undefined,\n mintEndTimestamp: options.mintEndTimestamp\n ? BigInt(options.mintEndTimestamp)\n : undefined,\n maxMintSupply: options.maxMintSupply\n ? BigInt(options.maxMintSupply)\n : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy ? parseEther(options.initialBuy) : undefined,\n },\n saltResult.salt\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n if (options.initialBuy) {\n console.log(chalk.blue(`Deploying token with ${options.initialBuy} ETH initial buy...`));\n } else {\n console.log(chalk.blue(\"Deploying token...\"));\n }\n\n try {\n // Use sendTransaction with encoded calldata to support payable functions\n const calldata = encodeFunctionData({\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: txConfig.address,\n data: calldata,\n chain: null,\n value: txConfig.value,\n });\n\n const initialBuyLine = options.initialBuy\n ? `\\n Initial Buy: ${options.initialBuy} ETH`\n : \"\";\n\n console.log(\n chalk.green(\n `Token deployed successfully!\\n Transaction: ${hash}\\n Token Address: ${saltResult.predictedAddress}\\n Name: ${options.name}\\n Symbol: ${options.symbol}${initialBuyLine}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to deploy token: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { NetrClient, isNetrSupportedChain } from \"@net-protocol/netr\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport {\n explorerAddressUrl,\n profileUrl as buildProfileUrl,\n tokenUrl as buildTokenUrl,\n} from \"../../shared/urls\";\nimport type { TokenInfoOptions } from \"./types\";\n\n/**\n * Execute the token info command\n */\nexport async function executeTokenInfo(options: TokenInfoOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n if (!isNetrSupportedChain(readOnlyOptions.chainId)) {\n exitWithError(\n `Chain ${readOnlyOptions.chainId} is not supported for Netr tokens`\n );\n }\n\n const client = new NetrClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n const tokenAddress = options.address as `0x${string}`;\n\n try {\n // Fetch token data in parallel\n const [token, storageData, price] = await Promise.all([\n client.getToken(tokenAddress),\n client.getStorageData(tokenAddress),\n client.getPrice(tokenAddress),\n ]);\n\n if (!token) {\n exitWithError(`Token not found at address ${tokenAddress}`);\n return;\n }\n\n // Fetch locker data if available\n let locker = null;\n if (storageData?.lockerAddress) {\n locker = await client.getLocker(storageData.lockerAddress);\n }\n\n if (options.json) {\n const output = {\n address: tokenAddress,\n chainId: readOnlyOptions.chainId,\n tokenUrl: buildTokenUrl(readOnlyOptions.chainId, tokenAddress),\n explorerAddressUrl: explorerAddressUrl(\n readOnlyOptions.chainId,\n tokenAddress\n ),\n token: {\n name: token.name,\n symbol: token.symbol,\n deployer: token.deployer,\n deployerProfileUrl: buildProfileUrl(\n readOnlyOptions.chainId,\n token.deployer\n ),\n image: token.image,\n animation: token.animation || null,\n fid: token.fid.toString(),\n totalSupply: token.totalSupply.toString(),\n decimals: token.decimals,\n extraStringData: token.extraStringData || null,\n },\n pool: storageData?.poolAddress || null,\n locker: storageData?.lockerAddress || null,\n price: price\n ? {\n priceInEth: price.priceInEth,\n priceInWeth: price.priceInWeth,\n tick: price.tick,\n }\n : null,\n lockerInfo: locker\n ? {\n owner: locker.owner,\n duration: locker.duration.toString(),\n endTimestamp: locker.endTimestamp.toString(),\n version: locker.version,\n }\n : null,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nToken Info:\\n\"));\n console.log(` ${chalk.cyan(\"Address:\")} ${tokenAddress}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n console.log(` ${chalk.cyan(\"Name:\")} ${token.name}`);\n console.log(` ${chalk.cyan(\"Symbol:\")} ${token.symbol}`);\n console.log(` ${chalk.cyan(\"Deployer:\")} ${token.deployer}`);\n console.log(` ${chalk.cyan(\"FID:\")} ${token.fid.toString()}`);\n console.log(` ${chalk.cyan(\"Image:\")} ${token.image}`);\n if (token.animation) {\n console.log(` ${chalk.cyan(\"Animation:\")} ${token.animation}`);\n }\n if (token.extraStringData) {\n console.log(` ${chalk.cyan(\"Extra Data:\")} ${token.extraStringData}`);\n }\n\n if (storageData?.poolAddress) {\n console.log(` ${chalk.cyan(\"Pool:\")} ${storageData.poolAddress}`);\n }\n\n if (storageData?.lockerAddress) {\n console.log(` ${chalk.cyan(\"Locker:\")} ${storageData.lockerAddress}`);\n }\n\n if (price) {\n console.log(` ${chalk.cyan(\"Price:\")} ${price.priceInEth} ETH`);\n }\n\n if (locker) {\n const endDate = new Date(Number(locker.endTimestamp) * 1000);\n console.log(\n ` ${chalk.cyan(\"Lock Ends:\")} ${endDate.toLocaleDateString()}`\n );\n }\n\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to get token info: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeTokenDeploy } from \"./deploy\";\nimport { executeTokenInfo } from \"./info\";\n\n/**\n * Register the token command with the commander program\n */\nexport function registerTokenCommand(program: Command): void {\n const tokenCommand = program\n .command(\"token\")\n .description(\"Token operations (Netr/Banger)\");\n\n // Deploy subcommand\n const deployCommand = new Command(\"deploy\")\n .description(\"Deploy a new Netr token\")\n .requiredOption(\"--name <name>\", \"Token name\")\n .requiredOption(\"--symbol <symbol>\", \"Token symbol\")\n .requiredOption(\"--image <url>\", \"Token image URL\")\n .option(\"--animation <url>\", \"Token animation URL\")\n .option(\"--fid <number>\", \"Farcaster ID\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\"--mint-price <wei>\", \"Mint price in wei for NFT drop\")\n .option(\"--mint-end-timestamp <timestamp>\", \"Unix timestamp when minting ends\")\n .option(\"--max-mint-supply <amount>\", \"Maximum mint supply for NFT drop\")\n .option(\"--metadata-address <address>\", \"Dynamic metadata contract address\")\n .option(\"--extra-string-data <data>\", \"Extra string data to store with token\")\n .option(\"--initial-buy <eth>\", \"ETH amount to swap for tokens on deploy (e.g., '0.001')\")\n .action(async (options) => {\n await executeTokenDeploy({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n fid: options.fid,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n mintPrice: options.mintPrice,\n mintEndTimestamp: options.mintEndTimestamp,\n maxMintSupply: options.maxMintSupply,\n metadataAddress: options.metadataAddress,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy,\n });\n });\n\n // Info subcommand\n const infoCommand = new Command(\"info\")\n .description(\"Get information about a Netr token\")\n .requiredOption(\"--address <address>\", \"Token address\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeTokenInfo({\n address: options.address,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n tokenCommand.addCommand(deployCommand);\n tokenCommand.addCommand(infoCommand);\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport {\n PROFILE_PICTURE_STORAGE_KEY,\n PROFILE_METADATA_STORAGE_KEY,\n PROFILE_CANVAS_STORAGE_KEY,\n PROFILE_CSS_STORAGE_KEY,\n parseProfileMetadata,\n} from \"@net-protocol/profiles\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport {\n profileUrl as buildProfileUrl,\n walletUrl as buildWalletUrl,\n} from \"../../shared/urls\";\nimport type { ProfileGetOptions } from \"./types\";\n\n/**\n * Execute the profile get command - reads profile data for an address\n */\nexport async function executeProfileGet(\n options: ProfileGetOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Fetch profile picture\n let profilePicture: string | undefined;\n try {\n const pictureResult = await client.readStorageData({\n key: PROFILE_PICTURE_STORAGE_KEY,\n operator: options.address,\n });\n if (pictureResult.data) {\n profilePicture = pictureResult.data;\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n // Fetch profile metadata (X username, bio, display name, token address)\n let xUsername: string | undefined;\n let bio: string | undefined;\n let displayName: string | undefined;\n let tokenAddress: string | undefined;\n try {\n const metadataResult = await client.readStorageData({\n key: PROFILE_METADATA_STORAGE_KEY,\n operator: options.address,\n });\n if (metadataResult.data) {\n const metadata = parseProfileMetadata(metadataResult.data);\n xUsername = metadata?.x_username;\n bio = metadata?.bio;\n displayName = metadata?.display_name;\n tokenAddress = metadata?.token_address;\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n // Fetch profile canvas\n let canvasSize: number | undefined;\n let canvasIsDataUri = false;\n try {\n const canvasResult = await client.readChunkedStorage({\n key: PROFILE_CANVAS_STORAGE_KEY,\n operator: options.address,\n });\n if (canvasResult.data) {\n canvasSize = canvasResult.data.length;\n canvasIsDataUri = canvasResult.data.startsWith(\"data:\");\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage !== \"ChunkedStorage metadata not found\" &&\n !errorMessage.includes(\"not found\")\n ) {\n throw error;\n }\n }\n\n // Fetch profile CSS\n let cssSize: number | undefined;\n try {\n const cssResult = await client.readStorageData({\n key: PROFILE_CSS_STORAGE_KEY,\n operator: options.address,\n });\n if (cssResult.data) {\n cssSize = cssResult.data.length;\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n const hasProfile = profilePicture || xUsername || bio || displayName || tokenAddress || canvasSize || cssSize;\n\n if (options.json) {\n const output = {\n address: options.address,\n chainId: readOnlyOptions.chainId,\n profileUrl: buildProfileUrl(readOnlyOptions.chainId, options.address),\n walletUrl: buildWalletUrl(readOnlyOptions.chainId, options.address),\n profilePicture: profilePicture || null,\n displayName: displayName || null,\n xUsername: xUsername || null,\n bio: bio || null,\n tokenAddress: tokenAddress || null,\n canvas: canvasSize\n ? { size: canvasSize, isDataUri: canvasIsDataUri }\n : null,\n css: cssSize ? { size: cssSize } : null,\n hasProfile,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nProfile:\\n\"));\n console.log(` ${chalk.cyan(\"Address:\")} ${options.address}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n console.log(\n ` ${chalk.cyan(\"Display Name:\")} ${\n displayName || chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Profile Picture:\")} ${\n profilePicture || chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"X Username:\")} ${\n xUsername ? `@${xUsername}` : chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Bio:\")} ${bio || chalk.gray(\"(not set)\")}`\n );\n console.log(\n ` ${chalk.cyan(\"Token Address:\")} ${\n tokenAddress || chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Canvas:\")} ${\n canvasSize\n ? `${canvasSize} bytes${canvasIsDataUri ? \" (data URI)\" : \"\"}`\n : chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Custom CSS:\")} ${\n cssSize ? `${cssSize} bytes` : chalk.gray(\"(not set)\")\n }`\n );\n\n if (!hasProfile) {\n console.log(chalk.yellow(\"\\n No profile data found for this address.\"));\n }\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to read profile: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfilePictureStorageArgs,\n isValidUrl,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { ProfileSetPictureOptions } from \"./types\";\n\n/**\n * Execute the profile set-picture command\n */\nexport async function executeProfileSetPicture(\n options: ProfileSetPictureOptions\n): Promise<void> {\n // Validate URL\n if (!isValidUrl(options.url)) {\n exitWithError(\n `Invalid URL: \"${options.url}\". Please provide a valid URL (e.g., https://example.com/image.jpg)`\n );\n }\n\n // Get storage args\n const storageArgs = getProfilePictureStorageArgs(options.url);\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`📷 Setting profile picture...`));\n console.log(chalk.gray(` URL: ${options.url}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`⏳ Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\n✓ Profile picture updated successfully!\\n Transaction: ${hash}\\n URL: ${options.url}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set profile picture: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { StorageClient } from \"@net-protocol/storage\";\nimport {\n PROFILE_METADATA_STORAGE_KEY,\n parseProfileMetadata,\n} from \"@net-protocol/profiles\";\n\ninterface ExistingMetadata {\n x_username?: string;\n bio?: string;\n display_name?: string;\n token_address?: string;\n}\n\n/**\n * Read existing profile metadata for an address.\n * Returns parsed metadata fields, or empty object if not found.\n */\nexport async function readExistingMetadata(\n address: string,\n client: StorageClient\n): Promise<ExistingMetadata> {\n try {\n const metadataResult = await client.readStorageData({\n key: PROFILE_METADATA_STORAGE_KEY,\n operator: address,\n });\n if (metadataResult.data) {\n const metadata = parseProfileMetadata(metadataResult.data);\n return {\n x_username: metadata?.x_username,\n bio: metadata?.bio,\n display_name: metadata?.display_name,\n token_address: metadata?.token_address,\n };\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n return {};\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidXUsername,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetUsernameOptions } from \"./types\";\n\n/**\n * Execute the profile set-username command\n */\nexport async function executeProfileSetUsername(\n options: ProfileSetUsernameOptions\n): Promise<void> {\n // Validate username\n if (!isValidXUsername(options.username)) {\n exitWithError(\n `Invalid X username: \"${options.username}\". Usernames must be 1-15 characters, alphanumeric and underscores only.`\n );\n }\n\n // Normalize username (strip @ if present for storage)\n const usernameForStorage = options.username.startsWith(\"@\")\n ? options.username.slice(1)\n : options.username;\n const displayUsername = `@${usernameForStorage}`;\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // If address provided, read existing metadata to preserve other fields\n let existing: Awaited<ReturnType<typeof readExistingMetadata>> = {};\n if (options.address) {\n const storageClient = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl\n ? { rpcUrls: [options.rpcUrl] }\n : undefined,\n });\n existing = await readExistingMetadata(options.address, storageClient);\n }\n\n const storageArgs = getProfileMetadataStorageArgs({\n x_username: usernameForStorage,\n bio: existing.bio,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting X username...`));\n console.log(chalk.gray(` Username: ${displayUsername}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update x_username, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n x_username: usernameForStorage,\n bio: existing.bio,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nX username updated successfully!\\n Transaction: ${hash}\\n Username: ${displayUsername}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set X username: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidBio,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetBioOptions } from \"./types\";\n\n/**\n * Execute the profile set-bio command\n */\nexport async function executeProfileSetBio(\n options: ProfileSetBioOptions\n): Promise<void> {\n // Validate bio\n if (!isValidBio(options.bio)) {\n exitWithError(\n `Invalid bio: \"${options.bio}\". Bio must be 1-280 characters and cannot contain control characters.`\n );\n }\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // If address provided, read existing metadata to preserve other fields\n let existing: Awaited<ReturnType<typeof readExistingMetadata>> = {};\n if (options.address) {\n const storageClient = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl\n ? { rpcUrls: [options.rpcUrl] }\n : undefined,\n });\n existing = await readExistingMetadata(options.address, storageClient);\n }\n\n const storageArgs = getProfileMetadataStorageArgs({\n bio: options.bio,\n x_username: existing.x_username,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile bio...`));\n console.log(chalk.gray(` Bio: ${options.bio}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update bio, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n bio: options.bio,\n x_username: existing.x_username,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nBio updated successfully!\\n Transaction: ${hash}\\n Bio: ${options.bio}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set bio: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidDisplayName,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetDisplayNameOptions } from \"./types\";\n\n/**\n * Execute the profile set-display-name command\n */\nexport async function executeProfileSetDisplayName(\n options: ProfileSetDisplayNameOptions\n): Promise<void> {\n // Validate display name\n if (!isValidDisplayName(options.name)) {\n exitWithError(\n `Invalid display name: \"${options.name}\". Display name must be 1-25 characters and cannot contain control characters.`\n );\n }\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // If address provided, read existing metadata to preserve other fields\n let existing: Awaited<ReturnType<typeof readExistingMetadata>> = {};\n if (options.address) {\n const storageClient = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl\n ? { rpcUrls: [options.rpcUrl] }\n : undefined,\n });\n existing = await readExistingMetadata(options.address, storageClient);\n }\n\n const storageArgs = getProfileMetadataStorageArgs({\n display_name: options.name,\n bio: existing.bio,\n x_username: existing.x_username,\n token_address: existing.token_address,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting display name...`));\n console.log(chalk.gray(` Name: ${options.name}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update display_name, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n display_name: options.name,\n bio: existing.bio,\n x_username: existing.x_username,\n token_address: existing.token_address,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nDisplay name updated successfully!\\n Transaction: ${hash}\\n Name: ${options.name}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set display name: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidTokenAddress,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetTokenAddressOptions } from \"./types\";\n\n/**\n * Execute the profile set-token-address command\n */\nexport async function executeProfileSetTokenAddress(\n options: ProfileSetTokenAddressOptions\n): Promise<void> {\n // Validate token address\n if (!isValidTokenAddress(options.tokenAddress)) {\n exitWithError(\n `Invalid token address: \"${options.tokenAddress}\". Must be a valid EVM address (0x-prefixed, 40 hex characters).`\n );\n }\n\n // Store as lowercase\n const normalizedAddress = options.tokenAddress.toLowerCase();\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // If address provided, read existing metadata to preserve other fields\n let existing: Awaited<ReturnType<typeof readExistingMetadata>> = {};\n if (options.address) {\n const storageClient = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl\n ? { rpcUrls: [options.rpcUrl] }\n : undefined,\n });\n existing = await readExistingMetadata(options.address, storageClient);\n }\n\n const storageArgs = getProfileMetadataStorageArgs({\n token_address: normalizedAddress,\n x_username: existing.x_username,\n bio: existing.bio,\n display_name: existing.display_name,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile token address...`));\n console.log(chalk.gray(` Token Address: ${normalizedAddress}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update token_address, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n token_address: normalizedAddress,\n x_username: existing.x_username,\n bio: existing.bio,\n display_name: existing.display_name,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nToken address updated successfully!\\n Transaction: ${hash}\\n Token Address: ${normalizedAddress}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set token address: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n PROFILE_CANVAS_STORAGE_KEY,\n PROFILE_CANVAS_TOPIC,\n} from \"@net-protocol/profiles\";\nimport {\n CHUNKED_STORAGE_CONTRACT,\n chunkDataForStorage,\n} from \"@net-protocol/storage\";\nimport { toBytes32 } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { ProfileSetCanvasOptions } from \"./types\";\n\nconst MAX_CANVAS_SIZE = 60 * 1024; // 60KB\nconst CANVAS_FILENAME = \"profile-compressed.html\";\n\n/**\n * Check if a buffer contains binary data (non-text)\n */\nfunction isBinaryContent(buffer: Buffer): boolean {\n // Check for null bytes or other non-text characters in the first 8KB\n const sampleSize = Math.min(buffer.length, 8192);\n for (let i = 0; i < sampleSize; i++) {\n const byte = buffer[i];\n // Null byte is a strong indicator of binary\n if (byte === 0) return true;\n // Control characters (except tab, newline, carriage return)\n if (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) return true;\n }\n return false;\n}\n\n/**\n * Get MIME type from file extension\n */\nfunction getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n const mimeTypes: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".pdf\": \"application/pdf\",\n \".html\": \"text/html\",\n \".htm\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"application/javascript\",\n \".json\": \"application/json\",\n \".txt\": \"text/plain\",\n };\n return mimeTypes[ext] || \"application/octet-stream\";\n}\n\n/**\n * Convert binary buffer to data URI\n */\nfunction bufferToDataUri(buffer: Buffer, mimeType: string): string {\n const base64 = buffer.toString(\"base64\");\n return `data:${mimeType};base64,${base64}`;\n}\n\n/**\n * Execute the profile set-canvas command\n */\nexport async function executeProfileSetCanvas(\n options: ProfileSetCanvasOptions\n): Promise<void> {\n // Validate: must provide --file or --content, but not both\n if (!options.file && !options.content) {\n exitWithError(\n \"Must provide either --file or --content to set canvas content.\"\n );\n }\n\n if (options.file && options.content) {\n exitWithError(\"Cannot provide both --file and --content. Choose one.\");\n }\n\n let canvasContent: string;\n\n // Read content from file or use provided content\n if (options.file) {\n const filePath = path.resolve(options.file);\n\n // Check file exists\n if (!fs.existsSync(filePath)) {\n exitWithError(`File not found: ${filePath}`);\n }\n\n // Read file as buffer to detect binary content\n const buffer = fs.readFileSync(filePath);\n\n // Check file size\n if (buffer.length > MAX_CANVAS_SIZE) {\n exitWithError(\n `File too large: ${buffer.length} bytes exceeds maximum of ${MAX_CANVAS_SIZE} bytes (60KB).`\n );\n }\n\n // Handle binary files (convert to data URI)\n if (isBinaryContent(buffer)) {\n const mimeType = getMimeType(filePath);\n canvasContent = bufferToDataUri(buffer, mimeType);\n } else {\n canvasContent = buffer.toString(\"utf-8\");\n }\n } else {\n // Use provided content\n canvasContent = options.content!;\n\n // Check content size\n const contentSize = Buffer.byteLength(canvasContent, \"utf-8\");\n if (contentSize > MAX_CANVAS_SIZE) {\n exitWithError(\n `Content too large: ${contentSize} bytes exceeds maximum of ${MAX_CANVAS_SIZE} bytes (60KB).`\n );\n }\n }\n\n // Prepare storage key as bytes32\n const bytesKey = toBytes32(PROFILE_CANVAS_STORAGE_KEY) as `0x${string}`;\n\n // Chunk and compress data for storage\n const chunks = chunkDataForStorage(canvasContent);\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const encoded = encodeTransaction(\n {\n to: CHUNKED_STORAGE_CONTRACT.address,\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [bytesKey, CANVAS_FILENAME, chunks],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile canvas...`));\n console.log(\n chalk.gray(` Content size: ${Buffer.byteLength(canvasContent)} bytes`)\n );\n console.log(chalk.gray(` Chunks: ${chunks.length}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Submit transaction to ChunkedStorage\n const hash = await client.writeContract({\n address: CHUNKED_STORAGE_CONTRACT.address as `0x${string}`,\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [bytesKey, CANVAS_FILENAME, chunks],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nCanvas updated successfully!\\n Transaction: ${hash}\\n Content size: ${Buffer.byteLength(canvasContent)} bytes\\n Chunks: ${chunks.length}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set canvas: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { PROFILE_CANVAS_STORAGE_KEY } from \"@net-protocol/profiles\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ProfileGetCanvasOptions } from \"./types\";\n\n/**\n * Check if content is a data URI\n */\nfunction isDataUri(content: string): boolean {\n return content.startsWith(\"data:\");\n}\n\n/**\n * Parse a data URI and return the buffer and mime type\n */\nfunction parseDataUri(dataUri: string): { buffer: Buffer; mimeType: string } {\n const match = dataUri.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n throw new Error(\"Invalid data URI format\");\n }\n const mimeType = match[1];\n const base64Data = match[2];\n const buffer = Buffer.from(base64Data, \"base64\");\n return { buffer, mimeType };\n}\n\n/**\n * Get file extension from mime type\n */\nfunction getExtensionFromMimeType(mimeType: string): string {\n const extensions: Record<string, string> = {\n \"image/png\": \".png\",\n \"image/jpeg\": \".jpg\",\n \"image/gif\": \".gif\",\n \"image/webp\": \".webp\",\n \"image/svg+xml\": \".svg\",\n \"application/pdf\": \".pdf\",\n \"text/html\": \".html\",\n \"text/css\": \".css\",\n \"application/javascript\": \".js\",\n \"application/json\": \".json\",\n \"text/plain\": \".txt\",\n \"application/octet-stream\": \".bin\",\n };\n return extensions[mimeType] || \".bin\";\n}\n\n/**\n * Execute the profile get-canvas command - reads canvas data for an address\n */\nexport async function executeProfileGetCanvas(\n options: ProfileGetCanvasOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Read canvas from chunked storage\n let canvasContent: string | undefined;\n let canvasText: string | undefined;\n\n try {\n const result = await client.readChunkedStorage({\n key: PROFILE_CANVAS_STORAGE_KEY,\n operator: options.address,\n });\n\n if (result.data) {\n canvasContent = result.data;\n canvasText = result.text;\n }\n } catch (error) {\n // Check for \"not found\" type errors\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage !== \"ChunkedStorage metadata not found\" &&\n !errorMessage.includes(\"not found\")\n ) {\n throw error;\n }\n // No canvas exists - that's okay\n }\n\n // Handle JSON output\n if (options.json) {\n const output = {\n address: options.address,\n chainId: readOnlyOptions.chainId,\n canvas: canvasContent || null,\n filename: canvasText || null,\n hasCanvas: !!canvasContent,\n isDataUri: canvasContent ? isDataUri(canvasContent) : false,\n contentLength: canvasContent ? canvasContent.length : 0,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // No canvas found\n if (!canvasContent) {\n exitWithError(`No canvas found for address: ${options.address}`);\n }\n\n // Handle output to file\n if (options.output) {\n const outputPath = path.resolve(options.output);\n\n // Check if content is a data URI (binary)\n if (isDataUri(canvasContent)) {\n const { buffer, mimeType } = parseDataUri(canvasContent);\n\n // If output path doesn't have extension, add one based on mime type\n let finalPath = outputPath;\n if (!path.extname(outputPath)) {\n finalPath = outputPath + getExtensionFromMimeType(mimeType);\n }\n\n fs.writeFileSync(finalPath, buffer);\n console.log(\n chalk.green(`Canvas written to: ${finalPath} (${buffer.length} bytes)`)\n );\n } else {\n // Text content\n fs.writeFileSync(outputPath, canvasContent, \"utf-8\");\n console.log(\n chalk.green(\n `Canvas written to: ${outputPath} (${canvasContent.length} bytes)`\n )\n );\n }\n return;\n }\n\n // Output to stdout\n // For binary content (data URI), output as-is since stdout can't handle raw binary\n console.log(canvasContent);\n } catch (error) {\n exitWithError(\n `Failed to read canvas: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport {\n getProfileCSSStorageArgs,\n isValidCSS,\n MAX_CSS_SIZE,\n STORAGE_CONTRACT,\n DEMO_THEMES,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { ProfileSetCSSOptions } from \"./types\";\n\n/**\n * Execute the profile set-css command\n */\nexport async function executeProfileSetCSS(\n options: ProfileSetCSSOptions\n): Promise<void> {\n // Validate: must provide exactly one of --file, --content, or --theme\n const sourceCount = [options.file, options.content, options.theme].filter(\n Boolean\n ).length;\n if (sourceCount === 0) {\n exitWithError(\n \"Must provide one of --file, --content, or --theme to set CSS.\"\n );\n }\n if (sourceCount > 1) {\n exitWithError(\"Cannot provide more than one of --file, --content, --theme.\");\n }\n\n let cssContent: string;\n\n if (options.theme) {\n // Use a built-in demo theme\n const theme = DEMO_THEMES[options.theme];\n if (!theme) {\n const available = Object.entries(DEMO_THEMES)\n .map(([key, val]) => ` ${key} — ${val.name}`)\n .join(\"\\n\");\n exitWithError(\n `Unknown theme: \"${options.theme}\"\\n\\nAvailable themes:\\n${available}`\n );\n }\n cssContent = theme.css;\n console.log(chalk.gray(` Using theme: ${theme.name}`));\n } else if (options.file) {\n const filePath = path.resolve(options.file);\n if (!fs.existsSync(filePath)) {\n exitWithError(`File not found: ${filePath}`);\n }\n const buffer = fs.readFileSync(filePath);\n if (buffer.length > MAX_CSS_SIZE) {\n exitWithError(\n `File too large: ${buffer.length} bytes exceeds maximum of ${MAX_CSS_SIZE} bytes (15KB).`\n );\n }\n cssContent = buffer.toString(\"utf-8\");\n } else {\n cssContent = options.content!;\n const contentSize = Buffer.byteLength(cssContent, \"utf-8\");\n if (contentSize > MAX_CSS_SIZE) {\n exitWithError(\n `Content too large: ${contentSize} bytes exceeds maximum of ${MAX_CSS_SIZE} bytes (15KB).`\n );\n }\n }\n\n // Validate CSS\n if (!isValidCSS(cssContent)) {\n exitWithError(\n \"Invalid CSS: content is empty, too large, or contains disallowed patterns (script injection).\"\n );\n }\n\n // Prepare storage args\n const storageArgs = getProfileCSSStorageArgs(cssContent);\n\n // Handle encode-only mode\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n try {\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile CSS...`));\n console.log(\n chalk.gray(\n ` Content size: ${Buffer.byteLength(cssContent, \"utf-8\")} bytes`\n )\n );\n console.log(chalk.gray(` Address: ${account.address}`));\n\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nCSS updated successfully!\\n Transaction: ${hash}\\n Content size: ${Buffer.byteLength(cssContent, \"utf-8\")} bytes`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set CSS: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { PROFILE_CSS_STORAGE_KEY } from \"@net-protocol/profiles\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ProfileGetCSSOptions } from \"./types\";\n\n/**\n * Execute the profile get-css command — reads custom CSS for an address\n */\nexport async function executeProfileGetCSS(\n options: ProfileGetCSSOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n let cssContent: string | undefined;\n\n try {\n const result = await client.readStorageData({\n key: PROFILE_CSS_STORAGE_KEY,\n operator: options.address,\n });\n\n if (result.data) {\n cssContent = result.data;\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n // Handle JSON output\n if (options.json) {\n const output = {\n address: options.address,\n chainId: readOnlyOptions.chainId,\n css: cssContent || null,\n hasCSS: !!cssContent,\n contentLength: cssContent ? cssContent.length : 0,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // No CSS found\n if (!cssContent) {\n exitWithError(`No custom CSS found for address: ${options.address}`);\n }\n\n // Handle output to file\n if (options.output) {\n const outputPath = path.resolve(options.output);\n fs.writeFileSync(outputPath, cssContent, \"utf-8\");\n console.log(\n chalk.green(\n `CSS written to: ${outputPath} (${cssContent.length} bytes)`\n )\n );\n return;\n }\n\n // Output to stdout\n console.log(cssContent);\n } catch (error) {\n exitWithError(\n `Failed to read CSS: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { buildCSSPrompt, DEMO_THEMES } from \"@net-protocol/profiles\";\n\n/**\n * Execute the profile css-prompt command — prints the AI prompt for CSS generation\n */\nexport async function executeProfileCSSPrompt(options: {\n listThemes?: boolean;\n}): Promise<void> {\n if (options.listThemes) {\n console.log(\"Available demo themes:\\n\");\n for (const [key, theme] of Object.entries(DEMO_THEMES)) {\n console.log(` ${key} — ${theme.name}`);\n }\n console.log(\n \"\\nUse with: net profile set-css --theme <name>\"\n );\n return;\n }\n\n console.log(buildCSSPrompt());\n}\n","import { Command } from \"commander\";\nimport { executeProfileGet } from \"./get\";\nimport { executeProfileSetPicture } from \"./set-picture\";\nimport { executeProfileSetUsername } from \"./set-username\";\nimport { executeProfileSetBio } from \"./set-bio\";\nimport { executeProfileSetDisplayName } from \"./set-display-name\";\nimport { executeProfileSetTokenAddress } from \"./set-token-address\";\nimport { executeProfileSetCanvas } from \"./set-canvas\";\nimport { executeProfileGetCanvas } from \"./get-canvas\";\nimport { executeProfileSetCSS } from \"./set-css\";\nimport { executeProfileGetCSS } from \"./get-css\";\nimport { executeProfileCSSPrompt } from \"./css-prompt\";\n\n/**\n * Register the profile command with the commander program\n */\nexport function registerProfileCommand(program: Command): void {\n // Command group\n const profileCommand = program\n .command(\"profile\")\n .description(\"User profile operations\");\n\n // Get subcommand (read-only)\n const getCommand = new Command(\"get\")\n .description(\"Get profile data for an address\")\n .requiredOption(\"--address <address>\", \"Wallet address to get profile for\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeProfileGet({\n address: options.address,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // Set-picture subcommand (write)\n const setPictureCommand = new Command(\"set-picture\")\n .description(\"Set your profile picture URL\")\n .requiredOption(\"--url <url>\", \"Image URL for profile picture\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetPicture({\n url: options.url,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Set-x-username subcommand (write)\n const setUsernameCommand = new Command(\"set-x-username\")\n .description(\"Set your X (Twitter) username for your profile\")\n .requiredOption(\n \"--username <username>\",\n \"Your X (Twitter) username (with or without @)\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--address <address>\",\n \"Wallet address to preserve existing metadata for (used with --encode-only)\"\n )\n .action(async (options) => {\n await executeProfileSetUsername({\n username: options.username,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n address: options.address,\n });\n });\n\n // Set-bio subcommand (write)\n const setBioCommand = new Command(\"set-bio\")\n .description(\"Set your profile bio\")\n .requiredOption(\"--bio <bio>\", \"Your profile bio (max 280 characters)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--address <address>\",\n \"Wallet address to preserve existing metadata for (used with --encode-only)\"\n )\n .action(async (options) => {\n await executeProfileSetBio({\n bio: options.bio,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n address: options.address,\n });\n });\n\n // Set-display-name subcommand (write)\n const setDisplayNameCommand = new Command(\"set-display-name\")\n .description(\"Set your profile display name\")\n .requiredOption(\"--name <name>\", \"Your display name (max 25 characters)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--address <address>\",\n \"Wallet address to preserve existing metadata for (used with --encode-only)\"\n )\n .action(async (options) => {\n await executeProfileSetDisplayName({\n name: options.name,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n address: options.address,\n });\n });\n\n // Set-token-address subcommand (write)\n const setTokenAddressCommand = new Command(\"set-token-address\")\n .description(\"Set your profile token address (ERC-20 token that represents you)\")\n .requiredOption(\n \"--token-address <address>\",\n \"ERC-20 token contract address (0x-prefixed)\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--address <address>\",\n \"Wallet address to preserve existing metadata for (used with --encode-only)\"\n )\n .action(async (options) => {\n await executeProfileSetTokenAddress({\n tokenAddress: options.tokenAddress,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n address: options.address,\n });\n });\n\n // Set-canvas subcommand (write)\n const setCanvasCommand = new Command(\"set-canvas\")\n .description(\"Set your profile canvas (HTML content)\")\n .option(\"--file <path>\", \"Path to file containing canvas content\")\n .option(\"--content <html>\", \"HTML content for canvas (inline)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetCanvas({\n file: options.file,\n content: options.content,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Get-canvas subcommand (read-only)\n const getCanvasCommand = new Command(\"get-canvas\")\n .description(\"Get profile canvas for an address\")\n .requiredOption(\"--address <address>\", \"Wallet address to get canvas for\")\n .option(\"--output <path>\", \"Write canvas content to file instead of stdout\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeProfileGetCanvas({\n address: options.address,\n output: options.output,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // Set-css subcommand (write)\n const setCSSCommand = new Command(\"set-css\")\n .description(\"Set your profile custom CSS theme\")\n .option(\"--file <path>\", \"Path to CSS file\")\n .option(\"--content <css>\", \"CSS content (inline)\")\n .option(\"--theme <name>\", \"Use a built-in demo theme (run css-prompt --list-themes to see available)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetCSS({\n file: options.file,\n content: options.content,\n theme: options.theme,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Get-css subcommand (read-only)\n const getCSSCommand = new Command(\"get-css\")\n .description(\"Get profile custom CSS for an address\")\n .requiredOption(\"--address <address>\", \"Wallet address to get CSS for\")\n .option(\"--output <path>\", \"Write CSS content to file instead of stdout\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeProfileGetCSS({\n address: options.address,\n output: options.output,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // CSS-prompt subcommand (read-only, no chain interaction)\n const cssPromptCommand = new Command(\"css-prompt\")\n .description(\"Print the AI prompt for generating profile CSS themes\")\n .option(\"--list-themes\", \"List available demo themes instead of the prompt\")\n .action(async (options) => {\n await executeProfileCSSPrompt({\n listThemes: options.listThemes,\n });\n });\n\n profileCommand.addCommand(getCommand);\n profileCommand.addCommand(setPictureCommand);\n profileCommand.addCommand(setUsernameCommand);\n profileCommand.addCommand(setBioCommand);\n profileCommand.addCommand(setDisplayNameCommand);\n profileCommand.addCommand(setTokenAddressCommand);\n profileCommand.addCommand(setCanvasCommand);\n profileCommand.addCommand(getCanvasCommand);\n profileCommand.addCommand(setCSSCommand);\n profileCommand.addCommand(getCSSCommand);\n profileCommand.addCommand(cssPromptCommand);\n}\n","/**\n * Format a price number for display (removes trailing zeros)\n */\nexport function formatEthPrice(price: number): string {\n return price.toFixed(6).replace(/\\.?0+$/, \"\");\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListListingsOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListListings(options: ListListingsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}` | undefined,\n });\n\n if (options.json) {\n const output = listings.map((l) => ({\n orderHash: l.orderHash,\n maker: l.maker,\n nftAddress: l.nftAddress,\n tokenId: l.tokenId,\n price: l.price,\n priceWei: l.priceWei.toString(),\n currency: l.currency,\n expirationDate: l.expirationDate,\n orderStatus: l.orderStatus,\n ...(l.targetFulfiller ? { targetFulfiller: l.targetFulfiller } : {}),\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (listings.length === 0) {\n console.log(chalk.yellow(\"No active listings found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nListings (${listings.length}):\\n`));\n\n for (const listing of listings) {\n const expiry = new Date(listing.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${listing.orderHash}`);\n console.log(` ${chalk.cyan(\"Seller:\")} ${listing.maker}`);\n console.log(` ${chalk.cyan(\"NFT:\")} ${listing.nftAddress} #${listing.tokenId}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(listing.price)} ${listing.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n if (listing.targetFulfiller) {\n console.log(` ${chalk.cyan(\"Private (for):\")} ${listing.targetFulfiller}`);\n }\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch listings: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListOffersOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListOffers(options: ListOffersOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = offers.map((o) => ({\n orderHash: o.orderHash,\n maker: o.maker,\n nftAddress: o.nftAddress,\n price: o.price,\n priceWei: o.priceWei.toString(),\n currency: o.currency,\n expirationDate: o.expirationDate,\n orderStatus: o.orderStatus,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (offers.length === 0) {\n console.log(chalk.yellow(\"No active collection offers found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nCollection Offers (${offers.length}):\\n`));\n\n for (const offer of offers) {\n const expiry = new Date(offer.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${offer.orderHash}`);\n console.log(` ${chalk.cyan(\"Buyer:\")} ${offer.maker}`);\n console.log(` ${chalk.cyan(\"Collection:\")} ${offer.nftAddress}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(offer.price)} ${offer.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch offers: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListSalesOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListSales(options: ListSalesOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const sales = await bazaarClient.getSales({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = sales.map((s) => ({\n orderHash: s.orderHash,\n seller: s.seller,\n buyer: s.buyer,\n tokenAddress: s.tokenAddress,\n tokenId: s.tokenId,\n amount: s.amount.toString(),\n price: s.price,\n priceWei: s.priceWei.toString(),\n currency: s.currency,\n timestamp: s.timestamp,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (sales.length === 0) {\n console.log(chalk.yellow(\"No sales found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nSales (${sales.length}):\\n`));\n\n for (const sale of sales) {\n const date = new Date(sale.timestamp * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${sale.orderHash}`);\n console.log(` ${chalk.cyan(\"Seller:\")} ${sale.seller}`);\n console.log(` ${chalk.cyan(\"Buyer:\")} ${sale.buyer}`);\n console.log(` ${chalk.cyan(\"Token:\")} ${sale.tokenAddress} #${sale.tokenId}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(sale.price)} ${sale.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Date:\")} ${date}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch sales: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateListingOptions } from \"./types\";\n\nexport async function executeCreateListing(options: CreateListingOptions): Promise<void> {\n // Dual mode: with private key = full flow, without = output EIP-712 data\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n console.log(chalk.blue(\"Preparing listing...\"));\n\n const prepared = await bazaarClient.prepareCreateListing({\n nftAddress: options.nftAddress as `0x${string}`,\n tokenId: options.tokenId,\n priceWei,\n offerer: account.address,\n targetFulfiller: options.targetFulfiller as `0x${string}` | undefined,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if needed\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing order...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the listing\n console.log(chalk.blue(\"Submitting listing...\"));\n const submitTx = bazaarClient.prepareSubmitListing(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `Listing created successfully!\\n Transaction: ${hash}\\n NFT: ${options.nftAddress} #${options.tokenId}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateListingOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n const prepared = await bazaarClient.prepareCreateListing({\n nftAddress: options.nftAddress as `0x${string}`,\n tokenId: options.tokenId,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n targetFulfiller: options.targetFulfiller as `0x${string}` | undefined,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateOfferOptions } from \"./types\";\n\nexport async function executeCreateOffer(options: CreateOfferOptions): Promise<void> {\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n console.log(chalk.blue(\"Preparing collection offer...\"));\n\n const prepared = await bazaarClient.prepareCreateCollectionOffer({\n nftAddress: options.nftAddress as `0x${string}`,\n priceWei,\n offerer: account.address,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if needed (WETH approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing offer...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the offer\n console.log(chalk.blue(\"Submitting offer...\"));\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `Collection offer created successfully!\\n Transaction: ${hash}\\n Collection: ${options.nftAddress}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateOfferOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n const prepared = await bazaarClient.prepareCreateCollectionOffer({\n nftAddress: options.nftAddress as `0x${string}`,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitListingOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitListing(options: SubmitListingOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitListing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitListing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n console.log(chalk.blue(\"Submitting listing...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`Listing submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitListingOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitListing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitListing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitOfferOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitOffer(options: SubmitOfferOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitCollectionOffer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n console.log(chalk.blue(\"Submitting offer...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`Offer submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitOfferOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitCollectionOffer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { BuyListingOptions } from \"./types\";\n\nexport async function executeBuyListing(options: BuyListingOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching listing...\"));\n\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`Listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillListing(listing, account.address);\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if any\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `Listing fulfilled successfully!\\n Transaction: ${hash}\\n NFT: ${listing.nftAddress} #${listing.tokenId}\\n Price: ${listing.price} ${listing.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to buy listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: BuyListingOptions): Promise<void> {\n if (!options.buyer) {\n exitWithError(\"--buyer is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const buyerAddress = options.buyer as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`Listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillListing(listing, buyerAddress);\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode buy listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { AcceptOfferOptions } from \"./types\";\n\nexport async function executeAcceptOffer(options: AcceptOfferOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching offers...\"));\n\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`Offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillCollectionOffer(\n offer,\n options.tokenId,\n account.address\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if any (ERC721 approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `Offer accepted successfully!\\n Transaction: ${hash}\\n NFT: ${options.nftAddress} #${options.tokenId}\\n Price: ${offer.price} ${offer.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to accept offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: AcceptOfferOptions): Promise<void> {\n if (!options.seller) {\n exitWithError(\"--seller is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const sellerAddress = options.seller as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`Offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillCollectionOffer(\n offer,\n options.tokenId,\n sellerAddress\n );\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode accept offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { OwnedNftsOptions } from \"./types\";\n\nexport async function executeOwnedNfts(options: OwnedNftsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const startTokenId = options.startTokenId ? BigInt(options.startTokenId) : undefined;\n const endTokenId = options.endTokenId ? BigInt(options.endTokenId) : undefined;\n\n try {\n const tokenIds = await bazaarClient.getOwnedTokens({\n nftAddress: options.nftAddress as `0x${string}`,\n ownerAddress: options.owner as `0x${string}`,\n startTokenId,\n endTokenId,\n });\n\n if (options.json) {\n const output = {\n nftAddress: options.nftAddress,\n owner: options.owner,\n tokenIds: tokenIds.map((id) => id.toString()),\n count: tokenIds.length,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (tokenIds.length === 0) {\n console.log(chalk.yellow(\"No owned tokens found in the specified range\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nOwned Tokens (${tokenIds.length}):\\n`));\n console.log(` ${chalk.cyan(\"Collection:\")} ${options.nftAddress}`);\n console.log(` ${chalk.cyan(\"Owner:\")} ${options.owner}`);\n console.log(` ${chalk.cyan(\"Token IDs:\")} ${tokenIds.map((id) => id.toString()).join(\", \")}`);\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to fetch owned tokens: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListErc20ListingsOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListErc20Listings(options: ListErc20ListingsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getErc20Listings({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = listings.map((l) => ({\n orderHash: l.orderHash,\n maker: l.maker,\n tokenAddress: l.tokenAddress,\n tokenAmount: l.tokenAmount.toString(),\n price: l.price,\n priceWei: l.priceWei.toString(),\n pricePerToken: l.pricePerToken,\n pricePerTokenWei: l.pricePerTokenWei.toString(),\n currency: l.currency,\n expirationDate: l.expirationDate,\n orderStatus: l.orderStatus,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (listings.length === 0) {\n console.log(chalk.yellow(\"No active ERC-20 listings found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nERC-20 Listings (${listings.length}):\\n`));\n\n for (const listing of listings) {\n const expiry = new Date(listing.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${listing.orderHash}`);\n console.log(` ${chalk.cyan(\"Seller:\")} ${listing.maker}`);\n console.log(` ${chalk.cyan(\"Token:\")} ${listing.tokenAddress}`);\n console.log(` ${chalk.cyan(\"Amount:\")} ${listing.tokenAmount.toString()}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(listing.price)} ${listing.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Price/Token:\")} ${formatEthPrice(listing.pricePerToken)} ${listing.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch ERC-20 listings: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListErc20OffersOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListErc20Offers(options: ListErc20OffersOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getErc20Offers({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = offers.map((o) => ({\n orderHash: o.orderHash,\n maker: o.maker,\n tokenAddress: o.tokenAddress,\n tokenAmount: o.tokenAmount.toString(),\n price: o.price,\n priceWei: o.priceWei.toString(),\n pricePerToken: o.pricePerToken,\n pricePerTokenWei: o.pricePerTokenWei.toString(),\n currency: o.currency,\n expirationDate: o.expirationDate,\n orderStatus: o.orderStatus,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (offers.length === 0) {\n console.log(chalk.yellow(\"No active ERC-20 offers found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nERC-20 Offers (${offers.length}):\\n`));\n\n for (const offer of offers) {\n const expiry = new Date(offer.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${offer.orderHash}`);\n console.log(` ${chalk.cyan(\"Buyer:\")} ${offer.maker}`);\n console.log(` ${chalk.cyan(\"Token:\")} ${offer.tokenAddress}`);\n console.log(` ${chalk.cyan(\"Amount:\")} ${offer.tokenAmount.toString()}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(offer.price)} ${offer.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Price/Token:\")} ${formatEthPrice(offer.pricePerToken)} ${offer.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch ERC-20 offers: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateErc20ListingOptions } from \"./types\";\n\nexport async function executeCreateErc20Listing(options: CreateErc20ListingOptions): Promise<void> {\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n console.log(chalk.blue(\"Preparing ERC-20 listing...\"));\n\n const prepared = await bazaarClient.prepareCreateErc20Listing({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: account.address,\n targetFulfiller: options.targetFulfiller as `0x${string}` | undefined,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if needed\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing order...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the listing\n console.log(chalk.blue(\"Submitting ERC-20 listing...\"));\n const submitTx = bazaarClient.prepareSubmitErc20Listing(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 listing created successfully!\\n Transaction: ${hash}\\n Token: ${options.tokenAddress}\\n Amount: ${options.tokenAmount}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateErc20ListingOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n const prepared = await bazaarClient.prepareCreateErc20Listing({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n targetFulfiller: options.targetFulfiller as `0x${string}` | undefined,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateErc20OfferOptions } from \"./types\";\n\nexport async function executeCreateErc20Offer(options: CreateErc20OfferOptions): Promise<void> {\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n console.log(chalk.blue(\"Preparing ERC-20 offer...\"));\n\n const prepared = await bazaarClient.prepareCreateErc20Offer({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: account.address,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if needed (WETH approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing offer...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the offer\n console.log(chalk.blue(\"Submitting ERC-20 offer...\"));\n const submitTx = bazaarClient.prepareSubmitErc20Offer(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 offer created successfully!\\n Transaction: ${hash}\\n Token: ${options.tokenAddress}\\n Amount: ${options.tokenAmount}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateErc20OfferOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n const prepared = await bazaarClient.prepareCreateErc20Offer({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitErc20ListingOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitErc20Listing(options: SubmitErc20ListingOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitErc20Listing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Listing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n console.log(chalk.blue(\"Submitting ERC-20 listing...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`ERC-20 listing submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitErc20ListingOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitErc20Listing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Listing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitErc20OfferOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitErc20Offer(options: SubmitErc20OfferOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitErc20Offer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Offer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n console.log(chalk.blue(\"Submitting ERC-20 offer...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`ERC-20 offer submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitErc20OfferOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitErc20Offer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Offer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { BuyErc20ListingOptions } from \"./types\";\n\nexport async function executeBuyErc20Listing(options: BuyErc20ListingOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching ERC-20 listing...\"));\n\n const listings = await bazaarClient.getErc20Listings({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`ERC-20 listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillErc20Listing(listing, account.address);\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if any\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 listing fulfilled successfully!\\n Transaction: ${hash}\\n Token: ${listing.tokenAddress}\\n Amount: ${listing.tokenAmount.toString()}\\n Price: ${listing.price} ${listing.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to buy ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: BuyErc20ListingOptions): Promise<void> {\n if (!options.buyer) {\n exitWithError(\"--buyer is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const buyerAddress = options.buyer as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getErc20Listings({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`ERC-20 listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillErc20Listing(listing, buyerAddress);\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode buy ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { AcceptErc20OfferOptions } from \"./types\";\n\nexport async function executeAcceptErc20Offer(options: AcceptErc20OfferOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching ERC-20 offers...\"));\n\n const offers = await bazaarClient.getErc20Offers({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`ERC-20 offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillErc20Offer(\n offer,\n account.address\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(commonOptions.chainId),\n });\n\n // Send approval txs if any (ERC20 approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 offer accepted successfully!\\n Transaction: ${hash}\\n Token: ${offer.tokenAddress}\\n Amount: ${offer.tokenAmount.toString()}\\n Price: ${offer.price} ${offer.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to accept ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: AcceptErc20OfferOptions): Promise<void> {\n if (!options.seller) {\n exitWithError(\"--seller is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const sellerAddress = options.seller as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getErc20Offers({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`ERC-20 offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillErc20Offer(\n offer,\n sellerAddress\n );\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode accept ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import { createWalletClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { getChainRpcUrls, getBaseDataSuffix } from \"@net-protocol/core\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\n\n/**\n * Create a wallet client from a private key\n */\nexport function createWallet(\n privateKey: `0x${string}`,\n chainId: number,\n rpcUrl?: string\n) {\n const account = privateKeyToAccount(privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId,\n rpcUrl: rpcUrl,\n });\n\n return createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n dataSuffix: getBaseDataSuffix(chainId),\n });\n}\n\n/**\n * Execute a transaction using a wallet client\n */\nexport async function executeTransaction(\n walletClient: ReturnType<typeof createWallet>,\n txConfig: WriteTransactionConfig\n): Promise<`0x${string}`> {\n const hash = await walletClient.writeContract({\n address: txConfig.to,\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n value: txConfig.value,\n chain: null,\n } as Parameters<typeof walletClient.writeContract>[0]);\n\n return hash;\n}\n","import chalk from \"chalk\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { CancelListingOptions } from \"./types\";\n\nexport async function executeCancelListing(options: CancelListingOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching listing...\"));\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}`,\n maker: account.address,\n includeExpired: true,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(\n `Listing with order hash ${options.orderHash} not found for maker ${account.address}`\n );\n }\n\n const cancelTx = bazaarClient.prepareCancelListing(listing);\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(\"Sending cancel transaction...\"));\n const hash = await executeTransaction(walletClient, cancelTx);\n\n console.log(\n chalk.green(\n `Listing cancelled successfully!\\n Transaction: ${hash}\\n NFT: ${listing.nftAddress} #${listing.tokenId}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to cancel listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: CancelListingOptions): Promise<void> {\n if (!options.maker) {\n exitWithError(\"--maker is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const makerAddress = options.maker as `0x${string}`;\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}`,\n maker: makerAddress,\n includeExpired: true,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(\n `Listing with order hash ${options.orderHash} not found for maker ${makerAddress}`\n );\n }\n\n const cancelTx = bazaarClient.prepareCancelListing(listing);\n console.log(JSON.stringify(encodeTransaction(cancelTx, readOnlyOptions.chainId), null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode cancel listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { CancelOfferOptions } from \"./types\";\n\nexport async function executeCancelOffer(options: CancelOfferOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching collection offer...\"));\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n maker: account.address,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(\n `Offer with order hash ${options.orderHash} not found for maker ${account.address}`\n );\n }\n\n const cancelTx = bazaarClient.prepareCancelCollectionOffer(offer);\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(\"Sending cancel transaction...\"));\n const hash = await executeTransaction(walletClient, cancelTx);\n\n console.log(\n chalk.green(\n `Offer cancelled successfully!\\n Transaction: ${hash}\\n NFT: ${offer.nftAddress}\\n Price: ${offer.price} ${offer.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to cancel offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: CancelOfferOptions): Promise<void> {\n if (!options.maker) {\n exitWithError(\"--maker is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const makerAddress = options.maker as `0x${string}`;\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n maker: makerAddress,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(\n `Offer with order hash ${options.orderHash} not found for maker ${makerAddress}`\n );\n }\n\n const cancelTx = bazaarClient.prepareCancelCollectionOffer(offer);\n console.log(JSON.stringify(encodeTransaction(cancelTx, readOnlyOptions.chainId), null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode cancel offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { CancelErc20ListingOptions } from \"./types\";\n\nexport async function executeCancelErc20Listing(\n options: CancelErc20ListingOptions\n): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching ERC20 listing...\"));\n const listings = await bazaarClient.getErc20Listings({\n tokenAddress: options.tokenAddress as `0x${string}`,\n maker: account.address,\n includeExpired: true,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(\n `ERC20 listing with order hash ${options.orderHash} not found for maker ${account.address}`\n );\n }\n\n const cancelTx = bazaarClient.prepareCancelErc20Listing(listing);\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(\"Sending cancel transaction...\"));\n const hash = await executeTransaction(walletClient, cancelTx);\n\n console.log(\n chalk.green(\n `ERC20 listing cancelled successfully!\\n Transaction: ${hash}\\n Token: ${listing.tokenAddress}\\n Amount: ${listing.tokenAmount.toString()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to cancel ERC20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: CancelErc20ListingOptions): Promise<void> {\n if (!options.maker) {\n exitWithError(\"--maker is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const makerAddress = options.maker as `0x${string}`;\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getErc20Listings({\n tokenAddress: options.tokenAddress as `0x${string}`,\n maker: makerAddress,\n includeExpired: true,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(\n `ERC20 listing with order hash ${options.orderHash} not found for maker ${makerAddress}`\n );\n }\n\n const cancelTx = bazaarClient.prepareCancelErc20Listing(listing);\n console.log(JSON.stringify(encodeTransaction(cancelTx, readOnlyOptions.chainId), null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode cancel ERC20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { CancelErc20OfferOptions } from \"./types\";\n\nexport async function executeCancelErc20Offer(\n options: CancelErc20OfferOptions\n): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching ERC20 offer...\"));\n const offers = await bazaarClient.getErc20Offers({\n tokenAddress: options.tokenAddress as `0x${string}`,\n maker: account.address,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(\n `ERC20 offer with order hash ${options.orderHash} not found for maker ${account.address}`\n );\n }\n\n const cancelTx = bazaarClient.prepareCancelErc20Offer(offer);\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(\"Sending cancel transaction...\"));\n const hash = await executeTransaction(walletClient, cancelTx);\n\n console.log(\n chalk.green(\n `ERC20 offer cancelled successfully!\\n Transaction: ${hash}\\n Token: ${offer.tokenAddress}\\n Amount: ${offer.tokenAmount.toString()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to cancel ERC20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: CancelErc20OfferOptions): Promise<void> {\n if (!options.maker) {\n exitWithError(\"--maker is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const makerAddress = options.maker as `0x${string}`;\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getErc20Offers({\n tokenAddress: options.tokenAddress as `0x${string}`,\n maker: makerAddress,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(\n `ERC20 offer with order hash ${options.orderHash} not found for maker ${makerAddress}`\n );\n }\n\n const cancelTx = bazaarClient.prepareCancelErc20Offer(offer);\n console.log(JSON.stringify(encodeTransaction(cancelTx, readOnlyOptions.chainId), null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode cancel ERC20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeListListings } from \"./list-listings\";\nimport { executeListOffers } from \"./list-offers\";\nimport { executeListSales } from \"./list-sales\";\nimport { executeCreateListing } from \"./create-listing\";\nimport { executeCreateOffer } from \"./create-offer\";\nimport { executeSubmitListing } from \"./submit-listing\";\nimport { executeSubmitOffer } from \"./submit-offer\";\nimport { executeBuyListing } from \"./buy-listing\";\nimport { executeAcceptOffer } from \"./accept-offer\";\nimport { executeOwnedNfts } from \"./owned-nfts\";\nimport { executeListErc20Listings } from \"./list-erc20-listings\";\nimport { executeListErc20Offers } from \"./list-erc20-offers\";\nimport { executeCreateErc20Listing } from \"./create-erc20-listing\";\nimport { executeCreateErc20Offer } from \"./create-erc20-offer\";\nimport { executeSubmitErc20Listing } from \"./submit-erc20-listing\";\nimport { executeSubmitErc20Offer } from \"./submit-erc20-offer\";\nimport { executeBuyErc20Listing } from \"./buy-erc20-listing\";\nimport { executeAcceptErc20Offer } from \"./accept-erc20-offer\";\nimport { executeCancelListing } from \"./cancel-listing\";\nimport { executeCancelOffer } from \"./cancel-offer\";\nimport { executeCancelErc20Listing } from \"./cancel-erc20-listing\";\nimport { executeCancelErc20Offer } from \"./cancel-erc20-offer\";\n\nconst chainIdOption = [\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value: string) => parseInt(value, 10),\n] as const;\n\nconst rpcUrlOption = [\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\",\n] as const;\n\nconst privateKeyOption = [\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\",\n] as const;\n\nexport function registerBazaarCommand(program: Command): void {\n const bazaarCommand = program\n .command(\"bazaar\")\n .description(\"Bazaar NFT trading operations\");\n\n const listListingsCommand = new Command(\"list-listings\")\n .description(\"List active NFT listings\")\n .option(\"--nft-address <address>\", \"NFT contract address (optional for cross-collection)\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListListings({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const listOffersCommand = new Command(\"list-offers\")\n .description(\"List active collection offers\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListOffers({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const listSalesCommand = new Command(\"list-sales\")\n .description(\"List recent sales\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListSales({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const createListingCommand = new Command(\"create-listing\")\n .description(\"Create an NFT listing (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--token-id <id>\", \"Token ID to list\")\n .requiredOption(\"--price <eth>\", \"Price in ETH (e.g., 0.1)\")\n .option(\"--target-fulfiller <address>\", \"Make a private listing for this address\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateListing({\n nftAddress: options.nftAddress,\n tokenId: options.tokenId,\n price: options.price,\n targetFulfiller: options.targetFulfiller,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const createOfferCommand = new Command(\"create-offer\")\n .description(\"Create a collection offer (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--price <eth>\", \"Offer price in ETH (e.g., 0.1)\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateOffer({\n nftAddress: options.nftAddress,\n price: options.price,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const submitListingCommand = new Command(\"submit-listing\")\n .description(\"Submit a signed listing (follow-up to create-listing without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-listing output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitListing({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const submitOfferCommand = new Command(\"submit-offer\")\n .description(\"Submit a signed offer (follow-up to create-offer without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-offer output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitOffer({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const buyListingCommand = new Command(\"buy-listing\")\n .description(\"Buy an NFT listing\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the listing to buy\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(\"--buyer <address>\", \"Buyer address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeBuyListing({\n orderHash: options.orderHash,\n nftAddress: options.nftAddress,\n buyer: options.buyer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const acceptOfferCommand = new Command(\"accept-offer\")\n .description(\"Accept a collection offer by selling your NFT\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the offer to accept\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--token-id <id>\", \"Token ID to sell\")\n .option(\"--seller <address>\", \"Seller address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeAcceptOffer({\n orderHash: options.orderHash,\n nftAddress: options.nftAddress,\n tokenId: options.tokenId,\n seller: options.seller,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const ownedNftsCommand = new Command(\"owned-nfts\")\n .description(\"List NFTs owned by an address\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--owner <address>\", \"Owner address to check\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .option(\"--start-token-id <id>\", \"Start of token ID range (default: 0)\")\n .option(\"--end-token-id <id>\", \"End of token ID range (default: 10000)\")\n .action(async (options) => {\n await executeOwnedNfts({\n nftAddress: options.nftAddress,\n owner: options.owner,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n startTokenId: options.startTokenId,\n endTokenId: options.endTokenId,\n });\n });\n\n // ERC-20 commands\n\n const listErc20ListingsCommand = new Command(\"list-erc20-listings\")\n .description(\"List active ERC-20 token listings\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListErc20Listings({\n tokenAddress: options.tokenAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const listErc20OffersCommand = new Command(\"list-erc20-offers\")\n .description(\"List active ERC-20 token offers\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListErc20Offers({\n tokenAddress: options.tokenAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const createErc20ListingCommand = new Command(\"create-erc20-listing\")\n .description(\"Create an ERC-20 token listing (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .requiredOption(\"--token-amount <amount>\", \"Token amount in raw units (bigint string)\")\n .requiredOption(\"--price <eth>\", \"Total price in ETH for the token amount\")\n .option(\"--target-fulfiller <address>\", \"Make a private listing for this address\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateErc20Listing({\n tokenAddress: options.tokenAddress,\n tokenAmount: options.tokenAmount,\n price: options.price,\n targetFulfiller: options.targetFulfiller,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const createErc20OfferCommand = new Command(\"create-erc20-offer\")\n .description(\"Create an ERC-20 token offer (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .requiredOption(\"--token-amount <amount>\", \"Token amount in raw units (bigint string)\")\n .requiredOption(\"--price <eth>\", \"Total price in ETH for the token amount\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateErc20Offer({\n tokenAddress: options.tokenAddress,\n tokenAmount: options.tokenAmount,\n price: options.price,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const submitErc20ListingCommand = new Command(\"submit-erc20-listing\")\n .description(\"Submit a signed ERC-20 listing (follow-up to create-erc20-listing without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-erc20-listing output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitErc20Listing({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const submitErc20OfferCommand = new Command(\"submit-erc20-offer\")\n .description(\"Submit a signed ERC-20 offer (follow-up to create-erc20-offer without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-erc20-offer output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitErc20Offer({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const buyErc20ListingCommand = new Command(\"buy-erc20-listing\")\n .description(\"Buy an ERC-20 token listing\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the listing to buy\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(\"--buyer <address>\", \"Buyer address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeBuyErc20Listing({\n orderHash: options.orderHash,\n tokenAddress: options.tokenAddress,\n buyer: options.buyer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const acceptErc20OfferCommand = new Command(\"accept-erc20-offer\")\n .description(\"Accept an ERC-20 token offer by selling your tokens\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the offer to accept\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(\"--seller <address>\", \"Seller address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeAcceptErc20Offer({\n orderHash: options.orderHash,\n tokenAddress: options.tokenAddress,\n seller: options.seller,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Cancel commands\n\n const cancelListingCommand = new Command(\"cancel-listing\")\n .description(\"Cancel an NFT listing you created\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the listing to cancel\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(\"--maker <address>\", \"Maker address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeCancelListing({\n orderHash: options.orderHash,\n nftAddress: options.nftAddress,\n maker: options.maker,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const cancelOfferCommand = new Command(\"cancel-offer\")\n .description(\"Cancel a collection offer you created\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the offer to cancel\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(\"--maker <address>\", \"Maker address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeCancelOffer({\n orderHash: options.orderHash,\n nftAddress: options.nftAddress,\n maker: options.maker,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const cancelErc20ListingCommand = new Command(\"cancel-erc20-listing\")\n .description(\"Cancel an ERC-20 listing you created\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the listing to cancel\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(\"--maker <address>\", \"Maker address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeCancelErc20Listing({\n orderHash: options.orderHash,\n tokenAddress: options.tokenAddress,\n maker: options.maker,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const cancelErc20OfferCommand = new Command(\"cancel-erc20-offer\")\n .description(\"Cancel an ERC-20 offer you created\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the offer to cancel\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(\"--maker <address>\", \"Maker address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeCancelErc20Offer({\n orderHash: options.orderHash,\n tokenAddress: options.tokenAddress,\n maker: options.maker,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n bazaarCommand.addCommand(listListingsCommand);\n bazaarCommand.addCommand(listOffersCommand);\n bazaarCommand.addCommand(listSalesCommand);\n bazaarCommand.addCommand(createListingCommand);\n bazaarCommand.addCommand(createOfferCommand);\n bazaarCommand.addCommand(submitListingCommand);\n bazaarCommand.addCommand(submitOfferCommand);\n bazaarCommand.addCommand(buyListingCommand);\n bazaarCommand.addCommand(acceptOfferCommand);\n bazaarCommand.addCommand(ownedNftsCommand);\n bazaarCommand.addCommand(listErc20ListingsCommand);\n bazaarCommand.addCommand(listErc20OffersCommand);\n bazaarCommand.addCommand(createErc20ListingCommand);\n bazaarCommand.addCommand(createErc20OfferCommand);\n bazaarCommand.addCommand(submitErc20ListingCommand);\n bazaarCommand.addCommand(submitErc20OfferCommand);\n bazaarCommand.addCommand(buyErc20ListingCommand);\n bazaarCommand.addCommand(acceptErc20OfferCommand);\n bazaarCommand.addCommand(cancelListingCommand);\n bazaarCommand.addCommand(cancelOfferCommand);\n bazaarCommand.addCommand(cancelErc20ListingCommand);\n bazaarCommand.addCommand(cancelErc20OfferCommand);\n}\n","import chalk from \"chalk\";\nimport type { NetMessage, RegisteredFeed, RegisteredAgent } from \"@net-protocol/feeds\";\nimport {\n feedUrl as buildFeedUrl,\n postPermalink,\n profileUrl as buildProfileUrl,\n walletUrl as buildWalletUrl,\n} from \"../../shared/urls\";\n\n/**\n * Truncate an address for display\n */\nexport function truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Format a timestamp as ISO date string\n */\nexport function formatTimestamp(timestamp: number | bigint): string {\n return new Date(Number(timestamp) * 1000).toISOString().replace(\"T\", \" \").slice(0, 19);\n}\n\n/** Parse topic to get clean feed name and whether it's a comment */\nfunction parseTopic(topic: string): { feedName: string; isComment: boolean } {\n const commentMatch = topic.match(/^(.+?):comments:/);\n if (commentMatch) {\n return { feedName: commentMatch[1], isComment: true };\n }\n return { feedName: topic, isComment: false };\n}\n\ninterface FormatPostOptions {\n commentCount?: number;\n showTopic?: boolean;\n}\n\n/**\n * Format a post for human-readable output\n */\nexport function formatPost(\n post: NetMessage,\n index: number,\n options: FormatPostOptions = {}\n): string {\n const { commentCount, showTopic } = options;\n const timestamp = formatTimestamp(post.timestamp);\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.gray(timestamp)}`,\n ` ${chalk.white(\"Sender:\")} ${post.sender}`,\n ` ${chalk.white(\"Text:\")} ${post.text}`,\n ];\n\n if (showTopic && post.topic) {\n const { feedName, isComment } = parseTopic(post.topic);\n const prefix = isComment ? \"Comment on\" : \"Feed\";\n lines.push(` ${chalk.white(prefix + \":\")} ${chalk.magenta(feedName)}`);\n }\n\n if (commentCount !== undefined) {\n lines.push(` ${chalk.white(\"Comments:\")} ${commentCount}`);\n }\n\n if (post.data && post.data !== \"0x\") {\n lines.push(` ${chalk.white(\"Data:\")} ${post.data}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a feed for human-readable output\n */\nexport function formatFeed(feed: RegisteredFeed, index: number): string {\n const timestamp = formatTimestamp(feed.timestamp);\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.white(feed.feedName)}`,\n ` ${chalk.gray(\"Registrant:\")} ${feed.registrant}`,\n ` ${chalk.gray(\"Registered:\")} ${timestamp}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a comment for human-readable output with indentation\n */\nexport function formatComment(\n comment: NetMessage,\n depth: number\n): string {\n const indent = \" \".repeat(depth + 1);\n const timestamp = formatTimestamp(comment.timestamp);\n const lines = [\n `${indent}${chalk.gray(timestamp)} ${chalk.blue(truncateAddress(comment.sender))}`,\n `${indent}${comment.text}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Strip the on-chain \"feed-\" topic prefix to get a display feed name.\n */\nfunction stripFeedPrefix(topic: string): string {\n const match = topic.match(/^(.+?):comments:/);\n const base = match ? match[1] : topic;\n return base.replace(/^feed-/i, \"\");\n}\n\ninterface PostJsonOptions {\n chainId: number;\n /**\n * Absolute index in the topic-filtered stream (when this post was fetched\n * via a topic filter, e.g. `botchan read general`).\n */\n topicIndex?: number;\n /**\n * Absolute index in the maker-filtered stream (when this post was fetched\n * via a sender filter, e.g. `botchan posts <address>`).\n */\n userIndex?: number;\n /**\n * Global Net message index (most reliable URL form when known — typically\n * available after a transaction via the MessageSent log).\n */\n globalIndex?: number;\n commentCount?: number;\n}\n\n/**\n * Convert a post to JSON format with ready-to-use URLs.\n *\n * Every URL field is pre-built using the chainId so AI agents reading this\n * output never need to construct URLs from parts.\n */\nexport function postToJson(\n post: NetMessage,\n options: PostJsonOptions\n): Record<string, unknown> {\n const { chainId, topicIndex, userIndex, globalIndex, commentCount } = options;\n const feedName = stripFeedPrefix(post.topic);\n const postId = `${post.sender}:${post.timestamp}`;\n\n const permalink = postPermalink(chainId, {\n globalIndex,\n topic: post.topic,\n topicIndex,\n user: userIndex !== undefined ? post.sender : undefined,\n userIndex,\n });\n\n const result: Record<string, unknown> = {\n postId,\n permalink,\n sender: post.sender,\n senderProfileUrl: buildProfileUrl(chainId, post.sender),\n senderWalletUrl: buildWalletUrl(chainId, post.sender),\n text: post.text,\n timestamp: Number(post.timestamp),\n feed: feedName,\n feedUrl: buildFeedUrl(chainId, feedName),\n topic: post.topic,\n };\n\n if (topicIndex !== undefined) result.topicIndex = topicIndex;\n if (userIndex !== undefined) result.userIndex = userIndex;\n if (globalIndex !== undefined) result.globalIndex = globalIndex;\n if (commentCount !== undefined) result.commentCount = commentCount;\n if (post.data && post.data !== \"0x\") result.data = post.data;\n\n return result;\n}\n\n/**\n * Convert a feed to JSON format\n */\nexport function feedToJson(\n feed: RegisteredFeed,\n index: number,\n chainId?: number\n): Record<string, unknown> {\n const result: Record<string, unknown> = {\n index,\n feedName: feed.feedName,\n registrant: feed.registrant,\n timestamp: feed.timestamp,\n };\n if (chainId !== undefined) {\n result.feedUrl = buildFeedUrl(chainId, feed.feedName);\n }\n return result;\n}\n\ninterface CommentJsonOptions {\n chainId: number;\n depth: number;\n /**\n * Permalink to the parent post (with `?topic=...&index=...`). When\n * provided, a per-comment `permalink` is built by appending\n * `&commentId={sender}-{timestamp}`.\n */\n parentPostUrl?: string | null;\n}\n\n/**\n * Convert a comment to JSON format with ready-to-use URLs.\n */\nexport function commentToJson(\n comment: NetMessage,\n options: CommentJsonOptions\n): Record<string, unknown> {\n const { chainId, depth, parentPostUrl } = options;\n const commentParam = `${comment.sender}-${comment.timestamp}`;\n const permalink = parentPostUrl\n ? `${parentPostUrl}${parentPostUrl.includes(\"?\") ? \"&\" : \"?\"}commentId=${commentParam}`\n : null;\n\n const result: Record<string, unknown> = {\n commentId: `${comment.sender}:${comment.timestamp}`,\n permalink,\n sender: comment.sender,\n senderProfileUrl: buildProfileUrl(chainId, comment.sender),\n text: comment.text,\n timestamp: Number(comment.timestamp),\n depth,\n };\n if (comment.data !== \"0x\") {\n result.data = comment.data;\n }\n return result;\n}\n\n/**\n * Format an agent for human-readable output\n */\nexport function formatAgent(agent: RegisteredAgent, index: number): string {\n const timestamp = formatTimestamp(agent.timestamp);\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.white(agent.address)}`,\n ` ${chalk.gray(\"Registered:\")} ${timestamp}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Convert an agent to JSON format\n */\nexport function agentToJson(\n agent: RegisteredAgent,\n index: number,\n chainId?: number\n): Record<string, unknown> {\n const result: Record<string, unknown> = {\n index,\n address: agent.address,\n timestamp: agent.timestamp,\n };\n if (chainId !== undefined) {\n result.profileUrl = buildProfileUrl(chainId, agent.address);\n result.walletUrl = buildWalletUrl(chainId, agent.address);\n }\n return result;\n}\n\n/**\n * Print JSON data to stdout\n */\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { RegisteredFeed } from \"@net-protocol/feeds\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedRegistryClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { formatFeed, feedToJson, printJson } from \"./format\";\n\ninterface ListOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the feed list command\n */\nasync function executeFeedList(options: ListOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedRegistryClient(readOnlyOptions);\n\n try {\n const feeds = await client.getRegisteredFeeds({\n maxFeeds: options.limit ?? 50,\n });\n\n if (options.json) {\n printJson(\n feeds.map((feed: RegisteredFeed, i: number) =>\n feedToJson(feed, i, readOnlyOptions.chainId)\n )\n );\n } else {\n if (feeds.length === 0) {\n console.log(chalk.yellow(\"No registered feeds found\"));\n return;\n }\n\n console.log(chalk.white(`Found ${feeds.length} registered feed(s):\\n`));\n feeds.forEach((feed: RegisteredFeed, i: number) => {\n console.log(formatFeed(feed, i));\n if (i < feeds.length - 1) {\n console.log(); // Empty line between feeds\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch feeds: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed list subcommand\n */\nexport function registerFeedListCommand(parent: Command, commandName = \"list\"): void {\n parent\n .command(commandName)\n .description(\"List registered feeds\")\n .option(\n \"--limit <n>\",\n \"Maximum number of feeds to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeFeedList(options);\n });\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\ninterface FeedState {\n lastSeenTimestamp: number;\n}\n\nexport type HistoryEntryType = \"post\" | \"comment\" | \"register\";\n\nexport interface HistoryEntry {\n type: HistoryEntryType;\n timestamp: number; // Unix timestamp (local time when action was taken)\n txHash: string;\n chainId: number;\n feed: string;\n sender?: string; // The agent's address (for constructing post IDs)\n text?: string; // Message content (for posts/comments)\n postId?: string; // For comments, the post being replied to\n}\n\ninterface AppState {\n feeds: Record<string, FeedState>;\n myAddress?: string;\n history?: HistoryEntry[];\n}\n\nconst MAX_HISTORY_ENTRIES = 100;\n\n// Keep state directory as ~/.botchan/ for backward compat\nconst STATE_DIR = path.join(os.homedir(), \".botchan\");\nconst STATE_FILE = path.join(STATE_DIR, \"state.json\");\n\nfunction ensureStateDir(): void {\n if (!fs.existsSync(STATE_DIR)) {\n fs.mkdirSync(STATE_DIR, { recursive: true });\n }\n}\n\nfunction loadState(): AppState {\n try {\n if (fs.existsSync(STATE_FILE)) {\n const data = fs.readFileSync(STATE_FILE, \"utf-8\");\n return JSON.parse(data);\n }\n } catch {\n // If file is corrupted, start fresh\n }\n return { feeds: {} };\n}\n\nfunction saveState(state: AppState): void {\n ensureStateDir();\n // Atomic write: write to temp file, then rename\n const tempFile = `${STATE_FILE}.tmp`;\n fs.writeFileSync(tempFile, JSON.stringify(state, null, 2));\n fs.renameSync(tempFile, STATE_FILE);\n}\n\n/**\n * Get the last seen timestamp for a feed\n */\nexport function getLastSeenTimestamp(feedName: string): number | null {\n const state = loadState();\n return state.feeds[feedName]?.lastSeenTimestamp ?? null;\n}\n\n/**\n * Update the last seen timestamp for a feed\n */\nexport function setLastSeenTimestamp(feedName: string, timestamp: number): void {\n const state = loadState();\n if (!state.feeds[feedName]) {\n state.feeds[feedName] = { lastSeenTimestamp: timestamp };\n } else {\n state.feeds[feedName].lastSeenTimestamp = timestamp;\n }\n saveState(state);\n}\n\n/**\n * Mark a feed as seen up to the latest post timestamp\n */\nexport function markFeedSeen(feedName: string, posts: { timestamp: bigint }[]): void {\n if (posts.length === 0) return;\n\n // Find the max timestamp\n const maxTimestamp = posts.reduce(\n (max, post) => (post.timestamp > max ? post.timestamp : max),\n posts[0].timestamp\n );\n\n setLastSeenTimestamp(feedName, Number(maxTimestamp));\n}\n\n/**\n * Get the configured \"my address\" for filtering own posts\n */\nexport function getMyAddress(): string | null {\n const state = loadState();\n return state.myAddress ?? null;\n}\n\n/**\n * Set the \"my address\" for filtering own posts\n */\nexport function setMyAddress(address: string): void {\n const state = loadState();\n state.myAddress = address.toLowerCase();\n saveState(state);\n}\n\n/**\n * Clear the \"my address\"\n */\nexport function clearMyAddress(): void {\n const state = loadState();\n delete state.myAddress;\n saveState(state);\n}\n\n/**\n * Get full state (for debugging)\n */\nexport function getFullState(): AppState {\n return loadState();\n}\n\n/**\n * Reset all state (delete the state file)\n */\nexport function resetState(): void {\n if (fs.existsSync(STATE_FILE)) {\n fs.unlinkSync(STATE_FILE);\n }\n}\n\n/**\n * Get the state file path (for display purposes)\n */\nexport function getStateFilePath(): string {\n return STATE_FILE;\n}\n\n/**\n * Add an entry to the agent's history\n * Keeps only the most recent MAX_HISTORY_ENTRIES entries\n */\nexport function addHistoryEntry(entry: Omit<HistoryEntry, \"timestamp\">): void {\n const state = loadState();\n const history = state.history ?? [];\n\n const newEntry: HistoryEntry = {\n ...entry,\n timestamp: Math.floor(Date.now() / 1000),\n };\n\n // Add to beginning (most recent first)\n history.unshift(newEntry);\n\n // Trim to max size\n if (history.length > MAX_HISTORY_ENTRIES) {\n history.length = MAX_HISTORY_ENTRIES;\n }\n\n state.history = history;\n saveState(state);\n}\n\n/**\n * Get the agent's history\n * Returns entries in reverse chronological order (most recent first)\n */\nexport function getHistory(limit?: number): HistoryEntry[] {\n const state = loadState();\n const history = state.history ?? [];\n return limit ? history.slice(0, limit) : history;\n}\n\n/**\n * Get history entries of a specific type\n */\nexport function getHistoryByType(\n type: HistoryEntryType,\n limit?: number\n): HistoryEntry[] {\n const history = getHistory();\n const filtered = history.filter((entry) => entry.type === type);\n return limit ? filtered.slice(0, limit) : filtered;\n}\n\n/**\n * Clear all history\n */\nexport function clearHistory(): void {\n const state = loadState();\n state.history = [];\n saveState(state);\n}\n\n/**\n * Get history count\n */\nexport function getHistoryCount(): number {\n const state = loadState();\n return state.history?.length ?? 0;\n}\n\n/**\n * Check if a feed name is a wallet address (i.e., a direct message)\n */\nexport function isWalletAddress(feed: string): boolean {\n return /^0x[a-fA-F0-9]{40}$/.test(feed);\n}\n\n/**\n * Contact info derived from history\n */\nexport interface Contact {\n address: string;\n lastInteraction: number;\n interactionCount: number;\n firstInteraction: number;\n}\n\n/**\n * Get contacts - wallet addresses you've posted to (DMs)\n * Returns contacts sorted by last interaction (most recent first)\n */\nexport function getContacts(): Contact[] {\n const history = getHistory();\n const contactMap = new Map<string, Contact>();\n\n // Only look at posts (not comments) to wallet addresses\n for (const entry of history) {\n if (entry.type === \"post\" && isWalletAddress(entry.feed)) {\n const address = entry.feed.toLowerCase();\n const existing = contactMap.get(address);\n\n if (existing) {\n existing.interactionCount++;\n // Update first/last interaction times\n if (entry.timestamp > existing.lastInteraction) {\n existing.lastInteraction = entry.timestamp;\n }\n if (entry.timestamp < existing.firstInteraction) {\n existing.firstInteraction = entry.timestamp;\n }\n } else {\n contactMap.set(address, {\n address,\n lastInteraction: entry.timestamp,\n firstInteraction: entry.timestamp,\n interactionCount: 1,\n });\n }\n }\n }\n\n // Sort by last interaction (most recent first)\n return Array.from(contactMap.values()).sort(\n (a, b) => b.lastInteraction - a.lastInteraction\n );\n}\n\n/**\n * Feed activity info derived from history\n */\nexport interface FeedActivity {\n feed: string;\n postCount: number;\n commentCount: number;\n lastActivity: number;\n firstActivity: number;\n}\n\n/**\n * Get feeds the agent has been active in\n * Returns feeds sorted by last activity (most recent first)\n * Excludes wallet addresses (those are contacts, not feeds)\n */\nexport function getActiveFeeds(): FeedActivity[] {\n const history = getHistory();\n const feedMap = new Map<string, FeedActivity>();\n\n for (const entry of history) {\n // Skip wallet addresses - those are contacts\n if (isWalletAddress(entry.feed)) continue;\n // Skip feed registrations - only count actual posts/comments\n if (entry.type === \"register\") continue;\n\n const feedName = entry.feed.toLowerCase();\n const existing = feedMap.get(feedName);\n\n if (existing) {\n if (entry.type === \"post\") existing.postCount++;\n if (entry.type === \"comment\") existing.commentCount++;\n if (entry.timestamp > existing.lastActivity) {\n existing.lastActivity = entry.timestamp;\n }\n if (entry.timestamp < existing.firstActivity) {\n existing.firstActivity = entry.timestamp;\n }\n } else {\n feedMap.set(feedName, {\n feed: feedName,\n postCount: entry.type === \"post\" ? 1 : 0,\n commentCount: entry.type === \"comment\" ? 1 : 0,\n lastActivity: entry.timestamp,\n firstActivity: entry.timestamp,\n });\n }\n }\n\n // Sort by last activity (most recent first)\n return Array.from(feedMap.values()).sort(\n (a, b) => b.lastActivity - a.lastActivity\n );\n}\n","/**\n * Normalize a feed name to lowercase for consistency.\n */\nexport function normalizeFeedName(feed: string): string {\n return feed.toLowerCase();\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { NetMessage } from \"@net-protocol/feeds\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { getLastSeenTimestamp, markFeedSeen, getMyAddress } from \"../../shared/state\";\nimport { formatPost, postToJson, printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface ReadOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n sender?: string;\n unseen?: boolean;\n markSeen?: boolean;\n}\n\n/**\n * Execute the feed read command\n */\nasync function executeFeedRead(feed: string, options: ReadOptions): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n const limit = options.limit ?? 20;\n\n try {\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No posts found in feed \"${normalizedFeed}\"`));\n }\n return;\n }\n\n // Fetch more posts if filtering by sender (we need to find enough matches)\n const fetchLimit = options.sender ? Math.max(limit * 5, 100) : limit;\n\n const fetched = await client.getFeedPostsWithIndex({\n topic: normalizedFeed,\n maxPosts: fetchLimit,\n });\n // Pair each post with its absolute topic-stream index so we can build\n // permalinks even after later filtering reorders/removes entries.\n let postsWithIndex: { post: NetMessage; topicIndex: number }[] =\n fetched.messages.map((post, i) => ({\n post,\n topicIndex: fetched.startIndex + i,\n }));\n\n // Filter by sender if specified\n if (options.sender) {\n const senderLower = options.sender.toLowerCase();\n postsWithIndex = postsWithIndex.filter(\n ({ post }) => post.sender.toLowerCase() === senderLower\n );\n // Apply limit after filtering\n postsWithIndex = postsWithIndex.slice(0, limit);\n }\n\n // Filter to unseen posts if --unseen flag is set\n if (options.unseen) {\n const lastSeen = getLastSeenTimestamp(normalizedFeed);\n const myAddress = getMyAddress();\n\n postsWithIndex = postsWithIndex.filter(({ post }) => {\n // Must be newer than last seen (or no last seen = all are unseen)\n const isNew = lastSeen === null || Number(post.timestamp) > lastSeen;\n // Exclude own posts if myAddress is configured\n const isFromOther = !myAddress || post.sender.toLowerCase() !== myAddress;\n return isNew && isFromOther;\n });\n }\n\n const posts = postsWithIndex.map(({ post }) => post);\n\n // Mark feed as seen if --mark-seen flag is set\n // Use the original unfiltered posts to get the true latest timestamp\n if (options.markSeen) {\n const allPosts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: 1, // Just need the latest\n });\n if (allPosts.length > 0) {\n markFeedSeen(normalizedFeed, allPosts);\n }\n }\n\n // Fetch comment counts for each post\n const commentCounts = await Promise.all(\n posts.map((post: NetMessage) => client.getCommentCount(post))\n );\n\n if (options.json) {\n printJson(\n postsWithIndex.map(({ post, topicIndex }, i) =>\n postToJson(post, {\n chainId: readOnlyOptions.chainId,\n topicIndex,\n commentCount: commentCounts[i],\n })\n )\n );\n } else {\n if (posts.length === 0) {\n const senderNote = options.sender ? ` by ${options.sender}` : \"\";\n console.log(chalk.yellow(`No posts found in feed \"${normalizedFeed}\"${senderNote}`));\n return;\n }\n\n const senderNote = options.sender ? ` by ${options.sender}` : \"\";\n console.log(\n chalk.white(`Found ${posts.length} post(s) in feed \"${normalizedFeed}\"${senderNote}:\\n`)\n );\n posts.forEach((post: NetMessage, i: number) => {\n console.log(formatPost(post, i, { commentCount: commentCounts[i] }));\n if (i < posts.length - 1) {\n console.log(); // Empty line between posts\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to read feed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed read subcommand\n */\nexport function registerFeedReadCommand(parent: Command): void {\n parent\n .command(\"read <feed>\")\n .description(\"Read posts from a feed (for group chats, use 'chat read' instead)\")\n .option(\n \"--limit <n>\",\n \"Maximum number of posts to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--sender <address>\", \"Filter posts by sender address\")\n .option(\"--unseen\", \"Only show posts not yet seen (newer than last --mark-seen)\")\n .option(\"--mark-seen\", \"Mark the feed as seen up to the latest post\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (feed, options) => {\n await executeFeedRead(feed, options);\n });\n}\n","import { decodeEventLog } from \"viem\";\nimport {\n getNetContract,\n getPublicClient,\n} from \"@net-protocol/core\";\n\n/**\n * Decode the global Net `MessageSent` indices emitted in a transaction.\n *\n * The Net contract assigns each message a monotonically-increasing global\n * index when the `MessageSent` event fires. That global index is the most\n * reliable input to a permalink (it works regardless of which filter context\n * the post was queried from). This helper waits for the receipt and returns\n * the indices in emission order.\n */\nexport async function getMessageIndicesFromTx(params: {\n chainId: number;\n rpcUrl?: string | string[];\n txHash: `0x${string}`;\n}): Promise<number[]> {\n const publicClient = getPublicClient({\n chainId: params.chainId,\n rpcUrl: params.rpcUrl,\n });\n const netContract = getNetContract(params.chainId);\n const contractAddress = netContract.address.toLowerCase();\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: params.txHash,\n });\n\n const indices: number[] = [];\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() !== contractAddress) continue;\n try {\n const decoded = decodeEventLog({\n abi: netContract.abi,\n data: log.data,\n topics: log.topics,\n });\n if (decoded.eventName === \"MessageSent\") {\n const args = decoded.args as unknown as {\n messageIndex: bigint;\n };\n indices.push(Number(args.messageIndex));\n }\n } catch {\n // Not a MessageSent event — ignore.\n }\n }\n return indices;\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault, parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { addHistoryEntry } from \"../../shared/state\";\nimport { getMessageIndicesFromTx } from \"../../shared/messageIndex\";\nimport {\n explorerTxUrl,\n feedUrl as buildFeedUrl,\n postPermalink,\n profileUrl as buildProfileUrl,\n} from \"../../shared/urls\";\nimport { printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface PostOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n data?: string;\n body?: string;\n json?: boolean;\n}\n\nconst MAX_MESSAGE_LENGTH = 4000;\n\n/**\n * Execute the feed post command\n */\nasync function executeFeedPost(\n feed: string,\n message: string,\n options: PostOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n\n if (message.length === 0) {\n exitWithError(\"Message cannot be empty\");\n }\n\n // If --body is provided, format as title + body\n // The message argument becomes the title, --body becomes the body\n const fullMessage = options.body\n ? `${message}\\n\\n${options.body}`\n : message;\n\n if (fullMessage.length > MAX_MESSAGE_LENGTH) {\n exitWithError(\n `Message too long (${fullMessage.length} chars). Maximum is ${MAX_MESSAGE_LENGTH} characters.`\n );\n }\n\n // For encode-only mode, we don't need a private key\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n const txConfig = client.preparePostToFeed({\n topic: normalizedFeed,\n text: fullMessage,\n data: options.data,\n });\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createFeedClient(commonOptions);\n const txConfig = client.preparePostToFeed({\n topic: normalizedFeed,\n text: fullMessage,\n data: options.data,\n });\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n if (!options.json) {\n console.log(chalk.blue(`Posting to feed \"${normalizedFeed}\"...`));\n }\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n const senderAddress = walletClient.account.address;\n\n // Recover the post ID and the global Net message index from the receipt.\n // The MessageSent event gives us the most reliable index for permalinks.\n let postId: string | undefined;\n let globalIndex: number | undefined;\n try {\n const indices = await getMessageIndicesFromTx({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n txHash: hash,\n });\n globalIndex = indices[0];\n } catch {\n // Non-fatal: we'll still try the legacy fallback below.\n }\n try {\n const posts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: 10,\n });\n const ourPost = posts.find(\n (p) =>\n p.sender.toLowerCase() === senderAddress.toLowerCase() &&\n p.text === fullMessage\n );\n if (ourPost) {\n postId = `${ourPost.sender}:${ourPost.timestamp}`;\n }\n } catch {\n // Non-fatal.\n }\n\n addHistoryEntry({\n type: \"post\",\n txHash: hash,\n chainId: commonOptions.chainId,\n feed: normalizedFeed,\n sender: senderAddress,\n text: fullMessage,\n postId,\n });\n\n const permalink = postPermalink(commonOptions.chainId, {\n globalIndex,\n });\n\n if (options.json) {\n printJson({\n success: true,\n txHash: hash,\n explorerTxUrl: explorerTxUrl(commonOptions.chainId, hash),\n postId,\n globalIndex,\n permalink,\n feed: normalizedFeed,\n feedUrl: buildFeedUrl(commonOptions.chainId, normalizedFeed),\n sender: senderAddress,\n senderProfileUrl: buildProfileUrl(commonOptions.chainId, senderAddress),\n text: fullMessage,\n });\n return;\n }\n\n const displayText = options.body\n ? `${message} (+ body)`\n : message;\n\n const lines = [\n `Message posted successfully!`,\n ` Transaction: ${hash}`,\n ` Feed: ${normalizedFeed}`,\n ];\n if (postId) lines.push(` Post ID: ${postId}`);\n if (permalink) lines.push(` Permalink: ${permalink}`);\n lines.push(` Text: ${displayText}`);\n\n console.log(chalk.green(lines.join(\"\\n\")));\n } catch (error) {\n exitWithError(\n `Failed to post message: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed post subcommand\n */\nexport function registerFeedPostCommand(parent: Command): void {\n parent\n .command(\"post <feed> <message>\")\n .description(\"Post a message to a feed (for group chats, use 'chat send' instead)\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\"--data <data>\", \"Optional data to attach to the post\")\n .option(\"--body <text>\", \"Post body (message becomes the title)\")\n .option(\n \"--json\",\n \"Output structured JSON (includes permalink and other URLs) after submission\"\n )\n .action(async (feed, message, options) => {\n await executeFeedPost(feed, message, options);\n });\n}\n","import type { NetMessage } from \"@net-protocol/feeds\";\n\n/**\n * Create a post ID from a message\n * Format: {sender}:{timestamp}\n */\nexport function createPostId(post: NetMessage): string {\n return `${post.sender}:${post.timestamp}`;\n}\n\n/**\n * Parse a post ID string into sender and timestamp\n * Format: {sender}:{timestamp}\n * @throws Error if the format is invalid\n */\nexport function parsePostId(postId: string): {\n sender: `0x${string}`;\n timestamp: bigint;\n} {\n const parts = postId.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\n `Invalid post ID format. Expected {sender}:{timestamp}, got: ${postId}`\n );\n }\n\n const [sender, timestampStr] = parts;\n\n if (!sender.startsWith(\"0x\") || sender.length !== 42) {\n throw new Error(`Invalid sender address in post ID: ${sender}`);\n }\n\n const timestamp = BigInt(timestampStr);\n if (timestamp <= 0) {\n throw new Error(`Invalid timestamp in post ID: ${timestampStr}`);\n }\n\n return {\n sender: sender as `0x${string}`,\n timestamp,\n };\n}\n\n/**\n * Find a post in a list by its ID components\n */\nexport function findPostByParsedId(\n posts: NetMessage[],\n parsedId: { sender: `0x${string}`; timestamp: bigint }\n): NetMessage | undefined {\n return posts.find(\n (p) =>\n p.sender.toLowerCase() === parsedId.sender.toLowerCase() &&\n p.timestamp === parsedId.timestamp\n );\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault, parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient, createNetClient } from \"../../shared/client\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { parsePostId } from \"../../shared/postId\";\nimport { addHistoryEntry } from \"../../shared/state\";\nimport { getMessageIndicesFromTx } from \"../../shared/messageIndex\";\nimport {\n explorerTxUrl,\n feedUrl as buildFeedUrl,\n postPermalink,\n profileUrl as buildProfileUrl,\n} from \"../../shared/urls\";\nimport { printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface CommentWriteOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n json?: boolean;\n}\n\nconst MAX_MESSAGE_LENGTH = 4000;\n\n/**\n * Execute the feed comment-write command\n */\nasync function executeFeedCommentWrite(\n feed: string,\n postId: string,\n message: string,\n options: CommentWriteOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n\n if (message.length === 0) {\n exitWithError(\"Comment cannot be empty\");\n }\n\n if (message.length > MAX_MESSAGE_LENGTH) {\n exitWithError(\n `Comment too long (${message.length} chars). Maximum is ${MAX_MESSAGE_LENGTH} characters.`\n );\n }\n\n // Parse post ID\n let parsedId: { sender: `0x${string}`; timestamp: bigint };\n try {\n parsedId = parsePostId(postId);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : \"Invalid post ID format\"\n );\n }\n\n // Determine options based on encode-only mode\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n exitWithError(\n `Feed \"${normalizedFeed}\" has no posts. Cannot find post ${postId}.`\n );\n }\n\n // Fetch the target post to get its full data (needed to generate comment\n // topic hash) and its absolute topic-stream index (needed for the parent\n // post permalink we return alongside the comment).\n const fetched = await client.getFeedPostsWithIndex({\n topic: normalizedFeed,\n maxPosts: 100,\n });\n\n const matchOffset = fetched.messages.findIndex(\n (p) =>\n p.sender.toLowerCase() === parsedId.sender.toLowerCase() &&\n p.timestamp === parsedId.timestamp\n );\n const targetPost = matchOffset >= 0 ? fetched.messages[matchOffset] : undefined;\n if (!targetPost) {\n exitWithError(\n `Post not found with ID ${postId} in feed \"${normalizedFeed}\". Make sure the sender and timestamp are correct.`\n );\n }\n const parentTopicIndex = fetched.startIndex + matchOffset;\n\n const txConfig = client.prepareComment({\n post: targetPost,\n text: message,\n });\n\n // For encode-only mode, just output the transaction data\n if (options.encodeOnly) {\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n if (!options.json) {\n console.log(chalk.blue(`Commenting on post ${postId}...`));\n }\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n const senderAddress = walletClient.account.address;\n\n let globalIndex: number | undefined;\n try {\n const indices = await getMessageIndicesFromTx({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n txHash: hash,\n });\n globalIndex = indices[0];\n } catch {\n // Non-fatal.\n }\n\n // Fetch the just-posted comment from chain to get its real on-chain\n // timestamp. We need that exact timestamp to build the deep-link\n // commentId param (`{sender}-{timestamp}`); using local clock time\n // would silently produce a broken URL.\n let commentTimestamp: number | undefined;\n if (globalIndex !== undefined) {\n try {\n const netClient = createNetClient(commonOptions);\n const fetchedComment = await netClient.getMessageAtIndex({\n messageIndex: globalIndex,\n });\n if (fetchedComment) {\n commentTimestamp = Number(fetchedComment.timestamp);\n }\n } catch {\n // Non-fatal — we'll fall back to a permalink without the highlight.\n }\n }\n\n addHistoryEntry({\n type: \"comment\",\n txHash: hash,\n chainId: commonOptions.chainId,\n feed: normalizedFeed,\n sender: senderAddress,\n text: message,\n postId: postId,\n });\n\n // Build permalinks. The parent post URL uses the absolute topic index\n // we recovered from getFeedPostsWithIndex above. The primary `permalink`\n // for the comment is the parent's URL with `&commentId=...` so the\n // deep-link highlights the new comment in context. If we couldn't\n // recover the on-chain timestamp, fall back to `?index={globalIndex}`\n // (which renders the comment as a post — still useful, just no\n // surrounding context).\n const parentPostUrl = postPermalink(commonOptions.chainId, {\n topic: normalizedFeed,\n topicIndex: parentTopicIndex,\n });\n const commentPermalink =\n commentTimestamp !== undefined\n ? postPermalink(commonOptions.chainId, {\n topic: normalizedFeed,\n topicIndex: parentTopicIndex,\n commentId: `${senderAddress}-${commentTimestamp}`,\n })\n : postPermalink(commonOptions.chainId, { globalIndex });\n\n if (options.json) {\n printJson({\n success: true,\n txHash: hash,\n explorerTxUrl: explorerTxUrl(commonOptions.chainId, hash),\n globalIndex,\n permalink: commentPermalink,\n parentPostId: postId,\n parentPostUrl,\n feed: normalizedFeed,\n feedUrl: buildFeedUrl(commonOptions.chainId, normalizedFeed),\n sender: senderAddress,\n senderProfileUrl: buildProfileUrl(commonOptions.chainId, senderAddress),\n text: message,\n ...(commentTimestamp !== undefined && {\n commentId: `${senderAddress}:${commentTimestamp}`,\n }),\n });\n return;\n }\n\n const lines = [\n `Comment posted successfully!`,\n ` Transaction: ${hash}`,\n ` Post: ${postId}`,\n ];\n if (commentPermalink) lines.push(` Permalink: ${commentPermalink}`);\n lines.push(` Comment: ${message}`);\n\n console.log(chalk.green(lines.join(\"\\n\")));\n } catch (error) {\n exitWithError(\n `Failed to post comment: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed comment-write subcommand\n */\nexport function registerFeedCommentWriteCommand(parent: Command): void {\n parent\n .command(\"comment <feed> <post-id> <message>\")\n .description(\n \"Comment on a post. Post ID format: {sender}:{timestamp}\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\n \"--json\",\n \"Output structured JSON (includes permalink and other URLs) after submission\"\n )\n .action(async (feed, postId, message, options) => {\n await executeFeedCommentWrite(feed, postId, message, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { NetMessage } from \"@net-protocol/feeds\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { parsePostId } from \"../../shared/postId\";\nimport { postPermalink } from \"../../shared/urls\";\nimport { formatComment, commentToJson, printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface CommentReadOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the feed comment-read command\n */\nasync function executeFeedCommentRead(\n feed: string,\n postId: string,\n options: CommentReadOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n\n // Parse post ID\n let parsedId: { sender: `0x${string}`; timestamp: bigint };\n try {\n parsedId = parsePostId(postId);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : \"Invalid post ID format\"\n );\n }\n\n try {\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n exitWithError(\n `Feed \"${normalizedFeed}\" has no posts. Cannot find post ${postId}.`\n );\n }\n\n // Fetch posts to find the target post (with absolute topic indices so we\n // can build a permalink to the parent post for comment deep-links).\n const fetched = await client.getFeedPostsWithIndex({\n topic: normalizedFeed,\n maxPosts: 100, // Fetch enough to find the post\n });\n\n const matchIndex = fetched.messages.findIndex(\n (p: NetMessage) =>\n p.sender.toLowerCase() === parsedId.sender.toLowerCase() &&\n p.timestamp === parsedId.timestamp\n );\n const targetPost =\n matchIndex >= 0 ? fetched.messages[matchIndex] : undefined;\n if (!targetPost) {\n exitWithError(\n `Post not found with ID ${postId} in feed \"${normalizedFeed}\". Make sure the sender and timestamp are correct.`\n );\n }\n const parentTopicIndex = fetched.startIndex + matchIndex;\n const parentPostUrl = postPermalink(readOnlyOptions.chainId, {\n topic: normalizedFeed,\n topicIndex: parentTopicIndex,\n });\n\n // Check comment count first\n const commentCount = await client.getCommentCount(targetPost);\n\n if (commentCount === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No comments found for post ${postId}`));\n }\n return;\n }\n\n // Fetch comments for the post\n const comments = await client.getComments({\n post: targetPost,\n maxComments: options.limit ?? 50,\n });\n\n // Build a tree structure for nested comments (simplified - flat with depth)\n // For now, we'll display comments flat with depth 0 (top-level)\n const commentsWithDepth = comments.map((comment: NetMessage) => ({\n comment,\n depth: 0,\n }));\n\n if (options.json) {\n printJson(\n commentsWithDepth.map(({ comment, depth }) =>\n commentToJson(comment, {\n chainId: readOnlyOptions.chainId,\n depth,\n parentPostUrl,\n })\n )\n );\n } else {\n if (comments.length === 0) {\n console.log(chalk.yellow(`No comments found for post ${postId}`));\n return;\n }\n\n console.log(\n chalk.white(`Found ${comments.length} comment(s) for post ${postId}:\\n`)\n );\n commentsWithDepth.forEach(({ comment, depth }, i) => {\n console.log(formatComment(comment, depth));\n if (i < commentsWithDepth.length - 1) {\n console.log(); // Empty line between comments\n }\n });\n }\n } catch (error) {\n if ((error as Error).message?.includes(\"Post not found\")) {\n throw error;\n }\n exitWithError(\n `Failed to fetch comments: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed comments subcommand\n */\nexport function registerFeedCommentReadCommand(parent: Command): void {\n parent\n .command(\"comments <feed> <post-id>\")\n .description(\n \"Read comments on a post. Post ID format: {sender}:{timestamp}\"\n )\n .option(\n \"--limit <n>\",\n \"Maximum number of comments to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (feed, postId, options) => {\n await executeFeedCommentRead(feed, postId, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault, parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedRegistryClient } from \"../../shared/client\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { addHistoryEntry } from \"../../shared/state\";\nimport { printJson } from \"./format\";\n\ninterface RegisterOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n}\n\n/**\n * Execute the feed register command\n */\nasync function executeFeedRegister(\n feedName: string,\n options: RegisterOptions\n): Promise<void> {\n // Validate feed name length\n if (feedName.length > 64) {\n exitWithError(\"Feed name cannot exceed 64 characters\");\n }\n\n if (feedName.length === 0) {\n exitWithError(\"Feed name cannot be empty\");\n }\n\n // For encode-only mode, we don't need a private key\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedRegistryClient(readOnlyOptions);\n const txConfig = client.prepareRegisterFeed({ feedName });\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createFeedRegistryClient(commonOptions);\n\n // Check if feed is already registered\n const isRegistered = await client.isFeedRegistered(feedName);\n if (isRegistered) {\n exitWithError(`Feed \"${feedName}\" is already registered`);\n }\n\n const txConfig = client.prepareRegisterFeed({ feedName });\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(`Registering feed \"${feedName}\"...`));\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n\n // Record in history\n addHistoryEntry({\n type: \"register\",\n txHash: hash,\n chainId: commonOptions.chainId,\n feed: feedName,\n sender: walletClient.account.address,\n });\n\n console.log(\n chalk.green(\n `Feed registered successfully!\\n Transaction: ${hash}\\n Feed: ${feedName}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to register feed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed register subcommand\n */\nexport function registerFeedRegisterCommand(parent: Command): void {\n parent\n .command(\"register <feed-name>\")\n .description(\"Register a new feed\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (feedName, options) => {\n await executeFeedRegister(feedName, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { getHistoryByType, type HistoryEntry } from \"../../shared/state\";\nimport { getMessageIndicesFromTx } from \"../../shared/messageIndex\";\nimport {\n explorerTxUrl,\n feedUrl as buildFeedUrl,\n postPermalink,\n profileUrl as buildProfileUrl,\n} from \"../../shared/urls\";\nimport { printJson } from \"./format\";\nimport { formatTimestamp } from \"./format\";\n\ninterface RepliesOptions {\n chainId?: number;\n rpcUrl?: string;\n limit?: number;\n json?: boolean;\n}\n\ninterface PostWithReplies {\n feed: string;\n postId: string;\n text: string;\n postedAt: number;\n commentCount: number;\n permalink: string | null;\n feedUrl: string | null;\n senderProfileUrl: string | null;\n explorerTxUrl: string | null;\n txHash: string;\n}\n\n/**\n * Truncate text for display\n */\nfunction truncateText(text: string, maxLen: number): string {\n if (text.length <= maxLen) return text;\n return text.slice(0, maxLen) + \"...\";\n}\n\n/**\n * Execute the feed replies command\n */\nasync function executeFeedReplies(options: RepliesOptions): Promise<void> {\n // Get recent posts from history that have post IDs\n const postHistory = getHistoryByType(\"post\", options.limit ?? 10);\n const postsWithIds = postHistory.filter(\n (entry): entry is HistoryEntry & { postId: string } => !!entry.postId\n );\n\n if (postsWithIds.length === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.gray(\"No posts with trackable IDs found in history.\"));\n console.log(\n chalk.gray(\"Post IDs are captured when you post with a wallet.\")\n );\n }\n return;\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n\n if (!options.json) {\n console.log(chalk.blue(`Checking replies on ${postsWithIds.length} posts...\\n`));\n }\n\n const results: PostWithReplies[] = [];\n\n for (const entry of postsWithIds) {\n try {\n // Parse post ID to get sender and timestamp\n const [sender, timestampStr] = entry.postId.split(\":\");\n const timestamp = BigInt(timestampStr);\n\n // Get comment count for this post\n // Construct a minimal post object for the comment count query\n const postObj = {\n sender: sender as `0x${string}`,\n timestamp,\n text: entry.text ?? \"\",\n topic: entry.feed,\n app: \"\" as `0x${string}`,\n data: \"0x\" as `0x${string}`,\n };\n const commentCount = await client.getCommentCount(postObj);\n\n // Recover the global Net message index from the original tx so we can\n // emit a stable permalink. One extra RPC call per post in exchange for\n // a URL the AI can hand back to a human.\n let permalink: string | null = null;\n try {\n const indices = await getMessageIndicesFromTx({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n txHash: entry.txHash as `0x${string}`,\n });\n if (indices[0] !== undefined) {\n permalink = postPermalink(readOnlyOptions.chainId, {\n globalIndex: indices[0],\n });\n }\n } catch {\n // Non-fatal — leave permalink null.\n }\n\n results.push({\n feed: entry.feed,\n postId: entry.postId,\n text: entry.text ?? \"\",\n postedAt: entry.timestamp,\n commentCount: Number(commentCount),\n permalink,\n feedUrl: buildFeedUrl(readOnlyOptions.chainId, entry.feed),\n senderProfileUrl: entry.sender\n ? buildProfileUrl(readOnlyOptions.chainId, entry.sender)\n : null,\n explorerTxUrl: explorerTxUrl(readOnlyOptions.chainId, entry.txHash),\n txHash: entry.txHash,\n });\n } catch {\n // Skip posts we can't check (e.g., if feed no longer exists)\n }\n }\n\n if (options.json) {\n printJson(results);\n return;\n }\n\n // Display results\n const postsWithReplies = results.filter((r: PostWithReplies) => r.commentCount > 0);\n const totalReplies = results.reduce((sum, r) => sum + r.commentCount, 0);\n\n console.log(\n chalk.cyan(\n `Found ${totalReplies} total replies across ${postsWithReplies.length} posts\\n`\n )\n );\n\n if (results.length === 0) {\n console.log(chalk.gray(\"Could not check any posts.\"));\n return;\n }\n\n // Sort by comment count (most replies first)\n results.sort((a: PostWithReplies, b: PostWithReplies) => b.commentCount - a.commentCount);\n\n for (const post of results) {\n const timeAgo = formatTimestamp(post.postedAt);\n const replyText =\n post.commentCount === 0\n ? chalk.gray(\"no replies\")\n : post.commentCount === 1\n ? chalk.green(\"1 reply\")\n : chalk.green(`${post.commentCount} replies`);\n\n console.log(\n `${chalk.white(post.feed)} ${chalk.gray(\"•\")} ${replyText} ${chalk.gray(`• ${timeAgo}`)}`\n );\n console.log(` ${chalk.gray(truncateText(post.text, 60))}`);\n\n if (post.commentCount > 0) {\n console.log(\n chalk.blue(` → netp feed comments ${post.feed} ${post.postId}`)\n );\n }\n console.log(\"\");\n }\n}\n\n/**\n * Register the feed replies subcommand\n */\nexport function registerFeedRepliesCommand(parent: Command): void {\n parent\n .command(\"replies\")\n .description(\"Check for replies on your recent posts\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--limit <n>\", \"Number of recent posts to check (default: 10)\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n await executeFeedReplies(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { NULL_ADDRESS } from \"@net-protocol/core\";\nimport type { NetMessage } from \"@net-protocol/feeds\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { formatPost, postToJson, printJson } from \"./format\";\n\ninterface PostsOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the feed posts command\n */\nasync function executeFeedPosts(\n address: string,\n options: PostsOptions\n): Promise<void> {\n // Validate address format\n if (!address.startsWith(\"0x\") || address.length !== 42) {\n exitWithError(\"Invalid address format. Must be 0x-prefixed, 42 characters\");\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const limit = options.limit ?? 20;\n\n try {\n // Get message count for this user from feeds (app = NULL_ADDRESS)\n const count = await client.getMessageCount({\n filter: {\n appAddress: NULL_ADDRESS as `0x${string}`,\n maker: address as `0x${string}`,\n },\n });\n\n if (count === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No posts found for address ${address}`));\n }\n return;\n }\n\n // Calculate range for fetching\n const startIndex = count > limit ? count - limit : 0;\n\n const messages = await client.getMessages({\n filter: {\n appAddress: NULL_ADDRESS as `0x${string}`,\n maker: address as `0x${string}`,\n },\n startIndex,\n endIndex: count,\n });\n\n if (options.json) {\n printJson(\n messages.map((msg: NetMessage, i: number) =>\n postToJson(msg, {\n chainId: readOnlyOptions.chainId,\n userIndex: startIndex + i,\n })\n )\n );\n } else {\n console.log(\n chalk.white(`Found ${messages.length} post(s) by ${address}:\\n`)\n );\n messages.forEach((msg: NetMessage, i: number) => {\n console.log(formatPost(msg, i, { showTopic: true }));\n if (i < messages.length - 1) {\n console.log(); // Empty line between posts\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch posts: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed posts subcommand\n */\nexport function registerFeedPostsCommand(parent: Command): void {\n parent\n .command(\"posts <address>\")\n .description(\"View posts by an address\")\n .option(\n \"--limit <n>\",\n \"Maximum number of posts to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (address, options) => {\n await executeFeedPosts(address, options);\n });\n}\n","import * as readline from \"readline\";\n\n/**\n * Prompt user for confirmation\n */\nexport async function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N): `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n });\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n getMyAddress,\n setMyAddress,\n clearMyAddress,\n getFullState,\n resetState,\n getStateFilePath,\n getHistoryCount,\n getContacts,\n getActiveFeeds,\n} from \"../../shared/state\";\nimport { formatTimestamp } from \"./format\";\nimport { confirm } from \"./confirm\";\n\ninterface ConfigOptions {\n myAddress?: string;\n clearAddress?: boolean;\n show?: boolean;\n reset?: boolean;\n force?: boolean;\n}\n\n/**\n * Execute the feed config command\n */\nasync function executeFeedConfig(options: ConfigOptions): Promise<void> {\n // Handle --reset\n if (options.reset) {\n const statePath = getStateFilePath();\n console.log(chalk.yellow(`This will delete all stored state at:`));\n console.log(chalk.white(` ${statePath}`));\n console.log(chalk.yellow(`\\nThis includes:`));\n console.log(chalk.white(` - All \"last seen\" timestamps for feeds`));\n console.log(chalk.white(` - Your configured address`));\n console.log(chalk.white(` - Your activity history`));\n\n if (!options.force) {\n const confirmed = await confirm(chalk.red(\"\\nAre you sure you want to reset?\"));\n if (!confirmed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n resetState();\n console.log(chalk.green(\"State reset successfully.\"));\n return;\n }\n\n // Handle --my-address\n if (options.myAddress) {\n // Basic validation\n if (!options.myAddress.match(/^0x[a-fA-F0-9]{40}$/)) {\n console.error(chalk.red(\"Invalid address format. Expected 0x followed by 40 hex characters.\"));\n process.exit(1);\n }\n setMyAddress(options.myAddress);\n console.log(chalk.green(`Set my address to: ${options.myAddress}`));\n return;\n }\n\n // Handle --clear-address\n if (options.clearAddress) {\n clearMyAddress();\n console.log(chalk.green(\"Cleared my address.\"));\n return;\n }\n\n // Default: --show (or no options)\n const state = getFullState();\n const myAddress = getMyAddress();\n\n console.log(chalk.cyan(\"Feed Configuration\\n\"));\n console.log(chalk.white(`State file: ${getStateFilePath()}`));\n console.log(chalk.white(`My address: ${myAddress ?? chalk.gray(\"(not set)\")}`));\n\n const feedCount = Object.keys(state.feeds).length;\n console.log(chalk.white(`Tracked feeds: ${feedCount}`));\n\n const historyCount = getHistoryCount();\n console.log(chalk.white(`History entries: ${historyCount}`));\n\n if (feedCount > 0 && feedCount <= 20) {\n console.log(chalk.gray(\"\\nLast seen timestamps:\"));\n for (const [feed, data] of Object.entries(state.feeds)) {\n const date = new Date(data.lastSeenTimestamp * 1000);\n console.log(chalk.gray(` ${feed}: ${date.toLocaleString()}`));\n }\n } else if (feedCount > 20) {\n console.log(chalk.gray(`\\n(${feedCount} feeds tracked, use --json for full list)`));\n }\n\n // Show active feeds (topics the agent has participated in)\n const activeFeeds = getActiveFeeds();\n if (activeFeeds.length > 0) {\n console.log(chalk.cyan(\"\\nActive Feeds:\"));\n const displayFeeds = activeFeeds.slice(0, 10);\n for (const feed of displayFeeds) {\n const activity = [];\n if (feed.postCount > 0) activity.push(`${feed.postCount} post${feed.postCount !== 1 ? \"s\" : \"\"}`);\n if (feed.commentCount > 0) activity.push(`${feed.commentCount} comment${feed.commentCount !== 1 ? \"s\" : \"\"}`);\n const lastActive = formatTimestamp(feed.lastActivity);\n console.log(chalk.white(` ${feed.feed}`) + chalk.gray(` • ${activity.join(\", \")} • ${lastActive}`));\n }\n if (activeFeeds.length > 10) {\n console.log(chalk.gray(` ... and ${activeFeeds.length - 10} more`));\n }\n }\n\n // Show contacts (wallet addresses the agent has DM'd)\n const contacts = getContacts();\n if (contacts.length > 0) {\n console.log(chalk.cyan(\"\\nRecent Contacts (DMs):\"));\n const displayContacts = contacts.slice(0, 10);\n for (const contact of displayContacts) {\n const truncAddr = `${contact.address.slice(0, 6)}...${contact.address.slice(-4)}`;\n const msgCount = contact.interactionCount;\n const lastActive = formatTimestamp(contact.lastInteraction);\n console.log(\n chalk.white(` ${truncAddr}`) +\n chalk.gray(` • ${msgCount} message${msgCount !== 1 ? \"s\" : \"\"} • ${lastActive}`)\n );\n }\n if (contacts.length > 10) {\n console.log(chalk.gray(` ... and ${contacts.length - 10} more`));\n }\n }\n}\n\n/**\n * Register the feed config subcommand\n */\nexport function registerFeedConfigCommand(parent: Command): void {\n parent\n .command(\"config\")\n .description(\"View or modify feed configuration\")\n .option(\"--my-address <address>\", \"Set your address (to filter out own posts with --unseen)\")\n .option(\"--clear-address\", \"Clear your configured address\")\n .option(\"--show\", \"Show current configuration (default)\")\n .option(\"--reset\", \"Reset all state (clears last-seen timestamps and address)\")\n .option(\"--force\", \"Skip confirmation prompt for --reset\")\n .action(async (options) => {\n await executeFeedConfig(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n getHistory,\n getHistoryByType,\n clearHistory,\n getHistoryCount,\n type HistoryEntry,\n type HistoryEntryType,\n} from \"../../shared/state\";\nimport { formatTimestamp, printJson, truncateAddress } from \"./format\";\nimport { confirm } from \"./confirm\";\nimport {\n explorerTxUrl,\n feedUrl as buildFeedUrl,\n profileUrl as buildProfileUrl,\n} from \"../../shared/urls\";\n\ninterface HistoryOptions {\n limit?: number;\n type?: string;\n json?: boolean;\n clear?: boolean;\n force?: boolean;\n}\n\n/**\n * Format a history entry for human-readable output\n */\nfunction formatHistoryEntry(entry: HistoryEntry, index: number): string {\n const timestamp = formatTimestamp(entry.timestamp);\n const typeColor =\n entry.type === \"post\"\n ? chalk.green\n : entry.type === \"comment\"\n ? chalk.blue\n : chalk.yellow;\n\n const lines = [\n chalk.cyan(`[${index}]`) +\n ` ${chalk.gray(timestamp)} ` +\n typeColor(entry.type.toUpperCase()),\n ` ${chalk.white(\"Feed:\")} ${entry.feed}`,\n ` ${chalk.white(\"Tx:\")} ${entry.txHash}`,\n ];\n\n if (entry.sender) {\n lines.push(` ${chalk.white(\"Sender:\")} ${truncateAddress(entry.sender)}`);\n }\n\n if (entry.text) {\n const truncatedText =\n entry.text.length > 80 ? entry.text.slice(0, 80) + \"...\" : entry.text;\n lines.push(` ${chalk.white(\"Text:\")} ${truncatedText}`);\n }\n\n // Show postId context based on entry type\n if (entry.type === \"post\" && entry.postId) {\n lines.push(` ${chalk.white(\"Post ID:\")} ${entry.postId}`);\n } else if (entry.type === \"comment\" && entry.postId) {\n lines.push(` ${chalk.white(\"Reply to:\")} ${entry.postId}`);\n }\n\n // Show follow-up hint\n if (entry.type === \"post\" && entry.postId) {\n lines.push(\n chalk.gray(` → Check replies: netp feed comments ${entry.feed} ${entry.postId}`)\n );\n } else if (entry.type === \"post\" && entry.sender) {\n lines.push(\n chalk.gray(` → Find post: netp feed read ${entry.feed} --sender ${entry.sender} --json`)\n );\n } else if (entry.type === \"comment\" && entry.postId) {\n lines.push(\n chalk.gray(` → See thread: netp feed comments ${entry.feed} ${entry.postId}`)\n );\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Convert a history entry to JSON format\n */\nfunction historyEntryToJson(\n entry: HistoryEntry,\n index: number\n): Record<string, unknown> {\n // History entries don't carry the topic/global index, so we can't build a\n // post permalink without an extra RPC call per entry. Emit the URLs we can\n // build from the data we have (feed, sender, tx hash) and let callers run\n // `botchan verify-claim <txHash> --json` to recover the post permalink\n // when needed.\n const result: Record<string, unknown> = {\n index,\n type: entry.type,\n timestamp: entry.timestamp,\n txHash: entry.txHash,\n explorerTxUrl: explorerTxUrl(entry.chainId, entry.txHash),\n chainId: entry.chainId,\n feed: entry.feed,\n feedUrl: buildFeedUrl(entry.chainId, entry.feed),\n };\n\n if (entry.sender) {\n result.sender = entry.sender;\n result.senderProfileUrl = buildProfileUrl(entry.chainId, entry.sender);\n }\n\n if (entry.text) {\n result.text = entry.text;\n }\n\n if (entry.postId) {\n result.postId = entry.postId;\n }\n\n return result;\n}\n\n/**\n * Validate history type option\n */\nfunction validateType(type: string): HistoryEntryType {\n const validTypes = [\"post\", \"comment\", \"register\"];\n if (!validTypes.includes(type)) {\n console.error(\n chalk.red(\n `Invalid type \"${type}\". Must be one of: ${validTypes.join(\", \")}`\n )\n );\n process.exit(1);\n }\n return type as HistoryEntryType;\n}\n\n/**\n * Execute the feed history command\n */\nasync function executeFeedHistory(options: HistoryOptions): Promise<void> {\n // Handle --clear\n if (options.clear) {\n const count = getHistoryCount();\n if (count === 0) {\n console.log(chalk.gray(\"History is already empty.\"));\n return;\n }\n\n console.log(chalk.yellow(`This will delete ${count} history entries.`));\n\n if (!options.force) {\n const confirmed = await confirm(\n chalk.red(\"\\nAre you sure you want to clear history?\")\n );\n if (!confirmed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n clearHistory();\n console.log(chalk.green(\"History cleared.\"));\n return;\n }\n\n // Get history entries\n let entries: HistoryEntry[];\n if (options.type) {\n const validType = validateType(options.type);\n entries = getHistoryByType(validType, options.limit);\n } else {\n entries = getHistory(options.limit);\n }\n\n if (entries.length === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.gray(\"No history entries found.\"));\n console.log(\n chalk.gray(\n \"History is recorded when you post, comment, or register feeds.\"\n )\n );\n }\n return;\n }\n\n // Output\n if (options.json) {\n const jsonEntries = entries.map((entry: HistoryEntry, idx: number) =>\n historyEntryToJson(entry, idx)\n );\n printJson(jsonEntries);\n } else {\n const totalCount = getHistoryCount();\n const typeFilter = options.type ? ` (type: ${options.type})` : \"\";\n console.log(\n chalk.cyan(`Feed History${typeFilter} (${entries.length} of ${totalCount})\\n`)\n );\n\n for (let i = 0; i < entries.length; i++) {\n console.log(formatHistoryEntry(entries[i], i));\n if (i < entries.length - 1) {\n console.log(\"\");\n }\n }\n }\n}\n\n/**\n * Register the feed history subcommand\n */\nexport function registerFeedHistoryCommand(parent: Command): void {\n parent\n .command(\"history\")\n .description(\"View feed activity history (posts, comments, registrations)\")\n .option(\"--limit <n>\", \"Limit number of entries\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--type <type>\", \"Filter by type: post, comment, or register\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--clear\", \"Clear all history\")\n .option(\"--force\", \"Skip confirmation prompt for --clear\")\n .action(async (options) => {\n await executeFeedHistory(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault, parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { createAgentRegistryClient } from \"../../shared/client\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { addHistoryEntry } from \"../../shared/state\";\nimport { printJson } from \"./format\";\n\ninterface RegisterAgentOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n}\n\n/**\n * Execute the agent register command\n */\nasync function executeRegisterAgent(\n options: RegisterAgentOptions\n): Promise<void> {\n // For encode-only mode, we don't need a private key\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createAgentRegistryClient(readOnlyOptions);\n const txConfig = client.prepareRegisterAgent();\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createAgentRegistryClient(commonOptions);\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n // Check if already registered\n const isRegistered = await client.isAgentRegistered(walletClient.account.address);\n if (isRegistered) {\n exitWithError(`Address ${walletClient.account.address} is already registered as an agent`);\n }\n\n console.log(chalk.blue(`Registering agent ${walletClient.account.address}...`));\n\n const txConfig = client.prepareRegisterAgent();\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n\n // Record in history\n addHistoryEntry({\n type: \"register\",\n txHash: hash,\n chainId: commonOptions.chainId,\n feed: \"agent-registry\",\n sender: walletClient.account.address,\n });\n\n console.log(\n chalk.green(\n `Agent registered successfully!\\n Transaction: ${hash}\\n Address: ${walletClient.account.address}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to register agent: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the register-agent subcommand\n */\nexport function registerAgentRegisterCommand(parent: Command): void {\n parent\n .command(\"register-agent\")\n .description(\"Register your address on the agent leaderboard\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeRegisterAgent(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { RegisteredAgent } from \"@net-protocol/feeds\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createAgentRegistryClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { formatAgent, agentToJson, printJson } from \"./format\";\n\ninterface ListAgentsOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the list-agents command\n */\nasync function executeListAgents(options: ListAgentsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createAgentRegistryClient(readOnlyOptions);\n\n try {\n const limit = options.limit ?? 100;\n const [totalCount, agents] = await Promise.all([\n client.getRegisteredAgentCount(),\n client.getRegisteredAgents({ maxAgents: limit }),\n ]);\n\n if (options.json) {\n printJson({\n totalCount,\n agents: agents.map((agent: RegisteredAgent, i: number) =>\n agentToJson(agent, i, readOnlyOptions.chainId)\n ),\n });\n } else {\n if (agents.length === 0) {\n console.log(chalk.yellow(\"No registered agents found\"));\n return;\n }\n\n console.log(\n chalk.white(`Registered agents: ${totalCount} total, showing last ${agents.length}:\\n`)\n );\n agents.forEach((agent: RegisteredAgent, i: number) => {\n console.log(formatAgent(agent, i));\n if (i < agents.length - 1) {\n console.log(); // Empty line between agents\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch agents: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the list-agents subcommand\n */\nexport function registerListAgentsCommand(parent: Command, commandName = \"list-agents\"): void {\n parent\n .command(commandName)\n .description(\"List registered agents from the agent registry\")\n .option(\n \"--limit <n>\",\n \"Maximum number of agents to display (default: 100)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListAgents(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { decodeEventLog } from \"viem\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { addHistoryEntry, getHistory } from \"../../shared/state\";\nimport { createPostId } from \"../../shared/postId\";\nimport {\n explorerTxUrl,\n feedUrl as buildFeedUrl,\n postPermalink,\n profileUrl as buildProfileUrl,\n} from \"../../shared/urls\";\nimport { printJson } from \"./format\";\nimport {\n getPublicClient,\n getNetContract,\n} from \"@net-protocol/core\";\nimport {\n isCommentTopic,\n parseCommentData,\n COMMENT_TOPIC_SUFFIX,\n FEED_TOPIC_PREFIX,\n} from \"@net-protocol/feeds\";\n\ninterface VerifyClaimOptions {\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Extract feed name from a topic string.\n * For posts: \"feed-crypto\" -> \"crypto\"\n * For comments: \"feed-crypto:comments:0x...\" -> \"crypto\"\n */\nfunction extractFeedName(topic: string): string {\n const baseTopic = isCommentTopic(topic)\n ? topic.split(COMMENT_TOPIC_SUFFIX)[0]\n : topic;\n return baseTopic.startsWith(FEED_TOPIC_PREFIX)\n ? baseTopic.slice(FEED_TOPIC_PREFIX.length)\n : baseTopic;\n}\n\n/**\n * Execute the feed verify-claim command\n */\nasync function executeFeedVerifyClaim(\n txHash: string,\n options: VerifyClaimOptions\n): Promise<void> {\n if (!txHash.startsWith(\"0x\") || txHash.length !== 66) {\n exitWithError(\n \"Invalid transaction hash format (must be 0x-prefixed, 66 characters)\"\n );\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const publicClient = getPublicClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n const netContract = getNetContract(readOnlyOptions.chainId);\n const netClient = createNetClient(readOnlyOptions);\n\n // Re-derive URL fields even if already recorded, so callers that lost the\n // original --json output can still recover the permalink.\n const wasAlreadyRecorded = getHistory().some(\n (entry) => entry.txHash === txHash\n );\n\n if (wasAlreadyRecorded && !options.json) {\n console.log(\n chalk.yellow(\n \"Transaction already in history — re-deriving URLs from on-chain data.\"\n )\n );\n }\n\n // Fetch transaction receipt\n const receipt = await publicClient\n .getTransactionReceipt({ hash: txHash as `0x${string}` })\n .catch(() =>\n exitWithError(\n \"Could not fetch transaction receipt. Make sure the transaction hash is correct and the transaction has been confirmed.\"\n )\n );\n\n // Filter logs from the Net contract and decode MessageSent events\n const contractAddress = netContract.address.toLowerCase();\n const messageSentEvents: { sender: `0x${string}`; messageIndex: bigint }[] =\n [];\n\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() !== contractAddress) {\n continue;\n }\n\n try {\n const decoded = decodeEventLog({\n abi: netContract.abi,\n data: log.data,\n topics: log.topics,\n });\n\n if (decoded.eventName === \"MessageSent\") {\n const args = decoded.args as unknown as {\n sender: `0x${string}`;\n topic: string;\n messageIndex: bigint;\n };\n messageSentEvents.push({\n sender: args.sender,\n messageIndex: args.messageIndex,\n });\n }\n } catch {\n // Not a MessageSent event, skip\n }\n }\n\n if (messageSentEvents.length === 0) {\n exitWithError(\n \"Transaction does not contain any Net protocol messages.\"\n );\n }\n\n if (!options.json) {\n console.log(\n chalk.blue(\n `Found ${messageSentEvents.length} message(s) in transaction. Fetching details...`\n )\n );\n }\n\n // Fetch all messages in parallel\n const messages = await Promise.all(\n messageSentEvents.map((event) =>\n netClient.getMessageAtIndex({\n messageIndex: Number(event.messageIndex),\n })\n )\n );\n\n type RecoveredEntry = Record<string, unknown>;\n const entries: RecoveredEntry[] = [];\n let recorded = 0;\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n if (!message) {\n if (!options.json) {\n console.log(\n chalk.yellow(\n ` Could not fetch message at index ${messageSentEvents[i].messageIndex}. Skipping.`\n )\n );\n }\n continue;\n }\n\n const globalIndex = Number(messageSentEvents[i].messageIndex);\n const feedName = extractFeedName(message.topic);\n const isComment = isCommentTopic(message.topic);\n\n let type: \"post\" | \"comment\";\n let postId: string | undefined;\n let parentPostId: string | undefined;\n let permalink: string | null = null;\n\n if (isComment) {\n type = \"comment\";\n const commentData = parseCommentData(message.data);\n parentPostId = commentData\n ? `${commentData.parentSender}:${commentData.parentTimestamp}`\n : undefined;\n const commentParam = `${message.sender}-${Number(message.timestamp)}`;\n permalink = postPermalink(readOnlyOptions.chainId, {\n globalIndex,\n commentId: commentParam,\n });\n } else {\n type = \"post\";\n postId = createPostId(message);\n permalink = postPermalink(readOnlyOptions.chainId, { globalIndex });\n }\n\n if (!wasAlreadyRecorded) {\n addHistoryEntry({\n type,\n txHash,\n chainId: readOnlyOptions.chainId,\n feed: feedName,\n sender: message.sender,\n text: message.text,\n postId: type === \"comment\" ? parentPostId : postId,\n });\n recorded++;\n }\n\n const entry: RecoveredEntry = {\n type,\n txHash,\n explorerTxUrl: explorerTxUrl(readOnlyOptions.chainId, txHash),\n globalIndex,\n permalink,\n feed: feedName,\n feedUrl: buildFeedUrl(readOnlyOptions.chainId, feedName),\n sender: message.sender,\n senderProfileUrl: buildProfileUrl(\n readOnlyOptions.chainId,\n message.sender\n ),\n text: message.text,\n timestamp: Number(message.timestamp),\n };\n if (type === \"post\") entry.postId = postId;\n if (type === \"comment\") entry.parentPostId = parentPostId;\n entries.push(entry);\n\n if (!options.json) {\n const label =\n type === \"comment\"\n ? `Verified comment:\\n Feed: ${feedName}\\n Sender: ${message.sender}\\n Text: ${message.text}\\n Parent post: ${parentPostId ?? \"unknown\"}\\n Permalink: ${permalink ?? \"(unavailable)\"}\\n Tx: ${txHash}`\n : `Verified post:\\n Feed: ${feedName}\\n Sender: ${message.sender}\\n Text: ${message.text}\\n Post ID: ${postId}\\n Permalink: ${permalink ?? \"(unavailable)\"}\\n Tx: ${txHash}`;\n console.log(chalk.green(` ${label}`));\n }\n }\n\n if (options.json) {\n printJson({ alreadyRecorded: wasAlreadyRecorded, recorded, entries });\n return;\n }\n\n if (recorded > 0) {\n console.log(\n chalk.green(`\\nSuccessfully recorded ${recorded} history entry(ies).`)\n );\n }\n}\n\n/**\n * Register the feed verify-claim subcommand\n */\nexport function registerFeedVerifyClaimCommand(parent: Command): void {\n parent\n .command(\"verify-claim <tx-hash>\")\n .description(\n \"Verify a transaction and add it to history. Recovers post/comment details from on-chain data.\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\n \"--json\",\n \"Output structured JSON (includes permalink and other URLs)\"\n )\n .action(async (txHash, options) => {\n await executeFeedVerifyClaim(txHash, options);\n });\n}\n","import { Command } from \"commander\";\nimport { registerFeedListCommand } from \"./list\";\nimport { registerFeedReadCommand } from \"./read\";\nimport { registerFeedPostCommand } from \"./post\";\nimport { registerFeedCommentWriteCommand } from \"./comment-write\";\nimport { registerFeedCommentReadCommand } from \"./comment-read\";\nimport { registerFeedRegisterCommand } from \"./register\";\nimport { registerFeedRepliesCommand } from \"./replies\";\nimport { registerFeedPostsCommand } from \"./posts\";\nimport { registerFeedConfigCommand } from \"./config\";\nimport { registerFeedHistoryCommand } from \"./history\";\nimport { registerAgentRegisterCommand } from \"./register-agent\";\nimport { registerListAgentsCommand } from \"./list-agents\";\nimport { registerFeedVerifyClaimCommand } from \"./verify-claim\";\n\n/**\n * Register the feed command group with the commander program\n */\nexport function registerFeedCommand(program: Command): void {\n const feedCommand = program\n .command(\"feed\")\n .description(\"Feed operations (read/write posts, comments, manage feeds)\");\n\n registerFeedListCommand(feedCommand);\n registerFeedReadCommand(feedCommand);\n registerFeedPostCommand(feedCommand);\n registerFeedCommentWriteCommand(feedCommand);\n registerFeedCommentReadCommand(feedCommand);\n registerFeedRegisterCommand(feedCommand);\n registerFeedRepliesCommand(feedCommand);\n registerFeedPostsCommand(feedCommand);\n registerFeedConfigCommand(feedCommand);\n registerFeedHistoryCommand(feedCommand);\n registerAgentRegisterCommand(feedCommand);\n registerListAgentsCommand(feedCommand);\n registerFeedVerifyClaimCommand(feedCommand);\n}\n\n// Re-export individual command registrations for botchan wrapper\nexport { registerFeedListCommand } from \"./list\";\nexport { registerFeedReadCommand } from \"./read\";\nexport { registerFeedPostCommand } from \"./post\";\nexport { registerFeedCommentWriteCommand } from \"./comment-write\";\nexport { registerFeedCommentReadCommand } from \"./comment-read\";\nexport { registerFeedRegisterCommand } from \"./register\";\nexport { registerFeedRepliesCommand } from \"./replies\";\nexport { registerFeedPostsCommand } from \"./posts\";\nexport { registerFeedConfigCommand } from \"./config\";\nexport { registerFeedHistoryCommand } from \"./history\";\nexport { registerAgentRegisterCommand } from \"./register-agent\";\nexport { registerListAgentsCommand } from \"./list-agents\";\nexport { registerFeedVerifyClaimCommand } from \"./verify-claim\";\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { createPublicClient, http, parseEther } from \"viem\";\nimport {\n parseReadOnlyOptionsWithDefault,\n parseCommonOptionsWithDefault,\n} from \"../../cli/shared\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n discoverTokenPool,\n getTokenScoreKey,\n encodePoolKey,\n UPVOTE_APP,\n PURE_ALPHA_STRATEGY,\n DYNAMIC_SPLIT_STRATEGY,\n UNIV234_POOLS_STRATEGY,\n UPVOTE_PRICE_ETH,\n} from \"@net-protocol/score\";\nimport type { UpvoteTokenOptions } from \"./types\";\n\nasync function executeUpvoteToken(options: UpvoteTokenOptions): Promise<void> {\n const count = parseInt(options.count, 10);\n if (isNaN(count) || count <= 0) {\n exitWithError(\"Count must be a positive integer\");\n return;\n }\n\n const tokenAddress = options.tokenAddress;\n if (!tokenAddress.startsWith(\"0x\") || tokenAddress.length !== 42) {\n exitWithError(\n \"Invalid token address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n // Read-only options for pool discovery (always needed)\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Create public client for pool discovery\n const rpcUrls = getChainRpcUrls({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n const publicClient = createPublicClient({\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Discovering Uniswap pool for token...\"));\n\n let poolResult;\n try {\n poolResult = await discoverTokenPool({\n publicClient,\n tokenAddress,\n chainId: readOnlyOptions.chainId,\n });\n } catch (error) {\n exitWithError(\n `Failed to discover token pool: ${error instanceof Error ? error.message : String(error)}`\n );\n return;\n }\n\n // Determine strategy\n let strategyAddress: `0x${string}`;\n let storedContext: `0x${string}`;\n\n if (!poolResult || !poolResult.poolKey) {\n // No pool found → pure alpha\n strategyAddress = PURE_ALPHA_STRATEGY.address;\n storedContext = \"0x\";\n console.log(chalk.yellow(\"No pool found — using Pure Alpha strategy\"));\n } else if (options.splitType === \"50/50\") {\n // Pool found + 50/50 override → UNIV234_POOLS_STRATEGY\n strategyAddress = UNIV234_POOLS_STRATEGY.address;\n storedContext = encodePoolKey(poolResult.poolKey);\n console.log(\n chalk.green(\n `Pool found (fee: ${poolResult.fee}) — using 50/50 Pools strategy`\n )\n );\n } else {\n // Pool found + default/dynamic → DYNAMIC_SPLIT_STRATEGY\n strategyAddress = DYNAMIC_SPLIT_STRATEGY.address;\n storedContext = encodePoolKey(poolResult.poolKey);\n console.log(\n chalk.green(\n `Pool found (fee: ${poolResult.fee}) — using Dynamic Split strategy`\n )\n );\n }\n\n // Build transaction config\n const scoreKey = getTokenScoreKey(tokenAddress);\n const value = parseEther((count * UPVOTE_PRICE_ETH).toString());\n\n const txConfig = {\n to: UPVOTE_APP.address,\n abi: UPVOTE_APP.abi,\n functionName: \"upvote\" as const,\n args: [strategyAddress, scoreKey, count, storedContext, \"0x\"],\n value,\n };\n\n if (options.encodeOnly) {\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Execute transaction\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(\n chalk.blue(`Submitting ${count} upvote(s) for ${tokenAddress}...`)\n );\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n\n console.log(chalk.green(`Upvote submitted successfully!`));\n console.log(chalk.white(` Transaction: ${hash}`));\n console.log(chalk.white(` Token: ${tokenAddress}`));\n console.log(chalk.white(` Count: ${count}`));\n console.log(\n chalk.white(` Value: ${(count * UPVOTE_PRICE_ETH).toFixed(6)} ETH`)\n );\n } catch (error) {\n exitWithError(\n `Failed to submit upvote: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerUpvoteTokenCommand(\n parent: Command,\n commandName = \"token\"\n): void {\n parent\n .command(commandName)\n .description(\"Upvote a token on Net Protocol\")\n .requiredOption(\n \"--token-address <address>\",\n \"Token contract address to upvote\"\n )\n .requiredOption(\"--count <n>\", \"Number of upvotes\")\n .option(\n \"--split-type <type>\",\n 'Strategy split type: \"dynamic\" (default) or \"50/50\"'\n )\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeUpvoteToken(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { tokenUrl as buildTokenUrl } from \"../../shared/urls\";\nimport {\n ScoreClient,\n getTokenScoreKey,\n ALL_STRATEGY_ADDRESSES,\n PURE_ALPHA_STRATEGY,\n UNIV234_POOLS_STRATEGY,\n DYNAMIC_SPLIT_STRATEGY,\n} from \"@net-protocol/score\";\nimport type { GetUpvotesOptions } from \"./types\";\n\nfunction getStrategyName(address: string): string {\n const lower = address.toLowerCase();\n if (lower === PURE_ALPHA_STRATEGY.address.toLowerCase()) return \"Pure Alpha\";\n if (lower === UNIV234_POOLS_STRATEGY.address.toLowerCase())\n return \"50/50 Pools\";\n if (lower === DYNAMIC_SPLIT_STRATEGY.address.toLowerCase())\n return \"Dynamic Split\";\n return address;\n}\n\nasync function executeGetUpvotes(options: GetUpvotesOptions): Promise<void> {\n const tokenAddress = options.tokenAddress;\n if (!tokenAddress.startsWith(\"0x\") || tokenAddress.length !== 42) {\n exitWithError(\n \"Invalid token address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new ScoreClient({\n chainId: readOnlyOptions.chainId,\n overrides: readOnlyOptions.rpcUrl\n ? { rpcUrls: [readOnlyOptions.rpcUrl] }\n : undefined,\n });\n\n const scoreKey = getTokenScoreKey(tokenAddress);\n\n try {\n // getUpvotesWithLegacy returns one aggregated count per scoreKey\n // (summing legacy + all specified strategies). To get per-strategy\n // counts, use getStrategyKeyScores for each strategy individually.\n const [totalCounts, ...perStrategyCounts] = await Promise.all([\n client.getUpvotesWithLegacy({\n scoreKeys: [scoreKey],\n strategies: ALL_STRATEGY_ADDRESSES,\n }),\n ...ALL_STRATEGY_ADDRESSES.map((strategy) =>\n client.getStrategyKeyScores({\n strategy,\n scoreKeys: [scoreKey],\n })\n ),\n ]);\n\n const total = totalCounts[0] ?? 0;\n const strategyCounts = ALL_STRATEGY_ADDRESSES.map((addr, i) => ({\n strategy: getStrategyName(addr),\n address: addr,\n count: perStrategyCounts[i]?.[0] ?? 0,\n }));\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n tokenAddress,\n tokenUrl: buildTokenUrl(readOnlyOptions.chainId, tokenAddress),\n scoreKey,\n total,\n strategies: strategyCounts.map((s) => ({\n name: s.strategy,\n address: s.address,\n count: s.count,\n })),\n },\n null,\n 2\n )\n );\n } else {\n console.log(chalk.white(`Upvotes for ${tokenAddress}:`));\n console.log(chalk.cyan(` Total: ${total}`));\n console.log();\n for (const s of strategyCounts) {\n if (s.count > 0) {\n console.log(chalk.white(` ${s.strategy}: ${s.count}`));\n }\n }\n if (total === 0) {\n console.log(chalk.yellow(\" No upvotes found\"));\n }\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch upvotes: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerGetUpvotesCommand(\n parent: Command,\n commandName = \"info\"\n): void {\n parent\n .command(commandName)\n .description(\"Get upvote counts for a token\")\n .requiredOption(\"--token-address <address>\", \"Token contract address\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeGetUpvotes(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { formatEther } from \"viem\";\nimport {\n parseReadOnlyOptionsWithDefault,\n parseCommonOptionsWithDefault,\n} from \"../../cli/shared\";\nimport { createWallet } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport {\n UserUpvoteClient,\n USER_UPVOTE_CONTRACT,\n NULL_ADDRESS,\n calculateUpvoteCost,\n} from \"@net-protocol/score\";\nimport type { UpvoteUserOptions } from \"./types\";\n\nexport async function executeUpvoteUser(\n options: UpvoteUserOptions\n): Promise<void> {\n const count = parseInt(options.count, 10);\n if (isNaN(count) || count <= 0) {\n exitWithError(\"Count must be a positive integer\");\n return;\n }\n\n const userAddress = options.address;\n if (!userAddress.startsWith(\"0x\") || userAddress.length !== 42) {\n exitWithError(\n \"Invalid address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n const token = (options.token ?? NULL_ADDRESS) as `0x${string}`;\n const feeTier = options.feeTier ? parseInt(options.feeTier, 10) : 0;\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new UserUpvoteClient({\n chainId: readOnlyOptions.chainId,\n overrides: readOnlyOptions.rpcUrl\n ? { rpcUrls: [readOnlyOptions.rpcUrl] }\n : undefined,\n });\n\n // Fetch current upvote price from contract\n let upvotePrice: bigint;\n try {\n upvotePrice = await client.getUpvotePrice();\n } catch (error) {\n exitWithError(\n `Failed to fetch upvote price: ${error instanceof Error ? error.message : String(error)}`\n );\n return;\n }\n\n const totalCost = calculateUpvoteCost(count, upvotePrice);\n\n if (options.encodeOnly) {\n const txConfig = {\n to: USER_UPVOTE_CONTRACT.address,\n abi: USER_UPVOTE_CONTRACT.abi,\n functionName: \"upvoteUser\" as const,\n args: [userAddress as `0x${string}`, token, BigInt(count), BigInt(feeTier)],\n value: totalCost,\n };\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(\n chalk.blue(`Submitting ${count} profile upvote(s) for ${userAddress}...`)\n );\n\n try {\n const hash = await client.upvoteUser({\n walletClient,\n userToUpvote: userAddress as `0x${string}`,\n token,\n numUpvotes: count,\n feeTier,\n value: totalCost,\n });\n\n console.log(chalk.green(\"Profile upvote submitted successfully!\"));\n console.log(chalk.white(` Transaction: ${hash}`));\n console.log(chalk.white(` User: ${userAddress}`));\n console.log(chalk.white(` Count: ${count}`));\n console.log(chalk.white(` Value: ${formatEther(totalCost)} ETH`));\n if (token !== NULL_ADDRESS) {\n console.log(chalk.white(` Token: ${token}`));\n }\n } catch (error) {\n exitWithError(\n `Failed to submit profile upvote: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerUpvoteUserCommand(\n parent: Command,\n commandName = \"user\"\n): void {\n parent\n .command(commandName)\n .description(\"Upvote a user's profile on Net Protocol\")\n .requiredOption(\"--address <address>\", \"User address to upvote\")\n .requiredOption(\"--count <n>\", \"Number of upvotes\")\n .option(\"--token <address>\", \"Token address (default: null address)\")\n .option(\"--fee-tier <tier>\", \"Fee tier (default: 0)\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeUpvoteUser(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { formatEther } from \"viem\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { UserUpvoteClient } from \"@net-protocol/score\";\nimport {\n profileUrl as buildProfileUrl,\n walletUrl as buildWalletUrl,\n} from \"../../shared/urls\";\nimport type { GetUserUpvotesOptions } from \"./types\";\n\nexport async function executeGetUserUpvotes(\n options: GetUserUpvotesOptions\n): Promise<void> {\n const userAddress = options.address;\n if (!userAddress.startsWith(\"0x\") || userAddress.length !== 42) {\n exitWithError(\n \"Invalid address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new UserUpvoteClient({\n chainId: readOnlyOptions.chainId,\n overrides: readOnlyOptions.rpcUrl\n ? { rpcUrls: [readOnlyOptions.rpcUrl] }\n : undefined,\n });\n\n try {\n const [given, received, upvotePrice] = await Promise.all([\n client.getUserUpvotesGiven({\n user: userAddress as `0x${string}`,\n }),\n client.getUserUpvotesReceived({\n user: userAddress as `0x${string}`,\n }),\n client.getUpvotePrice(),\n ]);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n address: userAddress,\n chainId: readOnlyOptions.chainId,\n profileUrl: buildProfileUrl(readOnlyOptions.chainId, userAddress),\n walletUrl: buildWalletUrl(readOnlyOptions.chainId, userAddress),\n upvotesGiven: Number(given),\n upvotesReceived: Number(received),\n upvotePriceWei: upvotePrice.toString(),\n upvotePriceEth: formatEther(upvotePrice),\n },\n null,\n 2\n )\n );\n } else {\n console.log(chalk.white(`Profile upvotes for ${userAddress}:`));\n console.log(chalk.cyan(` Upvotes Given: ${given}`));\n console.log(chalk.cyan(` Upvotes Received: ${received}`));\n console.log(\n chalk.white(` Upvote Price: ${formatEther(upvotePrice)} ETH`)\n );\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch user upvotes: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerGetUserUpvotesCommand(\n parent: Command,\n commandName = \"user-info\"\n): void {\n parent\n .command(commandName)\n .description(\"Get profile upvote stats for a user\")\n .requiredOption(\"--address <address>\", \"User address to look up\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeGetUserUpvotes(options);\n });\n}\n","import { Command } from \"commander\";\nimport { registerUpvoteTokenCommand } from \"./upvote-token\";\nimport { registerGetUpvotesCommand } from \"./get-upvotes\";\nimport { registerUpvoteUserCommand } from \"./upvote-user\";\nimport { registerGetUserUpvotesCommand } from \"./get-user-upvotes\";\n\nexport function registerUpvoteCommand(program: Command): void {\n const upvoteCommand = program\n .command(\"upvote\")\n .description(\"Upvote tokens and users on Net Protocol\");\n\n registerUpvoteTokenCommand(upvoteCommand);\n registerGetUpvotesCommand(upvoteCommand);\n registerUpvoteUserCommand(upvoteCommand);\n registerGetUserUpvotesCommand(upvoteCommand);\n}\n\n// Re-exports for botchan\nexport { registerUpvoteTokenCommand } from \"./upvote-token\";\nexport { registerGetUpvotesCommand } from \"./get-upvotes\";\nexport { registerUpvoteUserCommand } from \"./upvote-user\";\nexport { registerGetUserUpvotesCommand } from \"./get-user-upvotes\";\n","/**\n * Shared utilities for agent CLI commands.\n *\n * Two auth modes are supported:\n * - Private key (--private-key or NET_PRIVATE_KEY) — CLI creates session\n * - Pre-existing session token (--session-token or NET_SESSION_TOKEN) —\n * typically obtained via `agent session-encode` + external signer\n * (e.g. Bankr) + `agent session-create`\n */\n\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { privateKeyToAccount, type LocalAccount } from \"viem/accounts\";\nimport { isAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport { createRelaySession } from \"@net-protocol/relay\";\nimport {\n AgentClient,\n NET_API_URL,\n RELAY_ACCESS_KEY,\n type AgentFilters,\n type AgentProfileInput,\n type AgentRunMode,\n} from \"@net-protocol/agents\";\nimport {\n parseCommonOptionsWithDefault,\n parseReadOnlyOptionsWithDefault,\n} from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\n\n// ============================================\n// OPTION INTERFACES\n// ============================================\n\n/** Chain/API options shared by every agent command. */\nexport interface AgentCommonOptions {\n chainId?: number;\n rpcUrl?: string;\n apiUrl?: string;\n}\n\n/** Options for read-only commands that only need a wallet address. */\nexport interface AgentReadOnlyOptions extends AgentCommonOptions {\n operator?: string;\n}\n\n/** Options shared by all agent write commands (CRUD, run, DM). */\nexport interface AgentAuthOptions extends AgentCommonOptions {\n privateKey?: string;\n sessionToken?: string;\n operator?: string;\n}\n\n/** Options for commands that accept filter flags (create, update). */\nexport interface AgentFilterOptions {\n includeFeed?: string[];\n excludeFeed?: string[];\n preferredFeed?: string[];\n chatTopic?: string[];\n}\n\n/** Options for commands that accept profile flags (create, update). */\nexport interface AgentProfileOptions {\n displayName?: string;\n bio?: string;\n}\n\nexport interface AuthResolution {\n client: AgentClient;\n sessionToken: string;\n /** Only set on the --private-key path; session-token callers don't expose it. */\n account?: LocalAccount;\n operatorAddress: Address;\n chainId: number;\n apiUrl: string;\n}\n\n// ============================================\n// CONSTANTS\n// ============================================\n\nexport const VALID_RUN_MODES = [\"auto\", \"feeds\", \"chats\"] as const;\n\n// ============================================\n// COMMAND OPTION HELPERS\n// ============================================\n\n/**\n * Attach the standard auth + common options to a write command.\n * Every write command (create, update, run, etc.) needs the same set.\n */\nexport function addAuthOptions(cmd: Command): Command {\n return addCommonOptions(cmd)\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--session-token <token>\",\n \"Pre-existing session token (alternative to --private-key)\",\n )\n .option(\n \"--operator <address>\",\n \"Operator address (required with --session-token)\",\n );\n}\n\n/** Attach chain/API options (no auth). Used by read-only commands. */\nexport function addCommonOptions(cmd: Command): Command {\n return cmd\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\", (v) => parseInt(v, 10))\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--api-url <url>\", \"Net Protocol API URL\");\n}\n\n/**\n * Attach filter options (create and update both accept these).\n */\nexport function addFilterOptions(cmd: Command): Command {\n return cmd\n .option(\"--include-feed <pattern...>\", \"Only engage with matching feeds\")\n .option(\"--exclude-feed <pattern...>\", \"Never engage with matching feeds\")\n .option(\"--preferred-feed <pattern...>\", \"Prioritize matching feeds\")\n .option(\"--chat-topic <topic...>\", \"Chat topics to participate in\");\n}\n\n/** Attach display-name / bio options (create and update both accept these). */\nexport function addProfileOptions(cmd: Command): Command {\n return cmd\n .option(\"--display-name <name>\", \"Agent display name\")\n .option(\"--bio <text>\", \"Agent bio\");\n}\n\n// ============================================\n// INPUT BUILDERS\n// ============================================\n\n/** Build an AgentFilters object from CLI options, or undefined when no flags are set. */\nexport function buildFilters(options: AgentFilterOptions): AgentFilters | undefined {\n const filters: AgentFilters = {};\n if (options.includeFeed?.length) filters.includeFeedPatterns = options.includeFeed;\n if (options.excludeFeed?.length) filters.excludeFeedPatterns = options.excludeFeed;\n if (options.preferredFeed?.length) filters.preferredFeedPatterns = options.preferredFeed;\n if (options.chatTopic?.length) filters.preferredChatTopics = options.chatTopic;\n return Object.keys(filters).length > 0 ? filters : undefined;\n}\n\n/** Build an AgentProfileInput from CLI options, or undefined when no flags are set. */\nexport function buildProfile(options: AgentProfileOptions): AgentProfileInput | undefined {\n const profile: AgentProfileInput = {};\n if (options.displayName) profile.displayName = options.displayName;\n if (options.bio) profile.bio = options.bio;\n return Object.keys(profile).length > 0 ? profile : undefined;\n}\n\n/** Parse and validate a run-mode flag. Exits the process on invalid input. */\nexport function parseRunMode(raw: string | undefined): AgentRunMode {\n const mode = (raw ?? \"auto\") as AgentRunMode;\n if (!VALID_RUN_MODES.includes(mode as (typeof VALID_RUN_MODES)[number])) {\n exitWithError(`Invalid mode \"${mode}\". Must be one of: ${VALID_RUN_MODES.join(\", \")}`);\n }\n return mode;\n}\n\n// ============================================\n// AUTH RESOLUTION\n// ============================================\n\n/** Resolve chain ID, API URL, and validate operator for a read-only command. */\nexport function resolveReadOnly(options: AgentReadOnlyOptions): {\n chainId: number;\n apiUrl: string;\n operator?: Address;\n} {\n const readOnly = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const apiUrl = options.apiUrl || process.env.NET_API_URL || NET_API_URL;\n\n let operator: Address | undefined;\n if (options.operator) {\n if (!isAddress(options.operator)) {\n exitWithError(`Invalid operator address: ${options.operator}`);\n }\n operator = options.operator as Address;\n }\n\n return { chainId: readOnly.chainId, apiUrl, operator };\n}\n\n/**\n * Resolve auth for a write command using either --private-key or --session-token.\n */\nexport async function resolveAuth(options: AgentAuthOptions): Promise<AuthResolution> {\n const sessionToken = options.sessionToken || process.env.NET_SESSION_TOKEN;\n const privateKey =\n options.privateKey || process.env.NET_PRIVATE_KEY || process.env.PRIVATE_KEY;\n\n if (sessionToken && options.privateKey) {\n exitWithError(\"Cannot use both --session-token and --private-key. Pick one.\");\n }\n\n const apiUrl = options.apiUrl || process.env.NET_API_URL || NET_API_URL;\n\n if (sessionToken) {\n if (!options.operator) {\n exitWithError(\n \"--operator <address> is required when using --session-token. \" +\n \"It must match the address that signed the session.\",\n );\n }\n if (!isAddress(options.operator!)) {\n exitWithError(`Invalid operator address: ${options.operator}`);\n }\n\n const readOnly = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const client = new AgentClient({ apiUrl, chainId: readOnly.chainId });\n\n return {\n client,\n sessionToken,\n operatorAddress: options.operator as Address,\n chainId: readOnly.chainId,\n apiUrl,\n };\n }\n\n if (!privateKey) {\n exitWithError(\n \"No auth provided. Use one of:\\n\" +\n \" --private-key <key> (or NET_PRIVATE_KEY env var)\\n\" +\n \" --session-token <token> + --operator <address> (for Bankr or other external signers)\",\n );\n }\n\n // Pass the original CLI flag value (not the env-resolved key) so the\n // \"Private key provided via command line\" warning inside\n // parseCommonOptionsWithDefault only fires when --private-key was actually\n // used. parseCommonOptionsWithDefault re-resolves env vars internally.\n const commonOptions = parseCommonOptionsWithDefault({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n // Route status to stderr so --json consumers reading stdout get clean JSON.\n console.error(chalk.blue(\"Creating session...\"));\n const { sessionToken: token } = await createRelaySession({\n apiUrl,\n chainId: commonOptions.chainId,\n operatorAddress: account.address,\n secretKey: RELAY_ACCESS_KEY,\n account,\n });\n\n const client = new AgentClient({ apiUrl, chainId: commonOptions.chainId });\n\n return {\n client,\n sessionToken: token,\n account,\n operatorAddress: account.address,\n chainId: commonOptions.chainId,\n apiUrl,\n };\n}\n\n// ============================================\n// OUTPUT HELPERS\n// ============================================\n\n/** JSON.stringify replacer converting bigints to decimal strings. */\nexport function bigintReplacer(_key: string, value: unknown): unknown {\n return typeof value === \"bigint\" ? value.toString() : value;\n}\n\n/** JSON.stringify wrapper that handles bigints. */\nexport function jsonStringify(obj: unknown, indent = 2): string {\n return JSON.stringify(obj, bigintReplacer, indent);\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n addAuthOptions,\n addFilterOptions,\n addProfileOptions,\n buildFilters,\n buildProfile,\n jsonStringify,\n resolveAuth,\n type AgentAuthOptions,\n type AgentFilterOptions,\n type AgentProfileOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateAgentInput } from \"@net-protocol/agents\";\n\ninterface CreateOptions extends AgentAuthOptions, AgentFilterOptions, AgentProfileOptions {\n systemPrompt: string;\n schedule?: number;\n json?: boolean;\n}\n\nasync function executeCreate(name: string, options: CreateOptions): Promise<void> {\n try {\n const auth = await resolveAuth(options);\n\n const config: CreateAgentInput = {\n name,\n systemPrompt: options.systemPrompt,\n };\n if (options.schedule) config.runIntervalMinutes = options.schedule;\n const filters = buildFilters(options);\n if (filters) config.filters = filters;\n\n const profile = buildProfile(options);\n\n if (!options.json) {\n console.log(chalk.blue(`Creating agent \"${name}\"...`));\n }\n const result = await auth.client.createAgent({\n sessionToken: auth.sessionToken,\n config,\n profile,\n });\n\n if (options.json) {\n console.log(jsonStringify(result));\n if (!result.success) process.exit(1);\n return;\n }\n\n if (!result.success) {\n exitWithError(result.error || \"Failed to create agent\");\n }\n\n console.log(chalk.green(\"Agent created successfully!\"));\n console.log(` Agent ID: ${result.agentId}`);\n console.log(` Wallet: ${result.agentWalletAddress}`);\n if (result.scheduleError) {\n // The on-chain follow-up (profile metadata write) commonly reverts\n // because the new agent's wallet starts with 0 ETH for gas. Detect\n // that specific case and prepend an actionable hint, but keep the\n // full underlying error visible so other reverts remain debuggable.\n const isGasOut = /gas required exceeds allowance \\(0\\)/i.test(\n result.scheduleError,\n );\n if (isGasOut) {\n console.log(\n chalk.yellow(\n ` Profile metadata write failed: the agent's wallet ` +\n `(${result.agentWalletAddress}) has 0 ETH for gas. It will ` +\n `be auto-funded on first \\`agent run\\`, or you can transfer ` +\n `a small amount of ETH to the wallet manually.`,\n ),\n );\n console.log(chalk.gray(` Underlying revert:`));\n } else {\n console.log(chalk.yellow(` On-chain follow-up failed:`));\n }\n console.log(\n chalk.gray(` ${result.scheduleError.replace(/\\n/g, \"\\n \")}`),\n );\n }\n } catch (error) {\n exitWithError(\n `Failed to create agent: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentCreateCommand(parent: Command): void {\n const cmd = parent\n .command(\"create <name>\")\n .description(\"Create a new onchain agent\")\n .requiredOption(\"--system-prompt <prompt>\", \"Agent system prompt (personality)\")\n .option(\"--schedule <minutes>\", \"Auto-run interval in minutes\", (v) => parseInt(v, 10))\n .option(\"--json\", \"Output as JSON\");\n addAuthOptions(cmd);\n addFilterOptions(cmd);\n addProfileOptions(cmd);\n cmd.action(async (name, options) => {\n await executeCreate(name, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n addAuthOptions,\n jsonStringify,\n resolveAuth,\n type AgentAuthOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\n\ninterface ListOptions extends AgentAuthOptions {\n json?: boolean;\n showHidden?: boolean;\n}\n\nasync function executeList(options: ListOptions): Promise<void> {\n try {\n const auth = await resolveAuth(options);\n const result = await auth.client.listAgents({ sessionToken: auth.sessionToken });\n\n if (!result.success) {\n exitWithError(result.error || \"Failed to list agents\");\n }\n\n const agents = result.agents || [];\n const visible = options.showHidden ? agents : agents.filter((a) => !a.config.hidden);\n\n if (options.json) {\n console.log(jsonStringify(visible));\n return;\n }\n\n if (visible.length === 0) {\n console.log(chalk.yellow(\"No agents found.\"));\n return;\n }\n\n console.log(chalk.bold(`Agents (${visible.length}):\\n`));\n\n for (const agent of visible) {\n const { config, walletAddress } = agent;\n const schedule = config.runIntervalMinutes\n ? `every ${config.runIntervalMinutes}m`\n : \"manual\";\n const hidden = config.hidden ? chalk.gray(\" [hidden]\") : \"\";\n const promptPreview =\n config.systemPrompt.length > 80\n ? `${config.systemPrompt.slice(0, 80)}...`\n : config.systemPrompt;\n\n console.log(` ${chalk.cyan(config.name)}${hidden}`);\n console.log(` ID: ${config.id}`);\n console.log(` Wallet: ${walletAddress}`);\n console.log(` Schedule: ${schedule}`);\n console.log(` Prompt: ${promptPreview}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to list agents: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentListCommand(parent: Command): void {\n const cmd = parent\n .command(\"list\")\n .description(\"List your onchain agents\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--show-hidden\", \"Include hidden agents\");\n addAuthOptions(cmd);\n cmd.action(async (options) => {\n await executeList(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n addAuthOptions,\n addFilterOptions,\n addProfileOptions,\n buildFilters,\n buildProfile,\n jsonStringify,\n resolveAuth,\n type AgentAuthOptions,\n type AgentFilterOptions,\n type AgentProfileOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { UpdateAgentInput } from \"@net-protocol/agents\";\n\ninterface UpdateOptions extends AgentAuthOptions, AgentFilterOptions, AgentProfileOptions {\n name?: string;\n systemPrompt?: string;\n schedule?: number;\n disableSchedule?: boolean;\n json?: boolean;\n}\n\nasync function executeUpdate(agentId: string, options: UpdateOptions): Promise<void> {\n try {\n const auth = await resolveAuth(options);\n\n const config: UpdateAgentInput = {};\n let hasConfigChanges = false;\n\n if (options.name) {\n config.name = options.name;\n hasConfigChanges = true;\n }\n if (options.systemPrompt) {\n config.systemPrompt = options.systemPrompt;\n hasConfigChanges = true;\n }\n if (options.schedule) {\n config.runIntervalMinutes = options.schedule;\n hasConfigChanges = true;\n }\n if (options.disableSchedule) {\n config.runIntervalMinutes = 0;\n hasConfigChanges = true;\n }\n\n const filters = buildFilters(options);\n if (filters) {\n config.filters = filters;\n hasConfigChanges = true;\n }\n\n const profile = buildProfile(options);\n\n if (!hasConfigChanges && !profile) {\n exitWithError(\n \"No changes specified. Use --name, --system-prompt, --schedule, --display-name, --bio, or filter options.\",\n );\n }\n\n if (!options.json) {\n console.log(chalk.blue(`Updating agent ${agentId}...`));\n }\n const result = await auth.client.updateAgent({\n sessionToken: auth.sessionToken,\n agentId,\n config: hasConfigChanges ? config : undefined,\n profile,\n });\n\n if (options.json) {\n console.log(jsonStringify(result));\n if (!result.success) process.exit(1);\n return;\n }\n\n if (!result.success) {\n exitWithError(result.error || \"Failed to update agent\");\n }\n\n console.log(chalk.green(\"Agent updated successfully!\"));\n if (result.profileError) {\n console.log(chalk.yellow(` Profile warning: ${result.profileError}`));\n }\n } catch (error) {\n exitWithError(\n `Failed to update agent: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentUpdateCommand(parent: Command): void {\n const cmd = parent\n .command(\"update <agentId>\")\n .description(\"Update an existing agent\")\n .option(\"--name <name>\", \"New agent name\")\n .option(\"--system-prompt <prompt>\", \"New system prompt\")\n .option(\"--schedule <minutes>\", \"Auto-run interval in minutes\", (v) => parseInt(v, 10))\n .option(\"--disable-schedule\", \"Disable automatic scheduling\")\n .option(\"--json\", \"Output as JSON\");\n addAuthOptions(cmd);\n addFilterOptions(cmd);\n addProfileOptions(cmd);\n cmd.action(async (agentId, options) => {\n await executeUpdate(agentId, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { addAuthOptions, resolveAuth, type AgentAuthOptions } from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\n\nasync function executeToggleHidden(\n agentId: string,\n options: AgentAuthOptions,\n hide: boolean,\n): Promise<void> {\n const verb = hide ? \"Hiding\" : \"Unhiding\";\n const past = hide ? \"hidden\" : \"unhidden\";\n try {\n const auth = await resolveAuth(options);\n console.error(chalk.blue(`${verb} agent ${agentId}...`));\n const result = hide\n ? await auth.client.hideAgent(auth.sessionToken, agentId)\n : await auth.client.unhideAgent(auth.sessionToken, agentId);\n\n if (!result.success) {\n exitWithError(result.error || `Failed to ${hide ? \"hide\" : \"unhide\"} agent`);\n }\n console.log(chalk.green(`Agent ${past} successfully.`));\n } catch (error) {\n exitWithError(\n `Failed to ${hide ? \"hide\" : \"unhide\"} agent: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentHideCommand(parent: Command): void {\n const cmd = parent.command(\"hide <agentId>\").description(\"Hide an agent (soft-delete)\");\n addAuthOptions(cmd).action(async (agentId, options) => {\n await executeToggleHidden(agentId, options, true);\n });\n}\n\nexport function registerAgentUnhideCommand(parent: Command): void {\n const cmd = parent\n .command(\"unhide <agentId>\")\n .description(\"Unhide a previously hidden agent\");\n addAuthOptions(cmd).action(async (agentId, options) => {\n await executeToggleHidden(agentId, options, false);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n addAuthOptions,\n jsonStringify,\n parseRunMode,\n resolveAuth,\n type AgentAuthOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\n\ninterface RunOptions extends AgentAuthOptions {\n mode?: string;\n json?: boolean;\n}\n\nasync function executeRun(agentId: string, options: RunOptions): Promise<void> {\n try {\n const auth = await resolveAuth(options);\n const mode = parseRunMode(options.mode);\n\n if (!options.json) {\n console.log(chalk.blue(`Running agent ${agentId} (mode: ${mode})...`));\n }\n const result = await auth.client.runAgent({\n sessionToken: auth.sessionToken,\n agentId,\n mode,\n });\n\n if (options.json) {\n console.log(jsonStringify(result));\n if (!result.success) process.exit(1);\n return;\n }\n\n if (!result.success) {\n exitWithError(result.error || \"Agent run failed\");\n }\n\n console.log(chalk.green(`Agent run complete: ${result.action}`));\n\n if (result.summary) {\n console.log(` Summary: ${result.summary}`);\n }\n\n if (result.actions.length > 0) {\n console.log(\" Actions:\");\n for (const action of result.actions) {\n const textPreview =\n action.text.length > 60 ? `${action.text.slice(0, 60)}...` : action.text;\n console.log(` - ${action.type} in ${action.topic}: \"${textPreview}\"`);\n console.log(` tx: ${action.transactionHash}`);\n }\n }\n\n if (result.autoFunded) {\n console.log(\n chalk.blue(\n ` Auto-funded: $${result.autoFunded.amountUsd.toFixed(4)} (${result.autoFunded.amountEth} ETH)`,\n ),\n );\n }\n\n if (result.agentBalanceUsd !== undefined) {\n console.log(` Agent balance: $${result.agentBalanceUsd.toFixed(4)}`);\n }\n if (result.mainBalanceUsd !== undefined) {\n console.log(` Credits balance: $${result.mainBalanceUsd.toFixed(4)}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to run agent: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentRunCommand(parent: Command): void {\n const cmd = parent\n .command(\"run <agentId>\")\n .description(\"Execute one agent cycle\")\n .option(\"--mode <mode>\", \"Run mode: auto, feeds, or chats (default: auto)\")\n .option(\"--json\", \"Output as JSON\");\n addAuthOptions(cmd).action(async (agentId, options) => {\n await executeRun(agentId, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n addAuthOptions,\n jsonStringify,\n resolveAuth,\n type AgentAuthOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\n\ninterface InfoOptions extends AgentAuthOptions {\n json?: boolean;\n}\n\nasync function executeInfo(agentId: string, options: InfoOptions): Promise<void> {\n try {\n const auth = await resolveAuth(options);\n const agent = await auth.client.getAgent(auth.sessionToken, agentId);\n\n if (!agent) {\n exitWithError(`Agent not found: ${agentId}`);\n return;\n }\n\n if (options.json) {\n console.log(jsonStringify(agent));\n return;\n }\n\n const { config, walletAddress } = agent;\n const schedule = config.runIntervalMinutes\n ? `every ${config.runIntervalMinutes} minutes`\n : \"manual only\";\n\n console.log(\n chalk.bold(config.name) + (config.hidden ? chalk.gray(\" [hidden]\") : \"\"),\n );\n console.log();\n console.log(` ID: ${config.id}`);\n console.log(` Wallet: ${walletAddress}`);\n console.log(` Owner: ${config.ownerAddress}`);\n console.log(` Schedule: ${schedule}`);\n console.log(` Created: ${new Date(config.createdAt).toLocaleString()}`);\n console.log(` Updated: ${new Date(config.updatedAt).toLocaleString()}`);\n console.log();\n console.log(\" System Prompt:\");\n console.log(` ${config.systemPrompt}`);\n\n if (config.filters) {\n console.log();\n console.log(\" Filters:\");\n if (config.filters.includeFeedPatterns?.length) {\n console.log(` Include feeds: ${config.filters.includeFeedPatterns.join(\", \")}`);\n }\n if (config.filters.excludeFeedPatterns?.length) {\n console.log(` Exclude feeds: ${config.filters.excludeFeedPatterns.join(\", \")}`);\n }\n if (config.filters.preferredFeedPatterns?.length) {\n console.log(\n ` Preferred feeds: ${config.filters.preferredFeedPatterns.join(\", \")}`,\n );\n }\n if (config.filters.preferredChatTopics?.length) {\n console.log(` Chat topics: ${config.filters.preferredChatTopics.join(\", \")}`);\n }\n }\n } catch (error) {\n exitWithError(\n `Failed to get agent info: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentInfoCommand(parent: Command): void {\n const cmd = parent\n .command(\"info <agentId>\")\n .description(\"Show detailed agent information\")\n .option(\"--json\", \"Output as JSON\");\n addAuthOptions(cmd).action(async (agentId, options) => {\n await executeInfo(agentId, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { isAddress } from \"viem\";\nimport {\n addAuthOptions,\n addCommonOptions,\n jsonStringify,\n resolveAuth,\n resolveReadOnly,\n type AgentAuthOptions,\n type AgentReadOnlyOptions,\n} from \"./shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport {\n AgentClient,\n buildConversationAuthTypedData,\n generateAgentChatTopic,\n isAgentChatTopic,\n parseAgentAddressFromTopic,\n} from \"@net-protocol/agents\";\n\ninterface DmOptions extends AgentAuthOptions {\n topic?: string;\n topicSignature?: string;\n json?: boolean;\n}\n\ninterface DmListOptions extends AgentReadOnlyOptions {\n json?: boolean;\n limit?: number;\n}\n\ninterface DmHistoryOptions extends AgentReadOnlyOptions {\n json?: boolean;\n limit?: number;\n}\n\ninterface DmAuthEncodeOptions {\n topic?: string;\n agentAddress?: string;\n chainId?: number;\n}\n\n// ============================================================\n// dm (send)\n// ============================================================\n\nasync function executeDm(\n agentAddress: string,\n message: string,\n options: DmOptions,\n): Promise<void> {\n try {\n if (!isAddress(agentAddress)) {\n exitWithError(`Invalid agent address: ${agentAddress}`);\n }\n if (options.topicSignature && !options.topic) {\n exitWithError(\n \"--topic-signature requires --topic (the topic the signature authorizes)\",\n );\n }\n\n // Session-token callers can't sign topics locally, so they must bring\n // --topic and --topic-signature. Catch up-front with actionable guidance\n // rather than falling through to a generic signer-required error.\n const usingSessionToken = !!(\n options.sessionToken || process.env.NET_SESSION_TOKEN\n );\n if (usingSessionToken && (!options.topic || !options.topicSignature)) {\n exitWithError(\n \"When using --session-token, you must also provide --topic and --topic-signature.\\n\" +\n \" Obtain the signature with:\\n\" +\n \" netp agent dm-auth-encode --agent-address <addr> → produces { typedData, topic }\\n\" +\n \" [sign .typedData with your external signer, e.g. Bankr /agent/sign]\\n\" +\n \" Then:\\n\" +\n \" netp agent dm <addr> <message> --session-token <token> --operator <addr> \\\\\\n\" +\n \" --topic <topic> --topic-signature <sig>\",\n );\n }\n\n const auth = await resolveAuth(options);\n const topic = options.topic ?? generateAgentChatTopic(agentAddress as Address);\n const isNewConversation = !options.topic;\n\n if (!options.json) {\n console.log(\n chalk.blue(\n isNewConversation\n ? `Starting new conversation with ${agentAddress}...`\n : `Continuing conversation ${topic}...`,\n ),\n );\n }\n\n const result = await auth.client.sendMessage(\n {\n sessionToken: auth.sessionToken,\n agentAddress: agentAddress as Address,\n topic,\n message,\n userSignature: options.topicSignature as Hex | undefined,\n },\n auth.account,\n );\n\n if (options.json) {\n console.log(jsonStringify(result));\n if (!result.success) process.exit(1);\n return;\n }\n\n if (!result.success) {\n // Surface the underlying error directly. The \"Failed to send DM:\"\n // prefix would just add noise around an already-clear message like\n // \"Insufficient Net credits ($X). Add at least $Y...\".\n exitWithError(result.error || \"Failed to send DM\");\n }\n\n console.log();\n console.log(chalk.cyan(\"You: \") + message);\n console.log(chalk.green(\"Agent: \") + result.aiMessage);\n console.log();\n console.log(chalk.gray(` Topic: ${result.topic}`));\n console.log(chalk.gray(` TX: ${result.transactionHash}`));\n if (isNewConversation) {\n console.log(\n chalk.gray(` (Use --topic ${result.topic} to continue this conversation)`),\n );\n }\n } catch (error) {\n exitWithError(\n `Failed to send DM: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentDmCommand(parent: Command): void {\n const cmd = parent\n .command(\"dm <agentAddress> <message>\")\n .description(\"Send a DM to an onchain agent\")\n .option(\"--topic <topic>\", \"Continue an existing conversation\")\n .option(\n \"--topic-signature <hex>\",\n \"Pre-signed ConversationAuth signature (requires --topic). \" +\n \"Obtain via `agent dm-auth-encode` + external signer.\",\n )\n .option(\"--json\", \"Output as JSON\");\n addAuthOptions(cmd).action(async (agentAddress, message, options) => {\n await executeDm(agentAddress, message, options);\n });\n}\n\n// ============================================================\n// dm-list\n// ============================================================\n\nasync function executeDmList(options: DmListOptions): Promise<void> {\n try {\n const { chainId, apiUrl, operator } = resolveReadOnly(options);\n if (!operator) {\n exitWithError(\n \"--operator <address> is required (user wallet address to list conversations for)\",\n );\n }\n\n const client = new AgentClient({ apiUrl, chainId });\n if (!options.json) {\n console.log(chalk.blue(\"Loading conversations...\"));\n }\n const conversations = await client.listConversations(operator!, {\n limit: options.limit,\n });\n const agentConversations = conversations.filter((c) => isAgentChatTopic(c.topic));\n\n if (options.json) {\n console.log(jsonStringify(agentConversations));\n return;\n }\n\n if (agentConversations.length === 0) {\n console.log(chalk.yellow(\"No agent conversations found.\"));\n return;\n }\n\n console.log(chalk.bold(`Agent Conversations (${agentConversations.length}):\\n`));\n\n for (const conv of agentConversations) {\n const agentAddr = parseAgentAddressFromTopic(conv.topic);\n const encrypted = conv.isEncrypted ? chalk.yellow(\" [encrypted]\") : \"\";\n const date = new Date(conv.lastMessageTimestamp * 1000).toLocaleString();\n const preview = conv.lastMessage\n ? conv.lastMessage.length > 60\n ? `${conv.lastMessage.slice(0, 60)}...`\n : conv.lastMessage\n : null;\n\n console.log(` ${chalk.cyan(agentAddr || \"unknown\")}${encrypted}`);\n console.log(` Topic: ${conv.topic}`);\n console.log(` Messages: ${conv.messageCount}`);\n console.log(` Last: ${date}`);\n if (preview) console.log(` Preview: ${preview}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to list conversations: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentDmListCommand(parent: Command): void {\n const cmd = parent\n .command(\"dm-list\")\n .description(\"List your DM conversations with agents (pure chain read)\")\n .requiredOption(\"--operator <address>\", \"User wallet address\")\n .option(\"--limit <n>\", \"Max conversations to fetch\", (v) => parseInt(v, 10))\n .option(\"--json\", \"Output as JSON\");\n addCommonOptions(cmd).action(async (options) => {\n await executeDmList(options);\n });\n}\n\n// ============================================================\n// dm-history\n// ============================================================\n\nasync function executeDmHistory(topic: string, options: DmHistoryOptions): Promise<void> {\n try {\n const { chainId, apiUrl, operator } = resolveReadOnly(options);\n if (!operator) {\n exitWithError(\n \"--operator <address> is required (user wallet address for this conversation)\",\n );\n }\n\n const client = new AgentClient({ apiUrl, chainId });\n if (!options.json) {\n console.log(chalk.blue(\"Loading conversation history...\"));\n }\n const messages = await client.getConversationHistory(operator!, topic, {\n limit: options.limit,\n });\n\n if (options.json) {\n console.log(jsonStringify(messages));\n return;\n }\n\n if (messages.length === 0) {\n console.log(chalk.yellow(\"No messages found.\"));\n return;\n }\n\n const agentAddr = parseAgentAddressFromTopic(topic);\n console.log(\n chalk.bold(\n `Conversation with ${agentAddr || topic} (${messages.length} messages):\\n`,\n ),\n );\n\n for (const msg of messages) {\n const date = new Date(msg.timestamp * 1000).toLocaleString();\n const prefix = msg.sender === \"user\" ? chalk.cyan(\"You\") : chalk.green(\"Agent\");\n const encrypted = msg.encrypted ? chalk.yellow(\" [encrypted]\") : \"\";\n console.log(` ${prefix}${encrypted} (${chalk.gray(date)}):`);\n console.log(` ${msg.text}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to load history: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentDmHistoryCommand(parent: Command): void {\n const cmd = parent\n .command(\"dm-history <topic>\")\n .description(\"Read DM conversation history (pure chain read)\")\n .requiredOption(\n \"--operator <address>\",\n \"User wallet address for this conversation\",\n )\n .option(\"--limit <n>\", \"Max recent messages to fetch\", (v) => parseInt(v, 10))\n .option(\"--json\", \"Output as JSON\");\n addCommonOptions(cmd).action(async (topic, options) => {\n await executeDmHistory(topic, options);\n });\n}\n\n// ============================================================\n// dm-auth-encode\n// ============================================================\n\nasync function executeDmAuthEncode(options: DmAuthEncodeOptions): Promise<void> {\n try {\n const { chainId } = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n });\n\n let topic = options.topic;\n if (!topic) {\n if (!options.agentAddress) {\n exitWithError(\n \"Must provide either --topic or --agent-address to generate a topic\",\n );\n }\n if (!isAddress(options.agentAddress!)) {\n exitWithError(`Invalid agent address: ${options.agentAddress}`);\n }\n topic = generateAgentChatTopic(options.agentAddress! as Address);\n }\n\n const result = buildConversationAuthTypedData({ topic, chainId });\n console.log(jsonStringify(result));\n } catch (error) {\n exitWithError(\n `dm-auth-encode failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentDmAuthEncodeCommand(parent: Command): void {\n parent\n .command(\"dm-auth-encode\")\n .description(\n \"Emit { typedData, topic } for external signing. \" +\n \"Pipe .typedData to your signer, pass .topic + the resulting \" +\n \"signature to `agent dm --topic ... --topic-signature ...`.\",\n )\n .option(\n \"--topic <topic>\",\n \"Existing topic to authorize (e.g. agent-chat-0x...-nanoid). \" +\n \"If omitted, a new topic is generated from --agent-address.\",\n )\n .option(\n \"--agent-address <address>\",\n \"Agent address — used to generate a new topic when --topic is omitted\",\n )\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\", (v) => parseInt(v, 10))\n .action(async (options) => {\n await executeDmAuthEncode(options);\n });\n}\n","/**\n * Session management commands for the external-signer flow (e.g. Bankr).\n *\n * The private-key flow creates sessions transparently via resolveAuth.\n * These commands expose the two-step flow so external signers can plug in:\n *\n * 1. `session-encode --operator 0x...` → { typedData, expiresAt }\n * 2. sign typedData externally (Bankr /agent/sign)\n * 3. `session-create --signature 0x... --expires-at N` → { sessionToken }\n */\n\nimport { Command } from \"commander\";\nimport { isAddress, type Hex } from \"viem\";\nimport {\n buildSessionTypedData,\n exchangeSessionSignature,\n NET_API_URL,\n} from \"@net-protocol/agents\";\nimport { exitWithError } from \"../../shared/output\";\nimport { jsonStringify } from \"./shared\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\n\ninterface SessionEncodeOptions {\n operator: string;\n chainId?: number;\n expiresIn?: number;\n}\n\ninterface SessionCreateOptions {\n operator: string;\n signature: string;\n expiresAt: number;\n chainId?: number;\n apiUrl?: string;\n}\n\nasync function executeSessionEncode(options: SessionEncodeOptions): Promise<void> {\n try {\n if (!isAddress(options.operator)) {\n exitWithError(`Invalid operator address: ${options.operator}`);\n }\n\n const { chainId } = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n });\n\n const result = buildSessionTypedData({\n operatorAddress: options.operator as `0x${string}`,\n chainId,\n expiresIn: options.expiresIn,\n });\n\n console.log(jsonStringify(result));\n } catch (error) {\n exitWithError(\n `session-encode failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentSessionEncodeCommand(parent: Command): void {\n parent\n .command(\"session-encode\")\n .description(\n \"Emit { typedData, expiresAt } for external signing (e.g., Bankr). \" +\n \"Pipe .typedData to your signer, pass .expiresAt + the resulting \" +\n \"signature to `agent session-create`.\",\n )\n .requiredOption(\n \"--operator <address>\",\n \"Address that will sign the session (must match signer)\",\n )\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\", (v) => parseInt(v, 10))\n .option(\n \"--expires-in <seconds>\",\n \"Session lifetime in seconds (default: 3600, max: 86400)\",\n (v) => parseInt(v, 10),\n )\n .action(async (options) => {\n await executeSessionEncode(options);\n });\n}\n\nasync function executeSessionCreate(options: SessionCreateOptions): Promise<void> {\n try {\n if (!isAddress(options.operator)) {\n exitWithError(`Invalid operator address: ${options.operator}`);\n }\n if (!options.signature.startsWith(\"0x\")) {\n exitWithError(\"--signature must be a 0x-prefixed hex string\");\n }\n if (!options.expiresAt || !Number.isFinite(options.expiresAt)) {\n exitWithError(\"--expires-at must be a unix timestamp (seconds)\");\n }\n\n const { chainId } = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n });\n const apiUrl = options.apiUrl || process.env.NET_API_URL || NET_API_URL;\n\n const result = await exchangeSessionSignature({\n apiUrl,\n chainId,\n operatorAddress: options.operator as `0x${string}`,\n signature: options.signature as Hex,\n expiresAt: options.expiresAt,\n });\n\n console.log(jsonStringify(result));\n } catch (error) {\n exitWithError(\n `session-create failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport function registerAgentSessionCreateCommand(parent: Command): void {\n parent\n .command(\"session-create\")\n .description(\n \"Exchange an externally-produced signature for a session token. \" +\n \"Pair with `agent session-encode`.\",\n )\n .requiredOption(\n \"--operator <address>\",\n \"Address that produced the signature (must match the ecrecover result)\",\n )\n .requiredOption(\"--signature <hex>\", \"EIP-712 signature over the session typed data\")\n .requiredOption(\n \"--expires-at <timestamp>\",\n \"expiresAt value from session-encode (unix seconds)\",\n (v) => parseInt(v, 10),\n )\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\", (v) => parseInt(v, 10))\n .option(\"--api-url <url>\", \"Net Protocol API URL\")\n .option(\n \"--json\",\n \"Output as JSON (default behavior; included for consistency with peer commands)\",\n )\n .action(async (options) => {\n await executeSessionCreate(options);\n });\n}\n","import { Command } from \"commander\";\nimport { registerAgentCreateCommand } from \"./create\";\nimport { registerAgentListCommand } from \"./list\";\nimport { registerAgentUpdateCommand } from \"./update\";\nimport { registerAgentHideCommand, registerAgentUnhideCommand } from \"./hide\";\nimport { registerAgentRunCommand } from \"./run\";\nimport { registerAgentInfoCommand } from \"./info\";\nimport {\n registerAgentDmCommand,\n registerAgentDmListCommand,\n registerAgentDmHistoryCommand,\n registerAgentDmAuthEncodeCommand,\n} from \"./dm\";\nimport {\n registerAgentSessionEncodeCommand,\n registerAgentSessionCreateCommand,\n} from \"./session\";\n\n/**\n * Register the agent command group with the commander program\n */\nexport function registerAgentCommand(program: Command): void {\n const agentCommand = program\n .command(\"agent\")\n .description(\"Onchain agent operations (create, manage, run, DM)\");\n\n // Agent CRUD + run\n registerAgentCreateCommand(agentCommand);\n registerAgentListCommand(agentCommand);\n registerAgentUpdateCommand(agentCommand);\n registerAgentHideCommand(agentCommand);\n registerAgentUnhideCommand(agentCommand);\n registerAgentRunCommand(agentCommand);\n registerAgentInfoCommand(agentCommand);\n\n // DM\n registerAgentDmCommand(agentCommand);\n registerAgentDmListCommand(agentCommand);\n registerAgentDmHistoryCommand(agentCommand);\n\n // External-signer flow (pair with Bankr or any EIP-712 signer)\n registerAgentSessionEncodeCommand(agentCommand);\n registerAgentSessionCreateCommand(agentCommand);\n registerAgentDmAuthEncodeCommand(agentCommand);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { createWalletClient, createPublicClient, http } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n fundBackendWallet,\n checkBackendWalletBalance,\n} from \"@net-protocol/relay\";\nimport {\n RELAY_ACCESS_KEY,\n NET_API_URL,\n NET_TESTNET_API_URL,\n} from \"@net-protocol/agents\";\nimport { parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\n\nconst CHAINS: Record<number, typeof base> = {\n 8453: base,\n 84532: baseSepolia,\n};\n\nfunction getApiUrl(chainId: number): string {\n return chainId === 84532 ? NET_TESTNET_API_URL : NET_API_URL;\n}\n\n/**\n * Register the relay command group with the commander program\n */\nexport function registerRelayCommand(program: Command): void {\n const relayCommand = program\n .command(\"relay\")\n .description(\"Relay operations (fund credits, check balance)\");\n\n // Fund\n relayCommand\n .command(\"fund\")\n .description(\"Add Net credits via x402 USDC payment\")\n .option(\"--amount <usd>\", \"Amount in USD to fund (default: 0.10)\", \"0.10\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\")\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n const { privateKey, chainId, rpcUrl } = parseCommonOptionsWithDefault({\n privateKey: options.privateKey,\n chainId: options.chainId ? parseInt(options.chainId, 10) : undefined,\n rpcUrl: options.rpcUrl,\n });\n\n const amount = parseFloat(options.amount);\n if (isNaN(amount) || amount <= 0) {\n exitWithError(\"Invalid amount. Must be a positive number.\");\n }\n\n const chain = CHAINS[chainId];\n if (!chain) {\n exitWithError(\n `Chain ${chainId} not supported for relay funding. Use Base (8453) or Base Sepolia (84532).`,\n );\n }\n\n const account = privateKeyToAccount(privateKey);\n const rpcUrls = getChainRpcUrls({ chainId, rpcUrl });\n\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrls[0]),\n });\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport: http(rpcUrls[0]),\n });\n\n // Build signer with correct shape for x402\n const signer = {\n address: account.address,\n signTypedData: (msg: Parameters<typeof walletClient.signTypedData>[0]) =>\n walletClient.signTypedData(msg),\n readContract: (args: Parameters<typeof publicClient.readContract>[0]) =>\n publicClient.readContract(args),\n sendTransaction: (\n args: Parameters<typeof walletClient.sendTransaction>[0],\n ) => walletClient.sendTransaction(args),\n };\n\n // Dynamic import x402 (ESM-only packages)\n const { x402Client, wrapFetchWithPayment, x402HTTPClient } =\n await import(\"@x402/fetch\");\n const { registerExactEvmScheme } = await import(\n \"@x402/evm/exact/client\"\n );\n\n const client = new x402Client();\n registerExactEvmScheme(client, { signer });\n const fetchWithPayment = wrapFetchWithPayment(fetch, client);\n const httpClient = new x402HTTPClient(client);\n\n const apiUrl = getApiUrl(chainId);\n\n if (!options.json) {\n console.log(\n `Funding $${amount.toFixed(2)} USDC to relay on chain ${chainId}...`,\n );\n }\n\n try {\n const result = await fundBackendWallet({\n apiUrl,\n chainId,\n operatorAddress: account.address,\n secretKey: RELAY_ACCESS_KEY,\n fetchWithPayment,\n httpClient,\n amount,\n });\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n success: true,\n paymentTxHash: result.paymentTxHash,\n backendWalletAddress: result.backendWalletAddress,\n amountUsd: amount,\n },\n null,\n 2,\n ),\n );\n } else {\n console.log(chalk.green(`\\n✓ Funded $${amount.toFixed(2)} successfully`));\n console.log(` Payment tx: ${result.paymentTxHash}`);\n console.log(\n ` Backend wallet: ${result.backendWalletAddress}`,\n );\n }\n } catch (error) {\n const msg =\n error instanceof Error ? error.message : String(error);\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: msg }, null, 2));\n process.exit(1);\n }\n exitWithError(`Funding failed: ${msg}`);\n }\n });\n\n // Balance\n relayCommand\n .command(\"balance\")\n .description(\"Check relay backend wallet balance\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453)\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n const { privateKey, chainId } = parseCommonOptionsWithDefault({\n privateKey: options.privateKey,\n chainId: options.chainId ? parseInt(options.chainId, 10) : undefined,\n });\n\n const account = privateKeyToAccount(privateKey);\n const apiUrl = getApiUrl(chainId);\n\n try {\n const result = await checkBackendWalletBalance({\n apiUrl,\n chainId,\n operatorAddress: account.address,\n secretKey: RELAY_ACCESS_KEY,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`Relay Balance`);\n console.log(` Backend wallet: ${result.backendWalletAddress}`);\n console.log(` Balance: ${result.balanceEth} ETH`);\n console.log(\n ` Sufficient: ${result.sufficientBalance ? chalk.green(\"Yes\") : chalk.red(\"No\")} (min: ${result.minRequiredEth} ETH)`,\n );\n }\n } catch (error) {\n const msg =\n error instanceof Error ? error.message : String(error);\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: msg }, null, 2));\n process.exit(1);\n }\n exitWithError(`Balance check failed: ${msg}`);\n }\n });\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport chalk from \"chalk\";\n\nconst CACHE_DIR = join(homedir(), \".netp\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst CHECK_INTERVAL_MS = 4 * 60 * 60 * 1000; // 4 hours\nconst FETCH_TIMEOUT_MS = 5000;\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion: string | null;\n}\n\nexport interface UpdateInfo {\n latest: string;\n}\n\nfunction isNewerVersion(latest: string, current: string): boolean {\n const l = latest.split(\".\").map(Number);\n const c = current.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((l[i] || 0) > (c[i] || 0)) return true;\n if ((l[i] || 0) < (c[i] || 0)) return false;\n }\n return false;\n}\n\nfunction readCache(): UpdateCache | null {\n try {\n if (existsSync(CACHE_FILE)) {\n return JSON.parse(readFileSync(CACHE_FILE, \"utf-8\"));\n }\n } catch {\n // Ignore corrupt cache\n }\n return null;\n}\n\nfunction writeCache(cache: UpdateCache): void {\n try {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n writeFileSync(CACHE_FILE, JSON.stringify(cache));\n } catch {\n // Ignore cache write failures\n }\n}\n\nasync function fetchLatestVersion(pkg: string): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n const res = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(pkg).replace(\"%40\", \"@\")}/latest`,\n { signal: controller.signal }\n );\n clearTimeout(timeout);\n if (res.ok) {\n const data = (await res.json()) as { version: string };\n return data.version;\n }\n } catch {\n // Network errors are expected (offline, timeout, etc.)\n }\n return null;\n}\n\n/**\n * Check npm registry for a newer version of @net-protocol/cli.\n * Uses a file-based cache to avoid hitting the registry on every invocation.\n * Returns UpdateInfo if an update is available, null otherwise.\n */\nexport async function getUpdateInfo(\n currentVersion: string\n): Promise<UpdateInfo | null> {\n const cache = readCache();\n\n // Use cached result if fresh\n if (cache && Date.now() - cache.lastCheck < CHECK_INTERVAL_MS) {\n if (\n cache.latestVersion &&\n isNewerVersion(cache.latestVersion, currentVersion)\n ) {\n return { latest: cache.latestVersion };\n }\n return null;\n }\n\n const latest = await fetchLatestVersion(\"@net-protocol/cli\");\n\n writeCache({\n lastCheck: Date.now(),\n latestVersion: latest,\n });\n\n if (latest && isNewerVersion(latest, currentVersion)) {\n return { latest };\n }\n\n return null;\n}\n\n/**\n * Print an update notification banner to stderr.\n * Uses stderr to avoid interfering with JSON output or piped commands.\n */\nexport function printUpdateBanner(current: string, latest: string): void {\n console.error(\"\");\n console.error(\n chalk.yellow(\n ` Update available: ${chalk.gray(current)} → ${chalk.green(latest)}`\n )\n );\n console.error(\n chalk.yellow(\n ` Run ${chalk.cyan(\"npm install -g @net-protocol/cli@latest\")} to update`\n )\n );\n console.error(\"\");\n}\n","#!/usr/bin/env node\n\n// Configure proxy support before any network requests\nimport { ProxyAgent, setGlobalDispatcher } from \"undici\";\n\nconst proxyUrl = process.env.https_proxy || process.env.HTTPS_PROXY;\nif (proxyUrl) {\n const agent = new ProxyAgent(proxyUrl);\n setGlobalDispatcher(agent);\n}\n\nimport \"dotenv/config\";\nimport { Command } from \"commander\";\nimport { createRequire } from \"module\";\nimport chalk from \"chalk\";\nimport { registerStorageCommand } from \"../commands/storage\";\nimport { registerMessageCommand } from \"../commands/message\";\nimport { registerChainsCommand } from \"../commands/chains\";\nimport { registerInfoCommand } from \"../commands/info\";\nimport { registerTokenCommand } from \"../commands/token\";\nimport { registerProfileCommand } from \"../commands/profile\";\nimport { registerBazaarCommand } from \"../commands/bazaar\";\nimport { registerFeedCommand } from \"../commands/feed\";\nimport { registerUpvoteCommand } from \"../commands/upvote\";\nimport { registerAgentCommand } from \"../commands/agent\";\nimport { registerRelayCommand } from \"../commands/relay\";\nimport { getUpdateInfo, printUpdateBanner } from \"../utils/update-check\";\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../../package.json\");\n\nconst program = new Command();\n\nprogram\n .name(\"netp\")\n .description(\"CLI tool for Net Protocol\")\n .version(version);\n\n// Register commands\nregisterStorageCommand(program);\nregisterMessageCommand(program);\nregisterChainsCommand(program);\nregisterInfoCommand(program);\nregisterTokenCommand(program);\nregisterProfileCommand(program);\nregisterBazaarCommand(program);\nregisterFeedCommand(program);\nregisterUpvoteCommand(program);\nregisterAgentCommand(program);\nregisterRelayCommand(program);\n\n// Add update command\nprogram\n .command(\"update\")\n .description(\"Update netp to the latest version\")\n .action(async () => {\n const { execSync } = await import(\"child_process\");\n\n console.log(\"Updating @net-protocol/cli...\");\n try {\n execSync(\"npm install -g @net-protocol/cli@latest\", {\n stdio: \"inherit\",\n });\n console.log(chalk.green(\"\\n✓ netp updated successfully\"));\n } catch {\n console.error(\n chalk.red(\n \"Failed to update. Try manually: npm install -g @net-protocol/cli@latest\"\n )\n );\n }\n });\n\n// Start non-blocking update check in parallel with command execution\nconst updatePromise = getUpdateInfo(version).catch(() => null);\n\nawait program.parseAsync();\n\n// Show update notification after command completes (with timeout so we don't hang)\ntry {\n const updateInfo = await Promise.race([\n updatePromise,\n new Promise<null>((resolve) => setTimeout(() => resolve(null), 1500)),\n ]);\n if (updateInfo) {\n printUpdateBanner(version, updateInfo.latest);\n }\n} catch {\n // Never let update check interfere with normal operation\n}\n"]}
|