@net-protocol/storage 0.1.0 → 0.1.1
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 +13 -14
- package/dist/index.d.ts +13 -14
- package/dist/index.js +86 -95
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +86 -95
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +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","../src/client/storage.ts","../src/client/chunkedStorage.ts","../src/utils/writingUtils.ts","../src/client/StorageClient.ts"],"names":["stringToHex","pako","hexToBytes","hexToString","fromHex","keccak256HashString","toBytes32","useState","useReadContract","useEffect","decodeAbiParameters","getPublicClient","readContract","storageKeyBytes","text","getNetContract","chunkData","useMemo","useAsyncEffect","BATCH_SIZE","normalizeDataOrEmpty"],"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;AAEO,IAAM,wBAAA,GAA2B;AAAA,EACtC,GAAA,EAAK,uBAAA;AAAA,EACL,OAAA,EAAS;AACX;AAEO,IAAM,+BAAA,GAAkC;AAAA,EAC7C,GAAA,EAAK,8BAAA;AAAA,EACL,OAAA,EAAS;AACX;AAEO,IAAM,uBAAA,GAA0B;AAAA,EACrC,GAAA,EAAK,sBAAA;AAAA,EACL,OAAA,EAAS;AACX;AAEO,IAAM,4BAAA,GAA+B;AAAA,EAC1C,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS;AACX;;;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;AAKO,SAAS,kBAAkB,QAAA,EAAqC;AACrE,EAAA,OAAO,qBAAA,CAAsB,QAAQ,CAAA,GAAI,KAAA,GAAQ,SAAA;AACnD;AAKO,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;;;ACpEA,IAAM,aAAa,EAAA,GAAK,GAAA;AAQjB,SAAS,oBAAoB,IAAA,EAAwB;AAC1D,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAUA,iBAAY,IAAI,CAAA;AAChC,IAAA,MAAM,eAAA,GAAkBC,qBAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAGzC,IAAA,MAAM,YAAY,IAAA,GAAO,MAAA,CAAO,KAAK,eAAe,CAAA,CAAE,SAAS,KAAK,CAAA;AACpE,IAAA,MAAM,SAAmB,EAAC;AAG1B,IAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA;AAG1C,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,iBAAiB,MAAA,EAAQ,CAAA,IAAK,aAAa,CAAA,EAAG;AAChE,MAAA,MAAM,QAAQ,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,aAAa,CAAC,CAAA;AAC1D,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAChE,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACvD;AACF;AAOO,SAAS,wBAAwB,IAAA,EAAuB;AAC7D,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,UAAA,IAAc,qBAAA,CAAsB,IAAI,CAAA;AAC/D;AAOO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,MAAM,SAAA,GAAYD,iBAAY,IAAI,CAAA;AAClC,EAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA;AAC1C,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,KAAK,gBAAA,CAAiB,MAAA,IAAU,UAAA,GAAa,CAAA,CAAE,CAAC,CAAA;AAC1E;AAQO,SAAS,eAAe,MAAA,EAAsC;AACnE,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,GAAQE,gBAAW,SAA0B,CAAA;AAEnD,IAAA,IAAI;AAEF,MAAA,MAAM,YAAA,GAAeD,qBAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAItC,MAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,MAAM,CAAA;AAE3D,MAAA,MAAM,MAAA,GAASE,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;AC/EA,SAAS,eAAe,GAAA,EAAsB;AAC5C,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,GAAI,GAAG,CAAA;AAC9D;AAMO,SAAS,2BAA2B,UAAA,EAGzC;AAEA,EAAA,IACE,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,IAC1B,UAAA,CAAW,WAAW,EAAA,IACtB,qBAAA,CAAsB,IAAA,CAAK,UAAU,CAAA,EACrC;AACA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUC,YAAA,CAAQ,UAAA,EAA6B,QAAQ,CAAA;AAE7D,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAEzC,MAAA,IAAI,CAAC,eAAe,OAAO,CAAA,IAAK,QAAQ,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACzD,QAAA,OAAO;AAAA,UACL,WAAA,EAAa,OAAA;AAAA,UACb,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,UAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AACF;AAUO,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;AAeO,SAAS,uBAAuB,GAAA,EAAqB;AAC1D,EAAA,OAAO,mBAAmB,GAAG,CAAA;AAC/B;AAWO,SAAS,wBAAwB,MAAA,EAK7B;AACT,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,eAAA,CAAgB,WAAA,EAAY;AACpD,EAAA,MAAM,YACJ,MAAA,CAAO,YAAA,KAAiB,SAAY,CAAA,IAAA,EAAO,MAAA,CAAO,YAAY,CAAA,CAAA,CAAA,GAAM,EAAA;AACtE,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,gBAAA,GAAmB,CAAA,MAAA,CAAA,GAAW,EAAA;AACxD,EAAA,OAAO,CAAA,QAAA,EAAW,OAAO,eAAe,CAAA,WAAA,EAAc,SAAS,CAAA,IAAA,EAAO,QAAQ,IAAI,UAAU,CAAA,GAAA,CAAA;AAC9F;;;AC/HA,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,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,CAAC,IAAA,EAAMH,gBAAAA,CAAY,OAAO,CAAC,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,CAAC,MAAM,OAAO,CAAA;AAAA,EACvB,CAAA;AAGA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAII,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,MAAM,eAAA,IAAmB,eAAA,GACrB,CAAC,eAAA,EAAiB,eAAe,CAAA,GACjC,MAAA;AAAA,IACJ,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,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,CAAC,IAAA,EAAM,eAAe,CAAC,CAAA;AAAA,UACvC,CAAA,MAAO;AAEL,YAAA,MAAM,OAAA,GAAUZ,iBAAY,eAAe,CAAA;AAC3C,YAAA,aAAA,CAAc,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,UAC/B;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,MACLQ,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,EAAS,CAAC,eAAA,IAAmB,OAAA,IAAW,CAAC,CAAC,eAAA,IAAmB,CAAC,CAAC,GAAA,IAAO;AAAA;AACxE,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,MAAME,gBAAAA,GAAkB,kBAAA;AAAA,UACtB,GAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAMD,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,CAACC,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,MAAMF,oBAAA,CAAa,MAAA,EAAQ;AAAA,cACzC,KAAK,+BAAA,CAAgC,GAAA;AAAA,cACrC,SAAS,+BAAA,CAAgC,OAAA;AAAA,cACzC,YAAA,EAAc,kBAAA;AAAA,cACd,MAAM,CAACC,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,GAAUb,iBAAY,aAAa,CAAA;AACzC,cAAA,iBAAA,CAAkB,UAAA,CAAWc,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,MAAMF,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,CAACC,gBAAAA,EAAiB,eAAA,EAAiB,KAAK;AAAA,SAC/C,CAAA;AAED,QAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,MAAA;AAErB,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,CAAC,OAAA,EAAS,GAAA,EAAK,iBAAiB,KAAA,EAAO,OAAA,EAAS,eAAA,EAAiB,cAAc,CAAC,CAAA;AAInF,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;AAGA,EAAA,MAAM,mBAAA,GAAsB,aACxB,UAAA,CAAY,UAAA,CAA2B,CAAC,CAAA,EAAI,UAAA,CAA2B,CAAC,CAAkB,CAAA,GAC1F,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,KAAmBP,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;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,eAAA,GAAkB,GAAA,GACnB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA,GAClC,MAAA;AACJ,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;AAAA,IACA,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,GAAIA,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;ACzbO,IAAM,aAAA,GAAgB;AAKtB,IAAM,sBAAA,GAAyB;AAwC/B,SAAS,eAAA,CACd,QAAA,EACA,MAAA,EACA,UAAA,EACQ;AACR,EAAA,IAAI,MAAA,GAAS,QAAA;AAEb,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AACjC,IAAA,MAAMQ,UAAAA,GAAY,OAAO,KAAK,CAAA;AAC9B,IAAA,IAAIA,UAAAA,EAAW;AAEb,MAAA,MAAM,YAAY,GAAA,CAAI,KAAA,KAAU,SAAY,CAAA,IAAA,EAAO,GAAA,CAAI,KAAK,CAAA,CAAA,CAAA,GAAM,EAAA;AAClE,MAAA,MAAM,eAAe,GAAA,CAAI,QAAA,GAAW,CAAA,IAAA,EAAO,GAAA,CAAI,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAA;AAC7D,MAAA,MAAM,aAAa,GAAA,CAAI,MAAA,GAAS,CAAA,IAAA,EAAO,GAAA,CAAI,MAAM,CAAA,CAAA,CAAA,GAAM,EAAA;AAEvD,MAAA,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;AAC9F,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQA,UAAS,CAAA;AAAA,IAC3C;AAAA,EACF,CAAC,CAAA;AAED,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,MAAMJ,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,GAAUT,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,MAAMS,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;AA0IA,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;AC7ZO,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,QAAA;AAAA,EACf,YAAA,GAAe;AACjB,CAAA,EAAyB;AAEvB,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,OAAA;AACxB,EAAA,MAAM,gBAAgB,YAAA,KAAiB,OAAA;AACvC,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,GAAW,CAAC,CAAA,EAAG,OAAO,EAAA;AAE3B,IAAA,OAAO,SAAS,CAAC,CAAA;AAAA,EACnB,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,IAAI,aAAA,EAAe;AAEjB,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAI,aAAA,EAAe;AAEjB,QAAA,MAAM,eAAe,OAAA,IAAW,EAAA;AAChC,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,eACF,cAAA,GACG,CAAC,WAAW,CAAC,CAAA,IAAK,EAAA,EAAI,YAAY,CAAA,GAClC;AAAA,YACC,QAAA,GAAW,CAAC,CAAA,IAAK,EAAA;AAAA,YACjBjB,iBAAY,YAAY;AAAA,WAC1B,GACF,MAAA;AAAA,UACJ,SAAA,EAAW,eAAA;AAAA,UACX,KAAA,EAAO;AAAA,SACT;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAC9B,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,YACF,cAAA,GACG,CAAC,WAAW,CAAC,CAAA,IAAK,EAAA,EAAI,SAAS,CAAA,GAC/B;AAAA,YACC,QAAA,GAAW,CAAC,CAAA,IAAK,EAAA;AAAA,YACjBA,iBAAY,SAAS;AAAA,WACvB,GACF,MAAA;AAAA,UACJ,SAAA,EAAW,eAAA;AAAA,UACX,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,CAAC,aAAA,EAAe;AAElB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN,WAAW,eAAA,IAAmB,aAAA;AAAA,UAC9B,OAAO,aAAA,IAAiB;AAAA,SAC1B;AAAA,MACF;AAGA,MAAA,MAAM,OAAA,GAAUA,iBAAY,aAAa,CAAA;AACzC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,cAAA,GACD,CAAC,QAAA,GAAW,CAAC,CAAA,IAAK,EAAA,EAAI,aAAa,CAAA,GACnC,CAAC,QAAA,GAAW,CAAC,CAAA,IAAK,IAAI,OAAO,CAAA;AAAA,QAClC,WAAW,eAAA,IAAmB,aAAA;AAAA,QAC9B,OAAO,aAAA,IAAiB;AAAA,OAC1B;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN,SAAA,EAAW,eAAA;AAAA,UACX,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,SAAS,CAAC,CAAA;AAC5B,MAAA,MAAM,WAAA,GAAc,YAChB,cAAA,GACG,CAAC,SAAS,CAAC,CAAA,EAAG,SAAS,CAAA,GACvB;AAAA,QACC,SAAS,CAAC,CAAA;AAAA,QACVA,iBAAY,SAAS;AAAA,OACvB,GACF,MAAA;AAEJ,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,SAAA,EAAW,eAAA;AAAA,QACX,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAIA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAO;AAAA,MACL,MAAM,aAAA,GAAgB,OAAA,IAAW,EAAA,GAAO,QAAA,GAAW,CAAC,CAAA,IAAK,EAAA;AAAA;AAAA,MACzD,QAAA,EAAU,QAAA,GAAW,CAAC,CAAA,IAAK,EAAA;AAAA,MAC3B,SAAA,EAAW,eAAA;AAAA,MACX,KAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QACF,aAAA,GACA,aAAA,GACA,WAAW,EAAA,GACT,QAAA,GAAW,CAAC,CAAA,IAAK,EAAA;AAAA;AAAA,IACvB,QAAA,EAAU,QAAA,GAAW,CAAC,CAAA,IAAK,EAAA;AAAA,IAC3B,SAAA,EAAW,mBAAoB,KAAA,IAAS,aAAA;AAAA,IACxC,OAAO,aAAA,IAAiB,WAAA;AAAA,IACxB;AAAA,GACF;AACF;ACzNA,IAAMmB,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,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAC7B,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;AAAA,UACnB,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,UAClB;AAAA,SACF;AAEA,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,GAAUV,iBAAY,eAAe,CAAA;AAC3C,UAAA,gBAAA,CAAiB,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,QAClC;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,GAASW,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;;;AC9FO,SAAS,qBAAqB,MAAA,EAAoC;AACvE,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,WAAU,GAAI,MAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,KAAK,gBAAA,CAAiB,GAAA;AAAA,IACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,YAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAAA,IAChC;AAAA,GACF;AACF;AAKO,SAAS,iCACd,MAAA,EACA;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,WAAU,GAAI,MAAA;AACrD,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,KAAK,gBAAA,CAAiB,GAAA;AAAA,IACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,YAAA,EAAc,iBAAA;AAAA,IACd,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAA,EAAU,KAAK,CAAA;AAAA,IACvC;AAAA,GACF;AACF;AAKO,SAAS,gCACd,MAAA,EACA;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,WAAU,GAAI,MAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,KAAK,gBAAA,CAAiB,GAAA;AAAA,IACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,YAAA,EAAc,gBAAA;AAAA,IACd,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAAA,IAChC;AAAA,GACF;AACF;AAKO,SAAS,4BAA4B,MAAA,EAA2C;AACrF,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,GAAO,KAAA,EAAO,WAAU,GAAI,MAAA;AACnD,EAAA,MAAM,QAAA,GAAW,OAAO,4BAAA,GAA+B,gBAAA;AAGvD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAChC,KAAK,kBAAA,CAAmB,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,aAAa,SAAS,CAAA;AAAA,IACvD,UAAU,CAAA,CAAE;AAAA,GACd,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,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;AACF;AAKO,SAAS,2BAA2B,MAAA,EAA0C;AACnF,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,WAAU,GAAI,MAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,KAAK,uBAAA,CAAwB,GAAA;AAAA,IAC7B,SAAS,uBAAA,CAAwB,OAAA;AAAA,IACjC,YAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAAA,IAChC;AAAA,GACF;AACF;;;ACvGO,SAAS,oCACd,MAAA,EACA;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,WAAU,GAAI,MAAA;AACrD,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,MAAM,YAAA,GACJ,KAAA,KAAU,MAAA,GAAY,oBAAA,GAAuB,aAAA;AAC/C,EAAA,MAAM,IAAA,GACJ,KAAA,KAAU,MAAA,GACN,CAAC,eAAA,EAAiB,UAAU,KAAK,CAAA,GACjC,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAEhC,EAAA,OAAO;AAAA,IACL,KAAK,+BAAA,CAAgC,GAAA;AAAA,IACrC,SAAS,+BAAA,CAAgC,OAAA;AAAA,IACzC,YAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,kCACd,MAAA,EACA;AACA,EAAA,MAAM,EAAE,SAAS,GAAA,EAAK,QAAA,EAAU,OAAO,GAAA,EAAK,KAAA,EAAO,WAAU,GAAI,MAAA;AACjE,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,MAAM,YAAA,GAAe,KAAA,KAAU,MAAA,GAAY,kBAAA,GAAqB,WAAA;AAChE,EAAA,MAAM,IAAA,GACJ,KAAA,KAAU,MAAA,GACN,CAAC,iBAAiB,QAAA,EAAU,KAAA,EAAO,GAAA,EAAK,KAAK,CAAA,GAC7C,CAAC,eAAA,EAAiB,QAAA,EAAU,OAAO,GAAG,CAAA;AAE5C,EAAA,OAAO;AAAA,IACL,KAAK,+BAAA,CAAgC,GAAA;AAAA,IACrC,SAAS,+BAAA,CAAgC,OAAA;AAAA,IACzC,YAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,uCACd,MAAA,EACA;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,WAAU,GAAI,MAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,KAAK,+BAAA,CAAgC,GAAA;AAAA,IACrC,SAAS,+BAAA,CAAgC,OAAA;AAAA,IACzC,YAAA,EAAc,gBAAA;AAAA,IACd,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAAA,IAChC;AAAA,GACF;AACF;AChGA,IAAM,UAAA,GAAa,GAAA;AACnB,IAAM,qBAAqB,EAAA,GAAK,GAAA;AAKzB,SAAS,SAAA,CACd,IAAA,EACA,SAAA,GAAoB,kBAAA,EACV;AACV,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,SAAA,EAAW;AAC/C,IAAA,MAAA,CAAO,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,SAAS,CAAC,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,mBAAA,CACd,WAAA,EACA,eAAA,EACA,eAAA,EACQ;AACR,EAAA,OAAO,WAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,QAAA,GAAW,gBAAgB,WAAA,EAAY;AAC7C,IAAA,OAAO,CAAA,QAAA,EAAW,IAAI,CAAA,eAAA,EAAkB,eAAe,QAAQ,QAAQ,CAAA,IAAA,CAAA;AAAA,EACzE,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACZ;AAMO,SAAS,6BAAA,CACd,WAAA,EACA,eAAA,EACA,eAAA,EACA,MAAA,EACQ;AACR,EAAA,OAAO,WAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,QAAA,GAAW,gBAAgB,WAAA,EAAY;AAC7C,IAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA,CAAA,GAAM,EAAA;AAC/C,IAAA,OAAO,WAAW,IAAI,CAAA,eAAA,EAAkB,eAAe,CAAA,KAAA,EAAQ,QAAQ,IAAI,UAAU,CAAA,GAAA,CAAA;AAAA,EACvF,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACZ;AAKO,SAAS,iBAAiB,MAAA,EAG/B;AACA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,qBAAA,EAAsB;AAAA,EACtD;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,UAAA,EAAY;AAC9B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,CAAA,iBAAA,EAAoB,MAAA,CAAO,MAAM,uBAAuB,UAAU,CAAA;AAAA,KAC3E;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAKO,SAAS,oBAAoB,WAAA,EAA+B;AACjE,EAAA,OAAOP,wBAAAA,CAAoB,WAAA,CAAY,IAAA,CAAK,EAAE,CAAC,CAAA;AACjD;AAKO,SAAS,qBAAA,CACd,IAAA,EACA,eAAA,EACA,UAAA,EAQA;AAEA,EAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAG7B,EAAA,MAAM,UAAA,GAAa,iBAAiB,MAAM,CAAA;AAC1C,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,IAAA,OAAO;AAAA,MACL,QAAQ,EAAC;AAAA,MACT,aAAa,EAAC;AAAA,MACd,WAAA,EAAa,EAAA;AAAA,MACb,YAAA,EAAc,EAAA;AAAA,MACd,KAAA,EAAO,KAAA;AAAA,MACP,OAAO,UAAA,CAAW;AAAA,KACpB;AAAA,EACF;AAGA,EAAA,MAAM,cAAc,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAUA,wBAAAA,CAAoB,KAAK,CAAC,CAAA;AAGpE,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,WAAA,EAAa,CAAA,EAAG,eAAe,CAAA;AAGvE,EAAA,MAAM,YAAA,GAAe,UAAA,IAAc,mBAAA,CAAoB,WAAW,CAAA;AAElE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF;;;ACjFO,IAAM,gBAAN,MAAoB;AAAA,EAIzB,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,SAASM,oBAAAA,CAAgB;AAAA,MAC5B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAA,EAAQ,OAAO,SAAA,EAAW;AAAA,KAC3B,CAAA;AACD,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,MAAA,EAIsB;AAC9B,IAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,MAClC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAMC,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACrD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,MAAA,EAKU;AAC9B,IAAA,MAAM,SAAS,gCAAA,CAAiC;AAAA,MAC9C,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACrD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,MAAA,EAID;AAElB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,sCAAA,CAAuC;AAAA,QACpD,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AACD,MAAA,MAAM,KAAA,GAAQ,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACpD,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,+BAAA,CAAgC;AAAA,UAC7C,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,KAAK,MAAA,CAAO,GAAA;AAAA,UACZ,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AACD,QAAA,MAAM,KAAA,GAAQ,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACpD,QAAA,OAAO,OAAO,KAAK,CAAA;AAAA,MACrB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,MAAA,EAImB;AAC/B,IAAA,MAAM,SAAS,2BAAA,CAA4B;AAAA,MACzC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACtD,MAAA,OAAQ,OAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACpC,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,QACT,KAAA,EAAO,EAAE,CAAC;AAAA,OACZ,CAAE,CAAA;AAAA,IACJ,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,MAAA,EAQT;AACR,IAAA,MAAM,SAAS,0BAAA,CAA2B;AAAA,MACxC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACrD,MAAA,MAAM,CAAC,gBAAA,EAAkB,IAAA,EAAM,IAAI,CAAA,GAAI,MAAA;AAOvC,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,MAAM,CAAC,UAAU,CAAA,GAAIF,wBAAAA,CAAoB,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA;AAClE,QAAA,IAAI,eAAe,CAAA,EAAG;AACpB,UAAA,OAAO,EAAE,gBAAA,EAAkB,IAAA,EAAM,IAAA,EAAM,MAAM,EAAA,EAAG;AAAA,QAClD;AAGA,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW;AAAA,UACnC,KAAK,MAAA,CAAO,GAAA;AAAA,UACZ,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,KAAA,EAAO,CAAA;AAAA,UACP,GAAA,EAAK,OAAO,UAAU,CAAA;AAAA,UACtB,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AAED,QAAA,MAAM,SAAA,GAAY,eAAe,MAAM,CAAA;AACvC,QAAA,OAAO;AAAA,UACL,gBAAA,EAAkB,IAAA;AAAA,UAClB,IAAA;AAAA,UACA,MAAM,SAAA,IAAa;AAAA,SACrB;AAAA,MACF;AAGA,MAAA,OAAO;AAAA,QACL,gBAAA,EAAkB,KAAA;AAAA,QAClB,IAAA;AAAA,QACA,IAAA,EAAMP,iBAAY,IAAI;AAAA,OACxB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,MAAA,EAKwC;AAC/D,IAAA,MAAM,SAAS,mCAAA,CAAoC;AAAA,MACjD,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAMS,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACrD,MAAA,MAAM,CAAC,UAAA,EAAY,YAAY,CAAA,GAAI,MAAA;AACnC,MAAA,OAAO,EAAE,YAAY,YAAA,EAAa;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,MAAA,EAOK;AACpB,IAAA,MAAM,SAAS,iCAAA,CAAkC;AAAA,MAC/C,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACrD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,MAAA,EAMF;AACpB,IAAA,OAAO,KAAK,UAAA,CAAW;AAAA,MACrB,GAAG,MAAA;AAAA,MACH,OAAO,MAAA,CAAO;AAAA,KACf,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,MAAA,EAEgC;AACnD,IAAA,MAAM,WAAA,GAAcG,mBAAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AAG/C,IAAA,MAAM,UAAA,GAAa,MAAMH,oBAAAA,CAAa,IAAA,CAAK,MAAA,EAAQ;AAAA,MACjD,KAAK,WAAA,CAAY,GAAA;AAAA,MACjB,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,YAAA,EAAc,iCAAA;AAAA,MACd,IAAA,EAAM,CAAC,gBAAA,CAAiB,OAAA,EAAS,OAAO,QAAQ;AAAA,KACjD,CAAA;AAED,IAAA,MAAM,gBAAA,GAAmB,OAAO,UAAU,CAAA;AAE1C,IAAA,IAAI,qBAAqB,CAAA,EAAG;AAC1B,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,QAAA,GAAW,MAAMA,oBAAAA,CAAa,IAAA,CAAK,MAAA,EAAQ;AAAA,MAC/C,KAAK,WAAA,CAAY,GAAA;AAAA,MACjB,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,YAAA,EAAc,8BAAA;AAAA,MACd,MAAM,CAAC,CAAA,EAAG,kBAAkB,gBAAA,CAAiB,OAAA,EAAS,OAAO,QAAQ;AAAA,KACtE,CAAA;AAED,IAAA,OAAQ,QAAA,CAAmB,GAAA,CAAI,CAAC,GAAA,KAAQ;AAAA,MACtC,GAAA,CAAI,KAAA;AAAA,MACJ,GAAA,CAAI,IAAA;AAAA,MACJ,MAAA,CAAO,IAAI,SAAS,CAAA;AAAA,MACpB,GAAA,CAAI;AAAA,KACL,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,MAAA,EAIK;AAC9B,IAAA,MAAM,eAAA,GAAkB,kBAAA;AAAA,MACtB,MAAA,CAAO,GAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAMA,oBAAAA,CAAa,IAAA,CAAK,MAAA,EAAQ;AAAA,QAC7C,KAAK,gBAAA,CAAiB,GAAA;AAAA,QACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,QAC1B,YAAA,EAAc,sBAAA;AAAA,QACd,IAAA,EAAM,CAAC,MAAA,CAAO,QAAA,EAAU,eAAe;AAAA,OACxC,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,MAAA,EAKsC;AAE1D,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,IAAA;AAGJ,IAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAW;AAE9B,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,kBAAA,CAAmB;AAAA,QAChD,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AAED,MAAA,IAAI,WAAA,IAAe,WAAA,CAAY,UAAA,GAAa,CAAA,EAAG;AAE7C,QAAA,IAAA,GAAO,WAAA,CAAY,YAAA;AACnB,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW;AAAA,UACnC,KAAK,MAAA,CAAO,GAAA;AAAA,UACZ,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,KAAA,EAAO,CAAA;AAAA,UACP,KAAK,WAAA,CAAY,UAAA;AAAA,UACjB,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AACD,QAAA,MAAM,SAAA,GAAY,eAAe,MAAM,CAAA;AACvC,QAAA,IAAA,GAAO,SAAA,IAAa,EAAA;AAAA,MACtB,CAAA,MAAO;AAEL,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB;AAAA,UACxC,KAAK,MAAA,CAAO,GAAA;AAAA,UACZ,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AACD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,QACtC;AAEA,QAAA,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,MAAA;AACf,QAAA,IAAA,GAAOT,iBAAY,IAAqB,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa;AAAA,QACrC,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AACD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,MACtC;AACA,MAAmB,MAAA,CAAO,gBAAA;AAC1B,MAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,MAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAAA,IAChB;AAGA,IAAA,MAAM,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AACxC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,eAAe,MAAM,mBAAA;AAAA,QACzB,IAAA;AAAA,QACA,MAAA,CAAO,QAAA;AAAA,QACP,IAAA,CAAK,MAAA;AAAA,QACL,CAAA;AAAA;AAAA,4BACI,GAAA;AAAI,OACV;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,YAAA,EAAc,OAAO,IAAA,EAAK;AAAA,IACjD;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,MAAA,EAKmB;AAC1C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,kBAAA,CAAmB;AAAA,MAC7C,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,QAAA,CAAS,eAAe,CAAA,EAAG;AAC7B,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,YAAA,EAAc,MAAM,EAAA,EAAG;AAAA,IACjD;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW;AAAA,MACnC,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,KAAA,EAAO,CAAA;AAAA,MACP,KAAK,QAAA,CAAS,UAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,eAAe,MAAM,CAAA;AACvC,IAAA,OAAO;AAAA,MACL,MAAM,QAAA,CAAS,YAAA;AAAA,MACf,MAAM,SAAA,IAAa;AAAA,KACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,MAAA,EAG3B;AACD,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,IAAQ,OAAO,MAAA,CAAO,QAAQ,QAAA,IAAY,MAAA,CAAO,GAAA,CAAI,MAAA,KAAW,CAAA,EAAI;AAC9E,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,EAAG;AAC/C,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,SAAS,GAAA,EAAK;AAC/C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAAA,IACnF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kCAAkC,MAAA,EAOxC;AACA,IAAA,MAAM,uBAAiC,EAAC;AACxC,IAAA,MAAM,qBAA+C,EAAC;AAGtD,IAAA,KAAA,MAAW,QAAA,IAAY,OAAO,SAAA,EAAW;AAEvC,MAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAI3C,MAAA,MAAM,WAAA,GAAcE,wBAAAA,CAAoB,QAAA,GAAW,MAAA,CAAO,eAAe,CAAA;AACzE,MAAA,oBAAA,CAAqB,KAAK,WAAW,CAAA;AAGrC,MAAA,MAAM,MAAA,GAAS,KAAK,iBAAA,CAAkB;AAAA,QACpC,GAAA,EAAK,WAAA;AAAA,QACL,IAAA,EAAM,EAAA;AAAA,QACN;AAAA,OACD,CAAA;AAED,MAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAAA,IAChC;AAIA,IAAA,MAAM,WAAA,GAAc,mBAAA;AAAA,MAClB,oBAAA;AAAA,MACA,CAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AAEA,IAAA,OAAO;AAAA,MACL,kBAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAKgB;AACzB,IAAA,IAAA,CAAK,qBAAA,CAAsB,EAAE,GAAA,EAAK,MAAA,CAAO,KAAK,CAAA;AAE9C,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,MAAA,CAAO,GAAA,EAAK,OAAO,SAAS,CAAA;AAClE,IAAA,MAAM,QAAA,GAAWe,yBAAA,CAAqB,MAAA,CAAO,KAAK,CAAA;AAElD,IAAA,OAAO;AAAA,MACL,IAAI,gBAAA,CAAiB,OAAA;AAAA,MACrB,YAAA,EAAc,KAAA;AAAA,MACd,IAAA,EAAM,CAAC,UAAA,EAAY,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,MACxC,KAAK,gBAAA,CAAiB;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,MAAA,EAKS;AACzB,IAAA,IAAA,CAAK,qBAAA,CAAsB,EAAE,GAAA,EAAK,MAAA,CAAO,KAAK,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AAErE,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,MAAA,CAAO,GAAA,EAAK,OAAO,SAAS,CAAA;AAGlE,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAK,CAAA,qBAAA,CAAuB,CAAA;AAAA,MACvE;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAI,wBAAA,CAAyB,OAAA;AAAA,MAC7B,YAAA,EAAc,KAAA;AAAA,MACd,MAAM,CAAC,UAAA,EAAY,MAAA,CAAO,IAAA,EAAM,OAAO,MAAM,CAAA;AAAA,MAC7C,KAAK,wBAAA,CAAyB;AAAA,KAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAA,EAOY;AACzB,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AAChD,MAAA,IAAA,CAAK,qBAAA,CAAsB,EAAE,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AAC7C,MAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,KAAA,CAAM,GAAA,EAAK,OAAO,SAAS,CAAA;AACjE,MAAA,MAAM,QAAA,GAAWA,yBAAA,CAAqB,KAAA,CAAM,KAAK,CAAA;AAEjD,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAA;AAAA,QACL,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,KAAA,EAAO;AAAA,OACT;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,IAAI,gBAAA,CAAiB,OAAA;AAAA,MACrB,YAAA,EAAc,SAAA;AAAA,MACd,IAAA,EAAM,CAAC,WAAW,CAAA;AAAA,MAClB,KAAK,gBAAA,CAAiB;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,MAAA,EAWhB;AAEA,IAAA,MAAM,MAAA,GAAS,qBAAA;AAAA,MACb,MAAA,CAAO,IAAA;AAAA,MACP,MAAA,CAAO,eAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAEA,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,oCAAoC,CAAA;AAAA,IACtE;AAGA,IAAA,MAAM,wBAAA,GAA2B,OAAO,wBAAA,KAA6B,KAAA;AAErE,IAAA,IAAI,wBAAA,EAA0B;AAE5B,MAAA,MAAM,aAAA,GAAgB,KAAK,iCAAA,CAAkC;AAAA,QAC3D,WAAW,MAAA,CAAO,MAAA;AAAA,QAClB,iBAAiB,MAAA,CAAO;AAAA,OACzB,CAAA;AAGD,MAAA,MAAM,cAAA,GAAiB,KAAK,UAAA,CAAW;AAAA,QACrC,KAAK,MAAA,CAAO,YAAA;AAAA,QACZ,IAAA,EAAM,OAAO,QAAA,IAAY,EAAA;AAAA,QACzB,OAAO,aAAA,CAAc,WAAA;AAAA,QACrB,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AAGD,MAAA,OAAO;AAAA,QACL,kBAAA,EAAoB,CAAC,cAAA,EAAgB,GAAG,cAAc,kBAAkB,CAAA;AAAA,QACxE,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,UAAU,aAAA,CAAc;AAAA,OAC1B;AAAA,IACF,CAAA,MAAO;AAGL,MAAA,MAAM,YAAA,GAAyC,OAAO,WAAA,CAAY,GAAA;AAAA,QAChE,CAAC,IAAA,EAAM,KAAA,KACL,IAAA,CAAK,UAAA,CAAW;AAAA,UACd,GAAA,EAAK,IAAA;AAAA,UACL,IAAA,EAAM,EAAA;AAAA,UACN,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,UAC1B,WAAW,MAAA,CAAO;AAAA,SACnB;AAAA,OACL;AAGA,MAAA,MAAM,cAAA,GAAiB,KAAK,UAAA,CAAW;AAAA,QACrC,KAAK,MAAA,CAAO,YAAA;AAAA,QACZ,IAAA,EAAM,OAAO,QAAA,IAAY,EAAA;AAAA,QACzB,OAAO,MAAA,CAAO,WAAA;AAAA,QACd,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AAED,MAAA,OAAO;AAAA,QACL,kBAAA,EAAoB,CAAC,cAAA,EAAgB,GAAG,YAAY,CAAA;AAAA,QACpD,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,UAAU,MAAA,CAAO;AAAA,OACnB;AAAA,IACF;AAAA,EACF;AACF","file":"index.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 * @returns Decompressed string or undefined if decompression fails\n */\nexport function assembleChunks(chunks: string[]): 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 // 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\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 { CHUNKED_STORAGE_READER_CONTRACT, STORAGE_ROUTER_CONTRACT, CHUNKED_STORAGE_CONTRACT } 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 if (outputAsString) {\n return [text, hexToString(dataHex)];\n }\n return [text, dataHex];\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: 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 // 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, assembledString]);\n } else {\n // Convert plain string to hex for hex output format\n const hexData = stringToHex(assembledString) as `0x${string}`;\n setRouterData([text, 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: !shouldUseRouter && enabled && !!operatorAddress && !!key && 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 // 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 }, [chainId, key, operatorAddress, index, enabled, isLatestVersion, 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 const formattedDirectData = latestData \n ? formatData((latestData as StorageData)[0], (latestData as StorageData)[1] as `0x${string}`)\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}: UseStorageOptions) {\n const storageKeyBytes = key\n ? (getStorageKeyBytes(key, keyFormat) as `0x${string}`)\n : undefined;\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 as StorageData | 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 let result = metadata;\n\n references.forEach((ref, index) => {\n const chunkData = chunks[index];\n if (chunkData) {\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\n const xmlTag = `<net k=\"${ref.hash}\" v=\"${ref.version}\"${indexAttr}${operatorAttr}${sourceAttr} />`;\n result = result.replace(xmlTag, chunkData);\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 ${i + 1} (${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\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 returnFormat = \"object\",\n outputFormat = \"hex\",\n}: UseXmlStorageOptions) {\n // Determine mode: preview (raw content) vs blockchain (fetch from storage)\n const isPreviewMode = !!content;\n const returnAsTuple = returnFormat === \"tuple\";\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?.[1]) return \"\";\n // metadata[1] is already a plain string because useStorage is called with outputFormat: \"string\"\n return metadata[1] 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 // Handle tuple format return\n if (returnAsTuple) {\n // Early return if XML parsing is skipped\n if (skipXmlParsing) {\n if (isPreviewMode) {\n // Preview mode: content is plain string\n const contentValue = content || \"\";\n return {\n data: contentValue\n ? outputAsString\n ? ([metadata?.[0] || \"\", contentValue] as StorageData)\n : ([\n metadata?.[0] || \"\",\n stringToHex(contentValue) as `0x${string}`,\n ] as StorageData)\n : undefined,\n isLoading: metadataLoading,\n error: metadataError,\n };\n } else {\n // Non-preview mode: metadata[1] is plain string from useStorage (since we pass outputFormat: \"string\")\n const dataValue = metadata?.[1] as string | undefined;\n return {\n data: dataValue\n ? outputAsString\n ? ([metadata?.[0] || \"\", dataValue] as StorageData)\n : ([\n metadata?.[0] || \"\",\n stringToHex(dataValue) as `0x${string}`,\n ] as StorageData)\n : undefined,\n isLoading: metadataLoading,\n error: metadataError,\n };\n }\n }\n\n // XML storage with tuple format\n if (isXml) {\n if (!assembledData) {\n // Loading or empty - return undefined (matches previous behavior)\n return {\n data: undefined,\n isLoading: metadataLoading || chunksLoading,\n error: metadataError || chunksError,\n };\n }\n\n // XML: resolved string → convert based on outputFormat\n const hexData = stringToHex(assembledData) as `0x${string}`;\n return {\n data: outputAsString\n ? ([metadata?.[0] || \"\", assembledData] as StorageData)\n : ([metadata?.[0] || \"\", hexData] as StorageData),\n isLoading: metadataLoading || chunksLoading,\n error: metadataError || chunksError,\n };\n } else {\n // Non-XML: metadata[1] is plain string from useStorage (since we pass outputFormat: \"string\") → convert based on outputFormat\n if (!metadata) {\n return {\n data: undefined,\n isLoading: metadataLoading,\n error: metadataError,\n };\n }\n // metadata[1] is now a plain string (not hex) because we pass outputFormat: \"string\" to useStorage\n const dataValue = metadata[1] as string | undefined;\n const returnValue = dataValue\n ? outputAsString\n ? ([metadata[0], dataValue] as StorageData)\n : ([\n metadata[0],\n stringToHex(dataValue) as `0x${string}`,\n ] as StorageData)\n : undefined;\n\n return {\n data: returnValue,\n isLoading: metadataLoading,\n error: metadataError,\n };\n }\n }\n\n // Default object format (existing behavior)\n // Early return if XML parsing is skipped\n if (skipXmlParsing) {\n return {\n data: isPreviewMode ? content || \"\" : ((metadata?.[1] || \"\") as string), // metadata[1] is already a plain string\n filename: metadata?.[0] || \"\",\n isLoading: metadataLoading,\n error: metadataError,\n isXml: false,\n };\n }\n\n return {\n data: isXml\n ? assembledData\n : isPreviewMode\n ? content || \"\"\n : ((metadata?.[1] || \"\") as string), // metadata[1] is already a plain string\n filename: metadata?.[0] || \"\",\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, 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(\n [{ type: \"uint8\" }],\n data\n );\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, 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\n","import {\n STORAGE_CONTRACT,\n SAFE_STORAGE_READER_CONTRACT,\n STORAGE_ROUTER_CONTRACT,\n} from \"../constants\";\nimport { getStorageKeyBytes } from \"../utils/keyUtils\";\nimport type { Abi } from \"viem\";\n\n// Internal config builder types (chainId required separately)\nexport interface GetStorageReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetStorageValueAtIndexReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n index: number;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetStorageTotalWritesReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetStorageBulkGetReadConfigParams {\n chainId: number;\n keys: Array<{ key: string; operator: string; keyFormat?: \"raw\" | \"bytes32\" }>;\n safe?: boolean;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetStorageRouterReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\n// Legacy types for backward compatibility (deprecated, use ReadConfigParams types)\nexport interface GetStorageOptions extends GetStorageReadConfigParams {}\nexport interface GetStorageValueAtIndexOptions extends GetStorageValueAtIndexReadConfigParams {}\nexport interface GetStorageTotalWritesOptions extends GetStorageTotalWritesReadConfigParams {}\nexport interface GetStorageBulkGetOptions extends GetStorageBulkGetReadConfigParams {}\nexport interface GetStorageRouterOptions extends GetStorageRouterReadConfigParams {}\n\n/**\n * Build contract read config for Storage.get()\n */\nexport function getStorageReadConfig(params: GetStorageReadConfigParams) {\n const { chainId, key, operator, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n return {\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"get\" as const,\n args: [storageKeyBytes, operator],\n chainId,\n };\n}\n\n/**\n * Build contract read config for Storage.getValueAtIndex()\n */\nexport function getStorageValueAtIndexReadConfig(\n params: GetStorageValueAtIndexReadConfigParams\n) {\n const { chainId, key, operator, index, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n return {\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"getValueAtIndex\" as const,\n args: [storageKeyBytes, operator, index],\n chainId,\n };\n}\n\n/**\n * Build contract read config for Storage.getTotalWrites()\n */\nexport function getStorageTotalWritesReadConfig(\n params: GetStorageTotalWritesReadConfigParams\n) {\n const { chainId, key, operator, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n return {\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"getTotalWrites\" as const,\n args: [storageKeyBytes, operator],\n chainId,\n };\n}\n\n/**\n * Build contract read config for Storage.bulkGet()\n */\nexport function getStorageBulkGetReadConfig(params: GetStorageBulkGetReadConfigParams) {\n const { chainId, keys, safe = false, keyFormat } = params;\n const contract = safe ? SAFE_STORAGE_READER_CONTRACT : STORAGE_CONTRACT;\n\n // Convert keys to bytes32 format (use individual keyFormat or fallback to global keyFormat)\n const bulkKeys = keys.map((k) => ({\n key: getStorageKeyBytes(k.key, k.keyFormat ?? keyFormat) as `0x${string}`,\n operator: k.operator as `0x${string}`,\n }));\n\n return {\n abi: contract.abi,\n address: contract.address,\n functionName: \"bulkGet\" as const,\n args: [bulkKeys],\n chainId,\n };\n}\n\n/**\n * Build contract read config for StorageRouter.get()\n */\nexport function getStorageRouterReadConfig(params: GetStorageRouterReadConfigParams) {\n const { chainId, key, operator, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n return {\n abi: STORAGE_ROUTER_CONTRACT.abi,\n address: STORAGE_ROUTER_CONTRACT.address,\n functionName: \"get\" as const,\n args: [storageKeyBytes, operator],\n chainId,\n };\n}\n","import { CHUNKED_STORAGE_READER_CONTRACT } from \"../constants\";\nimport { getStorageKeyBytes } from \"../utils/keyUtils\";\n\n// Internal config builder types (chainId required separately)\nexport interface GetChunkedStorageMetadataReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetChunkedStorageChunksReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n start: number;\n end: number;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetChunkedStorageTotalWritesReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\n// Legacy types for backward compatibility (deprecated, use ReadConfigParams types)\nexport interface GetChunkedStorageMetadataOptions extends GetChunkedStorageMetadataReadConfigParams {}\nexport interface GetChunkedStorageChunksOptions extends GetChunkedStorageChunksReadConfigParams {}\nexport interface GetChunkedStorageTotalWritesOptions extends GetChunkedStorageTotalWritesReadConfigParams {}\n\n/**\n * Build contract read config for ChunkedStorageReader.getMetadata() or getMetadataAtIndex()\n */\nexport function getChunkedStorageMetadataReadConfig(\n params: GetChunkedStorageMetadataReadConfigParams\n) {\n const { chainId, key, operator, index, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n const functionName =\n index !== undefined ? \"getMetadataAtIndex\" : \"getMetadata\";\n const args =\n index !== undefined\n ? [storageKeyBytes, operator, index]\n : [storageKeyBytes, operator];\n\n return {\n abi: CHUNKED_STORAGE_READER_CONTRACT.abi,\n address: CHUNKED_STORAGE_READER_CONTRACT.address,\n functionName: functionName as \"getMetadata\" | \"getMetadataAtIndex\",\n args,\n chainId,\n };\n}\n\n/**\n * Build contract read config for ChunkedStorageReader.getChunks() or getChunksAtIndex()\n */\nexport function getChunkedStorageChunksReadConfig(\n params: GetChunkedStorageChunksReadConfigParams\n) {\n const { chainId, key, operator, start, end, index, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n const functionName = index !== undefined ? \"getChunksAtIndex\" : \"getChunks\";\n const args =\n index !== undefined\n ? [storageKeyBytes, operator, start, end, index]\n : [storageKeyBytes, operator, start, end];\n\n return {\n abi: CHUNKED_STORAGE_READER_CONTRACT.abi,\n address: CHUNKED_STORAGE_READER_CONTRACT.address,\n functionName: functionName as \"getChunks\" | \"getChunksAtIndex\",\n args,\n chainId,\n };\n}\n\n/**\n * Build contract read config for ChunkedStorageReader.getTotalWrites()\n */\nexport function getChunkedStorageTotalWritesReadConfig(\n params: GetChunkedStorageTotalWritesReadConfigParams\n) {\n const { chainId, key, operator, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n return {\n abi: CHUNKED_STORAGE_READER_CONTRACT.abi,\n address: CHUNKED_STORAGE_READER_CONTRACT.address,\n functionName: \"getTotalWrites\" as const,\n args: [storageKeyBytes, operator],\n chainId,\n };\n}\n","import { keccak256HashString } from \"@net-protocol/core\";\n\n// Constants from ChunkedStorage.sol\nconst MAX_CHUNKS = 255;\nconst OPTIMAL_CHUNK_SIZE = 80 * 1000;\n\n/**\n * Split data into chunks of specified size\n */\nexport function chunkData(\n data: string,\n chunkSize: number = OPTIMAL_CHUNK_SIZE\n): string[] {\n const chunks: string[] = [];\n for (let i = 0; i < data.length; i += chunkSize) {\n chunks.push(data.slice(i, i + chunkSize));\n }\n return chunks;\n}\n\n/**\n * Generate XML metadata string from chunk hashes\n * Format: <net k=\"hash1\" v=\"0.0.1\" i=\"0\" o=\"0xoperator\" /><net k=\"hash2\" v=\"0.0.1\" i=\"0\" o=\"0xoperator\" />\n */\nexport function generateXmlMetadata(\n chunkHashes: string[],\n historicalIndex: number,\n operatorAddress: string\n): string {\n return chunkHashes\n .map((hash) => {\n const operator = operatorAddress.toLowerCase();\n return `<net k=\"${hash}\" v=\"0.0.1\" i=\"${historicalIndex}\" o=\"${operator}\" />`;\n })\n .join(\"\");\n}\n\n/**\n * Generate XML metadata string from chunk hashes with source support\n * Format: <net k=\"hash1\" v=\"0.0.1\" i=\"0\" o=\"0xoperator\" s=\"d\" /><net k=\"hash2\" v=\"0.0.1\" i=\"0\" o=\"0xoperator\" />\n */\nexport function generateXmlMetadataWithSource(\n chunkHashes: string[],\n historicalIndex: number,\n operatorAddress: string,\n source?: string\n): string {\n return chunkHashes\n .map((hash) => {\n const operator = operatorAddress.toLowerCase();\n const sourceAttr = source ? ` s=\"${source}\"` : \"\";\n return `<net k=\"${hash}\" v=\"0.0.1\" i=\"${historicalIndex}\" o=\"${operator}\"${sourceAttr} />`;\n })\n .join(\"\");\n}\n\n/**\n * Validate data size against constraints\n */\nexport function validateDataSize(chunks: string[]): {\n valid: boolean;\n error?: string;\n} {\n if (chunks.length === 0) {\n return { valid: false, error: \"No chunks generated\" };\n }\n\n if (chunks.length > MAX_CHUNKS) {\n return {\n valid: false,\n error: `Too many chunks: ${chunks.length} exceeds maximum of ${MAX_CHUNKS}`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Compute top-level hash from chunk hashes\n */\nexport function computeTopLevelHash(chunkHashes: string[]): string {\n return keccak256HashString(chunkHashes.join(\"\"));\n}\n\n/**\n * Complete chunking and hash generation process\n */\nexport function processDataForStorage(\n data: string,\n operatorAddress: string,\n storageKey?: string\n): {\n chunks: string[];\n chunkHashes: string[];\n xmlMetadata: string;\n topLevelHash: string;\n valid: boolean;\n error?: string;\n} {\n // 1. Chunk the data\n const chunks = chunkData(data);\n\n // 2. Validate size\n const validation = validateDataSize(chunks);\n if (!validation.valid) {\n return {\n chunks: [],\n chunkHashes: [],\n xmlMetadata: \"\",\n topLevelHash: \"\",\n valid: false,\n error: validation.error,\n };\n }\n\n // 3. Generate chunk hashes\n const chunkHashes = chunks.map((chunk) => keccak256HashString(chunk));\n\n // 4. Generate XML metadata\n const xmlMetadata = generateXmlMetadata(chunkHashes, 0, operatorAddress);\n\n // 5. Use provided storage key or compute top-level hash\n const topLevelHash = storageKey || computeTopLevelHash(chunkHashes);\n\n return {\n chunks,\n chunkHashes,\n xmlMetadata,\n topLevelHash,\n valid: true,\n };\n}\n\n","import { PublicClient, hexToString, decodeAbiParameters } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { getPublicClient, getNetContract } from \"@net-protocol/core\";\nimport {\n getStorageReadConfig,\n getStorageValueAtIndexReadConfig,\n getStorageTotalWritesReadConfig,\n getStorageBulkGetReadConfig,\n getStorageRouterReadConfig,\n} from \"./storage\";\nimport {\n getChunkedStorageMetadataReadConfig,\n getChunkedStorageChunksReadConfig,\n getChunkedStorageTotalWritesReadConfig,\n} from \"./chunkedStorage\";\nimport { assembleChunks } from \"../utils/chunkUtils\";\nimport {\n resolveXmlRecursive,\n fetchChunksWithSourceSupport,\n fetchXmlChunksFromChunkedStorage,\n} from \"./xmlStorage\";\nimport { parseNetReferences, containsXmlReferences } from \"../utils/xmlUtils\";\nimport { getStorageKeyBytes } from \"../utils/keyUtils\";\nimport {\n STORAGE_CONTRACT,\n CHUNKED_STORAGE_CONTRACT,\n CHUNKED_STORAGE_READER_CONTRACT,\n STORAGE_ROUTER_CONTRACT,\n} from \"../constants\";\nimport type {\n StorageData,\n BulkStorageKey,\n BulkStorageResult,\n StorageClientOptions,\n} from \"../types\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport { normalizeDataOrEmpty } from \"@net-protocol/core\";\nimport { keccak256HashString } from \"@net-protocol/core\";\nimport { processDataForStorage, generateXmlMetadata } from \"../utils/writingUtils\";\nimport { chunkDataForStorage } from \"../utils/chunkUtils\";\n\n/**\n * StorageClient - Client for interacting with Net protocol storage\n * \n * **Pattern for client methods:**\n * - Client methods never require `chainId` in their parameters\n * - All methods use `this.chainId` internally (set during construction)\n * - Config builders receive `chainId` as a separate required parameter\n * - This ensures consistency: the client's `chainId` is the single source of truth\n */\nexport class StorageClient {\n private client: PublicClient;\n private chainId: number;\n\n constructor(params: StorageClientOptions) {\n this.client = getPublicClient({\n chainId: params.chainId,\n rpcUrl: params.overrides?.rpcUrls,\n });\n this.chainId = params.chainId;\n }\n\n /**\n * Get storage value for a key and operator (latest version)\n */\n async get(params: {\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<StorageData | null> {\n const config = getStorageReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n keyFormat: params.keyFormat,\n });\n\n try {\n const result = await readContract(this.client, config);\n return result as StorageData;\n } catch {\n return null;\n }\n }\n\n /**\n * Get storage value at a specific historical index\n */\n async getValueAtIndex(params: {\n key: string;\n operator: string;\n index: number;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<StorageData | null> {\n const config = getStorageValueAtIndexReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n try {\n const result = await readContract(this.client, config);\n return result as StorageData;\n } catch {\n return null;\n }\n }\n\n /**\n * Get total number of writes (versions) for a key-operator pair\n * Tries ChunkedStorageReader first, then Storage\n */\n async getTotalWrites(params: {\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<number> {\n // Try ChunkedStorageReader first\n try {\n const config = getChunkedStorageTotalWritesReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n keyFormat: params.keyFormat,\n });\n const count = await readContract(this.client, config);\n return Number(count);\n } catch {\n // Fall back to Storage\n try {\n const config = getStorageTotalWritesReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n keyFormat: params.keyFormat,\n });\n const count = await readContract(this.client, config);\n return Number(count);\n } catch {\n return 0;\n }\n }\n }\n\n /**\n * Bulk get storage values\n */\n async bulkGet(params: {\n keys: BulkStorageKey[];\n safe?: boolean;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<BulkStorageResult[]> {\n const config = getStorageBulkGetReadConfig({\n chainId: this.chainId,\n keys: params.keys,\n safe: params.safe,\n keyFormat: params.keyFormat,\n });\n\n try {\n const results = await readContract(this.client, config);\n return (results as any[]).map((r) => ({\n text: r[0],\n value: r[1],\n })) as BulkStorageResult[];\n } catch {\n return [];\n }\n }\n\n /**\n * Get storage value via StorageRouter (latest version)\n * Returns data with storage type indication\n */\n async getViaRouter(params: {\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<{\n isChunkedStorage: boolean;\n text: string;\n data: string;\n } | null> {\n const config = getStorageRouterReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n keyFormat: params.keyFormat,\n });\n\n try {\n const result = await readContract(this.client, config);\n const [isChunkedStorage, text, data] = result as [\n boolean,\n string,\n `0x${string}`\n ];\n\n // If chunked, decode chunk count and return assembled data\n if (isChunkedStorage) {\n const [chunkCount] = decodeAbiParameters([{ type: \"uint8\" }], data);\n if (chunkCount === 0) {\n return { isChunkedStorage: true, text, data: \"\" };\n }\n\n // Fetch and assemble chunks\n const chunks = await this.getChunked({\n key: params.key,\n operator: params.operator,\n start: 0,\n end: Number(chunkCount),\n keyFormat: params.keyFormat,\n });\n\n const assembled = assembleChunks(chunks);\n return {\n isChunkedStorage: true,\n text,\n data: assembled || \"\",\n };\n }\n\n // Regular storage\n return {\n isChunkedStorage: false,\n text,\n data: hexToString(data),\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get chunked storage metadata\n */\n async getChunkedMetadata(params: {\n key: string;\n operator: string;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<{ chunkCount: number; originalText: string } | null> {\n const config = getChunkedStorageMetadataReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n try {\n const result = await readContract(this.client, config);\n const [chunkCount, originalText] = result as [number, string];\n return { chunkCount, originalText };\n } catch {\n return null;\n }\n }\n\n /**\n * Get chunked storage chunks\n */\n async getChunked(params: {\n key: string;\n operator: string;\n start: number;\n end: number;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<string[]> {\n const config = getChunkedStorageChunksReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n start: params.start,\n end: params.end,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n try {\n const chunks = await readContract(this.client, config);\n return chunks as string[];\n } catch {\n return [];\n }\n }\n\n /**\n * Get chunked storage at a specific historical index\n */\n async getChunkedAtIndex(params: {\n key: string;\n operator: string;\n start: number;\n end: number;\n index: number;\n }): Promise<string[]> {\n return this.getChunked({\n ...params,\n index: params.index,\n });\n }\n\n /**\n * Get all storage keys for an operator using Net contract\n */\n async getForOperator(params: {\n operator: string;\n }): Promise<Array<[string, string, number, string]>> {\n const netContract = getNetContract(this.chainId);\n\n // Get total count\n const totalCount = await readContract(this.client, {\n abi: netContract.abi,\n address: netContract.address,\n functionName: \"getTotalMessagesForAppUserCount\",\n args: [STORAGE_CONTRACT.address, params.operator],\n });\n\n const totalCountNumber = Number(totalCount);\n\n if (totalCountNumber === 0) {\n return [];\n }\n\n // Get all messages\n const messages = await readContract(this.client, {\n abi: netContract.abi,\n address: netContract.address,\n functionName: \"getMessagesInRangeForAppUser\",\n args: [0, totalCountNumber, STORAGE_CONTRACT.address, params.operator],\n });\n\n return (messages as any[]).map((msg) => [\n msg.topic,\n msg.text,\n Number(msg.timestamp),\n msg.data,\n ]);\n }\n\n /**\n * Get storage value for operator and key\n */\n async getForOperatorAndKey(params: {\n operator: string;\n key: string;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<StorageData | null> {\n const storageKeyBytes = getStorageKeyBytes(\n params.key,\n params.keyFormat\n ) as `0x${string}`;\n\n try {\n const result = await readContract(this.client, {\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"getForOperatorAndKey\",\n args: [params.operator, storageKeyBytes],\n });\n return result as StorageData;\n } catch {\n return null;\n }\n }\n\n /**\n * Read storage data with XML resolution\n */\n async readStorageData(params: {\n key: string;\n operator: string;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<{ text: string; data: string; isXml: boolean }> {\n // Get data via router (latest) or direct (historical)\n let text: string;\n let data: string;\n let isChunkedStorage: boolean;\n\n if (params.index !== undefined) {\n // Historical: try chunked first, then regular\n const chunkedMeta = await this.getChunkedMetadata({\n key: params.key,\n operator: params.operator,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n if (chunkedMeta && chunkedMeta.chunkCount > 0) {\n isChunkedStorage = true;\n text = chunkedMeta.originalText;\n const chunks = await this.getChunked({\n key: params.key,\n operator: params.operator,\n start: 0,\n end: chunkedMeta.chunkCount,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n const assembled = assembleChunks(chunks);\n data = assembled || \"\";\n } else {\n // Try regular storage\n const result = await this.getValueAtIndex({\n key: params.key,\n operator: params.operator,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n if (!result) {\n throw new Error(\"StoredDataNotFound\");\n }\n isChunkedStorage = false;\n [text, data] = result;\n data = hexToString(data as `0x${string}`);\n }\n } else {\n // Latest: use router\n const result = await this.getViaRouter({\n key: params.key,\n operator: params.operator,\n keyFormat: params.keyFormat,\n });\n if (!result) {\n throw new Error(\"StoredDataNotFound\");\n }\n isChunkedStorage = result.isChunkedStorage;\n text = result.text;\n data = result.data;\n }\n\n // Resolve XML if needed\n const isXml = containsXmlReferences(data);\n if (isXml) {\n const resolvedData = await resolveXmlRecursive(\n data,\n params.operator,\n this.client,\n 3, // MAX_XML_DEPTH\n new Set()\n );\n return { text, data: resolvedData, isXml: true };\n }\n\n return { text, data, isXml: false };\n }\n\n /**\n * Read chunked storage data with decompression\n */\n async readChunkedStorage(params: {\n key: string;\n operator: string;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<{ text: string; data: string }> {\n const metadata = await this.getChunkedMetadata({\n key: params.key,\n operator: params.operator,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n if (!metadata) {\n throw new Error(\"ChunkedStorage metadata not found\");\n }\n\n if (metadata.chunkCount === 0) {\n return { text: metadata.originalText, data: \"\" };\n }\n\n const chunks = await this.getChunked({\n key: params.key,\n operator: params.operator,\n start: 0,\n end: metadata.chunkCount,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n const assembled = assembleChunks(chunks);\n return {\n text: metadata.originalText,\n data: assembled || \"\",\n };\n }\n\n /**\n * Validate storage parameters\n */\n private validateStorageParams(params: {\n key: string | `0x${string}`;\n chunks?: string[];\n }) {\n if (!params.key || (typeof params.key === \"string\" && params.key.length === 0)) {\n throw new Error(\"Storage key cannot be empty\");\n }\n \n if (params.chunks && params.chunks.length === 0) {\n throw new Error(\"Chunks array cannot be empty\");\n }\n \n if (params.chunks && params.chunks.length > 255) {\n throw new Error(`Too many chunks: ${params.chunks.length} exceeds maximum of 255`);\n }\n }\n\n /**\n * Prepare transaction configs for storing XML chunks in ChunkedStorage backend.\n * Each XML chunk is compressed and chunked into 20KB ChunkedStorage chunks.\n */\n private prepareXmlChunksForChunkedStorage(params: {\n xmlChunks: string[];\n operatorAddress: `0x${string}`;\n }): {\n transactionConfigs: WriteTransactionConfig[];\n chunkedStorageHashes: string[];\n xmlMetadata: string;\n } {\n const chunkedStorageHashes: string[] = [];\n const transactionConfigs: WriteTransactionConfig[] = [];\n\n // Store each XML chunk in ChunkedStorage\n for (const xmlChunk of params.xmlChunks) {\n // Compress and chunk the XML chunk into 20KB ChunkedStorage chunks\n const chunks = chunkDataForStorage(xmlChunk);\n\n // Generate storage key for this XML chunk's ChunkedStorage entry\n // This will be the key used in XML metadata to reference this XML chunk\n const chunkedHash = keccak256HashString(xmlChunk + params.operatorAddress);\n chunkedStorageHashes.push(chunkedHash);\n\n // Create ChunkedStorage transaction config\n const config = this.prepareChunkedPut({\n key: chunkedHash,\n text: \"\",\n chunks,\n });\n\n transactionConfigs.push(config);\n }\n\n // Generate XML metadata pointing to ChunkedStorage hashes\n // Always include i=\"0\" for initial storage (first version)\n const xmlMetadata = generateXmlMetadata(\n chunkedStorageHashes,\n 0,\n params.operatorAddress\n );\n\n return {\n transactionConfigs,\n chunkedStorageHashes,\n xmlMetadata,\n };\n }\n\n /**\n * Prepare transaction config for storing a single value in Storage contract.\n */\n preparePut(params: {\n key: string | `0x${string}`;\n text: string;\n value: string | `0x${string}`;\n keyFormat?: \"raw\" | \"bytes32\";\n }): WriteTransactionConfig {\n this.validateStorageParams({ key: params.key });\n\n const keyBytes32 = getStorageKeyBytes(params.key, params.keyFormat) as `0x${string}`;\n const valueHex = normalizeDataOrEmpty(params.value);\n\n return {\n to: STORAGE_CONTRACT.address,\n functionName: \"put\",\n args: [keyBytes32, params.text, valueHex],\n abi: STORAGE_CONTRACT.abi,\n };\n }\n\n /**\n * Prepare transaction config for storing data in ChunkedStorage contract.\n */\n prepareChunkedPut(params: {\n key: string | `0x${string}`;\n text: string;\n chunks: string[];\n keyFormat?: \"raw\" | \"bytes32\";\n }): WriteTransactionConfig {\n this.validateStorageParams({ key: params.key, chunks: params.chunks });\n\n const keyBytes32 = getStorageKeyBytes(params.key, params.keyFormat) as `0x${string}`;\n\n // Validate chunks are hex strings\n for (const chunk of params.chunks) {\n if (!chunk.startsWith(\"0x\")) {\n throw new Error(`Invalid chunk format: ${chunk} must be a hex string`);\n }\n }\n\n return {\n to: CHUNKED_STORAGE_CONTRACT.address,\n functionName: \"put\",\n args: [keyBytes32, params.text, params.chunks],\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n };\n }\n\n /**\n * Prepare transaction config for bulk storage operations using Storage.bulkPut.\n */\n prepareBulkPut(params: {\n entries: Array<{\n key: string | `0x${string}`;\n text: string;\n value: string | `0x${string}`;\n }>;\n keyFormat?: \"raw\" | \"bytes32\";\n }): WriteTransactionConfig {\n if (params.entries.length === 0) {\n throw new Error(\"Entries array cannot be empty\");\n }\n\n // Convert all entries\n const bulkEntries = params.entries.map((entry) => {\n this.validateStorageParams({ key: entry.key });\n const keyBytes32 = getStorageKeyBytes(entry.key, params.keyFormat) as `0x${string}`;\n const valueHex = normalizeDataOrEmpty(entry.value);\n\n return {\n key: keyBytes32,\n text: entry.text,\n value: valueHex,\n };\n });\n\n return {\n to: STORAGE_CONTRACT.address,\n functionName: \"bulkPut\",\n args: [bulkEntries],\n abi: STORAGE_CONTRACT.abi,\n };\n }\n\n /**\n * Prepare transaction configs for XML storage (multiple transactions - metadata + chunks).\n */\n prepareXmlStorage(params: {\n data: string;\n operatorAddress: `0x${string}`;\n storageKey?: string | `0x${string}`;\n filename?: string;\n useChunkedStorageBackend?: boolean; // Default: true\n keyFormat?: \"raw\" | \"bytes32\";\n }): {\n transactionConfigs: WriteTransactionConfig[];\n topLevelHash: string;\n metadata: string;\n } {\n // Process data: chunk it and generate hashes\n const result = processDataForStorage(\n params.data,\n params.operatorAddress,\n params.storageKey\n );\n\n if (!result.valid) {\n throw new Error(result.error || \"Failed to process data for storage\");\n }\n\n // Use ChunkedStorage backend by default\n const useChunkedStorageBackend = params.useChunkedStorageBackend !== false;\n\n if (useChunkedStorageBackend) {\n // Prepare XML chunks for ChunkedStorage backend\n const chunkedResult = this.prepareXmlChunksForChunkedStorage({\n xmlChunks: result.chunks,\n operatorAddress: params.operatorAddress,\n });\n\n // Create metadata transaction (Storage.put with XML metadata)\n const metadataConfig = this.preparePut({\n key: result.topLevelHash,\n text: params.filename || \"\",\n value: chunkedResult.xmlMetadata,\n keyFormat: params.keyFormat,\n });\n\n // Combine transactions: metadata first, then chunk transactions\n return {\n transactionConfigs: [metadataConfig, ...chunkedResult.transactionConfigs],\n topLevelHash: result.topLevelHash,\n metadata: chunkedResult.xmlMetadata,\n };\n } else {\n // Legacy mode: store XML chunks directly in Storage\n // This is not commonly used but kept for backward compatibility\n const chunkConfigs: WriteTransactionConfig[] = result.chunkHashes.map(\n (hash, index) =>\n this.preparePut({\n key: hash,\n text: \"\",\n value: result.chunks[index],\n keyFormat: params.keyFormat,\n })\n );\n\n // Create metadata transaction\n const metadataConfig = this.preparePut({\n key: result.topLevelHash,\n text: params.filename || \"\",\n value: result.xmlMetadata,\n keyFormat: params.keyFormat,\n });\n\n return {\n transactionConfigs: [metadataConfig, ...chunkConfigs],\n topLevelHash: result.topLevelHash,\n metadata: result.xmlMetadata,\n };\n }\n }\n}\n"]}
|
|
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","../src/client/storage.ts","../src/client/chunkedStorage.ts","../src/utils/writingUtils.ts","../src/client/StorageClient.ts"],"names":["stringToHex","pako","hexToBytes","hexToString","fromHex","keccak256HashString","toBytes32","useState","useReadContract","useEffect","decodeAbiParameters","getPublicClient","readContract","storageKeyBytes","text","getNetContract","chunkData","useMemo","useAsyncEffect","BATCH_SIZE","normalizeDataOrEmpty"],"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;AAEO,IAAM,wBAAA,GAA2B;AAAA,EACtC,GAAA,EAAK,uBAAA;AAAA,EACL,OAAA,EAAS;AACX;AAEO,IAAM,+BAAA,GAAkC;AAAA,EAC7C,GAAA,EAAK,8BAAA;AAAA,EACL,OAAA,EAAS;AACX;AAEO,IAAM,uBAAA,GAA0B;AAAA,EACrC,GAAA,EAAK,sBAAA;AAAA,EACL,OAAA,EAAS;AACX;AAEO,IAAM,4BAAA,GAA+B;AAAA,EAC1C,GAAA,EAAK,2BAAA;AAAA,EACL,OAAA,EAAS;AACX;;;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;AAKO,SAAS,kBAAkB,QAAA,EAAqC;AACrE,EAAA,OAAO,qBAAA,CAAsB,QAAQ,CAAA,GAAI,KAAA,GAAQ,SAAA;AACnD;AAKO,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;;;ACpEA,IAAM,aAAa,EAAA,GAAK,GAAA;AAQjB,SAAS,oBAAoB,IAAA,EAAwB;AAC1D,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAUA,iBAAY,IAAI,CAAA;AAChC,IAAA,MAAM,eAAA,GAAkBC,qBAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAGzC,IAAA,MAAM,YAAY,IAAA,GAAO,MAAA,CAAO,KAAK,eAAe,CAAA,CAAE,SAAS,KAAK,CAAA;AACpE,IAAA,MAAM,SAAmB,EAAC;AAG1B,IAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA;AAG1C,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,iBAAiB,MAAA,EAAQ,CAAA,IAAK,aAAa,CAAA,EAAG;AAChE,MAAA,MAAM,QAAQ,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,aAAa,CAAC,CAAA;AAC1D,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAChE,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACvD;AACF;AAOO,SAAS,wBAAwB,IAAA,EAAuB;AAC7D,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,UAAA,IAAc,qBAAA,CAAsB,IAAI,CAAA;AAC/D;AAOO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,MAAM,SAAA,GAAYD,iBAAY,IAAI,CAAA;AAClC,EAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA;AAC1C,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,KAAK,gBAAA,CAAiB,MAAA,IAAU,UAAA,GAAa,CAAA,CAAE,CAAC,CAAA;AAC1E;AAQO,SAAS,eAAe,MAAA,EAAsC;AACnE,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,GAAQE,gBAAW,SAA0B,CAAA;AAEnD,IAAA,IAAI;AAEF,MAAA,MAAM,YAAA,GAAeD,qBAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAItC,MAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,MAAM,CAAA;AAE3D,MAAA,MAAM,MAAA,GAASE,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;AC/EA,SAAS,eAAe,GAAA,EAAsB;AAC5C,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,GAAI,GAAG,CAAA;AAC9D;AAMO,SAAS,2BAA2B,UAAA,EAGzC;AAEA,EAAA,IACE,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,IAC1B,UAAA,CAAW,WAAW,EAAA,IACtB,qBAAA,CAAsB,IAAA,CAAK,UAAU,CAAA,EACrC;AACA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUC,YAAA,CAAQ,UAAA,EAA6B,QAAQ,CAAA;AAE7D,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAEzC,MAAA,IAAI,CAAC,eAAe,OAAO,CAAA,IAAK,QAAQ,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACzD,QAAA,OAAO;AAAA,UACL,WAAA,EAAa,OAAA;AAAA,UACb,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,UAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AACF;AAUO,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;AAeO,SAAS,uBAAuB,GAAA,EAAqB;AAC1D,EAAA,OAAO,mBAAmB,GAAG,CAAA;AAC/B;AAWO,SAAS,wBAAwB,MAAA,EAK7B;AACT,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,eAAA,CAAgB,WAAA,EAAY;AACpD,EAAA,MAAM,YACJ,MAAA,CAAO,YAAA,KAAiB,SAAY,CAAA,IAAA,EAAO,MAAA,CAAO,YAAY,CAAA,CAAA,CAAA,GAAM,EAAA;AACtE,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,gBAAA,GAAmB,CAAA,MAAA,CAAA,GAAW,EAAA;AACxD,EAAA,OAAO,CAAA,QAAA,EAAW,OAAO,eAAe,CAAA,WAAA,EAAc,SAAS,CAAA,IAAA,EAAO,QAAQ,IAAI,UAAU,CAAA,GAAA,CAAA;AAC9F;;;AC3HA,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,GAAiBH,gBAAAA,CAAY,OAAO,CAAA,GAAI;AAAA,KACjD;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAII,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,GAAUZ,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,MACLQ,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,MAAME,gBAAAA,GAAkB,kBAAA;AAAA,UACtB,GAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAMD,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,CAACC,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,MAAMF,oBAAA,CAAa,MAAA,EAAQ;AAAA,cACzC,KAAK,+BAAA,CAAgC,GAAA;AAAA,cACrC,SAAS,+BAAA,CAAgC,OAAA;AAAA,cACzC,YAAA,EAAc,kBAAA;AAAA,cACd,MAAM,CAACC,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,GAAUb,iBAAY,aAAa,CAAA;AACzC,cAAA,iBAAA,CAAkB,UAAA,CAAWc,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,MAAMF,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,CAACC,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,KAAmBP,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,GAAiBL,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,GAAIK,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;AAKtB,IAAM,sBAAA,GAAyB;AAwC/B,SAAS,eAAA,CACd,QAAA,EACA,MAAA,EACA,UAAA,EACQ;AACR,EAAA,IAAI,MAAA,GAAS,QAAA;AAEb,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AACjC,IAAA,MAAMQ,UAAAA,GAAY,OAAO,KAAK,CAAA;AAC9B,IAAA,IAAIA,UAAAA,EAAW;AAEb,MAAA,MAAM,YAAY,GAAA,CAAI,KAAA,KAAU,SAAY,CAAA,IAAA,EAAO,GAAA,CAAI,KAAK,CAAA,CAAA,CAAA,GAAM,EAAA;AAClE,MAAA,MAAM,eAAe,GAAA,CAAI,QAAA,GAAW,CAAA,IAAA,EAAO,GAAA,CAAI,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAA;AAC7D,MAAA,MAAM,aAAa,GAAA,CAAI,MAAA,GAAS,CAAA,IAAA,EAAO,GAAA,CAAI,MAAM,CAAA,CAAA,CAAA,GAAM,EAAA;AAEvD,MAAA,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;AAC9F,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQA,UAAS,CAAA;AAAA,IAC3C;AAAA,EACF,CAAC,CAAA;AAED,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,MAAMJ,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,GAAUT,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,MAAMS,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;AA0IA,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;AC7ZO,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,GAAQjB,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,IAAMmB,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,GAAUV,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,GAASW,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;;;AC3FO,SAAS,qBAAqB,MAAA,EAAoC;AACvE,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,WAAU,GAAI,MAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,KAAK,gBAAA,CAAiB,GAAA;AAAA,IACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,YAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAAA,IAChC;AAAA,GACF;AACF;AAKO,SAAS,iCACd,MAAA,EACA;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,WAAU,GAAI,MAAA;AACrD,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,KAAK,gBAAA,CAAiB,GAAA;AAAA,IACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,YAAA,EAAc,iBAAA;AAAA,IACd,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAA,EAAU,KAAK,CAAA;AAAA,IACvC;AAAA,GACF;AACF;AAKO,SAAS,gCACd,MAAA,EACA;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,WAAU,GAAI,MAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,KAAK,gBAAA,CAAiB,GAAA;AAAA,IACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,YAAA,EAAc,gBAAA;AAAA,IACd,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAAA,IAChC;AAAA,GACF;AACF;AAKO,SAAS,4BAA4B,MAAA,EAA2C;AACrF,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,GAAO,KAAA,EAAO,WAAU,GAAI,MAAA;AACnD,EAAA,MAAM,QAAA,GAAW,OAAO,4BAAA,GAA+B,gBAAA;AAGvD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAChC,KAAK,kBAAA,CAAmB,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,aAAa,SAAS,CAAA;AAAA,IACvD,UAAU,CAAA,CAAE;AAAA,GACd,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,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;AACF;AAKO,SAAS,2BAA2B,MAAA,EAA0C;AACnF,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,WAAU,GAAI,MAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,KAAK,uBAAA,CAAwB,GAAA;AAAA,IAC7B,SAAS,uBAAA,CAAwB,OAAA;AAAA,IACjC,YAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAAA,IAChC;AAAA,GACF;AACF;;;ACvGO,SAAS,oCACd,MAAA,EACA;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,WAAU,GAAI,MAAA;AACrD,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,MAAM,YAAA,GACJ,KAAA,KAAU,MAAA,GAAY,oBAAA,GAAuB,aAAA;AAC/C,EAAA,MAAM,IAAA,GACJ,KAAA,KAAU,MAAA,GACN,CAAC,eAAA,EAAiB,UAAU,KAAK,CAAA,GACjC,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAEhC,EAAA,OAAO;AAAA,IACL,KAAK,+BAAA,CAAgC,GAAA;AAAA,IACrC,SAAS,+BAAA,CAAgC,OAAA;AAAA,IACzC,YAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,kCACd,MAAA,EACA;AACA,EAAA,MAAM,EAAE,SAAS,GAAA,EAAK,QAAA,EAAU,OAAO,GAAA,EAAK,KAAA,EAAO,WAAU,GAAI,MAAA;AACjE,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,MAAM,YAAA,GAAe,KAAA,KAAU,MAAA,GAAY,kBAAA,GAAqB,WAAA;AAChE,EAAA,MAAM,IAAA,GACJ,KAAA,KAAU,MAAA,GACN,CAAC,iBAAiB,QAAA,EAAU,KAAA,EAAO,GAAA,EAAK,KAAK,CAAA,GAC7C,CAAC,eAAA,EAAiB,QAAA,EAAU,OAAO,GAAG,CAAA;AAE5C,EAAA,OAAO;AAAA,IACL,KAAK,+BAAA,CAAgC,GAAA;AAAA,IACrC,SAAS,+BAAA,CAAgC,OAAA;AAAA,IACzC,YAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,uCACd,MAAA,EACA;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,WAAU,GAAI,MAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,EAAK,SAAS,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,KAAK,+BAAA,CAAgC,GAAA;AAAA,IACrC,SAAS,+BAAA,CAAgC,OAAA;AAAA,IACzC,YAAA,EAAc,gBAAA;AAAA,IACd,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAAA,IAChC;AAAA,GACF;AACF;AChGA,IAAM,UAAA,GAAa,GAAA;AACnB,IAAM,qBAAqB,EAAA,GAAK,GAAA;AAKzB,SAAS,SAAA,CACd,IAAA,EACA,SAAA,GAAoB,kBAAA,EACV;AACV,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,SAAA,EAAW;AAC/C,IAAA,MAAA,CAAO,KAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,SAAS,CAAC,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,mBAAA,CACd,WAAA,EACA,eAAA,EACA,eAAA,EACQ;AACR,EAAA,OAAO,WAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,QAAA,GAAW,gBAAgB,WAAA,EAAY;AAC7C,IAAA,OAAO,CAAA,QAAA,EAAW,IAAI,CAAA,eAAA,EAAkB,eAAe,QAAQ,QAAQ,CAAA,IAAA,CAAA;AAAA,EACzE,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACZ;AAMO,SAAS,6BAAA,CACd,WAAA,EACA,eAAA,EACA,eAAA,EACA,MAAA,EACQ;AACR,EAAA,OAAO,WAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,QAAA,GAAW,gBAAgB,WAAA,EAAY;AAC7C,IAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA,CAAA,GAAM,EAAA;AAC/C,IAAA,OAAO,WAAW,IAAI,CAAA,eAAA,EAAkB,eAAe,CAAA,KAAA,EAAQ,QAAQ,IAAI,UAAU,CAAA,GAAA,CAAA;AAAA,EACvF,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACZ;AAKO,SAAS,iBAAiB,MAAA,EAG/B;AACA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,qBAAA,EAAsB;AAAA,EACtD;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,UAAA,EAAY;AAC9B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,CAAA,iBAAA,EAAoB,MAAA,CAAO,MAAM,uBAAuB,UAAU,CAAA;AAAA,KAC3E;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAKO,SAAS,oBAAoB,WAAA,EAA+B;AACjE,EAAA,OAAOP,wBAAAA,CAAoB,WAAA,CAAY,IAAA,CAAK,EAAE,CAAC,CAAA;AACjD;AAKO,SAAS,qBAAA,CACd,IAAA,EACA,eAAA,EACA,UAAA,EAQA;AAEA,EAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAG7B,EAAA,MAAM,UAAA,GAAa,iBAAiB,MAAM,CAAA;AAC1C,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,IAAA,OAAO;AAAA,MACL,QAAQ,EAAC;AAAA,MACT,aAAa,EAAC;AAAA,MACd,WAAA,EAAa,EAAA;AAAA,MACb,YAAA,EAAc,EAAA;AAAA,MACd,KAAA,EAAO,KAAA;AAAA,MACP,OAAO,UAAA,CAAW;AAAA,KACpB;AAAA,EACF;AAGA,EAAA,MAAM,cAAc,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAUA,wBAAAA,CAAoB,KAAK,CAAC,CAAA;AAGpE,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,WAAA,EAAa,CAAA,EAAG,eAAe,CAAA;AAGvE,EAAA,MAAM,YAAA,GAAe,UAAA,IAAc,mBAAA,CAAoB,WAAW,CAAA;AAElE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF;;;AC9EO,IAAM,gBAAN,MAAoB;AAAA,EAIzB,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,SAASM,oBAAAA,CAAgB;AAAA,MAC5B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAA,EAAQ,OAAO,SAAA,EAAW;AAAA,KAC3B,CAAA;AACD,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,MAAA,EAIsB;AAC9B,IAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,MAClC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAU,MAAMC,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AAItD,MAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,MAAA;AACtB,MAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,MAAA,EAKU;AAC9B,IAAA,MAAM,SAAS,gCAAA,CAAiC;AAAA,MAC9C,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAU,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AAItD,MAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,MAAA;AACtB,MAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,MAAA,EAID;AAElB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,sCAAA,CAAuC;AAAA,QACpD,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AACD,MAAA,MAAM,KAAA,GAAQ,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACpD,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,+BAAA,CAAgC;AAAA,UAC7C,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,KAAK,MAAA,CAAO,GAAA;AAAA,UACZ,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AACD,QAAA,MAAM,KAAA,GAAQ,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACpD,QAAA,OAAO,OAAO,KAAK,CAAA;AAAA,MACrB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,MAAA,EAImB;AAC/B,IAAA,MAAM,SAAS,2BAAA,CAA4B;AAAA,MACzC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACtD,MAAA,OAAQ,OAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACpC,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,QACT,KAAA,EAAO,EAAE,CAAC;AAAA,OACZ,CAAE,CAAA;AAAA,IACJ,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,MAAA,EAQT;AACR,IAAA,MAAM,SAAS,0BAAA,CAA2B;AAAA,MACxC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACrD,MAAA,MAAM,CAAC,gBAAA,EAAkB,IAAA,EAAM,IAAI,CAAA,GAAI,MAAA;AAOvC,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,MAAM,CAAC,UAAU,CAAA,GAAIF,wBAAAA,CAAoB,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA;AAClE,QAAA,IAAI,eAAe,CAAA,EAAG;AACpB,UAAA,OAAO,EAAE,gBAAA,EAAkB,IAAA,EAAM,IAAA,EAAM,MAAM,EAAA,EAAG;AAAA,QAClD;AAGA,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW;AAAA,UACnC,KAAK,MAAA,CAAO,GAAA;AAAA,UACZ,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,KAAA,EAAO,CAAA;AAAA,UACP,GAAA,EAAK,OAAO,UAAU,CAAA;AAAA,UACtB,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AAED,QAAA,MAAM,SAAA,GAAY,eAAe,MAAM,CAAA;AACvC,QAAA,OAAO;AAAA,UACL,gBAAA,EAAkB,IAAA;AAAA,UAClB,IAAA;AAAA,UACA,MAAM,SAAA,IAAa;AAAA,SACrB;AAAA,MACF;AAGA,MAAA,OAAO;AAAA,QACL,gBAAA,EAAkB,KAAA;AAAA,QAClB,IAAA;AAAA,QACA,IAAA,EAAMP,iBAAY,IAAI;AAAA,OACxB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,MAAA,EAKwC;AAC/D,IAAA,MAAM,SAAS,mCAAA,CAAoC;AAAA,MACjD,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAMS,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACrD,MAAA,MAAM,CAAC,UAAA,EAAY,YAAY,CAAA,GAAI,MAAA;AACnC,MAAA,OAAO,EAAE,YAAY,YAAA,EAAa;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,MAAA,EAOK;AACpB,IAAA,MAAM,SAAS,iCAAA,CAAkC;AAAA,MAC/C,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAMA,oBAAAA,CAAa,IAAA,CAAK,QAAQ,MAAM,CAAA;AACrD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,MAAA,EAMF;AACpB,IAAA,OAAO,KAAK,UAAA,CAAW;AAAA,MACrB,GAAG,MAAA;AAAA,MACH,OAAO,MAAA,CAAO;AAAA,KACf,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,MAAA,EAEgC;AACnD,IAAA,MAAM,WAAA,GAAcG,mBAAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AAG/C,IAAA,MAAM,UAAA,GAAa,MAAMH,oBAAAA,CAAa,IAAA,CAAK,MAAA,EAAQ;AAAA,MACjD,KAAK,WAAA,CAAY,GAAA;AAAA,MACjB,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,YAAA,EAAc,iCAAA;AAAA,MACd,IAAA,EAAM,CAAC,gBAAA,CAAiB,OAAA,EAAS,OAAO,QAAQ;AAAA,KACjD,CAAA;AAED,IAAA,MAAM,gBAAA,GAAmB,OAAO,UAAU,CAAA;AAE1C,IAAA,IAAI,qBAAqB,CAAA,EAAG;AAC1B,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,QAAA,GAAW,MAAMA,oBAAAA,CAAa,IAAA,CAAK,MAAA,EAAQ;AAAA,MAC/C,KAAK,WAAA,CAAY,GAAA;AAAA,MACjB,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,YAAA,EAAc,8BAAA;AAAA,MACd,MAAM,CAAC,CAAA,EAAG,kBAAkB,gBAAA,CAAiB,OAAA,EAAS,OAAO,QAAQ;AAAA,KACtE,CAAA;AAED,IAAA,OAAQ,QAAA,CAAmB,GAAA,CAAI,CAAC,GAAA,KAAQ;AAAA,MACtC,GAAA,CAAI,KAAA;AAAA,MACJ,GAAA,CAAI,IAAA;AAAA,MACJ,MAAA,CAAO,IAAI,SAAS,CAAA;AAAA,MACpB,GAAA,CAAI;AAAA,KACL,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,MAAA,EAIK;AAC9B,IAAA,MAAM,eAAA,GAAkB,kBAAA;AAAA,MACtB,MAAA,CAAO,GAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAU,MAAMA,oBAAAA,CAAa,IAAA,CAAK,MAAA,EAAQ;AAAA,QAC9C,KAAK,gBAAA,CAAiB,GAAA;AAAA,QACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,QAC1B,YAAA,EAAc,sBAAA;AAAA,QACd,IAAA,EAAM,CAAC,MAAA,CAAO,QAAA,EAAU,eAAe;AAAA,OACxC,CAAA;AACD,MAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,MAAA;AACtB,MAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,MAAA,EAKsC;AAE1D,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,IAAA;AAGJ,IAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAW;AAE9B,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,kBAAA,CAAmB;AAAA,QAChD,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AAED,MAAA,IAAI,WAAA,IAAe,WAAA,CAAY,UAAA,GAAa,CAAA,EAAG;AAE7C,QAAA,IAAA,GAAO,WAAA,CAAY,YAAA;AACnB,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW;AAAA,UACnC,KAAK,MAAA,CAAO,GAAA;AAAA,UACZ,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,KAAA,EAAO,CAAA;AAAA,UACP,KAAK,WAAA,CAAY,UAAA;AAAA,UACjB,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AACD,QAAA,MAAM,SAAA,GAAY,eAAe,MAAM,CAAA;AACvC,QAAA,IAAA,GAAO,SAAA,IAAa,EAAA;AAAA,MACtB,CAAA,MAAO;AAEL,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB;AAAA,UACxC,KAAK,MAAA,CAAO,GAAA;AAAA,UACZ,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AACD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,QACtC;AAEA,QAAA,MAAM,SAAA,GAAY,MAAA;AAClB,QAAA,IAAA,GAAO,SAAA,CAAU,IAAA;AACjB,QAAA,IAAA,GAAOT,gBAAAA,CAAY,UAAU,KAAsB,CAAA;AAAA,MACrD;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa;AAAA,QACrC,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AACD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,MACtC;AACA,MAAmB,MAAA,CAAO,gBAAA;AAC1B,MAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,MAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAAA,IAChB;AAGA,IAAA,MAAM,KAAA,GAAQ,sBAAsB,IAAI,CAAA;AACxC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,eAAe,MAAM,mBAAA;AAAA,QACzB,IAAA;AAAA,QACA,MAAA,CAAO,QAAA;AAAA,QACP,IAAA,CAAK,MAAA;AAAA,QACL,CAAA;AAAA;AAAA,4BACI,GAAA;AAAI,OACV;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,YAAA,EAAc,OAAO,IAAA,EAAK;AAAA,IACjD;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,MAAA,EAKmB;AAC1C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,kBAAA,CAAmB;AAAA,MAC7C,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,QAAA,CAAS,eAAe,CAAA,EAAG;AAC7B,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,YAAA,EAAc,MAAM,EAAA,EAAG;AAAA,IACjD;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW;AAAA,MACnC,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,KAAA,EAAO,CAAA;AAAA,MACP,KAAK,QAAA,CAAS,UAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,eAAe,MAAM,CAAA;AACvC,IAAA,OAAO;AAAA,MACL,MAAM,QAAA,CAAS,YAAA;AAAA,MACf,MAAM,SAAA,IAAa;AAAA,KACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,MAAA,EAG3B;AACD,IAAA,IACE,CAAC,MAAA,CAAO,GAAA,IACP,OAAO,MAAA,CAAO,QAAQ,QAAA,IAAY,MAAA,CAAO,GAAA,CAAI,MAAA,KAAW,CAAA,EACzD;AACA,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,EAAG;AAC/C,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,SAAS,GAAA,EAAK;AAC/C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,iBAAA,EAAoB,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,uBAAA;AAAA,OAC1C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kCAAkC,MAAA,EAOxC;AACA,IAAA,MAAM,uBAAiC,EAAC;AACxC,IAAA,MAAM,qBAA+C,EAAC;AAGtD,IAAA,KAAA,MAAW,QAAA,IAAY,OAAO,SAAA,EAAW;AAEvC,MAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAI3C,MAAA,MAAM,WAAA,GAAcE,wBAAAA;AAAA,QAClB,WAAW,MAAA,CAAO;AAAA,OACpB;AACA,MAAA,oBAAA,CAAqB,KAAK,WAAW,CAAA;AAGrC,MAAA,MAAM,MAAA,GAAS,KAAK,iBAAA,CAAkB;AAAA,QACpC,GAAA,EAAK,WAAA;AAAA,QACL,IAAA,EAAM,EAAA;AAAA,QACN;AAAA,OACD,CAAA;AAED,MAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAAA,IAChC;AAIA,IAAA,MAAM,WAAA,GAAc,mBAAA;AAAA,MAClB,oBAAA;AAAA,MACA,CAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AAEA,IAAA,OAAO;AAAA,MACL,kBAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAKgB;AACzB,IAAA,IAAA,CAAK,qBAAA,CAAsB,EAAE,GAAA,EAAK,MAAA,CAAO,KAAK,CAAA;AAE9C,IAAA,MAAM,UAAA,GAAa,kBAAA;AAAA,MACjB,MAAA,CAAO,GAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AACA,IAAA,MAAM,QAAA,GAAWe,yBAAA,CAAqB,MAAA,CAAO,KAAK,CAAA;AAElD,IAAA,OAAO;AAAA,MACL,IAAI,gBAAA,CAAiB,OAAA;AAAA,MACrB,YAAA,EAAc,KAAA;AAAA,MACd,IAAA,EAAM,CAAC,UAAA,EAAY,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,MACxC,KAAK,gBAAA,CAAiB;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,MAAA,EAKS;AACzB,IAAA,IAAA,CAAK,qBAAA,CAAsB,EAAE,GAAA,EAAK,MAAA,CAAO,KAAK,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AAErE,IAAA,MAAM,UAAA,GAAa,kBAAA;AAAA,MACjB,MAAA,CAAO,GAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAK,CAAA,qBAAA,CAAuB,CAAA;AAAA,MACvE;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAI,wBAAA,CAAyB,OAAA;AAAA,MAC7B,YAAA,EAAc,KAAA;AAAA,MACd,MAAM,CAAC,UAAA,EAAY,MAAA,CAAO,IAAA,EAAM,OAAO,MAAM,CAAA;AAAA,MAC7C,KAAK,wBAAA,CAAyB;AAAA,KAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAA,EAOY;AACzB,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AAChD,MAAA,IAAA,CAAK,qBAAA,CAAsB,EAAE,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AAC7C,MAAA,MAAM,UAAA,GAAa,kBAAA;AAAA,QACjB,KAAA,CAAM,GAAA;AAAA,QACN,MAAA,CAAO;AAAA,OACT;AACA,MAAA,MAAM,QAAA,GAAWA,yBAAA,CAAqB,KAAA,CAAM,KAAK,CAAA;AAEjD,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,UAAA;AAAA,QACL,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,KAAA,EAAO;AAAA,OACT;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,IAAI,gBAAA,CAAiB,OAAA;AAAA,MACrB,YAAA,EAAc,SAAA;AAAA,MACd,IAAA,EAAM,CAAC,WAAW,CAAA;AAAA,MAClB,KAAK,gBAAA,CAAiB;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,MAAA,EAWhB;AAEA,IAAA,MAAM,MAAA,GAAS,qBAAA;AAAA,MACb,MAAA,CAAO,IAAA;AAAA,MACP,MAAA,CAAO,eAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAEA,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,oCAAoC,CAAA;AAAA,IACtE;AAGA,IAAA,MAAM,wBAAA,GAA2B,OAAO,wBAAA,KAA6B,KAAA;AAErE,IAAA,IAAI,wBAAA,EAA0B;AAE5B,MAAA,MAAM,aAAA,GAAgB,KAAK,iCAAA,CAAkC;AAAA,QAC3D,WAAW,MAAA,CAAO,MAAA;AAAA,QAClB,iBAAiB,MAAA,CAAO;AAAA,OACzB,CAAA;AAGD,MAAA,MAAM,cAAA,GAAiB,KAAK,UAAA,CAAW;AAAA,QACrC,KAAK,MAAA,CAAO,YAAA;AAAA,QACZ,IAAA,EAAM,OAAO,QAAA,IAAY,EAAA;AAAA,QACzB,OAAO,aAAA,CAAc,WAAA;AAAA,QACrB,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AAGD,MAAA,OAAO;AAAA,QACL,kBAAA,EAAoB;AAAA,UAClB,cAAA;AAAA,UACA,GAAG,aAAA,CAAc;AAAA,SACnB;AAAA,QACA,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,UAAU,aAAA,CAAc;AAAA,OAC1B;AAAA,IACF,CAAA,MAAO;AAGL,MAAA,MAAM,YAAA,GAAyC,OAAO,WAAA,CAAY,GAAA;AAAA,QAChE,CAAC,IAAA,EAAM,KAAA,KACL,IAAA,CAAK,UAAA,CAAW;AAAA,UACd,GAAA,EAAK,IAAA;AAAA,UACL,IAAA,EAAM,EAAA;AAAA,UACN,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,UAC1B,WAAW,MAAA,CAAO;AAAA,SACnB;AAAA,OACL;AAGA,MAAA,MAAM,cAAA,GAAiB,KAAK,UAAA,CAAW;AAAA,QACrC,KAAK,MAAA,CAAO,YAAA;AAAA,QACZ,IAAA,EAAM,OAAO,QAAA,IAAY,EAAA;AAAA,QACzB,OAAO,MAAA,CAAO,WAAA;AAAA,QACd,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AAED,MAAA,OAAO;AAAA,QACL,kBAAA,EAAoB,CAAC,cAAA,EAAgB,GAAG,YAAY,CAAA;AAAA,QACpD,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,UAAU,MAAA,CAAO;AAAA,OACnB;AAAA,IACF;AAAA,EACF;AACF","file":"index.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 * @returns Decompressed string or undefined if decompression fails\n */\nexport function assembleChunks(chunks: string[]): 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 // 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\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 let result = metadata;\n\n references.forEach((ref, index) => {\n const chunkData = chunks[index];\n if (chunkData) {\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\n const xmlTag = `<net k=\"${ref.hash}\" v=\"${ref.version}\"${indexAttr}${operatorAttr}${sourceAttr} />`;\n result = result.replace(xmlTag, chunkData);\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 ${i + 1} (${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\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","import {\n STORAGE_CONTRACT,\n SAFE_STORAGE_READER_CONTRACT,\n STORAGE_ROUTER_CONTRACT,\n} from \"../constants\";\nimport { getStorageKeyBytes } from \"../utils/keyUtils\";\nimport type { Abi } from \"viem\";\n\n// Internal config builder types (chainId required separately)\nexport interface GetStorageReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetStorageValueAtIndexReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n index: number;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetStorageTotalWritesReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetStorageBulkGetReadConfigParams {\n chainId: number;\n keys: Array<{ key: string; operator: string; keyFormat?: \"raw\" | \"bytes32\" }>;\n safe?: boolean;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetStorageRouterReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\n// Legacy types for backward compatibility (deprecated, use ReadConfigParams types)\nexport interface GetStorageOptions extends GetStorageReadConfigParams {}\nexport interface GetStorageValueAtIndexOptions extends GetStorageValueAtIndexReadConfigParams {}\nexport interface GetStorageTotalWritesOptions extends GetStorageTotalWritesReadConfigParams {}\nexport interface GetStorageBulkGetOptions extends GetStorageBulkGetReadConfigParams {}\nexport interface GetStorageRouterOptions extends GetStorageRouterReadConfigParams {}\n\n/**\n * Build contract read config for Storage.get()\n */\nexport function getStorageReadConfig(params: GetStorageReadConfigParams) {\n const { chainId, key, operator, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n return {\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"get\" as const,\n args: [storageKeyBytes, operator],\n chainId,\n };\n}\n\n/**\n * Build contract read config for Storage.getValueAtIndex()\n */\nexport function getStorageValueAtIndexReadConfig(\n params: GetStorageValueAtIndexReadConfigParams\n) {\n const { chainId, key, operator, index, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n return {\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"getValueAtIndex\" as const,\n args: [storageKeyBytes, operator, index],\n chainId,\n };\n}\n\n/**\n * Build contract read config for Storage.getTotalWrites()\n */\nexport function getStorageTotalWritesReadConfig(\n params: GetStorageTotalWritesReadConfigParams\n) {\n const { chainId, key, operator, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n return {\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"getTotalWrites\" as const,\n args: [storageKeyBytes, operator],\n chainId,\n };\n}\n\n/**\n * Build contract read config for Storage.bulkGet()\n */\nexport function getStorageBulkGetReadConfig(params: GetStorageBulkGetReadConfigParams) {\n const { chainId, keys, safe = false, keyFormat } = params;\n const contract = safe ? SAFE_STORAGE_READER_CONTRACT : STORAGE_CONTRACT;\n\n // Convert keys to bytes32 format (use individual keyFormat or fallback to global keyFormat)\n const bulkKeys = keys.map((k) => ({\n key: getStorageKeyBytes(k.key, k.keyFormat ?? keyFormat) as `0x${string}`,\n operator: k.operator as `0x${string}`,\n }));\n\n return {\n abi: contract.abi,\n address: contract.address,\n functionName: \"bulkGet\" as const,\n args: [bulkKeys],\n chainId,\n };\n}\n\n/**\n * Build contract read config for StorageRouter.get()\n */\nexport function getStorageRouterReadConfig(params: GetStorageRouterReadConfigParams) {\n const { chainId, key, operator, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n return {\n abi: STORAGE_ROUTER_CONTRACT.abi,\n address: STORAGE_ROUTER_CONTRACT.address,\n functionName: \"get\" as const,\n args: [storageKeyBytes, operator],\n chainId,\n };\n}\n","import { CHUNKED_STORAGE_READER_CONTRACT } from \"../constants\";\nimport { getStorageKeyBytes } from \"../utils/keyUtils\";\n\n// Internal config builder types (chainId required separately)\nexport interface GetChunkedStorageMetadataReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetChunkedStorageChunksReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n start: number;\n end: number;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\nexport interface GetChunkedStorageTotalWritesReadConfigParams {\n chainId: number;\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n}\n\n// Legacy types for backward compatibility (deprecated, use ReadConfigParams types)\nexport interface GetChunkedStorageMetadataOptions extends GetChunkedStorageMetadataReadConfigParams {}\nexport interface GetChunkedStorageChunksOptions extends GetChunkedStorageChunksReadConfigParams {}\nexport interface GetChunkedStorageTotalWritesOptions extends GetChunkedStorageTotalWritesReadConfigParams {}\n\n/**\n * Build contract read config for ChunkedStorageReader.getMetadata() or getMetadataAtIndex()\n */\nexport function getChunkedStorageMetadataReadConfig(\n params: GetChunkedStorageMetadataReadConfigParams\n) {\n const { chainId, key, operator, index, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n const functionName =\n index !== undefined ? \"getMetadataAtIndex\" : \"getMetadata\";\n const args =\n index !== undefined\n ? [storageKeyBytes, operator, index]\n : [storageKeyBytes, operator];\n\n return {\n abi: CHUNKED_STORAGE_READER_CONTRACT.abi,\n address: CHUNKED_STORAGE_READER_CONTRACT.address,\n functionName: functionName as \"getMetadata\" | \"getMetadataAtIndex\",\n args,\n chainId,\n };\n}\n\n/**\n * Build contract read config for ChunkedStorageReader.getChunks() or getChunksAtIndex()\n */\nexport function getChunkedStorageChunksReadConfig(\n params: GetChunkedStorageChunksReadConfigParams\n) {\n const { chainId, key, operator, start, end, index, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n const functionName = index !== undefined ? \"getChunksAtIndex\" : \"getChunks\";\n const args =\n index !== undefined\n ? [storageKeyBytes, operator, start, end, index]\n : [storageKeyBytes, operator, start, end];\n\n return {\n abi: CHUNKED_STORAGE_READER_CONTRACT.abi,\n address: CHUNKED_STORAGE_READER_CONTRACT.address,\n functionName: functionName as \"getChunks\" | \"getChunksAtIndex\",\n args,\n chainId,\n };\n}\n\n/**\n * Build contract read config for ChunkedStorageReader.getTotalWrites()\n */\nexport function getChunkedStorageTotalWritesReadConfig(\n params: GetChunkedStorageTotalWritesReadConfigParams\n) {\n const { chainId, key, operator, keyFormat } = params;\n const storageKeyBytes = getStorageKeyBytes(key, keyFormat) as `0x${string}`;\n\n return {\n abi: CHUNKED_STORAGE_READER_CONTRACT.abi,\n address: CHUNKED_STORAGE_READER_CONTRACT.address,\n functionName: \"getTotalWrites\" as const,\n args: [storageKeyBytes, operator],\n chainId,\n };\n}\n","import { keccak256HashString } from \"@net-protocol/core\";\n\n// Constants from ChunkedStorage.sol\nconst MAX_CHUNKS = 255;\nconst OPTIMAL_CHUNK_SIZE = 80 * 1000;\n\n/**\n * Split data into chunks of specified size\n */\nexport function chunkData(\n data: string,\n chunkSize: number = OPTIMAL_CHUNK_SIZE\n): string[] {\n const chunks: string[] = [];\n for (let i = 0; i < data.length; i += chunkSize) {\n chunks.push(data.slice(i, i + chunkSize));\n }\n return chunks;\n}\n\n/**\n * Generate XML metadata string from chunk hashes\n * Format: <net k=\"hash1\" v=\"0.0.1\" i=\"0\" o=\"0xoperator\" /><net k=\"hash2\" v=\"0.0.1\" i=\"0\" o=\"0xoperator\" />\n */\nexport function generateXmlMetadata(\n chunkHashes: string[],\n historicalIndex: number,\n operatorAddress: string\n): string {\n return chunkHashes\n .map((hash) => {\n const operator = operatorAddress.toLowerCase();\n return `<net k=\"${hash}\" v=\"0.0.1\" i=\"${historicalIndex}\" o=\"${operator}\" />`;\n })\n .join(\"\");\n}\n\n/**\n * Generate XML metadata string from chunk hashes with source support\n * Format: <net k=\"hash1\" v=\"0.0.1\" i=\"0\" o=\"0xoperator\" s=\"d\" /><net k=\"hash2\" v=\"0.0.1\" i=\"0\" o=\"0xoperator\" />\n */\nexport function generateXmlMetadataWithSource(\n chunkHashes: string[],\n historicalIndex: number,\n operatorAddress: string,\n source?: string\n): string {\n return chunkHashes\n .map((hash) => {\n const operator = operatorAddress.toLowerCase();\n const sourceAttr = source ? ` s=\"${source}\"` : \"\";\n return `<net k=\"${hash}\" v=\"0.0.1\" i=\"${historicalIndex}\" o=\"${operator}\"${sourceAttr} />`;\n })\n .join(\"\");\n}\n\n/**\n * Validate data size against constraints\n */\nexport function validateDataSize(chunks: string[]): {\n valid: boolean;\n error?: string;\n} {\n if (chunks.length === 0) {\n return { valid: false, error: \"No chunks generated\" };\n }\n\n if (chunks.length > MAX_CHUNKS) {\n return {\n valid: false,\n error: `Too many chunks: ${chunks.length} exceeds maximum of ${MAX_CHUNKS}`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Compute top-level hash from chunk hashes\n */\nexport function computeTopLevelHash(chunkHashes: string[]): string {\n return keccak256HashString(chunkHashes.join(\"\"));\n}\n\n/**\n * Complete chunking and hash generation process\n */\nexport function processDataForStorage(\n data: string,\n operatorAddress: string,\n storageKey?: string\n): {\n chunks: string[];\n chunkHashes: string[];\n xmlMetadata: string;\n topLevelHash: string;\n valid: boolean;\n error?: string;\n} {\n // 1. Chunk the data\n const chunks = chunkData(data);\n\n // 2. Validate size\n const validation = validateDataSize(chunks);\n if (!validation.valid) {\n return {\n chunks: [],\n chunkHashes: [],\n xmlMetadata: \"\",\n topLevelHash: \"\",\n valid: false,\n error: validation.error,\n };\n }\n\n // 3. Generate chunk hashes\n const chunkHashes = chunks.map((chunk) => keccak256HashString(chunk));\n\n // 4. Generate XML metadata\n const xmlMetadata = generateXmlMetadata(chunkHashes, 0, operatorAddress);\n\n // 5. Use provided storage key or compute top-level hash\n const topLevelHash = storageKey || computeTopLevelHash(chunkHashes);\n\n return {\n chunks,\n chunkHashes,\n xmlMetadata,\n topLevelHash,\n valid: true,\n };\n}\n\n","import { PublicClient, hexToString, decodeAbiParameters } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { getPublicClient, getNetContract } from \"@net-protocol/core\";\nimport {\n getStorageReadConfig,\n getStorageValueAtIndexReadConfig,\n getStorageTotalWritesReadConfig,\n getStorageBulkGetReadConfig,\n getStorageRouterReadConfig,\n} from \"./storage\";\nimport {\n getChunkedStorageMetadataReadConfig,\n getChunkedStorageChunksReadConfig,\n getChunkedStorageTotalWritesReadConfig,\n} from \"./chunkedStorage\";\nimport { assembleChunks } from \"../utils/chunkUtils\";\nimport {\n resolveXmlRecursive,\n fetchChunksWithSourceSupport,\n fetchXmlChunksFromChunkedStorage,\n} from \"./xmlStorage\";\nimport { parseNetReferences, containsXmlReferences } from \"../utils/xmlUtils\";\nimport { getStorageKeyBytes } from \"../utils/keyUtils\";\nimport {\n STORAGE_CONTRACT,\n CHUNKED_STORAGE_CONTRACT,\n CHUNKED_STORAGE_READER_CONTRACT,\n STORAGE_ROUTER_CONTRACT,\n} from \"../constants\";\nimport type {\n StorageData,\n BulkStorageKey,\n BulkStorageResult,\n StorageClientOptions,\n} from \"../types\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport { normalizeDataOrEmpty } from \"@net-protocol/core\";\nimport { keccak256HashString } from \"@net-protocol/core\";\nimport {\n processDataForStorage,\n generateXmlMetadata,\n} from \"../utils/writingUtils\";\nimport { chunkDataForStorage } from \"../utils/chunkUtils\";\n\n/**\n * StorageClient - Client for interacting with Net protocol storage\n *\n * **Pattern for client methods:**\n * - Client methods never require `chainId` in their parameters\n * - All methods use `this.chainId` internally (set during construction)\n * - Config builders receive `chainId` as a separate required parameter\n * - This ensures consistency: the client's `chainId` is the single source of truth\n */\nexport class StorageClient {\n private client: PublicClient;\n private chainId: number;\n\n constructor(params: StorageClientOptions) {\n this.client = getPublicClient({\n chainId: params.chainId,\n rpcUrl: params.overrides?.rpcUrls,\n });\n this.chainId = params.chainId;\n }\n\n /**\n * Get storage value for a key and operator (latest version)\n */\n async get(params: {\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<StorageData | null> {\n const config = getStorageReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n keyFormat: params.keyFormat,\n });\n\n try {\n const result = (await readContract(this.client, config)) as [\n string,\n string\n ];\n const [text, value] = result;\n return { text, value };\n } catch {\n return null;\n }\n }\n\n /**\n * Get storage value at a specific historical index\n */\n async getValueAtIndex(params: {\n key: string;\n operator: string;\n index: number;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<StorageData | null> {\n const config = getStorageValueAtIndexReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n try {\n const result = (await readContract(this.client, config)) as [\n string,\n string\n ];\n const [text, value] = result;\n return { text, value };\n } catch {\n return null;\n }\n }\n\n /**\n * Get total number of writes (versions) for a key-operator pair\n * Tries ChunkedStorageReader first, then Storage\n */\n async getTotalWrites(params: {\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<number> {\n // Try ChunkedStorageReader first\n try {\n const config = getChunkedStorageTotalWritesReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n keyFormat: params.keyFormat,\n });\n const count = await readContract(this.client, config);\n return Number(count);\n } catch {\n // Fall back to Storage\n try {\n const config = getStorageTotalWritesReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n keyFormat: params.keyFormat,\n });\n const count = await readContract(this.client, config);\n return Number(count);\n } catch {\n return 0;\n }\n }\n }\n\n /**\n * Bulk get storage values\n */\n async bulkGet(params: {\n keys: BulkStorageKey[];\n safe?: boolean;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<BulkStorageResult[]> {\n const config = getStorageBulkGetReadConfig({\n chainId: this.chainId,\n keys: params.keys,\n safe: params.safe,\n keyFormat: params.keyFormat,\n });\n\n try {\n const results = await readContract(this.client, config);\n return (results as any[]).map((r) => ({\n text: r[0],\n value: r[1],\n })) as BulkStorageResult[];\n } catch {\n return [];\n }\n }\n\n /**\n * Get storage value via StorageRouter (latest version)\n * Returns data with storage type indication\n */\n async getViaRouter(params: {\n key: string;\n operator: string;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<{\n isChunkedStorage: boolean;\n text: string;\n data: string;\n } | null> {\n const config = getStorageRouterReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n keyFormat: params.keyFormat,\n });\n\n try {\n const result = await readContract(this.client, config);\n const [isChunkedStorage, text, data] = result as [\n boolean,\n string,\n `0x${string}`\n ];\n\n // If chunked, decode chunk count and return assembled data\n if (isChunkedStorage) {\n const [chunkCount] = decodeAbiParameters([{ type: \"uint8\" }], data);\n if (chunkCount === 0) {\n return { isChunkedStorage: true, text, data: \"\" };\n }\n\n // Fetch and assemble chunks\n const chunks = await this.getChunked({\n key: params.key,\n operator: params.operator,\n start: 0,\n end: Number(chunkCount),\n keyFormat: params.keyFormat,\n });\n\n const assembled = assembleChunks(chunks);\n return {\n isChunkedStorage: true,\n text,\n data: assembled || \"\",\n };\n }\n\n // Regular storage\n return {\n isChunkedStorage: false,\n text,\n data: hexToString(data),\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get chunked storage metadata\n */\n async getChunkedMetadata(params: {\n key: string;\n operator: string;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<{ chunkCount: number; originalText: string } | null> {\n const config = getChunkedStorageMetadataReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n try {\n const result = await readContract(this.client, config);\n const [chunkCount, originalText] = result as [number, string];\n return { chunkCount, originalText };\n } catch {\n return null;\n }\n }\n\n /**\n * Get chunked storage chunks\n */\n async getChunked(params: {\n key: string;\n operator: string;\n start: number;\n end: number;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<string[]> {\n const config = getChunkedStorageChunksReadConfig({\n chainId: this.chainId,\n key: params.key,\n operator: params.operator,\n start: params.start,\n end: params.end,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n try {\n const chunks = await readContract(this.client, config);\n return chunks as string[];\n } catch {\n return [];\n }\n }\n\n /**\n * Get chunked storage at a specific historical index\n */\n async getChunkedAtIndex(params: {\n key: string;\n operator: string;\n start: number;\n end: number;\n index: number;\n }): Promise<string[]> {\n return this.getChunked({\n ...params,\n index: params.index,\n });\n }\n\n /**\n * Get all storage keys for an operator using Net contract\n */\n async getForOperator(params: {\n operator: string;\n }): Promise<Array<[string, string, number, string]>> {\n const netContract = getNetContract(this.chainId);\n\n // Get total count\n const totalCount = await readContract(this.client, {\n abi: netContract.abi,\n address: netContract.address,\n functionName: \"getTotalMessagesForAppUserCount\",\n args: [STORAGE_CONTRACT.address, params.operator],\n });\n\n const totalCountNumber = Number(totalCount);\n\n if (totalCountNumber === 0) {\n return [];\n }\n\n // Get all messages\n const messages = await readContract(this.client, {\n abi: netContract.abi,\n address: netContract.address,\n functionName: \"getMessagesInRangeForAppUser\",\n args: [0, totalCountNumber, STORAGE_CONTRACT.address, params.operator],\n });\n\n return (messages as any[]).map((msg) => [\n msg.topic,\n msg.text,\n Number(msg.timestamp),\n msg.data,\n ]);\n }\n\n /**\n * Get storage value for operator and key\n */\n async getForOperatorAndKey(params: {\n operator: string;\n key: string;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<StorageData | null> {\n const storageKeyBytes = getStorageKeyBytes(\n params.key,\n params.keyFormat\n ) as `0x${string}`;\n\n try {\n const result = (await readContract(this.client, {\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"getForOperatorAndKey\",\n args: [params.operator, storageKeyBytes],\n })) as [string, string];\n const [text, value] = result;\n return { text, value };\n } catch {\n return null;\n }\n }\n\n /**\n * Read storage data with XML resolution\n */\n async readStorageData(params: {\n key: string;\n operator: string;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<{ text: string; data: string; isXml: boolean }> {\n // Get data via router (latest) or direct (historical)\n let text: string;\n let data: string;\n let isChunkedStorage: boolean;\n\n if (params.index !== undefined) {\n // Historical: try chunked first, then regular\n const chunkedMeta = await this.getChunkedMetadata({\n key: params.key,\n operator: params.operator,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n if (chunkedMeta && chunkedMeta.chunkCount > 0) {\n isChunkedStorage = true;\n text = chunkedMeta.originalText;\n const chunks = await this.getChunked({\n key: params.key,\n operator: params.operator,\n start: 0,\n end: chunkedMeta.chunkCount,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n const assembled = assembleChunks(chunks);\n data = assembled || \"\";\n } else {\n // Try regular storage\n const result = await this.getValueAtIndex({\n key: params.key,\n operator: params.operator,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n if (!result) {\n throw new Error(\"StoredDataNotFound\");\n }\n isChunkedStorage = false;\n const resultObj = result as StorageData;\n text = resultObj.text;\n data = hexToString(resultObj.value as `0x${string}`);\n }\n } else {\n // Latest: use router\n const result = await this.getViaRouter({\n key: params.key,\n operator: params.operator,\n keyFormat: params.keyFormat,\n });\n if (!result) {\n throw new Error(\"StoredDataNotFound\");\n }\n isChunkedStorage = result.isChunkedStorage;\n text = result.text;\n data = result.data;\n }\n\n // Resolve XML if needed\n const isXml = containsXmlReferences(data);\n if (isXml) {\n const resolvedData = await resolveXmlRecursive(\n data,\n params.operator,\n this.client,\n 3, // MAX_XML_DEPTH\n new Set()\n );\n return { text, data: resolvedData, isXml: true };\n }\n\n return { text, data, isXml: false };\n }\n\n /**\n * Read chunked storage data with decompression\n */\n async readChunkedStorage(params: {\n key: string;\n operator: string;\n index?: number;\n keyFormat?: \"raw\" | \"bytes32\";\n }): Promise<{ text: string; data: string }> {\n const metadata = await this.getChunkedMetadata({\n key: params.key,\n operator: params.operator,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n if (!metadata) {\n throw new Error(\"ChunkedStorage metadata not found\");\n }\n\n if (metadata.chunkCount === 0) {\n return { text: metadata.originalText, data: \"\" };\n }\n\n const chunks = await this.getChunked({\n key: params.key,\n operator: params.operator,\n start: 0,\n end: metadata.chunkCount,\n index: params.index,\n keyFormat: params.keyFormat,\n });\n\n const assembled = assembleChunks(chunks);\n return {\n text: metadata.originalText,\n data: assembled || \"\",\n };\n }\n\n /**\n * Validate storage parameters\n */\n private validateStorageParams(params: {\n key: string | `0x${string}`;\n chunks?: string[];\n }) {\n if (\n !params.key ||\n (typeof params.key === \"string\" && params.key.length === 0)\n ) {\n throw new Error(\"Storage key cannot be empty\");\n }\n\n if (params.chunks && params.chunks.length === 0) {\n throw new Error(\"Chunks array cannot be empty\");\n }\n\n if (params.chunks && params.chunks.length > 255) {\n throw new Error(\n `Too many chunks: ${params.chunks.length} exceeds maximum of 255`\n );\n }\n }\n\n /**\n * Prepare transaction configs for storing XML chunks in ChunkedStorage backend.\n * Each XML chunk is compressed and chunked into 20KB ChunkedStorage chunks.\n */\n private prepareXmlChunksForChunkedStorage(params: {\n xmlChunks: string[];\n operatorAddress: `0x${string}`;\n }): {\n transactionConfigs: WriteTransactionConfig[];\n chunkedStorageHashes: string[];\n xmlMetadata: string;\n } {\n const chunkedStorageHashes: string[] = [];\n const transactionConfigs: WriteTransactionConfig[] = [];\n\n // Store each XML chunk in ChunkedStorage\n for (const xmlChunk of params.xmlChunks) {\n // Compress and chunk the XML chunk into 20KB ChunkedStorage chunks\n const chunks = chunkDataForStorage(xmlChunk);\n\n // Generate storage key for this XML chunk's ChunkedStorage entry\n // This will be the key used in XML metadata to reference this XML chunk\n const chunkedHash = keccak256HashString(\n xmlChunk + params.operatorAddress\n );\n chunkedStorageHashes.push(chunkedHash);\n\n // Create ChunkedStorage transaction config\n const config = this.prepareChunkedPut({\n key: chunkedHash,\n text: \"\",\n chunks,\n });\n\n transactionConfigs.push(config);\n }\n\n // Generate XML metadata pointing to ChunkedStorage hashes\n // Always include i=\"0\" for initial storage (first version)\n const xmlMetadata = generateXmlMetadata(\n chunkedStorageHashes,\n 0,\n params.operatorAddress\n );\n\n return {\n transactionConfigs,\n chunkedStorageHashes,\n xmlMetadata,\n };\n }\n\n /**\n * Prepare transaction config for storing a single value in Storage contract.\n */\n preparePut(params: {\n key: string | `0x${string}`;\n text: string;\n value: string | `0x${string}`;\n keyFormat?: \"raw\" | \"bytes32\";\n }): WriteTransactionConfig {\n this.validateStorageParams({ key: params.key });\n\n const keyBytes32 = getStorageKeyBytes(\n params.key,\n params.keyFormat\n ) as `0x${string}`;\n const valueHex = normalizeDataOrEmpty(params.value);\n\n return {\n to: STORAGE_CONTRACT.address,\n functionName: \"put\",\n args: [keyBytes32, params.text, valueHex],\n abi: STORAGE_CONTRACT.abi,\n };\n }\n\n /**\n * Prepare transaction config for storing data in ChunkedStorage contract.\n */\n prepareChunkedPut(params: {\n key: string | `0x${string}`;\n text: string;\n chunks: string[];\n keyFormat?: \"raw\" | \"bytes32\";\n }): WriteTransactionConfig {\n this.validateStorageParams({ key: params.key, chunks: params.chunks });\n\n const keyBytes32 = getStorageKeyBytes(\n params.key,\n params.keyFormat\n ) as `0x${string}`;\n\n // Validate chunks are hex strings\n for (const chunk of params.chunks) {\n if (!chunk.startsWith(\"0x\")) {\n throw new Error(`Invalid chunk format: ${chunk} must be a hex string`);\n }\n }\n\n return {\n to: CHUNKED_STORAGE_CONTRACT.address,\n functionName: \"put\",\n args: [keyBytes32, params.text, params.chunks],\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n };\n }\n\n /**\n * Prepare transaction config for bulk storage operations using Storage.bulkPut.\n */\n prepareBulkPut(params: {\n entries: Array<{\n key: string | `0x${string}`;\n text: string;\n value: string | `0x${string}`;\n }>;\n keyFormat?: \"raw\" | \"bytes32\";\n }): WriteTransactionConfig {\n if (params.entries.length === 0) {\n throw new Error(\"Entries array cannot be empty\");\n }\n\n // Convert all entries\n const bulkEntries = params.entries.map((entry) => {\n this.validateStorageParams({ key: entry.key });\n const keyBytes32 = getStorageKeyBytes(\n entry.key,\n params.keyFormat\n ) as `0x${string}`;\n const valueHex = normalizeDataOrEmpty(entry.value);\n\n return {\n key: keyBytes32,\n text: entry.text,\n value: valueHex,\n };\n });\n\n return {\n to: STORAGE_CONTRACT.address,\n functionName: \"bulkPut\",\n args: [bulkEntries],\n abi: STORAGE_CONTRACT.abi,\n };\n }\n\n /**\n * Prepare transaction configs for XML storage (multiple transactions - metadata + chunks).\n */\n prepareXmlStorage(params: {\n data: string;\n operatorAddress: `0x${string}`;\n storageKey?: string | `0x${string}`;\n filename?: string;\n useChunkedStorageBackend?: boolean; // Default: true\n keyFormat?: \"raw\" | \"bytes32\";\n }): {\n transactionConfigs: WriteTransactionConfig[];\n topLevelHash: string;\n metadata: string;\n } {\n // Process data: chunk it and generate hashes\n const result = processDataForStorage(\n params.data,\n params.operatorAddress,\n params.storageKey\n );\n\n if (!result.valid) {\n throw new Error(result.error || \"Failed to process data for storage\");\n }\n\n // Use ChunkedStorage backend by default\n const useChunkedStorageBackend = params.useChunkedStorageBackend !== false;\n\n if (useChunkedStorageBackend) {\n // Prepare XML chunks for ChunkedStorage backend\n const chunkedResult = this.prepareXmlChunksForChunkedStorage({\n xmlChunks: result.chunks,\n operatorAddress: params.operatorAddress,\n });\n\n // Create metadata transaction (Storage.put with XML metadata)\n const metadataConfig = this.preparePut({\n key: result.topLevelHash,\n text: params.filename || \"\",\n value: chunkedResult.xmlMetadata,\n keyFormat: params.keyFormat,\n });\n\n // Combine transactions: metadata first, then chunk transactions\n return {\n transactionConfigs: [\n metadataConfig,\n ...chunkedResult.transactionConfigs,\n ],\n topLevelHash: result.topLevelHash,\n metadata: chunkedResult.xmlMetadata,\n };\n } else {\n // Legacy mode: store XML chunks directly in Storage\n // This is not commonly used but kept for backward compatibility\n const chunkConfigs: WriteTransactionConfig[] = result.chunkHashes.map(\n (hash, index) =>\n this.preparePut({\n key: hash,\n text: \"\",\n value: result.chunks[index],\n keyFormat: params.keyFormat,\n })\n );\n\n // Create metadata transaction\n const metadataConfig = this.preparePut({\n key: result.topLevelHash,\n text: params.filename || \"\",\n value: result.xmlMetadata,\n keyFormat: params.keyFormat,\n });\n\n return {\n transactionConfigs: [metadataConfig, ...chunkConfigs],\n topLevelHash: result.topLevelHash,\n metadata: result.xmlMetadata,\n };\n }\n }\n}\n"]}
|