@ghostspeak/sdk 2.0.7 → 2.0.8

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.
Files changed (54) hide show
  1. package/README.md +145 -2
  2. package/dist/{GhostSpeakClient-CWmGaM9Q.d.ts → GhostSpeakClient-bnXwUPHI.d.ts} +10 -6
  3. package/dist/{StakingModule-C5rzuOWb.d.ts → StakingModule-DunDShLq.d.ts} +263 -343
  4. package/dist/{agent-5YLZ7DAC.js → agent-S42FIMR7.js} +3 -3
  5. package/dist/{agent-5YLZ7DAC.js.map → agent-S42FIMR7.js.map} +1 -1
  6. package/dist/browser-CI5_6Gzk.d.ts +234 -0
  7. package/dist/browser.d.ts +3 -64
  8. package/dist/browser.js +9 -9
  9. package/dist/{chunk-SFTSZ3LC.js → chunk-46QWY3MG.js} +3 -3
  10. package/dist/{chunk-SFTSZ3LC.js.map → chunk-46QWY3MG.js.map} +1 -1
  11. package/dist/{chunk-G7S6B6WB.js → chunk-5QBSC4T4.js} +7 -7
  12. package/dist/{chunk-G7S6B6WB.js.map → chunk-5QBSC4T4.js.map} +1 -1
  13. package/dist/{chunk-IHVDQ4YI.js → chunk-5QZVFUXB.js} +201 -256
  14. package/dist/chunk-5QZVFUXB.js.map +1 -0
  15. package/dist/{chunk-E3FD2CNY.js → chunk-6XCCMJ6M.js} +19 -23
  16. package/dist/chunk-6XCCMJ6M.js.map +1 -0
  17. package/dist/{chunk-JV2SWONF.js → chunk-A7ALCVUI.js} +3 -3
  18. package/dist/{chunk-JV2SWONF.js.map → chunk-A7ALCVUI.js.map} +1 -1
  19. package/dist/{chunk-AL3HQN73.js → chunk-AWMGX3OX.js} +172 -112
  20. package/dist/chunk-AWMGX3OX.js.map +1 -0
  21. package/dist/{chunk-S74EH3KD.js → chunk-IQM5RASO.js} +637 -25
  22. package/dist/chunk-IQM5RASO.js.map +1 -0
  23. package/dist/{chunk-SZGFSCNU.js → chunk-JYXSOXCP.js} +467 -299
  24. package/dist/chunk-JYXSOXCP.js.map +1 -0
  25. package/dist/{chunk-C5CDA3WX.js → chunk-OXA7MECJ.js} +476 -3
  26. package/dist/chunk-OXA7MECJ.js.map +1 -0
  27. package/dist/{chunk-KB6CKIUK.js → chunk-QLRWUHN2.js} +3 -3
  28. package/dist/{chunk-KB6CKIUK.js.map → chunk-QLRWUHN2.js.map} +1 -1
  29. package/dist/client.d.ts +2 -3
  30. package/dist/client.js +9 -9
  31. package/dist/{createAgentAuthorization-ULG47ZJI.js → createAgentAuthorization-KGZNXZBT.js} +4 -4
  32. package/dist/{createAgentAuthorization-ULG47ZJI.js.map → createAgentAuthorization-KGZNXZBT.js.map} +1 -1
  33. package/dist/generated-QJREJQ2C.js +9 -0
  34. package/dist/{generated-EG5USUFG.js.map → generated-QJREJQ2C.js.map} +1 -1
  35. package/dist/index.d.ts +209 -231
  36. package/dist/index.js +231 -521
  37. package/dist/index.js.map +1 -1
  38. package/dist/metafile-esm.json +1 -1
  39. package/dist/minimal/core-minimal.d.ts +266 -184
  40. package/dist/minimal/core-minimal.js +6 -6
  41. package/dist/minimal/core-minimal.js.map +1 -1
  42. package/dist/{revokeAuthorization-OK7E7OK3.js → revokeAuthorization-2ZRO6GUZ.js} +4 -4
  43. package/dist/{revokeAuthorization-OK7E7OK3.js.map → revokeAuthorization-2ZRO6GUZ.js.map} +1 -1
  44. package/dist/{updateReputationWithAuth-Y4ONEVSP.js → updateReputationWithAuth-PCEUOCFV.js} +4 -4
  45. package/dist/{updateReputationWithAuth-Y4ONEVSP.js.map → updateReputationWithAuth-PCEUOCFV.js.map} +1 -1
  46. package/dist/utils.js +9 -9
  47. package/package.json +4 -4
  48. package/dist/chunk-AL3HQN73.js.map +0 -1
  49. package/dist/chunk-C5CDA3WX.js.map +0 -1
  50. package/dist/chunk-E3FD2CNY.js.map +0 -1
  51. package/dist/chunk-IHVDQ4YI.js.map +0 -1
  52. package/dist/chunk-S74EH3KD.js.map +0 -1
  53. package/dist/chunk-SZGFSCNU.js.map +0 -1
  54. package/dist/generated-EG5USUFG.js +0 -9
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/modules/reputation/MultiSourceAggregator.ts","../src/core/rpc-client.ts","../src/utils/transaction-urls.ts","../src/core/DevTools.ts","../src/core/InstructionBuilder.ts","../src/core/CacheManager.ts","../src/core/BaseModule.ts","../src/utils/ipfs-utils.ts","../src/core/modules/AgentModule.ts","../src/modules/governance/GovernanceModule.ts","../src/modules/multisig/MultisigModule.ts","../src/modules/did/did-types.ts","../src/modules/did/did-helpers.ts","../src/modules/credentials/CredentialModule.ts","../src/payai/PayAIClient.ts","../src/modules/reputation/ReputationModule.ts","../src/modules/staking/StakingModule.ts"],"names":["createSolanaRpc","getProgramDerivedAddress","getAddressEncoder","VerificationMethodType","VerificationRelationship","ServiceEndpointType","DidError","bs58","CredentialKind","CredentialStatus"],"mappings":";;;;;;;;;;AAAA,IAAA,6BAAA,GAAA;AAAA,QAAA,CAAA,6BAAA,EAAA;AAAA,EAAA,qBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IA4Da;AA5Db,IAAA,0BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iDAAA,GAAA;AA4DO,IAAM,wBAAN,MAA4B;AAAA,MACzB,QAAA,uBAA+D,GAAA,EAAI;AAAA,MACnE,OAAA,uBAA6D,GAAA,EAAI;AAAA;AAAA,MAGxD,kBAAA,GAAqB,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKtC,WAAA,GAAc;AAAA,MAEd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,SAAA,CAAU,SAAkC,MAAA,EAAsC;AAChF,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAA;AACzC,QAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAa,MAAA,EAAgC;AAC3C,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,MAAM,CAAA;AAC3B,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,kBAAA,CAAmB,QAA0B,MAAA,EAAsB;AACjE,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACtC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAAA,QAClB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,uBAAA,CAAwB,QAA0B,WAAA,EAA2B;AAC3E,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACtC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,WAAA,GAAc,WAAA;AAAA,QACvB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,oBAAoB,OAAA,EAA0D;AAClF,QAAA,MAAM,iBAAyC,EAAC;AAGhD,QAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,OAAO,KAAK,IAAA,CAAK,QAAA,CAAS,SAAQ,EAAG;AACvD,UAAA,IAAI;AACF,YAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,mBAAA,CAAoB,OAAA,CAAQ,UAAU,CAAA;AACjE,YAAA,IAAI,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA,EAAG;AAC9B,cAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,YAC1B;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmC,MAAM,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,UAElE;AAAA,QACF;AAGA,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,sBAAA,CAAuB,cAAc,CAAA;AAGjE,QAAA,MAAM,EAAE,YAAA,EAAc,SAAA,EAAU,GAAI,IAAA,CAAK,gBAAgB,cAAc,CAAA;AAGvE,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,qBAAA,CAAsB,cAAc,CAAA;AAG9D,QAAA,MAAM,eAAA,GAAkB,eAAe,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,UAAA,EAAY,CAAC,CAAA;AAErF,QAAA,OAAO;AAAA,UACL,OAAA;AAAA,UACA,cAAA;AAAA,UACA,YAAA;AAAA,UACA,YAAA;AAAA,UACA,SAAA;AAAA,UACA,eAAA;AAAA,UACA,SAAA,sBAAe,IAAA;AAAK,SACtB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,uBAAuB,cAAA,EAAgD;AACrE,QAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,UAAA,OAAO,CAAA;AAAA,QACT;AAEA,QAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,QAAA,IAAI,kBAAA,GAAqB,CAAA;AAEzB,QAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,MAAM,CAAA;AAC3C,UAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,UAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAAS,GAAA;AAC/B,UAAA,MAAM,cAAc,IAAA,CAAK,WAAA;AAEzB,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,GAAQ,MAAA,GAAS,WAAA;AAC3C,UAAA,MAAM,gBAAgB,MAAA,GAAS,WAAA;AAE/B,UAAA,iBAAA,IAAqB,YAAA;AACrB,UAAA,kBAAA,IAAsB,aAAA;AAAA,QACxB;AAEA,QAAA,IAAI,uBAAuB,CAAA,EAAG;AAC5B,UAAA,OAAO,CAAA;AAAA,QACT;AAEA,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,iBAAA,GAAoB,kBAAkB,CAAA;AAAA,MAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,gBAAgB,cAAA,EAGd;AACA,QAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,UAAA,OAAO,EAAE,YAAA,EAAc,KAAA,EAAO,SAAA,EAAW,EAAC,EAAE;AAAA,QAC9C;AAEA,QAAA,MAAM,SAAS,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAChD,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AACnC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AACnC,QAAA,MAAM,WAAW,QAAA,GAAW,QAAA;AAE5B,QAAA,MAAM,YAAsB,EAAC;AAE7B,QAAA,IAAI,QAAA,GAAW,KAAK,kBAAA,EAAoB;AACtC,UAAA,MAAM,SAAA,GAAY,eAAe,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,QAAQ,CAAA,EAAG,MAAA;AACpE,UAAA,MAAM,SAAA,GAAY,eAAe,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,QAAQ,CAAA,EAAG,MAAA;AAEpE,UAAA,SAAA,CAAU,IAAA;AAAA,YACR,2BAA2B,QAAQ,CAAA,EAAA,EAAA,CAAO,QAAA,GAAW,GAAA,GAAQ,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,WAAA,EAC/D,SAAS,CAAA,EAAA,EAAK,QAAQ,CAAA,MAAA,EAAS,SAAS,KAAK,QAAQ,CAAA,CAAA;AAAA,WACpE;AAEA,UAAA,OAAO,EAAE,YAAA,EAAc,IAAA,EAAM,SAAA,EAAU;AAAA,QACzC;AAEA,QAAA,OAAO,EAAE,YAAA,EAAc,KAAA,EAAO,SAAA,EAAW,EAAC,EAAE;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQQ,sBAAsB,cAAA,EAAgE;AAC5F,QAAA,OAAO,cAAA,CAAe,GAAA,CAAI,CAAC,IAAA,KAAS;AAClC,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,MAAM,CAAA;AAC3C,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,UAC9D;AAEA,UAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,UAAA,MAAM,WAAA,GAAc,KAAK,WAAA,GAAc,GAAA;AAGvC,UAAA,MAAM,YAAA,GACH,KAAK,KAAA,IAAS,MAAA,GAAS,QAAU,WAAA,GAAc,GAAA,CAAA,GAChD,IAAA,CAAK,4BAAA,CAA6B,cAAc,CAAA;AAElD,UAAA,OAAO;AAAA,YACL,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,OAAO,IAAA,CAAK,KAAA;AAAA,YACZ,MAAA;AAAA,YACA,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAAA,YACnC,YAAY,IAAA,CAAK,UAAA;AAAA,YACjB,YAAA,EAAc,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAAA,YACrC,aAAa,IAAA,CAAK;AAAA,WACpB;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKQ,6BAA6B,cAAA,EAAgD;AACnF,QAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,QAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,MAAM,CAAA;AAC3C,UAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,UAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAAS,GAAA;AAC/B,UAAA,MAAM,cAAc,IAAA,CAAK,WAAA;AAEzB,UAAA,KAAA,IAAS,MAAA,GAAS,WAAA;AAAA,QACpB;AAEA,QAAA,OAAO,KAAA,IAAS,CAAA;AAAA,MAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,mBAAmB,OAAA,EAA4D;AACnF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA;AACrD,QAAA,OAAO,MAAA,CAAO,YAAA;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKA,oBAAA,GAA2C;AACzC,QAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,MACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,gBAAgB,MAAA,EAA8D;AAC5E,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAa,MAAA,EAAgC;AAC3C,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACtC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AAAA,QACnB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,cAAc,MAAA,EAAgC;AAC5C,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACtC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,QACnB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,gBAAgB,MAAA,EAAmC;AACjD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACtC,QAAA,OAAO,QAAQ,OAAA,IAAW,KAAA;AAAA,MAC5B;AAAA,KACF;AAAA,EAAA;AAAA,CAAA;ACrUO,IAAM,YAAN,MAAgB;AAAA,EACb,GAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EAER,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,GAAA,GAAM,eAAA,CAAgB,MAAA,CAAO,QAAQ,CAAA;AAC1C,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,WAAA;AACvC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,CAAA;AACvC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,GAAA;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AAEjC,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,IAAA,CAAK,gBAAA,GAAmB,4BAAA,CAA6B,MAAA,CAAO,UAAU,CAAA;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,OAAA,EACA,OAAA,EAC6B;AAC7B,IAAA,OAAO,IAAA,CAAK,UAAU,YAAY;AAChC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,eAAe,OAAA,EAAS;AAAA,QACpD,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,QACxC,QAAA,EAAU;AAAA,OACX,EAAE,IAAA,EAAK;AAER,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,OAAO,IAAA;AAE1B,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,KAAK,CAAA;AAAA,IAC3C,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,SAAA,EACA,OAAA,EACiC;AACjC,IAAA,OAAO,IAAA,CAAK,UAAU,YAAY;AAChC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,oBAAoB,SAAA,EAAW;AAAA,QAC3D,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,QACxC,QAAA,EAAU;AAAA,OACX,EAAE,IAAA,EAAK;AAEd,MAAA,OAAO,OAAO,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,OAAA,KACjB,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA,GAAI;AAAA,OAC7C;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,SAAA,EACA,OAAA,EACsD;AACtD,IAAA,OAAO,IAAA,CAAK,UAAU,YAAY;AAChC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,mBAAmB,SAAA,EAAW;AAAA,QAC1D,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,QACxC,QAAA,EAAU,QAAA;AAAA,QACV,SAAS,OAAA,EAAS;AAAA,OACnB,EAAE,IAAA,EAAK;AAEd,MAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,KAAkB;AAC7B,QAAA,MAAM,SAAA,GAAY,IAAA;AAClB,QAAA,OAAO;AAAA,UACL,QAAQ,SAAA,CAAU,MAAA;AAAA,UAClB,OAAA,EAAS,IAAA,CAAK,gBAAA,CAAiB,SAAA,CAAU,OAAO;AAAA,SAClD;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,GAA2G,IAAA;AAAA,EAEnH,MAAM,kBAAA,GAAmF;AAEvF,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,KAAK,cAAA,IAAkB,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,YAAY,GAAA,EAAM;AACrE,MAAA,OAAO,KAAK,cAAA,CAAe,KAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,YAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,kBAAA,CAAmB;AAAA,QACjD,YAAY,IAAA,CAAK;AAAA,OAClB,EAAE,IAAA,EAAK;AAER,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,SAAS,KAAA,CAAM,SAAA;AAAA,QAC1B,oBAAA,EAAsB,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,oBAAoB;AAAA,OAClE;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,KAAA,EAAO,MAAA,EAAQ,WAAW,GAAA,EAAI;AACtD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,WAAA,EACA,OAAA,EACoB;AACpB,IAAA,OAAO,IAAA,CAAK,UAAU,YAAY;AAChC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,gBAAgB,WAAA,EAAa;AAAA,QACzD,QAAA,EAAU,QAAA;AAAA,QACV,aAAA,EAAe,SAAS,aAAA,IAAiB,KAAA;AAAA,QACzC,mBAAA,EAAqB,OAAA,EAAS,mBAAA,IAAuB,IAAA,CAAK,UAAA;AAAA,QAC1D,YAAY,OAAA,EAAS,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,GAAI;AAAA,OAChE,EAAE,IAAA,EAAK;AAER,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBACJ,UAAA,EACqC;AACrC,IAAA,OAAO,IAAA,CAAK,UAAU,YAAY;AAChC,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAI,oBAAA,CAAqB,UAAU,EAAE,IAAA,EAAK;AAE1E,MAAA,OAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,MAAA,KAAoB;AACrC,QAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,QAAA,MAAM,WAAA,GAAc,MAAA;AAOpB,QAAA,OAAO;AAAA,UACL,MAAM,WAAA,CAAY,IAAA;AAAA,UAClB,eAAe,WAAA,CAAY,aAAA;AAAA,UAC3B,KAAK,WAAA,CAAY,GAAA;AAAA,UACjB,oBAAoB,WAAA,CAAY;AAAA,SAClC;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,WAAA,EACA,OAAA,EAIuC;AACvC,IAAA,OAAO,IAAA,CAAK,UAAU,YAAY;AAChC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,oBAAoB,WAAA,EAAa;AAAA,QAC7D,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,QACxC,sBAAA,EAAwB,SAAS,sBAAA,IAA0B;AAAA,OAC5D,EAAE,IAAA,EAAK;AAER,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,OAAO,KAAA,CAAM,GAAA;AAAA,QAClB,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,QAC5B,aAAA,EAAe,OAAO,KAAA,CAAM,aAAA,GAAgB,OAAO,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA,GAAI,MAAA;AAAA,QACjF,UAAA,EAAY,OAAO,KAAA,CAAM;AAAA,OAC3B;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,cAAA,EAAuE;AAC5F,IAAA,OAAO,IAAA,CAAK,UAAU,YAAY;AAChC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,iBAAiB,cAAA,EAAgB;AAAA,QAC7D,YAAY,IAAA,CAAK;AAAA,OAClB,EAAE,IAAA,EAAK;AAER,MAAA,OAAO,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,GAAI,IAAA;AAAA,IAC/C,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAA8B;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,SAAA,EAAU,CAAE,IAAA,EAAK;AAChC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAAwE;AAC5E,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,IAAA,EAAK;AAChD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAA,CACJ,OAAA,EACA,QAAA,EACqB;AACrB,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAGA,IAAA,OAAA,CAAQ,KAAK,+DAA+D,CAAA;AAG5E,IAAA,MAAM,UAAA,GAAa,YAAY,YAAY;AACzC,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACrD,QAAA,QAAA,CAAS,WAAW,CAAA;AAAA,MACtB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,MACpD;AAAA,IACF,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM;AACX,MAAA,aAAA,CAAc,UAAU,CAAA;AAAA,IAC1B,CAAA;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,SAAA,CACZ,SAAA,EACA,OAAA,GAAU,KAAK,UAAA,EACH;AACZ,IAAA,IAAI,SAAA;AAEJ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,SAAA,EAAU;AAAA,MACzB,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,IAAI,IAAI,OAAA,EAAS;AACf,UAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAA;AAAA,EACR;AAAA,EAEQ,iBAAiB,UAAA,EAAkC;AACzD,IAAA,MAAM,OAAA,GAAU,UAAA;AAShB,IAAA,MAAM,YAAY,OAAA,CAAQ,IAAA;AAC1B,IAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,GAAI,SAAA;AAE7D,IAAA,OAAO;AAAA,MACL,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,QAAA,EAAU,OAAO,OAAA,CAAQ,QAAA,KAAa,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA,GAAI,OAAA,CAAQ,QAAA;AAAA,MAC9F,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,SAAA,EAAW,OAAA,CAAQ,SAAA,KAAc,MAAA,GAAa,OAAO,OAAA,CAAQ,SAAA,KAAc,QAAA,GAAW,MAAA,CAAO,QAAQ,SAAS,CAAA,GAAI,OAAA,CAAQ,SAAA,GAAa,OAAO,CAAC,CAAA;AAAA,MAC/I,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAAA,MACtC,KAAA,EAAO,OAAA,CAAQ,KAAA,GAAS,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,GAAI,OAAA,CAAQ,KAAA,GAAS;AAAA,KACvG;AAAA,EACF;AACF;;;ACjSO,SAAS,oBAAA,CACd,SAAA,EACA,OAAA,GAAyB,cAAA,EACjB;AACR,EAAA,MAAM,OAAA,GAAU,gCAAA;AAEhB,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,eAAA,CAAA;AAAA,IAChC,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,gBAAA,CAAA;AAAA,IAChC,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,+CAAA,CAAA;AAAA,IAChC;AACE,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA;AAEpC;AAKO,SAAS,aAAA,CACd,SAAA,EACA,OAAA,GAAyB,cAAA,EACjB;AACR,EAAA,MAAM,OAAA,GAAU,uBAAA;AAEhB,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,eAAA,CAAA;AAAA,IAChC,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,gBAAA,CAAA;AAAA,IAChC,KAAK,UAAA;AACH,MAAA,OAAO,sBAAsB,SAAS,CAAA,0BAAA,CAAA;AAAA,IACxC;AACE,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA;AAEpC;AAKO,SAAS,cAAA,CACd,SAAA,EACA,OAAA,GAAyB,cAAA,EACjB;AACR,EAAA,MAAM,OAAA,GAAU,sBAAA;AAEhB,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,sBAAA,CAAA;AAAA,IAChC,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,uBAAA,CAAA;AAAA,IAChC,KAAK,UAAA;AACH,MAAA,OAAO,sBAAsB,SAAS,CAAA,2BAAA,CAAA;AAAA,IACxC;AACE,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA;AAEpC;AAKO,SAAS,UAAA,CACd,SAAA,EACA,OAAA,GAAyB,cAAA,EACjB;AACR,EAAA,MAAM,OAAA,GAAU,4BAAA;AAEhB,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,eAAA,CAAA;AAAA,IAChC,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,gBAAA,CAAA;AAAA,IAChC,KAAK,UAAA;AACH,MAAA,OAAO,sBAAsB,SAAS,CAAA,uBAAA,CAAA;AAAA,IACxC;AACE,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA;AAEpC;AAKO,SAAS,oBAAA,CACd,SAAA,EACA,OAAA,GAAyB,cAAA,EACE;AAC3B,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,oBAAA,CAAqB,SAAA,EAAW,OAAO,CAAA;AAAA,IACvD,OAAA,EAAS,aAAA,CAAc,SAAA,EAAW,OAAO,CAAA;AAAA,IACzC,QAAA,EAAU,cAAA,CAAe,SAAA,EAAW,OAAO,CAAA;AAAA,IAC3C,IAAA,EAAM,UAAA,CAAW,SAAA,EAAW,OAAO;AAAA,GACrC;AACF;AAKO,SAAS,uBAAA,CACd,SAAA,EACA,OAAA,EACA,UAAA,GAAyB,WAAA,EACN;AACnB,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA,EAAM,oBAAA,CAAqB,SAAA,EAAW,OAAO,CAAA;AAAA,IAC7C,UAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;;;AC/FO,IAAM,QAAA,GAAN,MAAM,SAAA,CAAS;AAAA,EACpB,OAAe,QAAA,GAA4B,IAAA;AAAA,EACnC,SAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAiB,EAAC;AAAA,EAClB,OAAA,uBAAmC,GAAA,EAAI;AAAA,EAE/C,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,MAC7B,QAAA,EAAU,OAAO,WAAA,IAAe,+BAAA;AAAA,MAChC,YAAY,MAAA,CAAO;AAAA,KACpB,CAAA;AACD,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,GAAA,CAAI,aAAa,aAAA,IACxB,MAAA,CAAO,YAAY,UAAA,IACnB,KAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY,MAAA,EAAqC;AACtD,IAAA,IAAI,CAAC,SAAA,CAAS,QAAA,IAAY,MAAA,EAAQ;AAChC,MAAA,SAAA,CAAS,QAAA,GAAW,IAAI,SAAA,CAAS,MAAM,CAAA;AAAA,IACzC;AACA,IAAA,IAAI,CAAC,UAAS,QAAA,EAAU;AACtB,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,SAAA,CAAS,QAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,OAAA,CAAQ,IAAI,qDAAyC,CAAA;AACrD,IAAA,OAAA,CAAQ,IAAI,4CAA4C,CAAA;AACxD,IAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AACpD,IAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAC1C,IAAA,OAAA,CAAQ,IAAI,yBAAyB,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,YAAA,EAAmD;AACpE,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAa;AAC1C,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAa;AAC1C,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAa;AACjC,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,IAAA,MAAM,mBAAA,GAA6C,YAAA,CAAa,GAAA,CAAI,CAAC,OAAO,KAAA,KAAU;AACpF,MAAA,SAAA,IAAa,EAAA;AACb,MAAA,SAAA,IAAA,CAAc,KAAA,CAAM,QAAA,EAAU,MAAA,IAAU,CAAA,IAAK,EAAA;AAC7C,MAAA,SAAA,IAAa,KAAA,CAAM,MAAM,MAAA,IAAU,CAAA;AAEnC,MAAA,MAAM,YAA2B,KAAA,CAAM,QAAA,IAAY,EAAC,EAAG,IAAI,CAAA,GAAA,KAAO;AAEhE,QAAA,MAAM,aAAa,GAAA,CAAI,IAAA,CAAK,QAAA,EAAS,CAAE,SAAS,UAAU,CAAA,IACxC,GAAA,CAAI,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,UAAU,CAAA,IACvC,IAAI,IAAA,KAAS,CAAA;AAAA,QACb,IAAI,IAAA,KAAS,CAAA;AAE/B,QAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,QAAQ,KACrC,GAAA,CAAI,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,QAAQ,CAAA,IACpC,OAAO,QAAQ,QAAA,IAAY,QAAA,IAAY,GAAA,IACxC,GAAA,CAAI,IAAA,KAAS,CAAA;AAI9B,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,gBAAA,CAAiB,GAAA,CAAI,IAAI,OAAO,CAAA;AAAA,QAClC,CAAA,MAAO;AACL,UAAA,gBAAA,CAAiB,GAAA,CAAI,IAAI,OAAO,CAAA;AAAA,QAClC;AAEA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,OAAO,CAAA;AAAA,QACzB;AAEA,QAAA,OAAO;AAAA,UACL,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,UAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAM,GAAA,CAAI;AAAA,SACZ;AAAA,MACF,CAAC,CAAA;AAED,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,KAAK,CAAA;AAEjE,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,WAAW,KAAA,CAAM,cAAA;AAAA,QACjB,cAAc,QAAA,CAAS,MAAA;AAAA,QACvB,QAAA,EAAU,KAAA,CAAM,IAAA,EAAM,MAAA,IAAU,CAAA;AAAA,QAChC,aAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,oBAAA,CAAqB,YAAY,CAAA;AAGpE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,WAAA,CAAY,qBAAA,EAAuB,aAAa,MAAM,CAAA;AAGhF,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,kBAAA,EAAqB,SAAS,CAAA,kCAAA,CAAoC,CAAA;AAAA,IAClF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,QAAA,CAAS,KAAK,iCAAiC,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,qBAAA,GAAwB,MAAA,CAAO,IAAS,CAAA,EAAG;AAC7C,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,oBAAA,EAAuB,qBAAqB,CAAA,MAAA,CAAQ,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,mBAAA;AAAA,MACd,aAAA,EAAe,gBAAA,CAAiB,IAAA,GAAO,gBAAA,CAAiB,IAAA;AAAA,MACxD,aAAa,OAAA,CAAQ,IAAA;AAAA,MACrB,gBAAA,EAAkB,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA;AAAA,MAC7C,gBAAA,EAAkB,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA;AAAA,MAC7C,aAAA,EAAe,SAAA;AAAA,MACf,qBAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAA,CAA0B,aAA2B,MAAA,EAAwB;AAEnF,IAAA,MAAM,YAAY,WAAA,CAAY,cAAA;AAG9B,IAAA,IAAI,SAAA,KAAc,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AACvC,MAAA,OAAO,IAAA,CAAK,4BAA4B,WAAW,CAAA;AAAA,IACrD;AAGA,IAAA,IAAI,cAAc,kCAAA,EAAoC;AACpD,MAAA,OAAO,4CAAA;AAAA,IACT;AAGA,IAAA,IAAI,cAAc,6CAAA,EAA+C;AAC/D,MAAA,OAAO,gCAAA;AAAA,IACT;AAGA,IAAA,IAAI,cAAc,6CAAA,EAA+C;AAC/D,MAAA,OAAO,8CAAA;AAAA,IACT;AAEA,IAAA,OAAO,CAAA,mBAAA,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAA4B,WAAA,EAAmC;AACrE,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,IAAQ,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA,EAAG;AACpD,MAAA,OAAO,iCAAA;AAAA,IACT;AAGA,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAC1D,GAAA,CAAI,OAAK,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAC,CAAA,CACxC,IAAA,CAAK,EAAE,CAAA;AAGV,IAAA,MAAM,cAAA,GAAyC;AAAA,MAC7C,kBAAA,EAAoB,gBAAA;AAAA,MACpB,kBAAA,EAAoB,eAAA;AAAA,MACpB,kBAAA,EAAoB,cAAA;AAAA,MACpB,kBAAA,EAAoB;AAAA;AAAA,KAEtB;AAEA,IAAA,OAAO,CAAA,YAAA,EAAe,cAAA,CAAe,aAAa,CAAA,IAAK,oBAAoB,CAAA,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,YAAA,EAAsC;AACjE,IAAA,IAAI,UAAA,GAAa,OAAO,CAAC,CAAA;AAEzB,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAEhC,MAAA,UAAA,IAAc,OAAO,GAAG,CAAA;AAGxB,MAAA,UAAA,IAAc,MAAA,CAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,MAAA,IAAU,KAAK,GAAG,CAAA;AAGxD,MAAA,UAAA,IAAc,MAAA,CAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,MAAA,IAAU,KAAK,EAAE,CAAA;AAGnD,MAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAElD,QAAA,UAAA,IAAc,OAAO,GAAI,CAAA;AAAA,MAC3B;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CAAY,cAAsB,gBAAA,EAAkC;AAE1E,IAAA,MAAM,OAAA,GAAU,OAAO,GAAI,CAAA;AAG3B,IAAA,MAAM,aAAc,YAAA,GAAe,MAAA,CAAO,CAAC,CAAA,GAAK,OAAO,GAAS,CAAA;AAGhE,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,gBAAA,GAAmB,GAAI,CAAA;AAElD,IAAA,OAAO,UAAU,UAAA,GAAa,WAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,SAAiB,IAAA,EAAsB;AACzC,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AAEzB,IAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,IAAA,MAAM,QAAA,GAAW,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AAE1C,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,QAAQ,CAAA;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAM,QAAQ,CAAA,CAAE,CAAA;AAE5B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,IAAI,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAAqB;AAC/B,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACzB,IAAA,MAAM,OAAA,GAAU,OAAO,WAAA,KAAgB,WAAA,GAAc,YAAY,GAAA,EAAI,GAAI,KAAK,GAAA,EAAI;AAClF,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,KAAA,EAAqB;AAC7B,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AAEzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,OAAA,GAAU,OAAO,WAAA,KAAgB,WAAA,GAAc,YAAY,GAAA,EAAI,GAAI,KAAK,GAAA,EAAI;AAClF,IAAA,MAAM,WAAW,OAAA,GAAU,KAAA;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,CAAA,MAAA,EAAS,SAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AACjD,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,QAAA,EAAuC;AACvD,IAAA,MAAM,KAAA,GAAkB;AAAA,MACtB,gCAAA;AAAA,MACA,4OAAA;AAAA,MACA,CAAA,cAAA,EAAiB,QAAA,CAAS,YAAA,CAAa,MAAM,CAAA,CAAA;AAAA,MAC7C,CAAA,gBAAA,EAAmB,SAAS,aAAa,CAAA,CAAA;AAAA,MACzC,CAAA,SAAA,EAAY,SAAS,WAAW,CAAA,CAAA;AAAA,MAChC,CAAA,gBAAA,EAAmB,SAAS,aAAa,CAAA,MAAA,CAAA;AAAA,MACzC,CAAA,yBAAA,EAA4B,QAAA,CAAS,qBAAA,CAAsB,cAAA,EAAgB,CAAA,CAAA;AAAA,MAC3E,CAAA,eAAA,EAAA,CAAmB,OAAO,QAAA,CAAS,YAAY,IAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAAA;AAAA,MAClE;AAAA,KACF;AAGA,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,IAAA,KAAA,MAAW,KAAA,IAAS,SAAS,YAAA,EAAc;AACzC,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,aAAa,CAAA,CAAE,CAAA;AACzD,MAAA,KAAA,CAAM,IAAA,CAAK,iBAAiB,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,CAAK,CAAA;AAC5D,MAAA,KAAA,CAAM,KAAK,CAAA,eAAA,EAAkB,KAAA,CAAM,YAAY,CAAA,QAAA,EAAW,KAAA,CAAM,QAAQ,CAAA,MAAA,CAAQ,CAAA;AAAA,IAClF;AAGA,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,wBAAc,CAAA;AACzB,MAAA,KAAA,MAAW,OAAA,IAAW,SAAS,QAAA,EAAU;AACvC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAK,4OAAyC,CAAA;AAEpD,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAuB;AACrB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,IAAI,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,OAAO,EAAC;AACb,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF,CAAA;AChWA,SAAS,oBAAoB,WAAA,EAA8D;AACzF,EAAA,MAAM,IAAA,GAAO,WAAA;AACb,EAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACF;AAMO,IAAM,qBAAN,MAAyB;AAAA,EACtB,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EAEpB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,MAC7B,QAAA,EAAU,OAAO,WAAA,IAAe,+BAAA;AAAA,MAChC,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,UAAA,EAAY,OAAO,UAAA,IAAc;AAAA,KAClC,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,WAAA,CAAY,MAAM,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,eAAA,EACA,iBAAA,EACA,SACA,OAAA,EAMY;AACZ,IAAA,MAAM,OAAA,GAAU,kBAAA;AAAA,MACd,SAAA;AAAA,MACA,eAAA;AAAA,MACA,OAAA,CAAQ,IAAI,CAAA,CAAA,MAAM,EAAE,SAAS,CAAA,CAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS,CAAE,CAAA;AAAA,MACzD,EAAE,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,SAAA;AAAU,KACrC;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,SAAA,EAAU,EAAG;AAC7B,QAAA,IAAA,CAAK,QAAA,CAAS,YAAY,eAAe,CAAA;AAAA,MAC3C;AAGA,MAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,OAAA,CAAQ,mBAAmB,CAAA;AAC7D,MAAA,mBAAA,CAAoB,WAAW,CAAA;AAG/B,MAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,QAAA,CAAS,WAAU,EAAG;AAC/C,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA,CAAS,kBAAA,CAAmB,CAAC,WAAW,CAA8B,CAAA;AAC5F,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AACrD,QAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,MACnB;AAGA,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,OAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,WAAA,EAAa,OAAO,CAAA;AAAA,MAC5D;AAGA,MAAA,MAAM,qBAAA,GAAwB,MAAM,IAAA,CAAK,SAAA,CAAU,kBAAA,EAAmB;AACtE,MAAA,MAAM,eAAA,GAAkB;AAAA,QACtB,WAAW,qBAAA,CAAsB,SAAA;AAAA,QACjC,sBAAsB,qBAAA,CAAsB;AAAA,OAC9C;AAGA,MAAA,MAAM,kBAAA,GAAqB,IAAA;AAAA,QACzB,wBAAA,CAAyB,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,QACvC,CAAA,EAAA,KAAM,mCAAA,CAAoC,OAAA,CAAQ,CAAC,GAAG,EAAE,CAAA;AAAA,QACxD,CAAA,EAAA,KAAM,2CAAA,CAA4C,eAAA,EAAiB,EAAE,CAAA;AAAA,QACrE,CAAA,EAAA,KAAM,oCAAA,CAAqC,CAAC,WAA2B,GAAG,EAAE;AAAA,OAC9E;AAGA,MAAA,MAAM,iBAAA,GAAoB,MAAM,iCAAA,CAAkC,kBAAkB,CAAA;AAGpF,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,cAAA;AAAA,QACjC,iBAAA;AAAA,QACA,SAAS,aAAA,IAAiB,KAAA;AAAA,QAC1B,SAAS,UAAA,IAAc;AAAA,OACzB;AAEA,MAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACvC,QAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,SAAA,GAAY,eAAA;AAGlB,MAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,QAAA;AACvC,QAAA,MAAM,SAAS,uBAAA,CAAwB,SAAA,EAAW,SAAS,IAAA,CAAK,MAAA,CAAO,cAAc,WAAW,CAAA;AAGhG,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,SAAA,EAAU,EAAG;AAC7B,UAAA,IAAA,CAAK,QAAA,CAAS,UAAU,eAAe,CAAA;AAAA,QACzC;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAGA,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,SAAA,EAAU,EAAG;AAC7B,QAAA,IAAA,CAAK,QAAA,CAAS,UAAU,eAAe,CAAA;AAAA,MACzC;AAEA,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,gBAAA,CAAiB,OAAgB,OAAO,CAAA;AACxC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,SAAA,EACA,kBAAA,EACA,SACA,OAAA,EAKY;AACZ,IAAA,MAAM,OAAA,GAAU,kBAAA;AAAA,MACd,cAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,CAAQ,IAAI,CAAA,CAAA,MAAM,EAAE,SAAS,CAAA,CAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS,CAAE,CAAA;AAAA,MACzD,EAAE,SAAA,EAAW,IAAA,CAAK,OAAO,SAAA,EAAW,gBAAA,EAAkB,mBAAmB,MAAA;AAAO,KAClF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA;AAAA,QACjC,kBAAA,CAAmB,GAAA,CAAI,OAAO,MAAA,EAAQ,CAAA,KAAM;AAC1C,UAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAClD,UAAA,IAAI;AACF,YAAA,mBAAA,CAAoB,WAAW,CAAA;AAC/B,YAAA,OAAO,WAAA;AAAA,UACT,SAAS,KAAA,EAAO;AACd,YAAA,MAAM,IAAI,MAAM,CAAA,YAAA,EAAe,CAAC,OAAO,SAAS,CAAA,EAAA,EAAM,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,UACjF;AAAA,QACF,CAAC;AAAA,OACH;AAGA,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,uBAAA,CAAwB,YAA8B,CAAA;AACjF,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,aAAa,CAAA,kBAAA,CAAoB,CAAA;AAAA,MAC7E;AAGA,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,OAAO,MAAM,IAAA,CAAK,aAAA,CAAc,YAAA,EAAgC,OAAO,CAAA;AAAA,MACzE;AAGA,MAAA,MAAM,qBAAA,GAAwB,MAAM,IAAA,CAAK,SAAA,CAAU,kBAAA,EAAmB;AACtE,MAAA,MAAM,eAAA,GAAkB;AAAA,QACtB,WAAW,qBAAA,CAAsB,SAAA;AAAA,QACjC,sBAAsB,qBAAA,CAAsB;AAAA,OAC9C;AAGA,MAAA,MAAM,kBAAA,GAAqB,IAAA;AAAA,QACzB,wBAAA,CAAyB,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,QACvC,CAAA,EAAA,KAAM,mCAAA,CAAoC,OAAA,CAAQ,CAAC,GAAG,EAAE,CAAA;AAAA,QACxD,CAAA,EAAA,KAAM,2CAAA,CAA4C,eAAA,EAAiB,EAAE,CAAA;AAAA,QACrE,CAAA,EAAA,KAAM,oCAAA,CAAqC,YAAA,EAAgC,EAAE;AAAA,OAC/E;AAGA,MAAA,MAAM,iBAAA,GAAoB,MAAM,iCAAA,CAAkC,kBAAkB,CAAA;AAGpF,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,cAAA;AAAA,QACjC,iBAAA;AAAA,QACA,SAAS,aAAA,IAAiB;AAAA,OAC5B;AAEA,MAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACvC,QAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,SAAA,GAAY,eAAA;AAGlB,MAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,QAAA;AACvC,QAAA,MAAM,SAAS,uBAAA,CAAwB,SAAA,EAAW,SAAS,IAAA,CAAK,MAAA,CAAO,cAAc,WAAW,CAAA;AAGhG,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,SAAA,EAAU,EAAG;AAC7B,UAAA,IAAA,CAAK,QAAA,CAAS,UAAU,SAAS,CAAA;AAAA,QACnC;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAGA,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,SAAA,EAAU,EAAG;AAC7B,QAAA,IAAA,CAAK,QAAA,CAAS,UAAU,SAAS,CAAA;AAAA,MACnC;AAEA,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,gBAAA,CAAiB,OAAgB,OAAO,CAAA;AACxC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,OAAA,EACA,iBAAA,EACmB;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,SAAA,CAAU,eAAe,OAAA,EAAS;AAAA,QAC/D,UAAA,EAAY,KAAK,MAAA,CAAO;AAAA,OACzB,CAAA;AAED,MAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AAGzB,MAAA,MAAM,SAAA,GAAY,MAAM,OAAO,yBAAuB,CAAA;AACtD,MAAA,MAAM,aAAA,GAAiB,UAAsC,iBAAiB,CAAA;AAI9E,MAAA,MAAM,UAAU,aAAA,EAAc;AAC9B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,WAAA,CAAY,IAAI,CAAA;AAEpD,MAAA,OAAO,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,IAC/B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACzD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,SAAA,EACA,iBAAA,EACuB;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,oBAAoB,SAAA,EAAW;AAAA,QACnE,UAAA,EAAY,KAAK,MAAA,CAAO;AAAA,OACzB,CAAA;AAGD,MAAA,MAAM,SAAA,GAAY,MAAM,OAAO,yBAAuB,CAAA;AACtD,MAAA,MAAM,aAAA,GAAiB,UAAsC,iBAAiB,CAAA;AAI9E,MAAA,MAAM,UAAU,aAAA,EAAc;AAE9B,MAAA,OAAO,QAAA,CAAS,IAAI,CAAA,WAAA,KAAe;AACjC,QAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,WAAA,CAAY,IAAI,CAAA;AACpD,UAAA,OAAO,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,QAC/B,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF,CAAC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,KAAK,CAAA;AACxD,MAAA,OAAO,SAAA,CAAU,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,iBAAA,EACA,OAAA,EAC0C;AAC1C,IAAA,IAAI;AAEF,MAAA,MAAM,gBAAA,GAAmB,OAAA,EAAS,GAAA,CAAI,CAAA,MAAA,KAAU;AAC9C,QAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,UAAA,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAS;AAAA,QACrC,CAAA,MAAO;AACL,UAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,QAAA,IAAY,QAAA;AAC3C,UAAA,IAAI,aAAa,QAAA,EAAU;AACzB,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ;AAAA,gBACN,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA;AAAA,gBACtB,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA;AAAA,gBACrB,QAAA,EAAU;AAAA;AACZ,aACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ;AAAA,gBACN,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA;AAAA,gBACtB,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA;AAAA,gBACrB,QAAA,EAAU;AAAA;AACZ,aACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAED,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAU,kBAAA,CAAmB,IAAA,CAAK,OAAO,SAAA,EAAY;AAAA,QAC/E,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,QACxB,OAAA,EAAS,oBAAoB;AAAC,OAC/B,CAAA;AAGD,MAAA,MAAM,SAAA,GAAY,MAAM,OAAO,yBAAuB,CAAA;AACtD,MAAA,MAAM,aAAA,GAAiB,UAAsC,iBAAiB,CAAA;AAI9E,MAAA,MAAM,UAAU,aAAA,EAAc;AAC9B,MAAA,MAAM,kBAAmD,EAAC;AAE1D,MAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,OAAA,EAAQ,IAAK,QAAA,EAAU;AAC1C,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,IAAI,CAAA;AAChD,UAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAC1C,UAAA,eAAA,CAAgB,KAAK,EAAE,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AAAA,QAC7D,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,OAAO,eAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CACJ,eAAA,EACA,kBAAA,EAC8B;AAC9B,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,UAAA,EAAa,eAAe,CAAA,CAAE,CAAA;AAGhD,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA;AAAA,MACjC,kBAAA,CAAmB,GAAA,CAAI,OAAM,MAAA,KAAU;AACrC,QAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAClD,QAAA,mBAAA,CAAoB,WAAW,CAAA;AAC/B,QAAA,OAAO,WAAA;AAAA,MACT,CAAC;AAAA,KACH;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,kBAAA,CAAmB,YAAyC,CAAA;AAG3F,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AAErD,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,eAAA,EACA,kBAAA,EACiB;AACjB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,iBAAiB,kBAAkB,CAAA;AAErE,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,0BAAmB,eAAe,CAAA,CAAA;AAAA,MAClC,EAAA;AAAA,MACA,wBAAA;AAAA,MACA,GAAG,QAAA,CAAS,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,KAAM,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,aAAa,CAAA,CAAE,CAAA;AAAA,MAC/E,EAAA;AAAA,MACA,CAAA,OAAA,EAAA,CAAW,OAAO,QAAA,CAAS,YAAY,IAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAAA;AAAA,MAC1D,CAAA,MAAA,EAAS,SAAS,aAAa,CAAA,MAAA,CAAA;AAAA,MAC/B,CAAA,SAAA,EAAY,QAAA,CAAS,qBAAA,CAAsB,cAAA,EAAgB,CAAA,MAAA;AAAA,KAC7D;AAEA,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,KAAA,CAAM,IAAA,CAAK,IAAI,wBAAc,CAAA;AAC7B,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,kBAAA,EACiB;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA;AAAA,QACjC,kBAAA,CAAmB,GAAA,CAAI,OAAM,MAAA,KAAU;AACrC,UAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAClD,UAAA,mBAAA,CAAoB,WAAW,CAAA;AAC/B,UAAA,OAAO,WAAA;AAAA,QACT,CAAC;AAAA,OACH;AAEA,MAAA,MAAM,qBAAA,GAAwB,MAAM,IAAA,CAAK,SAAA,CAAU,kBAAA,EAAmB;AACtE,MAAA,MAAM,eAAA,GAAkB;AAAA,QACtB,WAAW,qBAAA,CAAsB,SAAA;AAAA,QACjC,sBAAsB,qBAAA,CAAsB;AAAA,OAC9C;AAEA,MAAA,MAAM,kBAAA,GAAqB,IAAA;AAAA,QACzB,wBAAA,CAAyB,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,QACvC,CAAA,EAAA,KAAM,6BAAA,CAA8B,IAAA,CAAK,MAAA,CAAO,iBAAkB,EAAE,CAAA;AAAA,QACpE,CAAA,EAAA,KAAM,2CAAA,CAA4C,eAAA,EAAiB,EAAE,CAAA;AAAA,QACrE,CAAA,EAAA,KAAM,oCAAA,CAAqC,YAAA,EAAgC,EAAE;AAAA,OAC/E;AAEA,MAAA,MAAM,eAAA,GAAkB,0BAA0B,kBAAkB,CAAA;AACpE,MAAA,MAAM,iBAAiB,MAAA,CAAO,IAAA,CAAK,eAAwC,CAAA,CAAE,SAAS,QAAQ,CAAA;AAE9F,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,iBAAiB,cAA+C,CAAA;AACjG,MAAA,OAAO,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AAEN,MAAA,MAAM,OAAA,GAAU,KAAA;AAChB,MAAA,MAAM,iBAAA,GAAoB,KAAA;AAC1B,MAAA,OAAO,OAAA,GAAW,MAAA,CAAO,kBAAA,CAAmB,MAAM,CAAA,GAAI,iBAAA;AAAA,IACxD;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,cAAA,CACZ,iBAAA,EACA,aAAA,EACA,aAAa,EAAA,EACO;AACpB,IAAA,MAAM,eAAA,GAAkB,gCAAgC,iBAAoG,CAAA;AAE5J,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,SAAA,CAAU,gBAAgB,eAAA,EAAiB;AAAA,MACtE,aAAA;AAAA,MACA,mBAAA,EAAqB,KAAK,MAAA,CAAO;AAAA,KAClC,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI,0CAAmC,SAAS,CAAA;AACxD,IAAA,OAAA,CAAQ,GAAA,CAAI,6BAAA,EAAwB,SAAA,CAAU,MAAM,CAAA;AACpD,IAAA,OAAA,CAAQ,GAAA,CAAI,2BAAA,EAAsB,OAAO,SAAS,CAAA;AAGlD,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,YAAA,GAAe,GAAA;AACnB,IAAA,MAAM,mBAAA,GAAsB,GAAA;AAE5B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,OAAO,CAAC,aAAa,QAAA,GAAW,UAAA,IAAe,KAAK,GAAA,EAAI,GAAI,YAAa,mBAAA,EAAqB;AAC5F,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,IAAI,CAAA,+BAAA,EAA2B,QAAA,GAAW,CAAC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAA;AACnE,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAU,oBAAA,CAAqB,CAAC,SAAS,CAAU,CAAA;AAE/E,QAAA,IAAI,QAAA,CAAS,CAAC,CAAA,EAAG;AACf,UAAA,OAAA,CAAQ,GAAA,CAAI,yBAAA,EAAoB,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3C,UAAA,IAAI,QAAA,CAAS,CAAC,CAAA,CAAE,GAAA,EAAK;AACnB,YAAA,MAAM,IAAI,MAAM,CAAA,oBAAA,EAAuB,IAAA,CAAK,UAAU,QAAA,CAAS,CAAC,EAAE,GAAA,EAAK,CAAC,GAAG,CAAA,KAAe,OAAO,MAAM,QAAA,GAAW,CAAA,CAAE,UAAS,GAAI,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,UACvI;AAEA,UAAA,MAAM,kBAAA,GAAqB,QAAA,CAAS,CAAC,CAAA,CAAE,kBAAA;AACvC,UAAA,IAAI,kBAAA,KAAuB,KAAK,MAAA,CAAO,UAAA,IAClC,KAAK,MAAA,CAAO,UAAA,KAAe,WAAA,IAAe,kBAAA,KAAuB,WAAA,EAAc;AAClF,YAAA,SAAA,GAAY,IAAA;AACZ,YAAA,OAAA,CAAQ,IAAI,+CAA0C,CAAA;AACtD,YAAA;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,IAAI,0DAAmD,CAAA;AAE/D,UAAA,IAAI;AAEF,YAAA,MAAM,EAAE,eAAA,EAAAA,gBAAAA,EAAgB,GAAI,MAAM,OAAO,aAAa,CAAA;AACtD,YAAA,MAAM,SAAA,GAAYA,gBAAAA,CAAgB,IAAA,CAAK,MAAA,CAAO,eAAe,+BAA+B,CAAA;AAC5F,YAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,cAAA,CAAe,SAAA,EAAW;AAAA,cAC5D,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,WAAA;AAAA,cACtC,QAAA,EAAU,MAAA;AAAA,cACV,8BAAA,EAAgC;AAAA,aACjC,EAAE,IAAA,EAAK;AAER,YAAA,IAAI,WAAA,IAAe,YAAY,IAAA,EAAM;AACnC,cAAA,IAAI,WAAA,CAAY,KAAK,GAAA,EAAK;AACxB,gBAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,KAAK,SAAA,CAAU,WAAA,CAAY,KAAK,GAAA,EAAK,CAAC,GAAG,CAAA,KAAe,OAAO,MAAM,QAAA,GAAW,CAAA,CAAE,UAAS,GAAI,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,cAC5I;AACA,cAAA,SAAA,GAAY,IAAA;AACZ,cAAA,OAAA,CAAQ,IAAI,gDAA2C,CAAA;AACvD,cAAA;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AACN,YAAA,OAAA,CAAQ,IAAI,iDAA0C,CAAA;AAAA,UACxD;AAAA,QACF;AAEA,QAAA,QAAA,EAAA;AACA,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,YAAY,CAAC,CAAA;AAC9D,QAAA,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,YAAA,GAAe,GAAA,EAAK,GAAI,CAAA;AAAA,MAElD,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,iBAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,oBAAoB,CAAA,EAAG;AAC1E,UAAA,MAAM,KAAA;AAAA,QACR;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,CAAA,EAAoC,KAAA,CAAgB,OAAO,CAAA;AACvE,QAAA,QAAA,EAAA;AACA,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,WAAW,OAAA,EAAS,YAAA,GAAe,CAAC,CAAC,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AAEd,MAAA,OAAA,CAAQ,IAAI,gEAAyD,CAAA;AACrE,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,eAAA,EAAAA,gBAAAA,EAAgB,GAAI,MAAM,OAAO,aAAa,CAAA;AACtD,QAAA,MAAM,SAAA,GAAYA,gBAAAA,CAAgB,IAAA,CAAK,MAAA,CAAO,eAAe,+BAA+B,CAAA;AAC5F,QAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,cAAA,CAAe,SAAA,EAAW;AAAA,UAC5D,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,WAAA;AAAA,UACtC,QAAA,EAAU,MAAA;AAAA,UACV,8BAAA,EAAgC;AAAA,SACjC,EAAE,IAAA,EAAK;AAER,QAAA,IAAI,WAAA,IAAe,YAAY,IAAA,EAAM;AACnC,UAAA,IAAI,WAAA,CAAY,KAAK,GAAA,EAAK;AACxB,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,KAAK,SAAA,CAAU,WAAA,CAAY,KAAK,GAAA,EAAK,CAAC,GAAG,CAAA,KAAe,OAAO,MAAM,QAAA,GAAW,CAAA,CAAE,UAAS,GAAI,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,UAC5I;AACA,UAAA,OAAA,CAAQ,IAAI,iEAA4D,CAAA;AACxE,UAAA,OAAO,SAAA;AAAA,QACT;AAAA,MACF,SAAS,UAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,GAAA,CAAI,+BAAA,EAA2B,UAAA,CAAqB,OAAO,CAAA;AAAA,MACrE;AAIA,MAAA,OAAA,CAAQ,IAAI,2EAAiE,CAAA;AAC7E,MAAA,OAAA,CAAQ,GAAA,CAAI,sDAAsD,SAAS,CAAA,SAAA,EAAY,KAAK,MAAA,CAAO,OAAA,IAAW,QAAQ,CAAA,CAAE,CAAA;AAIxH,MAAA,OAAO,SAAA;AAAA,IACT;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,MAAc,mBAAA,CACZ,WAAA,EACA,OAAA,EACkB;AAClB,IAAA,MAAM,qBAAA,GAAwB,MAAM,IAAA,CAAK,SAAA,CAAU,kBAAA,EAAmB;AACtE,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,WAAW,qBAAA,CAAsB,SAAA;AAAA,MACjC,sBAAsB,qBAAA,CAAsB;AAAA,KAC9C;AAEA,IAAA,MAAM,kBAAA,GAAqB,IAAA;AAAA,MACzB,wBAAA,CAAyB,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,MACvC,CAAA,EAAA,KAAM,mCAAA,CAAoC,OAAA,CAAQ,CAAC,GAAG,EAAE,CAAA;AAAA,MACxD,CAAA,EAAA,KAAM,2CAAA,CAA4C,eAAA,EAAiB,EAAE,CAAA;AAAA,MACrE,CAAA,EAAA,KAAM,oCAAA,CAAqC,CAAC,WAA2B,GAAG,EAAE;AAAA,KAC9E;AAEA,IAAA,MAAM,iBAAA,GAAoB,MAAM,iCAAA,CAAkC,kBAAkB,CAAA;AACpF,IAAA,MAAM,eAAA,GAAkB,gCAAgC,iBAAoG,CAAA;AAE5J,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,eAAA,EAAiB;AAAA,MACzD,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,MACxB,sBAAA,EAAwB;AAAA,KACzB,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,aAAA,CACZ,YAAA,EACA,OAAA,EACkB;AAClB,IAAA,MAAM,qBAAA,GAAwB,MAAM,IAAA,CAAK,SAAA,CAAU,kBAAA,EAAmB;AACtE,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,WAAW,qBAAA,CAAsB,SAAA;AAAA,MACjC,sBAAsB,qBAAA,CAAsB;AAAA,KAC9C;AAEA,IAAA,MAAM,kBAAA,GAAqB,IAAA;AAAA,MACzB,wBAAA,CAAyB,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,MACvC,CAAA,EAAA,KAAM,mCAAA,CAAoC,OAAA,CAAQ,CAAC,GAAG,EAAE,CAAA;AAAA,MACxD,CAAA,EAAA,KAAM,2CAAA,CAA4C,eAAA,EAAiB,EAAE,CAAA;AAAA,MACrE,CAAA,EAAA,KAAM,oCAAA,CAAqC,YAAA,EAAc,EAAE;AAAA,KAC7D;AAEA,IAAA,MAAM,iBAAA,GAAoB,MAAM,iCAAA,CAAkC,kBAAkB,CAAA;AACpF,IAAA,MAAM,eAAA,GAAkB,gCAAgC,iBAAoG,CAAA;AAE5J,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,eAAA,EAAiB;AAAA,MACzD,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,MACxB,sBAAA,EAAwB;AAAA,KACzB,CAAA;AAAA,EACH;AAAA,EAEQ,wBAAwB,YAAA,EAAsC;AACpE,IAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,IAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,MAAA,SAAA,IAAa,EAAA;AACb,MAAA,SAAA,IAAA,CAAc,WAAA,CAAY,QAAA,EAAU,MAAA,IAAU,CAAA,IAAK,EAAA;AACnD,MAAA,SAAA,IAAc,YAAY,IAAA,CAAoB,MAAA;AAAA,IAChD;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,eAAe,IAAA,EAA2B;AAChD,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,gBAAgB,UAAA,EAAY;AACvD,MAAA,OAAO,IAAI,WAAW,IAAI,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,IAAQ,UAAU,IAAA,EAAM;AAC/D,MAAA,OAAO,MAAA,CAAO,IAAA,CAAM,IAAA,CAA0B,IAAA,EAAM,QAAQ,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA;AAAA,IACnC;AACA,IAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,2BAA2B,OAAA,EASJ;AAG3B,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,KAAK,MAAA,CAAO,SAAA;AAAA,MAC5B,UAAU,EAAC;AAAA,MACX,IAAA,EAAM,IAAI,UAAA,CAAW,CAAC;AAAA;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAA,CAAyB,eAAA,EAA0B,OAAA,EAM5B;AAG3B,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,KAAK,MAAA,CAAO,SAAA;AAAA,MAC5B,UAAU,EAAC;AAAA,MACX,IAAA,EAAM,IAAI,UAAA,CAAW,CAAC;AAAA;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,OAAA,EAMD;AAG3B,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,KAAK,MAAA,CAAO,SAAA;AAAA,MAC5B,UAAU,EAAC;AAAA,MACX,IAAA,EAAM,IAAI,UAAA,CAAW,CAAC;AAAA;AAAA,KACxB;AAAA,EACF;AACF;ACvsBA,IAAM,YAAA,GAA2C;AAAA,EAC/C,SAAA,EAAW,GAAA;AAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA;AAAA,EACX,SAAA,EAAW;AAAA;AACb,CAAA;AAWO,IAAM,eAAN,MAAmB;AAAA,EAChB,YAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EAER,WAAA,CAAY,MAAA,GAAsB,EAAC,EAAG;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,OAAA,EAAS,OAAO,OAAA,IAAW,KAAA;AAAA,MAC3B,OAAA,EAAS,OAAO,OAAA,IAAW,GAAA;AAAA,MAC3B,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB;AAAC,KACxC;AAGA,IAAA,IAAA,CAAK,IAAA,GAAO;AAAA,MACV,SAAA,EAAW,MAAA,CAAO,YAAA,EAAc,SAAA,IAAa,YAAA,CAAa,SAAA;AAAA,MAC1D,SAAA,EAAW,MAAA,CAAO,YAAA,EAAc,SAAA,IAAa,YAAA,CAAa,SAAA;AAAA,MAC1D,SAAA,EAAW,MAAA,CAAO,YAAA,EAAc,SAAA,IAAa,YAAA,CAAa;AAAA,KAC5D;AAGA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,QAAA,CAAS;AAAA,MAC/B,GAAA,EAAK,KAAK,MAAA,CAAO,OAAA;AAAA,MACjB,KAAK,YAAA,CAAa;AAAA;AAAA,KACnB,CAAA;AAGD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS;AAAA,MAC3B,GAAA,EAAK,KAAK,MAAA,CAAO;AAAA,KAClB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAqB;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAA,CACE,OAAA,EACA,UAAA,EACA,WAAA,EACe;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,OAAO,MAAA;AAEjC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAEvC,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAGnB,IAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,KAAA,CAAM,IAAA,GAAO,WAAA,EAAa;AACzD,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,GAAG,CAAA;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAA,CACE,OAAA,EACA,IAAA,EACA,UAAA,EACA,IAAA,EACM;AACN,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAE1B,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AACpC,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,IAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAGA,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,KAAA,EAA8B;AAAA,MACvD,GAAA,EAAK,IAAA,CAAK,IAAA,CAAK,UAAU;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,KAAA,EAAoC;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,OAAO,MAAA;AACjC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,OAAe,GAAA,EAAoB;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAA,CAAkB,SAAkB,UAAA,EAA+B;AACjE,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAE1B,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,aAAa,MAAA,CAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACrD,CAAA,MAAO;AAEJ,MAAC,CAAC,WAAA,EAAa,WAAA,EAAa,WAAW,CAAA,CAAmB,OAAA,CAAQ,CAAC,CAAA,KAAM;AACxE,QAAA,IAAA,CAAK,aAAa,MAAA,CAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAC5C,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,GAGE;AACA,IAAA,OAAO;AAAA,MACL,YAAA,EAAc;AAAA,QACZ,IAAA,EAAM,KAAK,YAAA,CAAa,IAAA;AAAA,QACxB,GAAA,EAAK,KAAK,MAAA,CAAO;AAAA,OACnB;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,QACpB,GAAA,EAAK,KAAK,MAAA,CAAO;AAAA;AACnB,KACF;AAAA,EACF;AACF;;;ACnNO,IAAe,aAAf,MAA0B;AAAA,EACrB,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACF,UAAA,GAAa,KAAA;AAAA,EAErB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,kBAAA,CAAmB,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA;AAEjD,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,QAAQ,WAAA,EAAY;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,OAAA,CACd,eAAA,EACA,iBAAA,EACA,OAAA,EACiB;AACjB,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA;AAAA,MAClB,eAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,kBAAA,CACd,eAAA,EACA,iBAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA;AAAA,MAClB,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,OAAA;AAAA,MACA,EAAE,eAAe,IAAA;AAAK,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,YAAA,CACd,SAAA,EACA,kBAAA,EACA,OAAA,EACoB;AACpB,IAAA,OAAO,KAAK,OAAA,CAAQ,YAAA;AAAA,MAClB,SAAA;AAAA,MACA,kBAAA,CAAmB,IAAI,CAAA,MAAA,KAAU,MAAM,QAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAAA,MAChE;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,QAAA,CACd,eAAA,EACA,iBAAA,EACA,OAAA,EACkB;AAClB,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA;AAAA,MAClB,eAAA;AAAA,MACA,MAAM,OAAA,CAAQ,OAAA,CAAQ,iBAAA,EAAmB,CAAA;AAAA,MACzC,OAAA;AAAA,MACA,EAAE,UAAU,IAAA;AAAK,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAA,CACX,eAAA,EACA,iBAAA,EACA,OAAA,EACkB;AAClB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,eAAA,EAAiB,iBAAA,EAAmB,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,aACd,kBAAA,EACiB;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,kBAAkB,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,eAAA,EACA,iBAAA,EACiB;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,CAAC,iBAAiB,CAAC,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,eAAA,EACA,iBAAA,EACiB;AACjB,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA,CAAQ,eAAA,EAAiB,CAAC,iBAAiB,CAAC,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,eAAA,EACA,iBAAA,EACkB;AAClB,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA,CAAM,eAAA,EAAiB,CAAC,iBAAiB,CAAC,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,UAAA,CACd,OAAA,EACA,iBAAA,EACmB;AAEnB,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,EAAU,EAAG;AACjC,MAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,UAAA,CAAc,OAAA,EAAS,KAAK,UAAU,CAAA;AACvE,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,CAAA,YAAA,EAAe,OAAO,CAAA,CAAE,CAAA;AAC1C,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAc,SAAS,iBAAiB,CAAA;AAG3E,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,EAAU,IAAK,YAAY,IAAA,EAAM;AAErD,MAAA,MAAM,IAAA,GAAO,CAAA;AACb,MAAA,IAAA,CAAK,aAAa,UAAA,CAAW,OAAA,EAAS,OAAA,EAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AACpE,MAAA,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,CAAA,YAAA,EAAe,OAAO,CAAA,CAAE,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,WAAA,CACd,SAAA,EACA,iBAAA,EACuB;AACvB,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,SAAA,EAAU,EAAG;AAElC,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAe,SAAA,EAAW,iBAAiB,CAAA;AAAA,IACjE;AAGA,IAAA,MAAM,OAAA,GAAwB,IAAI,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA;AACxD,IAAA,MAAM,kBAA4B,EAAC;AACnC,IAAA,MAAM,oBAA+B,EAAC;AAEtC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,MAAA,GAAS,KAAK,YAAA,CAAa,UAAA,CAAc,UAAU,CAAC,CAAA,EAAG,KAAK,UAAU,CAAA;AAC5E,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,MAAA;AACb,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,YAAA,EAAe,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MACjD,CAAA,MAAO;AACL,QAAA,eAAA,CAAgB,KAAK,CAAC,CAAA;AACtB,QAAA,iBAAA,CAAkB,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,MACrC;AAAA,IACF;AAGA,IAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA,sBAAA,EAAyB,iBAAA,CAAkB,MAAM,CAAA,CAAA,EAAI,SAAA,CAAU,MAAM,CAAA,SAAA,CAAW,CAAA;AAClG,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAe,mBAAmB,iBAAiB,CAAA;AAGtF,MAAA,MAAM,IAAA,GAAO,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,QAAA,MAAM,aAAA,GAAgB,gBAAgB,CAAC,CAAA;AACvC,QAAA,MAAM,OAAA,GAAU,QAAQ,CAAC,CAAA;AACzB,QAAA,OAAA,CAAQ,aAAa,CAAA,GAAI,OAAA;AAEzB,QAAA,IAAI,YAAY,IAAA,EAAM;AACpB,UAAA,IAAA,CAAK,YAAA,CAAa,WAAW,iBAAA,CAAkB,CAAC,GAAG,OAAA,EAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,kBAAA,CACd,iBAAA,EACA,OAAA,EAC0C;AAC1C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAsB,iBAAA,EAAmB,OAAO,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAc,SAAA,GAAqB;AACjC,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKO,YAAA,GAAwB;AAC7B,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAc,UAAA,GAAa;AACzB,IAAA,OAAO,IAAA,CAAK,OAAO,UAAA,IAAc,WAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKO,aAAA,GAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,OAAO,UAAA,IAAc,WAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKO,gBAAgB,OAAA,EAAwB;AAC7C,IAAA,IAAA,CAAK,YAAA,CAAa,kBAAkB,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAE,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKO,UAAA,GAAmB;AACxB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,kCAAkC,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKO,aAAA,GAAgB;AACrB,IAAA,OAAO,IAAA,CAAK,aAAa,QAAA,EAAS;AAAA,EACpC;AACF;;;ACjRO,IAAM,mBAAA,GAAkC;AAAA,EAC7C,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,QAAA,EAAU;AAAA,IACR,8BAAA;AAAA,IACA,iBAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,WAAA,EAAa,IAAA;AAAA,EACb,aAAA,EAAe,GAAA;AAAA;AAAA,EACf,UAAA,EAAY,CAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,WAAA,EAAa,IAAA;AAAA,EACb,QAAA,EAAU;AAAA;AACZ;AAKO,IAAM,YAAN,MAAgB;AAAA,EACd,MAAA;AAAA,EAEP,YAAY,MAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,UAAA,CAAW,MAAM,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,QAAA,EAQA,OAAA,EAC+B;AAC/B,IAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU;AAAA,MAClC,GAAG,QAAA;AAAA,MACH,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,YAAA,EAAc,gBAAA,EAAkB;AAAA,MAC9D,QAAA,EAAU,CAAA,MAAA,EAAS,QAAA,CAAS,OAAA,IAAW,UAAU,CAAA,KAAA,CAAA;AAAA,MACjD,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,gBAAA;AAAA,QACN,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,MAAM,QAAA,CAAS;AAAA,OACjB;AAAA,MACA,WAAA,EAAa,kBAAA;AAAA,MACb,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,OAAA,EAQA,OAAA,EAC+B;AAC/B,IAAA,MAAM,WAAA,GAAc,KAAK,SAAA,CAAU;AAAA,MACjC,GAAG,OAAA;AAAA,MACH,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,iBAAA,EAAmB;AAAA,MAC9D,QAAA,EAAU,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA,KAAA,CAAA;AAAA,MAC/B,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,iBAAA;AAAA,QACN,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,WAAA,EAAa,QAAQ,WAAA,IAAe;AAAA,OACtC;AAAA,MACA,WAAA,EAAa,kBAAA;AAAA,MACb,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,WAAA,EACA,QAAA,EACA,aACA,OAAA,EAC+B;AAC/B,IAAA,MAAM,OAAA,GAAU,OAAO,WAAA,KAAgB,QAAA,GAAW,cAAc,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,WAAW,CAAA;AAEpG,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,OAAA,EAAS,iBAAA,EAAmB;AAAA,MAC1D,QAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,iBAAA;AAAA,QACN,gBAAA,EAAkB,QAAA;AAAA,QAClB,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,GAAA,EAQzB;AACD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,CAAO,gBAAgB,GAAG,CAAA;AACrD,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAE1C,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO,MAAA;AAAA,EAST;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,GAAA,EAM1B;AACD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,CAAO,gBAAgB,GAAG,CAAA;AACrD,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAE1C,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AAEA,IAAA,OAAO,MAAA;AAAA,EAOT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,KAAA,EAMsD;AACtD,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC5B,KAAA,CAAM,GAAA;AAAA,QAAI,UACR,IAAA,CAAK,MAAA,CAAO,aAAa,IAAA,CAAK,OAAA,EAAS,KAAK,IAAA,EAAM;AAAA,UAChD,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,GAAG,IAAA,CAAK;AAAA,SACT;AAAA;AACH,KACF;AAEA,IAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,MAAA,KAAU;AAC3B,MAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,MAAM,MAAA,CAAO;AAAA,SACf;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,eAAA;AAAA,UACP,OAAA,EAAS,OAAO,MAAA,YAAkB,KAAA,GAAQ,OAAO,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,MAAM;AAAA,SACxF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAA,EAAqD;AACpE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,IAAI,CAAA;AACzC,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,MAAM,MAAA,CAAO;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,GAAA,EAAsB;AAC9B,IAAA,OAAO,GAAA,CAAI,WAAW,SAAS,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,GAAA,EAA4B;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,EAAG;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,MAAc,QAAA,EAA+B;AAC1D,IAAA,MAAM,eAAA,GAAkB,QAAA,IAAY,mBAAA,CAAoB,QAAA,IAAY,EAAC;AACrE,IAAA,OAAO,gBAAgB,GAAA,CAAI,CAAA,OAAA,KAAW,GAAG,OAAO,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,IAAA,EAAuB;AAErC,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI,OAAO,KAAA;AAG7B,IAAA,IAAI,KAAK,UAAA,CAAW,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,EAAA,EAAI;AAC/C,MAAA,OAAO,qBAAA,CAAsB,KAAK,IAAI,CAAA;AAAA,IACxC;AAGA,IAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAI;AACpB,MAAA,OAAO,gBAAA,CAAiB,KAAK,IAAI,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,SAAiB,SAAA,EAA6B;AAC1D,IAAA,MAAM,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AAC/C,IAAA,MAAM,aAAA,GAAgB,SAAA,IAAa,mBAAA,CAAoB,aAAA,IAAiB,GAAA;AACxE,IAAA,OAAO,IAAA,GAAO,aAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAA,EAAqE;AACzF,IAAA,IAAI;AAEF,MAAA,IAAI,OAAO,sBAAsB,WAAA,EAAa;AAC5C,QAAA,MAAM,gBAAA,GAAmB,IAAI,iBAAA,CAAkB,MAAM,CAAA;AACrD,QAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,QAAA,CAAS,SAAA,EAAU;AACnD,QAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,QAAA,CAAS,SAAA,EAAU;AAGnD,QAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAGpC,QAAA,MAAM,YAAA,GAAe,OAAO,KAAA,CAAM,KAAK,EAAE,IAAA,CAAK,MAAM,MAAA,CAAO,KAAA,EAAO,CAAA;AAClE,QAAA,MAAM,SAAuB,EAAC;AAG9B,QAAA,MAAM,iBAAiB,YAA2B;AAChD,UAAA,MAAM,MAAA,GAAgD,MAAM,MAAA,CAAO,IAAA,EAAK;AACxE,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAA;AACxB,UAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,YAAA,MAAA,CAAO,KAAK,KAAmB,CAAA;AAC/B,YAAA,MAAM,cAAA,EAAe;AAAA,UACvB;AAAA,QACF,CAAA;AAEA,QAAA,MAAM,QAAQ,GAAA,CAAI,CAAC,YAAA,EAAc,cAAA,EAAgB,CAAC,CAAA;AAGlD,QAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACvE,QAAA,MAAM,cAAA,GAAiB,IAAI,UAAA,CAAW,WAAW,CAAA;AACjD,QAAA,IAAI,MAAA,GAAS,CAAA;AAEb,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,cAAA,CAAe,GAAA,CAAI,OAAO,MAAM,CAAA;AAChC,UAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,QAClB;AAGA,QAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,SAAS,QAAQ,CAAA;AAEhE,QAAA,OAAO;AAAA,UACL,UAAA;AAAA,UACA,SAAA,EAAW;AAAA,SACb;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,OAAA,CAAQ,KAAK,qEAAqE,CAAA;AAClF,QAAA,OAAO;AAAA,UACL,UAAA,EAAY,OAAA;AAAA,UACZ,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,qDAAqD,KAAK,CAAA;AACvE,MAAA,OAAO;AAAA,QACL,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,UAAA,EAAoB,SAAA,EAAoC;AAC9E,IAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,cAAc,MAAA,EAAQ;AAExB,QAAA,IAAI,OAAO,wBAAwB,WAAA,EAAa;AAC9C,UAAA,MAAM,kBAAA,GAAqB,IAAI,mBAAA,CAAoB,MAAM,CAAA;AACzD,UAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,QAAA,CAAS,SAAA,EAAU;AACrD,UAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,QAAA,CAAS,SAAA,EAAU;AAGrD,UAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAGvD,UAAA,MAAM,YAAA,GAAe,OAAO,KAAA,CAAM,cAAc,EAAE,IAAA,CAAK,MAAM,MAAA,CAAO,KAAA,EAAO,CAAA;AAC3E,UAAA,MAAM,SAAuB,EAAC;AAG9B,UAAA,MAAM,mBAAmB,YAA2B;AAClD,YAAA,MAAM,MAAA,GAAgD,MAAM,MAAA,CAAO,IAAA,EAAK;AAC1E,YAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAA;AACtB,YAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,cAAA,MAAA,CAAO,KAAK,KAAmB,CAAA;AAC/B,cAAA,MAAM,gBAAA,EAAiB;AAAA,YACzB;AAAA,UACF,CAAA;AAEA,UAAA,MAAM,QAAQ,GAAA,CAAI,CAAC,YAAA,EAAc,gBAAA,EAAkB,CAAC,CAAA;AAGpD,UAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACvE,UAAA,MAAM,gBAAA,GAAmB,IAAI,UAAA,CAAW,WAAW,CAAA;AACnD,UAAA,IAAI,MAAA,GAAS,CAAA;AAEb,UAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,YAAA,gBAAA,CAAiB,GAAA,CAAI,OAAO,MAAM,CAAA;AAClC,YAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,UAClB;AAGA,UAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,UAAA,OAAO,OAAA,CAAQ,OAAO,gBAAgB,CAAA;AAAA,QAExC,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,KAAK,4EAA4E,CAAA;AACzF,UAAA,OAAO,UAAA;AAAA,QACT;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,SAAS,CAAA,CAAE,CAAA;AAC1D,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,oDAAoD,KAAK,CAAA;AACvE,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAGE;AACA,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,aAAA,EAAc;AAAA,MACtC,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,EACzB;AACF;AAKO,SAAS,gBAAgB,MAAA,EAAyC;AACvE,EAAA,MAAM,WAAA,GAA0B;AAAA,IAC9B,GAAG,mBAAA;AAAA,IACH,GAAG,MAAA;AAAA,IACH,QAAA,EAAU;AAAA,MACR,GAAG,mBAAA,CAAoB,QAAA;AAAA,MACvB,GAAG,MAAA,EAAQ;AAAA;AACb,GACF;AAEA,EAAA,OAAO,IAAI,UAAU,WAAW,CAAA;AAClC;AAKO,SAAS,sBAAA,CACd,SACA,OAAA,EAKmB;AACnB,EAAA,IAAI,OAAA,EAAS,aAAa,OAAO,QAAA;AACjC,EAAA,IAAI,OAAA,EAAS,WAAW,OAAO,MAAA;AAE/B,EAAA,MAAM,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,aAAA,IAAiB,mBAAA,CAAoB,aAAA,IAAiB,GAAA;AAEjF,EAAA,OAAO,IAAA,GAAO,YAAY,MAAA,GAAS,QAAA;AACrC;AAKA,eAAsB,iBAAA,CACpB,QAAA,EACA,SAAA,EACA,OAAA,EAKiB;AACjB,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,uBAAuB,YAAA,EAAc;AAAA,IACzD,WAAW,OAAA,EAAS;AAAA,GACrB,CAAA;AAED,EAAA,IAAI,aAAA,KAAkB,QAAA,IAAY,CAAC,SAAA,EAAW;AAE5C,IAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,QAAQ,CAAA;AAC3D,IAAA,OAAO,gCAAgC,OAAO,CAAA,CAAA;AAAA,EAChD,CAAA,MAAO;AAEL,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,MAAA,CAAO,YAAA;AAAA,MACpC,YAAA;AAAA,MACA,SAAS,IAAA,IAAQ,QAAA;AAAA,MACjB;AAAA,QACE,UAAU,OAAA,EAAS,QAAA;AAAA,QACnB,WAAA,EAAa;AAAA;AACf,KACF;AACA,IAAA,OAAO,MAAA,CAAO,GAAA;AAAA,EAChB;AACF;;;ACleO,IAAM,WAAA,GAAN,cAA0B,UAAA,CAAW;AAAA,EAClC,SAAA,GAAuD,IAAA;AAAA,EAE/D,YAAY,MAAA,EAAwD;AAClE,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,IAAA,CAAK,SAAA,GAAY,eAAA,CAAgB,MAAA,CAAO,UAAU,CAAA;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,MAAA,EAA2B,MAAA,EAQtB;AAClB,IAAA,MAAM,eAAe,MAAA,CAAO,YAAA,IAAA,CAAA;AAC5B,IAAA,MAAM,iBAAiB,YAAY;AACjC,MAAA,MAAM,eAAe,MAAM,IAAA,CAAK,eAAe,MAAA,CAAO,OAAA,EAAS,OAAO,OAAO,CAAA;AAC7E,MAAA,MAAM,EAAA,GAAK,MAAM,gCAAA,CAAiC;AAAA,QAChD,YAAA;AAAA,QACA,MAAA;AAAA,QACA,eAAe,IAAA,CAAK,eAAA;AAAA,QACpB,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB;AAAA,OACD,CAAA;AAED,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,aAAa,MAAM;AAGvB,MAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,CAAC,CAAA;AACjC,MAAA,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA;AACd,MAAA,IAAI,QAAA,CAAS,SAAS,MAAM,CAAA,CAAE,UAAU,CAAA,EAAG,GAAA,GAAM,MAAM,IAAI,CAAA;AAE3D,MAAA,OAAO;AAAA,QACL,cAAA,EAAgB,6CAAA;AAAA,QAChB,UAAU,EAAC;AAAA,QACX,IAAA,EAAM;AAAA,OACR;AAAA,IACF,CAAA;AAGA,IAAA,IAAA,CAAK,KAAA,EAAM;AAGX,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,OAAA,CAAQ,IAAI,8DAAiE,CAAA;AAC7E,MAAA,OAAO,KAAK,OAAA,CAAQ,YAAA;AAAA,QAClB,eAAA;AAAA,QACA,CAAC,YAAY,cAAc,CAAA;AAAA,QAC3B,CAAC,MAAM,CAAA;AAAA,QACP,EAAE,QAAA,EAAU,KAAA,EAAO,aAAA,EAAe,IAAA;AAAK,OACzC;AAAA,IACF;AAEA,IAAA,OAAO,KAAK,OAAA,CAAQ,YAAA;AAAA,MAClB,eAAA;AAAA,MACA,CAAC,YAAY,cAAc,CAAA;AAAA,MAC3B,CAAC,MAAM;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAA,CAAmB,MAAA,EAA2B,MAAA,EAShC;AAClB,IAAA,MAAM,oBAAoB,YAAY;AAEpC,MAAA,MAAM,aAAa,MAAA,CAAO,UAAA,IAAc,MAAM,IAAA,CAAK,mBAAA,CAAoB,OAAO,OAAO,CAAA;AAErF,MAAA,MAAM,MAAA,GAAS,MAAM,0CAAA,CAA2C;AAAA,QAC9D,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,aAAA,EAAe,UAAA;AAAA;AAAA,QACf,MAAA;AAAA,QACA,eAAe,IAAA,CAAK,eAAA;AAAA,QACpB,oBAAoB,IAAA,CAAK,oBAAA;AAAA,QACzB,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,cAAc,MAAA,CAAO,YAAA,IAAA,CAAA;AAAA,QACrB,UAAA,EAAY;AAAA;AAAA,OACb,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,yBAAA;AAAA,MACA,iBAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,MAAA,EAA2B,MAAA,EAQpB;AAClB,IAAA,MAAM,oBAAoB,MAAM;AAC9B,MAAA,MAAM,SAAS,yBAAA,CAA0B;AAAA,QACvC,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,MAAA;AAAA,QACA,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,IAAA,EAAM,OAAO,IAAA,IAAQ,IAAA;AAAA,QACrB,WAAA,EAAa,OAAO,WAAA,IAAe,IAAA;AAAA,QACnC,cAAc,MAAA,CAAO,YAAA,IAAA,CAAA;AAAA,OACtB,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,MAAA,EAA2B,MAAA,EAMpB;AAClB,IAAA,MAAM,oBAAoB,YAAY;AACpC,MAAA,MAAM,MAAA,GAAS,MAAM,8BAAA,CAA+B;AAAA,QAClD,OAAO,MAAA,CAAO,YAAA;AAAA,QACd,QAAA,EAAU,MAAA;AAAA,QACV,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,iBAAiB,MAAA,CAAO,eAAA;AAAA,QACxB,uBAAuB,MAAA,CAAO,qBAAA;AAAA,QAC9B,YAAY,MAAA,CAAO;AAAA,OACpB,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,MAAA,EAA2B,MAAA,EAGxB;AAClB,IAAA,MAAM,oBAAoB,MAAM;AAC9B,MAAA,MAAM,SAAS,6BAAA,CAA8B;AAAA,QAC3C,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,MAAA;AAAA,QACA,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,MAAA,EAA2B,MAAA,EAGtB;AAClB,IAAA,MAAM,oBAAoB,MAAM;AAC9B,MAAA,MAAM,SAAS,2BAAA,CAA4B;AAAA,QACzC,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,MAAA;AAAA,QACA,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAA,EAAyC;AAC7D,IAAA,OAAO,KAAA,CAAM,UAAA,CAAkB,OAAA,EAAS,iBAAiB,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAA6D;AACjE,IAAA,OAAO,IAAA,CAAK,mBAA0B,iBAAiB,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,SAAA,EAAiE;AACrF,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAChC,IAAA,SAAA,CAAU,UAAA,CAAW,WAAW,CAAC,CAAA;AAEjC,IAAA,MAAM,UAAU,CAAC;AAAA,MACf,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA;AAAA,QAChB,KAAA,EAAO,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA;AAAA,QAClC,QAAA,EAAU;AAAA;AACZ,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,kBAAA,CAA0B,iBAAA,EAAmB,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAA,EAAkE;AACpF,IAAA,MAAM,UAAU,CAAC;AAAA,MACf,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA;AAAA,QAChB,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,kBAAA,CAA0B,iBAAA,EAAmB,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,cAAA,CACJ,SAAA,EACA,UAAA,EAC2B;AAE3B,IAAA,OAAO,KAAA,CAAM,WAAA,CAAmB,SAAA,EAAW,iBAAiB,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,sBAAA,CACJ,SAAA,EACA,UAAA,EACsD;AACtD,IAAA,MAAM,EAAE,wBAAA,EAAyB,GAAI,MAAM,OAAO,gCAAiC,CAAA;AACnF,IAAA,OAAO,wBAAA;AAAA,MACL,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,SAAA;AAAA,MACA,EAAE,UAAA;AAAW,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,oBAAA,CACJ,SAAA,EACA,MAAA,EACc;AACd,IAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,gCAAiC,CAAA;AACzE,IAAA,OAAO,cAAA;AAAA,MACL,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,cAAA,CAAe,OAAA,EAAiB,KAAA,EAAkC;AAE9E,IAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,mBAAoB,CAAA;AAC5D,IAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,cAAA,CAAe,EAAE,cAAA,EAAgB,IAAA,CAAK,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,CAAA;AACzF,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,sBAAsB,KAAA,EAAkC;AAEpE,IAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,MAAM,OAAO,mBAAoB,CAAA;AACnE,IAAA,OAAO,qBAAA,CAAsB,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAAA,EACpD;AAAA,EAEA,MAAc,oBAAoB,KAAA,EAAkC;AAClE,IAAA,MAAM,EAAE,0BAAAC,yBAAAA,EAA0B,iBAAA,EAAAC,oBAAkB,GAAI,MAAM,OAAO,mBAAmB,CAAA;AACxF,IAAA,MAAM,iBAAiBA,kBAAAA,EAAkB;AACzC,IAAA,MAAM,UAAA,GAAa,cAAA,CAAe,MAAA,CAAO,KAAK,CAAA;AAG9C,IAAA,MAAM,CAAC,GAAG,CAAA,GAAI,MAAMD,yBAAAA,CAAyB;AAAA,MAC3C,gBAAgB,IAAA,CAAK,SAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,mBAAmB,CAAA;AAAA,QAC5C;AAAA;AACF,KACD,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAY,eAAA,GAA2B;AACrC,IAAA,OAAO,sBAAA;AAAA,EACT;AAAA,EAEA,IAAY,oBAAA,GAAgC;AAC1C,IAAA,OAAO,6CAAA;AAAA,EACT;AACF;;;AC3WO,IAAM,gBAAA,GAAN,cAA+B,UAAA,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW/C,2CAA2C,MAAA,EAQxC;AACD,IAAA,OAAO,gDAAgD,MAAM,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAe,MAAA,EAOD;AAClB,IAAA,MAAM,kBAAkB,IAAA,CAAK,iBAAA,CAAkB,OAAO,MAAA,CAAO,OAAA,EAAS,OAAO,KAAK,CAAA;AAElF,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,0CAAA,CAA2C;AAAA,MACxE,QAAA,EAAU,eAAA;AAAA,MACV,UAAU,MAAA,CAAO,MAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,EAAE,IAAA,EAAM,OAAO,YAAA,EAAc,IAAA,EAAM,EAAC,EAAE;AAAA,MACpD,eAAA,EAAiB;AAAA,QACf,cAAc,EAAC;AAAA,QACf,UAAU,EAAC;AAAA,QACX,aAAA,EAAe,eAAA;AAAA,QACf,YAAA,EAAc,MAAA,CAAO,MAAA,CAAO,cAAA,IAAkB,CAAC;AAAA,OACjD;AAAA,MACA,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK;AAAA,KAC9B,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,QAAQ,gBAAA,EAAkB,MAAM,aAAa,CAAC,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAY,OAAA,EAAsD;AACtE,IAAA,OAAO,KAAA,CAAM,UAAA,CAA+B,OAAA,EAAS,8BAA8B,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAAgF;AAEpF,IAAA,OAAO,IAAA,CAAK,mBAAuC,8BAA8B,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,QAAA,EAA8E;AACzG,IAAA,MAAM,UAAU,CAAC;AAAA,MACf,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA;AAAA,QAChB,KAAA,EAAO,QAAA;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAuC,8BAAA,EAAgC,OAAO,CAAA;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,OAAA,EAAgI;AAEzJ,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,kBAAA,CAAuC,8BAA8B,CAAA;AAGrG,IAAA,OAAO,YAAA,CAAa,OAAO,CAAA,SAAA,KAAa;AAGtC,MAAA,OAAO,aAAa,MAAA,GAAS,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAOQ,iBAAA,CAAkB,UAAmB,KAAA,EAAwB;AAEnE,IAAA,OAAO,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,EACtC;AACF;;;AC9IO,IAAM,cAAA,GAAN,cAA6B,UAAA,CAAW;AAAA;AAAA;AAAA;AAAA,EAI7C,MAAM,eAAe,MAAA,EAA+C;AAElE,IAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,MAAA,EAAiD;AAEpE,IAAA,MAAM,WAAA,GAAc,MAAM,+CAAA,CAAgD;AAAA,MACxE,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,iBAAiB,MAAA,CAAO;AAAA,KAC1B,EAAG,EAAE,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AAErC,IAAA,OAAO,IAAA,CAAK,QAAQ,gBAAA,EAAkB,MAAM,aAAa,CAAC,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,MAAA,EAAgD;AAGpE,IAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,EACnF;AACF;;;ACpDO,IAAM,iBAAA,GAAoB,cAAA;AAU1B,IAAK,sBAAA,qBAAAE,uBAAAA,KAAL;AAEL,EAAAA,wBAAA,4BAAA,CAAA,GAA6B,4BAAA;AAE7B,EAAAA,wBAAA,2BAAA,CAAA,GAA4B,2BAAA;AAE5B,EAAAA,wBAAA,mCAAA,CAAA,GAAoC,mCAAA;AAN1B,EAAA,OAAAA,uBAAAA;AAAA,CAAA,EAAA,sBAAA,IAAA,EAAA;AAYL,IAAK,wBAAA,qBAAAC,yBAAAA,KAAL;AAEL,EAAAA,0BAAA,gBAAA,CAAA,GAAiB,gBAAA;AAEjB,EAAAA,0BAAA,iBAAA,CAAA,GAAkB,iBAAA;AAElB,EAAAA,0BAAA,cAAA,CAAA,GAAe,cAAA;AAEf,EAAAA,0BAAA,sBAAA,CAAA,GAAuB,sBAAA;AAEvB,EAAAA,0BAAA,sBAAA,CAAA,GAAuB,sBAAA;AAVb,EAAA,OAAAA,yBAAAA;AAAA,CAAA,EAAA,wBAAA,IAAA,EAAA;AAgBL,IAAK,mBAAA,qBAAAC,oBAAAA,KAAL;AAEL,EAAAA,qBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAEjB,EAAAA,qBAAA,kBAAA,CAAA,GAAmB,kBAAA;AAEnB,EAAAA,qBAAA,sBAAA,CAAA,GAAuB,sBAAA;AAEvB,EAAAA,qBAAA,eAAA,CAAA,GAAgB,eAAA;AAEhB,EAAAA,qBAAA,QAAA,CAAA,GAAS,QAAA;AAVC,EAAA,OAAAA,oBAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA;AAwNL,IAAK,QAAA,qBAAAC,SAAAA,KAAL;AACL,EAAAA,UAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,UAAA,4BAAA,CAAA,GAA6B,4BAAA;AAC7B,EAAAA,UAAA,yBAAA,CAAA,GAA0B,yBAAA;AAC1B,EAAAA,UAAA,mBAAA,CAAA,GAAoB,mBAAA;AACpB,EAAAA,UAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,UAAA,gBAAA,CAAA,GAAiB,gBAAA;AACjB,EAAAA,UAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,UAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,UAAA,0BAAA,CAAA,GAA2B,0BAAA;AAC3B,EAAAA,UAAA,gBAAA,CAAA,GAAiB,gBAAA;AAVP,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAgBL,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,IAAA;AAAA,EAEA,WAAA,CAAY,MAAgB,OAAA,EAAkB;AAC5C,IAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;ACzQA,eAAsB,oBAAA,CACpB,WACA,UAAA,EAC4B;AAC5B,EAAA,MAAM,CAAC,OAAA,EAAS,IAAI,CAAA,GAAI,MAAM,wBAAA,CAAyB;AAAA,IACrD,cAAA,EAAgB,SAAA;AAAA,IAChB,KAAA,EAAO;AAAA,MACL,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,iBAAiB,CAAA;AAAA,MAC1C,iBAAA,EAAkB,CAAE,MAAA,CAAO,UAAU;AAAA;AACvC,GACD,CAAA;AACD,EAAA,OAAO,CAAC,SAAS,IAAI,CAAA;AACvB;AAmBO,SAAS,iBAAA,CACd,SACA,MAAA,EACQ;AAER,EAAA,MAAM,iBAAA,GAAoB,OAAA,KAAY,SAAA,GAAY,cAAA,GAAiB,OAAA;AACnE,EAAA,OAAO,CAAA,QAAA,EAAW,iBAAiB,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAA,CAAA;AAC1D;AAiBO,SAAS,kBAAkB,GAAA,EAAmB;AAEnD,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,aAAA;AAAA,MAAA,kBAAA;AAAA,MAER;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAG3B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,aAAA;AAAA,MAAA,kBAAA;AAAA,MAER;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,cAAA,EAAgB,QAAA,EAAU,WAAW,UAAU,CAAA;AACtE,EAAA,IAAI,CAAC,aAAA,CAAc,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,aAAA;AAAA,MAAA,kBAAA;AAAA,MAER,CAAA,iBAAA,EAAoB,MAAM,CAAC,CAAC,sBAAsB,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC5E;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,aAAA;AAAA,MAAA,kBAAA;AAAA,MAER;AAAA,KACF;AAAA,EACF;AACF;AAcO,SAAS,eAAe,GAAA,EAI7B;AACA,EAAA,iBAAA,CAAkB,GAAG,CAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAE3B,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IACf,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,IAChB,UAAA,EAAY,MAAM,CAAC;AAAA,GACrB;AACF;AAkBO,SAAS,uBACd,WAAA,EACgB;AAEhB,EAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,mBAAA,CACpC,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,OAAO,CAAA,CACtB,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,IACd,IAAI,CAAA,EAAG,WAAA,CAAY,GAAG,CAAA,CAAA,EAAI,OAAO,EAAE,CAAA,CAAA;AAAA,IACnC,MAAM,MAAA,CAAO,UAAA;AAAA,IACb,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,oBAAoB,MAAA,CAAO;AAAA,GAC7B,CAAE,CAAA;AAGJ,EAAA,MAAM,cAAA,GAAiB,YAAY,mBAAA,CAChC,MAAA,CAAO,OAAK,CAAC,CAAA,CAAE,WAAW,CAAA,CAAE,aAAA,CAAc,+CAAiD,CAAA,CAC3F,IAAI,CAAA,CAAA,KAAK,CAAA,EAAG,YAAY,GAAG,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAGxC,EAAA,MAAM,eAAA,GAAkB,YAAY,mBAAA,CACjC,MAAA,CAAO,OAAK,CAAC,CAAA,CAAE,WAAW,CAAA,CAAE,aAAA,CAAc,iDAAkD,CAAA,CAC5F,IAAI,CAAA,CAAA,KAAK,CAAA,EAAG,YAAY,GAAG,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAGxC,EAAA,MAAM,YAAA,GAAe,YAAY,mBAAA,CAC9B,MAAA,CAAO,OAAK,CAAC,CAAA,CAAE,WAAW,CAAA,CAAE,aAAA,CAAc,2CAA+C,CAAA,CACzF,IAAI,CAAA,CAAA,KAAK,CAAA,EAAG,YAAY,GAAG,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAGxC,EAAA,MAAM,oBAAA,GAAuB,YAAY,mBAAA,CACtC,MAAA,CAAO,OAAK,CAAC,CAAA,CAAE,WAAW,CAAA,CAAE,aAAA,CAAc,2DAAuD,CAAA,CACjG,IAAI,CAAA,CAAA,KAAK,CAAA,EAAG,YAAY,GAAG,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAGxC,EAAA,MAAM,oBAAA,GAAuB,YAAY,mBAAA,CACtC,MAAA,CAAO,OAAK,CAAC,CAAA,CAAE,WAAW,CAAA,CAAE,aAAA,CAAc,2DAAuD,CAAA,CACjG,IAAI,CAAA,CAAA,KAAK,CAAA,EAAG,YAAY,GAAG,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAGxC,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,gBAAA,CAAiB,GAAA,CAAI,CAAA,QAAA,MAAa;AAAA,IAC5D,IAAI,CAAA,EAAG,WAAA,CAAY,GAAG,CAAA,CAAA,EAAI,SAAS,EAAE,CAAA,CAAA;AAAA,IACrC,MAAM,QAAA,CAAS,WAAA;AAAA,IACf,iBAAiB,QAAA,CAAS,eAAA;AAAA,IAC1B,WAAA,EAAa,SAAS,WAAA,IAAe;AAAA,GACvC,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,YAAY,WAAA,CAAY,OAAA;AAAA,IACxB,IAAI,WAAA,CAAY,GAAA;AAAA,IAChB,UAAA,EAAY,WAAA,CAAY,UAAA,CAAW,QAAA,EAAS;AAAA,IAC5C,kBAAA;AAAA,IACA,cAAA,EAAgB,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,cAAA,GAAiB,MAAA;AAAA,IAC7D,eAAA,EAAiB,eAAA,CAAgB,MAAA,GAAS,CAAA,GAAI,eAAA,GAAkB,MAAA;AAAA,IAChE,YAAA,EAAc,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,YAAA,GAAe,MAAA;AAAA,IACvD,oBAAA,EAAsB,oBAAA,CAAqB,MAAA,GAAS,CAAA,GAAI,oBAAA,GAAuB,MAAA;AAAA,IAC/E,oBAAA,EAAsB,oBAAA,CAAqB,MAAA,GAAS,CAAA,GAAI,oBAAA,GAAuB,MAAA;AAAA,IAC/E,OAAA,EAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,MAAA;AAAA,IACxC,aAAa,WAAA,CAAY,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,YAAY,WAAA,GAAc;AAAA,GAC9E;AACF;AAeO,SAAS,gCACd,EAAA,EACA,UAAA,EACA,SAAA,EACA,aAAA,GAA4C,uCAAwC,EAChE;AAGpB,EAAA,MAAM,kBAAA,GAAqB,IAAI,SAAS,CAAA,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,UAAA,EAAA,4BAAA;AAAA,IACA,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAAA,IACvC,OAAA,EAAS;AAAA,GACX;AACF;AAWO,SAAS,qBAAA,CACd,EAAA,EACA,WAAA,EACA,eAAA,EACA,cAAc,EAAA,EACG;AACjB,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;AAYO,SAAS,YAAY,WAAA,EAAmC;AAC7D,EAAA,OAAO,CAAC,WAAA,CAAY,WAAA;AACtB;AASO,SAAS,yBAAA,CACd,aACA,YAAA,EACsB;AACtB,EAAA,OAAO,YAAY,mBAAA,CAAoB,MAAA;AAAA,IACrC,OAAK,CAAC,CAAA,CAAE,WAAW,CAAA,CAAE,aAAA,CAAc,SAAS,YAAY;AAAA,GAC1D;AACF;AAUO,SAAS,gBAAA,CACd,WAAA,EACA,SAAA,EACA,YAAA,EACS;AAET,EAAA,IAAI,UAAU,QAAA,EAAS,KAAM,WAAA,CAAY,UAAA,CAAW,UAAS,EAAG;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAA,CAAA,EAAI,SAAA,CAAU,QAAA,EAAU,CAAA,CAAA;AAEhD,EAAA,OAAO,YAAY,mBAAA,CAAoB,IAAA;AAAA,IACrC,CAAA,MAAA,KACE,CAAC,MAAA,CAAO,OAAA,IACR,MAAA,CAAO,uBAAuB,eAAA,IAC9B,MAAA,CAAO,aAAA,CAAc,QAAA,CAAS,YAAY;AAAA,GAC9C;AACF;AAaO,SAAS,iBAAA,CACd,WAAA,EACA,MAAA,GAAS,IAAA,EACD;AACR,EAAA,MAAM,MAAA,GAAS,uBAAuB,WAAW,CAAA;AACjD,EAAA,OAAO,MAAA,GACH,KAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA,GAC9B,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAC3B;AAQO,SAAS,kBAAkB,GAAA,EAAqB;AACrD,EAAA,MAAM,KAAA,GAAQ,eAAe,GAAG,CAAA;AAChC,EAAA,OAAO,KAAA,CAAM,OAAA;AACf;AAQO,SAAS,qBAAqB,GAAA,EAAqB;AACxD,EAAA,MAAM,KAAA,GAAQ,eAAe,GAAG,CAAA;AAChC,EAAA,OAAO,KAAA,CAAM,UAAA;AACf;ACnXA,IAAM,YAAA,GAAe,CAAC,IAAA,KAA6BC,IAAAA,CAAK,OAAO,IAAI,CAAA;AAG5D,IAAM,kBAAA,GAAqB,8CAAA;AAM3B,IAAK,cAAA,qBAAAC,eAAAA,KAAL;AACL,EAAAA,gBAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,gBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,gBAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,gBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,gBAAA,QAAA,CAAA,GAAS,QAAA;AALC,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;AAQL,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,kBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,kBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,kBAAA,SAAA,CAAA,GAAU,SAAA;AAJA,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAmFL,IAAM,mBAAN,MAAuB;AAAA,EACpB,SAAA;AAAA,EACA,SAAA;AAAA,EAER,WAAA,CAAY,SAAA,GAAqB,kBAAA,EAAoB,SAAA,EAAuB;AAC1E,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,SAAA,EAA4B;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,WAAA,EAAkD;AAEhE,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,WAAA,EAAa,OAAO,IAAA,CAAK,WAAW,CAAA,CAAE,IAAA,EAAM,CAAA;AACxE,IAAA,OAAO,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EAC9C;AAAA,EAEA,oBAAA,CAAqB,MAAsB,OAAA,EAAyB;AAClE,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,OAAO,IAAI,SAAS,CAAA,CAAA;AAC7C,IAAA,MAAM,OAAO,MAAA,CAAO,IAAI,aAAY,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AACnD,IAAA,MAAM,YAAY,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAC/C,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,WAAA,EAAa,IAAI,SAAS,CAAA,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAA,CACE,UAAA,EACA,QAAA,EACA,cAAA,EACA,aACA,OAAA,EAIyB;AACzB,IAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,SAAA;AAGpC,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAC3D,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,OAAA,EAAS,UAAA,CAAW,OAAkB,CAAA;AAI3E,IAAA,MAAM,WAAW,CAAA,OAAA,EAAU,IAAA,CAAK,SAAS,CAAA,YAAA,EAAe,WAAW,YAAY,CAAA,CAAA;AAE/E,IAAA,OAAO;AAAA,MACL,UAAA,EAAY;AAAA,QACV,sCAAA;AAAA,QACA,6CAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,MAAM,CAAC,sBAAA,EAAwB,CAAA,UAAA,EAAa,cAAA,CAAe,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,MAC3E,EAAA,EAAI,CAAA,eAAA,EAAkB,UAAA,CAAW,YAAY,CAAA,CAAA;AAAA,MAC7C,MAAA,EAAQ;AAAA,QACN,EAAA,EAAI,SAAA;AAAA,QACJ,IAAA,EAAM;AAAA,OACR;AAAA,MACA,WAAW,IAAI,IAAA,CAAK,WAAW,QAAA,GAAW,GAAI,EAAE,WAAA,EAAY;AAAA,MAC5D,UAAA,EAAY,UAAA,CAAW,SAAA,GACnB,IAAI,IAAA,CAAK,WAAW,SAAA,GAAY,GAAI,CAAA,CAAE,WAAA,EAAY,GAClD,MAAA;AAAA,MACJ,iBAAA,EAAmB;AAAA,QACjB,EAAA,EAAI,UAAA;AAAA,QACJ,GAAG;AAAA,OACL;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,IAAI,cAAA,CAAe,SAAA;AAAA,QACnB,IAAA,EAAM;AAAA,OACR;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,yBAAA;AAAA,QACN,aAAA,EAAe;AAAA,OACjB;AAAA,MACA,eAAA,EAAiB,SAAS,sBAAA,GACtB;AAAA,QACE;AAAA,UACE,IAAI,UAAA,CAAW,cAAA;AAAA,UACf,eAAA,EAAiB,CAAA,GAAA,EAAM,YAAA,CAAa,UAAA,CAAW,eAAe,CAAC,CAAA;AAAA;AACjE,OACF,GACA,MAAA;AAAA,MACJ,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,oBAAA;AAAA,QACN,SAAS,IAAI,IAAA,CAAK,WAAW,QAAA,GAAW,GAAI,EAAE,WAAA,EAAY;AAAA,QAC1D,kBAAA,EAAoB,GAAG,SAAS,CAAA,MAAA,CAAA;AAAA,QAChC,WAAA,EAAa,iBAAA;AAAA,QACb,YAAA,EAAc,iBAAA;AAAA,QACd,UAAA,EAAY,YAAA,CAAa,UAAA,CAAW,SAAS;AAAA;AAC/C,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,uBAAA,CACJ,UAAA,EACA,QAAA,EACA,cAAA,EACA,aACA,OAAA,EAIkC;AAClC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AAEnB,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,QACV,UAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,SAAA;AAGpC,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAG3D,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,OAAA,EAAS,UAAA,CAAW,OAAkB,CAAA;AAG3E,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,SAAS,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAClF,IAAsB,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,WAAW,OAAkB,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI;AAElG,IAAA,MAAM,WAAW,CAAA,OAAA,EAAU,IAAA,CAAK,SAAS,CAAA,YAAA,EAAe,WAAW,YAAY,CAAA,CAAA;AAG/E,IAAA,MAAM,kBAAA,GAAqB,YAAA,EAAc,mBAAA,GAAsB,CAAC,IAC5D,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,YAAA,CAAa,oBAAoB,CAAC,CAAA,CAAE,EAAE,CAAA,CAAA,GACtD,GAAG,SAAS,CAAA,MAAA,CAAA;AAEhB,IAAA,OAAO;AAAA,MACL,UAAA,EAAY;AAAA,QACV,sCAAA;AAAA,QACA,6CAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,MAAM,CAAC,sBAAA,EAAwB,CAAA,UAAA,EAAa,cAAA,CAAe,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,MAC3E,EAAA,EAAI,CAAA,eAAA,EAAkB,UAAA,CAAW,YAAY,CAAA,CAAA;AAAA,MAC7C,MAAA,EAAQ;AAAA,QACN,EAAA,EAAI,SAAA;AAAA,QACJ,IAAA,EAAM;AAAA,OACR;AAAA,MACA,WAAW,IAAI,IAAA,CAAK,WAAW,QAAA,GAAW,GAAI,EAAE,WAAA,EAAY;AAAA,MAC5D,UAAA,EAAY,UAAA,CAAW,SAAA,GACnB,IAAI,IAAA,CAAK,WAAW,SAAA,GAAY,GAAI,CAAA,CAAE,WAAA,EAAY,GAClD,MAAA;AAAA,MACJ,iBAAA,EAAmB;AAAA,QACjB,EAAA,EAAI,UAAA;AAAA,QACJ,GAAG;AAAA,OACL;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,IAAI,cAAA,CAAe,SAAA;AAAA,QACnB,IAAA,EAAM;AAAA,OACR;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,yBAAA;AAAA,QACN,aAAA,EAAe;AAAA,OACjB;AAAA,MACA,eAAA,EAAiB,SAAS,sBAAA,GACtB;AAAA,QACE;AAAA,UACE,IAAI,UAAA,CAAW,cAAA;AAAA,UACf,eAAA,EAAiB,CAAA,GAAA,EAAM,YAAA,CAAa,UAAA,CAAW,eAAe,CAAC,CAAA;AAAA;AACjE,OACF,GACA,MAAA;AAAA,MACJ,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,oBAAA;AAAA,QACN,SAAS,IAAI,IAAA,CAAK,WAAW,QAAA,GAAW,GAAI,EAAE,WAAA,EAAY;AAAA,QAC1D,kBAAA;AAAA,QACA,WAAA,EAAa,iBAAA;AAAA,QACb,YAAA,EAAc,iBAAA;AAAA,QACd,UAAA,EAAY,YAAA,CAAa,UAAA,CAAW,SAAS;AAAA;AAC/C,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,0BAA0B,MAAA,EAU9B;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BA,yBAAyB,MAAA,EAmBvB;AACA,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAGxC,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB,EAAC;AAAA,MACtC,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,WAAA,EAAa,IAAA;AAAA,MACb,oBAAoB,MAAA,CAAO,kBAAA;AAAA,MAC3B,oBAAoB,MAAA,CAAO,kBAAA;AAAA,MAC3B,kBAAkB,MAAA,CAAO,gBAAA;AAAA,MACzB,YAAA,EAAc,GAAA;AAAA,MACd,UAAA,EAAY,GAAA;AAAA,MACZ,IAAA,EAAM,qBAAA;AAAA,MACN,4BAA4B,MAAA,CAAO;AAAA,KACrC;AAGA,IAAA,MAAM,eAAe,IAAA,CAAK,oBAAA;AAAA,MACxB,eAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AAGA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,eAAA,CAAgB,WAAW,CAAA;AAGxD,IAAA,MAAM,UAAA,GAAyB;AAAA,MAC7B,QAAA,EAAU,CAAA,4BAAA,CAAA;AAAA,MACV,SAAS,MAAA,CAAO,YAAA;AAAA,MAChB,QAAQ,IAAA,CAAK,SAAA;AAAA,MACb,YAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA,EAAgB,CAAA,6BAAA,EAAgC,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA;AAAA,MAC3G,MAAA,EAAQ,QAAA;AAAA,MACR,SAAA,EAAW,eAAA;AAAA;AAAA,MACX,QAAA,EAAU;AAAA,KACZ;AAGA,IAAA,MAAM,cAAA,GAAiC;AAAA,MACrC,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,IAAA,EAAM,qBAAA;AAAA,MACN,IAAA,EAAM,eAAA;AAAA,MACN,SAAA,EAAW,2DAAA;AAAA,MACX,WAAA,EAAa,gFAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa,CAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACb;AAGA,IAAA,MAAM,QAAA,GAA+B;AAAA,MACnC,gBAAgB,cAAA,CAAe,SAAA;AAAA,MAC/B,IAAA,EAAM,qBAAA;AAAA,MACN,QAAA,EAAU,wDAAA;AAAA,MACV,QAAQ,IAAA,CAAK,SAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa,CAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACb;AAGA,IAAA,MAAM,gBAAgB,IAAA,CAAK,qBAAA;AAAA,MACzB,UAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,QAAA,EAAU,wBAAwB,IAAA;AAAK,KACtE;AAEA,IAAA,OAAO;AAAA,MACL,YAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAA,CACE,UAAA,EACA,WAAA,EACA,OAAA,EAIQ;AACR,IAAA,MAAM,QAAA,GAA+B;AAAA,MACnC,cAAA,EAAgB,YAAA;AAAA,MAChB,MAAM,UAAA,CAAW,YAAA,CAAa,QAAA,CAAS,eAAe,IAAI,gBAAA,GAAmB,QAAA;AAAA,MAC7E,QAAA,EAAU,mDAAA;AAAA,MACV,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa,CAAA;AAAA,MACb,WAAW,UAAA,CAAW;AAAA,KACxB;AAEA,IAAA,MAAM,cAAA,GAAiC;AAAA,MACrC,WAAW,UAAA,CAAW,MAAA;AAAA,MACtB,IAAA,EAAM,uBAAA;AAAA,MACN,IAAA,EAAM,eAAA;AAAA,MACN,SAAA,EAAW,kDAAA;AAAA,MACX,WAAA,EAAa,kCAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa,CAAA;AAAA,MACb,WAAW,UAAA,CAAW;AAAA,KACxB;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,qBAAA;AAAA,MACf,UAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,EAAE,OAAA,EAAS,OAAA,EAAS,OAAA,IAAW,QAAA,EAAU,wBAAwB,IAAA;AAAK,KACxE;AAEA,IAAA,OAAO,OAAA,EAAS,MAAA,GACZ,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,MAAM,CAAC,CAAA,GAC3B,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,EACxB;AACF;AC1eA,IAAM,uBAAA,GAA0B,mCAAA;AAGhC,IAAM,eAAA,GAAkB,GAAA;AAGxB,IAAM,aAAA,GAAgB,EAAE,QAAA,EAAU,CAAA,EAAG,SAAS,GAAA,EAAK;AAS5C,SAAS,kBAAkB,QAAA,EAA6B;AAC7D,EAAA,OAAO,SAAS,MAAA,KAAW,GAAA;AAC7B;AAKA,eAAsB,2BACpB,QAAA,EACoC;AAEpC,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAG9B,IAAA,IAAI,OAAO,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AACnD,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAGA,IAAA,IAAI,OAAO,mBAAA,IAAuB,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,mBAAmB,CAAA,EAAG;AAC3E,MAAA,OAAO,MAAA,CAAO,mBAAA;AAAA,IAChB;AAGA,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,KAAA,EAAO;AACjC,MAAA,OAAO,CAAC,MAAiC,CAAA;AAAA,IAC3C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,oBAAoB,CAAA;AAC/D,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,aAAa,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,EAAC;AACV;AAwDO,IAAM,WAAA,GAAN,cAA0B,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,eAAwC,EAAC;AAAA,EAE1D,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,cAAA,EAAgB,OAAO,cAAA,IAAkB,uBAAA;AAAA,MACzC,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS,OAAO,OAAA,IAAW,eAAA;AAAA,MAC3B,KAAA,EAAO,OAAO,KAAA,IAAS;AAAA,KACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,KAAA,CAAM,GAAA,EAAa,IAAA,EAAuC;AAC9D,IAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,GAAG,CAAA;AAChC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AAEF,MAAA,IAAI,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAK,IAAI,CAAA;AAGpD,MAAA,IAAI,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AAC/B,QAAA,MAAM,YAAA,GAAe,MAAM,0BAAA,CAA2B,QAAQ,CAAA;AAC9D,QAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,YAAY,CAAA;AAE1C,QAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,UAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,QACpE;AAGA,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,YAAY,CAAA;AACzD,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,QACtD;AAGA,QAAA,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,IAAA,IAAQ,IAAI,WAAW,CAAA;AAAA,MACxE;AAEA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,MAAA,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,GAAA,EAAK,QAAA,CAAS,IAAI,UAAU,CAAA;AAE3D,MAAA,OAAO,QAAA;AAAA,IAET,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,MAAA,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,GAAA,EAAK,KAAA,EAAO,UAAU,CAAA;AAErD,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,MACnC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAA,CACJ,aAAA,EACA,WAAA,EAC6D;AAC7D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA;AAAA,MAC1B,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,OAAA,CAAA;AAAA,MAC7B;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,aAAA;AAAA,UACA,mBAAA,EAAqB;AAAA,SACtB;AAAA;AACH,KACF;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAA,CACJ,aAAA,EACA,WAAA,EACqE;AACrE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA;AAAA,MAC1B,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,OAAA,CAAA;AAAA,MAC7B;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,aAAA;AAAA,UACA,mBAAA,EAAqB;AAAA,SACtB;AAAA;AACH,KACF;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAc,OAAA,EAWjB;AACD,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,SAAS,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,QAAQ,OAAO,CAAA;AAC3D,IAAA,IAAI,SAAS,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,YAAA,EAAc,QAAQ,UAAU,CAAA;AACpE,IAAA,IAAI,OAAA,EAAS,UAAU,MAAA,CAAO,GAAA,CAAI,YAAY,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA;AAEzE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA;AAAA,MAC1B,GAAG,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,MAAA,EAAS,MAAA,CAAO,UAAU,CAAA;AAAA,KACzD;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAAA,GAAqD;AACnD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,YAAY,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,2BAAA,GAAoC;AAClC,IAAA,IAAA,CAAK,aAAa,MAAA,GAAS,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,oBACN,YAAA,EACgC;AAEhC,IAAA,MAAM,eAAe,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,QAAQ,CAAA;AAClE,IAAA,IAAI,cAAc,OAAO,YAAA;AAGzB,IAAA,OAAO,YAAA,CAAa,CAAC,CAAA,IAAK,IAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAA,CACZ,GAAA,EACA,IAAA,EACA,WAAA,EACmB;AACnB,IAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,WAAW,CAAA;AAGxC,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,mBAAA,CAAoB,WAAW,CAAA;AAGhE,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,aAAA,CAAc,eAAe,WAAW,CAAA;AACxE,IAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,YAAA,CAAa,KAAA,IAAS,eAAe,CAAA,CAAE,CAAA;AAAA,IACzF;AAGA,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,aAAA,CAAc,eAAe,WAAW,CAAA;AACtE,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,UAAA,CAAW,KAAA,IAAS,eAAe,CAAA,CAAE,CAAA;AAAA,IACrF;AAEA,IAAA,IAAA,CAAK,KAAK,mBAAA,EAAqB;AAAA,MAC7B,OAAA,EAAS,IAAA;AAAA,MACT,sBAAsB,UAAA,CAAW,WAAA;AAAA,MACjC,SAAA,EAAW,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,KAC7B,CAAA;AAGD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK;AAAA,MAChD,GAAG,IAAA;AAAA,MACH,OAAA,EAAS;AAAA,QACP,GAAG,IAAA,CAAK,OAAA;AAAA,QACR,WAAA,EAAa,aAAA;AAAA,QACb,qBAAA,EAAuB,WAAW,WAAA,IAAe;AAAA;AACnD,KACD,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAGlC,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK;AAAA,QACrB,cAAc,WAAA,CAAY,KAAA;AAAA,QAC1B,kBAAkB,UAAA,CAAW,WAAA;AAAA,QAC7B,MAAA,EAAQ,MAAA,CAAO,WAAA,CAAY,iBAAiB,CAAA;AAAA,QAC5C,SAAS,QAAA,CAAS,EAAA;AAAA,QAClB,cAAA,EAAgB,YAAA;AAAA,QAChB,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,SAAA,IAAa,SAAA;AAAA,QAC/C,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,SAAS,WAAA,CAAY;AAAA,OACtB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,oBACZ,WAAA,EACiB;AACjB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACvB,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AAIA,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,OAAA,EAAS,KAAA;AAAA,MACT,QAAQ,WAAA,CAAY,MAAA;AAAA,MACpB,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,MAC1B,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,QAAQ,WAAA,CAAY,iBAAA;AAAA,MACpB,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,UAAU,WAAA,CAAY,QAAA;AAAA,MACtB,KAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,MAC3B,SAAA,EAAW,CAAA,SAAA,EAAY,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,KACnC;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,GAAA,EACA,IAAA,EACmB;AACnB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,GAAG,IAAA;AAAA,QACH,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AACD,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AACF;AAYO,SAAS,kBAAkB,MAAA,EAAwC;AACxE,EAAA,OAAO,IAAI,YAAY,MAAM,CAAA;AAC/B;AAcA,eAAsB,UAAA,CACpB,GAAA,EACA,MAAA,EACA,IAAA,EACmB;AACnB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AAC/B;;;AC5cA,0BAAA,EAAA;AAkDO,IAAM,gBAAA,GAAN,cAA+B,UAAA,CAAW;AAAA,EACvC,UAAA;AAAA,EACA,SAAA;AAAA,EAER,YAAY,MAAA,EAAyD;AACnE,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,oBAAA,EAAqB;AAC3C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,mBAAA,EAAoB;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAA,CACE,aACA,cAAA,EAC6B;AAE7B,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,mBAAA,CAAoB,WAAA,EAAoB,cAAc,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAA8B;AACxC,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAA,MAAA;AACE,QAAA,OAAO,UAAA;AAAA,MACT,KAAA,QAAA;AACE,QAAA,OAAO,QAAA;AAAA,MACT,KAAA,QAAA;AACE,QAAA,OAAO,QAAA;AAAA,MACT,KAAA,MAAA;AACE,QAAA,OAAO,MAAA;AAAA,MACT,KAAA,UAAA;AACE,QAAA,OAAO,UAAA;AAAA,MACT;AACE,QAAA,OAAO,SAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,KAAA,EAA+B;AAC9C,IAAA,IAAI,KAAA,IAAS,qBAAqB,uBAAA,EAAyB;AACzD,MAAA,OAAA,UAAA;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,IAAS,oBAAA,CAAqB,mBAAA,EAAqB;AAC5D,MAAA,OAAA,MAAA;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,IAAS,oBAAA,CAAqB,qBAAA,EAAuB;AAC9D,MAAA,OAAA,QAAA;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,IAAS,oBAAA,CAAqB,qBAAA,EAAuB;AAC9D,MAAA,OAAA,QAAA;AAAA,IACF;AACA,IAAA,OAAA,MAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,EAA0B;AACrC,IAAA,QAAQ,KAAA;AAAO,MACb,KAAA,UAAA;AACE,QAAA,OAAO,WAAA;AAAA,MACT,KAAA,SAAA;AACE,QAAA,OAAO,SAAA;AAAA,MACT,KAAA,aAAA;AACE,QAAA,OAAO,UAAA;AAAA,MACT,KAAA,cAAA;AACE,QAAA,OAAO,WAAA;AAAA,MACT,KAAA,eAAA;AACE,QAAA,OAAO,gBAAA;AAAA,MACT,KAAA,gBAAA;AACE,QAAA,OAAO,iBAAA;AAAA,MACT,KAAA,iBAAA;AACE,QAAA,OAAO,kBAAA;AAAA,MACT,KAAA,gBAAA;AACE,QAAA,OAAO,iBAAA;AAAA,MACT,KAAA,qBAAA;AACE,QAAA,OAAO,uBAAA;AAAA,MACT;AACE,QAAA,OAAO,eAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,KAAA,EAAuB;AAEvC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAI,CAAA,GAAI,EAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAAA,EAA8B;AACzC,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAA,UAAA;AACE,QAAA,OAAO,SAAA;AAAA;AAAA,MACT,KAAA,MAAA;AACE,QAAA,OAAO,SAAA;AAAA;AAAA,MACT,KAAA,QAAA;AACE,QAAA,OAAO,SAAA;AAAA;AAAA,MACT,KAAA,QAAA;AACE,QAAA,OAAO,SAAA;AAAA;AAAA,MACT;AACE,QAAA,OAAO,SAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,4BAA4B,YAAA,EAAuC;AACjE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,YAAA;AAAA,MACP,YAAA,EAAc,GAAA;AAAA;AAAA,MACd,kBAAA,EAAoB,CAAA;AAAA,MACpB,eAAA,EAAiB,CAAA;AAAA,MACjB,eAAA,EAAiB,CAAA;AAAA,MACjB,eAAA,EAAiB,CAAA;AAAA,MACjB,gBAAA,EAAkB,CAAA;AAAA,MAClB,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAAA,MACzC,qBAAqB,EAAC;AAAA,MACtB,QAAQ,EAAC;AAAA,MACT,oBAAoB,EAAC;AAAA,MACrB,OAAA,EAAS;AAAA,QACP,gBAAA,EAAkB,EAAA;AAAA,QAClB,aAAA,EAAe,EAAA;AAAA,QACf,gBAAA,EAAkB,EAAA;AAAA,QAClB,kBAAA,EAAoB,EAAA;AAAA,QACpB,aAAA,EAAe;AAAA;AACjB,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAiB,OAAe,IAAA,EAA+B;AAC7D,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAA,UAAA;AACE,QAAA,OAAO,SAAS,oBAAA,CAAqB,uBAAA;AAAA,MACvC,KAAA,MAAA;AACE,QAAA,OAAO,SAAS,oBAAA,CAAqB,mBAAA;AAAA,MACvC,KAAA,QAAA;AACE,QAAA,OAAO,SAAS,oBAAA,CAAqB,qBAAA;AAAA,MACvC,KAAA,QAAA;AACE,QAAA,OAAO,SAAS,oBAAA,CAAqB,qBAAA;AAAA,MACvC;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,KAAA,EAA0E;AACzF,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAE/C,IAAA,QAAQ,WAAA;AAAa,MACnB,KAAA,MAAA;AACE,QAAA,OAAO,EAAE,QAAA,EAAA,QAAA,eAAiC,YAAA,EAAc,oBAAA,CAAqB,wBAAwB,KAAA,EAAM;AAAA,MAC7G,KAAA,QAAA;AACE,QAAA,OAAO,EAAE,QAAA,EAAA,QAAA,eAAiC,YAAA,EAAc,oBAAA,CAAqB,wBAAwB,KAAA,EAAM;AAAA,MAC7G,KAAA,QAAA;AACE,QAAA,OAAO,EAAE,QAAA,EAAA,MAAA,aAA+B,YAAA,EAAc,oBAAA,CAAqB,sBAAsB,KAAA,EAAM;AAAA,MACzG,KAAA,MAAA;AACE,QAAA,OAAO,EAAE,QAAA,EAAA,UAAA,iBAAmC,YAAA,EAAc,oBAAA,CAAqB,0BAA0B,KAAA,EAAM;AAAA,MACjH,KAAA,UAAA;AACE,QAAA,OAAO,IAAA;AAAA;AAAA,MACT;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,kBAAA,CACE,QACA,WAAA,EAC6B;AAE7B,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,2BAAA,CAA4B,MAAM,CAAA;AAG9D,IAAA,OAAO,IAAA,CAAK,yBAAA,CAA0B,WAAA,EAAa,cAAc,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,4BAA4B,MAAA,EAAoD;AAG9E,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,+BAAA,CAAgC,MAAA,CAAO,cAAc,CAAA;AAIhF,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,wBAAA,CAAyB,MAAA,CAAO,MAAM,CAAA;AAEpE,IAAA,OAAO;AAAA,MACL,WAAW,MAAA,CAAO,OAAA;AAAA,MAClB,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,cAAA,EAAgB,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,iBAAiB,GAAI,CAAA;AAAA;AAAA,MACtD,kBAAA,EAAoB,MAAA,CAAO,OAAA,GAAU,aAAA,GAAgB,EAAA;AAAA;AAAA,MACrD,UAAA,EAAY,KAAA;AAAA;AAAA,MACZ,wBAAA,EAA0B,KAAA;AAAA,MAC1B,QAAA,EAAU,IAAA,CAAK,qBAAA,CAAsB,MAAA,CAAO,OAAO,CAAA;AAAA,MACnD,aAAA,EAAe,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,GAAI;AAAA;AAAA,KACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,gCAAgC,cAAA,EAAgC;AACtE,IAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,MAAA,IAAW,kBAAkB,GAAA,EAAM;AAEjC,MAAA,OAAO,KAAK,KAAA,CAAM,EAAA,GAAA,CAAO,cAAA,GAAiB,GAAA,IAAO,OAAQ,EAAE,CAAA;AAAA,IAC7D,CAAA,MAAA,IAAW,kBAAkB,GAAA,EAAO;AAElC,MAAA,OAAO,KAAK,KAAA,CAAM,EAAA,GAAA,CAAO,cAAA,GAAiB,GAAA,IAAQ,MAAQ,EAAE,CAAA;AAAA,IAC9D,CAAA,MAAO;AAEL,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,MAAO,cAAA,GAAiB,GAAA,IAAS,GAAA,GAAS,EAAE,CAAC,CAAA;AAAA,IAC9E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,yBAAyB,eAAA,EAAiC;AAChE,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,eAAe,CAAA,GAAI,GAAA;AAI7C,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,GAAI,UAAA,GAAa,EAAE,CAAC,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,OAAA,EAAyB;AACrD,IAAA,QAAQ,OAAA;AAAS,MACf,KAAK,QAAA;AACH,QAAA,OAAO,oBAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,kBAAA;AAAA,MACT,KAAK,UAAA;AACH,QAAA,OAAO,sBAAA;AAAA,MACT;AACE,QAAA,OAAO,aAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,8BAAA,CACE,QACA,gBAAA,EAWA;AACA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,OAAA,EAAQ;AAAA,MACpC,WAAW,MAAA,CAAO,gBAAA;AAAA,MAClB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,QAAA,EAAS;AAAA,MAC/B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,kBAAkB,gBAAA,CAAiB,QAAA;AAAA,MACnC,UAAU,gBAAA,CAAiB,YAAA;AAAA,MAC3B,MAAM,gBAAA,CAAiB;AAAA,KACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,sBAAsB,OAAA,EAAiD;AAC3E,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,OAAO,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,iBAAA,CAAkB,MAAkB,QAAA,EAAmC;AACrE,IAAA,OAAO,KAAK,SAAA,CAAU,UAAA,CAAW,IAAA,EAAM,EAAE,UAAU,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAA,CAAO,MAAkB,OAAA,EAA0B;AACjD,IAAA,OAAO,KAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,YAAY,OAAO,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAA,CAAiB,MAAkB,OAAA,EAAqC;AACtE,IAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO,CAAA;AAClD,IAAA,OAAO,GAAA,EAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,CAAW,MAAkB,OAAA,EAAiC;AAC5D,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,aAAA,CAAc,MAAkB,gBAAA,EAAuC;AACrE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,IAAA,EAAM,gBAAgB,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAA,CAAU,cAA0B,OAAA,EAAiC;AACnE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,YAAA,EAAc,OAAO,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,eAAe,IAAA,EAAkC;AAC/C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,CAAW,MAAkB,KAAA,EAA2B;AACtD,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAqB,IAAA,EAA8B;AACjD,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,IAAI,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,IAAA,EAA8B;AAC/C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,IAAA,EAA8B;AAC7C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,IAAI,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,UAAA,EAA4B;AAC7C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,UAAU,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,OAAA,EAA0B;AACxC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,OAAO,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,UAAA,EAA6B;AAC9C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,UAAU,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,yBAAyB,cAAA,EAWH;AACpB,IAAA,MAAM,eAAA,GACJ,eAAe,iBAAA,GAAoB,EAAA,GAC/B,OAAO,cAAA,CAAe,iBAAA,GAAoB,cAAA,CAAe,iBAAiB,CAAA,GAC1E,CAAA;AAEN,IAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,kBAAA,GAAqB,cAAA,CAAe,cAAA;AACzE,IAAA,MAAM,WAAA,GACJ,gBAAgB,EAAA,GACZ,MAAA,CAAQ,eAAe,kBAAA,GAAqB,MAAA,GAAU,aAAa,CAAA,GACnE,CAAA;AAEN,IAAA,MAAM,SAAA,GACJ,cAAA,CAAe,iBAAA,GAAoB,CAAA,GAC/B,IAAA,CAAK,KAAA;AAAA,MACF,cAAA,CAAe,WAAA,GAAc,GAAA,IAAQ,cAAA,CAAe,iBAAA,GAAoB,CAAA;AAAA,KAC3E,GACA,CAAA;AAEN,IAAA,MAAM,qBAAA,GACJ,cAAA,CAAe,aAAA,GAAgB,CAAA,GAC3B,IAAA,CAAK,KAAA,CAAO,cAAA,CAAe,gBAAA,GAAmB,GAAA,GAAS,cAAA,CAAe,aAAa,CAAA,GACnF,GAAA;AAEN,IAAA,OAAO;AAAA,MACL,oBAAoB,cAAA,CAAe,kBAAA;AAAA,MACnC,gBAAgB,cAAA,CAAe,cAAA;AAAA,MAC/B,mBAAmB,cAAA,CAAe,iBAAA;AAAA,MAClC,mBAAmB,cAAA,CAAe,iBAAA;AAAA,MAClC,eAAe,cAAA,CAAe,aAAA;AAAA,MAC9B,kBAAkB,cAAA,CAAe,gBAAA;AAAA,MACjC,aAAa,cAAA,CAAe,WAAA;AAAA,MAC5B,mBAAmB,cAAA,CAAe,iBAAA;AAAA,MAClC,WAAW,cAAA,CAAe,SAAA;AAAA,MAC1B,WAAW,cAAA,CAAe,SAAA;AAAA,MAC1B,eAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;AC5iBO,IAAM,aAAA,GAAN,cAA4B,UAAA,CAAW;AAAA;AAAA;AAAA;AAAA,EAI5C,MAAM,wBAAwB,MAAA,EAAwD;AACpF,IAAA,MAAM,WAAA,GAAc,MAAM,0CAAA,CAA2C;AAAA,MACnE,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO;AAAA,KACnB,EAAG,EAAE,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AAErC,IAAA,OAAO,IAAA,CAAK,QAAQ,yBAAA,EAA2B,MAAM,aAAa,CAAC,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAM,MAAA,EAAsC;AAChD,IAAA,MAAM,WAAA,GAAc,MAAM,6BAAA,CAA8B;AAAA,MACtD,mBAAmB,MAAA,CAAO,iBAAA;AAAA,MAC1B,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,OAAO,MAAA,CAAO,UAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,cAAc,MAAA,CAAO;AAAA,KACvB,EAAG,EAAE,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AAErC,IAAA,OAAO,IAAA,CAAK,QAAQ,YAAA,EAAc,MAAM,aAAa,CAAC,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAQ,MAAA,EAAwC;AACpD,IAAA,MAAM,WAAA,GAAc,MAAM,+BAAA,CAAgC;AAAA,MACxD,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,MAC1B,OAAO,MAAA,CAAO;AAAA,KAChB,EAAG,EAAE,cAAA,EAAgB,IAAA,CAAK,WAAW,CAAA;AAErC,IAAA,OAAO,IAAA,CAAK,QAAQ,cAAA,EAAgB,MAAM,aAAa,CAAC,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,kBAAkB,qBAAA,EAAgE;AACtF,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAA2B,qBAAA,EAAuB,0BAA0B,CAAA;AAAA,IAChG,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAiB,oBAAA,EAA8D;AACnF,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAA0B,oBAAA,EAAsB,yBAAyB,CAAA;AAAA,IAC7F,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF","file":"chunk-SZGFSCNU.js","sourcesContent":["/**\n * Multi-Source Reputation Aggregator\n *\n * Aggregates reputation data from multiple sources (PayAI, GitHub, custom webhooks)\n * with weighted scoring, conflict detection, and reliability-based adjustments.\n *\n * Based on MUSCLE multi-source oracle pattern with reputation-based source selection.\n */\n\nimport type { Address } from '@solana/addresses'\nimport type {\n ReputationSource,\n ReputationSourceAdapter,\n ReputationSourceConfig,\n SourceReputationData,\n} from './adapters/ReputationSourceAdapter.js'\n\n/**\n * Aggregated reputation result\n */\nexport interface AggregatedReputation {\n /** Agent address */\n agentId: Address | string\n /** Weighted aggregate score (0-1000) */\n aggregateScore: number\n /** Individual source scores */\n sourceScores: SourceScoreBreakdown[]\n /** Whether conflicts were detected */\n hasConflicts: boolean\n /** Conflict descriptions */\n conflicts: string[]\n /** Total number of data points across all sources */\n totalDataPoints: number\n /** Timestamp of aggregation */\n timestamp: Date\n}\n\n/**\n * Individual source score breakdown\n */\nexport interface SourceScoreBreakdown {\n /** Source identifier */\n source: ReputationSource\n /** Raw score from source (0-1000) */\n score: number\n /** Source weight (0-10000 basis points) */\n weight: number\n /** Source reliability (0-10000 basis points) */\n reliability: number\n /** Number of data points */\n dataPoints: number\n /** Weighted contribution to final score */\n contribution: number\n /** Last updated timestamp */\n lastUpdated: Date\n}\n\n/**\n * Multi-source reputation aggregator\n */\nexport class MultiSourceAggregator {\n private adapters: Map<ReputationSource, ReputationSourceAdapter> = new Map()\n private configs: Map<ReputationSource, ReputationSourceConfig> = new Map()\n\n /** Conflict threshold (30% variance) */\n private readonly CONFLICT_THRESHOLD = 300 // 30% of 1000 scale\n\n /**\n * Create a new multi-source aggregator\n */\n constructor() {\n // Initialize empty - sources are added via addSource()\n }\n\n /**\n * Add a reputation source\n *\n * @param adapter - Reputation source adapter\n * @param config - Source configuration\n */\n addSource(adapter: ReputationSourceAdapter, config: ReputationSourceConfig): void {\n if (!config.enabled) {\n return\n }\n\n this.adapters.set(adapter.source, adapter)\n this.configs.set(adapter.source, config)\n }\n\n /**\n * Remove a reputation source\n *\n * @param source - Source to remove\n */\n removeSource(source: ReputationSource): void {\n this.adapters.delete(source)\n this.configs.delete(source)\n }\n\n /**\n * Update source weight\n *\n * @param source - Source to update\n * @param weight - New weight in basis points (0-10000)\n */\n updateSourceWeight(source: ReputationSource, weight: number): void {\n const config = this.configs.get(source)\n if (config) {\n config.weight = weight\n }\n }\n\n /**\n * Update source reliability\n *\n * @param source - Source to update\n * @param reliability - New reliability in basis points (0-10000)\n */\n updateSourceReliability(source: ReputationSource, reliability: number): void {\n const config = this.configs.get(source)\n if (config) {\n config.reliability = reliability\n }\n }\n\n /**\n * Aggregate reputation from all sources\n *\n * @param agentId - Agent identifier\n * @returns Aggregated reputation data\n */\n async aggregateReputation(agentId: Address | string): Promise<AggregatedReputation> {\n const sourceDataList: SourceReputationData[] = []\n\n // Fetch data from all enabled sources\n for (const [source, adapter] of this.adapters.entries()) {\n try {\n const data = await adapter.fetchReputationData(agentId.toString())\n if (adapter.validateData(data)) {\n sourceDataList.push(data)\n }\n } catch (error) {\n console.warn(`Failed to fetch reputation from ${source}:`, error)\n // Continue with other sources on error (graceful degradation)\n }\n }\n\n // Calculate weighted aggregate score\n const aggregateScore = this.calculateWeightedScore(sourceDataList)\n\n // Detect conflicts\n const { hasConflicts, conflicts } = this.detectConflicts(sourceDataList)\n\n // Build source breakdowns\n const sourceScores = this.buildSourceBreakdowns(sourceDataList)\n\n // Calculate total data points\n const totalDataPoints = sourceDataList.reduce((sum, data) => sum + data.dataPoints, 0)\n\n return {\n agentId,\n aggregateScore,\n sourceScores,\n hasConflicts,\n conflicts,\n totalDataPoints,\n timestamp: new Date(),\n }\n }\n\n /**\n * Calculate weighted aggregate score\n *\n * Formula: Σ(score × weight × reliability) / Σ(weight × reliability)\n *\n * @param sourceDataList - Data from all sources\n * @returns Weighted aggregate score (0-1000)\n */\n calculateWeightedScore(sourceDataList: SourceReputationData[]): number {\n if (sourceDataList.length === 0) {\n return 0\n }\n\n let totalContribution = 0\n let totalNormalization = 0\n\n for (const data of sourceDataList) {\n const config = this.configs.get(data.source)\n if (!config) continue\n\n const weight = config.weight / 10000 // Convert to 0-1\n const reliability = data.reliability // Already 0-1\n\n const contribution = data.score * weight * reliability\n const normalization = weight * reliability\n\n totalContribution += contribution\n totalNormalization += normalization\n }\n\n if (totalNormalization === 0) {\n return 0\n }\n\n return Math.round(totalContribution / totalNormalization)\n }\n\n /**\n * Detect conflicts between sources\n *\n * Flags conflicts if max_score - min_score > 30%\n *\n * @param sourceDataList - Data from all sources\n * @returns Conflict detection result\n */\n detectConflicts(sourceDataList: SourceReputationData[]): {\n hasConflicts: boolean\n conflicts: string[]\n } {\n if (sourceDataList.length < 2) {\n return { hasConflicts: false, conflicts: [] }\n }\n\n const scores = sourceDataList.map((d) => d.score)\n const maxScore = Math.max(...scores)\n const minScore = Math.min(...scores)\n const variance = maxScore - minScore\n\n const conflicts: string[] = []\n\n if (variance > this.CONFLICT_THRESHOLD) {\n const maxSource = sourceDataList.find((d) => d.score === maxScore)?.source\n const minSource = sourceDataList.find((d) => d.score === minScore)?.source\n\n conflicts.push(\n `High variance detected: ${variance} (${((variance / 1000) * 100).toFixed(1)}%) ` +\n `between ${maxSource} (${maxScore}) and ${minSource} (${minScore})`\n )\n\n return { hasConflicts: true, conflicts }\n }\n\n return { hasConflicts: false, conflicts: [] }\n }\n\n /**\n * Build source score breakdowns\n *\n * @param sourceDataList - Data from all sources\n * @returns Source score breakdowns\n */\n private buildSourceBreakdowns(sourceDataList: SourceReputationData[]): SourceScoreBreakdown[] {\n return sourceDataList.map((data) => {\n const config = this.configs.get(data.source)\n if (!config) {\n throw new Error(`No config found for source: ${data.source}`)\n }\n\n const weight = config.weight\n const reliability = data.reliability * 10000 // Convert to basis points\n\n // Calculate weighted contribution\n const contribution =\n (data.score * (weight / 10000) * (reliability / 10000)) /\n this.calculateNormalizationFactor(sourceDataList)\n\n return {\n source: data.source,\n score: data.score,\n weight,\n reliability: Math.round(reliability),\n dataPoints: data.dataPoints,\n contribution: Math.round(contribution),\n lastUpdated: data.timestamp,\n }\n })\n }\n\n /**\n * Calculate normalization factor for weighted scoring\n */\n private calculateNormalizationFactor(sourceDataList: SourceReputationData[]): number {\n let total = 0\n\n for (const data of sourceDataList) {\n const config = this.configs.get(data.source)\n if (!config) continue\n\n const weight = config.weight / 10000\n const reliability = data.reliability\n\n total += weight * reliability\n }\n\n return total || 1 // Avoid division by zero\n }\n\n /**\n * Get detailed source breakdown for an agent\n *\n * @param agentId - Agent identifier\n * @returns Source breakdowns with full details\n */\n async getSourceBreakdown(agentId: Address | string): Promise<SourceScoreBreakdown[]> {\n const result = await this.aggregateReputation(agentId)\n return result.sourceScores\n }\n\n /**\n * Get list of registered sources\n */\n getRegisteredSources(): ReputationSource[] {\n return Array.from(this.adapters.keys())\n }\n\n /**\n * Get source configuration\n *\n * @param source - Source identifier\n * @returns Source configuration or undefined\n */\n getSourceConfig(source: ReputationSource): ReputationSourceConfig | undefined {\n return this.configs.get(source)\n }\n\n /**\n * Enable a source\n *\n * @param source - Source to enable\n */\n enableSource(source: ReputationSource): void {\n const config = this.configs.get(source)\n if (config) {\n config.enabled = true\n }\n }\n\n /**\n * Disable a source\n *\n * @param source - Source to disable\n */\n disableSource(source: ReputationSource): void {\n const config = this.configs.get(source)\n if (config) {\n config.enabled = false\n }\n }\n\n /**\n * Check if source is enabled\n *\n * @param source - Source to check\n * @returns True if enabled\n */\n isSourceEnabled(source: ReputationSource): boolean {\n const config = this.configs.get(source)\n return config?.enabled ?? false\n }\n}\n","import type { Address } from '@solana/addresses'\nimport { \n createSolanaRpc, \n createSolanaRpcSubscriptions,\n lamports,\n type Signature,\n type Base64EncodedWireTransaction,\n type TransactionError,\n type TransactionMessageBytesBase64\n} from '@solana/kit'\nimport type {\n Commitment,\n AccountInfo,\n GetAccountInfoOptions,\n GetMultipleAccountsOptions,\n GetProgramAccountsOptions,\n SignatureStatus,\n SimulatedTransactionResponse,\n SendTransactionOptions\n} from '../types/rpc-types.js'\n\nexport interface RpcClientConfig {\n endpoint: string\n wsEndpoint?: string\n commitment?: Commitment\n maxRetries?: number\n retryDelay?: number\n timeout?: number\n}\n\n/**\n * Unified RPC client with all features consolidated from multiple implementations.\n * This is the single source of truth for all RPC operations.\n */\nexport class RpcClient {\n private rpc: ReturnType<typeof createSolanaRpc>\n private rpcSubscriptions?: ReturnType<typeof createSolanaRpcSubscriptions>\n private commitment: Commitment\n private endpoint: string\n private maxRetries: number\n private retryDelay: number\n private timeout: number\n\n constructor(config: RpcClientConfig) {\n this.endpoint = config.endpoint\n this.rpc = createSolanaRpc(config.endpoint)\n this.commitment = config.commitment ?? 'confirmed'\n this.maxRetries = config.maxRetries ?? 3\n this.retryDelay = config.retryDelay ?? 1000\n this.timeout = config.timeout ?? 60000\n \n if (config.wsEndpoint) {\n this.rpcSubscriptions = createSolanaRpcSubscriptions(config.wsEndpoint)\n }\n }\n\n /**\n * Get account information with automatic retries\n */\n async getAccountInfo(\n address: Address,\n options?: GetAccountInfoOptions\n ): Promise<AccountInfo | null> {\n return this.withRetry(async () => {\n const result = await this.rpc.getAccountInfo(address, {\n commitment: options?.commitment ?? this.commitment,\n encoding: 'base64'\n }).send()\n\n if (!result.value) return null\n\n return this.parseAccountInfo(result.value)\n })\n }\n\n /**\n * Get multiple accounts efficiently\n */\n async getMultipleAccounts(\n addresses: Address[],\n options?: GetMultipleAccountsOptions\n ): Promise<(AccountInfo | null)[]> {\n return this.withRetry(async () => {\n const result = await this.rpc.getMultipleAccounts(addresses, {\n commitment: options?.commitment ?? this.commitment,\n encoding: 'base64'\n }).send()\n\nreturn result.value.map((account: unknown) => \n account ? this.parseAccountInfo(account) : null\n )\n })\n }\n\n /**\n * Get program accounts with filters\n */\n async getProgramAccounts(\n programId: Address,\n options?: GetProgramAccountsOptions\n ): Promise<{ pubkey: Address; account: AccountInfo }[]> {\n return this.withRetry(async () => {\n const result = await this.rpc.getProgramAccounts(programId, {\n commitment: options?.commitment ?? this.commitment,\n encoding: 'base64',\n filters: options?.filters\n }).send()\n\nreturn result.map((item: unknown) => {\n const typedItem = item as { pubkey: string; account: unknown }\n return {\n pubkey: typedItem.pubkey as Address,\n account: this.parseAccountInfo(typedItem.account)\n }\n })\n })\n }\n\n /**\n * Get latest blockhash with automatic caching\n */\n private blockhashCache: { value: { blockhash: string; lastValidBlockHeight: bigint }; timestamp: number } | null = null\n \n async getLatestBlockhash(): Promise<{ blockhash: string; lastValidBlockHeight: bigint }> {\n // Cache blockhash for 1 second to avoid excessive RPC calls\n const now = Date.now()\n if (this.blockhashCache && now - this.blockhashCache.timestamp < 1000) {\n return this.blockhashCache.value\n }\n\n const result = await this.withRetry(async () => {\n const response = await this.rpc.getLatestBlockhash({\n commitment: this.commitment\n }).send()\n \n return {\n blockhash: response.value.blockhash,\n lastValidBlockHeight: BigInt(response.value.lastValidBlockHeight)\n }\n })\n\n this.blockhashCache = { value: result, timestamp: now }\n return result\n }\n\n /**\n * Send transaction with enhanced error handling\n */\n async sendTransaction(\n transaction: Base64EncodedWireTransaction,\n options?: SendTransactionOptions\n ): Promise<Signature> {\n return this.withRetry(async () => {\n const result = await this.rpc.sendTransaction(transaction, {\n encoding: 'base64',\n skipPreflight: options?.skipPreflight ?? false,\n preflightCommitment: options?.preflightCommitment ?? this.commitment,\n maxRetries: options?.maxRetries ? BigInt(options.maxRetries) : undefined\n }).send()\n \n return result as Signature\n })\n }\n\n /**\n * Get signature statuses with batch support\n */\n async getSignatureStatuses(\n signatures: Signature[]\n ): Promise<(SignatureStatus | null)[]> {\n return this.withRetry(async () => {\n const result = await this.rpc.getSignatureStatuses(signatures).send()\n \nreturn result.value.map((status: unknown) => {\n if (!status) return null\n \n const typedStatus = status as {\n slot: bigint\n confirmations: number | null\n err: unknown | null\n confirmationStatus: string | null\n }\n \n return {\n slot: typedStatus.slot,\n confirmations: typedStatus.confirmations,\n err: typedStatus.err as TransactionError | null,\n confirmationStatus: typedStatus.confirmationStatus as Commitment | undefined\n }\n })\n })\n }\n\n /**\n * Simulate transaction with detailed error info\n */\n async simulateTransaction(\n transaction: Base64EncodedWireTransaction,\n options?: {\n commitment?: Commitment\n replaceRecentBlockhash?: boolean\n }\n ): Promise<SimulatedTransactionResponse> {\n return this.withRetry(async () => {\n const result = await this.rpc.simulateTransaction(transaction, {\n encoding: 'base64',\n commitment: options?.commitment ?? this.commitment,\n replaceRecentBlockhash: options?.replaceRecentBlockhash ?? false\n }).send()\n \n return {\n err: result.value.err,\n logs: result.value.logs ?? [],\n unitsConsumed: result.value.unitsConsumed ? BigInt(result.value.unitsConsumed) : undefined,\n returnData: result.value.returnData\n }\n })\n }\n\n /**\n * Get fee for message\n */\n async getFeeForMessage(encodedMessage: TransactionMessageBytesBase64): Promise<bigint | null> {\n return this.withRetry(async () => {\n const result = await this.rpc.getFeeForMessage(encodedMessage, {\n commitment: this.commitment\n }).send()\n \n return result.value ? BigInt(result.value) : null\n })\n }\n\n /**\n * Health check\n */\n async isHealthy(): Promise<boolean> {\n try {\n await this.rpc.getHealth().send()\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Get RPC node version\n */\n async getVersion(): Promise<{ 'solana-core': string; 'feature-set': number }> {\n const result = await this.rpc.getVersion().send()\n return result\n }\n\n /**\n * Subscribe to account changes (WebSocket) \n * Note: This is a placeholder implementation. In production, you would use the actual subscription API\n */\n async subscribeToAccount(\n address: Address,\n callback: (accountInfo: AccountInfo | null) => void\n ): Promise<() => void> {\n if (!this.rpcSubscriptions) {\n throw new Error('WebSocket endpoint not configured')\n }\n\n // Placeholder implementation - in practice would use actual subscription\n console.warn('Account subscription is not fully implemented in this version')\n \n // Poll for changes as a fallback (not recommended for production)\n const intervalId = setInterval(async () => {\n try {\n const accountInfo = await this.getAccountInfo(address)\n callback(accountInfo)\n } catch (error) {\n console.error('Subscription polling error:', error)\n }\n }, 5000) // Poll every 5 seconds\n\n return () => {\n clearInterval(intervalId)\n }\n }\n\n // Private helper methods\n\n private async withRetry<T>(\n operation: () => Promise<T>,\n retries = this.maxRetries\n ): Promise<T> {\n let lastError: Error | undefined\n \n for (let i = 0; i <= retries; i++) {\n try {\n return await operation()\n } catch (error) {\n lastError = error as Error\n if (i < retries) {\n await new Promise(resolve => setTimeout(resolve, this.retryDelay * Math.pow(2, i)))\n }\n }\n }\n \n throw lastError\n }\n\n private parseAccountInfo(rawAccount: unknown): AccountInfo {\n const account = rawAccount as {\n executable: boolean\n lamports: number\n owner: string\n rentEpoch?: number\n data: [string, string] | string\n space?: number\n }\n\n const dataArray = account.data\n const base64Data = Array.isArray(dataArray) ? dataArray[0] : dataArray\n \n return {\n executable: account.executable,\n lamports: typeof account.lamports === 'number' ? lamports(BigInt(account.lamports)) : account.lamports,\n owner: account.owner as Address,\n rentEpoch: account.rentEpoch !== undefined ? (typeof account.rentEpoch === 'number' ? BigInt(account.rentEpoch) : account.rentEpoch) : BigInt(0),\n data: Buffer.from(base64Data, 'base64'),\n space: account.space ? (typeof account.space === 'number' ? BigInt(account.space) : account.space) : undefined\n }\n }\n}","import type { Address, Signature } from '@solana/kit'\nimport type { Commitment } from '../types/index.js'\n\n/**\n * Solana cluster types for URL generation\n */\nexport type SolanaCluster = 'mainnet-beta' | 'devnet' | 'testnet' | 'localnet'\n\n/**\n * Transaction result with verification URLs\n */\nexport interface TransactionResult {\n signature: string | Signature\n cluster: SolanaCluster\n urls: {\n solanaExplorer: string\n solscan: string\n solanaFM: string\n xray: string\n }\n commitment: Commitment\n timestamp: number\n}\n\n/**\n * Detect cluster from RPC endpoint URL\n */\nexport function detectClusterFromEndpoint(rpcUrl: string): SolanaCluster {\n if (rpcUrl.includes('devnet')) return 'devnet'\n if (rpcUrl.includes('testnet')) return 'testnet'\n if (rpcUrl.includes('localhost') || rpcUrl.includes('127.0.0.1')) return 'localnet'\n return 'mainnet-beta'\n}\n\n/**\n * Generate Solana Explorer URL for transaction\n */\nexport function getSolanaExplorerUrl(\n signature: string | Signature, \n cluster: SolanaCluster = 'mainnet-beta'\n): string {\n const baseUrl = 'https://explorer.solana.com/tx'\n \n switch (cluster) {\n case 'devnet':\n return `${baseUrl}/${signature}?cluster=devnet`\n case 'testnet':\n return `${baseUrl}/${signature}?cluster=testnet`\n case 'localnet':\n return `${baseUrl}/${signature}?cluster=custom&customUrl=http://localhost:8899`\n default:\n return `${baseUrl}/${signature}`\n }\n}\n\n/**\n * Generate Solscan URL for transaction\n */\nexport function getSolscanUrl(\n signature: string | Signature, \n cluster: SolanaCluster = 'mainnet-beta'\n): string {\n const baseUrl = 'https://solscan.io/tx'\n \n switch (cluster) {\n case 'devnet':\n return `${baseUrl}/${signature}?cluster=devnet`\n case 'testnet':\n return `${baseUrl}/${signature}?cluster=testnet`\n case 'localnet':\n return `Local transaction: ${signature} (not viewable on Solscan)`\n default:\n return `${baseUrl}/${signature}`\n }\n}\n\n/**\n * Generate SolanaFM URL for transaction\n */\nexport function getSolanaFMUrl(\n signature: string | Signature, \n cluster: SolanaCluster = 'mainnet-beta'\n): string {\n const baseUrl = 'https://solana.fm/tx'\n \n switch (cluster) {\n case 'devnet':\n return `${baseUrl}/${signature}?cluster=devnet-solana`\n case 'testnet':\n return `${baseUrl}/${signature}?cluster=testnet-solana`\n case 'localnet':\n return `Local transaction: ${signature} (not viewable on SolanaFM)`\n default:\n return `${baseUrl}/${signature}`\n }\n}\n\n/**\n * Generate XRAY URL for transaction (Helius explorer)\n */\nexport function getXrayUrl(\n signature: string | Signature, \n cluster: SolanaCluster = 'mainnet-beta'\n): string {\n const baseUrl = 'https://xray.helius.xyz/tx'\n \n switch (cluster) {\n case 'devnet':\n return `${baseUrl}/${signature}?network=devnet`\n case 'testnet':\n return `${baseUrl}/${signature}?network=testnet`\n case 'localnet':\n return `Local transaction: ${signature} (not viewable on XRAY)`\n default:\n return `${baseUrl}/${signature}`\n }\n}\n\n/**\n * Generate all explorer URLs for a transaction\n */\nexport function generateExplorerUrls(\n signature: string | Signature,\n cluster: SolanaCluster = 'mainnet-beta'\n): TransactionResult['urls'] {\n return {\n solanaExplorer: getSolanaExplorerUrl(signature, cluster),\n solscan: getSolscanUrl(signature, cluster),\n solanaFM: getSolanaFMUrl(signature, cluster),\n xray: getXrayUrl(signature, cluster)\n }\n}\n\n/**\n * Create a complete transaction result with all verification URLs\n */\nexport function createTransactionResult(\n signature: string | Signature,\n cluster: SolanaCluster,\n commitment: Commitment = 'confirmed'\n): TransactionResult {\n return {\n signature,\n cluster,\n urls: generateExplorerUrls(signature, cluster),\n commitment,\n timestamp: Date.now()\n }\n}\n\n/**\n * Generate account explorer URLs\n */\nexport function getAccountExplorerUrls(\n address: Address,\n cluster: SolanaCluster = 'mainnet-beta'\n) {\n const clusterParam = cluster === 'mainnet-beta' ? '' : `?cluster=${cluster}`\n \n return {\n solanaExplorer: `https://explorer.solana.com/address/${address}${clusterParam}`,\n solscan: cluster === 'mainnet-beta' \n ? `https://solscan.io/account/${address}`\n : `https://solscan.io/account/${address}?cluster=${cluster}`,\n solanaFM: cluster === 'mainnet-beta'\n ? `https://solana.fm/address/${address}`\n : `https://solana.fm/address/${address}?cluster=${cluster}-solana`\n }\n}\n\n/**\n * Log transaction details with clickable URLs\n */\nexport function logTransactionDetails(result: TransactionResult): void {\n console.log('\\n🎉 TRANSACTION SUCCESSFUL!')\n console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')\n console.log(`📝 Signature: ${result.signature}`)\n console.log(`🌐 Cluster: ${result.cluster}`)\n console.log(`⏰ Timestamp: ${new Date(result.timestamp).toISOString()}`)\n console.log(`🔒 Commitment: ${result.commitment}`)\n console.log('\\n🔗 VIEW TRANSACTION ON EXPLORERS:')\n console.log(` 🔍 Solana Explorer: ${result.urls.solanaExplorer}`)\n console.log(` 📊 Solscan: ${result.urls.solscan}`)\n console.log(` 🎯 SolanaFM: ${result.urls.solanaFM}`)\n console.log(` ⚡ XRAY (Helius): ${result.urls.xray}`)\n console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')\n}\n\n/**\n * Create markdown link for transaction\n */\nexport function createTransactionMarkdown(\n signature: string | Signature,\n cluster: SolanaCluster = 'mainnet-beta',\n linkText?: string\n): string {\n const url = getSolanaExplorerUrl(signature, cluster)\n const text = linkText ?? `View Transaction ${signature.slice(0, 8)}...`\n return `[${text}](${url})`\n}\n\n/**\n * Wait for transaction confirmation with progress updates\n */\nexport async function waitForTransactionConfirmation(\n signature: string | Signature,\n cluster: SolanaCluster,\n commitment: Commitment = 'confirmed',\n timeoutMs = 30000\n): Promise<void> {\n console.log(`⏳ Waiting for transaction confirmation...`)\n console.log(` Signature: ${signature}`)\n console.log(` Cluster: ${cluster}`)\n console.log(` Commitment: ${commitment}`)\n \n const startTime = Date.now()\n const checkInterval = 2000 // Check every 2 seconds\n \n return new Promise((resolve, reject) => {\n const intervalId = setInterval(() => {\n const elapsed = Date.now() - startTime\n \n if (elapsed >= timeoutMs) {\n clearInterval(intervalId)\n reject(new Error(`Transaction confirmation timeout after ${timeoutMs}ms`))\n return\n }\n \n console.log(` ⏱️ Waiting... (${Math.floor(elapsed/1000)}s elapsed)`)\n \n // In a real implementation, you would check transaction status here\n // For now, we simulate confirmation after a reasonable time\n if (elapsed >= 5000) {\n clearInterval(intervalId)\n console.log(` ✅ Transaction confirmed after ${Math.floor(elapsed/1000)}s`)\n resolve()\n }\n }, checkInterval)\n })\n}","/**\n * Developer Tools for GhostSpeak SDK\n * \n * Provides debugging, inspection, and development utilities\n */\n\nimport type { Instruction, AccountRole } from '@solana/kit'\n// Type alias for backward compatibility with @solana/kit v2\ntype IInstruction = Instruction\nimport type { Address } from '@solana/addresses'\nimport type { GhostSpeakConfig } from '../types/index.js'\nimport { RpcClient } from './rpc-client.js'\n\n/**\n * Transaction analysis result\n */\nexport interface TransactionAnalysis {\n instructions: InstructionAnalysis[]\n totalAccounts: number\n signerCount: number\n writableAccounts: Address[]\n readonlyAccounts: Address[]\n estimatedSize: number\n estimatedComputeUnits: bigint\n estimatedFee: bigint\n warnings: string[]\n}\n\n/**\n * Individual instruction analysis\n */\nexport interface InstructionAnalysis {\n index: number\n programId: Address\n accountCount: number\n dataSize: number\n humanReadable: string\n accounts: AccountInfo[]\n}\n\n/**\n * Account information in instruction\n */\nexport interface AccountInfo {\n address: Address\n isWritable: boolean\n isSigner: boolean\n role: AccountRole\n}\n\n/**\n * Developer tools for debugging and analysis\n */\nexport class DevTools {\n private static instance: DevTools | null = null\n private rpcClient: RpcClient\n private config: GhostSpeakConfig\n private isDevelopment: boolean\n private logs: string[] = []\n private timings: Map<string, number> = new Map()\n\n constructor(config: GhostSpeakConfig) {\n this.config = config\n this.rpcClient = new RpcClient({\n endpoint: config.rpcEndpoint ?? 'https://api.devnet.solana.com',\n commitment: config.commitment\n })\n this.isDevelopment = process.env.NODE_ENV === 'development' || \n config.cluster === 'localnet' ||\n false\n }\n\n /**\n * Get singleton instance\n */\n static getInstance(config?: GhostSpeakConfig): DevTools {\n if (!DevTools.instance && config) {\n DevTools.instance = new DevTools(config)\n }\n if (!DevTools.instance) {\n throw new Error('DevTools not initialized. Call with config first.')\n }\n return DevTools.instance\n }\n\n /**\n * Enable development mode\n */\n enableDevMode(): void {\n this.isDevelopment = true\n console.log('🛠️ GhostSpeak Development Mode Enabled')\n console.log(' - Transaction simulation before sending')\n console.log(' - Cost estimates for all operations')\n console.log(' - Enhanced error messages')\n console.log(' - Performance timing')\n }\n\n /**\n * Check if in development mode\n */\n isDevMode(): boolean {\n return this.isDevelopment\n }\n\n /**\n * Analyze transaction instructions\n */\n analyzeTransaction(instructions: IInstruction[]): TransactionAnalysis {\n const writableAccounts = new Set<Address>()\n const readonlyAccounts = new Set<Address>()\n const signers = new Set<Address>()\n const warnings: string[] = []\n let totalSize = 64 // Base transaction overhead\n\n const instructionAnalyses: InstructionAnalysis[] = instructions.map((instr, index) => {\n totalSize += 32 // Program ID\n totalSize += (instr.accounts?.length ?? 0) * 32 // Account metas\n totalSize += instr.data?.length ?? 0 // Instruction data\n\n const accounts: AccountInfo[] = (instr.accounts ?? []).map(acc => {\n // Check if the role has 'writable' in its name or is specifically writable\n const isWritable = acc.role.toString().includes('writable') || \n acc.role.toString().includes('WRITABLE') ||\n acc.role === 1 || // AccountRole.WRITABLE = 1\n acc.role === 3 // AccountRole.WRITABLE_SIGNER = 3\n // Check if the role has 'signer' in its name or contains signer property\n const isSigner = acc.role.toString().includes('signer') || \n acc.role.toString().includes('SIGNER') ||\n (typeof acc === 'object' && 'signer' in acc) ||\n acc.role === 3 // AccountRole.WRITABLE_SIGNER = 3\n \n // Account analysis complete\n \n if (isWritable) {\n writableAccounts.add(acc.address)\n } else {\n readonlyAccounts.add(acc.address)\n }\n \n if (isSigner) {\n signers.add(acc.address)\n }\n\n return {\n address: acc.address,\n isWritable,\n isSigner,\n role: acc.role\n }\n })\n\n const humanReadable = this.getInstructionDescription(instr, index)\n\n return {\n index,\n programId: instr.programAddress,\n accountCount: accounts.length,\n dataSize: instr.data?.length ?? 0,\n humanReadable,\n accounts\n }\n })\n\n // Calculate estimated compute units\n const estimatedComputeUnits = this.estimateComputeUnits(instructions)\n \n // Calculate estimated fee\n const estimatedFee = this.estimateFee(estimatedComputeUnits, instructions.length)\n\n // Generate warnings\n if (totalSize > 1232) {\n warnings.push(`Transaction size (${totalSize} bytes) exceeds limit (1232 bytes)`)\n }\n \n if (signers.size === 0) {\n warnings.push('No signers found in transaction')\n }\n \n if (estimatedComputeUnits > BigInt(1_400_000)) {\n warnings.push(`High compute usage: ${estimatedComputeUnits} units`)\n }\n\n return {\n instructions: instructionAnalyses,\n totalAccounts: writableAccounts.size + readonlyAccounts.size,\n signerCount: signers.size,\n writableAccounts: Array.from(writableAccounts),\n readonlyAccounts: Array.from(readonlyAccounts),\n estimatedSize: totalSize,\n estimatedComputeUnits,\n estimatedFee,\n warnings\n }\n }\n\n /**\n * Get human-readable instruction description\n */\n private getInstructionDescription(instruction: IInstruction, _index: number): string {\n // Try to decode based on program ID\n const programId = instruction.programAddress\n \n // GhostSpeak program\n if (programId === this.config.programId) {\n return this.decodeGhostSpeakInstruction(instruction)\n }\n \n // System program\n if (programId === '11111111111111111111111111111111') {\n return 'System Program: Transfer or Create Account'\n }\n \n // Token program\n if (programId === 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA') {\n return 'Token Program: Token Operation'\n }\n \n // Token-2022 program\n if (programId === 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb') {\n return 'Token-2022 Program: Advanced Token Operation'\n }\n \n return `Unknown Instruction`\n }\n\n /**\n * Decode GhostSpeak instruction\n */\n private decodeGhostSpeakInstruction(instruction: IInstruction): string {\n if (!instruction.data || instruction.data.length < 8) {\n return 'GhostSpeak: Unknown Instruction'\n }\n \n // Read discriminator (first 8 bytes)\n const discriminator = Array.from(instruction.data.slice(0, 8))\n .map(b => b.toString(16).padStart(2, '0'))\n .join('')\n \n // Map common discriminators to names\n const instructionMap: Record<string, string> = {\n 'a8c5e109d3d1b8d5': 'Register Agent',\n 'b7f3c8e0a2d4e9f1': 'Create Escrow',\n 'c4d2f7a9b8e1c3f5': 'Send Message',\n 'd9e8f2b5c1a7e4f8': 'Create Channel',\n // Add more mappings as needed\n }\n \n return `GhostSpeak: ${instructionMap[discriminator] ?? 'Custom Instruction'}`\n }\n\n /**\n * Estimate compute units for instructions\n */\n private estimateComputeUnits(instructions: IInstruction[]): bigint {\n let totalUnits = BigInt(0)\n \n for (const instr of instructions) {\n // Base cost per instruction\n totalUnits += BigInt(200)\n \n // Account access costs\n totalUnits += BigInt((instr.accounts?.length ?? 0) * 150)\n \n // Data processing cost\n totalUnits += BigInt((instr.data?.length ?? 0) * 10)\n \n // Program-specific costs\n if (instr.programAddress === this.config.programId) {\n // GhostSpeak operations are more complex\n totalUnits += BigInt(5000)\n }\n }\n \n return totalUnits\n }\n\n /**\n * Estimate transaction fee\n */\n private estimateFee(computeUnits: bigint, instructionCount: number): bigint {\n // Base fee: 5000 lamports per signature\n const baseFee = BigInt(5000)\n \n // Compute unit fee: ~0.000005 SOL per 1M units\n const computeFee = (computeUnits * BigInt(5)) / BigInt(1_000_000)\n \n // Priority fee estimate\n const priorityFee = BigInt(instructionCount * 1000)\n \n return baseFee + computeFee + priorityFee\n }\n\n /**\n * Log debug message\n */\n log(message: string, data?: unknown): void {\n if (!this.isDevelopment) return\n \n const timestamp = new Date().toISOString()\n const logEntry = `[${timestamp}] ${message}`\n \n this.logs.push(logEntry)\n console.log(`🔍 ${logEntry}`)\n \n if (data) {\n console.log(' Data:', data)\n }\n }\n\n /**\n * Start timing an operation\n */\n startTiming(label: string): void {\n if (!this.isDevelopment) return\n const perfNow = typeof performance !== 'undefined' ? performance.now() : Date.now()\n this.timings.set(label, perfNow)\n }\n\n /**\n * End timing and log result\n */\n endTiming(label: string): void {\n if (!this.isDevelopment) return\n \n const start = this.timings.get(label)\n if (!start) return\n \n const perfNow = typeof performance !== 'undefined' ? performance.now() : Date.now()\n const duration = perfNow - start\n this.log(`${label} took ${duration.toFixed(2)}ms`)\n this.timings.delete(label)\n }\n\n /**\n * Format transaction for display\n */\n formatTransaction(analysis: TransactionAnalysis): string {\n const lines: string[] = [\n '📋 Transaction Analysis',\n '═══════════════════════════════════════',\n `Instructions: ${analysis.instructions.length}`,\n `Total Accounts: ${analysis.totalAccounts}`,\n `Signers: ${analysis.signerCount}`,\n `Estimated Size: ${analysis.estimatedSize} bytes`,\n `Estimated Compute Units: ${analysis.estimatedComputeUnits.toLocaleString()}`,\n `Estimated Fee: ${(Number(analysis.estimatedFee) / 1e9).toFixed(6)} SOL`,\n ''\n ]\n \n // Add instruction details\n lines.push('Instructions:')\n for (const instr of analysis.instructions) {\n lines.push(` ${instr.index + 1}. ${instr.humanReadable}`)\n lines.push(` Program: ${instr.programId.slice(0, 8)}...`)\n lines.push(` Accounts: ${instr.accountCount}, Data: ${instr.dataSize} bytes`)\n }\n \n // Add warnings\n if (analysis.warnings.length > 0) {\n lines.push('')\n lines.push('⚠️ Warnings:')\n for (const warning of analysis.warnings) {\n lines.push(` - ${warning}`)\n }\n }\n \n lines.push('═══════════════════════════════════════')\n \n return lines.join('\\n')\n }\n\n /**\n * Export debug logs\n */\n exportLogs(): string[] {\n return [...this.logs]\n }\n\n /**\n * Clear debug logs\n */\n clearLogs(): void {\n this.logs = []\n this.timings.clear()\n }\n}\n\n/**\n * Global development mode check\n */\nexport function isDevMode(): boolean {\n return DevTools.getInstance().isDevMode()\n}\n\n/**\n * Global logging function\n */\nexport function devLog(message: string, data?: unknown): void {\n DevTools.getInstance().log(message, data)\n}\n\n/**\n * Export DevTools as default\n */\nexport default DevTools","import type { Address } from '@solana/addresses'\nimport type { Instruction, TransactionSigner, Blockhash, Base64EncodedBytes, Base58EncodedBytes, TransactionMessageBytesBase64, TransactionMessageBytes, SignaturesMap, Signature } from '@solana/kit'\n// Type alias for backward compatibility with @solana/kit v2\ntype IInstruction = Instruction\nimport type { GhostSpeakConfig, ParticipantType } from '../types/index.js'\nimport { RpcClient } from './rpc-client.js'\nimport { createTransactionResult } from '../utils/transaction-urls.js'\nimport { logEnhancedError, createErrorContext } from '../utils/enhanced-client-errors.js'\nimport { DevTools, type TransactionAnalysis } from './DevTools.js'\nimport {\n pipe,\n createTransactionMessage,\n setTransactionMessageFeePayerSigner,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n appendTransactionMessageInstructions,\n signTransactionMessageWithSigners,\n getBase64EncodedWireTransaction,\n compileTransactionMessage\n} from '@solana/kit'\n\n/**\n * Type for instruction-like objects from generated code\n */\ntype InstructionLike = {\n programAddress: Address\n accounts?: readonly unknown[]\n data?: unknown\n}\n\n/**\n * Helper to validate instruction has required properties\n */\nfunction validateInstruction(instruction: unknown): asserts instruction is InstructionLike {\n const inst = instruction as Record<string, unknown>\n if (!inst.programAddress) {\n throw new Error('Invalid instruction format')\n }\n}\n\n/**\n * Unified instruction builder that eliminates duplication across all instruction classes.\n * This is the single source of truth for instruction execution patterns.\n */\nexport class InstructionBuilder {\n private rpcClient: RpcClient\n private config: GhostSpeakConfig\n private devTools: DevTools\n private debugMode = false\n\n constructor(config: GhostSpeakConfig) {\n this.config = config\n this.rpcClient = new RpcClient({\n endpoint: config.rpcEndpoint ?? 'https://api.devnet.solana.com',\n wsEndpoint: config.wsEndpoint,\n commitment: config.commitment ?? 'confirmed'\n })\n this.devTools = DevTools.getInstance(config)\n }\n\n /**\n * Execute a single instruction with unified error handling and transaction patterns\n */\n async execute<T = string>(\n instructionName: string,\n instructionGetter: () => Promise<InstructionLike> | InstructionLike,\n signers: TransactionSigner[],\n options?: {\n simulate?: boolean\n returnDetails?: boolean\n skipPreflight?: boolean\n maxRetries?: number\n }\n ): Promise<T> {\n const context = createErrorContext(\n 'execute',\n instructionName,\n signers.map(s => ({ address: s.address, name: 'signer' })),\n { programId: this.config.programId }\n )\n\n try {\n // Start timing if in dev mode\n if (this.devTools.isDevMode()) {\n this.devTools.startTiming(instructionName)\n }\n\n // Get the instruction and validate it\n const instruction = await Promise.resolve(instructionGetter())\n validateInstruction(instruction)\n\n // Debug mode - show analysis before execution\n if (this.debugMode || this.devTools.isDevMode()) {\n const analysis = this.devTools.analyzeTransaction([instruction] as unknown as IInstruction[])\n console.log(this.devTools.formatTransaction(analysis))\n this.debugMode = false // Reset debug mode\n }\n\n // Simulate if requested\n if (options?.simulate) {\n return await this.simulateInstruction(instruction, signers) as T\n }\n\n // Get latest blockhash\n const latestBlockhashResult = await this.rpcClient.getLatestBlockhash()\n const latestBlockhash = {\n blockhash: latestBlockhashResult.blockhash as Blockhash,\n lastValidBlockHeight: latestBlockhashResult.lastValidBlockHeight\n }\n\n // Build transaction message\n const transactionMessage = pipe(\n createTransactionMessage({ version: 0 }),\n tx => setTransactionMessageFeePayerSigner(signers[0], tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n tx => appendTransactionMessageInstructions([instruction as IInstruction], tx)\n )\n\n // Sign transaction\n const signedTransaction = await signTransactionMessageWithSigners(transactionMessage)\n \n // Send and confirm\n const signatureResult = await this.sendAndConfirm(\n signedTransaction,\n options?.skipPreflight ?? false,\n options?.maxRetries ?? 30\n )\n \n if (typeof signatureResult !== 'string') {\n throw new Error('Transaction signature is not a string')\n }\n \n const signature = signatureResult\n\n // Return detailed result if requested\n if (options?.returnDetails) {\n const cluster = this.config.cluster ?? 'devnet'\n const result = createTransactionResult(signature, cluster, this.config.commitment ?? 'confirmed') as unknown\n \n // End timing if in dev mode\n if (this.devTools.isDevMode()) {\n this.devTools.endTiming(instructionName)\n }\n \n return result as T\n }\n\n // End timing if in dev mode\n if (this.devTools.isDevMode()) {\n this.devTools.endTiming(instructionName)\n }\n\n return signature as T\n } catch (error) {\n logEnhancedError(error as Error, context)\n throw error\n }\n }\n\n /**\n * Execute multiple instructions in a single transaction\n */\n async executeBatch<T = string>(\n batchName: string,\n instructionGetters: (() => Promise<InstructionLike> | InstructionLike)[],\n signers: TransactionSigner[],\n options?: {\n simulate?: boolean\n returnDetails?: boolean\n skipPreflight?: boolean\n }\n ): Promise<T> {\n const context = createErrorContext(\n 'executeBatch',\n batchName,\n signers.map(s => ({ address: s.address, name: 'signer' })),\n { programId: this.config.programId, instructionCount: instructionGetters.length }\n )\n\n try {\n // Get all instructions and validate them\n const instructions = await Promise.all(\n instructionGetters.map(async (getter, i) => {\n const instruction = await Promise.resolve(getter())\n try {\n validateInstruction(instruction)\n return instruction\n } catch (error) {\n throw new Error(`Instruction ${i} in ${batchName}: ${(error as Error).message}`)\n }\n })\n )\n\n // Check transaction size\n const estimatedSize = this.estimateTransactionSize(instructions as IInstruction[])\n if (estimatedSize > 1232) {\n throw new Error(`Transaction too large: ${estimatedSize} bytes (max: 1232)`)\n }\n\n // Simulate if requested\n if (options?.simulate) {\n return await this.simulateBatch(instructions as IInstruction[], signers) as T\n }\n\n // Get latest blockhash\n const latestBlockhashResult = await this.rpcClient.getLatestBlockhash()\n const latestBlockhash = {\n blockhash: latestBlockhashResult.blockhash as Blockhash,\n lastValidBlockHeight: latestBlockhashResult.lastValidBlockHeight\n }\n\n // Build transaction message\n const transactionMessage = pipe(\n createTransactionMessage({ version: 0 }),\n tx => setTransactionMessageFeePayerSigner(signers[0], tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n tx => appendTransactionMessageInstructions(instructions as IInstruction[], tx)\n )\n\n // Sign transaction\n const signedTransaction = await signTransactionMessageWithSigners(transactionMessage)\n \n // Send and confirm\n const signatureResult = await this.sendAndConfirm(\n signedTransaction,\n options?.skipPreflight ?? false\n )\n \n if (typeof signatureResult !== 'string') {\n throw new Error('Transaction signature is not a string')\n }\n \n const signature = signatureResult\n\n // Return detailed result if requested\n if (options?.returnDetails) {\n const cluster = this.config.cluster ?? 'devnet'\n const result = createTransactionResult(signature, cluster, this.config.commitment ?? 'confirmed') as unknown\n \n // End timing if in dev mode\n if (this.devTools.isDevMode()) {\n this.devTools.endTiming(batchName)\n }\n \n return result as T\n }\n\n // End timing if in dev mode\n if (this.devTools.isDevMode()) {\n this.devTools.endTiming(batchName)\n }\n\n return signature as T\n } catch (error) {\n logEnhancedError(error as Error, context)\n throw error\n }\n }\n\n /**\n * Get and decode account data with unified error handling\n */\n async getAccount<T>(\n address: Address,\n decoderImportName: string\n ): Promise<T | null> {\n try {\n const accountInfo = await this.rpcClient.getAccountInfo(address, {\n commitment: this.config.commitment\n })\n \n if (!accountInfo) return null\n\n // Dynamic import and decode\n const generated = await import('../generated/index.js')\n const decoderGetter = (generated as Record<string, unknown>)[decoderImportName] as (() => { decode: (data: Uint8Array | Buffer) => T })\n \n // Decoder existence guaranteed by dynamic import\n\n const decoder = decoderGetter()\n const rawData = this.extractRawData(accountInfo.data)\n \n return decoder.decode(rawData)\n } catch (error) {\n console.warn(`Failed to fetch account ${address}:`, error)\n return null\n }\n }\n\n /**\n * Get multiple accounts with unified pattern\n */\n async getAccounts<T>(\n addresses: Address[],\n decoderImportName: string\n ): Promise<(T | null)[]> {\n try {\n const accounts = await this.rpcClient.getMultipleAccounts(addresses, {\n commitment: this.config.commitment\n })\n\n // Dynamic import decoder\n const generated = await import('../generated/index.js')\n const decoderGetter = (generated as Record<string, unknown>)[decoderImportName] as (() => { decode: (data: Uint8Array | Buffer) => T })\n \n // Decoder existence guaranteed by dynamic import\n\n const decoder = decoderGetter()\n \n return accounts.map(accountInfo => {\n if (!accountInfo) return null\n try {\n const rawData = this.extractRawData(accountInfo.data)\n return decoder.decode(rawData)\n } catch {\n return null\n }\n })\n } catch (error) {\n console.warn('Failed to fetch multiple accounts:', error)\n return addresses.map(() => null)\n }\n }\n\n /**\n * Get program accounts with filters\n */\n async getProgramAccounts<T>(\n decoderImportName: string,\n filters?: ({ dataSize: bigint } | { memcmp: { offset: bigint; bytes: string; encoding?: 'base58' | 'base64' } })[]\n ): Promise<{ address: Address; data: T }[]> {\n try {\n // Convert filters to the proper branded types for RPC client\n const convertedFilters = filters?.map(filter => {\n if ('dataSize' in filter) {\n return { dataSize: filter.dataSize }\n } else {\n const encoding = filter.memcmp.encoding ?? 'base58'\n if (encoding === 'base64') {\n return {\n memcmp: {\n offset: filter.memcmp.offset,\n bytes: filter.memcmp.bytes as Base64EncodedBytes,\n encoding: 'base64' as const\n }\n }\n } else {\n return {\n memcmp: {\n offset: filter.memcmp.offset,\n bytes: filter.memcmp.bytes as Base58EncodedBytes,\n encoding: 'base58' as const\n }\n }\n }\n }\n })\n\n const accounts = await this.rpcClient.getProgramAccounts(this.config.programId!, {\n commitment: this.config.commitment,\n filters: convertedFilters ?? []\n })\n\n // Dynamic import decoder\n const generated = await import('../generated/index.js')\n const decoderGetter = (generated as Record<string, unknown>)[decoderImportName] as (() => { decode: (data: Uint8Array | Buffer) => T })\n \n // Decoder existence guaranteed by dynamic import\n\n const decoder = decoderGetter()\n const decodedAccounts: { address: Address; data: T }[] = []\n\n for (const { pubkey, account } of accounts) {\n try {\n const rawData = this.extractRawData(account.data)\n const decodedData = decoder.decode(rawData)\n decodedAccounts.push({ address: pubkey, data: decodedData })\n } catch {\n // Skip accounts that fail to decode\n }\n }\n\n return decodedAccounts\n } catch (error) {\n console.error('Failed to get program accounts:', error)\n return []\n }\n }\n\n /**\n * Enable debug mode for next transaction\n */\n enableDebug(): this {\n this.debugMode = true\n return this\n }\n\n /**\n * Debug transaction - analyze without executing\n */\n async debug(\n instructionName: string,\n instructionGetters: (() => Promise<InstructionLike> | InstructionLike)[]\n ): Promise<TransactionAnalysis> {\n this.devTools.log(`Debugging ${instructionName}`)\n \n // Get all instructions and validate them\n const instructions = await Promise.all(\n instructionGetters.map(async getter => {\n const instruction = await Promise.resolve(getter())\n validateInstruction(instruction)\n return instruction\n })\n )\n \n // Analyze transaction\n const analysis = this.devTools.analyzeTransaction(instructions as unknown as IInstruction[])\n \n // Log formatted analysis\n console.log(this.devTools.formatTransaction(analysis))\n \n return analysis\n }\n\n /**\n * Get human-readable explanation of transaction\n */\n async explain(\n instructionName: string,\n instructionGetters: (() => Promise<InstructionLike> | InstructionLike)[]\n ): Promise<string> {\n const analysis = await this.debug(instructionName, instructionGetters)\n \n const lines = [\n `🔍 Transaction: ${instructionName}`,\n '',\n 'This transaction will:',\n ...analysis.instructions.map((instr, i) => ` ${i + 1}. ${instr.humanReadable}`),\n '',\n `Cost: ~${(Number(analysis.estimatedFee) / 1e9).toFixed(6)} SOL`,\n `Size: ${analysis.estimatedSize} bytes`,\n `Compute: ${analysis.estimatedComputeUnits.toLocaleString()} units`\n ]\n \n if (analysis.warnings.length > 0) {\n lines.push('', '⚠️ Warnings:')\n lines.push(...analysis.warnings.map(w => ` - ${w}`))\n }\n \n return lines.join('\\n')\n }\n\n /**\n * Estimate transaction cost\n */\n async estimateCost(\n instructionGetters: (() => Promise<InstructionLike> | InstructionLike)[]\n ): Promise<bigint> {\n try {\n const instructions = await Promise.all(\n instructionGetters.map(async getter => {\n const instruction = await Promise.resolve(getter())\n validateInstruction(instruction)\n return instruction\n })\n )\n\n const latestBlockhashResult = await this.rpcClient.getLatestBlockhash()\n const latestBlockhash = {\n blockhash: latestBlockhashResult.blockhash as Blockhash,\n lastValidBlockHeight: latestBlockhashResult.lastValidBlockHeight\n }\n \n const transactionMessage = pipe(\n createTransactionMessage({ version: 0 }),\n tx => setTransactionMessageFeePayer(this.config.defaultFeePayer!, tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n tx => appendTransactionMessageInstructions(instructions as IInstruction[], tx)\n )\n\n const compiledMessage = compileTransactionMessage(transactionMessage)\n const encodedMessage = Buffer.from(compiledMessage as unknown as Uint8Array).toString('base64')\n \n const fee = await this.rpcClient.getFeeForMessage(encodedMessage as TransactionMessageBytesBase64)\n return BigInt(fee ?? 0)\n } catch {\n // Fallback estimate\n const baseFee = 5000n\n const perInstructionFee = 1000n\n return baseFee + (BigInt(instructionGetters.length) * perInstructionFee)\n }\n }\n\n // Private helper methods\n\n private async sendAndConfirm(\n signedTransaction: Readonly<{ messageBytes: TransactionMessageBytes; signatures: SignaturesMap; }>,\n skipPreflight: boolean,\n maxRetries = 30\n ): Promise<Signature> {\n const wireTransaction = getBase64EncodedWireTransaction(signedTransaction as Readonly<{ messageBytes: TransactionMessageBytes; signatures: SignaturesMap; }>)\n \n const signature = await this.rpcClient.sendTransaction(wireTransaction, {\n skipPreflight,\n preflightCommitment: this.config.commitment\n })\n\n console.log('🔍 Transaction sent, signature:', signature)\n console.log('🔍 Signature length:', signature.length)\n console.log('🔍 Signature type:', typeof signature)\n\n // Poll for confirmation with improved logic\n let confirmed = false\n let attempts = 0\n let currentDelay = 1000\n const maxConfirmationTime = 30000 // 30 seconds max\n\n const startTime = Date.now()\n\n while (!confirmed && attempts < maxRetries && (Date.now() - startTime) < maxConfirmationTime) {\n try {\n console.log(`🔍 Confirmation attempt ${attempts + 1}/${maxRetries}`)\n const statuses = await this.rpcClient.getSignatureStatuses([signature] as const)\n \n if (statuses[0]) {\n console.log('🔍 Status found:', statuses[0])\n if (statuses[0].err) {\n throw new Error(`Transaction failed: ${JSON.stringify(statuses[0].err, (_, v: unknown) => typeof v === 'bigint' ? v.toString() : v)}`)\n }\n \n const confirmationStatus = statuses[0].confirmationStatus\n if (confirmationStatus === this.config.commitment || \n (this.config.commitment === 'confirmed' && confirmationStatus === 'finalized')) {\n confirmed = true\n console.log('✅ Transaction confirmed via status check')\n break\n }\n } else {\n console.log('🔍 No status found, trying transaction details...')\n // Fallback: try to get transaction details directly\n try {\n // Try to import and create a direct RPC connection for transaction lookup\n const { createSolanaRpc } = await import('@solana/kit')\n const directRpc = createSolanaRpc(this.config.rpcEndpoint ?? 'https://api.devnet.solana.com')\n const transaction = await directRpc.getTransaction(signature, {\n commitment: this.config.commitment ?? 'confirmed',\n encoding: 'json',\n maxSupportedTransactionVersion: 0\n }).send()\n \n if (transaction && transaction.meta) {\n if (transaction.meta.err) {\n throw new Error(`Transaction failed: ${JSON.stringify(transaction.meta.err, (_, v: unknown) => typeof v === 'bigint' ? v.toString() : v)}`)\n }\n confirmed = true\n console.log('✅ Transaction confirmed via direct lookup')\n break\n }\n } catch {\n console.log('🔍 Transaction details not yet available')\n }\n }\n \n attempts++\n await new Promise(resolve => setTimeout(resolve, currentDelay))\n currentDelay = Math.min(currentDelay * 1.5, 5000)\n \n } catch (error) {\n if (error instanceof Error && error.message.includes('Transaction failed')) {\n throw error\n }\n console.log(`🔍 Confirmation attempt failed:`, (error as Error).message)\n attempts++\n await new Promise(resolve => setTimeout(resolve, currentDelay * 2))\n }\n }\n\n if (!confirmed) {\n // Before giving up, do one final check with direct transaction lookup\n console.log('🔍 Final confirmation attempt via transaction lookup...')\n try {\n const { createSolanaRpc } = await import('@solana/kit')\n const directRpc = createSolanaRpc(this.config.rpcEndpoint ?? 'https://api.devnet.solana.com')\n const transaction = await directRpc.getTransaction(signature, {\n commitment: this.config.commitment ?? 'confirmed',\n encoding: 'json',\n maxSupportedTransactionVersion: 0\n }).send()\n \n if (transaction && transaction.meta) {\n if (transaction.meta.err) {\n throw new Error(`Transaction failed: ${JSON.stringify(transaction.meta.err, (_, v: unknown) => typeof v === 'bigint' ? v.toString() : v)}`)\n }\n console.log('✅ Transaction confirmed on final check - returning success')\n return signature as Signature\n }\n } catch (finalError) {\n console.log('🔍 Final check failed:', (finalError as Error).message)\n }\n \n // Transaction was sent but confirmation timed out\n // This often happens on devnet - the transaction may still be successful\n console.log('⚠️ Transaction confirmation timed out, but transaction was sent')\n console.log(` Check status at: https://explorer.solana.com/tx/${signature}?cluster=${this.config.cluster || 'devnet'}`)\n \n // Return the signature anyway since the transaction was sent\n // The caller can check the transaction status manually if needed\n return signature as Signature\n }\n\n return signature as Signature\n }\n\n private async simulateInstruction(\n instruction: InstructionLike,\n signers: TransactionSigner[]\n ): Promise<unknown> {\n const latestBlockhashResult = await this.rpcClient.getLatestBlockhash()\n const latestBlockhash = {\n blockhash: latestBlockhashResult.blockhash as Blockhash,\n lastValidBlockHeight: latestBlockhashResult.lastValidBlockHeight\n }\n \n const transactionMessage = pipe(\n createTransactionMessage({ version: 0 }),\n tx => setTransactionMessageFeePayerSigner(signers[0], tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n tx => appendTransactionMessageInstructions([instruction as IInstruction], tx)\n )\n\n const signedTransaction = await signTransactionMessageWithSigners(transactionMessage)\n const wireTransaction = getBase64EncodedWireTransaction(signedTransaction as Readonly<{ messageBytes: TransactionMessageBytes; signatures: SignaturesMap; }>)\n\n return this.rpcClient.simulateTransaction(wireTransaction, {\n commitment: this.config.commitment,\n replaceRecentBlockhash: true\n })\n }\n\n private async simulateBatch(\n instructions: IInstruction[],\n signers: TransactionSigner[]\n ): Promise<unknown> {\n const latestBlockhashResult = await this.rpcClient.getLatestBlockhash()\n const latestBlockhash = {\n blockhash: latestBlockhashResult.blockhash as Blockhash,\n lastValidBlockHeight: latestBlockhashResult.lastValidBlockHeight\n }\n \n const transactionMessage = pipe(\n createTransactionMessage({ version: 0 }),\n tx => setTransactionMessageFeePayerSigner(signers[0], tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),\n tx => appendTransactionMessageInstructions(instructions, tx)\n )\n\n const signedTransaction = await signTransactionMessageWithSigners(transactionMessage)\n const wireTransaction = getBase64EncodedWireTransaction(signedTransaction as Readonly<{ messageBytes: TransactionMessageBytes; signatures: SignaturesMap; }>)\n\n return this.rpcClient.simulateTransaction(wireTransaction, {\n commitment: this.config.commitment,\n replaceRecentBlockhash: true\n })\n }\n\n private estimateTransactionSize(instructions: IInstruction[]): number {\n let totalSize = 64 // Base transaction overhead\n \n for (const instruction of instructions) {\n totalSize += 32 // Program ID\n totalSize += (instruction.accounts?.length ?? 0) * 32 // Account metas\n totalSize += (instruction.data as Uint8Array).length // Instruction data\n }\n \n return totalSize\n }\n\n private extractRawData(data: unknown): Uint8Array {\n if (Buffer.isBuffer(data) || data instanceof Uint8Array) {\n return new Uint8Array(data)\n }\n if (typeof data === 'object' && data !== null && 'data' in data) {\n return Buffer.from((data as { data: string }).data, 'base64')\n }\n if (typeof data === 'string') {\n return Buffer.from(data, 'base64')\n }\n throw new Error('Invalid account data format')\n }\n\n // =====================================================\n // H2A PROTOCOL INSTRUCTION METHODS\n // =====================================================\n\n /**\n * Create a communication session instruction\n */\n async createCommunicationSession(_params: {\n sessionId: bigint\n initiator: Address\n initiatorType: ParticipantType\n responder: Address\n responderType: ParticipantType\n sessionType: string\n metadata: string\n expiresAt: bigint\n }): Promise<InstructionLike> {\n // This would typically use generated instruction builders\n // For now, return a placeholder that the H2A module can use\n return {\n programAddress: this.config.programId!,\n accounts: [],\n data: new Uint8Array(0) // Placeholder - would contain serialized instruction data\n }\n }\n\n /**\n * Send a communication message instruction\n */\n async sendCommunicationMessage(_sessionAddress: Address, _params: {\n messageId: bigint\n senderType: unknown // ParticipantType\n content: string\n messageType: string\n attachments: string[]\n }): Promise<InstructionLike> {\n // This would typically use generated instruction builders\n // For now, return a placeholder that the H2A module can use\n return {\n programAddress: this.config.programId!,\n accounts: [],\n data: new Uint8Array(0) // Placeholder - would contain serialized instruction data\n }\n }\n\n /**\n * Update participant status instruction\n */\n async updateParticipantStatus(_params: {\n participant: Address\n participantType: unknown // ParticipantType\n servicesOffered: string[]\n availability: boolean\n reputationScore: number\n }): Promise<InstructionLike> {\n // This would typically use generated instruction builders\n // For now, return a placeholder that the H2A module can use\n return {\n programAddress: this.config.programId!,\n accounts: [],\n data: new Uint8Array(0) // Placeholder - would contain serialized instruction data\n }\n }\n}\n\n","/**\n * CacheManager - Slot-aware RPC result caching\n *\n * Reduces RPC calls by caching account data and PDA derivations\n * with commitment-level aware TTLs.\n *\n * @module CacheManager\n */\n\nimport { LRUCache } from 'lru-cache'\nimport type { Address } from '@solana/addresses'\nimport type { Commitment } from '@solana/kit'\n\n/**\n * Cache configuration options\n */\nexport interface CacheConfig {\n /** Enable caching (default: false, opt-in) */\n enabled?: boolean\n /** Maximum cache entries (default: 1000) */\n maxSize?: number\n /** Custom TTL overrides (milliseconds) */\n ttlOverrides?: {\n processed?: number\n confirmed?: number\n finalized?: number\n }\n}\n\n/**\n * Cached entry metadata\n */\ninterface CacheEntry<T> {\n data: T\n slot: number\n commitment: Commitment\n timestamp: number\n}\n\n/**\n * Default TTLs by commitment level (milliseconds)\n */\nconst DEFAULT_TTLS: Record<Commitment, number> = {\n processed: 500, // 500ms - very volatile\n confirmed: 2000, // 2s - less volatile\n finalized: 30000, // 30s - stable\n}\n\n/**\n * CacheManager handles slot-aware caching for RPC results\n *\n * Features:\n * - Commitment-level TTLs (finalized=30s, confirmed=2s, processed=500ms)\n * - Indefinite PDA caching (deterministic addresses)\n * - LRU eviction policy\n * - Opt-in (disabled by default)\n */\nexport class CacheManager {\n private accountCache: LRUCache<string, CacheEntry<unknown>>\n private pdaCache: LRUCache<string, Address>\n private config: Required<CacheConfig>\n private ttls: Record<Commitment, number>\n\n constructor(config: CacheConfig = {}) {\n this.config = {\n enabled: config.enabled ?? false,\n maxSize: config.maxSize ?? 1000,\n ttlOverrides: config.ttlOverrides ?? {},\n }\n\n // Merge default TTLs with user overrides\n this.ttls = {\n processed: config.ttlOverrides?.processed ?? DEFAULT_TTLS.processed,\n confirmed: config.ttlOverrides?.confirmed ?? DEFAULT_TTLS.confirmed,\n finalized: config.ttlOverrides?.finalized ?? DEFAULT_TTLS.finalized,\n }\n\n // Initialize LRU caches\n this.accountCache = new LRUCache({\n max: this.config.maxSize,\n ttl: DEFAULT_TTLS.finalized, // Default TTL (overridden per entry)\n })\n\n // PDA cache has no TTL (deterministic addresses never change)\n this.pdaCache = new LRUCache({\n max: this.config.maxSize,\n })\n }\n\n /**\n * Check if caching is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled\n }\n\n /**\n * Get cached account data\n *\n * @param address - Account address\n * @param commitment - Commitment level\n * @param currentSlot - Current blockchain slot (for staleness check)\n * @returns Cached data or undefined\n */\n getAccount<T>(\n address: Address,\n commitment: Commitment,\n currentSlot?: number\n ): T | undefined {\n if (!this.config.enabled) return undefined\n\n const key = `${address}:${commitment}`\n const entry = this.accountCache.get(key) as CacheEntry<T> | undefined\n\n if (!entry) return undefined\n\n // Check if entry is stale based on slot (if current slot provided)\n if (currentSlot !== undefined && entry.slot < currentSlot) {\n this.accountCache.delete(key)\n return undefined\n }\n\n return entry.data\n }\n\n /**\n * Cache account data\n *\n * @param address - Account address\n * @param data - Account data to cache\n * @param commitment - Commitment level\n * @param slot - Blockchain slot when data was fetched\n */\n setAccount<T>(\n address: Address,\n data: T,\n commitment: Commitment,\n slot: number\n ): void {\n if (!this.config.enabled) return\n\n const key = `${address}:${commitment}`\n const entry: CacheEntry<T> = {\n data,\n slot,\n commitment,\n timestamp: Date.now(),\n }\n\n // Set with commitment-level TTL\n this.accountCache.set(key, entry as CacheEntry<unknown>, {\n ttl: this.ttls[commitment],\n })\n }\n\n /**\n * Get cached PDA\n *\n * PDAs are cached indefinitely as they're deterministic.\n *\n * @param seeds - Serialized seed components\n * @returns Cached PDA or undefined\n */\n getPDA(seeds: string): Address | undefined {\n if (!this.config.enabled) return undefined\n return this.pdaCache.get(seeds)\n }\n\n /**\n * Cache PDA derivation\n *\n * @param seeds - Serialized seed components (use JSON.stringify for consistency)\n * @param pda - Derived PDA address\n */\n setPDA(seeds: string, pda: Address): void {\n if (!this.config.enabled) return\n this.pdaCache.set(seeds, pda)\n }\n\n /**\n * Invalidate account cache entry\n *\n * @param address - Account address to invalidate\n * @param commitment - Optional commitment level (invalidates all if not specified)\n */\n invalidateAccount(address: Address, commitment?: Commitment): void {\n if (!this.config.enabled) return\n\n if (commitment) {\n this.accountCache.delete(`${address}:${commitment}`)\n } else {\n // Invalidate all commitment levels\n ;(['processed', 'confirmed', 'finalized'] as Commitment[]).forEach((c) => {\n this.accountCache.delete(`${address}:${c}`)\n })\n }\n }\n\n /**\n * Clear all caches\n */\n clear(): void {\n this.accountCache.clear()\n this.pdaCache.clear()\n }\n\n /**\n * Get cache statistics\n *\n * @returns Cache size and hit/miss stats\n */\n getStats(): {\n accountCache: { size: number; max: number }\n pdaCache: { size: number; max: number }\n } {\n return {\n accountCache: {\n size: this.accountCache.size,\n max: this.config.maxSize,\n },\n pdaCache: {\n size: this.pdaCache.size,\n max: this.config.maxSize,\n },\n }\n }\n}\n","import type { Address } from '@solana/addresses'\nimport type { TransactionSigner, Instruction } from '@solana/kit'\n// Use string type for signature since @solana/rpc-types doesn't export Signature in v2\ntype Signature = string\n// Type alias for backward compatibility with @solana/kit v2\ntype IInstruction = Instruction\nimport type { GhostSpeakConfig } from '../types/index.js'\nimport { InstructionBuilder } from './InstructionBuilder.js'\nimport type { TransactionResult } from '../utils/transaction-urls.js'\nimport { CacheManager } from './CacheManager.js'\n\n/**\n * Base class for all instruction modules using the unified InstructionBuilder.\n * This replaces the old BaseInstructions class with a much simpler pattern.\n */\nexport abstract class BaseModule {\n protected builder: InstructionBuilder\n protected config: GhostSpeakConfig\n protected logger?: { info: (...args: unknown[]) => void; error: (...args: unknown[]) => void }\n protected cacheManager: CacheManager\n private _debugMode = false\n\n constructor(config: GhostSpeakConfig) {\n this.config = config\n this.builder = new InstructionBuilder(config)\n this.cacheManager = new CacheManager(config.cache)\n // Optional: Set logger if provided in config\n this.logger = config.logger\n }\n\n /**\n * Enable debug mode for next operation\n */\n debug(): this {\n this._debugMode = true\n this.builder.enableDebug()\n return this\n }\n\n /**\n * Execute a single instruction\n */\n protected async execute(\n instructionName: string,\n instructionGetter: () => Promise<IInstruction> | IInstruction,\n signers: TransactionSigner[]\n ): Promise<string> {\n return this.builder.execute(\n instructionName,\n instructionGetter,\n signers\n ) as Promise<string>\n }\n\n /**\n * Execute a single instruction with detailed result\n */\n protected async executeWithDetails(\n instructionName: string,\n instructionGetter: () => Promise<IInstruction> | IInstruction,\n signers: TransactionSigner[]\n ): Promise<TransactionResult> {\n return this.builder.execute(\n instructionName,\n instructionGetter,\n signers,\n { returnDetails: true }\n )\n }\n\n /**\n * Execute multiple instructions in a batch\n */\n protected async executeBatch(\n batchName: string,\n instructionGetters: (() => Promise<IInstruction> | IInstruction)[],\n signers: TransactionSigner[]\n ): Promise<Signature> {\n return this.builder.executeBatch(\n batchName,\n instructionGetters.map(getter => () => Promise.resolve(getter())),\n signers\n )\n }\n\n /**\n * Simulate an instruction\n */\n protected async simulate(\n instructionName: string,\n instructionGetter: () => Promise<IInstruction> | IInstruction,\n signers: TransactionSigner[]\n ): Promise<unknown> {\n return this.builder.execute(\n instructionName,\n () => Promise.resolve(instructionGetter()),\n signers,\n { simulate: true }\n )\n }\n\n /**\n * Simulate an instruction (public accessor)\n */\n public async simulateInstruction(\n instructionName: string,\n instructionGetter: () => Promise<IInstruction> | IInstruction,\n signers: TransactionSigner[]\n ): Promise<unknown> {\n return this.simulate(instructionName, instructionGetter, signers)\n }\n\n /**\n * Estimate transaction cost\n */\n protected async estimateCost(\n instructionGetters: (() => Promise<IInstruction> | IInstruction)[]\n ): Promise<bigint> {\n return this.builder.estimateCost(instructionGetters)\n }\n\n /**\n * Get cost estimation for an instruction\n */\n async getCost(\n instructionName: string,\n instructionGetter: () => Promise<IInstruction> | IInstruction\n ): Promise<bigint> {\n return this.builder.estimateCost([instructionGetter])\n }\n\n /**\n * Get human-readable explanation\n */\n async explain(\n instructionName: string,\n instructionGetter: () => Promise<IInstruction> | IInstruction\n ): Promise<string> {\n return this.builder.explain(instructionName, [instructionGetter])\n }\n\n /**\n * Debug analyze without executing\n */\n async analyze(\n instructionName: string,\n instructionGetter: () => Promise<IInstruction> | IInstruction\n ): Promise<unknown> {\n return this.builder.debug(instructionName, [instructionGetter])\n }\n\n /**\n * Get decoded account (with optional caching)\n */\n protected async getAccount<T>(\n address: Address,\n decoderImportName: string\n ): Promise<T | null> {\n // Check cache first (if enabled)\n if (this.cacheManager.isEnabled()) {\n const cached = this.cacheManager.getAccount<T>(address, this.commitment)\n if (cached !== undefined) {\n this.logger?.info(`[Cache HIT] ${address}`)\n return cached\n }\n }\n\n // Cache miss - fetch from RPC\n const account = await this.builder.getAccount<T>(address, decoderImportName)\n\n // Cache the result (if enabled and account exists)\n if (this.cacheManager.isEnabled() && account !== null) {\n // Get current slot for cache metadata (optional enhancement)\n const slot = 0 // TODO: fetch current slot from RPC context\n this.cacheManager.setAccount(address, account, this.commitment, slot)\n this.logger?.info(`[Cache SET] ${address}`)\n }\n\n return account\n }\n\n /**\n * Get multiple decoded accounts (with optional caching)\n */\n protected async getAccounts<T>(\n addresses: Address[],\n decoderImportName: string\n ): Promise<(T | null)[]> {\n if (!this.cacheManager.isEnabled()) {\n // Caching disabled - fetch all\n return this.builder.getAccounts<T>(addresses, decoderImportName)\n }\n\n // Check cache for each address\n const results: (T | null)[] = new Array(addresses.length)\n const uncachedIndices: number[] = []\n const uncachedAddresses: Address[] = []\n\n for (let i = 0; i < addresses.length; i++) {\n const cached = this.cacheManager.getAccount<T>(addresses[i], this.commitment)\n if (cached !== undefined) {\n results[i] = cached\n this.logger?.info(`[Cache HIT] ${addresses[i]}`)\n } else {\n uncachedIndices.push(i)\n uncachedAddresses.push(addresses[i])\n }\n }\n\n // Fetch uncached accounts\n if (uncachedAddresses.length > 0) {\n this.logger?.info(`[Cache MISS] Fetching ${uncachedAddresses.length}/${addresses.length} accounts`)\n const fetched = await this.builder.getAccounts<T>(uncachedAddresses, decoderImportName)\n\n // Insert fetched results and cache them\n const slot = 0 // TODO: fetch current slot\n for (let i = 0; i < fetched.length; i++) {\n const originalIndex = uncachedIndices[i]\n const account = fetched[i]\n results[originalIndex] = account\n\n if (account !== null) {\n this.cacheManager.setAccount(uncachedAddresses[i], account, this.commitment, slot)\n }\n }\n }\n\n return results\n }\n\n /**\n * Get program accounts\n */\n protected async getProgramAccounts<T>(\n decoderImportName: string,\n filters?: ({ dataSize: bigint } | { memcmp: { offset: bigint; bytes: string; encoding?: 'base58' | 'base64' } })[]\n ): Promise<{ address: Address; data: T }[]> {\n return this.builder.getProgramAccounts<T>(decoderImportName, filters)\n }\n\n /**\n * Get program ID\n */\n protected get programId(): Address {\n return this.config.programId!\n }\n\n /**\n * Get program ID (public accessor)\n */\n public getProgramId(): Address {\n return this.config.programId!\n }\n\n /**\n * Get commitment level\n */\n protected get commitment() {\n return this.config.commitment ?? 'confirmed'\n }\n\n /**\n * Get commitment level (public accessor)\n */\n public getCommitment() {\n return this.config.commitment ?? 'confirmed'\n }\n\n /**\n * Invalidate cache for specific account\n */\n public invalidateCache(address: Address): void {\n this.cacheManager.invalidateAccount(address)\n this.logger?.info(`[Cache INVALIDATE] ${address}`)\n }\n\n /**\n * Clear all caches\n */\n public clearCache(): void {\n this.cacheManager.clear()\n this.logger?.info('[Cache CLEAR] All caches cleared')\n }\n\n /**\n * Get cache statistics\n */\n public getCacheStats() {\n return this.cacheManager.getStats()\n }\n}","/**\n * Utility functions for IPFS operations in GhostSpeak\n */\n\nimport './text-encoder-polyfill.js'\nimport type {\n IPFSConfig,\n IPFSContentMetadata,\n ContentStorageResult,\n IPFSUploadOptions,\n IPFSOperationResult\n} from '../types/ipfs-types.js'\nimport { IPFSClient } from './ipfs-client.js'\n\n/**\n * Default IPFS configuration for GhostSpeak\n */\nexport const DEFAULT_IPFS_CONFIG: IPFSConfig = {\n provider: {\n name: 'pinata',\n endpoint: 'https://api.pinata.cloud'\n },\n gateways: [\n 'https://gateway.pinata.cloud',\n 'https://ipfs.io',\n 'https://cloudflare-ipfs.com',\n 'https://gateway.ipfs.io'\n ],\n autoPinning: true,\n sizeThreshold: 800, // 800 bytes threshold to stay under Solana transaction limits\n maxRetries: 3,\n retryDelay: 1000,\n enableCache: true,\n cacheTTL: 300000 // 5 minutes\n}\n\n/**\n * IPFS utility class with convenience methods\n */\nexport class IPFSUtils {\n public client: IPFSClient\n\n constructor(config: IPFSConfig) {\n this.client = new IPFSClient(config)\n }\n\n /**\n * Store agent metadata with automatic IPFS/inline decision\n */\n async storeAgentMetadata(\n metadata: {\n name: string\n description: string\n capabilities: string[]\n serviceEndpoint: string\n agentId?: string\n [key: string]: unknown\n },\n options?: IPFSUploadOptions\n ): Promise<ContentStorageResult> {\n const metadataJson = JSON.stringify({\n ...metadata,\n createdAt: new Date().toISOString(),\n version: '1.0.0'\n })\n\n return this.client.storeContent(metadataJson, 'agent-metadata', {\n filename: `agent-${metadata.agentId ?? 'metadata'}.json`,\n metadata: {\n type: 'agent-metadata',\n agentId: metadata.agentId,\n name: metadata.name\n },\n contentType: 'application/json',\n ...options\n })\n }\n\n /**\n * Store channel message content with automatic IPFS/inline decision\n */\n async storeChannelMessage(\n message: {\n content: string\n messageType?: number\n attachments?: string[]\n channelId?: string\n sender?: string\n [key: string]: unknown\n },\n options?: IPFSUploadOptions\n ): Promise<ContentStorageResult> {\n const messageJson = JSON.stringify({\n ...message,\n timestamp: new Date().toISOString(),\n version: '1.0.0'\n })\n\n return this.client.storeContent(messageJson, 'channel-message', {\n filename: `message-${Date.now()}.json`,\n metadata: {\n type: 'channel-message',\n channelId: message.channelId,\n messageType: message.messageType ?? 0\n },\n contentType: 'application/json',\n ...options\n })\n }\n\n /**\n * Store file attachments on IPFS\n */\n async storeFileAttachment(\n fileContent: Uint8Array | string,\n filename: string,\n contentType: string,\n options?: IPFSUploadOptions\n ): Promise<ContentStorageResult> {\n const content = typeof fileContent === 'string' ? fileContent : new TextDecoder().decode(fileContent)\n \n return this.client.storeContent(content, 'file-attachment', {\n filename,\n contentType,\n metadata: {\n type: 'file-attachment',\n originalFilename: filename,\n mimeType: contentType\n },\n ...options\n })\n }\n\n /**\n * Retrieve and parse agent metadata\n */\n async retrieveAgentMetadata(uri: string): Promise<{\n name: string\n description: string\n capabilities: string[]\n serviceEndpoint: string\n agentId?: string\n createdAt?: string\n [key: string]: unknown\n }> {\n const content = await this.client.retrieveContent(uri)\n const parsed: unknown = JSON.parse(content)\n \n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Retrieved agent metadata is not a valid object')\n }\n \n return parsed as {\n name: string\n description: string\n capabilities: string[]\n serviceEndpoint: string\n agentId?: string\n createdAt?: string\n [key: string]: unknown\n }\n }\n\n /**\n * Retrieve and parse channel message content\n */\n async retrieveChannelMessage(uri: string): Promise<{\n content: string\n messageType?: number\n attachments?: string[]\n timestamp?: string\n [key: string]: unknown\n }> {\n const content = await this.client.retrieveContent(uri)\n const parsed: unknown = JSON.parse(content)\n \n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Retrieved channel message is not a valid object')\n }\n \n return parsed as {\n content: string\n messageType?: number\n attachments?: string[]\n timestamp?: string\n [key: string]: unknown\n }\n }\n\n /**\n * Batch upload multiple content items\n */\n async batchUpload(\n items: {\n content: string\n type: IPFSContentMetadata['type']\n filename?: string\n options?: IPFSUploadOptions\n }[]\n ): Promise<IPFSOperationResult<ContentStorageResult>[]> {\n const results = await Promise.allSettled(\n items.map(item => \n this.client.storeContent(item.content, item.type, {\n filename: item.filename,\n ...item.options\n })\n )\n )\n\n return results.map(result => {\n if (result.status === 'fulfilled') {\n return {\n success: true,\n data: result.value\n }\n } else {\n return {\n success: false,\n error: 'UPLOAD_FAILED' as const,\n message: result.reason instanceof Error ? result.reason.message : String(result.reason)\n }\n }\n })\n }\n\n /**\n * Pin existing content by hash\n */\n async pinContent(hash: string): Promise<IPFSOperationResult<boolean>> {\n const result = await this.client.pin(hash)\n return {\n ...result,\n data: result.success\n }\n }\n\n /**\n * Check if a URI uses IPFS storage\n */\n isIPFSUri(uri: string): boolean {\n return uri.startsWith('ipfs://')\n }\n\n /**\n * Extract IPFS hash from URI\n */\n extractIPFSHash(uri: string): string | null {\n if (!this.isIPFSUri(uri)) {\n return null\n }\n return uri.replace('ipfs://', '')\n }\n\n /**\n * Convert IPFS hash to gateway URLs\n */\n getGatewayUrls(hash: string, gateways?: string[]): string[] {\n const defaultGateways = gateways ?? DEFAULT_IPFS_CONFIG.gateways ?? []\n return defaultGateways.map(gateway => `${gateway}/ipfs/${hash}`)\n }\n\n /**\n * Validate IPFS hash format\n */\n isValidIPFSHash(hash: string): boolean {\n // Basic validation for IPFS hash (CIDv0 or CIDv1)\n if (hash.length < 44) return false\n \n // CIDv0: starts with Qm and is 46 characters\n if (hash.startsWith('Qm') && hash.length === 46) {\n return /^Qm[A-Za-z0-9]{44}$/.test(hash)\n }\n \n // CIDv1: more complex validation\n if (hash.length > 46) {\n return /^[A-Za-z0-9]+$/.test(hash)\n }\n \n return false\n }\n\n /**\n * Calculate content size to determine if IPFS should be used\n */\n shouldUseIPFS(content: string, threshold?: number): boolean {\n const size = new TextEncoder().encode(content).length\n const sizeThreshold = threshold ?? DEFAULT_IPFS_CONFIG.sizeThreshold ?? 800\n return size > sizeThreshold\n }\n\n /**\n * Compress content before IPFS upload using modern compression APIs\n */\n async compressContent(content: string): Promise<{ compressed: string; algorithm: string }> {\n try {\n // Use browser CompressionStream if available (Node.js 18+ and modern browsers)\n if (typeof CompressionStream !== 'undefined') {\n const compressedStream = new CompressionStream('gzip')\n const writer = compressedStream.writable.getWriter()\n const reader = compressedStream.readable.getReader()\n \n // Encode string to Uint8Array\n const encoder = new TextEncoder()\n const input = encoder.encode(content)\n \n // Start compression\n const writePromise = writer.write(input).then(() => writer.close())\n const chunks: Uint8Array[] = []\n \n // Read compressed chunks\n const readCompressed = async (): Promise<void> => {\n const result: { done: boolean; value?: Uint8Array } = await reader.read()\n const { done, value } = result\n if (!done && value) {\n chunks.push(value as Uint8Array)\n await readCompressed()\n }\n }\n \n await Promise.all([writePromise, readCompressed()])\n \n // Combine chunks and encode as base64\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0)\n const compressedData = new Uint8Array(totalLength)\n let offset = 0\n \n for (const chunk of chunks) {\n compressedData.set(chunk, offset)\n offset += chunk.length\n }\n \n // Convert to base64 for storage\n const compressed = Buffer.from(compressedData).toString('base64')\n \n return {\n compressed,\n algorithm: 'gzip'\n }\n } else {\n // Fallback to no compression in environments without support\n console.warn('Compression not available in this environment, storing uncompressed')\n return {\n compressed: content,\n algorithm: 'none'\n }\n }\n } catch (error) {\n console.warn('Compression failed, falling back to uncompressed:', error)\n return {\n compressed: content,\n algorithm: 'none'\n }\n }\n }\n\n /**\n * Decompress content after IPFS retrieval using modern decompression APIs\n */\n async decompressContent(compressed: string, algorithm: string): Promise<string> {\n if (algorithm === 'none') {\n return compressed\n }\n \n try {\n if (algorithm === 'gzip') {\n // Use browser DecompressionStream if available (Node.js 18+ and modern browsers)\n if (typeof DecompressionStream !== 'undefined') {\n const decompressedStream = new DecompressionStream('gzip')\n const writer = decompressedStream.writable.getWriter()\n const reader = decompressedStream.readable.getReader()\n \n // Decode base64 to Uint8Array\n const compressedData = Buffer.from(compressed, 'base64')\n \n // Start decompression\n const writePromise = writer.write(compressedData).then(() => writer.close())\n const chunks: Uint8Array[] = []\n \n // Read decompressed chunks\n const readDecompressed = async (): Promise<void> => {\n const result: { done: boolean; value?: Uint8Array } = await reader.read()\n const { done, value } = result\n if (!done && value) {\n chunks.push(value as Uint8Array)\n await readDecompressed()\n }\n }\n \n await Promise.all([writePromise, readDecompressed()])\n \n // Combine chunks and decode to string\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0)\n const decompressedData = new Uint8Array(totalLength)\n let offset = 0\n \n for (const chunk of chunks) {\n decompressedData.set(chunk, offset)\n offset += chunk.length\n }\n \n // Convert to string\n const decoder = new TextDecoder()\n return decoder.decode(decompressedData)\n \n } else {\n console.warn('Decompression not available in this environment, returning compressed data')\n return compressed\n }\n } else {\n console.warn(`Unknown compression algorithm: ${algorithm}`)\n return compressed\n }\n } catch (error) {\n console.error('Decompression failed, returning compressed data:', error)\n return compressed\n }\n }\n\n /**\n * Get client stats\n */\n getStats(): {\n cacheStats: { size: number; keys: string[] }\n config: IPFSConfig\n } {\n return {\n cacheStats: this.client.getCacheStats(),\n config: DEFAULT_IPFS_CONFIG\n }\n }\n\n /**\n * Clear client cache\n */\n clearCache(): void {\n this.client.clearCache()\n }\n}\n\n/**\n * Create an IPFS utility instance with configuration\n */\nexport function createIPFSUtils(config?: Partial<IPFSConfig>): IPFSUtils {\n const finalConfig: IPFSConfig = {\n ...DEFAULT_IPFS_CONFIG,\n ...config,\n provider: {\n ...DEFAULT_IPFS_CONFIG.provider,\n ...config?.provider\n }\n }\n \n return new IPFSUtils(finalConfig)\n}\n\n/**\n * Helper function to determine optimal storage method\n */\nexport function determineStorageMethod(\n content: string,\n options?: {\n sizeThreshold?: number\n forceIPFS?: boolean\n forceInline?: boolean\n }\n): 'inline' | 'ipfs' {\n if (options?.forceInline) return 'inline'\n if (options?.forceIPFS) return 'ipfs'\n \n const size = new TextEncoder().encode(content).length\n const threshold = options?.sizeThreshold ?? DEFAULT_IPFS_CONFIG.sizeThreshold ?? 800\n \n return size > threshold ? 'ipfs' : 'inline'\n}\n\n/**\n * Create metadata URI with automatic storage decision\n */\nexport async function createMetadataUri(\n metadata: Record<string, unknown>,\n ipfsUtils?: IPFSUtils,\n options?: {\n type?: IPFSContentMetadata['type']\n filename?: string\n forceIPFS?: boolean\n }\n): Promise<string> {\n const metadataJson = JSON.stringify(metadata)\n const storageMethod = determineStorageMethod(metadataJson, { \n forceIPFS: options?.forceIPFS \n })\n \n if (storageMethod === 'inline' || !ipfsUtils) {\n // Store as data URI\n const encoded = Buffer.from(metadataJson).toString('base64')\n return `data:application/json;base64,${encoded}`\n } else {\n // Store on IPFS\n const result = await ipfsUtils.client.storeContent(\n metadataJson, \n options?.type ?? 'custom',\n {\n filename: options?.filename,\n contentType: 'application/json'\n }\n )\n return result.uri\n }\n}","import type { Address } from '@solana/addresses'\nimport type { TransactionSigner } from '@solana/kit'\nimport type { GhostSpeakConfig } from '../../types/index.js'\nimport type { IPFSConfig } from '../../types/ipfs-types.js'\nimport { BaseModule } from '../BaseModule.js'\nimport { createIPFSUtils } from '../../utils/ipfs-utils.js'\nimport { SYSTEM_PROGRAM_ADDRESS } from '../../constants/system-addresses.js'\nimport {\n getRegisterAgentInstructionAsync,\n getUpdateAgentInstruction,\n getVerifyAgentInstructionAsync,\n getDeactivateAgentInstruction,\n getActivateAgentInstruction,\n getRegisterAgentCompressedInstructionAsync,\n type Agent,\n PricingModel\n} from '../../generated/index.js'\n\n// External x402 agent types removed - use PayAI integration\n\n/** Agent type for external x402 agents */\nexport const EXTERNAL_X402_AGENT_TYPE = 10\n\n/**\n * Simplified agent management using unified instruction pattern\n */\nexport class AgentModule extends BaseModule {\n private ipfsUtils: ReturnType<typeof createIPFSUtils> | null = null\n\n constructor(config: GhostSpeakConfig & { ipfsConfig?: IPFSConfig }) {\n super(config)\n if (config.ipfsConfig) {\n this.ipfsUtils = createIPFSUtils(config.ipfsConfig)\n }\n }\n\n /**\n * Register a new agent\n */\n async register(signer: TransactionSigner, params: {\n agentType: number\n name: string\n description: string\n metadataUri: string\n agentId: string\n pricingModel?: PricingModel\n skipSimulation?: boolean\n }): Promise<string> {\n const pricingModel = params.pricingModel ?? PricingModel.Fixed;\n const registerGetter = async () => {\n const agentAccount = await this.deriveAgentPda(params.agentId, signer.address)\n const ix = await getRegisterAgentInstructionAsync({\n agentAccount,\n signer,\n systemProgram: this.systemProgramId,\n agentType: params.agentType,\n name: params.name,\n description: params.description,\n metadataUri: params.metadataUri,\n agentId: params.agentId,\n pricingModel\n })\n \n return ix;\n }\n\n const heapGetter = () => {\n // Request 64KB Heap (Index 1)\n // ComputeBudgetProgram ID: ComputeBudget111111111111111111111111111111\n const heapData = new Uint8Array(5);\n heapData[0] = 1; // RequestHeapFrame\n new DataView(heapData.buffer).setUint32(1, 256 * 1024, true); // 256KB (Safe margin)\n\n return {\n programAddress: 'ComputeBudget111111111111111111111111111111' as Address,\n accounts: [],\n data: heapData\n }\n }\n \n // Enable debug mode to get detailed transaction information\n this.debug()\n \n // If skipSimulation is true, call builder directly to bypass simulation\n if (params.skipSimulation) {\n console.log('\\uD83D\\uDE80 SKIPPING SIMULATION - Sending transaction directly')\n return this.builder.executeBatch(\n 'registerAgent',\n [heapGetter, registerGetter],\n [signer] as unknown as TransactionSigner[],\n { simulate: false, skipPreflight: true }\n ) as Promise<string>\n }\n \n return this.builder.executeBatch(\n 'registerAgent',\n [heapGetter, registerGetter],\n [signer] as unknown as TransactionSigner[]\n ) as Promise<string>\n }\n\n // registerX402Agent method removed - use PayAI integration\n\n /**\n * Register a compressed agent (5000x cheaper)\n */\n async registerCompressed(signer: TransactionSigner, params: {\n agentType: number\n name: string\n description: string\n metadataUri: string\n agentId: string\n merkleTree: Address\n treeConfig?: Address\n pricingModel?: PricingModel\n }): Promise<string> {\n const instructionGetter = async () => {\n // Derive treeConfig if not provided\n const treeConfig = params.treeConfig || await this.deriveTreeConfigPda(signer.address)\n \n const result = await getRegisterAgentCompressedInstructionAsync({\n merkleTree: params.merkleTree,\n treeAuthority: treeConfig, // Map to correct instruction field (it's treeAuthority in IDL?)\n signer,\n systemProgram: this.systemProgramId,\n compressionProgram: this.compressionProgramId,\n agentType: params.agentType,\n name: params.name,\n description: params.description,\n metadataUri: params.metadataUri,\n agentId: params.agentId,\n pricingModel: params.pricingModel ?? PricingModel.Fixed,\n logWrapper: 'noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV' as Address // Explicitly provide Noop program\n })\n return result\n }\n \n return this.execute(\n 'registerAgentCompressed',\n instructionGetter,\n [signer] as unknown as TransactionSigner[]\n )\n }\n\n /**\n * Update agent metadata\n */\n async update(signer: TransactionSigner, params: {\n agentAddress: Address\n metadataUri: string\n agentType: number\n agentId: string\n name?: string | null\n description?: string | null\n pricingModel?: PricingModel\n }): Promise<string> {\n const instructionGetter = () => {\n const result = getUpdateAgentInstruction({\n agentAccount: params.agentAddress,\n signer,\n metadataUri: params.metadataUri,\n agentType: params.agentType,\n agentId: params.agentId,\n name: params.name ?? null,\n description: params.description ?? null,\n pricingModel: params.pricingModel ?? PricingModel.Fixed\n })\n return result\n }\n \n return this.execute(\n 'updateAgent',\n instructionGetter,\n [signer] as unknown as TransactionSigner[]\n )\n }\n\n /**\n * Verify an agent\n */\n async verify(signer: TransactionSigner, params: {\n agentAddress: Address\n agentPubkey: Address\n serviceEndpoint: string\n supportedCapabilities: Array<number | bigint>\n verifiedAt: number | bigint\n }): Promise<string> {\n const instructionGetter = async () => {\n const result = await getVerifyAgentInstructionAsync({\n agent: params.agentAddress,\n verifier: signer,\n agentPubkey: params.agentPubkey,\n serviceEndpoint: params.serviceEndpoint,\n supportedCapabilities: params.supportedCapabilities,\n verifiedAt: params.verifiedAt\n })\n return result\n }\n \n return this.execute(\n 'verifyAgent',\n instructionGetter,\n [signer] as unknown as TransactionSigner[]\n )\n }\n\n /**\n * Deactivate an agent\n */\n async deactivate(signer: TransactionSigner, params: {\n agentAddress: Address\n agentId: string\n }): Promise<string> {\n const instructionGetter = () => {\n const result = getDeactivateAgentInstruction({\n agentAccount: params.agentAddress,\n signer,\n agentId: params.agentId\n })\n return result\n }\n \n return this.execute(\n 'deactivateAgent',\n instructionGetter,\n [signer] as unknown as TransactionSigner[]\n )\n }\n\n /**\n * Activate an agent\n */\n async activate(signer: TransactionSigner, params: {\n agentAddress: Address\n agentId: string\n }): Promise<string> {\n const instructionGetter = () => {\n const result = getActivateAgentInstruction({\n agentAccount: params.agentAddress,\n signer,\n agentId: params.agentId\n })\n return result\n }\n \n return this.execute(\n 'activateAgent',\n instructionGetter,\n [signer] as unknown as TransactionSigner[]\n )\n }\n\n /**\n * Get agent account\n */\n async getAgentAccount(address: Address): Promise<Agent | null> {\n return super.getAccount<Agent>(address, 'getAgentDecoder')\n }\n\n /**\n * Get all agents\n */\n async getAllAgents(): Promise<{ address: Address; data: Agent }[]> {\n return this.getProgramAccounts<Agent>('getAgentDecoder')\n }\n\n /**\n * Get agents by type\n */\n async getAgentsByType(agentType: number): Promise<{ address: Address; data: Agent }[]> {\n const typeBytes = Buffer.alloc(1)\n typeBytes.writeUInt8(agentType, 0)\n \n const filters = [{\n memcmp: {\n offset: BigInt(8), // Skip discriminator\n bytes: typeBytes.toString('base64'),\n encoding: 'base64' as const\n }\n }]\n \n return this.getProgramAccounts<Agent>('getAgentDecoder', filters)\n }\n\n /**\n * Get user's agents\n */\n async getUserAgents(authority: Address): Promise<{ address: Address; data: Agent }[]> {\n const filters = [{\n memcmp: {\n offset: BigInt(9), // Skip discriminator + type\n bytes: authority,\n encoding: 'base58' as const\n }\n }]\n\n return this.getProgramAccounts<Agent>('getAgentDecoder', filters)\n }\n\n /**\n * Batch get multiple agent accounts\n *\n * Uses efficient batching (100 accounts per RPC call) with optional caching.\n *\n * @param addresses - Agent addresses to fetch\n * @param onProgress - Optional progress callback\n * @returns Array of agent accounts (null for non-existent)\n *\n * @example\n * ```typescript\n * const agents = await client.agents.batchGetAgents(\n * ['agent1...', 'agent2...', 'agent3...'],\n * (completed, total) => console.log(`${completed}/${total}`)\n * )\n * ```\n */\n async batchGetAgents(\n addresses: Address[],\n onProgress?: (completed: number, total: number) => void\n ): Promise<(Agent | null)[]> {\n // Use BaseModule's getAccounts which has caching built-in\n return super.getAccounts<Agent>(addresses, 'getAgentDecoder')\n }\n\n /**\n * Batch get only existing agent accounts\n *\n * Filters out non-existent addresses.\n *\n * @param addresses - Agent addresses to fetch\n * @param onProgress - Optional progress callback\n * @returns Array of existing agents with their addresses\n *\n * @example\n * ```typescript\n * const existingAgents = await client.agents.batchGetExistingAgents(['addr1', 'addr2'])\n * // Returns: [{ address: 'addr1', account: Agent }, ...]\n * ```\n */\n async batchGetExistingAgents(\n addresses: Address[],\n onProgress?: (completed: number, total: number) => void\n ): Promise<Array<{ address: Address; account: Agent }>> {\n const { batchGetExistingAccounts } = await import('../../utils/batch-operations.js')\n return batchGetExistingAccounts<Agent>(\n this.config.rpc,\n addresses,\n { onProgress }\n )\n }\n\n /**\n * Batch get and map agents to a simplified format\n *\n * Useful for creating agent summaries or lists.\n *\n * @param addresses - Agent addresses to fetch\n * @param mapper - Transform function\n * @returns Array of mapped results\n *\n * @example\n * ```typescript\n * const summaries = await client.agents.batchGetAndMapAgents(\n * addresses,\n * (agent, address) => agent ? {\n * address,\n * name: agent.name,\n * type: agent.agentType,\n * active: agent.isActive\n * } : null\n * )\n * ```\n */\n async batchGetAndMapAgents<R>(\n addresses: Address[],\n mapper: (agent: Agent | null, address: Address, index: number) => R\n ): Promise<R[]> {\n const { batchGetAndMap } = await import('../../utils/batch-operations.js')\n return batchGetAndMap<Agent, R>(\n this.config.rpc,\n addresses,\n mapper\n )\n }\n\n // Helper methods\n\n private async deriveAgentPda(agentId: string, owner: Address): Promise<Address> {\n // Use the standard PDA utility function that matches Rust implementation\n const { deriveAgentPda } = await import('../../utils/pda.js')\n const [address] = await deriveAgentPda({ programAddress: this.programId, owner, agentId })\n return address\n }\n\n private async deriveUserRegistryPda(owner: Address): Promise<Address> {\n // Use the standard PDA utility function that matches Rust implementation\n const { deriveUserRegistryPda } = await import('../../utils/pda.js')\n return deriveUserRegistryPda(this.programId, owner)\n }\n\n private async deriveTreeConfigPda(owner: Address): Promise<Address> {\n const { getProgramDerivedAddress, getAddressEncoder } = await import('@solana/addresses')\n const addressEncoder = getAddressEncoder()\n const ownerBytes = addressEncoder.encode(owner)\n \n // seeds = [b\"agent_tree_config\", signer.key().as_ref()]\n const [pda] = await getProgramDerivedAddress({\n programAddress: this.programId,\n seeds: [\n new TextEncoder().encode('agent_tree_config'),\n ownerBytes\n ]\n })\n \n return pda\n }\n\n private get systemProgramId(): Address {\n return SYSTEM_PROGRAM_ADDRESS\n }\n\n private get compressionProgramId(): Address {\n return 'cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK' as Address\n }\n}","import type { Address } from '@solana/addresses'\nimport type { TransactionSigner } from '@solana/kit'\nimport { BaseModule } from '../../core/BaseModule.js'\nimport {\n getInitializeGovernanceProposalInstructionAsync,\n type GovernanceProposal,\n} from '../../generated/index.js'\n\n// =====================================================\n// TYPE DEFINITIONS\n// =====================================================\n\nexport interface ProposalType {\n kind: 'ConfigChange' | 'Treasury' | 'Protocol' | 'Emergency'\n data?: Record<string, unknown>\n}\n\nexport interface ExecutionParams {\n instructions: string[]\n accounts: Address[]\n targetProgram: Address\n executeAfter?: bigint\n}\n\nexport interface DelegationScope {\n kind: 'All' | 'Proposal' | 'Category'\n value?: string | number\n}\n\nexport interface CreateMultisigParams {\n signers: Address[]\n threshold: number\n multisigId: bigint\n config: {\n requireSequentialSigning: boolean\n allowOwnerOffCurve: boolean\n }\n}\n\nexport interface CreateProposalParams {\n title: string\n description: string\n proposalType: ProposalType\n executionParams: ExecutionParams\n proposalId: bigint\n}\n\nexport interface VoteParams {\n proposalAddress: Address\n voteChoice: 'For' | 'Against' | 'Abstain'\n reasoning?: string\n}\n\n/**\n * Governance management module\n *\n * Provides high-level access to governance operations including:\n * - Proposal creation and management\n *\n * NOTE: Voting, delegation, and execution are handled through protocol_config + multisig\n */\nexport class GovernanceModule extends BaseModule {\n\n // =====================================================\n // DIRECT INSTRUCTION ACCESS\n // These methods provide direct access to generated instructions\n // with minimal wrapping for maximum flexibility\n // =====================================================\n\n /**\n * Get initialize governance proposal instruction\n */\n getInitializeGovernanceProposalInstruction(params: {\n proposal?: Address\n proposer: TransactionSigner\n title: string\n description: string\n proposalType: any // eslint-disable-line @typescript-eslint/no-explicit-any\n executionParams: any // eslint-disable-line @typescript-eslint/no-explicit-any\n proposalId: number | bigint\n }) {\n return getInitializeGovernanceProposalInstructionAsync(params)\n }\n\n // =====================================================\n // CONVENIENCE METHODS\n // These methods provide simplified access to common operations\n // =====================================================\n\n /**\n * Create a new governance proposal\n */\n async createProposal(params: {\n signer: TransactionSigner\n title: string\n description: string\n proposalType: 'parameter_change' | 'upgrade' | 'treasury'\n votingDuration: number\n executionDelay?: number\n }): Promise<string> {\n const proposalAddress = this.deriveProposalPda(params.signer.address, params.title)\n\n const instruction = await this.getInitializeGovernanceProposalInstruction({\n proposal: proposalAddress,\n proposer: params.signer,\n title: params.title,\n description: params.description,\n proposalType: { kind: params.proposalType, data: {} },\n executionParams: {\n instructions: [],\n accounts: [],\n targetProgram: proposalAddress,\n executeAfter: BigInt(params.executionDelay ?? 0)\n },\n proposalId: BigInt(Date.now())\n })\n\n return this.execute('createProposal', () => instruction, [params.signer])\n }\n\n // =====================================================\n // QUERY OPERATIONS\n // =====================================================\n\n /**\n * Get governance proposal account\n */\n async getProposal(address: Address): Promise<GovernanceProposal | null> {\n return super.getAccount<GovernanceProposal>(address, 'getGovernanceProposalDecoder')\n }\n\n /**\n * Get all active proposals\n */\n async getActiveProposals(): Promise<{ address: Address; data: GovernanceProposal }[]> {\n // This would filter by status in a real implementation\n return this.getProgramAccounts<GovernanceProposal>('getGovernanceProposalDecoder')\n }\n\n /**\n * Get proposals by proposer\n */\n async getProposalsByProposer(proposer: Address): Promise<{ address: Address; data: GovernanceProposal }[]> {\n const filters = [{\n memcmp: {\n offset: BigInt(8), // Skip discriminator\n bytes: proposer as string,\n encoding: 'base58' as const\n }\n }]\n \n return this.getProgramAccounts<GovernanceProposal>('getGovernanceProposalDecoder', filters)\n }\n\n /**\n * Get proposals by status\n */\n async getProposalsByStatus(_status: 'draft' | 'voting' | 'succeeded' | 'defeated' | 'executed'): Promise<{ address: Address; data: GovernanceProposal }[]> {\n // This would need proper filtering based on proposal status field\n const allProposals = await this.getProgramAccounts<GovernanceProposal>('getGovernanceProposalDecoder')\n \n // Placeholder filtering - in real implementation would filter by actual status field\n return allProposals.filter(_proposal => {\n // Would check proposal.data.status === status\n // For now, return all proposals since filtering logic is not implemented\n return allProposals.length > 0\n })\n }\n\n\n // =====================================================\n // HELPER METHODS\n // =====================================================\n\n private deriveProposalPda(proposer: Address, title: string): Address {\n // Implementation would derive PDA using findProgramAddressSync\n return `proposal_${proposer}_${title}` as Address\n }\n}","\nimport type { Address } from '@solana/addresses'\nimport type { TransactionSigner } from '@solana/kit'\nimport { BaseModule } from '../../core/BaseModule.js'\nimport {\n getInitializeGovernanceProposalInstructionAsync,\n type MultisigTypeConfigArgs,\n type ProposalTypeArgs,\n type ExecutionParamsArgs\n} from '../../generated/index.js'\nimport { deriveMultisigPda } from '../../utils/governance-helpers.js'\n\nexport interface CreateMultisigParams {\n multisigId: bigint\n threshold: number\n signers: Address[]\n config?: Partial<MultisigTypeConfigArgs>\n owner: TransactionSigner\n}\n\nexport interface MultisigProposalParams {\n multisigAddress: Address\n title: string\n description: string\n proposalType: ProposalTypeArgs\n executionParams: ExecutionParamsArgs\n proposalId: bigint\n proposer: TransactionSigner\n}\n\nexport interface ExecuteProposalParams {\n proposalAddress: Address\n executor: TransactionSigner\n targetProgram: Address\n}\n\nexport class MultisigModule extends BaseModule {\n /**\n * Create a new multisig account\n */\n async createMultisig(params: CreateMultisigParams): Promise<string> {\n // createMultisig pending instruction regeneration\n throw new Error('createMultisig: Instruction not available - requires IDL regeneration')\n }\n\n /**\n * Create a proposal (Uses Governance Protocol)\n * \n * Note: This creates a GovernanceProposal. The proposer must be a signer.\n */\n async createProposal(params: MultisigProposalParams): Promise<string> {\n // We use the async builder which handles PDA derivation for us\n const instruction = await getInitializeGovernanceProposalInstructionAsync({\n proposer: params.proposer,\n proposalId: params.proposalId,\n title: params.title,\n description: params.description,\n proposalType: params.proposalType,\n executionParams: params.executionParams,\n }, { programAddress: this.programId })\n\n return this.execute('createProposal', () => instruction, [params.proposer])\n }\n\n /**\n * Execute a proposal (Note: Approval/voting removed, use protocol_config instead)\n */\n async executeProposal(params: ExecuteProposalParams): Promise<string> {\n // Execution logic would need to be implemented with protocol_config instructions\n // For now, this is a placeholder that needs to be updated with protocol_config approach\n throw new Error('executeProposal: Use protocol_config instructions for execution')\n }\n}\n","/**\n * GhostSpeak DID (Decentralized Identifier) Types\n *\n * Implements the did:sol method for Solana-based DIDs following W3C standards.\n * Based on Identity.com's did:sol specification v3.0.\n */\n\nimport type { Address } from '@solana/addresses'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nexport const MAX_DID_STRING = 64\nexport const MAX_VERIFICATION_METHODS = 10\nexport const MAX_SERVICE_ENDPOINTS = 5\nexport const MAX_AUTHENTICATION_KEYS = 5\nexport const MAX_URI_LENGTH = 256\nexport const MAX_METHOD_ID = 128\n\nexport const DID_DOCUMENT_SEED = 'did_document'\nexport const VERIFICATION_METHOD_SEED = 'verification_method'\n\n// ============================================================================\n// Enums\n// ============================================================================\n\n/**\n * Verification method type for DIDs\n */\nexport enum VerificationMethodType {\n /** Ed25519 verification key (Solana native) */\n Ed25519VerificationKey2020 = 'Ed25519VerificationKey2020',\n /** X25519 key agreement for encryption */\n X25519KeyAgreementKey2020 = 'X25519KeyAgreementKey2020',\n /** Secp256k1 verification key (Ethereum compatibility) */\n EcdsaSecp256k1VerificationKey2019 = 'EcdsaSecp256k1VerificationKey2019',\n}\n\n/**\n * Verification relationship types\n */\nexport enum VerificationRelationship {\n /** Key can authenticate as the DID */\n Authentication = 'authentication',\n /** Key can assert claims (issue credentials) */\n AssertionMethod = 'assertionMethod',\n /** Key can perform key agreement (encryption) */\n KeyAgreement = 'keyAgreement',\n /** Key can invoke capabilities (update DID document) */\n CapabilityInvocation = 'capabilityInvocation',\n /** Key can delegate capabilities */\n CapabilityDelegation = 'capabilityDelegation',\n}\n\n/**\n * Service endpoint type\n */\nexport enum ServiceEndpointType {\n /** AI agent service endpoint */\n AIAgentService = 'AIAgentService',\n /** Messaging service endpoint (DIDComm) */\n DIDCommMessaging = 'DIDCommMessaging',\n /** Credential repository */\n CredentialRepository = 'CredentialRepository',\n /** Linked domains verification */\n LinkedDomains = 'LinkedDomains',\n /** Custom service type */\n Custom = 'Custom',\n}\n\n// ============================================================================\n// Interfaces\n// ============================================================================\n\n/**\n * Verification method for DID document\n *\n * Represents a cryptographic key that can be used to verify\n * signatures or perform other cryptographic operations\n */\nexport interface VerificationMethod {\n /** Method identifier (e.g., \"key-1\") */\n id: string\n /** Type of verification method */\n methodType: VerificationMethodType\n /** DID of the controller (usually the DID itself) */\n controller: string\n /** Public key in multibase format (base58btc) */\n publicKeyMultibase: string\n /** Verification relationships this key has */\n relationships: VerificationRelationship[]\n /** Creation timestamp */\n createdAt: number\n /** Revoked flag */\n revoked: boolean\n}\n\n/**\n * Service endpoint in DID document\n */\nexport interface ServiceEndpoint {\n /** Service identifier (e.g., \"agent-api\") */\n id: string\n /** Type of service */\n serviceType: ServiceEndpointType\n /** Service endpoint URI */\n serviceEndpoint: string\n /** Optional description */\n description: string\n}\n\n/**\n * DID Document - main account for storing decentralized identifiers\n *\n * Follows W3C DID Core specification and did:sol method\n */\nexport interface DidDocument {\n /** The DID string (e.g., \"did:sol:devnet:HN7cABqLq46Es1jh92dQQisAq662SmxELLLsHHe4YWrH\") */\n did: string\n\n /** Controller of the DID (can update the document) */\n controller: Address\n\n /** Verification methods (public keys) */\n verificationMethods: VerificationMethod[]\n\n /** Service endpoints */\n serviceEndpoints: ServiceEndpoint[]\n\n /** Context URIs (for W3C compatibility) */\n context: string[]\n\n /** Also known as (alternative DIDs) */\n alsoKnownAs: string[]\n\n /** DID document creation timestamp */\n createdAt: number\n\n /** Last update timestamp */\n updatedAt: number\n\n /** Version number (incremented on each update) */\n version: number\n\n /** Deactivated flag */\n deactivated: boolean\n\n /** Deactivation timestamp (if deactivated) */\n deactivatedAt?: number\n\n /** PDA bump */\n bump: number\n}\n\n/**\n * DID Resolution Metadata\n *\n * Additional metadata for DID resolution\n */\nexport interface DidResolutionMetadata {\n /** DID being resolved */\n did: string\n\n /** Pointer to the DID document account */\n didDocument: Address\n\n /** Resolution timestamp */\n resolvedAt: number\n\n /** Content type (application/did+json) */\n contentType: string\n\n /** DID document version at resolution time */\n version: number\n\n /** PDA bump */\n bump: number\n}\n\n// ============================================================================\n// W3C DID Document Format\n// ============================================================================\n\n/**\n * W3C DID Document format for export\n * Compliant with W3C DID Core specification\n */\nexport interface W3CDidDocument {\n '@context': string[]\n id: string\n controller?: string | string[]\n verificationMethod: Array<{\n id: string\n type: string\n controller: string\n publicKeyMultibase: string\n }>\n authentication?: Array<string | {\n id: string\n type: string\n controller: string\n publicKeyMultibase: string\n }>\n assertionMethod?: string[]\n keyAgreement?: string[]\n capabilityInvocation?: string[]\n capabilityDelegation?: string[]\n service?: Array<{\n id: string\n type: string\n serviceEndpoint: string\n description?: string\n }>\n alsoKnownAs?: string[]\n}\n\n// ============================================================================\n// Operation Parameters\n// ============================================================================\n\n/**\n * Parameters for creating a DID document\n */\nexport interface CreateDidDocumentParams {\n /** Controller public key */\n controller: Address\n /** Initial verification methods */\n verificationMethods?: VerificationMethod[]\n /** Initial service endpoints */\n serviceEndpoints?: ServiceEndpoint[]\n /** Network (mainnet, devnet, testnet) */\n network?: 'mainnet' | 'devnet' | 'testnet'\n}\n\n/**\n * Parameters for updating a DID document\n */\nexport interface UpdateDidDocumentParams {\n /** DID document address */\n didDocument: Address\n /** Verification method to add */\n addVerificationMethod?: VerificationMethod\n /** Verification method ID to remove */\n removeVerificationMethodId?: string\n /** Service endpoint to add */\n addServiceEndpoint?: ServiceEndpoint\n /** Service endpoint ID to remove */\n removeServiceEndpointId?: string\n}\n\n/**\n * Parameters for deactivating a DID document\n */\nexport interface DeactivateDidDocumentParams {\n /** DID document address */\n didDocument: Address\n}\n\n/**\n * Parameters for resolving a DID document\n */\nexport interface ResolveDidDocumentParams {\n /** DID string or controller address */\n did: string | Address\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * DID-related errors\n */\nexport enum DidError {\n AlreadyDeactivated = 'AlreadyDeactivated',\n TooManyVerificationMethods = 'TooManyVerificationMethods',\n TooManyServiceEndpoints = 'TooManyServiceEndpoints',\n DuplicateMethodId = 'DuplicateMethodId',\n DuplicateServiceId = 'DuplicateServiceId',\n MethodNotFound = 'MethodNotFound',\n ServiceNotFound = 'ServiceNotFound',\n InvalidDidFormat = 'InvalidDidFormat',\n UnauthorizedDidOperation = 'UnauthorizedDidOperation',\n DidDeactivated = 'DidDeactivated',\n}\n\n/**\n * DID Error class\n */\nexport class DidErrorClass extends Error {\n code: DidError\n\n constructor(code: DidError, message?: string) {\n super(message || code)\n this.name = 'DidError'\n this.code = code\n }\n}\n","/**\n * GhostSpeak DID Helpers\n *\n * Utility functions for DID operations, validation, and W3C export\n */\n\nimport type { Address } from '@solana/addresses'\nimport {\n getProgramDerivedAddress,\n getAddressEncoder,\n getBytesEncoder\n} from '@solana/kit'\nimport bs58 from 'bs58'\nimport {\n type DidDocument,\n type VerificationMethod,\n type ServiceEndpoint,\n type W3CDidDocument,\n VerificationMethodType,\n VerificationRelationship,\n DID_DOCUMENT_SEED,\n DidError,\n DidErrorClass\n} from './did-types.js'\n\n// ============================================================================\n// PDA Derivation\n// ============================================================================\n\n/**\n * Derive DID document PDA\n * Pattern: ['did_document', controller]\n */\nexport async function deriveDidDocumentPda(\n programId: Address,\n controller: Address\n): Promise<[Address, number]> {\n const [address, bump] = await getProgramDerivedAddress({\n programAddress: programId,\n seeds: [\n new TextEncoder().encode(DID_DOCUMENT_SEED),\n getAddressEncoder().encode(controller)\n ]\n })\n return [address, bump]\n}\n\n// ============================================================================\n// DID String Generation and Validation\n// ============================================================================\n\n/**\n * Generate a did:sol string from network and public key\n *\n * @param network - Solana network (mainnet, devnet, testnet, localnet)\n * @param pubkey - Public key to use as the DID identifier\n * @returns DID string in the format \"did:sol:network:pubkey\"\n *\n * @example\n * ```typescript\n * const did = generateDidString('devnet', '5VKz...')\n * // Returns: \"did:sol:devnet:5VKz...\"\n * ```\n */\nexport function generateDidString(\n network: 'mainnet' | 'devnet' | 'testnet' | 'localnet',\n pubkey: Address | string\n): string {\n // Normalize network name for mainnet\n const normalizedNetwork = network === 'mainnet' ? 'mainnet-beta' : network\n return `did:sol:${normalizedNetwork}:${pubkey.toString()}`\n}\n\n/**\n * Validate DID string format\n *\n * @param did - DID string to validate\n * @throws {DidErrorClass} If DID format is invalid\n *\n * @example\n * ```typescript\n * validateDidString('did:sol:devnet:5VKz...')\n * // Returns: void (no error)\n *\n * validateDidString('invalid:did')\n * // Throws: DidErrorClass\n * ```\n */\nexport function validateDidString(did: string): void {\n // Must start with did:sol:\n if (!did.startsWith('did:sol:')) {\n throw new DidErrorClass(\n DidError.InvalidDidFormat,\n 'DID must start with \"did:sol:\"'\n )\n }\n\n // Split into parts\n const parts = did.split(':')\n\n // Must have 4 parts: did, sol, network, identifier\n if (parts.length !== 4) {\n throw new DidErrorClass(\n DidError.InvalidDidFormat,\n 'DID must have format \"did:sol:network:identifier\"'\n )\n }\n\n // Validate network (mainnet-beta, devnet, testnet, or localnet)\n const validNetworks = ['mainnet-beta', 'devnet', 'testnet', 'localnet']\n if (!validNetworks.includes(parts[2])) {\n throw new DidErrorClass(\n DidError.InvalidDidFormat,\n `Invalid network \"${parts[2]}\". Must be one of: ${validNetworks.join(', ')}`\n )\n }\n\n // Validate identifier is a valid base58 string (Solana pubkey)\n try {\n bs58.decode(parts[3])\n } catch {\n throw new DidErrorClass(\n DidError.InvalidDidFormat,\n 'DID identifier must be a valid base58-encoded Solana public key'\n )\n }\n}\n\n/**\n * Parse a DID string into its components\n *\n * @param did - DID string to parse\n * @returns Object with method, network, and identifier\n *\n * @example\n * ```typescript\n * const parts = parseDidString('did:sol:devnet:5VKz...')\n * // Returns: { method: 'sol', network: 'devnet', identifier: '5VKz...' }\n * ```\n */\nexport function parseDidString(did: string): {\n method: string\n network: string\n identifier: string\n} {\n validateDidString(did)\n const parts = did.split(':')\n\n return {\n method: parts[1],\n network: parts[2],\n identifier: parts[3]\n }\n}\n\n// ============================================================================\n// W3C DID Document Export\n// ============================================================================\n\n/**\n * Export a DID document as W3C-compliant format\n *\n * @param didDocument - DID document to export\n * @returns W3C-compliant DID document\n *\n * @example\n * ```typescript\n * const w3cDoc = exportAsW3CDidDocument(didDocument)\n * console.log(JSON.stringify(w3cDoc, null, 2))\n * ```\n */\nexport function exportAsW3CDidDocument(\n didDocument: DidDocument\n): W3CDidDocument {\n // Build verification method section\n const verificationMethod = didDocument.verificationMethods\n .filter(m => !m.revoked)\n .map(method => ({\n id: `${didDocument.did}#${method.id}`,\n type: method.methodType,\n controller: method.controller,\n publicKeyMultibase: method.publicKeyMultibase\n }))\n\n // Build authentication array (methods with Authentication relationship)\n const authentication = didDocument.verificationMethods\n .filter(m => !m.revoked && m.relationships.includes(VerificationRelationship.Authentication))\n .map(m => `${didDocument.did}#${m.id}`)\n\n // Build assertionMethod array\n const assertionMethod = didDocument.verificationMethods\n .filter(m => !m.revoked && m.relationships.includes(VerificationRelationship.AssertionMethod))\n .map(m => `${didDocument.did}#${m.id}`)\n\n // Build keyAgreement array\n const keyAgreement = didDocument.verificationMethods\n .filter(m => !m.revoked && m.relationships.includes(VerificationRelationship.KeyAgreement))\n .map(m => `${didDocument.did}#${m.id}`)\n\n // Build capabilityInvocation array\n const capabilityInvocation = didDocument.verificationMethods\n .filter(m => !m.revoked && m.relationships.includes(VerificationRelationship.CapabilityInvocation))\n .map(m => `${didDocument.did}#${m.id}`)\n\n // Build capabilityDelegation array\n const capabilityDelegation = didDocument.verificationMethods\n .filter(m => !m.revoked && m.relationships.includes(VerificationRelationship.CapabilityDelegation))\n .map(m => `${didDocument.did}#${m.id}`)\n\n // Build service endpoints\n const service = didDocument.serviceEndpoints.map(endpoint => ({\n id: `${didDocument.did}#${endpoint.id}`,\n type: endpoint.serviceType,\n serviceEndpoint: endpoint.serviceEndpoint,\n description: endpoint.description || undefined\n }))\n\n return {\n '@context': didDocument.context,\n id: didDocument.did,\n controller: didDocument.controller.toString(),\n verificationMethod,\n authentication: authentication.length > 0 ? authentication : undefined,\n assertionMethod: assertionMethod.length > 0 ? assertionMethod : undefined,\n keyAgreement: keyAgreement.length > 0 ? keyAgreement : undefined,\n capabilityInvocation: capabilityInvocation.length > 0 ? capabilityInvocation : undefined,\n capabilityDelegation: capabilityDelegation.length > 0 ? capabilityDelegation : undefined,\n service: service.length > 0 ? service : undefined,\n alsoKnownAs: didDocument.alsoKnownAs.length > 0 ? didDocument.alsoKnownAs : undefined\n }\n}\n\n// ============================================================================\n// Verification Method Helpers\n// ============================================================================\n\n/**\n * Create a default Ed25519 verification method\n *\n * @param id - Method identifier (e.g., \"key-1\")\n * @param controller - Controller DID\n * @param publicKey - Public key (Address or base58 string)\n * @param relationships - Verification relationships\n * @returns Verification method object\n */\nexport function createEd25519VerificationMethod(\n id: string,\n controller: string,\n publicKey: Address | string,\n relationships: VerificationRelationship[] = [VerificationRelationship.Authentication]\n): VerificationMethod {\n // Convert public key to multibase format (base58btc with 'z' prefix)\n // Address in @solana/kit v2 is just a string type, no .toString() needed\n const publicKeyMultibase = `z${publicKey}`\n\n return {\n id,\n methodType: VerificationMethodType.Ed25519VerificationKey2020,\n controller,\n publicKeyMultibase,\n relationships,\n createdAt: Math.floor(Date.now() / 1000),\n revoked: false\n }\n}\n\n/**\n * Create a service endpoint\n *\n * @param id - Service identifier (e.g., \"agent-api\")\n * @param serviceType - Type of service\n * @param serviceEndpoint - Service endpoint URI\n * @param description - Optional description\n * @returns Service endpoint object\n */\nexport function createServiceEndpoint(\n id: string,\n serviceType: string,\n serviceEndpoint: string,\n description = ''\n): ServiceEndpoint {\n return {\n id,\n serviceType: serviceType as any,\n serviceEndpoint,\n description\n }\n}\n\n// ============================================================================\n// DID Resolution Helpers\n// ============================================================================\n\n/**\n * Check if a DID document is active and can be used\n *\n * @param didDocument - DID document to check\n * @returns True if active, false if deactivated\n */\nexport function isDidActive(didDocument: DidDocument): boolean {\n return !didDocument.deactivated\n}\n\n/**\n * Get verification methods for a specific relationship\n *\n * @param didDocument - DID document\n * @param relationship - Verification relationship to filter by\n * @returns Array of verification methods with the specified relationship\n */\nexport function getMethodsForRelationship(\n didDocument: DidDocument,\n relationship: VerificationRelationship\n): VerificationMethod[] {\n return didDocument.verificationMethods.filter(\n m => !m.revoked && m.relationships.includes(relationship)\n )\n}\n\n/**\n * Check if a public key can perform a specific action\n *\n * @param didDocument - DID document\n * @param publicKey - Public key to check\n * @param relationship - Required verification relationship\n * @returns True if the public key has the required relationship\n */\nexport function canPerformAction(\n didDocument: DidDocument,\n publicKey: Address,\n relationship: VerificationRelationship\n): boolean {\n // Controller can always perform actions\n if (publicKey.toString() === didDocument.controller.toString()) {\n return true\n }\n\n // Check if public key is in verification methods with correct relationship\n const pubkeyMultibase = `z${publicKey.toString()}`\n\n return didDocument.verificationMethods.some(\n method =>\n !method.revoked &&\n method.publicKeyMultibase === pubkeyMultibase &&\n method.relationships.includes(relationship)\n )\n}\n\n// ============================================================================\n// Conversion Helpers\n// ============================================================================\n\n/**\n * Convert a DID document to JSON string\n *\n * @param didDocument - DID document to convert\n * @param pretty - Whether to pretty-print the JSON\n * @returns JSON string representation\n */\nexport function didDocumentToJson(\n didDocument: DidDocument,\n pretty = true\n): string {\n const w3cDoc = exportAsW3CDidDocument(didDocument)\n return pretty\n ? JSON.stringify(w3cDoc, null, 2)\n : JSON.stringify(w3cDoc)\n}\n\n/**\n * Extract network from DID string\n *\n * @param did - DID string\n * @returns Network identifier\n */\nexport function getNetworkFromDid(did: string): string {\n const parts = parseDidString(did)\n return parts.network\n}\n\n/**\n * Extract identifier (public key) from DID string\n *\n * @param did - DID string\n * @returns Public key identifier\n */\nexport function getIdentifierFromDid(did: string): string {\n const parts = parseDidString(did)\n return parts.identifier\n}\n","/**\n * GhostSpeak Credential Module\n *\n * Provides functionality for creating, signing, and exporting\n * W3C-compatible Verifiable Credentials with DID integration.\n */\n\n\nimport { sha256 } from '@noble/hashes/sha256'\nimport type { Address } from '@solana/addresses'\n// Using simple string encoding for base58 to match SDK patterns if needed,\n// or usually @solana/addresses handles address strings.\n// We need bs58 for raw data encoding\nimport bs58 from 'bs58'\nimport type { DidModule } from '../did/DidModule.js'\nimport { generateDidString } from '../did/did-helpers.js'\n\n// Helper for base58 encoding\nconst base58Encode = (data: Uint8Array): string => bs58.encode(data)\n\n// Constants\nexport const DEFAULT_PROGRAM_ID = 'GHosT3wqDfNq9bKz8dNEQ1F5mLuN7bKdNYx3Z1111111' as Address\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport enum CredentialKind {\n AgentIdentity = 'AgentIdentity',\n ReputationScore = 'ReputationScore',\n JobCompletion = 'JobCompletion',\n DelegatedSigner = 'DelegatedSigner',\n Custom = 'Custom',\n}\n\nexport enum CredentialStatus {\n Pending = 'Pending',\n Active = 'Active',\n Revoked = 'Revoked',\n Expired = 'Expired',\n}\n\nexport interface CredentialType {\n authority: string; // Address\n name: string;\n kind: CredentialKind;\n schemaUri: string;\n description: string;\n isActive: boolean;\n totalIssued: number;\n createdAt: number;\n}\n\nexport interface CredentialTemplate {\n credentialType: string; // Address\n name: string;\n imageUri: string;\n issuer: string; // Address\n isActive: boolean;\n totalIssued: number;\n createdAt: number;\n crossmintTemplateId?: string;\n}\n\nexport interface Credential {\n template: string; // Address\n subject: string; // Address\n issuer: string; // Address\n credentialId: string;\n subjectDataHash: Uint8Array;\n subjectDataUri: string;\n status: CredentialStatus;\n signature: Uint8Array;\n issuedAt: number;\n expiresAt?: number;\n revokedAt?: number;\n // Metadata\n crossmintCredentialId?: string;\n}\n\n// W3C Verifiable Credential Data Model v2.0\nexport interface W3CVerifiableCredential {\n '@context': string[];\n type: string[];\n id: string;\n issuer: {\n id: string;\n name?: string;\n } | string;\n validFrom: string;\n validUntil?: string;\n credentialSubject: {\n id?: string;\n [key: string]: unknown;\n };\n credentialSchema?: {\n id: string;\n type: 'JsonSchema';\n };\n credentialStatus?: {\n id: string;\n type: string;\n statusPurpose: 'revocation' | 'suspension';\n };\n relatedResource?: Array<{\n id: string;\n digestMultibase?: string;\n }>;\n proof: {\n type: 'DataIntegrityProof';\n created: string;\n verificationMethod: string;\n cryptosuite: 'eddsa-rdfc-2022';\n proofPurpose: 'assertionMethod';\n proofValue: string;\n };\n}\n\nexport class CredentialModule {\n private programId: Address\n private didModule?: DidModule\n\n constructor(programId: Address = DEFAULT_PROGRAM_ID, didModule?: DidModule) {\n this.programId = programId\n this.didModule = didModule\n }\n\n /**\n * Set the DID module for enhanced DID resolution\n * This enables automatic DID creation and resolution for credentials\n */\n setDidModule(didModule: DidModule): void {\n this.didModule = didModule\n }\n\n // --------------------------------------------------------------------------\n // Hashing\n // --------------------------------------------------------------------------\n\n hashSubjectData(subjectData: Record<string, unknown>): Uint8Array {\n // Sort keys for deterministic hashing\n const json = JSON.stringify(subjectData, Object.keys(subjectData).sort());\n return sha256(new TextEncoder().encode(json));\n }\n\n generateCredentialId(kind: CredentialKind, subject: string): string {\n const timestamp = Date.now();\n const input = `${kind}-${subject}-${timestamp}`;\n const hash = sha256(new TextEncoder().encode(input));\n const shortHash = base58Encode(hash.slice(0, 8));\n return `${kind.toLowerCase()}-${shortHash}`;\n }\n\n // --------------------------------------------------------------------------\n // Export W3C\n // --------------------------------------------------------------------------\n\n exportAsW3CCredential(\n credential: Credential,\n template: CredentialTemplate,\n credentialType: CredentialType,\n subjectData: Record<string, unknown>,\n options?: {\n network?: 'mainnet' | 'devnet' | 'testnet'\n includeRelatedResource?: boolean\n }\n ): W3CVerifiableCredential {\n const network = options?.network || 'mainnet'\n\n // Use DID helper to generate proper DID strings\n const issuerDid = generateDidString(network, this.programId)\n const subjectDid = generateDidString(network, credential.subject as Address)\n\n // Simplification for ID generation to avoid complex PDA math in this module for now\n // In strict implementation, this status ID should calculate the exact PDA\n const statusId = `solana:${this.programId}:credential:${credential.credentialId}`;\n\n return {\n '@context': [\n 'https://www.w3.org/ns/credentials/v2',\n 'https://w3id.org/security/data-integrity/v2',\n 'https://ghostspeak.io/ns/credentials/v1',\n ],\n type: ['VerifiableCredential', `GhostSpeak${credentialType.kind}Credential`],\n id: `urn:ghostspeak:${credential.credentialId}`,\n issuer: {\n id: issuerDid,\n name: 'GhostSpeak Protocol',\n },\n validFrom: new Date(credential.issuedAt * 1000).toISOString(),\n validUntil: credential.expiresAt\n ? new Date(credential.expiresAt * 1000).toISOString()\n : undefined,\n credentialSubject: {\n id: subjectDid,\n ...subjectData,\n },\n credentialSchema: {\n id: credentialType.schemaUri,\n type: 'JsonSchema',\n },\n credentialStatus: {\n id: statusId,\n type: 'SolanaAccountStatus2025',\n statusPurpose: 'revocation',\n },\n relatedResource: options?.includeRelatedResource\n ? [\n {\n id: credential.subjectDataUri,\n digestMultibase: `mEi${base58Encode(credential.subjectDataHash)}`,\n },\n ]\n : undefined,\n proof: {\n type: 'DataIntegrityProof',\n created: new Date(credential.issuedAt * 1000).toISOString(),\n verificationMethod: `${issuerDid}#key-1`,\n cryptosuite: 'eddsa-rdfc-2022',\n proofPurpose: 'assertionMethod',\n proofValue: base58Encode(credential.signature),\n },\n }\n }\n\n /**\n * Export credential with DID resolution\n * Resolves DIDs for issuer and subject to get full DID documents\n *\n * @param credential - Credential to export\n * @param template - Credential template\n * @param credentialType - Credential type\n * @param subjectData - Subject data\n * @param options - Export options\n * @returns W3C credential with resolved DIDs\n */\n async exportWithDidResolution(\n credential: Credential,\n template: CredentialTemplate,\n credentialType: CredentialType,\n subjectData: Record<string, unknown>,\n options?: {\n network?: 'mainnet' | 'devnet' | 'testnet'\n includeRelatedResource?: boolean\n }\n ): Promise<W3CVerifiableCredential> {\n if (!this.didModule) {\n // Fall back to basic export if DID module not available\n return this.exportAsW3CCredential(\n credential,\n template,\n credentialType,\n subjectData,\n options\n )\n }\n\n const network = options?.network || 'mainnet'\n\n // Resolve issuer DID\n const issuerDid = generateDidString(network, this.programId)\n\n // Resolve subject DID\n const subjectDid = generateDidString(network, credential.subject as Address)\n\n // Try to resolve DID documents (optional - for enhanced verification)\n const issuerDidDoc = await this.didModule.resolve(this.programId).catch(() => null)\n const subjectDidDoc = await this.didModule.resolve(credential.subject as Address).catch(() => null)\n\n const statusId = `solana:${this.programId}:credential:${credential.credentialId}`;\n\n // Use the first verification method for proof if available\n const verificationMethod = issuerDidDoc?.verificationMethods?.[0]\n ? `${issuerDid}#${issuerDidDoc.verificationMethods[0].id}`\n : `${issuerDid}#key-1`\n\n return {\n '@context': [\n 'https://www.w3.org/ns/credentials/v2',\n 'https://w3id.org/security/data-integrity/v2',\n 'https://ghostspeak.io/ns/credentials/v1',\n ],\n type: ['VerifiableCredential', `GhostSpeak${credentialType.kind}Credential`],\n id: `urn:ghostspeak:${credential.credentialId}`,\n issuer: {\n id: issuerDid,\n name: 'GhostSpeak Protocol',\n },\n validFrom: new Date(credential.issuedAt * 1000).toISOString(),\n validUntil: credential.expiresAt\n ? new Date(credential.expiresAt * 1000).toISOString()\n : undefined,\n credentialSubject: {\n id: subjectDid,\n ...subjectData,\n },\n credentialSchema: {\n id: credentialType.schemaUri,\n type: 'JsonSchema',\n },\n credentialStatus: {\n id: statusId,\n type: 'SolanaAccountStatus2025',\n statusPurpose: 'revocation',\n },\n relatedResource: options?.includeRelatedResource\n ? [\n {\n id: credential.subjectDataUri,\n digestMultibase: `mEi${base58Encode(credential.subjectDataHash)}`,\n },\n ]\n : undefined,\n proof: {\n type: 'DataIntegrityProof',\n created: new Date(credential.issuedAt * 1000).toISOString(),\n verificationMethod,\n cryptosuite: 'eddsa-rdfc-2022',\n proofPurpose: 'assertionMethod',\n proofValue: base58Encode(credential.signature),\n },\n }\n }\n\n // --------------------------------------------------------------------------\n // Helpers for Subject Building\n // --------------------------------------------------------------------------\n\n static buildAgentIdentitySubject(params: {\n agentId: string;\n owner: string;\n name: string;\n capabilities: string[];\n serviceEndpoint: string;\n frameworkOrigin: string;\n x402Enabled: boolean;\n registeredAt: number;\n verifiedAt: number;\n }) {\n return params;\n }\n\n // --------------------------------------------------------------------------\n // x402 Agent Credential Issuance\n // --------------------------------------------------------------------------\n\n /**\n * Issue an AgentIdentity credential for a newly registered x402 agent\n * \n * This creates a W3C Verifiable Credential that can be:\n * - Stored on-chain for reputation\n * - Exported as standard W3C VC JSON\n * - Verified by third parties\n * \n * @example\n * ```typescript\n * const result = await credentialModule.issueX402AgentCredential({\n * agentAddress: 'EPjFWdd5...',\n * agentId: 'x402-abc123',\n * owner: 'HN7cAB...',\n * name: 'My Coinbase Agent',\n * serviceEndpoint: 'https://my-agent.com/api',\n * frameworkOrigin: 'coinbase-x402',\n * x402PaymentAddress: 'EPjFWdd5...',\n * x402AcceptedTokens: ['EPjFWdd5...'],\n * x402PricePerCall: '1000000'\n * })\n * ```\n */\n issueX402AgentCredential(params: {\n agentAddress: string;\n agentId: string;\n owner: string;\n name: string;\n serviceEndpoint: string;\n frameworkOrigin: string;\n x402PaymentAddress: string;\n x402AcceptedTokens: string[];\n x402PricePerCall: string;\n capabilities?: string[];\n description?: string;\n verificationResponseTimeMs?: number;\n network?: 'mainnet' | 'devnet' | 'testnet';\n }): {\n credentialId: string;\n credential: Credential;\n w3cCredential: W3CVerifiableCredential;\n subjectData: Record<string, unknown>;\n } {\n const now = Math.floor(Date.now() / 1000);\n \n // Build subject data with x402-specific fields\n const subjectData = {\n agentId: params.agentId,\n owner: params.owner,\n name: params.name,\n capabilities: params.capabilities || [],\n serviceEndpoint: params.serviceEndpoint,\n frameworkOrigin: params.frameworkOrigin,\n x402Enabled: true,\n x402PaymentAddress: params.x402PaymentAddress,\n x402AcceptedTokens: params.x402AcceptedTokens,\n x402PricePerCall: params.x402PricePerCall,\n registeredAt: now,\n verifiedAt: now,\n type: 'external-x402-agent',\n verificationResponseTimeMs: params.verificationResponseTimeMs,\n };\n\n // Generate credential ID\n const credentialId = this.generateCredentialId(\n CredentialKind.AgentIdentity, \n params.agentAddress\n );\n\n // Hash subject data\n const subjectDataHash = this.hashSubjectData(subjectData);\n \n // Create credential (in-memory, could be stored on-chain later)\n const credential: Credential = {\n template: `x402-agent-identity-template`,\n subject: params.agentAddress,\n issuer: this.programId,\n credentialId,\n subjectDataHash,\n subjectDataUri: `data:application/json;base64,${Buffer.from(JSON.stringify(subjectData)).toString('base64')}`,\n status: CredentialStatus.Active,\n signature: subjectDataHash, // Self-signed with hash (for demo; real impl would sign with authority key)\n issuedAt: now,\n };\n\n // Create credential type (template info)\n const credentialType: CredentialType = {\n authority: this.programId,\n name: 'x402 Agent Identity',\n kind: CredentialKind.AgentIdentity,\n schemaUri: 'https://ghostspeak.io/schemas/x402-agent-identity-v1.json',\n description: 'Verifiable credential for x402-compatible AI agents registered with GhostSpeak',\n isActive: true,\n totalIssued: 1,\n createdAt: now,\n };\n\n // Create template\n const template: CredentialTemplate = {\n credentialType: credentialType.authority,\n name: 'x402 Agent Identity',\n imageUri: 'https://ghostspeak.io/assets/credential-badge-x402.png',\n issuer: this.programId,\n isActive: true,\n totalIssued: 1,\n createdAt: now,\n };\n\n // Export as W3C credential\n const w3cCredential = this.exportAsW3CCredential(\n credential,\n template,\n credentialType,\n subjectData,\n { network: params.network || 'devnet', includeRelatedResource: true }\n );\n\n return {\n credentialId,\n credential,\n w3cCredential,\n subjectData,\n };\n }\n\n /**\n * Export an existing credential to W3C JSON format\n */\n exportCredentialToJSON(\n credential: Credential,\n subjectData: Record<string, unknown>,\n options?: {\n network?: 'mainnet' | 'devnet' | 'testnet';\n pretty?: boolean;\n }\n ): string {\n const template: CredentialTemplate = {\n credentialType: 'x402-agent',\n name: credential.credentialId.includes('agentidentity') ? 'Agent Identity' : 'Custom',\n imageUri: 'https://ghostspeak.io/assets/credential-badge.png',\n issuer: credential.issuer,\n isActive: true,\n totalIssued: 1,\n createdAt: credential.issuedAt,\n };\n\n const credentialType: CredentialType = {\n authority: credential.issuer,\n name: 'GhostSpeak Credential',\n kind: CredentialKind.AgentIdentity,\n schemaUri: 'https://ghostspeak.io/schemas/credential-v1.json',\n description: 'GhostSpeak verifiable credential',\n isActive: true,\n totalIssued: 1,\n createdAt: credential.issuedAt,\n };\n\n const w3c = this.exportAsW3CCredential(\n credential,\n template,\n credentialType,\n subjectData,\n { network: options?.network || 'devnet', includeRelatedResource: true }\n );\n\n return options?.pretty \n ? JSON.stringify(w3c, null, 2) \n : JSON.stringify(w3c);\n }\n}\n","/**\n * PayAI x402 Client\n *\n * Client for making x402 payments through the PayAI facilitator.\n * Wraps the standard fetch API with automatic payment handling.\n *\n * @module payai/PayAIClient\n * @see https://docs.payai.network/x402/introduction\n */\n\nimport { EventEmitter } from 'node:events'\nimport type {\n PayAIClientConfig,\n PayAIPaymentRequirement,\n PayAIPaymentResponse,\n PayAIReputationRecord,\n PayAINetwork\n} from './PayAITypes.js'\nimport type { Address } from '@solana/addresses'\n\n// =====================================================\n// CONSTANTS\n// =====================================================\n\n/** Default PayAI facilitator URL */\nconst DEFAULT_FACILITATOR_URL = 'https://facilitator.payai.network'\n\n/** Default request timeout in milliseconds */\nconst DEFAULT_TIMEOUT = 30000\n\n/** Default retry configuration */\nconst DEFAULT_RETRY = { attempts: 3, delayMs: 1000 }\n\n// =====================================================\n// HELPER FUNCTIONS\n// =====================================================\n\n/**\n * Check if a response requires payment\n */\nexport function isPaymentRequired(response: Response): boolean {\n return response.status === 402\n}\n\n/**\n * Extract payment requirements from a 402 response\n */\nexport async function extractPaymentRequirements(\n response: Response\n): Promise<PayAIPaymentRequirement[]> {\n // Try to parse from response body\n const body = await response.text()\n\n try {\n const parsed = JSON.parse(body)\n\n // Handle x402 v1 format\n if (parsed.accepts && Array.isArray(parsed.accepts)) {\n return parsed.accepts as PayAIPaymentRequirement[]\n }\n\n // Handle legacy format\n if (parsed.paymentRequirements && Array.isArray(parsed.paymentRequirements)) {\n return parsed.paymentRequirements as PayAIPaymentRequirement[]\n }\n\n // Handle single requirement\n if (parsed.scheme && parsed.payTo) {\n return [parsed as PayAIPaymentRequirement]\n }\n } catch {\n // Not JSON, try to parse from headers\n }\n\n // Try to extract from headers\n const paymentHeader = response.headers.get('x-payment-required')\n if (paymentHeader) {\n try {\n return JSON.parse(paymentHeader) as PayAIPaymentRequirement[]\n } catch {\n // Invalid header format\n }\n }\n\n return []\n}\n\n// =====================================================\n// CLIENT EVENTS\n// =====================================================\n\n// Client events interface (used for type documentation)\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ninterface _PayAIClientEvents {\n 'payment:required': (requirements: PayAIPaymentRequirement[]) => void\n 'payment:started': (requirement: PayAIPaymentRequirement) => void\n 'payment:completed': (response: PayAIPaymentResponse) => void\n 'payment:failed': (error: Error) => void\n 'request:started': (url: string) => void\n 'request:completed': (url: string, success: boolean, durationMs: number) => void\n}\n\n// =====================================================\n// PAYAI CLIENT CLASS\n// =====================================================\n\n/**\n * PayAI x402 Client\n *\n * Makes HTTP requests with automatic x402 payment handling\n * using PayAI as the facilitator.\n *\n * @example\n * ```typescript\n * const client = new PayAIClient({\n * rpcUrl: 'https://api.mainnet-beta.solana.com',\n * wallet: {\n * publicKey: wallet.publicKey.toString(),\n * signTransaction: (tx) => wallet.signTransaction(tx)\n * }\n * });\n *\n * // Make a paid request\n * const response = await client.fetch('https://api.example.com/ai/generate', {\n * method: 'POST',\n * body: JSON.stringify({ prompt: 'Hello' })\n * });\n * ```\n */\n// Internal config type that makes some fields optional\ninterface PayAIClientInternalConfig {\n facilitatorUrl: string\n rpcUrl: string\n wallet?: {\n publicKey: string\n signTransaction: (tx: unknown) => Promise<unknown>\n }\n timeout: number\n retry: { attempts: number; delayMs: number }\n}\n\nexport class PayAIClient extends EventEmitter {\n private readonly config: PayAIClientInternalConfig\n private readonly localRecords: PayAIReputationRecord[] = []\n\n constructor(config: PayAIClientConfig) {\n super()\n this.config = {\n facilitatorUrl: config.facilitatorUrl ?? DEFAULT_FACILITATOR_URL,\n rpcUrl: config.rpcUrl,\n wallet: config.wallet,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n retry: config.retry ?? DEFAULT_RETRY\n }\n }\n\n // =====================================================\n // PUBLIC METHODS\n // =====================================================\n\n /**\n * Make a fetch request with automatic x402 payment handling\n *\n * @param url - The resource URL\n * @param init - Fetch options\n * @returns Response from the resource\n */\n async fetch(url: string, init?: RequestInit): Promise<Response> {\n this.emit('request:started', url)\n const startTime = Date.now()\n\n try {\n // Make initial request\n let response = await this.fetchWithTimeout(url, init)\n\n // If payment required, handle it\n if (isPaymentRequired(response)) {\n const requirements = await extractPaymentRequirements(response)\n this.emit('payment:required', requirements)\n\n if (requirements.length === 0) {\n throw new Error('Payment required but no payment options provided')\n }\n\n // Select best payment option (prefer Solana)\n const requirement = this.selectPaymentOption(requirements)\n if (!requirement) {\n throw new Error('No compatible payment option found')\n }\n\n // Make payment and retry request\n response = await this.makePaymentAndRetry(url, init ?? {}, requirement)\n }\n\n const durationMs = Date.now() - startTime\n this.emit('request:completed', url, response.ok, durationMs)\n\n return response\n\n } catch (error) {\n const durationMs = Date.now() - startTime\n this.emit('request:completed', url, false, durationMs)\n\n if (error instanceof Error) {\n this.emit('payment:failed', error)\n }\n throw error\n }\n }\n\n /**\n * Verify a payment through the PayAI facilitator\n *\n * @param paymentHeader - The payment header/payload\n * @param requirement - The payment requirement\n * @returns Verification result\n */\n async verifyPayment(\n paymentHeader: string,\n requirement: PayAIPaymentRequirement\n ): Promise<{ valid: boolean; payer?: string; error?: string }> {\n const response = await this.fetchWithTimeout(\n `${this.config.facilitatorUrl}/verify`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n paymentHeader,\n paymentRequirements: requirement\n })\n }\n )\n\n return response.json()\n }\n\n /**\n * Settle a payment through the PayAI facilitator\n *\n * @param paymentHeader - The payment header/payload\n * @param requirement - The payment requirement\n * @returns Settlement result\n */\n async settlePayment(\n paymentHeader: string,\n requirement: PayAIPaymentRequirement\n ): Promise<{ success: boolean; transaction?: string; error?: string }> {\n const response = await this.fetchWithTimeout(\n `${this.config.facilitatorUrl}/settle`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n paymentHeader,\n paymentRequirements: requirement\n })\n }\n )\n\n return response.json()\n }\n\n /**\n * List available resources from the PayAI facilitator\n *\n * @param options - Filter options\n * @returns List of available resources\n */\n async listResources(options?: {\n network?: PayAINetwork\n capability?: string\n maxPrice?: number\n }): Promise<{\n resources: Array<{\n url: string\n description?: string\n accepts: PayAIPaymentRequirement[]\n tags?: string[]\n }>\n }> {\n const params = new URLSearchParams()\n if (options?.network) params.set('network', options.network)\n if (options?.capability) params.set('capability', options.capability)\n if (options?.maxPrice) params.set('maxPrice', options.maxPrice.toString())\n\n const response = await this.fetchWithTimeout(\n `${this.config.facilitatorUrl}/list?${params.toString()}`\n )\n\n return response.json()\n }\n\n /**\n * Get locally tracked reputation records\n * (For payments made through this client instance)\n */\n getLocalReputationRecords(): PayAIReputationRecord[] {\n return [...this.localRecords]\n }\n\n /**\n * Clear local reputation records\n */\n clearLocalReputationRecords(): void {\n this.localRecords.length = 0\n }\n\n // =====================================================\n // PRIVATE METHODS\n // =====================================================\n\n /**\n * Select the best payment option from requirements\n */\n private selectPaymentOption(\n requirements: PayAIPaymentRequirement[]\n ): PayAIPaymentRequirement | null {\n // Prefer Solana\n const solanaOption = requirements.find(r => r.network === 'solana')\n if (solanaOption) return solanaOption\n\n // Return first available\n return requirements[0] ?? null\n }\n\n /**\n * Make payment and retry the original request\n */\n private async makePaymentAndRetry(\n url: string,\n init: RequestInit,\n requirement: PayAIPaymentRequirement\n ): Promise<Response> {\n this.emit('payment:started', requirement)\n\n // Create payment header\n const paymentHeader = await this.createPaymentHeader(requirement)\n\n // Verify payment first\n const verification = await this.verifyPayment(paymentHeader, requirement)\n if (!verification.valid) {\n throw new Error(`Payment verification failed: ${verification.error ?? 'Unknown error'}`)\n }\n\n // Settle payment\n const settlement = await this.settlePayment(paymentHeader, requirement)\n if (!settlement.success) {\n throw new Error(`Payment settlement failed: ${settlement.error ?? 'Unknown error'}`)\n }\n\n this.emit('payment:completed', {\n success: true,\n transactionSignature: settlement.transaction,\n paymentId: `pay_${Date.now()}`\n })\n\n // Record to local reputation tracking\n const startTime = Date.now()\n\n // Retry request with payment header\n const response = await this.fetchWithTimeout(url, {\n ...init,\n headers: {\n ...init.headers as Record<string, string>,\n 'X-Payment': paymentHeader,\n 'X-Payment-Signature': settlement.transaction ?? ''\n }\n })\n\n const responseTime = Date.now() - startTime\n\n // Track for reputation\n if (settlement.transaction) {\n this.localRecords.push({\n agentAddress: requirement.payTo as Address,\n paymentSignature: settlement.transaction,\n amount: BigInt(requirement.maxAmountRequired),\n success: response.ok,\n responseTimeMs: responseTime,\n payerAddress: this.config.wallet?.publicKey ?? 'unknown',\n timestamp: new Date(),\n network: requirement.network\n })\n }\n\n return response\n }\n\n /**\n * Create a payment header for a requirement\n * (In production, this would sign a real Solana transaction)\n */\n private async createPaymentHeader(\n requirement: PayAIPaymentRequirement\n ): Promise<string> {\n if (!this.config.wallet) {\n throw new Error('Wallet not configured for payments')\n }\n\n // Production implementation pending\n // For now, create a mock payment header for development\n const paymentData = {\n version: '1.0',\n scheme: requirement.scheme,\n network: requirement.network,\n payer: this.config.wallet.publicKey,\n payTo: requirement.payTo,\n amount: requirement.maxAmountRequired,\n asset: requirement.asset,\n resource: requirement.resource,\n nonce: Date.now().toString(),\n signature: `mock_sig_${Date.now()}`\n }\n\n return Buffer.from(JSON.stringify(paymentData)).toString('base64')\n }\n\n /**\n * Fetch with timeout\n */\n private async fetchWithTimeout(\n url: string,\n init?: RequestInit\n ): Promise<Response> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout)\n\n try {\n const response = await fetch(url, {\n ...init,\n signal: controller.signal\n })\n return response\n } finally {\n clearTimeout(timeoutId)\n }\n }\n}\n\n// =====================================================\n// FACTORY FUNCTION\n// =====================================================\n\n/**\n * Create a new PayAI client\n *\n * @param config - Client configuration\n * @returns Configured PayAI client\n */\nexport function createPayAIClient(config: PayAIClientConfig): PayAIClient {\n return new PayAIClient(config)\n}\n\n// =====================================================\n// CONVENIENCE FUNCTION\n// =====================================================\n\n/**\n * Make a single x402 payment request through PayAI\n *\n * @param url - Resource URL\n * @param config - Client configuration\n * @param init - Fetch options\n * @returns Response from the resource\n */\nexport async function payAIFetch(\n url: string,\n config: PayAIClientConfig,\n init?: RequestInit\n): Promise<Response> {\n const client = createPayAIClient(config)\n return client.fetch(url, init)\n}\n","/**\n * Reputation Module\n *\n * Manages reputation tracking and calculations:\n * - Calculating reputation scores\n * - Managing reputation badges\n * - Fraud detection\n */\n\nimport type { Address } from '@solana/addresses'\nimport { BaseModule } from '../../core/BaseModule.js'\nimport { ReputationCalculator } from '../../utils/reputation-calculator.js'\nimport { ReputationTagEngine } from '../../utils/reputation-tag-engine.js'\nimport {\n ReputationTier,\n BadgeType,\n REPUTATION_CONSTANTS,\n} from '../../types/reputation-types.js'\nimport type {\n JobPerformance,\n ReputationCalculationResult,\n CategoryReputation,\n} from '../../types/reputation-types.js'\nimport type {\n TagScore,\n TagCategory,\n TagFilters,\n TagQueryResult,\n ReputationMetrics,\n} from '../../types/reputation-tags.js'\n\nexport { ReputationTier, BadgeType, REPUTATION_CONSTANTS }\nexport type { JobPerformance, ReputationCalculationResult, CategoryReputation }\nexport type { TagScore, TagCategory, TagFilters, TagQueryResult, ReputationMetrics }\n\n/**\n * Simplified reputation data for module use\n */\nexport interface ReputationData {\n agent: Address\n overallScore: number\n totalJobsCompleted: number\n totalJobsFailed: number\n avgResponseTime: number\n disputesAgainst: number\n disputesResolved: number\n lastUpdated: number\n categoryReputations: CategoryReputation[]\n badges: Array<{ badgeType: BadgeType; earnedAt: number }>\n performanceHistory: Array<{ timestamp: number; score: number; jobsCompleted: number; avgQuality: number }>\n factors: {\n completionWeight: number\n qualityWeight: number\n timelinessWeight: number\n satisfactionWeight: number\n disputeWeight: number\n }\n}\n\n/**\n * Reputation module for managing reputation calculations\n */\nexport class ReputationModule extends BaseModule {\n private calculator: ReputationCalculator\n private tagEngine: ReputationTagEngine\n\n constructor(config: import('../../types/index.js').GhostSpeakConfig) {\n super(config)\n this.calculator = new ReputationCalculator()\n this.tagEngine = new ReputationTagEngine()\n }\n\n /**\n * Calculate reputation change for a job\n */\n calculateReputationChange(\n currentData: ReputationData,\n jobPerformance: JobPerformance\n ): ReputationCalculationResult {\n // Cast to internal type for calculator\n return this.calculator.calculateReputation(currentData as any, jobPerformance)\n }\n\n /**\n * Get tier name from tier enum\n */\n getTierName(tier: ReputationTier): string {\n switch (tier) {\n case ReputationTier.None:\n return 'Unranked'\n case ReputationTier.Bronze:\n return 'Bronze'\n case ReputationTier.Silver:\n return 'Silver'\n case ReputationTier.Gold:\n return 'Gold'\n case ReputationTier.Platinum:\n return 'Platinum'\n default:\n return 'Unknown'\n }\n }\n\n /**\n * Get tier from score\n */\n getTierFromScore(score: number): ReputationTier {\n if (score >= REPUTATION_CONSTANTS.PLATINUM_TIER_THRESHOLD) {\n return ReputationTier.Platinum\n } else if (score >= REPUTATION_CONSTANTS.GOLD_TIER_THRESHOLD) {\n return ReputationTier.Gold\n } else if (score >= REPUTATION_CONSTANTS.SILVER_TIER_THRESHOLD) {\n return ReputationTier.Silver\n } else if (score >= REPUTATION_CONSTANTS.BRONZE_TIER_THRESHOLD) {\n return ReputationTier.Bronze\n }\n return ReputationTier.None\n }\n\n /**\n * Get badge display name\n */\n getBadgeName(badge: BadgeType): string {\n switch (badge) {\n case BadgeType.FirstJob:\n return 'First Job'\n case BadgeType.TenJobs:\n return '10 Jobs'\n case BadgeType.HundredJobs:\n return '100 Jobs'\n case BadgeType.ThousandJobs:\n return '1000 Jobs'\n case BadgeType.PerfectRating:\n return 'Perfect Rating'\n case BadgeType.QuickResponder:\n return 'Quick Responder'\n case BadgeType.DisputeResolver:\n return 'Dispute Resolver'\n case BadgeType.CategoryExpert:\n return 'Category Expert'\n case BadgeType.CrossCategoryMaster:\n return 'Cross-Category Master'\n default:\n return 'Unknown Badge'\n }\n }\n\n /**\n * Calculate estimated APY boost from reputation\n */\n calculateApyBoost(score: number): number {\n // 0.5% boost per 1000 reputation points\n return Math.floor(score / 1000) * 50 // Returns in basis points\n }\n\n /**\n * Get reputation tier color for UI\n */\n getTierColor(tier: ReputationTier): string {\n switch (tier) {\n case ReputationTier.Platinum:\n return '#E5E4E2' // Platinum gray\n case ReputationTier.Gold:\n return '#FFD700' // Gold\n case ReputationTier.Silver:\n return '#C0C0C0' // Silver\n case ReputationTier.Bronze:\n return '#CD7F32' // Bronze\n default:\n return '#808080' // Gray\n }\n }\n\n /**\n * Create default reputation data for new agents\n */\n createDefaultReputationData(agentAddress: Address): ReputationData {\n return {\n agent: agentAddress,\n overallScore: 5000, // Start at 50%\n totalJobsCompleted: 0,\n totalJobsFailed: 0,\n avgResponseTime: 0,\n disputesAgainst: 0,\n disputesResolved: 0,\n lastUpdated: Math.floor(Date.now() / 1000),\n categoryReputations: [],\n badges: [],\n performanceHistory: [],\n factors: {\n completionWeight: 25,\n qualityWeight: 25,\n timelinessWeight: 20,\n satisfactionWeight: 20,\n disputeWeight: 10,\n },\n }\n }\n\n /**\n * Check if agent qualifies for a specific tier\n */\n qualifiesForTier(score: number, tier: ReputationTier): boolean {\n switch (tier) {\n case ReputationTier.Platinum:\n return score >= REPUTATION_CONSTANTS.PLATINUM_TIER_THRESHOLD\n case ReputationTier.Gold:\n return score >= REPUTATION_CONSTANTS.GOLD_TIER_THRESHOLD\n case ReputationTier.Silver:\n return score >= REPUTATION_CONSTANTS.SILVER_TIER_THRESHOLD\n case ReputationTier.Bronze:\n return score >= REPUTATION_CONSTANTS.BRONZE_TIER_THRESHOLD\n default:\n return true\n }\n }\n\n /**\n * Calculate points needed for next tier\n */\n pointsToNextTier(score: number): { nextTier: ReputationTier; pointsNeeded: number } | null {\n const currentTier = this.getTierFromScore(score)\n\n switch (currentTier) {\n case ReputationTier.None:\n return { nextTier: ReputationTier.Bronze, pointsNeeded: REPUTATION_CONSTANTS.BRONZE_TIER_THRESHOLD - score }\n case ReputationTier.Bronze:\n return { nextTier: ReputationTier.Silver, pointsNeeded: REPUTATION_CONSTANTS.SILVER_TIER_THRESHOLD - score }\n case ReputationTier.Silver:\n return { nextTier: ReputationTier.Gold, pointsNeeded: REPUTATION_CONSTANTS.GOLD_TIER_THRESHOLD - score }\n case ReputationTier.Gold:\n return { nextTier: ReputationTier.Platinum, pointsNeeded: REPUTATION_CONSTANTS.PLATINUM_TIER_THRESHOLD - score }\n case ReputationTier.Platinum:\n return null // Already at max tier\n default:\n return null\n }\n }\n\n // =====================================================\n // PAYAI INTEGRATION\n // =====================================================\n\n /**\n * Record a PayAI payment event to update reputation\n *\n * Converts PayAI webhook data to JobPerformance format and\n * calculates reputation change.\n *\n * @param record - PayAI reputation record from webhook\n * @param currentData - Current agent reputation data (fetched from on-chain or cache)\n * @returns Reputation calculation result\n */\n recordPayAIPayment(\n record: PayAIReputationRecordInput,\n currentData: ReputationData\n ): ReputationCalculationResult {\n // Convert PayAI record to JobPerformance\n const jobPerformance = this.payAIRecordToJobPerformance(record)\n\n // Calculate reputation change\n return this.calculateReputationChange(currentData, jobPerformance)\n }\n\n /**\n * Convert a PayAI reputation record to JobPerformance format\n *\n * PayAI provides basic payment data, so we derive quality metrics\n * from response time and success status.\n */\n payAIRecordToJobPerformance(record: PayAIReputationRecordInput): JobPerformance {\n // Estimate quality from response time\n // Faster response times indicate better quality\n const qualityRating = this.estimateQualityFromResponseTime(record.responseTimeMs)\n\n // Estimate expected duration based on payment amount\n // Higher payments typically expect longer processing times\n const expectedDuration = this.estimateExpectedDuration(record.amount)\n\n return {\n completed: record.success,\n qualityRating,\n expectedDuration,\n actualDuration: Math.ceil(record.responseTimeMs / 1000), // Convert to seconds\n clientSatisfaction: record.success ? qualityRating : 20, // Lower satisfaction on failure\n hadDispute: false, // PayAI webhook doesn't include dispute info\n disputeResolvedFavorably: false,\n category: this.categorizeFromNetwork(record.network),\n paymentAmount: Number(record.amount) / 1_000_000, // Convert from base units (e.g., USDC 6 decimals)\n }\n }\n\n /**\n * Estimate quality rating from response time\n *\n * Fast responses (< 500ms) = 100 quality\n * Average responses (500ms-2s) = 70-90 quality\n * Slow responses (2s-10s) = 40-70 quality\n * Very slow responses (> 10s) = 20-40 quality\n */\n private estimateQualityFromResponseTime(responseTimeMs: number): number {\n if (responseTimeMs <= 500) {\n return 100\n } else if (responseTimeMs <= 2000) {\n // Linear scale from 90 to 70 for 500ms-2s\n return Math.round(90 - ((responseTimeMs - 500) / 1500) * 20)\n } else if (responseTimeMs <= 10000) {\n // Linear scale from 70 to 40 for 2s-10s\n return Math.round(70 - ((responseTimeMs - 2000) / 8000) * 30)\n } else {\n // Minimum 20 for any response\n return Math.max(20, Math.round(40 - ((responseTimeMs - 10000) / 50000) * 20))\n }\n }\n\n /**\n * Estimate expected duration based on payment amount\n *\n * Larger payments = longer expected processing time\n */\n private estimateExpectedDuration(amountBaseUnits: bigint): number {\n const amountUSDC = Number(amountBaseUnits) / 1_000_000\n\n // Base expectation of 2 seconds for micro-payments\n // +1 second per $0.10 payment\n return Math.max(2, Math.ceil(2 + amountUSDC * 10))\n }\n\n /**\n * Categorize payment by network\n */\n private categorizeFromNetwork(network: string): string {\n switch (network) {\n case 'solana':\n return 'ai-services-solana'\n case 'base':\n return 'ai-services-base'\n case 'ethereum':\n return 'ai-services-ethereum'\n default:\n return 'ai-services'\n }\n }\n\n /**\n * Create a PayAI-compatible performance snapshot\n * Useful for tracking payment patterns\n */\n createPayAIPerformanceSnapshot(\n record: PayAIReputationRecordInput,\n reputationResult: ReputationCalculationResult\n ): {\n timestamp: number\n paymentId: string\n network: string\n amount: string\n success: boolean\n responseTimeMs: number\n reputationChange: number\n newScore: number\n tier: string\n } {\n return {\n timestamp: record.timestamp.getTime(),\n paymentId: record.paymentSignature,\n network: record.network,\n amount: record.amount.toString(),\n success: record.success,\n responseTimeMs: record.responseTimeMs,\n reputationChange: reputationResult.jobScore,\n newScore: reputationResult.overallScore,\n tier: reputationResult.tier,\n }\n }\n\n // =====================================================\n // REPUTATION TAGGING METHODS\n // =====================================================\n\n /**\n * Calculate tags for an agent based on metrics\n *\n * Automatically evaluates all tag criteria and assigns tags\n * with appropriate confidence scores.\n *\n * @param metrics - Agent reputation metrics\n * @returns Array of tag scores\n */\n async calculateTagsForAgent(metrics: ReputationMetrics): Promise<TagScore[]> {\n return this.tagEngine.calculateTags(metrics)\n }\n\n /**\n * Get tags by category\n *\n * Filters tags to only those in the specified category.\n *\n * @param tags - All tag scores\n * @param category - Category to filter by\n * @returns Filtered tag scores\n */\n getTagsByCategory(tags: TagScore[], category: TagCategory): TagScore[] {\n return this.tagEngine.filterTags(tags, { category })\n }\n\n /**\n * Check if agent has a specific tag\n *\n * @param tags - Agent's tag scores\n * @param tagName - Tag to check for\n * @returns Whether the tag exists\n */\n hasTag(tags: TagScore[], tagName: string): boolean {\n return tags.some((tag) => tag.tagName === tagName)\n }\n\n /**\n * Get tag confidence score\n *\n * @param tags - Agent's tag scores\n * @param tagName - Tag to check\n * @returns Confidence score or undefined if tag doesn't exist\n */\n getTagConfidence(tags: TagScore[], tagName: string): number | undefined {\n const tag = tags.find((t) => t.tagName === tagName)\n return tag?.confidence\n }\n\n /**\n * Filter tags by criteria\n *\n * @param tags - Tags to filter\n * @param filters - Filter criteria\n * @returns Filtered tags\n */\n filterTags(tags: TagScore[], filters: TagFilters): TagScore[] {\n return this.tagEngine.filterTags(tags, filters)\n }\n\n /**\n * Apply tag decay based on age\n *\n * Reduces confidence scores for old tags and removes stale tags.\n *\n * @param tags - Current tag scores\n * @param currentTimestamp - Current Unix timestamp (optional)\n * @returns Tags with decay applied\n */\n applyTagDecay(tags: TagScore[], currentTimestamp?: number): TagScore[] {\n return this.tagEngine.applyTagDecay(tags, currentTimestamp)\n }\n\n /**\n * Merge new tags with existing tags\n *\n * Updates existing tags or adds new ones, preferring higher confidence.\n *\n * @param existingTags - Current tags\n * @param newTags - New tags to merge\n * @returns Merged tag list\n */\n mergeTags(existingTags: TagScore[], newTags: TagScore[]): TagScore[] {\n return this.tagEngine.mergeTags(existingTags, newTags)\n }\n\n /**\n * Categorize tags by type\n *\n * Organizes tags into skill, behavior, and compliance categories.\n *\n * @param tags - Tags to categorize\n * @returns Categorized tag result\n */\n categorizeTags(tags: TagScore[]): TagQueryResult {\n return this.tagEngine.categorizeTags(tags)\n }\n\n /**\n * Get top N tags by confidence\n *\n * @param tags - Tags to sort\n * @param count - Number of tags to return\n * @returns Top tags\n */\n getTopTags(tags: TagScore[], count: number): TagScore[] {\n return this.tagEngine.getTopTags(tags, count)\n }\n\n /**\n * Sort tags by confidence (descending)\n *\n * @param tags - Tags to sort\n * @returns Sorted tags\n */\n sortTagsByConfidence(tags: TagScore[]): TagScore[] {\n return this.tagEngine.sortByConfidence(tags)\n }\n\n /**\n * Sort tags by evidence count (descending)\n *\n * @param tags - Tags to sort\n * @returns Sorted tags\n */\n sortTagsByEvidence(tags: TagScore[]): TagScore[] {\n return this.tagEngine.sortByEvidence(tags)\n }\n\n /**\n * Sort tags by most recently updated\n *\n * @param tags - Tags to sort\n * @returns Sorted tags\n */\n sortTagsByRecent(tags: TagScore[]): TagScore[] {\n return this.tagEngine.sortByRecent(tags)\n }\n\n /**\n * Get confidence level description\n *\n * @param confidence - Confidence score (0-10000)\n * @returns Human-readable confidence level\n */\n getConfidenceLevel(confidence: number): string {\n return this.tagEngine.getConfidenceLevel(confidence)\n }\n\n /**\n * Validate tag name length\n *\n * @param tagName - Tag name to validate\n * @returns Whether tag name is valid\n */\n validateTagName(tagName: string): boolean {\n return this.tagEngine.validateTagName(tagName)\n }\n\n /**\n * Validate confidence score\n *\n * @param confidence - Confidence to validate\n * @returns Whether confidence is valid (0-10000)\n */\n validateConfidence(confidence: number): boolean {\n return this.tagEngine.validateConfidence(confidence)\n }\n\n /**\n * Convert on-chain ReputationMetrics to TagEngine format\n *\n * Helper to convert blockchain data to the format needed for tag calculation.\n *\n * @param onChainMetrics - Metrics from blockchain\n * @returns Metrics in TagEngine format\n */\n convertMetricsForTagging(onChainMetrics: {\n successfulPayments: bigint\n failedPayments: bigint\n totalResponseTime: bigint\n responseTimeCount: bigint\n totalDisputes: number\n disputesResolved: number\n totalRating: number\n totalRatingsCount: number\n createdAt: number\n updatedAt: number\n }): ReputationMetrics {\n const avgResponseTime =\n onChainMetrics.responseTimeCount > 0n\n ? Number(onChainMetrics.totalResponseTime / onChainMetrics.responseTimeCount)\n : 0\n\n const totalPayments = onChainMetrics.successfulPayments + onChainMetrics.failedPayments\n const successRate =\n totalPayments > 0n\n ? Number((onChainMetrics.successfulPayments * 10000n) / totalPayments)\n : 0\n\n const avgRating =\n onChainMetrics.totalRatingsCount > 0\n ? Math.floor(\n (onChainMetrics.totalRating * 100) / (onChainMetrics.totalRatingsCount * 5)\n )\n : 0\n\n const disputeResolutionRate =\n onChainMetrics.totalDisputes > 0\n ? Math.floor((onChainMetrics.disputesResolved * 10000) / onChainMetrics.totalDisputes)\n : 10000\n\n return {\n successfulPayments: onChainMetrics.successfulPayments,\n failedPayments: onChainMetrics.failedPayments,\n totalResponseTime: onChainMetrics.totalResponseTime,\n responseTimeCount: onChainMetrics.responseTimeCount,\n totalDisputes: onChainMetrics.totalDisputes,\n disputesResolved: onChainMetrics.disputesResolved,\n totalRating: onChainMetrics.totalRating,\n totalRatingsCount: onChainMetrics.totalRatingsCount,\n createdAt: onChainMetrics.createdAt,\n updatedAt: onChainMetrics.updatedAt,\n avgResponseTime,\n successRate,\n avgRating,\n disputeResolutionRate,\n }\n }\n}\n\n/**\n * Interface for PayAI reputation record input\n * Matches the PayAIReputationRecord from payai module\n */\nexport interface PayAIReputationRecordInput {\n agentAddress: Address\n paymentSignature: string\n amount: bigint\n success: boolean\n responseTimeMs: number\n payerAddress: string\n timestamp: Date\n network: string\n}\n","import type { Address } from '@solana/addresses'\nimport type { TransactionSigner } from '@solana/kit'\nimport { BaseModule } from '../../core/BaseModule.js'\nimport {\n getStakeGhostInstructionAsync,\n getUnstakeGhostInstructionAsync,\n getInitializeStakingConfigInstructionAsync,\n type StakingAccount,\n type StakingConfig,\n} from '../../generated/index.js'\n\nexport interface StakeParams {\n /** Agent address to stake for */\n agent: Address\n /** Agent's token account holding GHOST tokens */\n agentTokenAccount: Address\n /** Staking vault to receive tokens */\n stakingVault: Address\n /** Global staking config account */\n stakingConfig: Address\n /** GHOST token mint address */\n ghostMint: Address\n /** Amount of GHOST tokens to stake (in lamports) */\n amount: bigint\n /** Lock duration in seconds */\n lockDuration: bigint\n /** The agent owner's transaction signer */\n agentOwner: TransactionSigner\n}\n\nexport interface UnstakeParams {\n /** Staking account to unstake from */\n stakingAccount: Address\n /** Agent address */\n agent: Address\n /** Staking vault holding the tokens */\n stakingVault: Address\n /** Agent's token account to receive tokens */\n agentTokenAccount: Address\n /** The agent owner's transaction signer */\n agentOwner: TransactionSigner\n}\n\nexport interface InitializeStakingConfigParams {\n /** Admin who can modify staking config */\n authority: TransactionSigner\n /** Minimum stake amount */\n minStake: bigint\n /** Treasury address to receive fees */\n treasury: Address\n}\n\nexport class StakingModule extends BaseModule {\n /**\n * Initialize the global staking configuration (admin only)\n */\n async initializeStakingConfig(params: InitializeStakingConfigParams): Promise<string> {\n const instruction = await getInitializeStakingConfigInstructionAsync({\n authority: params.authority,\n minStake: params.minStake,\n treasury: params.treasury,\n }, { programAddress: this.programId })\n\n return this.execute('initializeStakingConfig', () => instruction, [params.authority])\n }\n\n /**\n * Stake GHOST tokens for an agent\n *\n * @param params - Staking parameters\n * @returns Transaction signature\n */\n async stake(params: StakeParams): Promise<string> {\n const instruction = await getStakeGhostInstructionAsync({\n ownerTokenAccount: params.agentTokenAccount,\n stakingVault: params.stakingVault,\n stakingConfig: params.stakingConfig,\n ghostMint: params.ghostMint,\n owner: params.agentOwner,\n amount: params.amount,\n lockDuration: params.lockDuration,\n }, { programAddress: this.programId })\n\n return this.execute('stakeGhost', () => instruction, [params.agentOwner])\n }\n\n /**\n * Unstake GHOST tokens from an agent\n *\n * @param params - Unstaking parameters\n * @returns Transaction signature\n */\n async unstake(params: UnstakeParams): Promise<string> {\n const instruction = await getUnstakeGhostInstructionAsync({\n stakingAccount: params.stakingAccount,\n stakingVault: params.stakingVault,\n ownerTokenAccount: params.agentTokenAccount,\n owner: params.agentOwner,\n }, { programAddress: this.programId })\n\n return this.execute('unstakeGhost', () => instruction, [params.agentOwner])\n }\n\n /**\n * Get staking account for an agent\n *\n * @param stakingAccountAddress - The staking account address\n * @returns Staking account data or null if not found\n */\n async getStakingAccount(stakingAccountAddress: Address): Promise<StakingAccount | null> {\n try {\n return await this.getAccount<StakingAccount>(stakingAccountAddress, 'getStakingAccountDecoder')\n } catch (error) {\n console.error('Error fetching staking account:', error)\n return null\n }\n }\n\n /**\n * Get the global staking configuration\n *\n * @param stakingConfigAddress - The staking config account address\n * @returns Staking config data or null if not initialized\n */\n async getStakingConfig(stakingConfigAddress: Address): Promise<StakingConfig | null> {\n try {\n return await this.getAccount<StakingConfig>(stakingConfigAddress, 'getStakingConfigDecoder')\n } catch (error) {\n console.error('Error fetching staking config:', error)\n return null\n }\n }\n}\n"]}