@net-protocol/bazaar 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/abis/bazaarV2.ts","../src/abis/helpers.ts","../src/abis/seaport.ts","../src/abis/index.ts","../src/chainConfig.ts","../src/utils/seaport.ts","../src/utils/validation.ts","../src/utils/parsing.ts","../src/utils/approvals.ts","../src/utils/fulfillment.ts","../src/utils/orderCreation.ts","../src/client/BazaarClient.ts","../src/hooks/useBazaarListings.ts","../src/hooks/useBazaarCollectionOffers.ts","../src/hooks/useBazaarErc20Offers.ts","../src/hooks/useBazaarErc20Listings.ts","../src/hooks/useBazaarSales.ts"],"names":["decodeAbiParameters","formatEther","readContract","ZERO_BYTES32","usePublicClient","useState","useMemo","useNetMessageCount","useNetMessages","useEffect"],"mappings":";;;;;;;;;;;;;AAAO,IAAM,aAAA,GAAgB;AAAA,EAC3B;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,YAAA,EAAc,4BAAA;AAAA,QACd,UAAA,EAAY;AAAA,UACV;AAAA,YACE,IAAA,EAAM,YAAA;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,YAAA,EAAc,wBAAA;AAAA,YACd,UAAA,EAAY;AAAA,cACV,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC5D,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cACzD;AAAA,gBACE,IAAA,EAAM,OAAA;AAAA,gBACN,IAAA,EAAM,SAAA;AAAA,gBACN,YAAA,EAAc,oBAAA;AAAA,gBACd,UAAA,EAAY;AAAA,kBACV,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,cAAc,eAAA,EAAgB;AAAA,kBACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAC1D,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBACzE,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAChE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA;AAAU;AAChE,eACF;AAAA,cACA;AAAA,gBACE,IAAA,EAAM,eAAA;AAAA,gBACN,IAAA,EAAM,SAAA;AAAA,gBACN,YAAA,EAAc,4BAAA;AAAA,gBACd,UAAA,EAAY;AAAA,kBACV,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,cAAc,eAAA,EAAgB;AAAA,kBACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAC1D,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBACzE,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAChE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAC9D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,iBAAA;AAAkB;AACxE,eACF;AAAA,cACA,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,cAAc,gBAAA,EAAiB;AAAA,cACnE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC9D,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC5D,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC7D,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cACzD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC/D,EAAE,IAAA,EAAM,iCAAA,EAAmC,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA;AAAU;AACtF,WACF;AAAA,UACA,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC5D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,cAAc,OAAA;AAAQ;AAC5D;AACF,KACF;AAAA,IACA,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB;AAAA,GACnB;AAAA,EACA;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,cAAA,EAAgB,IAAA,EAAM,WAAW,OAAA,EAAS,IAAA,EAAM,cAAc,SAAA,EAAU;AAAA,MAChF,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,WAAW,OAAA,EAAS,IAAA,EAAM,cAAc,SAAA;AAAU,KAC7E;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AAAA,EACA,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,uCAAA,EAAyC,MAAA,EAAQ,EAAC,EAAE;AAAA,EAC3E,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,8BAAA,EAAgC,MAAA,EAAQ,EAAC;AAClE,CAAA;AAEO,IAAM,4BAAA,GAA+B;AAAA,EAC1C;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,cAAA;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,QAAA,EAAU,YAAA,EAAc,QAAA,EAAU,CAAA;AAAA,IAC9D,eAAA,EAAiB;AAAA,GACnB;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,YAAA,EAAc,4CAAA;AAAA,QACd,UAAA,EAAY;AAAA,UACV;AAAA,YACE,IAAA,EAAM,YAAA;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,YAAA,EAAc,wBAAA;AAAA,YACd,UAAA,EAAY;AAAA,cACV,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC5D,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cACzD;AAAA,gBACE,IAAA,EAAM,OAAA;AAAA,gBACN,IAAA,EAAM,SAAA;AAAA,gBACN,YAAA,EAAc,oBAAA;AAAA,gBACd,UAAA,EAAY;AAAA,kBACV,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,cAAc,eAAA,EAAgB;AAAA,kBACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAC1D,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBACzE,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAChE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA;AAAU;AAChE,eACF;AAAA,cACA;AAAA,gBACE,IAAA,EAAM,eAAA;AAAA,gBACN,IAAA,EAAM,SAAA;AAAA,gBACN,YAAA,EAAc,4BAAA;AAAA,gBACd,UAAA,EAAY;AAAA,kBACV,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,cAAc,eAAA,EAAgB;AAAA,kBACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAC1D,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBACzE,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAChE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAC9D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,iBAAA;AAAkB;AACxE,eACF;AAAA,cACA,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,cAAc,gBAAA,EAAiB;AAAA,cACnE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC9D,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC5D,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC7D,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cACzD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC/D,EAAE,IAAA,EAAM,iCAAA,EAAmC,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA;AAAU;AACtF,WACF;AAAA,UACA,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC5D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,cAAc,OAAA;AAAQ;AAC5D;AACF,KACF;AAAA,IACA,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB;AAAA,GACnB;AAAA,EACA;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,cAAA,EAAgB,IAAA,EAAM,WAAW,OAAA,EAAS,IAAA,EAAM,cAAc,SAAA,EAAU;AAAA,MAChF,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,WAAW,OAAA,EAAS,IAAA,EAAM,cAAc,SAAA;AAAU,KAC7E;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AAAA,EACA,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,uCAAA,EAAyC,MAAA,EAAQ,EAAC,EAAE;AAAA,EAC3E,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,yCAAA,EAA2C,MAAA,EAAQ,EAAC,EAAE;AAAA,EAC7E,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,wCAAA,EAA0C,MAAA,EAAQ,EAAC,EAAE;AAAA,EAC5E,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,YAAA,EAAc,MAAA,EAAQ,EAAC,EAAE;AAAA,EAChD,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,8BAAA,EAAgC,MAAA,EAAQ,EAAC;AAClE,CAAA;AAKO,IAAM,uBAAA,GAA0B;AAAA,EACrC;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,YAAA,EAAc,4CAAA;AAAA,QACd,UAAA,EAAY;AAAA,UACV;AAAA,YACE,IAAA,EAAM,YAAA;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,YAAA,EAAc,wBAAA;AAAA,YACd,UAAA,EAAY;AAAA,cACV,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC5D,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cACzD;AAAA,gBACE,IAAA,EAAM,OAAA;AAAA,gBACN,IAAA,EAAM,SAAA;AAAA,gBACN,YAAA,EAAc,oBAAA;AAAA,gBACd,UAAA,EAAY;AAAA,kBACV,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,cAAc,eAAA,EAAgB;AAAA,kBACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAC1D,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBACzE,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAChE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA;AAAU;AAChE,eACF;AAAA,cACA;AAAA,gBACE,IAAA,EAAM,eAAA;AAAA,gBACN,IAAA,EAAM,SAAA;AAAA,gBACN,YAAA,EAAc,4BAAA;AAAA,gBACd,UAAA,EAAY;AAAA,kBACV,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,cAAc,eAAA,EAAgB;AAAA,kBACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAC1D,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBACzE,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAChE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,kBAC9D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,iBAAA;AAAkB;AACxE,eACF;AAAA,cACA,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,cAAc,gBAAA,EAAiB;AAAA,cACnE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC9D,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC5D,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC7D,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cACzD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC/D,EAAE,IAAA,EAAM,iCAAA,EAAmC,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA;AAAU;AACtF,WACF;AAAA,UACA,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC5D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,cAAc,OAAA;AAAQ;AAC5D;AACF,KACF;AAAA,IACA,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB;AAAA;AAErB,CAAA;;;ACxNO,IAAM,qCAAA,GAAwC;AAAA,EACnD,EAAE,IAAA,EAAM,aAAA,EAAe,QAAQ,EAAC,EAAG,iBAAiB,YAAA,EAAa;AAAA,EACjE;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,kBAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,MAC5D,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,WAAA,EAAa,cAAc,WAAA;AAAY,KACtE;AAAA,IACA,OAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc,wDAAA;AAAA,QACd,UAAA,EAAY;AAAA,UACV,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,MAAA,EAAQ,cAAc,MAAA,EAAO;AAAA,UAC1D,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,MAAA,EAAQ,cAAc,MAAA,EAAO;AAAA,UAC1D,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAChE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA;AAAU;AAChE;AACF,KACF;AAAA,IACA,eAAA,EAAiB;AAAA;AAErB,CAAA;AAEO,IAAM,0BAAA,GAA6B;AAAA,EACxC;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,gBAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,MAChE,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,WAAA,EAAa,cAAc,WAAA;AAAY,KACnE;AAAA,IACA,OAAA,EAAS;AAAA,MACP,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,WAAA,EAAa,cAAc,WAAA;AAAY,KACjE;AAAA,IACA,eAAA,EAAiB;AAAA,GACnB;AAAA,EACA,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,gBAAA,EAAkB,MAAA,EAAQ,EAAC,EAAE;AAAA,EACpD,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,kBAAA,EAAoB,MAAA,EAAQ,EAAC;AACtD,CAAA;AAEO,IAAM,8BAAA,GAAiC;AAAA,EAC5C;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,aAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,MAC1D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,WAAA,EAAa,cAAc,WAAA;AAAY,KACpE;AAAA,IACA,OAAA,EAAS;AAAA,MACP,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,WAAA,EAAa,cAAc,WAAA;AAAY,KACnE;AAAA,IACA,eAAA,EAAiB;AAAA;AAErB,CAAA;;;ACrDO,IAAM,kBAAA,GAAqB;AAAA,EAChC;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,UAAA,EAAY;AAAA,UACV,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,UAC5D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,UACzD;AAAA,YACE,UAAA,EAAY;AAAA,cACV,EAAE,YAAA,EAAc,eAAA,EAAiB,IAAA,EAAM,UAAA,EAAY,MAAM,OAAA,EAAQ;AAAA,cACjE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,cAC1D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,sBAAA,EAAwB,MAAM,SAAA,EAAU;AAAA,cACzE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,aAAA,EAAe,MAAM,SAAA,EAAU;AAAA,cAChE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAM,SAAA;AAAU,aAChE;AAAA,YACA,YAAA,EAAc,oBAAA;AAAA,YACd,IAAA,EAAM,OAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,YACE,UAAA,EAAY;AAAA,cACV,EAAE,YAAA,EAAc,eAAA,EAAiB,IAAA,EAAM,UAAA,EAAY,MAAM,OAAA,EAAQ;AAAA,cACjE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,cAC1D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,sBAAA,EAAwB,MAAM,SAAA,EAAU;AAAA,cACzE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,aAAA,EAAe,MAAM,SAAA,EAAU;AAAA,cAChE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAM,SAAA,EAAU;AAAA,cAC9D,EAAE,YAAA,EAAc,iBAAA,EAAmB,IAAA,EAAM,WAAA,EAAa,MAAM,SAAA;AAAU,aACxE;AAAA,YACA,YAAA,EAAc,4BAAA;AAAA,YACd,IAAA,EAAM,eAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACR;AAAA,UACA,EAAE,YAAA,EAAc,gBAAA,EAAkB,IAAA,EAAM,WAAA,EAAa,MAAM,OAAA,EAAQ;AAAA,UACnE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAM,SAAA,EAAU;AAAA,UAC9D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,UAC5D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,MAAM,SAAA,EAAU;AAAA,UAC7D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,UACzD,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,YAAA,EAAc,MAAM,SAAA,EAAU;AAAA,UAC/D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAM,SAAA;AAAU,SAC9D;AAAA,QACA,YAAA,EAAc,0BAAA;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAQ,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,IACnE,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV,CAAA;AAGA,IAAM,2BAAA,GAA8B;AAAA,EAClC,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,EAC5D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,EACzD;AAAA,IACE,UAAA,EAAY;AAAA,MACV,EAAE,YAAA,EAAc,eAAA,EAAiB,IAAA,EAAM,UAAA,EAAY,MAAM,OAAA,EAAQ;AAAA,MACjE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,MAC1D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,sBAAA,EAAwB,MAAM,SAAA,EAAU;AAAA,MACzE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,aAAA,EAAe,MAAM,SAAA,EAAU;AAAA,MAChE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAM,SAAA;AAAU,KAChE;AAAA,IACA,YAAA,EAAc,oBAAA;AAAA,IACd,IAAA,EAAM,OAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,UAAA,EAAY;AAAA,MACV,EAAE,YAAA,EAAc,eAAA,EAAiB,IAAA,EAAM,UAAA,EAAY,MAAM,OAAA,EAAQ;AAAA,MACjE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,MAC1D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,sBAAA,EAAwB,MAAM,SAAA,EAAU;AAAA,MACzE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,aAAA,EAAe,MAAM,SAAA,EAAU;AAAA,MAChE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAM,SAAA,EAAU;AAAA,MAC9D,EAAE,YAAA,EAAc,iBAAA,EAAmB,IAAA,EAAM,WAAA,EAAa,MAAM,SAAA;AAAU,KACxE;AAAA,IACA,YAAA,EAAc,4BAAA;AAAA,IACd,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,EAAE,YAAA,EAAc,gBAAA,EAAkB,IAAA,EAAM,WAAA,EAAa,MAAM,OAAA,EAAQ;AAAA,EACnE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAM,SAAA,EAAU;AAAA,EAC9D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,EAC5D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,MAAM,SAAA,EAAU;AAAA,EAC7D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,EACzD,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,YAAA,EAAc,MAAM,SAAA,EAAU;AAAA,EAC/D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,iCAAA,EAAmC,MAAM,SAAA;AAC5E,CAAA;AAKO,IAAM,yBAAA,GAA4B;AAAA,EACvC;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,UAAA,EAAY;AAAA,UACV;AAAA,YACE,UAAA,EAAY,2BAAA;AAAA,YACZ,YAAA,EAAc,wBAAA;AAAA,YACd,IAAA,EAAM,YAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACR;AAAA,UACA,EAAE,YAAA,EAAc,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,MAAM,OAAA;AAAQ,SAC5D;AAAA,QACA,YAAA,EAAc,cAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,qBAAA,EAAuB,MAAM,SAAA;AAAU,KAC1E;AAAA,IACA,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAQ,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,IACnE,eAAA,EAAiB,SAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV,CAAA;AAKO,IAAM,kCAAA,GAAqC;AAAA,EAChD;AAAA,IACE,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,UAAA,EAAY;AAAA,UACV;AAAA,YACE,UAAA,EAAY,2BAAA;AAAA,YACZ,YAAA,EAAc,wBAAA;AAAA,YACd,IAAA,EAAM,YAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACR;AAAA,UACA,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAM,SAAA,EAAU;AAAA,UAC9D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,aAAA,EAAe,MAAM,SAAA,EAAU;AAAA,UAChE,EAAE,YAAA,EAAc,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,MAAM,OAAA,EAAQ;AAAA,UAC1D,EAAE,YAAA,EAAc,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,MAAM,OAAA;AAAQ,SAC5D;AAAA,QACA,YAAA,EAAc,sBAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,QACE,UAAA,EAAY;AAAA,UACV,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,YAAA,EAAc,MAAM,SAAA,EAAU;AAAA,UAC/D,EAAE,YAAA,EAAc,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,MAAM,OAAA,EAAQ;AAAA,UACzD,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,UAC1D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,YAAA,EAAc,MAAM,SAAA,EAAU;AAAA,UAC/D,EAAE,YAAA,EAAc,WAAA,EAAa,IAAA,EAAM,eAAA,EAAiB,MAAM,WAAA;AAAY,SACxE;AAAA,QACA,YAAA,EAAc,2BAAA;AAAA,QACd,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,MACA,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,qBAAA,EAAuB,MAAM,SAAA,EAAU;AAAA,MACxE,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAM,SAAA;AAAU,KAChE;AAAA,IACA,IAAA,EAAM,sBAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAQ,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,IACnE,eAAA,EAAiB,SAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV,CAAA;AAKO,IAAM,uBAAA,GAA0B;AAAA,EACrC;AAAA,IACE,MAAA,EAAQ,CAAC,EAAE,YAAA,EAAc,WAAW,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,IACtE,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,WAAW,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,IACvE,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV,CAAA;AAKO,IAAM,mBAAA,GAAsB;AAAA,EACjC;AAAA,IACE,MAAA,EAAQ;AAAA,MACN,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,MAC1D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,MAAM,SAAA;AAAU,KAC/D;AAAA,IACA,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAQ,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,IAC1D,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,MAAM,SAAA,EAAU;AAAA,MAC7D,EAAE,YAAA,EAAc,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,MAAM,MAAA;AAAO,KACzD;AAAA,IACA,IAAA,EAAM,mBAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV,CAAA;AAKO,IAAM,kBAAA,GAAqB;AAAA,EAChC;AAAA,IACE,MAAA,EAAQ;AAAA,MACN,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,MAC1D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAM,SAAA;AAAU,KAC9D;AAAA,IACA,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,WAAW,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,IAChE,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAA,EAAQ;AAAA,MACN,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,MAC5D,EAAE,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,MAAM,SAAA;AAAU,KAC7D;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,QAAQ,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,IAC1D,eAAA,EAAiB,YAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV,CAAA;;;ACpNO,IAAM,qBAAA,GAAwB;AAAA,EACnC;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc,4BAAA;AAAA,IACd,UAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,YAAA,EAAc,wBAAA;AAAA,QACd,UAAA,EAAY;AAAA,UACV,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC5D,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UACzD;AAAA,YACE,IAAA,EAAM,OAAA;AAAA,YACN,IAAA,EAAM,SAAA;AAAA,YACN,YAAA,EAAc,oBAAA;AAAA,YACd,UAAA,EAAY;AAAA,cACV,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,cAAc,eAAA,EAAgB;AAAA,cACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC1D,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cACzE,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAChE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA;AAAU;AAChE,WACF;AAAA,UACA;AAAA,YACE,IAAA,EAAM,eAAA;AAAA,YACN,IAAA,EAAM,SAAA;AAAA,YACN,YAAA,EAAc,4BAAA;AAAA,YACd,UAAA,EAAY;AAAA,cACV,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,cAAc,eAAA,EAAgB;AAAA,cACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC1D,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cACzE,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAChE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,cAC9D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,iBAAA;AAAkB;AACxE,WACF;AAAA,UACA,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,cAAc,gBAAA,EAAiB;AAAA,UACnE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC9D,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC5D,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC7D,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UACzD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC/D,EAAE,IAAA,EAAM,iCAAA,EAAmC,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA;AAAU;AACtF,OACF;AAAA,MACA,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,MAC5D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,cAAc,OAAA;AAAQ;AAC5D;AAEJ,CAAA;;;ACjCA,IAAM,uBAAA,GAA0B,4CAAA;AAChC,IAAM,sBAAA,GAAyB,4CAAA;AAC/B,IAAM,iCAAA,GAAoC,4CAAA;AAC1C,IAAM,6BAAA,GAAgC,4CAAA;AACtC,IAAM,4BAAA,GAA+B,4CAAA;AACrC,IAAM,mBAAA,GAAsB,GAAA;AAGrB,IAAM,yCAAA,GAA4C,4CAAA;AAClD,IAAM,8BAAA,GAAiC,4CAAA;AACvC,IAAM,kCAAA,GAAqC,4CAAA;AAG3C,IAAM,wBAAA,GAA2B,4CAAA;AACjC,IAAM,yCAAA,GAA4C,4CAAA;AAClD,IAAM,sCAAA,GAAyC,4CAAA;AAKtD,IAAM,oBAAA,GAA0D;AAAA;AAAA,EAE9D,IAAA,EAAM;AAAA,IACJ,aAAA,EAAe,4CAAA;AAAA,IACf,uBAAA,EAAyB,4CAAA;AAAA,IACzB,kBAAA,EAAoB,4CAAA;AAAA,IACpB,kBAAA,EAAoB,4CAAA;AAAA,IACpB,cAAA,EAAgB,uBAAA;AAAA,IAChB,mBAAA,EAAqB,4CAAA;AAAA,IACrB,SAAA,EAAW,CAAA;AAAA;AAAA,IACX,qBAAA,EAAuB;AAAA,MACrB,OAAA,EAAS,4CAAA;AAAA,MACT,IAAA,EAAM,eAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,cAAA,EAAgB;AAAA,GAClB;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACL,aAAA,EAAe,sBAAA;AAAA,IACf,uBAAA,EAAyB,iCAAA;AAAA,IACzB,cAAA,EAAgB,uBAAA;AAAA,IAChB,mBAAA,EAAqB,6BAAA;AAAA,IACrB,SAAA,EAAW,mBAAA;AAAA,IACX,qBAAA,EAAuB;AAAA,MACrB,OAAA,EAAS,4CAAA;AAAA,MACT,IAAA,EAAM,eAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,cAAA,EAAgB;AAAA,GAClB;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,aAAA,EAAe,sBAAA;AAAA,IACf,uBAAA,EAAyB,iCAAA;AAAA,IACzB,cAAA,EAAgB,uBAAA;AAAA,IAChB,mBAAA,EAAqB,6BAAA;AAAA,IACrB,SAAA,EAAW,mBAAA;AAAA,IACX,qBAAA,EAAuB;AAAA,MACrB,OAAA,EAAS,4CAAA;AAAA,MACT,IAAA,EAAM,eAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,cAAA,EAAgB;AAAA,GAClB;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,aAAA,EAAe,sBAAA;AAAA,IACf,uBAAA,EAAyB,iCAAA;AAAA,IACzB,cAAA,EAAgB,uBAAA;AAAA,IAChB,mBAAA,EAAqB,6BAAA;AAAA,IACrB,SAAA,EAAW,mBAAA;AAAA,IACX,qBAAA,EAAuB;AAAA,MACrB,OAAA,EAAS,4CAAA;AAAA,MACT,IAAA,EAAM,eAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,cAAA,EAAgB,4CAAA;AAAA,IAChB,cAAA,EAAgB;AAAA,GAClB;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACL,aAAA,EAAe,sBAAA;AAAA,IACf,uBAAA,EAAyB,iCAAA;AAAA;AAAA,IAEzB,cAAA,EAAgB,4CAAA;AAAA,IAChB,mBAAA,EAAqB,6BAAA;AAAA,IACrB,SAAA,EAAW,mBAAA;AAAA,IACX,qBAAA,EAAuB;AAAA,MACrB,OAAA,EAAS,4CAAA;AAAA,MACT,IAAA,EAAM,aAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,cAAA,EAAgB,4CAAA;AAAA,IAChB,cAAA,EAAgB;AAAA,GAClB;AAAA;AAAA,EAGA,GAAA,EAAK;AAAA,IACH,aAAA,EAAe,sBAAA;AAAA,IACf,uBAAA,EAAyB,iCAAA;AAAA,IACzB,cAAA,EAAgB,uBAAA;AAAA,IAChB,mBAAA,EAAqB,6BAAA;AAAA,IACrB,SAAA,EAAW,mBAAA;AAAA,IACX,qBAAA,EAAuB;AAAA,MACrB,OAAA,EAAS,4CAAA;AAAA,MACT,IAAA,EAAM,eAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,cAAA,EAAgB;AAAA,GAClB;AAAA;AAAA,EAGA,GAAA,EAAK;AAAA,IACH,aAAA,EAAe,4CAAA;AAAA,IACf,uBAAA,EAAyB,4CAAA;AAAA,IACzB,kBAAA,EAAoB,4CAAA;AAAA,IACpB,kBAAA,EAAoB,4CAAA;AAAA,IACpB,cAAA,EAAgB,uBAAA;AAAA,IAChB,mBAAA,EAAqB,4CAAA;AAAA,IACrB,SAAA,EAAW,CAAA;AAAA;AAAA,IACX,qBAAA,EAAuB;AAAA,MACrB,OAAA,EAAS,4CAAA;AAAA,MACT,IAAA,EAAM,cAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,cAAA,EAAgB;AAAA,GAClB;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,aAAA,EAAe,sBAAA;AAAA,IACf,uBAAA,EAAyB,iCAAA;AAAA,IACzB,cAAA,EAAgB,uBAAA;AAAA,IAChB,mBAAA,EAAqB,6BAAA;AAAA,IACrB,SAAA,EAAW,mBAAA;AAAA,IACX,qBAAA,EAAuB;AAAA,MACrB,OAAA,EAAS,4CAAA;AAAA,MACT,IAAA,EAAM,aAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,cAAA,EAAgB;AAAA,GAClB;AAAA;AAAA,EAGA,GAAA,EAAK;AAAA,IACH,aAAA,EAAe,sBAAA;AAAA,IACf,uBAAA,EAAyB,iCAAA;AAAA,IACzB,cAAA,EAAgB,uBAAA;AAAA,IAChB,mBAAA,EAAqB,6BAAA;AAAA,IACrB,SAAA,EAAW,mBAAA;AAAA,IACX,qBAAA,EAAuB;AAAA,MACrB,OAAA,EAAS,4CAAA;AAAA,MACT,IAAA,EAAM,eAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,cAAA,EAAgB;AAAA;AAEpB,CAAA;AAKO,SAAS,qBAAqB,OAAA,EAAgD;AACnF,EAAA,OAAO,qBAAqB,OAAO,CAAA;AACrC;AAYO,SAAS,yBAAyB,OAAA,EAA0B;AACjE,EAAA,OAAO,OAAA,IAAW,oBAAA;AACpB;AAKO,SAAS,iBAAiB,OAAA,EAAgC;AAC/D,EAAA,OAAO,oBAAA,CAAqB,OAAO,CAAA,EAAG,aAAA,IAAiB,sBAAA;AACzD;AAKO,SAAS,2BAA2B,OAAA,EAAgC;AACzE,EAAA,OAAO,oBAAA,CAAqB,OAAO,CAAA,EAAG,uBAAA,IAA2B,iCAAA;AACnE;AAKO,SAAS,kBAAkB,OAAA,EAAgC;AAChE,EAAA,OAAO,oBAAA,CAAqB,OAAO,CAAA,EAAG,cAAA,IAAkB,uBAAA;AAC1D;AAKO,SAAS,uBAAuB,OAAA,EAAgC;AACrE,EAAA,OAAO,oBAAA,CAAqB,OAAO,CAAA,EAAG,mBAAA,IAAuB,6BAAA;AAC/D;AAKO,SAAS,aAAa,OAAA,EAAyB;AACpD,EAAA,OAAO,oBAAA,CAAqB,OAAO,CAAA,EAAG,SAAA,IAAa,mBAAA;AACrD;AAKO,SAAS,yBAAyB,OAAA,EAAoD;AAC3F,EAAA,OAAO,oBAAA,CAAqB,OAAO,CAAA,EAAG,qBAAA;AACxC;AAKO,SAAS,kBAAkB,OAAA,EAAyB;AACzD,EAAA,OAAO,oBAAA,CAAqB,OAAO,CAAA,EAAG,cAAA,IAAkB,KAAA;AAC1D;AAKO,SAAS,kBAAkB,OAAA,EAA4C;AAC5E,EAAA,OAAO,oBAAA,CAAqB,OAAO,CAAA,EAAG,cAAA;AACxC;AAMO,SAAS,sBAAsB,OAAA,EAA4C;AAChF,EAAA,OAAO,oBAAA,CAAqB,OAAO,CAAA,EAAG,kBAAA;AACxC;AAKO,SAAS,sBAAsB,OAAA,EAAgC;AACpE,EAAA,OAAO,oBAAA,CAAqB,OAAO,CAAA,EAAG,kBAAA,IAAsB,4BAAA;AAC9D;AC/QO,SAAS,wBAAwB,WAAA,EAA+C;AACrF,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,mBAAA,CAAoB,uBAAuB,WAAW,CAAA;AAExE,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,QAAQ,UAAA,CAAW,OAAA;AAAA,MAC5B,IAAA,EAAM,QAAQ,UAAA,CAAW,IAAA;AAAA,MACzB,OAAO,OAAA,CAAQ,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,QAClD,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,oBAAA,EAAsB,MAAA,CAAO,IAAA,CAAK,oBAAoB,CAAA;AAAA,QACtD,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,QACpC,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS;AAAA,OAClC,CAAE,CAAA;AAAA,MACF,eAAe,OAAA,CAAQ,UAAA,CAAW,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,QAClE,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,oBAAA,EAAsB,MAAA,CAAO,IAAA,CAAK,oBAAoB,CAAA;AAAA,QACtD,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,QACpC,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,QAChC,WAAW,IAAA,CAAK;AAAA,OAClB,CAAE,CAAA;AAAA,MACF,SAAA,EAAW,QAAQ,UAAA,CAAW,SAAA;AAAA,MAC9B,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA;AAAA,MAC9C,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA;AAAA,MAC1C,QAAA,EAAU,QAAQ,UAAA,CAAW,QAAA;AAAA,MAC7B,IAAA,EAAM,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA;AAAA,MACpC,UAAA,EAAY,QAAQ,UAAA,CAAW,UAAA;AAAA,MAC/B,+BAAA,EAAiC,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,+BAA+B;AAAA,KAC5F;AAAA,IACA,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC/B,WAAW,OAAA,CAAQ;AAAA,GACrB;AACF;AAMO,SAAS,+BAA+B,WAAA,EAI7C;AACA,EAAA,MAAM,UAAA,GAAa,wBAAwB,WAAW,CAAA;AAEtD,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,GAAG,UAAA,CAAW,UAAA;AAAA;AAAA,MAEd,OAAO,UAAA,CAAW,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAChD,GAAG,IAAA;AAAA,QACH,oBAAA,EAAsB,IAAA,CAAK,oBAAA,CAAqB,QAAA,EAAS;AAAA,QACzD,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,QAAA,EAAS;AAAA,QACvC,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,QAAA;AAAS,OACrC,CAAE,CAAA;AAAA,MACF,eAAe,UAAA,CAAW,UAAA,CAAW,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAChE,GAAG,IAAA;AAAA,QACH,oBAAA,EAAsB,IAAA,CAAK,oBAAA,CAAqB,QAAA,EAAS;AAAA,QACzD,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,QAAA,EAAS;AAAA,QACvC,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,QAAA;AAAS,OACrC,CAAE,CAAA;AAAA,MACF,SAAA,EAAW,UAAA,CAAW,UAAA,CAAW,SAAA,CAAU,QAAA,EAAS;AAAA,MACpD,OAAA,EAAS,UAAA,CAAW,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAS;AAAA,MAChD,IAAA,EAAM,UAAA,CAAW,UAAA,CAAW,IAAA,CAAK,QAAA,EAAS;AAAA,MAC1C,+BAAA,EAAiC,UAAA,CAAW,UAAA,CAAW,+BAAA,CAAgC,QAAA,EAAS;AAAA,MAChG,OAAA,EAAS,UAAA,CAAW,OAAA,CAAQ,QAAA;AAAS,KACvC;AAAA,IACA,WAAW,UAAA,CAAW,SAAA;AAAA,IACtB,SAAS,UAAA,CAAW;AAAA,GACtB;AACF;AAKO,SAAS,qBAAA,CAAsB,SAAiB,MAAA,EAAyB;AAC9E,EAAA,MAAM,QAAA,GAAW,IAAI,MAAA,CAAO,eAAA,CAAgB,MAAM,CAAA;AAGlD,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,MAAA;AAAA;AAAA,IAExB,kEAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,cAAA,GAAiB,kBAAkB,OAAO,CAAA;AAChD,EAAA,MAAM,cAAc,cAAA,GAChB;AAAA,IACE,GAAG,MAAA;AAAA,IACH,YAAY,MAAM,cAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX,GACA,MAAA;AAEJ,EAAA,OAAO,IAAI,QAAQ,WAAA,EAAoB;AAAA,IACrC,SAAA,EAAW,EAAE,eAAA,EAAiB,iBAAA,CAAkB,OAAO,CAAA;AAAE,GAC1D,CAAA;AACH;AAKO,SAAS,gBAAA,CACd,OAAA,EACA,eAAA,EACA,OAAA,EACQ;AACR,EAAA,OAAO,QAAQ,YAAA,CAAa;AAAA,IAC1B,GAAG,eAAA;AAAA,IACH,OAAA,EAAS,QAAQ,QAAA;AAAS,GAC3B,CAAA;AACH;AAKO,SAAS,sBAAA,CACd,iBACA,UAAA,EACoB;AACpB,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,OAAA,CAAA;AAAA,EACF;AAEA,EAAA,IACE,UAAA,CAAW,gBAAgB,UAAA,CAAW,SAAA,IACtC,WAAW,WAAA,GAAc,MAAA,CAAO,CAAC,CAAA,EACjC;AACA,IAAA,OAAA,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AAChD,EAAA,IAAI,eAAA,CAAgB,UAAU,GAAA,EAAK;AACjC,IAAA,OAAA,CAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAA;AACF;AAKO,SAAS,4BAA4B,UAAA,EAA4C;AACtF,EAAA,OAAO,WAAW,aAAA,CAAc,MAAA;AAAA,IAC9B,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,WAAA;AAAA,IAC1B,OAAO,CAAC;AAAA,GACV;AACF;AAKO,SAAS,YAAY,QAAA,EAA0B;AACpD,EAAA,OAAO,UAAA,CAAW,WAAA,CAAY,QAAQ,CAAC,CAAA;AACzC;ACzJA,eAAsB,sBAAA,CACpB,MAAA,EACA,OAAA,EACA,WAAA,EACmC;AACnC,EAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,cAAA,GAAiB,kBAAkB,OAAO,CAAA;AAEhD,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAI,CAAA,kCAAA,EAAqC,WAAA,CAAY,MAAM,CAAA,cAAA,EAAiB,yCAAyC,CAAA,CAAE,CAAA;AAC/H,IAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,MAAA,EAAQ;AAAA,MACzC,OAAA,EAAS,yCAAA;AAAA,MACT,GAAA,EAAK,qCAAA;AAAA,MACL,YAAA,EAAc,kBAAA;AAAA,MACd,IAAA,EAAM,CAAC,cAAA,EAAgB,WAAW;AAAA,KACnC,CAAA;AAED,IAAA,MAAM,QAAA,GAAY,OAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC9C,aAAa,CAAA,CAAE,WAAA;AAAA,MACf,aAAa,CAAA,CAAE,WAAA;AAAA,MACf,WAAA,EAAa,MAAA,CAAO,CAAA,CAAE,WAAW,CAAA;AAAA,MACjC,SAAA,EAAW,MAAA,CAAO,CAAA,CAAE,SAAS;AAAA,KAC/B,CAAE,CAAA;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,QAAA,CAAS,MAAM,CAAA,SAAA,CAAW,CAAA;AAC3E,IAAA,OAAO,QAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,WAAA,CAAY,MAAM,YAAY,GAAG,CAAA;AACtF,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAuBA,eAAsB,kBAAA,CACpB,MAAA,EACA,UAAA,EACA,QAAA,EACmC;AACnC,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA,YAAA,EAAe,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,KAAA,EAAQ,8BAA8B,CAAA,CAAE,CAAA;AAC1I,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,MAAA,EAAQ;AAAA,MACxC,OAAA,EAAS,8BAAA;AAAA,MACT,GAAA,EAAK,0BAAA;AAAA,MACL,YAAA,EAAc,gBAAA;AAAA,MACd,IAAA,EAAM,CAAC,UAAA,EAAY,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,MAAA,CAAO,EAAE,CAAC,CAAC;AAAA,KACpD,CAAA;AAED,IAAA,MAAM,SAAU,MAAA,CAA2B,GAAA;AAAA,MAAI,CAAC,KAAA,KAC9C,KAAA,KAAU,4CAAA,GAA+C,IAAA,GAAO;AAAA,KAClE;AACA,IAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAA,CAAE,MAAA;AACpD,IAAA,OAAA,CAAQ,IAAI,CAAA,8BAAA,EAAiC,UAAU,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,YAAA,CAAc,CAAA;AACxF,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAA,CAAS,MAAM,sCAAiC,GAAG,CAAA;AACpG,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,EAChC;AACF;AAuBA,eAAsB,sBAAA,CACpB,MAAA,EACA,YAAA,EACA,SAAA,EACmB;AACnB,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,SAAA,CAAU,MAAM,CAAA,cAAA,EAAiB,aAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,CAAA;AAC7G,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,MAAA,EAAQ;AAAA,MAC1C,OAAA,EAAS,kCAAA;AAAA,MACT,GAAA,EAAK,8BAAA;AAAA,MACL,YAAA,EAAc,aAAA;AAAA,MACd,IAAA,EAAM,CAAC,YAAA,EAAc,SAAS;AAAA,KAC/B,CAAA;AAED,IAAA,MAAM,SAAU,QAAA,CAAsB,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAC1D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,MAAA,CAAO,MAAM,CAAA,SAAA,CAAW,CAAA;AACzE,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,SAAA,CAAU,MAAM,yCAAoC,GAAG,CAAA;AAC5G,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,MAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACtC;AACF;AA0BO,SAAS,cAAA,CACd,WAAA,EACA,cAAA,EACA,aAAA,EACA,YAAA,EACS;AACT,EAAA,IAAI,WAAA,KAAA,CAAA,aAAyC;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,EAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,YAAA,IAAgB,YAAA,CAAa,aAAY,KAAM,aAAA,CAAc,aAAY,EAAG;AAC/E,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,sBAAA,CACd,WAAA,EACA,cAAA,EACA,QAAA,EACA,YAAA,EACS;AACT,EAAA,IAAI,WAAA,KAAA,CAAA,aAAyC;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,EAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,iBAAA,CACd,WAAA,EACA,cAAA,EACA,QAAA,EACA,gBAAA,EACS;AACT,EAAA,IAAI,WAAA,KAAA,CAAA,aAAyC;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,EAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,mBAAmB,QAAA,EAAU;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,mBAAA,CACd,WAAA,EACA,cAAA,EACA,WAAA,EACA,kBAAA,EACS;AACT,EAAA,IAAI,WAAA,KAAA,CAAA,aAAyC;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,EAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,qBAAqB,WAAA,EAAa;AACpC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;ACzQO,SAAS,uBAAA,CACd,SACA,OAAA,EACgB;AAChB,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,OAAA,CAAQ,IAAqB,CAAA;AACxE,IAAA,MAAM,EAAE,YAAW,GAAI,UAAA;AAGvB,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA;AACpC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,SAAA,CAAU,QAAA,KAAA,CAAA,iBAAgC,SAAA,CAAU,QAAA,KAAA,CAAA,gBAA+B;AACrF,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,4BAA4B,UAAU,CAAA;AACvD,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,oBAAA,CAAqB,QAAA,EAAS;AAExD,IAAA,MAAM,eAAA,GACJ,UAAA,CAAW,IAAA,CAAK,WAAA,EAAY,KAAM,sCAAA,CAAuC,WAAA,EAAY,IACrF,UAAA,CAAW,QAAA,KAAa,oEAAA,GACpB,UAAA,CAAW,QAAA,GACX,KAAA,CAAA;AAEN,IAAA,OAAO;AAAA,MACL,OAAO,UAAA,CAAW,OAAA;AAAA,MAClB,YAAY,SAAA,CAAU,KAAA;AAAA,MACtB,OAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,YAAY,QAAQ,CAAA;AAAA,MAC3B,QAAA,EAAU,kBAAkB,OAAO,CAAA;AAAA,MACnC,cAAA,EAAgB,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA;AAAA,MACzC,SAAA,EAAW,EAAA;AAAA;AAAA,MACX,WAAA,EAAA,CAAA;AAAA;AAAA,MACA,aAAa,OAAA,CAAQ,IAAA;AAAA,MACrB,eAAA,EAAiB;AAAA,QACf,GAAG,UAAA;AAAA,QACH,SAAS,UAAA,CAAW;AAAA,OACtB;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,+BAAA,CACd,SACA,OAAA,EACwB;AACxB,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,OAAA,CAAQ,IAAqB,CAAA;AACxE,IAAA,MAAM,EAAE,YAAW,GAAI,UAAA;AAGvB,IAAA,IACE,WAAW,IAAA,CAAK,WAAA,EAAY,KAC5B,yCAAA,CAA0C,aAAY,EACtD;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA;AACpC,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,QAAA,KAAA,CAAA,cAA6B;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,gBAAA,GAAmB,WAAW,aAAA,CAAc,IAAA;AAAA,MAChD,CAAC,IAAA,KACC,IAAA,CAAK,QAAA,KAAA,CAAA,+BACL,IAAA,CAAK,QAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,gBAAA,CAAiB,WAAA,KAAgB,MAAA,CAAO,CAAC,CAAA,EAAG;AAC9C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAW,SAAA,CAAU,WAAA;AAE3B,IAAA,OAAO;AAAA,MACL,OAAO,UAAA,CAAW,OAAA;AAAA,MAClB,YAAY,gBAAA,CAAiB,KAAA;AAAA,MAC7B,QAAA;AAAA,MACA,KAAA,EAAO,YAAY,QAAQ,CAAA;AAAA,MAC3B,QAAA,EAAU,kBAAkB,OAAO,CAAA;AAAA,MACnC,cAAA,EAAgB,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA;AAAA,MACzC,SAAA,EAAW,EAAA;AAAA;AAAA,MACX,WAAA,EAAA,CAAA;AAAA;AAAA,MACA,aAAa,OAAA,CAAQ,IAAA;AAAA,MACrB,eAAA,EAAiB;AAAA,QACf,GAAG,UAAA;AAAA,QACH,SAAS,UAAA,CAAW;AAAA;AACtB,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,uBAAuB,QAAA,EAAgC;AACrE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAqB;AAE1C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,GAAA,GAAM,GAAG,OAAA,CAAQ,UAAA,CAAW,aAAa,CAAA,CAAA,EAAI,QAAQ,OAAO,CAAA,CAAA;AAClE,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAEjC,IAAA,IAAI,CAAC,QAAA,IAAY,OAAA,CAAQ,QAAA,GAAW,SAAS,QAAA,EAAU;AACrD,MAAA,QAAA,CAAS,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA;AACrC;AAkBO,SAAS,oBAAoB,QAAA,EAAgC;AAClE,EAAA,OAAO,CAAC,GAAG,QAAQ,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAClC,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAA;AAC5B,IAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,EAAA;AAC7B,IAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,CAAA;AAC7B,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AACH;AAKO,SAAS,kBAAkB,MAAA,EAA8C;AAC9E,EAAA,OAAO,CAAC,GAAG,MAAM,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAChC,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAA;AAC5B,IAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,EAAA;AAC7B,IAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,CAAA;AAC7B,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AACH;AAKO,SAAS,0BAAA,CACd,SACA,OAAA,EACmB;AACnB,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,OAAA,CAAQ,IAAqB,CAAA;AACxE,IAAA,MAAM,EAAE,YAAW,GAAI,UAAA;AAGvB,IAAA,IACE,WAAW,IAAA,CAAK,WAAA,EAAY,KAC5B,yCAAA,CAA0C,aAAY,EACtD;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA;AACpC,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,QAAA,KAAA,CAAA,cAA6B;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,kBAAA,GAAqB,WAAW,aAAA,CAAc,IAAA;AAAA,MAClD,CAAC,SAAS,IAAA,CAAK,QAAA,KAAA,CAAA;AAAA,KACjB;AAEA,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,cAAc,kBAAA,CAAmB,WAAA;AACvC,IAAA,IAAI,WAAA,KAAgB,MAAA,CAAO,CAAC,CAAA,EAAG;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAW,SAAA,CAAU,WAAA;AAC3B,IAAA,MAAM,mBAAmB,QAAA,GAAW,WAAA;AAEpC,IAAA,OAAO;AAAA,MACL,OAAO,UAAA,CAAW,OAAA;AAAA,MAClB,cAAc,kBAAA,CAAmB,KAAA;AAAA,MACjC,WAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,KAAA,EAAO,YAAY,QAAQ,CAAA;AAAA,MAC3B,aAAA,EAAe,YAAY,gBAAgB,CAAA;AAAA,MAC3C,QAAA,EAAU,kBAAkB,OAAO,CAAA;AAAA,MACnC,cAAA,EAAgB,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA;AAAA,MACzC,SAAA,EAAW,IAAA;AAAA;AAAA,MACX,WAAA,EAAA,CAAA;AAAA;AAAA,MACA,aAAa,OAAA,CAAQ,IAAA;AAAA,MACrB,eAAA,EAAiB;AAAA,QACf,GAAG,UAAA;AAAA,QACH,SAAS,UAAA,CAAW;AAAA;AACtB,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,+BAA+B,MAAA,EAAoC;AACjF,EAAA,OAAO,CAAC,GAAG,MAAM,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAChC,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,gBAAA,GAAmB,CAAA,CAAE,gBAAA;AACpC,IAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,EAAA;AAC7B,IAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,CAAA;AAC7B,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AACH;AASO,SAAS,4BAAA,CACd,SACA,OAAA,EACqB;AACrB,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,OAAA,CAAQ,IAAqB,CAAA;AACxE,IAAA,MAAM,EAAE,YAAW,GAAI,UAAA;AAGvB,IAAA,IACE,WAAW,IAAA,CAAK,WAAA,EAAY,KAC5B,yCAAA,CAA0C,aAAY,EACtD;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA;AACpC,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,QAAA,KAAA,CAAA,cAA6B;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAc,SAAA,CAAU,WAAA;AAC9B,IAAA,IAAI,WAAA,KAAgB,MAAA,CAAO,CAAC,CAAA,EAAG;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,4BAA4B,UAAU,CAAA;AACvD,IAAA,IAAI,QAAA,KAAa,MAAA,CAAO,CAAC,CAAA,EAAG;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,mBAAmB,QAAA,GAAW,WAAA;AAEpC,IAAA,OAAO;AAAA,MACL,OAAO,UAAA,CAAW,OAAA;AAAA,MAClB,cAAc,SAAA,CAAU,KAAA;AAAA,MACxB,WAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,KAAA,EAAO,YAAY,QAAQ,CAAA;AAAA,MAC3B,aAAA,EAAe,YAAY,gBAAgB,CAAA;AAAA,MAC3C,QAAA,EAAU,kBAAkB,OAAO,CAAA;AAAA,MACnC,cAAA,EAAgB,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA;AAAA,MACzC,SAAA,EAAW,IAAA;AAAA;AAAA,MACX,WAAA,EAAA,CAAA;AAAA;AAAA,MACA,aAAa,OAAA,CAAQ,IAAA;AAAA,MACrB,eAAA,EAAiB;AAAA,QACf,GAAG,UAAA;AAAA,QACH,SAAS,UAAA,CAAW;AAAA;AACtB,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,iCAAiC,QAAA,EAA0C;AACzF,EAAA,OAAO,CAAC,GAAG,QAAQ,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAClC,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,gBAAA,GAAmB,CAAA,CAAE,gBAAA;AACpC,IAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,EAAA;AAC7B,IAAA,IAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,CAAA;AAC7B,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AACH;AAOA,IAAM,oBAAA,GAAuB;AAAA,EAC3B,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,EAClB,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,EAClB,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,EAClB;AAAA,IACE,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,YAAA,EAAc,uBAAA;AAAA,IACd,UAAA,EAAY;AAAA,MACV,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,MAC5D;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc,oBAAA;AAAA,QACd,UAAA,EAAY;AAAA,UACV,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,cAAc,eAAA,EAAgB;AAAA,UACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC1D,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC/D,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA;AAAU;AAC7D,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,eAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc,uBAAA;AAAA,QACd,UAAA,EAAY;AAAA,UACV,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,cAAc,eAAA,EAAgB;AAAA,UACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC1D,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC/D,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,UAC3D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,iBAAA;AAAkB;AACxE,OACF;AAAA,MACA,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,cAAc,OAAA,EAAQ;AAAA,MAC1D,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,WAAA,EAAa,cAAc,WAAA,EAAY;AAAA,MACpE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,MAC9D,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAU;AAAA,MAC5D,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA;AAAU;AAC/D;AAEJ,CAAA;AAQO,SAAS,uBAAA,CACd,YACA,OAAA,EACa;AACb,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GACJ,QACC,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,GAAI,UAAA,CAAA;AAGvD,IAAA,MAAM,CAAC,SAAA,MAAe,cAAc,CAAA,GAAIA,mBAAAA;AAAA,MACtC,oBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA;AACxC,IAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,IAAA,MAAM,kBAAA,GAAqB,eAAe,aAAA,CAAc,MAAA;AAAA,MACtD,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,MAAA;AAAA,MAC1B,OAAO,CAAC;AAAA,KACV;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,cAAA,CAAe,OAAA;AAAA,MACvB,OAAO,cAAA,CAAe,SAAA;AAAA,MACtB,cAAc,SAAA,CAAU,KAAA;AAAA,MACxB,OAAA,EAAS,SAAA,CAAU,UAAA,CAAW,QAAA,EAAS;AAAA,MACvC,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,QAAA,EAAU,kBAAA;AAAA,MACV,KAAA,EAAO,UAAA,CAAWC,WAAAA,CAAY,kBAAkB,CAAC,CAAA;AAAA,MACjD,QAAA,EAAU,kBAAkB,OAAO,CAAA;AAAA,MACnC,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,MAC3B,WAAW,cAAA,CAAe;AAAA,KAC5B;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;ACzaA,IAAM,WAAA,GAAc,OAAO,oEAAoE,CAAA;AAO/F,eAAsB,mBAAA,CACpB,MAAA,EACA,UAAA,EACA,KAAA,EACA,OAAA,EACwC;AACxC,EAAA,MAAM,UAAA,GAAa,MAAMC,YAAAA,CAAa,MAAA,EAAQ;AAAA,IAC5C,OAAA,EAAS,UAAA;AAAA,IACT,GAAA,EAAK,mBAAA;AAAA,IACL,YAAA,EAAc,kBAAA;AAAA,IACd,IAAA,EAAM,CAAC,KAAA,EAAO,OAAO;AAAA,GACtB,CAAA;AAED,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,UAAA;AAAA,IACJ,YAAA,EAAc,mBAAA;AAAA,IACd,IAAA,EAAM,CAAC,OAAA,EAAS,IAAI,CAAA;AAAA,IACpB,GAAA,EAAK;AAAA,GACP;AACF;AAOA,eAAsB,kBAAA,CACpB,MAAA,EACA,YAAA,EACA,KAAA,EACA,SACA,MAAA,EACwC;AACxC,EAAA,MAAM,SAAA,GAAa,MAAMA,YAAAA,CAAa,MAAA,EAAQ;AAAA,IAC5C,OAAA,EAAS,YAAA;AAAA,IACT,GAAA,EAAK,kBAAA;AAAA,IACL,YAAA,EAAc,WAAA;AAAA,IACd,IAAA,EAAM,CAAC,KAAA,EAAO,OAAO;AAAA,GACtB,CAAA;AAED,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,YAAA;AAAA,IACJ,YAAA,EAAc,SAAA;AAAA,IACd,IAAA,EAAM,CAAC,OAAA,EAAS,WAAW,CAAA;AAAA,IAC3B,GAAA,EAAK;AAAA,GACP;AACF;;;ACvDA,IAAM,YAAA,GAAe,oEAAA;AAKrB,SAAS,sBAAsB,MAAA,EAAgC;AAC7D,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACjC,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,sBAAsB,IAAA,CAAK,oBAAA;AAAA,MAC3B,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK;AAAA,KAClB,CAAE,CAAA;AAAA,IACF,aAAA,EAAe,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACjD,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,sBAAsB,IAAA,CAAK,oBAAA;AAAA,MAC3B,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK;AAAA,KAClB,CAAE,CAAA;AAAA,IACF,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,iCAAiC,MAAA,CAAO;AAAA,GAC1C;AACF;AAKA,SAAS,4BAA4B,MAAA,EAAwC;AAC3E,EAAA,OAAO,MAAA,CAAO,aAAA,CAAc,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS;AAChD,IAAA,IAAI,KAAK,QAAA,KAAA,CAAA,eAA8B;AACrC,MAAA,OAAO,MAAM,IAAA,CAAK,WAAA;AAAA,IACpB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AACd;AAcO,SAAS,qBAAA,CACd,UAAA,EACA,SAAA,EACA,cAAA,EACwB;AACxB,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,UAAA,EAAY,qBAAA,CAAsB,UAAA,CAAW,UAAU,CAAA;AAAA,IACvD,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,IACnB,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,IACrB,WAAW,UAAA,CAAW,SAAA;AAAA,IACtB,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,cAAA;AAAA,IACJ,YAAA,EAAc,sBAAA;AAAA,IACd,MAAM,CAAC,aAAA,EAAe,EAAC,EAAG,cAAc,SAAS,CAAA;AAAA,IACjD,GAAA,EAAK,kCAAA;AAAA,IACL,KAAA,EAAO,2BAAA,CAA4B,UAAA,CAAW,UAAU;AAAA,GAC1D;AACF;AAcO,SAAS,6BAAA,CACd,UAAA,EACA,OAAA,EACA,SAAA,EACA,cAAA,EACwB;AACxB,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,UAAA,EAAY,qBAAA,CAAsB,UAAA,CAAW,UAAU,CAAA;AAAA,IACvD,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,IACnB,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,IACrB,WAAW,UAAA,CAAW,SAAA;AAAA,IACtB,SAAA,EAAW;AAAA,GACb;AAGA,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACxB;AAAA,MACE,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,MACpB,IAAA,EAAM,CAAA;AAAA;AAAA,MACN,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA;AAAA,MACf,UAAA,EAAY,OAAA;AAAA,MACZ,eAAe;AAAC;AAClB,GACF;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,cAAA;AAAA,IACJ,YAAA,EAAc,sBAAA;AAAA,IACd,IAAA,EAAM,CAAC,aAAA,EAAe,iBAAA,EAAmB,cAAc,SAAS,CAAA;AAAA,IAChE,GAAA,EAAK,kCAAA;AAAA,IACL,KAAA,EAAO,OAAO,CAAC;AAAA,GACjB;AACF;AASO,SAAS,wBAAA,CACd,YACA,cAAA,EACwB;AACxB,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,UAAA,EAAY,qBAAA,CAAsB,UAAA,CAAW,UAAU,CAAA;AAAA,IACvD,WAAW,UAAA,CAAW;AAAA,GACxB;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,cAAA;AAAA,IACJ,YAAA,EAAc,cAAA;AAAA,IACd,IAAA,EAAM,CAAC,KAAA,EAAO,YAAY,CAAA;AAAA,IAC1B,GAAA,EAAK,yBAAA;AAAA,IACL,KAAA,EAAO,OAAO,CAAC;AAAA,GACjB;AACF;AAYO,SAAS,0BAAA,CACd,UAAA,EACA,SAAA,EACA,cAAA,EACwB;AACxB,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,UAAA,EAAY,qBAAA,CAAsB,UAAA,CAAW,UAAU,CAAA;AAAA,IACvD,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,IACnB,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,IACrB,WAAW,UAAA,CAAW,SAAA;AAAA,IACtB,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,cAAA;AAAA,IACJ,YAAA,EAAc,sBAAA;AAAA,IACd,MAAM,CAAC,aAAA,EAAe,EAAC,EAAG,cAAc,SAAS,CAAA;AAAA,IACjD,GAAA,EAAK,kCAAA;AAAA,IACL,KAAA,EAAO,2BAAA,CAA4B,UAAA,CAAW,UAAU;AAAA,GAC1D;AACF;ACpKA,IAAM,0BAAA,GAA6B,SAAA;AACnC,IAAM,6BAAA,GAAgC,KAAA;AAEtC,IAAMC,aAAAA,GAAe,oEAAA;AACrB,IAAM,YAAA,GAAe,4CAAA;AAQrB,IAAM,0BAAA,GAA6B;AAAA,EACjC,eAAA,EAAiB;AAAA,IACf,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,IACnC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,IAChC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,aAAA,EAAc;AAAA,IACrC,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAA,EAAM,qBAAA,EAAsB;AAAA,IACrD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,OAAA,EAAQ;AAAA,IACnC,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAU;AAAA,IACrC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,IACnC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAU;AAAA,IACpC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,IAChC,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA,EAAU;AAAA,IACtC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA;AAAU,GACrC;AAAA,EACA,SAAA,EAAW;AAAA,IACT,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAQ;AAAA,IAClC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,IACjC,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,SAAA,EAAU;AAAA,IAChD,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAU;AAAA,IACvC,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA;AAAU,GACvC;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAQ;AAAA,IAClC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,IACjC,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,SAAA,EAAU;AAAA,IAChD,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAU;AAAA,IACvC,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA,EAAU;AAAA,IACrC,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA;AAAU;AAEzC,CAAA;AAQO,SAAS,YAAA,CACd,KAAA,EACA,MAAA,EACA,kBAAA,EACQ;AACR,EAAA,IAAI,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA,CAAO,CAAC,CAAA;AAEjC,EAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAA;AACjC,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,OAAA,CAAQ,GAAA,GAAM,MAAA,CAAO,IAAI,CAAA,IAAK,OAAO,GAAK,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,GAAA,GAAM,OAAO,GAAK,CAAA;AAC3B;AAKO,SAAS,YAAA,GAAuB;AACrC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,IAAI,OAAO,UAAA,CAAW,MAAA,KAAW,WAAA,IAAe,UAAA,CAAW,OAAO,eAAA,EAAiB;AACjF,IAAA,UAAA,CAAW,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAAA,EACzC,CAAA,MAAO;AAEL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,GAAG,CAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,IAAI,GAAA,GAAM,IAAA;AACV,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,GAAA,IAAO,EAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,OAAO,GAAG,CAAA;AACnB;AAKO,SAAS,oBAAA,GAA+B;AAC7C,EAAA,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAA,GAAI,KAAA;AACzC;AAQO,SAAS,2BAAA,CACd,MAAA,EACA,OAAA,EACA,OAAA,EAC8D;AAC9D,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,QAAQ,KAAK,CAAA;AAC7D,EAAA,MAAM,YAAA,GAAe,OAAO,QAAA,GAAW,SAAA;AACvC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,cAAA,IAAkB,sBAAsB,CAAA;AACtE,EAAA,MAAM,YAAA,GAAe,uBAAuB,OAAO,CAAA;AAEnD,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB;AAAA,MACE,QAAA,EAAA,CAAA;AAAA,MACA,KAAA,EAAO,YAAA;AAAA,MACP,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAAA,MAC9B,WAAA,EAAa,YAAA;AAAA,MACb,SAAA,EAAW,YAAA;AAAA,MACX,WAAW,MAAA,CAAO;AAAA;AACpB,GACF;AAEA,EAAA,IAAI,SAAA,GAAY,MAAA,CAAO,CAAC,CAAA,EAAG;AACzB,IAAA,aAAA,CAAc,IAAA,CAAK;AAAA,MACjB,QAAA,EAAA,CAAA;AAAA,MACA,KAAA,EAAO,YAAA;AAAA,MACP,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAAA,MAC9B,WAAA,EAAa,SAAA;AAAA,MACb,SAAA,EAAW,SAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,QAAA;AAEJ,EAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,IAAA,IAAA,GAAO,sCAAA;AAEP,IAAA,QAAA,GAAW,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,eAAe,CAAC,CAAA;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,wBAAA;AACP,IAAA,QAAA,GAAWA,aAAAA;AAAA,EACb;AAEA,EAAA,MAAM,eAAA,GAA0C;AAAA,IAC9C,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,IAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL;AAAA,QACE,QAAA,EAAA,CAAA;AAAA,QACA,OAAO,MAAA,CAAO,UAAA;AAAA,QACd,oBAAA,EAAsB,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,QAC3C,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,QACrB,SAAA,EAAW,OAAO,CAAC;AAAA;AACrB,KACF;AAAA,IACA,aAAA;AAAA,IACA,SAAA,EAAA,CAAA;AAAA,IACA,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,IACnB,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAM,YAAA,EAAa;AAAA,IACnB,UAAA,EAAYA,aAAAA;AAAA,IACZ,+BAAA,EAAiC,MAAA,CAAO,aAAA,CAAc,MAAM;AAAA,GAC9D;AAEA,EAAA,OAAO,EAAE,iBAAiB,OAAA,EAAQ;AACpC;AAQO,SAAS,mCAAA,CACd,MAAA,EACA,OAAA,EACA,OAAA,EAC8D;AAC9D,EAAA,MAAM,IAAA,GAAO,yBAAyB,OAAO,CAAA;AAC7C,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gDAAA,EAAmD,OAAO,CAAA,CAAE,CAAA;AAAA,EAC9E;AAEA,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,QAAQ,KAAK,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,cAAA,IAAkB,sBAAsB,CAAA;AACtE,EAAA,MAAM,YAAA,GAAe,uBAAuB,OAAO,CAAA;AAEnD,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB;AAAA,MACE,QAAA,EAAA,CAAA;AAAA,MACA,OAAO,MAAA,CAAO,UAAA;AAAA,MACd,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAAA;AAAA,MAC9B,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,MACrB,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,MACnB,WAAW,MAAA,CAAO;AAAA;AACpB,GACF;AAEA,EAAA,IAAI,SAAA,GAAY,MAAA,CAAO,CAAC,CAAA,EAAG;AACzB,IAAA,aAAA,CAAc,IAAA,CAAK;AAAA,MACjB,QAAA,EAAA,CAAA;AAAA,MACA,OAAO,IAAA,CAAK,OAAA;AAAA,MACZ,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAAA,MAC9B,WAAA,EAAa,SAAA;AAAA,MACb,SAAA,EAAW,SAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,eAAA,GAA0C;AAAA,IAC9C,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,IAAA,EAAM,yCAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL;AAAA,QACE,QAAA,EAAA,CAAA;AAAA,QACA,OAAO,IAAA,CAAK,OAAA;AAAA,QACZ,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAAA,QAC9B,aAAa,MAAA,CAAO,QAAA;AAAA,QACpB,WAAW,MAAA,CAAO;AAAA;AACpB,KACF;AAAA,IACA,aAAA;AAAA,IACA,SAAA,EAAA,CAAA;AAAA,IACA,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,IACnB,OAAA;AAAA,IACA,QAAA,EAAUA,aAAAA;AAAA,IACV,MAAM,YAAA,EAAa;AAAA,IACnB,UAAA,EAAYA,aAAAA;AAAA,IACZ,+BAAA,EAAiC,MAAA,CAAO,aAAA,CAAc,MAAM;AAAA,GAC9D;AAEA,EAAA,OAAO,EAAE,iBAAiB,OAAA,EAAQ;AACpC;AAQO,SAAS,8BAAA,CACd,MAAA,EACA,OAAA,EACA,OAAA,EAC8D;AAC9D,EAAA,MAAM,IAAA,GAAO,yBAAyB,OAAO,CAAA;AAC7C,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gDAAA,EAAmD,OAAO,CAAA,CAAE,CAAA;AAAA,EAC9E;AAEA,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,QAAQ,IAAI,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,cAAA,IAAkB,sBAAsB,CAAA;AACtE,EAAA,MAAM,YAAA,GAAe,uBAAuB,OAAO,CAAA;AAEnD,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB;AAAA,MACE,QAAA,EAAA,CAAA;AAAA,MACA,OAAO,MAAA,CAAO,YAAA;AAAA,MACd,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAAA,MAC9B,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,WAAW,MAAA,CAAO,WAAA;AAAA,MAClB,WAAW,MAAA,CAAO;AAAA;AACpB,GACF;AAEA,EAAA,IAAI,SAAA,GAAY,MAAA,CAAO,CAAC,CAAA,EAAG;AACzB,IAAA,aAAA,CAAc,IAAA,CAAK;AAAA,MACjB,QAAA,EAAA,CAAA;AAAA,MACA,OAAO,IAAA,CAAK,OAAA;AAAA,MACZ,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAAA,MAC9B,WAAA,EAAa,SAAA;AAAA,MACb,SAAA,EAAW,SAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,eAAA,GAA0C;AAAA,IAC9C,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,IAAA,EAAM,yCAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL;AAAA,QACE,QAAA,EAAA,CAAA;AAAA,QACA,OAAO,IAAA,CAAK,OAAA;AAAA,QACZ,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAAA,QAC9B,aAAa,MAAA,CAAO,QAAA;AAAA,QACpB,WAAW,MAAA,CAAO;AAAA;AACpB,KACF;AAAA,IACA,aAAA;AAAA,IACA,SAAA,EAAA,CAAA;AAAA,IACA,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,IACnB,OAAA;AAAA,IACA,QAAA,EAAUA,aAAAA;AAAA,IACV,MAAM,YAAA,EAAa;AAAA,IACnB,UAAA,EAAYA,aAAAA;AAAA,IACZ,+BAAA,EAAiC,MAAA,CAAO,aAAA,CAAc,MAAM;AAAA,GAC9D;AAEA,EAAA,OAAO,EAAE,iBAAiB,OAAA,EAAQ;AACpC;AAQO,SAAS,gCAAA,CACd,MAAA,EACA,OAAA,EACA,OAAA,EAC8D;AAC9D,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,QAAQ,IAAI,CAAA;AAC5D,EAAA,MAAM,YAAA,GAAe,OAAO,QAAA,GAAW,SAAA;AACvC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,cAAA,IAAkB,sBAAsB,CAAA;AACtE,EAAA,MAAM,YAAA,GAAe,uBAAuB,OAAO,CAAA;AAEnD,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB;AAAA,MACE,QAAA,EAAA,CAAA;AAAA,MACA,KAAA,EAAO,YAAA;AAAA,MACP,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAAA,MAC9B,WAAA,EAAa,YAAA;AAAA,MACb,SAAA,EAAW,YAAA;AAAA,MACX,WAAW,MAAA,CAAO;AAAA;AACpB,GACF;AAEA,EAAA,IAAI,SAAA,GAAY,MAAA,CAAO,CAAC,CAAA,EAAG;AACzB,IAAA,aAAA,CAAc,IAAA,CAAK;AAAA,MACjB,QAAA,EAAA,CAAA;AAAA,MACA,KAAA,EAAO,YAAA;AAAA,MACP,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAAA,MAC9B,WAAA,EAAa,SAAA;AAAA,MACb,SAAA,EAAW,SAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,QAAA;AAEJ,EAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,IAAA,IAAA,GAAO,sCAAA;AAEP,IAAA,QAAA,GAAW,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,eAAe,CAAC,CAAA;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,wBAAA;AACP,IAAA,QAAA,GAAWA,aAAAA;AAAA,EACb;AAEA,EAAA,MAAM,eAAA,GAA0C;AAAA,IAC9C,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,IAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL;AAAA,QACE,QAAA,EAAA,CAAA;AAAA,QACA,OAAO,MAAA,CAAO,YAAA;AAAA,QACd,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAAA,QAC9B,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,WAAW,MAAA,CAAO;AAAA;AACpB,KACF;AAAA,IACA,aAAA;AAAA,IACA,SAAA,EAAA,CAAA;AAAA,IACA,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,IACnB,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAM,YAAA,EAAa;AAAA,IACnB,UAAA,EAAYA,aAAAA;AAAA,IACZ,+BAAA,EAAiC,MAAA,CAAO,aAAA,CAAc,MAAM;AAAA,GAC9D;AAEA,EAAA,OAAO,EAAE,iBAAiB,OAAA,EAAQ;AACpC;AAQO,SAAS,oBAAA,CACd,eAAA,EACA,OAAA,EACA,OAAA,EACA,cAAA,EACiB;AAEjB,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,MAAM,eAAA,CAAgB,IAAA;AAAA,IACtB,KAAA,EAAO,eAAA,CAAgB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC1C,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,sBAAsB,IAAA,CAAK,oBAAA;AAAA,MAC3B,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK;AAAA,KAClB,CAAE,CAAA;AAAA,IACF,aAAA,EAAe,eAAA,CAAgB,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC1D,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,sBAAsB,IAAA,CAAK,oBAAA;AAAA,MAC3B,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK;AAAA,KAClB,CAAE,CAAA;AAAA,IACF,WAAW,eAAA,CAAgB,SAAA;AAAA,IAC3B,WAAW,eAAA,CAAgB,SAAA;AAAA,IAC3B,SAAS,eAAA,CAAgB,OAAA;AAAA,IACzB,UAAU,eAAA,CAAgB,QAAA;AAAA,IAC1B,MAAM,eAAA,CAAgB,IAAA;AAAA,IACtB,YAAY,eAAA,CAAgB,UAAA;AAAA,IAC5B;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,0BAAA;AAAA,MACN,OAAA,EAAS,6BAAA;AAAA,MACT,OAAA;AAAA,MACA,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA,KAAA,EAAO,0BAAA;AAAA,IACP,WAAA,EAAa,iBAAA;AAAA,IACb,OAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;AAWO,SAAS,kBAAA,CACd,eAAA,EACA,GAAA,EACA,eAAA,EACA,SACA,SAAA,EACwB;AACxB,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,UAAA,EAAY;AAAA,MACV,SAAS,eAAA,CAAgB,OAAA;AAAA,MACzB,MAAM,eAAA,CAAgB,IAAA;AAAA,MACtB,KAAA,EAAO,eAAA,CAAgB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC1C,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,sBAAsB,IAAA,CAAK,oBAAA;AAAA,QAC3B,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,WAAW,IAAA,CAAK;AAAA,OAClB,CAAE,CAAA;AAAA,MACF,aAAA,EAAe,eAAA,CAAgB,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC1D,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,sBAAsB,IAAA,CAAK,oBAAA;AAAA,QAC3B,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,WAAW,IAAA,CAAK;AAAA,OAClB,CAAE,CAAA;AAAA,MACF,WAAW,eAAA,CAAgB,SAAA;AAAA,MAC3B,WAAW,eAAA,CAAgB,SAAA;AAAA,MAC3B,SAAS,eAAA,CAAgB,OAAA;AAAA,MACzB,UAAU,eAAA,CAAgB,QAAA;AAAA,MAC1B,MAAM,eAAA,CAAgB,IAAA;AAAA,MACtB,YAAY,eAAA,CAAgB,UAAA;AAAA,MAC5B,iCAAiC,eAAA,CAAgB;AAAA,KACnD;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,eAAA;AAAA,IACJ,YAAA,EAAc,QAAA;AAAA,IACd,IAAA,EAAM,CAAC,UAAU,CAAA;AAAA,IACjB;AAAA,GACF;AACF;ACzaA,IAAM,uCAAA,GAA0C,4CAAA;AAEhD,IAAM,mCAAA,GAAsC;AAAA,EAC1C;AAAA,IACE,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAU;AAAA,MACvC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,MAChC,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,SAAA,EAAU;AAAA,MACxC,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA;AAAU,KACxC;AAAA,IACA,IAAA,EAAM,uBAAA;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,aAAa,CAAA;AAAA,IACzC,eAAA,EAAiB,MAAA;AAAA,IACjB,IAAA,EAAM;AAAA;AAEV,CAAA;AAGA,IAAM,uBAAA,GAA0B,KAAA;AAGhC,IAAM,cAAA,GAA2C;AAAA,EAC/C,IAAA,EAAM,CAAC,yCAAA,EAA2C,0BAA0B,CAAA;AAAA,EAC5E,KAAA,EAAO,CAAC,0BAA0B,CAAA;AAAA,EAClC,SAAA,EAAW,CAAC,wBAAwB,CAAA;AAAA,EACpC,IAAA,EAAM,CAAC,qBAAqB,CAAA;AAAA,EAC5B,KAAA,EAAO,CAAC,gCAAgC,CAAA;AAAA,EACxC,GAAA,EAAK,CAAC,8BAA8B,CAAA;AAAA,EACpC,GAAA,EAAK,CAAC,iCAAiC,CAAA;AAAA,EACvC,IAAA,EAAM,CAAC,uBAAuB,CAAA;AAAA,EAC9B,GAAA,EAAK,CAAC,wBAAwB;AAChC,CAAA;AAEO,IAAM,eAAN,MAAmB;AAAA,EAMxB,YAAY,MAAA,EAA2E;AACrF,IAAA,IAAI,CAAC,wBAAA,CAAyB,MAAA,CAAO,OAAO,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,IACtE;AAEA,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,MAAA,IAAU,cAAA,CAAe,OAAO,OAAO,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AAEtE,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,IAAA,CAAK,SAAS,MAAA,CAAO,YAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,MACpE;AAEA,MAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,MAAA,CAAO,OAAO,CAAA;AAElD,MAAA,IAAA,CAAK,SAAS,kBAAA,CAAmB;AAAA,QAC/B,OAAO,WAAA,CAAY;AAAA,UACjB,IAAI,MAAA,CAAO,OAAA;AAAA,UACX,IAAA,EAAM,CAAA,MAAA,EAAS,MAAA,CAAO,OAAO,CAAA,CAAA;AAAA,UAC7B,cAAA,EAAgB;AAAA,YACd,MAAM,MAAA,CAAO,qBAAA,CAAsB,IAAA,CAAK,OAAA,CAAQ,YAAY,EAAE,CAAA;AAAA,YAC9D,MAAA,EAAQ,MAAA,CAAO,cAAA,CAAe,WAAA,EAAY;AAAA,YAC1C,QAAA,EAAU;AAAA,WACZ;AAAA,UACA,OAAA,EAAS;AAAA,YACP,SAAS,EAAE,IAAA,EAAM,CAAC,IAAA,CAAK,MAAM,CAAA;AAAE;AACjC,SACD,CAAA;AAAA,QACD,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,QAC3B,KAAA,EAAO,EAAE,SAAA,EAAW,IAAA;AAAK,OAC1B,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,MAC7B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAA,EAAW,OAAO,MAAA,GAAS,EAAE,SAAS,CAAC,MAAA,CAAO,MAAM,CAAA,EAAE,GAAI;AAAA,KAC3D,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,YAAY,OAAA,EAAiD;AACjE,IAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAc,KAAA,EAAO,WAAA,GAAc,KAAI,GAAI,OAAA;AAC/D,IAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAEnD,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,UAAA,EAAY,aAAA;AAAA,MACZ,KAAA,EAAO,YAAY,WAAA,EAAY;AAAA,MAC/B;AAAA,KACF;AAEA,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,IAAA,IAAQ,OAAA,CAAQ,YAAY,IAAA,EAAM;AAC1D,MAAA,UAAA,GAAa,OAAA,CAAQ,UAAA;AACrB,MAAA,QAAA,GAAW,OAAA,CAAQ,QAAA;AAAA,IACrB,CAAA,MAAO;AAEL,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,UAAU,eAAA,CAAgB,EAAE,QAAQ,CAAA;AAC7D,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,OAAO,EAAC;AAAA,MACV;AACA,MAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,WAAW,CAAA;AAC5C,MAAA,QAAA,GAAW,KAAA;AAAA,IACb;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY;AAAA,MAChD,MAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,2BAAA,CAA4B,QAAA,EAAU,OAAO,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,2BAAA,CACJ,QAAA,EACA,OAAA,EACoB;AACpB,IAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAc,cAAA,GAAiB,OAAM,GAAI,OAAA;AAC7D,IAAA,MAAM,GAAA,GAAM,CAAA,oCAAA,EAAuC,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA;AAG/D,IAAA,IAAI,WAAsB,EAAC;AAC3B,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,OAAA,GAAU,uBAAA,CAAwB,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AAC7D,MAAA,IAAI,CAAC,OAAA,EAAS;AAGd,MAAA,IAAI,gBAAgB,OAAA,CAAQ,KAAA,CAAM,aAAY,KAAM,YAAA,CAAa,aAAY,EAAG;AAC9E,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IACvB;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAEtF,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,IAAA,CAAK,OAAA,EAAS,KAAK,MAAM,CAAA;AAC/D,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,8BAAA,CAA+B,OAAA,CAAQ,WAAW,CAAA;AAChE,MAAA,OAAA,CAAQ,YAAY,gBAAA,CAAiB,OAAA,EAAS,KAAA,CAAM,UAAA,EAAY,MAAM,OAAO,CAAA;AAAA,IAC/E;AAGA,IAAA,MAAM,cAAc,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAA0B,CAAA;AACpE,IAAA,MAAM,cAAc,MAAM,sBAAA,CAAuB,KAAK,MAAA,EAAQ,IAAA,CAAK,SAAS,WAAW,CAAA;AAGvF,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,KAAA,KAAU;AACnC,MAAA,MAAM,UAAA,GAAa,YAAY,KAAK,CAAA;AACpC,MAAA,OAAA,CAAQ,WAAA,GAAc,sBAAA,CAAuB,OAAA,CAAQ,eAAA,EAAkB,UAAU,CAAA;AAAA,IACnF,CAAC,CAAA;AAGD,IAAA,MAAM,eAAuC,EAAC;AAC9C,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,YAAA,CAAa,EAAE,WAAW,CAAA,GAAA,CAAK,aAAa,CAAA,CAAE,WAAW,KAAK,CAAA,IAAK,CAAA;AACnE,MAAA,IAAI,CAAA,CAAE,kBAAkB,GAAA,EAAK,YAAA,EAAA;AAAA,IAC/B;AACA,IAAA,OAAA,CAAQ,IAAI,GAAA,EAAK,CAAA,eAAA,CAAA,EAAmB,YAAA,EAAc,CAAA,SAAA,EAAY,YAAY,CAAA,CAAE,CAAA;AAG5E,IAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,MAClB,CAAC,MACE,CAAA,CAAE,WAAA,KAAA,CAAA,eAA2C,EAAE,cAAA,GAAiB,GAAA,IAChE,kBAAkB,CAAA,CAAE,WAAA,KAAA,CAAA;AAAA,KACzB;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,qBAAA,EAAwB,QAAA,CAAS,MAAM,CAAA,MAAA,EAAS,cAAA,GAAiB,YAAA,GAAe,EAAE,CAAA,CAAA,CAAG,CAAA;AAEtG,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,eAAe,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,WAAA,KAAA,CAAA,YAAuC;AACrF,IAAA,MAAM,eAAA,GAAkB,iBAAiB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,KAAA,CAAA,eAA0C,GAAI,EAAC;AAEjH,IAAA,IAAI,iBAAA;AACJ,IAAA,MAAM,kBAAkB,YAAA,CAAa,MAAA;AAErC,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,MAAM,WAAW,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAClD,MAAA,MAAM,SAAS,MAAM,kBAAA,CAAmB,IAAA,CAAK,MAAA,EAAQ,YAAY,QAAQ,CAAA;AAEzE,MAAA,iBAAA,GAAoB,YAAA,CAAa,MAAA,CAAO,CAAC,OAAA,EAAS,KAAA,KAAU;AAC1D,QAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,QAAA,OAAO,cAAA;AAAA,UACL,OAAA,CAAQ,WAAA;AAAA,UACR,OAAA,CAAQ,cAAA;AAAA,UACR,OAAA,CAAQ,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAuB;AAC1C,MAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,UAAA,CAAW,WAAA,EAAY;AAC3C,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC5B,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,QACpB,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,CAAC,OAAO,CAAC,CAAA;AAAA,QAC3B;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAChD,MAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA;AAAA,QACjC,YAAA,CAAa,GAAA;AAAA,UAAI,CAAC,CAAC,IAAA,EAAM,aAAa,CAAA,KACpC,kBAAA;AAAA,YACE,IAAA,CAAK,MAAA;AAAA,YACL,IAAA;AAAA,YACA,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO;AAAA;AACpC;AACF,OACF;AAEA,MAAA,iBAAA,GAAoB,EAAC;AACrB,MAAA,YAAA,CAAa,QAAQ,CAAC,GAAG,aAAa,GAAG,UAAA,KAAe;AACtD,QAAA,MAAM,MAAA,GAAS,aAAa,UAAU,CAAA;AACtC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,aAAA,CAAc,QAAQ,CAAA,EAAA,EAAK;AAC7C,UAAA,MAAM,OAAA,GAAU,cAAc,CAAC,CAAA;AAC/B,UAAA,IACE,cAAA;AAAA,YACE,OAAA,CAAQ,WAAA;AAAA,YACR,OAAA,CAAQ,cAAA;AAAA,YACR,OAAA,CAAQ,KAAA;AAAA,YACR,OAAO,CAAC;AAAA,WACV,EACA;AACA,YAAA,iBAAA,CAAkB,KAAK,OAAO,CAAA;AAAA,UAChC;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,wBAAA,EAA2B,iBAAA,CAAkB,MAAM,CAAA,CAAA,EAAI,eAAe,CAAA,EAAA,EAAK,eAAA,GAAkB,iBAAA,CAAkB,MAAM,CAAA,SAAA,CAAW,CAAA;AAGjJ,IAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,sBAAA,CAAuB,iBAAiB,CAAC,CAAA;AAGjF,IAAA,MAAM,kBAAkB,IAAI,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,UAAA,CAAW,aAAa,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,EAAE,CAAC,CAAA;AACpG,IAAA,MAAM,aAAA,GAAgB,sBAAA;AAAA,MACpB,gBAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,gBAAgB,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,UAAA,CAAW,aAAa,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,EAAE,CAAC;AAAA,KAClG;AACA,IAAA,MAAM,aAAA,GAAgB,oBAAoB,aAAa,CAAA;AAGvD,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,WAAA,EAAa,GAAG,aAAa,CAAA;AAChD,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,WAAA,EAAc,WAAA,CAAY,MAAM,CAAA,OAAA,EAAU,aAAA,CAAc,MAAM,CAAA,SAAA,CAAW,CAAA;AACjH,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,oBAAoB,OAAA,EAAiE;AACzF,IAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAc,WAAA,GAAc,KAAI,GAAI,OAAA;AACxD,IAAA,MAAM,uBAAA,GAA0B,0BAAA,CAA2B,IAAA,CAAK,OAAO,CAAA;AAGvE,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,eAAA,CAAgB;AAAA,MACjD,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,uBAAA;AAAA,QACZ,KAAA,EAAO,YAAY,WAAA;AAAY;AACjC,KACD,CAAA;AAED,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,WAAW,CAAA;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY;AAAA,MAChD,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,uBAAA;AAAA,QACZ,KAAA,EAAO,YAAY,WAAA;AAAY,OACjC;AAAA,MACA,UAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,mCAAA,CAAoC,QAAA,EAAU,OAAO,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,mCAAA,CACJ,QAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAa,GAAI,OAAA;AACrC,IAAA,MAAM,GAAA,GAAM,CAAA,4CAAA,EAA+C,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA;AACvE,IAAA,MAAM,IAAA,GAAO,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA;AAElD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,IAAI,SAA4B,EAAC;AACjC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,+BAAA,CAAgC,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AACnE,MAAA,IAAI,CAAC,KAAA,EAAO;AAGZ,MAAA,MAAM,KAAA,GAAQ,8BAAA,CAA+B,KAAA,CAAM,WAAW,CAAA;AAC9D,MAAA,MAAM,aAAa,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAC,CAAA,EAAG,OAAO,WAAA,EAAY;AACnE,MAAA,IAAI,UAAA,KAAe,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY,EAAG;AAC7C,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,gBAAgB,KAAA,CAAM,KAAA,CAAM,aAAY,KAAM,YAAA,CAAa,aAAY,EAAG;AAC5E,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,qBAAA,CAAuB,CAAA;AAElF,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,IAAA,CAAK,OAAA,EAAS,KAAK,MAAM,CAAA;AAC/D,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,KAAA,GAAQ,8BAAA,CAA+B,KAAA,CAAM,WAAW,CAAA;AAC9D,MAAA,KAAA,CAAM,YAAY,gBAAA,CAAiB,OAAA,EAAS,KAAA,CAAM,UAAA,EAAY,MAAM,OAAO,CAAA;AAAA,IAC7E;AAGA,IAAA,MAAM,cAAc,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAA0B,CAAA;AAClE,IAAA,MAAM,cAAc,MAAM,sBAAA,CAAuB,KAAK,MAAA,EAAQ,IAAA,CAAK,SAAS,WAAW,CAAA;AAGvF,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,MAAA,MAAM,UAAA,GAAa,YAAY,KAAK,CAAA;AACpC,MAAA,KAAA,CAAM,WAAA,GAAc,sBAAA,CAAuB,KAAA,CAAM,eAAA,EAAkB,UAAU,CAAA;AAAA,IAC/E,CAAC,CAAA;AAGD,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,MACd,CAAC,CAAA,KACC,CAAA,CAAE,WAAA,KAAA,CAAA,eACF,EAAE,cAAA,GAAiB;AAAA,KACvB;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,qBAAA,EAAwB,MAAA,CAAO,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAE3E,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAC5D,IAAA,MAAM,WAAW,MAAM,sBAAA,CAAuB,KAAK,MAAA,EAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAErF,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACrC,MAAA,UAAA,CAAW,IAAI,KAAA,CAAM,WAAA,EAAY,EAAG,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IACrD,CAAC,CAAA;AAGD,IAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA;AAC7B,IAAA,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU;AAChC,MAAA,MAAM,OAAA,GAAU,WAAW,GAAA,CAAI,KAAA,CAAM,MAAM,WAAA,EAAa,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA;AACrE,MAAA,OAAO,sBAAA;AAAA,QACL,KAAA,CAAM,WAAA;AAAA,QACN,KAAA,CAAM,cAAA;AAAA,QACN,KAAA,CAAM,QAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,sBAAA,EAAyB,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,aAAa,CAAA,EAAA,EAAK,aAAA,GAAgB,MAAA,CAAO,MAAM,CAAA,SAAA,CAAW,CAAA;AAGrH,IAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,eAAe,OAAA,EAAuD;AAC1E,IAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAc,WAAA,GAAc,KAAI,GAAI,OAAA;AAC1D,IAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAG7D,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,eAAA,CAAgB;AAAA,MACjD,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,kBAAA;AAAA,QACZ,KAAA,EAAO,aAAa,WAAA;AAAY;AAClC,KACD,CAAA;AAED,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,WAAW,CAAA;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY;AAAA,MAChD,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,kBAAA;AAAA,QACZ,KAAA,EAAO,aAAa,WAAA;AAAY,OAClC;AAAA,MACA,UAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,8BAAA,CAA+B,QAAA,EAAU,OAAO,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,8BAAA,CACJ,QAAA,EACA,OAAA,EACuB;AACvB,IAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAa,GAAI,OAAA;AACvC,IAAA,MAAM,GAAA,GAAM,CAAA,uCAAA,EAA0C,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA;AAClE,IAAA,MAAM,IAAA,GAAO,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA;AAElD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,IAAI,SAAuB,EAAC;AAC5B,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,0BAAA,CAA2B,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AAC9D,MAAA,IAAI,CAAC,KAAA,EAAO;AAGZ,MAAA,MAAM,KAAA,GAAQ,8BAAA,CAA+B,KAAA,CAAM,WAAW,CAAA;AAC9D,MAAA,MAAM,aAAa,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAC,CAAA,EAAG,OAAO,WAAA,EAAY;AACnE,MAAA,IAAI,UAAA,KAAe,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY,EAAG;AAC7C,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,MAAM,YAAA,CAAa,WAAA,EAAY,KAAM,YAAA,CAAa,aAAY,EAAG;AACnE,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,gBAAgB,KAAA,CAAM,KAAA,CAAM,aAAY,KAAM,YAAA,CAAa,aAAY,EAAG;AAC5E,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,qBAAA,CAAuB,CAAA;AAElF,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,IAAA,CAAK,OAAA,EAAS,KAAK,MAAM,CAAA;AAC/D,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,KAAA,GAAQ,8BAAA,CAA+B,KAAA,CAAM,WAAW,CAAA;AAC9D,MAAA,KAAA,CAAM,YAAY,gBAAA,CAAiB,OAAA,EAAS,KAAA,CAAM,UAAA,EAAY,MAAM,OAAO,CAAA;AAAA,IAC7E;AAGA,IAAA,MAAM,cAAc,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACjD,IAAA,MAAM,cAAc,MAAM,sBAAA,CAAuB,KAAK,MAAA,EAAQ,IAAA,CAAK,SAAS,WAAW,CAAA;AAGvF,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC/B,MAAA,MAAM,UAAA,GAAa,YAAY,KAAK,CAAA;AACpC,MAAA,KAAA,CAAM,WAAA,GAAc,sBAAA,CAAuB,KAAA,CAAM,eAAA,EAAkB,UAAU,CAAA;AAAA,IAC/E,CAAC,CAAA;AAGD,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,MACd,CAAC,CAAA,KACC,CAAA,CAAE,WAAA,KAAA,CAAA,eACF,EAAE,cAAA,GAAiB;AAAA,KACvB;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,qBAAA,EAAwB,MAAA,CAAO,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAE3E,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAC5D,IAAA,MAAM,WAAW,MAAM,sBAAA,CAAuB,KAAK,MAAA,EAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAErF,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACrC,MAAA,UAAA,CAAW,IAAI,KAAA,CAAM,WAAA,EAAY,EAAG,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IACrD,CAAC,CAAA;AAGD,IAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA;AAC7B,IAAA,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU;AAChC,MAAA,MAAM,OAAA,GAAU,WAAW,GAAA,CAAI,KAAA,CAAM,MAAM,WAAA,EAAa,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA;AACrE,MAAA,OAAO,iBAAA;AAAA,QACL,KAAA,CAAM,WAAA;AAAA,QACN,KAAA,CAAM,cAAA;AAAA,QACN,KAAA,CAAM,QAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,sBAAA,EAAyB,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,aAAa,CAAA,EAAA,EAAK,aAAA,GAAgB,MAAA,CAAO,MAAM,CAAA,SAAA,CAAW,CAAA;AAGrH,IAAA,OAAO,+BAA+B,MAAM,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,iBAAiB,OAAA,EAA2D;AAChF,IAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAc,KAAA,EAAO,WAAA,GAAc,KAAI,GAAI,OAAA;AACjE,IAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAE7D,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,UAAA,EAAY,kBAAA;AAAA,MACZ,KAAA,EAAO,aAAa,WAAA,EAAY;AAAA,MAChC;AAAA,KACF;AAEA,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,IAAA,IAAQ,OAAA,CAAQ,YAAY,IAAA,EAAM;AAC1D,MAAA,UAAA,GAAa,OAAA,CAAQ,UAAA;AACrB,MAAA,QAAA,GAAW,OAAA,CAAQ,QAAA;AAAA,IACrB,CAAA,MAAO;AAEL,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,UAAU,eAAA,CAAgB,EAAE,QAAQ,CAAA;AAC7D,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,OAAO,EAAC;AAAA,MACV;AACA,MAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,WAAW,CAAA;AAC5C,MAAA,QAAA,GAAW,KAAA;AAAA,IACb;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY;AAAA,MAChD,MAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,gCAAA,CAAiC,QAAA,EAAU,OAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gCAAA,CACJ,QAAA,EACA,OAAA,EACyB;AACzB,IAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAa,GAAI,OAAA;AACvC,IAAA,MAAM,GAAA,GAAM,CAAA,yCAAA,EAA4C,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA;AAGpE,IAAA,IAAI,WAA2B,EAAC;AAChC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,OAAA,GAAU,4BAAA,CAA6B,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AAClE,MAAA,IAAI,CAAC,OAAA,EAAS;AAGd,MAAA,IAAI,QAAQ,YAAA,CAAa,WAAA,EAAY,KAAM,YAAA,CAAa,aAAY,EAAG;AACrE,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,gBAAgB,OAAA,CAAQ,KAAA,CAAM,aAAY,KAAM,YAAA,CAAa,aAAY,EAAG;AAC9E,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IACvB;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAEtF,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,IAAA,CAAK,OAAA,EAAS,KAAK,MAAM,CAAA;AAC/D,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,8BAAA,CAA+B,OAAA,CAAQ,WAAW,CAAA;AAChE,MAAA,OAAA,CAAQ,YAAY,gBAAA,CAAiB,OAAA,EAAS,KAAA,CAAM,UAAA,EAAY,MAAM,OAAO,CAAA;AAAA,IAC/E;AAGA,IAAA,MAAM,cAAc,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACnD,IAAA,MAAM,cAAc,MAAM,sBAAA,CAAuB,KAAK,MAAA,EAAQ,IAAA,CAAK,SAAS,WAAW,CAAA;AAGvF,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,KAAA,KAAU;AACnC,MAAA,MAAM,UAAA,GAAa,YAAY,KAAK,CAAA;AACpC,MAAA,OAAA,CAAQ,WAAA,GAAc,sBAAA,CAAuB,OAAA,CAAQ,eAAA,EAAkB,UAAU,CAAA;AAAA,IACnF,CAAC,CAAA;AAGD,IAAA,MAAM,eAAuC,EAAC;AAC9C,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,YAAA,CAAa,EAAE,WAAW,CAAA,GAAA,CAAK,aAAa,CAAA,CAAE,WAAW,KAAK,CAAA,IAAK,CAAA;AACnE,MAAA,IAAI,CAAA,CAAE,kBAAkB,GAAA,EAAK,YAAA,EAAA;AAAA,IAC/B;AACA,IAAA,OAAA,CAAQ,IAAI,GAAA,EAAK,CAAA,eAAA,CAAA,EAAmB,YAAA,EAAc,CAAA,SAAA,EAAY,YAAY,CAAA,CAAE,CAAA;AAG5E,IAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,MAClB,CAAC,CAAA,KACC,CAAA,CAAE,WAAA,KAAA,CAAA,eACF,EAAE,cAAA,GAAiB;AAAA,KACvB;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,qBAAA,EAAwB,QAAA,CAAS,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAE7E,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAC9D,IAAA,MAAM,WAAW,MAAM,sBAAA,CAAuB,IAAA,CAAK,MAAA,EAAQ,cAAc,YAAY,CAAA;AAErF,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACrC,MAAA,UAAA,CAAW,IAAI,KAAA,CAAM,WAAA,EAAY,EAAG,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IACrD,CAAC,CAAA;AAGD,IAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA;AAC/B,IAAA,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAC,OAAA,KAAY;AACtC,MAAA,MAAM,OAAA,GAAU,WAAW,GAAA,CAAI,OAAA,CAAQ,MAAM,WAAA,EAAa,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA;AACvE,MAAA,OAAO,mBAAA;AAAA,QACL,OAAA,CAAQ,WAAA;AAAA,QACR,OAAA,CAAQ,cAAA;AAAA,QACR,OAAA,CAAQ,WAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,aAAa,CAAA,EAAA,EAAK,aAAA,GAAgB,QAAA,CAAS,MAAM,CAAA,SAAA,CAAW,CAAA;AAGzH,IAAA,OAAO,iCAAiC,QAAQ,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,SAAS,OAAA,EAA2C;AACxD,IAAA,MAAM,EAAE,UAAA,EAAY,WAAA,GAAc,GAAA,EAAI,GAAI,OAAA;AAE1C,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,UAAA,EAAY,wBAAA;AAAA,MACZ,KAAA,EAAO,WAAW,WAAA;AAAY,KAChC;AAGA,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,UAAU,eAAA,CAAgB,EAAE,QAAQ,CAAA;AAC7D,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,WAAW,CAAA;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY;AAAA,MAChD,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,wBAAA,CAAyB,QAAA,EAAU,OAAO,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,wBAAA,CACJ,QAAA,EACA,OAAA,EACiB;AACjB,IAAA,MAAM,GAAA,GAAM,CAAA,iCAAA,EAAoC,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA;AAE5D,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,cAAc,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC9C,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,SAAA,EAAY,WAAA,CAAY,MAAM,CAAA,6BAAA,CAA+B,CAAA;AAG9E,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC1C,GAAA,EAAK,IAAA;AAAA,MACL,QAAA,EAAU;AAAA,KACZ,CAAE,CAAA;AAGF,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI;AACF,MAAA,aAAA,GAAgB,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa;AAAA,QAC7C,KAAK,gBAAA,CAAiB,GAAA;AAAA,QACtB,SAAS,gBAAA,CAAiB,OAAA;AAAA,QAC1B,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,CAAC,QAAQ;AAAA,OAChB,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAK,4BAAA,EAA8B,GAAG,CAAA;AACpD,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,QAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,UAAU,IAAA,EAAM;AAC5C,MAAA,MAAM,IAAA,GAAO,uBAAA,CAAwB,MAAA,CAAO,KAAA,EAAO,KAAK,OAAO,CAAA;AAC/D,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,aAAA,CAAc,MAAM,CAAA,MAAA,CAAQ,CAAA;AAEvE,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAAkC;AAChC,IAAA,OAAO,gBAAA,CAAiB,KAAK,OAAO,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,0BAAA,GAA4C;AAC1C,IAAA,OAAO,0BAAA,CAA2B,KAAK,OAAO,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAA,GAAmD;AACjD,IAAA,OAAO,qBAAA,CAAsB,KAAK,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAAuC;AACrC,IAAA,OAAO,qBAAA,CAAsB,KAAK,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAmC;AACjC,IAAA,OAAO,iBAAA,CAAkB,KAAK,OAAO,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAqB,OAAA,EAA0C;AAC7D,IAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AAEA,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,eAAe,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,6BAA6B,KAAA,EAAgD;AAC3E,IAAA,IAAI,CAAC,MAAM,eAAA,EAAiB;AAC1B,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,KAAA,CAAM,eAAe,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,0BAA0B,OAAA,EAA+C;AACvE,IAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AAEA,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,eAAe,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,eAAA,EAAiE;AAClF,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA;AAGrD,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,SAAS,eAAA,CAAgB,OAAA;AAAA,MACzB,MAAM,eAAA,CAAgB,IAAA;AAAA,MACtB,KAAA,EAAO,eAAA,CAAgB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC1C,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,sBAAsB,IAAA,CAAK,oBAAA;AAAA,QAC3B,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,WAAW,IAAA,CAAK;AAAA,OAClB,CAAE,CAAA;AAAA,MACF,aAAA,EAAe,eAAA,CAAgB,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC1D,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,sBAAsB,IAAA,CAAK,oBAAA;AAAA,QAC3B,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,WAAW,IAAA,CAAK;AAAA,OAClB,CAAE,CAAA;AAAA,MACF,WAAW,eAAA,CAAgB,SAAA;AAAA,MAC3B,WAAW,eAAA,CAAgB,SAAA;AAAA,MAC3B,SAAS,eAAA,CAAgB,OAAA;AAAA,MACzB,UAAU,eAAA,CAAgB,QAAA;AAAA,MAC1B,MAAM,eAAA,CAAgB,IAAA;AAAA,MACtB,YAAY,eAAA,CAAgB,UAAA;AAAA,MAC5B,SAAS,eAAA,CAAgB;AAAA,KAC3B;AAEA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,cAAA;AAAA,MACJ,YAAA,EAAc,QAAA;AAAA,MACd,IAAA,EAAM,CAAC,CAAC,cAAc,CAAC,CAAA;AAAA,MACvB,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,qBAAA,CACJ,OAAA,EACA,gBAAA,EAC8B;AAC9B,IAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,OAAA,CAAQ,WAAW,CAAA;AAC9D,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,UAAA,EAAY,gBAAA,EAAkB,cAAc,CAAA;AAGtF,IAAA,OAAO,EAAE,SAAA,EAAW,EAAC,EAAG,WAAA,EAAY;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,6BAAA,CACJ,KAAA,EACA,OAAA,EACA,gBAAA,EAC8B;AAC9B,IAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,KAAA,CAAM,WAAW,CAAA;AAC5D,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA;AAGrD,IAAA,MAAM,YAAsC,EAAC;AAC7C,IAAA,MAAM,cAAc,MAAM,mBAAA;AAAA,MACxB,IAAA,CAAK,MAAA;AAAA,MACL,KAAA,CAAM,UAAA;AAAA,MACN,gBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,SAAA,CAAU,KAAK,WAAW,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,WAAA,GAAc,6BAAA;AAAA,MAClB,UAAA;AAAA,MACA,OAAO,OAAO,CAAA;AAAA,MACd,gBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,EAAE,WAAW,WAAA,EAAY;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,wBAAA,CACJ,KAAA,EACA,gBAAA,EAC8B;AAC9B,IAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,KAAA,CAAM,WAAW,CAAA;AAC5D,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA;AAGrD,IAAA,MAAM,YAAsC,EAAC;AAC7C,IAAA,MAAM,gBAAgB,MAAM,kBAAA;AAAA,MAC1B,IAAA,CAAK,MAAA;AAAA,MACL,KAAA,CAAM,YAAA;AAAA,MACN,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,KAAA,CAAM;AAAA,KACR;AACA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,SAAA,CAAU,KAAK,aAAa,CAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,WAAA,GAAc,wBAAA,CAAyB,UAAA,EAAY,cAAc,CAAA;AAEvE,IAAA,OAAO,EAAE,WAAW,WAAA,EAAY;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,0BAAA,CACJ,OAAA,EACA,gBAAA,EAC8B;AAC9B,IAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,OAAA,CAAQ,WAAW,CAAA;AAC9D,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,MAAM,WAAA,GAAc,0BAAA,CAA2B,UAAA,EAAY,gBAAA,EAAkB,cAAc,CAAA;AAE3F,IAAA,OAAO,EAAE,SAAA,EAAW,EAAC,EAAG,WAAA,EAAY;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,kBAAkB,OAAA,EAAyC;AACvE,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,MAAMD,YAAAA,CAAa,IAAA,CAAK,MAAA,EAAQ;AAAA,MAC9C,OAAA,EAAS,cAAA;AAAA,MACT,GAAA,EAAK,uBAAA;AAAA,MACL,YAAA,EAAc,YAAA;AAAA,MACd,IAAA,EAAM,CAAC,OAAO;AAAA,KACf,CAAA;AACD,IAAA,OAAO,OAAO,OAAiB,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,qBACJ,MAAA,EACwB;AACxB,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAAkB,OAAO,OAAO,CAAA;AAE3D,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,4BAA4B,MAAA,EAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AACrF,IAAA,MAAM,SAAS,oBAAA,CAAqB,eAAA,EAAiB,OAAA,EAAS,IAAA,CAAK,SAAS,cAAc,CAAA;AAG1F,IAAA,MAAM,YAAsC,EAAC;AAC7C,IAAA,MAAM,cAAc,MAAM,mBAAA;AAAA,MACxB,IAAA,CAAK,MAAA;AAAA,MACL,MAAA,CAAO,UAAA;AAAA,MACP,MAAA,CAAO,OAAA;AAAA,MACP;AAAA,KACF;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,SAAA,CAAU,KAAK,WAAW,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,6BACJ,MAAA,EACwB;AACxB,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,MAAM,IAAA,GAAO,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA;AAClD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gDAAA,EAAmD,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAAA,IACnF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAAkB,OAAO,OAAO,CAAA;AAE3D,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,oCAAoC,MAAA,EAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAC7F,IAAA,MAAM,SAAS,oBAAA,CAAqB,eAAA,EAAiB,OAAA,EAAS,IAAA,CAAK,SAAS,cAAc,CAAA;AAG1F,IAAA,MAAM,YAAsC,EAAC;AAC7C,IAAA,MAAM,eAAe,MAAM,kBAAA;AAAA,MACzB,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,OAAA;AAAA,MACL,MAAA,CAAO,OAAA;AAAA,MACP,cAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AACA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,SAAA,CAAU,KAAK,YAAY,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,wBACJ,MAAA,EACwB;AACxB,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,MAAM,IAAA,GAAO,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA;AAClD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gDAAA,EAAmD,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAAA,IACnF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAAkB,OAAO,OAAO,CAAA;AAE3D,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,+BAA+B,MAAA,EAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AACxF,IAAA,MAAM,SAAS,oBAAA,CAAqB,eAAA,EAAiB,OAAA,EAAS,IAAA,CAAK,SAAS,cAAc,CAAA;AAG1F,IAAA,MAAM,YAAsC,EAAC;AAC7C,IAAA,MAAM,eAAe,MAAM,kBAAA;AAAA,MACzB,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,OAAA;AAAA,MACL,MAAA,CAAO,OAAA;AAAA,MACP,cAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AACA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,SAAA,CAAU,KAAK,YAAY,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,0BACJ,MAAA,EACwB;AACxB,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAAkB,OAAO,OAAO,CAAA;AAE3D,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,iCAAiC,MAAA,EAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAC1F,IAAA,MAAM,SAAS,oBAAA,CAAqB,eAAA,EAAiB,OAAA,EAAS,IAAA,CAAK,SAAS,cAAc,CAAA;AAG1F,IAAA,MAAM,YAAsC,EAAC;AAC7C,IAAA,MAAM,gBAAgB,MAAM,kBAAA;AAAA,MAC1B,IAAA,CAAK,MAAA;AAAA,MACL,MAAA,CAAO,YAAA;AAAA,MACP,MAAA,CAAO,OAAA;AAAA,MACP,cAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AACA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,SAAA,CAAU,KAAK,aAAa,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,oBAAA,CACE,eAAA,EACA,OAAA,EACA,SAAA,EACwB;AACxB,IAAA,OAAO,kBAAA;AAAA,MACL,gBAAA,CAAiB,KAAK,OAAO,CAAA;AAAA,MAC7B,aAAA;AAAA,MACA,eAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,4BAAA,CACE,eAAA,EACA,OAAA,EACA,SAAA,EACwB;AACxB,IAAA,OAAO,kBAAA;AAAA,MACL,0BAAA,CAA2B,KAAK,OAAO,CAAA;AAAA,MACvC,4BAAA;AAAA,MACA,eAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uBAAA,CACE,eAAA,EACA,OAAA,EACA,SAAA,EACwB;AACxB,IAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAC7D,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAAA,IACvE;AAEA,IAAA,OAAO,kBAAA;AAAA,MACL,kBAAA;AAAA,MACA,uBAAA;AAAA,MACA,eAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,yBAAA,CACE,eAAA,EACA,OAAA,EACA,SAAA,EACwB;AACxB,IAAA,OAAO,kBAAA;AAAA,MACL,qBAAA,CAAsB,KAAK,OAAO,CAAA;AAAA,MAClC,aAAA;AAAA,MACA,eAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAe,MAAA,EAKC;AACpB,IAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAa,GAAI,MAAA;AACrC,IAAA,MAAM,YAAA,GAAe,OAAO,YAAA,IAAgB,EAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,MAAA;AAExC,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,IAAI,OAAA,GAAU,YAAA;AAEd,IAAA,OAAO,UAAU,UAAA,EAAY;AAC3B,MAAA,MAAM,QAAA,GAAW,OAAA,GAAU,uBAAA,GAA0B,UAAA,GACjD,UAAU,uBAAA,GACV,UAAA;AAEJ,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAMA,YAAAA,CAAa,IAAA,CAAK,MAAA,EAAQ;AAAA,UAC7C,OAAA,EAAS,uCAAA;AAAA,UACT,GAAA,EAAK,mCAAA;AAAA,UACL,YAAA,EAAc,uBAAA;AAAA,UACd,IAAA,EAAM,CAAC,UAAA,EAAY,YAAA,EAAc,SAAS,QAAQ;AAAA,SACnD,CAAA;AAED,QAAA,KAAA,MAAW,WAAW,MAAA,EAAQ;AAC5B,UAAA,WAAA,CAAY,KAAK,OAAO,CAAA;AAAA,QAC1B;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,OAAA,GAAU,QAAA;AAAA,IACZ;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AACF,CAAA;;;ACl0CO,SAAS,iBAAA,CAAkB;AAAA,EAChC,OAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA,GAAc,GAAA;AAAA,EACd,UAAA,EAAY,kBAAA;AAAA,EACZ,QAAA,EAAU,gBAAA;AAAA,EACV,cAAA,GAAiB,KAAA;AAAA,EACjB,OAAA,GAAU,IAAA;AAAA,EACV;AACF,CAAA,EAAsD;AACpD,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAC/C,EAAA,MAAM,iBAAkB,YAAA,IAAgB,WAAA;AAExC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,QAAA,EAA4B;AAC1E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,CAAC,CAAA;AAEtD,EAAA,MAAM,gBAAA,GAAmB,kBAAA,IAAsB,IAAA,IAAQ,gBAAA,IAAoB,IAAA;AAG3E,EAAA,MAAM,WAAA,GAAc,OAAA;AAAA,IAClB,MAAM,yBAAyB,OAAO,CAAA;AAAA,IACtC,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,MAAO,WAAA,GAAc,gBAAA,CAAiB,OAAO,CAAA,GAAI,MAAA;AAAA,IACjD,CAAC,SAAS,WAAW;AAAA,GACvB;AAGA,EAAA,MAAM,MAAA,GAAS,OAAA;AAAA,IACb,OAAO;AAAA,MACL,UAAA,EAAY,aAAA;AAAA,MACZ,KAAA,EAAO,YAAY,WAAA,EAAY;AAAA,MAC/B;AAAA,KACF,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,UAAA,EAAY,KAAK;AAAA,GACnC;AAGA,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,cAAA,KAAmB,kBAAA,CAAmB;AAAA,IAC1E,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,WAAA,IAAe,CAAC;AAAA,GACrC,CAAA;AAGD,EAAA,MAAM,aAAa,gBAAA,GACf,kBAAA,GACA,KAAK,GAAA,CAAI,CAAA,EAAG,aAAa,WAAW,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,mBAAmB,gBAAA,GAAoB,UAAA;AAGxD,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,KAAA,EAAO,aAAA;AAAA,IACP,OAAA,EAAS;AAAA,MACP,cAAA,CAAe;AAAA,IACjB,OAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,WAAA,KAAgB,gBAAA,IAAoB,UAAA,GAAa,CAAA;AAAA,GACtE,CAAA;AAED,EAAA,MAAM,GAAA,GAAM,4BAA4B,OAAO,CAAA,KAAA,EAAQ,YAAY,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,IAAK,KAAK,CAAA,CAAA,CAAA;AAGxF,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,MACf,OAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA,EAAgB,UAAU,MAAA,IAAU,CAAA;AAAA,MACpC,iBAAA;AAAA,MACA,eAAe,aAAA,EAAe;AAAA,KAC/B,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,gBAAA,EAAkB,UAAA,EAAY,cAAA,EAAgB,UAAA,EAAY,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,iBAAA,EAAmB,aAAa,CAAC,CAAA;AAGjJ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAC5B,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACtC,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,eAAe,eAAA,GAAkB;AAC/B,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,kBAAA,CAAmB,MAAS,CAAA;AAC5B,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,WAAA,EAAc,QAAA,CAAS,MAAM,CAAA,YAAA,CAAc,CAAA;AAE5D,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,IAAI,YAAA,CAAa,EAAE,OAAA,EAAS,YAAA,EAAc,gBAAgB,CAAA;AACzE,QAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,2BAAA;AAAA,UACjC,QAAA;AAAA,UACA,EAAE,UAAA,EAAY,YAAA,EAAc,cAAA;AAAe,SAC7C;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,iBAAA,EAAe,aAAA,CAAc,MAAM,CAAA,eAAA,CAAiB,CAAA;AACrE,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,WAAA,CAAY,aAAa,CAAA;AAAA,QAC3B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAK,mBAAA,EAAqB,GAAG,CAAA;AAC3C,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,kBAAA,CAAmB,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AACtE,UAAA,WAAA,CAAY,EAAE,CAAA;AAAA,QAChB;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,eAAA,EAAgB;AAEhB,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,YAAA,EAAc,gBAAgB,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,cAAc,CAAC,CAAA;AAEtG,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,eAAA,EAAgB;AAChB,IAAA,iBAAA,CAAkB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,SAAA,EAAA,CAAY,gBAAA,GAAmB,KAAA,GAAQ,cAAA,KAAmB,iBAAA,IAAqB,YAAA;AAAA,IAC/E,OAAO,aAAA,IAAiB,eAAA;AAAA,IACxB;AAAA,GACF;AACF;ACtKO,SAAS,yBAAA,CAA0B;AAAA,EACxC,OAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,GAAA;AAAA,EACd,OAAA,GAAU;AACZ,CAAA,EAAsE;AACpE,EAAA,MAAM,WAAA,GAAcE,eAAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAE/C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,QAAAA,CAA4B,EAAE,CAAA;AAC1D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,EAA4B;AAC1E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,CAAC,CAAA;AAGtD,EAAA,MAAM,WAAA,GAAcC,OAAAA;AAAA,IAClB,MAAM,yBAAyB,OAAO,CAAA;AAAA,IACtC,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,uBAAA,GAA0BA,OAAAA;AAAA,IAC9B,MAAO,WAAA,GAAc,0BAAA,CAA2B,OAAO,CAAA,GAAI,MAAA;AAAA,IAC3D,CAAC,SAAS,WAAW;AAAA,GACvB;AAGA,EAAA,MAAM,MAAA,GAASA,OAAAA;AAAA,IACb,OAAO;AAAA,MACL,UAAA,EAAY,uBAAA;AAAA,MACZ,KAAA,EAAO,YAAY,WAAA;AAAY,KACjC,CAAA;AAAA,IACA,CAAC,yBAAyB,UAAU;AAAA,GACtC;AAGA,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,cAAA,KAAmBC,kBAAAA,CAAmB;AAAA,IAC1E,OAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAS,OAAA,IAAW;AAAA,GACrB,CAAA;AAGD,EAAA,MAAM,UAAA,GAAaD,OAAAA;AAAA,IACjB,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAa,WAAW,CAAA;AAAA,IAC1C,CAAC,YAAY,WAAW;AAAA,GAC1B;AAGA,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,KAAA,EAAO,aAAA;AAAA,IACP,OAAA,EAAS;AAAA,MACPE,cAAAA,CAAe;AAAA,IACjB,OAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA,EAAU,UAAA;AAAA,IACV,OAAA,EAAS,OAAA,IAAW,WAAA,IAAe,UAAA,GAAa;AAAA,GACjD,CAAA;AAED,EAAA,MAAM,GAAA,GAAM,CAAA,iCAAA,EAAoC,OAAO,CAAA,EAAG,UAAA,GAAa,CAAA,KAAA,EAAQ,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAA;AAG7G,EAAAC,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,MACf,OAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA,EAAU,UAAA;AAAA,MACV,cAAA,EAAgB,UAAU,MAAA,IAAU,CAAA;AAAA,MACpC,iBAAA;AAAA,MACA,eAAe,aAAA,EAAe;AAAA,KAC/B,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,UAAA,EAAY,cAAA,EAAgB,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,iBAAA,EAAmB,aAAa,CAAC,CAAA;AAGrH,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAC5B,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACtC,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,eAAe,aAAA,GAAgB;AAC7B,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,kBAAA,CAAmB,MAAS,CAAA;AAC5B,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,WAAA,EAAc,QAAA,CAAS,MAAM,CAAA,YAAA,CAAc,CAAA;AAE5D,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,IAAI,YAAA,CAAa,EAAE,OAAA,EAAS,YAAA,EAAc,aAA6B,CAAA;AACtF,QAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,mCAAA;AAAA,UAC/B,QAAA;AAAA,UACA,EAAE,YAAY,YAAA;AAAa,SAC7B;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,iBAAA,EAAe,WAAA,CAAY,MAAM,CAAA,aAAA,CAAe,CAAA;AAEjE,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,SAAA,CAAU,WAAW,CAAA;AAAA,QACvB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAK,mBAAA,EAAqB,GAAG,CAAA;AAC3C,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,kBAAA,CAAmB,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AACtE,UAAA,SAAA,CAAU,EAAE,CAAA;AAAA,QACd;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,aAAA,EAAc;AAEd,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,cAAc,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,cAAc,CAAC,CAAA;AAEtF,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,eAAA,EAAgB;AAChB,IAAA,iBAAA,CAAkB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA,EAAW,kBAAkB,iBAAA,IAAqB,YAAA;AAAA,IAClD,OAAO,aAAA,IAAiB,eAAA;AAAA,IACxB;AAAA,GACF;AACF;ACrIO,SAAS,oBAAA,CAAqB;AAAA,EACnC,OAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,GAAA;AAAA,EACd,OAAA,GAAU;AACZ,CAAA,EAA4D;AAC1D,EAAA,MAAM,WAAA,GAAcL,eAAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAE/C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,QAAAA,CAAuB,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,EAA4B;AAC1E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,CAAC,CAAA;AAGtD,EAAA,MAAM,WAAA,GAAcC,OAAAA;AAAA,IAClB,MAAM,yBAAyB,OAAO,CAAA;AAAA,IACtC,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,kBAAA,GAAqBA,OAAAA;AAAA,IACzB,MAAO,WAAA,GAAc,qBAAA,CAAsB,OAAO,CAAA,GAAI,MAAA;AAAA,IACtD,CAAC,SAAS,WAAW;AAAA,GACvB;AAGA,EAAA,MAAM,cAAA,GAAiB,QAAQ,kBAAkB,CAAA;AAGjD,EAAA,MAAM,MAAA,GAASA,OAAAA;AAAA,IACb,OAAO;AAAA,MACL,UAAA,EAAY,kBAAA;AAAA,MACZ,KAAA,EAAO,aAAa,WAAA;AAAY,KAClC,CAAA;AAAA,IACA,CAAC,oBAAoB,YAAY;AAAA,GACnC;AAGA,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,cAAA,KAAmBC,kBAAAA,CAAmB;AAAA,IAC1E,OAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAS,OAAA,IAAW;AAAA,GACrB,CAAA;AAGD,EAAA,MAAM,UAAA,GAAaD,OAAAA;AAAA,IACjB,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAa,WAAW,CAAA;AAAA,IAC1C,CAAC,YAAY,WAAW;AAAA,GAC1B;AAGA,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,KAAA,EAAO,aAAA;AAAA,IACP,OAAA,EAAS;AAAA,MACPE,cAAAA,CAAe;AAAA,IACjB,OAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA,EAAU,UAAA;AAAA,IACV,OAAA,EAAS,OAAA,IAAW,cAAA,IAAkB,UAAA,GAAa;AAAA,GACpD,CAAA;AAED,EAAA,MAAM,GAAA,GAAM,+BAA+B,OAAO,CAAA,OAAA,EAAU,aAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,CAAA;AAGrF,EAAAC,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,MACf,OAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA,EAAU,UAAA;AAAA,MACV,cAAA,EAAgB,UAAU,MAAA,IAAU,CAAA;AAAA,MACpC,iBAAA;AAAA,MACA,eAAe,aAAA,EAAe;AAAA,KAC/B,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,cAAA,EAAgB,UAAA,EAAY,cAAA,EAAgB,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,iBAAA,EAAmB,aAAa,CAAC,CAAA;AAGxH,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,OAAA,EAAS;AAC/B,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACtC,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,eAAe,aAAA,GAAgB;AAC7B,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,kBAAA,CAAmB,MAAS,CAAA;AAC5B,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,WAAA,EAAc,QAAA,CAAS,MAAM,CAAA,YAAA,CAAc,CAAA;AAE5D,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,IAAI,YAAA,CAAa,EAAE,OAAA,EAAS,YAAA,EAAc,aAA6B,CAAA;AACtF,QAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,8BAAA;AAAA,UAC/B,QAAA;AAAA,UACA,EAAE,cAAc,YAAA;AAAa,SAC/B;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,iBAAA,EAAe,WAAA,CAAY,MAAM,CAAA,aAAA,CAAe,CAAA;AAEjE,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,SAAA,CAAU,WAAW,CAAA;AAAA,QACvB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAK,mBAAA,EAAqB,GAAG,CAAA;AAC3C,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,kBAAA,CAAmB,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AACtE,UAAA,SAAA,CAAU,EAAE,CAAA;AAAA,QACd;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,aAAA,EAAc;AAEd,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,YAAA,EAAc,cAAc,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,cAAc,CAAC,CAAA;AAE3F,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,eAAA,EAAgB;AAChB,IAAA,iBAAA,CAAkB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA,EAAW,kBAAkB,iBAAA,IAAqB,YAAA;AAAA,IAClD,OAAO,aAAA,IAAiB,eAAA;AAAA,IACxB;AAAA,GACF;AACF;ACvIO,SAAS,sBAAA,CAAuB;AAAA,EACrC,OAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA,GAAc,GAAA;AAAA,EACd,UAAA,EAAY,kBAAA;AAAA,EACZ,QAAA,EAAU,gBAAA;AAAA,EACV,OAAA,GAAU,IAAA;AAAA,EACV;AACF,CAAA,EAAgE;AAC9D,EAAA,MAAM,WAAA,GAAcL,eAAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAC/C,EAAA,MAAM,iBAAkB,YAAA,IAAgB,WAAA;AAExC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,QAAAA,CAAyB,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,EAA4B;AAC1E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,CAAC,CAAA;AAEtD,EAAA,MAAM,gBAAA,GAAmB,kBAAA,IAAsB,IAAA,IAAQ,gBAAA,IAAoB,IAAA;AAG3E,EAAA,MAAM,WAAA,GAAcC,OAAAA;AAAA,IAClB,MAAM,yBAAyB,OAAO,CAAA;AAAA,IACtC,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,kBAAA,GAAqBA,OAAAA;AAAA,IACzB,MAAO,WAAA,GAAc,qBAAA,CAAsB,OAAO,CAAA,GAAI,MAAA;AAAA,IACtD,CAAC,SAAS,WAAW;AAAA,GACvB;AAGA,EAAA,MAAM,MAAA,GAASA,OAAAA;AAAA,IACb,OAAO;AAAA,MACL,UAAA,EAAY,kBAAA;AAAA,MACZ,KAAA,EAAO,aAAa,WAAA,EAAY;AAAA,MAChC;AAAA,KACF,CAAA;AAAA,IACA,CAAC,kBAAA,EAAoB,YAAA,EAAc,KAAK;AAAA,GAC1C;AAGA,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,cAAA,KAAmBC,kBAAAA,CAAmB;AAAA,IAC1E,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,WAAA,IAAe,CAAC;AAAA,GACrC,CAAA;AAGD,EAAA,MAAM,aAAa,gBAAA,GACf,kBAAA,GACA,KAAK,GAAA,CAAI,CAAA,EAAG,aAAa,WAAW,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,mBAAmB,gBAAA,GAAoB,UAAA;AAGxD,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,KAAA,EAAO,aAAA;AAAA,IACP,OAAA,EAAS;AAAA,MACPC,cAAAA,CAAe;AAAA,IACjB,OAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,WAAA,KAAgB,gBAAA,IAAoB,UAAA,GAAa,CAAA;AAAA,GACtE,CAAA;AAED,EAAA,MAAM,GAAA,GAAM,iCAAiC,OAAO,CAAA,OAAA,EAAU,aAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,CAAA;AAGvF,EAAAC,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,MACf,OAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA,EAAgB,UAAU,MAAA,IAAU,CAAA;AAAA,MACpC,iBAAA;AAAA,MACA,eAAe,aAAA,EAAe;AAAA,KAC/B,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,gBAAA,EAAkB,UAAA,EAAY,cAAA,EAAgB,UAAA,EAAY,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,iBAAA,EAAmB,aAAa,CAAC,CAAA;AAGjJ,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAC5B,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACtC,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,eAAe,eAAA,GAAkB;AAC/B,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,kBAAA,CAAmB,MAAS,CAAA;AAC5B,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,WAAA,EAAc,QAAA,CAAS,MAAM,CAAA,YAAA,CAAc,CAAA;AAE5D,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,IAAI,YAAA,CAAa,EAAE,OAAA,EAAS,YAAA,EAAc,gBAAgB,CAAA;AACzE,QAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,gCAAA;AAAA,UACjC,QAAA;AAAA,UACA,EAAE,cAAc,YAAA;AAAa,SAC/B;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,iBAAA,EAAe,aAAA,CAAc,MAAM,CAAA,eAAA,CAAiB,CAAA;AAErE,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,WAAA,CAAY,aAAa,CAAA;AAAA,QAC3B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAK,mBAAA,EAAqB,GAAG,CAAA;AAC3C,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,kBAAA,CAAmB,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AACtE,UAAA,WAAA,CAAY,EAAE,CAAA;AAAA,QAChB;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,eAAA,EAAgB;AAEhB,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,YAAA,EAAc,cAAc,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,cAAc,CAAC,CAAA;AAExF,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,eAAA,EAAgB;AAChB,IAAA,iBAAA,CAAkB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,SAAA,EAAA,CAAY,gBAAA,GAAmB,KAAA,GAAQ,cAAA,KAAmB,iBAAA,IAAqB,YAAA;AAAA,IAC/E,OAAO,aAAA,IAAiB,eAAA;AAAA,IACxB;AAAA,GACF;AACF;ACjKO,SAAS,cAAA,CAAe;AAAA,EAC7B,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA,GAAc,GAAA;AAAA,EACd,OAAA,GAAU;AACZ,CAAA,EAAgD;AAC9C,EAAA,MAAM,WAAA,GAAcL,eAAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAE/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,QAAAA,CAAiB,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,EAA4B;AAC1E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,CAAC,CAAA;AAGtD,EAAA,MAAM,WAAA,GAAcC,OAAAA;AAAA,IAClB,MAAM,yBAAyB,OAAO,CAAA;AAAA,IACtC,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,MAAA,GAASA,OAAAA;AAAA,IACb,OAAO;AAAA,MACL,UAAA,EAAY,wBAAA;AAAA,MACZ,KAAA,EAAO,WAAW,WAAA;AAAY,KAChC,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAGA,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,cAAA,KAAmBC,kBAAAA,CAAmB;AAAA,IAC1E,OAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAS,OAAA,IAAW;AAAA,GACrB,CAAA;AAGD,EAAA,MAAM,UAAA,GAAaD,OAAAA;AAAA,IACjB,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAa,WAAW,CAAA;AAAA,IAC1C,CAAC,YAAY,WAAW;AAAA,GAC1B;AAGA,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,KAAA,EAAO,aAAA;AAAA,IACP,OAAA,EAAS;AAAA,MACPE,cAAAA,CAAe;AAAA,IACjB,OAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA,EAAU,UAAA;AAAA,IACV,OAAA,EAAS,OAAA,IAAW,WAAA,IAAe,UAAA,GAAa;AAAA,GACjD,CAAA;AAED,EAAA,MAAM,GAAA,GAAM,yBAAyB,OAAO,CAAA,KAAA,EAAQ,WAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,CAAA;AAG3E,EAAAC,UAAU,MAAM;AACd,IAAA,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,MACf,OAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA,EAAU,UAAA;AAAA,MACV,cAAA,EAAgB,UAAU,MAAA,IAAU,CAAA;AAAA,MACpC,iBAAA;AAAA,MACA,eAAe,aAAA,EAAe;AAAA,KAC/B,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,UAAA,EAAY,cAAA,EAAgB,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,iBAAA,EAAmB,aAAa,CAAC,CAAA;AAGrH,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAC5B,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACtC,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,eAAe,YAAA,GAAe;AAC5B,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,kBAAA,CAAmB,MAAS,CAAA;AAC5B,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,WAAA,EAAc,QAAA,CAAS,MAAM,CAAA,YAAA,CAAc,CAAA;AAE5D,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,IAAI,YAAA,CAAa,EAAE,OAAA,EAAS,YAAA,EAAc,aAA6B,CAAA;AACtF,QAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,wBAAA;AAAA,UAC/B,QAAA;AAAA,UACA,EAAE,UAAA;AAAW,SACf;AACA,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAA,iBAAA,EAAe,WAAA,CAAY,MAAM,CAAA,MAAA,CAAQ,CAAA;AAE1D,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,WAAW,CAAA;AAAA,QACtB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAK,mBAAA,EAAqB,GAAG,CAAA;AAC3C,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,kBAAA,CAAmB,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AACtE,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QACb;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,YAAA,EAAa;AAEb,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,UAAU,WAAA,EAAa,OAAA,EAAS,cAAc,CAAC,CAAA;AAExE,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,eAAA,EAAgB;AAChB,IAAA,iBAAA,CAAkB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,SAAA,EAAW,kBAAkB,iBAAA,IAAqB,YAAA;AAAA,IAClD,OAAO,aAAA,IAAiB,eAAA;AAAA,IACxB;AAAA,GACF;AACF","file":"react.mjs","sourcesContent":["export const BAZAAR_V2_ABI = [\n {\n type: \"function\",\n name: \"submit\",\n inputs: [\n {\n name: \"submission\",\n type: \"tuple\",\n internalType: \"struct BazaarV1.Submission\",\n components: [\n {\n name: \"parameters\",\n type: \"tuple\",\n internalType: \"struct OrderParameters\",\n components: [\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n { name: \"zone\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct OfferItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ConsiderationItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"orderType\", type: \"uint8\", internalType: \"enum OrderType\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"salt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"totalOriginalConsiderationItems\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"counter\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"event\",\n name: \"Submitted\",\n inputs: [\n { name: \"tokenAddress\", type: \"address\", indexed: true, internalType: \"address\" },\n { name: \"tokenId\", type: \"uint256\", indexed: true, internalType: \"uint256\" },\n ],\n anonymous: false,\n },\n { type: \"error\", name: \"ConsiderationItemsMustContainTwoItems\", inputs: [] },\n { type: \"error\", name: \"OfferItemsMustContainOneItem\", inputs: [] },\n] as const;\n\nexport const BAZAAR_COLLECTION_OFFERS_ABI = [\n {\n type: \"function\",\n name: \"NET_APP_NAME\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\", internalType: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"submit\",\n inputs: [\n {\n name: \"submission\",\n type: \"tuple\",\n internalType: \"struct BazaarV2CollectionOffers.Submission\",\n components: [\n {\n name: \"parameters\",\n type: \"tuple\",\n internalType: \"struct OrderParameters\",\n components: [\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n { name: \"zone\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct OfferItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ConsiderationItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"orderType\", type: \"uint8\", internalType: \"enum OrderType\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"salt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"totalOriginalConsiderationItems\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"counter\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"event\",\n name: \"Submitted\",\n inputs: [\n { name: \"tokenAddress\", type: \"address\", indexed: true, internalType: \"address\" },\n { name: \"tokenId\", type: \"uint256\", indexed: true, internalType: \"uint256\" },\n ],\n anonymous: false,\n },\n { type: \"error\", name: \"ConsiderationItemsMustContainTwoItems\", inputs: [] },\n { type: \"error\", name: \"ConsiderationItemsMustIncludeFeeAddress\", inputs: [] },\n { type: \"error\", name: \"ConsiderationItemsMustIncludeMsgSender\", inputs: [] },\n { type: \"error\", name: \"InvalidFee\", inputs: [] },\n { type: \"error\", name: \"OfferItemsMustContainOneItem\", inputs: [] },\n] as const;\n\n/**\n * ERC20 offers contract ABI (same submit signature as collection offers, different contract address)\n */\nexport const BAZAAR_ERC20_OFFERS_ABI = [\n {\n type: \"function\",\n name: \"submit\",\n inputs: [\n {\n name: \"submission\",\n type: \"tuple\",\n internalType: \"struct BazaarV2CollectionOffers.Submission\",\n components: [\n {\n name: \"parameters\",\n type: \"tuple\",\n internalType: \"struct OrderParameters\",\n components: [\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n { name: \"zone\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct OfferItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ConsiderationItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"orderType\", type: \"uint8\", internalType: \"enum OrderType\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"salt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"totalOriginalConsiderationItems\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"counter\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n","export const BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI = [\n { type: \"constructor\", inputs: [], stateMutability: \"nonpayable\" },\n {\n type: \"function\",\n name: \"getOrderStatuses\",\n inputs: [\n { name: \"seaport\", type: \"address\", internalType: \"address\" },\n { name: \"orderHashes\", type: \"bytes32[]\", internalType: \"bytes32[]\" },\n ],\n outputs: [\n {\n name: \"results\",\n type: \"tuple[]\",\n internalType: \"struct BulkSeaportOrderStatusFetcher.OrderStatusInfo[]\",\n components: [\n { name: \"isValidated\", type: \"bool\", internalType: \"bool\" },\n { name: \"isCancelled\", type: \"bool\", internalType: \"bool\" },\n { name: \"totalFilled\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"totalSize\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const ERC721_OWNER_OF_HELPER_ABI = [\n {\n type: \"function\",\n name: \"getTokenOwners\",\n inputs: [\n { name: \"nftContract\", type: \"address\", internalType: \"address\" },\n { name: \"tokenIds\", type: \"uint256[]\", internalType: \"uint256[]\" },\n ],\n outputs: [\n { name: \"owners\", type: \"address[]\", internalType: \"address[]\" },\n ],\n stateMutability: \"view\",\n },\n { type: \"error\", name: \"InvalidAddress\", inputs: [] },\n { type: \"error\", name: \"TokenQueryFailed\", inputs: [] },\n] as const;\n\nexport const ERC20_BULK_BALANCE_CHECKER_ABI = [\n {\n type: \"function\",\n name: \"getBalances\",\n inputs: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"addresses\", type: \"address[]\", internalType: \"address[]\" },\n ],\n outputs: [\n { name: \"balances\", type: \"uint256[]\", internalType: \"uint256[]\" },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","/**\n * Minimal Seaport ABI for cancel operations\n */\nexport const SEAPORT_CANCEL_ABI = [\n {\n inputs: [\n {\n components: [\n { internalType: \"address\", name: \"offerer\", type: \"address\" },\n { internalType: \"address\", name: \"zone\", type: \"address\" },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n ],\n internalType: \"struct OfferItem[]\",\n name: \"offer\",\n type: \"tuple[]\",\n },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n { internalType: \"address payable\", name: \"recipient\", type: \"address\" },\n ],\n internalType: \"struct ConsiderationItem[]\",\n name: \"consideration\",\n type: \"tuple[]\",\n },\n { internalType: \"enum OrderType\", name: \"orderType\", type: \"uint8\" },\n { internalType: \"uint256\", name: \"startTime\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endTime\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"zoneHash\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"salt\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"conduitKey\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"counter\", type: \"uint256\" },\n ],\n internalType: \"struct OrderComponents[]\",\n name: \"orders\",\n type: \"tuple[]\",\n },\n ],\n name: \"cancel\",\n outputs: [{ internalType: \"bool\", name: \"cancelled\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\n// Shared ABI fragments for OrderParameters, OfferItem, and ConsiderationItem\nconst ORDER_PARAMETERS_COMPONENTS = [\n { internalType: \"address\", name: \"offerer\", type: \"address\" },\n { internalType: \"address\", name: \"zone\", type: \"address\" },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n ],\n internalType: \"struct OfferItem[]\",\n name: \"offer\",\n type: \"tuple[]\",\n },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n { internalType: \"address payable\", name: \"recipient\", type: \"address\" },\n ],\n internalType: \"struct ConsiderationItem[]\",\n name: \"consideration\",\n type: \"tuple[]\",\n },\n { internalType: \"enum OrderType\", name: \"orderType\", type: \"uint8\" },\n { internalType: \"uint256\", name: \"startTime\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endTime\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"zoneHash\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"salt\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"conduitKey\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"totalOriginalConsiderationItems\", type: \"uint256\" },\n] as const;\n\n/**\n * Seaport fulfillOrder ABI\n */\nexport const SEAPORT_FULFILL_ORDER_ABI = [\n {\n inputs: [\n {\n components: [\n {\n components: ORDER_PARAMETERS_COMPONENTS,\n internalType: \"struct OrderParameters\",\n name: \"parameters\",\n type: \"tuple\",\n },\n { internalType: \"bytes\", name: \"signature\", type: \"bytes\" },\n ],\n internalType: \"struct Order\",\n name: \"\",\n type: \"tuple\",\n },\n { internalType: \"bytes32\", name: \"fulfillerConduitKey\", type: \"bytes32\" },\n ],\n name: \"fulfillOrder\",\n outputs: [{ internalType: \"bool\", name: \"fulfilled\", type: \"bool\" }],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\n/**\n * Seaport fulfillAdvancedOrder ABI\n */\nexport const SEAPORT_FULFILL_ADVANCED_ORDER_ABI = [\n {\n inputs: [\n {\n components: [\n {\n components: ORDER_PARAMETERS_COMPONENTS,\n internalType: \"struct OrderParameters\",\n name: \"parameters\",\n type: \"tuple\",\n },\n { internalType: \"uint120\", name: \"numerator\", type: \"uint120\" },\n { internalType: \"uint120\", name: \"denominator\", type: \"uint120\" },\n { internalType: \"bytes\", name: \"signature\", type: \"bytes\" },\n { internalType: \"bytes\", name: \"extraData\", type: \"bytes\" },\n ],\n internalType: \"struct AdvancedOrder\",\n name: \"\",\n type: \"tuple\",\n },\n {\n components: [\n { internalType: \"uint256\", name: \"orderIndex\", type: \"uint256\" },\n { internalType: \"enum Side\", name: \"side\", type: \"uint8\" },\n { internalType: \"uint256\", name: \"index\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"identifier\", type: \"uint256\" },\n { internalType: \"bytes32[]\", name: \"criteriaProof\", type: \"bytes32[]\" },\n ],\n internalType: \"struct CriteriaResolver[]\",\n name: \"\",\n type: \"tuple[]\",\n },\n { internalType: \"bytes32\", name: \"fulfillerConduitKey\", type: \"bytes32\" },\n { internalType: \"address\", name: \"recipient\", type: \"address\" },\n ],\n name: \"fulfillAdvancedOrder\",\n outputs: [{ internalType: \"bool\", name: \"fulfilled\", type: \"bool\" }],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\n/**\n * Seaport getCounter ABI\n */\nexport const SEAPORT_GET_COUNTER_ABI = [\n {\n inputs: [{ internalType: \"address\", name: \"offerer\", type: \"address\" }],\n name: \"getCounter\",\n outputs: [{ internalType: \"uint256\", name: \"counter\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n/**\n * ERC721 approval ABIs (isApprovedForAll + setApprovalForAll)\n */\nexport const ERC721_APPROVAL_ABI = [\n {\n inputs: [\n { internalType: \"address\", name: \"owner\", type: \"address\" },\n { internalType: \"address\", name: \"operator\", type: \"address\" },\n ],\n name: \"isApprovedForAll\",\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"address\", name: \"operator\", type: \"address\" },\n { internalType: \"bool\", name: \"approved\", type: \"bool\" },\n ],\n name: \"setApprovalForAll\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\n/**\n * ERC20 approval ABIs (allowance + approve)\n */\nexport const ERC20_APPROVAL_ABI = [\n {\n inputs: [\n { internalType: \"address\", name: \"owner\", type: \"address\" },\n { internalType: \"address\", name: \"spender\", type: \"address\" },\n ],\n name: \"allowance\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"address\", name: \"spender\", type: \"address\" },\n { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n","export { BAZAAR_V2_ABI, BAZAAR_COLLECTION_OFFERS_ABI, BAZAAR_ERC20_OFFERS_ABI } from \"./bazaarV2\";\nexport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n ERC721_OWNER_OF_HELPER_ABI,\n ERC20_BULK_BALANCE_CHECKER_ABI,\n} from \"./helpers\";\nexport {\n SEAPORT_CANCEL_ABI,\n SEAPORT_FULFILL_ORDER_ABI,\n SEAPORT_FULFILL_ADVANCED_ORDER_ABI,\n SEAPORT_GET_COUNTER_ABI,\n ERC721_APPROVAL_ABI,\n ERC20_APPROVAL_ABI,\n} from \"./seaport\";\n\n/**\n * ABI for decoding Seaport submission from Net message data\n */\nexport const BAZAAR_SUBMISSION_ABI = [\n {\n name: \"submission\",\n type: \"tuple\",\n internalType: \"struct BazaarV2.Submission\",\n components: [\n {\n name: \"parameters\",\n type: \"tuple\",\n internalType: \"struct OrderParameters\",\n components: [\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n { name: \"zone\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct OfferItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ConsiderationItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"orderType\", type: \"uint8\", internalType: \"enum OrderType\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"salt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"totalOriginalConsiderationItems\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"counter\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n },\n] as const;\n","/**\n * Bazaar chain configuration\n *\n * Contains contract addresses and configuration for each supported chain.\n */\n\nexport interface WrappedNativeCurrency {\n address: `0x${string}`;\n name: string;\n symbol: string;\n}\n\nexport interface BazaarChainConfig {\n /** Main NFT listing contract */\n bazaarAddress: `0x${string}`;\n /** Collection offers contract */\n collectionOffersAddress: `0x${string}`;\n /** ERC20 offers contract (only on Base and HyperEVM) */\n erc20OffersAddress?: `0x${string}`;\n /** ERC20 listings contract */\n erc20BazaarAddress?: `0x${string}`;\n /** Seaport contract address */\n seaportAddress: `0x${string}`;\n /** Fee collector address */\n feeCollectorAddress: `0x${string}`;\n /** Fee in basis points for NFT trades */\n nftFeeBps: number;\n /** Wrapped native currency (WETH, etc.) */\n wrappedNativeCurrency: WrappedNativeCurrency;\n /** Address with high ETH balance for Seaport checks */\n highEthAddress?: `0x${string}`;\n /** Native currency symbol (lowercase) */\n currencySymbol: string;\n}\n\n// Default addresses used by most chains\nconst DEFAULT_SEAPORT_ADDRESS = \"0x0000000000000068F116a894984e2DB1123eB395\" as const;\nconst DEFAULT_BAZAAR_ADDRESS = \"0x00000000E3dA5fC031282A39759bDDA78ae7fAE5\" as const;\nconst DEFAULT_COLLECTION_OFFERS_ADDRESS = \"0x0000000D43423E0A12CecB307a74591999b32B32\" as const;\nconst DEFAULT_FEE_COLLECTOR_ADDRESS = \"0x32D16C15410248bef498D7aF50D10Db1a546b9E5\" as const;\nconst DEFAULT_ERC20_BAZAAR_ADDRESS = \"0x00000000a2d173a4610c85c7471a25b6bc216a70\" as const;\nconst DEFAULT_NFT_FEE_BPS = 500; // 5%\n\n// Helper contract addresses (same on all chains)\nexport const BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS = \"0x0000009112ABCE652674b4fE3eD9C765B22d11A7\" as const;\nexport const ERC721_OWNER_OF_HELPER_ADDRESS = \"0x00000012E3eb0700925947fAF9cd1440319b4F37\" as const;\nexport const ERC20_BULK_BALANCE_CHECKER_ADDRESS = \"0x000000B50A9f2923F2DB931391824F6D1278f712\" as const;\n\n// Zone contract addresses (same on all chains)\nexport const NET_SEAPORT_ZONE_ADDRESS = \"0x000000007F8c58fbf215bF91Bda7421A806cf3ae\" as const;\nexport const NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS = \"0x000000B799ec6D7aCC1B578f62bFc324c25DFC5A\" as const;\nexport const NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS = \"0x000000bC63761cbb05305632212e2f3AE2BE7a9B\" as const;\n\n/**\n * Chain-specific bazaar configuration\n */\nconst BAZAAR_CHAIN_CONFIGS: Record<number, BazaarChainConfig> = {\n // Base Mainnet\n 8453: {\n bazaarAddress: \"0x000000058f3ade587388daf827174d0e6fc97595\",\n collectionOffersAddress: \"0x0000000f9c45efcff0f78d8b54aa6a40092d66dc\",\n erc20OffersAddress: \"0x0000000e23a89aa06f317306aa1ae231d3503082\",\n erc20BazaarAddress: \"0x00000006557e3629e2fc50bbad0c002b27cac492\",\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: \"0x66547ff4f7206e291F7BC157b54C026Fc6660961\",\n nftFeeBps: 0, // 0% on Base\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // Base Sepolia (Testnet)\n 84532: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // Degen\n 666666666: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0xEb54dACB4C2ccb64F8074eceEa33b5eBb38E5387\",\n name: \"Wrapped Degen\",\n symbol: \"WDEGEN\",\n },\n currencySymbol: \"degen\",\n },\n\n // Ham Chain\n 5112: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n highEthAddress: \"0x4200000000000000000000000000000000000006\",\n currencySymbol: \"eth\",\n },\n\n // Ink Chain\n 57073: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n // Custom Seaport address for Ink (no create2 factory)\n seaportAddress: \"0xD00C96804e9fF35f10C7D2a92239C351Ff3F94e5\",\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped ETH\",\n symbol: \"WETH\",\n },\n highEthAddress: \"0x4200000000000000000000000000000000000006\",\n currencySymbol: \"eth\",\n },\n\n // Unichain\n 130: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // HyperEVM (Hyperliquid)\n 999: {\n bazaarAddress: \"0x000000058f3ade587388daf827174d0e6fc97595\",\n collectionOffersAddress: \"0x0000000f9c45efcff0f78d8b54aa6a40092d66dc\",\n erc20OffersAddress: \"0x0000000e23a89aa06f317306aa1ae231d3503082\",\n erc20BazaarAddress: \"0x00000006557e3629e2fc50bbad0c002b27cac492\",\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: \"0x66547ff4f7206e291F7BC157b54C026Fc6660961\",\n nftFeeBps: 0, // 0% on HyperEVM\n wrappedNativeCurrency: {\n address: \"0x5555555555555555555555555555555555555555\",\n name: \"Wrapped Hype\",\n symbol: \"WHYPE\",\n },\n currencySymbol: \"hype\",\n },\n\n // Plasma\n 9745: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x6100e367285b01f48d07953803a2d8dca5d19873\",\n name: \"Wrapped XPL\",\n symbol: \"WXPL\",\n },\n currencySymbol: \"xpl\",\n },\n\n // Monad\n 143: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A\",\n name: \"Wrapped Monad\",\n symbol: \"WMONAD\",\n },\n currencySymbol: \"monad\",\n },\n};\n\n/**\n * Get bazaar configuration for a chain\n */\nexport function getBazaarChainConfig(chainId: number): BazaarChainConfig | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId];\n}\n\n/**\n * Get all supported bazaar chain IDs\n */\nexport function getBazaarSupportedChainIds(): number[] {\n return Object.keys(BAZAAR_CHAIN_CONFIGS).map(Number);\n}\n\n/**\n * Check if bazaar is supported on a chain\n */\nexport function isBazaarSupportedOnChain(chainId: number): boolean {\n return chainId in BAZAAR_CHAIN_CONFIGS;\n}\n\n/**\n * Get bazaar contract address for a chain\n */\nexport function getBazaarAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.bazaarAddress ?? DEFAULT_BAZAAR_ADDRESS;\n}\n\n/**\n * Get collection offers contract address for a chain\n */\nexport function getCollectionOffersAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.collectionOffersAddress ?? DEFAULT_COLLECTION_OFFERS_ADDRESS;\n}\n\n/**\n * Get Seaport contract address for a chain\n */\nexport function getSeaportAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.seaportAddress ?? DEFAULT_SEAPORT_ADDRESS;\n}\n\n/**\n * Get fee collector address for a chain\n */\nexport function getFeeCollectorAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.feeCollectorAddress ?? DEFAULT_FEE_COLLECTOR_ADDRESS;\n}\n\n/**\n * Get NFT fee in basis points for a chain\n */\nexport function getNftFeeBps(chainId: number): number {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.nftFeeBps ?? DEFAULT_NFT_FEE_BPS;\n}\n\n/**\n * Get wrapped native currency for a chain\n */\nexport function getWrappedNativeCurrency(chainId: number): WrappedNativeCurrency | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.wrappedNativeCurrency;\n}\n\n/**\n * Get currency symbol for a chain (lowercase)\n */\nexport function getCurrencySymbol(chainId: number): string {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.currencySymbol ?? \"eth\";\n}\n\n/**\n * Get high ETH address for Seaport balance checks\n */\nexport function getHighEthAddress(chainId: number): `0x${string}` | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.highEthAddress;\n}\n\n/**\n * Get ERC20 offers contract address for a chain\n * Only deployed on Base (8453) and HyperEVM (999)\n */\nexport function getErc20OffersAddress(chainId: number): `0x${string}` | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.erc20OffersAddress;\n}\n\n/**\n * Get ERC20 bazaar (listings) contract address for a chain\n */\nexport function getErc20BazaarAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.erc20BazaarAddress ?? DEFAULT_ERC20_BAZAAR_ADDRESS;\n}\n","/**\n * Seaport-related utilities for decoding and computing order hashes\n */\n\nimport { decodeAbiParameters, formatEther } from \"viem\";\nimport { Seaport } from \"@opensea/seaport-js\";\nimport { ethers } from \"ethers\";\nimport { BAZAAR_SUBMISSION_ABI } from \"../abis\";\nimport {\n SeaportSubmission,\n SeaportOrderParameters,\n SeaportOrderStatus,\n SeaportOrderStatusInfo,\n} from \"../types\";\nimport { getSeaportAddress, getHighEthAddress } from \"../chainConfig\";\n\n/**\n * Decode Seaport submission from Net message data\n */\nexport function decodeSeaportSubmission(messageData: `0x${string}`): SeaportSubmission {\n const [decoded] = decodeAbiParameters(BAZAAR_SUBMISSION_ABI, messageData);\n\n return {\n parameters: {\n offerer: decoded.parameters.offerer as `0x${string}`,\n zone: decoded.parameters.zone as `0x${string}`,\n offer: decoded.parameters.offer.map((item: any) => ({\n itemType: item.itemType,\n token: item.token as `0x${string}`,\n identifierOrCriteria: BigInt(item.identifierOrCriteria),\n startAmount: BigInt(item.startAmount),\n endAmount: BigInt(item.endAmount),\n })),\n consideration: decoded.parameters.consideration.map((item: any) => ({\n itemType: item.itemType,\n token: item.token as `0x${string}`,\n identifierOrCriteria: BigInt(item.identifierOrCriteria),\n startAmount: BigInt(item.startAmount),\n endAmount: BigInt(item.endAmount),\n recipient: item.recipient as `0x${string}`,\n })),\n orderType: decoded.parameters.orderType,\n startTime: BigInt(decoded.parameters.startTime),\n endTime: BigInt(decoded.parameters.endTime),\n zoneHash: decoded.parameters.zoneHash as `0x${string}`,\n salt: BigInt(decoded.parameters.salt),\n conduitKey: decoded.parameters.conduitKey as `0x${string}`,\n totalOriginalConsiderationItems: BigInt(decoded.parameters.totalOriginalConsiderationItems),\n },\n counter: BigInt(decoded.counter),\n signature: decoded.signature as `0x${string}`,\n };\n}\n\n/**\n * Get Seaport order from message data with string identifiers\n * (needed for Seaport SDK compatibility)\n */\nexport function getSeaportOrderFromMessageData(messageData: `0x${string}`): {\n parameters: any;\n signature: `0x${string}`;\n counter: bigint;\n} {\n const submission = decodeSeaportSubmission(messageData);\n\n return {\n parameters: {\n ...submission.parameters,\n // Convert BigInts to strings for Seaport SDK compatibility\n offer: submission.parameters.offer.map((item) => ({\n ...item,\n identifierOrCriteria: item.identifierOrCriteria.toString(),\n startAmount: item.startAmount.toString(),\n endAmount: item.endAmount.toString(),\n })),\n consideration: submission.parameters.consideration.map((item) => ({\n ...item,\n identifierOrCriteria: item.identifierOrCriteria.toString(),\n startAmount: item.startAmount.toString(),\n endAmount: item.endAmount.toString(),\n })),\n startTime: submission.parameters.startTime.toString(),\n endTime: submission.parameters.endTime.toString(),\n salt: submission.parameters.salt.toString(),\n totalOriginalConsiderationItems: submission.parameters.totalOriginalConsiderationItems.toString(),\n counter: submission.counter.toString(),\n },\n signature: submission.signature,\n counter: submission.counter,\n };\n}\n\n/**\n * Create a Seaport instance for a chain using a public RPC\n */\nexport function createSeaportInstance(chainId: number, rpcUrl: string): Seaport {\n const provider = new ethers.JsonRpcProvider(rpcUrl);\n\n // Use a dummy signer for read-only operations\n const signer = new ethers.Wallet(\n // Random private key for read-only operations\n \"dc63e9af2088e2afd61499411cb6dd718d00a3d9e46e2cb5e33912c781bd77fe\",\n provider\n );\n\n // Override getAddress to return a high-balance address for checks\n const highEthAddress = getHighEthAddress(chainId);\n const finalSigner = highEthAddress\n ? {\n ...signer,\n getAddress: () => highEthAddress,\n address: highEthAddress,\n }\n : signer;\n\n return new Seaport(finalSigner as any, {\n overrides: { contractAddress: getSeaportAddress(chainId) },\n });\n}\n\n/**\n * Compute Seaport order hash\n */\nexport function computeOrderHash(\n seaport: Seaport,\n orderParameters: any,\n counter: bigint | string\n): string {\n return seaport.getOrderHash({\n ...orderParameters,\n counter: counter.toString(),\n });\n}\n\n/**\n * Determine order status from on-chain status info\n */\nexport function getOrderStatusFromInfo(\n orderParameters: SeaportOrderParameters,\n statusInfo: SeaportOrderStatusInfo\n): SeaportOrderStatus {\n if (statusInfo.isCancelled) {\n return SeaportOrderStatus.CANCELLED;\n }\n\n if (\n statusInfo.totalFilled === statusInfo.totalSize &&\n statusInfo.totalFilled > BigInt(0)\n ) {\n return SeaportOrderStatus.FILLED;\n }\n\n const now = BigInt(Math.floor(Date.now() / 1000));\n if (orderParameters.endTime < now) {\n return SeaportOrderStatus.EXPIRED;\n }\n\n return SeaportOrderStatus.OPEN;\n}\n\n/**\n * Calculate total consideration amount (price) from order\n */\nexport function getTotalConsiderationAmount(parameters: SeaportOrderParameters): bigint {\n return parameters.consideration.reduce(\n (acc, item) => acc + item.startAmount,\n BigInt(0)\n );\n}\n\n/**\n * Format price from wei to display string\n */\nexport function formatPrice(priceWei: bigint): number {\n return parseFloat(formatEther(priceWei));\n}\n","/**\n * Validation utilities for checking order status and ownership\n */\n\nimport { PublicClient } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n ERC721_OWNER_OF_HELPER_ABI,\n ERC20_BULK_BALANCE_CHECKER_ABI,\n} from \"../abis\";\nimport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS,\n ERC721_OWNER_OF_HELPER_ADDRESS,\n ERC20_BULK_BALANCE_CHECKER_ADDRESS,\n getSeaportAddress,\n} from \"../chainConfig\";\nimport { SeaportOrderStatusInfo, SeaportOrderStatus } from \"../types\";\n\n/**\n * Bulk fetch Seaport order statuses\n */\nexport async function bulkFetchOrderStatuses(\n client: PublicClient,\n chainId: number,\n orderHashes: `0x${string}`[]\n): Promise<SeaportOrderStatusInfo[]> {\n if (orderHashes.length === 0) {\n return [];\n }\n\n const seaportAddress = getSeaportAddress(chainId);\n\n try {\n console.log(`[bulkFetchOrderStatuses] fetching ${orderHashes.length} statuses via ${BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS}`);\n const results = await readContract(client, {\n address: BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS,\n abi: BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n functionName: \"getOrderStatuses\",\n args: [seaportAddress, orderHashes],\n });\n\n const statuses = (results as any[]).map((r) => ({\n isValidated: r.isValidated,\n isCancelled: r.isCancelled,\n totalFilled: BigInt(r.totalFilled),\n totalSize: BigInt(r.totalSize),\n }));\n console.log(`[bulkFetchOrderStatuses] success: ${statuses.length} statuses`);\n return statuses;\n } catch (err) {\n console.error(`[bulkFetchOrderStatuses] FAILED for ${orderHashes.length} hashes:`, err);\n throw err;\n }\n}\n\n/**\n * Create a mapping of order hash to status\n */\nexport async function createOrderStatusMap(\n client: PublicClient,\n chainId: number,\n orderHashes: `0x${string}`[]\n): Promise<Map<string, SeaportOrderStatusInfo>> {\n const statuses = await bulkFetchOrderStatuses(client, chainId, orderHashes);\n\n const map = new Map<string, SeaportOrderStatusInfo>();\n orderHashes.forEach((hash, index) => {\n map.set(hash.toLowerCase(), statuses[index]);\n });\n\n return map;\n}\n\n/**\n * Bulk fetch NFT owners for specific token IDs\n */\nexport async function bulkFetchNftOwners(\n client: PublicClient,\n nftAddress: `0x${string}`,\n tokenIds: string[]\n): Promise<(`0x${string}` | null)[]> {\n if (tokenIds.length === 0) {\n return [];\n }\n\n try {\n console.log(`[bulkFetchNftOwners] fetching ${tokenIds.length} owners for ${nftAddress.slice(0, 10)} via ${ERC721_OWNER_OF_HELPER_ADDRESS}`);\n const owners = await readContract(client, {\n address: ERC721_OWNER_OF_HELPER_ADDRESS,\n abi: ERC721_OWNER_OF_HELPER_ABI,\n functionName: \"getTokenOwners\",\n args: [nftAddress, tokenIds.map((id) => BigInt(id))],\n });\n\n const result = (owners as `0x${string}`[]).map((owner) =>\n owner === \"0x0000000000000000000000000000000000000000\" ? null : owner\n );\n const validCount = result.filter((o) => o !== null).length;\n console.log(`[bulkFetchNftOwners] success: ${validCount}/${tokenIds.length} have owners`);\n return result;\n } catch (err) {\n console.error(`[bulkFetchNftOwners] FAILED for ${tokenIds.length} tokens — returning all null:`, err);\n return tokenIds.map(() => null);\n }\n}\n\n/**\n * Create a mapping of token ID to owner address\n */\nexport async function createOwnershipMap(\n client: PublicClient,\n nftAddress: `0x${string}`,\n tokenIds: string[]\n): Promise<Map<string, `0x${string}` | null>> {\n const owners = await bulkFetchNftOwners(client, nftAddress, tokenIds);\n\n const map = new Map<string, `0x${string}` | null>();\n tokenIds.forEach((tokenId, index) => {\n map.set(tokenId, owners[index]);\n });\n\n return map;\n}\n\n/**\n * Bulk fetch ERC20 balances for addresses\n */\nexport async function bulkFetchErc20Balances(\n client: PublicClient,\n tokenAddress: `0x${string}`,\n addresses: `0x${string}`[]\n): Promise<bigint[]> {\n if (addresses.length === 0) {\n return [];\n }\n\n try {\n console.log(`[bulkFetchErc20Balances] fetching ${addresses.length} balances for ${tokenAddress.slice(0, 10)}`);\n const balances = await readContract(client, {\n address: ERC20_BULK_BALANCE_CHECKER_ADDRESS,\n abi: ERC20_BULK_BALANCE_CHECKER_ABI,\n functionName: \"getBalances\",\n args: [tokenAddress, addresses],\n });\n\n const result = (balances as bigint[]).map((b) => BigInt(b));\n console.log(`[bulkFetchErc20Balances] success: ${result.length} balances`);\n return result;\n } catch (err) {\n console.error(`[bulkFetchErc20Balances] FAILED for ${addresses.length} addresses — returning all zero:`, err);\n return addresses.map(() => BigInt(0));\n }\n}\n\n/**\n * Create a mapping of address to ERC20 balance\n */\nexport async function createBalanceMap(\n client: PublicClient,\n tokenAddress: `0x${string}`,\n addresses: `0x${string}`[]\n): Promise<Map<string, bigint>> {\n const balances = await bulkFetchErc20Balances(client, tokenAddress, addresses);\n\n const map = new Map<string, bigint>();\n addresses.forEach((address, index) => {\n map.set(address.toLowerCase(), balances[index]);\n });\n\n return map;\n}\n\n/**\n * Validate that a listing is still valid:\n * - Order is OPEN\n * - Not expired\n * - Seller still owns the NFT\n */\nexport function isListingValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n sellerAddress: `0x${string}`,\n currentOwner: `0x${string}` | null\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (!currentOwner || currentOwner.toLowerCase() !== sellerAddress.toLowerCase()) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that a collection offer is still valid:\n * - Order is OPEN\n * - Not expired\n * - Buyer has sufficient WETH balance\n */\nexport function isCollectionOfferValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n priceWei: bigint,\n buyerBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (buyerBalance < priceWei) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that an ERC20 offer is still valid:\n * - Order is OPEN\n * - Not expired\n * - Buyer has sufficient WETH balance\n */\nexport function isErc20OfferValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n priceWei: bigint,\n buyerWethBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (buyerWethBalance < priceWei) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that an ERC20 listing is still valid:\n * - Order is OPEN\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n */\nexport function isErc20ListingValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n tokenAmount: bigint,\n sellerTokenBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (sellerTokenBalance < tokenAmount) {\n return false;\n }\n\n return true;\n}\n","/**\n * Utilities for parsing Net messages into listings and offers\n */\n\nimport { NetMessage } from \"@net-protocol/core\";\nimport { decodeAbiParameters, formatEther } from \"viem\";\nimport { Listing, CollectionOffer, Erc20Offer, Erc20Listing, Sale, SeaportOrderStatus, ItemType } from \"../types\";\nimport {\n decodeSeaportSubmission,\n getSeaportOrderFromMessageData,\n getTotalConsiderationAmount,\n formatPrice,\n} from \"./seaport\";\nimport { getCurrencySymbol, NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS, NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS } from \"../chainConfig\";\n\n/**\n * Parse a Net message into an NFT listing\n */\nexport function parseListingFromMessage(\n message: NetMessage,\n chainId: number\n): Listing | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // NFT listings have the NFT in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem) {\n return null;\n }\n\n // Must be ERC721 or ERC1155\n if (offerItem.itemType !== ItemType.ERC721 && offerItem.itemType !== ItemType.ERC1155) {\n return null;\n }\n\n const priceWei = getTotalConsiderationAmount(parameters);\n const tokenId = offerItem.identifierOrCriteria.toString();\n\n const targetFulfiller =\n parameters.zone.toLowerCase() === NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS.toLowerCase() &&\n parameters.zoneHash !== \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n ? parameters.zoneHash\n : undefined;\n\n return {\n maker: parameters.offerer,\n nftAddress: offerItem.token,\n tokenId,\n priceWei,\n price: formatPrice(priceWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"\", // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n targetFulfiller,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Parse a Net message into a collection offer\n */\nexport function parseCollectionOfferFromMessage(\n message: NetMessage,\n chainId: number\n): CollectionOffer | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // Collection offers must use the collection offer zone\n if (\n parameters.zone.toLowerCase() !==\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // Collection offers have WETH in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n // The NFT is in the consideration array with criteria type\n const nftConsideration = parameters.consideration.find(\n (item) =>\n item.itemType === ItemType.ERC721_WITH_CRITERIA ||\n item.itemType === ItemType.ERC1155_WITH_CRITERIA\n );\n\n if (!nftConsideration) {\n return null;\n }\n\n // Only support single NFT offers\n if (nftConsideration.startAmount !== BigInt(1)) {\n return null;\n }\n\n const priceWei = offerItem.startAmount;\n\n return {\n maker: parameters.offerer,\n nftAddress: nftConsideration.token,\n priceWei,\n price: formatPrice(priceWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"\", // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Get the best listing for each token (lowest price)\n */\nexport function getBestListingPerToken(listings: Listing[]): Listing[] {\n const tokenMap = new Map<string, Listing>();\n\n for (const listing of listings) {\n const key = `${listing.nftAddress.toLowerCase()}-${listing.tokenId}`;\n const existing = tokenMap.get(key);\n\n if (!existing || listing.priceWei < existing.priceWei) {\n tokenMap.set(key, listing);\n }\n }\n\n return Array.from(tokenMap.values());\n}\n\n/**\n * Get the best collection offer (highest price)\n */\nexport function getBestCollectionOffer(offers: CollectionOffer[]): CollectionOffer | null {\n if (offers.length === 0) {\n return null;\n }\n\n return offers.reduce((best, current) =>\n current.priceWei > best.priceWei ? current : best\n );\n}\n\n/**\n * Sort listings by price (lowest first)\n */\nexport function sortListingsByPrice(listings: Listing[]): Listing[] {\n return [...listings].sort((a, b) => {\n const diff = a.priceWei - b.priceWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Sort offers by price (highest first)\n */\nexport function sortOffersByPrice(offers: CollectionOffer[]): CollectionOffer[] {\n return [...offers].sort((a, b) => {\n const diff = b.priceWei - a.priceWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Parse a Net message into an ERC20 offer\n */\nexport function parseErc20OfferFromMessage(\n message: NetMessage,\n chainId: number\n): Erc20Offer | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // ERC20 offers must use the collection offer zone\n if (\n parameters.zone.toLowerCase() !==\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // ERC20 offers have WETH in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n // The ERC20 token being purchased is in the consideration array\n const erc20Consideration = parameters.consideration.find(\n (item) => item.itemType === ItemType.ERC20\n );\n\n if (!erc20Consideration) {\n return null;\n }\n\n // Must have a non-zero token amount\n const tokenAmount = erc20Consideration.startAmount;\n if (tokenAmount === BigInt(0)) {\n return null;\n }\n\n const priceWei = offerItem.startAmount;\n const pricePerTokenWei = priceWei / tokenAmount;\n\n return {\n maker: parameters.offerer,\n tokenAddress: erc20Consideration.token,\n tokenAmount,\n priceWei,\n pricePerTokenWei,\n price: formatPrice(priceWei),\n pricePerToken: formatPrice(pricePerTokenWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"0x\" as `0x${string}`, // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Sort ERC20 offers by price per token (highest first)\n */\nexport function sortErc20OffersByPricePerToken(offers: Erc20Offer[]): Erc20Offer[] {\n return [...offers].sort((a, b) => {\n const diff = b.pricePerTokenWei - a.pricePerTokenWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Parse a Net message into an ERC20 listing\n *\n * ERC20 listings have the ERC20 token in the offer array (seller is offering tokens)\n * and native currency payments in the consideration array.\n * They do NOT use the collection offer zone (that would be an offer, not a listing).\n */\nexport function parseErc20ListingFromMessage(\n message: NetMessage,\n chainId: number\n): Erc20Listing | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // ERC20 listings must NOT use the collection offer zone (that would be an offer)\n if (\n parameters.zone.toLowerCase() ===\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // ERC20 listings have the ERC20 token in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n const tokenAmount = offerItem.startAmount;\n if (tokenAmount === BigInt(0)) {\n return null;\n }\n\n const priceWei = getTotalConsiderationAmount(parameters);\n if (priceWei === BigInt(0)) {\n return null;\n }\n\n const pricePerTokenWei = priceWei / tokenAmount;\n\n return {\n maker: parameters.offerer,\n tokenAddress: offerItem.token,\n tokenAmount,\n priceWei,\n pricePerTokenWei,\n price: formatPrice(priceWei),\n pricePerToken: formatPrice(pricePerTokenWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"0x\" as `0x${string}`, // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Sort ERC20 listings by price per token (lowest first)\n */\nexport function sortErc20ListingsByPricePerToken(listings: Erc20Listing[]): Erc20Listing[] {\n return [...listings].sort((a, b) => {\n const diff = a.pricePerTokenWei - b.pricePerTokenWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * ABI for decoding zone-stored sale data from bulk storage.\n * The stored data contains: timestamp, netTotalMessageLength,\n * netTotalMessageForAppTopicLength, and the full ZoneParameters struct.\n */\nconst ZONE_STORED_SALE_ABI = [\n { type: \"uint256\" }, // timestamp\n { type: \"uint256\" }, // netTotalMessageLength\n { type: \"uint256\" }, // netTotalMessageForAppTopicLength\n {\n name: \"zoneParameters\",\n type: \"tuple\",\n internalType: \"struct ZoneParameters\",\n components: [\n { name: \"orderHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"fulfiller\", type: \"address\", internalType: \"address\" },\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct SpentItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifier\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ReceivedItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifier\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"extraData\", type: \"bytes\", internalType: \"bytes\" },\n { name: \"orderHashes\", type: \"bytes32[]\", internalType: \"bytes32[]\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n ],\n },\n] as const;\n\n/**\n * Parse a sale from bulk storage data (zone-stored sale details).\n *\n * The storage contract stores the full ZoneParameters struct for each sale,\n * keyed by order hash with operator = NET_SEAPORT_ZONE_ADDRESS.\n */\nexport function parseSaleFromStoredData(\n storedData: string,\n chainId: number\n): Sale | null {\n try {\n const cleanedData = (\n \"0x\" +\n (storedData.startsWith(\"0x\") ? storedData.slice(2) : storedData)\n ) as `0x${string}`;\n\n const [timestamp, , , zoneParameters] = decodeAbiParameters(\n ZONE_STORED_SALE_ABI,\n cleanedData\n );\n\n const offerItem = zoneParameters.offer[0];\n if (!offerItem) return null;\n\n const totalConsideration = zoneParameters.consideration.reduce(\n (acc, item) => acc + item.amount,\n BigInt(0)\n );\n\n return {\n seller: zoneParameters.offerer as `0x${string}`,\n buyer: zoneParameters.fulfiller as `0x${string}`,\n tokenAddress: offerItem.token as `0x${string}`,\n tokenId: offerItem.identifier.toString(),\n amount: offerItem.amount,\n itemType: offerItem.itemType as ItemType,\n priceWei: totalConsideration,\n price: parseFloat(formatEther(totalConsideration)),\n currency: getCurrencySymbol(chainId),\n timestamp: Number(timestamp),\n orderHash: zoneParameters.orderHash,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Sort sales by timestamp (most recent first)\n */\nexport function sortSalesByTimestamp(sales: Sale[]): Sale[] {\n return [...sales].sort((a, b) => b.timestamp - a.timestamp);\n}\n","/**\n * Approval utilities for checking and building ERC721/ERC20 approval transactions\n */\n\nimport { PublicClient } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { ERC721_APPROVAL_ABI, ERC20_APPROVAL_ABI } from \"../abis\";\nimport { WriteTransactionConfig } from \"../types\";\n\nconst MAX_UINT256 = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n\n/**\n * Check if an ERC721 collection is approved for a spender, and return an approval tx if not.\n *\n * @returns A `setApprovalForAll` tx if not approved, or `null` if already approved.\n */\nexport async function checkErc721Approval(\n client: PublicClient,\n nftAddress: `0x${string}`,\n owner: `0x${string}`,\n spender: `0x${string}`\n): Promise<WriteTransactionConfig | null> {\n const isApproved = await readContract(client, {\n address: nftAddress,\n abi: ERC721_APPROVAL_ABI,\n functionName: \"isApprovedForAll\",\n args: [owner, spender],\n });\n\n if (isApproved) {\n return null;\n }\n\n return {\n to: nftAddress,\n functionName: \"setApprovalForAll\",\n args: [spender, true],\n abi: ERC721_APPROVAL_ABI,\n };\n}\n\n/**\n * Check if an ERC20 token has sufficient allowance for a spender, and return an approval tx if not.\n *\n * @returns An `approve(spender, maxUint256)` tx if allowance is insufficient, or `null` if sufficient.\n */\nexport async function checkErc20Approval(\n client: PublicClient,\n tokenAddress: `0x${string}`,\n owner: `0x${string}`,\n spender: `0x${string}`,\n amount: bigint\n): Promise<WriteTransactionConfig | null> {\n const allowance = (await readContract(client, {\n address: tokenAddress,\n abi: ERC20_APPROVAL_ABI,\n functionName: \"allowance\",\n args: [owner, spender],\n })) as bigint;\n\n if (allowance >= amount) {\n return null;\n }\n\n return {\n to: tokenAddress,\n functionName: \"approve\",\n args: [spender, MAX_UINT256],\n abi: ERC20_APPROVAL_ABI,\n };\n}\n","/**\n * Fulfillment utilities for building Seaport fulfillOrder/fulfillAdvancedOrder transaction data\n */\n\nimport {\n SEAPORT_FULFILL_ORDER_ABI,\n SEAPORT_FULFILL_ADVANCED_ORDER_ABI,\n} from \"../abis\";\nimport {\n SeaportSubmission,\n SeaportOrderParameters,\n ItemType,\n WriteTransactionConfig,\n} from \"../types\";\n\nconst ZERO_BYTES32 = \"0x0000000000000000000000000000000000000000000000000000000000000000\" as const;\n\n/**\n * Convert SeaportOrderParameters to the tuple format expected by Seaport ABI\n */\nfunction formatOrderParameters(params: SeaportOrderParameters) {\n return {\n offerer: params.offerer,\n zone: params.zone,\n offer: params.offer.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n })),\n consideration: params.consideration.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n recipient: item.recipient,\n })),\n orderType: params.orderType,\n startTime: params.startTime,\n endTime: params.endTime,\n zoneHash: params.zoneHash,\n salt: params.salt,\n conduitKey: params.conduitKey,\n totalOriginalConsiderationItems: params.totalOriginalConsiderationItems,\n };\n}\n\n/**\n * Calculate the total native currency value needed from consideration items\n */\nfunction getNativeConsiderationValue(params: SeaportOrderParameters): bigint {\n return params.consideration.reduce((acc, item) => {\n if (item.itemType === ItemType.NATIVE) {\n return acc + item.startAmount;\n }\n return acc;\n }, BigInt(0));\n}\n\n/**\n * Build a fulfillAdvancedOrder transaction for an NFT listing (buyer pays native currency for NFT).\n *\n * Uses fulfillAdvancedOrder (instead of fulfillOrder) to support both standard and\n * private listings — private listings use a restricted zone that requires the\n * advanced order path.\n *\n * @param submission - Decoded Seaport submission from the listing's messageData\n * @param recipient - Address to receive the NFT\n * @param seaportAddress - Seaport contract address\n * @returns WriteTransactionConfig with value set to the native currency payment\n */\nexport function buildFulfillListingTx(\n submission: SeaportSubmission,\n recipient: `0x${string}`,\n seaportAddress: `0x${string}`\n): WriteTransactionConfig {\n const advancedOrder = {\n parameters: formatOrderParameters(submission.parameters),\n numerator: BigInt(1),\n denominator: BigInt(1),\n signature: submission.signature,\n extraData: \"0x\" as `0x${string}`,\n };\n\n return {\n to: seaportAddress,\n functionName: \"fulfillAdvancedOrder\",\n args: [advancedOrder, [], ZERO_BYTES32, recipient],\n abi: SEAPORT_FULFILL_ADVANCED_ORDER_ABI,\n value: getNativeConsiderationValue(submission.parameters),\n };\n}\n\n/**\n * Build a fulfillAdvancedOrder transaction for a collection offer.\n *\n * The fulfiller provides a specific NFT (tokenId) to satisfy the offerer's\n * ERC721_WITH_CRITERIA consideration item.\n *\n * @param submission - Decoded Seaport submission from the offer's messageData\n * @param tokenId - The specific token ID the fulfiller is providing\n * @param recipient - Address to receive the WETH payment\n * @param seaportAddress - Seaport contract address\n * @returns WriteTransactionConfig with value=0 (no native currency needed)\n */\nexport function buildFulfillCollectionOfferTx(\n submission: SeaportSubmission,\n tokenId: bigint,\n recipient: `0x${string}`,\n seaportAddress: `0x${string}`\n): WriteTransactionConfig {\n const advancedOrder = {\n parameters: formatOrderParameters(submission.parameters),\n numerator: BigInt(1),\n denominator: BigInt(1),\n signature: submission.signature,\n extraData: \"0x\" as `0x${string}`,\n };\n\n // CriteriaResolver: resolve the NFT criteria item in consideration (side=1)\n const criteriaResolvers = [\n {\n orderIndex: BigInt(0),\n side: 1, // Consideration side\n index: BigInt(0), // First consideration item (the NFT)\n identifier: tokenId,\n criteriaProof: [] as `0x${string}`[],\n },\n ];\n\n return {\n to: seaportAddress,\n functionName: \"fulfillAdvancedOrder\",\n args: [advancedOrder, criteriaResolvers, ZERO_BYTES32, recipient],\n abi: SEAPORT_FULFILL_ADVANCED_ORDER_ABI,\n value: BigInt(0),\n };\n}\n\n/**\n * Build a fulfillOrder transaction for an ERC20 offer (seller provides ERC20 tokens, buyer pays WETH).\n *\n * @param submission - Decoded Seaport submission from the offer's messageData\n * @param seaportAddress - Seaport contract address\n * @returns WriteTransactionConfig with value=0 (no native currency needed)\n */\nexport function buildFulfillErc20OfferTx(\n submission: SeaportSubmission,\n seaportAddress: `0x${string}`\n): WriteTransactionConfig {\n const order = {\n parameters: formatOrderParameters(submission.parameters),\n signature: submission.signature,\n };\n\n return {\n to: seaportAddress,\n functionName: \"fulfillOrder\",\n args: [order, ZERO_BYTES32],\n abi: SEAPORT_FULFILL_ORDER_ABI,\n value: BigInt(0),\n };\n}\n\n/**\n * Build a fulfillAdvancedOrder transaction for an ERC20 listing (buyer pays native currency for ERC20 tokens).\n *\n * Uses fulfillAdvancedOrder to support both standard and private listings.\n *\n * @param submission - Decoded Seaport submission from the listing's messageData\n * @param recipient - Address to receive the ERC20 tokens\n * @param seaportAddress - Seaport contract address\n * @returns WriteTransactionConfig with value set to the native currency payment\n */\nexport function buildFulfillErc20ListingTx(\n submission: SeaportSubmission,\n recipient: `0x${string}`,\n seaportAddress: `0x${string}`\n): WriteTransactionConfig {\n const advancedOrder = {\n parameters: formatOrderParameters(submission.parameters),\n numerator: BigInt(1),\n denominator: BigInt(1),\n signature: submission.signature,\n extraData: \"0x\" as `0x${string}`,\n };\n\n return {\n to: seaportAddress,\n functionName: \"fulfillAdvancedOrder\",\n args: [advancedOrder, [], ZERO_BYTES32, recipient],\n abi: SEAPORT_FULFILL_ADVANCED_ORDER_ABI,\n value: getNativeConsiderationValue(submission.parameters),\n };\n}\n","/**\n * Order creation utilities for building EIP-712 typed data and Bazaar submit transactions\n */\n\nimport { keccak256, toBytes } from \"viem\";\nimport {\n SeaportOrderParameters,\n EIP712OrderData,\n WriteTransactionConfig,\n ItemType,\n OrderType,\n CreateListingParams,\n CreateCollectionOfferParams,\n CreateErc20OfferParams,\n CreateErc20ListingParams,\n} from \"../types\";\nimport {\n BAZAAR_V2_ABI,\n BAZAAR_COLLECTION_OFFERS_ABI,\n BAZAAR_ERC20_OFFERS_ABI,\n} from \"../abis\";\nimport {\n getSeaportAddress,\n getFeeCollectorAddress,\n getNftFeeBps,\n getWrappedNativeCurrency,\n NET_SEAPORT_ZONE_ADDRESS,\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS,\n NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS,\n} from \"../chainConfig\";\n\n// EIP-712 constants\nconst SEAPORT_EIP712_DOMAIN_NAME = \"Seaport\";\nconst SEAPORT_EIP712_DOMAIN_VERSION = \"1.6\";\n\nconst ZERO_BYTES32 = \"0x0000000000000000000000000000000000000000000000000000000000000000\" as const;\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as const;\n\n/**\n * EIP-712 type definitions for Seaport OrderComponents.\n *\n * Important: OrderComponents has `counter` at the end, NOT `totalOriginalConsiderationItems`.\n * This matches the Seaport contract's EIP-712 domain.\n */\nconst SEAPORT_ORDER_EIP712_TYPES = {\n OrderComponents: [\n { name: \"offerer\", type: \"address\" },\n { name: \"zone\", type: \"address\" },\n { name: \"offer\", type: \"OfferItem[]\" },\n { name: \"consideration\", type: \"ConsiderationItem[]\" },\n { name: \"orderType\", type: \"uint8\" },\n { name: \"startTime\", type: \"uint256\" },\n { name: \"endTime\", type: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\" },\n { name: \"salt\", type: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\" },\n { name: \"counter\", type: \"uint256\" },\n ],\n OfferItem: [\n { name: \"itemType\", type: \"uint8\" },\n { name: \"token\", type: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\" },\n ],\n ConsiderationItem: [\n { name: \"itemType\", type: \"uint8\" },\n { name: \"token\", type: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\" },\n { name: \"recipient\", type: \"address\" },\n ],\n} as const;\n\n/**\n * Calculate fee amount.\n *\n * - NFTs use floor division: `(price * bps) / 10000`\n * - ERC20s use ceiling division: `(price * bps + 9999) / 10000`\n */\nexport function calculateFee(\n price: bigint,\n feeBps: number,\n useCeilingDivision: boolean\n): bigint {\n if (feeBps === 0) return BigInt(0);\n\n const fee = price * BigInt(feeBps);\n if (useCeilingDivision) {\n return (fee + BigInt(9999)) / BigInt(10000);\n }\n return fee / BigInt(10000);\n}\n\n/**\n * Generate a random salt for order uniqueness\n */\nexport function generateSalt(): bigint {\n const bytes = new Uint8Array(32);\n if (typeof globalThis.crypto !== \"undefined\" && globalThis.crypto.getRandomValues) {\n globalThis.crypto.getRandomValues(bytes);\n } else {\n // Fallback for environments without crypto\n for (let i = 0; i < 32; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n let hex = \"0x\";\n for (const b of bytes) {\n hex += b.toString(16).padStart(2, \"0\");\n }\n return BigInt(hex);\n}\n\n/**\n * Get default expiration timestamp (24 hours from now, in seconds)\n */\nexport function getDefaultExpiration(): number {\n return Math.floor(Date.now() / 1000) + 86400;\n}\n\n/**\n * Build order components for an NFT listing.\n *\n * Offer: one ERC721 item\n * Consideration: native currency payment to offerer + optional fee to feeCollector\n */\nexport function buildListingOrderComponents(\n params: CreateListingParams & { offerer: `0x${string}`; targetFulfiller?: `0x${string}` },\n chainId: number,\n counter: bigint\n): { orderParameters: SeaportOrderParameters; counter: bigint } {\n const feeBps = getNftFeeBps(chainId);\n const feeAmount = calculateFee(params.priceWei, feeBps, false);\n const sellerAmount = params.priceWei - feeAmount;\n const endTime = BigInt(params.expirationDate ?? getDefaultExpiration());\n const feeCollector = getFeeCollectorAddress(chainId);\n\n const consideration = [\n {\n itemType: ItemType.NATIVE,\n token: ZERO_ADDRESS as `0x${string}`,\n identifierOrCriteria: BigInt(0),\n startAmount: sellerAmount,\n endAmount: sellerAmount,\n recipient: params.offerer,\n },\n ];\n\n if (feeAmount > BigInt(0)) {\n consideration.push({\n itemType: ItemType.NATIVE,\n token: ZERO_ADDRESS as `0x${string}`,\n identifierOrCriteria: BigInt(0),\n startAmount: feeAmount,\n endAmount: feeAmount,\n recipient: feeCollector,\n });\n }\n\n // Private order support\n let zone: `0x${string}`;\n let zoneHash: `0x${string}`;\n\n if (params.targetFulfiller) {\n zone = NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS;\n // zoneHash is keccak256 of the raw address bytes (20 bytes)\n zoneHash = keccak256(toBytes(params.targetFulfiller));\n } else {\n zone = NET_SEAPORT_ZONE_ADDRESS;\n zoneHash = ZERO_BYTES32;\n }\n\n const orderParameters: SeaportOrderParameters = {\n offerer: params.offerer,\n zone,\n offer: [\n {\n itemType: ItemType.ERC721,\n token: params.nftAddress,\n identifierOrCriteria: BigInt(params.tokenId),\n startAmount: BigInt(1),\n endAmount: BigInt(1),\n },\n ],\n consideration,\n orderType: OrderType.FULL_RESTRICTED,\n startTime: BigInt(0),\n endTime,\n zoneHash,\n salt: generateSalt(),\n conduitKey: ZERO_BYTES32,\n totalOriginalConsiderationItems: BigInt(consideration.length),\n };\n\n return { orderParameters, counter };\n}\n\n/**\n * Build order components for a collection offer.\n *\n * Offer: WETH payment\n * Consideration: ERC721_WITH_CRITERIA (any token from collection) to offerer + optional fee\n */\nexport function buildCollectionOfferOrderComponents(\n params: CreateCollectionOfferParams & { offerer: `0x${string}` },\n chainId: number,\n counter: bigint\n): { orderParameters: SeaportOrderParameters; counter: bigint } {\n const weth = getWrappedNativeCurrency(chainId);\n if (!weth) {\n throw new Error(`No wrapped native currency configured for chain ${chainId}`);\n }\n\n const feeBps = getNftFeeBps(chainId);\n const feeAmount = calculateFee(params.priceWei, feeBps, false);\n const endTime = BigInt(params.expirationDate ?? getDefaultExpiration());\n const feeCollector = getFeeCollectorAddress(chainId);\n\n const consideration = [\n {\n itemType: ItemType.ERC721_WITH_CRITERIA,\n token: params.nftAddress,\n identifierOrCriteria: BigInt(0), // Any token in the collection\n startAmount: BigInt(1),\n endAmount: BigInt(1),\n recipient: params.offerer,\n },\n ];\n\n if (feeAmount > BigInt(0)) {\n consideration.push({\n itemType: ItemType.ERC20,\n token: weth.address,\n identifierOrCriteria: BigInt(0),\n startAmount: feeAmount,\n endAmount: feeAmount,\n recipient: feeCollector,\n });\n }\n\n const orderParameters: SeaportOrderParameters = {\n offerer: params.offerer,\n zone: NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS,\n offer: [\n {\n itemType: ItemType.ERC20,\n token: weth.address,\n identifierOrCriteria: BigInt(0),\n startAmount: params.priceWei,\n endAmount: params.priceWei,\n },\n ],\n consideration,\n orderType: OrderType.FULL_RESTRICTED,\n startTime: BigInt(0),\n endTime,\n zoneHash: ZERO_BYTES32,\n salt: generateSalt(),\n conduitKey: ZERO_BYTES32,\n totalOriginalConsiderationItems: BigInt(consideration.length),\n };\n\n return { orderParameters, counter };\n}\n\n/**\n * Build order components for an ERC20 offer (buying ERC20 tokens with WETH).\n *\n * Offer: WETH payment\n * Consideration: ERC20 tokens to offerer + optional WETH fee to feeCollector\n */\nexport function buildErc20OfferOrderComponents(\n params: CreateErc20OfferParams & { offerer: `0x${string}` },\n chainId: number,\n counter: bigint\n): { orderParameters: SeaportOrderParameters; counter: bigint } {\n const weth = getWrappedNativeCurrency(chainId);\n if (!weth) {\n throw new Error(`No wrapped native currency configured for chain ${chainId}`);\n }\n\n const feeBps = getNftFeeBps(chainId);\n const feeAmount = calculateFee(params.priceWei, feeBps, true); // Ceiling division for ERC20s\n const endTime = BigInt(params.expirationDate ?? getDefaultExpiration());\n const feeCollector = getFeeCollectorAddress(chainId);\n\n const consideration = [\n {\n itemType: ItemType.ERC20,\n token: params.tokenAddress,\n identifierOrCriteria: BigInt(0),\n startAmount: params.tokenAmount,\n endAmount: params.tokenAmount,\n recipient: params.offerer,\n },\n ];\n\n if (feeAmount > BigInt(0)) {\n consideration.push({\n itemType: ItemType.ERC20,\n token: weth.address,\n identifierOrCriteria: BigInt(0),\n startAmount: feeAmount,\n endAmount: feeAmount,\n recipient: feeCollector,\n });\n }\n\n const orderParameters: SeaportOrderParameters = {\n offerer: params.offerer,\n zone: NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS,\n offer: [\n {\n itemType: ItemType.ERC20,\n token: weth.address,\n identifierOrCriteria: BigInt(0),\n startAmount: params.priceWei,\n endAmount: params.priceWei,\n },\n ],\n consideration,\n orderType: OrderType.FULL_RESTRICTED,\n startTime: BigInt(0),\n endTime,\n zoneHash: ZERO_BYTES32,\n salt: generateSalt(),\n conduitKey: ZERO_BYTES32,\n totalOriginalConsiderationItems: BigInt(consideration.length),\n };\n\n return { orderParameters, counter };\n}\n\n/**\n * Build order components for an ERC20 listing (selling ERC20 tokens for native currency).\n *\n * Offer: ERC20 tokens\n * Consideration: native currency payment to offerer + optional fee to feeCollector\n */\nexport function buildErc20ListingOrderComponents(\n params: CreateErc20ListingParams & { offerer: `0x${string}`; targetFulfiller?: `0x${string}` },\n chainId: number,\n counter: bigint\n): { orderParameters: SeaportOrderParameters; counter: bigint } {\n const feeBps = getNftFeeBps(chainId);\n const feeAmount = calculateFee(params.priceWei, feeBps, true); // Ceiling division for ERC20s\n const sellerAmount = params.priceWei - feeAmount;\n const endTime = BigInt(params.expirationDate ?? getDefaultExpiration());\n const feeCollector = getFeeCollectorAddress(chainId);\n\n const consideration = [\n {\n itemType: ItemType.NATIVE,\n token: ZERO_ADDRESS as `0x${string}`,\n identifierOrCriteria: BigInt(0),\n startAmount: sellerAmount,\n endAmount: sellerAmount,\n recipient: params.offerer,\n },\n ];\n\n if (feeAmount > BigInt(0)) {\n consideration.push({\n itemType: ItemType.NATIVE,\n token: ZERO_ADDRESS as `0x${string}`,\n identifierOrCriteria: BigInt(0),\n startAmount: feeAmount,\n endAmount: feeAmount,\n recipient: feeCollector,\n });\n }\n\n // Private order support\n let zone: `0x${string}`;\n let zoneHash: `0x${string}`;\n\n if (params.targetFulfiller) {\n zone = NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS;\n // zoneHash is keccak256 of the raw address bytes (20 bytes)\n zoneHash = keccak256(toBytes(params.targetFulfiller));\n } else {\n zone = NET_SEAPORT_ZONE_ADDRESS;\n zoneHash = ZERO_BYTES32;\n }\n\n const orderParameters: SeaportOrderParameters = {\n offerer: params.offerer,\n zone,\n offer: [\n {\n itemType: ItemType.ERC20,\n token: params.tokenAddress,\n identifierOrCriteria: BigInt(0),\n startAmount: params.tokenAmount,\n endAmount: params.tokenAmount,\n },\n ],\n consideration,\n orderType: OrderType.FULL_RESTRICTED,\n startTime: BigInt(0),\n endTime,\n zoneHash,\n salt: generateSalt(),\n conduitKey: ZERO_BYTES32,\n totalOriginalConsiderationItems: BigInt(consideration.length),\n };\n\n return { orderParameters, counter };\n}\n\n/**\n * Build EIP-712 typed data for a Seaport order.\n *\n * The message object uses `counter` instead of `totalOriginalConsiderationItems`,\n * matching Seaport's EIP-712 domain specification.\n */\nexport function buildEIP712OrderData(\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n chainId: number,\n seaportAddress: `0x${string}`\n): EIP712OrderData {\n // Build the EIP-712 message: OrderComponents (parameters without totalOriginalConsiderationItems, with counter)\n const message: Record<string, unknown> = {\n offerer: orderParameters.offerer,\n zone: orderParameters.zone,\n offer: orderParameters.offer.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n })),\n consideration: orderParameters.consideration.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n recipient: item.recipient,\n })),\n orderType: orderParameters.orderType,\n startTime: orderParameters.startTime,\n endTime: orderParameters.endTime,\n zoneHash: orderParameters.zoneHash,\n salt: orderParameters.salt,\n conduitKey: orderParameters.conduitKey,\n counter,\n };\n\n return {\n domain: {\n name: SEAPORT_EIP712_DOMAIN_NAME,\n version: SEAPORT_EIP712_DOMAIN_VERSION,\n chainId,\n verifyingContract: seaportAddress,\n },\n types: SEAPORT_ORDER_EIP712_TYPES as unknown as Record<string, Array<{ name: string; type: string }>>,\n primaryType: \"OrderComponents\",\n message,\n orderParameters,\n counter,\n };\n}\n\n/**\n * Build a submit transaction for a Bazaar contract (NFT listings, collection offers, ERC20 offers/listings).\n *\n * @param contractAddress - The Bazaar contract address to submit to\n * @param abi - The contract ABI (BAZAAR_V2_ABI, BAZAAR_COLLECTION_OFFERS_ABI, or BAZAAR_ERC20_OFFERS_ABI)\n * @param orderParameters - The signed order parameters\n * @param counter - The order counter\n * @param signature - The EIP-712 signature from the offerer\n */\nexport function buildSubmitOrderTx(\n contractAddress: `0x${string}`,\n abi: readonly unknown[],\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n signature: `0x${string}`\n): WriteTransactionConfig {\n const submission = {\n parameters: {\n offerer: orderParameters.offerer,\n zone: orderParameters.zone,\n offer: orderParameters.offer.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n })),\n consideration: orderParameters.consideration.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n recipient: item.recipient,\n })),\n orderType: orderParameters.orderType,\n startTime: orderParameters.startTime,\n endTime: orderParameters.endTime,\n zoneHash: orderParameters.zoneHash,\n salt: orderParameters.salt,\n conduitKey: orderParameters.conduitKey,\n totalOriginalConsiderationItems: orderParameters.totalOriginalConsiderationItems,\n },\n counter,\n signature,\n };\n\n return {\n to: contractAddress,\n functionName: \"submit\",\n args: [submission],\n abi,\n };\n}\n","/**\n * BazaarClient - Client for interacting with Net Bazaar\n *\n * Provides methods for:\n * - Reading NFT listings and collection offers\n * - Preparing transactions for creating/canceling listings and offers\n */\n\nimport { PublicClient, createPublicClient, defineChain, http, type Abi } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { NetClient, NetMessage } from \"@net-protocol/core\";\nimport {\n Listing,\n CollectionOffer,\n Erc20Offer,\n Erc20Listing,\n Sale,\n GetListingsOptions,\n GetCollectionOffersOptions,\n GetErc20OffersOptions,\n GetErc20ListingsOptions,\n GetSalesOptions,\n SeaportOrderStatus,\n WriteTransactionConfig,\n SeaportOrderComponents,\n SeaportOrderParameters,\n PreparedFulfillment,\n PreparedOrder,\n CreateListingParams,\n CreateCollectionOfferParams,\n CreateErc20OfferParams,\n CreateErc20ListingParams,\n} from \"../types\";\nimport {\n SEAPORT_CANCEL_ABI,\n SEAPORT_GET_COUNTER_ABI,\n BAZAAR_V2_ABI,\n BAZAAR_COLLECTION_OFFERS_ABI,\n BAZAAR_ERC20_OFFERS_ABI,\n} from \"../abis\";\nimport {\n getBazaarChainConfig,\n getBazaarAddress,\n getCollectionOffersAddress,\n getErc20OffersAddress,\n getErc20BazaarAddress,\n getSeaportAddress,\n getWrappedNativeCurrency,\n isBazaarSupportedOnChain,\n NET_SEAPORT_ZONE_ADDRESS,\n} from \"../chainConfig\";\nimport {\n parseListingFromMessage,\n parseCollectionOfferFromMessage,\n parseErc20OfferFromMessage,\n parseErc20ListingFromMessage,\n parseSaleFromStoredData,\n getBestListingPerToken,\n sortListingsByPrice,\n sortOffersByPrice,\n sortErc20OffersByPricePerToken,\n sortErc20ListingsByPricePerToken,\n createSeaportInstance,\n computeOrderHash,\n getSeaportOrderFromMessageData,\n getOrderStatusFromInfo,\n decodeSeaportSubmission,\n} from \"../utils\";\nimport {\n bulkFetchOrderStatuses,\n bulkFetchNftOwners,\n bulkFetchErc20Balances,\n isListingValid,\n isCollectionOfferValid,\n isErc20OfferValid,\n isErc20ListingValid,\n} from \"../utils/validation\";\nimport { STORAGE_CONTRACT } from \"@net-protocol/storage\";\nimport { checkErc721Approval, checkErc20Approval } from \"../utils/approvals\";\nimport {\n buildFulfillListingTx,\n buildFulfillCollectionOfferTx,\n buildFulfillErc20OfferTx,\n buildFulfillErc20ListingTx,\n} from \"../utils/fulfillment\";\nimport {\n buildListingOrderComponents,\n buildCollectionOfferOrderComponents,\n buildErc20OfferOrderComponents,\n buildErc20ListingOrderComponents,\n buildEIP712OrderData,\n buildSubmitOrderTx,\n} from \"../utils/orderCreation\";\n\n// ERC721TokenOwnerRangeHelper contract (deployed via CREATE2, same address on all chains)\nconst ERC721_TOKEN_OWNER_RANGE_HELPER_ADDRESS = \"0x00000000f4ec2016d6e856b0cb14d635949bfd3f\" as const;\n\nconst ERC721_TOKEN_OWNER_RANGE_HELPER_ABI = [\n {\n inputs: [\n { name: \"nftContract\", type: \"address\" },\n { name: \"user\", type: \"address\" },\n { name: \"startTokenId\", type: \"uint256\" },\n { name: \"endTokenId\", type: \"uint256\" },\n ],\n name: \"getOwnedTokensInRange\",\n outputs: [{ name: \"\", type: \"uint256[]\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n// Batch size for owned token queries (matches website)\nconst OWNED_TOKENS_BATCH_SIZE = 5000n;\n\n// Default RPC URLs for chains (same as @net-protocol/core)\nconst CHAIN_RPC_URLS: Record<number, string[]> = {\n 8453: [\"https://base-mainnet.public.blastapi.io\", \"https://mainnet.base.org\"],\n 84532: [\"https://sepolia.base.org\"],\n 666666666: [\"https://rpc.degen.tips\"],\n 5112: [\"https://rpc.ham.fun\"],\n 57073: [\"https://rpc-qnd.inkonchain.com\"],\n 130: [\"https://mainnet.unichain.org\"],\n 999: [\"https://rpc.hyperliquid.xyz/evm\"],\n 9745: [\"https://rpc.plasma.to\"],\n 143: [\"https://rpc3.monad.xyz\"],\n};\n\nexport class BazaarClient {\n private chainId: number;\n private client: PublicClient;\n private netClient: NetClient;\n private rpcUrl: string;\n\n constructor(params: { chainId: number; rpcUrl?: string; publicClient?: PublicClient }) {\n if (!isBazaarSupportedOnChain(params.chainId)) {\n throw new Error(`Bazaar is not supported on chain ${params.chainId}`);\n }\n\n this.chainId = params.chainId;\n this.rpcUrl = params.rpcUrl || CHAIN_RPC_URLS[params.chainId]?.[0] || \"\";\n\n if (params.publicClient) {\n this.client = params.publicClient;\n } else {\n if (!this.rpcUrl) {\n throw new Error(`No RPC URL available for chain ${params.chainId}`);\n }\n\n const config = getBazaarChainConfig(params.chainId)!;\n\n this.client = createPublicClient({\n chain: defineChain({\n id: params.chainId,\n name: `Chain ${params.chainId}`,\n nativeCurrency: {\n name: config.wrappedNativeCurrency.name.replace(\"Wrapped \", \"\"),\n symbol: config.currencySymbol.toUpperCase(),\n decimals: 18,\n },\n rpcUrls: {\n default: { http: [this.rpcUrl] },\n },\n }),\n transport: http(this.rpcUrl),\n batch: { multicall: true },\n });\n }\n\n this.netClient = new NetClient({\n chainId: params.chainId,\n overrides: params.rpcUrl ? { rpcUrls: [params.rpcUrl] } : undefined,\n });\n }\n\n /**\n * Get valid NFT listings for a collection\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller still owns the NFT\n *\n * Results are deduplicated (one per token) and sorted by price (lowest first)\n */\n async getListings(options: GetListingsOptions): Promise<Listing[]> {\n const { nftAddress, excludeMaker, maker, maxMessages = 200 } = options;\n const bazaarAddress = getBazaarAddress(this.chainId);\n\n const filter = {\n appAddress: bazaarAddress,\n topic: nftAddress?.toLowerCase(),\n maker,\n };\n\n let startIndex: number;\n let endIndex: number;\n\n if (options.startIndex != null && options.endIndex != null) {\n startIndex = options.startIndex;\n endIndex = options.endIndex;\n } else {\n // Get message count\n const count = await this.netClient.getMessageCount({ filter });\n if (count === 0) {\n return [];\n }\n startIndex = Math.max(0, count - maxMessages);\n endIndex = count;\n }\n\n // Fetch messages (most recent)\n const messages = await this.netClient.getMessages({\n filter,\n startIndex,\n endIndex,\n });\n\n return this.processListingsFromMessages(messages, options);\n }\n\n /**\n * Process pre-fetched messages into valid NFT listings.\n *\n * Use this when messages have already been fetched (e.g. via useNetMessages)\n * to avoid redundant RPC calls.\n */\n async processListingsFromMessages(\n messages: NetMessage[],\n options: Pick<GetListingsOptions, \"nftAddress\" | \"excludeMaker\" | \"includeExpired\">\n ): Promise<Listing[]> {\n const { nftAddress, excludeMaker, includeExpired = false } = options;\n const tag = `[BazaarClient.processListings chain=${this.chainId}]`;\n\n // Parse messages into listings\n let listings: Listing[] = [];\n for (const message of messages) {\n const listing = parseListingFromMessage(message, this.chainId);\n if (!listing) continue;\n\n // Filter by excludeMaker\n if (excludeMaker && listing.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n listings.push(listing);\n }\n\n console.log(tag, `parsed ${listings.length}/${messages.length} messages into listings`);\n\n if (listings.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const listing of listings) {\n const order = getSeaportOrderFromMessageData(listing.messageData);\n listing.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = listings.map((l) => l.orderHash as `0x${string}`);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n listings.forEach((listing, index) => {\n const statusInfo = statusInfos[index];\n listing.orderStatus = getOrderStatusFromInfo(listing.orderComponents!, statusInfo);\n });\n\n // Log status distribution before filtering\n const statusCounts: Record<string, number> = {};\n const now = Math.floor(Date.now() / 1000);\n let expiredCount = 0;\n for (const l of listings) {\n statusCounts[l.orderStatus] = (statusCounts[l.orderStatus] || 0) + 1;\n if (l.expirationDate <= now) expiredCount++;\n }\n console.log(tag, `order statuses:`, statusCounts, `expired: ${expiredCount}`);\n\n // Filter by order status: keep OPEN (and optionally EXPIRED) listings\n listings = listings.filter(\n (l) =>\n (l.orderStatus === SeaportOrderStatus.OPEN && l.expirationDate > now) ||\n (includeExpired && l.orderStatus === SeaportOrderStatus.EXPIRED)\n );\n\n console.log(tag, `after status filter: ${listings.length} (OPEN${includeExpired ? ' + EXPIRED' : ''})`);\n\n if (listings.length === 0) {\n return [];\n }\n\n // Validate ownership (only for OPEN listings; expired listings skip ownership check)\n const openListings = listings.filter((l) => l.orderStatus === SeaportOrderStatus.OPEN);\n const expiredListings = includeExpired ? listings.filter((l) => l.orderStatus === SeaportOrderStatus.EXPIRED) : [];\n\n let validOpenListings: Listing[];\n const beforeOwnership = openListings.length;\n\n if (nftAddress) {\n // Single collection: one bulkFetchNftOwners call\n const tokenIds = openListings.map((l) => l.tokenId);\n const owners = await bulkFetchNftOwners(this.client, nftAddress, tokenIds);\n\n validOpenListings = openListings.filter((listing, index) => {\n const owner = owners[index];\n return isListingValid(\n listing.orderStatus,\n listing.expirationDate,\n listing.maker,\n owner\n );\n });\n } else {\n // Cross-collection: group by nftAddress, fetch owners per group in parallel\n const groups = new Map<string, Listing[]>();\n for (const listing of openListings) {\n const key = listing.nftAddress.toLowerCase();\n const group = groups.get(key);\n if (group) {\n group.push(listing);\n } else {\n groups.set(key, [listing]);\n }\n }\n\n const groupEntries = Array.from(groups.entries());\n const ownerResults = await Promise.all(\n groupEntries.map(([addr, groupListings]) =>\n bulkFetchNftOwners(\n this.client,\n addr as `0x${string}`,\n groupListings.map((l) => l.tokenId)\n )\n )\n );\n\n validOpenListings = [];\n groupEntries.forEach(([, groupListings], groupIndex) => {\n const owners = ownerResults[groupIndex];\n for (let i = 0; i < groupListings.length; i++) {\n const listing = groupListings[i];\n if (\n isListingValid(\n listing.orderStatus,\n listing.expirationDate,\n listing.maker,\n owners[i]\n )\n ) {\n validOpenListings.push(listing);\n }\n }\n });\n }\n\n console.log(tag, `after ownership filter: ${validOpenListings.length}/${beforeOwnership} (${beforeOwnership - validOpenListings.length} dropped)`);\n\n // Deduplicate open listings (best price per token), sort by price\n const dedupedOpen = sortListingsByPrice(getBestListingPerToken(validOpenListings));\n\n // For expired: only keep tokens that don't already have an active listing\n const activeTokenKeys = new Set(dedupedOpen.map((l) => `${l.nftAddress.toLowerCase()}-${l.tokenId}`));\n const uniqueExpired = getBestListingPerToken(\n expiredListings.filter((l) => !activeTokenKeys.has(`${l.nftAddress.toLowerCase()}-${l.tokenId}`))\n );\n const sortedExpired = sortListingsByPrice(uniqueExpired);\n\n // Active listings first (by price), then expired listings after\n const result = [...dedupedOpen, ...sortedExpired];\n console.log(tag, `final: ${result.length} listings (${dedupedOpen.length} open, ${sortedExpired.length} expired)`);\n return result;\n }\n\n /**\n * Get valid collection offers for a collection\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price (highest first)\n */\n async getCollectionOffers(options: GetCollectionOffersOptions): Promise<CollectionOffer[]> {\n const { nftAddress, excludeMaker, maxMessages = 100 } = options;\n const collectionOffersAddress = getCollectionOffersAddress(this.chainId);\n\n // Get message count\n const count = await this.netClient.getMessageCount({\n filter: {\n appAddress: collectionOffersAddress,\n topic: nftAddress?.toLowerCase(),\n },\n });\n\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter: {\n appAddress: collectionOffersAddress,\n topic: nftAddress?.toLowerCase(),\n },\n startIndex,\n endIndex: count,\n });\n\n return this.processCollectionOffersFromMessages(messages, options);\n }\n\n /**\n * Process pre-fetched messages into valid collection offers.\n *\n * Use this when messages have already been fetched (e.g. via useNetMessages)\n * to avoid redundant RPC calls.\n */\n async processCollectionOffersFromMessages(\n messages: NetMessage[],\n options: Pick<GetCollectionOffersOptions, \"nftAddress\" | \"excludeMaker\">\n ): Promise<CollectionOffer[]> {\n const { nftAddress, excludeMaker } = options;\n const tag = `[BazaarClient.processCollectionOffers chain=${this.chainId}]`;\n const weth = getWrappedNativeCurrency(this.chainId);\n\n if (!weth) {\n return [];\n }\n\n // Parse messages into offers\n let offers: CollectionOffer[] = [];\n for (const message of messages) {\n const offer = parseCollectionOfferFromMessage(message, this.chainId);\n if (!offer) continue;\n\n // Validate WETH token matches\n const order = getSeaportOrderFromMessageData(offer.messageData);\n const offerToken = order.parameters.offer?.[0]?.token?.toLowerCase();\n if (offerToken !== weth.address.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && offer.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n offers.push(offer);\n }\n\n console.log(tag, `parsed ${offers.length}/${messages.length} messages into offers`);\n\n if (offers.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const offer of offers) {\n const order = getSeaportOrderFromMessageData(offer.messageData);\n offer.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = offers.map((o) => o.orderHash as `0x${string}`);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n offers.forEach((offer, index) => {\n const statusInfo = statusInfos[index];\n offer.orderStatus = getOrderStatusFromInfo(offer.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n const now = Math.floor(Date.now() / 1000);\n offers = offers.filter(\n (o) =>\n o.orderStatus === SeaportOrderStatus.OPEN &&\n o.expirationDate > now\n );\n\n console.log(tag, `after status filter: ${offers.length} OPEN & not expired`);\n\n if (offers.length === 0) {\n return [];\n }\n\n // Validate WETH balances\n const uniqueMakers = [...new Set(offers.map((o) => o.maker))];\n const balances = await bulkFetchErc20Balances(this.client, weth.address, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to offers where buyer has sufficient balance\n const beforeBalance = offers.length;\n offers = offers.filter((offer) => {\n const balance = balanceMap.get(offer.maker.toLowerCase()) || BigInt(0);\n return isCollectionOfferValid(\n offer.orderStatus,\n offer.expirationDate,\n offer.priceWei,\n balance\n );\n });\n\n console.log(tag, `after balance filter: ${offers.length}/${beforeBalance} (${beforeBalance - offers.length} dropped)`);\n\n // Sort by price (highest first)\n return sortOffersByPrice(offers);\n }\n\n /**\n * Get valid ERC20 offers for a token\n *\n * ERC20 offers are only available on Base (8453) and HyperEVM (999).\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price per token (highest first)\n */\n async getErc20Offers(options: GetErc20OffersOptions): Promise<Erc20Offer[]> {\n const { tokenAddress, excludeMaker, maxMessages = 200 } = options;\n const erc20OffersAddress = getErc20OffersAddress(this.chainId);\n\n // ERC20 offers only available on Base and HyperEVM\n if (!erc20OffersAddress) {\n return [];\n }\n\n // Get message count\n const count = await this.netClient.getMessageCount({\n filter: {\n appAddress: erc20OffersAddress,\n topic: tokenAddress.toLowerCase(),\n },\n });\n\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter: {\n appAddress: erc20OffersAddress,\n topic: tokenAddress.toLowerCase(),\n },\n startIndex,\n endIndex: count,\n });\n\n return this.processErc20OffersFromMessages(messages, options);\n }\n\n /**\n * Process pre-fetched messages into valid ERC20 offers.\n *\n * Use this when messages have already been fetched (e.g. via useNetMessages)\n * to avoid redundant RPC calls.\n */\n async processErc20OffersFromMessages(\n messages: NetMessage[],\n options: Pick<GetErc20OffersOptions, \"tokenAddress\" | \"excludeMaker\">\n ): Promise<Erc20Offer[]> {\n const { tokenAddress, excludeMaker } = options;\n const tag = `[BazaarClient.processErc20Offers chain=${this.chainId}]`;\n const weth = getWrappedNativeCurrency(this.chainId);\n\n if (!weth) {\n return [];\n }\n\n // Parse messages into offers\n let offers: Erc20Offer[] = [];\n for (const message of messages) {\n const offer = parseErc20OfferFromMessage(message, this.chainId);\n if (!offer) continue;\n\n // Validate WETH token matches\n const order = getSeaportOrderFromMessageData(offer.messageData);\n const offerToken = order.parameters.offer?.[0]?.token?.toLowerCase();\n if (offerToken !== weth.address.toLowerCase()) {\n continue;\n }\n\n // Validate the consideration token matches the requested token\n if (offer.tokenAddress.toLowerCase() !== tokenAddress.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && offer.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n offers.push(offer);\n }\n\n console.log(tag, `parsed ${offers.length}/${messages.length} messages into offers`);\n\n if (offers.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const offer of offers) {\n const order = getSeaportOrderFromMessageData(offer.messageData);\n offer.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = offers.map((o) => o.orderHash);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n offers.forEach((offer, index) => {\n const statusInfo = statusInfos[index];\n offer.orderStatus = getOrderStatusFromInfo(offer.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n const now = Math.floor(Date.now() / 1000);\n offers = offers.filter(\n (o) =>\n o.orderStatus === SeaportOrderStatus.OPEN &&\n o.expirationDate > now\n );\n\n console.log(tag, `after status filter: ${offers.length} OPEN & not expired`);\n\n if (offers.length === 0) {\n return [];\n }\n\n // Validate WETH balances\n const uniqueMakers = [...new Set(offers.map((o) => o.maker))];\n const balances = await bulkFetchErc20Balances(this.client, weth.address, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to offers where buyer has sufficient balance\n const beforeBalance = offers.length;\n offers = offers.filter((offer) => {\n const balance = balanceMap.get(offer.maker.toLowerCase()) || BigInt(0);\n return isErc20OfferValid(\n offer.orderStatus,\n offer.expirationDate,\n offer.priceWei,\n balance\n );\n });\n\n console.log(tag, `after balance filter: ${offers.length}/${beforeBalance} (${beforeBalance - offers.length} dropped)`);\n\n // Sort by price per token (highest first) - no deduplication for ERC20 offers\n return sortErc20OffersByPricePerToken(offers);\n }\n\n /**\n * Get valid ERC20 listings for a token\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n *\n * Results are sorted by price per token (lowest first). No deduplication —\n * all valid listings are returned (grouped by maker in the UI).\n */\n async getErc20Listings(options: GetErc20ListingsOptions): Promise<Erc20Listing[]> {\n const { tokenAddress, excludeMaker, maker, maxMessages = 200 } = options;\n const erc20BazaarAddress = getErc20BazaarAddress(this.chainId);\n\n const filter = {\n appAddress: erc20BazaarAddress,\n topic: tokenAddress.toLowerCase(),\n maker,\n };\n\n let startIndex: number;\n let endIndex: number;\n\n if (options.startIndex != null && options.endIndex != null) {\n startIndex = options.startIndex;\n endIndex = options.endIndex;\n } else {\n // Get message count\n const count = await this.netClient.getMessageCount({ filter });\n if (count === 0) {\n return [];\n }\n startIndex = Math.max(0, count - maxMessages);\n endIndex = count;\n }\n\n // Fetch messages (most recent)\n const messages = await this.netClient.getMessages({\n filter,\n startIndex,\n endIndex,\n });\n\n return this.processErc20ListingsFromMessages(messages, options);\n }\n\n /**\n * Process pre-fetched messages into valid ERC20 listings.\n *\n * Use this when messages have already been fetched (e.g. via useNetMessages)\n * to avoid redundant RPC calls.\n */\n async processErc20ListingsFromMessages(\n messages: NetMessage[],\n options: Pick<GetErc20ListingsOptions, \"tokenAddress\" | \"excludeMaker\">\n ): Promise<Erc20Listing[]> {\n const { tokenAddress, excludeMaker } = options;\n const tag = `[BazaarClient.processErc20Listings chain=${this.chainId}]`;\n\n // Parse messages into listings\n let listings: Erc20Listing[] = [];\n for (const message of messages) {\n const listing = parseErc20ListingFromMessage(message, this.chainId);\n if (!listing) continue;\n\n // Validate the offer token matches the requested token\n if (listing.tokenAddress.toLowerCase() !== tokenAddress.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && listing.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n listings.push(listing);\n }\n\n console.log(tag, `parsed ${listings.length}/${messages.length} messages into listings`);\n\n if (listings.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const listing of listings) {\n const order = getSeaportOrderFromMessageData(listing.messageData);\n listing.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = listings.map((l) => l.orderHash);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n listings.forEach((listing, index) => {\n const statusInfo = statusInfos[index];\n listing.orderStatus = getOrderStatusFromInfo(listing.orderComponents!, statusInfo);\n });\n\n // Log status distribution before filtering\n const statusCounts: Record<string, number> = {};\n const now = Math.floor(Date.now() / 1000);\n let expiredCount = 0;\n for (const l of listings) {\n statusCounts[l.orderStatus] = (statusCounts[l.orderStatus] || 0) + 1;\n if (l.expirationDate <= now) expiredCount++;\n }\n console.log(tag, `order statuses:`, statusCounts, `expired: ${expiredCount}`);\n\n // Filter to OPEN orders only\n listings = listings.filter(\n (l) =>\n l.orderStatus === SeaportOrderStatus.OPEN &&\n l.expirationDate > now\n );\n\n console.log(tag, `after status filter: ${listings.length} OPEN & not expired`);\n\n if (listings.length === 0) {\n return [];\n }\n\n // Validate seller's ERC20 balances\n const uniqueMakers = [...new Set(listings.map((l) => l.maker))];\n const balances = await bulkFetchErc20Balances(this.client, tokenAddress, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to listings where seller has sufficient token balance\n const beforeBalance = listings.length;\n listings = listings.filter((listing) => {\n const balance = balanceMap.get(listing.maker.toLowerCase()) || BigInt(0);\n return isErc20ListingValid(\n listing.orderStatus,\n listing.expirationDate,\n listing.tokenAmount,\n balance\n );\n });\n\n console.log(tag, `after balance filter: ${listings.length}/${beforeBalance} (${beforeBalance - listings.length} dropped)`);\n\n // Sort by price per token (lowest first) — no deduplication for ERC20 listings\n return sortErc20ListingsByPricePerToken(listings);\n }\n\n /**\n * Get recent sales for a collection\n *\n * Sales are stored differently from listings: Net messages contain order hashes,\n * and the actual sale data is fetched from the bulk storage contract.\n *\n * Results are sorted by timestamp (most recent first)\n */\n async getSales(options: GetSalesOptions): Promise<Sale[]> {\n const { nftAddress, maxMessages = 100 } = options;\n\n const filter = {\n appAddress: NET_SEAPORT_ZONE_ADDRESS as `0x${string}`,\n topic: nftAddress.toLowerCase(),\n };\n\n // Get message count\n const count = await this.netClient.getMessageCount({ filter });\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter,\n startIndex,\n endIndex: count,\n });\n\n return this.processSalesFromMessages(messages, options);\n }\n\n /**\n * Process pre-fetched messages into sales.\n *\n * Each message's data field contains an order hash. The actual sale data\n * is fetched from the bulk storage contract using these order hashes.\n */\n async processSalesFromMessages(\n messages: NetMessage[],\n options: Pick<GetSalesOptions, \"nftAddress\">\n ): Promise<Sale[]> {\n const tag = `[BazaarClient.processSales chain=${this.chainId}]`;\n\n if (messages.length === 0) {\n return [];\n }\n\n // Extract order hashes from message data\n const orderHashes = messages.map((m) => m.data);\n console.log(tag, `fetching ${orderHashes.length} sale details from storage...`);\n\n // Build bulk storage keys: each keyed by order hash, operator = zone address\n const bulkKeys = orderHashes.map((hash) => ({\n key: hash as `0x${string}`,\n operator: NET_SEAPORT_ZONE_ADDRESS as `0x${string}`,\n }));\n\n // Fetch sale data from bulk storage contract\n let storedResults: readonly { text: string; value: string }[];\n try {\n storedResults = await this.client.readContract({\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"bulkGet\",\n args: [bulkKeys],\n }) as readonly { text: string; value: string }[];\n } catch (err) {\n console.error(tag, \"bulk storage fetch failed:\", err);\n return [];\n }\n\n // Parse each stored result into a Sale\n const sales: Sale[] = [];\n for (const result of storedResults) {\n if (!result.value || result.value === \"0x\") continue;\n const sale = parseSaleFromStoredData(result.value, this.chainId);\n if (sale) {\n sales.push(sale);\n }\n }\n\n console.log(tag, `parsed ${sales.length}/${storedResults.length} sales`);\n\n return sales;\n }\n\n /**\n * Get the chain ID this client is configured for\n */\n getChainId(): number {\n return this.chainId;\n }\n\n /**\n * Get the bazaar contract address for this chain\n */\n getBazaarAddress(): `0x${string}` {\n return getBazaarAddress(this.chainId);\n }\n\n /**\n * Get the collection offers contract address for this chain\n */\n getCollectionOffersAddress(): `0x${string}` {\n return getCollectionOffersAddress(this.chainId);\n }\n\n /**\n * Get the ERC20 offers contract address for this chain\n * Only available on Base (8453) and HyperEVM (999)\n */\n getErc20OffersAddress(): `0x${string}` | undefined {\n return getErc20OffersAddress(this.chainId);\n }\n\n /**\n * Get the ERC20 bazaar (listings) contract address for this chain\n */\n getErc20BazaarAddress(): `0x${string}` {\n return getErc20BazaarAddress(this.chainId);\n }\n\n /**\n * Get the Seaport contract address for this chain\n */\n getSeaportAddress(): `0x${string}` {\n return getSeaportAddress(this.chainId);\n }\n\n /**\n * Prepare a transaction to cancel a listing\n *\n * The listing must have been created by the caller.\n * Use the orderComponents from the Listing object returned by getListings().\n */\n prepareCancelListing(listing: Listing): WriteTransactionConfig {\n if (!listing.orderComponents) {\n throw new Error(\"Listing does not have order components\");\n }\n\n return this.prepareCancelOrder(listing.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel a collection offer\n *\n * The offer must have been created by the caller.\n * Use the orderComponents from the CollectionOffer object returned by getCollectionOffers().\n */\n prepareCancelCollectionOffer(offer: CollectionOffer): WriteTransactionConfig {\n if (!offer.orderComponents) {\n throw new Error(\"Offer does not have order components\");\n }\n\n return this.prepareCancelOrder(offer.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel an ERC20 listing\n *\n * The listing must have been created by the caller.\n * Use the orderComponents from the Erc20Listing object returned by getErc20Listings().\n */\n prepareCancelErc20Listing(listing: Erc20Listing): WriteTransactionConfig {\n if (!listing.orderComponents) {\n throw new Error(\"Listing does not have order components\");\n }\n\n return this.prepareCancelOrder(listing.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel a Seaport order\n *\n * This is a low-level method. Prefer prepareCancelListing or prepareCancelCollectionOffer.\n */\n prepareCancelOrder(orderComponents: SeaportOrderComponents): WriteTransactionConfig {\n const seaportAddress = getSeaportAddress(this.chainId);\n\n // Convert order components to the format expected by Seaport\n const orderForCancel = {\n offerer: orderComponents.offerer,\n zone: orderComponents.zone,\n offer: orderComponents.offer.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n })),\n consideration: orderComponents.consideration.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n recipient: item.recipient,\n })),\n orderType: orderComponents.orderType,\n startTime: orderComponents.startTime,\n endTime: orderComponents.endTime,\n zoneHash: orderComponents.zoneHash,\n salt: orderComponents.salt,\n conduitKey: orderComponents.conduitKey,\n counter: orderComponents.counter,\n };\n\n return {\n to: seaportAddress,\n functionName: \"cancel\",\n args: [[orderForCancel]],\n abi: SEAPORT_CANCEL_ABI,\n };\n }\n\n // ─── Fulfillment Methods ───────────────────────────────────────────\n\n /**\n * Prepare a fulfillment for an NFT listing (buy an NFT).\n *\n * Returns approval transactions (if the listing requires ERC20 payment) and\n * the Seaport `fulfillAdvancedOrder` transaction with the correct native currency value.\n */\n async prepareFulfillListing(\n listing: Listing,\n fulfillerAddress: `0x${string}`\n ): Promise<PreparedFulfillment> {\n const submission = decodeSeaportSubmission(listing.messageData);\n const seaportAddress = getSeaportAddress(this.chainId);\n const fulfillment = buildFulfillListingTx(submission, fulfillerAddress, seaportAddress);\n\n // NFT listings paid in native currency don't need ERC20 approvals from the buyer\n return { approvals: [], fulfillment };\n }\n\n /**\n * Prepare a fulfillment for a collection offer (sell your NFT into an offer).\n *\n * Returns ERC721 approval transaction (if the NFT isn't approved for Seaport)\n * and the Seaport `fulfillAdvancedOrder` transaction.\n */\n async prepareFulfillCollectionOffer(\n offer: CollectionOffer,\n tokenId: string,\n fulfillerAddress: `0x${string}`\n ): Promise<PreparedFulfillment> {\n const submission = decodeSeaportSubmission(offer.messageData);\n const seaportAddress = getSeaportAddress(this.chainId);\n\n // Check ERC721 approval (fulfiller needs to approve Seaport to transfer their NFT)\n const approvals: WriteTransactionConfig[] = [];\n const nftApproval = await checkErc721Approval(\n this.client,\n offer.nftAddress,\n fulfillerAddress,\n seaportAddress\n );\n if (nftApproval) {\n approvals.push(nftApproval);\n }\n\n const fulfillment = buildFulfillCollectionOfferTx(\n submission,\n BigInt(tokenId),\n fulfillerAddress,\n seaportAddress\n );\n\n return { approvals, fulfillment };\n }\n\n /**\n * Prepare a fulfillment for an ERC20 offer (sell your ERC20 tokens into an offer).\n *\n * Returns ERC20 approval transaction (if the token isn't approved for Seaport)\n * and the Seaport `fulfillOrder` transaction.\n */\n async prepareFulfillErc20Offer(\n offer: Erc20Offer,\n fulfillerAddress: `0x${string}`\n ): Promise<PreparedFulfillment> {\n const submission = decodeSeaportSubmission(offer.messageData);\n const seaportAddress = getSeaportAddress(this.chainId);\n\n // Check ERC20 approval (fulfiller needs to approve Seaport for the token being sold)\n const approvals: WriteTransactionConfig[] = [];\n const tokenApproval = await checkErc20Approval(\n this.client,\n offer.tokenAddress,\n fulfillerAddress,\n seaportAddress,\n offer.tokenAmount\n );\n if (tokenApproval) {\n approvals.push(tokenApproval);\n }\n\n const fulfillment = buildFulfillErc20OfferTx(submission, seaportAddress);\n\n return { approvals, fulfillment };\n }\n\n /**\n * Prepare a fulfillment for an ERC20 listing (buy ERC20 tokens with native currency).\n *\n * Returns the Seaport `fulfillAdvancedOrder` transaction with the correct native currency value.\n * No approvals needed since the buyer pays in native currency.\n */\n async prepareFulfillErc20Listing(\n listing: Erc20Listing,\n fulfillerAddress: `0x${string}`\n ): Promise<PreparedFulfillment> {\n const submission = decodeSeaportSubmission(listing.messageData);\n const seaportAddress = getSeaportAddress(this.chainId);\n const fulfillment = buildFulfillErc20ListingTx(submission, fulfillerAddress, seaportAddress);\n\n return { approvals: [], fulfillment };\n }\n\n // ─── Order Creation Methods (Step 1: Build EIP-712 data) ──────────\n\n /**\n * Fetch the Seaport counter for an address\n */\n private async getSeaportCounter(offerer: `0x${string}`): Promise<bigint> {\n const seaportAddress = getSeaportAddress(this.chainId);\n const counter = await readContract(this.client, {\n address: seaportAddress,\n abi: SEAPORT_GET_COUNTER_ABI,\n functionName: \"getCounter\",\n args: [offerer],\n });\n return BigInt(counter as bigint);\n }\n\n /**\n * Prepare an NFT listing order for signing.\n *\n * Returns EIP-712 typed data for the caller to sign, plus any maker approvals needed\n * (ERC721 `setApprovalForAll` for Seaport).\n */\n async prepareCreateListing(\n params: CreateListingParams & { offerer: `0x${string}`; targetFulfiller?: `0x${string}` }\n ): Promise<PreparedOrder> {\n const seaportAddress = getSeaportAddress(this.chainId);\n const counter = await this.getSeaportCounter(params.offerer);\n\n const { orderParameters } = buildListingOrderComponents(params, this.chainId, counter);\n const eip712 = buildEIP712OrderData(orderParameters, counter, this.chainId, seaportAddress);\n\n // Check ERC721 approval\n const approvals: WriteTransactionConfig[] = [];\n const nftApproval = await checkErc721Approval(\n this.client,\n params.nftAddress,\n params.offerer,\n seaportAddress\n );\n if (nftApproval) {\n approvals.push(nftApproval);\n }\n\n return { eip712, approvals };\n }\n\n /**\n * Prepare a collection offer order for signing.\n *\n * Returns EIP-712 typed data for the caller to sign, plus any maker approvals needed\n * (WETH `approve` for Seaport).\n */\n async prepareCreateCollectionOffer(\n params: CreateCollectionOfferParams & { offerer: `0x${string}` }\n ): Promise<PreparedOrder> {\n const seaportAddress = getSeaportAddress(this.chainId);\n const weth = getWrappedNativeCurrency(this.chainId);\n if (!weth) {\n throw new Error(`No wrapped native currency configured for chain ${this.chainId}`);\n }\n\n const counter = await this.getSeaportCounter(params.offerer);\n\n const { orderParameters } = buildCollectionOfferOrderComponents(params, this.chainId, counter);\n const eip712 = buildEIP712OrderData(orderParameters, counter, this.chainId, seaportAddress);\n\n // Check WETH approval\n const approvals: WriteTransactionConfig[] = [];\n const wethApproval = await checkErc20Approval(\n this.client,\n weth.address,\n params.offerer,\n seaportAddress,\n params.priceWei\n );\n if (wethApproval) {\n approvals.push(wethApproval);\n }\n\n return { eip712, approvals };\n }\n\n /**\n * Prepare an ERC20 offer order for signing.\n *\n * Returns EIP-712 typed data for the caller to sign, plus any maker approvals needed\n * (WETH `approve` for Seaport).\n */\n async prepareCreateErc20Offer(\n params: CreateErc20OfferParams & { offerer: `0x${string}` }\n ): Promise<PreparedOrder> {\n const seaportAddress = getSeaportAddress(this.chainId);\n const weth = getWrappedNativeCurrency(this.chainId);\n if (!weth) {\n throw new Error(`No wrapped native currency configured for chain ${this.chainId}`);\n }\n\n const counter = await this.getSeaportCounter(params.offerer);\n\n const { orderParameters } = buildErc20OfferOrderComponents(params, this.chainId, counter);\n const eip712 = buildEIP712OrderData(orderParameters, counter, this.chainId, seaportAddress);\n\n // Check WETH approval\n const approvals: WriteTransactionConfig[] = [];\n const wethApproval = await checkErc20Approval(\n this.client,\n weth.address,\n params.offerer,\n seaportAddress,\n params.priceWei\n );\n if (wethApproval) {\n approvals.push(wethApproval);\n }\n\n return { eip712, approvals };\n }\n\n /**\n * Prepare an ERC20 listing order for signing.\n *\n * Returns EIP-712 typed data for the caller to sign, plus any maker approvals needed\n * (ERC20 `approve` for Seaport).\n */\n async prepareCreateErc20Listing(\n params: CreateErc20ListingParams & { offerer: `0x${string}`; targetFulfiller?: `0x${string}` }\n ): Promise<PreparedOrder> {\n const seaportAddress = getSeaportAddress(this.chainId);\n const counter = await this.getSeaportCounter(params.offerer);\n\n const { orderParameters } = buildErc20ListingOrderComponents(params, this.chainId, counter);\n const eip712 = buildEIP712OrderData(orderParameters, counter, this.chainId, seaportAddress);\n\n // Check ERC20 approval (seller needs to approve Seaport for the token being sold)\n const approvals: WriteTransactionConfig[] = [];\n const tokenApproval = await checkErc20Approval(\n this.client,\n params.tokenAddress,\n params.offerer,\n seaportAddress,\n params.tokenAmount\n );\n if (tokenApproval) {\n approvals.push(tokenApproval);\n }\n\n return { eip712, approvals };\n }\n\n // ─── Order Creation Methods (Step 2: Submit signed order) ─────────\n\n /**\n * Prepare a submit transaction for an NFT listing.\n *\n * Call this after the user has signed the EIP-712 data from prepareCreateListing().\n */\n prepareSubmitListing(\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n signature: `0x${string}`\n ): WriteTransactionConfig {\n return buildSubmitOrderTx(\n getBazaarAddress(this.chainId),\n BAZAAR_V2_ABI,\n orderParameters,\n counter,\n signature\n );\n }\n\n /**\n * Prepare a submit transaction for a collection offer.\n *\n * Call this after the user has signed the EIP-712 data from prepareCreateCollectionOffer().\n */\n prepareSubmitCollectionOffer(\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n signature: `0x${string}`\n ): WriteTransactionConfig {\n return buildSubmitOrderTx(\n getCollectionOffersAddress(this.chainId),\n BAZAAR_COLLECTION_OFFERS_ABI,\n orderParameters,\n counter,\n signature\n );\n }\n\n /**\n * Prepare a submit transaction for an ERC20 offer.\n *\n * Call this after the user has signed the EIP-712 data from prepareCreateErc20Offer().\n */\n prepareSubmitErc20Offer(\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n signature: `0x${string}`\n ): WriteTransactionConfig {\n const erc20OffersAddress = getErc20OffersAddress(this.chainId);\n if (!erc20OffersAddress) {\n throw new Error(`ERC20 offers not available on chain ${this.chainId}`);\n }\n\n return buildSubmitOrderTx(\n erc20OffersAddress,\n BAZAAR_ERC20_OFFERS_ABI,\n orderParameters,\n counter,\n signature\n );\n }\n\n /**\n * Prepare a submit transaction for an ERC20 listing.\n *\n * Call this after the user has signed the EIP-712 data from prepareCreateErc20Listing().\n */\n prepareSubmitErc20Listing(\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n signature: `0x${string}`\n ): WriteTransactionConfig {\n return buildSubmitOrderTx(\n getErc20BazaarAddress(this.chainId),\n BAZAAR_V2_ABI,\n orderParameters,\n counter,\n signature\n );\n }\n\n // ─── Owned Tokens Query ─────────────────────────────────────────────\n\n /**\n * Get token IDs owned by an address for an ERC721 collection.\n *\n * Uses the on-chain ERC721TokenOwnerRangeHelper contract, batching\n * large ranges into 5000-token chunks to avoid RPC limits.\n */\n async getOwnedTokens(params: {\n nftAddress: `0x${string}`;\n ownerAddress: `0x${string}`;\n startTokenId?: bigint;\n endTokenId?: bigint;\n }): Promise<bigint[]> {\n const { nftAddress, ownerAddress } = params;\n const startTokenId = params.startTokenId ?? 0n;\n const endTokenId = params.endTokenId ?? 10000n;\n\n const ownedTokens: bigint[] = [];\n let current = startTokenId;\n\n while (current < endTokenId) {\n const batchEnd = current + OWNED_TOKENS_BATCH_SIZE < endTokenId\n ? current + OWNED_TOKENS_BATCH_SIZE\n : endTokenId;\n\n try {\n const result = await readContract(this.client, {\n address: ERC721_TOKEN_OWNER_RANGE_HELPER_ADDRESS,\n abi: ERC721_TOKEN_OWNER_RANGE_HELPER_ABI as unknown as Abi,\n functionName: \"getOwnedTokensInRange\",\n args: [nftAddress, ownerAddress, current, batchEnd],\n }) as bigint[];\n\n for (const tokenId of result) {\n ownedTokens.push(tokenId);\n }\n } catch {\n // Batch failed (e.g. RPC timeout or gas limit), skip it\n }\n\n current = batchEnd;\n }\n\n return ownedTokens;\n }\n}\n","/**\n * React hook for fetching NFT listings from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { PublicClient } from \"viem\";\nimport { usePublicClient } from \"wagmi\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Listing, SeaportOrderStatus } from \"../types\";\nimport { getBazaarAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarListingsOptions {\n /** Chain ID to query */\n chainId: number;\n /** NFT collection address (optional - if omitted, fetches recent listings across all collections) */\n nftAddress?: `0x${string}`;\n /** Exclude listings from this address */\n excludeMaker?: `0x${string}`;\n /** Only include listings from this address */\n maker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Override start index for message range */\n startIndex?: number;\n /** Override end index for message range */\n endIndex?: number;\n /** Include expired listings in results (default: false) */\n includeExpired?: boolean;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n /** Optional viem PublicClient (defaults to wagmi's client for the chain) */\n publicClient?: PublicClient;\n}\n\nexport interface UseBazaarListingsResult {\n /** Valid listings (deduplicated, sorted by price) */\n listings: Listing[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid NFT listings from Bazaar\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller still owns the NFT\n *\n * Results are deduplicated (one per token) and sorted by price (lowest first).\n * If `nftAddress` is omitted, fetches recent listings across all collections on the chain.\n *\n * @example\n * ```tsx\n * const { listings, isLoading, error } = useBazaarListings({\n * chainId: 8453,\n * nftAddress: \"0x...\",\n * maxMessages: 100,\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <ul>\n * {listings.map((listing) => (\n * <li key={listing.orderHash}>\n * Token #{listing.tokenId} - {listing.price} {listing.currency}\n * </li>\n * ))}\n * </ul>\n * );\n * ```\n */\nexport function useBazaarListings({\n chainId,\n nftAddress,\n excludeMaker,\n maker,\n maxMessages = 200,\n startIndex: startIndexOverride,\n endIndex: endIndexOverride,\n includeExpired = false,\n enabled = true,\n publicClient,\n}: UseBazaarListingsOptions): UseBazaarListingsResult {\n const wagmiClient = usePublicClient({ chainId });\n const resolvedClient = (publicClient ?? wagmiClient) as PublicClient | undefined;\n\n const [listings, setListings] = useState<Listing[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n const hasRangeOverride = startIndexOverride != null && endIndexOverride != null;\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get bazaar address for the chain\n const bazaarAddress = useMemo(\n () => (isSupported ? getBazaarAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: bazaarAddress as `0x${string}`,\n topic: nftAddress?.toLowerCase(),\n maker,\n }),\n [bazaarAddress, nftAddress, maker]\n );\n\n // Get message count (skip when range overrides are provided)\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported && !hasRangeOverride,\n });\n\n // Calculate range\n const startIndex = hasRangeOverride\n ? startIndexOverride!\n : Math.max(0, totalCount - maxMessages);\n const endIndex = hasRangeOverride ? endIndexOverride! : totalCount;\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex,\n enabled: enabled && isSupported && (hasRangeOverride || totalCount > 0),\n });\n\n const TAG = `[useBazaarListings chain=${chainId} nft=${nftAddress?.slice(0, 10) ?? \"all\"}]`;\n\n // Log pipeline state changes\n useEffect(() => {\n console.log(TAG, {\n enabled,\n isSupported,\n hasRangeOverride,\n totalCount,\n isLoadingCount,\n startIndex,\n endIndex,\n messagesLength: messages?.length ?? 0,\n isLoadingMessages,\n messagesError: messagesError?.message,\n });\n }, [enabled, isSupported, hasRangeOverride, totalCount, isLoadingCount, startIndex, endIndex, messages?.length, isLoadingMessages, messagesError]);\n\n // Process listings when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setListings([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setListings([]);\n return;\n }\n\n let cancelled = false;\n\n async function processListings() {\n setIsProcessing(true);\n setProcessingError(undefined);\n console.log(TAG, `processing ${messages.length} messages...`);\n\n try {\n const client = new BazaarClient({ chainId, publicClient: resolvedClient });\n const validListings = await client.processListingsFromMessages(\n messages,\n { nftAddress, excludeMaker, includeExpired }\n );\n console.log(TAG, `processed → ${validListings.length} valid listings`);\n if (!cancelled) {\n setListings(validListings);\n }\n } catch (err) {\n console.error(TAG, \"processing error:\", err);\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setListings([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processListings();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, nftAddress, excludeMaker, includeExpired, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n listings,\n isLoading: (hasRangeOverride ? false : isLoadingCount) || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching collection offers from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { PublicClient } from \"viem\";\nimport { usePublicClient } from \"wagmi\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { CollectionOffer } from \"../types\";\nimport { getCollectionOffersAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarCollectionOffersOptions {\n /** Chain ID to query */\n chainId: number;\n /** NFT collection address (optional - if omitted, fetches recent offers across all collections) */\n nftAddress?: `0x${string}`;\n /** Exclude offers from this address */\n excludeMaker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 100) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarCollectionOffersResult {\n /** Valid collection offers (sorted by price, highest first) */\n offers: CollectionOffer[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid collection offers from Bazaar\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price (highest first)\n *\n * @example\n * ```tsx\n * const { offers, isLoading, error } = useBazaarCollectionOffers({\n * chainId: 8453,\n * nftAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestOffer = offers[0];\n * if (bestOffer) {\n * return <div>Best offer: {bestOffer.price} {bestOffer.currency}</div>;\n * }\n * ```\n */\nexport function useBazaarCollectionOffers({\n chainId,\n nftAddress,\n excludeMaker,\n maxMessages = 100,\n enabled = true,\n}: UseBazaarCollectionOffersOptions): UseBazaarCollectionOffersResult {\n const wagmiClient = usePublicClient({ chainId });\n\n const [offers, setOffers] = useState<CollectionOffer[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get collection offers address for the chain\n const collectionOffersAddress = useMemo(\n () => (isSupported ? getCollectionOffersAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: collectionOffersAddress as `0x${string}`,\n topic: nftAddress?.toLowerCase(),\n }),\n [collectionOffersAddress, nftAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && isSupported && totalCount > 0,\n });\n\n const TAG = `[useBazaarCollectionOffers chain=${chainId}${nftAddress ? ` nft=${nftAddress.slice(0, 10)}` : \"\"}]`;\n\n // Log pipeline state changes\n useEffect(() => {\n console.log(TAG, {\n enabled,\n isSupported,\n totalCount,\n isLoadingCount,\n startIndex,\n endIndex: totalCount,\n messagesLength: messages?.length ?? 0,\n isLoadingMessages,\n messagesError: messagesError?.message,\n });\n }, [enabled, isSupported, totalCount, isLoadingCount, startIndex, messages?.length, isLoadingMessages, messagesError]);\n\n // Process offers when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setOffers([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setOffers([]);\n return;\n }\n\n let cancelled = false;\n\n async function processOffers() {\n setIsProcessing(true);\n setProcessingError(undefined);\n console.log(TAG, `processing ${messages.length} messages...`);\n\n try {\n const client = new BazaarClient({ chainId, publicClient: wagmiClient as PublicClient });\n const validOffers = await client.processCollectionOffersFromMessages(\n messages,\n { nftAddress, excludeMaker }\n );\n console.log(TAG, `processed → ${validOffers.length} valid offers`);\n\n if (!cancelled) {\n setOffers(validOffers);\n }\n } catch (err) {\n console.error(TAG, \"processing error:\", err);\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setOffers([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processOffers();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, nftAddress, excludeMaker, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n offers,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching ERC20 offers from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { PublicClient } from \"viem\";\nimport { usePublicClient } from \"wagmi\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Erc20Offer } from \"../types\";\nimport { getErc20OffersAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarErc20OffersOptions {\n /** Chain ID to query */\n chainId: number;\n /** ERC20 token address */\n tokenAddress: `0x${string}`;\n /** Exclude offers from this address */\n excludeMaker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarErc20OffersResult {\n /** Valid ERC20 offers (sorted by price per token, highest first) */\n offers: Erc20Offer[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid ERC20 offers from Bazaar\n *\n * ERC20 offers are only available on Base (8453) and HyperEVM (999).\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price per token (highest first)\n *\n * @example\n * ```tsx\n * const { offers, isLoading, error } = useBazaarErc20Offers({\n * chainId: 8453,\n * tokenAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestOffer = offers[0];\n * if (bestOffer) {\n * return (\n * <div>\n * Best offer: {bestOffer.pricePerToken} {bestOffer.currency} per token\n * (total: {bestOffer.price} {bestOffer.currency} for {bestOffer.tokenAmount.toString()} tokens)\n * </div>\n * );\n * }\n * ```\n */\nexport function useBazaarErc20Offers({\n chainId,\n tokenAddress,\n excludeMaker,\n maxMessages = 200,\n enabled = true,\n}: UseBazaarErc20OffersOptions): UseBazaarErc20OffersResult {\n const wagmiClient = usePublicClient({ chainId });\n\n const [offers, setOffers] = useState<Erc20Offer[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported and has ERC20 offers\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get ERC20 offers address for the chain (only Base and HyperEVM)\n const erc20OffersAddress = useMemo(\n () => (isSupported ? getErc20OffersAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // ERC20 offers only available on chains with the contract deployed\n const hasErc20Offers = Boolean(erc20OffersAddress);\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: erc20OffersAddress as `0x${string}`,\n topic: tokenAddress.toLowerCase(),\n }),\n [erc20OffersAddress, tokenAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && hasErc20Offers,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && hasErc20Offers && totalCount > 0,\n });\n\n const TAG = `[useBazaarErc20Offers chain=${chainId} token=${tokenAddress.slice(0, 10)}]`;\n\n // Log pipeline state changes\n useEffect(() => {\n console.log(TAG, {\n enabled,\n hasErc20Offers,\n totalCount,\n isLoadingCount,\n startIndex,\n endIndex: totalCount,\n messagesLength: messages?.length ?? 0,\n isLoadingMessages,\n messagesError: messagesError?.message,\n });\n }, [enabled, hasErc20Offers, totalCount, isLoadingCount, startIndex, messages?.length, isLoadingMessages, messagesError]);\n\n // Process offers when messages change\n useEffect(() => {\n if (!hasErc20Offers || !enabled) {\n setOffers([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setOffers([]);\n return;\n }\n\n let cancelled = false;\n\n async function processOffers() {\n setIsProcessing(true);\n setProcessingError(undefined);\n console.log(TAG, `processing ${messages.length} messages...`);\n\n try {\n const client = new BazaarClient({ chainId, publicClient: wagmiClient as PublicClient });\n const validOffers = await client.processErc20OffersFromMessages(\n messages,\n { tokenAddress, excludeMaker }\n );\n console.log(TAG, `processed → ${validOffers.length} valid offers`);\n\n if (!cancelled) {\n setOffers(validOffers);\n }\n } catch (err) {\n console.error(TAG, \"processing error:\", err);\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setOffers([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processOffers();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, tokenAddress, excludeMaker, messages, hasErc20Offers, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n offers,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching ERC20 listings from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { PublicClient } from \"viem\";\nimport { usePublicClient } from \"wagmi\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Erc20Listing } from \"../types\";\nimport { getErc20BazaarAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarErc20ListingsOptions {\n /** Chain ID to query */\n chainId: number;\n /** ERC20 token address */\n tokenAddress: `0x${string}`;\n /** Exclude listings from this address */\n excludeMaker?: `0x${string}`;\n /** Only include listings from this address */\n maker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Override start index for message range */\n startIndex?: number;\n /** Override end index for message range */\n endIndex?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n /** Optional viem PublicClient (defaults to wagmi's client for the chain) */\n publicClient?: PublicClient;\n}\n\nexport interface UseBazaarErc20ListingsResult {\n /** Valid ERC20 listings (sorted by price per token, lowest first) */\n listings: Erc20Listing[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid ERC20 listings from Bazaar\n *\n * ERC20 listings are available on all supported chains.\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n *\n * Results are sorted by price per token (lowest first)\n *\n * @example\n * ```tsx\n * const { listings, isLoading, error } = useBazaarErc20Listings({\n * chainId: 8453,\n * tokenAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestListing = listings[0];\n * if (bestListing) {\n * return (\n * <div>\n * Best listing: {bestListing.pricePerToken} {bestListing.currency} per token\n * (total: {bestListing.price} {bestListing.currency} for {bestListing.tokenAmount.toString()} tokens)\n * </div>\n * );\n * }\n * ```\n */\nexport function useBazaarErc20Listings({\n chainId,\n tokenAddress,\n excludeMaker,\n maker,\n maxMessages = 200,\n startIndex: startIndexOverride,\n endIndex: endIndexOverride,\n enabled = true,\n publicClient,\n}: UseBazaarErc20ListingsOptions): UseBazaarErc20ListingsResult {\n const wagmiClient = usePublicClient({ chainId });\n const resolvedClient = (publicClient ?? wagmiClient) as PublicClient | undefined;\n\n const [listings, setListings] = useState<Erc20Listing[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n const hasRangeOverride = startIndexOverride != null && endIndexOverride != null;\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get ERC20 bazaar address for the chain (available on all chains)\n const erc20BazaarAddress = useMemo(\n () => (isSupported ? getErc20BazaarAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: erc20BazaarAddress as `0x${string}`,\n topic: tokenAddress.toLowerCase(),\n maker,\n }),\n [erc20BazaarAddress, tokenAddress, maker]\n );\n\n // Get message count (skip when range overrides are provided)\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported && !hasRangeOverride,\n });\n\n // Calculate range\n const startIndex = hasRangeOverride\n ? startIndexOverride!\n : Math.max(0, totalCount - maxMessages);\n const endIndex = hasRangeOverride ? endIndexOverride! : totalCount;\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex,\n enabled: enabled && isSupported && (hasRangeOverride || totalCount > 0),\n });\n\n const TAG = `[useBazaarErc20Listings chain=${chainId} token=${tokenAddress.slice(0, 10)}]`;\n\n // Log pipeline state changes\n useEffect(() => {\n console.log(TAG, {\n enabled,\n isSupported,\n hasRangeOverride,\n totalCount,\n isLoadingCount,\n startIndex,\n endIndex,\n messagesLength: messages?.length ?? 0,\n isLoadingMessages,\n messagesError: messagesError?.message,\n });\n }, [enabled, isSupported, hasRangeOverride, totalCount, isLoadingCount, startIndex, endIndex, messages?.length, isLoadingMessages, messagesError]);\n\n // Process listings when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setListings([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setListings([]);\n return;\n }\n\n let cancelled = false;\n\n async function processListings() {\n setIsProcessing(true);\n setProcessingError(undefined);\n console.log(TAG, `processing ${messages.length} messages...`);\n\n try {\n const client = new BazaarClient({ chainId, publicClient: resolvedClient });\n const validListings = await client.processErc20ListingsFromMessages(\n messages,\n { tokenAddress, excludeMaker }\n );\n console.log(TAG, `processed → ${validListings.length} valid listings`);\n\n if (!cancelled) {\n setListings(validListings);\n }\n } catch (err) {\n console.error(TAG, \"processing error:\", err);\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setListings([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processListings();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, tokenAddress, excludeMaker, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n listings,\n isLoading: (hasRangeOverride ? false : isLoadingCount) || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching recent sales from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { PublicClient } from \"viem\";\nimport { usePublicClient } from \"wagmi\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Sale } from \"../types\";\nimport { NET_SEAPORT_ZONE_ADDRESS, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarSalesOptions {\n /** Chain ID to query */\n chainId: number;\n /** NFT collection address */\n nftAddress: `0x${string}`;\n /** Maximum number of messages to fetch (default: 100) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarSalesResult {\n /** Recent sales (sorted by timestamp, most recent first) */\n sales: Sale[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching recent sales from Bazaar\n *\n * Sales data flows differently from listings/offers:\n * - Net messages (appAddress=zone, topic=nftAddress) contain order hashes\n * - Actual sale data is fetched from the bulk storage contract\n *\n * Results are sorted by timestamp (most recent first)\n *\n * @example\n * ```tsx\n * const { sales, isLoading, error } = useBazaarSales({\n * chainId: 8453,\n * nftAddress: \"0x...\",\n * maxMessages: 100,\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <ul>\n * {sales.map((sale) => (\n * <li key={sale.orderHash}>\n * Token #{sale.tokenId} - {sale.price} {sale.currency}\n * </li>\n * ))}\n * </ul>\n * );\n * ```\n */\nexport function useBazaarSales({\n chainId,\n nftAddress,\n maxMessages = 100,\n enabled = true,\n}: UseBazaarSalesOptions): UseBazaarSalesResult {\n const wagmiClient = usePublicClient({ chainId });\n\n const [sales, setSales] = useState<Sale[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Build filter: appAddress = zone contract, topic = nft address\n const filter = useMemo(\n () => ({\n appAddress: NET_SEAPORT_ZONE_ADDRESS as `0x${string}`,\n topic: nftAddress.toLowerCase(),\n }),\n [nftAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && isSupported && totalCount > 0,\n });\n\n const TAG = `[useBazaarSales chain=${chainId} nft=${nftAddress.slice(0, 10)}]`;\n\n // Log pipeline state changes\n useEffect(() => {\n console.log(TAG, {\n enabled,\n isSupported,\n totalCount,\n isLoadingCount,\n startIndex,\n endIndex: totalCount,\n messagesLength: messages?.length ?? 0,\n isLoadingMessages,\n messagesError: messagesError?.message,\n });\n }, [enabled, isSupported, totalCount, isLoadingCount, startIndex, messages?.length, isLoadingMessages, messagesError]);\n\n // Process sales when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setSales([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setSales([]);\n return;\n }\n\n let cancelled = false;\n\n async function processSales() {\n setIsProcessing(true);\n setProcessingError(undefined);\n console.log(TAG, `processing ${messages.length} messages...`);\n\n try {\n const client = new BazaarClient({ chainId, publicClient: wagmiClient as PublicClient });\n const parsedSales = await client.processSalesFromMessages(\n messages,\n { nftAddress }\n );\n console.log(TAG, `processed → ${parsedSales.length} sales`);\n\n if (!cancelled) {\n setSales(parsedSales);\n }\n } catch (err) {\n console.error(TAG, \"processing error:\", err);\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setSales([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processSales();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, nftAddress, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n sales,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/abis/bazaarV2.ts","../src/abis/helpers.ts","../src/abis/seaport.ts","../src/abis/index.ts","../src/chainConfig.ts","../src/utils/seaport.ts","../src/utils/validation.ts","../src/utils/parsing.ts","../src/utils/approvals.ts","../src/utils/fulfillment.ts","../src/utils/orderCreation.ts","../src/client/BazaarClient.ts","../src/hooks/useBazaarListings.ts","../src/hooks/useBazaarCollectionOffers.ts","../src/hooks/useBazaarErc20Offers.ts","../src/hooks/useBazaarErc20Listings.ts","../src/hooks/useBazaarSales.ts"],"names":["decodeAbiParameters","formatEther","readContract","ZERO_BYTES32","usePublicClient","useState","useMemo","useNetMessageCount","useNetMessages","useEffect"],"mappings":"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","file":"react.mjs","sourcesContent":["export const BAZAAR_V2_ABI = [\n {\n type: \"function\",\n name: \"submit\",\n inputs: [\n {\n name: \"submission\",\n type: \"tuple\",\n internalType: \"struct BazaarV1.Submission\",\n components: [\n {\n name: \"parameters\",\n type: \"tuple\",\n internalType: \"struct OrderParameters\",\n components: [\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n { name: \"zone\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct OfferItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ConsiderationItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"orderType\", type: \"uint8\", internalType: \"enum OrderType\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"salt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"totalOriginalConsiderationItems\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"counter\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"event\",\n name: \"Submitted\",\n inputs: [\n { name: \"tokenAddress\", type: \"address\", indexed: true, internalType: \"address\" },\n { name: \"tokenId\", type: \"uint256\", indexed: true, internalType: \"uint256\" },\n ],\n anonymous: false,\n },\n { type: \"error\", name: \"ConsiderationItemsMustContainTwoItems\", inputs: [] },\n { type: \"error\", name: \"OfferItemsMustContainOneItem\", inputs: [] },\n] as const;\n\nexport const BAZAAR_COLLECTION_OFFERS_ABI = [\n {\n type: \"function\",\n name: \"NET_APP_NAME\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\", internalType: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"submit\",\n inputs: [\n {\n name: \"submission\",\n type: \"tuple\",\n internalType: \"struct BazaarV2CollectionOffers.Submission\",\n components: [\n {\n name: \"parameters\",\n type: \"tuple\",\n internalType: \"struct OrderParameters\",\n components: [\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n { name: \"zone\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct OfferItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ConsiderationItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"orderType\", type: \"uint8\", internalType: \"enum OrderType\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"salt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"totalOriginalConsiderationItems\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"counter\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"event\",\n name: \"Submitted\",\n inputs: [\n { name: \"tokenAddress\", type: \"address\", indexed: true, internalType: \"address\" },\n { name: \"tokenId\", type: \"uint256\", indexed: true, internalType: \"uint256\" },\n ],\n anonymous: false,\n },\n { type: \"error\", name: \"ConsiderationItemsMustContainTwoItems\", inputs: [] },\n { type: \"error\", name: \"ConsiderationItemsMustIncludeFeeAddress\", inputs: [] },\n { type: \"error\", name: \"ConsiderationItemsMustIncludeMsgSender\", inputs: [] },\n { type: \"error\", name: \"InvalidFee\", inputs: [] },\n { type: \"error\", name: \"OfferItemsMustContainOneItem\", inputs: [] },\n] as const;\n\n/**\n * ERC20 offers contract ABI (same submit signature as collection offers, different contract address)\n */\nexport const BAZAAR_ERC20_OFFERS_ABI = [\n {\n type: \"function\",\n name: \"submit\",\n inputs: [\n {\n name: \"submission\",\n type: \"tuple\",\n internalType: \"struct BazaarV2CollectionOffers.Submission\",\n components: [\n {\n name: \"parameters\",\n type: \"tuple\",\n internalType: \"struct OrderParameters\",\n components: [\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n { name: \"zone\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct OfferItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ConsiderationItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"orderType\", type: \"uint8\", internalType: \"enum OrderType\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"salt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"totalOriginalConsiderationItems\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"counter\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n","export const BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI = [\n { type: \"constructor\", inputs: [], stateMutability: \"nonpayable\" },\n {\n type: \"function\",\n name: \"getOrderStatuses\",\n inputs: [\n { name: \"seaport\", type: \"address\", internalType: \"address\" },\n { name: \"orderHashes\", type: \"bytes32[]\", internalType: \"bytes32[]\" },\n ],\n outputs: [\n {\n name: \"results\",\n type: \"tuple[]\",\n internalType: \"struct BulkSeaportOrderStatusFetcher.OrderStatusInfo[]\",\n components: [\n { name: \"isValidated\", type: \"bool\", internalType: \"bool\" },\n { name: \"isCancelled\", type: \"bool\", internalType: \"bool\" },\n { name: \"totalFilled\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"totalSize\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const ERC721_OWNER_OF_HELPER_ABI = [\n {\n type: \"function\",\n name: \"getTokenOwners\",\n inputs: [\n { name: \"nftContract\", type: \"address\", internalType: \"address\" },\n { name: \"tokenIds\", type: \"uint256[]\", internalType: \"uint256[]\" },\n ],\n outputs: [\n { name: \"owners\", type: \"address[]\", internalType: \"address[]\" },\n ],\n stateMutability: \"view\",\n },\n { type: \"error\", name: \"InvalidAddress\", inputs: [] },\n { type: \"error\", name: \"TokenQueryFailed\", inputs: [] },\n] as const;\n\nexport const ERC20_BULK_BALANCE_CHECKER_ABI = [\n {\n type: \"function\",\n name: \"getBalances\",\n inputs: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"addresses\", type: \"address[]\", internalType: \"address[]\" },\n ],\n outputs: [\n { name: \"balances\", type: \"uint256[]\", internalType: \"uint256[]\" },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","/**\n * Minimal Seaport ABI for cancel operations\n */\nexport const SEAPORT_CANCEL_ABI = [\n {\n inputs: [\n {\n components: [\n { internalType: \"address\", name: \"offerer\", type: \"address\" },\n { internalType: \"address\", name: \"zone\", type: \"address\" },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n ],\n internalType: \"struct OfferItem[]\",\n name: \"offer\",\n type: \"tuple[]\",\n },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n { internalType: \"address payable\", name: \"recipient\", type: \"address\" },\n ],\n internalType: \"struct ConsiderationItem[]\",\n name: \"consideration\",\n type: \"tuple[]\",\n },\n { internalType: \"enum OrderType\", name: \"orderType\", type: \"uint8\" },\n { internalType: \"uint256\", name: \"startTime\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endTime\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"zoneHash\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"salt\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"conduitKey\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"counter\", type: \"uint256\" },\n ],\n internalType: \"struct OrderComponents[]\",\n name: \"orders\",\n type: \"tuple[]\",\n },\n ],\n name: \"cancel\",\n outputs: [{ internalType: \"bool\", name: \"cancelled\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\n// Shared ABI fragments for OrderParameters, OfferItem, and ConsiderationItem\nconst ORDER_PARAMETERS_COMPONENTS = [\n { internalType: \"address\", name: \"offerer\", type: \"address\" },\n { internalType: \"address\", name: \"zone\", type: \"address\" },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n ],\n internalType: \"struct OfferItem[]\",\n name: \"offer\",\n type: \"tuple[]\",\n },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n { internalType: \"address payable\", name: \"recipient\", type: \"address\" },\n ],\n internalType: \"struct ConsiderationItem[]\",\n name: \"consideration\",\n type: \"tuple[]\",\n },\n { internalType: \"enum OrderType\", name: \"orderType\", type: \"uint8\" },\n { internalType: \"uint256\", name: \"startTime\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endTime\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"zoneHash\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"salt\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"conduitKey\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"totalOriginalConsiderationItems\", type: \"uint256\" },\n] as const;\n\n/**\n * Seaport fulfillOrder ABI\n */\nexport const SEAPORT_FULFILL_ORDER_ABI = [\n {\n inputs: [\n {\n components: [\n {\n components: ORDER_PARAMETERS_COMPONENTS,\n internalType: \"struct OrderParameters\",\n name: \"parameters\",\n type: \"tuple\",\n },\n { internalType: \"bytes\", name: \"signature\", type: \"bytes\" },\n ],\n internalType: \"struct Order\",\n name: \"\",\n type: \"tuple\",\n },\n { internalType: \"bytes32\", name: \"fulfillerConduitKey\", type: \"bytes32\" },\n ],\n name: \"fulfillOrder\",\n outputs: [{ internalType: \"bool\", name: \"fulfilled\", type: \"bool\" }],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\n/**\n * Seaport fulfillAdvancedOrder ABI\n */\nexport const SEAPORT_FULFILL_ADVANCED_ORDER_ABI = [\n {\n inputs: [\n {\n components: [\n {\n components: ORDER_PARAMETERS_COMPONENTS,\n internalType: \"struct OrderParameters\",\n name: \"parameters\",\n type: \"tuple\",\n },\n { internalType: \"uint120\", name: \"numerator\", type: \"uint120\" },\n { internalType: \"uint120\", name: \"denominator\", type: \"uint120\" },\n { internalType: \"bytes\", name: \"signature\", type: \"bytes\" },\n { internalType: \"bytes\", name: \"extraData\", type: \"bytes\" },\n ],\n internalType: \"struct AdvancedOrder\",\n name: \"\",\n type: \"tuple\",\n },\n {\n components: [\n { internalType: \"uint256\", name: \"orderIndex\", type: \"uint256\" },\n { internalType: \"enum Side\", name: \"side\", type: \"uint8\" },\n { internalType: \"uint256\", name: \"index\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"identifier\", type: \"uint256\" },\n { internalType: \"bytes32[]\", name: \"criteriaProof\", type: \"bytes32[]\" },\n ],\n internalType: \"struct CriteriaResolver[]\",\n name: \"\",\n type: \"tuple[]\",\n },\n { internalType: \"bytes32\", name: \"fulfillerConduitKey\", type: \"bytes32\" },\n { internalType: \"address\", name: \"recipient\", type: \"address\" },\n ],\n name: \"fulfillAdvancedOrder\",\n outputs: [{ internalType: \"bool\", name: \"fulfilled\", type: \"bool\" }],\n stateMutability: \"payable\",\n type: \"function\",\n },\n] as const;\n\n/**\n * Seaport getCounter ABI\n */\nexport const SEAPORT_GET_COUNTER_ABI = [\n {\n inputs: [{ internalType: \"address\", name: \"offerer\", type: \"address\" }],\n name: \"getCounter\",\n outputs: [{ internalType: \"uint256\", name: \"counter\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n/**\n * ERC721 approval ABIs (isApprovedForAll + setApprovalForAll)\n */\nexport const ERC721_APPROVAL_ABI = [\n {\n inputs: [\n { internalType: \"address\", name: \"owner\", type: \"address\" },\n { internalType: \"address\", name: \"operator\", type: \"address\" },\n ],\n name: \"isApprovedForAll\",\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"address\", name: \"operator\", type: \"address\" },\n { internalType: \"bool\", name: \"approved\", type: \"bool\" },\n ],\n name: \"setApprovalForAll\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\n/**\n * ERC20 approval ABIs (allowance + approve)\n */\nexport const ERC20_APPROVAL_ABI = [\n {\n inputs: [\n { internalType: \"address\", name: \"owner\", type: \"address\" },\n { internalType: \"address\", name: \"spender\", type: \"address\" },\n ],\n name: \"allowance\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n { internalType: \"address\", name: \"spender\", type: \"address\" },\n { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [{ internalType: \"bool\", name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n","export { BAZAAR_V2_ABI, BAZAAR_COLLECTION_OFFERS_ABI, BAZAAR_ERC20_OFFERS_ABI } from \"./bazaarV2\";\nexport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n ERC721_OWNER_OF_HELPER_ABI,\n ERC20_BULK_BALANCE_CHECKER_ABI,\n} from \"./helpers\";\nexport {\n SEAPORT_CANCEL_ABI,\n SEAPORT_FULFILL_ORDER_ABI,\n SEAPORT_FULFILL_ADVANCED_ORDER_ABI,\n SEAPORT_GET_COUNTER_ABI,\n ERC721_APPROVAL_ABI,\n ERC20_APPROVAL_ABI,\n} from \"./seaport\";\n\n/**\n * ABI for decoding Seaport submission from Net message data\n */\nexport const BAZAAR_SUBMISSION_ABI = [\n {\n name: \"submission\",\n type: \"tuple\",\n internalType: \"struct BazaarV2.Submission\",\n components: [\n {\n name: \"parameters\",\n type: \"tuple\",\n internalType: \"struct OrderParameters\",\n components: [\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n { name: \"zone\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct OfferItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ConsiderationItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"orderType\", type: \"uint8\", internalType: \"enum OrderType\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"salt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"totalOriginalConsiderationItems\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"counter\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n },\n] as const;\n","/**\n * Bazaar chain configuration\n *\n * Contains contract addresses and configuration for each supported chain.\n */\n\nexport interface WrappedNativeCurrency {\n address: `0x${string}`;\n name: string;\n symbol: string;\n}\n\nexport interface BazaarChainConfig {\n /** Main NFT listing contract */\n bazaarAddress: `0x${string}`;\n /** Collection offers contract */\n collectionOffersAddress: `0x${string}`;\n /** ERC20 offers contract (only on Base and HyperEVM) */\n erc20OffersAddress?: `0x${string}`;\n /** ERC20 listings contract */\n erc20BazaarAddress?: `0x${string}`;\n /** Seaport contract address */\n seaportAddress: `0x${string}`;\n /** Fee collector address */\n feeCollectorAddress: `0x${string}`;\n /** Fee in basis points for NFT trades */\n nftFeeBps: number;\n /** Wrapped native currency (WETH, etc.) */\n wrappedNativeCurrency: WrappedNativeCurrency;\n /** Address with high ETH balance for Seaport checks */\n highEthAddress?: `0x${string}`;\n /** Native currency symbol (lowercase) */\n currencySymbol: string;\n}\n\n// Default addresses used by most chains\nconst DEFAULT_SEAPORT_ADDRESS = \"0x0000000000000068F116a894984e2DB1123eB395\" as const;\nconst DEFAULT_BAZAAR_ADDRESS = \"0x00000000E3dA5fC031282A39759bDDA78ae7fAE5\" as const;\nconst DEFAULT_COLLECTION_OFFERS_ADDRESS = \"0x0000000D43423E0A12CecB307a74591999b32B32\" as const;\nconst DEFAULT_FEE_COLLECTOR_ADDRESS = \"0x32D16C15410248bef498D7aF50D10Db1a546b9E5\" as const;\nconst DEFAULT_ERC20_BAZAAR_ADDRESS = \"0x00000000a2d173a4610c85c7471a25b6bc216a70\" as const;\nconst DEFAULT_NFT_FEE_BPS = 500; // 5%\n\n// Helper contract addresses (same on all chains)\nexport const BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS = \"0x0000009112ABCE652674b4fE3eD9C765B22d11A7\" as const;\nexport const ERC721_OWNER_OF_HELPER_ADDRESS = \"0x00000012E3eb0700925947fAF9cd1440319b4F37\" as const;\nexport const ERC20_BULK_BALANCE_CHECKER_ADDRESS = \"0x000000B50A9f2923F2DB931391824F6D1278f712\" as const;\n\n// Zone contract addresses (same on all chains)\nexport const NET_SEAPORT_ZONE_ADDRESS = \"0x000000007F8c58fbf215bF91Bda7421A806cf3ae\" as const;\nexport const NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS = \"0x000000B799ec6D7aCC1B578f62bFc324c25DFC5A\" as const;\nexport const NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS = \"0x000000bC63761cbb05305632212e2f3AE2BE7a9B\" as const;\n\n/**\n * Chain-specific bazaar configuration\n */\nconst BAZAAR_CHAIN_CONFIGS: Record<number, BazaarChainConfig> = {\n // Base Mainnet\n 8453: {\n bazaarAddress: \"0x000000058f3ade587388daf827174d0e6fc97595\",\n collectionOffersAddress: \"0x0000000f9c45efcff0f78d8b54aa6a40092d66dc\",\n erc20OffersAddress: \"0x0000000e23a89aa06f317306aa1ae231d3503082\",\n erc20BazaarAddress: \"0x00000006557e3629e2fc50bbad0c002b27cac492\",\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: \"0x66547ff4f7206e291F7BC157b54C026Fc6660961\",\n nftFeeBps: 0, // 0% on Base\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // Base Sepolia (Testnet)\n 84532: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // Degen\n 666666666: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0xEb54dACB4C2ccb64F8074eceEa33b5eBb38E5387\",\n name: \"Wrapped Degen\",\n symbol: \"WDEGEN\",\n },\n currencySymbol: \"degen\",\n },\n\n // Ham Chain\n 5112: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n highEthAddress: \"0x4200000000000000000000000000000000000006\",\n currencySymbol: \"eth\",\n },\n\n // Ink Chain\n 57073: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n // Custom Seaport address for Ink (no create2 factory)\n seaportAddress: \"0xD00C96804e9fF35f10C7D2a92239C351Ff3F94e5\",\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped ETH\",\n symbol: \"WETH\",\n },\n highEthAddress: \"0x4200000000000000000000000000000000000006\",\n currencySymbol: \"eth\",\n },\n\n // Unichain\n 130: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // HyperEVM (Hyperliquid)\n 999: {\n bazaarAddress: \"0x000000058f3ade587388daf827174d0e6fc97595\",\n collectionOffersAddress: \"0x0000000f9c45efcff0f78d8b54aa6a40092d66dc\",\n erc20OffersAddress: \"0x0000000e23a89aa06f317306aa1ae231d3503082\",\n erc20BazaarAddress: \"0x00000006557e3629e2fc50bbad0c002b27cac492\",\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: \"0x66547ff4f7206e291F7BC157b54C026Fc6660961\",\n nftFeeBps: 0, // 0% on HyperEVM\n wrappedNativeCurrency: {\n address: \"0x5555555555555555555555555555555555555555\",\n name: \"Wrapped Hype\",\n symbol: \"WHYPE\",\n },\n currencySymbol: \"hype\",\n },\n\n // Plasma\n 9745: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x6100e367285b01f48d07953803a2d8dca5d19873\",\n name: \"Wrapped XPL\",\n symbol: \"WXPL\",\n },\n currencySymbol: \"xpl\",\n },\n\n // Monad\n 143: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A\",\n name: \"Wrapped Monad\",\n symbol: \"WMONAD\",\n },\n currencySymbol: \"monad\",\n },\n\n // MegaETH\n 4326: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n};\n\n/**\n * Get bazaar configuration for a chain\n */\nexport function getBazaarChainConfig(chainId: number): BazaarChainConfig | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId];\n}\n\n/**\n * Get all supported bazaar chain IDs\n */\nexport function getBazaarSupportedChainIds(): number[] {\n return Object.keys(BAZAAR_CHAIN_CONFIGS).map(Number);\n}\n\n/**\n * Check if bazaar is supported on a chain\n */\nexport function isBazaarSupportedOnChain(chainId: number): boolean {\n return chainId in BAZAAR_CHAIN_CONFIGS;\n}\n\n/**\n * Get bazaar contract address for a chain\n */\nexport function getBazaarAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.bazaarAddress ?? DEFAULT_BAZAAR_ADDRESS;\n}\n\n/**\n * Get collection offers contract address for a chain\n */\nexport function getCollectionOffersAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.collectionOffersAddress ?? DEFAULT_COLLECTION_OFFERS_ADDRESS;\n}\n\n/**\n * Get Seaport contract address for a chain\n */\nexport function getSeaportAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.seaportAddress ?? DEFAULT_SEAPORT_ADDRESS;\n}\n\n/**\n * Get fee collector address for a chain\n */\nexport function getFeeCollectorAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.feeCollectorAddress ?? DEFAULT_FEE_COLLECTOR_ADDRESS;\n}\n\n/**\n * Get NFT fee in basis points for a chain\n */\nexport function getNftFeeBps(chainId: number): number {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.nftFeeBps ?? DEFAULT_NFT_FEE_BPS;\n}\n\n/**\n * Get wrapped native currency for a chain\n */\nexport function getWrappedNativeCurrency(chainId: number): WrappedNativeCurrency | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.wrappedNativeCurrency;\n}\n\n/**\n * Get currency symbol for a chain (lowercase)\n */\nexport function getCurrencySymbol(chainId: number): string {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.currencySymbol ?? \"eth\";\n}\n\n/**\n * Get high ETH address for Seaport balance checks\n */\nexport function getHighEthAddress(chainId: number): `0x${string}` | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.highEthAddress;\n}\n\n/**\n * Get ERC20 offers contract address for a chain\n * Only deployed on Base (8453) and HyperEVM (999)\n */\nexport function getErc20OffersAddress(chainId: number): `0x${string}` | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.erc20OffersAddress;\n}\n\n/**\n * Get ERC20 bazaar (listings) contract address for a chain\n */\nexport function getErc20BazaarAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.erc20BazaarAddress ?? DEFAULT_ERC20_BAZAAR_ADDRESS;\n}\n","/**\n * Seaport-related utilities for decoding and computing order hashes\n */\n\nimport { decodeAbiParameters, formatEther } from \"viem\";\nimport { Seaport } from \"@opensea/seaport-js\";\nimport { ethers } from \"ethers\";\nimport { BAZAAR_SUBMISSION_ABI } from \"../abis\";\nimport {\n SeaportSubmission,\n SeaportOrderParameters,\n SeaportOrderStatus,\n SeaportOrderStatusInfo,\n} from \"../types\";\nimport { getSeaportAddress, getHighEthAddress } from \"../chainConfig\";\n\n/**\n * Decode Seaport submission from Net message data\n */\nexport function decodeSeaportSubmission(messageData: `0x${string}`): SeaportSubmission {\n const [decoded] = decodeAbiParameters(BAZAAR_SUBMISSION_ABI, messageData);\n\n return {\n parameters: {\n offerer: decoded.parameters.offerer as `0x${string}`,\n zone: decoded.parameters.zone as `0x${string}`,\n offer: decoded.parameters.offer.map((item: any) => ({\n itemType: item.itemType,\n token: item.token as `0x${string}`,\n identifierOrCriteria: BigInt(item.identifierOrCriteria),\n startAmount: BigInt(item.startAmount),\n endAmount: BigInt(item.endAmount),\n })),\n consideration: decoded.parameters.consideration.map((item: any) => ({\n itemType: item.itemType,\n token: item.token as `0x${string}`,\n identifierOrCriteria: BigInt(item.identifierOrCriteria),\n startAmount: BigInt(item.startAmount),\n endAmount: BigInt(item.endAmount),\n recipient: item.recipient as `0x${string}`,\n })),\n orderType: decoded.parameters.orderType,\n startTime: BigInt(decoded.parameters.startTime),\n endTime: BigInt(decoded.parameters.endTime),\n zoneHash: decoded.parameters.zoneHash as `0x${string}`,\n salt: BigInt(decoded.parameters.salt),\n conduitKey: decoded.parameters.conduitKey as `0x${string}`,\n totalOriginalConsiderationItems: BigInt(decoded.parameters.totalOriginalConsiderationItems),\n },\n counter: BigInt(decoded.counter),\n signature: decoded.signature as `0x${string}`,\n };\n}\n\n/**\n * Get Seaport order from message data with string identifiers\n * (needed for Seaport SDK compatibility)\n */\nexport function getSeaportOrderFromMessageData(messageData: `0x${string}`): {\n parameters: any;\n signature: `0x${string}`;\n counter: bigint;\n} {\n const submission = decodeSeaportSubmission(messageData);\n\n return {\n parameters: {\n ...submission.parameters,\n // Convert BigInts to strings for Seaport SDK compatibility\n offer: submission.parameters.offer.map((item) => ({\n ...item,\n identifierOrCriteria: item.identifierOrCriteria.toString(),\n startAmount: item.startAmount.toString(),\n endAmount: item.endAmount.toString(),\n })),\n consideration: submission.parameters.consideration.map((item) => ({\n ...item,\n identifierOrCriteria: item.identifierOrCriteria.toString(),\n startAmount: item.startAmount.toString(),\n endAmount: item.endAmount.toString(),\n })),\n startTime: submission.parameters.startTime.toString(),\n endTime: submission.parameters.endTime.toString(),\n salt: submission.parameters.salt.toString(),\n totalOriginalConsiderationItems: submission.parameters.totalOriginalConsiderationItems.toString(),\n counter: submission.counter.toString(),\n },\n signature: submission.signature,\n counter: submission.counter,\n };\n}\n\n/**\n * Create a Seaport instance for a chain using a public RPC\n */\nexport function createSeaportInstance(chainId: number, rpcUrl: string): Seaport {\n const provider = new ethers.JsonRpcProvider(rpcUrl);\n\n // Use a dummy signer for read-only operations\n const signer = new ethers.Wallet(\n // Random private key for read-only operations\n \"dc63e9af2088e2afd61499411cb6dd718d00a3d9e46e2cb5e33912c781bd77fe\",\n provider\n );\n\n // Override getAddress to return a high-balance address for checks\n const highEthAddress = getHighEthAddress(chainId);\n const finalSigner = highEthAddress\n ? {\n ...signer,\n getAddress: () => highEthAddress,\n address: highEthAddress,\n }\n : signer;\n\n return new Seaport(finalSigner as any, {\n overrides: { contractAddress: getSeaportAddress(chainId) },\n });\n}\n\n/**\n * Compute Seaport order hash\n */\nexport function computeOrderHash(\n seaport: Seaport,\n orderParameters: any,\n counter: bigint | string\n): string {\n return seaport.getOrderHash({\n ...orderParameters,\n counter: counter.toString(),\n });\n}\n\n/**\n * Determine order status from on-chain status info\n */\nexport function getOrderStatusFromInfo(\n orderParameters: SeaportOrderParameters,\n statusInfo: SeaportOrderStatusInfo\n): SeaportOrderStatus {\n if (statusInfo.isCancelled) {\n return SeaportOrderStatus.CANCELLED;\n }\n\n if (\n statusInfo.totalFilled === statusInfo.totalSize &&\n statusInfo.totalFilled > BigInt(0)\n ) {\n return SeaportOrderStatus.FILLED;\n }\n\n const now = BigInt(Math.floor(Date.now() / 1000));\n if (orderParameters.endTime < now) {\n return SeaportOrderStatus.EXPIRED;\n }\n\n return SeaportOrderStatus.OPEN;\n}\n\n/**\n * Calculate total consideration amount (price) from order\n */\nexport function getTotalConsiderationAmount(parameters: SeaportOrderParameters): bigint {\n return parameters.consideration.reduce(\n (acc, item) => acc + item.startAmount,\n BigInt(0)\n );\n}\n\n/**\n * Format price from wei to display string\n */\nexport function formatPrice(priceWei: bigint): number {\n return parseFloat(formatEther(priceWei));\n}\n","/**\n * Validation utilities for checking order status and ownership\n */\n\nimport { PublicClient } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n ERC721_OWNER_OF_HELPER_ABI,\n ERC20_BULK_BALANCE_CHECKER_ABI,\n} from \"../abis\";\nimport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS,\n ERC721_OWNER_OF_HELPER_ADDRESS,\n ERC20_BULK_BALANCE_CHECKER_ADDRESS,\n getSeaportAddress,\n} from \"../chainConfig\";\nimport { SeaportOrderStatusInfo, SeaportOrderStatus } from \"../types\";\n\n/**\n * Bulk fetch Seaport order statuses\n */\nexport async function bulkFetchOrderStatuses(\n client: PublicClient,\n chainId: number,\n orderHashes: `0x${string}`[]\n): Promise<SeaportOrderStatusInfo[]> {\n if (orderHashes.length === 0) {\n return [];\n }\n\n const seaportAddress = getSeaportAddress(chainId);\n\n try {\n console.log(`[bulkFetchOrderStatuses] fetching ${orderHashes.length} statuses via ${BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS}`);\n const results = await readContract(client, {\n address: BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS,\n abi: BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n functionName: \"getOrderStatuses\",\n args: [seaportAddress, orderHashes],\n });\n\n const statuses = (results as any[]).map((r) => ({\n isValidated: r.isValidated,\n isCancelled: r.isCancelled,\n totalFilled: BigInt(r.totalFilled),\n totalSize: BigInt(r.totalSize),\n }));\n console.log(`[bulkFetchOrderStatuses] success: ${statuses.length} statuses`);\n return statuses;\n } catch (err) {\n console.error(`[bulkFetchOrderStatuses] FAILED for ${orderHashes.length} hashes:`, err);\n throw err;\n }\n}\n\n/**\n * Create a mapping of order hash to status\n */\nexport async function createOrderStatusMap(\n client: PublicClient,\n chainId: number,\n orderHashes: `0x${string}`[]\n): Promise<Map<string, SeaportOrderStatusInfo>> {\n const statuses = await bulkFetchOrderStatuses(client, chainId, orderHashes);\n\n const map = new Map<string, SeaportOrderStatusInfo>();\n orderHashes.forEach((hash, index) => {\n map.set(hash.toLowerCase(), statuses[index]);\n });\n\n return map;\n}\n\n/**\n * Bulk fetch NFT owners for specific token IDs\n */\nexport async function bulkFetchNftOwners(\n client: PublicClient,\n nftAddress: `0x${string}`,\n tokenIds: string[]\n): Promise<(`0x${string}` | null)[]> {\n if (tokenIds.length === 0) {\n return [];\n }\n\n try {\n console.log(`[bulkFetchNftOwners] fetching ${tokenIds.length} owners for ${nftAddress.slice(0, 10)} via ${ERC721_OWNER_OF_HELPER_ADDRESS}`);\n const owners = await readContract(client, {\n address: ERC721_OWNER_OF_HELPER_ADDRESS,\n abi: ERC721_OWNER_OF_HELPER_ABI,\n functionName: \"getTokenOwners\",\n args: [nftAddress, tokenIds.map((id) => BigInt(id))],\n });\n\n const result = (owners as `0x${string}`[]).map((owner) =>\n owner === \"0x0000000000000000000000000000000000000000\" ? null : owner\n );\n const validCount = result.filter((o) => o !== null).length;\n console.log(`[bulkFetchNftOwners] success: ${validCount}/${tokenIds.length} have owners`);\n return result;\n } catch (err) {\n console.error(`[bulkFetchNftOwners] FAILED for ${tokenIds.length} tokens — returning all null:`, err);\n return tokenIds.map(() => null);\n }\n}\n\n/**\n * Create a mapping of token ID to owner address\n */\nexport async function createOwnershipMap(\n client: PublicClient,\n nftAddress: `0x${string}`,\n tokenIds: string[]\n): Promise<Map<string, `0x${string}` | null>> {\n const owners = await bulkFetchNftOwners(client, nftAddress, tokenIds);\n\n const map = new Map<string, `0x${string}` | null>();\n tokenIds.forEach((tokenId, index) => {\n map.set(tokenId, owners[index]);\n });\n\n return map;\n}\n\n/**\n * Bulk fetch ERC20 balances for addresses\n */\nexport async function bulkFetchErc20Balances(\n client: PublicClient,\n tokenAddress: `0x${string}`,\n addresses: `0x${string}`[]\n): Promise<bigint[]> {\n if (addresses.length === 0) {\n return [];\n }\n\n try {\n console.log(`[bulkFetchErc20Balances] fetching ${addresses.length} balances for ${tokenAddress.slice(0, 10)}`);\n const balances = await readContract(client, {\n address: ERC20_BULK_BALANCE_CHECKER_ADDRESS,\n abi: ERC20_BULK_BALANCE_CHECKER_ABI,\n functionName: \"getBalances\",\n args: [tokenAddress, addresses],\n });\n\n const result = (balances as bigint[]).map((b) => BigInt(b));\n console.log(`[bulkFetchErc20Balances] success: ${result.length} balances`);\n return result;\n } catch (err) {\n console.error(`[bulkFetchErc20Balances] FAILED for ${addresses.length} addresses — returning all zero:`, err);\n return addresses.map(() => BigInt(0));\n }\n}\n\n/**\n * Create a mapping of address to ERC20 balance\n */\nexport async function createBalanceMap(\n client: PublicClient,\n tokenAddress: `0x${string}`,\n addresses: `0x${string}`[]\n): Promise<Map<string, bigint>> {\n const balances = await bulkFetchErc20Balances(client, tokenAddress, addresses);\n\n const map = new Map<string, bigint>();\n addresses.forEach((address, index) => {\n map.set(address.toLowerCase(), balances[index]);\n });\n\n return map;\n}\n\n/**\n * Validate that a listing is still valid:\n * - Order is OPEN\n * - Not expired\n * - Seller still owns the NFT\n */\nexport function isListingValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n sellerAddress: `0x${string}`,\n currentOwner: `0x${string}` | null\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (!currentOwner || currentOwner.toLowerCase() !== sellerAddress.toLowerCase()) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that a collection offer is still valid:\n * - Order is OPEN\n * - Not expired\n * - Buyer has sufficient WETH balance\n */\nexport function isCollectionOfferValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n priceWei: bigint,\n buyerBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (buyerBalance < priceWei) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that an ERC20 offer is still valid:\n * - Order is OPEN\n * - Not expired\n * - Buyer has sufficient WETH balance\n */\nexport function isErc20OfferValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n priceWei: bigint,\n buyerWethBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (buyerWethBalance < priceWei) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that an ERC20 listing is still valid:\n * - Order is OPEN\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n */\nexport function isErc20ListingValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n tokenAmount: bigint,\n sellerTokenBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (sellerTokenBalance < tokenAmount) {\n return false;\n }\n\n return true;\n}\n","/**\n * Utilities for parsing Net messages into listings and offers\n */\n\nimport { NetMessage } from \"@net-protocol/core\";\nimport { decodeAbiParameters, formatEther } from \"viem\";\nimport { Listing, CollectionOffer, Erc20Offer, Erc20Listing, Sale, SeaportOrderStatus, ItemType } from \"../types\";\nimport {\n decodeSeaportSubmission,\n getSeaportOrderFromMessageData,\n getTotalConsiderationAmount,\n formatPrice,\n} from \"./seaport\";\nimport { getCurrencySymbol, NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS, NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS } from \"../chainConfig\";\n\n/**\n * Parse a Net message into an NFT listing\n */\nexport function parseListingFromMessage(\n message: NetMessage,\n chainId: number\n): Listing | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // NFT listings have the NFT in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem) {\n return null;\n }\n\n // Must be ERC721 or ERC1155\n if (offerItem.itemType !== ItemType.ERC721 && offerItem.itemType !== ItemType.ERC1155) {\n return null;\n }\n\n const priceWei = getTotalConsiderationAmount(parameters);\n const tokenId = offerItem.identifierOrCriteria.toString();\n\n const targetFulfiller =\n parameters.zone.toLowerCase() === NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS.toLowerCase() &&\n parameters.zoneHash !== \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n ? parameters.zoneHash\n : undefined;\n\n return {\n maker: parameters.offerer,\n nftAddress: offerItem.token,\n tokenId,\n priceWei,\n price: formatPrice(priceWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"\", // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n targetFulfiller,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Parse a Net message into a collection offer\n */\nexport function parseCollectionOfferFromMessage(\n message: NetMessage,\n chainId: number\n): CollectionOffer | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // Collection offers must use the collection offer zone\n if (\n parameters.zone.toLowerCase() !==\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // Collection offers have WETH in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n // The NFT is in the consideration array with criteria type\n const nftConsideration = parameters.consideration.find(\n (item) =>\n item.itemType === ItemType.ERC721_WITH_CRITERIA ||\n item.itemType === ItemType.ERC1155_WITH_CRITERIA\n );\n\n if (!nftConsideration) {\n return null;\n }\n\n // Only support single NFT offers\n if (nftConsideration.startAmount !== BigInt(1)) {\n return null;\n }\n\n const priceWei = offerItem.startAmount;\n\n return {\n maker: parameters.offerer,\n nftAddress: nftConsideration.token,\n priceWei,\n price: formatPrice(priceWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"\", // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Get the best listing for each token (lowest price)\n */\nexport function getBestListingPerToken(listings: Listing[]): Listing[] {\n const tokenMap = new Map<string, Listing>();\n\n for (const listing of listings) {\n const key = `${listing.nftAddress.toLowerCase()}-${listing.tokenId}`;\n const existing = tokenMap.get(key);\n\n if (!existing || listing.priceWei < existing.priceWei) {\n tokenMap.set(key, listing);\n }\n }\n\n return Array.from(tokenMap.values());\n}\n\n/**\n * Get the best collection offer (highest price)\n */\nexport function getBestCollectionOffer(offers: CollectionOffer[]): CollectionOffer | null {\n if (offers.length === 0) {\n return null;\n }\n\n return offers.reduce((best, current) =>\n current.priceWei > best.priceWei ? current : best\n );\n}\n\n/**\n * Sort listings by price (lowest first)\n */\nexport function sortListingsByPrice(listings: Listing[]): Listing[] {\n return [...listings].sort((a, b) => {\n const diff = a.priceWei - b.priceWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Sort offers by price (highest first)\n */\nexport function sortOffersByPrice(offers: CollectionOffer[]): CollectionOffer[] {\n return [...offers].sort((a, b) => {\n const diff = b.priceWei - a.priceWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Parse a Net message into an ERC20 offer\n */\nexport function parseErc20OfferFromMessage(\n message: NetMessage,\n chainId: number\n): Erc20Offer | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // ERC20 offers must use the collection offer zone\n if (\n parameters.zone.toLowerCase() !==\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // ERC20 offers have WETH in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n // The ERC20 token being purchased is in the consideration array\n const erc20Consideration = parameters.consideration.find(\n (item) => item.itemType === ItemType.ERC20\n );\n\n if (!erc20Consideration) {\n return null;\n }\n\n // Must have a non-zero token amount\n const tokenAmount = erc20Consideration.startAmount;\n if (tokenAmount === BigInt(0)) {\n return null;\n }\n\n const priceWei = offerItem.startAmount;\n const pricePerTokenWei = priceWei / tokenAmount;\n\n return {\n maker: parameters.offerer,\n tokenAddress: erc20Consideration.token,\n tokenAmount,\n priceWei,\n pricePerTokenWei,\n price: formatPrice(priceWei),\n pricePerToken: formatPrice(pricePerTokenWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"0x\" as `0x${string}`, // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Sort ERC20 offers by price per token (highest first)\n */\nexport function sortErc20OffersByPricePerToken(offers: Erc20Offer[]): Erc20Offer[] {\n return [...offers].sort((a, b) => {\n const diff = b.pricePerTokenWei - a.pricePerTokenWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Parse a Net message into an ERC20 listing\n *\n * ERC20 listings have the ERC20 token in the offer array (seller is offering tokens)\n * and native currency payments in the consideration array.\n * They do NOT use the collection offer zone (that would be an offer, not a listing).\n */\nexport function parseErc20ListingFromMessage(\n message: NetMessage,\n chainId: number\n): Erc20Listing | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // ERC20 listings must NOT use the collection offer zone (that would be an offer)\n if (\n parameters.zone.toLowerCase() ===\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // ERC20 listings have the ERC20 token in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n const tokenAmount = offerItem.startAmount;\n if (tokenAmount === BigInt(0)) {\n return null;\n }\n\n const priceWei = getTotalConsiderationAmount(parameters);\n if (priceWei === BigInt(0)) {\n return null;\n }\n\n const pricePerTokenWei = priceWei / tokenAmount;\n\n return {\n maker: parameters.offerer,\n tokenAddress: offerItem.token,\n tokenAmount,\n priceWei,\n pricePerTokenWei,\n price: formatPrice(priceWei),\n pricePerToken: formatPrice(pricePerTokenWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"0x\" as `0x${string}`, // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Sort ERC20 listings by price per token (lowest first)\n */\nexport function sortErc20ListingsByPricePerToken(listings: Erc20Listing[]): Erc20Listing[] {\n return [...listings].sort((a, b) => {\n const diff = a.pricePerTokenWei - b.pricePerTokenWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * ABI for decoding zone-stored sale data from bulk storage.\n * The stored data contains: timestamp, netTotalMessageLength,\n * netTotalMessageForAppTopicLength, and the full ZoneParameters struct.\n */\nconst ZONE_STORED_SALE_ABI = [\n { type: \"uint256\" }, // timestamp\n { type: \"uint256\" }, // netTotalMessageLength\n { type: \"uint256\" }, // netTotalMessageForAppTopicLength\n {\n name: \"zoneParameters\",\n type: \"tuple\",\n internalType: \"struct ZoneParameters\",\n components: [\n { name: \"orderHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"fulfiller\", type: \"address\", internalType: \"address\" },\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct SpentItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifier\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ReceivedItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifier\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"extraData\", type: \"bytes\", internalType: \"bytes\" },\n { name: \"orderHashes\", type: \"bytes32[]\", internalType: \"bytes32[]\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n ],\n },\n] as const;\n\n/**\n * Parse a sale from bulk storage data (zone-stored sale details).\n *\n * The storage contract stores the full ZoneParameters struct for each sale,\n * keyed by order hash with operator = NET_SEAPORT_ZONE_ADDRESS.\n */\nexport function parseSaleFromStoredData(\n storedData: string,\n chainId: number\n): Sale | null {\n try {\n const cleanedData = (\n \"0x\" +\n (storedData.startsWith(\"0x\") ? storedData.slice(2) : storedData)\n ) as `0x${string}`;\n\n const [timestamp, , , zoneParameters] = decodeAbiParameters(\n ZONE_STORED_SALE_ABI,\n cleanedData\n );\n\n const offerItem = zoneParameters.offer[0];\n if (!offerItem) return null;\n\n const totalConsideration = zoneParameters.consideration.reduce(\n (acc, item) => acc + item.amount,\n BigInt(0)\n );\n\n return {\n seller: zoneParameters.offerer as `0x${string}`,\n buyer: zoneParameters.fulfiller as `0x${string}`,\n tokenAddress: offerItem.token as `0x${string}`,\n tokenId: offerItem.identifier.toString(),\n amount: offerItem.amount,\n itemType: offerItem.itemType as ItemType,\n priceWei: totalConsideration,\n price: parseFloat(formatEther(totalConsideration)),\n currency: getCurrencySymbol(chainId),\n timestamp: Number(timestamp),\n orderHash: zoneParameters.orderHash,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Sort sales by timestamp (most recent first)\n */\nexport function sortSalesByTimestamp(sales: Sale[]): Sale[] {\n return [...sales].sort((a, b) => b.timestamp - a.timestamp);\n}\n","/**\n * Approval utilities for checking and building ERC721/ERC20 approval transactions\n */\n\nimport { PublicClient } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { ERC721_APPROVAL_ABI, ERC20_APPROVAL_ABI } from \"../abis\";\nimport { WriteTransactionConfig } from \"../types\";\n\nconst MAX_UINT256 = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n\n/**\n * Check if an ERC721 collection is approved for a spender, and return an approval tx if not.\n *\n * @returns A `setApprovalForAll` tx if not approved, or `null` if already approved.\n */\nexport async function checkErc721Approval(\n client: PublicClient,\n nftAddress: `0x${string}`,\n owner: `0x${string}`,\n spender: `0x${string}`\n): Promise<WriteTransactionConfig | null> {\n const isApproved = await readContract(client, {\n address: nftAddress,\n abi: ERC721_APPROVAL_ABI,\n functionName: \"isApprovedForAll\",\n args: [owner, spender],\n });\n\n if (isApproved) {\n return null;\n }\n\n return {\n to: nftAddress,\n functionName: \"setApprovalForAll\",\n args: [spender, true],\n abi: ERC721_APPROVAL_ABI,\n };\n}\n\n/**\n * Check if an ERC20 token has sufficient allowance for a spender, and return an approval tx if not.\n *\n * @returns An `approve(spender, maxUint256)` tx if allowance is insufficient, or `null` if sufficient.\n */\nexport async function checkErc20Approval(\n client: PublicClient,\n tokenAddress: `0x${string}`,\n owner: `0x${string}`,\n spender: `0x${string}`,\n amount: bigint\n): Promise<WriteTransactionConfig | null> {\n const allowance = (await readContract(client, {\n address: tokenAddress,\n abi: ERC20_APPROVAL_ABI,\n functionName: \"allowance\",\n args: [owner, spender],\n })) as bigint;\n\n if (allowance >= amount) {\n return null;\n }\n\n return {\n to: tokenAddress,\n functionName: \"approve\",\n args: [spender, MAX_UINT256],\n abi: ERC20_APPROVAL_ABI,\n };\n}\n","/**\n * Fulfillment utilities for building Seaport fulfillOrder/fulfillAdvancedOrder transaction data\n */\n\nimport {\n SEAPORT_FULFILL_ORDER_ABI,\n SEAPORT_FULFILL_ADVANCED_ORDER_ABI,\n} from \"../abis\";\nimport {\n SeaportSubmission,\n SeaportOrderParameters,\n ItemType,\n WriteTransactionConfig,\n} from \"../types\";\n\nconst ZERO_BYTES32 = \"0x0000000000000000000000000000000000000000000000000000000000000000\" as const;\n\n/**\n * Convert SeaportOrderParameters to the tuple format expected by Seaport ABI\n */\nfunction formatOrderParameters(params: SeaportOrderParameters) {\n return {\n offerer: params.offerer,\n zone: params.zone,\n offer: params.offer.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n })),\n consideration: params.consideration.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n recipient: item.recipient,\n })),\n orderType: params.orderType,\n startTime: params.startTime,\n endTime: params.endTime,\n zoneHash: params.zoneHash,\n salt: params.salt,\n conduitKey: params.conduitKey,\n totalOriginalConsiderationItems: params.totalOriginalConsiderationItems,\n };\n}\n\n/**\n * Calculate the total native currency value needed from consideration items\n */\nfunction getNativeConsiderationValue(params: SeaportOrderParameters): bigint {\n return params.consideration.reduce((acc, item) => {\n if (item.itemType === ItemType.NATIVE) {\n return acc + item.startAmount;\n }\n return acc;\n }, BigInt(0));\n}\n\n/**\n * Build a fulfillAdvancedOrder transaction for an NFT listing (buyer pays native currency for NFT).\n *\n * Uses fulfillAdvancedOrder (instead of fulfillOrder) to support both standard and\n * private listings — private listings use a restricted zone that requires the\n * advanced order path.\n *\n * @param submission - Decoded Seaport submission from the listing's messageData\n * @param recipient - Address to receive the NFT\n * @param seaportAddress - Seaport contract address\n * @returns WriteTransactionConfig with value set to the native currency payment\n */\nexport function buildFulfillListingTx(\n submission: SeaportSubmission,\n recipient: `0x${string}`,\n seaportAddress: `0x${string}`\n): WriteTransactionConfig {\n const advancedOrder = {\n parameters: formatOrderParameters(submission.parameters),\n numerator: BigInt(1),\n denominator: BigInt(1),\n signature: submission.signature,\n extraData: \"0x\" as `0x${string}`,\n };\n\n return {\n to: seaportAddress,\n functionName: \"fulfillAdvancedOrder\",\n args: [advancedOrder, [], ZERO_BYTES32, recipient],\n abi: SEAPORT_FULFILL_ADVANCED_ORDER_ABI,\n value: getNativeConsiderationValue(submission.parameters),\n };\n}\n\n/**\n * Build a fulfillAdvancedOrder transaction for a collection offer.\n *\n * The fulfiller provides a specific NFT (tokenId) to satisfy the offerer's\n * ERC721_WITH_CRITERIA consideration item.\n *\n * @param submission - Decoded Seaport submission from the offer's messageData\n * @param tokenId - The specific token ID the fulfiller is providing\n * @param recipient - Address to receive the WETH payment\n * @param seaportAddress - Seaport contract address\n * @returns WriteTransactionConfig with value=0 (no native currency needed)\n */\nexport function buildFulfillCollectionOfferTx(\n submission: SeaportSubmission,\n tokenId: bigint,\n recipient: `0x${string}`,\n seaportAddress: `0x${string}`\n): WriteTransactionConfig {\n const advancedOrder = {\n parameters: formatOrderParameters(submission.parameters),\n numerator: BigInt(1),\n denominator: BigInt(1),\n signature: submission.signature,\n extraData: \"0x\" as `0x${string}`,\n };\n\n // CriteriaResolver: resolve the NFT criteria item in consideration (side=1)\n const criteriaResolvers = [\n {\n orderIndex: BigInt(0),\n side: 1, // Consideration side\n index: BigInt(0), // First consideration item (the NFT)\n identifier: tokenId,\n criteriaProof: [] as `0x${string}`[],\n },\n ];\n\n return {\n to: seaportAddress,\n functionName: \"fulfillAdvancedOrder\",\n args: [advancedOrder, criteriaResolvers, ZERO_BYTES32, recipient],\n abi: SEAPORT_FULFILL_ADVANCED_ORDER_ABI,\n value: BigInt(0),\n };\n}\n\n/**\n * Build a fulfillOrder transaction for an ERC20 offer (seller provides ERC20 tokens, buyer pays WETH).\n *\n * @param submission - Decoded Seaport submission from the offer's messageData\n * @param seaportAddress - Seaport contract address\n * @returns WriteTransactionConfig with value=0 (no native currency needed)\n */\nexport function buildFulfillErc20OfferTx(\n submission: SeaportSubmission,\n seaportAddress: `0x${string}`\n): WriteTransactionConfig {\n const order = {\n parameters: formatOrderParameters(submission.parameters),\n signature: submission.signature,\n };\n\n return {\n to: seaportAddress,\n functionName: \"fulfillOrder\",\n args: [order, ZERO_BYTES32],\n abi: SEAPORT_FULFILL_ORDER_ABI,\n value: BigInt(0),\n };\n}\n\n/**\n * Build a fulfillAdvancedOrder transaction for an ERC20 listing (buyer pays native currency for ERC20 tokens).\n *\n * Uses fulfillAdvancedOrder to support both standard and private listings.\n *\n * @param submission - Decoded Seaport submission from the listing's messageData\n * @param recipient - Address to receive the ERC20 tokens\n * @param seaportAddress - Seaport contract address\n * @returns WriteTransactionConfig with value set to the native currency payment\n */\nexport function buildFulfillErc20ListingTx(\n submission: SeaportSubmission,\n recipient: `0x${string}`,\n seaportAddress: `0x${string}`\n): WriteTransactionConfig {\n const advancedOrder = {\n parameters: formatOrderParameters(submission.parameters),\n numerator: BigInt(1),\n denominator: BigInt(1),\n signature: submission.signature,\n extraData: \"0x\" as `0x${string}`,\n };\n\n return {\n to: seaportAddress,\n functionName: \"fulfillAdvancedOrder\",\n args: [advancedOrder, [], ZERO_BYTES32, recipient],\n abi: SEAPORT_FULFILL_ADVANCED_ORDER_ABI,\n value: getNativeConsiderationValue(submission.parameters),\n };\n}\n","/**\n * Order creation utilities for building EIP-712 typed data and Bazaar submit transactions\n */\n\nimport { keccak256, toBytes } from \"viem\";\nimport {\n SeaportOrderParameters,\n EIP712OrderData,\n WriteTransactionConfig,\n ItemType,\n OrderType,\n CreateListingParams,\n CreateCollectionOfferParams,\n CreateErc20OfferParams,\n CreateErc20ListingParams,\n} from \"../types\";\nimport {\n BAZAAR_V2_ABI,\n BAZAAR_COLLECTION_OFFERS_ABI,\n BAZAAR_ERC20_OFFERS_ABI,\n} from \"../abis\";\nimport {\n getSeaportAddress,\n getFeeCollectorAddress,\n getNftFeeBps,\n getWrappedNativeCurrency,\n NET_SEAPORT_ZONE_ADDRESS,\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS,\n NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS,\n} from \"../chainConfig\";\n\n// EIP-712 constants\nconst SEAPORT_EIP712_DOMAIN_NAME = \"Seaport\";\nconst SEAPORT_EIP712_DOMAIN_VERSION = \"1.6\";\n\nconst ZERO_BYTES32 = \"0x0000000000000000000000000000000000000000000000000000000000000000\" as const;\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as const;\n\n/**\n * EIP-712 type definitions for Seaport OrderComponents.\n *\n * Important: OrderComponents has `counter` at the end, NOT `totalOriginalConsiderationItems`.\n * This matches the Seaport contract's EIP-712 domain.\n */\nconst SEAPORT_ORDER_EIP712_TYPES = {\n OrderComponents: [\n { name: \"offerer\", type: \"address\" },\n { name: \"zone\", type: \"address\" },\n { name: \"offer\", type: \"OfferItem[]\" },\n { name: \"consideration\", type: \"ConsiderationItem[]\" },\n { name: \"orderType\", type: \"uint8\" },\n { name: \"startTime\", type: \"uint256\" },\n { name: \"endTime\", type: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\" },\n { name: \"salt\", type: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\" },\n { name: \"counter\", type: \"uint256\" },\n ],\n OfferItem: [\n { name: \"itemType\", type: \"uint8\" },\n { name: \"token\", type: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\" },\n ],\n ConsiderationItem: [\n { name: \"itemType\", type: \"uint8\" },\n { name: \"token\", type: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\" },\n { name: \"recipient\", type: \"address\" },\n ],\n} as const;\n\n/**\n * Calculate fee amount.\n *\n * - NFTs use floor division: `(price * bps) / 10000`\n * - ERC20s use ceiling division: `(price * bps + 9999) / 10000`\n */\nexport function calculateFee(\n price: bigint,\n feeBps: number,\n useCeilingDivision: boolean\n): bigint {\n if (feeBps === 0) return BigInt(0);\n\n const fee = price * BigInt(feeBps);\n if (useCeilingDivision) {\n return (fee + BigInt(9999)) / BigInt(10000);\n }\n return fee / BigInt(10000);\n}\n\n/**\n * Generate a random salt for order uniqueness\n */\nexport function generateSalt(): bigint {\n const bytes = new Uint8Array(32);\n if (typeof globalThis.crypto !== \"undefined\" && globalThis.crypto.getRandomValues) {\n globalThis.crypto.getRandomValues(bytes);\n } else {\n // Fallback for environments without crypto\n for (let i = 0; i < 32; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n let hex = \"0x\";\n for (const b of bytes) {\n hex += b.toString(16).padStart(2, \"0\");\n }\n return BigInt(hex);\n}\n\n/**\n * Get default expiration timestamp (24 hours from now, in seconds)\n */\nexport function getDefaultExpiration(): number {\n return Math.floor(Date.now() / 1000) + 86400;\n}\n\n/**\n * Build order components for an NFT listing.\n *\n * Offer: one ERC721 item\n * Consideration: native currency payment to offerer + optional fee to feeCollector\n */\nexport function buildListingOrderComponents(\n params: CreateListingParams & { offerer: `0x${string}`; targetFulfiller?: `0x${string}` },\n chainId: number,\n counter: bigint\n): { orderParameters: SeaportOrderParameters; counter: bigint } {\n const feeBps = getNftFeeBps(chainId);\n const feeAmount = calculateFee(params.priceWei, feeBps, false);\n const sellerAmount = params.priceWei - feeAmount;\n const endTime = BigInt(params.expirationDate ?? getDefaultExpiration());\n const feeCollector = getFeeCollectorAddress(chainId);\n\n const consideration = [\n {\n itemType: ItemType.NATIVE,\n token: ZERO_ADDRESS as `0x${string}`,\n identifierOrCriteria: BigInt(0),\n startAmount: sellerAmount,\n endAmount: sellerAmount,\n recipient: params.offerer,\n },\n ];\n\n if (feeAmount > BigInt(0)) {\n consideration.push({\n itemType: ItemType.NATIVE,\n token: ZERO_ADDRESS as `0x${string}`,\n identifierOrCriteria: BigInt(0),\n startAmount: feeAmount,\n endAmount: feeAmount,\n recipient: feeCollector,\n });\n }\n\n // Private order support\n let zone: `0x${string}`;\n let zoneHash: `0x${string}`;\n\n if (params.targetFulfiller) {\n zone = NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS;\n // zoneHash is keccak256 of the raw address bytes (20 bytes)\n zoneHash = keccak256(toBytes(params.targetFulfiller));\n } else {\n zone = NET_SEAPORT_ZONE_ADDRESS;\n zoneHash = ZERO_BYTES32;\n }\n\n const orderParameters: SeaportOrderParameters = {\n offerer: params.offerer,\n zone,\n offer: [\n {\n itemType: ItemType.ERC721,\n token: params.nftAddress,\n identifierOrCriteria: BigInt(params.tokenId),\n startAmount: BigInt(1),\n endAmount: BigInt(1),\n },\n ],\n consideration,\n orderType: OrderType.FULL_RESTRICTED,\n startTime: BigInt(0),\n endTime,\n zoneHash,\n salt: generateSalt(),\n conduitKey: ZERO_BYTES32,\n totalOriginalConsiderationItems: BigInt(consideration.length),\n };\n\n return { orderParameters, counter };\n}\n\n/**\n * Build order components for a collection offer.\n *\n * Offer: WETH payment\n * Consideration: ERC721_WITH_CRITERIA (any token from collection) to offerer + optional fee\n */\nexport function buildCollectionOfferOrderComponents(\n params: CreateCollectionOfferParams & { offerer: `0x${string}` },\n chainId: number,\n counter: bigint\n): { orderParameters: SeaportOrderParameters; counter: bigint } {\n const weth = getWrappedNativeCurrency(chainId);\n if (!weth) {\n throw new Error(`No wrapped native currency configured for chain ${chainId}`);\n }\n\n const feeBps = getNftFeeBps(chainId);\n const feeAmount = calculateFee(params.priceWei, feeBps, false);\n const endTime = BigInt(params.expirationDate ?? getDefaultExpiration());\n const feeCollector = getFeeCollectorAddress(chainId);\n\n const consideration = [\n {\n itemType: ItemType.ERC721_WITH_CRITERIA,\n token: params.nftAddress,\n identifierOrCriteria: BigInt(0), // Any token in the collection\n startAmount: BigInt(1),\n endAmount: BigInt(1),\n recipient: params.offerer,\n },\n ];\n\n if (feeAmount > BigInt(0)) {\n consideration.push({\n itemType: ItemType.ERC20,\n token: weth.address,\n identifierOrCriteria: BigInt(0),\n startAmount: feeAmount,\n endAmount: feeAmount,\n recipient: feeCollector,\n });\n }\n\n const orderParameters: SeaportOrderParameters = {\n offerer: params.offerer,\n zone: NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS,\n offer: [\n {\n itemType: ItemType.ERC20,\n token: weth.address,\n identifierOrCriteria: BigInt(0),\n startAmount: params.priceWei,\n endAmount: params.priceWei,\n },\n ],\n consideration,\n orderType: OrderType.FULL_RESTRICTED,\n startTime: BigInt(0),\n endTime,\n zoneHash: ZERO_BYTES32,\n salt: generateSalt(),\n conduitKey: ZERO_BYTES32,\n totalOriginalConsiderationItems: BigInt(consideration.length),\n };\n\n return { orderParameters, counter };\n}\n\n/**\n * Build order components for an ERC20 offer (buying ERC20 tokens with WETH).\n *\n * Offer: WETH payment\n * Consideration: ERC20 tokens to offerer + optional WETH fee to feeCollector\n */\nexport function buildErc20OfferOrderComponents(\n params: CreateErc20OfferParams & { offerer: `0x${string}` },\n chainId: number,\n counter: bigint\n): { orderParameters: SeaportOrderParameters; counter: bigint } {\n const weth = getWrappedNativeCurrency(chainId);\n if (!weth) {\n throw new Error(`No wrapped native currency configured for chain ${chainId}`);\n }\n\n const feeBps = getNftFeeBps(chainId);\n const feeAmount = calculateFee(params.priceWei, feeBps, true); // Ceiling division for ERC20s\n const endTime = BigInt(params.expirationDate ?? getDefaultExpiration());\n const feeCollector = getFeeCollectorAddress(chainId);\n\n const consideration = [\n {\n itemType: ItemType.ERC20,\n token: params.tokenAddress,\n identifierOrCriteria: BigInt(0),\n startAmount: params.tokenAmount,\n endAmount: params.tokenAmount,\n recipient: params.offerer,\n },\n ];\n\n if (feeAmount > BigInt(0)) {\n consideration.push({\n itemType: ItemType.ERC20,\n token: weth.address,\n identifierOrCriteria: BigInt(0),\n startAmount: feeAmount,\n endAmount: feeAmount,\n recipient: feeCollector,\n });\n }\n\n const orderParameters: SeaportOrderParameters = {\n offerer: params.offerer,\n zone: NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS,\n offer: [\n {\n itemType: ItemType.ERC20,\n token: weth.address,\n identifierOrCriteria: BigInt(0),\n startAmount: params.priceWei,\n endAmount: params.priceWei,\n },\n ],\n consideration,\n orderType: OrderType.FULL_RESTRICTED,\n startTime: BigInt(0),\n endTime,\n zoneHash: ZERO_BYTES32,\n salt: generateSalt(),\n conduitKey: ZERO_BYTES32,\n totalOriginalConsiderationItems: BigInt(consideration.length),\n };\n\n return { orderParameters, counter };\n}\n\n/**\n * Build order components for an ERC20 listing (selling ERC20 tokens for native currency).\n *\n * Offer: ERC20 tokens\n * Consideration: native currency payment to offerer + optional fee to feeCollector\n */\nexport function buildErc20ListingOrderComponents(\n params: CreateErc20ListingParams & { offerer: `0x${string}`; targetFulfiller?: `0x${string}` },\n chainId: number,\n counter: bigint\n): { orderParameters: SeaportOrderParameters; counter: bigint } {\n const feeBps = getNftFeeBps(chainId);\n const feeAmount = calculateFee(params.priceWei, feeBps, true); // Ceiling division for ERC20s\n const sellerAmount = params.priceWei - feeAmount;\n const endTime = BigInt(params.expirationDate ?? getDefaultExpiration());\n const feeCollector = getFeeCollectorAddress(chainId);\n\n const consideration = [\n {\n itemType: ItemType.NATIVE,\n token: ZERO_ADDRESS as `0x${string}`,\n identifierOrCriteria: BigInt(0),\n startAmount: sellerAmount,\n endAmount: sellerAmount,\n recipient: params.offerer,\n },\n ];\n\n if (feeAmount > BigInt(0)) {\n consideration.push({\n itemType: ItemType.NATIVE,\n token: ZERO_ADDRESS as `0x${string}`,\n identifierOrCriteria: BigInt(0),\n startAmount: feeAmount,\n endAmount: feeAmount,\n recipient: feeCollector,\n });\n }\n\n // Private order support\n let zone: `0x${string}`;\n let zoneHash: `0x${string}`;\n\n if (params.targetFulfiller) {\n zone = NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS;\n // zoneHash is keccak256 of the raw address bytes (20 bytes)\n zoneHash = keccak256(toBytes(params.targetFulfiller));\n } else {\n zone = NET_SEAPORT_ZONE_ADDRESS;\n zoneHash = ZERO_BYTES32;\n }\n\n const orderParameters: SeaportOrderParameters = {\n offerer: params.offerer,\n zone,\n offer: [\n {\n itemType: ItemType.ERC20,\n token: params.tokenAddress,\n identifierOrCriteria: BigInt(0),\n startAmount: params.tokenAmount,\n endAmount: params.tokenAmount,\n },\n ],\n consideration,\n orderType: OrderType.FULL_RESTRICTED,\n startTime: BigInt(0),\n endTime,\n zoneHash,\n salt: generateSalt(),\n conduitKey: ZERO_BYTES32,\n totalOriginalConsiderationItems: BigInt(consideration.length),\n };\n\n return { orderParameters, counter };\n}\n\n/**\n * Build EIP-712 typed data for a Seaport order.\n *\n * The message object uses `counter` instead of `totalOriginalConsiderationItems`,\n * matching Seaport's EIP-712 domain specification.\n */\nexport function buildEIP712OrderData(\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n chainId: number,\n seaportAddress: `0x${string}`\n): EIP712OrderData {\n // Build the EIP-712 message: OrderComponents (parameters without totalOriginalConsiderationItems, with counter)\n const message: Record<string, unknown> = {\n offerer: orderParameters.offerer,\n zone: orderParameters.zone,\n offer: orderParameters.offer.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n })),\n consideration: orderParameters.consideration.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n recipient: item.recipient,\n })),\n orderType: orderParameters.orderType,\n startTime: orderParameters.startTime,\n endTime: orderParameters.endTime,\n zoneHash: orderParameters.zoneHash,\n salt: orderParameters.salt,\n conduitKey: orderParameters.conduitKey,\n counter,\n };\n\n return {\n domain: {\n name: SEAPORT_EIP712_DOMAIN_NAME,\n version: SEAPORT_EIP712_DOMAIN_VERSION,\n chainId,\n verifyingContract: seaportAddress,\n },\n types: SEAPORT_ORDER_EIP712_TYPES as unknown as Record<string, Array<{ name: string; type: string }>>,\n primaryType: \"OrderComponents\",\n message,\n orderParameters,\n counter,\n };\n}\n\n/**\n * Build a submit transaction for a Bazaar contract (NFT listings, collection offers, ERC20 offers/listings).\n *\n * @param contractAddress - The Bazaar contract address to submit to\n * @param abi - The contract ABI (BAZAAR_V2_ABI, BAZAAR_COLLECTION_OFFERS_ABI, or BAZAAR_ERC20_OFFERS_ABI)\n * @param orderParameters - The signed order parameters\n * @param counter - The order counter\n * @param signature - The EIP-712 signature from the offerer\n */\nexport function buildSubmitOrderTx(\n contractAddress: `0x${string}`,\n abi: readonly unknown[],\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n signature: `0x${string}`\n): WriteTransactionConfig {\n const submission = {\n parameters: {\n offerer: orderParameters.offerer,\n zone: orderParameters.zone,\n offer: orderParameters.offer.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n })),\n consideration: orderParameters.consideration.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n recipient: item.recipient,\n })),\n orderType: orderParameters.orderType,\n startTime: orderParameters.startTime,\n endTime: orderParameters.endTime,\n zoneHash: orderParameters.zoneHash,\n salt: orderParameters.salt,\n conduitKey: orderParameters.conduitKey,\n totalOriginalConsiderationItems: orderParameters.totalOriginalConsiderationItems,\n },\n counter,\n signature,\n };\n\n return {\n to: contractAddress,\n functionName: \"submit\",\n args: [submission],\n abi,\n };\n}\n","/**\n * BazaarClient - Client for interacting with Net Bazaar\n *\n * Provides methods for:\n * - Reading NFT listings and collection offers\n * - Preparing transactions for creating/canceling listings and offers\n */\n\nimport { PublicClient, createPublicClient, defineChain, http, type Abi } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { NetClient, NetMessage } from \"@net-protocol/core\";\nimport {\n Listing,\n CollectionOffer,\n Erc20Offer,\n Erc20Listing,\n Sale,\n GetListingsOptions,\n GetCollectionOffersOptions,\n GetErc20OffersOptions,\n GetErc20ListingsOptions,\n GetSalesOptions,\n SeaportOrderStatus,\n WriteTransactionConfig,\n SeaportOrderComponents,\n SeaportOrderParameters,\n PreparedFulfillment,\n PreparedOrder,\n CreateListingParams,\n CreateCollectionOfferParams,\n CreateErc20OfferParams,\n CreateErc20ListingParams,\n} from \"../types\";\nimport {\n SEAPORT_CANCEL_ABI,\n SEAPORT_GET_COUNTER_ABI,\n BAZAAR_V2_ABI,\n BAZAAR_COLLECTION_OFFERS_ABI,\n BAZAAR_ERC20_OFFERS_ABI,\n} from \"../abis\";\nimport {\n getBazaarChainConfig,\n getBazaarAddress,\n getCollectionOffersAddress,\n getErc20OffersAddress,\n getErc20BazaarAddress,\n getSeaportAddress,\n getWrappedNativeCurrency,\n isBazaarSupportedOnChain,\n NET_SEAPORT_ZONE_ADDRESS,\n} from \"../chainConfig\";\nimport {\n parseListingFromMessage,\n parseCollectionOfferFromMessage,\n parseErc20OfferFromMessage,\n parseErc20ListingFromMessage,\n parseSaleFromStoredData,\n getBestListingPerToken,\n sortListingsByPrice,\n sortOffersByPrice,\n sortErc20OffersByPricePerToken,\n sortErc20ListingsByPricePerToken,\n createSeaportInstance,\n computeOrderHash,\n getSeaportOrderFromMessageData,\n getOrderStatusFromInfo,\n decodeSeaportSubmission,\n} from \"../utils\";\nimport {\n bulkFetchOrderStatuses,\n bulkFetchNftOwners,\n bulkFetchErc20Balances,\n isListingValid,\n isCollectionOfferValid,\n isErc20OfferValid,\n isErc20ListingValid,\n} from \"../utils/validation\";\nimport { STORAGE_CONTRACT } from \"@net-protocol/storage\";\nimport { checkErc721Approval, checkErc20Approval } from \"../utils/approvals\";\nimport {\n buildFulfillListingTx,\n buildFulfillCollectionOfferTx,\n buildFulfillErc20OfferTx,\n buildFulfillErc20ListingTx,\n} from \"../utils/fulfillment\";\nimport {\n buildListingOrderComponents,\n buildCollectionOfferOrderComponents,\n buildErc20OfferOrderComponents,\n buildErc20ListingOrderComponents,\n buildEIP712OrderData,\n buildSubmitOrderTx,\n} from \"../utils/orderCreation\";\n\n// ERC721TokenOwnerRangeHelper contract (deployed via CREATE2, same address on all chains)\nconst ERC721_TOKEN_OWNER_RANGE_HELPER_ADDRESS = \"0x00000000f4ec2016d6e856b0cb14d635949bfd3f\" as const;\n\nconst ERC721_TOKEN_OWNER_RANGE_HELPER_ABI = [\n {\n inputs: [\n { name: \"nftContract\", type: \"address\" },\n { name: \"user\", type: \"address\" },\n { name: \"startTokenId\", type: \"uint256\" },\n { name: \"endTokenId\", type: \"uint256\" },\n ],\n name: \"getOwnedTokensInRange\",\n outputs: [{ name: \"\", type: \"uint256[]\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n// Batch size for owned token queries (matches website)\nconst OWNED_TOKENS_BATCH_SIZE = 5000n;\n\n// Default RPC URLs for chains (same as @net-protocol/core)\nconst CHAIN_RPC_URLS: Record<number, string[]> = {\n 8453: [\"https://base-mainnet.public.blastapi.io\", \"https://mainnet.base.org\"],\n 84532: [\"https://sepolia.base.org\"],\n 666666666: [\"https://rpc.degen.tips\"],\n 5112: [\"https://rpc.ham.fun\"],\n 57073: [\"https://rpc-qnd.inkonchain.com\"],\n 130: [\"https://mainnet.unichain.org\"],\n 999: [\"https://rpc.hyperliquid.xyz/evm\"],\n 9745: [\"https://rpc.plasma.to\"],\n 143: [\"https://rpc3.monad.xyz\"],\n};\n\nexport class BazaarClient {\n private chainId: number;\n private client: PublicClient;\n private netClient: NetClient;\n private rpcUrl: string;\n\n constructor(params: { chainId: number; rpcUrl?: string; publicClient?: PublicClient }) {\n if (!isBazaarSupportedOnChain(params.chainId)) {\n throw new Error(`Bazaar is not supported on chain ${params.chainId}`);\n }\n\n this.chainId = params.chainId;\n this.rpcUrl = params.rpcUrl || CHAIN_RPC_URLS[params.chainId]?.[0] || \"\";\n\n if (params.publicClient) {\n this.client = params.publicClient;\n } else {\n if (!this.rpcUrl) {\n throw new Error(`No RPC URL available for chain ${params.chainId}`);\n }\n\n const config = getBazaarChainConfig(params.chainId)!;\n\n this.client = createPublicClient({\n chain: defineChain({\n id: params.chainId,\n name: `Chain ${params.chainId}`,\n nativeCurrency: {\n name: config.wrappedNativeCurrency.name.replace(\"Wrapped \", \"\"),\n symbol: config.currencySymbol.toUpperCase(),\n decimals: 18,\n },\n rpcUrls: {\n default: { http: [this.rpcUrl] },\n },\n }),\n transport: http(this.rpcUrl),\n batch: { multicall: true },\n });\n }\n\n this.netClient = new NetClient({\n chainId: params.chainId,\n overrides: params.rpcUrl ? { rpcUrls: [params.rpcUrl] } : undefined,\n });\n }\n\n /**\n * Get valid NFT listings for a collection\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller still owns the NFT\n *\n * Results are deduplicated (one per token) and sorted by price (lowest first)\n */\n async getListings(options: GetListingsOptions): Promise<Listing[]> {\n const { nftAddress, excludeMaker, maker, maxMessages = 200 } = options;\n const bazaarAddress = getBazaarAddress(this.chainId);\n\n const filter = {\n appAddress: bazaarAddress,\n topic: nftAddress?.toLowerCase(),\n maker,\n };\n\n let startIndex: number;\n let endIndex: number;\n\n if (options.startIndex != null && options.endIndex != null) {\n startIndex = options.startIndex;\n endIndex = options.endIndex;\n } else {\n // Get message count\n const count = await this.netClient.getMessageCount({ filter });\n if (count === 0) {\n return [];\n }\n startIndex = Math.max(0, count - maxMessages);\n endIndex = count;\n }\n\n // Fetch messages (most recent)\n const messages = await this.netClient.getMessages({\n filter,\n startIndex,\n endIndex,\n });\n\n return this.processListingsFromMessages(messages, options);\n }\n\n /**\n * Process pre-fetched messages into valid NFT listings.\n *\n * Use this when messages have already been fetched (e.g. via useNetMessages)\n * to avoid redundant RPC calls.\n */\n async processListingsFromMessages(\n messages: NetMessage[],\n options: Pick<GetListingsOptions, \"nftAddress\" | \"excludeMaker\" | \"includeExpired\">\n ): Promise<Listing[]> {\n const { nftAddress, excludeMaker, includeExpired = false } = options;\n const tag = `[BazaarClient.processListings chain=${this.chainId}]`;\n\n // Parse messages into listings\n let listings: Listing[] = [];\n for (const message of messages) {\n const listing = parseListingFromMessage(message, this.chainId);\n if (!listing) continue;\n\n // Filter by excludeMaker\n if (excludeMaker && listing.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n listings.push(listing);\n }\n\n console.log(tag, `parsed ${listings.length}/${messages.length} messages into listings`);\n\n if (listings.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const listing of listings) {\n const order = getSeaportOrderFromMessageData(listing.messageData);\n listing.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = listings.map((l) => l.orderHash as `0x${string}`);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n listings.forEach((listing, index) => {\n const statusInfo = statusInfos[index];\n listing.orderStatus = getOrderStatusFromInfo(listing.orderComponents!, statusInfo);\n });\n\n // Log status distribution before filtering\n const statusCounts: Record<string, number> = {};\n const now = Math.floor(Date.now() / 1000);\n let expiredCount = 0;\n for (const l of listings) {\n statusCounts[l.orderStatus] = (statusCounts[l.orderStatus] || 0) + 1;\n if (l.expirationDate <= now) expiredCount++;\n }\n console.log(tag, `order statuses:`, statusCounts, `expired: ${expiredCount}`);\n\n // Filter by order status: keep OPEN (and optionally EXPIRED) listings\n listings = listings.filter(\n (l) =>\n (l.orderStatus === SeaportOrderStatus.OPEN && l.expirationDate > now) ||\n (includeExpired && l.orderStatus === SeaportOrderStatus.EXPIRED)\n );\n\n console.log(tag, `after status filter: ${listings.length} (OPEN${includeExpired ? ' + EXPIRED' : ''})`);\n\n if (listings.length === 0) {\n return [];\n }\n\n // Validate ownership (only for OPEN listings; expired listings skip ownership check)\n const openListings = listings.filter((l) => l.orderStatus === SeaportOrderStatus.OPEN);\n const expiredListings = includeExpired ? listings.filter((l) => l.orderStatus === SeaportOrderStatus.EXPIRED) : [];\n\n let validOpenListings: Listing[];\n const beforeOwnership = openListings.length;\n\n if (nftAddress) {\n // Single collection: one bulkFetchNftOwners call\n const tokenIds = openListings.map((l) => l.tokenId);\n const owners = await bulkFetchNftOwners(this.client, nftAddress, tokenIds);\n\n validOpenListings = openListings.filter((listing, index) => {\n const owner = owners[index];\n return isListingValid(\n listing.orderStatus,\n listing.expirationDate,\n listing.maker,\n owner\n );\n });\n } else {\n // Cross-collection: group by nftAddress, fetch owners per group in parallel\n const groups = new Map<string, Listing[]>();\n for (const listing of openListings) {\n const key = listing.nftAddress.toLowerCase();\n const group = groups.get(key);\n if (group) {\n group.push(listing);\n } else {\n groups.set(key, [listing]);\n }\n }\n\n const groupEntries = Array.from(groups.entries());\n const ownerResults = await Promise.all(\n groupEntries.map(([addr, groupListings]) =>\n bulkFetchNftOwners(\n this.client,\n addr as `0x${string}`,\n groupListings.map((l) => l.tokenId)\n )\n )\n );\n\n validOpenListings = [];\n groupEntries.forEach(([, groupListings], groupIndex) => {\n const owners = ownerResults[groupIndex];\n for (let i = 0; i < groupListings.length; i++) {\n const listing = groupListings[i];\n if (\n isListingValid(\n listing.orderStatus,\n listing.expirationDate,\n listing.maker,\n owners[i]\n )\n ) {\n validOpenListings.push(listing);\n }\n }\n });\n }\n\n console.log(tag, `after ownership filter: ${validOpenListings.length}/${beforeOwnership} (${beforeOwnership - validOpenListings.length} dropped)`);\n\n // Deduplicate open listings (best price per token), sort by price\n const dedupedOpen = sortListingsByPrice(getBestListingPerToken(validOpenListings));\n\n // For expired: only keep tokens that don't already have an active listing\n const activeTokenKeys = new Set(dedupedOpen.map((l) => `${l.nftAddress.toLowerCase()}-${l.tokenId}`));\n const uniqueExpired = getBestListingPerToken(\n expiredListings.filter((l) => !activeTokenKeys.has(`${l.nftAddress.toLowerCase()}-${l.tokenId}`))\n );\n const sortedExpired = sortListingsByPrice(uniqueExpired);\n\n // Active listings first (by price), then expired listings after\n const result = [...dedupedOpen, ...sortedExpired];\n console.log(tag, `final: ${result.length} listings (${dedupedOpen.length} open, ${sortedExpired.length} expired)`);\n return result;\n }\n\n /**\n * Get valid collection offers for a collection\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price (highest first)\n */\n async getCollectionOffers(options: GetCollectionOffersOptions): Promise<CollectionOffer[]> {\n const { nftAddress, excludeMaker, maxMessages = 100 } = options;\n const collectionOffersAddress = getCollectionOffersAddress(this.chainId);\n\n // Get message count\n const count = await this.netClient.getMessageCount({\n filter: {\n appAddress: collectionOffersAddress,\n topic: nftAddress?.toLowerCase(),\n },\n });\n\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter: {\n appAddress: collectionOffersAddress,\n topic: nftAddress?.toLowerCase(),\n },\n startIndex,\n endIndex: count,\n });\n\n return this.processCollectionOffersFromMessages(messages, options);\n }\n\n /**\n * Process pre-fetched messages into valid collection offers.\n *\n * Use this when messages have already been fetched (e.g. via useNetMessages)\n * to avoid redundant RPC calls.\n */\n async processCollectionOffersFromMessages(\n messages: NetMessage[],\n options: Pick<GetCollectionOffersOptions, \"nftAddress\" | \"excludeMaker\">\n ): Promise<CollectionOffer[]> {\n const { nftAddress, excludeMaker } = options;\n const tag = `[BazaarClient.processCollectionOffers chain=${this.chainId}]`;\n const weth = getWrappedNativeCurrency(this.chainId);\n\n if (!weth) {\n return [];\n }\n\n // Parse messages into offers\n let offers: CollectionOffer[] = [];\n for (const message of messages) {\n const offer = parseCollectionOfferFromMessage(message, this.chainId);\n if (!offer) continue;\n\n // Validate WETH token matches\n const order = getSeaportOrderFromMessageData(offer.messageData);\n const offerToken = order.parameters.offer?.[0]?.token?.toLowerCase();\n if (offerToken !== weth.address.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && offer.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n offers.push(offer);\n }\n\n console.log(tag, `parsed ${offers.length}/${messages.length} messages into offers`);\n\n if (offers.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const offer of offers) {\n const order = getSeaportOrderFromMessageData(offer.messageData);\n offer.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = offers.map((o) => o.orderHash as `0x${string}`);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n offers.forEach((offer, index) => {\n const statusInfo = statusInfos[index];\n offer.orderStatus = getOrderStatusFromInfo(offer.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n const now = Math.floor(Date.now() / 1000);\n offers = offers.filter(\n (o) =>\n o.orderStatus === SeaportOrderStatus.OPEN &&\n o.expirationDate > now\n );\n\n console.log(tag, `after status filter: ${offers.length} OPEN & not expired`);\n\n if (offers.length === 0) {\n return [];\n }\n\n // Validate WETH balances\n const uniqueMakers = [...new Set(offers.map((o) => o.maker))];\n const balances = await bulkFetchErc20Balances(this.client, weth.address, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to offers where buyer has sufficient balance\n const beforeBalance = offers.length;\n offers = offers.filter((offer) => {\n const balance = balanceMap.get(offer.maker.toLowerCase()) || BigInt(0);\n return isCollectionOfferValid(\n offer.orderStatus,\n offer.expirationDate,\n offer.priceWei,\n balance\n );\n });\n\n console.log(tag, `after balance filter: ${offers.length}/${beforeBalance} (${beforeBalance - offers.length} dropped)`);\n\n // Sort by price (highest first)\n return sortOffersByPrice(offers);\n }\n\n /**\n * Get valid ERC20 offers for a token\n *\n * ERC20 offers are only available on Base (8453) and HyperEVM (999).\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price per token (highest first)\n */\n async getErc20Offers(options: GetErc20OffersOptions): Promise<Erc20Offer[]> {\n const { tokenAddress, excludeMaker, maxMessages = 200 } = options;\n const erc20OffersAddress = getErc20OffersAddress(this.chainId);\n\n // ERC20 offers only available on Base and HyperEVM\n if (!erc20OffersAddress) {\n return [];\n }\n\n // Get message count\n const count = await this.netClient.getMessageCount({\n filter: {\n appAddress: erc20OffersAddress,\n topic: tokenAddress.toLowerCase(),\n },\n });\n\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter: {\n appAddress: erc20OffersAddress,\n topic: tokenAddress.toLowerCase(),\n },\n startIndex,\n endIndex: count,\n });\n\n return this.processErc20OffersFromMessages(messages, options);\n }\n\n /**\n * Process pre-fetched messages into valid ERC20 offers.\n *\n * Use this when messages have already been fetched (e.g. via useNetMessages)\n * to avoid redundant RPC calls.\n */\n async processErc20OffersFromMessages(\n messages: NetMessage[],\n options: Pick<GetErc20OffersOptions, \"tokenAddress\" | \"excludeMaker\">\n ): Promise<Erc20Offer[]> {\n const { tokenAddress, excludeMaker } = options;\n const tag = `[BazaarClient.processErc20Offers chain=${this.chainId}]`;\n const weth = getWrappedNativeCurrency(this.chainId);\n\n if (!weth) {\n return [];\n }\n\n // Parse messages into offers\n let offers: Erc20Offer[] = [];\n for (const message of messages) {\n const offer = parseErc20OfferFromMessage(message, this.chainId);\n if (!offer) continue;\n\n // Validate WETH token matches\n const order = getSeaportOrderFromMessageData(offer.messageData);\n const offerToken = order.parameters.offer?.[0]?.token?.toLowerCase();\n if (offerToken !== weth.address.toLowerCase()) {\n continue;\n }\n\n // Validate the consideration token matches the requested token\n if (offer.tokenAddress.toLowerCase() !== tokenAddress.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && offer.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n offers.push(offer);\n }\n\n console.log(tag, `parsed ${offers.length}/${messages.length} messages into offers`);\n\n if (offers.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const offer of offers) {\n const order = getSeaportOrderFromMessageData(offer.messageData);\n offer.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = offers.map((o) => o.orderHash);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n offers.forEach((offer, index) => {\n const statusInfo = statusInfos[index];\n offer.orderStatus = getOrderStatusFromInfo(offer.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n const now = Math.floor(Date.now() / 1000);\n offers = offers.filter(\n (o) =>\n o.orderStatus === SeaportOrderStatus.OPEN &&\n o.expirationDate > now\n );\n\n console.log(tag, `after status filter: ${offers.length} OPEN & not expired`);\n\n if (offers.length === 0) {\n return [];\n }\n\n // Validate WETH balances\n const uniqueMakers = [...new Set(offers.map((o) => o.maker))];\n const balances = await bulkFetchErc20Balances(this.client, weth.address, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to offers where buyer has sufficient balance\n const beforeBalance = offers.length;\n offers = offers.filter((offer) => {\n const balance = balanceMap.get(offer.maker.toLowerCase()) || BigInt(0);\n return isErc20OfferValid(\n offer.orderStatus,\n offer.expirationDate,\n offer.priceWei,\n balance\n );\n });\n\n console.log(tag, `after balance filter: ${offers.length}/${beforeBalance} (${beforeBalance - offers.length} dropped)`);\n\n // Sort by price per token (highest first) - no deduplication for ERC20 offers\n return sortErc20OffersByPricePerToken(offers);\n }\n\n /**\n * Get valid ERC20 listings for a token\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n *\n * Results are sorted by price per token (lowest first). No deduplication —\n * all valid listings are returned (grouped by maker in the UI).\n */\n async getErc20Listings(options: GetErc20ListingsOptions): Promise<Erc20Listing[]> {\n const { tokenAddress, excludeMaker, maker, maxMessages = 200 } = options;\n const erc20BazaarAddress = getErc20BazaarAddress(this.chainId);\n\n const filter = {\n appAddress: erc20BazaarAddress,\n topic: tokenAddress.toLowerCase(),\n maker,\n };\n\n let startIndex: number;\n let endIndex: number;\n\n if (options.startIndex != null && options.endIndex != null) {\n startIndex = options.startIndex;\n endIndex = options.endIndex;\n } else {\n // Get message count\n const count = await this.netClient.getMessageCount({ filter });\n if (count === 0) {\n return [];\n }\n startIndex = Math.max(0, count - maxMessages);\n endIndex = count;\n }\n\n // Fetch messages (most recent)\n const messages = await this.netClient.getMessages({\n filter,\n startIndex,\n endIndex,\n });\n\n return this.processErc20ListingsFromMessages(messages, options);\n }\n\n /**\n * Process pre-fetched messages into valid ERC20 listings.\n *\n * Use this when messages have already been fetched (e.g. via useNetMessages)\n * to avoid redundant RPC calls.\n */\n async processErc20ListingsFromMessages(\n messages: NetMessage[],\n options: Pick<GetErc20ListingsOptions, \"tokenAddress\" | \"excludeMaker\">\n ): Promise<Erc20Listing[]> {\n const { tokenAddress, excludeMaker } = options;\n const tag = `[BazaarClient.processErc20Listings chain=${this.chainId}]`;\n\n // Parse messages into listings\n let listings: Erc20Listing[] = [];\n for (const message of messages) {\n const listing = parseErc20ListingFromMessage(message, this.chainId);\n if (!listing) continue;\n\n // Validate the offer token matches the requested token\n if (listing.tokenAddress.toLowerCase() !== tokenAddress.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && listing.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n listings.push(listing);\n }\n\n console.log(tag, `parsed ${listings.length}/${messages.length} messages into listings`);\n\n if (listings.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const listing of listings) {\n const order = getSeaportOrderFromMessageData(listing.messageData);\n listing.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = listings.map((l) => l.orderHash);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n listings.forEach((listing, index) => {\n const statusInfo = statusInfos[index];\n listing.orderStatus = getOrderStatusFromInfo(listing.orderComponents!, statusInfo);\n });\n\n // Log status distribution before filtering\n const statusCounts: Record<string, number> = {};\n const now = Math.floor(Date.now() / 1000);\n let expiredCount = 0;\n for (const l of listings) {\n statusCounts[l.orderStatus] = (statusCounts[l.orderStatus] || 0) + 1;\n if (l.expirationDate <= now) expiredCount++;\n }\n console.log(tag, `order statuses:`, statusCounts, `expired: ${expiredCount}`);\n\n // Filter to OPEN orders only\n listings = listings.filter(\n (l) =>\n l.orderStatus === SeaportOrderStatus.OPEN &&\n l.expirationDate > now\n );\n\n console.log(tag, `after status filter: ${listings.length} OPEN & not expired`);\n\n if (listings.length === 0) {\n return [];\n }\n\n // Validate seller's ERC20 balances\n const uniqueMakers = [...new Set(listings.map((l) => l.maker))];\n const balances = await bulkFetchErc20Balances(this.client, tokenAddress, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to listings where seller has sufficient token balance\n const beforeBalance = listings.length;\n listings = listings.filter((listing) => {\n const balance = balanceMap.get(listing.maker.toLowerCase()) || BigInt(0);\n return isErc20ListingValid(\n listing.orderStatus,\n listing.expirationDate,\n listing.tokenAmount,\n balance\n );\n });\n\n console.log(tag, `after balance filter: ${listings.length}/${beforeBalance} (${beforeBalance - listings.length} dropped)`);\n\n // Sort by price per token (lowest first) — no deduplication for ERC20 listings\n return sortErc20ListingsByPricePerToken(listings);\n }\n\n /**\n * Get recent sales for a collection\n *\n * Sales are stored differently from listings: Net messages contain order hashes,\n * and the actual sale data is fetched from the bulk storage contract.\n *\n * Results are sorted by timestamp (most recent first)\n */\n async getSales(options: GetSalesOptions): Promise<Sale[]> {\n const { nftAddress, maxMessages = 100 } = options;\n\n const filter = {\n appAddress: NET_SEAPORT_ZONE_ADDRESS as `0x${string}`,\n topic: nftAddress.toLowerCase(),\n };\n\n // Get message count\n const count = await this.netClient.getMessageCount({ filter });\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter,\n startIndex,\n endIndex: count,\n });\n\n return this.processSalesFromMessages(messages, options);\n }\n\n /**\n * Process pre-fetched messages into sales.\n *\n * Each message's data field contains an order hash. The actual sale data\n * is fetched from the bulk storage contract using these order hashes.\n */\n async processSalesFromMessages(\n messages: NetMessage[],\n options: Pick<GetSalesOptions, \"nftAddress\">\n ): Promise<Sale[]> {\n const tag = `[BazaarClient.processSales chain=${this.chainId}]`;\n\n if (messages.length === 0) {\n return [];\n }\n\n // Extract order hashes from message data\n const orderHashes = messages.map((m) => m.data);\n console.log(tag, `fetching ${orderHashes.length} sale details from storage...`);\n\n // Build bulk storage keys: each keyed by order hash, operator = zone address\n const bulkKeys = orderHashes.map((hash) => ({\n key: hash as `0x${string}`,\n operator: NET_SEAPORT_ZONE_ADDRESS as `0x${string}`,\n }));\n\n // Fetch sale data from bulk storage contract\n let storedResults: readonly { text: string; value: string }[];\n try {\n storedResults = await this.client.readContract({\n abi: STORAGE_CONTRACT.abi,\n address: STORAGE_CONTRACT.address,\n functionName: \"bulkGet\",\n args: [bulkKeys],\n }) as readonly { text: string; value: string }[];\n } catch (err) {\n console.error(tag, \"bulk storage fetch failed:\", err);\n return [];\n }\n\n // Parse each stored result into a Sale\n const sales: Sale[] = [];\n for (const result of storedResults) {\n if (!result.value || result.value === \"0x\") continue;\n const sale = parseSaleFromStoredData(result.value, this.chainId);\n if (sale) {\n sales.push(sale);\n }\n }\n\n console.log(tag, `parsed ${sales.length}/${storedResults.length} sales`);\n\n return sales;\n }\n\n /**\n * Get the chain ID this client is configured for\n */\n getChainId(): number {\n return this.chainId;\n }\n\n /**\n * Get the bazaar contract address for this chain\n */\n getBazaarAddress(): `0x${string}` {\n return getBazaarAddress(this.chainId);\n }\n\n /**\n * Get the collection offers contract address for this chain\n */\n getCollectionOffersAddress(): `0x${string}` {\n return getCollectionOffersAddress(this.chainId);\n }\n\n /**\n * Get the ERC20 offers contract address for this chain\n * Only available on Base (8453) and HyperEVM (999)\n */\n getErc20OffersAddress(): `0x${string}` | undefined {\n return getErc20OffersAddress(this.chainId);\n }\n\n /**\n * Get the ERC20 bazaar (listings) contract address for this chain\n */\n getErc20BazaarAddress(): `0x${string}` {\n return getErc20BazaarAddress(this.chainId);\n }\n\n /**\n * Get the Seaport contract address for this chain\n */\n getSeaportAddress(): `0x${string}` {\n return getSeaportAddress(this.chainId);\n }\n\n /**\n * Prepare a transaction to cancel a listing\n *\n * The listing must have been created by the caller.\n * Use the orderComponents from the Listing object returned by getListings().\n */\n prepareCancelListing(listing: Listing): WriteTransactionConfig {\n if (!listing.orderComponents) {\n throw new Error(\"Listing does not have order components\");\n }\n\n return this.prepareCancelOrder(listing.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel a collection offer\n *\n * The offer must have been created by the caller.\n * Use the orderComponents from the CollectionOffer object returned by getCollectionOffers().\n */\n prepareCancelCollectionOffer(offer: CollectionOffer): WriteTransactionConfig {\n if (!offer.orderComponents) {\n throw new Error(\"Offer does not have order components\");\n }\n\n return this.prepareCancelOrder(offer.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel an ERC20 listing\n *\n * The listing must have been created by the caller.\n * Use the orderComponents from the Erc20Listing object returned by getErc20Listings().\n */\n prepareCancelErc20Listing(listing: Erc20Listing): WriteTransactionConfig {\n if (!listing.orderComponents) {\n throw new Error(\"Listing does not have order components\");\n }\n\n return this.prepareCancelOrder(listing.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel a Seaport order\n *\n * This is a low-level method. Prefer prepareCancelListing or prepareCancelCollectionOffer.\n */\n prepareCancelOrder(orderComponents: SeaportOrderComponents): WriteTransactionConfig {\n const seaportAddress = getSeaportAddress(this.chainId);\n\n // Convert order components to the format expected by Seaport\n const orderForCancel = {\n offerer: orderComponents.offerer,\n zone: orderComponents.zone,\n offer: orderComponents.offer.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n })),\n consideration: orderComponents.consideration.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n recipient: item.recipient,\n })),\n orderType: orderComponents.orderType,\n startTime: orderComponents.startTime,\n endTime: orderComponents.endTime,\n zoneHash: orderComponents.zoneHash,\n salt: orderComponents.salt,\n conduitKey: orderComponents.conduitKey,\n counter: orderComponents.counter,\n };\n\n return {\n to: seaportAddress,\n functionName: \"cancel\",\n args: [[orderForCancel]],\n abi: SEAPORT_CANCEL_ABI,\n };\n }\n\n // ─── Fulfillment Methods ───────────────────────────────────────────\n\n /**\n * Prepare a fulfillment for an NFT listing (buy an NFT).\n *\n * Returns approval transactions (if the listing requires ERC20 payment) and\n * the Seaport `fulfillAdvancedOrder` transaction with the correct native currency value.\n */\n async prepareFulfillListing(\n listing: Listing,\n fulfillerAddress: `0x${string}`\n ): Promise<PreparedFulfillment> {\n const submission = decodeSeaportSubmission(listing.messageData);\n const seaportAddress = getSeaportAddress(this.chainId);\n const fulfillment = buildFulfillListingTx(submission, fulfillerAddress, seaportAddress);\n\n // NFT listings paid in native currency don't need ERC20 approvals from the buyer\n return { approvals: [], fulfillment };\n }\n\n /**\n * Prepare a fulfillment for a collection offer (sell your NFT into an offer).\n *\n * Returns ERC721 approval transaction (if the NFT isn't approved for Seaport)\n * and the Seaport `fulfillAdvancedOrder` transaction.\n */\n async prepareFulfillCollectionOffer(\n offer: CollectionOffer,\n tokenId: string,\n fulfillerAddress: `0x${string}`\n ): Promise<PreparedFulfillment> {\n const submission = decodeSeaportSubmission(offer.messageData);\n const seaportAddress = getSeaportAddress(this.chainId);\n\n // Check ERC721 approval (fulfiller needs to approve Seaport to transfer their NFT)\n const approvals: WriteTransactionConfig[] = [];\n const nftApproval = await checkErc721Approval(\n this.client,\n offer.nftAddress,\n fulfillerAddress,\n seaportAddress\n );\n if (nftApproval) {\n approvals.push(nftApproval);\n }\n\n const fulfillment = buildFulfillCollectionOfferTx(\n submission,\n BigInt(tokenId),\n fulfillerAddress,\n seaportAddress\n );\n\n return { approvals, fulfillment };\n }\n\n /**\n * Prepare a fulfillment for an ERC20 offer (sell your ERC20 tokens into an offer).\n *\n * Returns ERC20 approval transaction (if the token isn't approved for Seaport)\n * and the Seaport `fulfillOrder` transaction.\n */\n async prepareFulfillErc20Offer(\n offer: Erc20Offer,\n fulfillerAddress: `0x${string}`\n ): Promise<PreparedFulfillment> {\n const submission = decodeSeaportSubmission(offer.messageData);\n const seaportAddress = getSeaportAddress(this.chainId);\n\n // Check ERC20 approval (fulfiller needs to approve Seaport for the token being sold)\n const approvals: WriteTransactionConfig[] = [];\n const tokenApproval = await checkErc20Approval(\n this.client,\n offer.tokenAddress,\n fulfillerAddress,\n seaportAddress,\n offer.tokenAmount\n );\n if (tokenApproval) {\n approvals.push(tokenApproval);\n }\n\n const fulfillment = buildFulfillErc20OfferTx(submission, seaportAddress);\n\n return { approvals, fulfillment };\n }\n\n /**\n * Prepare a fulfillment for an ERC20 listing (buy ERC20 tokens with native currency).\n *\n * Returns the Seaport `fulfillAdvancedOrder` transaction with the correct native currency value.\n * No approvals needed since the buyer pays in native currency.\n */\n async prepareFulfillErc20Listing(\n listing: Erc20Listing,\n fulfillerAddress: `0x${string}`\n ): Promise<PreparedFulfillment> {\n const submission = decodeSeaportSubmission(listing.messageData);\n const seaportAddress = getSeaportAddress(this.chainId);\n const fulfillment = buildFulfillErc20ListingTx(submission, fulfillerAddress, seaportAddress);\n\n return { approvals: [], fulfillment };\n }\n\n // ─── Order Creation Methods (Step 1: Build EIP-712 data) ──────────\n\n /**\n * Fetch the Seaport counter for an address\n */\n private async getSeaportCounter(offerer: `0x${string}`): Promise<bigint> {\n const seaportAddress = getSeaportAddress(this.chainId);\n const counter = await readContract(this.client, {\n address: seaportAddress,\n abi: SEAPORT_GET_COUNTER_ABI,\n functionName: \"getCounter\",\n args: [offerer],\n });\n return BigInt(counter as bigint);\n }\n\n /**\n * Prepare an NFT listing order for signing.\n *\n * Returns EIP-712 typed data for the caller to sign, plus any maker approvals needed\n * (ERC721 `setApprovalForAll` for Seaport).\n */\n async prepareCreateListing(\n params: CreateListingParams & { offerer: `0x${string}`; targetFulfiller?: `0x${string}` }\n ): Promise<PreparedOrder> {\n const seaportAddress = getSeaportAddress(this.chainId);\n const counter = await this.getSeaportCounter(params.offerer);\n\n const { orderParameters } = buildListingOrderComponents(params, this.chainId, counter);\n const eip712 = buildEIP712OrderData(orderParameters, counter, this.chainId, seaportAddress);\n\n // Check ERC721 approval\n const approvals: WriteTransactionConfig[] = [];\n const nftApproval = await checkErc721Approval(\n this.client,\n params.nftAddress,\n params.offerer,\n seaportAddress\n );\n if (nftApproval) {\n approvals.push(nftApproval);\n }\n\n return { eip712, approvals };\n }\n\n /**\n * Prepare a collection offer order for signing.\n *\n * Returns EIP-712 typed data for the caller to sign, plus any maker approvals needed\n * (WETH `approve` for Seaport).\n */\n async prepareCreateCollectionOffer(\n params: CreateCollectionOfferParams & { offerer: `0x${string}` }\n ): Promise<PreparedOrder> {\n const seaportAddress = getSeaportAddress(this.chainId);\n const weth = getWrappedNativeCurrency(this.chainId);\n if (!weth) {\n throw new Error(`No wrapped native currency configured for chain ${this.chainId}`);\n }\n\n const counter = await this.getSeaportCounter(params.offerer);\n\n const { orderParameters } = buildCollectionOfferOrderComponents(params, this.chainId, counter);\n const eip712 = buildEIP712OrderData(orderParameters, counter, this.chainId, seaportAddress);\n\n // Check WETH approval\n const approvals: WriteTransactionConfig[] = [];\n const wethApproval = await checkErc20Approval(\n this.client,\n weth.address,\n params.offerer,\n seaportAddress,\n params.priceWei\n );\n if (wethApproval) {\n approvals.push(wethApproval);\n }\n\n return { eip712, approvals };\n }\n\n /**\n * Prepare an ERC20 offer order for signing.\n *\n * Returns EIP-712 typed data for the caller to sign, plus any maker approvals needed\n * (WETH `approve` for Seaport).\n */\n async prepareCreateErc20Offer(\n params: CreateErc20OfferParams & { offerer: `0x${string}` }\n ): Promise<PreparedOrder> {\n const seaportAddress = getSeaportAddress(this.chainId);\n const weth = getWrappedNativeCurrency(this.chainId);\n if (!weth) {\n throw new Error(`No wrapped native currency configured for chain ${this.chainId}`);\n }\n\n const counter = await this.getSeaportCounter(params.offerer);\n\n const { orderParameters } = buildErc20OfferOrderComponents(params, this.chainId, counter);\n const eip712 = buildEIP712OrderData(orderParameters, counter, this.chainId, seaportAddress);\n\n // Check WETH approval\n const approvals: WriteTransactionConfig[] = [];\n const wethApproval = await checkErc20Approval(\n this.client,\n weth.address,\n params.offerer,\n seaportAddress,\n params.priceWei\n );\n if (wethApproval) {\n approvals.push(wethApproval);\n }\n\n return { eip712, approvals };\n }\n\n /**\n * Prepare an ERC20 listing order for signing.\n *\n * Returns EIP-712 typed data for the caller to sign, plus any maker approvals needed\n * (ERC20 `approve` for Seaport).\n */\n async prepareCreateErc20Listing(\n params: CreateErc20ListingParams & { offerer: `0x${string}`; targetFulfiller?: `0x${string}` }\n ): Promise<PreparedOrder> {\n const seaportAddress = getSeaportAddress(this.chainId);\n const counter = await this.getSeaportCounter(params.offerer);\n\n const { orderParameters } = buildErc20ListingOrderComponents(params, this.chainId, counter);\n const eip712 = buildEIP712OrderData(orderParameters, counter, this.chainId, seaportAddress);\n\n // Check ERC20 approval (seller needs to approve Seaport for the token being sold)\n const approvals: WriteTransactionConfig[] = [];\n const tokenApproval = await checkErc20Approval(\n this.client,\n params.tokenAddress,\n params.offerer,\n seaportAddress,\n params.tokenAmount\n );\n if (tokenApproval) {\n approvals.push(tokenApproval);\n }\n\n return { eip712, approvals };\n }\n\n // ─── Order Creation Methods (Step 2: Submit signed order) ─────────\n\n /**\n * Prepare a submit transaction for an NFT listing.\n *\n * Call this after the user has signed the EIP-712 data from prepareCreateListing().\n */\n prepareSubmitListing(\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n signature: `0x${string}`\n ): WriteTransactionConfig {\n return buildSubmitOrderTx(\n getBazaarAddress(this.chainId),\n BAZAAR_V2_ABI,\n orderParameters,\n counter,\n signature\n );\n }\n\n /**\n * Prepare a submit transaction for a collection offer.\n *\n * Call this after the user has signed the EIP-712 data from prepareCreateCollectionOffer().\n */\n prepareSubmitCollectionOffer(\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n signature: `0x${string}`\n ): WriteTransactionConfig {\n return buildSubmitOrderTx(\n getCollectionOffersAddress(this.chainId),\n BAZAAR_COLLECTION_OFFERS_ABI,\n orderParameters,\n counter,\n signature\n );\n }\n\n /**\n * Prepare a submit transaction for an ERC20 offer.\n *\n * Call this after the user has signed the EIP-712 data from prepareCreateErc20Offer().\n */\n prepareSubmitErc20Offer(\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n signature: `0x${string}`\n ): WriteTransactionConfig {\n const erc20OffersAddress = getErc20OffersAddress(this.chainId);\n if (!erc20OffersAddress) {\n throw new Error(`ERC20 offers not available on chain ${this.chainId}`);\n }\n\n return buildSubmitOrderTx(\n erc20OffersAddress,\n BAZAAR_ERC20_OFFERS_ABI,\n orderParameters,\n counter,\n signature\n );\n }\n\n /**\n * Prepare a submit transaction for an ERC20 listing.\n *\n * Call this after the user has signed the EIP-712 data from prepareCreateErc20Listing().\n */\n prepareSubmitErc20Listing(\n orderParameters: SeaportOrderParameters,\n counter: bigint,\n signature: `0x${string}`\n ): WriteTransactionConfig {\n return buildSubmitOrderTx(\n getErc20BazaarAddress(this.chainId),\n BAZAAR_V2_ABI,\n orderParameters,\n counter,\n signature\n );\n }\n\n // ─── Owned Tokens Query ─────────────────────────────────────────────\n\n /**\n * Get token IDs owned by an address for an ERC721 collection.\n *\n * Uses the on-chain ERC721TokenOwnerRangeHelper contract, batching\n * large ranges into 5000-token chunks to avoid RPC limits.\n */\n async getOwnedTokens(params: {\n nftAddress: `0x${string}`;\n ownerAddress: `0x${string}`;\n startTokenId?: bigint;\n endTokenId?: bigint;\n }): Promise<bigint[]> {\n const { nftAddress, ownerAddress } = params;\n const startTokenId = params.startTokenId ?? 0n;\n const endTokenId = params.endTokenId ?? 10000n;\n\n const ownedTokens: bigint[] = [];\n let current = startTokenId;\n\n while (current < endTokenId) {\n const batchEnd = current + OWNED_TOKENS_BATCH_SIZE < endTokenId\n ? current + OWNED_TOKENS_BATCH_SIZE\n : endTokenId;\n\n try {\n const result = await readContract(this.client, {\n address: ERC721_TOKEN_OWNER_RANGE_HELPER_ADDRESS,\n abi: ERC721_TOKEN_OWNER_RANGE_HELPER_ABI as unknown as Abi,\n functionName: \"getOwnedTokensInRange\",\n args: [nftAddress, ownerAddress, current, batchEnd],\n }) as bigint[];\n\n for (const tokenId of result) {\n ownedTokens.push(tokenId);\n }\n } catch {\n // Batch failed (e.g. RPC timeout or gas limit), skip it\n }\n\n current = batchEnd;\n }\n\n return ownedTokens;\n }\n}\n","/**\n * React hook for fetching NFT listings from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { PublicClient } from \"viem\";\nimport { usePublicClient } from \"wagmi\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Listing, SeaportOrderStatus } from \"../types\";\nimport { getBazaarAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarListingsOptions {\n /** Chain ID to query */\n chainId: number;\n /** NFT collection address (optional - if omitted, fetches recent listings across all collections) */\n nftAddress?: `0x${string}`;\n /** Exclude listings from this address */\n excludeMaker?: `0x${string}`;\n /** Only include listings from this address */\n maker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Override start index for message range */\n startIndex?: number;\n /** Override end index for message range */\n endIndex?: number;\n /** Include expired listings in results (default: false) */\n includeExpired?: boolean;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n /** Optional viem PublicClient (defaults to wagmi's client for the chain) */\n publicClient?: PublicClient;\n}\n\nexport interface UseBazaarListingsResult {\n /** Valid listings (deduplicated, sorted by price) */\n listings: Listing[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid NFT listings from Bazaar\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller still owns the NFT\n *\n * Results are deduplicated (one per token) and sorted by price (lowest first).\n * If `nftAddress` is omitted, fetches recent listings across all collections on the chain.\n *\n * @example\n * ```tsx\n * const { listings, isLoading, error } = useBazaarListings({\n * chainId: 8453,\n * nftAddress: \"0x...\",\n * maxMessages: 100,\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <ul>\n * {listings.map((listing) => (\n * <li key={listing.orderHash}>\n * Token #{listing.tokenId} - {listing.price} {listing.currency}\n * </li>\n * ))}\n * </ul>\n * );\n * ```\n */\nexport function useBazaarListings({\n chainId,\n nftAddress,\n excludeMaker,\n maker,\n maxMessages = 200,\n startIndex: startIndexOverride,\n endIndex: endIndexOverride,\n includeExpired = false,\n enabled = true,\n publicClient,\n}: UseBazaarListingsOptions): UseBazaarListingsResult {\n const wagmiClient = usePublicClient({ chainId });\n const resolvedClient = (publicClient ?? wagmiClient) as PublicClient | undefined;\n\n const [listings, setListings] = useState<Listing[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n const hasRangeOverride = startIndexOverride != null && endIndexOverride != null;\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get bazaar address for the chain\n const bazaarAddress = useMemo(\n () => (isSupported ? getBazaarAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: bazaarAddress as `0x${string}`,\n topic: nftAddress?.toLowerCase(),\n maker,\n }),\n [bazaarAddress, nftAddress, maker]\n );\n\n // Get message count (skip when range overrides are provided)\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported && !hasRangeOverride,\n });\n\n // Calculate range\n const startIndex = hasRangeOverride\n ? startIndexOverride!\n : Math.max(0, totalCount - maxMessages);\n const endIndex = hasRangeOverride ? endIndexOverride! : totalCount;\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex,\n enabled: enabled && isSupported && (hasRangeOverride || totalCount > 0),\n });\n\n const TAG = `[useBazaarListings chain=${chainId} nft=${nftAddress?.slice(0, 10) ?? \"all\"}]`;\n\n // Log pipeline state changes\n useEffect(() => {\n console.log(TAG, {\n enabled,\n isSupported,\n hasRangeOverride,\n totalCount,\n isLoadingCount,\n startIndex,\n endIndex,\n messagesLength: messages?.length ?? 0,\n isLoadingMessages,\n messagesError: messagesError?.message,\n });\n }, [enabled, isSupported, hasRangeOverride, totalCount, isLoadingCount, startIndex, endIndex, messages?.length, isLoadingMessages, messagesError]);\n\n // Process listings when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setListings([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setListings([]);\n return;\n }\n\n let cancelled = false;\n\n async function processListings() {\n setIsProcessing(true);\n setProcessingError(undefined);\n console.log(TAG, `processing ${messages.length} messages...`);\n\n try {\n const client = new BazaarClient({ chainId, publicClient: resolvedClient });\n const validListings = await client.processListingsFromMessages(\n messages,\n { nftAddress, excludeMaker, includeExpired }\n );\n console.log(TAG, `processed → ${validListings.length} valid listings`);\n if (!cancelled) {\n setListings(validListings);\n }\n } catch (err) {\n console.error(TAG, \"processing error:\", err);\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setListings([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processListings();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, nftAddress, excludeMaker, includeExpired, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n listings,\n isLoading: (hasRangeOverride ? false : isLoadingCount) || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching collection offers from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { PublicClient } from \"viem\";\nimport { usePublicClient } from \"wagmi\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { CollectionOffer } from \"../types\";\nimport { getCollectionOffersAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarCollectionOffersOptions {\n /** Chain ID to query */\n chainId: number;\n /** NFT collection address (optional - if omitted, fetches recent offers across all collections) */\n nftAddress?: `0x${string}`;\n /** Exclude offers from this address */\n excludeMaker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 100) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarCollectionOffersResult {\n /** Valid collection offers (sorted by price, highest first) */\n offers: CollectionOffer[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid collection offers from Bazaar\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price (highest first)\n *\n * @example\n * ```tsx\n * const { offers, isLoading, error } = useBazaarCollectionOffers({\n * chainId: 8453,\n * nftAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestOffer = offers[0];\n * if (bestOffer) {\n * return <div>Best offer: {bestOffer.price} {bestOffer.currency}</div>;\n * }\n * ```\n */\nexport function useBazaarCollectionOffers({\n chainId,\n nftAddress,\n excludeMaker,\n maxMessages = 100,\n enabled = true,\n}: UseBazaarCollectionOffersOptions): UseBazaarCollectionOffersResult {\n const wagmiClient = usePublicClient({ chainId });\n\n const [offers, setOffers] = useState<CollectionOffer[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get collection offers address for the chain\n const collectionOffersAddress = useMemo(\n () => (isSupported ? getCollectionOffersAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: collectionOffersAddress as `0x${string}`,\n topic: nftAddress?.toLowerCase(),\n }),\n [collectionOffersAddress, nftAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && isSupported && totalCount > 0,\n });\n\n const TAG = `[useBazaarCollectionOffers chain=${chainId}${nftAddress ? ` nft=${nftAddress.slice(0, 10)}` : \"\"}]`;\n\n // Log pipeline state changes\n useEffect(() => {\n console.log(TAG, {\n enabled,\n isSupported,\n totalCount,\n isLoadingCount,\n startIndex,\n endIndex: totalCount,\n messagesLength: messages?.length ?? 0,\n isLoadingMessages,\n messagesError: messagesError?.message,\n });\n }, [enabled, isSupported, totalCount, isLoadingCount, startIndex, messages?.length, isLoadingMessages, messagesError]);\n\n // Process offers when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setOffers([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setOffers([]);\n return;\n }\n\n let cancelled = false;\n\n async function processOffers() {\n setIsProcessing(true);\n setProcessingError(undefined);\n console.log(TAG, `processing ${messages.length} messages...`);\n\n try {\n const client = new BazaarClient({ chainId, publicClient: wagmiClient as PublicClient });\n const validOffers = await client.processCollectionOffersFromMessages(\n messages,\n { nftAddress, excludeMaker }\n );\n console.log(TAG, `processed → ${validOffers.length} valid offers`);\n\n if (!cancelled) {\n setOffers(validOffers);\n }\n } catch (err) {\n console.error(TAG, \"processing error:\", err);\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setOffers([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processOffers();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, nftAddress, excludeMaker, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n offers,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching ERC20 offers from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { PublicClient } from \"viem\";\nimport { usePublicClient } from \"wagmi\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Erc20Offer } from \"../types\";\nimport { getErc20OffersAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarErc20OffersOptions {\n /** Chain ID to query */\n chainId: number;\n /** ERC20 token address */\n tokenAddress: `0x${string}`;\n /** Exclude offers from this address */\n excludeMaker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarErc20OffersResult {\n /** Valid ERC20 offers (sorted by price per token, highest first) */\n offers: Erc20Offer[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid ERC20 offers from Bazaar\n *\n * ERC20 offers are only available on Base (8453) and HyperEVM (999).\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price per token (highest first)\n *\n * @example\n * ```tsx\n * const { offers, isLoading, error } = useBazaarErc20Offers({\n * chainId: 8453,\n * tokenAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestOffer = offers[0];\n * if (bestOffer) {\n * return (\n * <div>\n * Best offer: {bestOffer.pricePerToken} {bestOffer.currency} per token\n * (total: {bestOffer.price} {bestOffer.currency} for {bestOffer.tokenAmount.toString()} tokens)\n * </div>\n * );\n * }\n * ```\n */\nexport function useBazaarErc20Offers({\n chainId,\n tokenAddress,\n excludeMaker,\n maxMessages = 200,\n enabled = true,\n}: UseBazaarErc20OffersOptions): UseBazaarErc20OffersResult {\n const wagmiClient = usePublicClient({ chainId });\n\n const [offers, setOffers] = useState<Erc20Offer[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported and has ERC20 offers\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get ERC20 offers address for the chain (only Base and HyperEVM)\n const erc20OffersAddress = useMemo(\n () => (isSupported ? getErc20OffersAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // ERC20 offers only available on chains with the contract deployed\n const hasErc20Offers = Boolean(erc20OffersAddress);\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: erc20OffersAddress as `0x${string}`,\n topic: tokenAddress.toLowerCase(),\n }),\n [erc20OffersAddress, tokenAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && hasErc20Offers,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && hasErc20Offers && totalCount > 0,\n });\n\n const TAG = `[useBazaarErc20Offers chain=${chainId} token=${tokenAddress.slice(0, 10)}]`;\n\n // Log pipeline state changes\n useEffect(() => {\n console.log(TAG, {\n enabled,\n hasErc20Offers,\n totalCount,\n isLoadingCount,\n startIndex,\n endIndex: totalCount,\n messagesLength: messages?.length ?? 0,\n isLoadingMessages,\n messagesError: messagesError?.message,\n });\n }, [enabled, hasErc20Offers, totalCount, isLoadingCount, startIndex, messages?.length, isLoadingMessages, messagesError]);\n\n // Process offers when messages change\n useEffect(() => {\n if (!hasErc20Offers || !enabled) {\n setOffers([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setOffers([]);\n return;\n }\n\n let cancelled = false;\n\n async function processOffers() {\n setIsProcessing(true);\n setProcessingError(undefined);\n console.log(TAG, `processing ${messages.length} messages...`);\n\n try {\n const client = new BazaarClient({ chainId, publicClient: wagmiClient as PublicClient });\n const validOffers = await client.processErc20OffersFromMessages(\n messages,\n { tokenAddress, excludeMaker }\n );\n console.log(TAG, `processed → ${validOffers.length} valid offers`);\n\n if (!cancelled) {\n setOffers(validOffers);\n }\n } catch (err) {\n console.error(TAG, \"processing error:\", err);\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setOffers([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processOffers();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, tokenAddress, excludeMaker, messages, hasErc20Offers, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n offers,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching ERC20 listings from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { PublicClient } from \"viem\";\nimport { usePublicClient } from \"wagmi\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Erc20Listing } from \"../types\";\nimport { getErc20BazaarAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarErc20ListingsOptions {\n /** Chain ID to query */\n chainId: number;\n /** ERC20 token address */\n tokenAddress: `0x${string}`;\n /** Exclude listings from this address */\n excludeMaker?: `0x${string}`;\n /** Only include listings from this address */\n maker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Override start index for message range */\n startIndex?: number;\n /** Override end index for message range */\n endIndex?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n /** Optional viem PublicClient (defaults to wagmi's client for the chain) */\n publicClient?: PublicClient;\n}\n\nexport interface UseBazaarErc20ListingsResult {\n /** Valid ERC20 listings (sorted by price per token, lowest first) */\n listings: Erc20Listing[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid ERC20 listings from Bazaar\n *\n * ERC20 listings are available on all supported chains.\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n *\n * Results are sorted by price per token (lowest first)\n *\n * @example\n * ```tsx\n * const { listings, isLoading, error } = useBazaarErc20Listings({\n * chainId: 8453,\n * tokenAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestListing = listings[0];\n * if (bestListing) {\n * return (\n * <div>\n * Best listing: {bestListing.pricePerToken} {bestListing.currency} per token\n * (total: {bestListing.price} {bestListing.currency} for {bestListing.tokenAmount.toString()} tokens)\n * </div>\n * );\n * }\n * ```\n */\nexport function useBazaarErc20Listings({\n chainId,\n tokenAddress,\n excludeMaker,\n maker,\n maxMessages = 200,\n startIndex: startIndexOverride,\n endIndex: endIndexOverride,\n enabled = true,\n publicClient,\n}: UseBazaarErc20ListingsOptions): UseBazaarErc20ListingsResult {\n const wagmiClient = usePublicClient({ chainId });\n const resolvedClient = (publicClient ?? wagmiClient) as PublicClient | undefined;\n\n const [listings, setListings] = useState<Erc20Listing[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n const hasRangeOverride = startIndexOverride != null && endIndexOverride != null;\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get ERC20 bazaar address for the chain (available on all chains)\n const erc20BazaarAddress = useMemo(\n () => (isSupported ? getErc20BazaarAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: erc20BazaarAddress as `0x${string}`,\n topic: tokenAddress.toLowerCase(),\n maker,\n }),\n [erc20BazaarAddress, tokenAddress, maker]\n );\n\n // Get message count (skip when range overrides are provided)\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported && !hasRangeOverride,\n });\n\n // Calculate range\n const startIndex = hasRangeOverride\n ? startIndexOverride!\n : Math.max(0, totalCount - maxMessages);\n const endIndex = hasRangeOverride ? endIndexOverride! : totalCount;\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex,\n enabled: enabled && isSupported && (hasRangeOverride || totalCount > 0),\n });\n\n const TAG = `[useBazaarErc20Listings chain=${chainId} token=${tokenAddress.slice(0, 10)}]`;\n\n // Log pipeline state changes\n useEffect(() => {\n console.log(TAG, {\n enabled,\n isSupported,\n hasRangeOverride,\n totalCount,\n isLoadingCount,\n startIndex,\n endIndex,\n messagesLength: messages?.length ?? 0,\n isLoadingMessages,\n messagesError: messagesError?.message,\n });\n }, [enabled, isSupported, hasRangeOverride, totalCount, isLoadingCount, startIndex, endIndex, messages?.length, isLoadingMessages, messagesError]);\n\n // Process listings when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setListings([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setListings([]);\n return;\n }\n\n let cancelled = false;\n\n async function processListings() {\n setIsProcessing(true);\n setProcessingError(undefined);\n console.log(TAG, `processing ${messages.length} messages...`);\n\n try {\n const client = new BazaarClient({ chainId, publicClient: resolvedClient });\n const validListings = await client.processErc20ListingsFromMessages(\n messages,\n { tokenAddress, excludeMaker }\n );\n console.log(TAG, `processed → ${validListings.length} valid listings`);\n\n if (!cancelled) {\n setListings(validListings);\n }\n } catch (err) {\n console.error(TAG, \"processing error:\", err);\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setListings([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processListings();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, tokenAddress, excludeMaker, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n listings,\n isLoading: (hasRangeOverride ? false : isLoadingCount) || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching recent sales from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { PublicClient } from \"viem\";\nimport { usePublicClient } from \"wagmi\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Sale } from \"../types\";\nimport { NET_SEAPORT_ZONE_ADDRESS, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarSalesOptions {\n /** Chain ID to query */\n chainId: number;\n /** NFT collection address */\n nftAddress: `0x${string}`;\n /** Maximum number of messages to fetch (default: 100) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarSalesResult {\n /** Recent sales (sorted by timestamp, most recent first) */\n sales: Sale[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching recent sales from Bazaar\n *\n * Sales data flows differently from listings/offers:\n * - Net messages (appAddress=zone, topic=nftAddress) contain order hashes\n * - Actual sale data is fetched from the bulk storage contract\n *\n * Results are sorted by timestamp (most recent first)\n *\n * @example\n * ```tsx\n * const { sales, isLoading, error } = useBazaarSales({\n * chainId: 8453,\n * nftAddress: \"0x...\",\n * maxMessages: 100,\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <ul>\n * {sales.map((sale) => (\n * <li key={sale.orderHash}>\n * Token #{sale.tokenId} - {sale.price} {sale.currency}\n * </li>\n * ))}\n * </ul>\n * );\n * ```\n */\nexport function useBazaarSales({\n chainId,\n nftAddress,\n maxMessages = 100,\n enabled = true,\n}: UseBazaarSalesOptions): UseBazaarSalesResult {\n const wagmiClient = usePublicClient({ chainId });\n\n const [sales, setSales] = useState<Sale[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Build filter: appAddress = zone contract, topic = nft address\n const filter = useMemo(\n () => ({\n appAddress: NET_SEAPORT_ZONE_ADDRESS as `0x${string}`,\n topic: nftAddress.toLowerCase(),\n }),\n [nftAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && isSupported && totalCount > 0,\n });\n\n const TAG = `[useBazaarSales chain=${chainId} nft=${nftAddress.slice(0, 10)}]`;\n\n // Log pipeline state changes\n useEffect(() => {\n console.log(TAG, {\n enabled,\n isSupported,\n totalCount,\n isLoadingCount,\n startIndex,\n endIndex: totalCount,\n messagesLength: messages?.length ?? 0,\n isLoadingMessages,\n messagesError: messagesError?.message,\n });\n }, [enabled, isSupported, totalCount, isLoadingCount, startIndex, messages?.length, isLoadingMessages, messagesError]);\n\n // Process sales when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setSales([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setSales([]);\n return;\n }\n\n let cancelled = false;\n\n async function processSales() {\n setIsProcessing(true);\n setProcessingError(undefined);\n console.log(TAG, `processing ${messages.length} messages...`);\n\n try {\n const client = new BazaarClient({ chainId, publicClient: wagmiClient as PublicClient });\n const parsedSales = await client.processSalesFromMessages(\n messages,\n { nftAddress }\n );\n console.log(TAG, `processed → ${parsedSales.length} sales`);\n\n if (!cancelled) {\n setSales(parsedSales);\n }\n } catch (err) {\n console.error(TAG, \"processing error:\", err);\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setSales([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processSales();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, nftAddress, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n sales,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n"]}