@zama-fhe/sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +28 -0
- package/README.md +649 -0
- package/dist/chunk-AJFSZ47V.js +5115 -0
- package/dist/chunk-AJFSZ47V.js.map +1 -0
- package/dist/chunk-UE6IBC3M.js +101 -0
- package/dist/chunk-UE6IBC3M.js.map +1 -0
- package/dist/chunk-VRLLWHHL.js +278 -0
- package/dist/chunk-VRLLWHHL.js.map +1 -0
- package/dist/ethers/index.d.ts +37 -0
- package/dist/ethers/index.js +131 -0
- package/dist/ethers/index.js.map +1 -0
- package/dist/index.d.ts +32910 -0
- package/dist/index.js +2862 -0
- package/dist/index.js.map +1 -0
- package/dist/node/index.d.ts +158 -0
- package/dist/node/index.js +317 -0
- package/dist/node/index.js.map +1 -0
- package/dist/relayer-sdk.node-worker.d.ts +2 -0
- package/dist/relayer-sdk.node-worker.js +320 -0
- package/dist/relayer-sdk.node-worker.js.map +1 -0
- package/dist/relayer-sdk.types-CFkzNzRy.d.ts +293 -0
- package/dist/relayer-sdk.worker.d.ts +2 -0
- package/dist/relayer-sdk.worker.js +401 -0
- package/dist/relayer-sdk.worker.js.map +1 -0
- package/dist/relayer-utils-D_3834H0.d.ts +46 -0
- package/dist/token.types-CRs1iJh7.d.ts +447 -0
- package/dist/viem/index.d.ts +38 -0
- package/dist/viem/index.js +137 -0
- package/dist/viem/index.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/worker/worker.client.ts","../src/relayer/relayer-web.ts","../src/abi/batch-swap.abi.ts","../src/events.ts","../src/token/credential-manager.ts","../src/token/readonly-token.ts","../src/token/token.ts","../src/token/token-sdk.ts","../src/token/memory-storage.ts","../src/token/indexeddb-storage.ts","../src/activity.ts"],"names":[],"mappings":";;;;;;;;AAyBO,IAAM,mBAAA,GAAN,cAAkC,gBAAA,CAA6C;AAAA,EACpF,YAAY,MAAA,EAA4B;AACtC,IAAA,KAAA,CAAM,MAAA,EAAQ,OAAO,MAAM,CAAA;AAAA,EAC7B;AAAA,EAEU,YAAA,GAAuB;AAC/B,IAAA,OAAO,IAAI,MAAA,CAAO,IAAI,IAAI,yBAAA,EAA2B,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAAA,EACvE;AAAA,EAEU,WAAW,MAAA,EAAsB;AACzC,IAAA,MAAA,CAAO,YAAY,CAAC,KAAA,KAClB,IAAA,CAAK,cAAA,CAAe,MAAM,IAAI,CAAA;AAChC,IAAA,MAAA,CAAO,UAAU,CAAC,KAAA,KAAsB,IAAA,CAAK,iBAAA,CAAkB,MAAM,OAAO,CAAA;AAC5E,IAAA,MAAA,CAAO,cAAA,GAAiB,MAAM,IAAA,CAAK,wBAAA,EAAyB;AAAA,EAC9D;AAAA,EAEU,WAAA,CAAY,QAAgB,OAAA,EAA8B;AAClE,IAAA,MAAA,CAAO,YAAY,OAAO,CAAA;AAAA,EAC5B;AAAA,EAEU,gBAAgB,MAAA,EAAsB;AAC9C,IAAA,MAAA,CAAO,SAAA,EAAU;AAAA,EACnB;AAAA,EAEU,iBAAA,GAA4B;AACpC,IAAA,OAAO,OAAO,UAAA,EAAW;AAAA,EAC3B;AAAA,EAEU,cAAA,GAGR;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAK,MAAA,EAAO;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,SAAA,EAAkC;AACjD,IAAA,MAAM,IAAA,CAAK,WAAA,CAAoC,aAAA,EAAe,EAAE,WAAW,CAAA;AAAA,EAC7E;AACF,CAAA;;;AC5CA,IAAM,mBAAA,GAAsB,OAAA;AAC5B,IAAM,OAAA,GAAU,uCAAuC,mBAAmB,CAAA,uBAAA,CAAA;AAE1E,IAAM,aAAA,GACJ,kGAAA;AAMK,IAAM,aAAN,MAAuC;AAAA,EAC5C,aAAA,GAA4C,IAAA;AAAA,EAC5C,YAAA,GAAoD,IAAA;AAAA,EACpD,WAAA,GAAmD,IAAA;AAAA,EACnD,WAAA,GAAc,KAAA;AAAA,EACd,gBAAA,GAAkC,IAAA;AAAA,EACzB,OAAA;AAAA,EAET,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA,EAEA,MAAM,gBAAA,GAAgD;AACpD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAW;AAC9C,IAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,IAAA,CAAK,OAAA;AAEtC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,WAAA,EAAa,gBAAA,CAAiB,OAAA,EAAS,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,MAC1D,SAAA,EAAW,QAAA,EAAU,YAAA,IAAe,IAAK,EAAA;AAAA,MACzC,SAAA,EAAW,QAAA,EAAU,cAAA,KAAmB,KAAA,GAAQ,MAAA,GAAY,aAAA;AAAA,MAC5D,MAAA,EAAQ,KAAK,OAAA,CAAQ;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,GAA8C;AAClD,IAAA,IAAI,IAAA,CAAK,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAClC,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,kBAAA,EAAmB;AAC3C,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,WAAA;AAAA,IACpB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,kBAAA,GAAmD;AACvD,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,sBAAsB,gCAAgC,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAW;AAG9C,IAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,IAAA,IAAQ,OAAA,KAAY,KAAK,gBAAA,EAAkB;AACvE,MAAA,IAAA,CAAK,eAAe,SAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAEA,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAA;AAExB,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,IAAA,CAAK,eAAe,IAAA,CAAK,WAAA,EAAY,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AACtD,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,QAAA,MAAM,KAAA,YAAiB,UAAA,GACnB,KAAA,GACA,IAAI,sBAAsB,iCAAA,EAAmC;AAAA,UAC3D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,SACzC,CAAA;AAAA,MACP,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAA4C;AAChD,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,gBAAA,EAAiB;AACjD,IAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,YAAY,CAAA;AACnD,IAAA,MAAM,OAAO,UAAA,EAAW;AAExB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAA,CAAO,SAAA,EAAU;AACjB,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,cAAc,SAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAA,GAAmC;AACvC,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,gBAAe,IAAK,EAAA;AACzD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,KAAK,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAAuC;AAC3C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,EAAgB;AAC5C,IAAA,OAAO;AAAA,MACL,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,YAAY,MAAA,CAAO;AAAA,KACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,SAAA,EACA,iBAAA,EACA,cAAA,EACA,eAAuB,CAAA,EACG;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,MACvC,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,IAAA,EAAM,OAAO,MAAA,CAAO,IAAA;AAAA,MACpB,OAAA,EAAS,OAAO,MAAA,CAAO,OAAA;AAAA,MACvB,OAAA,EAAS,OAAO,MAAA,CAAO,OAAA;AAAA,MACvB,iBAAA,EAAmB,OAAO,MAAA,CAAO;AAAA,KACnC;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,YAAA,EAAc,sBAAsB,MAAM,CAAA;AAAA,QAC1C,8BAAA,EAAgC,OAAO,KAAA,CAAM;AAAA,OAC/C;AAAA,MACA,OAAA,EAAS;AAAA,QACP,SAAA,EAAW,OAAO,OAAA,CAAQ,SAAA;AAAA,QAC1B,iBAAA,EAAmB,OAAO,OAAA,CAAQ,iBAAA;AAAA,QAClC,cAAA,EAAgB,OAAO,OAAA,CAAQ,cAAA;AAAA,QAC/B,YAAA,EAAc,OAAO,OAAA,CAAQ,YAAA;AAAA,QAC7B,SAAA,EAAW,OAAO,OAAA,CAAQ;AAAA;AAC5B,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,MAAA,EAA+C;AAC3D,IAAA,MAAM,EAAE,MAAA,EAAQ,eAAA,EAAiB,WAAA,EAAY,GAAI,MAAA;AAEjD,IAAA,OAAO,UAAU,YAAY;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,MAAA,MAAM,KAAK,iBAAA,EAAkB;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,EAAE,MAAA,EAAQ,eAAA,EAAiB,aAAa,CAAA;AAC5E,MAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,UAAA,EAAY,OAAO,UAAA,EAAW;AAAA,IAClE,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,MAAA,EAA4D;AAC5E,IAAA,OAAO,UAAU,YAAY;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,MAAA,MAAM,KAAK,iBAAA,EAAkB;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA;AAC9C,MAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,OAAA,EAAiD;AACnE,IAAA,OAAO,UAAU,YAAY;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,MAAA,MAAM,KAAK,iBAAA,EAAkB;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,aAAA,CAAc,OAAO,CAAA;AACjD,MAAA,OAAO;AAAA,QACL,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,uBAAuB,MAAA,CAAO,qBAAA;AAAA,QAC9B,iBAAiB,MAAA,CAAO;AAAA,OAC1B;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gCAAA,CACJ,SAAA,EACA,mBACA,gBAAA,EACA,cAAA,EACA,eAAuB,CAAA,EACqB;AAC5C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,IAAA,OAAO,OAAO,gCAAA,CAAiC;AAAA,MAC7C,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,gBAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAqB,MAAA,EAAqE;AAC9F,IAAA,OAAO,UAAU,YAAY;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,MAAA,MAAM,KAAK,iBAAA,EAAkB;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,oBAAA,CAAqB,MAAM,CAAA;AACvD,MAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,2BAA2B,OAAA,EAAoD;AACnF,IAAA,OAAO,UAAU,YAAY;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,MAAA,MAAM,KAAK,iBAAA,EAAkB;AAC7B,MAAA,OAAO,MAAA,CAAO,2BAA2B,OAAO,CAAA;AAAA,IAClD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAGI;AACR,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,IAAA,OAAA,CAAQ,MAAM,MAAA,CAAO,YAAA,EAAa,EAAG,MAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,IAAA,EACsE;AACtE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,EAAc;AACxC,IAAA,OAAA,CAAQ,MAAM,MAAA,CAAO,eAAA,CAAgB,IAAI,CAAA,EAAG,MAAA;AAAA,EAC9C;AACF;;;AClTO,IAAM,cAAA,GAAiB;AAAA,EAC5B;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,gCAAA;AAAA,QACd,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,sCAAA;AAAA,QACd,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,sCAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,8BAAA;AAAA,QACd,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,8BAAA;AAAA,QACd,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,mBAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,qBAAA;AAAA,QACd,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,gBAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,4BAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,oBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,yBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,mBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,sBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,sBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,qBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,oBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,kBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,iBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,wBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,qBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,4BAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,oBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,qBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,0BAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,kBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,qBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,yBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,aAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,kBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,iBAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,uBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,iBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,aAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,YAAA,EAAc,QAAA;AAAA,QACd,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,YAAA,EAAc,QAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,YAAA,EAAc,QAAA;AAAA,QACd,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,+BAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,eAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,0BAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,eAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,sBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,kBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,IAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,iBAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,OAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,OAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,wBAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,gCAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,eAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,eAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,sCAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,8BAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,0BAAA;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,yBAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,QAAA;AAAA,QACd,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,QAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,iBAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,mBAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,WAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,MAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,MAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,MAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,OAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,gCAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,OAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,aAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,OAAA;AAAA,QACd,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,2BAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,MAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,YAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,oBAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,mBAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,IAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,cAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,YAAA,EAAc,QAAA;AAAA,QACd,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,2BAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,qBAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,cAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,qBAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,sCAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP;AAAA,QACE,YAAA,EAAc,8BAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,mBAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,UAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,eAAA,EAAiB,SAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV;;;AC7gCO,IAAM,MAAA,GAAS;AAAA;AAAA,EAEpB,oBAAA,EAAsB,oEAAA;AAAA;AAAA,EAEtB,OAAA,EAAS,oEAAA;AAAA;AAAA,EAET,eAAA,EAAiB,oEAAA;AAAA;AAAA,EAEjB,kBAAA,EAAoB,oEAAA;AAAA;AAAA,EAEpB,gBAAA,EAAkB;AACpB;AA2FA,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,OAAO,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAC/B;AAEA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAAS,eAAe,KAAA,EAAuB;AAE7C,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,MAAA,CAAO,MAAc,KAAA,EAAuB;AAEnD,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,GAAQ,EAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,EAAE,CAAA;AACzC,EAAA,OAAO,KAAK,MAAA,KAAW,EAAA,GAAK,OAAO,IAAA,CAAK,MAAA,CAAO,IAAI,GAAG,CAAA;AACxD;AAEA,SAAS,aAAA,CAAc,MAAc,KAAA,EAAuB;AAC1D,EAAA,OAAO,OAAO,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA,CAAE,MAAM,GAAG,CAAA;AAC7C;AAEA,SAAS,YAAA,CAAa,MAAc,KAAA,EAAuB;AACzD,EAAA,OAAO,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,EAAM,KAAK,CAAC,CAAA;AAC1C;AAEA,SAAS,UAAA,CAAW,MAAc,KAAA,EAAwB;AACxD,EAAA,OAAO,OAAO,IAAA,GAAO,MAAA,CAAO,IAAA,EAAM,KAAK,CAAC,CAAA,KAAM,EAAA;AAChD;AAEA,SAAS,aAAA,CAAc,MAAc,KAAA,EAAwB;AAC3D,EAAA,OAAO,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,EAAM,KAAK,CAAC,CAAA,CAAA;AACjC;AAUO,SAAS,2BAA2B,GAAA,EAA+C;AACxF,EAAA,IAAI,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,sBAAsB,OAAO,IAAA;AAC1D,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAElC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,sBAAA;AAAA,IACX,IAAA,EAAM,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,IACnC,EAAA,EAAI,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,IACjC,qBAAA,EAAuB,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE;AAAA,GACtD;AACF;AAOO,SAAS,cAAc,GAAA,EAAkC;AAC9D,EAAA,IAAI,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,SAAS,OAAO,IAAA;AAC7C,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAElC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,SAAA;AAAA,IACX,EAAA,EAAI,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,IACjC,QAAA,EAAU,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,IACtC,UAAA,EAAY,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IACpC,QAAA,EAAU,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IAClC,SAAA,EAAW,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,CAAC;AAAA,GACrC;AACF;AAOO,SAAS,sBAAsB,GAAA,EAA0C;AAC9E,EAAA,IAAI,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,iBAAiB,OAAO,IAAA;AACrD,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAElC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,iBAAA;AAAA,IACX,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,IACvC,eAAA,EAAiB,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,CAAC;AAAA,GAC5C;AACF;AAQO,SAAS,yBAAyB,GAAA,EAA6C;AACpF,EAAA,IAAI,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,oBAAoB,OAAO,IAAA;AACxD,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAElC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,oBAAA;AAAA,IACX,iBAAA,EAAmB,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,IAChD,QAAA,EAAU,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,IACtC,eAAA,EAAiB,UAAA,CAAW,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC,kBAAA,EAAoB,UAAA,CAAW,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IAC1C,UAAA,EAAY,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IACpC,YAAA,EAAc,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IACtC,SAAA,EAAW,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,CAAC;AAAA,GACrC;AACF;AAQO,SAAS,uBAAuB,GAAA,EAA2C;AAChF,EAAA,IAAI,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,kBAAkB,OAAO,IAAA;AACtD,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAElC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,kBAAA;AAAA,IACX,SAAA,EAAW,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,IACvC,IAAA,EAAM,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,IAClC,EAAA,EAAI,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,IACjC,SAAA,EAAW,UAAA,CAAW,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IACjC,MAAA,EAAQ,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IACjC,eAAA,EAAiB,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,IAC1C,UAAA,EAAY,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,CAAC;AAAA,GACvC;AACF;AAiBO,SAAS,iBAAiB,GAAA,EAAgC;AAC/D,EAAA,OACE,0BAAA,CAA2B,GAAG,CAAA,IAC9B,aAAA,CAAc,GAAG,CAAA,IACjB,qBAAA,CAAsB,GAAG,CAAA,IACzB,wBAAA,CAAyB,GAAG,CAAA,IAC5B,uBAAuB,GAAG,CAAA;AAE9B;AAUO,SAAS,kBAAkB,IAAA,EAAuC;AACvE,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,iBAAiB,GAAG,CAAA;AAClC,IAAA,IAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,oBAAoB,IAAA,EAAsD;AACxF,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,sBAAsB,GAAG,CAAA;AACvC,IAAA,IAAI,OAAO,OAAO,KAAA;AAAA,EACpB;AACA,EAAA,OAAO,IAAA;AACT;AAWO,SAAS,YAAY,IAAA,EAA8C;AACxE,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,IAAA,IAAI,OAAO,OAAO,KAAA;AAAA,EACpB;AACA,EAAA,OAAO,IAAA;AACT;AAOO,IAAM,YAAA,GAAe;AAAA,EAC1B,MAAA,CAAO,oBAAA;AAAA,EACP,MAAA,CAAO,OAAA;AAAA,EACP,MAAA,CAAO,eAAA;AAAA,EACP,MAAA,CAAO,kBAAA;AAAA,EACP,MAAA,CAAO;AACT;;;AC3TO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA,GAAoD,IAAA;AAAA,EACpD,iBAAA,GAAmC,IAAA;AAAA,EAEnC,YAAY,MAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,GAAA;AACnB,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,MAAA;AACtB,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,OAAA;AACvB,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,YAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,IAAI,eAAA,EAAsD;AAC9D,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,eAAe,CAAC,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAO,iBAAA,EAA0D;AACrE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,EAAU;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,QAAQ,CAAA;AACnD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AACnC,QAAA,IAAA,CAAK,4BAA4B,SAAS,CAAA;AAC1C,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA;AACtD,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,iBAAiB,CAAA,EAAG;AAC3C,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,iBAAA,CAAkB,KAAA,GAAQ,IAAA,EAAK,CAAE,KAAK,GAAG,CAAA;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,sBAAsB,GAAA,EAAK;AAC1D,MAAA,IAAA,CAAK,iBAAA,GAAoB,GAAA;AACzB,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,MAAA,CAAO,iBAAiB,CAAA,CAAE,QAAQ,MAAM;AACjE,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,MAC3B,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,UAAU,eAAA,EAA6C;AAC3D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,EAAU;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,QAAQ,CAAA;AACnD,MAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AACnC,MAAA,IAAA,CAAK,4BAA4B,SAAS,CAAA;AAC1C,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA;AAEtD,MAAA,MAAM,iBAAA,GAAoB,eAAA,GAAkB,CAAC,eAAe,IAAI,EAAC;AACjE,MAAA,OAAO,CAAC,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,iBAAiB,CAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,EAAU;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAAA,GAA6B;AACjC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,WAAA,EAAY;AAC9D,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AACpF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAI,WAAW,IAAI,CAAC,EACxC,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CAAA;AACV,IAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACxB;AAAA;AAAA,EAIA,4BAA4B,IAAA,EAAqD;AAC/E,IAAA,YAAA,CAAa,MAAM,oBAAoB,CAAA;AACvC,IAAA,YAAA,CAAa,IAAA,CAAK,WAAW,uBAAuB,CAAA;AACpD,IAAA,WAAA,CAAY,IAAA,CAAK,mBAAmB,+BAA+B,CAAA;AACnE,IAAA,YAAA,CAAa,IAAA,CAAK,qBAAqB,iCAAiC,CAAA;AACxE,IAAA,YAAA,CAAa,IAAA,CAAK,mBAAA,CAAoB,EAAA,EAAI,wBAAwB,CAAA;AAClE,IAAA,YAAA,CAAa,IAAA,CAAK,mBAAA,CAAoB,UAAA,EAAY,gCAAgC,CAAA;AAAA,EACpF;AAAA,EAEA,QAAA,CAAS,OAA0B,iBAAA,EAAuC;AACxE,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAC/C,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAM,YAAA,GAAe,KAAA;AAC9D,IAAA,IAAI,UAAA,IAAc,WAAW,OAAO,KAAA;AAEpC,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,iBAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAC7E,IAAA,OAAO,iBAAA,CAAkB,MAAM,CAAC,IAAA,KAAS,UAAU,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,OAAO,iBAAA,EAA0D;AACrE,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,CAAK,eAAA,EAAgB;AAChD,MAAA,MAAM,iBAAiB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAEnD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,YAAA;AAAA,QAC7B,OAAA,CAAQ,SAAA;AAAA,QACR,iBAAA;AAAA,QACA,cAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAc,MAAM,CAAA;AAEzD,MAAA,MAAM,KAAA,GAA2B;AAAA,QAC/B,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,SAAA;AAAA,QACA,iBAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAc,IAAA,CAAK;AAAA,OACrB;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,EAAU;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AACtD,QAAA,MAAM,KAAK,QAAA,CAAS,OAAA,CAAQ,UAAU,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,MACjE,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,aACH,KAAA,YAAiB,KAAA,IAAS,UAAU,KAAA,IAAS,KAAA,CAAM,SAAS,IAAA,IAC5D,KAAA,YAAiB,KAAA,KACf,KAAA,CAAM,QAAQ,QAAA,CAAS,UAAU,KAAK,KAAA,CAAM,OAAA,CAAQ,SAAS,QAAQ,CAAA,CAAA;AAC1E,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,IAAI,qBAAqB,mDAAA,EAAqD;AAAA,UAClF,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AACA,MAAA,MAAM,IAAI,mBAAmB,sCAAA,EAAwC;AAAA,QACnE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,oBAAoB,KAAA,EAAyD;AACjF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,WAAA,EAAY;AAC9D,IAAA,MAAM,mBAAA,GAAsB,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,UAAA,EAAY,KAAA,CAAM,WAAW,OAAO,CAAA;AAC1F,IAAA,MAAM,EAAE,UAAA,EAAY,CAAA,EAAG,GAAG,MAAK,GAAI,KAAA;AACnC,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,mBAAA,EAAoB;AAAA,EACxC;AAAA,EAEA,MAAM,oBAAoB,SAAA,EAA6D;AACrF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,WAAA,EAAY;AAC9D,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA;AAAA,MAC5B,SAAA,CAAU,mBAAA;AAAA,MACV,SAAA,CAAU,SAAA;AAAA,MACV;AAAA,KACF;AACA,IAAA,MAAM,EAAE,mBAAA,EAAqB,CAAA,EAAG,GAAG,MAAK,GAAI,SAAA;AAC5C,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,UAAA,EAAW;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CAAW,SAAA,EAAmB,OAAA,EAAqC;AACvE,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,MACtC,KAAA;AAAA,MACA,OAAA,CAAQ,OAAO,SAAS,CAAA;AAAA,MACxB,QAAA;AAAA,MACA,KAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,OAAO,OAAO,MAAA,CAAO,SAAA;AAAA,MACnB;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAAA,QAC5B,UAAA,EAAY,GAAA;AAAA,QACZ,IAAA,EAAM;AAAA,OACR;AAAA,MACA,WAAA;AAAA,MACA,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,GAAA,EAAI;AAAA,MAC/B,KAAA;AAAA,MACA,CAAC,WAAW,SAAS;AAAA,KACvB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QAAA,CAAS,SAAA,EAAmB,SAAA,EAAmB,OAAA,EAAyC;AAC5F,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,CAAW,WAAW,OAAO,CAAA;AACpD,IAAA,MAAM,KAAK,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAEhC,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,MAAA,CAAO,OAAA;AAAA,MACrC,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAG;AAAA,MACtB,GAAA;AAAA,MACA,OAAA,CAAQ,OAAO,SAAS;AAAA,KAC1B;AAEA,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,GAAG,EAAE,CAAC,CAAA;AAAA,MACnC,UAAA,EAAY,KAAK,MAAA,CAAO,YAAA,CAAa,GAAG,IAAI,UAAA,CAAW,UAAU,CAAC,CAAC;AAAA,KACrE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QAAA,CAAS,SAAA,EAA0B,SAAA,EAAmB,OAAA,EAAkC;AAC5F,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,CAAW,WAAW,OAAO,CAAA;AACpD,IAAA,MAAM,EAAA,GAAK,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,CAAC,CAAC,CAAA;AACrE,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,CAAC,CAAC,CAAA;AAErF,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAG,EAAG,GAAA,EAAK,UAAU,CAAA;AAEtF,IAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,SAAS,CAAA;AAAA,EAC3C;AACF;;;AC/SO,IAAM,WAAA,GACX;AAqBK,IAAM,gBAAN,MAAoB;AAAA,EACN,WAAA;AAAA,EACA,GAAA;AAAA,EACV,MAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,MAAA,EAA6B;AACvC,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,MAAA,CAAO,OAAA,EAAS,SAAS,CAAA;AAC1D,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,kBAAA,CAAmB;AAAA,MACxC,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAA,EAAc,OAAO,YAAA,IAAgB;AAAA,KACtC,CAAA;AACD,IAAA,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA;AAClB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,UAAU,KAAA,EAAkC;AAChD,IAAA,MAAM,YAAA,GAAe,QAAQ,gBAAA,CAAiB,KAAA,EAAO,OAAO,CAAA,GAAI,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AAC7F,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,yBAAA,CAA0B,YAAY,CAAA;AAEhE,IAAA,IAAI,KAAK,YAAA,CAAa,MAAM,CAAA,EAAG,OAAO,OAAO,CAAC,CAAA;AAE9C,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,OAAO,CAAA;AAErD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY;AAAA,QACxC,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,QAChB,iBAAiB,IAAA,CAAK,OAAA;AAAA,QACtB,yBAAyB,KAAA,CAAM,iBAAA;AAAA,QAC/B,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,aAAA,EAAe,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AAAA,QAC5C,gBAAgB,KAAA,CAAM,cAAA;AAAA,QACtB,cAAc,KAAA,CAAM;AAAA,OACrB,CAAA;AAED,MAAA,OAAO,MAAA,CAAO,MAAM,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,gBAAA,CAAiB,OAAO,2BAA2B,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,sBAAsB,KAAA,EAAmC;AAC7D,IAAA,MAAM,YAAA,GAAe,QAAQ,gBAAA,CAAiB,KAAA,EAAO,OAAO,CAAA,GAAI,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AAC7F,IAAA,OAAO,IAAA,CAAK,0BAA0B,YAAY,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,cAAA,GAAmC;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA;AAAA,MAC/B,yBAAA,CAA0B,IAAA,CAAK,OAAA,EAAS,oBAAoB;AAAA,KAC9D;AACA,IAAA,OAAO,MAAA,KAAW,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,SAAA,GAA8B;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA;AAAA,MAC/B,yBAAA,CAA0B,IAAA,CAAK,OAAA,EAAS,4BAA4B;AAAA,KACtE;AACA,IAAA,OAAO,MAAA,KAAW,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,aAAa,cAAA,CACX,MAAA,EACA,KAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,2BAAW,GAAA,EAAI;AAExC,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,CAAG,GAAA;AACvB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAC,CAAA,CAAG,MAAA;AAC1B,IAAA,MAAM,YAAA,GAAe,KAAA,IAAU,MAAM,MAAA,CAAO,UAAA,EAAW;AACvD,IAAA,MAAM,eAAe,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAEhD,IAAA,MAAM,QAAQ,MAAM,MAAA,CAAO,CAAC,CAAA,CAAG,WAAA,CAAY,OAAO,YAAY,CAAA;AAE9D,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,yBAAA,CAA0B,YAAY,CAAC,CAAC,CAAA;AAE9F,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAqB;AACzC,IAAA,MAAM,kBAAmC,EAAC;AAE1C,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,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AAExB,MAAA,IAAI,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,EAAG;AAC9B,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,MAAA,CAAO,CAAC,CAAC,CAAA;AACpC,QAAA;AAAA,MACF;AAEA,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd,IACG,WAAA,CAAY;AAAA,UACX,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,UAChB,iBAAiB,KAAA,CAAM,OAAA;AAAA,UACvB,yBAAyB,KAAA,CAAM,iBAAA;AAAA,UAC/B,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,aAAA,EAAe,YAAA;AAAA,UACf,gBAAgB,KAAA,CAAM,cAAA;AAAA,UACtB,cAAc,KAAA,CAAM;AAAA,SACrB,CAAA,CACA,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,UAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA,IAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QACxD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,UAAA,OAAA,GAAU,KAAA,CAAM,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAClF,UAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QACtC,CAAC;AAAA,OACL;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,CAAQ,IAAI,eAAe,CAAA;AACjC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,aAAa,oBAAA,CACX,MAAA,EACA,OAAA,EACA,OACA,OAAA,EAC+B;AAC/B,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,2BAAW,GAAA,EAAI;AACxC,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ;AACpC,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,eAAA,EAAkB,MAAA,CAAO,MAAM,CAAA,6BAAA,EAAgC,QAAQ,MAAM,CAAA,CAAA;AAAA,OAC/E;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,CAAG,GAAA;AACvB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAC,CAAA,CAAG,MAAA;AAC1B,IAAA,MAAM,eAAe,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAChD,IAAA,MAAM,QAAQ,MAAM,MAAA,CAAO,CAAC,CAAA,CAAG,WAAA,CAAY,OAAO,YAAY,CAAA;AAC9D,IAAA,MAAM,aAAA,GAAgB,KAAA,IAAU,MAAM,MAAA,CAAO,UAAA,EAAW;AAExD,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAqB;AACzC,IAAA,MAAM,kBAAmC,EAAC;AAE1C,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,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AAExB,MAAA,IAAI,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,EAAG;AAC9B,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,MAAA,CAAO,CAAC,CAAC,CAAA;AACpC,QAAA;AAAA,MACF;AAEA,MAAA,eAAA,CAAgB,IAAA;AAAA,QACd,IACG,WAAA,CAAY;AAAA,UACX,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,UAChB,iBAAiB,KAAA,CAAM,OAAA;AAAA,UACvB,yBAAyB,KAAA,CAAM,iBAAA;AAAA,UAC/B,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,aAAA;AAAA,UACA,gBAAgB,KAAA,CAAM,cAAA;AAAA,UACtB,cAAc,KAAA,CAAM;AAAA,SACrB,CAAA,CACA,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,UAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA,IAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QACxD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,UAAA,OAAA,GAAU,KAAA,CAAM,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAClF,UAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QACtC,CAAC;AAAA,OACL;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,CAAQ,IAAI,eAAe,CAAA;AACjC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,gBAAgB,kBAAA,EAAsD;AAC1E,IAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,kBAAA,EAAoB,oBAAoB,CAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA;AAAA,MAC/B,qBAAA,CAAsB,WAAA,EAAa,IAAA,CAAK,OAAO;AAAA,KACjD;AACA,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA,CAAsB,mBAAmB,WAAA,EAAa,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAA,GAAoC;AACxC,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA,CAAsB,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,SAAA,CAAU,OAAA,EAAkB,KAAA,EAAkC;AAClE,IAAA,MAAM,iBAAA,GAAoB,gBAAA,CAAiB,OAAA,EAAS,SAAS,CAAA;AAC7D,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA;AAAA,MACnC,mBAAmB,iBAAiB;AAAA,KACtC;AACA,IAAA,MAAM,WAAA,GAAc,QAAQ,gBAAA,CAAiB,KAAA,EAAO,OAAO,CAAA,GAAI,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AAC5F,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA;AAAA,MACjB,iBAAA,CAAkB,UAAA,EAAY,WAAA,EAAa,iBAAiB;AAAA,KAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,IAAA,GAAwB;AAC5B,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA,CAAqB,YAAA,CAAa,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAA,GAA0B;AAC9B,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA,CAAqB,cAAA,CAAe,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAA,GAA4B;AAChC,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA,CAAqB,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,SAAA,GAA2B;AAC/B,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,aAAa,aAAa,MAAA,EAAwC;AAChE,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,eAAe,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAChD,IAAA,MAAM,MAAA,CAAO,CAAC,CAAA,CAAG,WAAA,CAAY,OAAO,YAAY,CAAA;AAAA,EAClD;AAAA,EAEA,MAAgB,0BAA0B,KAAA,EAAkC;AAC1E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA;AAAA,MAC/B,6BAAA,CAA8B,IAAA,CAAK,OAAA,EAAS,KAAK;AAAA,KACnD;AACA,IAAA,OAAO,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,EACpC;AAAA,EAEU,gBAAgB,KAAA,EAAyB;AACjD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AACvD,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,CAAA,EAAA,EAAK,MAAM,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAC,CAAA,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,aAAa,MAAA,EAAqD;AAChE,IAAA,OAAO,MAAA,KAAW,eAAe,MAAA,KAAW,IAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,cAAA,CAAe,MAAA,EAAiB,KAAA,EAAkC;AACtE,IAAA,IAAI,KAAK,YAAA,CAAa,MAAM,CAAA,EAAG,OAAO,OAAO,CAAC,CAAA;AAE9C,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,OAAO,CAAA;AAErD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY;AAAA,QACxC,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,QAChB,iBAAiB,IAAA,CAAK,OAAA;AAAA,QACtB,yBAAyB,KAAA,CAAM,iBAAA;AAAA,QAC/B,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,aAAA,EAAe,KAAA,IAAU,MAAM,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,QACtD,gBAAgB,KAAA,CAAM,cAAA;AAAA,QACtB,cAAc,KAAA,CAAM;AAAA,OACrB,CAAA;AAED,MAAA,OAAO,MAAA,CAAO,MAAM,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,gBAAA,CAAiB,OAAO,2BAA2B,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CAAe,OAAA,EAAoB,KAAA,EAAgD;AACvF,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAqB;AACzC,IAAA,MAAM,iBAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,EAAG;AAC7B,QAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG,OAAO,OAAA;AAExC,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,OAAO,CAAA;AAErD,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY;AAAA,QAC3C,OAAA,EAAS,cAAA;AAAA,QACT,iBAAiB,IAAA,CAAK,OAAA;AAAA,QACtB,yBAAyB,KAAA,CAAM,iBAAA;AAAA,QAC/B,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,aAAA,EAAe,KAAA,IAAU,MAAM,IAAA,CAAK,OAAO,UAAA,EAAW;AAAA,QACtD,gBAAgB,KAAA,CAAM,cAAA;AAAA,QACtB,cAAc,KAAA,CAAM;AAAA,OACrB,CAAA;AAED,MAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,QAAA,OAAA,CAAQ,IAAI,MAAA,EAAQ,SAAA,CAAU,MAAM,CAAA,IAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MACpD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,gBAAA,CAAiB,OAAO,2BAA2B,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAOA,SAAS,gBAAA,CAAiB,OAAgB,eAAA,EAAgC;AACxE,EAAA,IAAI,KAAA,YAAiB,iBAAA,IAAqB,KAAA,YAAiB,yBAAA,EAA2B;AACpF,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GACJ,KAAA,IAAS,IAAA,IACT,OAAO,KAAA,KAAU,QAAA,IACjB,YAAA,IAAgB,KAAA,IAChB,OAAQ,KAAA,CAAkC,UAAA,KAAe,QAAA,GACnD,MAAkC,UAAA,GACpC,MAAA;AAEN,EAAA,IAAI,eAAe,GAAA,EAAK;AACtB,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,gCAAA;AAAA,MACzC,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAA;AAAU,KACtD;AAAA,EACF;AAEA,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,OAAO,IAAI,yBAAA;AAAA,MACT,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,MACzC,UAAA;AAAA,MACA,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAA;AAAU,KACtD;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,sBAAsB,eAAA,EAAiB;AAAA,IAChD,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,GACzC,CAAA;AACH;;;AC9fO,IAAM,KAAA,GAAN,MAAM,MAAA,SAAc,aAAA,CAAc;AAAA,EACvC,OAAgB,YAAA,GAAwB,4CAAA;AAAA,EAE/B,OAAA;AAAA,EACT,WAAA;AAAA,EACA,kBAAA,GAA8C,IAAA;AAAA,EAE9C,YAAY,MAAA,EAAqB;AAC/B,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,GAAU,gBAAA,CAAiB,OAAO,OAAA,EAAS,SAAS,IAAI,IAAA,CAAK,OAAA;AAAA,EACrF;AAAA,EAEA,MAAM,cAAA,GAAmC;AACvC,IAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,MAAA,EAAW,OAAO,IAAA,CAAK,WAAA;AAChD,IAAA,IAAI,CAAC,KAAK,kBAAA,EAAoB;AAC5B,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,MAAA,CAC5B,YAAA,CAAsB,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAC,CAAA,CACtD,IAAA,CAAK,CAAC,CAAA,KAAM;AACX,QAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,QAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,QAAA,OAAO,CAAA;AAAA,MACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,QAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,QAAA,MAAM,KAAA;AAAA,MACR,CAAC,CAAA;AAAA,IACL;AACA,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,oBAAA,CAAqB,EAAA,EAAa,MAAA,EAA8B;AACpE,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,EAAA,EAAI,IAAI,CAAA;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAS,UAAA,KAAe,MAAM,IAAA,CAAK,IAAI,OAAA,CAAQ;AAAA,QACrD,MAAA,EAAQ,CAAC,MAAM,CAAA;AAAA,QACf,iBAAiB,IAAA,CAAK,OAAA;AAAA,QACtB,WAAA,EAAa,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA;AAAW,OAC3C,CAAA;AAED,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,sBAAsB,gCAAgC,CAAA;AAAA,MAClE;AAEA,MAAA,OAAO,MAAM,KAAK,MAAA,CAAO,aAAA;AAAA,QACvB,6BAA6B,IAAA,CAAK,OAAA,EAAS,cAAc,OAAA,CAAQ,CAAC,GAAI,UAAU;AAAA,OAClF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,sBAAsB,mCAAA,EAAqC;AAAA,QACnE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,wBAAA,CAAyB,IAAA,EAAe,EAAA,EAAa,MAAA,EAA8B;AACvF,IAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAA;AACpD,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,EAAA,EAAI,IAAI,CAAA;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAS,UAAA,KAAe,MAAM,IAAA,CAAK,IAAI,OAAA,CAAQ;AAAA,QACrD,MAAA,EAAQ,CAAC,MAAM,CAAA;AAAA,QACf,iBAAiB,IAAA,CAAK,OAAA;AAAA,QACtB,WAAA,EAAa;AAAA,OACd,CAAA;AAED,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,sBAAsB,gCAAgC,CAAA;AAAA,MAClE;AAEA,MAAA,OAAO,MAAM,KAAK,MAAA,CAAO,aAAA;AAAA,QACvB,gCAAA;AAAA,UACE,IAAA,CAAK,OAAA;AAAA,UACL,cAAA;AAAA,UACA,YAAA;AAAA,UACA,QAAQ,CAAC,CAAA;AAAA,UACT;AAAA;AACF,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,sBAAsB,uCAAA,EAAyC;AAAA,QACvE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,OAAA,CAAQ,OAAA,EAAkB,KAAA,EAA8B;AAC5D,IAAA,MAAM,iBAAA,GAAoB,gBAAA,CAAiB,OAAA,EAAS,SAAS,CAAA;AAC7D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,KAAK,MAAA,CAAO,aAAA;AAAA,QACvB,mBAAA,CAAoB,IAAA,CAAK,OAAA,EAAS,iBAAA,EAAmB,KAAK;AAAA,OAC5D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,oBAAoB,0BAAA,EAA4B;AAAA,QACxD,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,WAAW,OAAA,EAAoC;AACnD,IAAA,MAAM,iBAAA,GAAoB,gBAAA,CAAiB,OAAA,EAAS,SAAS,CAAA;AAC7D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AAC5C,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA;AAAA,MACjB,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,iBAAiB;AAAA,KAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,IAAA,CACJ,MAAA,EACA,OAAA,EAIc;AACd,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA,EAAe;AAE7C,IAAA,IAAI,UAAA,KAAe,OAAM,YAAA,EAAc;AACrC,MAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,EAAQ,MAAA,IAAU,OAAA,EAAS,QAAQ,EAAA,CAAG,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,QAAA,GAAW,SAAS,gBAAA,IAAoB,OAAA;AAC9C,IAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,QAAA,KAAa,KAAK,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AAC7C,MAAA,OAAO,MAAM,KAAK,MAAA,CAAO,aAAA,CAAc,aAAa,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,IACpF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,yBAAyB,kCAAA,EAAoC;AAAA,QACrE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OAAA,CAAQ,MAAA,EAAgB,KAAA,EAA8B;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AACjD,MAAA,OAAO,MAAM,KAAK,MAAA,CAAO,aAAA;AAAA,QACvB,gBAAgB,IAAA,CAAK,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,SAAS,MAAM;AAAA,OACpE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,yBAAyB,yCAAA,EAA2C;AAAA,QAC5E,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,OAAO,MAAA,EAA8B;AACzC,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AAEjD,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI;AACF,MAAA,CAAC,EAAE,OAAA,EAAS,UAAA,KAAe,MAAM,IAAA,CAAK,IAAI,OAAA,CAAQ;AAAA,QAChD,MAAA,EAAQ,CAAC,MAAM,CAAA;AAAA,QACf,iBAAiB,IAAA,CAAK,OAAA;AAAA,QACtB;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,sBAAsB,mCAAA,EAAqC;AAAA,QACnE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,sBAAsB,gCAAgC,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,KAAK,MAAA,CAAO,aAAA;AAAA,QACvB,cAAA,CAAe,KAAK,OAAA,EAAS,WAAA,EAAa,aAAa,OAAA,CAAQ,CAAC,GAAI,UAAU;AAAA,OAChF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,yBAAyB,6BAAA,EAA+B;AAAA,QAChE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,SAAA,GAA0B;AAC9B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AACjD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,yBAAA,CAA0B,WAAW,CAAA;AAE/D,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,sBAAsB,kCAAkC,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,KAAK,MAAA,CAAO,aAAA;AAAA,QACvB,yBAAA,CAA0B,IAAA,CAAK,OAAA,EAAS,WAAA,EAAa,aAAa,MAAM;AAAA,OAC1E;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,yBAAyB,iCAAA,EAAmC;AAAA,QACpE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QAAA,CAAS,MAAA,EAAgB,SAAA,EAA6C;AAC1E,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAC7C,IAAA,YAAA,CAAa,MAAM,SAAA,EAAW,iBAAA,GAAoB,YAAY,CAAC,CAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,wBAAA,CAAyB,YAAA,EAAc,SAAS,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,YAAY,SAAA,EAA6C;AAC7D,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,SAAA,EAAU;AAC1C,IAAA,YAAA,CAAa,MAAM,SAAA,EAAW,iBAAA,GAAoB,YAAY,CAAC,CAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,wBAAA,CAAyB,YAAA,EAAc,SAAS,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,cAAA,CAAe,YAAA,EAAmB,SAAA,EAA6C;AACnF,IAAA,OAAO,IAAA,CAAK,wBAAA,CAAyB,YAAA,EAAc,SAAS,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,eAAe,gBAAA,EAAyC;AAC5D,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,eAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAI,aAAA,CAAc,CAAC,gBAAgB,CAAC,CAAA;AAC9D,MAAA,eAAA,GAAkB,MAAA,CAAO,eAAA;AACzB,MAAA,IAAI;AACF,QAAA,UAAA,GAAa,MAAA,CAAO,OAAO,qBAAqB,CAAA;AAAA,MAClD,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,IAAI,qBAAA;AAAA,UACR,CAAA,8BAAA,EAAiC,OAAO,qBAAqB,CAAA;AAAA,SAC/D;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,sBAAsB,6BAAA,EAA+B;AAAA,QAC7D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,KAAK,MAAA,CAAO,aAAA;AAAA,QACvB,sBAAA,CAAuB,IAAA,CAAK,OAAA,EAAS,gBAAA,EAAkB,YAAY,eAAe;AAAA,OACpF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,yBAAyB,6BAAA,EAA+B;AAAA,QAChE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,kBAAkB,MAAA,EAA+B;AACrD,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA,EAAe;AAE7C,IAAA,MAAM,cAAA,GAAiB,MAAA,IAAU,EAAA,IAAM,IAAA,GAAO,EAAA;AAE9C,IAAA,IAAI;AACF,MAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AACjD,QAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA;AAAA,UACzC,iBAAA,CAAkB,UAAA,EAAY,WAAA,EAAa,IAAA,CAAK,OAAO;AAAA,SACzD;AAEA,QAAA,IAAI,mBAAmB,EAAA,EAAI;AACzB,UAAA,MAAM,IAAA,CAAK,OAAO,aAAA,CAAc,eAAA,CAAgB,YAAY,IAAA,CAAK,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,QAC/E;AAAA,MACF;AAEA,MAAA,OAAO,MAAM,KAAK,MAAA,CAAO,aAAA;AAAA,QACvB,eAAA,CAAgB,UAAA,EAAY,IAAA,CAAK,OAAA,EAAS,cAAc;AAAA,OAC1D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,oBAAoB,wBAAA,EAA0B;AAAA,QACtD,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,wBAAA,CAAyB,YAAA,EAAmB,SAAA,EAA6C;AAC7F,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,CAAO,yBAAA,CAA0B,YAAY,CAAA;AAAA,IACpE,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,yBAAyB,gCAAA,EAAkC;AAAA,QACnE,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AACA,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,CAAQ,IAAI,CAAA;AAC9C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,yBAAyB,oDAAoD,CAAA;AAAA,IACzF;AACA,IAAA,YAAA,CAAa,MAAM,SAAA,EAAW,YAAA,IAAgB,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,cAAA,CAAe,MAAM,eAAe,CAAA;AACpE,IAAA,YAAA,CAAa,MAAM,SAAA,EAAW,mBAAA,GAAsB,YAAY,CAAC,CAAA;AACjE,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAA,CAAiB,MAAA,EAAgB,WAAA,EAAqC;AAC1E,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA,EAAe;AAE7C,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AACjD,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA;AAAA,MAClC,iBAAA,CAAkB,UAAA,EAAY,WAAA,EAAa,IAAA,CAAK,OAAO;AAAA,KACzD;AAEA,IAAA,IAAI,aAAa,MAAA,EAAQ;AAEzB,IAAA,IAAI;AAIF,MAAA,IAAI,YAAY,EAAA,EAAI;AAClB,QAAA,MAAM,IAAA,CAAK,OAAO,aAAA,CAAc,eAAA,CAAgB,YAAY,IAAA,CAAK,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,MAC/E;AAEA,MAAA,MAAM,cAAA,GAAiB,WAAA,GAAc,EAAA,IAAM,IAAA,GAAO,EAAA,GAAK,MAAA;AAEvD,MAAA,MAAM,IAAA,CAAK,OAAO,aAAA,CAAc,eAAA,CAAgB,YAAY,IAAA,CAAK,OAAA,EAAS,cAAc,CAAC,CAAA;AAAA,IAC3F,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,YAAY,MAAM,KAAA;AACvC,MAAA,MAAM,IAAI,oBAAoB,wBAAA,EAA0B;AAAA,QACtD,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AACF;AAMA,SAAS,aAAa,EAAA,EAAsB;AAC1C,EAAA,IAAI;AACF,IAAA,EAAA,EAAG;AAAA,EACL,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;ACveO,IAAM,WAAN,MAAe;AAAA,EACX,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,uBAAA;AAAA,EAET,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,0BAA0B,MAAA,CAAO,sBAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,OAAA,EAAiC;AACnD,IAAA,OAAO,IAAI,aAAA,CAAc;AAAA,MACvB,KAAK,IAAA,CAAK,OAAA;AAAA,MACV,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAA,EAAS,gBAAA,CAAiB,OAAA,EAAS,SAAS,CAAA;AAAA,MAC5C,cAAc,IAAA,CAAK;AAAA,KACpB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,CAAY,SAAkB,OAAA,EAA0B;AACtD,IAAA,OAAO,IAAI,KAAA,CAAM;AAAA,MACf,KAAK,IAAA,CAAK,OAAA;AAAA,MACV,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAA,EAAS,gBAAA,CAAiB,OAAA,EAAS,SAAS,CAAA;AAAA,MAC5C,OAAA,EAAS,OAAA,GAAU,gBAAA,CAAiB,OAAA,EAAS,SAAS,CAAA,GAAI,MAAA;AAAA,MAC1D,cAAc,IAAA,CAAK;AAAA,KACpB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,QAAQ,SAAA,EAAU;AAAA,EACzB;AACF;;;ACpEO,IAAM,gBAAN,MAAoD;AAAA,EACzD,IAAA,uBAAW,GAAA,EAAoB;AAAA,EAE/B,MAAM,QAAQ,GAAA,EAAqC;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,EAA8B;AACvD,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACtB;AACF;;;ACNO,IAAM,mBAAN,MAAuD;AAAA,EAC5D,GAAA,GAA0B,IAAA;AAAA,EAC1B,UAAA,GAA0C,IAAA;AAAA,EAC1C,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA,GAAa,aAAA;AAAA,EAEb,WAAA,CAAY,MAAA,GAAS,iBAAA,EAAmB,SAAA,GAAY,CAAA,EAAG;AACrD,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,EACpB;AAAA,EAEA,MAAA,GAA+B;AAC7B,IAAA,IAAI,KAAK,GAAA,EAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC7C,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,OAAO,IAAA,CAAK,UAAA;AAEjC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,OAAA,CAAQ,CAAC,SAAS,MAAA,KAAW;AACjD,MAAA,MAAM,UAAU,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAE5D,MAAA,OAAA,CAAQ,kBAAkB,MAAM;AAC9B,QAAA,MAAM,KAAK,OAAA,CAAQ,MAAA;AACnB,QAAA,IAAI,CAAC,EAAA,CAAG,gBAAA,CAAiB,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA,EAAG;AAClD,UAAA,EAAA,CAAG,kBAAkB,IAAA,CAAK,UAAA,EAAY,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,QAC1D;AAAA,MACF,CAAA;AAEA,MAAA,OAAA,CAAQ,YAAY,MAAM;AACxB,QAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,MAAA;AACnB,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,IAAA,CAAK,GAAA,CAAI,kBAAkB,MAAM;AAC/B,UAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAChB,UAAA,IAAA,CAAK,GAAA,GAAM,IAAA;AACX,UAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,QACpB,CAAA;AACA,QAAA,IAAA,CAAK,GAAA,CAAI,UAAU,MAAM;AACvB,UAAA,IAAA,CAAK,GAAA,GAAM,IAAA;AACX,UAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,QACpB,CAAA;AACA,QAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,MAClB,CAAA;AAEA,MAAA,OAAA,CAAQ,UAAU,MAAM;AACtB,QAAA,IAAA,CAAK,GAAA,GAAM,IAAA;AACX,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA,MACtB,CAAA;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,GAAA,EAAqC;AACjD,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,MAAA,EAAO;AAC7B,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,YAAY,UAAU,CAAA;AACrD,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,SAAS,IAAI,KAAA,CAAM,qBAAqB,CAAC,CAAA;AACtE,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC7B,MAAA,OAAA,CAAQ,YAAY,MAAM,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,SAAS,IAAI,CAAA;AAC/D,MAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,EAA8B;AACvD,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,MAAA,EAAO;AAC7B,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,YAAY,WAAW,CAAA;AACtD,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,SAAS,IAAI,KAAA,CAAM,qBAAqB,CAAC,CAAA;AACtE,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAC5C,MAAA,MAAM,UAAU,KAAA,CAAM,GAAA,CAAI,EAAE,GAAA,EAAK,OAAO,CAAA;AACxC,MAAA,OAAA,CAAQ,SAAA,GAAY,MAAM,OAAA,EAAQ;AAClC,MAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,MAAA,EAAO;AAC7B,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,YAAY,WAAW,CAAA;AACtD,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,SAAS,IAAI,KAAA,CAAM,qBAAqB,CAAC,CAAA;AACtE,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAChC,MAAA,OAAA,CAAQ,SAAA,GAAY,MAAM,OAAA,EAAQ;AAClC,MAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,MAAA,EAAO;AAC7B,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,YAAY,WAAW,CAAA;AACtD,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,SAAS,IAAI,KAAA,CAAM,qBAAqB,CAAC,CAAA;AACtE,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,MAAA,OAAA,CAAQ,SAAA,GAAY,MAAM,OAAA,EAAQ;AAClC,MAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AACF;AAGO,IAAM,gBAAA,GAAmB,IAAI,gBAAA;;;AC3BpC,SAAS,cAAA,CAAe,GAAW,CAAA,EAAoB;AACrD,EAAA,OAAO,CAAA,CAAE,WAAA,EAAY,KAAM,CAAA,CAAE,WAAA,EAAY;AAC3C;AAEA,SAAS,iBAAA,CACP,WAAA,EACA,IAAA,EACA,EAAA,EACmB;AACnB,EAAA,MAAM,MAAA,GAAS,IAAA,KAAS,MAAA,IAAa,cAAA,CAAe,aAAa,IAAI,CAAA;AACrE,EAAA,MAAM,IAAA,GAAO,EAAA,KAAO,MAAA,IAAa,cAAA,CAAe,aAAa,EAAE,CAAA;AAE/D,EAAA,IAAI,MAAA,IAAU,MAAM,OAAO,MAAA;AAC3B,EAAA,IAAI,QAAQ,OAAO,UAAA;AACnB,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,mBAAA,CACP,KAAA,EACA,WAAA,EACA,QAAA,EACc;AACd,EAAA,QAAQ,MAAM,SAAA;AAAW,IACvB,KAAK,sBAAA;AACH,MAAA,OAAO,aAAA,CAAc,KAAA,EAAO,WAAA,EAAa,QAAQ,CAAA;AAAA,IACnD,KAAK,SAAA;AACH,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,WAAA,EAAa,QAAQ,CAAA;AAAA,IACjD,KAAK,iBAAA;AACH,MAAA,OAAO,sBAAA,CAAuB,KAAA,EAAO,WAAA,EAAa,QAAQ,CAAA;AAAA,IAC5D,KAAK,kBAAA;AACH,MAAA,OAAO,oBAAA,CAAqB,KAAA,EAAO,WAAA,EAAa,QAAQ,CAAA;AAAA,IAC1D,KAAK,oBAAA;AACH,MAAA,OAAO,sBAAA,CAAuB,OAAO,QAAQ,CAAA;AAAA;AAEnD;AAEA,SAAS,aAAA,CACP,KAAA,EACA,WAAA,EACA,QAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,WAAW,iBAAA,CAAkB,WAAA,EAAa,KAAA,CAAM,IAAA,EAAM,MAAM,EAAE,CAAA;AAAA,IAC9D,QAAQ,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,MAAM,qBAAA,EAAsB;AAAA,IACjE,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,QAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AACF;AAEA,SAAS,WAAA,CACP,KAAA,EACA,WAAA,EACA,QAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,SAAA,EAAW,iBAAA,CAAkB,WAAA,EAAa,MAAA,EAAW,MAAM,EAAE,CAAA;AAAA,IAC7D,QAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,MAAM,QAAA,EAAS;AAAA,IAC/C,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,KAAK,KAAA,CAAM,SAAA;AAAA,IACX,QAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AACF;AAEA,SAAS,sBAAA,CACP,KAAA,EACA,WAAA,EACA,QAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,oBAAA;AAAA,IACN,SAAA,EAAW,iBAAA,CAAkB,WAAA,EAAa,MAAA,EAAW,MAAM,QAAQ,CAAA;AAAA,IACnE,QAAQ,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,MAAM,eAAA,EAAgB;AAAA,IAC3D,IAAI,KAAA,CAAM,QAAA;AAAA,IACV,QAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AACF;AAEA,SAAS,oBAAA,CACP,KAAA,EACA,WAAA,EACA,QAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,kBAAA;AAAA,IACN,SAAA,EAAW,iBAAA,CAAkB,WAAA,EAAa,MAAA,EAAW,MAAM,EAAE,CAAA;AAAA,IAC7D,QAAQ,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,MAAM,eAAA,EAAgB;AAAA,IAC3D,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,SAAS,KAAA,CAAM,SAAA;AAAA,IACf,QAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AACF;AAEA,SAAS,sBAAA,CACP,OACA,QAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,oBAAA;AAAA;AAAA,IAEN,SAAA,EAAW,UAAA;AAAA,IACX,QAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,MAAM,YAAA,EAAa;AAAA,IACnD,KAAK,KAAA,CAAM,SAAA;AAAA,IACX,SAAS,KAAA,CAAM,eAAA;AAAA,IACf,QAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AACF;AAUO,SAAS,iBAAA,CACd,MACA,WAAA,EACgB;AAChB,EAAA,MAAM,QAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,iBAAiB,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,QAAA,GAAgC;AAAA,MACpC,iBAAiB,GAAA,CAAI,eAAA;AAAA,MACrB,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,UAAU,GAAA,CAAI;AAAA,KAChB;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,mBAAA,CAAoB,KAAA,EAAO,WAAA,EAAa,QAAQ,CAAC,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,wBAAwB,KAAA,EAA0C;AAChF,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,eAAe,IAAA,CAAK,MAAA,CAAO,mBAAmB,MAAA,EAAW;AAChF,MAAA,MAAM,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA;AAEtB,MAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,WAAA,EAAa;AACnC,QAAA,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,OAAO,CAAA;AACpB;AAMO,SAAS,oBAAA,CACd,OACA,YAAA,EACgB;AAChB,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,WAAA,EAAa,OAAO,IAAA;AAE7C,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,OAAO,MAAM,CAAA;AACjD,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,IAAA;AAEhC,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,QACpB,cAAA,EAAgB;AAAA;AAClB,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAMO,SAAS,kBAAkB,KAAA,EAAgD;AAChF,EAAA,OAAO,CAAC,GAAG,KAAK,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAC/B,IAAA,MAAM,MAAA,GAAS,EAAE,QAAA,CAAS,WAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,EAAE,QAAA,CAAS,WAAA;AAE1B,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW,OAAO,CAAA;AACzD,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,EAAA;AACjC,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,CAAA;AAGjC,IAAA,MAAM,OAAO,OAAO,MAAA,KAAW,QAAA,GAAW,MAAA,GAAS,OAAO,MAAM,CAAA;AAChE,IAAA,MAAM,OAAO,OAAO,MAAA,KAAW,QAAA,GAAW,MAAA,GAAS,OAAO,MAAM,CAAA;AAEhE,IAAA,IAAI,IAAA,GAAO,MAAM,OAAO,CAAA;AACxB,IAAA,IAAI,IAAA,GAAO,MAAM,OAAO,EAAA;AAGxB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,QAAA,CAAS,QAAA,IAAY,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,QAAA,CAAS,QAAA,IAAY,CAAA;AACpC,IAAA,OAAO,IAAA,GAAO,IAAA;AAAA,EAChB,CAAC,CAAA;AACH","file":"index.js","sourcesContent":["import type { FhevmInstanceConfig } from \"../relayer/relayer-sdk.types\";\nimport type {\n GenericLogger,\n UpdateCsrfResponseData,\n WorkerRequest,\n WorkerRequestType,\n WorkerResponse,\n} from \"./worker.types\";\nimport { BaseWorkerClient } from \"./worker.base-client\";\n\n/** Configuration for the worker client */\nexport interface WorkerClientConfig {\n cdnUrl: string;\n fhevmConfig: FhevmInstanceConfig;\n csrfToken: string;\n /** Expected SHA-384 hex digest of the CDN bundle for integrity verification. */\n integrity?: string;\n /** Optional logger for tracing worker request lifecycle. */\n logger?: GenericLogger;\n}\n\n/**\n * Client for communicating with the RelayerSDK Web Worker.\n * Provides a promise-based API for FHE operations.\n */\nexport class RelayerWorkerClient extends BaseWorkerClient<Worker, WorkerClientConfig> {\n constructor(config: WorkerClientConfig) {\n super(config, config.logger);\n }\n\n protected createWorker(): Worker {\n return new Worker(new URL(\"./relayer-sdk.worker.js\", import.meta.url));\n }\n\n protected wireEvents(worker: Worker): void {\n worker.onmessage = (event: MessageEvent<WorkerResponse<unknown>>) =>\n this.handleResponse(event.data);\n worker.onerror = (event: ErrorEvent) => this.handleWorkerError(event.message);\n worker.onmessageerror = () => this.handleWorkerMessageError();\n }\n\n protected postMessage(worker: Worker, request: WorkerRequest): void {\n worker.postMessage(request);\n }\n\n protected terminateWorker(worker: Worker): void {\n worker.terminate();\n }\n\n protected generateRequestId(): string {\n return crypto.randomUUID();\n }\n\n protected getInitPayload(): {\n type: WorkerRequestType;\n payload: WorkerRequest[\"payload\"];\n } {\n return { type: \"INIT\", payload: this.config };\n }\n\n /**\n * Update the CSRF token in the worker.\n * Call this before making authenticated requests to ensure the token is fresh.\n */\n async updateCsrf(csrfToken: string): Promise<void> {\n await this.sendRequest<UpdateCsrfResponseData>(\"UPDATE_CSRF\", { csrfToken });\n }\n}\n","import type {\n Address,\n DelegatedUserDecryptParams,\n EIP712TypedData,\n EncryptParams,\n EncryptResult,\n FHEKeypair,\n InputProofBytesType,\n KmsDelegatedUserDecryptEIP712Type,\n PublicDecryptResult,\n RelayerWebConfig,\n UserDecryptParams,\n ZKProofLike,\n} from \"./relayer-sdk.types\";\nimport { RelayerWorkerClient, type WorkerClientConfig } from \"../worker/worker.client\";\nimport type { RelayerSDK } from \"./relayer-sdk\";\nimport { buildEIP712DomainType, mergeFhevmConfig, withRetry } from \"./relayer-utils\";\nimport { TokenError, EncryptionFailedError } from \"../token/errors\";\n\n/**\n * Pinned relayer SDK version used for the WASM CDN bundle.\n * Update this when upgrading @zama-fhe/relayer-sdk.\n */\nconst RELAYER_SDK_VERSION = \"0.4.1\";\nconst CDN_URL = `https://cdn.zama.org/relayer-sdk-js/${RELAYER_SDK_VERSION}/relayer-sdk-js.umd.cjs`;\n/** SHA-384 hex digest of the pinned CDN bundle for integrity verification. */\nconst CDN_INTEGRITY =\n \"2bd5401738b74509549bed2029bbbabedd481b10ac260f66e64a4ff3723d6d704180c51e882757c56ca1840491e90e33\";\n\n/**\n * RelayerWeb — browser FHE backend using a Web Worker.\n * Handles WASM initialization in a Web Worker for non-blocking operations.\n */\nexport class RelayerWeb implements RelayerSDK {\n #workerClient: RelayerWorkerClient | null = null;\n #initPromise: Promise<RelayerWorkerClient> | null = null;\n #ensureLock: Promise<RelayerWorkerClient> | null = null;\n #terminated = false;\n #resolvedChainId: number | null = null;\n readonly #config: RelayerWebConfig;\n\n constructor(config: RelayerWebConfig) {\n this.#config = config;\n }\n\n async #getWorkerConfig(): Promise<WorkerClientConfig> {\n const chainId = await this.#config.getChainId();\n const { transports, security } = this.#config;\n\n return {\n cdnUrl: CDN_URL,\n fhevmConfig: mergeFhevmConfig(chainId, transports[chainId]),\n csrfToken: security?.getCsrfToken?.() ?? \"\",\n integrity: security?.integrityCheck === false ? undefined : CDN_INTEGRITY,\n logger: this.#config.logger,\n };\n }\n\n /**\n * Ensure the worker is initialized.\n * Uses a promise lock to prevent concurrent initialization.\n * Resets on failure to allow retries.\n */\n async #ensureWorker(): Promise<RelayerWorkerClient> {\n if (this.#ensureLock) return this.#ensureLock;\n this.#ensureLock = this.#ensureWorkerInner();\n try {\n return await this.#ensureLock;\n } finally {\n this.#ensureLock = null;\n }\n }\n\n async #ensureWorkerInner(): Promise<RelayerWorkerClient> {\n if (this.#terminated) {\n throw new EncryptionFailedError(\"RelayerWeb has been terminated\");\n }\n\n const chainId = await this.#config.getChainId();\n\n // Chain changed → tear down old worker, re-init\n if (this.#resolvedChainId !== null && chainId !== this.#resolvedChainId) {\n this.#workerClient?.terminate();\n this.#workerClient = null;\n this.#initPromise = null;\n }\n\n this.#resolvedChainId = chainId;\n\n if (!this.#initPromise) {\n this.#initPromise = this.#initWorker().catch((error) => {\n this.#initPromise = null;\n throw error instanceof TokenError\n ? error\n : new EncryptionFailedError(\"Failed to initialize FHE worker\", {\n cause: error instanceof Error ? error : undefined,\n });\n });\n }\n return this.#initPromise;\n }\n\n /**\n * Initialize the worker (called once via promise lock).\n */\n async #initWorker(): Promise<RelayerWorkerClient> {\n const workerConfig = await this.#getWorkerConfig();\n const client = new RelayerWorkerClient(workerConfig);\n await client.initWorker();\n // If terminate() was called while we were initializing, clean up immediately\n if (this.#terminated) {\n client.terminate();\n throw new Error(\"RelayerWeb was terminated during initialization\");\n }\n this.#workerClient = client;\n return client;\n }\n\n /**\n * Terminate the worker and clean up resources.\n * Call this when the SDK is no longer needed.\n */\n terminate(): void {\n this.#terminated = true;\n if (this.#workerClient) {\n this.#workerClient.terminate();\n this.#workerClient = null;\n }\n this.#initPromise = null;\n this.#ensureLock = null;\n }\n\n /**\n * Refresh the CSRF token in the worker.\n * Call this before making authenticated network requests.\n */\n async #refreshCsrfToken(): Promise<void> {\n if (this.#workerClient) {\n const token = this.#config.security?.getCsrfToken?.() ?? \"\";\n if (token) {\n await this.#workerClient.updateCsrf(token);\n }\n }\n }\n\n /**\n * Generate a keypair for FHE operations.\n */\n async generateKeypair(): Promise<FHEKeypair> {\n const worker = await this.#ensureWorker();\n const result = await worker.generateKeypair();\n return {\n publicKey: result.publicKey,\n privateKey: result.privateKey,\n };\n }\n\n /**\n * Create EIP712 typed data for user decryption authorization.\n */\n async createEIP712(\n publicKey: string,\n contractAddresses: Address[],\n startTimestamp: number,\n durationDays: number = 7,\n ): Promise<EIP712TypedData> {\n const worker = await this.#ensureWorker();\n const result = await worker.createEIP712({\n publicKey,\n contractAddresses,\n startTimestamp,\n durationDays,\n });\n\n const domain = {\n name: result.domain.name,\n version: result.domain.version,\n chainId: result.domain.chainId,\n verifyingContract: result.domain.verifyingContract,\n };\n\n return {\n domain,\n types: {\n EIP712Domain: buildEIP712DomainType(domain),\n UserDecryptRequestVerification: result.types.UserDecryptRequestVerification,\n },\n message: {\n publicKey: result.message.publicKey,\n contractAddresses: result.message.contractAddresses,\n startTimestamp: result.message.startTimestamp,\n durationDays: result.message.durationDays,\n extraData: result.message.extraData,\n },\n };\n }\n\n /**\n * Encrypt values for use in smart contract calls.\n * All values are treated as 64-bit unsigned integers.\n */\n async encrypt(params: EncryptParams): Promise<EncryptResult> {\n const { values, contractAddress, userAddress } = params;\n\n return withRetry(async () => {\n const worker = await this.#ensureWorker();\n await this.#refreshCsrfToken();\n const result = await worker.encrypt({ values, contractAddress, userAddress });\n return { handles: result.handles, inputProof: result.inputProof };\n });\n }\n\n /**\n * Decrypt ciphertexts using user's private key.\n * Requires a valid EIP712 signature.\n */\n async userDecrypt(params: UserDecryptParams): Promise<Record<string, bigint>> {\n return withRetry(async () => {\n const worker = await this.#ensureWorker();\n await this.#refreshCsrfToken();\n const result = await worker.userDecrypt(params);\n return result.clearValues;\n });\n }\n\n /**\n * Public decryption - no authorization needed.\n * Used for publicly visible encrypted values.\n */\n async publicDecrypt(handles: string[]): Promise<PublicDecryptResult> {\n return withRetry(async () => {\n const worker = await this.#ensureWorker();\n await this.#refreshCsrfToken();\n const result = await worker.publicDecrypt(handles);\n return {\n clearValues: result.clearValues,\n abiEncodedClearValues: result.abiEncodedClearValues,\n decryptionProof: result.decryptionProof,\n };\n });\n }\n\n /**\n * Create EIP712 typed data for delegated user decryption authorization.\n */\n async createDelegatedUserDecryptEIP712(\n publicKey: string,\n contractAddresses: Address[],\n delegatorAddress: string,\n startTimestamp: number,\n durationDays: number = 7,\n ): Promise<KmsDelegatedUserDecryptEIP712Type> {\n const worker = await this.#ensureWorker();\n return worker.createDelegatedUserDecryptEIP712({\n publicKey,\n contractAddresses,\n delegatorAddress,\n startTimestamp,\n durationDays,\n });\n }\n\n /**\n * Decrypt ciphertexts via delegation.\n * Requires a valid EIP712 signature from the delegator.\n */\n async delegatedUserDecrypt(params: DelegatedUserDecryptParams): Promise<Record<string, bigint>> {\n return withRetry(async () => {\n const worker = await this.#ensureWorker();\n await this.#refreshCsrfToken();\n const result = await worker.delegatedUserDecrypt(params);\n return result.clearValues;\n });\n }\n\n /**\n * Submit a ZK proof to the relayer for verification.\n */\n async requestZKProofVerification(zkProof: ZKProofLike): Promise<InputProofBytesType> {\n return withRetry(async () => {\n const worker = await this.#ensureWorker();\n await this.#refreshCsrfToken();\n return worker.requestZKProofVerification(zkProof);\n });\n }\n\n /**\n * Get the TFHE compact public key.\n */\n async getPublicKey(): Promise<{\n publicKeyId: string;\n publicKey: Uint8Array;\n } | null> {\n const worker = await this.#ensureWorker();\n return (await worker.getPublicKey()).result;\n }\n\n /**\n * Get public parameters for encryption capacity.\n */\n async getPublicParams(\n bits: number,\n ): Promise<{ publicParams: Uint8Array; publicParamsId: string } | null> {\n const worker = await this.#ensureWorker();\n return (await worker.getPublicParams(bits)).result;\n }\n}\n","export const BATCH_SWAP_ABI = [\n {\n inputs: [\n {\n internalType: \"contract DeploymentCoordinator\",\n name: \"coordinator_\",\n type: \"address\",\n },\n {\n internalType: \"contract RegulatedERC7984Upgradeable\",\n name: \"fromToken_\",\n type: \"address\",\n },\n {\n internalType: \"contract RegulatedERC7984Upgradeable\",\n name: \"toToken_\",\n type: \"address\",\n },\n {\n internalType: \"contract ConfidentialWrapper\",\n name: \"fromWrapper_\",\n type: \"address\",\n },\n {\n internalType: \"contract ConfidentialWrapper\",\n name: \"toWrapper_\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"minBatchDuration_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"batchExpiry_\",\n type: \"uint256\",\n },\n {\n internalType: \"contract ISwapRoute\",\n name: \"swapRoute_\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"minDepositors_\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n inputs: [],\n name: \"AlreadyClaimed\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"BatchExpiredBeforeDispatch\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"BatchNotDispatched\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"BatchNotExpiredOrFailed\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"BatchNotFinalized\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"BatchNotOpen\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ExchangeRateOverflow\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"FinalizeNotSupported\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InsufficientEntropy\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidBatchExpiry\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidFromToken\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidMantissa\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"MinBatchDurationNotMet\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"NoDeposit\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n ],\n name: \"OwnableInvalidOwner\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n ],\n name: \"OwnableUnauthorizedAccount\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"RouteInputMismatch\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"RouteOutputMismatch\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n ],\n name: \"SafeERC20FailedOperation\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"SenderNotAllowed\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"TokenTransferFailed\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"UnknownWrapper\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ZamaProtocolUnsupported\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ZeroAddress\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ZeroCTokenAmount\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"plaintextAmount\",\n type: \"uint256\",\n },\n ],\n name: \"BatchDispatchCallback\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"newBatchId\",\n type: \"uint256\",\n },\n ],\n name: \"BatchDispatched\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n ],\n name: \"BatchExpired\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n ],\n name: \"BatchFailed\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint64\",\n name: \"exchangeRate\",\n type: \"uint64\",\n },\n {\n indexed: false,\n internalType: \"uint64\",\n name: \"mantissa\",\n type: \"uint64\",\n },\n ],\n name: \"BatchFinalized\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"Claimed\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"startIndex\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"endIndex\",\n type: \"uint256\",\n },\n ],\n name: \"ClaimsPushed\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"Deposited\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"operator\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint48\",\n name: \"until\",\n type: \"uint48\",\n },\n ],\n name: \"FinalizeUnwrapOperatorUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferStarted\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"oldRoute\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newRoute\",\n type: \"address\",\n },\n ],\n name: \"SwapRouteUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"TokensRescued\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"Withdrawn\",\n type: \"event\",\n },\n {\n inputs: [],\n name: \"acceptOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"batchExpiry\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n ],\n name: \"claim\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"claim\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"confidentialProtocolId\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"coordinator\",\n outputs: [\n {\n internalType: \"contract DeploymentCoordinator\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"currentBatchId\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n ],\n name: \"dispatchBatch\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n ],\n name: \"finalizeBatch\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"fromToken\",\n outputs: [\n {\n internalType: \"contract RegulatedERC7984Upgradeable\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"fromWrapper\",\n outputs: [\n {\n internalType: \"contract ConfidentialWrapper\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n ],\n name: \"getBatch\",\n outputs: [\n {\n internalType: \"enum Batcher.BatchStatus\",\n name: \"status\",\n type: \"uint8\",\n },\n {\n internalType: \"uint256\",\n name: \"createdAt\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"dispatchedAt\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"totalDepositedPlaintext\",\n type: \"uint256\",\n },\n {\n internalType: \"uint64\",\n name: \"exchangeRate\",\n type: \"uint64\",\n },\n {\n internalType: \"uint64\",\n name: \"mantissa\",\n type: \"uint64\",\n },\n {\n internalType: \"uint256\",\n name: \"depositCount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"unwrapRequestId\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n ],\n name: \"getDepositorCount\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n ],\n name: \"getDepositors\",\n outputs: [\n {\n internalType: \"address[]\",\n name: \"\",\n type: \"address[]\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"hasDeposit\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"isClaimable\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"isClaimed\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"minBatchDuration\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"minDepositors\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"euint64\",\n name: \"amount\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes\",\n name: \"\",\n type: \"bytes\",\n },\n ],\n name: \"onConfidentialTransferReceived\",\n outputs: [\n {\n internalType: \"ebool\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"euint64\",\n name: \"burntAmount\",\n type: \"bytes32\",\n },\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n {\n internalType: \"bytes\",\n name: \"data\",\n type: \"bytes\",\n },\n ],\n name: \"onUnwrapFinalizedReceived\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"pendingOwner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"startIndex\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"count\",\n type: \"uint256\",\n },\n ],\n name: \"pushClaims\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n ],\n name: \"recoverFailedBatch\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"rescueTokens\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"operator\",\n type: \"address\",\n },\n {\n internalType: \"uint48\",\n name: \"until\",\n type: \"uint48\",\n },\n ],\n name: \"setFinalizeUnwrapOperator\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract ISwapRoute\",\n name: \"newRoute\",\n type: \"address\",\n },\n ],\n name: \"setSwapRoute\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"swapRoute\",\n outputs: [\n {\n internalType: \"contract ISwapRoute\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"toToken\",\n outputs: [\n {\n internalType: \"contract RegulatedERC7984Upgradeable\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"toWrapper\",\n outputs: [\n {\n internalType: \"contract ConfidentialWrapper\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"batchId\",\n type: \"uint256\",\n },\n ],\n name: \"withdraw\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n] as const;\n","/**\n * Framework-agnostic event decoders for confidential token contracts.\n * No viem/ethers dependency — works with raw log data from any provider.\n */\n\nimport type { Address } from \"./relayer/relayer-sdk.types\";\n\n// ---------------------------------------------------------------------------\n// Generic log shape\n// ---------------------------------------------------------------------------\n\n/** Framework-agnostic log shape compatible with any Ethereum provider. */\nexport interface RawLog {\n /** Indexed event topics (topic[0] is the event signature hash). */\n readonly topics: readonly string[];\n /** ABI-encoded non-indexed event data. */\n readonly data: string;\n}\n\n// ---------------------------------------------------------------------------\n// Event topic0 constants (keccak256 of canonical signature)\n// ---------------------------------------------------------------------------\n\n/**\n * Event topic0 constants (keccak256 of the canonical Solidity signature).\n * Pass to `getLogs({ topics: [Object.values(Topics)] })` to fetch all events.\n */\nexport const Topics = {\n /** `ConfidentialTransfer(address indexed from, address indexed to, bytes32 indexed amount)` */\n ConfidentialTransfer: \"0x67500e8d0ed826d2194f514dd0d8124f35648ab6e3fb5e6ed867134cffe661e9\",\n /** `Wrapped(uint64 mintAmount, uint256 amountIn, uint256 feeAmount, address indexed to_, uint256 indexed mintTxId)` */\n Wrapped: \"0x1f7907f4d84043abe0fb7c74e8865ee5fe93fe4f691c54a7b8fa9d6fb17c7cba\",\n /** `UnwrapRequested(address indexed receiver, bytes32 amount)` */\n UnwrapRequested: \"0x77d02d353c5629272875d11f1b34ec4c65d7430b075575b78cd2502034c469ee\",\n /** `UnwrappedFinalized(bytes32 indexed burntAmountHandle, ...)` */\n UnwrappedFinalized: \"0xc64e7c81b18b674fc5b037d8a0041bfe3332d86c780a4688f404ee01fbabb152\",\n /** `UnwrappedStarted(bool returnVal, uint256 indexed requestId, ...)` */\n UnwrappedStarted: \"0x3838891d4843c6d7f9f494570b6fd8843f4e3c3ddb817c1411760bd31b819806\",\n} as const;\n\n// ---------------------------------------------------------------------------\n// Typed event interfaces\n// ---------------------------------------------------------------------------\n\n/** Decoded `ConfidentialTransfer` event — an encrypted token transfer. */\nexport interface ConfidentialTransferEvent {\n readonly eventName: \"ConfidentialTransfer\";\n /** Sender address. */\n readonly from: string;\n /** Receiver address. */\n readonly to: string;\n /** FHE ciphertext handle for the transferred amount. */\n readonly encryptedAmountHandle: string;\n}\n\n/** Decoded `Wrapped` event — an ERC-20 shield (wrap) operation. */\nexport interface WrappedEvent {\n readonly eventName: \"Wrapped\";\n /** Confidential tokens minted. */\n readonly mintAmount: bigint;\n /** Underlying ERC-20 tokens deposited. */\n readonly amountIn: bigint;\n /** Fee deducted during wrapping. */\n readonly feeAmount: bigint;\n /** Receiver of the minted confidential tokens. */\n readonly to: string;\n /** On-chain mint transaction ID. */\n readonly mintTxId: bigint;\n}\n\n/** Decoded `UnwrapRequested` event — an unshield request submitted. */\nexport interface UnwrapRequestedEvent {\n readonly eventName: \"UnwrapRequested\";\n /** Address that will receive the unwrapped ERC-20 tokens. */\n readonly receiver: string;\n /** FHE ciphertext handle for the requested unshield amount. */\n readonly encryptedAmount: Address;\n}\n\n/** Decoded `UnwrappedFinalized` event — an unshield completed on-chain. */\nexport interface UnwrappedFinalizedEvent {\n readonly eventName: \"UnwrappedFinalized\";\n /** FHE handle of the burnt confidential balance. */\n readonly burntAmountHandle: string;\n /** Whether the finalization succeeded. */\n readonly finalizeSuccess: boolean;\n /** Whether the fee transfer succeeded. */\n readonly feeTransferSuccess: boolean;\n /** Amount of confidential tokens burnt. */\n readonly burnAmount: bigint;\n /** Amount of underlying ERC-20 tokens returned. */\n readonly unwrapAmount: bigint;\n /** Fee deducted during unwrapping. */\n readonly feeAmount: bigint;\n /** Next on-chain transaction ID. */\n readonly nextTxId: bigint;\n}\n\n/** Decoded `UnwrappedStarted` event — the relayer began processing an unshield. */\nexport interface UnwrappedStartedEvent {\n readonly eventName: \"UnwrappedStarted\";\n /** Whether the unwrap start succeeded. */\n readonly returnVal: boolean;\n /** On-chain request ID. */\n readonly requestId: bigint;\n /** On-chain transaction ID. */\n readonly txId: bigint;\n /** Receiver address. */\n readonly to: string;\n /** Refund address (if applicable). */\n readonly refund: string;\n /** FHE handle of the requested amount. */\n readonly requestedAmount: string;\n /** FHE handle of the burn amount. */\n readonly burnAmount: string;\n}\n\n/** Union of all decoded confidential token event types. */\nexport type TokenEvent =\n | ConfidentialTransferEvent\n | WrappedEvent\n | UnwrapRequestedEvent\n | UnwrappedFinalizedEvent\n | UnwrappedStartedEvent;\n\n// ---------------------------------------------------------------------------\n// ABI decoding helpers (no external deps)\n// ---------------------------------------------------------------------------\n\nfunction topicToAddress(topic: string): string {\n return \"0x\" + topic.slice(-40);\n}\n\nfunction topicToBigInt(topic: string): bigint {\n return BigInt(topic);\n}\n\nfunction topicToBytes32(topic: string): string {\n // topics are already 32-byte hex values with 0x prefix\n return topic;\n}\n\nfunction wordAt(data: string, index: number): string {\n // data starts with \"0x\", each word is 64 hex chars (32 bytes)\n const start = 2 + index * 64;\n const word = data.slice(start, start + 64);\n return word.length === 64 ? word : word.padEnd(64, \"0\");\n}\n\nfunction wordToAddress(data: string, index: number): string {\n return \"0x\" + wordAt(data, index).slice(-40);\n}\n\nfunction wordToBigInt(data: string, index: number): bigint {\n return BigInt(\"0x\" + wordAt(data, index));\n}\n\nfunction wordToBool(data: string, index: number): boolean {\n return BigInt(\"0x\" + wordAt(data, index)) !== 0n;\n}\n\nfunction wordToBytes32(data: string, index: number): Address {\n return `0x${wordAt(data, index)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Individual decoders\n// ---------------------------------------------------------------------------\n\n/**\n * ConfidentialTransfer(address indexed from, address indexed to, bytes32 indexed amount)\n * All 3 params indexed → topics[1..3], no data.\n */\nexport function decodeConfidentialTransfer(log: RawLog): ConfidentialTransferEvent | null {\n if (log.topics[0] !== Topics.ConfidentialTransfer) return null;\n if (log.topics.length < 4) return null;\n\n return {\n eventName: \"ConfidentialTransfer\",\n from: topicToAddress(log.topics[1]!),\n to: topicToAddress(log.topics[2]!),\n encryptedAmountHandle: topicToBytes32(log.topics[3]!),\n };\n}\n\n/**\n * Wrapped(uint64 mintAmount, uint256 amountIn, uint256 feeAmount, address indexed to_, uint256 indexed mintTxId)\n * Indexed: to_ (topics[1]), mintTxId (topics[2])\n * Data: mintAmount (uint64, abi-encoded as uint256), amountIn, feeAmount\n */\nexport function decodeWrapped(log: RawLog): WrappedEvent | null {\n if (log.topics[0] !== Topics.Wrapped) return null;\n if (log.topics.length < 3) return null;\n\n return {\n eventName: \"Wrapped\",\n to: topicToAddress(log.topics[1]!),\n mintTxId: topicToBigInt(log.topics[2]!),\n mintAmount: wordToBigInt(log.data, 0),\n amountIn: wordToBigInt(log.data, 1),\n feeAmount: wordToBigInt(log.data, 2),\n };\n}\n\n/**\n * UnwrapRequested(address indexed receiver, bytes32 amount)\n * Indexed: receiver (topics[1])\n * Data: amount (bytes32)\n */\nexport function decodeUnwrapRequested(log: RawLog): UnwrapRequestedEvent | null {\n if (log.topics[0] !== Topics.UnwrapRequested) return null;\n if (log.topics.length < 2) return null;\n\n return {\n eventName: \"UnwrapRequested\",\n receiver: topicToAddress(log.topics[1]!),\n encryptedAmount: wordToBytes32(log.data, 0),\n };\n}\n\n/**\n * UnwrappedFinalized(bytes32 indexed burntAmountHandle, bool finalizeSuccess, bool feeTransferSuccess,\n * uint64 burnAmount, uint256 unwrapAmount, uint256 feeAmount, uint256 indexed nextTxId)\n * Indexed: burntAmountHandle (topics[1]), nextTxId (topics[2])\n * Data: finalizeSuccess, feeTransferSuccess, burnAmount, unwrapAmount, feeAmount\n */\nexport function decodeUnwrappedFinalized(log: RawLog): UnwrappedFinalizedEvent | null {\n if (log.topics[0] !== Topics.UnwrappedFinalized) return null;\n if (log.topics.length < 3) return null;\n\n return {\n eventName: \"UnwrappedFinalized\",\n burntAmountHandle: topicToBytes32(log.topics[1]!),\n nextTxId: topicToBigInt(log.topics[2]!),\n finalizeSuccess: wordToBool(log.data, 0),\n feeTransferSuccess: wordToBool(log.data, 1),\n burnAmount: wordToBigInt(log.data, 2),\n unwrapAmount: wordToBigInt(log.data, 3),\n feeAmount: wordToBigInt(log.data, 4),\n };\n}\n\n/**\n * UnwrappedStarted(bool returnVal, uint256 indexed requestId, uint256 indexed txId, address indexed to,\n * address refund, bytes32 requestedAmount, bytes32 burnAmount)\n * Indexed: requestId (topics[1]), txId (topics[2]), to (topics[3])\n * Data: returnVal, refund, requestedAmount, burnAmount\n */\nexport function decodeUnwrappedStarted(log: RawLog): UnwrappedStartedEvent | null {\n if (log.topics[0] !== Topics.UnwrappedStarted) return null;\n if (log.topics.length < 4) return null;\n\n return {\n eventName: \"UnwrappedStarted\",\n requestId: topicToBigInt(log.topics[1]!),\n txId: topicToBigInt(log.topics[2]!),\n to: topicToAddress(log.topics[3]!),\n returnVal: wordToBool(log.data, 0),\n refund: wordToAddress(log.data, 1),\n requestedAmount: wordToBytes32(log.data, 2),\n burnAmount: wordToBytes32(log.data, 3),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Convenience helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Try all decoders on a single log and return the first match, or `null`.\n *\n * @example\n * ```ts\n * const event = decodeTokenEvent(log);\n * if (event?.eventName === \"ConfidentialTransfer\") {\n * console.log(event.from, event.to);\n * }\n * ```\n */\nexport function decodeTokenEvent(log: RawLog): TokenEvent | null {\n return (\n decodeConfidentialTransfer(log) ??\n decodeWrapped(log) ??\n decodeUnwrapRequested(log) ??\n decodeUnwrappedFinalized(log) ??\n decodeUnwrappedStarted(log)\n );\n}\n\n/**\n * Batch-decode an array of logs, skipping unrecognized entries.\n *\n * @example\n * ```ts\n * const events = decodeTokenEvents(receipt.logs);\n * ```\n */\nexport function decodeTokenEvents(logs: readonly RawLog[]): TokenEvent[] {\n const events: TokenEvent[] = [];\n for (const log of logs) {\n const event = decodeTokenEvent(log);\n if (event) events.push(event);\n }\n return events;\n}\n\n/**\n * Find the first {@link UnwrapRequestedEvent} in a logs array.\n *\n * @example\n * ```ts\n * const event = findUnwrapRequested(receipt.logs);\n * if (event) console.log(event.receiver, event.encryptedAmount);\n * ```\n */\nexport function findUnwrapRequested(logs: readonly RawLog[]): UnwrapRequestedEvent | null {\n for (const log of logs) {\n const event = decodeUnwrapRequested(log);\n if (event) return event;\n }\n return null;\n}\n\n/**\n * Find the first {@link WrappedEvent} in a logs array.\n *\n * @example\n * ```ts\n * const event = findWrapped(receipt.logs);\n * if (event) console.log(event.to, event.amountIn);\n * ```\n */\nexport function findWrapped(logs: readonly RawLog[]): WrappedEvent | null {\n for (const log of logs) {\n const event = decodeWrapped(log);\n if (event) return event;\n }\n return null;\n}\n\n/**\n * All 5 confidential token event topic0 hashes.\n * Pass to `getLogs({ topics: [TOKEN_TOPICS] })` to fetch\n * all confidential token events in a single RPC call.\n */\nexport const TOKEN_TOPICS = [\n Topics.ConfidentialTransfer,\n Topics.Wrapped,\n Topics.UnwrapRequested,\n Topics.UnwrappedFinalized,\n Topics.UnwrappedStarted,\n] as const;\n","import type { RelayerSDK } from \"../relayer/relayer-sdk\";\nimport type { Address } from \"../relayer/relayer-sdk.types\";\nimport type { GenericSigner, GenericStringStorage, StoredCredentials } from \"./token.types\";\nimport { SigningRejectedError, SigningFailedError } from \"./errors\";\nimport { assertObject, assertString, assertArray } from \"../utils\";\n\n/** Encrypted data format with IV for AES-GCM decryption. */\ninterface EncryptedData {\n iv: string; // Base64-encoded IV\n ciphertext: string; // Base64-encoded encrypted data\n}\n\n/** Internal storage shape — privateKey is replaced by its encrypted form. */\ninterface EncryptedCredentials extends Omit<StoredCredentials, \"privateKey\"> {\n encryptedPrivateKey: EncryptedData;\n}\n\n/**\n * Manages FHE decrypt credentials (keypair + EIP-712 signature).\n * Generates and refreshes credentials transparently.\n *\n * The privateKey is encrypted with AES-GCM (key derived from the\n * wallet signature via PBKDF2) before being written to the store.\n */\n/** Configuration for constructing a {@link CredentialsManager}. */\nexport interface CredentialsManagerConfig {\n /** FHE relayer backend for keypair generation and EIP-712 creation. */\n sdk: RelayerSDK;\n /** Wallet signer for signing EIP-712 typed data. */\n signer: GenericSigner;\n /** Credential storage backend for persisting encrypted credentials. */\n storage: GenericStringStorage;\n /** Number of days generated credentials remain valid. */\n durationDays: number;\n}\n\nexport class CredentialsManager {\n #sdk: RelayerSDK;\n #signer: GenericSigner;\n #storage: GenericStringStorage;\n #durationDays: number;\n #createPromise: Promise<StoredCredentials> | null = null;\n #createPromiseKey: string | null = null;\n\n constructor(config: CredentialsManagerConfig) {\n this.#sdk = config.sdk;\n this.#signer = config.signer;\n this.#storage = config.storage;\n this.#durationDays = config.durationDays;\n }\n\n /**\n * Get or create FHE credentials for a single contract address.\n * Shorthand for `getAll([contractAddress])`.\n *\n * @example\n * ```ts\n * const creds = await credentials.get(\"0xTokenAddress\");\n * ```\n */\n async get(contractAddress: Address): Promise<StoredCredentials> {\n return this.getAll([contractAddress]);\n }\n\n /**\n * Get or create FHE credentials covering multiple contract addresses.\n * Returns cached credentials if still valid and covering all addresses,\n * otherwise generates a fresh keypair and requests an EIP-712 signature.\n *\n * @example\n * ```ts\n * const creds = await credentials.getAll([\"0xTokenA\", \"0xTokenB\"]);\n * ```\n */\n async getAll(contractAddresses: Address[]): Promise<StoredCredentials> {\n const storeKey = await this.#storeKey();\n try {\n const stored = await this.#storage.getItem(storeKey);\n if (stored) {\n const encrypted = JSON.parse(stored) as unknown;\n this.#assertEncryptedCredentials(encrypted);\n const creds = await this.#decryptCredentials(encrypted);\n if (this.#isValid(creds, contractAddresses)) {\n return creds;\n }\n }\n } catch {\n // Stored credentials unreadable (corrupt, schema change, decryption failure) — regenerate.\n try {\n await this.#storage.removeItem(storeKey);\n } catch {\n // Best effort cleanup\n }\n }\n\n const key = contractAddresses.slice().sort().join(\",\");\n if (!this.#createPromise || this.#createPromiseKey !== key) {\n this.#createPromiseKey = key;\n this.#createPromise = this.create(contractAddresses).finally(() => {\n this.#createPromise = null;\n this.#createPromiseKey = null;\n });\n }\n return this.#createPromise;\n }\n\n /**\n * Check if stored credentials exist and are expired.\n * Returns `true` if credentials are stored but past their expiration time.\n * Returns `false` if no credentials are stored or if they are still valid.\n *\n * Use this to proactively detect expiration and show appropriate UI\n * (e.g. \"Re-authorizing...\" instead of a generic loading state).\n *\n * @param contractAddress - Optional contract address to check coverage for.\n * When provided, also returns `true` if credentials don't cover this address.\n *\n * @example\n * ```ts\n * if (await credentials.isExpired(\"0xTokenAddress\")) {\n * showReauthorizingUI();\n * }\n * ```\n */\n async isExpired(contractAddress?: Address): Promise<boolean> {\n const storeKey = await this.#storeKey();\n try {\n const stored = await this.#storage.getItem(storeKey);\n if (!stored) return false;\n\n const encrypted = JSON.parse(stored) as unknown;\n this.#assertEncryptedCredentials(encrypted);\n const creds = await this.#decryptCredentials(encrypted);\n\n const requiredContracts = contractAddress ? [contractAddress] : [];\n return !this.#isValid(creds, requiredContracts);\n } catch {\n return false;\n }\n }\n\n /**\n * Delete stored credentials for the connected wallet (best-effort).\n *\n * @example\n * ```ts\n * await credentials.clear();\n * ```\n */\n async clear(): Promise<void> {\n const storeKey = await this.#storeKey();\n try {\n await this.#storage.removeItem(storeKey);\n } catch {\n // Best effort\n }\n }\n\n /** Returns a truncated SHA-256 hash of the address to avoid leaking it in storage. */\n async #storeKey(): Promise<string> {\n const address = (await this.#signer.getAddress()).toLowerCase();\n const hash = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(address));\n const hex = Array.from(new Uint8Array(hash))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return hex.slice(0, 32);\n }\n\n // ── Validation ──────────────────────────────────────────────\n\n #assertEncryptedCredentials(data: unknown): asserts data is EncryptedCredentials {\n assertObject(data, \"Stored credentials\");\n assertString(data.signature, \"credentials.signature\");\n assertArray(data.contractAddresses, \"credentials.contractAddresses\");\n assertObject(data.encryptedPrivateKey, \"credentials.encryptedPrivateKey\");\n assertString(data.encryptedPrivateKey.iv, \"encryptedPrivateKey.iv\");\n assertString(data.encryptedPrivateKey.ciphertext, \"encryptedPrivateKey.ciphertext\");\n }\n\n #isValid(creds: StoredCredentials, requiredContracts: Address[]): boolean {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const expiresAt = creds.startTimestamp + creds.durationDays * 86400;\n if (nowSeconds >= expiresAt) return false;\n\n const signedSet = new Set(creds.contractAddresses.map((a) => a.toLowerCase()));\n return requiredContracts.every((addr) => signedSet.has(addr.toLowerCase()));\n }\n\n // ── Credential generation ───────────────────────────────────\n\n /**\n * Generate a fresh FHE keypair, create an EIP-712 authorization, and\n * prompt the user to sign it. Persists the encrypted credentials to storage.\n *\n * @example\n * ```ts\n * const creds = await credentials.create([\"0xTokenAddress\"]);\n * ```\n */\n async create(contractAddresses: Address[]): Promise<StoredCredentials> {\n try {\n const keypair = await this.#sdk.generateKeypair();\n const startTimestamp = Math.floor(Date.now() / 1000);\n\n const eip712 = await this.#sdk.createEIP712(\n keypair.publicKey,\n contractAddresses,\n startTimestamp,\n this.#durationDays,\n );\n\n const signature = await this.#signer.signTypedData(eip712);\n\n const creds: StoredCredentials = {\n publicKey: keypair.publicKey,\n privateKey: keypair.privateKey,\n signature,\n contractAddresses,\n startTimestamp,\n durationDays: this.#durationDays,\n };\n\n const storeKey = await this.#storeKey();\n try {\n const encrypted = await this.#encryptCredentials(creds);\n await this.#storage.setItem(storeKey, JSON.stringify(encrypted));\n } catch {\n // Store write failed — credentials still usable in memory\n }\n\n return creds;\n } catch (error) {\n const isRejected =\n (error instanceof Error && \"code\" in error && error.code === 4001) ||\n (error instanceof Error &&\n (error.message.includes(\"rejected\") || error.message.includes(\"denied\")));\n if (isRejected) {\n throw new SigningRejectedError(\"User rejected the decrypt authorization signature\", {\n cause: error,\n });\n }\n throw new SigningFailedError(\"Failed to create decrypt credentials\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n // ── AES-GCM encryption (ported from KeypairDB) ─────────────\n\n async #encryptCredentials(creds: StoredCredentials): Promise<EncryptedCredentials> {\n const address = (await this.#signer.getAddress()).toLowerCase();\n const encryptedPrivateKey = await this.#encrypt(creds.privateKey, creds.signature, address);\n const { privateKey: _, ...rest } = creds;\n return { ...rest, encryptedPrivateKey };\n }\n\n async #decryptCredentials(encrypted: EncryptedCredentials): Promise<StoredCredentials> {\n const address = (await this.#signer.getAddress()).toLowerCase();\n const privateKey = await this.#decrypt(\n encrypted.encryptedPrivateKey,\n encrypted.signature,\n address,\n );\n const { encryptedPrivateKey: _, ...rest } = encrypted;\n return { ...rest, privateKey };\n }\n\n /**\n * Derives an AES-GCM encryption key from a wallet signature using PBKDF2.\n * The signature is a secret known only to the wallet holder, providing\n * meaningful encryption protection for the stored private key.\n */\n async #deriveKey(signature: string, address: string): Promise<CryptoKey> {\n const encoder = new TextEncoder();\n const keyMaterial = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(signature),\n \"PBKDF2\",\n false,\n [\"deriveKey\"],\n );\n\n return crypto.subtle.deriveKey(\n {\n name: \"PBKDF2\",\n salt: encoder.encode(address),\n iterations: 600_000,\n hash: \"SHA-256\",\n },\n keyMaterial,\n { name: \"AES-GCM\", length: 256 },\n false,\n [\"encrypt\", \"decrypt\"],\n );\n }\n\n /** Encrypts a string using AES-GCM with a key derived from the wallet signature. */\n async #encrypt(plaintext: string, signature: string, address: string): Promise<EncryptedData> {\n const key = await this.#deriveKey(signature, address);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoder = new TextEncoder();\n\n const ciphertext = await crypto.subtle.encrypt(\n { name: \"AES-GCM\", iv },\n key,\n encoder.encode(plaintext),\n );\n\n return {\n iv: btoa(String.fromCharCode(...iv)),\n ciphertext: btoa(String.fromCharCode(...new Uint8Array(ciphertext))),\n };\n }\n\n /** Decrypts AES-GCM encrypted data using a key derived from the wallet signature. */\n async #decrypt(encrypted: EncryptedData, signature: string, address: string): Promise<string> {\n const key = await this.#deriveKey(signature, address);\n const iv = Uint8Array.from(atob(encrypted.iv), (c) => c.charCodeAt(0));\n const ciphertext = Uint8Array.from(atob(encrypted.ciphertext), (c) => c.charCodeAt(0));\n\n const plaintext = await crypto.subtle.decrypt({ name: \"AES-GCM\", iv }, key, ciphertext);\n\n return new TextDecoder().decode(plaintext);\n }\n}\n","import {\n ERC7984_INTERFACE_ID,\n ERC7984_WRAPPER_INTERFACE_ID,\n allowanceContract,\n confidentialBalanceOfContract,\n decimalsContract,\n nameContract,\n supportsInterfaceContract,\n symbolContract,\n underlyingContract,\n wrapperExistsContract,\n getWrapperContract,\n} from \"../contracts\";\nimport type { RelayerSDK } from \"../relayer/relayer-sdk\";\nimport type { Address } from \"../relayer/relayer-sdk.types\";\nimport { normalizeAddress } from \"../utils\";\nimport type { GenericSigner, GenericStringStorage } from \"./token.types\";\nimport { DecryptionFailedError, NoCiphertextError, RelayerRequestFailedError } from \"./errors\";\nimport { CredentialsManager } from \"./credential-manager\";\n\n/** 32-byte zero handle, used to detect uninitialized encrypted balances. */\nexport const ZERO_HANDLE =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\" as const;\n\n/** Configuration for constructing a {@link ReadonlyToken}. */\nexport interface ReadonlyTokenConfig {\n /** FHE relayer backend. */\n sdk: RelayerSDK;\n /** Wallet signer for read calls and credential signing. */\n signer: GenericSigner;\n /** Credential storage backend. */\n storage: GenericStringStorage;\n /** Address of the confidential token contract. */\n address: Address;\n /** Number of days FHE credentials remain valid. Default: `1`. */\n durationDays?: number;\n}\n\n/**\n * Read-only interface for a confidential token.\n * Supports balance queries, authorization, and ERC-165 checks.\n * Does not require a wrapper address.\n */\nexport class ReadonlyToken {\n protected readonly credentials: CredentialsManager;\n protected readonly sdk: RelayerSDK;\n readonly signer: GenericSigner;\n readonly address: Address;\n\n constructor(config: ReadonlyTokenConfig) {\n const address = normalizeAddress(config.address, \"address\");\n this.credentials = new CredentialsManager({\n sdk: config.sdk,\n signer: config.signer,\n storage: config.storage,\n durationDays: config.durationDays ?? 1,\n });\n this.sdk = config.sdk;\n this.signer = config.signer;\n this.address = address;\n }\n\n /**\n * Decrypt and return the plaintext balance for the given owner.\n * Generates FHE credentials automatically if they don't exist.\n *\n * @example\n * ```ts\n * const balance = await token.balanceOf();\n * // or for another address:\n * const balance = await token.balanceOf(\"0xOwner\");\n * ```\n */\n async balanceOf(owner?: Address): Promise<bigint> {\n const ownerAddress = owner ? normalizeAddress(owner, \"owner\") : await this.signer.getAddress();\n const handle = await this.readConfidentialBalanceOf(ownerAddress);\n\n if (this.isZeroHandle(handle)) return BigInt(0);\n\n const creds = await this.credentials.get(this.address);\n\n try {\n const result = await this.sdk.userDecrypt({\n handles: [handle],\n contractAddress: this.address,\n signedContractAddresses: creds.contractAddresses,\n privateKey: creds.privateKey,\n publicKey: creds.publicKey,\n signature: creds.signature,\n signerAddress: await this.signer.getAddress(),\n startTimestamp: creds.startTimestamp,\n durationDays: creds.durationDays,\n });\n\n return result[handle] ?? BigInt(0);\n } catch (error) {\n throw wrapDecryptError(error, \"Failed to decrypt balance\");\n }\n }\n\n /**\n * Return the raw encrypted balance handle without decrypting.\n *\n * @example\n * ```ts\n * const handle = await token.confidentialBalanceOf();\n * ```\n */\n async confidentialBalanceOf(owner?: Address): Promise<Address> {\n const ownerAddress = owner ? normalizeAddress(owner, \"owner\") : await this.signer.getAddress();\n return this.readConfidentialBalanceOf(ownerAddress);\n }\n\n /**\n * ERC-165 check for {@link ERC7984_INTERFACE_ID} support.\n *\n * @example\n * ```ts\n * if (await token.isConfidential()) {\n * // Token supports encrypted operations\n * }\n * ```\n */\n async isConfidential(): Promise<boolean> {\n const result = await this.signer.readContract(\n supportsInterfaceContract(this.address, ERC7984_INTERFACE_ID),\n );\n return result === true;\n }\n\n /**\n * ERC-165 check for {@link ERC7984_WRAPPER_INTERFACE_ID} support.\n *\n * @example\n * ```ts\n * if (await token.isWrapper()) {\n * // Token is a confidential wrapper\n * }\n * ```\n */\n async isWrapper(): Promise<boolean> {\n const result = await this.signer.readContract(\n supportsInterfaceContract(this.address, ERC7984_WRAPPER_INTERFACE_ID),\n );\n return result === true;\n }\n\n /**\n * Decrypt balances for multiple tokens in parallel.\n * Shares a single set of credentials across all tokens.\n *\n * **Warning:** If a per-token decryption fails and no `onError` callback is\n * provided, the failed token's balance is silently set to `0n` in the result\n * map. Always pass `onError` if you need to detect partial failures.\n *\n * @example\n * ```ts\n * const balances = await ReadonlyToken.batchBalanceOf(tokens);\n * for (const [address, balance] of balances) {\n * console.log(address, balance);\n * }\n * ```\n */\n static async batchBalanceOf(\n tokens: ReadonlyToken[],\n owner?: Address,\n onError?: (address: Address, error: Error) => void,\n ): Promise<Map<Address, bigint>> {\n if (tokens.length === 0) return new Map();\n\n const sdk = tokens[0]!.sdk;\n const signer = tokens[0]!.signer;\n const ownerAddress = owner ?? (await signer.getAddress());\n const allAddresses = tokens.map((t) => t.address);\n\n const creds = await tokens[0]!.credentials.getAll(allAddresses);\n\n const handles = await Promise.all(tokens.map((t) => t.readConfidentialBalanceOf(ownerAddress)));\n\n const results = new Map<Address, bigint>();\n const decryptPromises: Promise<void>[] = [];\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n const handle = handles[i]!;\n\n if (token.isZeroHandle(handle)) {\n results.set(token.address, BigInt(0));\n continue;\n }\n\n decryptPromises.push(\n sdk\n .userDecrypt({\n handles: [handle],\n contractAddress: token.address,\n signedContractAddresses: creds.contractAddresses,\n privateKey: creds.privateKey,\n publicKey: creds.publicKey,\n signature: creds.signature,\n signerAddress: ownerAddress,\n startTimestamp: creds.startTimestamp,\n durationDays: creds.durationDays,\n })\n .then((result) => {\n results.set(token.address, result[handle] ?? BigInt(0));\n })\n .catch((error) => {\n onError?.(token.address, error instanceof Error ? error : new Error(String(error)));\n results.set(token.address, BigInt(0));\n }),\n );\n }\n\n await Promise.all(decryptPromises);\n return results;\n }\n\n /**\n * Decrypt pre-fetched encrypted handles for multiple tokens in parallel.\n * Use when you already have handles from {@link confidentialBalanceOf}.\n *\n * **Warning:** If a per-token decryption fails and no `onError` callback is\n * provided, the failed token's balance is silently set to `0n` in the result\n * map. Always pass `onError` if you need to detect partial failures.\n *\n * @example\n * ```ts\n * const handles = await Promise.all(tokens.map(t => t.confidentialBalanceOf()));\n * const balances = await ReadonlyToken.batchDecryptBalances(\n * tokens, handles, owner,\n * (addr, err) => console.error(`Decrypt failed for ${addr}`, err),\n * );\n * ```\n */\n static async batchDecryptBalances(\n tokens: ReadonlyToken[],\n handles: Address[],\n owner?: Address,\n onError?: (address: Address, error: Error) => void,\n ): Promise<Map<Address, bigint>> {\n if (tokens.length === 0) return new Map();\n if (tokens.length !== handles.length) {\n throw new DecryptionFailedError(\n `tokens.length (${tokens.length}) must equal handles.length (${handles.length})`,\n );\n }\n\n const sdk = tokens[0]!.sdk;\n const signer = tokens[0]!.signer;\n const allAddresses = tokens.map((t) => t.address);\n const creds = await tokens[0]!.credentials.getAll(allAddresses);\n const signerAddress = owner ?? (await signer.getAddress());\n\n const results = new Map<Address, bigint>();\n const decryptPromises: Promise<void>[] = [];\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n const handle = handles[i]!;\n\n if (token.isZeroHandle(handle)) {\n results.set(token.address, BigInt(0));\n continue;\n }\n\n decryptPromises.push(\n sdk\n .userDecrypt({\n handles: [handle],\n contractAddress: token.address,\n signedContractAddresses: creds.contractAddresses,\n privateKey: creds.privateKey,\n publicKey: creds.publicKey,\n signature: creds.signature,\n signerAddress,\n startTimestamp: creds.startTimestamp,\n durationDays: creds.durationDays,\n })\n .then((result) => {\n results.set(token.address, result[handle] ?? BigInt(0));\n })\n .catch((error) => {\n onError?.(token.address, error instanceof Error ? error : new Error(String(error)));\n results.set(token.address, BigInt(0));\n }),\n );\n }\n\n await Promise.all(decryptPromises);\n return results;\n }\n\n /**\n * Look up the wrapper contract for this token via the deployment coordinator.\n * Returns `null` if no wrapper is deployed.\n *\n * @example\n * ```ts\n * const wrapper = await token.discoverWrapper(\"0xCoordinator\");\n * if (wrapper) {\n * const fullToken = sdk.createToken(token.address, wrapper);\n * }\n * ```\n */\n async discoverWrapper(coordinatorAddress: Address): Promise<Address | null> {\n const coordinator = normalizeAddress(coordinatorAddress, \"coordinatorAddress\");\n const exists = await this.signer.readContract<boolean>(\n wrapperExistsContract(coordinator, this.address),\n );\n if (!exists) return null;\n return this.signer.readContract<Address>(getWrapperContract(coordinator, this.address));\n }\n\n /**\n * Read the underlying ERC-20 address from this token's wrapper contract.\n *\n * @example\n * ```ts\n * const underlying = await token.underlyingToken();\n * ```\n */\n async underlyingToken(): Promise<Address> {\n return this.signer.readContract<Address>(underlyingContract(this.address));\n }\n\n /**\n * Read the ERC-20 allowance of the underlying token for a given wrapper.\n *\n * @example\n * ```ts\n * const allowance = await token.allowance(\"0xWrapper\");\n * ```\n */\n async allowance(wrapper: Address, owner?: Address): Promise<bigint> {\n const normalizedWrapper = normalizeAddress(wrapper, \"wrapper\");\n const underlying = await this.signer.readContract<Address>(\n underlyingContract(normalizedWrapper),\n );\n const userAddress = owner ? normalizeAddress(owner, \"owner\") : await this.signer.getAddress();\n return this.signer.readContract<bigint>(\n allowanceContract(underlying, userAddress, normalizedWrapper),\n );\n }\n\n /**\n * Read the token name from the contract.\n *\n * @example\n * ```ts\n * const name = await token.name(); // \"Wrapped USDC\"\n * ```\n */\n async name(): Promise<string> {\n return this.signer.readContract<string>(nameContract(this.address));\n }\n\n /**\n * Read the token symbol from the contract.\n *\n * @example\n * ```ts\n * const symbol = await token.symbol(); // \"cUSDC\"\n * ```\n */\n async symbol(): Promise<string> {\n return this.signer.readContract<string>(symbolContract(this.address));\n }\n\n /**\n * Read the token decimals from the contract.\n *\n * @example\n * ```ts\n * const decimals = await token.decimals(); // 6\n * ```\n */\n async decimals(): Promise<number> {\n return this.signer.readContract<number>(decimalsContract(this.address));\n }\n\n /**\n * Ensure FHE decrypt credentials exist for this token.\n * Generates a keypair and requests an EIP-712 signature if needed.\n * Call this before any decrypt operation to avoid mid-flow wallet prompts.\n *\n * @example\n * ```ts\n * await token.authorize();\n * // Credentials are now cached — subsequent decrypts won't prompt\n * const balance = await token.balanceOf();\n * ```\n */\n async authorize(): Promise<void> {\n await this.credentials.get(this.address);\n }\n\n /**\n * Ensure FHE decrypt credentials exist for all given tokens in a single\n * wallet signature. Call this early (e.g. after loading the token list) so\n * that subsequent individual decrypt operations reuse cached credentials.\n *\n * @example\n * ```ts\n * const tokens = addresses.map(a => sdk.createReadonlyToken(a));\n * await ReadonlyToken.authorizeAll(tokens);\n * // All tokens now share the same credentials\n * ```\n */\n static async authorizeAll(tokens: ReadonlyToken[]): Promise<void> {\n if (tokens.length === 0) return;\n const allAddresses = tokens.map((t) => t.address);\n await tokens[0]!.credentials.getAll(allAddresses);\n }\n\n protected async readConfidentialBalanceOf(owner: Address): Promise<Address> {\n const result = await this.signer.readContract(\n confidentialBalanceOfContract(this.address, owner),\n );\n return this.normalizeHandle(result);\n }\n\n protected normalizeHandle(value: unknown): Address {\n if (typeof value === \"string\" && value.startsWith(\"0x\")) {\n return value as Address;\n }\n if (typeof value === \"bigint\") {\n return `0x${value.toString(16).padStart(64, \"0\")}`;\n }\n return ZERO_HANDLE;\n }\n\n isZeroHandle(handle: string): handle is typeof ZERO_HANDLE | `0x` {\n return handle === ZERO_HANDLE || handle === \"0x\";\n }\n\n /**\n * Decrypt a single encrypted handle into a plaintext bigint.\n * Returns `0n` for zero handles without calling the relayer.\n *\n * @example\n * ```ts\n * const handle = await token.confidentialBalanceOf();\n * const value = await token.decryptBalance(handle);\n * ```\n */\n async decryptBalance(handle: Address, owner?: Address): Promise<bigint> {\n if (this.isZeroHandle(handle)) return BigInt(0);\n\n const creds = await this.credentials.get(this.address);\n\n try {\n const result = await this.sdk.userDecrypt({\n handles: [handle],\n contractAddress: this.address,\n signedContractAddresses: creds.contractAddresses,\n privateKey: creds.privateKey,\n publicKey: creds.publicKey,\n signature: creds.signature,\n signerAddress: owner ?? (await this.signer.getAddress()),\n startTimestamp: creds.startTimestamp,\n durationDays: creds.durationDays,\n });\n\n return result[handle] ?? BigInt(0);\n } catch (error) {\n throw wrapDecryptError(error, \"Failed to decrypt balance\");\n }\n }\n\n /**\n * Batch-decrypt arbitrary encrypted handles in a single relayer call.\n * Zero handles are returned as 0n without hitting the relayer.\n */\n async decryptHandles(handles: Address[], owner?: Address): Promise<Map<Address, bigint>> {\n const results = new Map<Address, bigint>();\n const nonZeroHandles: Address[] = [];\n\n for (const handle of handles) {\n if (this.isZeroHandle(handle)) {\n results.set(handle, BigInt(0));\n } else {\n nonZeroHandles.push(handle);\n }\n }\n\n if (nonZeroHandles.length === 0) return results;\n\n const creds = await this.credentials.get(this.address);\n\n try {\n const decrypted = await this.sdk.userDecrypt({\n handles: nonZeroHandles,\n contractAddress: this.address,\n signedContractAddresses: creds.contractAddresses,\n privateKey: creds.privateKey,\n publicKey: creds.publicKey,\n signature: creds.signature,\n signerAddress: owner ?? (await this.signer.getAddress()),\n startTimestamp: creds.startTimestamp,\n durationDays: creds.durationDays,\n });\n\n for (const handle of nonZeroHandles) {\n results.set(handle, decrypted[handle] ?? BigInt(0));\n }\n } catch (error) {\n throw wrapDecryptError(error, \"Failed to decrypt handles\");\n }\n\n return results;\n }\n}\n\n/**\n * Inspect a caught error for an HTTP status code and return the appropriate\n * typed SDK error (NoCiphertextError for 400, RelayerRequestFailedError for\n * other HTTP errors, or the generic DecryptionFailedError as fallback).\n */\nfunction wrapDecryptError(error: unknown, fallbackMessage: string): Error {\n if (error instanceof NoCiphertextError || error instanceof RelayerRequestFailedError) {\n return error;\n }\n\n const statusCode =\n error != null &&\n typeof error === \"object\" &&\n \"statusCode\" in error &&\n typeof (error as Record<string, unknown>).statusCode === \"number\"\n ? ((error as Record<string, unknown>).statusCode as number)\n : undefined;\n\n if (statusCode === 400) {\n return new NoCiphertextError(\n error instanceof Error ? error.message : \"No ciphertext for this account\",\n { cause: error instanceof Error ? error : undefined },\n );\n }\n\n if (statusCode !== undefined) {\n return new RelayerRequestFailedError(\n error instanceof Error ? error.message : fallbackMessage,\n statusCode,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n\n return new DecryptionFailedError(fallbackMessage, {\n cause: error instanceof Error ? error : undefined,\n });\n}\n","import {\n allowanceContract,\n approveContract,\n confidentialTransferContract,\n confidentialTransferFromContract,\n finalizeUnwrapContract,\n isOperatorContract,\n setOperatorContract,\n underlyingContract,\n unwrapContract,\n unwrapFromBalanceContract,\n wrapContract,\n wrapETHContract,\n} from \"../contracts\";\nimport { findUnwrapRequested } from \"../events\";\nimport type { Address, Hex } from \"../relayer/relayer-sdk.types\";\nimport { normalizeAddress } from \"../utils\";\nimport {\n TokenError,\n EncryptionFailedError,\n ApprovalFailedError,\n TransactionRevertedError,\n DecryptionFailedError,\n} from \"./errors\";\nimport { ReadonlyToken, type ReadonlyTokenConfig } from \"./readonly-token\";\nimport type { UnshieldCallbacks } from \"./token.types\";\n\n/**\n * ERC-20-like interface for a single confidential token.\n * Hides all FHE complexity (encryption, decryption, EIP-712 signing)\n * behind familiar methods.\n *\n * Extends ReadonlyToken with write operations\n * (transfer, shield, unshield).\n */\nexport interface TokenConfig extends ReadonlyTokenConfig {\n /** Override the wrapper address. Defaults to `address` (the token IS the wrapper). */\n wrapper?: Address;\n}\n\nexport class Token extends ReadonlyToken {\n static readonly ZERO_ADDRESS: Address = \"0x0000000000000000000000000000000000000000\";\n\n readonly wrapper: Address;\n #underlying: Address | undefined;\n #underlyingPromise: Promise<Address> | null = null;\n\n constructor(config: TokenConfig) {\n super(config);\n this.wrapper = config.wrapper ? normalizeAddress(config.wrapper, \"wrapper\") : this.address;\n }\n\n async #getUnderlying(): Promise<Address> {\n if (this.#underlying !== undefined) return this.#underlying;\n if (!this.#underlyingPromise) {\n this.#underlyingPromise = this.signer\n .readContract<Address>(underlyingContract(this.wrapper))\n .then((v) => {\n this.#underlying = v;\n this.#underlyingPromise = null;\n return v;\n })\n .catch((error) => {\n this.#underlyingPromise = null;\n throw error;\n });\n }\n return this.#underlyingPromise;\n }\n\n // WRITE OPERATIONS\n\n /**\n * Confidential transfer. Encrypts the amount via FHE, then calls the contract.\n * Returns the transaction hash.\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransfer(\"0xRecipient\", 1000n);\n * ```\n */\n async confidentialTransfer(to: Address, amount: bigint): Promise<Hex> {\n const normalizedTo = normalizeAddress(to, \"to\");\n try {\n const { handles, inputProof } = await this.sdk.encrypt({\n values: [amount],\n contractAddress: this.address,\n userAddress: await this.signer.getAddress(),\n });\n\n if (handles.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no handles\");\n }\n\n return await this.signer.writeContract(\n confidentialTransferContract(this.address, normalizedTo, handles[0]!, inputProof),\n );\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new EncryptionFailedError(\"Failed to encrypt transfer amount\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n /**\n * Operator encrypted transfer on behalf of another address.\n * The caller must be an approved operator for `from`.\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferFrom(\"0xFrom\", \"0xTo\", 500n);\n * ```\n */\n async confidentialTransferFrom(from: Address, to: Address, amount: bigint): Promise<Hex> {\n const normalizedFrom = normalizeAddress(from, \"from\");\n const normalizedTo = normalizeAddress(to, \"to\");\n try {\n const { handles, inputProof } = await this.sdk.encrypt({\n values: [amount],\n contractAddress: this.address,\n userAddress: normalizedFrom,\n });\n\n if (handles.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no handles\");\n }\n\n return await this.signer.writeContract(\n confidentialTransferFromContract(\n this.address,\n normalizedFrom,\n normalizedTo,\n handles[0]!,\n inputProof,\n ),\n );\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new EncryptionFailedError(\"Failed to encrypt transferFrom amount\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n /**\n * Set operator approval for the confidential token.\n * Defaults to 1 hour from now if `until` is not specified.\n *\n * @example\n * ```ts\n * const txHash = await token.approve(\"0xSpender\");\n * ```\n */\n async approve(spender: Address, until?: number): Promise<Hex> {\n const normalizedSpender = normalizeAddress(spender, \"spender\");\n try {\n return await this.signer.writeContract(\n setOperatorContract(this.address, normalizedSpender, until),\n );\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new ApprovalFailedError(\"Operator approval failed\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n /**\n * Check if a spender is an approved operator for the connected wallet.\n *\n * @example\n * ```ts\n * if (await token.isApproved(\"0xSpender\")) {\n * // spender can call transferFrom\n * }\n * ```\n */\n async isApproved(spender: Address): Promise<boolean> {\n const normalizedSpender = normalizeAddress(spender, \"spender\");\n const holder = await this.signer.getAddress();\n return this.signer.readContract<boolean>(\n isOperatorContract(this.address, holder, normalizedSpender),\n );\n }\n\n /**\n * Wrap public ERC-20 tokens into confidential tokens.\n * Handles ERC-20 approval automatically based on `approvalStrategy`\n * (`\"exact\"` by default, `\"max\"` for unlimited approval, `\"skip\"` to opt out).\n *\n * @example\n * ```ts\n * const txHash = await token.wrap(1000n);\n * // or with exact approval:\n * const txHash = await token.wrap(1000n, { approvalStrategy: \"exact\" });\n * ```\n */\n async wrap(\n amount: bigint,\n options?: {\n approvalStrategy?: \"max\" | \"exact\" | \"skip\";\n fees?: bigint;\n },\n ): Promise<Hex> {\n const underlying = await this.#getUnderlying();\n\n if (underlying === Token.ZERO_ADDRESS) {\n return this.wrapETH(amount, amount + (options?.fees ?? 0n));\n }\n\n const strategy = options?.approvalStrategy ?? \"exact\";\n if (strategy !== \"skip\") {\n await this.#ensureAllowance(amount, strategy === \"max\");\n }\n\n try {\n const address = await this.signer.getAddress();\n return await this.signer.writeContract(wrapContract(this.wrapper, address, amount));\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new TransactionRevertedError(\"Shield (wrap) transaction failed\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n /**\n * Wrap native ETH into confidential tokens. `value` defaults to `amount`.\n *\n * @example\n * ```ts\n * const txHash = await token.wrapETH(1000000000000000000n); // 1 ETH\n * ```\n */\n async wrapETH(amount: bigint, value?: bigint): Promise<Hex> {\n try {\n const userAddress = await this.signer.getAddress();\n return await this.signer.writeContract(\n wrapETHContract(this.wrapper, userAddress, amount, value ?? amount),\n );\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new TransactionRevertedError(\"Shield ETH (wrapETH) transaction failed\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n /**\n * Request an unwrap for a specific amount. Encrypts the amount first.\n * Call {@link finalizeUnwrap} after the request is processed on-chain.\n *\n * @example\n * ```ts\n * const txHash = await token.unwrap(500n);\n * ```\n */\n async unwrap(amount: bigint): Promise<Hex> {\n const userAddress = await this.signer.getAddress();\n\n let handles: Uint8Array[];\n let inputProof: Uint8Array;\n try {\n ({ handles, inputProof } = await this.sdk.encrypt({\n values: [amount],\n contractAddress: this.wrapper,\n userAddress,\n }));\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new EncryptionFailedError(\"Failed to encrypt unshield amount\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n if (handles.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no handles\");\n }\n\n try {\n return await this.signer.writeContract(\n unwrapContract(this.address, userAddress, userAddress, handles[0]!, inputProof),\n );\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new TransactionRevertedError(\"Unshield transaction failed\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n /**\n * Request an unwrap for the entire confidential balance.\n * Uses the on-chain balance handle directly (no encryption needed).\n * Throws if the balance is zero.\n *\n * @example\n * ```ts\n * const txHash = await token.unwrapAll();\n * ```\n */\n async unwrapAll(): Promise<Hex> {\n const userAddress = await this.signer.getAddress();\n const handle = await this.readConfidentialBalanceOf(userAddress);\n\n if (this.isZeroHandle(handle)) {\n throw new DecryptionFailedError(\"Cannot unshield: balance is zero\");\n }\n\n try {\n return await this.signer.writeContract(\n unwrapFromBalanceContract(this.address, userAddress, userAddress, handle),\n );\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new TransactionRevertedError(\"Unshield-all transaction failed\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n /**\n * Unshield a specific amount and finalize in one call.\n * Orchestrates: unshield → wait for receipt → parse event → finalize.\n *\n * @example\n * ```ts\n * const txHash = await token.unshield(500n);\n * ```\n */\n async unshield(amount: bigint, callbacks?: UnshieldCallbacks): Promise<Hex> {\n const unshieldHash = await this.unwrap(amount);\n safeCallback(() => callbacks?.onUnwrapSubmitted?.(unshieldHash));\n return this.#waitAndFinalizeUnshield(unshieldHash, callbacks);\n }\n\n /**\n * Unshield the entire balance and finalize in one call.\n * Orchestrates: unshieldAll → wait for receipt → parse event → finalize.\n *\n * @example\n * ```ts\n * const txHash = await token.unshieldAll();\n * ```\n */\n async unshieldAll(callbacks?: UnshieldCallbacks): Promise<Hex> {\n const unshieldHash = await this.unwrapAll();\n safeCallback(() => callbacks?.onUnwrapSubmitted?.(unshieldHash));\n return this.#waitAndFinalizeUnshield(unshieldHash, callbacks);\n }\n\n /**\n * Resume an in-progress unshield from an existing unwrap tx hash.\n * Useful when the user already submitted the unwrap but the finalize step\n * was interrupted (e.g. page reload, network error).\n *\n * @example\n * ```ts\n * const txHash = await token.resumeUnshield(previousUnwrapTxHash);\n * ```\n */\n async resumeUnshield(unwrapTxHash: Hex, callbacks?: UnshieldCallbacks): Promise<Hex> {\n return this.#waitAndFinalizeUnshield(unwrapTxHash, callbacks);\n }\n\n /**\n * Complete an unwrap by providing the public decryption proof.\n * Call this after an unshield request has been processed on-chain.\n *\n * @example\n * ```ts\n * const event = findUnwrapRequested(receipt.logs);\n * const txHash = await token.finalizeUnwrap(event.encryptedAmount);\n * ```\n */\n async finalizeUnwrap(burnAmountHandle: Address): Promise<Hex> {\n let clearValue: bigint;\n let decryptionProof: Address;\n\n try {\n const result = await this.sdk.publicDecrypt([burnAmountHandle]);\n decryptionProof = result.decryptionProof;\n try {\n clearValue = BigInt(result.abiEncodedClearValues);\n } catch {\n throw new DecryptionFailedError(\n `Cannot parse decrypted value: ${result.abiEncodedClearValues}`,\n );\n }\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new DecryptionFailedError(\"Failed to finalize unshield\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n try {\n return await this.signer.writeContract(\n finalizeUnwrapContract(this.wrapper, burnAmountHandle, clearValue, decryptionProof),\n );\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new TransactionRevertedError(\"Failed to finalize unshield\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n /**\n * Approve this token contract to spend the underlying ERC-20.\n * Defaults to max uint256. Resets to zero first if there's an existing\n * non-zero allowance (required by tokens like USDT).\n *\n * @example\n * ```ts\n * await token.approveUnderlying(); // max approval\n * await token.approveUnderlying(1000n); // exact amount\n * ```\n */\n async approveUnderlying(amount?: bigint): Promise<Hex> {\n const underlying = await this.#getUnderlying();\n\n const approvalAmount = amount ?? 2n ** 256n - 1n;\n\n try {\n if (approvalAmount > 0n) {\n const userAddress = await this.signer.getAddress();\n const currentAllowance = await this.signer.readContract<bigint>(\n allowanceContract(underlying, userAddress, this.wrapper),\n );\n\n if (currentAllowance > 0n) {\n await this.signer.writeContract(approveContract(underlying, this.wrapper, 0n));\n }\n }\n\n return await this.signer.writeContract(\n approveContract(underlying, this.wrapper, approvalAmount),\n );\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new ApprovalFailedError(\"ERC-20 approval failed\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n // PRIVATE HELPERS\n\n async #waitAndFinalizeUnshield(unshieldHash: Hex, callbacks?: UnshieldCallbacks): Promise<Hex> {\n let receipt;\n try {\n receipt = await this.signer.waitForTransactionReceipt(unshieldHash);\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new TransactionRevertedError(\"Failed to get unshield receipt\", {\n cause: error,\n });\n }\n const event = findUnwrapRequested(receipt.logs);\n if (!event) {\n throw new TransactionRevertedError(\"No UnwrapRequested event found in unshield receipt\");\n }\n safeCallback(() => callbacks?.onFinalizing?.());\n const finalizeHash = await this.finalizeUnwrap(event.encryptedAmount);\n safeCallback(() => callbacks?.onFinalizeSubmitted?.(finalizeHash));\n return finalizeHash;\n }\n\n async #ensureAllowance(amount: bigint, maxApproval: boolean): Promise<void> {\n const underlying = await this.#getUnderlying();\n\n const userAddress = await this.signer.getAddress();\n const allowance = await this.signer.readContract<bigint>(\n allowanceContract(underlying, userAddress, this.wrapper),\n );\n\n if (allowance >= amount) return;\n\n try {\n // Reset to zero first when there's an existing non-zero allowance.\n // Required by non-standard tokens like USDT, and also mitigates the\n // ERC-20 approve race condition for all tokens.\n if (allowance > 0n) {\n await this.signer.writeContract(approveContract(underlying, this.wrapper, 0n));\n }\n\n const approvalAmount = maxApproval ? 2n ** 256n - 1n : amount;\n\n await this.signer.writeContract(approveContract(underlying, this.wrapper, approvalAmount));\n } catch (error) {\n if (error instanceof TokenError) throw error;\n throw new ApprovalFailedError(\"ERC-20 approval failed\", {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n}\n\n/**\n * Invoke a callback inside a try/catch so a throwing listener\n * can never break the unshield flow (unwrap already on-chain).\n */\nfunction safeCallback(fn: () => void): void {\n try {\n fn();\n } catch {\n // Swallow – the caller must not be disrupted by listener errors.\n }\n}\n","import type { Address } from \"../relayer/relayer-sdk.types\";\nimport type { RelayerSDK } from \"../relayer/relayer-sdk\";\nimport { normalizeAddress } from \"../utils\";\nimport { Token } from \"./token\";\nimport { ReadonlyToken } from \"./readonly-token\";\nimport type { GenericSigner, GenericStringStorage } from \"./token.types\";\n\n/** Configuration for {@link TokenSDK}. */\nexport interface TokenSDKConfig {\n /** FHE relayer backend (`RelayerWeb` for browser, `RelayerNode` for server). */\n relayer: RelayerSDK;\n /** Wallet signer (`ViemSigner`, `EthersSigner`, or custom {@link GenericSigner}). */\n signer: GenericSigner;\n /** Credential storage backend (`IndexedDBStorage` for browser, `MemoryStorage` for tests). */\n storage: GenericStringStorage;\n /** Number of days FHE credentials remain valid. Default: `1`. */\n credentialDurationDays?: number;\n}\n\n/**\n * TokenSDK — composes a RelayerSDK with token abstraction.\n * Provides signer, storage, and high-level ERC-20-like token interface.\n */\nexport class TokenSDK {\n readonly relayer: RelayerSDK;\n readonly signer: GenericSigner;\n readonly storage: GenericStringStorage;\n readonly #credentialDurationDays: number | undefined;\n\n constructor(config: TokenSDKConfig) {\n this.relayer = config.relayer;\n this.signer = config.signer;\n this.storage = config.storage;\n this.#credentialDurationDays = config.credentialDurationDays;\n }\n\n /**\n * Create a read-only interface for a confidential token.\n * Supports balance queries and authorization without a wrapper address.\n */\n createReadonlyToken(address: Address): ReadonlyToken {\n return new ReadonlyToken({\n sdk: this.relayer,\n signer: this.signer,\n storage: this.storage,\n address: normalizeAddress(address, \"address\"),\n durationDays: this.#credentialDurationDays,\n });\n }\n\n /**\n * Create a high-level ERC-20-like interface for a confidential token.\n * Includes write operations (transfer, shield, unshield).\n */\n createToken(address: Address, wrapper?: Address): Token {\n return new Token({\n sdk: this.relayer,\n signer: this.signer,\n storage: this.storage,\n address: normalizeAddress(address, \"address\"),\n wrapper: wrapper ? normalizeAddress(wrapper, \"wrapper\") : undefined,\n durationDays: this.#credentialDurationDays,\n });\n }\n\n /**\n * Terminate the relayer backend and clean up resources.\n */\n terminate(): void {\n this.relayer.terminate();\n }\n}\n","import type { GenericStringStorage } from \"./token.types\";\n\n/** In-memory credential store. Credentials are lost on page reload. */\nexport class MemoryStorage implements GenericStringStorage {\n #map = new Map<string, string>();\n\n async getItem(key: string): Promise<string | null> {\n return this.#map.get(key) ?? null;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.#map.set(key, value);\n }\n\n async removeItem(key: string): Promise<void> {\n this.#map.delete(key);\n }\n}\n","\"use client\";\n\nimport type { GenericStringStorage } from \"./token.types\";\n\n/**\n * IndexedDB-backed {@link GenericStringStorage}.\n *\n * Stores encrypted credential JSON strings keyed by a hashed wallet address.\n * Encryption is handled by {@link CredentialManager} — this store only\n * persists opaque string values.\n */\nexport class IndexedDBStorage implements GenericStringStorage {\n #db: IDBDatabase | null = null;\n #dbPromise: Promise<IDBDatabase> | null = null;\n #dbName: string;\n #dbVersion: number;\n #storeName = \"credentials\";\n\n constructor(dbName = \"CredentialStore\", dbVersion = 1) {\n this.#dbName = dbName;\n this.#dbVersion = dbVersion;\n }\n\n #getDB(): Promise<IDBDatabase> {\n if (this.#db) return Promise.resolve(this.#db);\n if (this.#dbPromise) return this.#dbPromise;\n\n this.#dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(this.#dbName, this.#dbVersion);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(this.#storeName)) {\n db.createObjectStore(this.#storeName, { keyPath: \"key\" });\n }\n };\n\n request.onsuccess = () => {\n this.#db = request.result;\n this.#dbPromise = null;\n this.#db.onversionchange = () => {\n this.#db?.close();\n this.#db = null;\n this.#dbPromise = null;\n };\n this.#db.onclose = () => {\n this.#db = null;\n this.#dbPromise = null;\n };\n resolve(this.#db);\n };\n\n request.onerror = () => {\n this.#db = null;\n this.#dbPromise = null;\n reject(request.error);\n };\n });\n\n return this.#dbPromise;\n }\n\n async getItem(key: string): Promise<string | null> {\n const db = await this.#getDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(this.#storeName, \"readonly\");\n tx.onabort = () => reject(tx.error ?? new Error(\"Transaction aborted\"));\n const store = tx.objectStore(this.#storeName);\n const request = store.get(key);\n request.onsuccess = () => resolve(request.result?.value ?? null);\n request.onerror = () => reject(request.error);\n });\n }\n\n async setItem(key: string, value: string): Promise<void> {\n const db = await this.#getDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(this.#storeName, \"readwrite\");\n tx.onabort = () => reject(tx.error ?? new Error(\"Transaction aborted\"));\n const store = tx.objectStore(this.#storeName);\n const request = store.put({ key, value });\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n async removeItem(key: string): Promise<void> {\n const db = await this.#getDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(this.#storeName, \"readwrite\");\n tx.onabort = () => reject(tx.error ?? new Error(\"Transaction aborted\"));\n const store = tx.objectStore(this.#storeName);\n const request = store.delete(key);\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n async clear(): Promise<void> {\n const db = await this.#getDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(this.#storeName, \"readwrite\");\n tx.onabort = () => reject(tx.error ?? new Error(\"Transaction aborted\"));\n const store = tx.objectStore(this.#storeName);\n const request = store.clear();\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n}\n\n/** Default singleton for application-wide use. */\nexport const indexedDBStorage = new IndexedDBStorage();\n","/**\n * Higher-level activity feed helpers for confidential token events.\n * Normalizes all 5 event types into a single renderable \"activity item\",\n * classifies direction (incoming/outgoing/self) relative to the user,\n * and supports batch-decryption of encrypted transfer amounts.\n *\n * Pure functions, no framework dependency — works with any provider.\n */\n\nimport {\n decodeTokenEvent,\n type RawLog,\n type TokenEvent,\n type ConfidentialTransferEvent,\n type WrappedEvent,\n type UnwrapRequestedEvent,\n type UnwrappedFinalizedEvent,\n type UnwrappedStartedEvent,\n} from \"./events\";\nimport { ZERO_HANDLE } from \"./token/readonly-token\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Direction of an activity item relative to the connected wallet. */\nexport type ActivityDirection = \"incoming\" | \"outgoing\" | \"self\";\n\n/** Classified type of a token activity event. */\nexport type ActivityType =\n | \"transfer\"\n | \"shield\"\n | \"unshield_requested\"\n | \"unshield_started\"\n | \"unshield_finalized\";\n\n/** Amount attached to an activity item — either cleartext or encrypted (with optional decrypted value). */\nexport type ActivityAmount =\n | { readonly type: \"clear\"; readonly value: bigint }\n | {\n readonly type: \"encrypted\";\n readonly handle: string;\n /** Populated after batch decryption via {@link applyDecryptedValues}. */\n readonly decryptedValue?: bigint;\n };\n\n/** On-chain metadata attached to each activity item. */\nexport interface ActivityLogMetadata {\n /** Transaction hash containing this event. */\n readonly transactionHash?: string;\n /** Block number where this event was emitted. */\n readonly blockNumber?: bigint | number;\n /** Log index within the transaction. */\n readonly logIndex?: number;\n}\n\n/**\n * A single renderable activity feed entry.\n * Produced by {@link parseActivityFeed} from raw event logs.\n */\nexport interface ActivityItem {\n /** Classified event type. */\n readonly type: ActivityType;\n /** Direction relative to the connected wallet. */\n readonly direction: ActivityDirection;\n /** Transfer amount (clear or encrypted). */\n readonly amount: ActivityAmount;\n /** Sender address (if applicable). */\n readonly from?: string;\n /** Receiver address (if applicable). */\n readonly to?: string;\n /** Fee deducted (for shield/unshield events). */\n readonly fee?: bigint;\n /** Whether the on-chain operation succeeded (for unshield events). */\n readonly success?: boolean;\n /** On-chain metadata (tx hash, block number, log index). */\n readonly metadata: ActivityLogMetadata;\n /** The original decoded event. */\n readonly rawEvent: TokenEvent;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction addressesEqual(a: string, b: string): boolean {\n return a.toLowerCase() === b.toLowerCase();\n}\n\nfunction classifyDirection(\n userAddress: string,\n from: string | undefined,\n to: string | undefined,\n): ActivityDirection {\n const isFrom = from !== undefined && addressesEqual(userAddress, from);\n const isTo = to !== undefined && addressesEqual(userAddress, to);\n\n if (isFrom && isTo) return \"self\";\n if (isFrom) return \"outgoing\";\n return \"incoming\";\n}\n\nfunction eventToActivityItem(\n event: TokenEvent,\n userAddress: string,\n metadata: ActivityLogMetadata,\n): ActivityItem {\n switch (event.eventName) {\n case \"ConfidentialTransfer\":\n return buildTransfer(event, userAddress, metadata);\n case \"Wrapped\":\n return buildShield(event, userAddress, metadata);\n case \"UnwrapRequested\":\n return buildUnshieldRequested(event, userAddress, metadata);\n case \"UnwrappedStarted\":\n return buildUnshieldStarted(event, userAddress, metadata);\n case \"UnwrappedFinalized\":\n return buildUnshieldFinalized(event, metadata);\n }\n}\n\nfunction buildTransfer(\n event: ConfidentialTransferEvent,\n userAddress: string,\n metadata: ActivityLogMetadata,\n): ActivityItem {\n return {\n type: \"transfer\",\n direction: classifyDirection(userAddress, event.from, event.to),\n amount: { type: \"encrypted\", handle: event.encryptedAmountHandle },\n from: event.from,\n to: event.to,\n metadata,\n rawEvent: event,\n };\n}\n\nfunction buildShield(\n event: WrappedEvent,\n userAddress: string,\n metadata: ActivityLogMetadata,\n): ActivityItem {\n return {\n type: \"shield\",\n direction: classifyDirection(userAddress, undefined, event.to),\n amount: { type: \"clear\", value: event.amountIn },\n to: event.to,\n fee: event.feeAmount,\n metadata,\n rawEvent: event,\n };\n}\n\nfunction buildUnshieldRequested(\n event: UnwrapRequestedEvent,\n userAddress: string,\n metadata: ActivityLogMetadata,\n): ActivityItem {\n return {\n type: \"unshield_requested\",\n direction: classifyDirection(userAddress, undefined, event.receiver),\n amount: { type: \"encrypted\", handle: event.encryptedAmount },\n to: event.receiver,\n metadata,\n rawEvent: event,\n };\n}\n\nfunction buildUnshieldStarted(\n event: UnwrappedStartedEvent,\n userAddress: string,\n metadata: ActivityLogMetadata,\n): ActivityItem {\n return {\n type: \"unshield_started\",\n direction: classifyDirection(userAddress, undefined, event.to),\n amount: { type: \"encrypted\", handle: event.requestedAmount },\n to: event.to,\n success: event.returnVal,\n metadata,\n rawEvent: event,\n };\n}\n\nfunction buildUnshieldFinalized(\n event: UnwrappedFinalizedEvent,\n metadata: ActivityLogMetadata,\n): ActivityItem {\n return {\n type: \"unshield_finalized\",\n // Finalized events don't carry from/to addresses, always treat as incoming\n direction: \"incoming\",\n amount: { type: \"clear\", value: event.unwrapAmount },\n fee: event.feeAmount,\n success: event.finalizeSuccess,\n metadata,\n rawEvent: event,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Decode raw logs into classified activity items.\n * Skips logs that don't match any confidential token event.\n */\nexport function parseActivityFeed(\n logs: readonly (RawLog & Partial<ActivityLogMetadata>)[],\n userAddress: string,\n): ActivityItem[] {\n const items: ActivityItem[] = [];\n for (const log of logs) {\n const event = decodeTokenEvent(log);\n if (!event) continue;\n\n const metadata: ActivityLogMetadata = {\n transactionHash: log.transactionHash,\n blockNumber: log.blockNumber,\n logIndex: log.logIndex,\n };\n items.push(eventToActivityItem(event, userAddress, metadata));\n }\n return items;\n}\n\n/**\n * Extract unique non-zero encrypted handles that need decryption.\n */\nexport function extractEncryptedHandles(items: readonly ActivityItem[]): string[] {\n const handles = new Set<string>();\n for (const item of items) {\n if (item.amount.type === \"encrypted\" && item.amount.decryptedValue === undefined) {\n const h = item.amount.handle;\n // Skip zero handles\n if (h !== \"0x\" && h !== ZERO_HANDLE) {\n handles.add(h);\n }\n }\n }\n return [...handles];\n}\n\n/**\n * Return new activity items with decrypted values populated.\n * Items whose handles aren't in the map are returned unchanged.\n */\nexport function applyDecryptedValues(\n items: readonly ActivityItem[],\n decryptedMap: ReadonlyMap<string, bigint>,\n): ActivityItem[] {\n return items.map((item) => {\n if (item.amount.type !== \"encrypted\") return item;\n\n const value = decryptedMap.get(item.amount.handle);\n if (value === undefined) return item;\n\n return {\n ...item,\n amount: {\n type: \"encrypted\" as const,\n handle: item.amount.handle,\n decryptedValue: value,\n },\n };\n });\n}\n\n/**\n * Sort activity items by block number, most recent first.\n * Items without a block number are placed at the beginning (most recent).\n */\nexport function sortByBlockNumber(items: readonly ActivityItem[]): ActivityItem[] {\n return [...items].sort((a, b) => {\n const aBlock = a.metadata.blockNumber;\n const bBlock = b.metadata.blockNumber;\n\n if (aBlock === undefined && bBlock === undefined) return 0;\n if (aBlock === undefined) return -1;\n if (bBlock === undefined) return 1;\n\n // Convert to bigint for comparison\n const aBig = typeof aBlock === \"bigint\" ? aBlock : BigInt(aBlock);\n const bBig = typeof bBlock === \"bigint\" ? bBlock : BigInt(bBlock);\n\n if (bBig > aBig) return 1;\n if (bBig < aBig) return -1;\n\n // Same block: sort by logIndex descending\n const aIdx = a.metadata.logIndex ?? 0;\n const bIdx = b.metadata.logIndex ?? 0;\n return bIdx - aIdx;\n });\n}\n"]}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { G as GenericLogger, F as FHEKeypair, E as EIP712TypedData, a as EncryptParams, b as EncryptResult, U as UserDecryptParams, P as PublicDecryptResult, D as DelegatedUserDecryptParams, W as WorkerRequest, c as WorkerRequestType, d as WorkerResponse, e as GenerateKeypairResponseData, C as CreateEIP712Payload, f as CreateEIP712ResponseData, g as EncryptPayload, h as EncryptResponseData, i as UserDecryptPayload, j as UserDecryptResponseData, k as PublicDecryptResponseData, l as CreateDelegatedEIP712Payload, m as CreateDelegatedEIP712ResponseData, n as DelegatedUserDecryptPayload, o as DelegatedUserDecryptResponseData, R as RequestZKProofVerificationResponseData, p as GetPublicKeyResponseData, q as GetPublicParamsResponseData } from '../relayer-sdk.types-CFkzNzRy.js';
|
|
2
|
+
import { FhevmInstanceConfig } from '@zama-fhe/relayer-sdk/node';
|
|
3
|
+
import { R as RelayerSDK } from '../relayer-utils-D_3834H0.js';
|
|
4
|
+
export { H as HardhatConfig, M as MainnetConfig, S as SepoliaConfig } from '../relayer-utils-D_3834H0.js';
|
|
5
|
+
import { Address, KmsDelegatedUserDecryptEIP712Type, ZKProofLike, InputProofBytesType, FhevmInstanceConfig as FhevmInstanceConfig$1 } from '@zama-fhe/relayer-sdk/bundle';
|
|
6
|
+
import { Worker } from 'node:worker_threads';
|
|
7
|
+
|
|
8
|
+
interface RelayerNodeConfig {
|
|
9
|
+
transports: Record<number, Partial<FhevmInstanceConfig>>;
|
|
10
|
+
/** Resolve the current chain ID. Called lazily before each operation; the pool is re-initialized when the value changes. */
|
|
11
|
+
getChainId: () => Promise<number>;
|
|
12
|
+
poolSize?: number;
|
|
13
|
+
/** Optional logger for observing worker lifecycle and request timing. */
|
|
14
|
+
logger?: GenericLogger;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* RelayerNode — Node.js FHE backend using a worker thread.
|
|
18
|
+
* Offloads CPU-intensive WASM/FHE operations to a node:worker_threads worker.
|
|
19
|
+
*/
|
|
20
|
+
declare class RelayerNode implements RelayerSDK {
|
|
21
|
+
#private;
|
|
22
|
+
constructor(config: RelayerNodeConfig);
|
|
23
|
+
terminate(): void;
|
|
24
|
+
generateKeypair(): Promise<FHEKeypair>;
|
|
25
|
+
createEIP712(publicKey: string, contractAddresses: Address[], startTimestamp: number, durationDays?: number): Promise<EIP712TypedData>;
|
|
26
|
+
encrypt(params: EncryptParams): Promise<EncryptResult>;
|
|
27
|
+
userDecrypt(params: UserDecryptParams): Promise<Record<string, bigint>>;
|
|
28
|
+
publicDecrypt(handles: string[]): Promise<PublicDecryptResult>;
|
|
29
|
+
createDelegatedUserDecryptEIP712(publicKey: string, contractAddresses: Address[], delegatorAddress: string, startTimestamp: number, durationDays?: number): Promise<KmsDelegatedUserDecryptEIP712Type>;
|
|
30
|
+
delegatedUserDecrypt(params: DelegatedUserDecryptParams): Promise<Record<string, bigint>>;
|
|
31
|
+
requestZKProofVerification(zkProof: ZKProofLike): Promise<InputProofBytesType>;
|
|
32
|
+
getPublicKey(): Promise<{
|
|
33
|
+
publicKeyId: string;
|
|
34
|
+
publicKey: Uint8Array;
|
|
35
|
+
} | null>;
|
|
36
|
+
getPublicParams(bits: number): Promise<{
|
|
37
|
+
publicParams: Uint8Array;
|
|
38
|
+
publicParamsId: string;
|
|
39
|
+
} | null>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Abstract base class for worker clients (browser Web Worker and Node.js worker_threads).
|
|
44
|
+
* Encapsulates all shared logic: pending request tracking, timeouts, init dedup, domain methods.
|
|
45
|
+
* Subclasses implement the abstract hooks for platform-specific worker creation and messaging.
|
|
46
|
+
*/
|
|
47
|
+
declare abstract class BaseWorkerClient<TWorker, TConfig> {
|
|
48
|
+
#private;
|
|
49
|
+
protected readonly config: TConfig;
|
|
50
|
+
protected readonly logger: GenericLogger | undefined;
|
|
51
|
+
constructor(config: TConfig, logger: GenericLogger | undefined);
|
|
52
|
+
/** Create the platform-specific worker instance. */
|
|
53
|
+
protected abstract createWorker(): TWorker;
|
|
54
|
+
/** Wire message/error/messageerror events on the worker. */
|
|
55
|
+
protected abstract wireEvents(worker: TWorker): void;
|
|
56
|
+
/** Post a message to the worker. */
|
|
57
|
+
protected abstract postMessage(worker: TWorker, request: WorkerRequest): void;
|
|
58
|
+
/** Terminate the platform-specific worker. */
|
|
59
|
+
protected abstract terminateWorker(worker: TWorker): void;
|
|
60
|
+
/** Generate a unique request ID. */
|
|
61
|
+
protected abstract generateRequestId(): string;
|
|
62
|
+
/** Return the init request type and payload. */
|
|
63
|
+
protected abstract getInitPayload(): {
|
|
64
|
+
type: WorkerRequestType;
|
|
65
|
+
payload: WorkerRequest["payload"];
|
|
66
|
+
};
|
|
67
|
+
/** Optional hook called after worker init succeeds (e.g. for node worker.unref()). */
|
|
68
|
+
protected onWorkerReady?(_worker: TWorker): void;
|
|
69
|
+
initWorker(): Promise<TWorker>;
|
|
70
|
+
terminate(): void;
|
|
71
|
+
protected handleResponse(response: WorkerResponse<unknown>): void;
|
|
72
|
+
protected handleWorkerError(message: string): void;
|
|
73
|
+
protected handleWorkerMessageError(): void;
|
|
74
|
+
protected sendRequestTo<T>(worker: TWorker, type: WorkerRequestType, payload: WorkerRequest["payload"], timeoutMs?: number): Promise<T>;
|
|
75
|
+
protected sendRequest<T>(type: WorkerRequestType, payload: WorkerRequest["payload"], timeoutMs?: number): Promise<T>;
|
|
76
|
+
generateKeypair(): Promise<GenerateKeypairResponseData>;
|
|
77
|
+
createEIP712(params: CreateEIP712Payload): Promise<CreateEIP712ResponseData>;
|
|
78
|
+
encrypt(params: EncryptPayload): Promise<EncryptResponseData>;
|
|
79
|
+
userDecrypt(params: UserDecryptPayload): Promise<UserDecryptResponseData>;
|
|
80
|
+
publicDecrypt(handles: string[]): Promise<PublicDecryptResponseData>;
|
|
81
|
+
createDelegatedUserDecryptEIP712(params: CreateDelegatedEIP712Payload): Promise<CreateDelegatedEIP712ResponseData>;
|
|
82
|
+
delegatedUserDecrypt(params: DelegatedUserDecryptPayload): Promise<DelegatedUserDecryptResponseData>;
|
|
83
|
+
requestZKProofVerification(zkProof: ZKProofLike): Promise<RequestZKProofVerificationResponseData>;
|
|
84
|
+
getPublicKey(): Promise<GetPublicKeyResponseData>;
|
|
85
|
+
getPublicParams(bits: number): Promise<GetPublicParamsResponseData>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
interface NodeWorkerClientConfig {
|
|
89
|
+
fhevmConfig: FhevmInstanceConfig$1;
|
|
90
|
+
/** Optional logger for tracing worker request lifecycle. */
|
|
91
|
+
logger?: GenericLogger;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Client for communicating with the RelayerSDK Node.js worker thread.
|
|
95
|
+
* Provides a promise-based API for FHE operations using node:worker_threads.
|
|
96
|
+
*/
|
|
97
|
+
declare class NodeWorkerClient extends BaseWorkerClient<Worker, NodeWorkerClientConfig> {
|
|
98
|
+
constructor(config: NodeWorkerClientConfig);
|
|
99
|
+
protected createWorker(): Worker;
|
|
100
|
+
protected wireEvents(worker: Worker): void;
|
|
101
|
+
protected postMessage(worker: Worker, request: WorkerRequest): void;
|
|
102
|
+
protected terminateWorker(worker: Worker): void;
|
|
103
|
+
protected generateRequestId(): string;
|
|
104
|
+
protected getInitPayload(): {
|
|
105
|
+
type: WorkerRequestType;
|
|
106
|
+
payload: WorkerRequest["payload"];
|
|
107
|
+
};
|
|
108
|
+
protected onWorkerReady(worker: Worker): void;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
interface NodeWorkerPoolConfig extends NodeWorkerClientConfig {
|
|
112
|
+
poolSize?: number;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Pool of Node.js worker threads for parallel FHE operations.
|
|
116
|
+
*
|
|
117
|
+
* **Default pool size:** `min(os.availableParallelism(), 4)`. Each worker loads
|
|
118
|
+
* the full WASM module (~50–100 MB), so size the pool based on available memory.
|
|
119
|
+
*
|
|
120
|
+
* **Scheduling:** Least-connections — each request is dispatched to the worker
|
|
121
|
+
* with the fewest in-flight operations.
|
|
122
|
+
*
|
|
123
|
+
* **When to override pool size:**
|
|
124
|
+
* - High-throughput batch processing (e.g. bulk encryptions): increase to match CPU cores.
|
|
125
|
+
* - Memory-constrained environments: decrease to 1–2 workers.
|
|
126
|
+
*
|
|
127
|
+
* **Lifecycle:**
|
|
128
|
+
* 1. Construct with config: `new NodeWorkerPool({ fhevmConfig })`
|
|
129
|
+
* 2. Initialize all workers: `await pool.initPool()`
|
|
130
|
+
* 3. Use: `await pool.encrypt(...)`, `await pool.userDecrypt(...)`, etc.
|
|
131
|
+
* 4. Shut down: `pool.terminate()`
|
|
132
|
+
*
|
|
133
|
+
* `initPool()` is idempotent — concurrent calls share the same initialization promise.
|
|
134
|
+
* If any worker fails to initialize, all workers are terminated and the error is propagated.
|
|
135
|
+
*/
|
|
136
|
+
declare class NodeWorkerPool {
|
|
137
|
+
#private;
|
|
138
|
+
/**
|
|
139
|
+
* @param config - Pool configuration. Set `poolSize` to override the default
|
|
140
|
+
* (`min(os.availableParallelism(), 4)`).
|
|
141
|
+
*/
|
|
142
|
+
constructor(config: NodeWorkerPoolConfig);
|
|
143
|
+
get poolSize(): number;
|
|
144
|
+
initPool(): Promise<void>;
|
|
145
|
+
terminate(): void;
|
|
146
|
+
generateKeypair(): Promise<GenerateKeypairResponseData>;
|
|
147
|
+
createEIP712(params: CreateEIP712Payload): Promise<CreateEIP712ResponseData>;
|
|
148
|
+
encrypt(params: EncryptPayload): Promise<EncryptResponseData>;
|
|
149
|
+
userDecrypt(params: UserDecryptPayload): Promise<UserDecryptResponseData>;
|
|
150
|
+
publicDecrypt(handles: string[]): Promise<PublicDecryptResponseData>;
|
|
151
|
+
createDelegatedUserDecryptEIP712(params: CreateDelegatedEIP712Payload): Promise<CreateDelegatedEIP712ResponseData>;
|
|
152
|
+
delegatedUserDecrypt(params: DelegatedUserDecryptPayload): Promise<DelegatedUserDecryptResponseData>;
|
|
153
|
+
requestZKProofVerification(zkProof: ZKProofLike): Promise<RequestZKProofVerificationResponseData>;
|
|
154
|
+
getPublicKey(): Promise<GetPublicKeyResponseData>;
|
|
155
|
+
getPublicParams(bits: number): Promise<GetPublicParamsResponseData>;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export { GenericLogger, NodeWorkerClient, type NodeWorkerClientConfig, NodeWorkerPool, type NodeWorkerPoolConfig, RelayerNode, type RelayerNodeConfig };
|