@taruvi/refine-providers 1.3.4-beta.2 → 1.3.4-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -5
- package/dist/index.cjs +40 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +97 -30
- package/dist/index.d.ts +97 -30
- package/dist/index.js +38 -27
- package/dist/index.js.map +1 -1
- package/package.json +2 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/utils.ts","../src/dataProvider.ts","../src/storageDataProvider.ts","../src/appDataProvider.ts","../src/userDataProvider.ts","../src/functionsDataProvider.ts","../src/analyticsDataProvider.ts","../src/authProvider.ts","../src/accessControlProvider.ts"],"names":["out","response","Functions","Analytics","Auth"],"mappings":";;;;;;AAAA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,cAmEb,CAAA;;;ACxDO,IAAM,mBAAA,GAA8C;AAAA;AAAA,EAEzD,EAAA,EAAI,EAAA;AAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA;AAAA,EAGJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA;AAAA,EAGL,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,YAAA,EAAc,cAAA;AAAA,EACd,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA;AAAA,EAEZ,SAAA,EAAW,UAAA;AAAA,EACX,UAAA,EAAY,WAAA;AAAA,EACZ,WAAA,EAAa,YAAA;AAAA,EACb,YAAA,EAAc,aAAA;AAAA,EACd,SAAA,EAAW,UAAA;AAAA,EACX,UAAA,EAAY,WAAA;AAAA;AAAA,EAGZ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA;AAAA,EAGN,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA;AAAA,EAGP,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA;AAAA,EAGV,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe,eAAA;AAAA,EACf,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA;AAAA,EAGX,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc,cAAA;AAAA,EACd,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,YAAA,EAAc,cAAA;AAAA;AAAA,EAGd,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ;AACV;AAGA,IAAM,qBAAA,uBAA4B,GAAA,CAAY;AAAA,EAC5C,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAUD,SAAS,gBAAgB,MAAA,EAA6B;AACpD,EAAA,OACE,OAAO,MAAA,KAAW,QAAA,IAClB,WAAW,IAAA,IACX,UAAA,IAAc,WACb,MAAA,CAAO,QAAA,KAAa,KAAA,IAAS,MAAA,CAAO,aAAa,IAAA,CAAA,IAClD,OAAA,IAAW,UACX,KAAA,CAAM,OAAA,CAAS,OAA8B,KAAK,CAAA;AAEtD;AAEA,SAAS,cAAc,MAAA,EAA6B;AAClD,EAAA,OACE,OAAO,MAAA,KAAW,QAAA,IAClB,MAAA,KAAW,QACX,OAAA,IAAW,MAAA,IACX,UAAA,IAAc,MAAA,IACd,OAAQ,MAAA,CAA8B,KAAA,KAAU,QAAA,IAChD,OAAQ,OAAiC,QAAA,KAAa,QAAA;AAE1D;AAqBO,SAAS,iBAAiB,OAAA,EAA+C;AAC9E,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,GAAG,OAAO,KAAA;AACpC,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,KAAM;AAC1B,IAAA,IAAI,CAAC,aAAA,CAAc,CAAC,CAAA,EAAG,OAAO,KAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,IACE,IAAA,CAAK,UAAU,MAAA,IACd,IAAA,CAAK,UAAU,IAAA,IAAQ,IAAA,CAAK,aAAa,MAAA,EAC1C;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA,KAAM,MAAA,EAAW;AACpD,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;AAGO,SAAS,oBACd,OAAA,EAC8B;AAC9B,EAAA,OACE,OAAO,OAAA,KAAY,QAAA,IACnB,OAAA,KAAY,IAAA,IACZ,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IACtB,eAAA,CAAgB,OAAqB,CAAA;AAEzC;AAMO,SAAS,2BACd,OAAA,EAC+B;AAC/B,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,MAAA;AACtD,EAAA,IAAI,mBAAA,CAAoB,OAAO,CAAA,EAAG,OAAO,OAAA;AACzC,EAAA,IAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG,OAAO,OAAA;AACtC,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,OAAO,KAAK,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,MAAA;AAE5D,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,gBAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG;AACvD,IAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,EAClB;AAEA,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA,EAAG;AAChC,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,kBAAkB,OAAA,EAAiD;AACjF,EAAA,IAAI,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,EAAC;AAE9B,EAAA,MAAM,SAA2B,EAAC;AAElC,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAiC;AAC7C,IAAA,KAAA,MAAW,UAAU,KAAA,EAAO;AAC1B,MAAA,IAAI,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC3B,QAAA,IAAI,MAAA,CAAO,QAAA,KAAa,IAAA,EAAM,OAAO,KAAA;AACrC,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAqB,GAAG,OAAO,KAAA;AAChD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,aAAA,CAAc,MAAM,CAAA,EAAG,OAAO,KAAA;AAEnC,MAAA,MAAM,IAAA,GAAO,MAAA;AACb,MAAA,IACE,IAAA,CAAK,UAAU,MAAA,IACd,IAAA,CAAK,UAAU,IAAA,IAAQ,IAAA,CAAK,aAAa,MAAA,EAC1C;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA,KAAM,MAAA,EAAW;AACpD,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AACxD,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AAC3B,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,2BAA2B,QAAA,EAA0B;AACnE,EAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAC3C,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,QAAA;AACjC,EAAA,OAAO,MAAA,KAAW,KAAK,IAAA,GAAO,MAAA;AAChC;AAGO,SAAS,qBAAA,CAAsB,UAAkB,KAAA,EAAwB;AAC9E,EAAA,IAAI,qBAAA,CAAsB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACvC,IAAA,OAAO,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAI,MAAM,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,EAC9D;AACA,EAAA,IAAI,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,OAAA,EAAS;AAC/C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAAS,cAAA,CACP,KAAA,EACA,QAAA,EACA,KAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,KAAA,KAAU,MAAA,IAAc,KAAA,KAAU,IAAA,IAAQ,aAAa,MAAA,EAAS;AAClE,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAC3C,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAE,CAAA;AACnD,IAAA;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,SAAS,CAAA,EAAG,KAAK,KAAK,MAAM,CAAA,CAAA,GAAK,OAAO,KAAK,CAAA;AAC9D,EAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,qBAAA,CAAsB,QAAA,EAAU,KAAK,CAAA;AAC1D;AAGO,SAAS,uBAAA,CACd,MAAA,EACA,IAAA,EACA,GAAA,EACM;AACN,EAAA,IAAI,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC3B,IAAA,MAAM,KAAK,MAAA,CAAO,QAAA;AAClB,IAAA,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,UAAA,CAAY,CAAA,GAAI,EAAA;AAC3B,IAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AACxB,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAA,KAAM;AAC7B,MAAA,uBAAA,CAAwB,OAAO,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,CAAC,KAAK,GAAG,CAAA;AAAA,IAC5D,CAAC,CAAA;AACD,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,aAAA,CAAc,MAAM,CAAA,EAAG;AAC1B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,MAAA;AACb,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM,GAAI,IAAA;AACnC,EAAA,IAAI,KAAA,KAAU,MAAA,IAAc,KAAA,KAAU,IAAA,IAAQ,aAAa,MAAA,EAAS;AAClE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAC3C,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAE,CAAA;AACnD,IAAA;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS,CAAA,GAAI,KAAA;AACxB,EAAA,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,UAAA,CAAY,CAAA,GAAI,2BAA2B,QAAQ,CAAA;AAC9D,EAAA,GAAA,CAAI,GAAG,IAAI,CAAA,OAAA,CAAS,CAAA,GAAI,qBAAA,CAAsB,UAAU,KAAK,CAAA;AAC/D;AAEA,SAAS,qBAAqB,CAAA,EAAqD;AACjF,EAAA,OAAO,EAAE,OAAA,IAAW,CAAA,CAAA,KAAO,EAAE,QAAA,KAAa,KAAA,IAAS,EAAE,QAAA,KAAa,IAAA,CAAA;AACpE;AAEA,SAAS,aAAA,CAAc,UAAkB,KAAA,EAAyB;AAChE,EAAA,IAAI,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,OAAA,EAAS,OAAO,IAAA;AACxD,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,8BAA8B,MAAA,EAA8C;AACnF,EAAA,IAAI,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC3B,IAAA,MAAM,QAAA,GAAY,MAAA,CAAO,KAAA,CACtB,GAAA,CAAI,6BAA6B,EACjC,MAAA,CAAO,CAAC,CAAA,KAA8B,CAAA,KAAM,IAAI,CAAA;AACnD,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAClC,IAAA,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAA0B,OAAO,QAAA,EAAS;AAAA,EACtE;AAEA,EAAA,IAAI,aAAA,CAAc,MAAM,CAAA,EAAG;AACzB,IAAA,MAAM,IAAA,GAAO,MAAA;AACb,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,IAAc,IAAA,CAAK,UAAU,IAAA,IAAQ,IAAA,CAAK,aAAa,MAAA,EAAS;AACjF,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA,KAAM,MAAA,EAAW;AACpD,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AACxD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,SAAA,GAAY,0BAAA,CAA2B,IAAA,CAAK,QAAQ,CAAA;AAC1D,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU,SAAA;AAAA,MACV,KAAA,EAAO,aAAA,CAAc,IAAA,CAAK,QAAA,EAAU,KAAK,KAAK;AAAA,KAChD;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AASO,SAAS,kCACd,OAAA,EAC8B;AAC9B,EAAA,IAAI,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,IAAA;AAE7B,EAAA,MAAM,KAAA,GAAQ,QACX,GAAA,CAAI,6BAA6B,EACjC,MAAA,CAAO,CAAC,CAAA,KAA8B,CAAA,KAAM,IAAI,CAAA;AACnD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,qBAAqB,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG;AACxD,IAAA,OAAO,CAAC,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAClB;AAEA,EAAA,OAAO,CAAC,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AAC3C;AAKO,SAAS,kCACd,MAAA,EAC8B;AAC9B,EAAA,MAAM,IAAA,GAAO,8BAA8B,MAAoB,CAAA;AAC/D,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,oBAAA,CAAqB,IAAI,GAAG,OAAO,IAAA;AACjD,EAAA,OAAO,CAAC,IAAI,CAAA;AACd;AAGO,SAAS,6BACd,MAAA,EACwB;AACxB,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,cAAA,CAAe,KAAK,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,8BACP,OAAA,EACwB;AACxB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,SAAU,EAAC;AAE9C,EAAA,MAAM,SAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC3B,MAAA,IAAI,OAAO,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC/C,QAAA,MAAM,MAAA,GAAS,6BAAA;AAAA,UACb,MAAA,CAAO;AAAA,SACT;AACA,QAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,MAC9B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,CAAc,MAAM,CAAA,EAAG;AACzB,MAAA,MAAM,IAAA,GAAO,MAAA;AACb,MAAA,cAAA,CAAe,KAAK,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,oBAAA,CACd,SACA,OAAA,EACwB;AACxB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,SAAU,EAAC;AAE9C,EAAA,IAAI,OAAA,EAAS,oBAAoB,SAAA,EAAW;AAC1C,IAAA,OAAO,8BAA8B,OAAO,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,eAAe,CAAA;AAE/C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,aAAA,CAAc,MAAM,CAAA,EAAG;AACzB,QAAA,MAAM,IAAA,GAAO,MAAA;AACb,QAAA,cAAA,CAAe,KAAK,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,MAC9D;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,gBAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG;AACvD,IAAA,MAAMA,OAA8B,EAAC;AACrC,IAAA,uBAAA,CAAwB,OAAA,CAAQ,CAAC,CAAA,EAAG,YAAA,EAAcA,IAAG,CAAA;AACrD,IAAA,OAAOA,IAAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,GAAA,CAAI,sBAAsB,CAAA,GAAI,KAAA;AAC9B,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,IAAA,uBAAA,CAAwB,CAAA,EAAG,CAAA,kBAAA,EAAqB,CAAC,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAAA,EAC3D,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,gCAAA,CACd,OACA,MAAA,EACa;AACb,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC/C,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,GAAA,EAAK,IAAA,EAAM,GAAG,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,qBAAqB,OAAA,EAA0C;AAC7E,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,MAAA;AAE7C,EAAA,OAAO,OAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAU,KAAK,KAAA,KAAU,MAAA,GAAS,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA,GAAK,IAAA,CAAK,KAAM,CAAA,CACrE,KAAK,GAAG,CAAA;AACb;AAKO,SAAS,wBACd,UAAA,EACuC;AACvC,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AAEzB,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,IAAA,EAAK,GAAI,UAAA;AAGxC,EAAA,IAAI,IAAA,KAAS,KAAA,EAAO,OAAO,EAAC;AAE5B,EAAA,OAAO;AAAA,IACL,MAAM,WAAA,IAAe,CAAA;AAAA;AAAA,IACrB,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,uBAAuB,OAAA,EAKX;AAC1B,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,MAAK,GAAI,OAAA;AAE/C,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,GAAG,qBAAqB,OAAO,CAAA;AAAA,IAC/B,GAAG,wBAAwB,UAAU;AAAA,GACvC;AAEA,EAAA,MAAM,QAAA,GAAW,qBAAqB,OAAO,CAAA;AAC7C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,EACpB;AAGA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAA,CAAO,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,GACzC,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GACtB,IAAA,CAAK,QAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,iBAAiB,MAAA,EAA0C;AACzE,EAAA,IAAI,CAAC,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,EAAA;AAExD,EAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AAEzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,MAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,aAAa,QAAA,EAAS;AAC1C,EAAA,OAAO,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,EAAA;AAC3C;AA4BO,SAAS,aAAa,MAAA,EAA2C;AACtE,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,MAAA;AAE3C,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,UAAU,MAAA,EAAQ;AAE3B,IAAA,IAAI,OAAA,IAAW,MAAA,IAAU,MAAA,CAAO,KAAA,IAAS,OAAO,QAAA,EAAU;AACxD,MAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM,GAAI,MAAA;AAGnC,MAAA,IAAI,KAAA,KAAU,MAAA,IAAc,KAAA,KAAU,IAAA,IAAQ,aAAa,MAAA,EAAS;AAClE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAE3C,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mCAAA,EAAsC,QAAQ,CAAA,CAAE,CAAA;AAC7D,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAAW,SAAS,CAAA,EAAG,KAAK,KAAK,MAAM,CAAA,CAAA,GAAK,OAAO,KAAK,CAAA;AAE9D,MAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,QAAA,EAAU,KAAK,CAAA;AAExD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAChD;AAKO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,MAAM,KAAA;AAAA,EACR;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,aAAa,KAAA,EAAO;AACrE,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAQ,KAAA,CAA+B,OAAO,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAC1C;;;ACzlBA,SAAS,iBAAA,CAAqB,OAAoB,IAAA,EAAgC;AAChF,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAElB,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,IAAA,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,GAAG,IAAA,CAAK,SAAS,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAC1C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,GAAS,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAA,CACP,OACA,MAAA,EACa;AACb,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,MAAW,MAAA,EAAQ;AAC/C,IAAA,MAAM,SAAA,GAAY,2BAA2B,QAAQ,CAAA;AACrD,IAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,QAAA,EAAU,KAAK,CAAA;AACvD,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA;AAAA,MACd,KAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AASA,SAAS,YAAA,CACP,OACA,OAAA,EACa;AACb,EAAA,MAAM,UAAA,GAAa,2BAA2B,OAAO,CAAA;AACrD,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,IAAI,MAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChD,MAAA,MAAM,IAAA,GAAO,kCAAkC,OAAuB,CAAA;AACtE,MAAA,IAAI,IAAA,EAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,UAAU,CAAA,EAAG;AAChC,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACpC,IAAA,OAAO,mBAAA,CAAoB,OAAO,UAAU,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,mBAAA,CAAoB,UAAU,CAAA,EAAG;AACnC,IAAA,MAAM,IAAA,GAAO,kCAAkC,UAAU,CAAA;AACzD,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,IAAA,OAAO,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,YAAA,CACP,OACA,OAAA,EACa;AACb,EAAA,MAAM,QAAA,GAAW,qBAAqB,OAAO,CAAA;AAC7C,EAAA,OAAO,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,KAAA;AAC9C;AAKA,SAAS,eAAA,CACP,OACA,UAAA,EACa;AACb,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,OAAO,OAAO,KAAA;AAErD,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,WAAW,WAAA,EAAa,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,WAAW,WAAW,CAAA;AACvE,EAAA,IAAI,WAAW,QAAA,EAAU,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,WAAW,QAAQ,CAAA;AACrE,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,aAAA,CACP,OACA,IAAA,EACa;AACb,EAAA,IAAI,CAAC,IAAA,EAAM,QAAA,EAAU,OAAO,KAAA;AAE5B,EAAA,MAAM,gBAAgB,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,IAC7C,IAAA,CAAK,QAAA,GACL,IAAA,CAAK,QAAA,CAAS,MAAM,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AAE9C,EAAA,OAAO,KAAA,CAAM,SAAS,aAAa,CAAA;AACrC;AAKA,SAAS,mBAAA,CAAuB,OAAoB,IAAA,EAAgC;AAClF,EAAA,IAAI,CAAC,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,OAAO,KAAA;AAC1C,EAAA,OAAO,KAAA,CAAM,cAAA,CAAe,IAAA,CAAK,cAAc,CAAA;AACjD;AAGA,SAAS,oBAAA,CAAwB,OAAoB,IAAA,EAAgC;AACnF,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAK;AACjC,EAAA,IAAI,MAAA,EAAQ,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AACzC,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,MAAM,SACJ,OAAO,MAAA,KAAW,QAAA,GACd,MAAA,CAAO,MAAK,GACZ,KAAA,CAAM,OAAA,CAAQ,MAAM,IAClB,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAC3B,EAAA;AACR,EAAA,IAAI,MAAA,EAAQ,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AACzC,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,aAAa,IAAA,EAA4B;AAChD,EAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,IAAU,MAAM,WAAA,IAAe,IAAA,EAAM,WAAW,IAAA,EAAM,KAAA,CAAA;AACxE;AAKA,SAAS,eAAA,CAAmB,MAAA,EAAgB,SAAA,EAAmB,IAAA,EAAmB,QAAA,EAAgC;AAChH,EAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAQ,SAAS,CAAA;AAElD,EAAA,IAAI,QAAA,EAAU,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACxC,EAAA,IAAI,MAAM,MAAA,EAAQ,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,KAAK,MAAM,CAAA;AAClD,EAAA,IAAI,MAAM,OAAA,EAAS,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,OAAO,CAAA;AACrD,EAAA,IAAI,MAAM,KAAA,EAAO,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,KAAK,CAAA;AAC/C,EAAA,IAAI,MAAM,WAAA,EAAa,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,WAAW,CAAA;AAE3D,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,aAAa,MAAA,EAA8B;AACzD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,eAAA,CAAI,OAAO,CAAA,YAAA,CAAc,CAAA;AAChE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAE9D,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAsB,IAAA,EAAM,YAAA,IAAgB,IAAA;AACjE,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,EAAkB,IAAA,KAAsB,MAAM,SAAA,IAAa,QAAA;AAEjF,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,MAAK,GAAI,MAAA;AACzD,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,IAAI,UAAA,GAAa,eAAA,CAAuB,MAAA,EAAQ,SAAA,EAAW,UAAU,CAAA;AACrE,QAAA,UAAA,GAAa,mBAAA,CAAoB,YAAY,UAAU,CAAA;AACvD,QAAA,MAAMC,SAAAA,GAAW,MAAM,UAAA,CAAW,OAAA,EAAQ;AAC1C,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQA,SAAQ,IAAIA,SAAAA,GAAYA,SAAAA,EAAkB,QAAQ,EAAC;AAC9E,QAAA,MAAM,KAAA,GAASA,SAAAA,EAAkB,KAAA,IAAS,IAAA,CAAK,MAAA;AAC/C,QAAA,OAAO,EAAE,MAAuB,KAAA,EAAM;AAAA,MACxC;AAEA,MAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC/C,MAAA,KAAA,GAAQ,YAAA,CAAa,OAAO,OAAO,CAAA;AACnC,MAAA,KAAA,GAAQ,YAAA,CAAa,OAAO,OAAO,CAAA;AACnC,MAAA,KAAA,GAAQ,eAAA,CAAgB,OAAO,UAAU,CAAA;AACzC,MAAA,KAAA,GAAQ,aAAA,CAAc,OAAO,UAAU,CAAA;AACvC,MAAA,KAAA,GAAQ,iBAAA,CAAkB,OAAO,UAAU,CAAA;AAC3C,MAAA,KAAA,GAAQ,oBAAA,CAAqB,OAAO,UAAU,CAAA;AAC9C,MAAA,KAAA,GAAQ,mBAAA,CAAoB,OAAO,UAAU,CAAA;AAE7C,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACtD,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAK,GAAI,MAAA;AAC/B,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAMA,SAAAA,GAAW,MAAM,eAAA,CAAuB,MAAA,EAAQ,SAAA,EAAW,YAAY,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,OAAA,EAAQ;AACjG,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQA,SAAQ,CAAA,GAAIA,SAAAA,CAAS,CAAC,CAAA,GAAaA,SAAAA,EAAU,IAAA,GAAO,CAAC,CAAA,IAAKA,SAAAA;AACrF,QAAA,OAAO,EAAE,IAAA,EAAK;AAAA,MAChB;AAEA,MAAA,IAAI,KAAA,GAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC/D,MAAA,KAAA,GAAQ,aAAA,CAAc,OAAO,UAAU,CAAA;AACvC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAK,GAAI,MAAA;AAChC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,UACzB,GAAA,CAAI,GAAA,CAAI,OAAM,EAAA,KAAM;AAClB,YAAA,MAAMA,SAAAA,GAAW,MAAM,eAAA,CAAuB,MAAA,EAAQ,SAAA,EAAW,YAAY,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,OAAA,EAAQ;AACjG,YAAA,OAAO,KAAA,CAAM,OAAA,CAAQA,SAAQ,CAAA,GAAIA,SAAAA,CAAS,CAAC,CAAA,GAAaA,SAAAA,EAAU,IAAA,GAAO,CAAC,CAAA,IAAKA,SAAAA;AAAA,UACjF,CAAC;AAAA,SACH;AACA,QAAA,OAAO,EAAE,IAAA,EAAK;AAAA,MAChB;AAEA,MAAA,MAAM,QAAA,GAAW,YAAY,UAAU,CAAA;AACvC,MAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC/C,MAAA,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,EAAU,MAAM,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AACrD,MAAA,KAAA,GAAQ,aAAA,CAAc,OAAO,UAAU,CAAA;AACvC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAMA,SAAAA,GAAW,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,KAAA,EAAM,CACN,MAAA,CAAO,SAA0B,EACjC,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAMA,SAAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,KAAK,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,YAAY,MAAA,GACtB,EAAA,CAAG,OAAO,SAAmB,CAAA,GAC7B,EAAA,CAAG,MAAA,CAAO,SAAmB,CAAA;AACjC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,QACzB,SAAA,CAAU,GAAA,CAAI,OAAO,IAAA,KAAS;AAC5B,UAAA,MAAM,QAAA,GAAW,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,IAAc,CAAA,CACrB,OAAA,EAAQ;AACX,UAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QAClB,CAAC;AAAA,OACH;AAEA,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,MAAK,GAAI,MAAA;AAC1C,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAMA,YAAW,MAAM,IAAI,SAAS,MAAM,CAAA,CACvC,KAAK,SAAS,CAAA,CACd,OAAM,CACN,GAAA,CAAI,OAAO,EAAE,CAAC,EACd,MAAA,CAAO,SAAwB,EAC/B,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAMA,SAAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,WAAW,MAAM,IAAI,QAAA,CAAS,MAAM,EACvC,IAAA,CAAK,SAAS,CAAA,CACd,GAAA,CAAI,OAAO,EAAE,CAAC,EACd,MAAA,CAAO,SAAmB,EAC1B,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,SAAA,EAAW,MAAK,GAAI,MAAA;AAC3C,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AACnD,MAAA,MAAM,QAAA,GAAW,YAAY,UAAU,CAAA;AAEvC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,CAAA,EAAA,MAAO,EAAE,CAAC,QAAQ,GAAG,EAAA,EAAI,GAAI,SAAA,EAAqB,CAAE,CAAA;AACzE,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,UAAA,CAAW,IAAI,CAAA,CACf,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,SAAA,EAAW,OACT,MAAA,KACsC;AACtC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAK,GAAI,MAAA;AAC/B,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAM,WAAW,MAAM,IAAI,SAAS,MAAM,CAAA,CACvC,KAAK,SAAS,CAAA,CACd,KAAA,EAAM,CACN,OAAO,CAAC,MAAA,CAAO,EAAE,CAAC,CAAC,EACnB,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACtB,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA,CACjB,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,IAAA,EAAM,EAAE,EAAA,EAAG,EAAsB;AAAA,IAC5C,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAK,GAAI,MAAA;AAChC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAM,WAAW,MAAM,IAAI,QAAA,CAAS,MAAM,EACvC,IAAA,CAAK,SAAS,CAAA,CACd,KAAA,GACA,MAAA,CAAO,GAAA,CAAI,IAAI,MAAM,CAAC,EACtB,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAM,CAAC,QAAA,CAAS,IAAI,CAAA,EAAE;AAAA,MACjC;AAEA,MAAA,IAAI,UAAA,EAAY,cAAA,IAAkB,UAAA,EAAY,OAAA,EAAS;AACrD,QAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC/C,QAAA,KAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,UAAA,CAAW,OAAuB,CAAA;AAC9D,QAAA,MAAM,KAAA,CAAM,cAAA,EAAe,CAAE,OAAA,EAAQ;AACrC,QAAA,OAAO,EAAE,MAAM,GAAA,CAAI,GAAA,CAAI,SAAO,EAAE,EAAA,GAAyB,CAAA,EAAE;AAAA,MAC7D;AAEA,MAAA,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACtB,IAAA,CAAK,SAAS,CAAA,CACd,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,EAC1B,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,MAAM,GAAA,CAAI,GAAA,CAAI,SAAO,EAAE,EAAA,GAAyB,CAAA,EAAE;AAAA,IAC7D,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,OAAM,GAAI,MAAA;AACxC,MAAA,IAAI,QAAA,GAAW,CAAA,SAAA,EAAY,MAAA,CAAO,OAAO,eAAe,GAAG,CAAA,CAAA;AAE3D,MAAA,IAAI,IAAA;AACJ,MAAA,QAAQ,MAAA,CAAO,aAAY;AAAG,QAC5B,KAAK,KAAA,EAAO;AACV,UAAA,IAAI,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,YAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB,KAA+B,EAAE,QAAA,EAAS;AAClF,YAAA,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,EAAG,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAG,WAAW,CAAA,CAAA;AAAA,UAC3E;AACA,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AAC3C,UAAA;AAAA,QACF;AAAA,QACA,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,UAAU,OAAO,CAAA;AACrD,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,UAAU,OAAO,CAAA;AACpD,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,UAAU,OAAO,CAAA;AACtD,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AAC9C,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAE,CAAA;AAAA;AAGxD,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA,IAEA,WAAW,MAAM;AAAA,GACnB;AACF;AC7aO,SAAS,oBAAoB,MAAA,EAA8B;AAChE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAE9D,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAkB,IAAA,KAAsB,MAAM,UAAA,IAAc,QAAA;AAEnF,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAKA;AACpB,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,GAAG,oBAAA,CAAqB,MAAA,CAAO,SAAS,EAAE,eAAA,EAAiB,WAAW,CAAA;AAAA,MACtE,GAAG,uBAAA,CAAwB,MAAA,CAAO,UAAU;AAAA,KAC9C;AAEA,IAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,MAAA,CAAO,OAAO,CAAA;AACpD,IAAA,IAAI,QAAA,UAAkB,QAAA,GAAW,QAAA;AAEjC,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,MAAK,GAAI,MAAA;AACzD,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AACjD,MAAA,MAAM,cAAA,GAAiB,aAAa,EAAE,OAAA,EAAS,SAAS,UAA6B,CAAC,CAAA;AAEtF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACtC,IAAA,CAAK,MAAM,CAAA,CACX,MAAA,CAAO,cAAc,CAAA,CACrB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACtD,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,MAAK,GAAI,MAAA;AACrC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,IAAI,YAAY,QAAA,EAAU;AACxB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACtC,IAAA,CAAK,MAAM,CAAA,CACX,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,EACrB,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CAClC,IAAA,CAAK,MAAM,CAAA,CACX,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,EACrB,OAAA,EAAc;AACjB,MAAA,OAAO,EAAE,MAAM,IAAA,EAAyB;AAAA,IAC1C,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AACjD,MAAA,MAAM,EAAE,OAAO,KAAA,GAAQ,IAAI,SAAA,GAAY,IAAG,GAAI,SAAA;AAE9C,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,MAAM,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA;AAC9D,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,SAAA,CAAU,CAAC,CAAA,IAAK,EAAE,CAAA;AAE5D,MAAA,MAAM,WAAW,MAAM,IAAI,QAAQ,MAAM,CAAA,CACtC,KAAK,MAAM,CAAA,CACX,MAAA,CAAO,EAAE,OAAO,KAAA,EAAO,SAAA,EAAW,WAAW,aAAA,EAAe,EAC5D,OAAA,EAAQ;AAGX,MAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,IAAA,EAAM,UAAA,GAAa,CAAC,CAAA,EAAG,MAAA;AACtD,MAAA,OAAO,EAAE,IAAA,EAAO,aAAA,IAAiB,QAAA,CAAS,IAAA,EAA0B;AAAA,IACtE,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,SAAA,EAAW,MAAK,GAAI,MAAA;AAChD,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACtC,IAAA,CAAK,MAAM,CAAA,CACX,OAAO,MAAA,CAAO,IAAI,CAAA,EAAG,SAAmB,EACxC,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,SAAA,EAAW,OACT,MAAA,KACsC;AACtC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,MAAK,GAAI,MAAA;AACrC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACrB,KAAK,MAAM,CAAA,CACX,MAAA,CAAO,CAAC,MAAA,CAAO,IAAI,CAAC,CAAC,EACrB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAM,EAAE,EAAA,EAAI,MAAK,EAAsB;AAAA,IAClD,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA,IAEjB,OAAA,EAAS,aAAqF,EAAE,IAAA,EAAM,EAAC,EAAE,CAAA;AAAA,IAEzG,UAAA,EAAY,OACV,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AACjD,MAAA,MAAM,EAAE,OAAO,KAAA,GAAQ,IAAI,SAAA,GAAY,IAAG,GAAI,SAAA;AAE9C,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,MAAM,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA;AAC9D,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,SAAA,CAAU,CAAC,CAAA,IAAK,EAAE,CAAA;AAE5D,MAAA,MAAM,WAAW,MAAM,IAAI,QAAQ,MAAM,CAAA,CACtC,KAAK,MAAM,CAAA,CACX,MAAA,CAAO,EAAE,OAAO,KAAA,EAAO,SAAA,EAAW,WAAW,aAAA,EAAe,EAC5D,OAAA,EAAQ;AAGX,MAAA,MAAM,QAAA,GAAW,SAAS,IAAA,EAAM,UAAA,EAAY,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA,IAAK,EAAC;AACnE,MAAA,OAAO,EAAE,MAAO,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,IAAA,EAA0B;AAAA,IACzF,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAK,GAAI,MAAA;AAChC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACrB,IAAA,CAAK,MAAM,CAAA,CACX,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,EACtB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,MAAM,GAAA,CAAI,GAAA,CAAI,SAAO,EAAE,EAAA,GAAyB,CAAA,EAAE;AAAA,IAC7D,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,OAAM,GAAI,MAAA;AACxC,MAAA,IAAI,OAAA,GAAU,CAAA,SAAA,EAAY,MAAA,CAAO,OAAO,oBAAoB,GAAG,CAAA,CAAA;AAE/D,MAAA,IAAI,IAAA;AACJ,MAAA,QAAQ,MAAA,CAAO,aAAY;AAAG,QAC5B,KAAK,KAAA,EAAO;AACV,UAAA,IAAI,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,YAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB,KAA+B,EAAE,QAAA,EAAS;AAClF,YAAA,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,EAAG,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAG,WAAW,CAAA,CAAA;AAAA,UACxE;AACA,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAC1C,UAAA;AAAA,QACF;AAAA,QACA,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,SAAS,OAAO,CAAA;AACpD,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,SAAS,OAAO,CAAA;AACnD,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,SAAS,OAAO,CAAA;AACrD,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAC7C,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAE,CAAA;AAAA;AAGxD,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA;AAAA,IAGA,UAAA,EAAY;AAAA,GACd;AACF;AClLO,SAAS,gBAAgB,MAAA,EAA8B;AAC5D,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,MAAM,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,MAAM,CAAA;AAEtC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,MAAA;AAE3B,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAM,CAAA;AAC1B,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,KAAA,GAAQ,OAAA,EAAQ;AAE3C,QAAA,OAAO;AAAA,UACL,IAAA,EAAO,SAAS,IAAA,IAAQ,QAAA;AAAA,UACxB,KAAA,EAAO,QAAA,CAAS,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,MAAA,IAAU,CAAA;AAAA,SACjG;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,MAAM,OAAO,IAAA,EAAM,IAAA;AACnB,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,UAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,QAC7D;AACA,QAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,MAAM,CAAA;AAClC,QAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM;AAAA,UACxC,KAAK,IAAA,EAAM,GAAA;AAAA,UACX,iBAAiB,IAAA,EAAM;AAAA,SACxB,CAAA;AACD,QAAA,MAAM,GAAA,GAAM,SAAS,IAAA,IAAQ,QAAA;AAC7B,QAAA,MAAM,OAAgB,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GACnC,GAAA,GACA,OAAO,OAAA,CAAQ,GAAG,EAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,OAAO,EAAE,GAAA,EAAK,OAAM,CAAsB,CAAA;AAClF,QAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,MAAA,EAAO;AAAA,MACpC;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,qCAAA,CAAuC,CAAA;AAAA,IAC1F,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAK,GAAI,MAAA;AAE/B,MAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAM,CAAA;AAC1B,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,QAAA,GAAW,OAAA,EAAQ;AAE9C,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,MAAM,CAAA;AAClC,QAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAG;AAAA,UAC7C,KAAK,IAAA,EAAM,GAAA;AAAA,UACX,MAAM,IAAA,EAAM;AAAA,SACb,EAAE,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAO,QAAA,CAAS,IAAA,IAAQ,QAAA,EAAmB;AAAA,MACtD;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,QAAQ,CAAA,wCAAA,CAA0C,CAAA;AAAA,IACxG,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,MAAK,GAAI,MAAA;AACrC,MAAA,MAAM,UAAA,GAAa,IAAA;AAEnB,MAAA,IAAI,UAAA,EAAY,SAAS,UAAA,EAAY;AACnC,QAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,IAAA,EAAM;AAAA,UACpD,KAAA,EAAO,WAAW,KAAA,IAAS,KAAA;AAAA,UAC3B,MAAA,EAAS,WAAW;AAAC,SACtB,CAAA;AACD,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,MACxC;AAEA,MAAA,IAAI,UAAA,EAAY,SAAS,WAAA,EAAa;AACpC,QAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,IAAA,EAAM;AAAA,UACpD,MAAA,EAAS,WAAW;AAAC,SACtB,CAAA;AACD,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,MACxC;AAEA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA,IAEjB,SAAS,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAAG,CAAA;AAAA,IACtF,QAAQ,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,yEAAyE,CAAA;AAAA,IAAG,CAAA;AAAA,IAClH,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IAAG,CAAA;AAAA,IAC5F,QAAQ,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAAG,CAAA;AAAA,IACpF,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IAAG,CAAA;AAAA,IAC5F,WAAW,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAAG,CAAA;AAAA,IAC1F,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IAAG;AAAA,GAC9F;AACF;AC3GA,SAAS,oBAAA,CACP,OAAA,EACA,OAAA,EACA,UAAA,EACiB;AACjB,EAAA,MAAM,SAA0B,EAAC;AAGjC,EAAA,IAAI,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,KAAA,EAAO;AAC3C,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,MAAA,CAAO,OAAO,UAAA,CAAW,WAAA;AAAA,IAC3B;AACA,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,MAAA,CAAO,YAAY,UAAA,CAAW,QAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,QAAA,QAAQ,KAAA;AAAO,UACb,KAAK,QAAA;AACH,YAAA,MAAA,CAAO,MAAA,GAAS,OAAO,KAAK,CAAA;AAC5B,YAAA;AAAA,UACF,KAAK,WAAA;AACH,YAAA,MAAA,CAAO,SAAA,GAAY,QAAQ,KAAK,CAAA;AAChC,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,MAAA,CAAO,QAAA,GAAW,QAAQ,KAAK,CAAA;AAC/B,YAAA;AAAA,UACF,KAAK,cAAA;AACH,YAAA,MAAA,CAAO,YAAA,GAAe,QAAQ,KAAK,CAAA;AACnC,YAAA;AAAA,UACF,KAAK,YAAA;AACH,YAAA,MAAA,CAAO,UAAA,GAAa,QAAQ,KAAK,CAAA;AACjC,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAA,CAAO,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAM,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AACpE,YAAA;AAAA;AACJ,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,IAAA,MAAA,CAAO,QAAA,GAAW,OAAO,KAAA,KAAU,MAAA,GAAS,IAAI,MAAA,CAAO,KAAK,KAAK,MAAA,CAAO,KAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,MAAA;AACT;AAyCO,SAAS,iBAAiB,MAAA,EAA8B;AAC7D,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAE9D,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,MAAK,GAAI,MAAA;AAEzD,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AACrE,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,WAA8C,CAAA;AAE/E,QAAA,OAAO;AAAA,UACL,IAAA,EAAO,SAAS,IAAA,IAAQ,QAAA;AAAA,UACxB,OAAO,QAAA,CAAS;AAAA,SAClB;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,OAAA,EAAS;AAExB,QAAA,MAAM,WAAW,IAAA,EAAM,QAAA;AACvB,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,QACzD;AACA,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAC5C,QAAA,MAAM,QAAQ,QAAA,CAAS,IAAA,EAAM,KAAA,IAAS,QAAA,CAAS,SAAS,EAAC;AAEzD,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,OAAO,KAAA,CAAM;AAAA,SACf;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,QAAA,MAAM,WAAW,IAAA,EAAM,QAAA;AACvB,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,QACxD;AACA,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAChD,QAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,QAAA;AAC9B,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,IAAA;AAAA,UACN,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAK,MAAA,GAAS;AAAA,SAC7C;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,QAAQ,CAAA,+BAAA,CAAiC,CAAA;AAAA,IACjG,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAG,GAAI,MAAA;AAEzB,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAG5B,QAAA,IAAI,MAAA,CAAO,EAAE,CAAA,KAAM,IAAA,EAAM;AACvB,UAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,UAAA,MAAMA,SAAAA,GAAW,MAAM,IAAA,CAAK,cAAA,EAAe;AAC3C,UAAA,MAAM,IAAA,GAAOA,SAAAA,GAAaA,SAAAA,CAAiB,IAAA,IAAQA,SAAAA,GAAY,IAAA;AAC/D,UAAA,OAAO,EAAE,IAAA,EAA+B;AAAA,QAC1C;AAEA,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAC,CAAA;AAE9C,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,kBAAA,CAAoB,CAAA;AAAA,IACnF,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA,IAEjB,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,MAAA;AAEhC,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,SAAA;AACjB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAE/C,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,4BAAA,CAA8B,CAAA;AAAA,IAC7F,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,SAAA,EAAU,GAAI,MAAA;AAEpC,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,OAAO,EAAE,CAAA;AAC1B,QAAA,MAAM,UAAA,GAAa,SAAA;AACnB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,UAAU,UAAU,CAAA;AAE3D,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,4BAAA,CAA8B,CAAA;AAAA,IAC7F,CAAA;AAAA,IAEA,SAAA,EAAW,OACT,MAAA,KACsC;AACtC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAG,GAAI,MAAA;AAEzB,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,OAAO,EAAE,CAAA;AAC1B,QAAA,MAAM,IAAA,CAAK,WAAW,QAAQ,CAAA;AAE9B,QAAA,OAAO;AAAA,UACL,MAAM;AAAC,SACT;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,4BAAA,CAA8B,CAAA;AAAA,IAC7F,CAAA;AAAA;AAAA,IAGA,SAAS,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAAG,CAAA;AAAA,IACvF,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAAG,CAAA;AAAA,IAC7F,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAAG,CAAA;AAAA,IAC7F,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAAG,CAAA;AAAA,IAC7F,QAAQ,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAAG;AAAA,GACvF;AACF;AC7QO,SAAS,sBAAsB,MAAA,EAA8B;AAClE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAIC,SAAAA,CAAU,MAAM,CAAA;AAEtC,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQL,QAAQ,OAA+D;AAAA,MACrE,QAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF,KAAgE;AAC9D,MAAA,MAAM,YAAA,GAAe,IAAA;AAErB,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,QAAA,EAAU;AAAA,QACxD,KAAA,EAAO,cAAc,KAAA,IAAS,KAAA;AAAA,QAC9B,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,IACxC,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA;AAAA,IAGjB,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,WAAW,YAAY;AACrB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AC/EO,SAAS,sBAAsB,MAAA,EAA8B;AAClE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAIC,SAAAA,CAAU,MAAM,CAAA;AAEtC,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOL,QAAQ,OAA+D;AAAA,MACrE,QAAA;AAAA,MACA;AAAA,KACF,KAAgE;AAC9D,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,QAAA,EAAU;AAAA,QACxD,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,IACxC,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA;AAAA,IAGjB,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,WAAW,YAAY;AACrB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;ACtDO,IAAI,WAAA,GAA0C;AAY9C,SAAS,aAAa,MAAA,EAA8B;AACzD,EAAA,MAAM,IAAA,GAAO,IAAIC,IAAAA,CAAK,MAAM,CAAA;AAE5B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,GAAsB,EAAC,KAAM;AACzC,MAAA,MAAM,EAAE,WAAA,EAAa,QAAA,GAAW,IAAA,EAAK,GAAI,MAAA;AAKzC,MAAA,IAAI,IAAA,CAAK,qBAAoB,EAAG;AAC9B,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,YAAY,WAAA,IAAe;AAAA,SAC7B;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,IAAA,CAAK,MAAM,WAAW,CAAA;AAItB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,YAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAA,EAAQ,OAAO,MAAA,GAAuB,EAAC,KAAM;AAC3C,MAAA,MAAM,EAAE,aAAY,GAAI,MAAA;AAExB,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,MAAM,IAAA,CAAK,OAAO,WAAW,CAAA;AAE7B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,YAAY,WAAA,IAAe;AAAA,OAC7B;AAAA,IACF,CAAA;AAAA,IAEA,OAAO,YAAY;AACjB,MAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,EAAoB,EAAG;AAC/B,QAAA,OAAO,EAAE,aAAA,EAAe,KAAA,EAAO,UAAA,EAAY,QAAA,EAAS;AAAA,MACtD;AAGA,MAAA,OAAO,EAAE,eAAe,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,OAAA,EAAS,OAAO,KAAA,KAAU;AACxB,MAAA,MAAM,SAAS,KAAA,EAAO,UAAA,IAAc,KAAA,EAAO,MAAA,IAAU,OAAO,QAAA,EAAU,MAAA;AAGtE,MAAA,IAAI,WAAW,GAAA,EAAK;AAClB,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,IAAA;AAAA,UACR,UAAA,EAAY,QAAA;AAAA,UACZ;AAAA,SACF;AAAA,MACF;AAGA,MAAA,IAAI,WAAW,GAAA,EAAK;AAClB,QAAA,OAAO,EAAE,KAAA,EAAM;AAAA,MACjB;AAEA,MAAA,OAAO,EAAE,KAAA,EAAM;AAAA,IACjB,CAAA;AAAA,IAEA,QAAA,EAAU,OAAO,MAAA,GAAyB,EAAC,KAAM;AAC/C,MAAA,MAAM,EAAE,aAAY,GAAI,MAAA;AAGxB,MAAA,IAAA,CAAK,OAAO,WAAW,CAAA;AAEvB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA;AAAA,IAEA,aAAa,YAAY;AACvB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,EAAe;AAE3C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,WAAA,GAAc,IAAA;AACd,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAQ,SAAiB,IAAA,IAAQ,QAAA;AACvC,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IAEA,gBAAgB,YAAY;AAE1B,MAAA,MAAM,IAAA,GAAO,WAAA;AAEb,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,QACtB,WAAA,EAAa,IAAA,CAAK,gBAAA,IAAoB,EAAC;AAAA,QACvC,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,EAAC;AAAA,QACxB,QAAA,EAAU,KAAK,QAAA,IAAY,KAAA;AAAA,QAC3B,YAAA,EAAc,KAAK,YAAA,IAAgB;AAAA,OACrC;AAAA,IACF;AAAA,GACF;AACF;ACrIO,SAAS,qBAAA,CACd,QACA,OAAA,EACuB;AACvB,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,MAAM,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,IAAIA,IAAAA,CAAK,MAAM,CAAA;AAC5B,EAAA,MAAM,EAAE,YAAA,GAAe,EAAA,EAAG,GAAI,WAAW,EAAC;AAG1C,EAAA,MAAM,mBAAmB,IAAI,UAAA;AAAA,IAC3B,OAAO,MAAA,KAAW;AAEhB,MAAA,IAAI,WAAA,GAAc,WAAA;AAElB,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,EAAe;AAC3C,UAAA,WAAA,GAAc,QAAA,GAAa,QAAA,CAAiB,IAAA,IAAQ,QAAA,GAAY,IAAA;AAAA,QAClE,CAAA,CAAA,MAAQ;AACN,UAAA,WAAA,GAAc,IAAA;AAAA,QAChB;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,MAAA,CAAO,IAAI,OAAO;AAAA,UACvB,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ;AAAA,SACV,CAAE,CAAA;AAAA,MACJ;AAGA,MAAA,MAAM,eAAA,uBAAsB,GAAA,EAKzB;AAEH,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,EAAQ,EAAA,GAAK,OAAO,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,GAAI,GAAA;AAC9D,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,QAAQ,IAAI,QAAQ,CAAA,CAAA;AAEzC,QAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,UAAA,eAAA,CAAgB,IAAI,GAAA,EAAK;AAAA,YACvB,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,QAAA;AAAA,YACA,UAAA,EAAa,KAAA,CAAM,MAAA,IAAU,EAAC;AAAA,YAC9B,OAAA,sBAAa,GAAA;AAAI,WAClB,CAAA;AAAA,QACH;AACA,QAAA,eAAA,CAAgB,IAAI,GAAG,CAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,MAAM,MAAM,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAGzD,MAAA,MAAM,YAAA,GAAe,aAAA,CAAc,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACjD,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAO;AAAA,OACnC,CAAE,CAAA;AAEF,MAAA,IAAI;AAEF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,aAAA,CAAc,YAAY,CAAA;AAKtD,QAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoC;AAClE,QAAA,MAAA,EAAQ,OAAA,EAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,KAAU;AACrC,UAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,UAAA,MAAM,MAAM,CAAA,EAAG,OAAA,CAAQ,QAAQ,CAAA,CAAA,EAAI,QAAQ,QAAQ,CAAA,CAAA;AACnD,UAAA,iBAAA,CAAkB,GAAA,CAAI,GAAA,EAAK,CAAA,CAAE,OAAA,IAAW,EAAE,CAAA;AAAA,QAC5C,CAAC,CAAA;AAGD,QAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AAC3B,UAAA,MAAM,QAAA,GAAW,MAAM,MAAA,EAAQ,EAAA,GAAK,OAAO,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,GAAI,GAAA;AAC9D,UAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,QAAQ,IAAI,QAAQ,CAAA,CAAA;AACzC,UAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,GAAA,CAAI,GAAG,KAAK,EAAC;AAC/C,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,KAAM,cAAA;AAE1C,UAAA,OAAO;AAAA,YACL,GAAA,EAAK,OAAA;AAAA,YACL,MAAA,EAAQ,UAAU,KAAA,CAAA,GAAY;AAAA,WAChC;AAAA,QACF,CAAC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,QAAA,OAAO,MAAA,CAAO,IAAI,OAAO;AAAA,UACvB,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SACnD,CAAE,CAAA;AAAA,MACJ;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,eAAA,EAAiB,CAAC,QAAA,KAAa,UAAA,CAAW,UAAU,YAAY,CAAA;AAAA,MAChE,KAAA,EAAO;AAAA;AAAA;AACT,GACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAO,KAAM;AAC3C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,wBAAA,EAAyB;AAAA,MACxD;AAEA,MAAA,OAAO,iBAAiB,IAAA,CAAK;AAAA,QAC3B,QAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,OAAA,EAAS;AAAA,MACP,OAAA,EAAS;AAAA,QACP,mBAAA,EAAqB,IAAA;AAAA,QACrB,kBAAA,EAAoB;AAAA,OACtB;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,QACpB,MAAA,EAAQ,KAAK,EAAA,GAAK;AAAA;AAAA;AACpB;AACF,GACF;AACF","file":"index.js","sourcesContent":["{\n \"name\": \"@taruvi/refine-providers\",\n \"version\": \"1.3.4-beta.2\",\n \"description\": \"Refine.dev data provider for Taruvi Data Service\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"peerDependencies\": {\n \"@refinedev/core\": \"^5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@refinedev/core\": {\n \"optional\": false\n }\n },\n \"devDependencies\": {\n \"@refinedev/core\": \"^5.0.0\",\n \"@types/node\": \"^20.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^4.0.18\"\n },\n \"keywords\": [\n \"refine\",\n \"refinedev\",\n \"data-provider\",\n \"taruvi\",\n \"react\",\n \"crud\"\n ],\n \"author\": \"EOX Vantage\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/taruvi-io/sdk.git\",\n \"directory\": \"packages/refine\"\n },\n \"homepage\": \"https://github.com/taruvi-io/sdk/tree/main/packages/refine#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/taruvi-io/sdk/issues\"\n },\n \"dependencies\": {\n \"@taruvi/sdk\": \"beta\",\n \"dataloader\": \"^2.2.3\"\n }\n}\n","import type { CrudFilter, CrudSort, Pagination } from \"@refinedev/core\";\nimport type {\n BackendFilterNode,\n BackendFilterTreeRoot,\n BackendFilterLogicalNode,\n Database,\n} from \"@taruvi/sdk\";\nimport type { TaruviMeta } from \"./types.js\";\n\n/**\n * Maps Refine operators to Taruvi DRF-style query parameter suffixes.\n * Example: { field: \"age\", operator: \"gte\", value: 18 } → \"age__gte=18\"\n */\nexport const REFINE_OPERATOR_MAP: Record<string, string> = {\n // Equality\n eq: \"\", // exact match (no suffix)\n ne: \"ne\",\n\n // Comparison\n lt: \"lt\",\n gt: \"gt\",\n lte: \"lte\",\n gte: \"gte\",\n\n // String matching — Taruvi wire suffix matches platform filter_translator.\n contains: \"contains\",\n ncontains: \"ncontains\",\n containss: \"containss\",\n ncontainss: \"ncontainss\",\n startswith: \"startswith\",\n nstartswith: \"nstartswith\",\n endswith: \"endswith\",\n nendswith: \"nendswith\",\n startswiths: \"startswiths\",\n nstartswiths: \"nstartswiths\",\n endswiths: \"endswiths\",\n nendswiths: \"nendswiths\",\n // Refine aliases → platform insensitive tokens\n icontains: \"contains\",\n nicontains: \"ncontains\",\n istartswith: \"startswith\",\n nistartswith: \"nstartswith\",\n iendswith: \"endswith\",\n niendswith: \"nendswith\",\n\n // Array / membership\n in: \"in\",\n nin: \"nin\",\n ina: \"ina\",\n nina: \"nina\",\n\n // Null checks\n null: \"null\",\n nnull: \"nnull\",\n\n // Range\n between: \"between\",\n nbetween: \"nbetween\",\n\n // PostgreSQL array ops (pass-through suffix names)\n acontains: \"acontains\",\n nacontains: \"nacontains\",\n acontainedby: \"acontainedby\",\n nacontainedby: \"nacontainedby\",\n aoverlap: \"aoverlap\",\n naoverlap: \"naoverlap\",\n aelement: \"aelement\",\n naelement: \"naelement\",\n\n // PostgreSQL range column ops\n rcontains: \"rcontains\",\n rcontainedby: \"rcontainedby\",\n roverlaps: \"roverlaps\",\n radjacent: \"radjacent\",\n rstrictleft: \"rstrictleft\",\n rstrictright: \"rstrictright\",\n\n // Raw pattern / field search\n like: \"like\",\n ilike: \"ilike\",\n search: \"search\",\n};\n\n/** Operators whose values are encoded as comma-separated lists for the query string. */\nconst COMMA_VALUE_OPERATORS = new Set<string>([\n \"in\",\n \"nin\",\n \"ina\",\n \"nina\",\n \"between\",\n \"nbetween\",\n \"acontains\",\n \"nacontains\",\n \"acontainedby\",\n \"nacontainedby\",\n \"aoverlap\",\n \"naoverlap\",\n \"aelement\",\n \"naelement\",\n \"rcontains\",\n \"rcontainedby\",\n \"roverlaps\",\n \"radjacent\",\n \"rstrictleft\",\n \"rstrictright\",\n]);\n\nexport type ConvertRefineFiltersOptions = {\n /**\n * `bracket` (default): logical `and` / `or` use Taruvi CrudFilters bracket query keys.\n * `flatten`: legacy merge (OR becomes AND) — only for Storage list filters that do not support CrudFilters.\n */\n logicalEncoding?: \"bracket\" | \"flatten\";\n};\n\nfunction isLogicalFilter(filter: CrudFilter): boolean {\n return (\n typeof filter === \"object\" &&\n filter !== null &&\n \"operator\" in filter &&\n (filter.operator === \"and\" || filter.operator === \"or\") &&\n \"value\" in filter &&\n Array.isArray((filter as { value: unknown }).value)\n );\n}\n\nfunction isFieldFilter(filter: CrudFilter): boolean {\n return (\n typeof filter === \"object\" &&\n filter !== null &&\n \"field\" in filter &&\n \"operator\" in filter &&\n typeof (filter as { field: unknown }).field === \"string\" &&\n typeof (filter as { operator: unknown }).operator === \"string\"\n );\n}\n\n/** One leaf filter ready for flat `field__op=value` query encoding. */\nexport type FlatFilterLeaf = {\n field: string;\n operator: string;\n value: unknown;\n};\n\n/** Root logical filter for JSON `filters` query param (not wrapped in an array). */\nexport type LogicalCrudFilter = {\n operator: \"and\" | \"or\";\n value: CrudFilter[];\n};\n\n/**\n * Taruvi list filter payload: leaf array → flat query params; logical object → JSON tree.\n */\nexport type TaruviListFilters = FlatFilterLeaf[] | LogicalCrudFilter;\n\n/** True when `filters` is a non-logical array of field leaves (may be empty). */\nexport function isFlatFilterList(filters: unknown): filters is FlatFilterLeaf[] {\n if (!Array.isArray(filters)) return false;\n return filters.every((f) => {\n if (!isFieldFilter(f)) return false;\n const leaf = f as FlatFilterLeaf;\n if (\n leaf.value === undefined ||\n (leaf.value === null && leaf.operator !== \"null\")\n ) {\n return false;\n }\n if (REFINE_OPERATOR_MAP[leaf.operator] === undefined) {\n return false;\n }\n return true;\n });\n}\n\n/** True when `filters` is a single logical object (and / or), not an array. */\nexport function isLogicalCrudFilter(\n filters: unknown\n): filters is LogicalCrudFilter {\n return (\n typeof filters === \"object\" &&\n filters !== null &&\n !Array.isArray(filters) &&\n isLogicalFilter(filters as CrudFilter)\n );\n}\n\n/**\n * Normalize Refine `CrudFilter[]` or Taruvi payloads for `applyFilters`.\n * Legacy: all field leaves → flat array; single root logical → logical object.\n */\nexport function normalizeTaruviListFilters(\n filters: unknown\n): TaruviListFilters | undefined {\n if (filters === undefined || filters === null) return undefined;\n if (isLogicalCrudFilter(filters)) return filters;\n if (isFlatFilterList(filters)) return filters;\n if (!Array.isArray(filters) || filters.length === 0) return undefined;\n\n if (filters.length === 1 && isLogicalFilter(filters[0])) {\n return filters[0] as LogicalCrudFilter;\n }\n\n if (filters.every(isFieldFilter)) {\n return filters as FlatFilterLeaf[];\n }\n\n return undefined;\n}\n\n/**\n * Collect field filters that can be sent as top-level query params (implicit AND).\n *\n * Returns `null` when the list contains `or` or other shapes that require the JSON\n * `filters` tree. FK-traversal fields (`department_id.name`, etc.) must use flat\n * params on the current platform — nesting them under JSON `and` breaks traversal.\n */\nexport function collectFlatLeaves(filters?: CrudFilter[]): FlatFilterLeaf[] | null {\n if (!filters?.length) return [];\n\n const leaves: FlatFilterLeaf[] = [];\n\n const walk = (group: CrudFilter[]): boolean => {\n for (const filter of group) {\n if (isLogicalFilter(filter)) {\n if (filter.operator === \"or\") return false;\n if (!walk(filter.value as CrudFilter[])) return false;\n continue;\n }\n\n if (!isFieldFilter(filter)) return false;\n\n const leaf = filter as { field: string; operator: string; value: unknown };\n if (\n leaf.value === undefined ||\n (leaf.value === null && leaf.operator !== \"null\")\n ) {\n continue;\n }\n if (REFINE_OPERATOR_MAP[leaf.operator] === undefined) {\n console.warn(`Unknown Refine operator: ${leaf.operator}`);\n return false;\n }\n leaves.push({\n field: leaf.field,\n operator: leaf.operator,\n value: leaf.value,\n });\n }\n return true;\n };\n\n if (!walk(filters)) return null;\n return leaves;\n}\n\n/** Backend operator token for CrudFilters bracket payloads (suffix or `eq`). */\nexport function refineOperatorToBackendKey(operator: string): string {\n const suffix = REFINE_OPERATOR_MAP[operator];\n if (suffix === undefined) return operator;\n return suffix === \"\" ? \"eq\" : suffix;\n}\n\n/** String value for a leaf filter (flat or bracket). */\nexport function formatRefineLeafValue(operator: string, value: unknown): string {\n if (COMMA_VALUE_OPERATORS.has(operator)) {\n return Array.isArray(value) ? value.join(\",\") : String(value);\n }\n if (operator === \"null\" || operator === \"nnull\") {\n return \"true\";\n }\n return String(value);\n}\n\nfunction encodeLeafFlat(\n field: string,\n operator: string,\n value: unknown,\n params: Record<string, string>\n): void {\n if (value === undefined || (value === null && operator !== \"null\")) {\n return;\n }\n const suffix = REFINE_OPERATOR_MAP[operator];\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n return;\n }\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n params[paramKey] = formatRefineLeafValue(operator, value);\n}\n\n/** Encode one CrudFilter node (logical or leaf) into bracket-style flat query keys. */\nexport function encodeCrudFilterBracket(\n filter: CrudFilter,\n path: string,\n out: Record<string, string>\n): void {\n if (isLogicalFilter(filter)) {\n const op = filter.operator as \"and\" | \"or\";\n out[`${path}[operator]`] = op;\n const children = filter.value as CrudFilter[];\n children.forEach((child, i) => {\n encodeCrudFilterBracket(child, `${path}[value][${i}]`, out);\n });\n return;\n }\n\n if (!isFieldFilter(filter)) {\n return;\n }\n\n const leaf = filter as { field: string; operator: string; value: unknown };\n const { field, operator, value } = leaf;\n if (value === undefined || (value === null && operator !== \"null\")) {\n return;\n }\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n return;\n }\n\n out[`${path}[field]`] = field;\n out[`${path}[operator]`] = refineOperatorToBackendKey(operator);\n out[`${path}[value]`] = formatRefineLeafValue(operator, value);\n}\n\nfunction isLogicalBackendNode(n: BackendFilterNode): n is BackendFilterLogicalNode {\n return !(\"field\" in n) && (n.operator === \"and\" || n.operator === \"or\");\n}\n\nfunction jsonLeafValue(operator: string, value: unknown): unknown {\n if (operator === \"null\" || operator === \"nnull\") return true;\n return value;\n}\n\nfunction crudFilterToBackendNodeOrNull(filter: CrudFilter): BackendFilterNode | null {\n if (isLogicalFilter(filter)) {\n const children = (filter.value as CrudFilter[])\n .map(crudFilterToBackendNodeOrNull)\n .filter((n): n is BackendFilterNode => n !== null);\n if (children.length === 0) return null;\n return { operator: filter.operator as \"and\" | \"or\", value: children };\n }\n\n if (isFieldFilter(filter)) {\n const leaf = filter as { field: string; operator: string; value: unknown };\n if (leaf.value === undefined || (leaf.value === null && leaf.operator !== \"null\")) {\n return null;\n }\n if (REFINE_OPERATOR_MAP[leaf.operator] === undefined) {\n console.warn(`Unknown Refine operator: ${leaf.operator}`);\n return null;\n }\n const backendOp = refineOperatorToBackendKey(leaf.operator);\n return {\n field: leaf.field,\n operator: backendOp,\n value: jsonLeafValue(leaf.operator, leaf.value),\n };\n }\n\n return null;\n}\n\n/**\n * Converts Refine `CrudFilter[]` into the backend JSON `filters` query param tree\n * (root array of `{ operator: \"and\"|\"or\", value: [...] }` nodes).\n *\n * Leaf `operator` values are **Taruvi / platform** tokens after `refineOperatorToBackendKey`.\n * Leaf `operator` values use Taruvi / platform tokens from `refineOperatorToBackendKey`.\n */\nexport function convertRefineFiltersToBackendTree(\n filters?: CrudFilter[]\n): BackendFilterTreeRoot | null {\n if (!filters?.length) return null;\n\n const nodes = filters\n .map(crudFilterToBackendNodeOrNull)\n .filter((n): n is BackendFilterNode => n !== null);\n if (nodes.length === 0) return null;\n\n if (nodes.length === 1 && isLogicalBackendNode(nodes[0])) {\n return [nodes[0]];\n }\n\n return [{ operator: \"and\", value: nodes }];\n}\n\n/**\n * Converts one logical CrudFilter object into the backend JSON `filters` tree root.\n */\nexport function convertLogicalFilterToBackendTree(\n filter: LogicalCrudFilter\n): BackendFilterTreeRoot | null {\n const node = crudFilterToBackendNodeOrNull(filter as CrudFilter);\n if (!node || !isLogicalBackendNode(node)) return null;\n return [node];\n}\n\n/** Encode leaf filters as flat `field__op` query param keys. */\nexport function encodeFlatFilterListToParams(\n leaves: FlatFilterLeaf[]\n): Record<string, string> {\n const params: Record<string, string> = {};\n for (const leaf of leaves) {\n encodeLeafFlat(leaf.field, leaf.operator, leaf.value, params);\n }\n return params;\n}\n\nfunction convertRefineFiltersFlattened(\n filters?: CrudFilter[]\n): Record<string, string> {\n if (!filters || filters.length === 0) return {};\n\n const params: Record<string, string> = {};\n\n for (const filter of filters) {\n if (isLogicalFilter(filter)) {\n if (filter.value && Array.isArray(filter.value)) {\n const nested = convertRefineFiltersFlattened(\n filter.value as CrudFilter[]\n );\n Object.assign(params, nested);\n }\n continue;\n }\n\n if (isFieldFilter(filter)) {\n const leaf = filter as { field: string; operator: string; value: unknown };\n encodeLeafFlat(leaf.field, leaf.operator, leaf.value, params);\n }\n }\n\n return params;\n}\n\n/**\n * Converts Refine CrudFilter[] to Taruvi query parameters.\n * Logical `and` / `or` use CrudFilters bracket notation unless `logicalEncoding: 'flatten'`.\n */\nexport function convertRefineFilters(\n filters?: CrudFilter[],\n options?: ConvertRefineFiltersOptions\n): Record<string, string> {\n if (!filters || filters.length === 0) return {};\n\n if (options?.logicalEncoding === \"flatten\") {\n return convertRefineFiltersFlattened(filters);\n }\n\n const hasLogical = filters.some(isLogicalFilter);\n\n if (!hasLogical) {\n const params: Record<string, string> = {};\n for (const filter of filters) {\n if (isFieldFilter(filter)) {\n const leaf = filter as { field: string; operator: string; value: unknown };\n encodeLeafFlat(leaf.field, leaf.operator, leaf.value, params);\n }\n }\n return params;\n }\n\n if (filters.length === 1 && isLogicalFilter(filters[0])) {\n const out: Record<string, string> = {};\n encodeCrudFilterBracket(filters[0], \"filters[0]\", out);\n return out;\n }\n\n const out: Record<string, string> = {};\n out[\"filters[0][operator]\"] = \"and\";\n filters.forEach((f, i) => {\n encodeCrudFilterBracket(f, `filters[0][value][${i}]`, out);\n });\n return out;\n}\n\n/**\n * Applies flat query param entries (including bracket keys) onto a Database query.\n */\nexport function applyRefineQueryParamsToDatabase<T>(\n query: Database<T>,\n params: Record<string, string>\n): Database<T> {\n let result = query;\n for (const [key, val] of Object.entries(params)) {\n result = result.filters(key, \"eq\", val);\n }\n return result;\n}\n\n/**\n * Converts Refine CrudSort[] to Taruvi ordering parameter.\n * Uses DRF convention: \"-field\" for DESC, \"field\" for ASC.\n */\nexport function convertRefineSorters(sorters?: CrudSort[]): string | undefined {\n if (!sorters || sorters.length === 0) return undefined;\n\n return sorters\n .map((sort) => (sort.order === \"desc\" ? `-${sort.field}` : sort.field))\n .join(\",\");\n}\n\n/**\n * Converts Refine Pagination to Taruvi page/page_size parameters.\n */\nexport function convertRefinePagination(\n pagination?: Pagination\n): { page?: number; page_size?: number } {\n if (!pagination) return {};\n\n const { currentPage, pageSize, mode } = pagination;\n\n // Handle \"off\" mode - no pagination\n if (mode === \"off\") return {};\n\n return {\n page: currentPage ?? 1, // Default to page 1 if currentPage is undefined\n page_size: pageSize,\n };\n}\n\n/**\n * Combines all Refine parameters into Taruvi query params.\n */\nexport function buildRefineQueryParams(options: {\n filters?: CrudFilter[];\n sorters?: CrudSort[];\n pagination?: Pagination;\n meta?: TaruviMeta;\n}): Record<string, unknown> {\n const { filters, sorters, pagination, meta } = options;\n\n const params: Record<string, unknown> = {\n ...convertRefineFilters(filters),\n ...convertRefinePagination(pagination),\n };\n\n const ordering = convertRefineSorters(sorters);\n if (ordering) {\n params.ordering = ordering;\n }\n\n // Handle populate from meta\n if (meta?.populate) {\n params.populate = Array.isArray(meta.populate)\n ? meta.populate.join(\",\")\n : meta.populate;\n }\n\n return params;\n}\n\n/**\n * Builds a query string from an object of parameters.\n */\nexport function buildQueryString(params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) return \"\";\n\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n }\n\n const queryString = searchParams.toString();\n return queryString ? `?${queryString}` : \"\";\n}\n\n/**\n * Converts aggregate expressions array to _aggregate query parameter.\n * @param aggregates - Array of aggregate expressions like [\"sum(total)\", \"count(*)\"]\n * @returns Comma-separated string or undefined\n */\nexport function formatAggregates(aggregates?: string[]): string | undefined {\n if (!aggregates || aggregates.length === 0) return undefined;\n return aggregates.join(\",\");\n}\n\n/**\n * Converts groupBy fields array to _group_by query parameter.\n * @param groupBy - Array of field names to group by\n * @returns Comma-separated string or undefined\n */\nexport function formatGroupBy(groupBy?: string[]): string | undefined {\n if (!groupBy || groupBy.length === 0) return undefined;\n return groupBy.join(\",\");\n}\n\n/**\n * Converts having filters to _having query parameter.\n * Uses same format as regular filters with DRF-style operators.\n * @param having - Array of CrudFilter for aggregate results\n * @returns Comma-separated filter string or undefined\n */\nexport function formatHaving(having?: CrudFilter[]): string | undefined {\n if (!having || having.length === 0) return undefined;\n\n const params: string[] = [];\n\n for (const filter of having) {\n // Handle conditional filters (field, operator, value)\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n // Skip undefined/null values\n if (value === undefined || (value === null && operator !== \"null\")) {\n continue;\n }\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n\n if (suffix === undefined) {\n console.warn(`Unknown operator in having clause: ${operator}`);\n continue;\n }\n\n // Build parameter with DRF-style operator\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n const paramValue = formatRefineLeafValue(operator, value);\n\n params.push(`${paramKey}=${paramValue}`);\n }\n }\n\n return params.length > 0 ? params.join(\",\") : undefined;\n}\n\n/**\n * Handles and transforms Taruvi API errors.\n */\nexport function handleError(error: unknown): never {\n if (error instanceof Error) {\n throw error;\n }\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n throw new Error(String((error as { message: unknown }).message));\n }\n throw new Error(\"Unknown error occurred\");\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n GetManyParams,\n GetManyResponse,\n CreateParams,\n CreateResponse,\n CreateManyParams,\n CreateManyResponse,\n UpdateParams,\n UpdateResponse,\n UpdateManyParams,\n UpdateManyResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, Database } from \"@taruvi/sdk\";\nimport type { EdgeRequest, FilterOperator } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport {\n convertRefineFiltersToBackendTree,\n convertLogicalFilterToBackendTree,\n convertRefineSorters,\n formatHaving,\n formatRefineLeafValue,\n isFlatFilterList,\n isLogicalCrudFilter,\n normalizeTaruviListFilters,\n refineOperatorToBackendKey,\n} from \"./utils.js\";\nimport type { FlatFilterLeaf, TaruviListFilters } from \"./utils.js\";\n\nfunction applyAggregations<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta) return query;\n\n let result = query;\n\n if (meta.aggregate?.length) {\n result = result.aggregate(...meta.aggregate);\n }\n\n if (meta.groupBy?.length) {\n result = result.groupBy(...meta.groupBy);\n }\n\n const havingStr = formatHaving(meta.having);\n if (havingStr) {\n result = result.having(havingStr);\n }\n\n return result;\n}\n\nfunction applyFlatFilterList<T>(\n query: Database<T>,\n leaves: FlatFilterLeaf[]\n): Database<T> {\n let result = query;\n for (const { field, operator, value } of leaves) {\n const backendOp = refineOperatorToBackendKey(operator);\n const formatted = formatRefineLeafValue(operator, value);\n result = result.filters(\n field,\n backendOp as FilterOperator,\n formatted as string | number | boolean | (string | number | boolean)[]\n );\n }\n return result;\n}\n\n/**\n * Applies Taruvi list filters to a Database query.\n *\n * - `FlatFilterLeaf[]` → top-level `field__op` query params (flat triple `.filters()`).\n * - `LogicalCrudFilter` object → JSON `filters` tree via `.filters(tree)`.\n * - Legacy `CrudFilter[]` is normalized when possible; otherwise JSON tree.\n */\nfunction applyFilters<T>(\n query: Database<T>,\n filters?: TaruviListFilters | CrudFilter[]\n): Database<T> {\n const normalized = normalizeTaruviListFilters(filters);\n if (normalized === undefined) {\n if (Array.isArray(filters) && filters.length > 0) {\n const tree = convertRefineFiltersToBackendTree(filters as CrudFilter[]);\n if (tree) return query.filters(tree);\n }\n return query;\n }\n\n if (isFlatFilterList(normalized)) {\n if (normalized.length === 0) return query;\n return applyFlatFilterList(query, normalized);\n }\n\n if (isLogicalCrudFilter(normalized)) {\n const tree = convertLogicalFilterToBackendTree(normalized);\n if (!tree) return query;\n return query.filters(tree);\n }\n\n return query;\n}\n\n/**\n * Applies Refine sorters to a Database query.\n */\nfunction applySorters<T>(\n query: Database<T>,\n sorters?: CrudSort[]\n): Database<T> {\n const ordering = convertRefineSorters(sorters);\n return ordering ? query.orderBy(ordering) : query;\n}\n\n/**\n * Applies Refine pagination to a Database query.\n */\nfunction applyPagination<T>(\n query: Database<T>,\n pagination?: Pagination\n): Database<T> {\n if (!pagination || pagination.mode === \"off\") return query;\n\n let result = query;\n if (pagination.currentPage) result = result.page(pagination.currentPage);\n if (pagination.pageSize) result = result.pageSize(pagination.pageSize);\n return result;\n}\n\n/**\n * Applies populate fields to a Database query.\n */\nfunction applyPopulate<T>(\n query: Database<T>,\n meta?: TaruviMeta\n): Database<T> {\n if (!meta?.populate) return query;\n\n const populateArray = Array.isArray(meta.populate)\n ? meta.populate\n : meta.populate.split(\",\").map(s => s.trim());\n\n return query.populate(populateArray);\n}\n\n/**\n * Applies allowed_actions query param for per-row permission hints.\n */\nfunction applyAllowedActions<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta?.allowedActions?.length) return query;\n return query.allowedActions(meta.allowedActions);\n}\n\n/** Applies `?search=` and `?fields=` (via meta.select) list query params. */\nfunction applySearchAndFields<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta) return query;\n let result = query;\n const search = meta.search?.trim();\n if (search) result = result.search(search);\n const select = meta.select;\n const fields =\n typeof select === \"string\"\n ? select.trim()\n : Array.isArray(select)\n ? select.map(String).join(\",\")\n : \"\";\n if (fields) result = result.fields(fields);\n return result;\n}\n\n/**\n * Checks if the query should use Graph SDK based on meta params.\n */\nfunction isGraphQuery(meta?: TaruviMeta): boolean {\n return !!(meta?.format || meta?.graph_types || meta?.include || meta?.depth);\n}\n\n/**\n * Builds a Graph query with optional params from meta.\n */\nfunction buildGraphQuery<T>(client: Client, tableName: string, meta?: TaruviMeta, recordId?: string): Database<T> {\n let query = new Database(client).from<T>(tableName);\n\n if (recordId) query = query.get(recordId);\n if (meta?.format) query = query.format(meta.format);\n if (meta?.include) query = query.include(meta.include);\n if (meta?.depth) query = query.depth(meta.depth);\n if (meta?.graph_types) query = query.types(meta.graph_types);\n\n return query;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi database operations.\n */\nexport function dataProvider(client: Client): DataProvider {\n console.log(`Taruvi Refine Provider v${pkg.version} initialized`);\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getIdColumn = (meta?: TaruviMeta) => meta?.idColumnName ?? \"id\";\n const getTableName = (resource: string, meta?: TaruviMeta) => meta?.tableName ?? resource;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n let graphQuery = buildGraphQuery<TData>(client, tableName, taruviMeta);\n graphQuery = applyAllowedActions(graphQuery, taruviMeta);\n const response = await graphQuery.execute();\n const data = Array.isArray(response) ? response : (response as any)?.data ?? [];\n const total = (response as any)?.total ?? data.length;\n return { data: data as TData[], total };\n }\n\n let query = new Database(client).from(tableName);\n query = applyFilters(query, filters);\n query = applySorters(query, sorters);\n query = applyPagination(query, pagination);\n query = applyPopulate(query, taruviMeta);\n query = applyAggregations(query, taruviMeta);\n query = applySearchAndFields(query, taruviMeta);\n query = applyAllowedActions(query, taruviMeta);\n\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n const data = Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n return { data };\n }\n\n let query = new Database(client).from(tableName).get(String(id));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n getMany: async <TData extends BaseRecord = BaseRecord>(\n params: GetManyParams\n ): Promise<GetManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const data = await Promise.all(\n ids.map(async id => {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n return Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n })\n );\n return { data };\n }\n\n const idColumn = getIdColumn(taruviMeta);\n let query = new Database(client).from(tableName);\n query = query.filters(idColumn, \"in\", ids.map(String));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .create(variables as EdgeRequest[])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const db = new Database(client).from(tableName);\n const query = taruviMeta?.upsert\n ? db.upsert(variables as object)\n : db.create(variables as object);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateManyParams<TVariables>\n ): Promise<CreateManyResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n const data = await Promise.all(\n variables.map(async (vars) => {\n const response = await new Database(client)\n .from(tableName)\n .create(vars as object)\n .execute() as { data: TData };\n return response.data;\n })\n );\n\n return { data };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .get(String(id))\n .update(variables as EdgeRequest)\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const response = await new Database(client)\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as { data: TData };\n return { data: response.data };\n },\n\n updateMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateManyParams<TVariables>\n ): Promise<UpdateManyResponse<TData>> => {\n const { resource, ids, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const idColumn = getIdColumn(taruviMeta);\n\n const body = ids.map(id => ({ [idColumn]: id, ...(variables as object) }));\n const response = await new Database(client)\n .from(tableName)\n .bulkUpdate(body)\n .execute() as { data: TData[] };\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete([Number(id)])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n await new Database(client)\n .from(tableName)\n .delete(String(id))\n .execute();\n return { data: { id } as unknown as TData };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete(ids.map(Number))\n .execute() as { data: TData };\n return { data: [response.data] };\n }\n\n if (taruviMeta?.deleteByFilter && taruviMeta?.filters) {\n let query = new Database(client).from(tableName);\n query = applyFilters(query, taruviMeta.filters as CrudFilter[]);\n await query.deleteFiltered().execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n }\n\n await new Database(client)\n .from(tableName)\n .bulkDelete(ids.map(String))\n .execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let endpoint = `api/apps/${config.appSlug}/datatables/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n endpoint = `${endpoint}${endpoint.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(endpoint) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(endpoint, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(endpoint, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(endpoint, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(endpoint) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n getApiUrl: () => baseApiUrl,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n GetManyResponse,\n CreateParams,\n CreateResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, Storage } from \"@taruvi/sdk\";\nimport type { StorageFilters, StorageUploadBatchResponse } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport { convertRefineFilters, convertRefineSorters, convertRefinePagination } from \"./utils.js\";\n\n/**\n * Storage upload variables interface.\n */\nexport interface StorageUploadVariables {\n files: File[];\n paths?: string[];\n metadatas?: Record<string, unknown>[];\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi file storage operations.\n */\nexport function storageDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getBucketName = (resource: string, meta?: TaruviMeta) => meta?.bucketName ?? resource;\n\n const buildFilters = (params: {\n filters?: GetListParams[\"filters\"];\n sorters?: GetListParams[\"sorters\"];\n pagination?: GetListParams[\"pagination\"];\n meta?: TaruviMeta;\n }): StorageFilters => {\n const filters: StorageFilters = {\n ...convertRefineFilters(params.filters, { logicalEncoding: \"flatten\" }) as StorageFilters,\n ...convertRefinePagination(params.pagination),\n };\n\n const ordering = convertRefineSorters(params.sorters);\n if (ordering) filters.ordering = ordering;\n\n return filters;\n };\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const storageFilters = buildFilters({ filters, sorters, pagination, meta: taruviMeta });\n\n const response = await new Storage(client)\n .from(bucket)\n .filter(storageFilters)\n .execute() as TaruviListResponse<TData>;\n\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n if (taruviMeta?.metadata) {\n const response = await new Storage(client)\n .from(bucket)\n .metadata(String(path))\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const blob = await new Storage(client)\n .from(bucket)\n .download(String(path))\n .execute<Blob>();\n return { data: blob as unknown as TData };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n // Extract the first uploaded file object from the batch response\n const firstUploaded = response.data?.successful?.[0]?.object;\n return { data: (firstUploaded ?? response.data) as unknown as TData };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id: path, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n const response = await new Storage(client)\n .from(bucket)\n .update(String(path), variables as object)\n .execute() as { data: TData };\n\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete([String(path)])\n .execute();\n\n return { data: { id: path } as unknown as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async <TData extends BaseRecord = BaseRecord>(): Promise<GetManyResponse<TData>> => ({ data: [] }),\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n // Extract all uploaded file objects from the batch response\n const uploaded = response.data?.successful?.map(s => s.object) ?? [];\n return { data: (uploaded.length > 0 ? uploaded[0] : response.data) as unknown as TData };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete(ids.map(String))\n .execute();\n\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let fullUrl = `api/apps/${config.appSlug}/storage/buckets/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n fullUrl = `${fullUrl}${fullUrl.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(fullUrl) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(fullUrl, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(fullUrl, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(fullUrl, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(fullUrl) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n // Not applicable for file storage - files are replaced, not updated\n updateMany: undefined,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, App, Functions, Analytics, Secrets } from \"@taruvi/sdk\";\nimport type { RoleData } from \"@taruvi/sdk\";\n\n/**\n * Response type for roles list from the App service..\n */\ninterface RolesListResponse {\n data: RoleData[];\n total: number;\n}\n\n/**\n * Meta options for function execution via custom().\n */\nexport interface FunctionMeta {\n kind: \"function\";\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/**\n * Meta options for analytics query execution via custom().\n */\nexport interface AnalyticsMeta {\n kind: \"analytics\";\n}\n\nexport type AppCustomMeta = FunctionMeta | AnalyticsMeta;\n\n/**\n * Creates a Refine DataProvider for Taruvi App operations.\n *\n * Supported operations:\n * - getList(\"roles\"): Fetch app roles\n * - getList(\"secrets\"): Fetch secrets by keys (requires meta.keys)\n * - getOne(\"settings\"): Fetch app settings\n * - getOne(\"secrets\"): Fetch a single secret by key (id = secret key)\n * - custom(): Execute edge functions or analytics queries via meta.kind\n */\nexport function appDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n const analytics = new Analytics(client);\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, meta } = params;\n\n if (resource === \"roles\") {\n const app = new App(client);\n const response = await app.roles().execute() as RolesListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total ?? (Array.isArray(response) ? response.length : response.data?.length ?? 0),\n };\n }\n\n if (resource === \"secrets\") {\n const keys = meta?.keys as string[] | undefined;\n if (!keys || keys.length === 0) {\n throw new Error('secrets resource requires meta.keys array');\n }\n const secrets = new Secrets(client);\n const response = await secrets.list(keys, {\n app: meta?.app as string | undefined,\n includeMetadata: meta?.includeMetadata as boolean | undefined,\n }) as any;\n const raw = response.data || response;\n const data: TData[] = Array.isArray(raw)\n ? raw\n : Object.entries(raw).map(([key, value]) => ({ key, value }) as unknown as TData);\n return { data, total: data.length };\n }\n\n throw new Error(`Unknown app resource: ${resource}. Supported resources: roles, secrets`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n\n if (resource === \"settings\") {\n const app = new App(client);\n const response = await app.settings().execute() as { data: TData };\n\n return {\n data: response.data,\n };\n }\n\n if (resource === \"secrets\") {\n const secrets = new Secrets(client);\n const response = await secrets.get(String(id), {\n app: meta?.app as string | undefined,\n tags: meta?.tags as string[] | undefined,\n }).execute() as any;\n return { data: (response.data ?? response) as TData };\n }\n\n throw new Error(`Unknown app resource for getOne: ${resource}. Supported resources: settings, secrets`);\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url: slug, payload, meta } = params;\n const customMeta = meta as AppCustomMeta | undefined;\n\n if (customMeta?.kind === \"function\") {\n const response = await functions.execute<TData>(slug, {\n async: customMeta.async ?? false,\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n if (customMeta?.kind === \"analytics\") {\n const response = await analytics.execute<TData>(slug, {\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n throw new Error(\n 'Specify meta.kind as \"function\" or \"analytics\" for custom operations on the app provider.'\n );\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async () => { throw new Error(\"getMany is not supported for app resources\"); },\n create: async () => { throw new Error(\"create is not supported for app resources. Use useCustom with meta.kind\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for app resources\"); },\n update: async () => { throw new Error(\"update is not supported for app resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for app resources\"); },\n deleteOne: async () => { throw new Error(\"deleteOne is not supported for app resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for app resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CreateParams,\n CreateResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, User, Auth } from \"@taruvi/sdk\";\nimport type { UserData, UserCreateRequest, UserUpdateRequest } from \"@taruvi/sdk\";\n\n/**\n * Response type for users list from the User service.\n */\ninterface UsersListResponse {\n data: UserData[];\n total: number;\n}\n\n/**\n * Filter parameters for listing users.\n */\ninterface UserListFilters {\n search?: string;\n is_active?: boolean;\n is_staff?: boolean;\n is_superuser?: boolean;\n is_deleted?: boolean;\n roles?: string;\n ordering?: string;\n page?: number;\n page_size?: number;\n}\n\n/**\n * Builds UserListFilters from Refine's filters, sorters, and pagination.\n */\nfunction buildUserListFilters(\n filters?: CrudFilter[],\n sorters?: CrudSort[],\n pagination?: Pagination\n): UserListFilters {\n const result: UserListFilters = {};\n\n // Apply pagination\n if (pagination && pagination.mode !== \"off\") {\n if (pagination.currentPage) {\n result.page = pagination.currentPage;\n }\n if (pagination.pageSize) {\n result.page_size = pagination.pageSize;\n }\n }\n\n // Apply filters\n if (filters) {\n for (const filter of filters) {\n if (\"field\" in filter) {\n const field = filter.field as string;\n const value = filter.value;\n\n switch (field) {\n case \"search\":\n result.search = String(value);\n break;\n case \"is_active\":\n result.is_active = Boolean(value);\n break;\n case \"is_staff\":\n result.is_staff = Boolean(value);\n break;\n case \"is_superuser\":\n result.is_superuser = Boolean(value);\n break;\n case \"is_deleted\":\n result.is_deleted = Boolean(value);\n break;\n case \"roles\":\n result.roles = Array.isArray(value) ? value.join(\",\") : String(value);\n break;\n }\n }\n }\n }\n\n // Apply sorting (first sorter only, as API accepts single ordering)\n if (sorters && sorters.length > 0) {\n const sorter = sorters[0];\n result.ordering = sorter.order === \"desc\" ? `-${sorter.field}` : sorter.field;\n }\n\n return result;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi User operations.\n *\n * This provider is specialized for fetching user-level data.\n *\n * Supported resources:\n * - \"users\" (getList): Fetch list of users with filtering/pagination\n * - \"users\" (getOne): Fetch a specific user by username/id\n * - \"roles\" (getList): Fetch roles for a specific user (requires meta.username)\n *\n * @example\n * ```typescript\n * // Get list of users\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * pagination: { currentPage: 1, pageSize: 10 },\n * filters: [\n * { field: \"is_active\", operator: \"eq\", value: true },\n * { field: \"search\", operator: \"eq\", value: \"john\" },\n * ],\n * sorters: [{ field: \"username\", order: \"asc\" }],\n * });\n *\n * // Get a specific user by username\n * const { data } = useOne({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * id: \"john_doe\",\n * });\n *\n * // Get roles for a specific user\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"roles\",\n * meta: { username: \"john_doe\" },\n * });\n * ```\n */\nexport function userDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userFilters = buildUserListFilters(filters, sorters, pagination);\n const response = await user.list(userFilters as Parameters<typeof user.list>[0]) as UsersListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total,\n };\n }\n\n if (resource === \"roles\") {\n // Get roles for a specific user - requires meta.username\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"roles resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUser(username) as any;\n const roles = response.data?.roles || response.roles || [];\n\n return {\n data: roles as unknown as TData[],\n total: roles.length,\n };\n }\n\n if (resource === \"apps\") {\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"apps resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUserApps(username) as any;\n const apps = response.data || response;\n return {\n data: apps as TData[],\n total: Array.isArray(apps) ? apps.length : 0,\n };\n }\n\n throw new Error(`Unknown user resource for getList: ${resource}. Supported: users, roles, apps`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client)\n\n // Support \"me\" as a special ID to get current user via Auth\n if (String(id) === \"me\") {\n const auth = new Auth(client);\n const response = await auth.getCurrentUser();\n const data = response ? ((response as any).data ?? response) : null;\n return { data: data as unknown as TData };\n }\n\n const response = await user.getUser(String(id));\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for getOne: ${resource}. Supported: users`);\n },\n\n getApiUrl: () => baseApiUrl,\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userData = variables as unknown as UserCreateRequest;\n const response = await user.createUser(userData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for create: ${resource}. Supported resources: users`);\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n const updateData = variables as unknown as UserUpdateRequest;\n const response = await user.updateUser(username, updateData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for update: ${resource}. Supported resources: users`);\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n await user.deleteUser(username);\n\n return {\n data: {} as TData,\n };\n }\n\n throw new Error(`Unknown user resource for delete: ${resource}. Supported resources: users`);\n },\n\n // User resources - other operations not supported\n getMany: async () => { throw new Error(\"getMany is not supported for user resources\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for user resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for user resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for user resources\"); },\n custom: async () => { throw new Error(\"custom is not supported for user resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Functions } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for function execution.\n */\nexport interface FunctionMeta {\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"function\"` instead. */\nexport function functionsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n\n return {\n /**\n * Execute an edge function.\n *\n * @param resource - The function slug to execute\n * @param variables - Parameters to pass to the function\n * @param meta.async - Whether to execute asynchronously (default: false)\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n meta,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const functionMeta = meta as FunctionMeta | undefined;\n\n const response = await functions.execute<TData>(resource, {\n async: functionMeta?.async ?? false,\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Edge functions don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n\n // Edge functions don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n };\n}","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Analytics } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for analytics query execution.\n */\nexport interface AnalyticsMeta {\n /** Additional parameters to pass to the analytics query */\n params?: Record<string, unknown>;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"analytics\"` instead. */\nexport function analyticsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const analytics = new Analytics(client);\n\n return {\n /**\n * Execute an analytics query.\n *\n * @param resource - The query slug to execute\n * @param variables - Parameters to pass to the query\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const response = await analytics.execute<TData>(resource, {\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Analytics don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n\n // Analytics queries don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n };\n}","import type { AuthProvider } from \"@refinedev/core\";\nimport { Client, Auth } from \"@taruvi/sdk\";\n\n/**\n * Login params - supports both redirect flow and credentials flow\n */\nexport interface LoginParams {\n /** For redirect-based login - URL to redirect after successful login */\n callbackUrl?: string;\n /** For credentials-based login (if supported) */\n username?: string;\n password?: string;\n /** Whether to use redirect flow (default: true) */\n redirect?: boolean;\n}\n\n/**\n * Logout params\n */\nexport interface LogoutParams {\n /** URL to redirect after logout */\n callbackUrl?: string;\n}\n\n/**\n * Register/Signup params\n */\nexport interface RegisterParams {\n /** URL to redirect after successful signup */\n callbackUrl?: string;\n}\n\n// ============================================================================\n// Shared user cache — populated by getIdentity(), reused by getPermissions()\n// and accessControlProvider. Prevents multiple /users/me calls per page load.\n// ============================================================================\n\nexport let _cachedUser: Record<string, any> | null = null;\n\n\n/**\n * Creates a Refine AuthProvider for Taruvi authentication.\n *\n * Supports redirect-based authentication flow (Web UI Flow):\n * 1. User calls login() → Redirects to backend /accounts/login/\n * 2. User authenticates on backend\n * 3. Backend redirects back with tokens in URL hash\n * 4. Client extracts and stores tokens automatically\n */\nexport function authProvider(client: Client): AuthProvider {\n const auth = new Auth(client);\n\n return {\n login: async (params: LoginParams = {}) => {\n const { callbackUrl, redirect = true } = params;\n\n // Check if already authenticated first (prevents infinite redirect loop)\n\n // TODO: check if this is necessary\n if (auth.isUserAuthenticated()) {\n return {\n success: true,\n redirectTo: callbackUrl || \"/\",\n };\n }\n\n if (redirect) {\n // Redirect-based login flow\n auth.login(callbackUrl);\n\n // Return success since we're redirecting\n // The actual auth state will be checked after redirect\n return {\n success: true,\n };\n }\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Login failed. Please try again.\",\n },\n };\n },\n\n logout: async (params: LogoutParams = {}) => {\n const { callbackUrl } = params;\n\n _cachedUser = null;\n await auth.logout(callbackUrl);\n\n return {\n success: true,\n redirectTo: callbackUrl || \"/login\",\n };\n },\n\n check: async () => {\n if (!auth.isUserAuthenticated()) {\n return { authenticated: false, redirectTo: \"/login\" };\n }\n // Trust token locally — server-side validation happens\n // via onError when actual API calls fail with 401/403\n return { authenticated: true };\n },\n\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // 401 means session is invalid — tokens already cleared by SDK interceptor\n if (status === 401) {\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n // 403 means authenticated but forbidden — don't logout, just report the error\n if (status === 403) {\n return { error };\n }\n\n return { error };\n },\n\n register: async (params: RegisterParams = {}) => {\n const { callbackUrl } = params;\n\n // Redirect to signup page\n auth.signup(callbackUrl);\n\n return {\n success: true,\n };\n },\n\n getIdentity: async () => {\n const response = await auth.getCurrentUser();\n\n if (!response) {\n _cachedUser = null;\n return null;\n }\n\n const user = (response as any).data ?? response;\n _cachedUser = user;\n return user;\n },\n\n getPermissions: async () => {\n // Reuse cached user from getIdentity() to avoid a separate /users/me call.\n const user = _cachedUser;\n\n if (!user) {\n return null;\n }\n\n return {\n roles: user.roles || [],\n permissions: user.user_permissions || [],\n groups: user.groups || [],\n is_staff: user.is_staff || false,\n is_superuser: user.is_superuser || false,\n };\n },\n };\n}\n","import type { AccessControlProvider } from \"@refinedev/core\";\nimport { Auth, Client, Policy } from \"@taruvi/sdk\";\nimport DataLoader from \"dataloader\";\nimport { _cachedUser } from \"./authProvider\";\n\n/**\n * Permission check request for DataLoader batching\n */\ninterface PermissionCheck {\n resource: string;\n action: string;\n params?: Record<string, unknown>;\n}\n\ninterface PermissionResult {\n can: boolean;\n reason?: string;\n}\n\n/**\n * Creates a Refine AccessControlProvider using Cerbos via the Policy client.\n *\n * Uses DataLoader for request batching (multiple useCan calls → single API request)\n * and Refine's built-in TanStack Query for caching.\n *\n * @example\n * ```tsx\n * <Refine\n * authProvider={authProvider(client)}\n * accessControlProvider={accessControlProvider(client)}\n * />\n *\n *\n * ```\n */\nexport function accessControlProvider(\n client: Client,\n options?: { batchDelayMs?: number }\n): AccessControlProvider {\n const policy = new Policy(client);\n const auth = new Auth(client);\n const { batchDelayMs = 50 } = options ?? {};\n\n // DataLoader for batching only - TanStack Query handles caching\n const permissionLoader = new DataLoader<PermissionCheck, PermissionResult>(\n async (checks) => {\n // Reuse cached user from authProvider.getIdentity() — no extra /users/me call\n let currentUser = _cachedUser;\n\n if (!currentUser) {\n try {\n const response = await auth.getCurrentUser();\n currentUser = response ? ((response as any).data ?? response) : null;\n } catch {\n currentUser = null;\n }\n }\n\n if (!currentUser) {\n return checks.map(() => ({\n can: false,\n reason: \"User not authenticated\",\n }));\n }\n\n // Deduplicate and group by resource:recordId (needed because cache: false)\n const uniqueResources = new Map<string, {\n resource: string;\n recordId: string;\n attributes: Record<string, unknown>;\n actions: Set<string>;\n }>();\n\n for (const check of checks) {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n\n if (!uniqueResources.has(key)) {\n uniqueResources.set(key, {\n resource: check.resource,\n recordId,\n attributes: (check.params || {}) as Record<string, unknown>,\n actions: new Set(),\n });\n }\n uniqueResources.get(key)!.actions.add(check.action);\n }\n\n const uniqueEntries = Array.from(uniqueResources.values());\n\n // Build batch payload for Cerbos\n const batchPayload = uniqueEntries.map((entry) => ({\n resource: entry.resource,\n recordId: entry.recordId,\n attributes: entry.attributes,\n actions: Array.from(entry.actions),\n }));\n\n try {\n // Single SDK call for all permissions\n const result = await policy.checkResource(batchPayload) as {\n results?: Array<{ actions?: Record<string, string> }>;\n };\n\n // Build results lookup\n const resultsByResource = new Map<string, Record<string, string>>();\n result?.results?.forEach((r, index) => {\n const payload = batchPayload[index];\n const key = `${payload.resource}:${payload.recordId}`;\n resultsByResource.set(key, r.actions || {});\n });\n\n // Map results back to original checks order (DataLoader requirement)\n return checks.map((check) => {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n const actions = resultsByResource.get(key) || {};\n const allowed = actions[check.action] === \"EFFECT_ALLOW\";\n\n return {\n can: allowed,\n reason: allowed ? undefined : \"Permission denied by policy\",\n };\n });\n } catch (error) {\n console.error(\"Batch permission check failed:\", error);\n return checks.map(() => ({\n can: false,\n reason: error instanceof Error ? error.message : \"Permission check failed\",\n }));\n }\n },\n {\n batchScheduleFn: (callback) => setTimeout(callback, batchDelayMs),\n cache: false, // TanStack Query handles caching\n }\n );\n\n return {\n can: async ({ resource, action, params }) => {\n if (!resource) {\n return { can: false, reason: \"Resource not specified\" };\n }\n\n return permissionLoader.load({\n resource,\n action,\n params,\n });\n },\n\n options: {\n buttons: {\n enableAccessControl: true,\n hideIfUnauthorized: true,\n },\n queryOptions: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n },\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/filterTypes.ts","../src/utils.ts","../src/dataProvider.ts","../src/storageDataProvider.ts","../src/appDataProvider.ts","../src/userDataProvider.ts","../src/functionsDataProvider.ts","../src/analyticsDataProvider.ts","../src/authProvider.ts","../src/accessControlProvider.ts"],"names":["out","response","Functions","Analytics","Auth","isBrowser"],"mappings":";;;;;;AAAA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,cA+Db,CAAA;;;AC3DO,IAAM,mBAAA,GAAsB;AAAA;AAAA,EAEjC,EAAA,EAAI,EAAA;AAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA;AAAA,EAGJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA;AAAA,EAGL,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,YAAA,EAAc,cAAA;AAAA,EACd,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA;AAAA,EAEZ,SAAA,EAAW,UAAA;AAAA,EACX,UAAA,EAAY,WAAA;AAAA,EACZ,WAAA,EAAa,YAAA;AAAA,EACb,YAAA,EAAc,aAAA;AAAA,EACd,SAAA,EAAW,UAAA;AAAA,EACX,UAAA,EAAY,WAAA;AAAA;AAAA,EAGZ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA;AAAA,EAGN,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA;AAAA,EAGP,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA;AAAA,EAGV,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe,eAAA;AAAA,EACf,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA;AAAA,EAGX,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc,cAAA;AAAA,EACd,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,YAAA,EAAc,cAAA;AAAA;AAAA,EAGd,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ;AACV;AAMO,SAAS,kBAAkB,QAAA,EAAkD;AAClF,EAAA,OAAO,QAAA,IAAY,mBAAA;AACrB;AAGO,SAAS,qBAAqB,QAAA,EAAsC;AACzE,EAAA,IAAI,CAAC,iBAAA,CAAkB,QAAQ,CAAA,EAAG,OAAO,MAAA;AACzC,EAAA,OAAO,oBAAoB,QAAQ,CAAA;AACrC;AAmCO,SAAS,gBACd,OAAA,EACc;AACd,EAAA,OAAO,OAAA;AACT;;;AC7FA,IAAM,qBAAA,uBAA4B,GAAA,CAAY;AAAA,EAC5C,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAUD,SAAS,gBAAgB,MAAA,EAA6B;AACpD,EAAA,OACE,OAAO,MAAA,KAAW,QAAA,IAClB,WAAW,IAAA,IACX,UAAA,IAAc,WACb,MAAA,CAAO,QAAA,KAAa,KAAA,IAAS,MAAA,CAAO,aAAa,IAAA,CAAA,IAClD,OAAA,IAAW,UACX,KAAA,CAAM,OAAA,CAAS,OAA8B,KAAK,CAAA;AAEtD;AAEA,SAAS,cAAc,MAAA,EAA6B;AAClD,EAAA,OACE,OAAO,MAAA,KAAW,QAAA,IAClB,MAAA,KAAW,QACX,OAAA,IAAW,MAAA,IACX,UAAA,IAAc,MAAA,IACd,OAAQ,MAAA,CAA8B,KAAA,KAAU,QAAA,IAChD,OAAQ,OAAiC,QAAA,KAAa,QAAA;AAE1D;AAGO,SAAS,iBAAiB,OAAA,EAA+C;AAC9E,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,GAAG,OAAO,KAAA;AACpC,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,KAAM;AAC1B,IAAA,IAAI,CAAC,aAAA,CAAc,CAAC,CAAA,EAAG,OAAO,KAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,IACE,IAAA,CAAK,UAAU,MAAA,IACd,IAAA,CAAK,UAAU,IAAA,IAAQ,IAAA,CAAK,aAAa,MAAA,EAC1C;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACrC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;AAGO,SAAS,oBACd,OAAA,EAC8B;AAC9B,EAAA,OACE,OAAO,OAAA,KAAY,QAAA,IACnB,OAAA,KAAY,IAAA,IACZ,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IACtB,eAAA,CAAgB,OAAqB,CAAA;AAEzC;AAMO,SAAS,2BACd,OAAA,EAC+B;AAC/B,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,MAAA;AACtD,EAAA,IAAI,mBAAA,CAAoB,OAAO,CAAA,EAAG,OAAO,OAAA;AACzC,EAAA,IAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG,OAAO,OAAA;AACtC,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,OAAO,KAAK,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,MAAA;AAE5D,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,gBAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG;AACvD,IAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,EAClB;AAEA,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA,EAAG;AAChC,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,kBAAkB,OAAA,EAAiD;AACjF,EAAA,IAAI,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,EAAC;AAE9B,EAAA,MAAM,SAA2B,EAAC;AAElC,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAiC;AAC7C,IAAA,KAAA,MAAW,UAAU,KAAA,EAAO;AAC1B,MAAA,IAAI,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC3B,QAAA,IAAI,MAAA,CAAO,QAAA,KAAa,IAAA,EAAM,OAAO,KAAA;AACrC,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAqB,GAAG,OAAO,KAAA;AAChD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,aAAA,CAAc,MAAM,CAAA,EAAG,OAAO,KAAA;AAEnC,MAAA,MAAM,IAAA,GAAO,MAAA;AACb,MAAA,IACE,IAAA,CAAK,UAAU,MAAA,IACd,IAAA,CAAK,UAAU,IAAA,IAAQ,IAAA,CAAK,aAAa,MAAA,EAC1C;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACrC,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AACxD,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AAC3B,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,2BAA2B,QAAA,EAA0B;AACnE,EAAA,MAAM,MAAA,GAAS,qBAAqB,QAAQ,CAAA;AAC5C,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,QAAA;AACjC,EAAA,OAAO,MAAA,KAAW,KAAK,IAAA,GAAO,MAAA;AAChC;AAGO,SAAS,qBAAA,CAAsB,UAAkB,KAAA,EAAwB;AAC9E,EAAA,IAAI,qBAAA,CAAsB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACvC,IAAA,OAAO,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAI,MAAM,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,EAC9D;AACA,EAAA,IAAI,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,OAAA,EAAS;AAC/C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAAS,cAAA,CACP,KAAA,EACA,QAAA,EACA,KAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,KAAA,KAAU,MAAA,IAAc,KAAA,KAAU,IAAA,IAAQ,aAAa,MAAA,EAAS;AAClE,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,qBAAqB,QAAQ,CAAA;AAC5C,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAE,CAAA;AACnD,IAAA;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,SAAS,CAAA,EAAG,KAAK,KAAK,MAAM,CAAA,CAAA,GAAK,OAAO,KAAK,CAAA;AAC9D,EAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,qBAAA,CAAsB,QAAA,EAAU,KAAK,CAAA;AAC1D;AAGO,SAAS,uBAAA,CACd,MAAA,EACA,IAAA,EACA,GAAA,EACM;AACN,EAAA,IAAI,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC3B,IAAA,MAAM,KAAK,MAAA,CAAO,QAAA;AAClB,IAAA,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,UAAA,CAAY,CAAA,GAAI,EAAA;AAC3B,IAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AACxB,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAA,KAAM;AAC7B,MAAA,uBAAA,CAAwB,OAAO,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,CAAC,KAAK,GAAG,CAAA;AAAA,IAC5D,CAAC,CAAA;AACD,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,aAAA,CAAc,MAAM,CAAA,EAAG;AAC1B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,MAAA;AACb,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM,GAAI,IAAA;AACnC,EAAA,IAAI,KAAA,KAAU,MAAA,IAAc,KAAA,KAAU,IAAA,IAAQ,aAAa,MAAA,EAAS;AAClE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,qBAAqB,QAAQ,CAAA;AAC5C,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAE,CAAA;AACnD,IAAA;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS,CAAA,GAAI,KAAA;AACxB,EAAA,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,UAAA,CAAY,CAAA,GAAI,2BAA2B,QAAQ,CAAA;AAC9D,EAAA,GAAA,CAAI,GAAG,IAAI,CAAA,OAAA,CAAS,CAAA,GAAI,qBAAA,CAAsB,UAAU,KAAK,CAAA;AAC/D;AAEA,SAAS,qBAAqB,CAAA,EAAqD;AACjF,EAAA,OAAO,EAAE,OAAA,IAAW,CAAA,CAAA,KAAO,EAAE,QAAA,KAAa,KAAA,IAAS,EAAE,QAAA,KAAa,IAAA,CAAA;AACpE;AAEA,SAAS,aAAA,CAAc,UAAkB,KAAA,EAAyB;AAChE,EAAA,IAAI,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,OAAA,EAAS,OAAO,IAAA;AACxD,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,8BAA8B,MAAA,EAA8C;AACnF,EAAA,IAAI,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC3B,IAAA,MAAM,QAAA,GAAY,MAAA,CAAO,KAAA,CACtB,GAAA,CAAI,6BAA6B,EACjC,MAAA,CAAO,CAAC,CAAA,KAA8B,CAAA,KAAM,IAAI,CAAA;AACnD,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAClC,IAAA,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAA0B,OAAO,QAAA,EAAS;AAAA,EACtE;AAEA,EAAA,IAAI,aAAA,CAAc,MAAM,CAAA,EAAG;AACzB,IAAA,MAAM,IAAA,GAAO,MAAA;AACb,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,IAAc,IAAA,CAAK,UAAU,IAAA,IAAQ,IAAA,CAAK,aAAa,MAAA,EAAS;AACjF,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACrC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AACxD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,SAAA,GAAY,0BAAA,CAA2B,IAAA,CAAK,QAAQ,CAAA;AAC1D,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU,SAAA;AAAA,MACV,KAAA,EAAO,aAAA,CAAc,IAAA,CAAK,QAAA,EAAU,KAAK,KAAK;AAAA,KAChD;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AASO,SAAS,kCACd,OAAA,EAC8B;AAC9B,EAAA,IAAI,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,IAAA;AAE7B,EAAA,MAAM,KAAA,GAAQ,QACX,GAAA,CAAI,6BAA6B,EACjC,MAAA,CAAO,CAAC,CAAA,KAA8B,CAAA,KAAM,IAAI,CAAA;AACnD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,qBAAqB,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG;AACxD,IAAA,OAAO,CAAC,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAClB;AAEA,EAAA,OAAO,CAAC,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AAC3C;AAKO,SAAS,kCACd,MAAA,EAC8B;AAC9B,EAAA,MAAM,IAAA,GAAO,8BAA8B,MAAoB,CAAA;AAC/D,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,oBAAA,CAAqB,IAAI,GAAG,OAAO,IAAA;AACjD,EAAA,OAAO,CAAC,IAAI,CAAA;AACd;AAGO,SAAS,6BACd,MAAA,EACwB;AACxB,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,cAAA,CAAe,KAAK,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,8BACP,OAAA,EACwB;AACxB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,SAAU,EAAC;AAE9C,EAAA,MAAM,SAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC3B,MAAA,IAAI,OAAO,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC/C,QAAA,MAAM,MAAA,GAAS,6BAAA;AAAA,UACb,MAAA,CAAO;AAAA,SACT;AACA,QAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,MAC9B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,CAAc,MAAM,CAAA,EAAG;AACzB,MAAA,MAAM,IAAA,GAAO,MAAA;AACb,MAAA,cAAA,CAAe,KAAK,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,oBAAA,CACd,SACA,OAAA,EACwB;AACxB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,SAAU,EAAC;AAE9C,EAAA,IAAI,OAAA,EAAS,oBAAoB,SAAA,EAAW;AAC1C,IAAA,OAAO,8BAA8B,OAAO,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,eAAe,CAAA;AAE/C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,aAAA,CAAc,MAAM,CAAA,EAAG;AACzB,QAAA,MAAM,IAAA,GAAO,MAAA;AACb,QAAA,cAAA,CAAe,KAAK,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,MAC9D;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,gBAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG;AACvD,IAAA,MAAMA,OAA8B,EAAC;AACrC,IAAA,uBAAA,CAAwB,OAAA,CAAQ,CAAC,CAAA,EAAG,YAAA,EAAcA,IAAG,CAAA;AACrD,IAAA,OAAOA,IAAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,GAAA,CAAI,sBAAsB,CAAA,GAAI,KAAA;AAC9B,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,IAAA,uBAAA,CAAwB,CAAA,EAAG,CAAA,kBAAA,EAAqB,CAAC,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAAA,EAC3D,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,gCAAA,CACd,OACA,MAAA,EACa;AACb,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC/C,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,GAAA,EAAK,IAAA,EAAM,GAAG,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,qBAAqB,OAAA,EAA0C;AAC7E,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,MAAA;AAE7C,EAAA,OAAO,OAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAU,KAAK,KAAA,KAAU,MAAA,GAAS,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA,GAAK,IAAA,CAAK,KAAM,CAAA,CACrE,KAAK,GAAG,CAAA;AACb;AAKO,SAAS,wBACd,UAAA,EACuC;AACvC,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AAEzB,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,IAAA,EAAK,GAAI,UAAA;AAGxC,EAAA,IAAI,IAAA,KAAS,KAAA,EAAO,OAAO,EAAC;AAE5B,EAAA,OAAO;AAAA,IACL,MAAM,WAAA,IAAe,CAAA;AAAA;AAAA,IACrB,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,uBAAuB,OAAA,EAKX;AAC1B,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,MAAK,GAAI,OAAA;AAE/C,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,GAAG,qBAAqB,OAAO,CAAA;AAAA,IAC/B,GAAG,wBAAwB,UAAU;AAAA,GACvC;AAEA,EAAA,MAAM,QAAA,GAAW,qBAAqB,OAAO,CAAA;AAC7C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,EACpB;AAGA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAA,CAAO,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,GACzC,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GACtB,IAAA,CAAK,QAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,iBAAiB,MAAA,EAA0C;AACzE,EAAA,IAAI,CAAC,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,EAAA;AAExD,EAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AAEzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,MAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,aAAa,QAAA,EAAS;AAC1C,EAAA,OAAO,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,EAAA;AAC3C;AA4BO,SAAS,aAAa,MAAA,EAAiD;AAC5E,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,MAAA;AAE3C,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,UAAU,MAAA,EAAQ;AAE3B,IAAA,IAAI,OAAA,IAAW,MAAA,IAAU,MAAA,CAAO,KAAA,IAAS,OAAO,QAAA,EAAU;AACxD,MAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM,GAAI,MAAA;AAGnC,MAAA,IAAI,KAAA,KAAU,MAAA,IAAc,KAAA,KAAU,IAAA,IAAQ,aAAa,MAAA,EAAS;AAClE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,qBAAqB,QAAQ,CAAA;AAE5C,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mCAAA,EAAsC,QAAQ,CAAA,CAAE,CAAA;AAC7D,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAAW,SAAS,CAAA,EAAG,KAAK,KAAK,MAAM,CAAA,CAAA,GAAK,OAAO,KAAK,CAAA;AAE9D,MAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,QAAA,EAAU,KAAK,CAAA;AAExD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAChD;;;ACxgBA,SAAS,iBAAA,CAAqB,OAAoB,IAAA,EAAgC;AAChF,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAElB,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,IAAA,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,GAAG,IAAA,CAAK,SAAS,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAC1C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,GAAS,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAA,CACP,OACA,MAAA,EACa;AACb,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,MAAW,MAAA,EAAQ;AAC/C,IAAA,MAAM,SAAA,GAAY,2BAA2B,QAAQ,CAAA;AACrD,IAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,QAAA,EAAU,KAAK,CAAA;AACvD,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA;AAAA,MACd,KAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AASA,SAAS,YAAA,CACP,OACA,OAAA,EACa;AACb,EAAA,MAAM,UAAA,GAAa,2BAA2B,OAAO,CAAA;AACrD,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,IAAI,MAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChD,MAAA,MAAM,IAAA,GAAO,kCAAkC,OAAuB,CAAA;AACtE,MAAA,IAAI,IAAA,EAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,UAAU,CAAA,EAAG;AAChC,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACpC,IAAA,OAAO,mBAAA,CAAoB,OAAO,UAAU,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,mBAAA,CAAoB,UAAU,CAAA,EAAG;AACnC,IAAA,MAAM,IAAA,GAAO,kCAAkC,UAAU,CAAA;AACzD,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,IAAA,OAAO,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,YAAA,CACP,OACA,OAAA,EACa;AACb,EAAA,MAAM,QAAA,GAAW,qBAAqB,OAAO,CAAA;AAC7C,EAAA,OAAO,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,GAAI,KAAA;AAC3C;AAKA,SAAS,eAAA,CACP,OACA,UAAA,EACa;AACb,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,OAAO,OAAO,KAAA;AAErD,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,WAAW,WAAA,EAAa,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,WAAW,WAAW,CAAA;AACvE,EAAA,IAAI,WAAW,QAAA,EAAU,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,WAAW,QAAQ,CAAA;AACrE,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,aAAA,CACP,OACA,IAAA,EACa;AACb,EAAA,IAAI,CAAC,IAAA,EAAM,QAAA,EAAU,OAAO,KAAA;AAE5B,EAAA,MAAM,gBAAgB,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,IAC7C,IAAA,CAAK,QAAA,GACL,IAAA,CAAK,QAAA,CAAS,MAAM,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AAE9C,EAAA,OAAO,KAAA,CAAM,SAAS,aAAa,CAAA;AACrC;AAKA,SAAS,mBAAA,CAAuB,OAAoB,IAAA,EAAgC;AAClF,EAAA,IAAI,CAAC,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,OAAO,KAAA;AAC1C,EAAA,OAAO,KAAA,CAAM,cAAA,CAAe,IAAA,CAAK,cAAc,CAAA;AACjD;AAGA,SAAS,oBAAA,CAAwB,OAAoB,IAAA,EAAgC;AACnF,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAK;AACjC,EAAA,IAAI,MAAA,EAAQ,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AACzC,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,MAAM,SACJ,OAAO,MAAA,KAAW,QAAA,GACd,MAAA,CAAO,MAAK,GACZ,KAAA,CAAM,OAAA,CAAQ,MAAM,IAClB,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAC3B,EAAA;AACR,EAAA,IAAI,MAAA,EAAQ,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AACzC,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,aAAa,IAAA,EAA4B;AAChD,EAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,IAAU,MAAM,iBAAA,IAAqB,IAAA,EAAM,WAAW,IAAA,EAAM,KAAA,CAAA;AAC9E;AAKA,SAAS,eAAA,CAAmB,MAAA,EAAgB,SAAA,EAAmB,IAAA,EAAmB,QAAA,EAAgC;AAChH,EAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAQ,SAAS,CAAA;AAElD,EAAA,IAAI,QAAA,EAAU,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACxC,EAAA,IAAI,MAAM,MAAA,EAAQ,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,KAAK,MAAM,CAAA;AAClD,EAAA,IAAI,MAAM,OAAA,EAAS,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,OAAO,CAAA;AACrD,EAAA,IAAI,MAAM,KAAA,EAAO,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,KAAK,CAAA;AAC/C,EAAA,IAAI,MAAM,iBAAA,EAAmB,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,iBAAiB,CAAA;AAEvE,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,aAAa,MAAA,EAA8B;AACzD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,eAAA,CAAI,OAAO,CAAA,YAAA,CAAc,CAAA;AAChE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAE9D,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAsB,IAAA,EAAM,YAAA,IAAgB,IAAA;AACjE,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,EAAkB,IAAA,KAAsB,MAAM,SAAA,IAAa,QAAA;AAEjF,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,MAAK,GAAI,MAAA;AACzD,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,IAAI,UAAA,GAAa,eAAA,CAAuB,MAAA,EAAQ,SAAA,EAAW,UAAU,CAAA;AACrE,QAAA,UAAA,GAAa,mBAAA,CAAoB,YAAY,UAAU,CAAA;AACvD,QAAA,MAAMC,SAAAA,GAAW,MAAM,UAAA,CAAW,OAAA,EAAQ;AAC1C,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQA,SAAQ,IAAIA,SAAAA,GAAYA,SAAAA,EAAkB,QAAQ,EAAC;AAC9E,QAAA,MAAM,KAAA,GAASA,SAAAA,EAAkB,KAAA,IAAS,IAAA,CAAK,MAAA;AAC/C,QAAA,OAAO,EAAE,MAAuB,KAAA,EAAM;AAAA,MACxC;AAEA,MAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC/C,MAAA,KAAA,GAAQ,YAAA,CAAa,OAAO,OAAO,CAAA;AACnC,MAAA,KAAA,GAAQ,YAAA,CAAa,OAAO,OAAO,CAAA;AACnC,MAAA,KAAA,GAAQ,eAAA,CAAgB,OAAO,UAAU,CAAA;AACzC,MAAA,KAAA,GAAQ,aAAA,CAAc,OAAO,UAAU,CAAA;AACvC,MAAA,KAAA,GAAQ,iBAAA,CAAkB,OAAO,UAAU,CAAA;AAC3C,MAAA,KAAA,GAAQ,oBAAA,CAAqB,OAAO,UAAU,CAAA;AAC9C,MAAA,KAAA,GAAQ,mBAAA,CAAoB,OAAO,UAAU,CAAA;AAE7C,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACtD,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAK,GAAI,MAAA;AAC/B,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAMA,SAAAA,GAAW,MAAM,eAAA,CAAuB,MAAA,EAAQ,SAAA,EAAW,YAAY,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,OAAA,EAAQ;AACjG,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQA,SAAQ,CAAA,GAAIA,SAAAA,CAAS,CAAC,CAAA,GAAaA,SAAAA,EAAU,IAAA,GAAO,CAAC,CAAA,IAAKA,SAAAA;AACrF,QAAA,OAAO,EAAE,IAAA,EAAK;AAAA,MAChB;AAEA,MAAA,IAAI,KAAA,GAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC/D,MAAA,KAAA,GAAQ,aAAA,CAAc,OAAO,UAAU,CAAA;AACvC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAK,GAAI,MAAA;AAChC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,UACzB,GAAA,CAAI,GAAA,CAAI,OAAM,EAAA,KAAM;AAClB,YAAA,MAAMA,SAAAA,GAAW,MAAM,eAAA,CAAuB,MAAA,EAAQ,SAAA,EAAW,YAAY,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,OAAA,EAAQ;AACjG,YAAA,OAAO,KAAA,CAAM,OAAA,CAAQA,SAAQ,CAAA,GAAIA,SAAAA,CAAS,CAAC,CAAA,GAAaA,SAAAA,EAAU,IAAA,GAAO,CAAC,CAAA,IAAKA,SAAAA;AAAA,UACjF,CAAC;AAAA,SACH;AACA,QAAA,OAAO,EAAE,IAAA,EAAK;AAAA,MAChB;AAEA,MAAA,MAAM,QAAA,GAAW,YAAY,UAAU,CAAA;AACvC,MAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC/C,MAAA,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,EAAU,MAAM,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AACrD,MAAA,KAAA,GAAQ,aAAA,CAAc,OAAO,UAAU,CAAA;AACvC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAMA,SAAAA,GAAW,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,KAAA,EAAM,CACN,MAAA,CAAO,SAA0B,EACjC,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAMA,SAAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,KAAK,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,YAAY,MAAA,GACtB,EAAA,CAAG,OAAO,SAAmB,CAAA,GAC7B,EAAA,CAAG,MAAA,CAAO,SAAmB,CAAA;AACjC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,QACzB,SAAA,CAAU,GAAA,CAAI,OAAO,IAAA,KAAS;AAC5B,UAAA,MAAM,QAAA,GAAW,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,IAAc,CAAA,CACrB,OAAA,EAAQ;AACX,UAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QAClB,CAAC;AAAA,OACH;AAEA,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,MAAK,GAAI,MAAA;AAC1C,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAMA,YAAW,MAAM,IAAI,SAAS,MAAM,CAAA,CACvC,KAAK,SAAS,CAAA,CACd,OAAM,CACN,GAAA,CAAI,OAAO,EAAE,CAAC,EACd,MAAA,CAAO,SAAwB,EAC/B,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAMA,SAAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,WAAW,MAAM,IAAI,QAAA,CAAS,MAAM,EACvC,IAAA,CAAK,SAAS,CAAA,CACd,GAAA,CAAI,OAAO,EAAE,CAAC,EACd,MAAA,CAAO,SAAmB,EAC1B,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,SAAA,EAAW,MAAK,GAAI,MAAA;AAC3C,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AACnD,MAAA,MAAM,QAAA,GAAW,YAAY,UAAU,CAAA;AAEvC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,CAAA,EAAA,MAAO,EAAE,CAAC,QAAQ,GAAG,EAAA,EAAI,GAAI,SAAA,EAAqB,CAAE,CAAA;AACzE,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,UAAA,CAAW,IAAI,CAAA,CACf,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,SAAA,EAAW,OACT,MAAA,KACsC;AACtC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAK,GAAI,MAAA;AAC/B,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAM,WAAW,MAAM,IAAI,SAAS,MAAM,CAAA,CACvC,KAAK,SAAS,CAAA,CACd,KAAA,EAAM,CACN,OAAO,CAAC,MAAA,CAAO,EAAE,CAAC,CAAC,EACnB,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACtB,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA,CACjB,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,IAAA,EAAM,EAAE,EAAA,EAAG,EAAsB;AAAA,IAC5C,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAK,GAAI,MAAA;AAChC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAM,WAAW,MAAM,IAAI,QAAA,CAAS,MAAM,EACvC,IAAA,CAAK,SAAS,CAAA,CACd,KAAA,GACA,MAAA,CAAO,GAAA,CAAI,IAAI,MAAM,CAAC,EACtB,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAM,CAAC,QAAA,CAAS,IAAI,CAAA,EAAE;AAAA,MACjC;AAEA,MAAA,IAAI,UAAA,EAAY,cAAA,IAAkB,UAAA,EAAY,OAAA,EAAS;AACrD,QAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC/C,QAAA,KAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,UAAA,CAAW,OAAuB,CAAA;AAC9D,QAAA,MAAM,KAAA,CAAM,cAAA,EAAe,CAAE,OAAA,EAAQ;AACrC,QAAA,OAAO,EAAE,MAAM,GAAA,CAAI,GAAA,CAAI,SAAO,EAAE,EAAA,GAAyB,CAAA,EAAE;AAAA,MAC7D;AAEA,MAAA,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACtB,IAAA,CAAK,SAAS,CAAA,CACd,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,EAC1B,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,MAAM,GAAA,CAAI,GAAA,CAAI,SAAO,EAAE,EAAA,GAAyB,CAAA,EAAE;AAAA,IAC7D,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,OAAM,GAAI,MAAA;AACxC,MAAA,IAAI,QAAA,GAAW,CAAA,SAAA,EAAY,MAAA,CAAO,OAAO,eAAe,GAAG,CAAA,CAAA;AAE3D,MAAA,IAAI,IAAA;AACJ,MAAA,QAAQ,MAAA,CAAO,aAAY;AAAG,QAC5B,KAAK,KAAA,EAAO;AACV,UAAA,IAAI,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,YAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB,KAA+B,EAAE,QAAA,EAAS;AAClF,YAAA,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,EAAG,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAG,WAAW,CAAA,CAAA;AAAA,UAC3E;AACA,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AAC3C,UAAA;AAAA,QACF;AAAA,QACA,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,UAAU,OAAO,CAAA;AACrD,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,UAAU,OAAO,CAAA;AACpD,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,UAAU,OAAO,CAAA;AACtD,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AAC9C,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAE,CAAA;AAAA;AAGxD,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA,IAEA,WAAW,MAAM;AAAA,GACnB;AACF;AC5aO,SAAS,oBAAoB,MAAA,EAA8B;AAChE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAE9D,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAkB,IAAA,KAAsB,MAAM,UAAA,IAAc,QAAA;AAEnF,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAKA;AACpB,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,GAAG,oBAAA,CAAqB,MAAA,CAAO,SAAS,EAAE,eAAA,EAAiB,WAAW,CAAA;AAAA,MACtE,GAAG,uBAAA,CAAwB,MAAA,CAAO,UAAU;AAAA,KAC9C;AAEA,IAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,MAAA,CAAO,OAAO,CAAA;AACpD,IAAA,IAAI,QAAA,UAAkB,QAAA,GAAW,QAAA;AAEjC,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,MAAK,GAAI,MAAA;AACzD,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AACjD,MAAA,MAAM,cAAA,GAAiB,aAAa,EAAE,OAAA,EAAS,SAAS,UAA6B,CAAC,CAAA;AAEtF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACtC,IAAA,CAAK,MAAM,CAAA,CACX,MAAA,CAAO,cAAc,CAAA,CACrB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACtD,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,MAAK,GAAI,MAAA;AACrC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,IAAI,YAAY,QAAA,EAAU;AACxB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACtC,IAAA,CAAK,MAAM,CAAA,CACX,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,EACrB,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CAClC,IAAA,CAAK,MAAM,CAAA,CACX,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,EACrB,OAAA,EAAc;AACjB,MAAA,OAAO,EAAE,MAAM,IAAA,EAAyB;AAAA,IAC1C,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AACjD,MAAA,MAAM,EAAE,OAAO,KAAA,GAAQ,IAAI,SAAA,GAAY,IAAG,GAAI,SAAA;AAE9C,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,MAAM,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA;AAC9D,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,SAAA,CAAU,CAAC,CAAA,IAAK,EAAE,CAAA;AAE5D,MAAA,MAAM,WAAW,MAAM,IAAI,QAAQ,MAAM,CAAA,CACtC,KAAK,MAAM,CAAA,CACX,MAAA,CAAO,EAAE,OAAO,KAAA,EAAO,SAAA,EAAW,WAAW,aAAA,EAAe,EAC5D,OAAA,EAAQ;AAGX,MAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,IAAA,EAAM,UAAA,GAAa,CAAC,CAAA,EAAG,MAAA;AACtD,MAAA,OAAO,EAAE,IAAA,EAAO,aAAA,IAAiB,QAAA,CAAS,IAAA,EAA0B;AAAA,IACtE,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,SAAA,EAAW,MAAK,GAAI,MAAA;AAChD,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACtC,IAAA,CAAK,MAAM,CAAA,CACX,OAAO,MAAA,CAAO,IAAI,CAAA,EAAG,SAAmB,EACxC,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,SAAA,EAAW,OACT,MAAA,KACsC;AACtC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,MAAK,GAAI,MAAA;AACrC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACrB,KAAK,MAAM,CAAA,CACX,MAAA,CAAO,CAAC,MAAA,CAAO,IAAI,CAAC,CAAC,EACrB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAM,EAAE,EAAA,EAAI,MAAK,EAAsB;AAAA,IAClD,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA,IAEjB,SAAS,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAAG,CAAA;AAAA,IAE1F,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AACjD,MAAA,MAAM,EAAE,OAAO,KAAA,GAAQ,IAAI,SAAA,GAAY,IAAG,GAAI,SAAA;AAE9C,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,MAAM,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA;AAC9D,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,SAAA,CAAU,CAAC,CAAA,IAAK,EAAE,CAAA;AAE5D,MAAA,MAAM,WAAW,MAAM,IAAI,QAAQ,MAAM,CAAA,CACtC,KAAK,MAAM,CAAA,CACX,MAAA,CAAO,EAAE,OAAO,KAAA,EAAO,SAAA,EAAW,WAAW,aAAA,EAAe,EAC5D,OAAA,EAAQ;AAEX,MAAA,MAAM,QAAA,GAAW,SAAS,IAAA,EAAM,UAAA,EAAY,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA,IAAK,EAAC;AACnE,MAAA,OAAO,EAAE,MAAO,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,CAAC,QAAA,CAAS,IAAI,CAAA,EAAyB;AAAA,IAC1F,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAK,GAAI,MAAA;AAChC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACrB,IAAA,CAAK,MAAM,CAAA,CACX,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,EACtB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,MAAM,GAAA,CAAI,GAAA,CAAI,SAAO,EAAE,EAAA,GAAyB,CAAA,EAAE;AAAA,IAC7D,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,OAAM,GAAI,MAAA;AACxC,MAAA,IAAI,OAAA,GAAU,CAAA,SAAA,EAAY,MAAA,CAAO,OAAO,oBAAoB,GAAG,CAAA,CAAA;AAE/D,MAAA,IAAI,IAAA;AACJ,MAAA,QAAQ,MAAA,CAAO,aAAY;AAAG,QAC5B,KAAK,KAAA,EAAO;AACV,UAAA,IAAI,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,YAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB,KAA+B,EAAE,QAAA,EAAS;AAClF,YAAA,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,EAAG,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAG,WAAW,CAAA,CAAA;AAAA,UACxE;AACA,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAC1C,UAAA;AAAA,QACF;AAAA,QACA,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,SAAS,OAAO,CAAA;AACpD,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,SAAS,OAAO,CAAA;AACnD,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,SAAS,OAAO,CAAA;AACrD,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAC7C,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAE,CAAA;AAAA;AAGxD,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA;AAAA,IAGA,UAAA,EAAY;AAAA,GACd;AACF;AClLO,SAAS,gBAAgB,MAAA,EAA8B;AAC5D,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,MAAM,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,MAAM,CAAA;AAEtC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,MAAA;AAE3B,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAM,CAAA;AAC1B,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,KAAA,GAAQ,OAAA,EAAQ;AAE3C,QAAA,OAAO;AAAA,UACL,IAAA,EAAO,SAAS,IAAA,IAAQ,QAAA;AAAA,UACxB,KAAA,EAAO,QAAA,CAAS,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,MAAA,IAAU,CAAA;AAAA,SACjG;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,MAAM,OAAO,IAAA,EAAM,IAAA;AACnB,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,UAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,QAC7D;AACA,QAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,MAAM,CAAA;AAClC,QAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM;AAAA,UACxC,KAAK,IAAA,EAAM,GAAA;AAAA,UACX,iBAAiB,IAAA,EAAM;AAAA,SACxB,CAAA;AACD,QAAA,MAAM,GAAA,GAAM,SAAS,IAAA,IAAQ,QAAA;AAC7B,QAAA,MAAM,OAAgB,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GACnC,GAAA,GACA,OAAO,OAAA,CAAQ,GAAG,EAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,OAAO,EAAE,GAAA,EAAK,OAAM,CAAsB,CAAA;AAClF,QAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,MAAA,EAAO;AAAA,MACpC;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,qCAAA,CAAuC,CAAA;AAAA,IAC1F,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAK,GAAI,MAAA;AAE/B,MAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAM,CAAA;AAC1B,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,QAAA,GAAW,OAAA,EAAQ;AAE9C,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,MAAM,CAAA;AAClC,QAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAG;AAAA,UAC7C,KAAK,IAAA,EAAM,GAAA;AAAA,UACX,MAAM,IAAA,EAAM;AAAA,SACb,EAAE,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAO,QAAA,CAAS,IAAA,IAAQ,QAAA,EAAmB;AAAA,MACtD;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,QAAQ,CAAA,wCAAA,CAA0C,CAAA;AAAA,IACxG,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,MAAK,GAAI,MAAA;AACrC,MAAA,MAAM,UAAA,GAAa,IAAA;AAEnB,MAAA,IAAI,UAAA,EAAY,SAAS,UAAA,EAAY;AACnC,QAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,IAAA,EAAM;AAAA,UACpD,KAAA,EAAO,WAAW,KAAA,IAAS,KAAA;AAAA,UAC3B,MAAA,EAAS,WAAW;AAAC,SACtB,CAAA;AACD,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,MACxC;AAEA,MAAA,IAAI,UAAA,EAAY,SAAS,WAAA,EAAa;AACpC,QAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,IAAA,EAAM;AAAA,UACpD,MAAA,EAAS,WAAW;AAAC,SACtB,CAAA;AACD,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,MACxC;AAEA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA,IAEjB,SAAS,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAAG,CAAA;AAAA,IACtF,QAAQ,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,yEAAyE,CAAA;AAAA,IAAG,CAAA;AAAA,IAClH,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IAAG,CAAA;AAAA,IAC5F,QAAQ,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAAG,CAAA;AAAA,IACpF,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IAAG,CAAA;AAAA,IAC5F,WAAW,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAAG,CAAA;AAAA,IAC1F,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IAAG;AAAA,GAC9F;AACF;AC3GA,SAAS,oBAAA,CACP,OAAA,EACA,OAAA,EACA,UAAA,EACiB;AACjB,EAAA,MAAM,SAA0B,EAAC;AAGjC,EAAA,IAAI,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,KAAA,EAAO;AAC3C,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,MAAA,CAAO,OAAO,UAAA,CAAW,WAAA;AAAA,IAC3B;AACA,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,MAAA,CAAO,YAAY,UAAA,CAAW,QAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,QAAA,QAAQ,KAAA;AAAO,UACb,KAAK,QAAA;AACH,YAAA,MAAA,CAAO,MAAA,GAAS,OAAO,KAAK,CAAA;AAC5B,YAAA;AAAA,UACF,KAAK,WAAA;AACH,YAAA,MAAA,CAAO,SAAA,GAAY,QAAQ,KAAK,CAAA;AAChC,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,MAAA,CAAO,QAAA,GAAW,QAAQ,KAAK,CAAA;AAC/B,YAAA;AAAA,UACF,KAAK,cAAA;AACH,YAAA,MAAA,CAAO,YAAA,GAAe,QAAQ,KAAK,CAAA;AACnC,YAAA;AAAA,UACF,KAAK,YAAA;AACH,YAAA,MAAA,CAAO,UAAA,GAAa,QAAQ,KAAK,CAAA;AACjC,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAA,CAAO,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAM,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AACpE,YAAA;AAAA;AACJ,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,IAAA,MAAA,CAAO,QAAA,GAAW,OAAO,KAAA,KAAU,MAAA,GAAS,IAAI,MAAA,CAAO,KAAK,KAAK,MAAA,CAAO,KAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,MAAA;AACT;AAyCO,SAAS,iBAAiB,MAAA,EAA8B;AAC7D,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAE9D,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,MAAK,GAAI,MAAA;AAEzD,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AACrE,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,WAA8C,CAAA;AAE/E,QAAA,OAAO;AAAA,UACL,IAAA,EAAO,SAAS,IAAA,IAAQ,QAAA;AAAA,UACxB,OAAO,QAAA,CAAS;AAAA,SAClB;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,OAAA,EAAS;AAExB,QAAA,MAAM,WAAW,IAAA,EAAM,QAAA;AACvB,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,QACzD;AACA,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAC5C,QAAA,MAAM,QAAQ,QAAA,CAAS,IAAA,EAAM,KAAA,IAAS,QAAA,CAAS,SAAS,EAAC;AAEzD,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,OAAO,KAAA,CAAM;AAAA,SACf;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,QAAA,MAAM,WAAW,IAAA,EAAM,QAAA;AACvB,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,QACxD;AACA,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAChD,QAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,QAAA;AAC9B,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,IAAA;AAAA,UACN,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAK,MAAA,GAAS;AAAA,SAC7C;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,QAAQ,CAAA,+BAAA,CAAiC,CAAA;AAAA,IACjG,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAG,GAAI,MAAA;AAEzB,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAG5B,QAAA,IAAI,MAAA,CAAO,EAAE,CAAA,KAAM,IAAA,EAAM;AACvB,UAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,UAAA,MAAMA,SAAAA,GAAW,MAAM,IAAA,CAAK,cAAA,EAAe;AAC3C,UAAA,MAAM,IAAA,GAAOA,SAAAA,GAAaA,SAAAA,CAAiB,IAAA,IAAQA,SAAAA,GAAY,IAAA;AAC/D,UAAA,OAAO,EAAE,IAAA,EAA+B;AAAA,QAC1C;AAEA,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAC,CAAA;AAE9C,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,kBAAA,CAAoB,CAAA;AAAA,IACnF,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA,IAEjB,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,MAAA;AAEhC,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,SAAA;AACjB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAE/C,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,4BAAA,CAA8B,CAAA;AAAA,IAC7F,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,SAAA,EAAU,GAAI,MAAA;AAEpC,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,OAAO,EAAE,CAAA;AAC1B,QAAA,MAAM,UAAA,GAAa,SAAA;AACnB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,UAAU,UAAU,CAAA;AAE3D,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,4BAAA,CAA8B,CAAA;AAAA,IAC7F,CAAA;AAAA,IAEA,SAAA,EAAW,OACT,MAAA,KACsC;AACtC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAG,GAAI,MAAA;AAEzB,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,OAAO,EAAE,CAAA;AAC1B,QAAA,MAAM,IAAA,CAAK,WAAW,QAAQ,CAAA;AAE9B,QAAA,OAAO;AAAA,UACL,MAAM;AAAC,SACT;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,4BAAA,CAA8B,CAAA;AAAA,IAC7F,CAAA;AAAA;AAAA,IAGA,SAAS,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAAG,CAAA;AAAA,IACvF,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAAG,CAAA;AAAA,IAC7F,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAAG,CAAA;AAAA,IAC7F,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAAG,CAAA;AAAA,IAC7F,QAAQ,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAAG;AAAA,GACvF;AACF;AC7QO,SAAS,sBAAsB,MAAA,EAA8B;AAClE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAIC,SAAAA,CAAU,MAAM,CAAA;AAEtC,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQL,QAAQ,OAA+D;AAAA,MACrE,QAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF,KAAgE;AAC9D,MAAA,MAAM,YAAA,GAAe,IAAA;AAErB,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,QAAA,EAAU;AAAA,QACxD,KAAA,EAAO,cAAc,KAAA,IAAS,KAAA;AAAA,QAC9B,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,IACxC,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA;AAAA,IAGjB,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,WAAW,YAAY;AACrB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AC/EO,SAAS,sBAAsB,MAAA,EAA8B;AAClE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAIC,SAAAA,CAAU,MAAM,CAAA;AAEtC,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOL,QAAQ,OAA+D;AAAA,MACrE,QAAA;AAAA,MACA;AAAA,KACF,KAAgE;AAC9D,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,QAAA,EAAU;AAAA,QACxD,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,IACxC,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA;AAAA,IAGjB,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,WAAW,YAAY;AACrB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;ACrDA,IAAM,SAAA,GAAY,OAAO,MAAA,KAAW,WAAA;AAE7B,IAAI,WAAA,GAA0C;AAY9C,SAAS,aAAa,MAAA,EAA8B;AACzD,EAAA,MAAM,IAAA,GAAO,IAAIC,IAAAA,CAAK,MAAM,CAAA;AAE5B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,GAAsB,EAAC,KAAM;AACzC,MAAA,MAAM,EAAE,WAAA,EAAa,QAAA,GAAW,IAAA,EAAK,GAAI,MAAA;AAKzC,MAAA,IAAI,IAAA,CAAK,qBAAoB,EAAG;AAC9B,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,YAAY,WAAA,IAAe;AAAA,SAC7B;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,IAAA,CAAK,MAAM,WAAW,CAAA;AAItB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,YAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAA,EAAQ,OAAO,MAAA,GAAuB,EAAC,KAAM;AAC3C,MAAA,MAAM,EAAE,aAAY,GAAI,MAAA;AAExB,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,MAAM,IAAA,CAAK,OAAO,WAAW,CAAA;AAE7B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,YAAY,WAAA,IAAe;AAAA,OAC7B;AAAA,IACF,CAAA;AAAA,IAEA,OAAO,YAAY;AACjB,MAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,EAAoB,EAAG;AAC/B,QAAA,OAAO,EAAE,aAAA,EAAe,KAAA,EAAO,UAAA,EAAY,QAAA,EAAS;AAAA,MACtD;AAGA,MAAA,OAAO,EAAE,eAAe,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,OAAA,EAAS,OAAO,KAAA,KAAU;AACxB,MAAA,MAAM,SAAS,KAAA,EAAO,UAAA,IAAc,KAAA,EAAO,MAAA,IAAU,OAAO,QAAA,EAAU,MAAA;AAGtE,MAAA,IAAI,WAAW,GAAA,EAAK;AAClB,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,IAAA;AAAA,UACR,UAAA,EAAY,QAAA;AAAA,UACZ;AAAA,SACF;AAAA,MACF;AAGA,MAAA,IAAI,WAAW,GAAA,EAAK;AAClB,QAAA,OAAO,EAAE,KAAA,EAAM;AAAA,MACjB;AAEA,MAAA,OAAO,EAAE,KAAA,EAAM;AAAA,IACjB,CAAA;AAAA,IAEA,QAAA,EAAU,OAAO,MAAA,GAAyB,EAAC,KAAM;AAC/C,MAAA,MAAM,EAAE,aAAY,GAAI,MAAA;AAGxB,MAAA,IAAA,CAAK,OAAO,WAAW,CAAA;AAEvB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA;AAAA,IAEA,aAAa,YAAY;AACvB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,EAAe;AAE3C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,WAAA,GAAc,IAAA;AACd,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAQ,SAAiB,IAAA,IAAQ,QAAA;AACvC,MAAA,IAAI,WAAW,WAAA,GAAc,IAAA;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IAEA,gBAAgB,YAAY;AAG1B,MAAA,IAAI,IAAA,GAAO,YAAY,WAAA,GAAc,IAAA;AAErC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,EAAe;AAC3C,QAAA,IAAA,GAAO,QAAA,GAAa,QAAA,CAAiB,IAAA,IAAQ,QAAA,GAAY,IAAA;AAAA,MAC3D;AAEA,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,QACtB,WAAA,EAAa,IAAA,CAAK,gBAAA,IAAoB,EAAC;AAAA,QACvC,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,EAAC;AAAA,QACxB,QAAA,EAAU,KAAK,QAAA,IAAY,KAAA;AAAA,QAC3B,YAAA,EAAc,KAAK,YAAA,IAAgB;AAAA,OACrC;AAAA,IACF;AAAA,GACF;AACF;AC5KA,IAAMC,UAAAA,GAAY,OAAO,MAAA,KAAW,WAAA;AAgC7B,SAAS,qBAAA,CACd,QACA,OAAA,EACuB;AACvB,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,MAAM,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,IAAID,IAAAA,CAAK,MAAM,CAAA;AAC5B,EAAA,MAAM,EAAE,YAAA,GAAe,EAAA,EAAG,GAAI,WAAW,EAAC;AAG1C,EAAA,MAAM,mBAAmB,IAAI,UAAA;AAAA,IAC3B,OAAO,MAAA,KAAW;AAGhB,MAAA,IAAI,WAAA,GAAcC,aAAY,WAAA,GAAc,IAAA;AAE5C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,EAAe;AAC3C,UAAA,WAAA,GAAc,QAAA,GAAa,QAAA,CAAiB,IAAA,IAAQ,QAAA,GAAY,IAAA;AAAA,QAClE,CAAA,CAAA,MAAQ;AACN,UAAA,WAAA,GAAc,IAAA;AAAA,QAChB;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,MAAA,CAAO,IAAI,OAAO;AAAA,UACvB,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ;AAAA,SACV,CAAE,CAAA;AAAA,MACJ;AAGA,MAAA,MAAM,eAAA,uBAAsB,GAAA,EAKzB;AAEH,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,EAAQ,EAAA,GAAK,OAAO,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,GAAI,GAAA;AAC9D,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,QAAQ,IAAI,QAAQ,CAAA,CAAA;AAEzC,QAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,UAAA,eAAA,CAAgB,IAAI,GAAA,EAAK;AAAA,YACvB,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,QAAA;AAAA,YACA,UAAA,EAAa,KAAA,CAAM,MAAA,IAAU,EAAC;AAAA,YAC9B,OAAA,sBAAa,GAAA;AAAI,WAClB,CAAA;AAAA,QACH;AACA,QAAA,eAAA,CAAgB,IAAI,GAAG,CAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,MAAM,MAAM,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAGzD,MAAA,MAAM,YAAA,GAAe,aAAA,CAAc,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACjD,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAO;AAAA,OACnC,CAAE,CAAA;AAEF,MAAA,IAAI;AAEF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,aAAA,CAAc,YAAY,CAAA;AAKtD,QAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoC;AAClE,QAAA,MAAA,EAAQ,OAAA,EAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,KAAU;AACrC,UAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,UAAA,MAAM,MAAM,CAAA,EAAG,OAAA,CAAQ,QAAQ,CAAA,CAAA,EAAI,QAAQ,QAAQ,CAAA,CAAA;AACnD,UAAA,iBAAA,CAAkB,GAAA,CAAI,GAAA,EAAK,CAAA,CAAE,OAAA,IAAW,EAAE,CAAA;AAAA,QAC5C,CAAC,CAAA;AAGD,QAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AAC3B,UAAA,MAAM,QAAA,GAAW,MAAM,MAAA,EAAQ,EAAA,GAAK,OAAO,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,GAAI,GAAA;AAC9D,UAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,QAAQ,IAAI,QAAQ,CAAA,CAAA;AACzC,UAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,GAAA,CAAI,GAAG,KAAK,EAAC;AAC/C,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,KAAM,cAAA;AAE1C,UAAA,OAAO;AAAA,YACL,GAAA,EAAK,OAAA;AAAA,YACL,MAAA,EAAQ,UAAU,KAAA,CAAA,GAAY;AAAA,WAChC;AAAA,QACF,CAAC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,QAAA,OAAO,MAAA,CAAO,IAAI,OAAO;AAAA,UACvB,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SACnD,CAAE,CAAA;AAAA,MACJ;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,eAAA,EAAiB,CAAC,QAAA,KAAa,UAAA,CAAW,UAAU,YAAY,CAAA;AAAA,MAChE,KAAA,EAAO;AAAA;AAAA;AACT,GACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAO,KAAM;AAC3C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,wBAAA,EAAyB;AAAA,MACxD;AAEA,MAAA,OAAO,iBAAiB,IAAA,CAAK;AAAA,QAC3B,QAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,OAAA,EAAS;AAAA,MACP,OAAA,EAAS;AAAA,QACP,mBAAA,EAAqB,IAAA;AAAA,QACrB,kBAAA,EAAoB;AAAA,OACtB;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,QACpB,MAAA,EAAQ,KAAK,EAAA,GAAK;AAAA;AAAA;AACpB;AACF,GACF;AACF","file":"index.js","sourcesContent":["{\n \"name\": \"@taruvi/refine-providers\",\n \"version\": \"1.3.4-beta.4\",\n \"description\": \"Refine.dev data provider for Taruvi Data Service\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"peerDependencies\": {\n \"@refinedev/core\": \"^5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@refinedev/core\": {\n \"optional\": false\n }\n },\n \"devDependencies\": {\n \"@refinedev/core\": \"^5.0.0\",\n \"@types/node\": \"^20.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^4.0.18\"\n },\n \"keywords\": [\n \"refine\",\n \"refinedev\",\n \"data-provider\",\n \"taruvi\",\n \"react\",\n \"crud\"\n ],\n \"author\": \"EOX Vantage\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Taruvi-ai/taruvi-refine-providers.git\",\n \"directory\": \"packages/refine\"\n },\n \"dependencies\": {\n \"@taruvi/sdk\": \"beta\",\n \"dataloader\": \"^2.2.3\"\n }\n}\n","import type { CrudFilter } from \"@refinedev/core\";\n\n/**\n * Maps Refine / Taruvi filter operators to Taruvi DRF-style query parameter suffixes.\n * Example: { field: \"age\", operator: \"gte\", value: 18 } → \"age__gte=18\"\n */\nexport const REFINE_OPERATOR_MAP = {\n // Equality\n eq: \"\", // exact match (no suffix)\n ne: \"ne\",\n\n // Comparison\n lt: \"lt\",\n gt: \"gt\",\n lte: \"lte\",\n gte: \"gte\",\n\n // String matching — Taruvi wire suffix matches platform filter_translator.\n contains: \"contains\",\n ncontains: \"ncontains\",\n containss: \"containss\",\n ncontainss: \"ncontainss\",\n startswith: \"startswith\",\n nstartswith: \"nstartswith\",\n endswith: \"endswith\",\n nendswith: \"nendswith\",\n startswiths: \"startswiths\",\n nstartswiths: \"nstartswiths\",\n endswiths: \"endswiths\",\n nendswiths: \"nendswiths\",\n // Refine aliases → platform insensitive tokens\n icontains: \"contains\",\n nicontains: \"ncontains\",\n istartswith: \"startswith\",\n nistartswith: \"nstartswith\",\n iendswith: \"endswith\",\n niendswith: \"nendswith\",\n\n // Array / membership\n in: \"in\",\n nin: \"nin\",\n ina: \"ina\",\n nina: \"nina\",\n\n // Null checks\n null: \"null\",\n nnull: \"nnull\",\n\n // Range\n between: \"between\",\n nbetween: \"nbetween\",\n\n // PostgreSQL array ops (pass-through suffix names)\n acontains: \"acontains\",\n nacontains: \"nacontains\",\n acontainedby: \"acontainedby\",\n nacontainedby: \"nacontainedby\",\n aoverlap: \"aoverlap\",\n naoverlap: \"naoverlap\",\n aelement: \"aelement\",\n naelement: \"naelement\",\n\n // PostgreSQL range column ops\n rcontains: \"rcontains\",\n rcontainedby: \"rcontainedby\",\n roverlaps: \"roverlaps\",\n radjacent: \"radjacent\",\n rstrictleft: \"rstrictleft\",\n rstrictright: \"rstrictright\",\n\n // Raw pattern / field search\n like: \"like\",\n ilike: \"ilike\",\n search: \"search\",\n} as const;\n\n/** All filter operators supported by the Taruvi database provider at runtime. */\nexport type TaruviCrudOperator = keyof typeof REFINE_OPERATOR_MAP;\n\n/** True when `operator` is in {@link REFINE_OPERATOR_MAP}. */\nexport function hasTaruviOperator(operator: string): operator is TaruviCrudOperator {\n return operator in REFINE_OPERATOR_MAP;\n}\n\n/** Taruvi query suffix for an operator, or `undefined` if unsupported. */\nexport function taruviOperatorSuffix(operator: string): string | undefined {\n if (!hasTaruviOperator(operator)) return undefined;\n return REFINE_OPERATOR_MAP[operator];\n}\n\n/** Field leaf filter with a Taruvi-supported operator. */\nexport type TaruviFieldFilter = {\n field: string;\n operator: TaruviCrudOperator;\n value: unknown;\n};\n\n/** Nested AND / OR group using Taruvi operators on leaves. */\nexport type TaruviConditionalFilter = {\n operator: \"and\" | \"or\";\n value: (TaruviFieldFilter | TaruviConditionalFilter)[];\n};\n\n/** Taruvi filter tree (field leaf or logical group). */\nexport type TaruviCrudFilter = TaruviFieldFilter | TaruviConditionalFilter;\n\n/** One leaf filter ready for flat `field__op=value` query encoding. */\nexport type FlatFilterLeaf = TaruviFieldFilter;\n\n/** Root logical filter for JSON `filters` query param (not wrapped in an array). */\nexport type LogicalCrudFilter = TaruviConditionalFilter;\n\n/**\n * Taruvi list filter payload: leaf array → flat query params; logical object → JSON tree.\n */\nexport type TaruviListFilters = FlatFilterLeaf[] | LogicalCrudFilter;\n\n/**\n * Pass Taruvi-typed filters into Refine hooks (`useList`, etc.) that expect `CrudFilter[]`.\n *\n * Refine v5 `CrudOperators` omits Taruvi-only operators (range, array, `search`, aliases).\n * Runtime mapping is unchanged; this helper centralizes the type boundary.\n */\nexport function toRefineFilters(\n filters: TaruviListFilters | TaruviCrudFilter[]\n): CrudFilter[] {\n return filters as CrudFilter[];\n}\n","import type { CrudFilter, CrudSort, Pagination } from \"@refinedev/core\";\nimport type {\n BackendFilterNode,\n BackendFilterTreeRoot,\n BackendFilterLogicalNode,\n Database,\n} from \"@taruvi/sdk\";\nimport type { TaruviMeta } from \"./types.js\";\nimport {\n hasTaruviOperator,\n taruviOperatorSuffix,\n type FlatFilterLeaf,\n type LogicalCrudFilter,\n type TaruviCrudFilter,\n type TaruviListFilters,\n} from \"./filterTypes.js\";\n\nexport {\n REFINE_OPERATOR_MAP,\n toRefineFilters,\n hasTaruviOperator,\n taruviOperatorSuffix,\n} from \"./filterTypes.js\";\nexport type {\n TaruviCrudOperator,\n TaruviFieldFilter,\n TaruviConditionalFilter,\n TaruviCrudFilter,\n FlatFilterLeaf,\n LogicalCrudFilter,\n TaruviListFilters,\n} from \"./filterTypes.js\";\n\n/** Operators whose values are encoded as comma-separated lists for the query string. */\nconst COMMA_VALUE_OPERATORS = new Set<string>([\n \"in\",\n \"nin\",\n \"ina\",\n \"nina\",\n \"between\",\n \"nbetween\",\n \"acontains\",\n \"nacontains\",\n \"acontainedby\",\n \"nacontainedby\",\n \"aoverlap\",\n \"naoverlap\",\n \"aelement\",\n \"naelement\",\n \"rcontains\",\n \"rcontainedby\",\n \"roverlaps\",\n \"radjacent\",\n \"rstrictleft\",\n \"rstrictright\",\n]);\n\nexport type ConvertRefineFiltersOptions = {\n /**\n * `bracket` (default): logical `and` / `or` use Taruvi CrudFilters bracket query keys.\n * `flatten`: legacy merge (OR becomes AND) — only for Storage list filters that do not support CrudFilters.\n */\n logicalEncoding?: \"bracket\" | \"flatten\";\n};\n\nfunction isLogicalFilter(filter: CrudFilter): boolean {\n return (\n typeof filter === \"object\" &&\n filter !== null &&\n \"operator\" in filter &&\n (filter.operator === \"and\" || filter.operator === \"or\") &&\n \"value\" in filter &&\n Array.isArray((filter as { value: unknown }).value)\n );\n}\n\nfunction isFieldFilter(filter: CrudFilter): boolean {\n return (\n typeof filter === \"object\" &&\n filter !== null &&\n \"field\" in filter &&\n \"operator\" in filter &&\n typeof (filter as { field: unknown }).field === \"string\" &&\n typeof (filter as { operator: unknown }).operator === \"string\"\n );\n}\n\n/** True when `filters` is a non-logical array of field leaves (may be empty). */\nexport function isFlatFilterList(filters: unknown): filters is FlatFilterLeaf[] {\n if (!Array.isArray(filters)) return false;\n return filters.every((f) => {\n if (!isFieldFilter(f)) return false;\n const leaf = f as FlatFilterLeaf;\n if (\n leaf.value === undefined ||\n (leaf.value === null && leaf.operator !== \"null\")\n ) {\n return false;\n }\n if (!hasTaruviOperator(leaf.operator)) {\n return false;\n }\n return true;\n });\n}\n\n/** True when `filters` is a single logical object (and / or), not an array. */\nexport function isLogicalCrudFilter(\n filters: unknown\n): filters is LogicalCrudFilter {\n return (\n typeof filters === \"object\" &&\n filters !== null &&\n !Array.isArray(filters) &&\n isLogicalFilter(filters as CrudFilter)\n );\n}\n\n/**\n * Normalize Refine `CrudFilter[]` or Taruvi payloads for `applyFilters`.\n * Legacy: all field leaves → flat array; single root logical → logical object.\n */\nexport function normalizeTaruviListFilters(\n filters: unknown\n): TaruviListFilters | undefined {\n if (filters === undefined || filters === null) return undefined;\n if (isLogicalCrudFilter(filters)) return filters;\n if (isFlatFilterList(filters)) return filters;\n if (!Array.isArray(filters) || filters.length === 0) return undefined;\n\n if (filters.length === 1 && isLogicalFilter(filters[0])) {\n return filters[0] as LogicalCrudFilter;\n }\n\n if (filters.every(isFieldFilter)) {\n return filters as FlatFilterLeaf[];\n }\n\n return undefined;\n}\n\n/**\n * Collect field filters that can be sent as top-level query params (implicit AND).\n *\n * Returns `null` when the list contains `or` or other shapes that require the JSON\n * `filters` tree. FK-traversal fields (`department_id.name`, etc.) must use flat\n * params on the current platform — nesting them under JSON `and` breaks traversal.\n */\nexport function collectFlatLeaves(filters?: CrudFilter[]): FlatFilterLeaf[] | null {\n if (!filters?.length) return [];\n\n const leaves: FlatFilterLeaf[] = [];\n\n const walk = (group: CrudFilter[]): boolean => {\n for (const filter of group) {\n if (isLogicalFilter(filter)) {\n if (filter.operator === \"or\") return false;\n if (!walk(filter.value as CrudFilter[])) return false;\n continue;\n }\n\n if (!isFieldFilter(filter)) return false;\n\n const leaf = filter as { field: string; operator: string; value: unknown };\n if (\n leaf.value === undefined ||\n (leaf.value === null && leaf.operator !== \"null\")\n ) {\n continue;\n }\n if (!hasTaruviOperator(leaf.operator)) {\n console.warn(`Unknown Refine operator: ${leaf.operator}`);\n return false;\n }\n leaves.push({\n field: leaf.field,\n operator: leaf.operator,\n value: leaf.value,\n });\n }\n return true;\n };\n\n if (!walk(filters)) return null;\n return leaves;\n}\n\n/** Backend operator token for CrudFilters bracket payloads (suffix or `eq`). */\nexport function refineOperatorToBackendKey(operator: string): string {\n const suffix = taruviOperatorSuffix(operator);\n if (suffix === undefined) return operator;\n return suffix === \"\" ? \"eq\" : suffix;\n}\n\n/** String value for a leaf filter (flat or bracket). */\nexport function formatRefineLeafValue(operator: string, value: unknown): string {\n if (COMMA_VALUE_OPERATORS.has(operator)) {\n return Array.isArray(value) ? value.join(\",\") : String(value);\n }\n if (operator === \"null\" || operator === \"nnull\") {\n return \"true\";\n }\n return String(value);\n}\n\nfunction encodeLeafFlat(\n field: string,\n operator: string,\n value: unknown,\n params: Record<string, string>\n): void {\n if (value === undefined || (value === null && operator !== \"null\")) {\n return;\n }\n const suffix = taruviOperatorSuffix(operator);\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n return;\n }\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n params[paramKey] = formatRefineLeafValue(operator, value);\n}\n\n/** Encode one CrudFilter node (logical or leaf) into bracket-style flat query keys. */\nexport function encodeCrudFilterBracket(\n filter: CrudFilter,\n path: string,\n out: Record<string, string>\n): void {\n if (isLogicalFilter(filter)) {\n const op = filter.operator as \"and\" | \"or\";\n out[`${path}[operator]`] = op;\n const children = filter.value as CrudFilter[];\n children.forEach((child, i) => {\n encodeCrudFilterBracket(child, `${path}[value][${i}]`, out);\n });\n return;\n }\n\n if (!isFieldFilter(filter)) {\n return;\n }\n\n const leaf = filter as { field: string; operator: string; value: unknown };\n const { field, operator, value } = leaf;\n if (value === undefined || (value === null && operator !== \"null\")) {\n return;\n }\n\n const suffix = taruviOperatorSuffix(operator);\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n return;\n }\n\n out[`${path}[field]`] = field;\n out[`${path}[operator]`] = refineOperatorToBackendKey(operator);\n out[`${path}[value]`] = formatRefineLeafValue(operator, value);\n}\n\nfunction isLogicalBackendNode(n: BackendFilterNode): n is BackendFilterLogicalNode {\n return !(\"field\" in n) && (n.operator === \"and\" || n.operator === \"or\");\n}\n\nfunction jsonLeafValue(operator: string, value: unknown): unknown {\n if (operator === \"null\" || operator === \"nnull\") return true;\n return value;\n}\n\nfunction crudFilterToBackendNodeOrNull(filter: CrudFilter): BackendFilterNode | null {\n if (isLogicalFilter(filter)) {\n const children = (filter.value as CrudFilter[])\n .map(crudFilterToBackendNodeOrNull)\n .filter((n): n is BackendFilterNode => n !== null);\n if (children.length === 0) return null;\n return { operator: filter.operator as \"and\" | \"or\", value: children };\n }\n\n if (isFieldFilter(filter)) {\n const leaf = filter as { field: string; operator: string; value: unknown };\n if (leaf.value === undefined || (leaf.value === null && leaf.operator !== \"null\")) {\n return null;\n }\n if (!hasTaruviOperator(leaf.operator)) {\n console.warn(`Unknown Refine operator: ${leaf.operator}`);\n return null;\n }\n const backendOp = refineOperatorToBackendKey(leaf.operator);\n return {\n field: leaf.field,\n operator: backendOp,\n value: jsonLeafValue(leaf.operator, leaf.value),\n };\n }\n\n return null;\n}\n\n/**\n * Converts Refine `CrudFilter[]` into the backend JSON `filters` query param tree\n * (root array of `{ operator: \"and\"|\"or\", value: [...] }` nodes).\n *\n * Leaf `operator` values are **Taruvi / platform** tokens after `refineOperatorToBackendKey`.\n * Leaf `operator` values use Taruvi / platform tokens from `refineOperatorToBackendKey`.\n */\nexport function convertRefineFiltersToBackendTree(\n filters?: CrudFilter[]\n): BackendFilterTreeRoot | null {\n if (!filters?.length) return null;\n\n const nodes = filters\n .map(crudFilterToBackendNodeOrNull)\n .filter((n): n is BackendFilterNode => n !== null);\n if (nodes.length === 0) return null;\n\n if (nodes.length === 1 && isLogicalBackendNode(nodes[0])) {\n return [nodes[0]];\n }\n\n return [{ operator: \"and\", value: nodes }];\n}\n\n/**\n * Converts one logical CrudFilter object into the backend JSON `filters` tree root.\n */\nexport function convertLogicalFilterToBackendTree(\n filter: LogicalCrudFilter\n): BackendFilterTreeRoot | null {\n const node = crudFilterToBackendNodeOrNull(filter as CrudFilter);\n if (!node || !isLogicalBackendNode(node)) return null;\n return [node];\n}\n\n/** Encode leaf filters as flat `field__op` query param keys. */\nexport function encodeFlatFilterListToParams(\n leaves: FlatFilterLeaf[]\n): Record<string, string> {\n const params: Record<string, string> = {};\n for (const leaf of leaves) {\n encodeLeafFlat(leaf.field, leaf.operator, leaf.value, params);\n }\n return params;\n}\n\nfunction convertRefineFiltersFlattened(\n filters?: CrudFilter[]\n): Record<string, string> {\n if (!filters || filters.length === 0) return {};\n\n const params: Record<string, string> = {};\n\n for (const filter of filters) {\n if (isLogicalFilter(filter)) {\n if (filter.value && Array.isArray(filter.value)) {\n const nested = convertRefineFiltersFlattened(\n filter.value as CrudFilter[]\n );\n Object.assign(params, nested);\n }\n continue;\n }\n\n if (isFieldFilter(filter)) {\n const leaf = filter as { field: string; operator: string; value: unknown };\n encodeLeafFlat(leaf.field, leaf.operator, leaf.value, params);\n }\n }\n\n return params;\n}\n\n/**\n * Converts Refine CrudFilter[] to Taruvi query parameters.\n * Logical `and` / `or` use CrudFilters bracket notation unless `logicalEncoding: 'flatten'`.\n */\nexport function convertRefineFilters(\n filters?: CrudFilter[],\n options?: ConvertRefineFiltersOptions\n): Record<string, string> {\n if (!filters || filters.length === 0) return {};\n\n if (options?.logicalEncoding === \"flatten\") {\n return convertRefineFiltersFlattened(filters);\n }\n\n const hasLogical = filters.some(isLogicalFilter);\n\n if (!hasLogical) {\n const params: Record<string, string> = {};\n for (const filter of filters) {\n if (isFieldFilter(filter)) {\n const leaf = filter as { field: string; operator: string; value: unknown };\n encodeLeafFlat(leaf.field, leaf.operator, leaf.value, params);\n }\n }\n return params;\n }\n\n if (filters.length === 1 && isLogicalFilter(filters[0])) {\n const out: Record<string, string> = {};\n encodeCrudFilterBracket(filters[0], \"filters[0]\", out);\n return out;\n }\n\n const out: Record<string, string> = {};\n out[\"filters[0][operator]\"] = \"and\";\n filters.forEach((f, i) => {\n encodeCrudFilterBracket(f, `filters[0][value][${i}]`, out);\n });\n return out;\n}\n\n/**\n * Applies flat query param entries (including bracket keys) onto a Database query.\n */\nexport function applyRefineQueryParamsToDatabase<T>(\n query: Database<T>,\n params: Record<string, string>\n): Database<T> {\n let result = query;\n for (const [key, val] of Object.entries(params)) {\n result = result.filters(key, \"eq\", val);\n }\n return result;\n}\n\n/**\n * Converts Refine CrudSort[] to Taruvi ordering parameter.\n * Uses DRF convention: \"-field\" for DESC, \"field\" for ASC.\n */\nexport function convertRefineSorters(sorters?: CrudSort[]): string | undefined {\n if (!sorters || sorters.length === 0) return undefined;\n\n return sorters\n .map((sort) => (sort.order === \"desc\" ? `-${sort.field}` : sort.field))\n .join(\",\");\n}\n\n/**\n * Converts Refine Pagination to Taruvi page/page_size parameters.\n */\nexport function convertRefinePagination(\n pagination?: Pagination\n): { page?: number; page_size?: number } {\n if (!pagination) return {};\n\n const { currentPage, pageSize, mode } = pagination;\n\n // Handle \"off\" mode - no pagination\n if (mode === \"off\") return {};\n\n return {\n page: currentPage ?? 1, // Default to page 1 if currentPage is undefined\n page_size: pageSize,\n };\n}\n\n/**\n * Combines all Refine parameters into Taruvi query params.\n */\nexport function buildRefineQueryParams(options: {\n filters?: CrudFilter[];\n sorters?: CrudSort[];\n pagination?: Pagination;\n meta?: TaruviMeta;\n}): Record<string, unknown> {\n const { filters, sorters, pagination, meta } = options;\n\n const params: Record<string, unknown> = {\n ...convertRefineFilters(filters),\n ...convertRefinePagination(pagination),\n };\n\n const ordering = convertRefineSorters(sorters);\n if (ordering) {\n params.ordering = ordering;\n }\n\n // Handle populate from meta\n if (meta?.populate) {\n params.populate = Array.isArray(meta.populate)\n ? meta.populate.join(\",\")\n : meta.populate;\n }\n\n return params;\n}\n\n/**\n * Builds a query string from an object of parameters.\n */\nexport function buildQueryString(params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) return \"\";\n\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n }\n\n const queryString = searchParams.toString();\n return queryString ? `?${queryString}` : \"\";\n}\n\n/**\n * Converts aggregate expressions array to _aggregate query parameter.\n * @param aggregates - Array of aggregate expressions like [\"sum(total)\", \"count(*)\"]\n * @returns Comma-separated string or undefined\n */\nexport function formatAggregates(aggregates?: string[]): string | undefined {\n if (!aggregates || aggregates.length === 0) return undefined;\n return aggregates.join(\",\");\n}\n\n/**\n * Converts groupBy fields array to _group_by query parameter.\n * @param groupBy - Array of field names to group by\n * @returns Comma-separated string or undefined\n */\nexport function formatGroupBy(groupBy?: string[]): string | undefined {\n if (!groupBy || groupBy.length === 0) return undefined;\n return groupBy.join(\",\");\n}\n\n/**\n * Converts having filters to _having query parameter.\n * Uses same format as regular filters with DRF-style operators.\n * @param having - Taruvi field / logical filters for aggregate results\n * @returns Comma-separated filter string or undefined\n */\nexport function formatHaving(having?: TaruviCrudFilter[]): string | undefined {\n if (!having || having.length === 0) return undefined;\n\n const params: string[] = [];\n\n for (const filter of having) {\n // Handle conditional filters (field, operator, value)\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n // Skip undefined/null values\n if (value === undefined || (value === null && operator !== \"null\")) {\n continue;\n }\n\n const suffix = taruviOperatorSuffix(operator);\n\n if (suffix === undefined) {\n console.warn(`Unknown operator in having clause: ${operator}`);\n continue;\n }\n\n // Build parameter with DRF-style operator\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n const paramValue = formatRefineLeafValue(operator, value);\n\n params.push(`${paramKey}=${paramValue}`);\n }\n }\n\n return params.length > 0 ? params.join(\",\") : undefined;\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n GetManyParams,\n GetManyResponse,\n CreateParams,\n CreateResponse,\n CreateManyParams,\n CreateManyResponse,\n UpdateParams,\n UpdateResponse,\n UpdateManyParams,\n UpdateManyResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, Database } from \"@taruvi/sdk\";\nimport type { EdgeRequest, FilterOperator } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport {\n convertRefineFiltersToBackendTree,\n convertLogicalFilterToBackendTree,\n convertRefineSorters,\n formatHaving,\n formatRefineLeafValue,\n isFlatFilterList,\n isLogicalCrudFilter,\n normalizeTaruviListFilters,\n refineOperatorToBackendKey,\n} from \"./utils.js\";\nimport type { FlatFilterLeaf, TaruviListFilters } from \"./utils.js\";\n\nfunction applyAggregations<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta) return query;\n\n let result = query;\n\n if (meta.aggregate?.length) {\n result = result.aggregate(...meta.aggregate);\n }\n\n if (meta.groupBy?.length) {\n result = result.groupBy(...meta.groupBy);\n }\n\n const havingStr = formatHaving(meta.having);\n if (havingStr) {\n result = result.having(havingStr);\n }\n\n return result;\n}\n\nfunction applyFlatFilterList<T>(\n query: Database<T>,\n leaves: FlatFilterLeaf[]\n): Database<T> {\n let result = query;\n for (const { field, operator, value } of leaves) {\n const backendOp = refineOperatorToBackendKey(operator);\n const formatted = formatRefineLeafValue(operator, value);\n result = result.filters(\n field,\n backendOp as FilterOperator,\n formatted as string | number | boolean | (string | number | boolean)[]\n );\n }\n return result;\n}\n\n/**\n * Applies Taruvi list filters to a Database query.\n *\n * - `FlatFilterLeaf[]` → top-level `field__op` query params (flat triple `.filters()`).\n * - `LogicalCrudFilter` object → JSON `filters` tree via `.filters(tree)`.\n * - Legacy `CrudFilter[]` is normalized when possible; otherwise JSON tree.\n */\nfunction applyFilters<T>(\n query: Database<T>,\n filters?: TaruviListFilters | CrudFilter[]\n): Database<T> {\n const normalized = normalizeTaruviListFilters(filters);\n if (normalized === undefined) {\n if (Array.isArray(filters) && filters.length > 0) {\n const tree = convertRefineFiltersToBackendTree(filters as CrudFilter[]);\n if (tree) return query.filters(tree);\n }\n return query;\n }\n\n if (isFlatFilterList(normalized)) {\n if (normalized.length === 0) return query;\n return applyFlatFilterList(query, normalized);\n }\n\n if (isLogicalCrudFilter(normalized)) {\n const tree = convertLogicalFilterToBackendTree(normalized);\n if (!tree) return query;\n return query.filters(tree);\n }\n\n return query;\n}\n\n/**\n * Applies Refine sorters to a Database query.\n */\nfunction applySorters<T>(\n query: Database<T>,\n sorters?: CrudSort[]\n): Database<T> {\n const ordering = convertRefineSorters(sorters);\n return ordering ? query.sort(ordering) : query;\n}\n\n/**\n * Applies Refine pagination to a Database query.\n */\nfunction applyPagination<T>(\n query: Database<T>,\n pagination?: Pagination\n): Database<T> {\n if (!pagination || pagination.mode === \"off\") return query;\n\n let result = query;\n if (pagination.currentPage) result = result.page(pagination.currentPage);\n if (pagination.pageSize) result = result.pageSize(pagination.pageSize);\n return result;\n}\n\n/**\n * Applies populate fields to a Database query.\n */\nfunction applyPopulate<T>(\n query: Database<T>,\n meta?: TaruviMeta\n): Database<T> {\n if (!meta?.populate) return query;\n\n const populateArray = Array.isArray(meta.populate)\n ? meta.populate\n : meta.populate.split(\",\").map(s => s.trim());\n\n return query.populate(populateArray);\n}\n\n/**\n * Applies allowed_actions query param for per-row permission hints.\n */\nfunction applyAllowedActions<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta?.allowedActions?.length) return query;\n return query.allowedActions(meta.allowedActions);\n}\n\n/** Applies `?search=` and `?fields=` (via meta.select) list query params. */\nfunction applySearchAndFields<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta) return query;\n let result = query;\n const search = meta.search?.trim();\n if (search) result = result.search(search);\n const select = meta.select;\n const fields =\n typeof select === \"string\"\n ? select.trim()\n : Array.isArray(select)\n ? select.map(String).join(\",\")\n : \"\";\n if (fields) result = result.fields(fields);\n return result;\n}\n\n/**\n * Checks if the query should use Graph SDK based on meta params.\n */\nfunction isGraphQuery(meta?: TaruviMeta): boolean {\n return !!(meta?.format || meta?.relationship_type || meta?.include || meta?.depth);\n}\n\n/**\n * Builds a Graph query with optional params from meta.\n */\nfunction buildGraphQuery<T>(client: Client, tableName: string, meta?: TaruviMeta, recordId?: string): Database<T> {\n let query = new Database(client).from<T>(tableName);\n\n if (recordId) query = query.get(recordId);\n if (meta?.format) query = query.format(meta.format);\n if (meta?.include) query = query.include(meta.include);\n if (meta?.depth) query = query.depth(meta.depth);\n if (meta?.relationship_type) query = query.types(meta.relationship_type);\n\n return query;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi database operations.\n */\nexport function dataProvider(client: Client): DataProvider {\n console.log(`Taruvi Refine Provider v${pkg.version} initialized`);\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getIdColumn = (meta?: TaruviMeta) => meta?.idColumnName ?? \"id\";\n const getTableName = (resource: string, meta?: TaruviMeta) => meta?.tableName ?? resource;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n let graphQuery = buildGraphQuery<TData>(client, tableName, taruviMeta);\n graphQuery = applyAllowedActions(graphQuery, taruviMeta);\n const response = await graphQuery.execute();\n const data = Array.isArray(response) ? response : (response as any)?.data ?? [];\n const total = (response as any)?.total ?? data.length;\n return { data: data as TData[], total };\n }\n\n let query = new Database(client).from(tableName);\n query = applyFilters(query, filters);\n query = applySorters(query, sorters);\n query = applyPagination(query, pagination);\n query = applyPopulate(query, taruviMeta);\n query = applyAggregations(query, taruviMeta);\n query = applySearchAndFields(query, taruviMeta);\n query = applyAllowedActions(query, taruviMeta);\n\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n const data = Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n return { data };\n }\n\n let query = new Database(client).from(tableName).get(String(id));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n getMany: async <TData extends BaseRecord = BaseRecord>(\n params: GetManyParams\n ): Promise<GetManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const data = await Promise.all(\n ids.map(async id => {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n return Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n })\n );\n return { data };\n }\n\n const idColumn = getIdColumn(taruviMeta);\n let query = new Database(client).from(tableName);\n query = query.filters(idColumn, \"in\", ids.map(String));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .create(variables as EdgeRequest[])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const db = new Database(client).from(tableName);\n const query = taruviMeta?.upsert\n ? db.upsert(variables as object)\n : db.create(variables as object);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateManyParams<TVariables>\n ): Promise<CreateManyResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n const data = await Promise.all(\n variables.map(async (vars) => {\n const response = await new Database(client)\n .from(tableName)\n .create(vars as object)\n .execute() as { data: TData };\n return response.data;\n })\n );\n\n return { data };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .get(String(id))\n .update(variables as EdgeRequest)\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const response = await new Database(client)\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as { data: TData };\n return { data: response.data };\n },\n\n updateMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateManyParams<TVariables>\n ): Promise<UpdateManyResponse<TData>> => {\n const { resource, ids, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const idColumn = getIdColumn(taruviMeta);\n\n const body = ids.map(id => ({ [idColumn]: id, ...(variables as object) }));\n const response = await new Database(client)\n .from(tableName)\n .bulkUpdate(body)\n .execute() as { data: TData[] };\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete([Number(id)])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n await new Database(client)\n .from(tableName)\n .delete(String(id))\n .execute();\n return { data: { id } as unknown as TData };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete(ids.map(Number))\n .execute() as { data: TData };\n return { data: [response.data] };\n }\n\n if (taruviMeta?.deleteByFilter && taruviMeta?.filters) {\n let query = new Database(client).from(tableName);\n query = applyFilters(query, taruviMeta.filters as CrudFilter[]);\n await query.deleteFiltered().execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n }\n\n await new Database(client)\n .from(tableName)\n .bulkDelete(ids.map(String))\n .execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let endpoint = `api/apps/${config.appSlug}/datatables/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n endpoint = `${endpoint}${endpoint.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(endpoint) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(endpoint, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(endpoint, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(endpoint, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(endpoint) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n getApiUrl: () => baseApiUrl,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CreateParams,\n CreateResponse,\n CreateManyParams,\n CreateManyResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, Storage } from \"@taruvi/sdk\";\nimport type { StorageFilters, StorageUploadBatchResponse } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport { convertRefineFilters, convertRefineSorters, convertRefinePagination } from \"./utils.js\";\n\n/**\n * Storage upload variables interface.\n */\nexport interface StorageUploadVariables {\n files: File[];\n paths?: string[];\n metadatas?: Record<string, unknown>[];\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi file storage operations.\n */\nexport function storageDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getBucketName = (resource: string, meta?: TaruviMeta) => meta?.bucketName ?? resource;\n\n const buildFilters = (params: {\n filters?: GetListParams[\"filters\"];\n sorters?: GetListParams[\"sorters\"];\n pagination?: GetListParams[\"pagination\"];\n meta?: TaruviMeta;\n }): StorageFilters => {\n const filters: StorageFilters = {\n ...convertRefineFilters(params.filters, { logicalEncoding: \"flatten\" }) as StorageFilters,\n ...convertRefinePagination(params.pagination),\n };\n\n const ordering = convertRefineSorters(params.sorters);\n if (ordering) filters.ordering = ordering;\n\n return filters;\n };\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const storageFilters = buildFilters({ filters, sorters, pagination, meta: taruviMeta });\n\n const response = await new Storage(client)\n .from(bucket)\n .filter(storageFilters)\n .execute() as TaruviListResponse<TData>;\n\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n if (taruviMeta?.metadata) {\n const response = await new Storage(client)\n .from(bucket)\n .metadata(String(path))\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const blob = await new Storage(client)\n .from(bucket)\n .download(String(path))\n .execute<Blob>();\n return { data: blob as unknown as TData };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n // Extract the first uploaded file object from the batch response\n const firstUploaded = response.data?.successful?.[0]?.object;\n return { data: (firstUploaded ?? response.data) as unknown as TData };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id: path, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n const response = await new Storage(client)\n .from(bucket)\n .update(String(path), variables as object)\n .execute() as { data: TData };\n\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete([String(path)])\n .execute();\n\n return { data: { id: path } as unknown as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async () => { throw new Error(\"getMany is not supported for storage resources\"); },\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateManyParams<TVariables>\n ): Promise<CreateManyResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n const uploaded = response.data?.successful?.map(s => s.object) ?? [];\n return { data: (uploaded.length > 0 ? uploaded : [response.data]) as unknown as TData[] };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete(ids.map(String))\n .execute();\n\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let fullUrl = `api/apps/${config.appSlug}/storage/buckets/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n fullUrl = `${fullUrl}${fullUrl.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(fullUrl) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(fullUrl, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(fullUrl, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(fullUrl, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(fullUrl) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n // Not applicable for file storage - files are replaced, not updated\n updateMany: undefined,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, App, Functions, Analytics, Secrets } from \"@taruvi/sdk\";\nimport type { RoleData } from \"@taruvi/sdk\";\n\n/**\n * Response type for roles list from the App service..\n */\ninterface RolesListResponse {\n data: RoleData[];\n total: number;\n}\n\n/**\n * Meta options for function execution via custom().\n */\nexport interface FunctionMeta {\n kind: \"function\";\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/**\n * Meta options for analytics query execution via custom().\n */\nexport interface AnalyticsMeta {\n kind: \"analytics\";\n}\n\nexport type AppCustomMeta = FunctionMeta | AnalyticsMeta;\n\n/**\n * Creates a Refine DataProvider for Taruvi App operations.\n *\n * Supported operations:\n * - getList(\"roles\"): Fetch app roles\n * - getList(\"secrets\"): Fetch secrets by keys (requires meta.keys)\n * - getOne(\"settings\"): Fetch app settings\n * - getOne(\"secrets\"): Fetch a single secret by key (id = secret key)\n * - custom(): Execute edge functions or analytics queries via meta.kind\n */\nexport function appDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n const analytics = new Analytics(client);\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, meta } = params;\n\n if (resource === \"roles\") {\n const app = new App(client);\n const response = await app.roles().execute() as RolesListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total ?? (Array.isArray(response) ? response.length : response.data?.length ?? 0),\n };\n }\n\n if (resource === \"secrets\") {\n const keys = meta?.keys as string[] | undefined;\n if (!keys || keys.length === 0) {\n throw new Error('secrets resource requires meta.keys array');\n }\n const secrets = new Secrets(client);\n const response = await secrets.list(keys, {\n app: meta?.app as string | undefined,\n includeMetadata: meta?.includeMetadata as boolean | undefined,\n }) as any;\n const raw = response.data || response;\n const data: TData[] = Array.isArray(raw)\n ? raw\n : Object.entries(raw).map(([key, value]) => ({ key, value }) as unknown as TData);\n return { data, total: data.length };\n }\n\n throw new Error(`Unknown app resource: ${resource}. Supported resources: roles, secrets`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n\n if (resource === \"settings\") {\n const app = new App(client);\n const response = await app.settings().execute() as { data: TData };\n\n return {\n data: response.data,\n };\n }\n\n if (resource === \"secrets\") {\n const secrets = new Secrets(client);\n const response = await secrets.get(String(id), {\n app: meta?.app as string | undefined,\n tags: meta?.tags as string[] | undefined,\n }).execute() as any;\n return { data: (response.data ?? response) as TData };\n }\n\n throw new Error(`Unknown app resource for getOne: ${resource}. Supported resources: settings, secrets`);\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url: slug, payload, meta } = params;\n const customMeta = meta as AppCustomMeta | undefined;\n\n if (customMeta?.kind === \"function\") {\n const response = await functions.execute<TData>(slug, {\n async: customMeta.async ?? false,\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n if (customMeta?.kind === \"analytics\") {\n const response = await analytics.execute<TData>(slug, {\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n throw new Error(\n 'Specify meta.kind as \"function\" or \"analytics\" for custom operations on the app provider.'\n );\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async () => { throw new Error(\"getMany is not supported for app resources\"); },\n create: async () => { throw new Error(\"create is not supported for app resources. Use useCustom with meta.kind\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for app resources\"); },\n update: async () => { throw new Error(\"update is not supported for app resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for app resources\"); },\n deleteOne: async () => { throw new Error(\"deleteOne is not supported for app resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for app resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CreateParams,\n CreateResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, User, Auth } from \"@taruvi/sdk\";\nimport type { UserData, UserCreateRequest, UserUpdateRequest } from \"@taruvi/sdk\";\n\n/**\n * Response type for users list from the User service.\n */\ninterface UsersListResponse {\n data: UserData[];\n total: number;\n}\n\n/**\n * Filter parameters for listing users.\n */\ninterface UserListFilters {\n search?: string;\n is_active?: boolean;\n is_staff?: boolean;\n is_superuser?: boolean;\n is_deleted?: boolean;\n roles?: string;\n ordering?: string;\n page?: number;\n page_size?: number;\n}\n\n/**\n * Builds UserListFilters from Refine's filters, sorters, and pagination.\n */\nfunction buildUserListFilters(\n filters?: CrudFilter[],\n sorters?: CrudSort[],\n pagination?: Pagination\n): UserListFilters {\n const result: UserListFilters = {};\n\n // Apply pagination\n if (pagination && pagination.mode !== \"off\") {\n if (pagination.currentPage) {\n result.page = pagination.currentPage;\n }\n if (pagination.pageSize) {\n result.page_size = pagination.pageSize;\n }\n }\n\n // Apply filters\n if (filters) {\n for (const filter of filters) {\n if (\"field\" in filter) {\n const field = filter.field as string;\n const value = filter.value;\n\n switch (field) {\n case \"search\":\n result.search = String(value);\n break;\n case \"is_active\":\n result.is_active = Boolean(value);\n break;\n case \"is_staff\":\n result.is_staff = Boolean(value);\n break;\n case \"is_superuser\":\n result.is_superuser = Boolean(value);\n break;\n case \"is_deleted\":\n result.is_deleted = Boolean(value);\n break;\n case \"roles\":\n result.roles = Array.isArray(value) ? value.join(\",\") : String(value);\n break;\n }\n }\n }\n }\n\n // Apply sorting (first sorter only, as API accepts single ordering)\n if (sorters && sorters.length > 0) {\n const sorter = sorters[0];\n result.ordering = sorter.order === \"desc\" ? `-${sorter.field}` : sorter.field;\n }\n\n return result;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi User operations.\n *\n * This provider is specialized for fetching user-level data.\n *\n * Supported resources:\n * - \"users\" (getList): Fetch list of users with filtering/pagination\n * - \"users\" (getOne): Fetch a specific user by username/id\n * - \"roles\" (getList): Fetch roles for a specific user (requires meta.username)\n *\n * @example\n * ```typescript\n * // Get list of users\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * pagination: { currentPage: 1, pageSize: 10 },\n * filters: [\n * { field: \"is_active\", operator: \"eq\", value: true },\n * { field: \"search\", operator: \"eq\", value: \"john\" },\n * ],\n * sorters: [{ field: \"username\", order: \"asc\" }],\n * });\n *\n * // Get a specific user by username\n * const { data } = useOne({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * id: \"john_doe\",\n * });\n *\n * // Get roles for a specific user\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"roles\",\n * meta: { username: \"john_doe\" },\n * });\n * ```\n */\nexport function userDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userFilters = buildUserListFilters(filters, sorters, pagination);\n const response = await user.list(userFilters as Parameters<typeof user.list>[0]) as UsersListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total,\n };\n }\n\n if (resource === \"roles\") {\n // Get roles for a specific user - requires meta.username\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"roles resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUser(username) as any;\n const roles = response.data?.roles || response.roles || [];\n\n return {\n data: roles as unknown as TData[],\n total: roles.length,\n };\n }\n\n if (resource === \"apps\") {\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"apps resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUserApps(username) as any;\n const apps = response.data || response;\n return {\n data: apps as TData[],\n total: Array.isArray(apps) ? apps.length : 0,\n };\n }\n\n throw new Error(`Unknown user resource for getList: ${resource}. Supported: users, roles, apps`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client)\n\n // Support \"me\" as a special ID to get current user via Auth\n if (String(id) === \"me\") {\n const auth = new Auth(client);\n const response = await auth.getCurrentUser();\n const data = response ? ((response as any).data ?? response) : null;\n return { data: data as unknown as TData };\n }\n\n const response = await user.getUser(String(id));\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for getOne: ${resource}. Supported: users`);\n },\n\n getApiUrl: () => baseApiUrl,\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userData = variables as unknown as UserCreateRequest;\n const response = await user.createUser(userData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for create: ${resource}. Supported resources: users`);\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n const updateData = variables as unknown as UserUpdateRequest;\n const response = await user.updateUser(username, updateData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for update: ${resource}. Supported resources: users`);\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n await user.deleteUser(username);\n\n return {\n data: {} as TData,\n };\n }\n\n throw new Error(`Unknown user resource for delete: ${resource}. Supported resources: users`);\n },\n\n // User resources - other operations not supported\n getMany: async () => { throw new Error(\"getMany is not supported for user resources\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for user resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for user resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for user resources\"); },\n custom: async () => { throw new Error(\"custom is not supported for user resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Functions } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for function execution.\n */\nexport interface FunctionMeta {\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"function\"` instead. */\nexport function functionsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n\n return {\n /**\n * Execute an edge function.\n *\n * @param resource - The function slug to execute\n * @param variables - Parameters to pass to the function\n * @param meta.async - Whether to execute asynchronously (default: false)\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n meta,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const functionMeta = meta as FunctionMeta | undefined;\n\n const response = await functions.execute<TData>(resource, {\n async: functionMeta?.async ?? false,\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Edge functions don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n\n // Edge functions don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n };\n}","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Analytics } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for analytics query execution.\n */\nexport interface AnalyticsMeta {\n /** Additional parameters to pass to the analytics query */\n params?: Record<string, unknown>;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"analytics\"` instead. */\nexport function analyticsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const analytics = new Analytics(client);\n\n return {\n /**\n * Execute an analytics query.\n *\n * @param resource - The query slug to execute\n * @param variables - Parameters to pass to the query\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const response = await analytics.execute<TData>(resource, {\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Analytics don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n\n // Analytics queries don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n };\n}","import type { AuthProvider } from \"@refinedev/core\";\nimport { Client, Auth } from \"@taruvi/sdk\";\n\n/**\n * Login params - supports both redirect flow and credentials flow\n */\nexport interface LoginParams {\n /** For redirect-based login - URL to redirect after successful login */\n callbackUrl?: string;\n /** For credentials-based login (if supported) */\n username?: string;\n password?: string;\n /** Whether to use redirect flow (default: true) */\n redirect?: boolean;\n}\n\n/**\n * Logout params\n */\nexport interface LogoutParams {\n /** URL to redirect after logout */\n callbackUrl?: string;\n}\n\n/**\n * Register/Signup params\n */\nexport interface RegisterParams {\n /** URL to redirect after successful signup */\n callbackUrl?: string;\n}\n\n// ============================================================================\n// Shared user cache — populated by getIdentity(), reused by getPermissions()\n// and accessControlProvider. Prevents multiple /users/me calls per page load.\n// Only used client-side; server-side always fetches fresh to avoid cross-request leakage.\n// ============================================================================\n\nconst isBrowser = typeof window !== \"undefined\";\n\nexport let _cachedUser: Record<string, any> | null = null;\n\n\n/**\n * Creates a Refine AuthProvider for Taruvi authentication.\n *\n * Supports redirect-based authentication flow (Web UI Flow):\n * 1. User calls login() → Redirects to backend /accounts/login/\n * 2. User authenticates on backend\n * 3. Backend redirects back with tokens in URL hash\n * 4. Client extracts and stores tokens automatically\n */\nexport function authProvider(client: Client): AuthProvider {\n const auth = new Auth(client);\n\n return {\n login: async (params: LoginParams = {}) => {\n const { callbackUrl, redirect = true } = params;\n\n // Check if already authenticated first (prevents infinite redirect loop)\n\n // TODO: check if this is necessary\n if (auth.isUserAuthenticated()) {\n return {\n success: true,\n redirectTo: callbackUrl || \"/\",\n };\n }\n\n if (redirect) {\n // Redirect-based login flow\n auth.login(callbackUrl);\n\n // Return success since we're redirecting\n // The actual auth state will be checked after redirect\n return {\n success: true,\n };\n }\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Login failed. Please try again.\",\n },\n };\n },\n\n logout: async (params: LogoutParams = {}) => {\n const { callbackUrl } = params;\n\n _cachedUser = null;\n await auth.logout(callbackUrl);\n\n return {\n success: true,\n redirectTo: callbackUrl || \"/login\",\n };\n },\n\n check: async () => {\n if (!auth.isUserAuthenticated()) {\n return { authenticated: false, redirectTo: \"/login\" };\n }\n // Trust token locally — server-side validation happens\n // via onError when actual API calls fail with 401/403\n return { authenticated: true };\n },\n\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // 401 means session is invalid — tokens already cleared by SDK interceptor\n if (status === 401) {\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n // 403 means authenticated but forbidden — don't logout, just report the error\n if (status === 403) {\n return { error };\n }\n\n return { error };\n },\n\n register: async (params: RegisterParams = {}) => {\n const { callbackUrl } = params;\n\n // Redirect to signup page\n auth.signup(callbackUrl);\n\n return {\n success: true,\n };\n },\n\n getIdentity: async () => {\n const response = await auth.getCurrentUser();\n\n if (!response) {\n _cachedUser = null;\n return null;\n }\n\n const user = (response as any).data ?? response;\n if (isBrowser) _cachedUser = user;\n return user;\n },\n\n getPermissions: async () => {\n // Reuse cached user from getIdentity() to avoid a separate /users/me call.\n // Server-side: always fetch fresh to avoid cross-request leakage.\n let user = isBrowser ? _cachedUser : null;\n\n if (!user) {\n const response = await auth.getCurrentUser();\n user = response ? ((response as any).data ?? response) : null;\n }\n\n if (!user) {\n return null;\n }\n\n return {\n roles: user.roles || [],\n permissions: user.user_permissions || [],\n groups: user.groups || [],\n is_staff: user.is_staff || false,\n is_superuser: user.is_superuser || false,\n };\n },\n };\n}\n","import type { AccessControlProvider } from \"@refinedev/core\";\nimport { Auth, Client, Policy } from \"@taruvi/sdk\";\nimport DataLoader from \"dataloader\";\nimport { _cachedUser } from \"./authProvider.js\";\n\nconst isBrowser = typeof window !== \"undefined\";\n\n/**\n * Permission check request for DataLoader batching\n */\ninterface PermissionCheck {\n resource: string;\n action: string;\n params?: Record<string, unknown>;\n}\n\ninterface PermissionResult {\n can: boolean;\n reason?: string;\n}\n\n/**\n * Creates a Refine AccessControlProvider using Cerbos via the Policy client.\n *\n * Uses DataLoader for request batching (multiple useCan calls → single API request)\n * and Refine's built-in TanStack Query for caching.\n *\n * @example\n * ```tsx\n * <Refine\n * authProvider={authProvider(client)}\n * accessControlProvider={accessControlProvider(client)}\n * />\n *\n *\n * ```\n */\nexport function accessControlProvider(\n client: Client,\n options?: { batchDelayMs?: number }\n): AccessControlProvider {\n const policy = new Policy(client);\n const auth = new Auth(client);\n const { batchDelayMs = 50 } = options ?? {};\n\n // DataLoader for batching only - TanStack Query handles caching\n const permissionLoader = new DataLoader<PermissionCheck, PermissionResult>(\n async (checks) => {\n // Reuse cached user from authProvider.getIdentity() — no extra /users/me call\n // Server-side: skip cache to avoid cross-request leakage\n let currentUser = isBrowser ? _cachedUser : null;\n\n if (!currentUser) {\n try {\n const response = await auth.getCurrentUser();\n currentUser = response ? ((response as any).data ?? response) : null;\n } catch {\n currentUser = null;\n }\n }\n\n if (!currentUser) {\n return checks.map(() => ({\n can: false,\n reason: \"User not authenticated\",\n }));\n }\n\n // Deduplicate and group by resource:recordId (needed because cache: false)\n const uniqueResources = new Map<string, {\n resource: string;\n recordId: string;\n attributes: Record<string, unknown>;\n actions: Set<string>;\n }>();\n\n for (const check of checks) {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n\n if (!uniqueResources.has(key)) {\n uniqueResources.set(key, {\n resource: check.resource,\n recordId,\n attributes: (check.params || {}) as Record<string, unknown>,\n actions: new Set(),\n });\n }\n uniqueResources.get(key)!.actions.add(check.action);\n }\n\n const uniqueEntries = Array.from(uniqueResources.values());\n\n // Build batch payload for Cerbos\n const batchPayload = uniqueEntries.map((entry) => ({\n resource: entry.resource,\n recordId: entry.recordId,\n attributes: entry.attributes,\n actions: Array.from(entry.actions),\n }));\n\n try {\n // Single SDK call for all permissions\n const result = await policy.checkResource(batchPayload) as {\n results?: Array<{ actions?: Record<string, string> }>;\n };\n\n // Build results lookup\n const resultsByResource = new Map<string, Record<string, string>>();\n result?.results?.forEach((r, index) => {\n const payload = batchPayload[index];\n const key = `${payload.resource}:${payload.recordId}`;\n resultsByResource.set(key, r.actions || {});\n });\n\n // Map results back to original checks order (DataLoader requirement)\n return checks.map((check) => {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n const actions = resultsByResource.get(key) || {};\n const allowed = actions[check.action] === \"EFFECT_ALLOW\";\n\n return {\n can: allowed,\n reason: allowed ? undefined : \"Permission denied by policy\",\n };\n });\n } catch (error) {\n console.error(\"Batch permission check failed:\", error);\n return checks.map(() => ({\n can: false,\n reason: error instanceof Error ? error.message : \"Permission check failed\",\n }));\n }\n },\n {\n batchScheduleFn: (callback) => setTimeout(callback, batchDelayMs),\n cache: false, // TanStack Query handles caching\n }\n );\n\n return {\n can: async ({ resource, action, params }) => {\n if (!resource) {\n return { can: false, reason: \"Resource not specified\" };\n }\n\n return permissionLoader.load({\n resource,\n action,\n params,\n });\n },\n\n options: {\n buttons: {\n enableAccessControl: true,\n hideIfUnauthorized: true,\n },\n queryOptions: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n },\n },\n };\n}\n"]}
|