@letsbot/sdk 0.0.0-stage → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/generated/operations.ts","../src/rate-limit.ts","../src/retry.ts","../src/client.ts","../src/resources.ts","../src/webhooks.ts","../src/generated/crm-operations.ts","../src/crm.ts","../src/generated/erp-operations.ts","../src/erp.ts","../src/identity.ts","../src/index.ts"],"names":["error","options","createHmac","timingSafeEqual","UNSAFE"],"mappings":";;;;;AAWO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,KAAA,CAAM;AAAA,EACvB,IAAA,GAAe,iBAAA;AAAA;AAAA,EAGxB,MAAA;AAAA;AAAA,EAGA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA;AAAA;AAAA,EAGA,IAAA;AAAA;AAAA,EAGA,WAAA;AAAA;AAAA,EAGA,UAAA;AAAA;AAAA,EAGA,OAAA;AAAA,EAET,YAAY,IAAA,EAMT;AACD,IAAA,KAAA,CAAM,gBAAA,CAAgB,YAAY,IAAA,CAAK,MAAA,EAAQ,KAAK,IAAA,EAAM,IAAA,CAAK,WAAW,CAAC,CAAA;AAC3E,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AACxB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,WAAW,IAAA,CAAK,IAAA,EAAM,CAAC,YAAA,EAAc,MAAA,EAAQ,OAAO,CAAC,CAAA;AACjE,IAAA,IAAA,CAAK,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,CAAC,WAAW,CAAC,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,MAAA;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,gBAAA,GAA4B;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,IAAA,CAAK,IAAA,KAAS,6BAAA;AAAA,EAC9C;AAAA,EAEA,OAAe,WAAA,CAAY,MAAA,EAAgB,IAAA,EAAe,WAAA,EAA6B;AAErF,IAAA,MAAM,OAAO,UAAA,CAAW,IAAA,EAAM,CAAC,SAAA,EAAW,WAAW,MAAA,EAAQ,OAAO,CAAC,CAAA,KAAM,OAAO,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,EAAA,CAAA;AAE3H,IAAA,OAAO,CAAA,EAAG,WAAW,CAAA,cAAA,EAAiB,MAAM,IAAI,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,EACzE;AACF;AAGO,IAAM,sBAAA,GAAN,cAAqC,KAAA,CAAM;AAAA,EAC9B,IAAA,GAAe,wBAAA;AAAA,EAExB,WAAA;AAAA,EAET,WAAA,CAAY,aAAqB,KAAA,EAAgB;AAC/C,IAAA,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA,SAAA,EAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA;AACnG,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AACF;AAEA,SAAS,UAAA,CAAW,MAAe,IAAA,EAAoC;AACrE,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,MAAA;AAE9C,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAS,KAAiC,GAAG,CAAA;AAEnD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAI,OAAO,KAAA;AAAA,EACxD;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,iBAAiB,IAAA,EAAwB;AACvD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,KAAA;AAErE,EAAA,MAAM,MAAA,GAAS,IAAA;AAEf,EAAA,IAAI,SAAA,IAAa,MAAA,IAAU,MAAA,CAAO,OAAA,KAAY,OAAO,OAAO,IAAA;AAE5D,EAAA,OAAO,QAAA,IAAY,MAAA,IAAU,CAAC,KAAA,EAAO,CAAA,EAAG,KAAK,OAAO,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,MAAe,CAAA;AACvF;;;AC1GO,IAAM,UAAA,GAAa;AAAA,EACxB,mBAAA,EAAqB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,wBAAA,EAA0B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACnG,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAClF,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,aAAA,EAAe,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC9E,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,0BAAA,EAA4B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC7F,UAAA,EAAY,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,cAAA,EAAgB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAChF,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAClF,aAAA,EAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,iBAAA,EAAmB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACtF,aAAA,EAAe,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAM,iBAAA,EAAmB,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EACzF,sBAAA,EAAwB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,2BAAA,EAA6B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACzG,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAClF,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,+BAAA,EAAiC,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACpG,qBAAA,EAAuB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,wBAAA,EAA0B,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EACrG,WAAA,EAAa,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,YAAA,EAAc,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EAC/E,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,0BAAA,EAA4B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAChG,UAAA,EAAY,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,oBAAA,EAAsB,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EACtF,WAAA,EAAa,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,WAAA,EAAa,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EAC9E,eAAA,EAAiB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,oBAAA,EAAsB,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EAC3F,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,qBAAA,EAAuB,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EACjG,YAAA,EAAc,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,aAAA,EAAe,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAChF,SAAA,EAAW,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,mBAAA,EAAqB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACnF,cAAA,EAAgB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,aAAA,EAAe,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EACnF,WAAA,EAAa,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,gBAAA,EAAkB,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EACnF,aAAA,EAAe,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,uBAAA,EAAyB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC3F,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,oBAAA,EAAsB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACpF,UAAA,EAAY,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,aAAA,EAAe,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EAC/E,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC7E,kBAAA,EAAoB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,kBAAA,EAAoB,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EAC5F,aAAA,EAAe,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,kBAAA,EAAoB,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EACvF,aAAA,EAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,iBAAA,EAAmB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACtF,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,WAAA,EAAa,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EACxE,UAAA,EAAY,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,cAAA,EAAgB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAChF,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,aAAA,EAAe,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC9E,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,YAAA,EAAc,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC5E,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,WAAA,EAAa,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC1E,uBAAA,EAAyB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,4BAAA,EAA8B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC3G,EAAA,EAAI,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC/D,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,2BAAA,EAA6B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACjG,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,YAAA,EAAc,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC5E,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC5E,sBAAA,EAAwB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,2BAAA,EAA6B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACzG,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAClF,gBAAA,EAAkB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,qBAAA,EAAuB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC7F,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,aAAA,EAAe,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC7E,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC3E,gBAAA,EAAkB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACtF,mBAAA,EAAqB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,kBAAA,EAAoB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC5F,+BAAA,EAAiC,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,2BAAA,EAA6B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACjH,4BAAA,EAA8B,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,wBAAA,EAA0B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC3G,+BAAA,EAAiC,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,2BAAA,EAA6B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACjH,4BAAA,EAA8B,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,wBAAA,EAA0B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC3G,uBAAA,EAAyB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,kBAAA,EAAoB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAChG,oBAAA,EAAsB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC1F,uBAAA,EAAyB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,kBAAA,EAAoB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAChG,oBAAA,EAAsB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC1F,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,WAAA,EAAa,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC9E,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACjF,uBAAA,EAAyB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,4BAAA,EAA8B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC1G,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,YAAA,EAAc,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC3E,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,WAAA,EAAa,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACzE,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,aAAA,EAAe,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC7E,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,mBAAA,EAAqB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACxF,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC9E,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,gBAAA,EAAkB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACnF,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,uBAAA,EAAyB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACzF,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACjF,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,WAAA,EAAa,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACzE,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,wBAAA,EAA0B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC3F,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,qBAAA,EAAuB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACrF,kBAAA,EAAoB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,kBAAA,EAAoB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC3F,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,uBAAA,EAAyB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACzF,wBAAA,EAA0B,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,oBAAA,EAAsB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACnG,qBAAA,EAAuB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,iBAAA,EAAmB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC7F,qBAAA,EAAuB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,iBAAA,EAAmB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC7F,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,aAAA,EAAe,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC7E,oBAAA,EAAsB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,gBAAA,EAAkB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EAC3F,aAAA,EAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,iBAAA,EAAmB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACtF,qBAAA,EAAuB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,4BAAA,EAA8B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACzG,eAAA,EAAiB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,sBAAA,EAAwB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC7F,mBAAA,EAAqB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,0BAAA,EAA4B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACrG,iBAAA,EAAmB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,2BAAA,EAA6B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACpG,mBAAA,EAAqB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,wBAAA,EAA0B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACnG,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,wBAAA,EAA0B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC3F,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,gBAAA,EAAkB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACtF,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,iBAAA,EAAmB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACrF,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,wBAAA,EAA0B,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC3F,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,sBAAA,EAAwB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACvF,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,cAAA,EAAgB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC/E,aAAA,EAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,kBAAA,EAAoB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACvF,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,gBAAA,EAAkB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,EACnF,MAAA,EAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,kBAAA,EAAoB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC/E,aAAA,EAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,iBAAA,EAAmB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACtF,WAAA,EAAa,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAClF,UAAA,EAAY,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,cAAA,EAAgB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAChF,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,aAAA,EAAe,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC9E,UAAA,EAAY,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,cAAA,EAAgB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAChF,mBAAA,EAAqB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,gBAAA,EAAkB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EAC3F,kBAAA,EAAoB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,uBAAA,EAAyB,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,EACjG,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,gBAAA,EAAkB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAAA,EACpF,UAAA,EAAY,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,cAAA,EAAgB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA;AAC5E;;;ACnGO,IAAM,cAAN,MAAkB;AAAA,EAKvB,YACmB,QAAA,EACjB,UAAA,EACiB,GAAA,GAAoB,IAAA,CAAK,KACzB,IAAA,GAAsC,CAAC,EAAA,KAAO,IAAI,QAAQ,CAAC,CAAA,KAAM,WAAW,CAAA,EAAG,EAAE,CAAC,CAAA,EACnG;AAJiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAEA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEjB,IAAA,IAAI,EAAE,QAAA,GAAW,CAAA,CAAA,IAAM,EAAE,aAAa,CAAA,CAAA,EAAI;AACxC,MAAA,MAAM,IAAI,WAAW,oDAAoD,CAAA;AAAA,IAC3E;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,IAAA,CAAK,OAAO,GAAA,EAAI;AAChB,IAAA,IAAA,CAAK,cAAc,QAAA,GAAW,UAAA;AAAA,EAChC;AAAA,EAZmB,QAAA;AAAA,EAEA,GAAA;AAAA,EACA,IAAA;AAAA,EARX,MAAA;AAAA,EACA,IAAA;AAAA,EACS,WAAA;AAAA;AAAA,EAkBjB,MAAM,IAAA,GAAsB;AAC1B,IAAA,WAAS;AACP,MAAA,IAAA,CAAK,MAAA,EAAO;AAEZ,MAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACpB,QAAA,IAAA,CAAK,MAAA,IAAU,CAAA;AAEf,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA,CAAA,CAAM,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,IACjE;AAAA,EACF;AAAA;AAAA,EAGA,SAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,MAAA,EAAO;AAEZ,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA;AAE3B,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,IAAA,CAAK,MAAA,GAAS,KAAK,GAAA,CAAI,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,GAAS,OAAA,GAAU,IAAA,CAAK,WAAW,CAAA;AAC9E,MAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AAAA,IACd;AAAA,EACF;AACF;;;ACtCO,IAAM,aAAA,GAAsC;AAAA,EACjD,UAAA,EAAY,CAAA;AAAA,EACZ,WAAA,EAAa,GAAA;AAAA,EACb,UAAA,EAAY,GAAA;AAAA,EACZ,eAAA,EAAiB;AACnB,CAAA;AAGO,SAAS,YAAA,CAAa,OAAA,EAAiB,OAAA,EAA+B,MAAA,GAAuB,KAAK,MAAA,EAAgB;AACvH,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,OAAA,CAAQ,YAAY,OAAA,CAAQ,WAAA,GAAc,KAAK,OAAO,CAAA;AAE/E,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,GAAI,OAAO,CAAA;AACtC;AAGO,SAAS,eAAA,CAAgB,KAAA,EAAsB,GAAA,GAAc,IAAA,CAAK,KAAI,EAAuB;AAClG,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,CAAM,IAAA,EAAK,KAAM,IAAI,OAAO,MAAA;AAElD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAE3B,EAAA,IAAI,gBAAgB,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,OAAO,OAAO,CAAA;AAExD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAE/B,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG,OAAO,MAAA;AAE/B,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,GAAO,GAAA,IAAO,GAAI,CAAC,CAAA;AACnD;AAEO,IAAM,KAAA,GAAQ,CAAC,EAAA,KAA8B,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;;;ACvC7F,IAAM,gBAAA,GAAmB;AACzB,IAAM,WAAA,GAAc;AA6F3B,IAAM,qCAAqB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,SAAS,CAAC,CAAA;AAC7D,IAAM,aAAA,uBAAoB,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAE3C,IAAM,gBAAN,MAAoB;AAAA,EACR,MAAA;AAAA,EACE,OAAA;AAAA,EACF,SAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,qBAAA;AAAA,EACA,SAAA;AAAA,EACE,MAAA;AAAA,EACF,SAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,EAA+B,QAAA,GAAW,kDAAA,EAAoD;AACxG,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,CAAQ,MAAA,KAAW,YAAY,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAK,KAAM,EAAA,EAAI;AAClF,MAAA,MAAM,IAAI,SAAA,CAAU,CAAA,EAAG,QAAQ,CAAA,YAAA,CAAc,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,IAAS,UAAA,CAAW,KAAA;AAE9C,IAAA,IAAI,OAAO,cAAc,UAAA,EAAY;AACnC,MAAA,MAAM,IAAI,UAAU,kEAAkE,CAAA;AAAA,IACxF;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAK;AAClC,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACvE,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AACtC,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,aAAA,EAAe,GAAI,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AAC1D,IAAA,IAAA,CAAK,qBAAA,GAAwB,QAAQ,qBAAA,IAAyB,IAAA;AAC9D,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,sBAAA,KAA2B,MAAM,UAAA,EAAW,CAAA;AAClE,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA,uBAAA,EAA0B,WAAW,CAAA,EAAG,OAAA,CAAQ,YAAY,CAAA,CAAA,EAAI,OAAA,CAAQ,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AACzG,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,KAAA;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,MAAA;AAErC,IAAA,MAAM,YAAY,OAAA,CAAQ,SAAA,KAAc,QAAQ,IAAA,GAAQ,OAAA,CAAQ,WAAW,iBAAA,IAAqB,GAAA;AAChG,IAAA,IAAA,CAAK,MAAA,GAAS,SAAA,KAAc,IAAA,GAAO,IAAA,GAAO,IAAI,WAAA,CAAY,SAAA,EAAW,GAAA,EAAQ,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA,EAClH;AAAA;AAAA,EAGA,MAAM,IAAA,CAA6B,WAAA,EAAA,GAAoB,IAAA,EAA2C;AAChG,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,GAAG,IAAI,CAAA,EAAG,IAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,MAAM,gBAAA,CAAyC,WAAA,EAAA,GAAoB,IAAA,EAAwD;AACzH,IAAA,MAAM,CAAC,MAAA,EAAQ,OAAA,GAAU,EAAE,CAAA,GAAI,IAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,WAAM,WAAW,CAAA;AAE9B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,SAAA,CAAU,CAAA,2BAAA,EAA8B,MAAA,CAAO,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,IACzE;AAEA,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,IAAA,CAAK,OAAA,GAAU,KAAK,IAAI,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AACxC,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS;AAC3B,MAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IACzB,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,KAAW,MAAA,EAAQ;AACjC,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAC1B,MAAA,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAA,IAAU,EAAE,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,cAAA;AAEJ,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,OAAA,CAAQ,cAAA,KAAmB,KAAA,EAAO;AACjD,MAAA,cAAA,GAAiB,OAAA,CAAQ,cAAA,IAAkB,IAAA,CAAK,MAAA,EAAO;AACvD,MAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,cAAA;AAAA,IAC/B;AAKA,IAAA,MAAM,kBAAA,GAAqB,mBAAmB,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,IAAM,IAAA,CAAK,QAAQ,cAAA,KAAmB,MAAA;AAEnG,IAAA,OAAO,IAAA,CAAK,OAAA,CAAsB,WAAA,EAAa,IAAA,CAAK,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,EAAE,cAAA,EAAgB,kBAAA,EAAmB,EAAG,OAAO,CAAA;AAAA,EACjI;AAAA;AAAA,EAGU,YAAY,OAAA,EAAiD;AACrE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAG,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAAA,MAC/B,cAAc,IAAA,CAAK,SAAA;AAAA,MACnB,GAAI,OAAA,CAAQ,OAAA,IAAW;AAAC,KAC1B;AAAA,EACF;AAAA;AAAA,EAGU,YAAY,MAAA,EAAwC;AAC5D,IAAA,OAAO,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAG;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,QACd,WAAA,EACA,MAAA,EACA,KACA,OAAA,EACA,IAAA,EACA,OACA,OAAA,EACyB;AACzB,IAAA,MAAM,EAAE,cAAA,EAAgB,kBAAA,EAAmB,GAAI,KAAA;AAC/C,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,IAAA,CAAK,KAAA,CAAM,UAAA;AAEpD,IAAA,KAAA,IAAS,OAAA,GAAU,KAAK,OAAA,EAAA,EAAW;AACjC,MAAA,cAAA,CAAe,QAAQ,MAAM,CAAA;AAE7B,MAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAA,CAAK,OAAO,IAAA,EAAK;AAExC,MAAA,IAAI,QAAA;AAEJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,MAAA,EAAQ,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,MAChE,SAASA,MAAAA,EAAO;AACd,QAAA,IAAI,QAAQ,MAAA,EAAQ,OAAA,EAAS,MAAM,OAAA,CAAQ,OAAO,MAAA,IAAUA,MAAAA;AAE5D,QAAA,IAAI,kBAAA,IAAsB,UAAU,UAAA,EAAY;AAC9C,UAAA,MAAM,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,IAAA,CAAK,OAAO,IAAA,CAAK,MAAM,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA;AAC9E,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,IAAI,sBAAA,CAAuB,WAAA,EAAaA,MAAK,CAAA;AAAA,MACrD;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,QAAQ,CAAA;AACtC,MAAA,MAAM,aAAa,eAAA,CAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA;AAEtE,MAAA,IAAI,SAAS,EAAA,IAAM,EAAE,KAAK,qBAAA,IAAyB,gBAAA,CAAiB,MAAM,CAAA,CAAA,EAAI;AAC5E,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,SAAS,QAAA,CAAS,OAAA;AAAA,UAClB,cAAA;AAAA,UACA,QAAA,EAAU,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA,KAAM,MAAA;AAAA,UAC1D,UAAU,OAAA,GAAU;AAAA,SACtB;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,CAAgB,EAAE,QAAQ,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAA,CAAS,OAAA,EAAS,WAAA,EAAa,YAAY,CAAA;AAE/H,MAAA,IAAI,CAAC,SAAS,EAAA,IAAM,OAAA,GAAU,cAAc,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,kBAAkB,CAAA,EAAG;AACvF,QAAA,IAAI,QAAQ,YAAA,CAAa,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAEzD,QAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,UAAA,IAAI,UAAA,GAAa,GAAA,GAAO,IAAA,CAAK,KAAA,CAAM,iBAAiB,MAAM,KAAA;AAE1D,UAAA,KAAA,GAAQ,UAAA,GAAa,GAAA;AAAA,QACvB;AAEA,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAA;AACrC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,WAAA,CAAY,OAAwB,kBAAA,EAAsC;AAEhF,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,GAAA,EAAK,OAAO,IAAA;AAGjC,IAAA,IAAI,MAAM,MAAA,KAAW,GAAA,IAAO,KAAA,CAAM,IAAA,KAAS,mCAAmC,OAAO,IAAA;AAErF,IAAA,OAAO,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,IAAK,kBAAA;AAAA,EAC5C;AAAA,EAEA,MAAc,IAAA,CAAK,GAAA,EAAU,MAAA,EAAgB,OAAA,EAAiC,MAA0B,OAAA,EAA4C;AAClJ,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,UAAU,UAAA,CAAW,MAAM,WAAW,KAAA,CAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,SAAS,CAAA,GAAA,CAAK,CAAC,GAAG,OAAA,CAAQ,SAAA,IAAa,KAAK,SAAS,CAAA;AAC9J,IAAA,MAAM,UAAU,MAAM,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAE7D,IAAA,OAAA,CAAQ,QAAQ,gBAAA,CAAiB,OAAA,EAAS,SAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAEjE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,EAAS,EAAG,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AAAA,IAClG,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,OAAA,CAAQ,MAAA,EAAQ,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAc,IAAA,CAAK,EAAA,EAAY,MAAA,EAAgD;AAC7E,IAAA,MAAM,IAAA,CAAK,MAAM,EAAE,CAAA;AACnB,IAAA,cAAA,CAAe,MAAM,CAAA;AAAA,EACvB;AACF;AAEA,SAAS,WAAA,CAAY,KAAU,MAAA,EAAmD;AAChF,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA,EAAG;AACvD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAE3C,IAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,OAAO,KAAA,KAAU,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAChG;AACF;AAEA,eAAe,SAAS,QAAA,EAAsC;AAC5D,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,EAAA,IAAI,IAAA,KAAS,IAAI,OAAO,MAAA;AAExB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,eAAe,MAAA,EAAuC;AAC7D,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,MAAA,CAAO,MAAA,IAAU,IAAI,KAAA,CAAM,SAAS,CAAA;AAAA,EAC5C;AACF;;;AC1TO,IAAM,WAAA,GAAc;AAAA,EACzB,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,aAAA;AAAA,IACN,gBAAA,EAAkB,yBAAA;AAAA,IAClB,OAAA,EAAS,gBAAA;AAAA,IACT,WAAA,EAAa,aAAA;AAAA,IACb,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,WAAA;AAAA,IACP,OAAA,EAAS,aAAA;AAAA,IACT,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,aAAA;AAAA,IACP,GAAA,EAAK,gBAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,UAAA;AAAA,IACV,SAAA,EAAW,WAAA;AAAA,IACX,SAAA,EAAW,WAAA;AAAA,IACX,SAAA,EAAW,WAAA;AAAA,IACX,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc,cAAA;AAAA,IACd,aAAA,EAAe,SAAA;AAAA,IACf,WAAA,EAAa,aAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,oBAAA,EAAsB,sBAAA;AAAA,IACtB,oBAAA,EAAsB,sBAAA;AAAA,IACtB,uBAAA,EAAyB,yBAAA;AAAA,IACzB,uBAAA,EAAyB,yBAAA;AAAA,IACzB,mBAAA,EAAqB,qBAAA;AAAA,IACrB,4BAAA,EAA8B,8BAAA;AAAA,IAC9B,4BAAA,EAA8B,8BAAA;AAAA,IAC9B,+BAAA,EAAiC,iCAAA;AAAA,IACjC,+BAAA,EAAiC,iCAAA;AAAA,IACjC,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,sBAAA;AAAA,IACN,UAAA,EAAY,oBAAA;AAAA,IACZ,aAAA,EAAe,uBAAA;AAAA,IACf,gBAAA,EAAkB,0BAAA;AAAA,IAClB,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,YAAA,EAAc,iBAAA;AAAA,IACd,MAAA,EAAQ,WAAA;AAAA,IACR,SAAA,EAAW,cAAA;AAAA,IACX,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,YAAA;AAAA,IACR,OAAA,EAAS,aAAA;AAAA,IACT,SAAA,EAAW,eAAA;AAAA,IACX,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,YAAA;AAAA,IACR,GAAA,EAAK,SAAA;AAAA,IACL,KAAA,EAAO,WAAA;AAAA,IACP,UAAA,EAAY;AAAA,GACd;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,aAAA;AAAA,IACN,GAAA,EAAK,YAAA;AAAA,IACL,cAAA,EAAgB,eAAA;AAAA,IAChB,eAAA,EAAiB,qBAAA;AAAA,IACjB,UAAA,EAAY,WAAA;AAAA,IACZ,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM,cAAA;AAAA,IACN,YAAA,EAAc,sBAAA;AAAA,IACd,QAAA,EAAU,eAAA;AAAA,IACV,QAAA,EAAU,eAAA;AAAA,IACV,MAAA,EAAQ,aAAA;AAAA,IACR,cAAA,EAAgB,qBAAA;AAAA,IAChB,eAAA,EAAiB,qBAAA;AAAA,IACjB,kBAAA,EAAoB,wBAAA;AAAA,IACpB,mBAAA,EAAqB,yBAAA;AAAA,IACrB,kBAAA,EAAoB,wBAAA;AAAA,IACpB,UAAA,EAAY,uBAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,YAAA;AAAA,IACT,UAAA,EAAY,kBAAA;AAAA,IACZ,QAAA,EAAU,gBAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,gBAAA;AAAA,IACT,eAAA,EAAiB,qBAAA;AAAA,IACjB,KAAA,EAAO,WAAA;AAAA,IACP,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,mBAAA;AAAA,IACZ,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,eAAA;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,WAAA;AAAA,IACX,WAAA,EAAa,aAAA;AAAA,IACb,WAAA,EAAa,aAAA;AAAA,IACb,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,aAAA;AAAA,IACN,GAAA,EAAK,YAAA;AAAA,IACL,MAAA,EAAQ,eAAA;AAAA,IACR,WAAA,EAAa,gBAAA;AAAA,IACb,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,aAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM;AAAA;AAEV;AAQO,SAAS,YAAA,CAAoD,QAAuB,GAAA,EAAqB;AAC9G,EAAA,MAAM,QAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACrD,IAAA,KAAA,CAAM,IAAI,IAAI,CAAA,GAAI,IAAA,KAAqB,OAAO,IAAA,CAAmE,WAAA,EAAa,GAAG,IAAI,CAAA;AAAA,EACvI;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,gBAAuB,cAAA,CACrB,MAAA,EACA,MAAA,EACA,OAAA,EACiD;AACjD,EAAA,IAAI,MAAA;AAEJ,EAAA,GAAG;AACD,IAAA,MAAM,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,EAAE,GAAG,MAAA,EAAQ,GAAI,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI,EAAC,IAA2B,OAAO,CAAA;AAElH,IAAA,OAAO,IAAA,CAAK,IAAA;AACZ,IAAA,MAAA,GAAS,KAAK,WAAA,IAAe,MAAA;AAAA,EAC/B,CAAA,QAAS,MAAA;AACX;ACnKO,IAAM,qBAAA,GAAwB;AAgC9B,SAAS,mCAAA,CACd,OAAA,EACA,SAAA,EACA,MAAA,GAAiB,qBAAA,EACR;AACT,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,CAAC,iBAAA,CAAkB,KAAK,SAAA,CAAU,IAAA,EAAM,CAAA,EAAG,OAAO,KAAA;AAEvF,EAAA,MAAM,QAAA,GAAW,WAAW,QAAA,EAAU,MAAM,EAAE,MAAA,CAAO,OAAO,EAAE,MAAA,EAAO;AACrE,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,IAAA,IAAQ,KAAK,CAAA;AAEjD,EAAA,OAAO,MAAM,MAAA,KAAW,QAAA,CAAS,MAAA,IAAU,eAAA,CAAgB,OAAO,QAAQ,CAAA;AAC5E;;;AC9CO,IAAM,aAAA,GAAgB;AAAA,EAC3B,mBAAmB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,uBAAA,EAAyB,MAAM,IAAA,EAAK;AAAA,EAC/E,mBAAmB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,sBAAA,EAAwB,MAAM,IAAA,EAAK;AAAA,EAC9E,gBAAgB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,mBAAA,EAAqB,MAAM,IAAA,EAAK;AAAA,EACxE,oBAAoB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,mBAAA,EAAqB,MAAM,KAAA,EAAM;AAAA,EAC5E,iBAAiB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,sBAAA,EAAwB,MAAM,KAAA,EAAM;AAAA,EAC7E,mBAAmB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,kBAAA,EAAoB,MAAM,KAAA,EAAM;AAAA,EAC1E,mBAAmB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,aAAA,EAAe,MAAM,IAAA,EAAK;AAAA,EACrE,gBAAA,EAAkB,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,CAAC,iBAAiB,CAAA,EAAE;AAAA,EAC/F,gBAAA,EAAkB,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,CAAC,iBAAiB,CAAA,EAAE;AAAA,EAC9F,uBAAuB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,wBAAA,EAA0B,MAAM,IAAA,EAAK;AAAA,EACpF,eAAe,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,QAAA,EAAU,MAAM,IAAA,EAAK;AAAA,EAC5D,kBAAkB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,WAAA,EAAa,MAAM,IAAA,EAAK;AAAA,EAClE,gBAAgB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,EAC9D,eAAe,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,QAAA,EAAU,MAAM,IAAA,EAAK;AAAA,EAC5D,uBAAuB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,uBAAA,EAAyB,MAAM,KAAA,EAAM;AAAA,EACnF,kBAAkB,EAAE,MAAA,EAAQ,UAAU,IAAA,EAAM,iBAAA,EAAmB,MAAM,KAAA,EAAM;AAAA,EAC3E,uBAAuB,EAAE,MAAA,EAAQ,UAAU,IAAA,EAAM,6BAAA,EAA+B,MAAM,KAAA,EAAM;AAAA,EAC5F,eAAe,EAAE,MAAA,EAAQ,UAAU,IAAA,EAAM,aAAA,EAAe,MAAM,KAAA,EAAM;AAAA,EACpE,kBAAkB,EAAE,MAAA,EAAQ,UAAU,IAAA,EAAM,gBAAA,EAAkB,MAAM,KAAA,EAAM;AAAA,EAC1E,gBAAgB,EAAE,MAAA,EAAQ,UAAU,IAAA,EAAM,cAAA,EAAgB,MAAM,KAAA,EAAM;AAAA,EACtE,eAAe,EAAE,MAAA,EAAQ,UAAU,IAAA,EAAM,aAAA,EAAe,MAAM,KAAA,EAAM;AAAA,EACpE,gBAAgB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,kBAAA,EAAoB,MAAM,KAAA,EAAM;AAAA,EACvE,eAAe,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,iBAAA,EAAmB,MAAM,KAAA,EAAM;AAAA,EACrE,eAAe,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,gBAAA,EAAkB,MAAM,KAAA,EAAM;AAAA,EACpE,oBAAoB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,6BAAA,EAA+B,MAAM,KAAA,EAAM;AAAA,EACtF,YAAY,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,aAAA,EAAe,MAAM,KAAA,EAAM;AAAA,EAC9D,eAAe,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,gBAAA,EAAkB,MAAM,KAAA,EAAM;AAAA,EACpE,aAAa,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,cAAA,EAAgB,MAAM,KAAA,EAAM;AAAA,EAChE,YAAY,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,aAAA,EAAe,MAAM,KAAA,EAAM;AAAA,EAC9D,eAAe,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,eAAA,EAAiB,MAAM,KAAA,EAAM;AAAA,EACnE,uBAAuB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,0BAAA,EAA4B,MAAM,IAAA,EAAK;AAAA,EACtF,mBAAmB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,aAAA,EAAe,MAAM,KAAA,EAAM;AAAA,EACrE,kBAAkB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,YAAA,EAAc,MAAM,KAAA,EAAM;AAAA,EACnE,iBAAiB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,WAAA,EAAa,MAAM,KAAA,EAAM;AAAA,EACjE,sBAAsB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,UAAA,EAAY,MAAM,KAAA,EAAM;AAAA,EACrE,sBAAsB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,wBAAA,EAA0B,MAAM,KAAA,EAAM;AAAA,EACnF,cAAc,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,QAAA,EAAU,MAAM,KAAA,EAAM;AAAA,EAC3D,mBAAmB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,eAAA,EAAiB,MAAM,KAAA,EAAM;AAAA,EACvE,cAAc,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,QAAA,EAAU,MAAM,KAAA,EAAM;AAAA,EAC3D,oBAAoB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,qBAAA,EAAuB,MAAM,KAAA,EAAM;AAAA,EAC9E,kBAAkB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,YAAA,EAAc,MAAM,KAAA,EAAM;AAAA,EACnE,iBAAiB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,WAAA,EAAa,MAAM,KAAA,EAAM;AAAA,EACjE,eAAe,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,SAAA,EAAW,MAAM,KAAA,EAAM;AAAA,EAC7D,cAAc,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,QAAA,EAAU,MAAM,KAAA,EAAM;AAAA,EAC3D,iBAAiB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,kBAAA,EAAoB,MAAM,IAAA,EAAK;AAAA,EACxE,gBAAgB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,iBAAA,EAAmB,MAAM,KAAA,EAAM;AAAA,EACvE,kBAAkB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,mBAAA,EAAqB,MAAM,IAAA,EAAK;AAAA,EAC1E,mBAAmB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,kBAAA,EAAoB,MAAM,KAAA,EAAM;AAAA,EAC1E,iBAAiB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,gBAAA,EAAkB,MAAM,KAAA,EAAM;AAAA,EACtE,oBAAoB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,mBAAA,EAAqB,MAAM,KAAA,EAAM;AAAA,EAC5E,mBAAmB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,kBAAA,EAAoB,MAAM,KAAA,EAAM;AAAA,EAC1E,wBAAwB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,+BAAA,EAAiC,MAAM,KAAA,EAAM;AAAA,EAC5F,gBAAgB,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,eAAA,EAAiB,MAAM,KAAA,EAAM;AAAA,EACpE,kBAAkB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,QAAA,EAAU,MAAM,IAAA,EAAK;AAAA,EAC/D,yBAAyB,EAAE,MAAA,EAAQ,UAAU,IAAA,EAAM,sCAAA,EAAwC,MAAM,KAAA,EAAM;AAAA,EACvG,oBAAoB,EAAE,MAAA,EAAQ,UAAU,IAAA,EAAM,aAAA,EAAe,MAAM,KAAA,EAAM;AAAA,EACzE,kBAAkB,EAAE,MAAA,EAAQ,SAAS,IAAA,EAAM,iBAAA,EAAmB,MAAM,IAAA,EAAK;AAAA,EACzE,kBAAkB,EAAE,MAAA,EAAQ,SAAS,IAAA,EAAM,gBAAA,EAAkB,MAAM,IAAA,EAAK;AAAA,EACxE,uBAAuB,EAAE,MAAA,EAAQ,SAAS,IAAA,EAAM,6BAAA,EAA+B,MAAM,IAAA,EAAK;AAAA,EAC1F,eAAe,EAAE,MAAA,EAAQ,SAAS,IAAA,EAAM,aAAA,EAAe,MAAM,IAAA,EAAK;AAAA,EAClE,kBAAkB,EAAE,MAAA,EAAQ,SAAS,IAAA,EAAM,gBAAA,EAAkB,MAAM,IAAA,EAAK;AAAA,EACxE,gBAAgB,EAAE,MAAA,EAAQ,SAAS,IAAA,EAAM,cAAA,EAAgB,MAAM,IAAA,EAAK;AAAA,EACpE,eAAe,EAAE,MAAA,EAAQ,SAAS,IAAA,EAAM,aAAA,EAAe,MAAM,IAAA;AAC/D;;;ACvBO,IAAM,kBAAA,GAAqB;AAAA,EAChC,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF;AAwBO,SAAS,qBAAqB,KAAA,EAA6C;AAChF,EAAA,MAAM,CAAA,GAAI,KAAA;AAEV,EAAA,IAAI,CAAC,KAAK,CAAA,CAAE,MAAA,KAAW,OAAO,CAAA,CAAE,IAAA,KAAS,sBAAsB,OAAO,IAAA;AAEtE,EAAA,MAAM,IAAA,GAAQ,CAAA,CAAE,IAAA,IAAQ,EAAC;AACzB,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,GAAK,IAAA,CAAK,aAAoD,EAAC;AAC/G,EAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,eAAe,UAAA,CAAW,CAAC,GAAG,EAAE,CAAA;AAE/D,EAAA,OAAO,OAAO,QAAA,CAAS,UAAU,IAAI,EAAE,UAAA,EAAY,YAAW,GAAI,IAAA;AACpE;AAEO,IAAM,sBAAA,GAAyB;AAC/B,IAAM,oBAAA,GAAuB;AA2B7B,IAAM,cAAA,GAAiB;AAAA,EAC5B,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,mBAAA;AAAA,IACR,MAAA,EAAQ,mBAAA;AAAA,IACR,GAAA,EAAK,eAAA;AAAA,IACL,MAAA,EAAQ,kBAAA;AAAA,IACR,MAAA,EAAQ,kBAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,kBAAA;AAAA,IACN,MAAA,EAAQ,oBAAA;AAAA,IACR,MAAA,EAAQ,oBAAA;AAAA,IACR,GAAA,EAAK,eAAA;AAAA,IACL,MAAA,EAAQ,kBAAA;AAAA,IACR,MAAA,EAAQ,kBAAA;AAAA,IACR,MAAA,EAAQ,kBAAA;AAAA,IACR,WAAA,EAAa,uBAAA;AAAA,IACb,aAAA,EAAe,yBAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,SAAA,EAAW,kBAAA;AAAA,IACX,WAAA,EAAa,oBAAA;AAAA,IACb,MAAA,EAAQ,gBAAA;AAAA,IACR,GAAA,EAAK,YAAA;AAAA,IACL,MAAA,EAAQ,eAAA;AAAA,IACR,MAAA,EAAQ,eAAA;AAAA,IACR,MAAA,EAAQ,eAAA;AAAA,IACR,SAAA,EAAW,kBAAA;AAAA,IACX,OAAA,EAAS,gBAAA;AAAA,IACT,QAAA,EAAU,iBAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,GAAA,EAAK,YAAA;AAAA,IACL,MAAA,EAAQ,eAAA;AAAA,IACR,MAAA,EAAQ,eAAA;AAAA,IACR,MAAA,EAAQ,eAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,mBAAA;AAAA,IACN,GAAA,EAAK,gBAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,eAAA;AAAA,IACN,MAAA,EAAQ,iBAAA;AAAA,IACR,GAAA,EAAK,aAAA;AAAA,IACL,MAAA,EAAQ,gBAAA;AAAA,IACR,MAAA,EAAQ,gBAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,mBAAA;AAAA,IACR,GAAA,EAAK,eAAA;AAAA,IACL,MAAA,EAAQ,kBAAA;AAAA,IACR,MAAA,EAAQ,kBAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,sBAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,sBAAA;AAAA,IACN,MAAA,EAAQ,wBAAA;AAAA,IACR,GAAA,EAAK,oBAAA;AAAA,IACL,MAAA,EAAQ,uBAAA;AAAA,IACR,MAAA,EAAQ,uBAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,MAAA,EAAQ,mBAAA;AAAA,IACR,MAAA,EAAQ,eAAA;AAAA,IACR,SAAA,EAAW,kBAAA;AAAA,IACX,WAAA,EAAa;AAAA;AAEjB;AAoBA,IAAM,MAAA,uBAAa,GAAA,CAAI,CAAC,QAAQ,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAGlD,SAAS,WAAW,SAAA,EAA2B;AACpD,EAAA,MAAM,GAAA,GAAM,UAAU,IAAA,EAAK;AAE3B,EAAA,IAAI,GAAA,KAAQ,EAAA,EAAI,MAAM,IAAI,UAAU,kCAAkC,CAAA;AAEtE,EAAA,MAAM,QAAQ,eAAA,CAAgB,IAAA,CAAK,GAAG,CAAA,GAAI,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,IAAA,GAAO,IAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAI,WAAA,EAAY;AAE9F,EAAA,OAAO,CAAA,QAAA,EAAW,KAAK,QAAA,CAAS,GAAG,IAAI,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,YAAA,CAAc,CAAA,WAAA,CAAA;AACrE;AAEA,IAAM,YAAA,GAAN,cAA2B,aAAA,CAAc;AAAA,EACpB,YAAY,MAAA,EAAwC;AACrE,IAAA,OAAO,EAAE,oBAAoB,MAAA,EAAO;AAAA,EACtC;AAAA,EAEA,OAAA,CAAW,WAAA,EAAqB,MAAA,EAAgB,GAAA,EAAU,MAAe,OAAA,EAAkD;AACzH,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AACxC,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAC1B,MAAA,IAAA,GAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,IAC5B;AAIA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,WAAA,EAAa,MAAA,EAAQ,KAAK,OAAA,EAAS,IAAA,EAAM,EAAE,kBAAA,EAAoB,CAAC,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,IAAK,OAAO,CAAA;AAAA,EACtH;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,aAAN,MAAiB;AAAA,EACb,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAEA,aAAA;AAAA;AAAA,EAEA,aAAA;AAAA,EACA,KAAA;AAAA,EAEQ,SAAA;AAAA,EAEjB,YAAY,OAAA,EAA4B;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS,OAAA,IAAW,CAAC,SAAS,SAAA,EAAW;AAC5C,MAAA,MAAM,IAAI,UAAU,sEAAsE,CAAA;AAAA,IAC5F;AAEA,IAAA,IAAA,CAAK,YAAY,IAAI,YAAA;AAAA,MACnB;AAAA,QACE,GAAG,OAAA;AAAA,QACH,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,UAAA,CAAW,QAAQ,SAAU,CAAA;AAAA,QACzD,SAAA,EAAW,OAAA,CAAQ,SAAA,KAAc,KAAA,GAAQ,KAAA,GAAQ,EAAE,iBAAA,EAAmB,OAAA,CAAQ,SAAA,EAAW,iBAAA,IAAqB,sBAAA;AAAuB,OACvI;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,GAAO,CAA2C,GAAA,KAA2B;AACjF,MAAA,MAAM,QAAiC,EAAC;AAExC,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC5C,QAAA,KAAA,CAAM,IAAI,CAAA,GAAI,CAAC,MAAA,EAAkCC,QAAAA,KAA6B,IAAA,CAAK,IAAA,CAAK,EAAA,EAAsB,GAAI,CAAC,MAAA,EAAQA,QAAO,CAA0C,CAAA;AAAA,MAC9K;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAC5C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AAC9C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AACxC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAC5C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,aAAa,CAAA;AACtD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,aAAa,CAAA;AACtD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA;AAAA,EACxB;AAAA;AAAA,EAGA,MAAM,IAAA,CAA+B,WAAA,EAAA,GAAmB,IAAA,EAA+C;AACrG,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,GAAG,IAAI,CAAA,EAAG,IAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,MAAM,gBAAA,CAA2C,WAAA,EAAA,GAAmB,IAAA,EAA4D;AAC9H,IAAA,MAAM,CAAC,MAAA,GAAS,IAAI,OAAA,GAAU,EAAE,CAAA,GAAI,IAAA;AACpC,IAAA,MAAM,IAAA,GAAO,cAAc,WAAW,CAAA;AAEtC,IAAA,IAAI,CAAC,MAAM,MAAM,IAAI,UAAU,CAAA,+BAAA,EAAkC,MAAA,CAAO,WAAW,CAAC,CAAA,CAAE,CAAA;AAEtF,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAG,MAAA,EAAO;AAClD,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,YAAA,EAAc,CAAC,GAAG,IAAA,KAAiB;AAChE,MAAA,MAAM,KAAA,GAAQ,KAAK,IAAI,CAAA;AAEvB,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,QAAA,MAAM,IAAI,SAAA,CAAU,CAAA,EAAG,WAAW,CAAA,IAAA,EAAO,IAAI,CAAA,cAAA,CAAgB,CAAA;AAAA,MAC/D;AAEA,MAAA,OAAO,KAAK,IAAI,CAAA;AAEhB,MAAA,OAAO,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACzC,CAAC,CAAA;AAED,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,OAAO,IAAI,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,EAAa,KAAA,KAAmB;AAC9C,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAE3C,MAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,OAAO,KAAA,KAAU,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAChG,CAAA;AAEA,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,IAAI,CAAA,EAAG,MAAA,CAAO,GAAA,EAAK,KAAK,CAAA;AAAA,IACpE,CAAA,MAAA,IAAW,WAAW,IAAA,EAAM;AAG1B,MAAA,KAAA,MAAW,GAAA,IAAO,KAAK,KAAA,EAA4B;AACjD,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,UAAA,MAAA,CAAO,KAAK,OAAO,KAAA,KAAU,YAAa,KAAA,GAAQ,CAAA,GAAI,IAAK,KAAK,CAAA;AAChE,UAAA,OAAO,KAAK,GAAG,CAAA;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAwB,WAAA,EAAa,IAAA,CAAK,MAAA,EAAQ,GAAA,EAAK,IAAA,CAAK,IAAA,GAAO,IAAA,GAAO,MAAA,EAAW,OAAO,CAAA;AAAA,EACpH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,OAAA,CACL,WAAA,EACA,MAAA,GAAuC,IACvC,OAAA,EAC2C;AAC3C,IAAA,KAAA,IAAS,IAAA,GAAO,KAAK,IAAA,EAAA,EAAQ;AAC3B,MAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,aAAa,GAAI,CAAC,EAAE,QAAA,EAAU,KAAK,GAAG,MAAA,EAAQ,IAAA,EAAK,EAAG,OAAO,CAA6B,CAAA;AAKxH,MAAA,OAAO,IAAA,CAAK,IAAA;AAEZ,MAAA,IAAI,IAAA,CAAK,KAAK,MAAA,KAAW,CAAA,IAAK,SAAS,IAAA,CAAK,IAAA,EAAM,aAAa,IAAA,CAAA,EAAO;AAAA,IACxE;AAAA,EACF;AACF;AAQO,SAAS,0BACd,OAAA,EACA,MAAA,EACA,MAAA,EACA,OAAA,GAAuD,EAAC,EAC/C;AACT,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,QAAQ,OAAO,KAAA;AAElD,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AAEtC,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACrC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAE/B,IAAA,IAAI,QAAQ,CAAA,EAAG,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,EACtF;AAEA,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,IAAK,EAAA;AAC5B,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,IAAK,EAAA;AAE9B,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,IAAK,CAAC,iBAAA,CAAkB,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,KAAA;AAE5D,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAEvD,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,MAAA,CAAO,CAAC,CAAC,CAAA,IAAK,OAAA,CAAQ,gBAAA,IAAoB,GAAA,CAAA,EAAM,OAAO,KAAA;AAE1E,EAAA,MAAM,QAAA,GAAWC,UAAAA,CAAW,QAAA,EAAU,MAAM,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,MAAA,CAAO,OAAO,EAAE,MAAA,EAAO;AACrF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,KAAK,CAAA;AAEnC,EAAA,OAAO,MAAM,MAAA,KAAW,QAAA,CAAS,MAAA,IAAUC,eAAAA,CAAgB,OAAO,QAAQ,CAAA;AAC5E;;;ACrbO,IAAM,aAAA,GAAgB;AAAA,EAC3B,oBAAA,EAAsB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,4BAAA,EAA8B,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC3G,mBAAA,EAAqB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,mCAAA,EAAqC,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAK;AAAA,EAC/G,gBAAA,EAAkB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,WAAA,EAAa,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAK;AAAA,EACpF,gBAAA,EAAkB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,iBAAA,EAAmB,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAK;AAAA,EAC1F,sBAAA,EAAwB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,6BAAA,EAA+B,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAK;AAAA,EAC5G,mBAAA,EAAqB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,eAAA,EAAiB,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAK;AAAA,EAC3F,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,iCAAA,EAAmC,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC/G,UAAA,EAAY,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,wBAAA,EAA0B,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC5F,gBAAA,EAAkB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,0BAAA,EAA4B,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACpG,cAAA,EAAgB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,uBAAA,EAAyB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC/F,aAAA,EAAe,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,gBAAA,EAAkB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACvF,aAAA,EAAe,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,sBAAA,EAAwB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC7F,UAAA,EAAY,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,uBAAA,EAAyB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC3F,kBAAA,EAAoB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,kCAAA,EAAoC,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC9G,aAAA,EAAe,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,sBAAA,EAAwB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC7F,mBAAA,EAAqB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,kCAAA,EAAoC,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC/G,gBAAA,EAAkB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,oBAAA,EAAsB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC9F,cAAA,EAAgB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,4BAAA,EAA8B,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACpG,aAAA,EAAe,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,eAAA,EAAiB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACtF,aAAA,EAAe,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,eAAA,EAAiB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACtF,iBAAA,EAAmB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,0BAAA,EAA4B,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACrG,kBAAA,EAAoB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,gCAAA,EAAkC,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC7G,eAAA,EAAiB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,4BAAA,EAA8B,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACtG,eAAA,EAAiB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,sBAAA,EAAwB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC/F,YAAA,EAAc,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,mBAAA,EAAqB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACzF,kBAAA,EAAoB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,qBAAA,EAAuB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACjG,gBAAA,EAAkB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,kBAAA,EAAoB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC5F,wBAAA,EAA0B,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,sBAAA,EAAwB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACxG,eAAA,EAAiB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,WAAA,EAAa,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACpF,YAAA,EAAc,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC9E,eAAA,EAAiB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,iBAAA,EAAmB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC1F,YAAA,EAAc,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,kBAAA,EAAoB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACxF,qBAAA,EAAuB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,6BAAA,EAA+B,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC5G,eAAA,EAAiB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,iBAAA,EAAmB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC1F,qBAAA,EAAuB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,6BAAA,EAA+B,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC5G,kBAAA,EAAoB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,eAAA,EAAiB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC3F,kBAAA,EAAoB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,yBAAA,EAA2B,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACrG,iBAAA,EAAmB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,wBAAA,EAA0B,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACnG,gBAAA,EAAkB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,uBAAA,EAAyB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACjG,eAAA,EAAiB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,qBAAA,EAAuB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC9F,iBAAA,EAAmB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,uBAAA,EAAyB,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAClG,gBAAA,EAAkB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,iBAAA,EAAmB,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAK;AAAA,EAC1F,qBAAA,EAAuB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,mCAAA,EAAqC,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAClH,sBAAA,EAAwB,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,qCAAA,EAAuC,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EACrH,YAAA,EAAc,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,yBAAA,EAA2B,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC/F,gBAAA,EAAkB,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,KAAA,EAAM;AAAA,EAClF,kBAAA,EAAoB,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAM,aAAA,EAAe,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,KAAA;AACxF;;;ACFO,IAAM,sBAAA,GAAyB;AAC/B,IAAM,kBAAA,GAAqB;AAAA,EAChC,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF;AA2BO,IAAM,cAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAK,YAAA,EAAa;AAAA,EACjD,QAAA,EAAU,EAAE,IAAA,EAAM,iBAAA,EAAkB;AAAA,EACpC,UAAA,EAAY,EAAE,IAAA,EAAM,mBAAA,EAAoB;AAAA,EACxC,KAAA,EAAO,EAAE,MAAA,EAAQ,oBAAA,EAAsB,OAAO,mBAAA,EAAoB;AAAA,EAClE,WAAW,EAAE,IAAA,EAAM,oBAAoB,GAAA,EAAK,gBAAA,EAAkB,WAAW,sBAAA,EAAuB;AAAA,EAChG,WAAA,EAAa,EAAE,IAAA,EAAM,oBAAA,EAAsB,KAAK,kBAAA,EAAoB,MAAA,EAAQ,qBAAA,EAAuB,OAAA,EAAS,sBAAA,EAAuB;AAAA,EACnI,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,iBAAA;AAAA,IACN,GAAA,EAAK,eAAA;AAAA,IACL,MAAA,EAAQ,kBAAA;AAAA,IACR,KAAA,EAAO,iBAAA;AAAA,IACP,OAAA,EAAS,mBAAA;AAAA,IACT,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,aAAa,EAAE,IAAA,EAAM,sBAAsB,GAAA,EAAK,kBAAA,EAAoB,OAAO,oBAAA,EAAqB;AAAA,EAChG,UAAU,EAAE,IAAA,EAAM,mBAAmB,GAAA,EAAK,eAAA,EAAiB,QAAQ,kBAAA,EAAmB;AAAA,EACtF,SAAA,EAAW,EAAE,IAAA,EAAM,kBAAA,EAAoB,KAAK,gBAAA,EAAiB;AAAA,EAC7D,gBAAgB,EAAE,IAAA,EAAM,yBAAyB,GAAA,EAAK,qBAAA,EAAuB,QAAQ,wBAAA,EAAyB;AAAA,EAC9G,KAAA,EAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAK,YAAA,EAAa;AAAA,EACjD,QAAA,EAAU,EAAE,IAAA,EAAM,iBAAA,EAAmB,KAAK,eAAA,EAAiB,MAAA,EAAQ,kBAAA,EAAoB,UAAA,EAAY,0BAAA,EAA2B;AAAA,EAC9H,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,iBAAA;AAAA,IACV,cAAA,EAAgB,uBAAA;AAAA,IAChB,YAAA,EAAc,oBAAA;AAAA,IACd,aAAA,EAAe,wBAAA;AAAA,IACf,YAAA,EAAc,uBAAA;AAAA,IACd,GAAA,EAAK;AAAA,GACP;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,MAAA,EAAQ,eAAA;AAAA,IACR,MAAA,EAAQ,eAAA;AAAA,IACR,SAAA,EAAW,kBAAA;AAAA,IACX,WAAA,EAAa;AAAA;AAEjB;AAoBA,IAAMC,OAAAA,uBAAa,GAAA,CAAI,CAAC,QAAQ,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAGlD,SAAS,WAAW,SAAA,EAA2B;AACpD,EAAA,MAAM,GAAA,GAAM,UAAU,IAAA,EAAK;AAE3B,EAAA,IAAI,GAAA,KAAQ,EAAA,EAAI,MAAM,IAAI,UAAU,kCAAkC,CAAA;AAEtE,EAAA,MAAM,QAAQ,eAAA,CAAgB,IAAA,CAAK,GAAG,CAAA,GAAI,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,IAAA,GAAO,IAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAI,WAAA,EAAY;AAE9F,EAAA,OAAO,CAAA,QAAA,EAAW,KAAK,QAAA,CAAS,GAAG,IAAI,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,YAAA,CAAc,CAAA,WAAA,CAAA;AACrE;AAEA,IAAM,YAAA,GAAN,cAA2B,aAAA,CAAc;AAAA,EACpB,YAAY,MAAA,EAAwC;AACrE,IAAA,OAAO,EAAE,oBAAoB,MAAA,EAAO;AAAA,EACtC;AAAA,EAEA,QAAW,WAAA,EAAqB,MAAA,EAAgB,GAAA,EAAU,IAAA,EAAe,YAAqB,OAAA,EAAkD;AAC9I,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AACxC,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAC1B,MAAA,IAAA,GAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,cAAA;AAEJ,IAAA,IAAI,UAAA,IAAc,OAAA,CAAQ,cAAA,KAAmB,KAAA,EAAO;AAClD,MAAA,cAAA,GAAiB,OAAA,CAAQ,cAAA,IAAkB,IAAA,CAAK,MAAA,EAAO;AACvD,MAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,cAAA;AAAA,IAC/B;AAKA,IAAA,MAAM,qBAAqB,CAACA,OAAAA,CAAO,GAAA,CAAI,MAAM,KAAK,cAAA,KAAmB,MAAA;AAErE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,WAAA,EAAa,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,IAAA,EAAM,EAAE,cAAA,EAAgB,kBAAA,EAAmB,EAAG,OAAO,CAAA;AAAA,EACjH;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF,CAAA;AAEO,IAAM,aAAN,MAAiB;AAAA,EACb,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EAEQ,SAAA;AAAA,EAEjB,YAAY,OAAA,EAA4B;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS,OAAA,IAAW,CAAC,SAAS,SAAA,EAAW;AAC5C,MAAA,MAAM,IAAI,UAAU,sEAAsE,CAAA;AAAA,IAC5F;AAEA,IAAA,IAAA,CAAK,YAAY,IAAI,YAAA;AAAA,MACnB;AAAA,QACE,GAAG,OAAA;AAAA,QACH,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,UAAA,CAAW,QAAQ,SAAU,CAAA;AAAA,QACzD,SAAA,EAAW,OAAA,CAAQ,SAAA,KAAc,KAAA,GAAQ,KAAA,GAAQ,EAAE,iBAAA,EAAmB,OAAA,CAAQ,SAAA,EAAW,iBAAA,IAAqB,sBAAA;AAAuB,OACvI;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,GAAO,CAA2C,GAAA,KAA2B;AACjF,MAAA,MAAM,QAAiC,EAAC;AAExC,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC5C,QAAA,KAAA,CAAM,IAAI,CAAA,GAAI,CAAC,MAAA,EAAkCH,QAAAA,KAA6B,IAAA,CAAK,IAAA,CAAK,EAAA,EAAsB,GAAI,CAAC,MAAA,EAAQA,QAAO,CAA0C,CAAA;AAAA,MAC9K;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAC5C,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AAC9C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,WAAW,CAAA;AAClD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAC5C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,WAAW,CAAA;AAClD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAC5C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AAC9C,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,cAAc,CAAA;AACxD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAC5C,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA;AAAA,EACxB;AAAA;AAAA,EAGA,MAAM,IAAA,CAA+B,WAAA,EAAA,GAAmB,IAAA,EAA+C;AACrG,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,GAAG,IAAI,CAAA,EAAG,IAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,MAAM,gBAAA,CAA2C,WAAA,EAAA,GAAmB,IAAA,EAA4D;AAC9H,IAAA,MAAM,CAAC,MAAA,GAAS,IAAI,OAAA,GAAU,EAAE,CAAA,GAAI,IAAA;AACpC,IAAA,MAAM,IAAA,GAAO,cAAc,WAAW,CAAA;AAEtC,IAAA,IAAI,CAAC,MAAM,MAAM,IAAI,UAAU,CAAA,+BAAA,EAAkC,MAAA,CAAO,WAAW,CAAC,CAAA,CAAE,CAAA;AAEtF,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAG,MAAA,EAAO;AAClD,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,YAAA,EAAc,CAAC,GAAG,IAAA,KAAiB;AAChE,MAAA,MAAM,KAAA,GAAQ,KAAK,IAAI,CAAA;AAEvB,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,QAAA,MAAM,IAAI,SAAA,CAAU,CAAA,EAAG,WAAW,CAAA,IAAA,EAAO,IAAI,CAAA,cAAA,CAAgB,CAAA;AAAA,MAC/D;AAEA,MAAA,OAAO,KAAK,IAAI,CAAA;AAEhB,MAAA,OAAO,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACzC,CAAC,CAAA;AAED,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,OAAO,IAAI,CAAA;AAE9C,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAE3C,QAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,OAAO,KAAA,KAAU,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAChG;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAwB,WAAA,EAAa,IAAA,CAAK,MAAA,EAAQ,GAAA,EAAK,IAAA,CAAK,IAAA,GAAO,IAAA,GAAO,MAAA,EAAW,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACrI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,OAAA,CACL,WAAA,EACA,MAAA,GAAuC,IACvC,OAAA,EAC2C;AAC3C,IAAA,KAAA,IAAS,IAAA,GAAO,KAAK,IAAA,EAAA,EAAQ;AAC3B,MAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,aAAa,GAAI,CAAC,EAAE,QAAA,EAAU,KAAK,GAAG,MAAA,EAAQ,IAAA,EAAK,EAAG,OAAO,CAA6B,CAAA;AAKxH,MAAA,OAAO,IAAA,CAAK,IAAA;AAEZ,MAAA,IAAI,IAAA,CAAK,KAAK,MAAA,KAAW,CAAA,IAAK,SAAS,IAAA,CAAK,IAAA,EAAM,aAAa,IAAA,CAAA,EAAO;AAAA,IACxE;AAAA,EACF;AACF;AAOO,SAAS,0BACd,OAAA,EACA,MAAA,EACA,MAAA,EACA,OAAA,GAAuD,EAAC,EAC/C;AACT,EAAA,OAAO,yBAAA,CAA0B,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAA;AACnE;ACxUO,IAAM,uBAAA,GAA0B;AAEhC,IAAM,wBAAA,GAA2B,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK;AAE/C,IAAM,oBAAA,GAAuB;AAgCpC,IAAM,YAAA,GAAuC,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,EAAA,EAAI,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,KAAA,EAAM;AAE9E,SAAS,WAAW,KAAA,EAAiC;AACnD,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAA,GAAU,KAAA;AAAA,EACZ,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AACpC,IAAA,MAAM,KAAA,GAAQ,2BAAA,CAA4B,IAAA,CAAK,KAAK,CAAA;AACpD,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,SAAA,CAAU,CAAA,uDAAA,EAA0D,KAAK,CAAA,CAAA,CAAG,CAAA;AAClG,IAAA,OAAA,GAAU,MAAA,CAAO,MAAM,CAAC,CAAC,IAAI,YAAA,CAAa,KAAA,CAAM,CAAC,CAAA,IAAK,GAAG,CAAA;AAAA,EAC3D,CAAA,MAAO;AACL,IAAA,MAAM,IAAI,UAAU,8DAA8D,CAAA;AAAA,EACpF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,OAAO,CAAA,IAAK,WAAW,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,WAAW,sDAAsD,CAAA;AAAA,EAC7E;AACA,EAAA,IAAI,UAAU,wBAAA,EAA0B;AACtC,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,kCAAA,EAAqC,wBAAwB,CAAA,SAAA,CAAW,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,QAAQ,GAAA,EAAwC;AACvD,EAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAC1D,EAAA,MAAM,KAAA,GAAQ,GAAA,YAAe,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,EAAQ,GAAI,GAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACrF,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,QAAQ,CAAA,EAAG,MAAM,IAAI,SAAA,CAAU,kDAAkD,CAAA;AAChH,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAAgC;AACjD,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,WAAW,CAAA;AAChD;AAEA,SAAS,aAAA,CAAc,MAAc,KAAA,EAAoC;AACvE,EAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,MAAA;AAClE,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU,MAAM,IAAI,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA,iBAAA,CAAmB,CAAA;AAC7E,EAAA,OAAO,KAAA;AACT;AAcO,SAAS,oBAAoB,OAAA,EAA6C;AAC/E,EAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,OAAA,KAAY,UAAU,MAAM,IAAI,UAAU,sBAAsB,CAAA;AAC/F,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,GAAY,oBAAA,EAAsB,KAAI,GAAI,OAAA;AAElE,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,WAAW,CAAA,EAAG;AACrD,IAAA,MAAM,IAAI,UAAU,+DAAgE,CAAA;AAAA,EACtF;AACA,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,MAAM,IAAI,SAAA,CAAU,4CAA4C,CAAA;AAC5H,EAAA,IAAI,OAAO,WAAW,QAAA,IAAY,OAAO,WAAW,QAAA,EAAU,MAAM,IAAI,SAAA,CAAU,qCAAqC,CAAA;AACvH,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,EAAK;AAChC,EAAA,IAAI,IAAI,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,UAAU,0BAA0B,CAAA;AACpE,EAAA,IAAI,CAAC,GAAG,GAAG,CAAA,CAAE,SAAS,uBAAA,EAAyB;AAC7C,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,uBAAA,EAA0B,uBAAuB,CAAA,WAAA,CAAa,CAAA;AAAA,EACrF;AAEA,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAG,CAAA;AACvB,EAAA,MAAM,MAAA,GAA8B,EAAE,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,GAAM,UAAA,CAAW,SAAS,CAAA,EAAE;AACjF,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AAClD,EAAA,IAAI,IAAA,KAAS,MAAA,EAAW,MAAA,CAAO,IAAA,GAAO,IAAA;AACtC,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,KAAA,GAAQ,KAAA;AACxC,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,KAAA,GAAQ,KAAA;AAExC,EAAA,MAAM,eAAe,CAAA,EAAG,SAAA,CAAU,KAAK,SAAA,CAAU,EAAE,KAAK,OAAA,EAAS,GAAA,EAAK,OAAO,CAAC,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,KAAK,SAAA,CAAU,MAAM,CAAC,CAAC,CAAA,CAAA;AACpH,EAAA,MAAM,SAAA,GAAYC,WAAW,QAAA,EAAU,MAAM,EAAE,MAAA,CAAO,YAAY,CAAA,CAAE,MAAA,CAAO,WAAW,CAAA;AACtF,EAAA,OAAO,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACrC;;;AC1GO,IAAM,OAAA,GAAN,cAAsB,aAAA,CAAc;AAAA,EAChC,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAEA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EAKT,YAAY,OAAA,EAA+B;AACzC,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,QAAQ,CAAA;AACvD,IAAA,IAAA,CAAK,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,KAAK,CAAA;AACjD,IAAA,IAAA,CAAK,WAAA,GAAc,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,WAAW,CAAA;AAC7D,IAAA,IAAA,CAAK,SAAA,GAAY,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,SAAS,CAAA;AACzD,IAAA,IAAA,CAAK,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,KAAK,CAAA;AACjD,IAAA,IAAA,CAAK,QAAA,GAAW,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,QAAQ,CAAA;AACvD,IAAA,IAAA,CAAK,MAAA,GAAS,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,OAAO,CAAA;AACrD,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,QAAA,GAAW,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,QAAQ,CAAA;AACvD,IAAA,IAAA,CAAK,QAAA,GAAW,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,QAAQ,CAAA;AACvD,IAAA,IAAA,CAAK,MAAA,GAAS,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,OAAO,CAAA;AACrD,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,GAAG,YAAA,CAAa,IAAA,EAAM,WAAA,CAAY,OAAO,CAAA;AAAA,MACzC,SAAS,CAAC,MAAA,EAAQD,aAAY,cAAA,CAAe,IAAA,EAAM,QAAQA,QAAO;AAAA,KACpE;AAAA,EACF;AACF","file":"index.js","sourcesContent":["/**\n * Every refusal from the API, whatever its HTTP status.\n *\n * The LetsBot API reports failure in several shapes, and not always with a 4xx/5xx:\n * - HTTP 202 `{\"Status\": 0, \"Message\": \"...\"}` — validation failure on most endpoints (historic contract);\n * - HTTP 200 `{\"success\": false, ...}` — the connection gateway did not carry the request out;\n * - HTTP 4xx/5xx with `{Status, Message, error_code|code}`, `{message, errors}`, `{success, message}`, …\n *\n * All of them surface as this error. `status` is the real HTTP status (so it can be 2xx), `body` is\n * the parsed JSON (or the raw text when the body was not JSON).\n */\nexport class LetsBotApiError extends Error {\n override readonly name: string = 'LetsBotApiError';\n\n /** HTTP status. Can be 200/202 for a refusal carried in the body. */\n readonly status: number;\n\n /** Parsed response body (raw text when it was not JSON, `undefined` when empty). */\n readonly body: unknown;\n\n /**\n * Support reference. The API does not send a request-id header; the only reference it returns\n * is `reference` on a 500 (`API-XXXXXXXXXX`) — quote it to support. `undefined` otherwise.\n */\n readonly requestId: string | undefined;\n\n /** Machine-readable code from the body (`error_code`, `code` or `error`), when there is one. */\n readonly code: string | undefined;\n\n /** The operation that failed, e.g. `sendMessage`. */\n readonly operationId: string;\n\n /** Seconds from a `Retry-After` header, when the response carried one. */\n readonly retryAfter: number | undefined;\n\n /** Response headers. */\n readonly headers: Headers;\n\n constructor(init: {\n status: number;\n body: unknown;\n headers: Headers;\n operationId: string;\n retryAfter?: number | undefined;\n }) {\n super(LetsBotApiError.messageFrom(init.status, init.body, init.operationId));\n this.status = init.status;\n this.body = init.body;\n this.headers = init.headers;\n this.operationId = init.operationId;\n this.retryAfter = init.retryAfter;\n this.code = pickString(init.body, ['error_code', 'code', 'error']);\n this.requestId = pickString(init.body, ['reference']) ?? init.headers.get('x-request-id') ?? undefined;\n }\n\n /**\n * True for `409 idempotency_outcome_unknown`: an earlier request with this Idempotency-Key died\n * before its result was known, so the message may or may not have been sent. Do not resend with\n * the same key; check the message status, or send again with a NEW key if you accept a possible\n * duplicate.\n */\n get isOutcomeUnknown(): boolean {\n return this.status === 409 && this.code === 'idempotency_outcome_unknown';\n }\n\n private static messageFrom(status: number, body: unknown, operationId: string): string {\n // `error` last: the CRM API's envelope is `{success: false, error, code}`.\n const text = pickString(body, ['Message', 'message', 'data', 'error']) ?? (typeof body === 'string' ? body.slice(0, 200) : '');\n\n return `${operationId} failed (HTTP ${status})${text ? `: ${text}` : ''}`;\n }\n}\n\n/** The request never produced an HTTP response (DNS, connection reset, timeout), after any retries. */\nexport class LetsBotConnectionError extends Error {\n override readonly name: string = 'LetsBotConnectionError';\n\n readonly operationId: string;\n\n constructor(operationId: string, cause: unknown) {\n super(`${operationId} failed: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });\n this.operationId = operationId;\n }\n}\n\nfunction pickString(body: unknown, keys: string[]): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n\n for (const key of keys) {\n const value = (body as Record<string, unknown>)[key];\n\n if (typeof value === 'string' && value !== '') return value;\n }\n\n return undefined;\n}\n\n/**\n * Did this 2xx body report a failure? Same rule the server uses to decide whether a send\n * happened (EnforceAutomationSendBudget::responseSent): `success: false`, or a falsy `Status`.\n */\nexport function isLogicalFailure(body: unknown): boolean {\n if (!body || typeof body !== 'object' || Array.isArray(body)) return false;\n\n const record = body as Record<string, unknown>;\n\n if ('success' in record && record.success === false) return true;\n\n return 'Status' in record && [false, 0, '0', 'false'].includes(record.Status as never);\n}\n","// Generated from openapi/openapi.yaml by scripts/gen-operations.mjs. Do not edit by hand:\n// run `npm run generate` (or `npm run spec:sync` inside the LetsBot workspace).\n\nexport const operations = {\n addGroupParticipant: { method: 'POST', path: '/group/add/participant', params: 'body', send: false },\n archiveChat: { method: 'POST', path: '/chat/archive', params: 'body', send: false },\n blockUser: { method: 'POST', path: '/user/block', params: 'body', send: false },\n cancelOrder: { method: 'POST', path: '/orders/{orderId}/cancel', params: 'body', send: false },\n checkPhone: { method: 'POST', path: '/check/phone', params: 'body', send: false },\n createGroup: { method: 'POST', path: '/group/create', params: 'body', send: false },\n createProduct: { method: 'POST', path: '/product/create', params: 'body', send: false },\n deleteMessage: { method: 'DELETE', path: '/message/delete', params: 'query', send: false },\n demoteGroupParticipant: { method: 'POST', path: '/group/demote/participant', params: 'body', send: false },\n findSession: { method: 'POST', path: '/session/find', params: 'none', send: false },\n forwardMessage: { method: 'POST', path: '/message/send/forward/message', params: 'body', send: true },\n getChatDisplayPicture: { method: 'GET', path: '/group/display/picture', params: 'query', send: false },\n getChatList: { method: 'GET', path: '/chat/list', params: 'query', send: false },\n getCollections: { method: 'POST', path: '/product/get/collections', params: 'body', send: false },\n getContact: { method: 'GET', path: '/live_chat/contact', params: 'query', send: false },\n getContacts: { method: 'GET', path: '/contacts', params: 'query', send: false },\n getConversation: { method: 'GET', path: '/chat/conversation', params: 'query', send: false },\n getGroupConversation: { method: 'GET', path: '/group/conversation', params: 'query', send: false },\n getGroupList: { method: 'GET', path: '/group/list', params: 'none', send: false },\n getLabels: { method: 'GET', path: '/live_chat/labels', params: 'none', send: false },\n getMessageByID: { method: 'GET', path: '/message/id', params: 'query', send: false },\n getMessages: { method: 'GET', path: '/message/fetch', params: 'query', send: false },\n getModerators: { method: 'GET', path: '/live_chat/moderators', params: 'none', send: false },\n getOrder: { method: 'POST', path: '/product/get/order', params: 'body', send: false },\n getProduct: { method: 'GET', path: '/product/id', params: 'query', send: false },\n getProducts: { method: 'POST', path: '/product', params: 'body', send: false },\n groupGetInviteInfo: { method: 'GET', path: '/invite/get/info', params: 'query', send: false },\n groupMetadata: { method: 'GET', path: '/group/meta/data', params: 'query', send: false },\n groupSettings: { method: 'POST', path: '/group/settings', params: 'body', send: false },\n index: { method: 'GET', path: '/messages', params: 'query', send: false },\n inviteCode: { method: 'POST', path: '/invite/code', params: 'body', send: false },\n joinGroup: { method: 'POST', path: '/group/join', params: 'body', send: false },\n muteChat: { method: 'POST', path: '/chat/mute', params: 'body', send: false },\n pinChat: { method: 'POST', path: '/chat/pin', params: 'body', send: false },\n promoteGroupParticipant: { method: 'POST', path: '/group/promote/participant', params: 'body', send: false },\n qr: { method: 'POST', path: '/qr', params: 'none', send: false },\n queryBroadcast: { method: 'POST', path: '/instance/query/broadcast', params: 'body', send: false },\n readChat: { method: 'POST', path: '/chat/read', params: 'body', send: false },\n recordOrder: { method: 'POST', path: '/orders', params: 'body', send: false },\n removeGroupParticipant: { method: 'POST', path: '/group/remove/participant', params: 'body', send: false },\n renameGroup: { method: 'POST', path: '/group/rename', params: 'body', send: false },\n revokeInviteCode: { method: 'POST', path: '/invite/revoke/code', params: 'body', send: false },\n sendAudio: { method: 'POST', path: '/send/audio', params: 'body', send: true },\n sendButtons: { method: 'POST', path: '/button', params: 'body', send: true },\n sendButtonsAlias: { method: 'POST', path: '/send/buttons', params: 'body', send: true },\n sendButtonsTemplate: { method: 'POST', path: '/button/template', params: 'body', send: true },\n sendButtonsTemplateWithDocument: { method: 'POST', path: '/button/document/template', params: 'body', send: true },\n sendButtonsTemplateWithImage: { method: 'POST', path: '/button/image/template', params: 'body', send: true },\n sendButtonsTemplateWithLocation: { method: 'POST', path: '/button/location/template', params: 'body', send: true },\n sendButtonsTemplateWithVideo: { method: 'POST', path: '/button/video/template', params: 'body', send: true },\n sendButtonsWithDocument: { method: 'POST', path: '/button/document', params: 'body', send: true },\n sendButtonsWithImage: { method: 'POST', path: '/button/image', params: 'body', send: true },\n sendButtonsWithLocation: { method: 'POST', path: '/button/location', params: 'body', send: true },\n sendButtonsWithVideo: { method: 'POST', path: '/button/video', params: 'body', send: true },\n sendCarousel: { method: 'POST', path: '/carousel', params: 'body', send: true },\n sendContact: { method: 'POST', path: '/send/contact', params: 'body', send: true },\n sendDisappearingMessage: { method: 'POST', path: '/message/send/disappearing', params: 'body', send: true },\n sendFile: { method: 'POST', path: '/send/file', params: 'body', send: true },\n sendGif: { method: 'POST', path: '/send/gif', params: 'body', send: true },\n sendImage: { method: 'POST', path: '/send/image', params: 'body', send: true },\n sendInviteLink: { method: 'POST', path: '/invite/send/link', params: 'body', send: true },\n sendList: { method: 'POST', path: '/list/message', params: 'body', send: true },\n sendLocation: { method: 'POST', path: '/send/location', params: 'body', send: true },\n sendMention: { method: 'POST', path: '/message/send/mention', params: 'body', send: true },\n sendMessage: { method: 'POST', path: '/message/send', params: 'body', send: true },\n sendPTT: { method: 'POST', path: '/send/ptt', params: 'body', send: true },\n sendReaction: { method: 'POST', path: '/message/send/reaction', params: 'body', send: true },\n sendReply: { method: 'POST', path: '/message/send/reply', params: 'body', send: true },\n sendSimpleTemplate: { method: 'POST', path: '/template/simple', params: 'body', send: true },\n sendSticker: { method: 'POST', path: '/message/send/sticker', params: 'body', send: true },\n sendTemplateWithDocument: { method: 'POST', path: '/template/document', params: 'body', send: true },\n sendTemplateWithImage: { method: 'POST', path: '/template/image', params: 'body', send: true },\n sendTemplateWithVideo: { method: 'POST', path: '/template/video', params: 'body', send: true },\n sendVideo: { method: 'POST', path: '/send/video', params: 'body', send: true },\n sendWhatsAppTemplate: { method: 'POST', path: '/template/send', params: 'body', send: true },\n sessionStatus: { method: 'POST', path: '/session/status', params: 'none', send: false },\n setChatDisplayPicture: { method: 'POST', path: '/group/set/display/picture', params: 'body', send: false },\n setContactLabel: { method: 'POST', path: '/live_chat/set-label', params: 'body', send: false },\n setContactModerator: { method: 'POST', path: '/live_chat/set-moderator', params: 'body', send: false },\n setDisplayPicture: { method: 'POST', path: '/user/set/display/picture', params: 'body', send: false },\n setGroupDescription: { method: 'POST', path: '/group/set/description', params: 'body', send: false },\n setPresence: { method: 'POST', path: '/instance/set/presence', params: 'body', send: false },\n setProfileName: { method: 'POST', path: '/user/set/name', params: 'body', send: false },\n setRecording: { method: 'POST', path: '/chat/recording', params: 'body', send: false },\n setSettings: { method: 'POST', path: '/instance/set/settings', params: 'body', send: false },\n setStatus: { method: 'POST', path: '/instance/set/status', params: 'body', send: false },\n setTyping: { method: 'POST', path: '/chat/typing', params: 'body', send: false },\n setUserStatus: { method: 'POST', path: '/user/set/status', params: 'body', send: false },\n shareCatalog: { method: 'POST', path: '/share/catalog', params: 'body', send: true },\n status: { method: 'GET', path: '/instance/status', params: 'none', send: false },\n unarchiveChat: { method: 'POST', path: '/chat/unarchive', params: 'body', send: false },\n unblockUser: { method: 'POST', path: '/user/unblock', params: 'body', send: false },\n unmuteChat: { method: 'POST', path: '/chat/unmute', params: 'body', send: false },\n unpinChat: { method: 'POST', path: '/chat/unpin', params: 'body', send: false },\n unreadChat: { method: 'POST', path: '/chat/unread', params: 'body', send: false },\n userBusinessProfile: { method: 'POST', path: '/user/business', params: 'body', send: false },\n userDisplayPicture: { method: 'GET', path: '/user/display/picture', params: 'query', send: false },\n userPresence: { method: 'POST', path: '/user/presence', params: 'body', send: false },\n userStatus: { method: 'POST', path: '/user/status', params: 'body', send: false },\n} as const;\n\nexport type OperationId = keyof typeof operations;\n","/**\n * Client-side token bucket, so a busy integration stays under the API's limit (1000 requests per\n * minute per channel) instead of collecting 429s. Every attempt, including a retry, takes a token.\n */\nexport class TokenBucket {\n private tokens: number;\n private last: number;\n private readonly refillPerMs: number;\n\n constructor(\n private readonly capacity: number,\n intervalMs: number,\n private readonly now: () => number = Date.now,\n private readonly wait: (ms: number) => Promise<void> = (ms) => new Promise((r) => setTimeout(r, ms)),\n ) {\n if (!(capacity > 0) || !(intervalMs > 0)) {\n throw new RangeError('TokenBucket needs a positive capacity and interval');\n }\n\n this.tokens = capacity;\n this.last = now();\n this.refillPerMs = capacity / intervalMs;\n }\n\n /** Resolves once a token is available and taken. */\n async take(): Promise<void> {\n for (;;) {\n this.refill();\n\n if (this.tokens >= 1) {\n this.tokens -= 1;\n\n return;\n }\n\n await this.wait(Math.ceil((1 - this.tokens) / this.refillPerMs));\n }\n }\n\n /** Tokens available right now (for tests and diagnostics). */\n available(): number {\n this.refill();\n\n return this.tokens;\n }\n\n private refill(): void {\n const now = this.now();\n const elapsed = now - this.last;\n\n if (elapsed > 0) {\n this.tokens = Math.min(this.capacity, this.tokens + elapsed * this.refillPerMs);\n this.last = now;\n }\n }\n}\n","export interface RetryOptions {\n /** Retries after the first attempt. Default 3. `0` disables retries. */\n maxRetries?: number;\n /** Base delay for exponential backoff with full jitter, in ms. Default 500. */\n baseDelayMs?: number;\n /** Upper bound of one backoff delay, in ms. Default 8000. */\n maxDelayMs?: number;\n /**\n * Longest `Retry-After` the client will wait on its own, in ms. A longer one (the workspace's\n * daily send limit can say hours) is thrown to the caller as a LetsBotApiError with `retryAfter`\n * set. Default 60000.\n */\n maxRetryAfterMs?: number;\n}\n\nexport type ResolvedRetryOptions = Required<RetryOptions>;\n\nexport const DEFAULT_RETRY: ResolvedRetryOptions = {\n maxRetries: 3,\n baseDelayMs: 500,\n maxDelayMs: 8_000,\n maxRetryAfterMs: 60_000,\n};\n\n/** Full jitter: a uniform delay in [0, min(maxDelay, base * 2^attempt)). `attempt` starts at 0. */\nexport function backoffDelay(attempt: number, options: ResolvedRetryOptions, random: () => number = Math.random): number {\n const ceiling = Math.min(options.maxDelayMs, options.baseDelayMs * 2 ** attempt);\n\n return Math.floor(random() * ceiling);\n}\n\n/** `Retry-After` as seconds (delta-seconds or an HTTP date), or undefined. */\nexport function parseRetryAfter(value: string | null, now: number = Date.now()): number | undefined {\n if (value === null || value.trim() === '') return undefined;\n\n const trimmed = value.trim();\n\n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) return Number(trimmed);\n\n const date = Date.parse(trimmed);\n\n if (Number.isNaN(date)) return undefined;\n\n return Math.max(0, Math.ceil((date - now) / 1000));\n}\n\nexport const sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n","import { randomUUID } from 'node:crypto';\nimport { isLogicalFailure, LetsBotApiError, LetsBotConnectionError } from './errors.js';\nimport { operations as table, type OperationId } from './generated/operations.js';\nimport type { operations as Ops } from './generated/types.js';\nimport { TokenBucket } from './rate-limit.js';\nimport { backoffDelay, DEFAULT_RETRY, parseRetryAfter, sleep as defaultSleep, type ResolvedRetryOptions, type RetryOptions } from './retry.js';\n\nexport const DEFAULT_BASE_URL = 'https://letsbot.net/api/v1';\nexport const SDK_VERSION = '0.5.0';\n\n// Every documented body is `required: true`, so an optional `requestBody?: never` means \"no body\".\ntype JsonBody<O> = O extends { requestBody: { content: { 'application/json': infer B } } } ? B : never;\n\ntype QueryOf<O> = O extends { parameters: { query?: infer Q } } ? Exclude<Q, undefined> : never;\n\n/** The request parameters of an operation: its JSON body, or its query string for GET/DELETE. */\nexport type ParamsOf<Id extends OperationId> = [JsonBody<Ops[Id]>] extends [never]\n ? [QueryOf<Ops[Id]>] extends [never]\n ? Record<string, never>\n : QueryOf<Ops[Id]>\n : JsonBody<Ops[Id]>;\n\n/** The documented 200 body of an operation. */\nexport type ResultOf<Id extends OperationId> = Ops[Id] extends {\n responses: { 200: { content: { 'application/json': infer R } } };\n}\n ? R\n : unknown;\n\ntype HasRequired<P> = {} extends P ? false : true;\n\n/** Call arguments: params are required only when the operation has required params. */\nexport type CallArgs<Id extends OperationId> =\n HasRequired<ParamsOf<Id>> extends true\n ? [params: ParamsOf<Id>, options?: RequestOptions]\n : [params?: ParamsOf<Id>, options?: RequestOptions];\n\nexport interface RequestOptions {\n /**\n * Send endpoints only (`x-letsbot-send` in the spec). By default the client generates a UUID\n * key per call and reuses it on every retry, so a retried send is delivered at most once. Pass\n * your own key to make a send idempotent across process restarts (e.g. your order id), or\n * `false` to send without one — then the client will NOT retry the send after a network error\n * or 5xx. Ignored on other endpoints: the server honours the header on sends only.\n */\n idempotencyKey?: string | false;\n /** Override the client's retry count for this call. */\n maxRetries?: number;\n /** Per-attempt timeout in ms. Overrides the client's `timeoutMs`. */\n timeoutMs?: number;\n /** Cancels the call, including any wait between retries. */\n signal?: AbortSignal;\n /** Extra headers for this call. */\n headers?: Record<string, string>;\n}\n\nexport interface LetsBotClientOptions {\n /** The channel's `lb_api_key` (panel → API → Authentication data). */\n apiKey: string;\n /** Default `https://letsbot.net/api/v1`. */\n baseUrl?: string;\n /** Per-attempt timeout in ms. Default 30000. */\n timeoutMs?: number;\n /** Exponential backoff with full jitter. Defaults: 3 retries, 500 ms base. */\n retry?: RetryOptions;\n /**\n * Client-side token bucket. Default 1000 requests per minute (the API's per-channel limit).\n * `false` turns it off; share one client per API key so the bucket sees all traffic.\n */\n rateLimit?: false | { requestsPerMinute?: number };\n /**\n * Throw LetsBotApiError for a 2xx whose body says `success: false` or has a falsy `Status`\n * (the API's validation failures are HTTP 202 `{Status: 0}`). Default true.\n */\n throwOnLogicalFailure?: boolean;\n /** Custom fetch (tests, proxies). Default: global fetch (Node 18+). */\n fetch?: typeof fetch;\n /** Idempotency-Key generator. Default: crypto.randomUUID. */\n generateIdempotencyKey?: () => string;\n /** Appended to the User-Agent. */\n userAgent?: string;\n /** @internal Test hooks. */\n sleep?: (ms: number) => Promise<void>;\n /** @internal Test hooks. */\n random?: () => number;\n /** @internal Test hooks. */\n now?: () => number;\n}\n\nexport interface ApiResponse<T> {\n data: T;\n status: number;\n headers: Headers;\n /** The Idempotency-Key sent, if any. */\n idempotencyKey: string | undefined;\n /** True when the server replayed the stored response of an earlier request with the same key: nothing new was sent. */\n replayed: boolean;\n /** Number of attempts made (1 = no retry). */\n attempts: number;\n}\n\nconst IDEMPOTENT_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);\nconst RETRYABLE_5XX = new Set([500, 502, 503, 504]);\n\nexport class LetsBotClient {\n private readonly apiKey: string;\n protected readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly retry: ResolvedRetryOptions;\n private readonly bucket: TokenBucket | null;\n private readonly throwOnLogicalFailure: boolean;\n private readonly fetchImpl: typeof fetch;\n protected readonly newKey: () => string;\n private readonly userAgent: string;\n private readonly sleep: (ms: number) => Promise<void>;\n private readonly random: () => number;\n\n constructor(options: LetsBotClientOptions, keyLabel = 'LetsBotClient: `apiKey` (the channel lb_api_key)') {\n if (!options || typeof options.apiKey !== 'string' || options.apiKey.trim() === '') {\n throw new TypeError(`${keyLabel} is required`);\n }\n\n const fetchImpl = options.fetch ?? globalThis.fetch;\n\n if (typeof fetchImpl !== 'function') {\n throw new TypeError('LetsBotClient: no fetch available. Use Node 18+ or pass `fetch`.');\n }\n\n this.apiKey = options.apiKey.trim();\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.retry = { ...DEFAULT_RETRY, ...(options.retry ?? {}) };\n this.throwOnLogicalFailure = options.throwOnLogicalFailure ?? true;\n this.fetchImpl = fetchImpl;\n this.newKey = options.generateIdempotencyKey ?? (() => randomUUID());\n this.userAgent = `letsbot-sdk-typescript/${SDK_VERSION}${options.userAgent ? ` ${options.userAgent}` : ''}`;\n this.sleep = options.sleep ?? defaultSleep;\n this.random = options.random ?? Math.random;\n\n const perMinute = options.rateLimit === false ? null : (options.rateLimit?.requestsPerMinute ?? 1000);\n this.bucket = perMinute === null ? null : new TokenBucket(perMinute, 60_000, options.now ?? Date.now, this.sleep);\n }\n\n /** Call any operation by its operationId and get the body. */\n async call<Id extends OperationId>(operationId: Id, ...args: CallArgs<Id>): Promise<ResultOf<Id>> {\n return (await this.callWithResponse(operationId, ...args)).data;\n }\n\n /** Call any operation and get the body plus status, headers, Idempotency-Key and replay flag. */\n async callWithResponse<Id extends OperationId>(operationId: Id, ...args: CallArgs<Id>): Promise<ApiResponse<ResultOf<Id>>> {\n const [params, options = {}] = args as [Record<string, unknown> | undefined, RequestOptions | undefined];\n const meta = table[operationId];\n\n if (!meta) {\n throw new TypeError(`Unknown LetsBot operation: ${String(operationId)}`);\n }\n\n const url = new URL(this.baseUrl + meta.path);\n const headers = this.baseHeaders(options);\n let body: string | undefined;\n\n if (meta.params === 'query') {\n appendQuery(url, params);\n } else if (meta.params === 'body') {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(params ?? {});\n }\n\n let idempotencyKey: string | undefined;\n\n if (meta.send && options.idempotencyKey !== false) {\n idempotencyKey = options.idempotencyKey ?? this.newKey();\n headers['Idempotency-Key'] = idempotencyKey;\n }\n\n // A read is safe to repeat. A send is safe to repeat only under the same Idempotency-Key.\n // Anything else (a POST that archives, blocks, creates a group...) is never repeated after\n // it may have reached the server.\n const unsafeRetryAllowed = IDEMPOTENT_METHODS.has(meta.method) || (meta.send && idempotencyKey !== undefined);\n\n return this.perform<ResultOf<Id>>(operationId, meta.method, url, headers, body, { idempotencyKey, unsafeRetryAllowed }, options);\n }\n\n /** Accept, auth, User-Agent and the per-call extra headers. */\n protected baseHeaders(options: RequestOptions): Record<string, string> {\n return {\n Accept: 'application/json',\n ...this.authHeaders(this.apiKey),\n 'User-Agent': this.userAgent,\n ...(options.headers ?? {}),\n };\n }\n\n /** How the key travels. The /api/v1 channel API takes a Bearer token. */\n protected authHeaders(apiKey: string): Record<string, string> {\n return { Authorization: `Bearer ${apiKey}` };\n }\n\n /**\n * One request with the client's rate limit, timeout, retries and error mapping.\n * `unsafeRetryAllowed`: whether a network error / 5xx may be retried (reads, keyed sends).\n */\n protected async perform<T>(\n operationId: string,\n method: string,\n url: URL,\n headers: Record<string, string>,\n body: string | undefined,\n retry: { idempotencyKey?: string | undefined; unsafeRetryAllowed: boolean },\n options: RequestOptions,\n ): Promise<ApiResponse<T>> {\n const { idempotencyKey, unsafeRetryAllowed } = retry;\n const maxRetries = options.maxRetries ?? this.retry.maxRetries;\n\n for (let attempt = 0; ; attempt++) {\n throwIfAborted(options.signal);\n\n if (this.bucket) await this.bucket.take();\n\n let response: Response;\n\n try {\n response = await this.send(url, method, headers, body, options);\n } catch (error) {\n if (options.signal?.aborted) throw options.signal.reason ?? error;\n\n if (unsafeRetryAllowed && attempt < maxRetries) {\n await this.wait(backoffDelay(attempt, this.retry, this.random), options.signal);\n continue;\n }\n\n throw new LetsBotConnectionError(operationId, error);\n }\n\n const parsed = await readBody(response);\n const retryAfter = parseRetryAfter(response.headers.get('retry-after'));\n\n if (response.ok && !(this.throwOnLogicalFailure && isLogicalFailure(parsed))) {\n return {\n data: parsed as T,\n status: response.status,\n headers: response.headers,\n idempotencyKey,\n replayed: response.headers.get('idempotent-replayed') === 'true',\n attempts: attempt + 1,\n };\n }\n\n const error = new LetsBotApiError({ status: response.status, body: parsed, headers: response.headers, operationId, retryAfter });\n\n if (!response.ok && attempt < maxRetries && this.shouldRetry(error, unsafeRetryAllowed)) {\n let delay = backoffDelay(attempt, this.retry, this.random);\n\n if (retryAfter !== undefined) {\n if (retryAfter * 1000 > this.retry.maxRetryAfterMs) throw error;\n\n delay = retryAfter * 1000;\n }\n\n await this.wait(delay, options.signal);\n continue;\n }\n\n throw error;\n }\n }\n\n private shouldRetry(error: LetsBotApiError, unsafeRetryAllowed: boolean): boolean {\n // 429: refused before anything was done (rate limit, daily send limit, WhatsApp throttling).\n if (error.status === 429) return true;\n\n // The first request with this key is still running; the same key returns its result.\n if (error.status === 409 && error.code === 'idempotency_request_in_progress') return true;\n\n return RETRYABLE_5XX.has(error.status) && unsafeRetryAllowed;\n }\n\n private async send(url: URL, method: string, headers: Record<string, string>, body: string | undefined, options: RequestOptions): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(new Error(`timed out after ${options.timeoutMs ?? this.timeoutMs} ms`)), options.timeoutMs ?? this.timeoutMs);\n const onAbort = () => controller.abort(options.signal?.reason);\n\n options.signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n return await this.fetchImpl(url.toString(), { method, headers, body, signal: controller.signal });\n } finally {\n clearTimeout(timeout);\n options.signal?.removeEventListener('abort', onAbort);\n }\n }\n\n private async wait(ms: number, signal: AbortSignal | undefined): Promise<void> {\n await this.sleep(ms);\n throwIfAborted(signal);\n }\n}\n\nfunction appendQuery(url: URL, params: Record<string, unknown> | undefined): void {\n for (const [key, value] of Object.entries(params ?? {})) {\n if (value === undefined || value === null) continue;\n\n url.searchParams.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n }\n}\n\nasync function readBody(response: Response): Promise<unknown> {\n const text = await response.text();\n\n if (text === '') return undefined;\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw signal.reason ?? new Error('aborted');\n }\n}\n","import type { CallArgs, LetsBotClient, ParamsOf, RequestOptions, ResultOf } from './client.js';\nimport type { OperationId } from './generated/operations.js';\n\n/**\n * Friendly names for every operation, grouped like the API. Each entry maps a method name to\n * the spec's operationId; the method's parameter and result types come from the spec.\n * `client.call(operationId, params)` reaches the same operations by id.\n */\nexport const resourceMap = {\n messages: {\n send: 'sendMessage',\n sendDisappearing: 'sendDisappearingMessage',\n forward: 'forwardMessage',\n sendSticker: 'sendSticker',\n react: 'sendReaction',\n reply: 'sendReply',\n mention: 'sendMention',\n sendList: 'sendList',\n fetch: 'getMessages',\n get: 'getMessageByID',\n delete: 'deleteMessage',\n },\n media: {\n sendFile: 'sendFile',\n sendImage: 'sendImage',\n sendAudio: 'sendAudio',\n sendVideo: 'sendVideo',\n sendGif: 'sendGif',\n sendLocation: 'sendLocation',\n sendVoiceNote: 'sendPTT',\n sendContact: 'sendContact',\n shareCatalog: 'shareCatalog',\n },\n interactive: {\n sendButtons: 'sendButtons',\n sendButtonsWithImage: 'sendButtonsWithImage',\n sendButtonsWithVideo: 'sendButtonsWithVideo',\n sendButtonsWithLocation: 'sendButtonsWithLocation',\n sendButtonsWithDocument: 'sendButtonsWithDocument',\n sendButtonsTemplate: 'sendButtonsTemplate',\n sendButtonsTemplateWithImage: 'sendButtonsTemplateWithImage',\n sendButtonsTemplateWithVideo: 'sendButtonsTemplateWithVideo',\n sendButtonsTemplateWithLocation: 'sendButtonsTemplateWithLocation',\n sendButtonsTemplateWithDocument: 'sendButtonsTemplateWithDocument',\n sendCarousel: 'sendCarousel',\n },\n templates: {\n send: 'sendWhatsAppTemplate',\n sendSimple: 'sendSimpleTemplate',\n sendWithImage: 'sendTemplateWithImage',\n sendWithDocument: 'sendTemplateWithDocument',\n sendWithVideo: 'sendTemplateWithVideo',\n },\n chats: {\n list: 'getChatList',\n conversation: 'getConversation',\n typing: 'setTyping',\n recording: 'setRecording',\n read: 'readChat',\n unread: 'unreadChat',\n archive: 'archiveChat',\n unarchive: 'unarchiveChat',\n mute: 'muteChat',\n unmute: 'unmuteChat',\n pin: 'pinChat',\n unpin: 'unpinChat',\n checkPhone: 'checkPhone',\n },\n contacts: {\n list: 'getContacts',\n get: 'getContact',\n listModerators: 'getModerators',\n assignModerator: 'setContactModerator',\n listLabels: 'getLabels',\n addLabel: 'setContactLabel',\n },\n groups: {\n create: 'createGroup',\n join: 'joinGroup',\n list: 'getGroupList',\n conversation: 'getGroupConversation',\n metadata: 'groupMetadata',\n settings: 'groupSettings',\n rename: 'renameGroup',\n setDescription: 'setGroupDescription',\n addParticipants: 'addGroupParticipant',\n removeParticipants: 'removeGroupParticipant',\n promoteParticipants: 'promoteGroupParticipant',\n demoteParticipants: 'demoteGroupParticipant',\n setPicture: 'setChatDisplayPicture',\n getPicture: 'getChatDisplayPicture',\n },\n invites: {\n getCode: 'inviteCode',\n revokeCode: 'revokeInviteCode',\n sendLink: 'sendInviteLink',\n getInfo: 'groupGetInviteInfo',\n },\n user: {\n setName: 'setProfileName',\n businessProfile: 'userBusinessProfile',\n block: 'blockUser',\n unblock: 'unblockUser',\n setPicture: 'setDisplayPicture',\n status: 'userStatus',\n setStatus: 'setUserStatus',\n presence: 'userPresence',\n picture: 'userDisplayPicture',\n },\n instance: {\n status: 'status',\n setStatus: 'setStatus',\n setPresence: 'setPresence',\n setSettings: 'setSettings',\n queryBroadcast: 'queryBroadcast',\n },\n products: {\n list: 'getProducts',\n get: 'getProduct',\n create: 'createProduct',\n collections: 'getCollections',\n getOrder: 'getOrder',\n },\n orders: {\n record: 'recordOrder',\n cancel: 'cancelOrder',\n },\n session: {\n qr: 'qr',\n find: 'findSession',\n status: 'sessionStatus',\n },\n archive: {\n list: 'index',\n },\n} as const satisfies Record<string, Record<string, OperationId>>;\n\nexport type ResourceMap = typeof resourceMap;\n\nexport type Resource<M extends Record<string, OperationId>> = {\n [K in keyof M]: (...args: CallArgs<M[K]>) => Promise<ResultOf<M[K]>>;\n};\n\nexport function bindResource<M extends Record<string, OperationId>>(client: LetsBotClient, map: M): Resource<M> {\n const bound: Record<string, unknown> = {};\n\n for (const [name, operationId] of Object.entries(map)) {\n bound[name] = (...args: unknown[]) => (client.call as (id: OperationId, ...rest: unknown[]) => Promise<unknown>)(operationId, ...args);\n }\n\n return bound as Resource<M>;\n}\n\nexport type ArchiveMessage = ResultOf<'index'>['data'][number];\n\n/** Every archived message in the range, following `next_cursor` page by page. */\nexport async function* iterateArchive(\n client: LetsBotClient,\n params: Omit<ParamsOf<'index'>, 'cursor'>,\n options?: RequestOptions,\n): AsyncGenerator<ArchiveMessage, void, undefined> {\n let cursor: string | undefined;\n\n do {\n const page = await client.call('index', { ...params, ...(cursor ? { cursor } : {}) } as ParamsOf<'index'>, options);\n\n yield* page.data;\n cursor = page.next_cursor ?? undefined;\n } while (cursor);\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\n\n/**\n * The key every LetsBot API webhook is signed with today: the literal string `Letsbot`, the same\n * for every workspace (packages/api CallWebhooksAction → spatie/laravel-webhook-server).\n */\nexport const LEGACY_WEBHOOK_SECRET = 'Letsbot';\n\n/** The events an API webhook can subscribe to (panel → API → Webhooks). */\nexport type WebhookEventType =\n | 'message_notification'\n | 'ack_notification'\n | 'chat_notification'\n | 'label_notifications'\n | 'contact_notifications'\n | 'order_notifications';\n\n/** Body of every API webhook POST. `data` depends on the event. */\nexport interface WebhookEnvelope<T = unknown> {\n event: WebhookEventType | (string & {});\n data: T;\n}\n\n/**\n * @experimental NOT A SECURITY CHECK.\n *\n * Recomputes the `Signature` header of an API webhook: hex HMAC-SHA256 of the raw request body.\n * Because the key is one shared, public string (`Letsbot`, printed in this SDK), anyone can\n * produce a valid signature. A `true` here proves only that the body was not altered by\n * something that did not know that string — it does NOT prove the request came from LetsBot.\n *\n * To authenticate webhooks, add a custom header with a secret of your own to the webhook in the\n * panel (API → Webhooks → headers) and compare it on receipt. If LetsBot ships per-webhook\n * secrets later, pass that secret as `secret`.\n *\n * @param rawBody the exact bytes received — verify BEFORE JSON.parse; a re-serialised body will not match\n * @param signature the `Signature` header value\n */\nexport function experimental_verifyWebhookSignature(\n rawBody: string | Uint8Array,\n signature: string | null | undefined,\n secret: string = LEGACY_WEBHOOK_SECRET,\n): boolean {\n if (typeof signature !== 'string' || !/^[0-9a-f]{64}$/i.test(signature.trim())) return false;\n\n const expected = createHmac('sha256', secret).update(rawBody).digest();\n const given = Buffer.from(signature.trim(), 'hex');\n\n return given.length === expected.length && timingSafeEqual(given, expected);\n}\n","// Generated from openapi/openapi.yaml by scripts/gen-operations.mjs. Do not edit by hand:\n// run `npm run generate` (or `npm run spec:sync` inside the LetsBot workspace).\n\nexport const crmOperations = {\n crmAddCompanyNote: { method: 'POST', path: '/companies/{id}/notes', body: true },\n crmAddContactNote: { method: 'POST', path: '/contacts/{id}/notes', body: true },\n crmAddDealNote: { method: 'POST', path: '/deals/{id}/notes', body: true },\n crmCompaniesSchema: { method: 'GET', path: '/companies/schema', body: false },\n crmCompleteTask: { method: 'POST', path: '/tasks/{id}/complete', body: false },\n crmContactsSchema: { method: 'GET', path: '/contacts/schema', body: false },\n crmCreateActivity: { method: 'POST', path: '/activities', body: true },\n crmCreateCompany: { method: 'POST', path: '/companies', body: true, query: ['allow_duplicate'] },\n crmCreateContact: { method: 'POST', path: '/contacts', body: true, query: ['allow_duplicate'] },\n crmCreateCustomRecord: { method: 'POST', path: '/objects/{key}/records', body: true },\n crmCreateDeal: { method: 'POST', path: '/deals', body: true },\n crmCreateProduct: { method: 'POST', path: '/products', body: true },\n crmCreateQuote: { method: 'POST', path: '/quotes', body: true },\n crmCreateTask: { method: 'POST', path: '/tasks', body: true },\n crmCustomObjectSchema: { method: 'GET', path: '/objects/{key}/schema', body: false },\n crmDeleteCompany: { method: 'DELETE', path: '/companies/{id}', body: false },\n crmDeleteCustomRecord: { method: 'DELETE', path: '/objects/{key}/records/{id}', body: false },\n crmDeleteDeal: { method: 'DELETE', path: '/deals/{id}', body: false },\n crmDeleteProduct: { method: 'DELETE', path: '/products/{id}', body: false },\n crmDeleteQuote: { method: 'DELETE', path: '/quotes/{id}', body: false },\n crmDeleteTask: { method: 'DELETE', path: '/tasks/{id}', body: false },\n crmGetActivity: { method: 'GET', path: '/activities/{id}', body: false },\n crmGetCompany: { method: 'GET', path: '/companies/{id}', body: false },\n crmGetContact: { method: 'GET', path: '/contacts/{id}', body: false },\n crmGetCustomRecord: { method: 'GET', path: '/objects/{key}/records/{id}', body: false },\n crmGetDeal: { method: 'GET', path: '/deals/{id}', body: false },\n crmGetProduct: { method: 'GET', path: '/products/{id}', body: false },\n crmGetQuote: { method: 'GET', path: '/quotes/{id}', body: false },\n crmGetTask: { method: 'GET', path: '/tasks/{id}', body: false },\n crmHookSample: { method: 'GET', path: '/hooks/sample', body: false },\n crmLinkCompanyContact: { method: 'POST', path: '/companies/{id}/contacts', body: true },\n crmListActivities: { method: 'GET', path: '/activities', body: false },\n crmListCompanies: { method: 'GET', path: '/companies', body: false },\n crmListContacts: { method: 'GET', path: '/contacts', body: false },\n crmListCustomObjects: { method: 'GET', path: '/objects', body: false },\n crmListCustomRecords: { method: 'GET', path: '/objects/{key}/records', body: false },\n crmListDeals: { method: 'GET', path: '/deals', body: false },\n crmListHookEvents: { method: 'GET', path: '/hooks/events', body: false },\n crmListHooks: { method: 'GET', path: '/hooks', body: false },\n crmListLostReasons: { method: 'GET', path: '/deals/lost-reasons', body: false },\n crmListPipelines: { method: 'GET', path: '/pipelines', body: false },\n crmListProducts: { method: 'GET', path: '/products', body: false },\n crmListQuotes: { method: 'GET', path: '/quotes', body: false },\n crmListTasks: { method: 'GET', path: '/tasks', body: false },\n crmMarkDealLost: { method: 'POST', path: '/deals/{id}/lost', body: true },\n crmMarkDealWon: { method: 'POST', path: '/deals/{id}/won', body: false },\n crmMoveDealStage: { method: 'POST', path: '/deals/{id}/stage', body: true },\n crmProductsSchema: { method: 'GET', path: '/products/schema', body: false },\n crmQuotesSchema: { method: 'GET', path: '/quotes/schema', body: false },\n crmSearchCompanies: { method: 'GET', path: '/companies/search', body: false },\n crmSearchContacts: { method: 'GET', path: '/contacts/search', body: false },\n crmSearchCustomRecords: { method: 'GET', path: '/objects/{key}/records/search', body: false },\n crmSearchDeals: { method: 'GET', path: '/deals/search', body: false },\n crmSubscribeHook: { method: 'POST', path: '/hooks', body: true },\n crmUnlinkCompanyContact: { method: 'DELETE', path: '/companies/{id}/contacts/{contactId}', body: false },\n crmUnsubscribeHook: { method: 'DELETE', path: '/hooks/{id}', body: false },\n crmUpdateCompany: { method: 'PATCH', path: '/companies/{id}', body: true },\n crmUpdateContact: { method: 'PATCH', path: '/contacts/{id}', body: true },\n crmUpdateCustomRecord: { method: 'PATCH', path: '/objects/{key}/records/{id}', body: true },\n crmUpdateDeal: { method: 'PATCH', path: '/deals/{id}', body: true },\n crmUpdateProduct: { method: 'PATCH', path: '/products/{id}', body: true },\n crmUpdateQuote: { method: 'PATCH', path: '/quotes/{id}', body: true },\n crmUpdateTask: { method: 'PATCH', path: '/tasks/{id}', body: true },\n} as const;\n\nexport type CrmOperationId = keyof typeof crmOperations;\n","import { createHmac, timingSafeEqual } from 'node:crypto';\nimport { LetsBotClient, type ApiResponse, type LetsBotClientOptions, type RequestOptions } from './client.js';\nimport { crmOperations, type CrmOperationId } from './generated/crm-operations.js';\nimport type { components, operations as Ops } from './generated/types.js';\n\n/**\n * Client for the LetsBot CRM API: `https://{workspace}/api/v1/crm`.\n *\n * ```ts\n * const crm = new LetsBotCrm({ apiKey: process.env.LETSBOT_CRM_KEY!, workspace: 'mystore.letsbot.net' });\n * const { data: deal } = await crm.deals.create({ title: 'Gift boxes', amount: 8750, contact_id: 678 });\n * await crm.deals.moveStage({ id: deal.id, stage_id: 4 });\n * ```\n *\n * The key is a workspace API key (`lbz_…`, Panel → Zapier → API keys) with the **crm** scope\n * ticked — a \"full access\" key without it gets `403 missing_scope`. It acts as the workspace\n * owner: it sees every CRM record. The API answers 404 for everything while the workspace has not\n * turned the CRM on.\n */\n\ntype Schemas = components['schemas'];\n\nexport type CrmContact = Schemas['CrmContact'];\nexport type CrmCompany = Schemas['CrmCompany'];\nexport type CrmCompanyDetail = Schemas['CrmCompanyDetail'];\nexport type CrmPipeline = Schemas['CrmPipeline'];\nexport type CrmDeal = Schemas['CrmDeal'];\nexport type CrmTask = Schemas['CrmTask'];\nexport type CrmActivity = Schemas['CrmActivity'];\nexport type CrmQuote = Schemas['CrmQuote'];\nexport type CrmProduct = Schemas['CrmProduct'];\nexport type CrmListMeta = Schemas['CrmListMeta'];\nexport type CrmListSchema = Schemas['CrmListSchema'];\nexport type CrmWebhookSubscription = Schemas['CrmWebhookSubscription'];\nexport type CrmWebhookEventName = Schemas['CrmWebhookEventName'];\n/** The body of every CRM webhook delivery. `data` is the record as the API's GET returns it. */\nexport type CrmWebhookEvent = Schemas['CrmWebhookEvent'];\n/** A merchant-defined object (e.g. `co_projects`) with its fields. */\nexport type CrmCustomObject = Schemas['CrmCustomObject'];\n/** One record of a custom object; `values` is keyed by field key. */\nexport type CrmCustomRecord = Schemas['CrmCustomRecord'];\nexport type CrmCustomRecordInput = Schemas['CrmCustomRecordInput'];\n\n/** Every CRM webhook event (`GET /hooks/events`), for `hooks.subscribe({ events })`. */\nexport const CRM_WEBHOOK_EVENTS = [\n 'contact.created',\n 'contact.updated',\n 'contact.deleted',\n 'company.created',\n 'company.updated',\n 'company.deleted',\n 'deal.created',\n 'deal.updated',\n 'deal.deleted',\n 'deal.stage_changed',\n 'deal.won',\n 'deal.lost',\n 'deal.assigned',\n 'task.created',\n 'task.completed',\n 'ticket.created',\n 'quote.sent',\n 'quote.viewed',\n 'quote.accepted',\n 'quote.signed',\n 'quote.paid',\n 'invoice.created',\n 'form.submitted',\n 'health.at_risk',\n] as const satisfies readonly CrmWebhookEventName[];\n\n/** A likely duplicate the API refused to create (409 `possible_duplicate`). */\nexport interface CrmPossibleDuplicate {\n /** The record to update instead. */\n existingId: number;\n /** Best match first: what matched (`phone`, `bsuid`, `email`, `domain`, `company_name`) and how sure (0–100). */\n duplicates: Array<{ id: number; reason: string; confidence?: number }>;\n}\n\n/**\n * The likely duplicate behind a failed `contacts.create` / `companies.create`, or `null` for any\n * other error. Repeat the call with `allow_duplicate: true` to create the record anyway.\n *\n * ```ts\n * try {\n * await crm.contacts.create({ phone: '966501234567', email: 'laila@example.com' });\n * } catch (error) {\n * const dup = crmPossibleDuplicate(error);\n * if (!dup) throw error;\n * await crm.contacts.update({ id: dup.existingId, name: 'Laila' });\n * }\n * ```\n */\nexport function crmPossibleDuplicate(error: unknown): CrmPossibleDuplicate | null {\n const e = error as { status?: unknown; code?: unknown; body?: unknown } | null;\n\n if (!e || e.status !== 409 || e.code !== 'possible_duplicate') return null;\n\n const body = (e.body ?? {}) as { existing_id?: unknown; duplicates?: unknown };\n const duplicates = Array.isArray(body.duplicates) ? (body.duplicates as CrmPossibleDuplicate['duplicates']) : [];\n const existingId = Number(body.existing_id ?? duplicates[0]?.id);\n\n return Number.isFinite(existingId) ? { existingId, duplicates } : null;\n}\n\nexport const CRM_DEFAULT_RATE_LIMIT = 120;\nexport const CRM_SIGNATURE_HEADER = 'X-LetsBot-Signature';\n\ntype Op<K extends CrmOperationId> = Ops[K];\ntype Defined<T> = Exclude<T, undefined>;\ntype PathOf<K extends CrmOperationId> = Op<K> extends { parameters: { path?: infer P } } ? Defined<P> : never;\ntype QueryOf<K extends CrmOperationId> = Op<K> extends { parameters: { query?: infer Q } } ? Defined<Q> : never;\ntype BodyOf<K extends CrmOperationId> = Op<K> extends { requestBody?: { content: { 'application/json': infer B } } } ? B : never;\ntype Part<T> = [T] extends [never] ? {} : T;\n\n/** One flat object: path parameters (`id`, …) plus the query (reads) or the JSON body (writes). */\nexport type CrmParamsOf<K extends CrmOperationId> = Part<PathOf<K>> & Part<QueryOf<K>> & Part<BodyOf<K>>;\n\n/** The documented success body (`{success: true, data, meta?}`) of a CRM operation. */\nexport type CrmResultOf<K extends CrmOperationId> = Op<K> extends { responses: { 200: { content: { 'application/json': infer R } } } }\n ? R\n : Op<K> extends { responses: { 201: { content: { 'application/json': infer R } } } }\n ? R\n : unknown;\n\ntype HasRequired<P> = {} extends P ? false : true;\n\nexport type CrmCallArgs<K extends CrmOperationId> =\n HasRequired<CrmParamsOf<K>> extends true\n ? [params: CrmParamsOf<K>, options?: RequestOptions]\n : [params?: CrmParamsOf<K>, options?: RequestOptions];\n\n/** Method name → operationId, grouped by resource. */\nexport const crmResourceMap = {\n contacts: {\n list: 'crmListContacts',\n schema: 'crmContactsSchema',\n search: 'crmSearchContacts',\n get: 'crmGetContact',\n create: 'crmCreateContact',\n update: 'crmUpdateContact',\n addNote: 'crmAddContactNote',\n },\n companies: {\n list: 'crmListCompanies',\n schema: 'crmCompaniesSchema',\n search: 'crmSearchCompanies',\n get: 'crmGetCompany',\n create: 'crmCreateCompany',\n update: 'crmUpdateCompany',\n delete: 'crmDeleteCompany',\n linkContact: 'crmLinkCompanyContact',\n unlinkContact: 'crmUnlinkCompanyContact',\n addNote: 'crmAddCompanyNote',\n },\n deals: {\n list: 'crmListDeals',\n pipelines: 'crmListPipelines',\n lostReasons: 'crmListLostReasons',\n search: 'crmSearchDeals',\n get: 'crmGetDeal',\n create: 'crmCreateDeal',\n update: 'crmUpdateDeal',\n delete: 'crmDeleteDeal',\n moveStage: 'crmMoveDealStage',\n markWon: 'crmMarkDealWon',\n markLost: 'crmMarkDealLost',\n addNote: 'crmAddDealNote',\n },\n tasks: {\n list: 'crmListTasks',\n get: 'crmGetTask',\n create: 'crmCreateTask',\n update: 'crmUpdateTask',\n delete: 'crmDeleteTask',\n complete: 'crmCompleteTask',\n },\n activities: {\n list: 'crmListActivities',\n get: 'crmGetActivity',\n create: 'crmCreateActivity',\n },\n quotes: {\n list: 'crmListQuotes',\n schema: 'crmQuotesSchema',\n get: 'crmGetQuote',\n create: 'crmCreateQuote',\n update: 'crmUpdateQuote',\n delete: 'crmDeleteQuote',\n },\n products: {\n list: 'crmListProducts',\n schema: 'crmProductsSchema',\n get: 'crmGetProduct',\n create: 'crmCreateProduct',\n update: 'crmUpdateProduct',\n delete: 'crmDeleteProduct',\n },\n customObjects: {\n list: 'crmListCustomObjects',\n schema: 'crmCustomObjectSchema',\n },\n customRecords: {\n list: 'crmListCustomRecords',\n search: 'crmSearchCustomRecords',\n get: 'crmGetCustomRecord',\n create: 'crmCreateCustomRecord',\n update: 'crmUpdateCustomRecord',\n delete: 'crmDeleteCustomRecord',\n },\n hooks: {\n list: 'crmListHooks',\n events: 'crmListHookEvents',\n sample: 'crmHookSample',\n subscribe: 'crmSubscribeHook',\n unsubscribe: 'crmUnsubscribeHook',\n },\n} as const satisfies Record<string, Record<string, CrmOperationId>>;\n\nexport type CrmResourceMap = typeof crmResourceMap;\n\nexport type CrmResource<M extends Record<string, CrmOperationId>> = {\n [K in keyof M]: (...args: CrmCallArgs<M[K]>) => Promise<CrmResultOf<M[K]>>;\n};\n\ntype ListOperation = { [K in CrmOperationId]: CrmResultOf<K> extends { meta: CrmListMeta; data: unknown[] } ? K : never }[CrmOperationId];\ntype RowOf<K extends ListOperation> = CrmResultOf<K> extends { data: Array<infer R> } ? R : never;\n\nexport interface LetsBotCrmOptions extends Omit<LetsBotClientOptions, 'baseUrl' | 'apiKey'> {\n /** Workspace API key (`lbz_…`) with the `crm` scope. */\n apiKey: string;\n /** The workspace host: `mystore.letsbot.net`, `crm.example.com` (custom domain) or just `mystore`. */\n workspace?: string;\n /** Full base URL instead of `workspace`, e.g. `https://mystore.letsbot.net/api/v1/crm`. */\n baseUrl?: string;\n}\n\nconst UNSAFE = new Set(['POST', 'PATCH', 'PUT', 'DELETE']);\n\n/** `mystore` → `https://mystore.letsbot.net/api/v1/crm`; a pasted `https://host/panel/...` keeps only the host. */\nexport function crmBaseUrl(workspace: string): string {\n const raw = workspace.trim();\n\n if (raw === '') throw new TypeError('LetsBotCrm: `workspace` is empty');\n\n const host = (/^https?:\\/\\//i.test(raw) ? new URL(raw).host : raw.split('/')[0]!).toLowerCase();\n\n return `https://${host.includes('.') ? host : `${host}.letsbot.net`}/api/v1/crm`;\n}\n\nclass CrmTransport extends LetsBotClient {\n protected override authHeaders(apiKey: string): Record<string, string> {\n return { 'X-Zapier-Api-Key': apiKey };\n }\n\n request<T>(operationId: string, method: string, url: URL, json: unknown, options: RequestOptions): Promise<ApiResponse<T>> {\n const headers = this.baseHeaders(options);\n let body: string | undefined;\n\n if (json !== undefined) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(json);\n }\n\n // Reads are safe to repeat; a write is never repeated after it may have reached the server\n // (429 is still retried: the server refused it before doing anything).\n return this.perform<T>(operationId, method, url, headers, body, { unsafeRetryAllowed: !UNSAFE.has(method) }, options);\n }\n\n get root(): string {\n return this.baseUrl;\n }\n}\n\nexport class LetsBotCrm {\n readonly contacts: CrmResource<CrmResourceMap['contacts']>;\n readonly companies: CrmResource<CrmResourceMap['companies']>;\n readonly deals: CrmResource<CrmResourceMap['deals']>;\n readonly tasks: CrmResource<CrmResourceMap['tasks']>;\n readonly activities: CrmResource<CrmResourceMap['activities']>;\n readonly quotes: CrmResource<CrmResourceMap['quotes']>;\n readonly products: CrmResource<CrmResourceMap['products']>;\n /** Custom objects (`/objects`): 404 until the workspace has custom objects switched on. */\n readonly customObjects: CrmResource<CrmResourceMap['customObjects']>;\n /** Records of a custom object (`/objects/{key}/records`); pass the object `key`, e.g. `co_projects`. */\n readonly customRecords: CrmResource<CrmResourceMap['customRecords']>;\n readonly hooks: CrmResource<CrmResourceMap['hooks']>;\n\n private readonly transport: CrmTransport;\n\n constructor(options: LetsBotCrmOptions) {\n if (!options?.baseUrl && !options?.workspace) {\n throw new TypeError('LetsBotCrm: pass `workspace` (e.g. mystore.letsbot.net) or `baseUrl`');\n }\n\n this.transport = new CrmTransport(\n {\n ...options,\n baseUrl: options.baseUrl ?? crmBaseUrl(options.workspace!),\n rateLimit: options.rateLimit === false ? false : { requestsPerMinute: options.rateLimit?.requestsPerMinute ?? CRM_DEFAULT_RATE_LIMIT },\n },\n 'LetsBotCrm: `apiKey` (a workspace API key with the crm scope)',\n );\n\n const bind = <M extends Record<string, CrmOperationId>>(map: M): CrmResource<M> => {\n const bound: Record<string, unknown> = {};\n\n for (const [name, id] of Object.entries(map)) {\n bound[name] = (params?: Record<string, unknown>, options?: RequestOptions) => this.call(id as CrmOperationId, ...([params, options] as never as CrmCallArgs<CrmOperationId>));\n }\n\n return bound as CrmResource<M>;\n };\n\n this.contacts = bind(crmResourceMap.contacts);\n this.companies = bind(crmResourceMap.companies);\n this.deals = bind(crmResourceMap.deals);\n this.tasks = bind(crmResourceMap.tasks);\n this.activities = bind(crmResourceMap.activities);\n this.quotes = bind(crmResourceMap.quotes);\n this.products = bind(crmResourceMap.products);\n this.customObjects = bind(crmResourceMap.customObjects);\n this.customRecords = bind(crmResourceMap.customRecords);\n this.hooks = bind(crmResourceMap.hooks);\n }\n\n /** The resolved base URL, e.g. `https://mystore.letsbot.net/api/v1/crm`. */\n get baseUrl(): string {\n return this.transport.root;\n }\n\n /** Call any CRM operation by its operationId and get the body. */\n async call<K extends CrmOperationId>(operationId: K, ...args: CrmCallArgs<K>): Promise<CrmResultOf<K>> {\n return (await this.callWithResponse(operationId, ...args)).data;\n }\n\n /** Call any CRM operation and get the body plus status and headers. */\n async callWithResponse<K extends CrmOperationId>(operationId: K, ...args: CrmCallArgs<K>): Promise<ApiResponse<CrmResultOf<K>>> {\n const [params = {}, options = {}] = args as [Record<string, unknown> | undefined, RequestOptions | undefined];\n const meta = crmOperations[operationId];\n\n if (!meta) throw new TypeError(`Unknown LetsBot CRM operation: ${String(operationId)}`);\n\n const rest: Record<string, unknown> = { ...params };\n const path = meta.path.replace(/\\{(\\w+)\\}/g, (_, name: string) => {\n const value = rest[name];\n\n if (value === undefined || value === null || value === '') {\n throw new TypeError(`${operationId}: \\`${name}\\` is required`);\n }\n\n delete rest[name];\n\n return encodeURIComponent(String(value));\n });\n\n const url = new URL(this.transport.root + path);\n const append = (key: string, value: unknown) => {\n if (value === undefined || value === null) return;\n\n url.searchParams.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n };\n\n if (!meta.body) {\n for (const [key, value] of Object.entries(rest)) append(key, value);\n } else if ('query' in meta) {\n // Query flags of a write (e.g. `allow_duplicate`) go in the URL, not the JSON body; booleans\n // as 1 / 0, which every Laravel boolean rule accepts.\n for (const key of meta.query as readonly string[]) {\n if (key in rest) {\n const value = rest[key];\n append(key, typeof value === 'boolean' ? (value ? 1 : 0) : value);\n delete rest[key];\n }\n }\n }\n\n return this.transport.request<CrmResultOf<K>>(operationId, meta.method, url, meta.body ? rest : undefined, options);\n }\n\n /**\n * Every row of a list, page by page (`meta.last_page`).\n *\n * ```ts\n * for await (const deal of crm.iterate('crmListDeals', { status: 'won', sort: 'updated_at', dir: 'desc' })) { … }\n * ```\n */\n async *iterate<K extends ListOperation>(\n operationId: K,\n params: Omit<CrmParamsOf<K>, 'page'> = {} as Omit<CrmParamsOf<K>, 'page'>,\n options?: RequestOptions,\n ): AsyncGenerator<RowOf<K>, void, undefined> {\n for (let page = 1; ; page++) {\n const body = (await this.call(operationId, ...([{ per_page: 100, ...params, page }, options] as never as CrmCallArgs<K>))) as {\n data: RowOf<K>[];\n meta: CrmListMeta;\n };\n\n yield* body.data;\n\n if (body.data.length === 0 || page >= (body.meta?.last_page ?? page)) return;\n }\n }\n}\n\n/**\n * Checks a CRM webhook delivery: `X-LetsBot-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256>` over\n * `\"<t>.<raw body>\"` with the subscription's secret (shown once when the subscription is made).\n * Pass the exact bytes received, before JSON.parse. Rejects timestamps more than\n * `toleranceSeconds` (default 300) away from now, which stops replays.\n */\nexport function verifyCrmWebhookSignature(\n rawBody: string | Uint8Array,\n header: string | null | undefined,\n secret: string,\n options: { toleranceSeconds?: number; now?: number } = {},\n): boolean {\n if (typeof header !== 'string' || !secret) return false;\n\n const parts = new Map<string, string>();\n\n for (const piece of header.split(',')) {\n const index = piece.indexOf('=');\n\n if (index > 0) parts.set(piece.slice(0, index).trim(), piece.slice(index + 1).trim());\n }\n\n const t = parts.get('t') ?? '';\n const v1 = parts.get('v1') ?? '';\n\n if (!/^\\d+$/.test(t) || !/^[0-9a-f]{64}$/i.test(v1)) return false;\n\n const now = options.now ?? Math.floor(Date.now() / 1000);\n\n if (Math.abs(now - Number(t)) > (options.toleranceSeconds ?? 300)) return false;\n\n const expected = createHmac('sha256', secret).update(`${t}.`).update(rawBody).digest();\n const given = Buffer.from(v1, 'hex');\n\n return given.length === expected.length && timingSafeEqual(given, expected);\n}\n","// Generated from openapi/erp-v1.yaml by scripts/gen-operations.mjs. Do not edit by hand:\n// run `npm run generate` (or `npm run spec:sync` inside the LetsBot workspace).\n\nexport const erpOperations = {\n erpConfirmSalesOrder: { method: 'POST', path: '/sales/orders/{id}/confirm', body: false, idempotent: false },\n erpCreateCreditNote: { method: 'POST', path: '/sales/invoices/{id}/credit-notes', body: true, idempotent: true },\n erpCreateExpense: { method: 'POST', path: '/expenses', body: true, idempotent: true },\n erpCreateInvoice: { method: 'POST', path: '/sales/invoices', body: true, idempotent: true },\n erpCreatePurchaseOrder: { method: 'POST', path: '/purchasing/purchase-orders', body: true, idempotent: true },\n erpCreateSalesOrder: { method: 'POST', path: '/sales/orders', body: true, idempotent: true },\n erpCustomerStatement: { method: 'GET', path: '/sales/customers/{id}/statement', body: false, idempotent: false },\n erpGetBill: { method: 'GET', path: '/purchasing/bills/{id}', body: false, idempotent: false },\n erpGetCreditNote: { method: 'GET', path: '/sales/credit-notes/{id}', body: false, idempotent: false },\n erpGetCustomer: { method: 'GET', path: '/sales/customers/{id}', body: false, idempotent: false },\n erpGetExpense: { method: 'GET', path: '/expenses/{id}', body: false, idempotent: false },\n erpGetInvoice: { method: 'GET', path: '/sales/invoices/{id}', body: false, idempotent: false },\n erpGetItem: { method: 'GET', path: '/inventory/items/{id}', body: false, idempotent: false },\n erpGetJournalEntry: { method: 'GET', path: '/accounting/journal-entries/{id}', body: false, idempotent: false },\n erpGetPayment: { method: 'GET', path: '/sales/payments/{id}', body: false, idempotent: false },\n erpGetPurchaseOrder: { method: 'GET', path: '/purchasing/purchase-orders/{id}', body: false, idempotent: false },\n erpGetSalesOrder: { method: 'GET', path: '/sales/orders/{id}', body: false, idempotent: false },\n erpGetSupplier: { method: 'GET', path: '/purchasing/suppliers/{id}', body: false, idempotent: false },\n erpHookEvents: { method: 'GET', path: '/hooks/events', body: false, idempotent: false },\n erpHookSample: { method: 'GET', path: '/hooks/sample', body: false, idempotent: false },\n erpInvoicePdfLink: { method: 'GET', path: '/sales/invoices/{id}/pdf', body: false, idempotent: false },\n erpIssueCreditNote: { method: 'POST', path: '/sales/credit-notes/{id}/issue', body: false, idempotent: false },\n erpIssueInvoice: { method: 'POST', path: '/sales/invoices/{id}/issue', body: false, idempotent: false },\n erpListAccounts: { method: 'GET', path: '/accounting/accounts', body: false, idempotent: false },\n erpListBills: { method: 'GET', path: '/purchasing/bills', body: false, idempotent: false },\n erpListCreditNotes: { method: 'GET', path: '/sales/credit-notes', body: false, idempotent: false },\n erpListCustomers: { method: 'GET', path: '/sales/customers', body: false, idempotent: false },\n erpListExpenseCategories: { method: 'GET', path: '/expenses/categories', body: false, idempotent: false },\n erpListExpenses: { method: 'GET', path: '/expenses', body: false, idempotent: false },\n erpListHooks: { method: 'GET', path: '/hooks', body: false, idempotent: false },\n erpListInvoices: { method: 'GET', path: '/sales/invoices', body: false, idempotent: false },\n erpListItems: { method: 'GET', path: '/inventory/items', body: false, idempotent: false },\n erpListJournalEntries: { method: 'GET', path: '/accounting/journal-entries', body: false, idempotent: false },\n erpListPayments: { method: 'GET', path: '/sales/payments', body: false, idempotent: false },\n erpListPurchaseOrders: { method: 'GET', path: '/purchasing/purchase-orders', body: false, idempotent: false },\n erpListSalesOrders: { method: 'GET', path: '/sales/orders', body: false, idempotent: false },\n erpListStockLevels: { method: 'GET', path: '/inventory/stock-levels', body: false, idempotent: false },\n erpListStockMoves: { method: 'GET', path: '/inventory/stock-moves', body: false, idempotent: false },\n erpListSuppliers: { method: 'GET', path: '/purchasing/suppliers', body: false, idempotent: false },\n erpListVariants: { method: 'GET', path: '/inventory/variants', body: false, idempotent: false },\n erpListWarehouses: { method: 'GET', path: '/inventory/warehouses', body: false, idempotent: false },\n erpRecordPayment: { method: 'POST', path: '/sales/payments', body: true, idempotent: true },\n erpReportBalanceSheet: { method: 'GET', path: '/accounting/reports/balance-sheet', body: false, idempotent: false },\n erpReportProfitAndLoss: { method: 'GET', path: '/accounting/reports/profit-and-loss', body: false, idempotent: false },\n erpReportVat: { method: 'GET', path: '/accounting/reports/vat', body: false, idempotent: false },\n erpSubscribeHook: { method: 'POST', path: '/hooks', body: true, idempotent: false },\n erpUnsubscribeHook: { method: 'DELETE', path: '/hooks/{id}', body: false, idempotent: false },\n} as const;\n\nexport type ErpOperationId = keyof typeof erpOperations;\n","import { LetsBotClient, type ApiResponse, type LetsBotClientOptions, type RequestOptions } from './client.js';\nimport { verifyCrmWebhookSignature } from './crm.js';\nimport { erpOperations, type ErpOperationId } from './generated/erp-operations.js';\nimport type { components, operations as Ops } from './generated/erp-types.js';\n\n/**\n * Client for the LetsBot Business (ERP) API: `https://{workspace}/api/v1/erp`.\n *\n * ```ts\n * const erp = new LetsBotErp({ apiKey: process.env.LETSBOT_KEY!, workspace: 'mystore.letsbot.net' });\n * const { data: order } = await erp.salesOrders.create({ customer_id: 42, lines: [{ sku: 'RY-OUD-50', qty: 2 }] });\n * await erp.salesOrders.confirm({ id: order.id });\n * ```\n *\n * The key is a workspace API key (`lbz_…`, Panel → Zapier → API keys) with the **erp** scope\n * ticked — a \"full access\" key without it gets `403 missing_scope`. Each area (inventory, sales,\n * purchasing, expenses, accounting) answers 404 until the workspace switches it on. Writes create\n * drafts or take exactly the step you call (confirm, issue, record a payment); nothing messages a\n * customer. Every creating call carries an `Idempotency-Key` (generated unless you pass one), so a\n * retried create never makes a second document.\n */\n\ntype Schemas = components['schemas'];\n\nexport type ErpItem = Schemas['Item'];\nexport type ErpVariant = Schemas['Variant'];\nexport type ErpWarehouse = Schemas['Warehouse'];\nexport type ErpStockLevel = Schemas['StockLevel'];\nexport type ErpStockMove = Schemas['StockMove'];\nexport type ErpCustomer = Schemas['Customer'];\nexport type ErpStatement = Schemas['Statement'];\nexport type ErpSalesOrder = Schemas['SalesOrder'];\nexport type ErpInvoice = Schemas['Invoice'];\nexport type ErpInvoiceLinks = Schemas['InvoiceLinks'];\nexport type ErpPayment = Schemas['Payment'];\nexport type ErpSupplier = Schemas['Supplier'];\nexport type ErpPurchaseOrder = Schemas['PurchaseOrder'];\nexport type ErpBill = Schemas['Bill'];\nexport type ErpExpense = Schemas['Expense'];\nexport type ErpExpenseCategory = Schemas['ExpenseCategory'];\nexport type ErpAccount = Schemas['Account'];\nexport type ErpJournalEntry = Schemas['JournalEntry'];\nexport type ErpReport = Schemas['Report'];\nexport type ErpListMeta = Schemas['PageMeta'];\nexport type ErpWebhookSubscription = Schemas['Hook'];\nexport type ErpWebhookEventName = Schemas['HookEvent']['event'];\n/** The body of every ERP webhook delivery. `data` is the document as the API's GET returns it. */\nexport type ErpWebhookEvent = Schemas['WebhookDelivery'];\n\nexport const ERP_DEFAULT_RATE_LIMIT = 120;\nexport const ERP_WEBHOOK_EVENTS = [\n 'invoice.issued',\n 'invoice.paid',\n 'invoice.cleared',\n 'invoice.rejected',\n 'credit_note.issued',\n 'payment.received',\n 'order.confirmed',\n 'stock.low',\n 'po.confirmed_by_supplier',\n 'expense.posted',\n] as const satisfies readonly ErpWebhookEventName[];\n\ntype Op<K extends ErpOperationId> = Ops[K];\ntype Defined<T> = Exclude<T, undefined>;\ntype PathOf<K extends ErpOperationId> = Op<K> extends { parameters: { path?: infer P } } ? Defined<P> : never;\ntype QueryOf<K extends ErpOperationId> = Op<K> extends { parameters: { query?: infer Q } } ? Defined<Q> : never;\ntype BodyOf<K extends ErpOperationId> = Op<K> extends { requestBody?: { content: { 'application/json': infer B } } } ? B : never;\ntype Part<T> = [T] extends [never] ? {} : T;\n\n/** One flat object: path parameters (`id`) plus the query (reads) or the JSON body (writes). */\nexport type ErpParamsOf<K extends ErpOperationId> = Part<PathOf<K>> & Part<QueryOf<K>> & Part<BodyOf<K>>;\n\n/** The documented success body (`{success: true, data, meta?}`) of an ERP operation. */\nexport type ErpResultOf<K extends ErpOperationId> = Op<K> extends { responses: { 200: { content: { 'application/json': infer R } } } }\n ? R\n : Op<K> extends { responses: { 201: { content: { 'application/json': infer R } } } }\n ? R\n : unknown;\n\ntype HasRequired<P> = {} extends P ? false : true;\n\nexport type ErpCallArgs<K extends ErpOperationId> =\n HasRequired<ErpParamsOf<K>> extends true\n ? [params: ErpParamsOf<K>, options?: RequestOptions]\n : [params?: ErpParamsOf<K>, options?: RequestOptions];\n\n/** Method name → operationId, grouped by resource. */\nexport const erpResourceMap = {\n items: { list: 'erpListItems', get: 'erpGetItem' },\n variants: { list: 'erpListVariants' },\n warehouses: { list: 'erpListWarehouses' },\n stock: { levels: 'erpListStockLevels', moves: 'erpListStockMoves' },\n customers: { list: 'erpListCustomers', get: 'erpGetCustomer', statement: 'erpCustomerStatement' },\n salesOrders: { list: 'erpListSalesOrders', get: 'erpGetSalesOrder', create: 'erpCreateSalesOrder', confirm: 'erpConfirmSalesOrder' },\n invoices: {\n list: 'erpListInvoices',\n get: 'erpGetInvoice',\n create: 'erpCreateInvoice',\n issue: 'erpIssueInvoice',\n pdfLink: 'erpInvoicePdfLink',\n createCreditNote: 'erpCreateCreditNote',\n },\n creditNotes: { list: 'erpListCreditNotes', get: 'erpGetCreditNote', issue: 'erpIssueCreditNote' },\n payments: { list: 'erpListPayments', get: 'erpGetPayment', record: 'erpRecordPayment' },\n suppliers: { list: 'erpListSuppliers', get: 'erpGetSupplier' },\n purchaseOrders: { list: 'erpListPurchaseOrders', get: 'erpGetPurchaseOrder', create: 'erpCreatePurchaseOrder' },\n bills: { list: 'erpListBills', get: 'erpGetBill' },\n expenses: { list: 'erpListExpenses', get: 'erpGetExpense', create: 'erpCreateExpense', categories: 'erpListExpenseCategories' },\n accounting: {\n accounts: 'erpListAccounts',\n journalEntries: 'erpListJournalEntries',\n journalEntry: 'erpGetJournalEntry',\n profitAndLoss: 'erpReportProfitAndLoss',\n balanceSheet: 'erpReportBalanceSheet',\n vat: 'erpReportVat',\n },\n hooks: {\n list: 'erpListHooks',\n events: 'erpHookEvents',\n sample: 'erpHookSample',\n subscribe: 'erpSubscribeHook',\n unsubscribe: 'erpUnsubscribeHook',\n },\n} as const satisfies Record<string, Record<string, ErpOperationId>>;\n\nexport type ErpResourceMap = typeof erpResourceMap;\n\nexport type ErpResource<M extends Record<string, ErpOperationId>> = {\n [K in keyof M]: (...args: ErpCallArgs<M[K]>) => Promise<ErpResultOf<M[K]>>;\n};\n\ntype ListOperation = { [K in ErpOperationId]: ErpResultOf<K> extends { meta?: ErpListMeta; data?: unknown[] } ? K : never }[ErpOperationId];\ntype RowOf<K extends ListOperation> = ErpResultOf<K> extends { data?: Array<infer R> } ? R : never;\n\nexport interface LetsBotErpOptions extends Omit<LetsBotClientOptions, 'baseUrl' | 'apiKey'> {\n /** Workspace API key (`lbz_…`) with the `erp` scope. */\n apiKey: string;\n /** The workspace host: `mystore.letsbot.net`, a custom domain, or just `mystore`. */\n workspace?: string;\n /** Full base URL instead of `workspace`, e.g. `https://mystore.letsbot.net/api/v1/erp`. */\n baseUrl?: string;\n}\n\nconst UNSAFE = new Set(['POST', 'PATCH', 'PUT', 'DELETE']);\n\n/** `mystore` → `https://mystore.letsbot.net/api/v1/erp`; a pasted `https://host/panel/...` keeps only the host. */\nexport function erpBaseUrl(workspace: string): string {\n const raw = workspace.trim();\n\n if (raw === '') throw new TypeError('LetsBotErp: `workspace` is empty');\n\n const host = (/^https?:\\/\\//i.test(raw) ? new URL(raw).host : raw.split('/')[0]!).toLowerCase();\n\n return `https://${host.includes('.') ? host : `${host}.letsbot.net`}/api/v1/erp`;\n}\n\nclass ErpTransport extends LetsBotClient {\n protected override authHeaders(apiKey: string): Record<string, string> {\n return { 'X-Zapier-Api-Key': apiKey };\n }\n\n request<T>(operationId: string, method: string, url: URL, json: unknown, idempotent: boolean, options: RequestOptions): Promise<ApiResponse<T>> {\n const headers = this.baseHeaders(options);\n let body: string | undefined;\n\n if (json !== undefined) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(json);\n }\n\n let idempotencyKey: string | undefined;\n\n if (idempotent && options.idempotencyKey !== false) {\n idempotencyKey = options.idempotencyKey ?? this.newKey();\n headers['Idempotency-Key'] = idempotencyKey;\n }\n\n // Reads are safe to repeat; a create is safe to repeat under its Idempotency-Key; any\n // other write (confirm, issue, unsubscribe) is never repeated after it may have reached\n // the server (429 is still retried: the server refused it before doing anything).\n const unsafeRetryAllowed = !UNSAFE.has(method) || idempotencyKey !== undefined;\n\n return this.perform<T>(operationId, method, url, headers, body, { idempotencyKey, unsafeRetryAllowed }, options);\n }\n\n get root(): string {\n return this.baseUrl;\n }\n}\n\nexport class LetsBotErp {\n readonly items: ErpResource<ErpResourceMap['items']>;\n readonly variants: ErpResource<ErpResourceMap['variants']>;\n readonly warehouses: ErpResource<ErpResourceMap['warehouses']>;\n readonly stock: ErpResource<ErpResourceMap['stock']>;\n readonly customers: ErpResource<ErpResourceMap['customers']>;\n readonly salesOrders: ErpResource<ErpResourceMap['salesOrders']>;\n readonly invoices: ErpResource<ErpResourceMap['invoices']>;\n readonly creditNotes: ErpResource<ErpResourceMap['creditNotes']>;\n readonly payments: ErpResource<ErpResourceMap['payments']>;\n readonly suppliers: ErpResource<ErpResourceMap['suppliers']>;\n readonly purchaseOrders: ErpResource<ErpResourceMap['purchaseOrders']>;\n readonly bills: ErpResource<ErpResourceMap['bills']>;\n readonly expenses: ErpResource<ErpResourceMap['expenses']>;\n readonly accounting: ErpResource<ErpResourceMap['accounting']>;\n readonly hooks: ErpResource<ErpResourceMap['hooks']>;\n\n private readonly transport: ErpTransport;\n\n constructor(options: LetsBotErpOptions) {\n if (!options?.baseUrl && !options?.workspace) {\n throw new TypeError('LetsBotErp: pass `workspace` (e.g. mystore.letsbot.net) or `baseUrl`');\n }\n\n this.transport = new ErpTransport(\n {\n ...options,\n baseUrl: options.baseUrl ?? erpBaseUrl(options.workspace!),\n rateLimit: options.rateLimit === false ? false : { requestsPerMinute: options.rateLimit?.requestsPerMinute ?? ERP_DEFAULT_RATE_LIMIT },\n },\n 'LetsBotErp: `apiKey` (a workspace API key with the erp scope)',\n );\n\n const bind = <M extends Record<string, ErpOperationId>>(map: M): ErpResource<M> => {\n const bound: Record<string, unknown> = {};\n\n for (const [name, id] of Object.entries(map)) {\n bound[name] = (params?: Record<string, unknown>, options?: RequestOptions) => this.call(id as ErpOperationId, ...([params, options] as never as ErpCallArgs<ErpOperationId>));\n }\n\n return bound as ErpResource<M>;\n };\n\n this.items = bind(erpResourceMap.items);\n this.variants = bind(erpResourceMap.variants);\n this.warehouses = bind(erpResourceMap.warehouses);\n this.stock = bind(erpResourceMap.stock);\n this.customers = bind(erpResourceMap.customers);\n this.salesOrders = bind(erpResourceMap.salesOrders);\n this.invoices = bind(erpResourceMap.invoices);\n this.creditNotes = bind(erpResourceMap.creditNotes);\n this.payments = bind(erpResourceMap.payments);\n this.suppliers = bind(erpResourceMap.suppliers);\n this.purchaseOrders = bind(erpResourceMap.purchaseOrders);\n this.bills = bind(erpResourceMap.bills);\n this.expenses = bind(erpResourceMap.expenses);\n this.accounting = bind(erpResourceMap.accounting);\n this.hooks = bind(erpResourceMap.hooks);\n }\n\n /** The resolved base URL, e.g. `https://mystore.letsbot.net/api/v1/erp`. */\n get baseUrl(): string {\n return this.transport.root;\n }\n\n /** Call any ERP operation by its operationId and get the body. */\n async call<K extends ErpOperationId>(operationId: K, ...args: ErpCallArgs<K>): Promise<ErpResultOf<K>> {\n return (await this.callWithResponse(operationId, ...args)).data;\n }\n\n /** Call any ERP operation and get the body plus status, headers, Idempotency-Key and replay flag. */\n async callWithResponse<K extends ErpOperationId>(operationId: K, ...args: ErpCallArgs<K>): Promise<ApiResponse<ErpResultOf<K>>> {\n const [params = {}, options = {}] = args as [Record<string, unknown> | undefined, RequestOptions | undefined];\n const meta = erpOperations[operationId];\n\n if (!meta) throw new TypeError(`Unknown LetsBot ERP operation: ${String(operationId)}`);\n\n const rest: Record<string, unknown> = { ...params };\n const path = meta.path.replace(/\\{(\\w+)\\}/g, (_, name: string) => {\n const value = rest[name];\n\n if (value === undefined || value === null || value === '') {\n throw new TypeError(`${operationId}: \\`${name}\\` is required`);\n }\n\n delete rest[name];\n\n return encodeURIComponent(String(value));\n });\n\n const url = new URL(this.transport.root + path);\n\n if (!meta.body) {\n for (const [key, value] of Object.entries(rest)) {\n if (value === undefined || value === null) continue;\n\n url.searchParams.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n }\n }\n\n return this.transport.request<ErpResultOf<K>>(operationId, meta.method, url, meta.body ? rest : undefined, meta.idempotent, options);\n }\n\n /**\n * Every row of a list, page by page (`meta.last_page`).\n *\n * ```ts\n * for await (const invoice of erp.iterate('erpListInvoices', { status: 'issued,partially_paid', overdue: true })) { … }\n * ```\n */\n async *iterate<K extends ListOperation>(\n operationId: K,\n params: Omit<ErpParamsOf<K>, 'page'> = {} as Omit<ErpParamsOf<K>, 'page'>,\n options?: RequestOptions,\n ): AsyncGenerator<RowOf<K>, void, undefined> {\n for (let page = 1; ; page++) {\n const body = (await this.call(operationId, ...([{ per_page: 100, ...params, page }, options] as never as ErpCallArgs<K>))) as {\n data: RowOf<K>[];\n meta?: ErpListMeta;\n };\n\n yield* body.data;\n\n if (body.data.length === 0 || page >= (body.meta?.last_page ?? page)) return;\n }\n }\n}\n\n/**\n * Checks an ERP webhook delivery — the same scheme as CRM webhooks:\n * `X-LetsBot-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256>` over `\"<t>.<raw body>\"` with the\n * subscription's secret. Pass the exact bytes received, before JSON.parse.\n */\nexport function verifyErpWebhookSignature(\n rawBody: string | Uint8Array,\n header: string | null | undefined,\n secret: string,\n options: { toleranceSeconds?: number; now?: number } = {},\n): boolean {\n return verifyCrmWebhookSignature(rawBody, header, secret, options);\n}\n","import { createHmac } from 'node:crypto';\n\n/** Longest `sub` LetsBot accepts (characters). */\nexport const IDENTITY_MAX_SUB_LENGTH = 191;\n/** Longest lifetime LetsBot accepts for an identity token: 7 days, in seconds. */\nexport const IDENTITY_MAX_TTL_SECONDS = 7 * 24 * 60 * 60;\n/** Recommended lifetime: 24 hours. */\nexport const IDENTITY_DEFAULT_TTL = '24h';\n\n/** `30`, `'30s'`, `'15m'`, `'24h'`, `'7d'` — a number is seconds. */\nexport type IdentityTokenTtl = number | `${number}` | `${number}${'s' | 'm' | 'h' | 'd'}`;\n\nexport interface CreateIdentityTokenOptions {\n /** Your stable, never-reused id for the signed-in user. Becomes the `sub` claim (≤ 191 characters). */\n userId: string | number;\n /** The app's Identity Secret (panel → In-App Chat → your app). Server-side only — never ship it in an app. */\n secret: string;\n /** Token lifetime, at most 7 days. Default `'24h'`. */\n expiresIn?: IdentityTokenTtl;\n /** Optional display name. Claims win over the fields the app sends in `identify`. */\n name?: string;\n /** Optional e-mail. */\n email?: string;\n /** Optional phone, international format (e.g. `+966501234567`). */\n phone?: string;\n /** Clock override for tests: a `Date` or Unix time in seconds. Defaults to the current time. */\n now?: Date | number;\n}\n\n/** The claims inside a LetsBot identity token. */\nexport interface IdentityTokenClaims {\n sub: string;\n iat: number;\n exp: number;\n name?: string;\n email?: string;\n phone?: string;\n}\n\nconst UNIT_SECONDS: Record<string, number> = { s: 1, m: 60, h: 3600, d: 86400 };\n\nfunction ttlSeconds(value: IdentityTokenTtl): number {\n let seconds: number;\n if (typeof value === 'number') {\n seconds = value;\n } else if (typeof value === 'string') {\n const match = /^\\s*(\\d+)\\s*([smhd]?)\\s*$/.exec(value);\n if (!match) throw new TypeError(`expiresIn must be seconds or a string like \"24h\", got \"${value}\"`);\n seconds = Number(match[1]) * UNIT_SECONDS[match[2] || 's']!;\n } else {\n throw new TypeError('expiresIn must be a number of seconds or a string like \"24h\"');\n }\n if (!Number.isInteger(seconds) || seconds <= 0) {\n throw new RangeError('expiresIn must be a positive whole number of seconds');\n }\n if (seconds > IDENTITY_MAX_TTL_SECONDS) {\n throw new RangeError(`expiresIn must be at most 7 days (${IDENTITY_MAX_TTL_SECONDS} seconds)`);\n }\n return seconds;\n}\n\nfunction unixNow(now: Date | number | undefined): number {\n if (now === undefined) return Math.floor(Date.now() / 1000);\n const value = now instanceof Date ? Math.floor(now.getTime() / 1000) : Math.floor(now);\n if (!Number.isFinite(value) || value < 0) throw new TypeError('now must be a valid Date or Unix time in seconds');\n return value;\n}\n\nfunction base64url(input: string | Buffer): string {\n return Buffer.from(input).toString('base64url');\n}\n\nfunction optionalClaim(name: string, value: unknown): string | undefined {\n if (value === undefined || value === null || value === '') return undefined;\n if (typeof value !== 'string') throw new TypeError(`${name} must be a string`);\n return value;\n}\n\n/**\n * Mints the identity token your **backend** hands to a signed-in user's app, which passes it to\n * `LetsBotChat.identify(...)` (In-App Chat). JWT, HS256, signed with the app's Identity Secret;\n * claims `sub`, `iat`, `exp` (+ optional `name`, `email`, `phone`).\n *\n * ```ts\n * import { createIdentityToken } from '@letsbot/sdk';\n * const token = createIdentityToken({ userId: user.id, secret: process.env.LETSBOT_IDENTITY_SECRET! });\n * ```\n *\n * Throws `TypeError` / `RangeError` on invalid input. Never log the returned token or the secret.\n */\nexport function createIdentityToken(options: CreateIdentityTokenOptions): string {\n if (options === null || typeof options !== 'object') throw new TypeError('options are required');\n const { userId, secret, expiresIn = IDENTITY_DEFAULT_TTL, now } = options;\n\n if (typeof secret !== 'string' || secret.length === 0) {\n throw new TypeError('secret must be a non-empty string (the app\\'s Identity Secret)');\n }\n if (typeof userId === 'number' && !Number.isFinite(userId)) throw new TypeError('userId must be a finite number or a string');\n if (typeof userId !== 'string' && typeof userId !== 'number') throw new TypeError('userId must be a string or a number');\n const sub = String(userId).trim();\n if (sub.length === 0) throw new TypeError('userId must not be empty');\n if ([...sub].length > IDENTITY_MAX_SUB_LENGTH) {\n throw new RangeError(`userId must be at most ${IDENTITY_MAX_SUB_LENGTH} characters`);\n }\n\n const iat = unixNow(now);\n const claims: IdentityTokenClaims = { sub, iat, exp: iat + ttlSeconds(expiresIn) };\n const name = optionalClaim('name', options.name);\n const email = optionalClaim('email', options.email);\n const phone = optionalClaim('phone', options.phone);\n if (name !== undefined) claims.name = name;\n if (email !== undefined) claims.email = email;\n if (phone !== undefined) claims.phone = phone;\n\n const signingInput = `${base64url(JSON.stringify({ alg: 'HS256', typ: 'JWT' }))}.${base64url(JSON.stringify(claims))}`;\n const signature = createHmac('sha256', secret).update(signingInput).digest('base64url');\n return `${signingInput}.${signature}`;\n}\n","import { LetsBotClient, type LetsBotClientOptions, type ParamsOf, type RequestOptions } from './client.js';\nimport { bindResource, iterateArchive, resourceMap, type ArchiveMessage, type Resource, type ResourceMap } from './resources.js';\n\n/**\n * LetsBot API client.\n *\n * ```ts\n * const letsbot = new LetsBot({ apiKey: process.env.LETSBOT_API_KEY! });\n * await letsbot.messages.send({ phone: '966501234567', body: 'Hello' });\n * ```\n */\nexport class LetsBot extends LetsBotClient {\n readonly messages: Resource<ResourceMap['messages']>;\n readonly media: Resource<ResourceMap['media']>;\n readonly interactive: Resource<ResourceMap['interactive']>;\n readonly templates: Resource<ResourceMap['templates']>;\n readonly chats: Resource<ResourceMap['chats']>;\n readonly contacts: Resource<ResourceMap['contacts']>;\n readonly groups: Resource<ResourceMap['groups']>;\n readonly invites: Resource<ResourceMap['invites']>;\n readonly user: Resource<ResourceMap['user']>;\n readonly instance: Resource<ResourceMap['instance']>;\n readonly products: Resource<ResourceMap['products']>;\n /** Store orders: record one (order journey + invoice) or stop its journey. */\n readonly orders: Resource<ResourceMap['orders']>;\n readonly session: Resource<ResourceMap['session']>;\n readonly archive: Resource<ResourceMap['archive']> & {\n /** Every message in the range, following `next_cursor`. */\n iterate(params: Omit<ParamsOf<'index'>, 'cursor'>, options?: RequestOptions): AsyncGenerator<ArchiveMessage, void, undefined>;\n };\n\n constructor(options: LetsBotClientOptions) {\n super(options);\n this.messages = bindResource(this, resourceMap.messages);\n this.media = bindResource(this, resourceMap.media);\n this.interactive = bindResource(this, resourceMap.interactive);\n this.templates = bindResource(this, resourceMap.templates);\n this.chats = bindResource(this, resourceMap.chats);\n this.contacts = bindResource(this, resourceMap.contacts);\n this.groups = bindResource(this, resourceMap.groups);\n this.invites = bindResource(this, resourceMap.invites);\n this.user = bindResource(this, resourceMap.user);\n this.instance = bindResource(this, resourceMap.instance);\n this.products = bindResource(this, resourceMap.products);\n this.orders = bindResource(this, resourceMap.orders);\n this.session = bindResource(this, resourceMap.session);\n this.archive = {\n ...bindResource(this, resourceMap.archive),\n iterate: (params, options) => iterateArchive(this, params, options),\n };\n }\n}\n\nexport { LetsBotClient, DEFAULT_BASE_URL, SDK_VERSION } from './client.js';\nexport type { ApiResponse, CallArgs, LetsBotClientOptions, ParamsOf, RequestOptions, ResultOf } from './client.js';\nexport { LetsBotApiError, LetsBotConnectionError, isLogicalFailure } from './errors.js';\nexport { operations, type OperationId } from './generated/operations.js';\nexport type { components, operations as OperationTypes, paths } from './generated/types.js';\nexport { TokenBucket } from './rate-limit.js';\nexport { resourceMap, type ArchiveMessage, type Resource, type ResourceMap } from './resources.js';\nexport type { RetryOptions } from './retry.js';\nexport {\n experimental_verifyWebhookSignature,\n LEGACY_WEBHOOK_SECRET,\n type WebhookEnvelope,\n type WebhookEventType,\n} from './webhooks.js';\nexport {\n CRM_DEFAULT_RATE_LIMIT,\n CRM_SIGNATURE_HEADER,\n CRM_WEBHOOK_EVENTS,\n crmBaseUrl,\n crmPossibleDuplicate,\n crmResourceMap,\n LetsBotCrm,\n verifyCrmWebhookSignature,\n type CrmActivity,\n type CrmCallArgs,\n type CrmCompany,\n type CrmCompanyDetail,\n type CrmContact,\n type CrmCustomObject,\n type CrmCustomRecord,\n type CrmCustomRecordInput,\n type CrmDeal,\n type CrmListMeta,\n type CrmListSchema,\n type CrmParamsOf,\n type CrmPipeline,\n type CrmPossibleDuplicate,\n type CrmProduct,\n type CrmQuote,\n type CrmResource,\n type CrmResourceMap,\n type CrmResultOf,\n type CrmTask,\n type CrmWebhookEvent,\n type CrmWebhookEventName,\n type CrmWebhookSubscription,\n type LetsBotCrmOptions,\n} from './crm.js';\nexport { crmOperations, type CrmOperationId } from './generated/crm-operations.js';\nexport {\n ERP_DEFAULT_RATE_LIMIT,\n ERP_WEBHOOK_EVENTS,\n erpBaseUrl,\n erpResourceMap,\n LetsBotErp,\n verifyErpWebhookSignature,\n type ErpAccount,\n type ErpBill,\n type ErpCallArgs,\n type ErpCustomer,\n type ErpExpense,\n type ErpExpenseCategory,\n type ErpInvoice,\n type ErpInvoiceLinks,\n type ErpItem,\n type ErpJournalEntry,\n type ErpListMeta,\n type ErpParamsOf,\n type ErpPayment,\n type ErpPurchaseOrder,\n type ErpReport,\n type ErpResource,\n type ErpResourceMap,\n type ErpResultOf,\n type ErpSalesOrder,\n type ErpStatement,\n type ErpStockLevel,\n type ErpStockMove,\n type ErpSupplier,\n type ErpVariant,\n type ErpWarehouse,\n type ErpWebhookEvent,\n type ErpWebhookEventName,\n type ErpWebhookSubscription,\n type LetsBotErpOptions,\n} from './erp.js';\nexport { erpOperations, type ErpOperationId } from './generated/erp-operations.js';\nexport {\n createIdentityToken,\n IDENTITY_DEFAULT_TTL,\n IDENTITY_MAX_SUB_LENGTH,\n IDENTITY_MAX_TTL_SECONDS,\n type CreateIdentityTokenOptions,\n type IdentityTokenClaims,\n type IdentityTokenTtl,\n} from './identity.js';\n"]}