@net-protocol/storage 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +97 -155
- package/dist/index.d.ts +97 -155
- package/dist/index.js +275 -716
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +272 -710
- package/dist/index.mjs.map +1 -1
- package/dist/react.d.mts +70 -0
- package/dist/react.d.ts +70 -0
- package/dist/react.js +1380 -0
- package/dist/react.js.map +1 -0
- package/dist/react.mjs +1367 -0
- package/dist/react.mjs.map +1 -0
- package/dist/types-BnOI6cJS.d.mts +87 -0
- package/dist/types-BnOI6cJS.d.ts +87 -0
- package/package.json +15 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/abis/storage.json","../src/abis/chunked-storage.json","../src/abis/chunked-storage-reader.json","../src/abis/storage-router.json","../src/abis/safe-storage-reader.json","../src/constants.ts","../src/utils/xmlUtils.ts","../src/utils/chunkUtils.ts","../src/utils/keyUtils.ts","../src/hooks/useStorage.ts","../src/client/xmlStorage.ts","../src/hooks/useXmlStorage.ts","../src/hooks/useStorageFromRouter.ts"],"names":["hexToBytes","pako","hexToString","keccak256HashString","toBytes32","useState","useReadContract","useEffect","decodeAbiParameters","getPublicClient","readContract","stringToHex","storageKeyBytes","text","getNetContract","useMemo","useAsyncEffect","BATCH_SIZE"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,IAAA,eAAA,GAAA;AAAA,EACE;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB,gCAAA;AAAA,QAChB,UAAA,EAAc;AAAA,UACZ,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,UAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU;AACrE;AACF,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB,gCAAA;AAAA,QAChB,UAAA,EAAc;AAAA,UACZ,EAAE,IAAA,EAAQ,MAAA,EAAQ,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA,EAAS;AAAA,UAC7D,EAAE,IAAA,EAAQ,OAAA,EAAS,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ;AAC9D;AACF,KACF;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,oBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB,gCAAA;AAAA,QAChB,UAAA,EAAc;AAAA,UACZ,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,UAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU;AACrE;AACF,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,SAAA,EAAW,IAAA,EAAQ,WAAA,EAAa,cAAgB,WAAA;AAAY,KACxE;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,qBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB,4CAAA;AAAA,QAChB,UAAA,EAAc;AAAA,UACZ,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,UAC9D;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ,SAAA;AAAA,YACR,YAAA,EAAgB;AAAA,WAClB;AAAA,UACA,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU;AAChE;AACF,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB,gCAAA;AAAA,QAChB,UAAA,EAAc;AAAA,UACZ,EAAE,IAAA,EAAQ,MAAA,EAAQ,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA,EAAS;AAAA,UAC7D,EAAE,IAAA,EAAQ,OAAA,EAAS,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ;AAC9D;AACF,KACF;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB,gCAAA;AAAA,QAChB,UAAA,EAAc;AAAA,UACZ,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,UAC9D,EAAE,IAAA,EAAQ,MAAA,EAAQ,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA,EAAS;AAAA,UAC7D,EAAE,IAAA,EAAQ,OAAA,EAAS,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ;AAC9D;AACF,KACF;AAAA,IACA,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACrE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,EAAA,EAAI,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA,EAAS;AAAA,MACzD,EAAE,IAAA,EAAQ,EAAA,EAAI,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KACzD;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,gBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACrE;AAAA,IACA,OAAA,EAAW,CAAC,EAAE,IAAA,EAAQ,IAAI,IAAA,EAAQ,SAAA,EAAW,YAAA,EAAgB,SAAA,EAAW,CAAA;AAAA,IACxE,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,iBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MACnE,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KAChE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,EAAA,EAAI,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA,EAAS;AAAA,MACzD,EAAE,IAAA,EAAQ,EAAA,EAAI,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KACzD;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,MAAA,EAAQ,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA,EAAS;AAAA,MAC7D,EAAE,IAAA,EAAQ,OAAA,EAAS,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KAC9D;AAAA,IACA,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB;AAAA,OAClB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB;AAAA;AAClB,KACF;AAAA,IACA,SAAA,EAAa;AAAA;AAEjB,CAAA;;;ACpKA,IAAA,uBAAA,GAAA;AAAA,EACE;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACrE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,EAAA,EAAI,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA,EAAS;AAAA,MACzD,EAAE,IAAA,EAAQ,EAAA,EAAI,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KACzD;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,UAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MACnE,EAAE,IAAA,EAAQ,YAAA,EAAc,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KACnE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,WAAA,EAAa,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KAClE;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,WAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MACnE,EAAE,IAAA,EAAQ,YAAA,EAAc,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA,EAAQ;AAAA,MACjE,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KACjE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,QAAA,EAAU,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACnE;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,aAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACrE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,YAAA,EAAc,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA,EAAQ;AAAA,MACjE,EAAE,IAAA,EAAQ,cAAA,EAAgB,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA;AAAS,KACvE;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,MAAA,EAAQ,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA,EAAS;AAAA,MAC7D,EAAE,IAAA,EAAQ,QAAA,EAAU,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACnE;AAAA,IACA,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAQ,mBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB;AAAA,OAClB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB;AAAA,OAClB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB;AAAA;AAClB,KACF;AAAA,IACA,SAAA,EAAa;AAAA,GACf;AAAA,EACA,EAAE,IAAA,EAAQ,OAAA,EAAS,MAAQ,cAAA,EAAgB,MAAA,EAAU,EAAC;AACxD,CAAA;;;AC3FA,IAAA,8BAAA,GAAA;AAAA,EACE;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACrE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,EAAA,EAAI,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA,EAAS;AAAA,MACzD,EAAE,IAAA,EAAQ,EAAA,EAAI,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KACzD;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,UAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MACnE,EAAE,IAAA,EAAQ,YAAA,EAAc,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KACnE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,WAAA,EAAa,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KAClE;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,iBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MACnE,EAAE,IAAA,EAAQ,YAAA,EAAc,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA,EAAQ;AAAA,MACjE,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KAChE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,WAAA,EAAa,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KAClE;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,WAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MACnE,EAAE,IAAA,EAAQ,YAAA,EAAc,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA,EAAQ;AAAA,MACjE,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KACjE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,QAAA,EAAU,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACnE;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,kBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MACnE,EAAE,IAAA,EAAQ,YAAA,EAAc,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA,EAAQ;AAAA,MACjE,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA,EAAQ;AAAA,MAC/D,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KAChE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,QAAA,EAAU,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACnE;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,aAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACrE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,YAAA,EAAc,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA,EAAQ;AAAA,MACjE,EAAE,IAAA,EAAQ,cAAA,EAAgB,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA;AAAS,KACvE;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,oBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MACnE,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KAChE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,YAAA,EAAc,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA,EAAQ;AAAA,MACjE,EAAE,IAAA,EAAQ,cAAA,EAAgB,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA;AAAS,KACvE;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,gBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACrE;AAAA,IACA,OAAA,EAAW,CAAC,EAAE,IAAA,EAAQ,IAAI,IAAA,EAAQ,SAAA,EAAW,YAAA,EAAgB,SAAA,EAAW,CAAA;AAAA,IACxE,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,iBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MACnE,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KAChE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,EAAA,EAAI,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA,EAAS;AAAA,MACzD,EAAE,IAAA,EAAQ,EAAA,EAAI,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KACzD;AAAA,IACA,eAAA,EAAmB;AAAA;AAEvB,CAAA;;;ACzHA,IAAA,sBAAA,GAAA;AAAA,EACE;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAQ,KAAA,EAAO,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAQ,UAAA,EAAY,IAAA,EAAQ,SAAA,EAAW,cAAgB,SAAA;AAAU,KACrE;AAAA,IACA,OAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAQ,kBAAA,EAAoB,IAAA,EAAQ,MAAA,EAAQ,cAAgB,MAAA,EAAO;AAAA,MACrE,EAAE,IAAA,EAAQ,MAAA,EAAQ,IAAA,EAAQ,QAAA,EAAU,cAAgB,QAAA,EAAS;AAAA,MAC7D,EAAE,IAAA,EAAQ,MAAA,EAAQ,IAAA,EAAQ,OAAA,EAAS,cAAgB,OAAA;AAAQ,KAC7D;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA,EAAE,IAAA,EAAQ,OAAA,EAAS,MAAQ,oBAAA,EAAsB,MAAA,EAAU,EAAC;AAC9D,CAAA;;;AChBA,IAAA,2BAAA,GAAA;AAAA,EACE;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB,iCAAA;AAAA,QAChB,UAAA,EAAc;AAAA,UACZ;AAAA,YACE,IAAA,EAAQ,KAAA;AAAA,YACR,IAAA,EAAQ,SAAA;AAAA,YACR,YAAA,EAAgB;AAAA,WAClB;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ,SAAA;AAAA,YACR,YAAA,EAAgB;AAAA;AAClB;AACF;AACF,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB,iCAAA;AAAA,QAChB,UAAA,EAAc;AAAA,UACZ;AAAA,YACE,IAAA,EAAQ,MAAA;AAAA,YACR,IAAA,EAAQ,QAAA;AAAA,YACR,YAAA,EAAgB;AAAA,WAClB;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ,OAAA;AAAA,YACR,YAAA,EAAgB;AAAA;AAClB;AACF;AACF,KACF;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,qBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB,6CAAA;AAAA,QAChB,UAAA,EAAc;AAAA,UACZ;AAAA,YACE,IAAA,EAAQ,KAAA;AAAA,YACR,IAAA,EAAQ,SAAA;AAAA,YACR,YAAA,EAAgB;AAAA,WAClB;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ,SAAA;AAAA,YACR,YAAA,EAAgB;AAAA,WAClB;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,KAAA;AAAA,YACR,IAAA,EAAQ,SAAA;AAAA,YACR,YAAA,EAAgB;AAAA;AAClB;AACF;AACF,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB,iCAAA;AAAA,QAChB,UAAA,EAAc;AAAA,UACZ;AAAA,YACE,IAAA,EAAQ,MAAA;AAAA,YACR,IAAA,EAAQ,QAAA;AAAA,YACR,YAAA,EAAgB;AAAA,WAClB;AAAA,UACA;AAAA,YACE,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ,OAAA;AAAA,YACR,YAAA,EAAgB;AAAA;AAClB;AACF;AACF,KACF;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB;AAAA,OAClB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB;AAAA;AAClB,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ,QAAA;AAAA,QACR,YAAA,EAAgB;AAAA,OAClB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ,OAAA;AAAA,QACR,YAAA,EAAgB;AAAA;AAClB,KACF;AAAA,IACA,eAAA,EAAmB;AAAA,GACrB;AAAA,EACA;AAAA,IACE,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ,iBAAA;AAAA,IACR,MAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB;AAAA,OAClB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB;AAAA,OAClB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAQ,SAAA;AAAA,QACR,YAAA,EAAgB;AAAA;AAClB,KACF;AAAA,IACA,OAAA,EAAW;AAAA,MACT;AAAA,QACE,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ,QAAA;AAAA,QACR,YAAA,EAAgB;AAAA,OAClB;AAAA,MACA;AAAA,QACE,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ,OAAA;AAAA,QACR,YAAA,EAAgB;AAAA;AAClB,KACF;AAAA,IACA,eAAA,EAAmB;AAAA;AAEvB,CAAA;;;ACpJO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,GAAA,EAAK,eAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,wBAAA,GAA2B;AAAA,EACtC,GAAA,EAAK,uBAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,+BAAA,GAAkC;AAAA,EAC7C,GAAA,EAAK,8BAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,uBAAA,GAA0B;AAAA,EACrC,GAAA,EAAK,sBAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,4BAAA,GAA+B;AAAA,EAC1C,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;;;ACbO,SAAS,mBAAmB,QAAA,EAAkC;AACnE,EAAA,MAAM,KAAA,GACJ,kGAAA;AACF,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,IAAI,KAAA;AAEJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAQ,OAAO,IAAA,EAAM;AAC9C,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,MAChB,KAAA,EAAO,MAAM,CAAC,CAAA,GAAI,SAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,MAC3C,QAAA,EAAU,KAAA,CAAM,CAAC,CAAA,EAAG,WAAA,EAAY;AAAA,MAChC,MAAA,EAAQ,MAAM,CAAC;AAAA,KAChB,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,sBAAsB,IAAA,EAAuB;AAC3D,EAAA,OAAO,uFAAA,CAAwF,IAAA;AAAA,IAC7F;AAAA,GACF;AACF;AAYO,SAAS,eAAA,CACd,WACA,eAAA,EACQ;AACR,EAAA,OAAO,SAAA,CAAU,QAAA,EAAU,WAAA,EAAY,IAAK,gBAAgB,WAAA,EAAY;AAC1E;AAKO,SAAS,eAAA,CACd,WACA,eAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,SAAA,EAAW,eAAe,CAAA;AAC3D,EAAA,MAAM,QAAQ,SAAA,CAAU,KAAA,KAAU,SAAY,CAAA,CAAA,EAAI,SAAA,CAAU,KAAK,CAAA,CAAA,GAAK,EAAA;AACtE,EAAA,OAAO,GAAG,SAAA,CAAU,IAAI,CAAA,CAAA,EAAI,QAAQ,GAAG,KAAK,CAAA,CAAA;AAC9C;ACFO,SAAS,cAAA,CACd,QACA,SAAA,EACoB;AACpB,EAAA,IAAI;AAEF,IAAA,IAAI,SAAA,GAAY,MAAA,CAAO,CAAC,CAAA,IAAK,IAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,MAAA,IAAI,KAAA,IAAS,UAAU,IAAA,EAAM;AAC3B,QAAA,SAAA,IAAa,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,MAC5B;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQA,gBAAW,SAA0B,CAAA;AAEnD,IAAA,IAAI;AAEF,MAAA,MAAM,YAAA,GAAeC,qBAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAItC,MAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,MAAM,CAAA;AAG3D,MAAA,IAAI,SAAA,EAAW;AAKf,MAAA,MAAM,MAAA,GAASC,iBAAY,SAA0B,CAAA;AACrD,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,OAAO,KAAA,CAAA;AAAA,IACT;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,KAAK,CAAA;AAClE,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACF;ACxCO,SAAS,kBAAA,CACd,OACA,SAAA,EACQ;AAER,EAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,IAAA,OAAO,MAAM,WAAA,EAAY;AAAA,EAC3B;AAGA,EAAA,IAAI,cAAc,KAAA,EAAO;AACvB,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,EAAA,GAClBC,wBAAA,CAAoB,KAAA,CAAM,WAAA,EAAa,CAAA,GACvCC,cAAA,CAAU,KAAA,CAAM,WAAA,EAAa,CAAA;AAAA,EACnC;AAGA,EAAA,IACE,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,IACrB,MAAM,MAAA,KAAW,EAAA;AAAA,EACjB,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA,EAChC;AACA,IAAA,OAAO,MAAM,WAAA,EAAY;AAAA,EAC3B;AAGA,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,EAAA,GAClBD,wBAAA,CAAoB,KAAA,CAAM,WAAA,EAAa,CAAA,GACvCC,cAAA,CAAU,KAAA,CAAM,WAAA,EAAa,CAAA;AACnC;;;ACpFA,IAAM,UAAA,GAAa,CAAA;AAEZ,SAAS,UAAA,CAAW;AAAA,EACzB,OAAA;AAAA,EACA,GAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,YAAA,GAAe;AACjB,CAAA,EAAsB;AAEpB,EAAA,MAAM,kBAAkB,KAAA,KAAU,MAAA;AAClC,EAAA,MAAM,eAAA,GAAkB,cAAc,IAAA,IAAQ,eAAA;AAC9C,EAAA,MAAM,iBAAiB,YAAA,KAAiB,QAAA;AACxC,EAAA,MAAM,eAAA,GAAkB,GAAA,GAAM,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA,GAAI,MAAA;AAGnE,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAAc,OAAA,KAAwC;AACxE,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,KAAA,EAAO,cAAA,GAAiBF,gBAAAA,CAAY,OAAO,CAAA,GAAI;AAAA,KACjD;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIG,cAAA,EAAkC;AACtE,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,cAAA,EAA4B;AAE5E,EAAA,MAAM,aAAaC,qBAAA,CAAgB;AAAA,IACjC,KAAK,uBAAA,CAAwB,GAAA;AAAA,IAC7B,SAAS,uBAAA,CAAwB,OAAA;AAAA,IACjC,YAAA,EAAc,KAAA;AAAA,IACd,MACE,eAAA,IAAmB,eAAA,GACf,CAAC,eAAA,EAAiB,eAAe,CAAA,GACjC,MAAA;AAAA,IACN,OAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,SAAS,eAAA,IAAmB,OAAA,IAAW,CAAC,CAAC,GAAA,IAAO,CAAC,CAAC;AAAA;AACpD,GACD,CAAA;AAGD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,eAAe,mBAAA,GAAsB;AACnC,MAAA,IAAI,CAAC,UAAA,CAAW,IAAA,IAAQ,UAAA,CAAW,SAAA,IAAa,WAAW,KAAA,EAAO;AAChE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,CAAC,gBAAA,EAAkB,IAAA,EAAM,IAAI,IAAI,UAAA,CAAW,IAAA;AAOlD,MAAA,IAAI,CAAC,gBAAA,EAAkB;AAErB,QAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,UAAA,aAAA,CAAc,MAAS,CAAA;AACvB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA;AACvC,QAAA,aAAA,CAAc,SAAS,CAAA;AACvB,QAAA;AAAA,MACF;AAGA,MAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,MAAA,mBAAA,CAAoB,MAAS,CAAA;AAE7B,MAAA,IAAI;AAEF,QAAA,MAAM,CAAC,UAAU,CAAA,GAAIC,wBAAA,CAAoB,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA;AAElE,QAAA,IAAI,eAAe,CAAA,EAAG;AACpB,UAAA,aAAA,CAAc,KAAA,CAAS,CAAA;AACvB,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,MAAA,GAASC,oBAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAC1C,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,OAAO,CAAA,CAAE,CAAA;AAAA,QAC3D;AAEA,QAAA,MAAM,YAAsB,EAAC;AAC7B,QAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,OAAO,UAAU,CAAA,EAAG,SAAS,UAAA,EAAY;AACnE,UAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,UAAA,EAAY,MAAA,CAAO,UAAU,CAAC,CAAA;AAC3D,UAAA,MAAM,KAAA,GAAS,MAAMC,oBAAA,CAAa,MAAA,EAAQ;AAAA,YACxC,KAAK,wBAAA,CAAyB,GAAA;AAAA,YAC9B,SAAS,wBAAA,CAAyB,OAAA;AAAA,YAClC,YAAA,EAAc,WAAA;AAAA,YACd,IAAA,EAAM,CAAC,eAAA,EAAkB,eAAA,EAAiB,OAAO,GAAG;AAAA,WACrD,CAAA;AACD,UAAA,SAAA,CAAU,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,QACzB;AAGA,QAAA,MAAM,eAAA,GAAkB,eAAe,SAAS,CAAA;AAGhD,QAAA,IAAI,oBAAoB,KAAA,CAAA,EAAW;AACjC,UAAA,aAAA,CAAc,KAAA,CAAS,CAAA;AAAA,QACzB,CAAA,MAAO;AACL,UAAA,IAAI,cAAA,EAAgB;AAElB,YAAA,aAAA,CAAc,EAAE,IAAA,EAAM,KAAA,EAAO,eAAA,EAAiB,CAAA;AAAA,UAChD,CAAA,MAAO;AAEL,YAAA,MAAM,OAAA,GAAUC,iBAAY,eAAe,CAAA;AAC3C,YAAA,aAAA,CAAc,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,UACxC;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,mBAAA,CAAoB,KAAc,CAAA;AAAA,MACpC,CAAA,SAAE;AACA,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,mBAAA,EAAoB;AAAA,EACtB,CAAA,EAAG;AAAA,IACD,UAAA,CAAW,IAAA;AAAA,IACX,UAAA,CAAW,SAAA;AAAA,IACX,UAAA,CAAW,KAAA;AAAA,IACX,eAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,SAAA,EAAW,aAAA;AAAA,IACX,KAAA,EAAO;AAAA,MACLL,qBAAA,CAAgB;AAAA,IAClB,KAAK,gBAAA,CAAiB,GAAA;AAAA,IACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,YAAA,EAAc,KAAA;AAAA,IACd,IAAA,EACE,OAAO,eAAA,GACH,CAAC,mBAAmB,GAAA,EAAK,SAAS,CAAA,EAAoB,eAAe,CAAA,GACrE,MAAA;AAAA,IACN,OAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,OAAA,EACE,CAAC,eAAA,IACD,OAAA,IACA,CAAC,CAAC,eAAA,IACF,CAAC,CAAC,GAAA,IACF;AAAA;AACJ,GACD,CAAA;AAGD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAID,cAAA;AAAA,IAC1C;AAAA,GACF;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,cAAA,EAA4B;AAE1E,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,eAAe,sBAAA,GAAyB;AACtC,MAAA,IAAI,mBAAmB,CAAC,GAAA,IAAO,CAAC,eAAA,IAAmB,CAAC,OAAA,EAAS;AAC3D,QAAA;AAAA,MACF;AAEA,MAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,MAAA,kBAAA,CAAmB,MAAS,CAAA;AAC5B,MAAA,iBAAA,CAAkB,MAAS,CAAA;AAE3B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAASE,oBAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAC1C,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,OAAO,CAAA,CAAE,CAAA;AAAA,QAC3D;AAEA,QAAA,MAAMG,gBAAAA,GAAkB,kBAAA;AAAA,UACtB,GAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAMF,oBAAA,CAAa,MAAA,EAAQ;AAAA,YAC1C,KAAK,+BAAA,CAAgC,GAAA;AAAA,YACrC,SAAS,+BAAA,CAAgC,OAAA;AAAA,YACzC,YAAA,EAAc,oBAAA;AAAA,YACd,IAAA,EAAM,CAACE,gBAAAA,EAAiB,eAAA,EAAiB,KAAK;AAAA,WAC/C,CAAA;AAED,UAAA,MAAM,CAAC,UAAA,EAAYC,KAAI,CAAA,GAAI,QAAA;AAE3B,UAAA,IAAI,aAAa,CAAA,EAAG;AAElB,YAAA,MAAM,MAAA,GAAU,MAAMH,oBAAA,CAAa,MAAA,EAAQ;AAAA,cACzC,KAAK,+BAAA,CAAgC,GAAA;AAAA,cACrC,SAAS,+BAAA,CAAgC,OAAA;AAAA,cACzC,YAAA,EAAc,kBAAA;AAAA,cACd,MAAM,CAACE,gBAAAA,EAAiB,eAAA,EAAiB,CAAA,EAAG,YAAY,KAAK;AAAA,aAC9D,CAAA;AAED,YAAA,MAAM,aAAA,GAAgB,eAAe,MAAM,CAAA;AAC3C,YAAA,IAAI,kBAAkB,KAAA,CAAA,EAAW;AAE/B,cAAA,MAAM,OAAA,GAAUD,iBAAY,aAAa,CAAA;AACzC,cAAA,iBAAA,CAAkB,UAAA,CAAWE,KAAAA,EAAM,OAAO,CAAC,CAAA;AAC3C,cAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,YAAA,EAAc;AAAA,QAEvB;AAGA,QAAA,MAAM,MAAA,GAAS,MAAMH,oBAAA,CAAa,MAAA,EAAQ;AAAA,UACxC,KAAK,gBAAA,CAAiB,GAAA;AAAA,UACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,UAC1B,YAAA,EAAc,iBAAA;AAAA,UACd,IAAA,EAAM,CAACE,gBAAAA,EAAiB,eAAA,EAAiB,KAAK;AAAA,SAC/C,CAAA;AAED,QAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,MAAA;AAErB,QAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,UAAA,iBAAA,CAAkB,KAAA,CAAS,CAAA;AAC3B,UAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,UAAA;AAAA,QACF;AAEA,QAAA,iBAAA,CAAkB,UAAA,CAAW,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,MAC1C,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,kDAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,kBAAA,CAAmB,KAAc,CAAA;AAAA,MACnC,CAAA,SAAE;AACA,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,sBAAA,EAAuB;AAAA,EACzB,CAAA,EAAG;AAAA,IACD,OAAA;AAAA,IACA,GAAA;AAAA,IACA,eAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,cAAA;AAAA,MACN,SAAA,EAAW,iBAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA;AAAA,MACN,SAAA,EAAW,WAAW,SAAA,IAAa,kBAAA;AAAA,MACnC,KAAA,EAAO,WAAW,KAAA,IAAS;AAAA,KAC7B;AAAA,EACF;AAIA,EAAA,MAAM,mBAAA,GAAsB,cACvB,MAAM;AACL,IAAA,MAAM,MAAA,GAAS,UAAA;AACf,IAAA,MAAM,CAAC,IAAA,EAAM,QAAQ,CAAA,GAAI,MAAA;AAEzB,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,UAAA,CAAW,MAAM,QAAQ,CAAA;AAAA,EAClC,IAAG,GACH,MAAA;AAEJ,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,mBAAA;AAAA,IACN,SAAA,EAAW,aAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACT;AACF;AAEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,OAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,WAAA,GAAcE,oBAAe,OAAO,CAAA;AAC1C,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,cAAA,KAAmBR,qBAAA,CAAgB;AAAA,IACtE,KAAK,WAAA,CAAY,GAAA;AAAA,IACjB,SAAS,WAAA,CAAY,OAAA;AAAA,IACrB,YAAA,EAAc,iCAAA;AAAA,IACd,IAAA,EAAM,CAAC,gBAAA,CAAiB,OAAA,EAAS,eAAe,CAAA;AAAA,IAChD;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,gBAAA,GAAmB,UAAA,GAAa,MAAA,CAAO,UAAU,CAAA,GAAI,CAAA;AAE3D,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,iBAAA,KAAsBA,qBAAA,CAAgB;AAAA,IACvE,KAAK,WAAA,CAAY,GAAA;AAAA,IACjB,SAAS,WAAA,CAAY,OAAA;AAAA,IACrB,YAAA,EAAc,8BAAA;AAAA,IACd,MAAM,CAAC,CAAA,EAAG,gBAAA,EAAkB,gBAAA,CAAiB,SAAS,eAAe,CAAA;AAAA,IACrE;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EACE,QAAA,EAAU,GAAA,CAAI,CAAC,GAAA,KAAa;AAAA,MAC1B,GAAA,CAAI,KAAA;AAAA,MACJ,GAAA,CAAI,IAAA;AAAA,MACJ,MAAA,CAAO,IAAI,SAAS,CAAA;AAAA,MACpB,GAAA,CAAI;AAAA,KACL,KAAK,EAAC;AAAA,IACT,WAAW,cAAA,IAAkB,iBAAA;AAAA,IAC7B,KAAA,EAAO;AAAA,GACT;AACF;AAEO,SAAS,2BAAA,CAA4B;AAAA,EAC1C,OAAA;AAAA,EACA,GAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAAsB;AACpB,EAAA,MAAM,eAAA,GAAkB,GAAA,GACnB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA,GAClC,MAAA;AACJ,EAAA,MAAM,iBAAiB,YAAA,KAAiB,QAAA;AACxC,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,KAAK,gBAAA,CAAiB,GAAA;AAAA,IACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,YAAA,EAAc,sBAAA;AAAA,IACd,IAAA,EAAM,eAAA,GAAkB,CAAC,eAAA,EAAiB,eAAe,CAAA,GAAI,MAAA;AAAA,IAC7D,OAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,CAAC,CAAC,GAAA,IAAO,CAAC,CAAC;AAAA;AACtB,GACF;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAM,GAAIA,sBAAgB,gBAAgB,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QACD,MAAM;AACL,MAAA,MAAM,CAAC,IAAA,EAAM,QAAQ,CAAA,GAAI,IAAA;AACzB,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,KAAA,EAAO,cAAA,GAAiBJ,gBAAAA,CAAY,QAAQ,CAAA,GAAI;AAAA,OAClD;AAAA,IACF,IAAG,GACH,MAAA;AAAA,IACJ,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP;AACF,CAAA,EAKG;AACD,EAAA,MAAM,QAAA,GAAW,OAAO,4BAAA,GAA+B,gBAAA;AAGvD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAChC,GAAA,EAAK,kBAAA,CAAmB,CAAA,CAAE,GAAA,EAAK,SAAS,CAAA;AAAA,IACxC,UAAU,CAAA,CAAE;AAAA,GACd,CAAE,CAAA;AAEF,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,YAAA,EAAc,SAAA;AAAA,IACd,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,IACf;AAAA,GACF;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAM,GAAII,sBAAgB,gBAAgB,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAMO,SAAS,qBAAA,CAAsB;AAAA,EACpC,OAAA;AAAA,EACA,GAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV;AACF,CAAA,EAMG;AACD,EAAA,MAAM,eAAA,GAAkB,GAAA,GACnB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA,GAClC,MAAA;AAGJ,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,EAAW,cAAA;AAAA,IACX,KAAA,EAAO;AAAA,MACLA,qBAAA,CAAgB;AAAA,IAClB,KAAK,+BAAA,CAAgC,GAAA;AAAA,IACrC,SAAS,+BAAA,CAAgC,OAAA;AAAA,IACzC,YAAA,EAAc,gBAAA;AAAA,IACd,MACE,eAAA,IAAmB,eAAA,GACf,CAAC,eAAA,EAAiB,eAAe,CAAA,GACjC,MAAA;AAAA,IACN,OAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,SAAS,OAAA,IAAW,CAAC,CAAC,GAAA,IAAO,CAAC,CAAC;AAAA;AACjC,GACD,CAAA;AAGD,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,EAAW,cAAA;AAAA,IACX,KAAA,EAAO;AAAA,MACLA,qBAAA,CAAgB;AAAA,IAClB,KAAK,gBAAA,CAAiB,GAAA;AAAA,IACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,YAAA,EAAc,gBAAA;AAAA,IACd,MACE,eAAA,IAAmB,eAAA,GACf,CAAC,eAAA,EAAiB,eAAe,CAAA,GACjC,MAAA;AAAA,IACN,OAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,OAAA,EACE,OAAA,IACA,CAAC,CAAC,GAAA,IACF,CAAC,CAAC,eAAA,KACD,YAAA,KAAiB,MAAA,IAAa,MAAA,CAAO,YAAY,CAAA,KAAM,CAAA;AAAA;AAC5D,GACD,CAAA;AAGD,EAAA,MAAM,kBAAA,GAAqB,YAAA,GAAe,MAAA,CAAO,YAAY,CAAA,GAAI,CAAA;AACjE,EAAA,MAAM,kBAAA,GAAqB,YAAA,GAAe,MAAA,CAAO,YAAY,CAAA,GAAI,CAAA;AAGjE,EAAA,MAAM,WAAA,GACJ,kBAAA,GAAqB,CAAA,GAAI,kBAAA,GAAqB,kBAAA;AAEhD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA,GAAc,CAAA,GAAI,WAAA,GAAc,MAAA;AAAA,IACtC,WAAW,cAAA,IAAkB,cAAA;AAAA,IAC7B,OACE,kBAAA,KAAuB,CAAA,IAAK,kBAAA,KAAuB,CAAA,GAC/C,gBAAgB,YAAA,GAChB;AAAA,GACR;AACF;ACxeO,IAAM,aAAA,GAAgB,CAAA;AAKtB,IAAM,sBAAA,GAAyB,CAAA;AAwC/B,SAAS,eAAA,CACd,QAAA,EACA,MAAA,EACA,UAAA,EACQ;AAER,EAAA,MAAM,eAMD,EAAC;AAEN,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,GAAA,GAAM,WAAW,CAAC,CAAA;AACxB,IAAA,MAAM,SAAA,GAAY,OAAO,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAC,SAAA,EAAW;AAGhB,IAAA,MAAM,YAAY,GAAA,CAAI,KAAA,KAAU,SAAY,CAAA,IAAA,EAAO,GAAA,CAAI,KAAK,CAAA,CAAA,CAAA,GAAM,EAAA;AAClE,IAAA,MAAM,eAAe,GAAA,CAAI,QAAA,GAAW,CAAA,IAAA,EAAO,GAAA,CAAI,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAA;AAC7D,IAAA,MAAM,aAAa,GAAA,CAAI,MAAA,GAAS,CAAA,IAAA,EAAO,GAAA,CAAI,MAAM,CAAA,CAAA,CAAA,GAAM,EAAA;AACvD,IAAA,MAAM,MAAA,GAAS,CAAA,QAAA,EAAW,GAAA,CAAI,IAAI,CAAA,KAAA,EAAQ,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,EAAG,YAAY,CAAA,EAAG,UAAU,CAAA,GAAA,CAAA;AAG9F,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,MAAM,CAAA;AACxC,IAAA,IAAI,aAAa,EAAA,EAAI;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,GAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,QAAA;AAAA,MACP,GAAA,EAAK,WAAW,MAAA,CAAO,MAAA;AAAA,MACvB,GAAA,EAAK;AAAA,KACN,CAAA;AAAA,EACH;AAGA,EAAA,YAAA,CAAa,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAE7C,EAAA,IAAI,MAAA,GAAS,QAAA;AAGb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,OAAO,GAAA,EAAI,GAAI,aAAa,CAAC,CAAA;AAEjD,IAAA,IAAI;AAEF,MAAA,MAAA,GAAS,MAAA,CAAO,UAAU,CAAA,EAAG,KAAK,IAAI,KAAA,GAAQ,MAAA,CAAO,UAAU,GAAG,CAAA;AAAA,IACpE,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,eAAe,sBAAA,CACb,SAAA,EACA,QAAA,EACA,MAAA,EACiB;AACjB,EAAA,MAAM,YAAA,GACJ,SAAA,CAAU,KAAA,KAAU,MAAA,GAAY,iBAAA,GAAoB,KAAA;AACtD,EAAA,MAAM,IAAA,GACJ,SAAA,CAAU,KAAA,KAAU,MAAA,GAChB,CAAC,SAAA,CAAU,IAAA,EAAM,QAAA,EAAU,SAAA,CAAU,KAAK,CAAA,GAC1C,CAAC,SAAA,CAAU,MAAM,QAAQ,CAAA;AAE/B,EAAA,MAAM,MAAA,GAAS,MAAMI,oBAAAA,CAAa,MAAA,EAAQ;AAAA,IACxC,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,KAAK,gBAAA,CAAiB,GAAA;AAAA,IACtB,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,OAAA,GAAUR,gBAAAA,CAAa,MAAA,CAAe,CAAC,KAAK,EAAE,CAAA;AACpD,EAAA,OAAO,OAAA;AACT;AAKA,eAAe,uBAAA,CACb,SAAA,EACA,QAAA,EACA,MAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,+BAAA;AAEjB,EAAA,MAAM,YAAA,GACJ,SAAA,CAAU,KAAA,KAAU,MAAA,GAAY,oBAAA,GAAuB,aAAA;AACzD,EAAA,MAAM,kBAAA,GACJ,SAAA,CAAU,KAAA,KAAU,MAAA,GAAY,kBAAA,GAAqB,WAAA;AAEvD,EAAA,MAAM,YAAA,GACJ,SAAA,CAAU,KAAA,KAAU,MAAA,GAChB,CAAC,SAAA,CAAU,IAAA,EAAM,QAAA,EAAU,SAAA,CAAU,KAAK,CAAA,GAC1C,CAAC,SAAA,CAAU,MAAM,QAAQ,CAAA;AAE/B,EAAA,MAAM,QAAA,GAAW,MAAMQ,oBAAAA,CAAa,MAAA,EAAQ;AAAA,IAC1C,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,YAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACP,CAAA;AAED,EAAA,MAAM,UAAA,GAAc,SAA8B,CAAC,CAAA;AAEnD,EAAA,IAAI,UAAA,KAAe,GAAG,OAAO,EAAA;AAE7B,EAAA,MAAM,aACJ,SAAA,CAAU,KAAA,KAAU,SAChB,CAAC,SAAA,CAAU,MAAM,QAAA,EAAU,CAAA,EAAG,UAAA,EAAY,SAAA,CAAU,KAAK,CAAA,GACzD,CAAC,UAAU,IAAA,EAAM,QAAA,EAAU,GAAG,UAAU,CAAA;AAE9C,EAAA,MAAM,MAAA,GAAU,MAAMA,oBAAAA,CAAa,MAAA,EAAQ;AAAA,IACzC,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,YAAA,EAAc,kBAAA;AAAA,IACd,IAAA,EAAM;AAAA,GACP,CAAA;AAED,EAAA,MAAM,eAAA,GAAkB,eAAe,MAAM,CAAA;AAE7C,EAAA,MAAM,UAAU,eAAA,IAAmB,EAAA;AAEnC,EAAA,OAAO,OAAA;AACT;AAMA,eAAe,gBAAA,CACb,SAAA,EACA,eAAA,EACA,iBAAA,EACA,MAAA,EACiB;AAEjB,EAAA,MAAM,iBAAA,GACJ,SAAA,CAAU,QAAA,IAAY,iBAAA,IAAqB,eAAA;AAE7C,EAAA,IAAI,SAAA,CAAU,WAAW,GAAA,EAAK;AAC5B,IAAA,OAAO,MAAM,sBAAA,CAAuB,SAAA,EAAW,iBAAA,EAAmB,MAAM,CAAA;AAAA,EAC1E,CAAA,MAAO;AACL,IAAA,OAAO,MAAM,uBAAA,CAAwB,SAAA,EAAW,iBAAA,EAAmB,MAAM,CAAA;AAAA,EAC3E;AACF;AA4IA,eAAsB,mBAAA,CACpB,SACA,eAAA,EACA,MAAA,EACA,UACA,OAAA,mBAAuB,IAAI,GAAA,EAAI,EAC/B,iBAAA,EACiB;AAEjB,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,qBAAA,CAAsB,OAAO,CAAA,EAAG;AACnC,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,MAAM,UAAA,GAAa,mBAAmB,OAAO,CAAA;AAE7C,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,KAAA,IACM,aAAa,CAAA,EACjB,UAAA,GAAa,UAAA,CAAW,MAAA,EACxB,cAAc,sBAAA,EACd;AAEA,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AAAA,MACpB,UAAA,GAAa,sBAAA;AAAA,MACb,UAAA,CAAW;AAAA,KACb;AACA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,UAAA,EAAY,QAAQ,CAAA;AAGnD,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA;AAAA,MACjC,KAAA,CAAM,GAAA,CAAI,OAAO,GAAA,EAAK,UAAA,KAAe;AACnC,QAAA,MAAM,QAAQ,UAAA,GAAa,UAAA;AAG3B,QAAA,MAAM,iBAAA,GACJ,GAAA,CAAI,QAAA,IAAY,iBAAA,IAAqB,eAAA;AAGvC,QAAA,MAAM,MAAA,GAAS,eAAA;AAAA,UACb,EAAE,GAAG,GAAA,EAAK,QAAA,EAAU,iBAAA,EAAkB;AAAA,UACtC;AAAA,SACF;AAGA,QAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AACvB,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,sDAAsD,MAAM,CAAA;AAAA,WAC9D;AACA,UAAA,OAAO,cAAc,MAAM,CAAA,CAAA,CAAA;AAAA,QAC7B;AAGA,QAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,OAAO,CAAA;AAClC,QAAA,UAAA,CAAW,IAAI,MAAM,CAAA;AAErB,QAAA,IAAI;AAEF,UAAA,MAAM,eAAe,MAAM,gBAAA;AAAA,YACzB,GAAA;AAAA,YACA,eAAA;AAAA,YACA,iBAAA;AAAA,YACA;AAAA,WACF;AAGA,UAAA,MAAM,kBAAkB,MAAM,mBAAA;AAAA,YAC5B,YAAA;AAAA,YACA,eAAA;AAAA,YACA,MAAA;AAAA,YACA,QAAA,GAAW,CAAA;AAAA,YACX,UAAA;AAAA,YACA;AAAA;AAAA,WACF;AAEA,UAAA,OAAO,eAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,uDAAuD,KAAK,CAAA,CAAA,CAAA;AAAA,YAC5D;AAAA,WACF;AACA,UAAA,OAAO,EAAA;AAAA,QACT;AAAA,MACF,CAAC;AAAA,KACH;AAGA,IAAA,cAAA,CAAe,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,EACrC;AAGA,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,OAAA,EAAS,cAAA,EAAgB,UAAU,CAAA;AAErE,EAAA,OAAO,SAAA;AACT;ACpcO,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,GAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,OAAA,GAAU,IAAA;AAAA,EACV,OAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAAyB;AAEvB,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,OAAA;AACxB,EAAA,MAAM,iBAAiB,YAAA,KAAiB,QAAA;AAGxC,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,SAAA,EAAW,eAAA;AAAA,IACX,KAAA,EAAO;AAAA,MACL,UAAA,CAAW;AAAA,IACb,OAAA;AAAA,IACA,KAAK,GAAA,IAAO,EAAA;AAAA,IACZ,eAAA;AAAA,IACA,OAAA,EAAS,WAAW,CAAC,aAAA;AAAA,IACrB,KAAA;AAAA;AAAA,IACA,SAAA;AAAA;AAAA,IACA,SAAA;AAAA;AAAA,IACA,YAAA,EAAc;AAAA;AAAA,GACf,CAAA;AAGD,EAAA,MAAM,cAAA,GAAiBK,cAAQ,MAAM;AACnC,IAAA,IAAI,gBAAgB,OAAO,EAAA;AAC3B,IAAA,IAAI,aAAA,SAAsB,OAAA,IAAW,EAAA;AACrC,IAAA,IAAI,CAAC,QAAA,EAAU,KAAA,EAAO,OAAO,EAAA;AAE7B,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB,GAAG,CAAC,cAAA,EAAgB,aAAA,EAAe,OAAA,EAAS,QAAQ,CAAC,CAAA;AAGrD,EAAmBA,cAAQ,MAAM;AAC/B,IAAA,IAAI,CAAC,cAAA,EAAgB,OAAO,EAAC;AAC7B,IAAA,OAAO,mBAAmB,cAAc,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,cAAc,CAAC;AAGnB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIV,cAAAA,CAAmB,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,cAAAA,EAA4B;AAElE,EAAAW,+BAAA,CAAe,YAAY;AACzB,IAAA,IAAI,cAAA,IAAkB,CAAC,cAAA,EAAgB;AACrC,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,qBAAA,CAAsB,cAAc,CAAA,EAAG;AAC1C,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,cAAA,CAAe,MAAS,CAAA;AAExB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAASP,oBAAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAC1C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,OAAO,CAAA,CAAE,CAAA;AAAA,MAC3D;AAGA,MAAA,MAAM,WAAW,MAAM,mBAAA;AAAA,QACrB,cAAA;AAAA,QACA,eAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,4BACI,GAAA;AAAI,OACV;AAGA,MAAA,SAAA,CAAU,CAAC,QAAQ,CAAC,CAAA;AAAA,IACtB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kDAAkD,KAAK,CAAA;AACrE,MAAA,cAAA,CAAe,KAAY,CAAA;AAC3B,MAAA,SAAA,CAAU,EAAE,CAAA;AAAA,IACd,CAAA,SAAE;AACA,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,cAAA,EAAgB,eAAA,EAAiB,OAAA,EAAS,cAAc,CAAC,CAAA;AAG7D,EAAA,MAAM,aAAA,GAAgBM,cAAQ,MAAM;AAClC,IAAA,IAAI,kBAAkB,CAAC,cAAA,IAAkB,CAAC,MAAA,CAAO,QAAQ,OAAO,MAAA;AAEhE,IAAA,OAAO,OAAO,CAAC,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,cAAA,EAAgB,MAAA,EAAQ,cAAc,CAAC,CAAA;AAG3C,EAAA,MAAM,KAAA,GAAQA,cAAQ,MAAM;AAC1B,IAAA,IAAI,cAAA,IAAkB,CAAC,cAAA,EAAgB,OAAO,KAAA;AAC9C,IAAA,OAAO,sBAAsB,cAAc,CAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,cAAA,EAAgB,cAAc,CAAC,CAAA;AAGnC,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAsC;AACzD,IAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AAGnB,IAAA,OAAO,cAAA,GAAiB,KAAA,GAAQJ,gBAAAA,CAAY,KAAK,CAAA;AAAA,EACnD,CAAA;AAIA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAU,IAAA,IAAQ,EAAA;AAAA,MACxB,OAAO,aAAA,GAAgB,OAAA,IAAW,EAAA,GAAK,WAAA,CAAY,UAAU,KAAK,CAAA;AAAA,MAClE,SAAA,EAAW,eAAA;AAAA,MACX,KAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAU,IAAA,IAAQ,EAAA;AAAA,IACxB,KAAA,EAAO,KAAA,GACH,WAAA,CAAY,aAAa,CAAA,GACzB,gBACA,OAAA,IAAW,EAAA,GACX,WAAA,CAAY,QAAA,EAAU,KAAK,CAAA;AAAA,IAC/B,SAAA,EAAW,mBAAoB,KAAA,IAAS,aAAA;AAAA,IACxC,OAAO,aAAA,IAAiB,WAAA;AAAA,IACxB;AAAA,GACF;AACF;AC1IA,IAAMM,WAAAA,GAAa,CAAA;AAOZ,SAAS,oBAAA,CAAqB;AAAA,EACnC,OAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAAgC;AAC9B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIZ,cAAAA,EAAkC;AAC5E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,EAA4B;AAGhE,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,EAAW,aAAA;AAAA,IACX,KAAA,EAAO;AAAA,MACLC,qBAAAA,CAAgB;AAAA,IAClB,KAAK,uBAAA,CAAwB,GAAA;AAAA,IAC7B,SAAS,uBAAA,CAAwB,OAAA;AAAA,IACjC,YAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAM,CAAC,UAAA,EAAY,eAAe,CAAA;AAAA,IAClC,OAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,OAAA,IAAW,CAAC,CAAC;AAAA;AACxB,GACD,CAAA;AAGD,EAAAC,gBAAU,MAAM;AACd,IAAA,eAAe,aAAA,GAAgB;AAC7B,MAAA,IAAI,CAAC,YAAA,IAAgB,aAAA,IAAiB,WAAA,EAAa;AACjD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,CAAC,gBAAA,EAAkB,IAAA,EAAM,IAAI,CAAA,GAAI,YAAA;AAOvC,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,gBAAA,CAAiB,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AACtC,QAAA;AAAA,MACF;AAGA,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,aAAA,CAAc,MAAS,CAAA;AAEvB,MAAA,IAAI;AAEF,QAAA,MAAM,CAAC,UAAU,CAAA,GAAIC,wBAAAA,CAAoB,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA;AAElE,QAAA,IAAI,eAAe,CAAA,EAAG;AACpB,UAAA,gBAAA,CAAiB,KAAA,CAAS,CAAA;AAC1B,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,YAAY,MAAM,oBAAA;AAAA,UACtB,OAAO,UAAU,CAAA;AAAA,UACjB,eAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,MAAM,eAAA,GAAkB,eAAe,SAAS,CAAA;AAEhD,QAAA,IAAI,oBAAoB,KAAA,CAAA,EAAW;AACjC,UAAA,gBAAA,CAAiB,KAAA,CAAS,CAAA;AAAA,QAC5B,CAAA,MAAO;AAEL,UAAA,MAAM,OAAA,GAAUG,iBAAY,eAAe,CAAA;AAC3C,UAAA,gBAAA,CAAiB,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,QAC3C;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,aAAA,CAAc,KAAc,CAAA;AAAA,MAC9B,CAAA,SAAE;AACA,QAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,aAAA,EAAc;AAAA,EAChB,CAAA,EAAG;AAAA,IACD,YAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAW,aAAA,IAAiB,cAAA;AAAA,IAC5B,OAAO,WAAA,IAAe;AAAA,GACxB;AACF;AAKA,eAAe,oBAAA,CACb,UAAA,EACA,eAAA,EACA,OAAA,EACA,UAAA,EACmB;AACnB,EAAA,MAAM,MAAA,GAASF,oBAAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAC1C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,OAAO,CAAA,CAAE,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,UAAA,EAAY,SAASQ,WAAAA,EAAY;AAC3D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQA,aAAY,UAAU,CAAA;AAEnD,IAAA,MAAM,KAAA,GAAS,MAAMP,oBAAAA,CAAa,MAAA,EAAQ;AAAA,MACxC,KAAK,wBAAA,CAAyB,GAAA;AAAA,MAC9B,SAAS,wBAAA,CAAyB,OAAA;AAAA,MAClC,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM,CAAC,UAAA,EAAY,eAAA,EAAiB,OAAO,GAAG;AAAA,KAC/C,CAAA;AAED,IAAA,SAAA,CAAU,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,SAAA;AACT","file":"react.js","sourcesContent":["[\n {\n \"type\": \"function\",\n \"name\": \"bulkGet\",\n \"inputs\": [\n {\n \"name\": \"params\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct Storage.BulkGetParams[]\",\n \"components\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" }\n ]\n }\n ],\n \"outputs\": [\n {\n \"name\": \"results\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct Storage.BulkGetResult[]\",\n \"components\": [\n { \"name\": \"text\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"value\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"bulkGetTotalWrites\",\n \"inputs\": [\n {\n \"name\": \"params\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct Storage.BulkGetParams[]\",\n \"components\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" }\n ]\n }\n ],\n \"outputs\": [\n { \"name\": \"results\", \"type\": \"uint256[]\", \"internalType\": \"uint256[]\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"bulkGetValueAtIndex\",\n \"inputs\": [\n {\n \"name\": \"params\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct Storage.BulkGetValueAtIndexParams[]\",\n \"components\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n {\n \"name\": \"operator\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n { \"name\": \"idx\", \"type\": \"uint256\", \"internalType\": \"uint256\" }\n ]\n }\n ],\n \"outputs\": [\n {\n \"name\": \"results\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct Storage.BulkGetResult[]\",\n \"components\": [\n { \"name\": \"text\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"value\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"bulkPut\",\n \"inputs\": [\n {\n \"name\": \"params\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct Storage.BulkPutParams[]\",\n \"components\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"text\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"value\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ]\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" }\n ],\n \"outputs\": [\n { \"name\": \"\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getTotalWrites\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" }\n ],\n \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\", \"internalType\": \"uint256\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getValueAtIndex\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" },\n { \"name\": \"idx\", \"type\": \"uint256\", \"internalType\": \"uint256\" }\n ],\n \"outputs\": [\n { \"name\": \"\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"put\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"text\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"value\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"event\",\n \"name\": \"Stored\",\n \"inputs\": [\n {\n \"name\": \"key\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"operator\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n }\n ],\n \"anonymous\": false\n }\n]\n","[\n {\n \"type\": \"function\",\n \"name\": \"get\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" }\n ],\n \"outputs\": [\n { \"name\": \"\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getChunk\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" },\n { \"name\": \"chunkIndex\", \"type\": \"uint8\", \"internalType\": \"uint8\" }\n ],\n \"outputs\": [\n { \"name\": \"chunkData\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getChunks\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" },\n { \"name\": \"startIndex\", \"type\": \"uint8\", \"internalType\": \"uint8\" },\n { \"name\": \"endIndex\", \"type\": \"uint8\", \"internalType\": \"uint8\" }\n ],\n \"outputs\": [\n { \"name\": \"chunks\", \"type\": \"bytes[]\", \"internalType\": \"bytes[]\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getMetadata\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" }\n ],\n \"outputs\": [\n { \"name\": \"chunkCount\", \"type\": \"uint8\", \"internalType\": \"uint8\" },\n { \"name\": \"originalText\", \"type\": \"string\", \"internalType\": \"string\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"put\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"text\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"chunks\", \"type\": \"bytes[]\", \"internalType\": \"bytes[]\" }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"event\",\n \"name\": \"ChunkedStoragePut\",\n \"inputs\": [\n {\n \"name\": \"originalKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"sender\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"hashedKey\",\n \"type\": \"bytes32\",\n \"indexed\": false,\n \"internalType\": \"bytes32\"\n }\n ],\n \"anonymous\": false\n },\n { \"type\": \"error\", \"name\": \"DataTooLarge\", \"inputs\": [] }\n]\n","[\n {\n \"type\": \"function\",\n \"name\": \"get\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" }\n ],\n \"outputs\": [\n { \"name\": \"\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getChunk\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" },\n { \"name\": \"chunkIndex\", \"type\": \"uint8\", \"internalType\": \"uint8\" }\n ],\n \"outputs\": [\n { \"name\": \"chunkData\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getChunkAtIndex\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" },\n { \"name\": \"chunkIndex\", \"type\": \"uint8\", \"internalType\": \"uint8\" },\n { \"name\": \"idx\", \"type\": \"uint256\", \"internalType\": \"uint256\" }\n ],\n \"outputs\": [\n { \"name\": \"chunkData\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getChunks\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" },\n { \"name\": \"startIndex\", \"type\": \"uint8\", \"internalType\": \"uint8\" },\n { \"name\": \"endIndex\", \"type\": \"uint8\", \"internalType\": \"uint8\" }\n ],\n \"outputs\": [\n { \"name\": \"chunks\", \"type\": \"bytes[]\", \"internalType\": \"bytes[]\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getChunksAtIndex\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" },\n { \"name\": \"startIndex\", \"type\": \"uint8\", \"internalType\": \"uint8\" },\n { \"name\": \"endIndex\", \"type\": \"uint8\", \"internalType\": \"uint8\" },\n { \"name\": \"idx\", \"type\": \"uint256\", \"internalType\": \"uint256\" }\n ],\n \"outputs\": [\n { \"name\": \"chunks\", \"type\": \"bytes[]\", \"internalType\": \"bytes[]\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getMetadata\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" }\n ],\n \"outputs\": [\n { \"name\": \"chunkCount\", \"type\": \"uint8\", \"internalType\": \"uint8\" },\n { \"name\": \"originalText\", \"type\": \"string\", \"internalType\": \"string\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getMetadataAtIndex\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" },\n { \"name\": \"idx\", \"type\": \"uint256\", \"internalType\": \"uint256\" }\n ],\n \"outputs\": [\n { \"name\": \"chunkCount\", \"type\": \"uint8\", \"internalType\": \"uint8\" },\n { \"name\": \"originalText\", \"type\": \"string\", \"internalType\": \"string\" }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getTotalWrites\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" }\n ],\n \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\", \"internalType\": \"uint256\" }],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getValueAtIndex\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" },\n { \"name\": \"idx\", \"type\": \"uint256\", \"internalType\": \"uint256\" }\n ],\n \"outputs\": [\n { \"name\": \"\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ],\n \"stateMutability\": \"view\"\n }\n]\n","[\n {\n \"type\": \"function\",\n \"name\": \"get\",\n \"inputs\": [\n { \"name\": \"key\", \"type\": \"bytes32\", \"internalType\": \"bytes32\" },\n { \"name\": \"operator\", \"type\": \"address\", \"internalType\": \"address\" }\n ],\n \"outputs\": [\n { \"name\": \"isChunkedStorage\", \"type\": \"bool\", \"internalType\": \"bool\" },\n { \"name\": \"text\", \"type\": \"string\", \"internalType\": \"string\" },\n { \"name\": \"data\", \"type\": \"bytes\", \"internalType\": \"bytes\" }\n ],\n \"stateMutability\": \"view\"\n },\n { \"type\": \"error\", \"name\": \"StoredDataNotFound\", \"inputs\": [] }\n]\n","[\n {\n \"type\": \"function\",\n \"name\": \"bulkGet\",\n \"inputs\": [\n {\n \"name\": \"params\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct IStorage.BulkGetParams[]\",\n \"components\": [\n {\n \"name\": \"key\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"operator\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n }\n ],\n \"outputs\": [\n {\n \"name\": \"results\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct IStorage.BulkGetResult[]\",\n \"components\": [\n {\n \"name\": \"text\",\n \"type\": \"string\",\n \"internalType\": \"string\"\n },\n {\n \"name\": \"value\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"bulkGetValueAtIndex\",\n \"inputs\": [\n {\n \"name\": \"params\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct IStorage.BulkGetValueAtIndexParams[]\",\n \"components\": [\n {\n \"name\": \"key\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"operator\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"idx\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ]\n }\n ],\n \"outputs\": [\n {\n \"name\": \"results\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct IStorage.BulkGetResult[]\",\n \"components\": [\n {\n \"name\": \"text\",\n \"type\": \"string\",\n \"internalType\": \"string\"\n },\n {\n \"name\": \"value\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"get\",\n \"inputs\": [\n {\n \"name\": \"key\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"operator\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"string\",\n \"internalType\": \"string\"\n },\n {\n \"name\": \"\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getValueAtIndex\",\n \"inputs\": [\n {\n \"name\": \"key\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"operator\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"idx\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"string\",\n \"internalType\": \"string\"\n },\n {\n \"name\": \"\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"stateMutability\": \"view\"\n }\n]\n","import storageAbi from \"./abis/storage.json\";\nimport chunkedStorageAbi from \"./abis/chunked-storage.json\";\nimport chunkedStorageReaderAbi from \"./abis/chunked-storage-reader.json\";\nimport storageRouterAbi from \"./abis/storage-router.json\";\nimport safeStorageReaderAbi from \"./abis/safe-storage-reader.json\";\nimport type { Abi } from \"viem\";\n\nexport const STORAGE_CONTRACT = {\n abi: storageAbi as Abi,\n address: \"0x00000000db40fcb9f4466330982372e27fd7bbf5\" as `0x${string}`,\n};\n\nexport const CHUNKED_STORAGE_CONTRACT = {\n abi: chunkedStorageAbi as Abi,\n address: \"0x000000A822F09aF21b1951B65223F54ea392E6C6\" as `0x${string}`,\n};\n\nexport const CHUNKED_STORAGE_READER_CONTRACT = {\n abi: chunkedStorageReaderAbi as Abi,\n address: \"0x00000005210a7532787419658f6162f771be62f8\" as `0x${string}`,\n};\n\nexport const STORAGE_ROUTER_CONTRACT = {\n abi: storageRouterAbi as Abi,\n address: \"0x000000C0bbc2Ca04B85E77D18053e7c38bB97939\" as `0x${string}`,\n};\n\nexport const SAFE_STORAGE_READER_CONTRACT = {\n abi: safeStorageReaderAbi as Abi,\n address: \"0x0000000d03bad401fae4935dc9cbbf8084347214\" as `0x${string}`,\n};\n","import { keccak256HashString } from \"@net-protocol/core\";\n\n/**\n * XML reference type for chunk metadata\n */\nexport interface XmlReference {\n hash: string;\n version: string;\n index?: number;\n operator?: string;\n source?: string; // 'd' for direct Storage.sol, undefined for ChunkedStorage\n}\n\n/**\n * Parse XML metadata to extract chunk references\n * Format: <net k=\"hashValue\" v=\"0.0.1\" o=\"0xoperator\" s=\"d\" />\n */\nexport function parseNetReferences(metadata: string): XmlReference[] {\n const regex =\n /<net\\s+k=\"([^\"]+)\"\\s+v=\"([^\"]+)\"(?:\\s+i=\"([^\"]+)\")?(?:\\s+o=\"([^\"]+)\")?(?:\\s+s=\"([^\"]+)\")?\\s*\\/>/g;\n const references: XmlReference[] = [];\n let match;\n\n while ((match = regex.exec(metadata)) !== null) {\n references.push({\n hash: match[1],\n version: match[2],\n index: match[3] ? parseInt(match[3], 10) : undefined,\n operator: match[4]?.toLowerCase(),\n source: match[5],\n });\n }\n\n return references;\n}\n\n/**\n * Check if a string contains XML references\n */\nexport function containsXmlReferences(data: string): boolean {\n return /<net\\s+k=\"[^\"]+\"\\s+v=\"[^\"]+\"(?:\\s+i=\"[^\"]+\")?(?:\\s+o=\"[^\"]+\")?(?:\\s+s=\"[^\"]+\")?\\s*\\/>/.test(\n data\n );\n}\n\n/**\n * Detect storage type based on content\n */\nexport function detectStorageType(metadata: string): \"xml\" | \"regular\" {\n return containsXmlReferences(metadata) ? \"xml\" : \"regular\";\n}\n\n/**\n * Resolve operator address for a reference with fallback to default\n */\nexport function resolveOperator(\n reference: XmlReference,\n defaultOperator: string\n): string {\n return reference.operator?.toLowerCase() || defaultOperator.toLowerCase();\n}\n\n/**\n * Generate unique key for a reference to detect circular dependencies\n */\nexport function getReferenceKey(\n reference: XmlReference,\n defaultOperator: string\n): string {\n const operator = resolveOperator(reference, defaultOperator);\n const index = reference.index !== undefined ? `-${reference.index}` : \"\";\n return `${reference.hash}-${operator}${index}`;\n}\n\n","import { stringToHex, hexToBytes, hexToString } from \"viem\";\nimport pako from \"pako\";\nimport { containsXmlReferences } from \"./xmlUtils\";\n\nconst CHUNK_SIZE = 20 * 1000; // 20KB to match contract\n\n/**\n * Chunks data for storage in ChunkedStorage contract\n * First compresses the data using gzip, then chunks the compressed data\n * @param data - The string data to chunk\n * @returns Array of hex-encoded byte chunks of compressed data\n */\nexport function chunkDataForStorage(data: string): string[] {\n try {\n // Convert to hex first, then compress\n const dataHex = stringToHex(data);\n const compressedBytes = pako.gzip(dataHex);\n\n // Convert compressed bytes to hex\n const dataBytes = \"0x\" + Buffer.from(compressedBytes).toString(\"hex\");\n const chunks: string[] = [];\n\n // Remove '0x' prefix for processing\n const hexWithoutPrefix = dataBytes.slice(2);\n\n // Chunk the hex data (each byte = 2 hex chars)\n for (let i = 0; i < hexWithoutPrefix.length; i += CHUNK_SIZE * 2) {\n const chunk = hexWithoutPrefix.slice(i, i + CHUNK_SIZE * 2);\n chunks.push(\"0x\" + chunk);\n }\n\n // Handle empty data case\n if (chunks.length === 0) {\n chunks.push(\"0x\");\n }\n\n return chunks;\n } catch (error) {\n console.error(\"[chunkDataForStorage] Compression failed:\", error);\n throw new Error(\"Failed to compress data for storage\");\n }\n}\n\n/**\n * Determines if XML storage should be suggested for the given data\n * @param data - The string data to check\n * @returns True if XML storage should be suggested\n */\nexport function shouldSuggestXmlStorage(data: string): boolean {\n return data.length > CHUNK_SIZE || containsXmlReferences(data);\n}\n\n/**\n * Gets the estimated number of chunks for given data\n * @param data - The string data\n * @returns Number of chunks that would be created\n */\nexport function getChunkCount(data: string): number {\n const dataBytes = stringToHex(data);\n const hexWithoutPrefix = dataBytes.slice(2);\n return Math.max(1, Math.ceil(hexWithoutPrefix.length / (CHUNK_SIZE * 2)));\n}\n\n/**\n * Assemble chunks into a single string and decompress\n * Pure function - can be used in both client and server code\n * @param chunks - Array of hex-encoded chunk strings\n * @param returnHex - If true, returns hex string instead of converting to UTF-8\n * @returns Decompressed string (or hex string if returnHex=true) or undefined if decompression fails\n */\nexport function assembleChunks(\n chunks: string[],\n returnHex?: boolean\n): string | undefined {\n try {\n // Concatenate hex strings, keeping only first 0x prefix\n let assembled = chunks[0] || \"0x\";\n for (let i = 1; i < chunks.length; i++) {\n const chunk = chunks[i];\n if (chunk && chunk !== \"0x\") {\n assembled += chunk.slice(2); // Remove '0x' prefix from subsequent chunks\n }\n }\n\n // Convert hex to bytes\n const bytes = hexToBytes(assembled as `0x${string}`);\n\n try {\n // Try to decompress\n const decompressed = pako.ungzip(bytes);\n\n // Decompressed bytes are UTF-8 bytes of the hex string (because chunkDataForStorage compressed the hex string)\n // Convert bytes to UTF-8 string (which is the hex string)\n const hexString = Buffer.from(decompressed).toString(\"utf8\");\n\n // If returnHex is true, return the hex string directly\n if (returnHex) {\n return hexString.startsWith(\"0x\") ? hexString : `0x${hexString}`;\n }\n\n // Convert hex string to plain string\n const result = hexToString(hexString as `0x${string}`);\n return result;\n } catch (error) {\n // If decompression fails, assume it's uncompressed data\n return undefined;\n }\n } catch (error) {\n console.error(\"[assembleChunks] Failed to assemble chunks:\", error);\n throw new Error(\"Failed to decompress chunked data\");\n }\n}\n","import { fromHex, stringToHex } from \"viem\";\nimport { keccak256HashString, toBytes32 } from \"@net-protocol/core\";\n\n/**\n * Convert a value string to hex format for storage\n */\nexport function getValueArgForStorage(value: string): string {\n return stringToHex(value);\n}\n\n/**\n * Get both key and value in bytes format for storage\n */\nexport function getBytesArgsForStorage(key: string, value: string) {\n const bytesKey = toBytes32(key);\n const bytesValue = getValueArgForStorage(value);\n return { bytesKey, bytesValue };\n}\n\n/**\n * Check if a string contains binary characters (non-ASCII)\n */\nfunction isBinaryString(str: string): boolean {\n return str.split(\"\").some((char) => char.charCodeAt(0) > 127);\n}\n\n/**\n * Format storage key for display, decoding hex to readable text when possible\n * Returns both the display text and whether it was successfully decoded\n */\nexport function formatStorageKeyForDisplay(storageKey: string): {\n displayText: string;\n isDecoded: boolean;\n} {\n // Try to decode if it looks like a hex bytes32\n if (\n storageKey.startsWith(\"0x\") &&\n storageKey.length === 66 &&\n /^0x[0-9a-fA-F]{64}$/.test(storageKey)\n ) {\n try {\n const decoded = fromHex(storageKey as `0x${string}`, \"string\");\n // Trim null bytes\n const trimmed = decoded.replace(/\\0/g, \"\");\n // Check if it's readable ASCII text (not binary)\n if (!isBinaryString(trimmed) && trimmed.trim().length > 0) {\n return {\n displayText: trimmed,\n isDecoded: true,\n };\n }\n } catch {\n // Fall through to return original\n }\n }\n\n // Return original for non-hex or failed decode\n return {\n displayText: storageKey,\n isDecoded: false,\n };\n}\n\n/**\n * Get storage key as bytes32 format\n * Supports direct hex bytes32 input or converts string to bytes32\n * For strings longer than 32 bytes, hashes them\n *\n * @param input - The storage key (raw string or bytes32 hex)\n * @param keyFormat - Optional format override: \"raw\" to always convert, \"bytes32\" to use as-is, undefined for auto-detect\n */\nexport function getStorageKeyBytes(\n input: string,\n keyFormat?: \"raw\" | \"bytes32\"\n): string {\n // Explicit format override: bytes32 - use as-is\n if (keyFormat === \"bytes32\") {\n return input.toLowerCase();\n }\n\n // Explicit format override: raw - always convert\n if (keyFormat === \"raw\") {\n return input.length > 32\n ? keccak256HashString(input.toLowerCase())\n : toBytes32(input.toLowerCase());\n }\n\n // Auto-detect: if already in correct format, use directly\n if (\n input.startsWith(\"0x\") &&\n input.length === 66 && // 0x + 64 hex chars = bytes32\n /^0x[0-9a-fA-F]{64}$/.test(input)\n ) {\n return input.toLowerCase();\n }\n\n // Auto-detect: convert string to bytes32\n return input.length > 32\n ? keccak256HashString(input.toLowerCase())\n : toBytes32(input.toLowerCase());\n}\n\n/**\n * Encodes a storage key for use in URL paths.\n *\n * This ensures special characters (including trailing spaces) are preserved\n * when storage keys are used in URLs.\n *\n * @param key - The storage key string (already decoded, from data or URL params)\n * @returns URL-encoded storage key safe for use in path segments\n *\n * @example\n * encodeStorageKeyForUrl('declaration of independence ')\n * // Returns: 'declaration%20of%20independence%20'\n */\nexport function encodeStorageKeyForUrl(key: string): string {\n return encodeURIComponent(key);\n}\n\n/**\n * Generate a <net ... /> embed tag for storage\n * @param params - Object containing storage embed parameters\n * @param params.storageKeyBytes - The storage key as bytes32 (hex string)\n * @param params.operatorAddress - The operator address\n * @param params.isRegularStorage - If true, includes s=\"d\" for direct Storage.sol reads. If false/undefined, omits s attribute (defaults to ChunkedStorage)\n * @param params.versionIndex - Optional version index. If provided, includes i=\"versionIndex\" attribute to reference specific historical version\n * @returns The embed tag string\n */\nexport function generateStorageEmbedTag(params: {\n storageKeyBytes: string;\n operatorAddress: string;\n isRegularStorage?: boolean;\n versionIndex?: number;\n}): string {\n const operator = params.operatorAddress.toLowerCase();\n const indexAttr =\n params.versionIndex !== undefined ? ` i=\"${params.versionIndex}\"` : \"\";\n const sourceAttr = params.isRegularStorage ? ` s=\"d\"` : \"\";\n return `<net k=\"${params.storageKeyBytes}\" v=\"0.0.1\"${indexAttr} o=\"${operator}\"${sourceAttr} />`;\n}\n","import { useReadContract } from \"wagmi\";\nimport { useState, useEffect } from \"react\";\nimport { STORAGE_CONTRACT, SAFE_STORAGE_READER_CONTRACT } from \"../constants\";\nimport {\n CHUNKED_STORAGE_READER_CONTRACT,\n STORAGE_ROUTER_CONTRACT,\n CHUNKED_STORAGE_CONTRACT,\n} from \"../constants\";\nimport { getNetContract } from \"@net-protocol/core\";\nimport { assembleChunks } from \"../utils/chunkUtils\";\nimport { getPublicClient } from \"@net-protocol/core\";\nimport { readContract } from \"viem/actions\";\nimport { hexToString, stringToHex, decodeAbiParameters } from \"viem\";\nimport { getStorageKeyBytes } from \"../utils/keyUtils\";\nimport type { UseStorageOptions, BulkStorageKey, StorageData } from \"../types\";\n\nconst BATCH_SIZE = 2;\n\nexport function useStorage({\n chainId,\n key,\n operatorAddress,\n enabled = true,\n index,\n keyFormat,\n useRouter = false,\n outputFormat = \"hex\",\n}: UseStorageOptions) {\n // For latest version (index undefined), use existing simple flow\n const isLatestVersion = index === undefined;\n const shouldUseRouter = useRouter === true && isLatestVersion;\n const outputAsString = outputFormat === \"string\";\n const storageKeyBytes = key ? getStorageKeyBytes(key, keyFormat) : undefined;\n\n // Helper function to convert data based on outputFormat\n const formatData = (text: string, dataHex: `0x${string}`): StorageData => {\n return {\n text,\n value: outputAsString ? hexToString(dataHex) : dataHex,\n };\n };\n\n // Router path (latest only, automatic detection)\n const [routerData, setRouterData] = useState<StorageData | undefined>();\n const [routerChunkLoading, setRouterChunkLoading] = useState(false);\n const [routerChunkError, setRouterChunkError] = useState<Error | undefined>();\n\n const routerHook = useReadContract({\n abi: STORAGE_ROUTER_CONTRACT.abi,\n address: STORAGE_ROUTER_CONTRACT.address,\n functionName: \"get\",\n args:\n storageKeyBytes && operatorAddress\n ? [storageKeyBytes, operatorAddress]\n : undefined,\n chainId,\n query: {\n enabled: shouldUseRouter && enabled && !!key && !!operatorAddress,\n },\n });\n\n // useEffect to process router result\n useEffect(() => {\n async function processRouterResult() {\n if (!routerHook.data || routerHook.isLoading || routerHook.error) {\n return;\n }\n\n const [isChunkedStorage, text, data] = routerHook.data as [\n boolean,\n string,\n `0x${string}`\n ];\n\n // Handle non-chunked data (early return)\n if (!isChunkedStorage) {\n // Guard: ensure data exists before formatting\n if (!data || typeof data !== \"string\") {\n setRouterData(undefined);\n return;\n }\n // Regular storage - data is already hex, apply outputFormat\n const formatted = formatData(text, data);\n setRouterData(formatted);\n return;\n }\n\n // Handle chunked data\n setRouterChunkLoading(true);\n setRouterChunkError(undefined);\n\n try {\n // Decode chunk count from the data\n const [chunkCount] = decodeAbiParameters([{ type: \"uint8\" }], data);\n\n if (chunkCount === 0) {\n setRouterData(undefined);\n return;\n }\n\n // Fetch chunks in batches\n const client = getPublicClient({ chainId });\n if (!client) {\n throw new Error(`Chain not found for chainId: ${chainId}`);\n }\n\n const allChunks: string[] = [];\n for (let start = 0; start < Number(chunkCount); start += BATCH_SIZE) {\n const end = Math.min(start + BATCH_SIZE, Number(chunkCount));\n const batch = (await readContract(client, {\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n address: CHUNKED_STORAGE_CONTRACT.address,\n functionName: \"getChunks\",\n args: [storageKeyBytes!, operatorAddress, start, end],\n })) as string[];\n allChunks.push(...batch);\n }\n\n // Assemble chunks\n const assembledString = assembleChunks(allChunks);\n\n // assembleChunks returns plain string (converted via hexToString internally) - handle based on outputFormat\n if (assembledString === undefined) {\n setRouterData(undefined);\n } else {\n if (outputAsString) {\n // assembleChunks already returns plain string\n setRouterData({ text, value: assembledString });\n } else {\n // Convert plain string to hex for hex output format\n const hexData = stringToHex(assembledString) as `0x${string}`;\n setRouterData({ text, value: hexData });\n }\n }\n } catch (error) {\n setRouterChunkError(error as Error);\n } finally {\n setRouterChunkLoading(false);\n }\n }\n\n processRouterResult();\n }, [\n routerHook.data,\n routerHook.isLoading,\n routerHook.error,\n operatorAddress,\n chainId,\n storageKeyBytes,\n outputAsString,\n ]);\n\n // Latest version: use Storage.get() directly (when router is disabled)\n const {\n data: latestData,\n isLoading: latestLoading,\n error: latestError,\n } = useReadContract({\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"get\",\n args:\n key && operatorAddress\n ? [getStorageKeyBytes(key, keyFormat) as `0x${string}`, operatorAddress]\n : undefined,\n chainId,\n query: {\n enabled:\n !shouldUseRouter &&\n enabled &&\n !!operatorAddress &&\n !!key &&\n isLatestVersion,\n },\n });\n\n // Historical version: try chunked storage first, then regular storage\n const [historicalData, setHistoricalData] = useState<StorageData | undefined>(\n undefined\n );\n const [historicalLoading, setHistoricalLoading] = useState(false);\n const [historicalError, setHistoricalError] = useState<Error | undefined>();\n\n useEffect(() => {\n async function fetchHistoricalVersion() {\n if (isLatestVersion || !key || !operatorAddress || !enabled) {\n return;\n }\n\n setHistoricalLoading(true);\n setHistoricalError(undefined);\n setHistoricalData(undefined);\n\n try {\n const client = getPublicClient({ chainId });\n if (!client) {\n throw new Error(`Chain not found for chainId: ${chainId}`);\n }\n\n const storageKeyBytes = getStorageKeyBytes(\n key,\n keyFormat\n ) as `0x${string}`;\n\n // Step 1: Try ChunkedStorageReader.getMetadataAtIndex first\n try {\n const metadata = await readContract(client, {\n abi: CHUNKED_STORAGE_READER_CONTRACT.abi,\n address: CHUNKED_STORAGE_READER_CONTRACT.address,\n functionName: \"getMetadataAtIndex\",\n args: [storageKeyBytes, operatorAddress, index],\n });\n\n const [chunkCount, text] = metadata as [number, string];\n\n if (chunkCount > 0) {\n // Found chunked storage at index - fetch and assemble chunks\n const chunks = (await readContract(client, {\n abi: CHUNKED_STORAGE_READER_CONTRACT.abi,\n address: CHUNKED_STORAGE_READER_CONTRACT.address,\n functionName: \"getChunksAtIndex\",\n args: [storageKeyBytes, operatorAddress, 0, chunkCount, index],\n })) as string[];\n\n const assembledData = assembleChunks(chunks);\n if (assembledData !== undefined) {\n // assembleChunks returns plain string - convert to hex first, then apply outputFormat\n const hexData = stringToHex(assembledData) as `0x${string}`;\n setHistoricalData(formatData(text, hexData));\n setHistoricalLoading(false);\n return;\n }\n }\n } catch (chunkedError) {\n // Chunked storage failed, continue to regular storage\n }\n\n // Step 2: Try regular Storage.getValueAtIndex\n const result = await readContract(client, {\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"getValueAtIndex\",\n args: [storageKeyBytes, operatorAddress, index],\n });\n\n const [text, data] = result as [string, `0x${string}`];\n // Guard: ensure data exists before formatting\n if (!data || typeof data !== \"string\") {\n setHistoricalData(undefined);\n setHistoricalLoading(false);\n return;\n }\n // Apply outputFormat to historical data\n setHistoricalData(formatData(text, data));\n } catch (error) {\n console.error(\n \"[useStorage] Failed to fetch historical version:\",\n error\n );\n setHistoricalError(error as Error);\n } finally {\n setHistoricalLoading(false);\n }\n }\n\n fetchHistoricalVersion();\n }, [\n chainId,\n key,\n operatorAddress,\n index,\n enabled,\n isLatestVersion,\n outputAsString,\n ]);\n\n // Return appropriate data based on version type\n if (!isLatestVersion) {\n return {\n data: historicalData,\n isLoading: historicalLoading,\n error: historicalError,\n };\n }\n\n if (shouldUseRouter) {\n return {\n data: routerData,\n isLoading: routerHook.isLoading || routerChunkLoading,\n error: routerHook.error || routerChunkError,\n };\n }\n\n // Apply outputFormat to direct storage data\n // latestData is a tuple [string, string] from the contract, not a StorageData object\n const formattedDirectData = latestData\n ? (() => {\n const result = latestData as [string, `0x${string}`];\n const [text, valueHex] = result;\n // Guard: ensure valueHex exists before formatting\n if (!valueHex || typeof valueHex !== \"string\") {\n return undefined;\n }\n return formatData(text, valueHex);\n })()\n : undefined;\n\n return {\n data: formattedDirectData,\n isLoading: latestLoading,\n error: latestError as Error | undefined,\n };\n}\n\nexport function useStorageForOperator({\n chainId,\n operatorAddress,\n}: UseStorageOptions) {\n const netContract = getNetContract(chainId);\n const { data: totalCount, isLoading: isLoadingCount } = useReadContract({\n abi: netContract.abi,\n address: netContract.address,\n functionName: \"getTotalMessagesForAppUserCount\",\n args: [STORAGE_CONTRACT.address, operatorAddress],\n chainId,\n });\n\n // Convert BigInt totalCount to number immediately\n const totalCountNumber = totalCount ? Number(totalCount) : 0;\n\n const { data: messages, isLoading: isLoadingMessages } = useReadContract({\n abi: netContract.abi,\n address: netContract.address,\n functionName: \"getMessagesInRangeForAppUser\",\n args: [0, totalCountNumber, STORAGE_CONTRACT.address, operatorAddress],\n chainId,\n }) as { data: any[] | undefined; isLoading: boolean };\n\n return {\n data:\n messages?.map((msg: any) => [\n msg.topic,\n msg.text,\n Number(msg.timestamp),\n msg.data,\n ]) || [],\n isLoading: isLoadingCount || isLoadingMessages,\n error: undefined,\n };\n}\n\nexport function useStorageForOperatorAndKey({\n chainId,\n key,\n operatorAddress,\n keyFormat,\n outputFormat = \"hex\",\n}: UseStorageOptions) {\n const storageKeyBytes = key\n ? (getStorageKeyBytes(key, keyFormat) as `0x${string}`)\n : undefined;\n const outputAsString = outputFormat === \"string\";\n const readContractArgs = {\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"getForOperatorAndKey\",\n args: storageKeyBytes ? [operatorAddress, storageKeyBytes] : undefined,\n chainId,\n query: {\n enabled: !!key && !!operatorAddress,\n },\n };\n\n const { data, isLoading, error } = useReadContract(readContractArgs);\n\n return {\n data: data\n ? (() => {\n const [text, valueHex] = data as [string, `0x${string}`];\n return {\n text,\n value: outputAsString ? hexToString(valueHex) : valueHex,\n };\n })()\n : undefined,\n isLoading,\n error: error as Error | undefined,\n };\n}\n\nexport function useBulkStorage({\n chainId,\n keys,\n safe = false,\n keyFormat,\n}: {\n chainId: number;\n keys: BulkStorageKey[];\n safe?: boolean;\n keyFormat?: \"raw\" | \"bytes32\";\n}) {\n const contract = safe ? SAFE_STORAGE_READER_CONTRACT : STORAGE_CONTRACT;\n\n // Convert keys to bytes32 format\n const bulkKeys = keys.map((k) => ({\n key: getStorageKeyBytes(k.key, keyFormat) as `0x${string}`,\n operator: k.operator as `0x${string}`,\n }));\n\n const readContractArgs = {\n abi: contract.abi,\n address: contract.address,\n functionName: \"bulkGet\",\n args: [bulkKeys],\n chainId,\n };\n\n const { data, isLoading, error } = useReadContract(readContractArgs);\n\n return {\n data: data as { text: string; value: string }[] | undefined,\n isLoading,\n error: error as Error | undefined,\n };\n}\n\n/**\n * Get total number of versions (writes) for a storage key\n * Tries both chunked storage and regular storage\n */\nexport function useStorageTotalWrites({\n chainId,\n key,\n operatorAddress,\n enabled = true,\n keyFormat,\n}: {\n chainId: number;\n key?: string;\n operatorAddress?: string;\n enabled?: boolean;\n keyFormat?: \"raw\" | \"bytes32\";\n}) {\n const storageKeyBytes = key\n ? (getStorageKeyBytes(key, keyFormat) as `0x${string}`)\n : undefined;\n\n // Try ChunkedStorageReader first\n const {\n data: chunkedTotal,\n isLoading: chunkedLoading,\n error: chunkedError,\n } = useReadContract({\n abi: CHUNKED_STORAGE_READER_CONTRACT.abi,\n address: CHUNKED_STORAGE_READER_CONTRACT.address,\n functionName: \"getTotalWrites\",\n args:\n storageKeyBytes && operatorAddress\n ? [storageKeyBytes, operatorAddress]\n : undefined,\n chainId,\n query: {\n enabled: enabled && !!key && !!operatorAddress,\n },\n });\n\n // Try regular Storage as fallback\n const {\n data: regularTotal,\n isLoading: regularLoading,\n error: regularError,\n } = useReadContract({\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"getTotalWrites\",\n args:\n storageKeyBytes && operatorAddress\n ? [storageKeyBytes, operatorAddress]\n : undefined,\n chainId,\n query: {\n enabled:\n enabled &&\n !!key &&\n !!operatorAddress &&\n (chunkedTotal === undefined || Number(chunkedTotal) === 0),\n },\n });\n\n // Determine which result to use\n const chunkedTotalNumber = chunkedTotal ? Number(chunkedTotal) : 0;\n const regularTotalNumber = regularTotal ? Number(regularTotal) : 0;\n\n // Use whichever returns > 0, prefer chunked if both are > 0\n const totalWrites =\n chunkedTotalNumber > 0 ? chunkedTotalNumber : regularTotalNumber;\n\n return {\n data: totalWrites > 0 ? totalWrites : undefined,\n isLoading: chunkedLoading || regularLoading,\n error:\n chunkedTotalNumber === 0 && regularTotalNumber === 0\n ? chunkedError || regularError\n : undefined,\n };\n}\n","import { readContract } from \"viem/actions\";\nimport { hexToString } from \"viem\";\nimport { PublicClient } from \"viem\";\nimport { STORAGE_CONTRACT } from \"../constants\";\nimport { CHUNKED_STORAGE_READER_CONTRACT } from \"../constants\";\nimport {\n XmlReference,\n resolveOperator,\n getReferenceKey,\n containsXmlReferences,\n parseNetReferences,\n} from \"../utils/xmlUtils\";\nimport { assembleChunks } from \"../utils/chunkUtils\";\n\n/**\n * Maximum depth for recursive XML resolution\n */\nexport const MAX_XML_DEPTH = 3;\n\n/**\n * Number of XML references to fetch concurrently per batch\n */\nexport const CONCURRENT_XML_FETCHES = 3;\n\n/**\n * Fetch chunks sequentially (legacy function)\n */\nexport async function fetchChunksSequential(\n references: XmlReference[],\n operatorAddress: string,\n client: PublicClient\n): Promise<string[]> {\n const chunks: string[] = [];\n\n for (let i = 0; i < references.length; i++) {\n const reference = references[i];\n const hash = reference.hash;\n const operator = resolveOperator(reference, operatorAddress);\n try {\n const result = await readContract(client, {\n address: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"get\",\n args: [hash, operator],\n });\n const chunkData = hexToString((result as any)[1] || \"\");\n chunks.push(chunkData);\n } catch (error) {\n console.error(\n `Failed to fetch chunk ${i + 1} (${hash}) from operator ${operator}:`,\n error\n );\n chunks.push(\"\");\n }\n }\n\n return chunks;\n}\n\n/**\n * Assemble XML data by replacing references with chunk content\n */\nexport function assembleXmlData(\n metadata: string,\n chunks: string[],\n references: XmlReference[]\n): string {\n // Find all tag positions first to avoid issues with replacements affecting positions\n const tagPositions: Array<{\n ref: XmlReference;\n chunk: string;\n start: number;\n end: number;\n tag: string;\n }> = [];\n\n for (let i = 0; i < references.length; i++) {\n const ref = references[i];\n const chunkData = chunks[i];\n if (!chunkData) continue;\n\n // Build XML tag with all attributes in order: k, v, i, o, s\n const indexAttr = ref.index !== undefined ? ` i=\"${ref.index}\"` : \"\";\n const operatorAttr = ref.operator ? ` o=\"${ref.operator}\"` : \"\";\n const sourceAttr = ref.source ? ` s=\"${ref.source}\"` : \"\";\n const xmlTag = `<net k=\"${ref.hash}\" v=\"${ref.version}\"${indexAttr}${operatorAttr}${sourceAttr} />`;\n\n // Find the position of this tag in the metadata\n const tagIndex = metadata.indexOf(xmlTag);\n if (tagIndex === -1) {\n continue;\n }\n\n tagPositions.push({\n ref,\n chunk: chunkData,\n start: tagIndex,\n end: tagIndex + xmlTag.length,\n tag: xmlTag,\n });\n }\n\n // Sort by position in reverse order (last tag first) so replacements don't affect positions\n tagPositions.sort((a, b) => b.start - a.start);\n\n let result = metadata;\n\n // Replace tags from end to beginning\n for (let i = 0; i < tagPositions.length; i++) {\n const { ref, chunk, start, end } = tagPositions[i];\n\n try {\n // Replace at specific position to avoid matching multiple occurrences\n result = result.substring(0, start) + chunk + result.substring(end);\n } catch (error) {\n throw error;\n }\n }\n\n return result;\n}\n\n/**\n * Fetch chunk data from direct Storage.sol (no decompression)\n */\nasync function fetchFromDirectStorage(\n reference: XmlReference,\n operator: string,\n client: PublicClient\n): Promise<string> {\n const functionName =\n reference.index !== undefined ? \"getValueAtIndex\" : \"get\";\n const args =\n reference.index !== undefined\n ? [reference.hash, operator, reference.index]\n : [reference.hash, operator];\n\n const result = await readContract(client, {\n address: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName,\n args,\n });\n\n const content = hexToString((result as any)[1] || \"\");\n return content;\n}\n\n/**\n * Fetch chunk data from ChunkedStorage (with decompression)\n */\nasync function fetchFromChunkedStorage(\n reference: XmlReference,\n operator: string,\n client: PublicClient\n): Promise<string> {\n const contract = CHUNKED_STORAGE_READER_CONTRACT;\n\n const functionName =\n reference.index !== undefined ? \"getMetadataAtIndex\" : \"getMetadata\";\n const chunksFunctionName =\n reference.index !== undefined ? \"getChunksAtIndex\" : \"getChunks\";\n\n const metadataArgs =\n reference.index !== undefined\n ? [reference.hash, operator, reference.index]\n : [reference.hash, operator];\n\n const metadata = await readContract(client, {\n abi: contract.abi,\n address: contract.address,\n functionName,\n args: metadataArgs,\n });\n\n const chunkCount = (metadata as [number, string])[0];\n\n if (chunkCount === 0) return \"\";\n\n const chunksArgs =\n reference.index !== undefined\n ? [reference.hash, operator, 0, chunkCount, reference.index]\n : [reference.hash, operator, 0, chunkCount];\n\n const chunks = (await readContract(client, {\n abi: contract.abi,\n address: contract.address,\n functionName: chunksFunctionName,\n args: chunksArgs,\n })) as string[];\n\n const assembledResult = assembleChunks(chunks);\n // assembleChunks returns plain string (converted via hexToString internally)\n const content = assembledResult || \"\";\n\n return content;\n}\n\n/**\n * Fetch a single chunk (used by recursive resolver)\n * Handles both Storage.sol and ChunkedStorage based on source attribute\n */\nasync function fetchSingleChunk(\n reference: XmlReference,\n defaultOperator: string,\n inheritedOperator: string | undefined,\n client: PublicClient\n): Promise<string> {\n // Use inherited operator if reference doesn't specify one\n const effectiveOperator =\n reference.operator || inheritedOperator || defaultOperator;\n\n if (reference.source === \"d\") {\n return await fetchFromDirectStorage(reference, effectiveOperator, client);\n } else {\n return await fetchFromChunkedStorage(reference, effectiveOperator, client);\n }\n}\n\n/**\n * Fetch chunks with source type support\n * Reads from Storage.sol if source=\"d\", otherwise from ChunkedStorage\n */\nexport async function fetchChunksWithSourceSupport(\n references: XmlReference[],\n operatorAddress: string,\n client: PublicClient\n): Promise<string[]> {\n const chunks: string[] = [];\n\n for (let i = 0; i < references.length; i++) {\n const reference = references[i];\n\n try {\n let chunkData: string;\n\n if (reference.source === \"d\") {\n // Read from regular Storage.sol\n chunkData = await fetchFromDirectStorage(\n reference,\n resolveOperator(reference, operatorAddress),\n client\n );\n } else {\n // Read from ChunkedStorage (default behavior)\n chunkData = await fetchFromChunkedStorage(\n reference,\n resolveOperator(reference, operatorAddress),\n client\n );\n }\n\n chunks.push(chunkData);\n } catch (error) {\n console.error(`Failed to fetch chunk ${i + 1}:`, error);\n chunks.push(\"\");\n }\n }\n\n return chunks;\n}\n\n/**\n * Fetch XML chunks from ChunkedStorage backend\n * Each XML chunk is stored as ChunkedStorage data (20KB chunks + compression)\n */\nexport async function fetchXmlChunksFromChunkedStorage(\n references: XmlReference[],\n operatorAddress: string,\n client: PublicClient\n): Promise<string[]> {\n const xmlChunks: string[] = [];\n\n // Fetch each XML chunk from ChunkedStorageReader\n for (let i = 0; i < references.length; i++) {\n const reference = references[i];\n const chunkedHash = reference.hash;\n\n try {\n // Always use ChunkedStorageReader - it has all ChunkedStorage functions plus historical ones\n const contract = CHUNKED_STORAGE_READER_CONTRACT;\n const functionName =\n reference.index !== undefined ? \"getMetadataAtIndex\" : \"getMetadata\";\n const chunksFunctionName =\n reference.index !== undefined ? \"getChunksAtIndex\" : \"getChunks\";\n\n // 1. Get metadata (latest or historical)\n const metadata = await readContract(client, {\n abi: contract.abi,\n address: contract.address,\n functionName,\n args:\n reference.index !== undefined\n ? [\n chunkedHash,\n resolveOperator(reference, operatorAddress),\n reference.index,\n ]\n : [chunkedHash, resolveOperator(reference, operatorAddress)],\n });\n\n const chunkCount = (metadata as [number, string])[0];\n\n if (chunkCount === 0) {\n xmlChunks.push(\"\");\n continue;\n }\n\n // 2. Get chunks (latest or historical)\n const chunks = (await readContract(client, {\n abi: contract.abi,\n address: contract.address,\n functionName: chunksFunctionName,\n args:\n reference.index !== undefined\n ? [\n chunkedHash,\n resolveOperator(reference, operatorAddress),\n 0,\n chunkCount,\n reference.index,\n ]\n : [\n chunkedHash,\n resolveOperator(reference, operatorAddress),\n 0,\n chunkCount,\n ],\n })) as string[];\n\n // 3. Use existing assembly logic (unchanged)\n const assembledResult = assembleChunks(chunks);\n\n if (assembledResult === undefined) {\n xmlChunks.push(\"\");\n } else {\n // assembleChunks returns plain string (converted via hexToString internally)\n xmlChunks.push(assembledResult);\n }\n } catch (error) {\n console.error(\n `[ChunkedStorage->XML] Failed to fetch XML chunk ${\n i + 1\n } (${chunkedHash}):`,\n error\n );\n xmlChunks.push(\"\"); // Push empty for failed chunks\n }\n }\n\n return xmlChunks;\n}\n\n/**\n * Recursively resolve XML references up to specified depth\n * Handles circular reference detection and parallel fetching per layer\n */\nexport async function resolveXmlRecursive(\n content: string,\n defaultOperator: string,\n client: PublicClient,\n maxDepth: number,\n visited: Set<string> = new Set(),\n inheritedOperator?: string\n): Promise<string> {\n // Base case 1: Depth limit reached\n if (maxDepth <= 0) {\n return content;\n }\n\n // Base case 2: No XML references in content\n if (!containsXmlReferences(content)) {\n return content;\n }\n\n // Parse references at current layer\n const references = parseNetReferences(content);\n\n if (references.length === 0) {\n return content;\n }\n\n // Fetch and recursively resolve chunks in batches to balance speed and rate limits\n const resolvedChunks: string[] = [];\n for (\n let batchStart = 0;\n batchStart < references.length;\n batchStart += CONCURRENT_XML_FETCHES\n ) {\n // Calculate batch boundaries\n const batchEnd = Math.min(\n batchStart + CONCURRENT_XML_FETCHES,\n references.length\n );\n const batch = references.slice(batchStart, batchEnd);\n\n // Process batch in parallel\n const batchResults = await Promise.all(\n batch.map(async (ref, batchIndex) => {\n const index = batchStart + batchIndex; // Global index for logging\n\n // Determine effective operator for this reference\n const effectiveOperator =\n ref.operator || inheritedOperator || defaultOperator;\n\n // Generate unique key for this reference using effective operator\n const refKey = getReferenceKey(\n { ...ref, operator: effectiveOperator },\n defaultOperator\n );\n\n // Check for circular reference\n if (visited.has(refKey)) {\n console.warn(\n `[resolveXmlRecursive] Circular reference detected: ${refKey}`\n );\n return `[Circular: ${refKey}]`;\n }\n\n // Add to visited set for this branch\n const newVisited = new Set(visited);\n newVisited.add(refKey);\n\n try {\n // Fetch the chunk\n const chunkContent = await fetchSingleChunk(\n ref,\n defaultOperator,\n inheritedOperator,\n client\n );\n\n // Recursively resolve the chunk's content, passing this reference's operator as inherited\n const resolvedContent = await resolveXmlRecursive(\n chunkContent,\n defaultOperator,\n client,\n maxDepth - 1,\n newVisited,\n effectiveOperator // Pass the effective operator to children\n );\n\n return resolvedContent;\n } catch (error) {\n console.error(\n `[resolveXmlRecursive] Failed to fetch/resolve chunk ${index}:`,\n error\n );\n return \"\"; // Return empty string on error\n }\n })\n );\n\n // Append batch results in order\n resolvedChunks.push(...batchResults);\n }\n\n // Assemble content with resolved chunks\n const assembled = assembleXmlData(content, resolvedChunks, references);\n\n return assembled;\n}\n","import { useMemo, useState, useEffect } from \"react\";\nimport useAsyncEffect from \"use-async-effect\";\nimport { hexToString, stringToHex } from \"viem\";\nimport { useStorage } from \"./useStorage\";\nimport { parseNetReferences, containsXmlReferences } from \"../utils/xmlUtils\";\nimport { resolveXmlRecursive, MAX_XML_DEPTH } from \"../client/xmlStorage\";\nimport { getPublicClient } from \"@net-protocol/core\";\nimport type { UseXmlStorageOptions, StorageData } from \"../types\";\n\nexport function useXmlStorage({\n chainId,\n key,\n operatorAddress,\n skipXmlParsing = false,\n enabled = true,\n content,\n index,\n keyFormat,\n useRouter,\n outputFormat = \"hex\",\n}: UseXmlStorageOptions) {\n // Determine mode: preview (raw content) vs blockchain (fetch from storage)\n const isPreviewMode = !!content;\n const outputAsString = outputFormat === \"string\";\n\n // 1. Fetch metadata using existing useStorage hook (only in blockchain mode)\n const {\n data: metadata,\n isLoading: metadataLoading,\n error: metadataError,\n } = useStorage({\n chainId,\n key: key || \"\",\n operatorAddress,\n enabled: enabled && !isPreviewMode,\n index, // Pass index to useStorage for historical versions\n keyFormat, // Pass keyFormat through\n useRouter, // Pass useRouter through to enable router path\n outputFormat: \"string\", // Always get plain string from useStorage, then convert based on our outputFormat\n });\n\n // 2. Get metadata string from either preview content or blockchain data\n const metadataString = useMemo(() => {\n if (skipXmlParsing) return \"\";\n if (isPreviewMode) return content || \"\";\n if (!metadata?.value) return \"\";\n // metadata.value is already a plain string because useStorage is called with outputFormat: \"string\"\n return metadata.value as string;\n }, [skipXmlParsing, isPreviewMode, content, metadata]);\n\n // 3. Parse XML references from metadata string\n const references = useMemo(() => {\n if (!metadataString) return [];\n return parseNetReferences(metadataString);\n }, [metadataString]);\n\n // 3. Fetch chunks\n const [chunks, setChunks] = useState<string[]>([]);\n const [chunksLoading, setChunksLoading] = useState(false);\n const [chunksError, setChunksError] = useState<Error | undefined>();\n\n useAsyncEffect(async () => {\n if (skipXmlParsing || !metadataString) {\n setChunks([]);\n setChunksLoading(false);\n return;\n }\n\n // Check if content has XML references\n if (!containsXmlReferences(metadataString)) {\n setChunks([]);\n setChunksLoading(false);\n return;\n }\n\n setChunksLoading(true);\n setChunksError(undefined);\n\n try {\n const client = getPublicClient({ chainId });\n if (!client) {\n throw new Error(`Chain not found for chainId: ${chainId}`);\n }\n\n // Use recursive resolver for multi-layer XML support\n const resolved = await resolveXmlRecursive(\n metadataString,\n operatorAddress,\n client,\n MAX_XML_DEPTH,\n new Set()\n );\n\n // Store resolved content as a single \"chunk\"\n setChunks([resolved]);\n } catch (error) {\n console.error(\"[useXmlStorage] Error in recursive resolution:\", error);\n setChunksError(error as any);\n setChunks([]);\n } finally {\n setChunksLoading(false);\n }\n }, [metadataString, operatorAddress, chainId, skipXmlParsing]);\n\n // 4. Assemble data (already resolved by recursive resolver)\n const assembledData = useMemo(() => {\n if (skipXmlParsing || !metadataString || !chunks.length) return undefined;\n // chunks[0] already contains fully resolved content from recursive resolver\n return chunks[0];\n }, [metadataString, chunks, skipXmlParsing]);\n\n // 5. Determine if this is XML storage\n const isXml = useMemo(() => {\n if (skipXmlParsing || !metadataString) return false;\n return containsXmlReferences(metadataString);\n }, [metadataString, skipXmlParsing]);\n\n // Helper to convert value based on outputFormat\n const formatValue = (value: string | undefined): string => {\n if (!value) return \"\";\n // If outputFormat is \"hex\", convert string back to hex\n // (metadata.value is always a string because useStorage is called with outputFormat: \"string\")\n return outputAsString ? value : stringToHex(value);\n };\n\n // Always return object format\n // Early return if XML parsing is skipped\n if (skipXmlParsing) {\n return {\n text: metadata?.text || \"\",\n value: isPreviewMode ? content || \"\" : formatValue(metadata?.value),\n isLoading: metadataLoading,\n error: metadataError,\n isXml: false,\n };\n }\n\n return {\n text: metadata?.text || \"\",\n value: isXml\n ? formatValue(assembledData)\n : isPreviewMode\n ? content || \"\"\n : formatValue(metadata?.value),\n isLoading: metadataLoading || (isXml && chunksLoading),\n error: metadataError || chunksError,\n isXml,\n };\n}\n","import { useState, useEffect } from \"react\";\nimport { useReadContract } from \"wagmi\";\nimport { decodeAbiParameters, stringToHex } from \"viem\";\nimport { STORAGE_ROUTER_CONTRACT } from \"../constants\";\nimport { CHUNKED_STORAGE_CONTRACT } from \"../constants\";\nimport { getPublicClient } from \"@net-protocol/core\";\nimport { readContract } from \"viem/actions\";\nimport { assembleChunks } from \"../utils/chunkUtils\";\nimport type { UseStorageFromRouterOptions, StorageData } from \"../types\";\n\nconst BATCH_SIZE = 2;\n\n/**\n * Generic hook to fetch storage content from StorageRouter\n * Handles both regular storage and chunked storage seamlessly\n * Works for any storage key (not just canvases)\n */\nexport function useStorageFromRouter({\n chainId,\n storageKey,\n operatorAddress,\n enabled = true,\n}: UseStorageFromRouterOptions) {\n const [assembledData, setAssembledData] = useState<StorageData | undefined>();\n const [isChunkLoading, setIsChunkLoading] = useState(false);\n const [chunkError, setChunkError] = useState<Error | undefined>();\n\n // Step 1: Get initial data from StorageRouter\n const {\n data: routerResult,\n isLoading: routerLoading,\n error: routerError,\n } = useReadContract({\n abi: STORAGE_ROUTER_CONTRACT.abi,\n address: STORAGE_ROUTER_CONTRACT.address,\n functionName: \"get\",\n args: [storageKey, operatorAddress],\n chainId,\n query: {\n enabled: enabled && !!operatorAddress,\n },\n });\n\n // Step 2: Process the result\n useEffect(() => {\n async function processResult() {\n if (!routerResult || routerLoading || routerError) {\n return;\n }\n\n const [isChunkedStorage, text, data] = routerResult as [\n boolean,\n string,\n `0x${string}`\n ];\n\n // Handle non-chunked data (early return)\n if (!isChunkedStorage) {\n setAssembledData({ text, value: data });\n return;\n }\n\n // Handle chunked data\n setIsChunkLoading(true);\n setChunkError(undefined);\n\n try {\n // Decode chunk count from the data\n const [chunkCount] = decodeAbiParameters([{ type: \"uint8\" }], data);\n\n if (chunkCount === 0) {\n setAssembledData(undefined);\n return;\n }\n\n // Fetch chunks in batches\n const allChunks = await fetchChunksInBatches(\n Number(chunkCount),\n operatorAddress,\n chainId,\n storageKey\n );\n\n // Assemble chunks\n const assembledString = assembleChunks(allChunks);\n\n if (assembledString === undefined) {\n setAssembledData(undefined);\n } else {\n // assembleChunks returns plain string, convert to hex for StorageData format\n const hexData = stringToHex(assembledString) as `0x${string}`;\n setAssembledData({ text, value: hexData });\n }\n } catch (error) {\n setChunkError(error as Error);\n } finally {\n setIsChunkLoading(false);\n }\n }\n\n processResult();\n }, [\n routerResult,\n routerLoading,\n routerError,\n operatorAddress,\n chainId,\n storageKey,\n ]);\n\n return {\n data: assembledData,\n isLoading: routerLoading || isChunkLoading,\n error: routerError || chunkError,\n };\n}\n\n/**\n * Fetch chunks in batches using getChunks\n */\nasync function fetchChunksInBatches(\n chunkCount: number,\n operatorAddress: string,\n chainId: number,\n storageKey: `0x${string}`\n): Promise<string[]> {\n const client = getPublicClient({ chainId });\n if (!client) {\n throw new Error(`Chain not found for chainId: ${chainId}`);\n }\n\n const allChunks: string[] = [];\n\n for (let start = 0; start < chunkCount; start += BATCH_SIZE) {\n const end = Math.min(start + BATCH_SIZE, chunkCount);\n\n const batch = (await readContract(client, {\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n address: CHUNKED_STORAGE_CONTRACT.address,\n functionName: \"getChunks\",\n args: [storageKey, operatorAddress, start, end],\n })) as string[];\n\n allChunks.push(...batch);\n }\n return allChunks;\n}\n"]}
|