@kyro-cms/core 0.1.4 → 0.1.5

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.
Files changed (77) hide show
  1. package/dist/bootstrap-BDTTUGY2.js +4 -0
  2. package/dist/{bootstrap-Q2TWUQF3.js.map → bootstrap-BDTTUGY2.js.map} +1 -1
  3. package/dist/bootstrap-X6TP3NKX.cjs +29 -0
  4. package/dist/{bootstrap-2WJK6PG7.cjs.map → bootstrap-X6TP3NKX.cjs.map} +1 -1
  5. package/dist/chunk-5BLDMQED.cjs +18 -0
  6. package/dist/{chunk-Q7SFCCGT.cjs.map → chunk-5BLDMQED.cjs.map} +1 -1
  7. package/dist/{chunk-U4CHJTWX.cjs → chunk-7G6EVYCU.cjs} +5 -5
  8. package/dist/{chunk-U4CHJTWX.cjs.map → chunk-7G6EVYCU.cjs.map} +1 -1
  9. package/dist/chunk-A3RQWHKD.cjs +263 -0
  10. package/dist/chunk-A3RQWHKD.cjs.map +1 -0
  11. package/dist/{chunk-V67YXRBT.js → chunk-C74MQIRL.js} +517 -203
  12. package/dist/chunk-C74MQIRL.js.map +1 -0
  13. package/dist/{chunk-XLMVCGXA.js → chunk-LRTZJJPD.js} +3 -3
  14. package/dist/{chunk-XLMVCGXA.js.map → chunk-LRTZJJPD.js.map} +1 -1
  15. package/dist/{chunk-I4BORBXT.cjs → chunk-MHS6CPO5.cjs} +517 -204
  16. package/dist/chunk-MHS6CPO5.cjs.map +1 -0
  17. package/dist/chunk-NSBPE2FW.js +15 -0
  18. package/dist/{chunk-PZ5AY32C.js.map → chunk-NSBPE2FW.js.map} +1 -1
  19. package/dist/{chunk-M4JFHQ5J.js → chunk-QUJ4OLSC.js} +3 -3
  20. package/dist/{chunk-M4JFHQ5J.js.map → chunk-QUJ4OLSC.js.map} +1 -1
  21. package/dist/{chunk-5AOILNGY.cjs → chunk-TZFJMPCH.cjs} +4 -4
  22. package/dist/{chunk-5AOILNGY.cjs.map → chunk-TZFJMPCH.cjs.map} +1 -1
  23. package/dist/chunk-VMSRTAH7.js +256 -0
  24. package/dist/chunk-VMSRTAH7.js.map +1 -0
  25. package/dist/{chunk-KA3UOIFC.js → chunk-XTZSUDSI.js} +3 -3
  26. package/dist/{chunk-KA3UOIFC.js.map → chunk-XTZSUDSI.js.map} +1 -1
  27. package/dist/{chunk-KWTKEBHM.cjs → chunk-YD7Y25W7.cjs} +19 -19
  28. package/dist/{chunk-KWTKEBHM.cjs.map → chunk-YD7Y25W7.cjs.map} +1 -1
  29. package/dist/cli/index.cjs +5 -5
  30. package/dist/cli/index.js +5 -5
  31. package/dist/database-7CJOXEZR.js +5 -0
  32. package/dist/{database-37KXWUER.js.map → database-7CJOXEZR.js.map} +1 -1
  33. package/dist/database-QOIV44GT.cjs +22 -0
  34. package/dist/{database-LJKD3HE4.cjs.map → database-QOIV44GT.cjs.map} +1 -1
  35. package/dist/drizzle/index.cjs +8 -8
  36. package/dist/drizzle/index.d.cts +1 -1
  37. package/dist/drizzle/index.d.ts +1 -1
  38. package/dist/drizzle/index.js +4 -4
  39. package/dist/graphql/index.cjs +1 -1
  40. package/dist/graphql/index.js +1 -1
  41. package/dist/{index-CzkEHKqu.d.cts → index-BMySjW6o.d.cts} +6 -0
  42. package/dist/{index-BVFlb7uU.d.ts → index-CMUNCIWQ.d.ts} +6 -0
  43. package/dist/index.cjs +727 -346
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.cts +229 -62
  46. package/dist/index.d.ts +229 -62
  47. package/dist/index.js +706 -331
  48. package/dist/index.js.map +1 -1
  49. package/dist/mongodb/index.cjs +1 -1
  50. package/dist/mongodb/index.js +1 -1
  51. package/dist/postgres-auth-adapter-REJFUMP7.js +5 -0
  52. package/dist/{postgres-auth-adapter-LTDUGBMB.js.map → postgres-auth-adapter-REJFUMP7.js.map} +1 -1
  53. package/dist/postgres-auth-adapter-VK6GY7LX.cjs +14 -0
  54. package/dist/{postgres-auth-adapter-CYZAVPPP.cjs.map → postgres-auth-adapter-VK6GY7LX.cjs.map} +1 -1
  55. package/dist/redis-adapter-4YDY4LWE.js +4 -0
  56. package/dist/redis-adapter-4YDY4LWE.js.map +1 -0
  57. package/dist/redis-adapter-LBLNKGNS.cjs +13 -0
  58. package/dist/redis-adapter-LBLNKGNS.cjs.map +1 -0
  59. package/dist/rest/index.cjs +1 -1
  60. package/dist/rest/index.js +1 -1
  61. package/dist/templates/index.cjs +1 -1
  62. package/dist/templates/index.js +1 -1
  63. package/dist/trpc/index.cjs +1 -1
  64. package/dist/trpc/index.js +1 -1
  65. package/dist/ws/index.cjs +1 -1
  66. package/dist/ws/index.js +1 -1
  67. package/package.json +2 -2
  68. package/dist/bootstrap-2WJK6PG7.cjs +0 -29
  69. package/dist/bootstrap-Q2TWUQF3.js +0 -4
  70. package/dist/chunk-I4BORBXT.cjs.map +0 -1
  71. package/dist/chunk-PZ5AY32C.js +0 -9
  72. package/dist/chunk-Q7SFCCGT.cjs +0 -11
  73. package/dist/chunk-V67YXRBT.js.map +0 -1
  74. package/dist/database-37KXWUER.js +0 -5
  75. package/dist/database-LJKD3HE4.cjs +0 -22
  76. package/dist/postgres-auth-adapter-CYZAVPPP.cjs +0 -14
  77. package/dist/postgres-auth-adapter-LTDUGBMB.js +0 -5
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/registry/validator.ts","../src/registry/zod-builder.ts","../src/registry/index.ts","../src/createKyro.ts","../src/fields/types.ts","../src/hooks/types.ts","../src/database/local/adapter.ts","../src/plugins/index.ts","../src/styling/index.ts","../src/auth/sqlite-adapter.ts","../src/auth/security/lockout.ts","../src/auth/security/rate-limit.ts","../src/auth/security/audit-log.ts","../src/api/rest/auth-middleware.ts","../src/api/rest/auth-routes.ts","../src/auth/config.ts","../src/auth/index.ts","../src/versions/types.ts","../src/versions/index.ts","../src/registry/config.ts"],"names":["fields","randomBytes","jwt","bcrypt"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOO,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EACxC,MAAA;AAAA,EAEP,YAAY,MAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,CAAA;AAAA,EAAqC,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC9D,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;AAMO,SAAS,mBAAmB,MAAA,EAAoC;AACrE,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,MAAA,CAAO,KAAK,CAAA,uCAAA,CAAyC,CAAA;AAAA,EACvD,WAAW,CAAC,oBAAA,CAAqB,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AAClD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,MAAA,CAAO,IAAI,CAAA,4CAAA,CAA8C,CAAA;AAAA,EAC3F;AAGA,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,EAAG;AAChD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,uBAAA,CAAyB,CAAA;AAAA,EACjE,CAAA,MAAO;AACL,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,CAAO,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC7D,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,KAAA,MAAW,CAAC,QAAQ,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AAC7D,MAAA,IAAI,OAAO,OAAA,KAAY,SAAA,IAAa,OAAO,YAAY,UAAA,EAAY;AACjE,QAAA,MAAA,CAAO,KAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,qBAAA,EAAwB,MAAM,CAAA,8BAAA,CAAgC,CAAA;AAAA,MACtG;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,KAAA,CAAO,UAAU,CAAA;AAC/E,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAA,CAAO,IAAA,CAAK,eAAe,MAAA,CAAO,IAAI,gDAAgD,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IAClH;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,OAAO,cAAA,EAAgB;AAChC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,KAAA,CAAM,cAAA,EAAgB;AAC7C,MAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,GAAG,CAAA;AAC1D,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAA,CAAO,KAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,iDAAA,EAAoD,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,IAAI,OAAO,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,EAAG;AACzD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,kCAAA,CAAoC,CAAA;AAAA,IAC5E;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,IAAI,OAAO,QAAA,CAAS,SAAA,IAAa,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG;AAC/D,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,qCAAA,CAAuC,CAAA;AAAA,IAC/E;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,OAAO,CAAA;AAChE,IAAA,MAAM,mBAAmB,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,UAAU,CAAA;AACtE,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,6CAAA,CAA+C,CAAA;AAAA,IACvF;AACA,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,IAAI,CAAA,+CAAA,CAAiD,CAAA;AAAA,IACzF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,eAAe,MAAA,EAAgC;AAC7D,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,MAAA,CAAO,KAAK,CAAA,mCAAA,CAAqC,CAAA;AAAA,EACnD,WAAW,CAAC,oBAAA,CAAqB,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AAClD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,MAAA,CAAO,IAAI,CAAA,4CAAA,CAA8C,CAAA;AAAA,EACvF;AAGA,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,EAAG;AAChD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,uBAAA,CAAyB,CAAA;AAAA,EAC7D,CAAA,MAAO;AACL,IAAA,MAAM,cAAc,cAAA,CAAe,MAAA,CAAO,QAAQ,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AACzE,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,cAAA,CAAe,QAAiB,OAAA,EAA2B;AACzE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AAEnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AAGtB,IAAA,IAAI,KAAA,CAAM,SAAS,KAAA,IAAS,KAAA,CAAM,SAAS,aAAA,IAAiB,KAAA,CAAM,SAAS,MAAA,EAAQ;AAEjF,MAAA,IAAI,QAAA,IAAY,KAAA,IAAS,KAAA,CAAM,MAAA,EAAQ;AACrC,QAAA,MAAM,YAAA,GAAe,cAAA,CAAe,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAA;AACzD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,UAAU,KAAA,EAAO;AAC1B,QAAA,KAAA,MAAW,GAAA,IAAQ,MAAc,IAAA,EAAM;AACrC,UAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AACpD,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,QAC1B;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,iBAAA,EAAoB,CAAC,CAAA,6BAAA,CAA+B,CAAA;AAC1E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/D;AACA,IAAA,UAAA,CAAW,IAAI,SAAS,CAAA;AAExB,IAAA,IAAI,CAAC,yBAAA,CAA0B,IAAA,CAAK,SAAS,CAAA,EAAG;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,cAAA,EAAiB,SAAS,CAAA,uCAAA,CAAyC,CAAA;AAAA,IAC3F;AAGA,IAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,8BAAA,CAAgC,CAAA;AAC3E,MAAA;AAAA,IACF;AAGA,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,cAAA;AACH,QAAA,IAAI,CAAC,MAAM,UAAA,EAAY;AACrB,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,sBAAA,EAAyB,SAAS,CAAA,yBAAA,CAA2B,CAAA;AAAA,QACrF;AACA,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,EAAG;AAC9C,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,eAAA,EAAkB,SAAS,CAAA,uBAAA,CAAyB,CAAA;AAAA,QAC5E,CAAA,MAAO;AACL,UAAA,MAAM,WAAA,GAAc,eAAe,KAAA,CAAM,MAAA,EAAQ,GAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAC1E,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,QAC5B;AACA,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,EAAG;AAC9C,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,eAAA,EAAkB,SAAS,CAAA,uBAAA,CAAyB,CAAA;AAAA,QAC5E,CAAA,MAAO;AACL,UAAA,MAAM,WAAA,GAAc,eAAe,KAAA,CAAM,MAAA,EAAQ,GAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAC1E,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,QAC5B;AACA,QAAA;AAAA,MAEF,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,EAAG;AAC9C,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,uBAAA,CAAyB,CAAA;AAAA,QAC7E,CAAA,MAAO;AACL,UAAA,MAAM,WAAA,GAAc,eAAe,KAAA,CAAM,MAAA,EAAQ,GAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAC1E,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,QAC5B;AACA,QAAA;AAAA,MAEF,KAAK,QAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAChD,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,OAAO,CAAA,EAAA,EAAK,MAAM,IAAI,CAAA,QAAA,EAAW,SAAS,CAAA,wBAAA,CAA0B,CAAA;AAAA,QACrF,CAAA,MAAO;AACL,UAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAW,EAAE,KAAK,CAAA;AACpD,UAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,MAAM,CAAA;AACnC,UAAA,IAAI,MAAA,CAAO,MAAA,KAAW,YAAA,CAAa,IAAA,EAAM;AACvC,YAAA,MAAA,CAAO,IAAA,CAAK,GAAG,OAAO,CAAA,EAAA,EAAK,MAAM,IAAI,CAAA,QAAA,EAAW,SAAS,CAAA,6BAAA,CAA+B,CAAA;AAAA,UAC1F;AAAA,QACF;AACA,QAAA;AAAA,MAEF,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,MAAM,UAAA,EAAY;AACrB,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,yBAAA,CAA2B,CAAA;AAAA,QAC/E;AACA,QAAA;AAAA;AAIJ,IAAA,IAAI,SAAS,KAAA,IAAS,KAAA,IAAS,SAAU,KAAA,CAAc,GAAA,GAAO,MAAc,GAAA,EAAK;AAC/E,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,0BAAA,CAA4B,CAAA;AAAA,IACzE;AAEA,IAAA,IAAI,eAAe,KAAA,IAAS,WAAA,IAAe,SAAU,KAAA,CAAc,SAAA,GAAa,MAAc,SAAA,EAAW;AACvG,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,sCAAA,CAAwC,CAAA;AAAA,IACrF;AAEA,IAAA,IAAI,aAAa,KAAA,IAAS,SAAA,IAAa,SAAU,KAAA,CAAc,OAAA,GAAW,MAAc,OAAA,EAAS;AAC/F,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,kCAAA,CAAoC,CAAA;AAAA,IACjF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,cAAA,CAAe,QAAiB,OAAA,EAA2B;AACzE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAE9B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,oCAAA,CAAsC,CAAA;AAC5D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,CAAA,wBAAA,EAA2B,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,IAAI,CAAA;AAEpB,IAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAChB,MAAA,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,KAAA,CAAM,IAAI,CAAA,+BAAA,CAAiC,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,EAAG;AAC9C,MAAA,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,KAAA,CAAM,IAAI,CAAA,uBAAA,CAAyB,CAAA;AAAA,IACvE,CAAA,MAAO;AACL,MAAA,MAAM,WAAA,GAAc,eAAe,KAAA,CAAM,MAAA,EAAQ,GAAG,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC3E,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,cAAA,CAAe,WAAA,EAAiC,OAAA,GAA0B,EAAC,EAAS;AAClG,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAG9B,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,IAAI,KAAA,CAAM,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,2BAAA,EAA8B,UAAA,CAAW,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9D;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,WAAW,IAAI,CAAA;AAAA,EAC3B;AAGA,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,uBAAA,EAA0B,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IACtD;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,EACvB;AAGA,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,MAAM,gBAAA,GAAmB,mBAAmB,UAAU,CAAA;AACtD,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,gBAAgB,CAAA;AAAA,EACjC;AAGA,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,YAAA,GAAe,eAAe,MAAM,CAAA;AAC1C,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,EAC7B;AAGA,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,UAAA,CAAW,MAAA,EAAQ,WAAW,CAAA;AAC/E,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,kBAAkB,CAAA;AAAA,EACnC;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,sBAAsB,MAAM,CAAA;AAAA,EACxC;AACF;AAEA,SAAS,qBAAA,CAAsB,QAAiB,WAAA,EAA2C;AACzF,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAE5D,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,UAAU,IAAI,KAAA,CAAM,UAAA,GAAa,CAAC,KAAA,CAAM,UAAU,CAAA;AACtF,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA,EAAG;AAChC,UAAA,MAAA,CAAO,KAAK,CAAA,oBAAA,EAAuB,KAAA,CAAM,IAAI,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,QAC5F;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,UAAU,IAAI,KAAA,CAAM,UAAA,GAAa,CAAC,KAAA,CAAM,UAAU,CAAA;AACtF,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA,EAAG;AAChC,UAAA,MAAA,CAAO,KAAK,CAAA,cAAA,EAAiB,KAAA,CAAM,IAAI,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,QACtF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,IAAY,KAAA,IAAS,KAAA,CAAM,MAAA,EAAQ;AACrC,MAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,KAAA,CAAM,MAAA,EAAQ,WAAW,CAAA;AACpE,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,UAAU,KAAA,EAAO;AACnB,MAAA,KAAA,MAAW,GAAA,IAAQ,MAAc,IAAA,EAAM;AACrC,QAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,GAAA,CAAI,MAAA,EAAQ,WAAW,CAAA;AAC/D,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,KAAA,MAAW,KAAA,IAAU,MAAc,MAAA,EAAQ;AACzC,QAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,KAAA,CAAM,MAAA,EAAQ,WAAW,CAAA;AACnE,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AC3UO,SAAS,WAAW,KAAA,EAA0B;AACnD,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,QAAA;AACH,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,OAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B,KAAK,QAAA;AACH,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B,KAAK,OAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,OAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB,KAAK,QAAA;AACH,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B,KAAK,UAAA;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC5B,KAAK,cAAA;AACH,MAAA,OAAO,kBAAkB,KAAK,CAAA;AAAA,IAChC,KAAK,OAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,OAAA;AACH,MAAA,OAAO,WAAW,KAAK,CAAA;AAAA,IACzB,KAAK,QAAA;AACH,MAAA,OAAO,YAAY,KAAK,CAAA;AAAA,IAC1B,KAAK,KAAA;AACH,MAAA,OAAO,SAAS,KAAK,CAAA;AAAA,IACvB,KAAK,aAAA;AACH,MAAA,OAAO,iBAAiB,KAAK,CAAA;AAAA,IAC/B,KAAK,MAAA;AACH,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB;AACE,MAAA,OAAO,EAAE,GAAA,EAAI;AAAA;AAEnB;AAMA,SAAS,UAAU,KAAA,EAA8B;AAC/C,EAAA,IAAI,MAAA,GAAqB,EAAE,MAAA,EAAO;AAClC,EAAA,IAAI,MAAM,SAAA,EAAW,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,SAAS,CAAA;AACjE,EAAA,IAAI,MAAM,SAAA,EAAW,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,SAAS,CAAA;AACjE,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,GAAU,MAAA,CAAe,MAAM,IAAI,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,CAAA;AAC3E,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,OAAA,EAAS,MAAA,GAAU,OAAe,KAAA,EAAM;AAC9D,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,KAAA,EAAO,MAAA,GAAU,OAAe,GAAA,EAAI;AAC1D,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,MAAA,GAAS,CAAA,CAAE,MAAM,MAAM,CAAA;AAC1C,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAgC;AACnD,EAAA,IAAI,MAAA,GAAqB,MAAM,OAAA,GAAU,CAAA,CAAE,QAAO,CAAE,GAAA,EAAI,GAAI,CAAA,CAAE,MAAA,EAAO;AACrE,EAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,WAAqB,MAAA,CAAe,GAAA,CAAI,MAAM,GAAG,CAAA;AACnE,EAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,WAAqB,MAAA,CAAe,GAAA,CAAI,MAAM,GAAG,CAAA;AACnE,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,MAAA,GAAU,MAAA,CAAe,MAAA;AAAA,MACvB,CAAC,GAAA,KAAgB,MAAA,CAAO,SAAA,CAAU,GAAA,GAAM,MAAM,IAAK,CAAA;AAAA,MACnD,CAAA,2BAAA,EAA8B,MAAM,IAAI,CAAA;AAAA,KAC1C;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,MAAA,GAAS,CAAA,CAAE,MAAM,MAAM,CAAA;AAC1C,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,IAAI,MAAA,GAAqB,EAAE,OAAA,EAAQ;AACnC,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAA8B;AAC/C,EAAA,IAAI,MAAA,GAAqB,CAAA,CAAE,MAAA,EAAO,CAAE,MAAA;AAAA,IAClC,CAAC,GAAA,KAAQ,CAAC,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,IAC/B;AAAA,GACF;AACA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,MAAA,GAAU,MAAA,CAAe,MAAA;AAAA,MACvB,CAAC,QAAgB,IAAI,IAAA,CAAK,GAAG,CAAA,IAAK,IAAI,IAAA,CAAK,KAAA,CAAM,OAAQ,CAAA;AAAA,MACzD,CAAA,mBAAA,EAAsB,MAAM,OAAO,CAAA;AAAA,KACrC;AAAA,EACF;AACA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,MAAA,GAAU,MAAA,CAAe,MAAA;AAAA,MACvB,CAAC,QAAgB,IAAI,IAAA,CAAK,GAAG,CAAA,IAAK,IAAI,IAAA,CAAK,KAAA,CAAM,OAAQ,CAAA;AAAA,MACzD,CAAA,oBAAA,EAAuB,MAAM,OAAO,CAAA;AAAA,KACtC;AAAA,EACF;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,IAAI,MAAA,GAAqB,CAAA,CAAE,MAAA,EAAO,CAAE,MAAM,eAAe,CAAA;AACzD,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,IAAI,SAAqB,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,wCAAwC,CAAA;AACnF,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,IAAI,MAAA,GAAqB,EAAE,MAAA,EAAO;AAClC,EAAA,IAAI,MAAM,SAAA,EAAW,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,SAAS,CAAA;AACjE,EAAA,IAAI,MAAM,SAAA,EAAW,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,SAAS,CAAA;AACjE,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAgC;AACnD,EAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AACjD,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,MAA+B,CAAC,CAAA;AAAA,EAC1D,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,CAAA,CAAE,KAAK,MAA+B,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,KAAK,CAAA;AACjD,EAAA,IAAI,MAAA,GAAqB,CAAA,CAAE,IAAA,CAAK,MAA+B,CAAA;AAC/D,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,IAAI,MAAA,GAAqB,EAAE,MAAA,EAAO;AAClC,EAAA,IAAI,MAAM,MAAA,KAAW,KAAA,EAAO,MAAA,GAAU,MAAA,CAAe,MAAM,mBAAmB,CAAA;AAC9E,EAAA,IAAI,MAAM,MAAA,KAAW,KAAA,EAAO,MAAA,GAAU,MAAA,CAAe,MAAM,oDAAoD,CAAA;AAC/G,EAAA,IAAI,MAAM,MAAA,KAAW,KAAA,EAAO,MAAA,GAAU,MAAA,CAAe,MAAM,sDAAsD,CAAA;AACjH,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,IAAI,MAAA,GAAqB,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,IACxC,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,IACf,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA;AAAA,IACtB,UAAU,CAAA,CAAE,KAAA,CAAM,EAAE,GAAA,EAAK,EAAE,QAAA;AAAS,GACrC,CAAC,CAAA;AACF,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAA8B;AAC/C,EAAA,IAAI,MAAA,GAAqB,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA;AACzC,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAA8B;AAC/C,EAAA,IAAI,MAAA,GAAqB,EAAE,MAAA,EAAO;AAClC,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAgC;AACnD,EAAA,IAAI,MAAA,GAAqB,EAAE,MAAA,EAAO;AAClC,EAAA,IAAI,MAAM,OAAA,EAAS,MAAA,GAAS,EAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA;AAC9C,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,IAAI,MAAA,GAAqB,EAAE,MAAA,EAAO;AAClC,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,kBAAkB,KAAA,EAAsC;AAC/D,EAAA,IAAI,MAAA,GAAqB,EAAE,MAAA,EAAO;AAClC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA,EAAG;AACnC,IAAA,MAAA,GAAS,EAAE,MAAA,CAAO;AAAA,MAChB,UAAA,EAAY,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,UAAmC,CAAA;AAAA,MAC5D,KAAA,EAAO,EAAE,MAAA;AAAO,KACjB,CAAA;AAAA,EACH;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,MAAA,GAAS,CAAA,CAAE,MAAM,MAAM,CAAA;AAC1C,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAS,OAAO,QAAA,EAAS;AAC9C,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,MAAM,aAAa,CAAA,CAAE,MAAA;AAAA,IACnB,MAAA,CAAO,WAAA;AAAA,MACL,KAAA,CAAM,MAAA,CACH,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAClB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAO,UAAA,CAAW,CAAC,CAAC,CAAC;AAAA;AACtC,GACF;AACA,EAAA,IAAI,MAAA,GAAqB,CAAA,CAAE,KAAA,CAAM,UAAU,CAAA;AAC3C,EAAA,IAAI,MAAM,OAAA,EAAS,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,OAAO,CAAA;AAC7D,EAAA,IAAI,MAAM,OAAA,EAAS,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,OAAO,CAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AAAA,IACf,MAAA,CAAO,WAAA;AAAA,MACL,KAAA,CAAM,MAAA,CACH,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAClB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAO,UAAA,CAAW,CAAC,CAAC,CAAC;AAAA;AACtC,GACF;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,OAAQ,OAAe,QAAA,EAAS;AACrD,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAgC;AACnD,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS;AAC7C,IAAA,OAAO,EAAE,MAAA,CAAO;AAAA,MACd,SAAA,EAAW,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAAA,MAC/B,GAAG,MAAA,CAAO,WAAA;AAAA,QACR,KAAA,CAAM,MAAA,CACH,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAClB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAO,UAAA,CAAW,CAAC,CAAC,CAAC;AAAA;AACtC,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,IAAI,SAAqB,CAAA,CAAE,KAAA,CAAM,EAAE,kBAAA,CAAmB,WAAA,EAAa,YAAmB,CAAC,CAAA;AACvF,EAAA,IAAI,MAAM,OAAA,EAAS,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,OAAO,CAAA;AAC7D,EAAA,IAAI,MAAM,OAAA,EAAS,MAAA,GAAU,MAAA,CAAe,GAAA,CAAI,MAAM,OAAO,CAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,MAAA,GAAU,OAAe,QAAA,EAAS;AACvD,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,GAAS,mBAAA,CAAoB,MAAA,EAAQ,MAAM,QAAQ,CAAA;AACvE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAA6B;AAC7C,EAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AAAA,IACf,MAAA,CAAO,WAAA;AAAA,MACL,KAAA,CAAM,MAAA,CACH,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAClB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAO,UAAA,CAAW,CAAC,CAAC,CAAC;AAAA;AACtC,GACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAiB,KAAA,EAAqC;AAC7D,EAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AAAA,IACf,MAAA,CAAO,WAAA;AAAA,MACL,KAAA,CAAM,MAAA,CACH,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAClB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAO,UAAA,CAAW,CAAC,CAAC,CAAC;AAAA;AACtC,GACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAA8B;AAC/C,EAAA,MAAM,UAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,EAAM;AAC5B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,MAAA,IAAI,EAAE,IAAA,EAAM;AACV,QAAA,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,CAAA,CAAE,OAAO,OAAO,CAAA;AACzB;AAMA,SAAS,mBAAA,CAAoB,QAAoB,QAAA,EAAwG;AACvJ,EAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IACZ,OAAO,GAAA,KAAa;AAClB,MAAA,MAAM,SAAS,MAAM,QAAA,CAAS,KAAK,EAAE,QAAA,EAAU,OAAO,CAAA;AACtD,MAAA,OAAO,MAAA,KAAW,IAAA;AAAA,IACpB,CAAA;AAAA,IACA;AAAA,MACE,OAAA,EAAS;AAAA;AACX,GACF;AACF;AAMO,SAAS,gBAAgB,UAAA,EAA0C;AACxE,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,UAAA,CAAW,KAAK,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,KAAA,CAAM,WAAW,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AACzC,IAAA,KAAA,CAAM,WAAW,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAAA,EAC3C;AAEA,EAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,IAAA,KAAA,CAAM,UAAU,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAAA,EAC1C;AAEA,EAAA,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAElC,EAAA,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AACvB;AAEO,SAAS,sBAAsB,UAAA,EAA0C;AAC9E,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,UAAA,CAAW,KAAK,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AACvB;AAEO,SAAS,sBAAsB,UAAA,EAA0C;AAC9E,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,KAAA,CAAM,MAAM,IAAI,CAAA,GAAI,UAAA,CAAW,KAAK,EAAE,QAAA,EAAS;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AACvB;AAEO,SAAS,qBAAqB,UAAA,EAA0C;AAC7E,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO;AAAA,QAC3B,MAAA,EAAQ,CAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,QACzB,UAAA,EAAY,CAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,QAC7B,IAAI,CAAA,CAAE,KAAA,CAAM,EAAE,GAAA,EAAK,EAAE,QAAA,EAAS;AAAA,QAC9B,QAAQ,CAAA,CAAE,KAAA,CAAM,EAAE,GAAA,EAAK,EAAE,QAAA,EAAS;AAAA,QAClC,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAClC,kBAAA,EAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACxC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC/B,eAAA,EAAiB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACrC,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC1B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC9B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC9B,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,OAC9B,EAAE,QAAA,EAAS;AAAA,IACd;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAC,EAAE,QAAA,EAAS;AAC/D,EAAA,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAC,EAAE,QAAA,EAAS;AAE9D,EAAA,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,QAAA,EAAS;AAClC;AAMO,SAAS,YAAY,MAAA,EAAkC;AAC5D,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,UAAA,CAAW,KAAK,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS;AAElC,EAAA,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AACvB;;;AC5bO,IAAM,WAAN,MAAe;AAAA,EACZ,WAAA,uBAAiD,GAAA,EAAI;AAAA,EACrD,OAAA,uBAAyC,GAAA,EAAI;AAAA,EAC7C,UAA0B,EAAC;AAAA,EAC3B,WAAA,uBAA2C,GAAA,EAAI;AAAA,EAC/C,WAAA,GAAc,KAAA;AAAA;AAAA;AAAA;AAAA,EAMtB,cAAc,MAAA,EAAgC;AAC5C,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,IAC9E;AAGA,IAAA,IAAI,WAAA,GAAc,EAAE,GAAG,MAAA,EAAO;AAC9B,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,QAAA,WAAA,GAAc,MAAA,CAAO,gBAAA,CAAiB,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAAA,MACrE;AAAA,IACF;AAGA,IAAA,WAAA,CAAY,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,WAAW,CAAA;AAExD,IAAA,MAAM,MAAA,GAAS,mBAAmB,WAAW,CAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACnE;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAClD,IAAA,IAAA,CAAK,gBAAA,CAAiB,YAAY,IAAI,CAAA;AAAA,EACxC;AAAA,EAEA,eAAe,OAAA,EAAmC;AAChD,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAA,CAAK,cAAc,MAAM,CAAA;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,cAAc,IAAA,EAA4C;AACxD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,cAAA,GAAqC;AACnC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,EAC7C;AAAA,EAEA,kBAAA,GAA+B;AAC7B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEA,cAAc,IAAA,EAAuB;AACnC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,iBAAiB,IAAA,EAAuB;AACtC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,IACjF;AACA,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,MAAA,EAA4B;AACpC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AACpC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,WAAA,GAAc,EAAE,GAAG,MAAA,EAAO;AAC9B,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,IAAI,OAAO,YAAA,EAAc;AACvB,QAAA,WAAA,GAAc,MAAA,CAAO,YAAA,CAAa,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAAA,MACjE;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAC9C,IAAA,IAAA,CAAK,gBAAA,CAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AAAA,EACpD;AAAA,EAEA,WAAW,OAAA,EAA+B;AACxC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,UAAU,IAAA,EAAwC;AAChD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,UAAA,GAA6B;AAC3B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,cAAA,GAA2B;AACzB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAAA,EACvC;AAAA,EAEA,UAAU,IAAA,EAAuB;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,aAAa,IAAA,EAAuB;AAClC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,IAC7E;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AACtC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,MAAA,EAA4B;AACpC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,EAC1B;AAAA,EAEA,UAAA,GAA6B;AAC3B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,IAAA,EAA0B;AACrC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACxC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,gBAAgB,UAAU,CAAA;AACzC,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AACjC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AACjC,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAA,OAAA,EAAU,IAAI,IAAI,MAAM,CAAA;AAC7C,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yCAAA,EAA4C,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACrE;AAAA,EAEA,mBAAmB,IAAA,EAA0B;AAC3C,IAAA,MAAM,QAAA,GAAW,GAAG,IAAI,CAAA,OAAA,CAAA;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,sBAAsB,UAAU,CAAA;AAC/C,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AACrC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3D;AAAA,EAEA,mBAAmB,IAAA,EAA0B;AAC3C,IAAA,MAAM,QAAA,GAAW,GAAG,IAAI,CAAA,OAAA,CAAA;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,sBAAsB,UAAU,CAAA;AAC/C,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AACrC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3D;AAAA,EAEA,kBAAkB,IAAA,EAA0B;AAC1C,IAAA,MAAM,QAAA,GAAW,GAAG,IAAI,CAAA,MAAA,CAAA;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,qBAAqB,UAAU,CAAA;AAC9C,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AACrC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3D;AAAA,EAEA,kBAAkB,KAAA,EAA0B;AAC1C,IAAA,OAAO,WAAW,KAAK,CAAA;AAAA,EACzB;AAAA,EAEQ,iBAAiB,IAAA,EAAoB;AAC3C,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,IAAI,CAAA;AAC5B,IAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS,CAAA;AACxC,IAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS,CAAA;AACxC,IAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAA,EAAG,IAAI,CAAA,MAAA,CAAQ,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,MAAA,EAAmC;AAC5D,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAA,CAAO,MAAM,CAAA;AAGhC,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,OAAA,CAAQ;AAAA,QACb,IAAA,EAAM,IAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,EAAM,QAAQ,IAAA;AAAK,OACvC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,MAAA,CAAO,gBAAgB,CAAC,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,EAAG;AACnE,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,EAAM,QAAQ,IAAA;AAAK,OACvC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,MAAA,CAAO,cAAc,CAAC,MAAA,CAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,WAAW,CAAA,EAAG;AAClE,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,EAAM,QAAQ,IAAA;AAAK,OACvC,CAAA;AACD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,EAAM,QAAQ,IAAA;AAAK,OACvC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,UAAU,IAAA,EAAuB;AAC/B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,SAAmB,UAAA,CAAW,MAAA;AAElC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,MAAA,SAAe,MAAA,CAAO,MAAA;AAE1B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yCAAA,EAA4C,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACrE;AAAA,EAEA,YAAY,IAAA,EAAkC;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAClC,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAmB;AAEnC,IAAA,MAAM,SAAA,GAAY,CAACA,OAAAA,KAAoB;AACrC,MAAA,KAAA,MAAW,SAASA,OAAAA,EAAQ;AAC1B,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,QAC3B;AACA,QAAA,IAAI,QAAA,IAAY,KAAA,IAAS,KAAA,CAAM,MAAA,EAAQ;AACrC,UAAA,SAAA,CAAU,MAAM,MAAM,CAAA;AAAA,QACxB;AACA,QAAA,IAAI,UAAU,KAAA,EAAO;AACnB,UAAA,KAAA,MAAW,GAAA,IAAQ,MAAc,IAAA,EAAM;AACrC,YAAA,SAAA,CAAU,IAAI,MAAM,CAAA;AAAA,UACtB;AAAA,QACF;AACA,QAAA,IAAI,YAAY,KAAA,EAAO;AACrB,UAAA,KAAA,MAAW,KAAA,IAAU,MAAc,MAAA,EAAQ;AACzC,YAAA,SAAA,CAAU,MAAM,MAAM,CAAA;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,SAAA,CAAU,MAAM,CAAA;AAChB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,iBAAiB,IAAA,EAAuB;AACtC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAClC,IAAA,OAAO,OAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAAiB;AACf,IAAA,MAAM,WAAA,GAAc,KAAK,cAAA,EAAe;AACxC,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,IAAA,cAAA,CAAe,aAAa,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAGd,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,MAAM,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA,EAEA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,IAAA,EAA0D;AAC9E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,YAAA,IAAgB,EAAA;AAAA,MAC7D,MAAA,EAAQ,YAAY,KAAA,EAAO,UAAA,EAAY,UAAU,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG;AAAA,KACnE;AAAA,EACF;AAAA,EAEA,eAAe,IAAA,EAAsB;AACnC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,YAAY,KAAA,EAAO,UAAA;AACtC,IAAA,IAAI,YAAY,OAAO,UAAA;AACvB,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,kBAAkB,IAAA,EAAwB;AACxC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY,OAAO,cAAA,EAAgB;AACrC,MAAA,OAAO,WAAW,KAAA,CAAM,cAAA;AAAA,IAC1B;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AACzC,IAAA,OAAO,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAK,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,IAAA,EAAsB;AAClC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,OAAO,UAAA,EAAY,KAAA,IAAS,UAAA,EAAY,KAAA,EAAO,WAAA,IAAe,IAAA;AAAA,EAChE;AAAA,EAEA,cAAc,IAAA,EAAsB;AAClC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAC5C,IAAA,OAAO,UAAA,EAAY,aAAA,IAAiB,UAAA,EAAY,KAAA,IAAS,IAAA;AAAA,EAC3D;AAAA,EAEA,cAAc,IAAA,EAAkC;AAC9C,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,GAAG,KAAA,EAAO,KAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAKE;AACA,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,EAAG;AAClD,MAAA,WAAA,IAAe,WAAW,MAAA,CAAO,MAAA;AAAA,IACnC;AACA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,WAAA,IAAe,OAAO,MAAA,CAAO,MAAA;AAAA,IAC/B;AAEA,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,KAAK,WAAA,CAAY,IAAA;AAAA,MAC9B,OAAA,EAAS,KAAK,OAAA,CAAQ,IAAA;AAAA,MACtB,OAAA,EAAS,KAAK,OAAA,CAAQ,MAAA;AAAA,MACtB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEA,MAAA,GAGE;AACA,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,KAAK,cAAA,EAAe;AAAA,MACjC,OAAA,EAAS,KAAK,UAAA;AAAW,KAC3B;AAAA,EACF;AACF;AAMA,IAAI,QAAA,GAA4B,IAAA;AAEzB,SAAS,WAAA,GAAwB;AACtC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,IAAI,QAAA,EAAS;AAAA,EAC1B;AACA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,aAAA,GAAsB;AACpC,EAAA,QAAA,GAAW,IAAA;AACb;AAEO,SAAS,cAAA,GAA2B;AACzC,EAAA,QAAA,GAAW,IAAI,QAAA,EAAS;AACxB,EAAA,OAAO,QAAA;AACT;AC1aO,IAAM,OAAN,MAAW;AAAA,EACT,QAAA;AAAA,EACA,EAAA;AAAA,EACA,MAAA;AAAA,EACC,QAAA;AAAA,EACA,MAAA;AAAA,EAER,YAAY,MAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAW,cAAA,EAAe;AAC/B,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,OAAA;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA;AAG1C,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,MAAA,CAAO,WAAW,CAAA;AAAA,IACjD;AAGA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,QAAA,IAAA,CAAK,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,GAAsB;AAE1B,IAAA,MAAM,IAAA,CAAK,SAAS,IAAA,EAAK;AAGzB,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,gBAAe,EAAG,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY,CAAA;AAG7E,IAAA,IAAA,CAAK,OAAO,iBAAA,EAAkB;AAE9B,IAAA,OAAA,CAAQ,IAAI,6BAAwB,CAAA;AACpC,IAAA,OAAA,CAAQ,IAAI,CAAA,gBAAA,EAAmB,IAAA,CAAK,SAAS,cAAA,EAAe,CAAE,MAAM,CAAA,CAAE,CAAA;AACtE,IAAA,OAAA,CAAQ,IAAI,CAAA,YAAA,EAAe,IAAA,CAAK,SAAS,UAAA,EAAW,CAAE,MAAM,CAAA,CAAE,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,OAAA,EAA6D;AACnE,IAAA,OAAO,aAAA,CAAc;AAAA,MACnB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,GAAG,OAAA;AAAA,MACH,IAAA,EAAM,KAAK,MAAA,CAAO;AAAA,KACnB,CAAA;AAAA,EACH;AAAA,EAEA,WAAW,OAAA,EAA6D;AACtE,IAAA,OAAO,kBAAA,CAAmB;AAAA,MACxB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,QAAQ,OAAA,EAA6D;AACnE,IAAA,OAAO,gBAAA,CAAiB;AAAA,MACtB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,KAAK,OAAA,EAAS,GAAA,IAAO,EAAE,OAAA,EAAS,EAAC,EAAE;AAAA,MACnC,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,OAAA,EAAmG;AACtH,IAAA,IAAA,CAAK,WAAW,cAAA,CAAe;AAAA,MAC7B,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,IAAA,EAAM,SAAS,IAAA,IAAQ,IAAA;AAAA,MACvB,aAAa,OAAA,EAAS,WAAA;AAAA,MACtB,aAAa,OAAA,EAAS;AAAA,KACvB,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2CAAA,EAAuC,OAAA,EAAS,IAAA,IAAQ,IAAI,CAAA,CAAE,CAAA;AAC1E,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,IAC5B;AACA,IAAA,MAAM,IAAA,CAAK,GAAG,UAAA,EAAW;AACzB,IAAA,OAAA,CAAQ,IAAI,8BAAuB,CAAA;AAAA,EACrC;AACF;AAMO,SAAS,WAAW,MAAA,EAA0B;AACnD,EAAA,OAAO,IAAI,KAAK,MAAM,CAAA;AACxB;;;ACkIO,SAAS,YAAY,KAAA,EAAkC;AAC5D,EAAA,OAAO,MAAM,IAAA,KAAS,MAAA;AACxB;AAEO,SAAS,cAAc,KAAA,EAAoC;AAChE,EAAA,OAAO,MAAM,IAAA,KAAS,QAAA;AACxB;AAEO,SAAS,oBAAoB,KAAA,EAA0C;AAC5E,EAAA,OAAO,MAAM,IAAA,KAAS,cAAA;AACxB;AAEO,SAAS,aAAa,KAAA,EAAmC;AAC9D,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA;AACxB;AAEO,SAAS,aAAa,KAAA,EAAmC;AAC9D,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA;AACxB;AAEO,SAAS,cAAc,KAAA,EAAoC;AAChE,EAAA,OAAO,MAAM,IAAA,KAAS,QAAA;AACxB;AAEO,SAAS,cAAc,KAAA,EAAoC;AAChE,EAAA,OAAO,MAAM,IAAA,KAAS,QAAA;AACxB;AAEO,SAAS,gBAAgB,KAAA,EAAsC;AACpE,EAAA,OAAO,MAAM,IAAA,KAAS,UAAA;AACxB;AAEO,SAAS,cAAc,KAAA,EAAoC;AAChE,EAAA,OAAO,MAAM,IAAA,KAAS,QAAA;AACxB;AAEO,SAAS,cAAc,KAAA,EAAgE;AAC5F,EAAA,OAAO,MAAM,IAAA,KAAS,KAAA,IAAS,MAAM,IAAA,KAAS,aAAA,IAAiB,MAAM,IAAA,KAAS,MAAA;AAChF;AAMO,IAAM,qBAAA,GAAwB;AAAA,EACnC,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,UAAA;AAAA,EAC/C,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS;AACjC;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,UAAA;AAAA,EAAY,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU;AACxC;AAEO,IAAM,sBAAA,GAAyB;AAAA,EACpC,cAAA;AAAA,EAAgB,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS;AACpC;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,KAAA;AAAA,EAAO,aAAA;AAAA,EAAe;AACxB;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,GAAG,qBAAA;AAAA,EACH,GAAG,mBAAA;AAAA,EACH,GAAG,sBAAA;AAAA,EACH,GAAG;AACL;;;ACtPA,eAAsB,QAAA,CACpB,OACA,IAAA,EACc;AACd,EAAA,IAAI,SAAS,IAAA,CAAK,IAAA;AAElB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK;AAAA,MAC5B,GAAG,IAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,MAAA,GAAS,UAAA;AAAA,IACX;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,aAAA,CACpB,OACA,IAAA,EACc;AACd,EAAA,OAAO,QAAA,CAAS,OAAO,IAAI,CAAA;AAC7B;;;AClFO,IAAM,YAAA,GAAN,cAA2B,mBAAA,CAAoB;AAAA,EAC5C,EAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA,uBAAuC,GAAA,EAAI;AAAA,EAEnD,YAAY,OAAA,EAGT;AACD,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAEpB,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,MAAA,MAAM,QAAA,GAAA,CAAY,MAAM,OAAO,gBAAgB,CAAA,EAAG,OAAA;AAClD,MAAA,IAAA,CAAK,EAAA,GAAK,IAAI,QAAA,CAAS,IAAA,CAAK,QAAQ,UAAU,CAAA;AAAA,IAChD;AACA,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,oBAAoB,CAAA;AACnC,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,mBAAmB,CAAA;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,IAAA,CAAK,IAAA,IAAQ,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,IAChB;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAY,MAAA,EAAgC;AAClD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA;AAElD,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,EAAG;AAEpC,IAAA,MAAM,OAAA,GAAoB;AAAA,MACxB,CAAA,mBAAA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,SAAS,IAAA,EAAM;AAExC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACpC,MAAA,IAAI,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,OAAA,CAAQ,KAAK,CAAA,yCAAA,CAA2C,CAAA;AACxD,MAAA,OAAA,CAAQ,KAAK,CAAA,yCAAA,CAA2C,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,OAAA,CAAQ,KAAK,CAAA,uBAAA,CAAyB,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,YAAY,CAAA,2BAAA,EAA8B,SAAS,KAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAChF,IAAA,IAAA,CAAK,EAAA,CAAG,KAAK,SAAS,CAAA;AAGtB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,OAAA,EAAS;AAC/B,QAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,+BAAA,EAAkC,SAAS,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MACzG;AACA,MAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,MAAA,EAAQ;AAC9B,QAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,sCAAA,EAAyC,SAAS,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MACvH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAA,EAAW,IAAI,CAAA;AAAA,EACrC;AAAA,EAEQ,WAAW,KAAA,EAA2B;AAC5C,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,MAAA;AAAA,MACL,KAAK,OAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,OAAA;AAAA,MACL,KAAK,MAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,KAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB,KAAK,QAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB,KAAK,UAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,kBAAA,CAAA;AAAA,MACtB,KAAK,MAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB,KAAK,QAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB,KAAK,cAAA;AAAA,MACL,KAAK,QAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB,KAAK,MAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,OAAA;AAAA,MACL,KAAK,OAAA;AAAA,MACL,KAAK,QAAA;AACH,QAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,KAAA,CAAA;AAAA,MACtB;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAQ,IAAA,EAAwC;AACpD,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,KAAA,GAAQ,EAAC,EAAG,IAAA,EAAM,KAAA,GAAQ,EAAA,EAAI,IAAA,GAAO,CAAA,EAAG,QAAA,EAAS,GAAI,IAAA;AAC/E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,GAAM,iBAAiB,SAAS,CAAA,CAAA;AACpC,IAAA,MAAM,SAAgB,EAAC;AACvB,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,UAAA,CAAW,KAAK,CAAA,aAAA,CAAe,CAAA;AAC/B,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACtB;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,IAAI,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,IAAA,EAAM;AAEnC,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,QAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,IAAA,CAAM,CAAA;AAC5B,UAAA,MAAA,CAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,QAC1B;AACA,QAAA,IAAI,KAAA,CAAM,OAAO,MAAA,EAAW;AAC1B,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,KAAA,EAAQ,KAAA,CAAM,EAAA,CAAG,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACnE,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,EAAE,CAAA;AAAA,QACzB;AACA,QAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,KAAA,CAAO,CAAA;AAC7B,UAAA,MAAA,CAAO,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,QAC9B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,IAAA,CAAM,CAAA;AAC5B,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,GAAA,IAAO,CAAA,OAAA,EAAU,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,EAAM,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA,IAAK,YAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,EAAM,UAAA,CAAW,GAAG,IAAI,MAAA,GAAS,KAAA;AACjD,IAAA,GAAA,IAAO,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAExC,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,0BAA0B,CAAA;AACnE,IAAA,MAAM,WAAA,GAAc,KAAK,EAAA,CAAG,OAAA,CAAQ,QAAQ,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,aAAa,KAAA,IAAS,CAAA;AAExC,IAAA,GAAA,IAAO,CAAA,iBAAA,CAAA;AACP,IAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAA,CAAQ,IAAA,GAAO,CAAA,IAAK,KAAK,CAAA;AAErC,IAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAC,QAAa,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,MAAM,CAAC,CAAA;AAE9D,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,KAAK,CAAA;AAAA,MACvC,IAAA;AAAA,MACA,aAAA,EAAA,CAAgB,IAAA,GAAO,CAAA,IAAK,KAAA,GAAQ,CAAA;AAAA,MACpC,aAAa,IAAA,GAAO,CAAA;AAAA,MACpB,WAAA,EAAa,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MAC/C,QAAA,EAAU,IAAA,GAAO,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,IAAA;AAAA,MAChC,QAAA,EAAU,OAAO,IAAA,CAAK,IAAA,CAAK,YAAY,KAAK,CAAA,GAAI,OAAO,CAAA,GAAI;AAAA,KAC7D;AAAA,EACF;AAAA,EAEA,MAAM,SAAY,IAAA,EAAuC;AACvD,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,EAAA,EAAI,UAAS,GAAI,IAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,GAAM,iBAAiB,SAAS,CAAA,aAAA,CAAA;AACpC,IAAA,MAAM,MAAA,GAAgB,CAAC,EAAE,CAAA;AAEzB,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,GAAA,IAAO,CAAA,kBAAA,CAAA;AACP,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACtB;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAC9C,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,EAAY,MAAM,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,OAAU,IAAA,EAA8B;AAC5C,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,UAAS,GAAI,IAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAEtC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,UAAA,CAAW,EAAA,GAAK,EAAA;AAChB,IAAA,UAAA,CAAW,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC/C,IAAA,UAAA,CAAW,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAE/C,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,UAAA,CAAW,SAAA,GAAY,QAAA;AAAA,IACzB;AAEA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AACtC,IAAA,MAAM,eAAe,OAAA,CAAQ,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,GAAA;AAAA,MAAI,CAAC,MAC5C,OAAO,CAAA,KAAM,WAAW,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,GAAI;AAAA,KAC9C;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACN,CAAA,YAAA,EAAe,SAAS,CAAA,EAAA,EAAK,OAAA,CAAQ,KAAK,IAAI,CAAC,aAAa,YAAY,CAAA,CAAA;AAAA,KAC1E,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAEf,IAAA,OAAO,EAAE,GAAG,UAAA,EAAY,EAAA,EAAG;AAAA,EAC7B;AAAA,EAEA,MAAM,OAAU,IAAA,EAA8B;AAC5C,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,UAAS,GAAI,IAAA;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,UAAA,CAAW,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAE/C,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AACtC,IAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAC,CAAA,IAAA,CAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACxD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,GAAA;AAAA,MAAI,CAAC,MAC5C,OAAO,CAAA,KAAM,WAAW,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,GAAI;AAAA,KAC9C;AAEA,IAAA,IAAI,GAAA,GAAM,CAAA,OAAA,EAAU,SAAS,CAAA,KAAA,EAAQ,SAAS,CAAA,aAAA,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAA,EAAQ,EAAE,CAAA;AAE7B,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,GAAA,IAAO,CAAA,kBAAA,CAAA;AACP,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACtB;AAEA,IAAA,IAAA,CAAK,GAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAElC,IAAA,OAAO,KAAK,QAAA,CAAY,EAAE,YAAY,IAAA,EAAM,EAAA,EAAI,UAAU,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,OAAU,IAAA,EAA8B;AAC5C,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,EAAA,EAAI,UAAS,GAAI,IAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,QAAA,CAAY,EAAE,UAAA,EAAY,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,CAAA;AACrE,IAAA,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA;AAE7D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,GAAM,eAAe,SAAS,CAAA,aAAA,CAAA;AAClC,IAAA,MAAM,MAAA,GAAgB,CAAC,EAAE,CAAA;AAEzB,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,GAAA,IAAO,CAAA,kBAAA,CAAA;AACP,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACtB;AAEA,IAAA,IAAA,CAAK,GAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAElC,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,IAAA,EAA+F;AACzG,IAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,QAAA,EAAS,GAAI,IAAA;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAEvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,IAAI,GAAA,GAAM,iCAAiC,SAAS,CAAA,CAAA;AACpD,IAAA,MAAM,SAAgB,EAAC;AAEvB,IAAA,IAAI,QAAA,IAAY,OAAO,YAAA,EAAc;AACnC,MAAA,GAAA,IAAO,CAAA,oBAAA,CAAA;AACP,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACtB;AAEA,IAAA,MAAM,MAAA,GAAS,KAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AACjD,IAAA,OAAO,QAAQ,KAAA,IAAS,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,QAAQ,IAAA,EAA2F;AACvG,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,CAAA;AACpD,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,GAAyC;AAC7C,IAAA,OAAO,EAAE,MAAM,EAAC,EAAG,WAAW,CAAA,EAAG,KAAA,EAAO,IAAI,UAAA,EAAY,CAAA,EAAG,MAAM,CAAA,EAAG,aAAA,EAAe,GAAG,WAAA,EAAa,KAAA,EAAO,aAAa,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,EAC/J;AAAA,EAEA,MAAM,eAAA,GAAgC;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAA,GAA8B;AAClC,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,MAAM,cAAA,GAAgC;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA,EAM/B,QAAA,CAAS,KAAU,MAAA,EAA+B;AACxD,IAAA,MAAM,GAAA,GAAW,EAAE,EAAA,EAAI,GAAA,CAAI,EAAA,EAAG;AAE9B,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,SAAS,IAAA,EAAM;AAExC,MAAA,IAAI,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAE1B,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,SAAS,UAAA,IACxC,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,SAAS,QAAA,EAAU;AAC/E,QAAA,IAAI;AACF,UAAA,KAAA,GAAQ,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA;AAAA,QACtC,CAAA,CAAA,MAAQ;AACN,UAAA,KAAA,GAAQ,IAAA;AAAA,QACV;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,QAAA,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAAA,MACvB;AAEA,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,EAAO;AAClC,QAAA,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAK,CAAA,CAAE,WAAA,EAAY;AAAA,MACtC;AAEA,MAAA,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAAA,IACpB;AAEA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,GAAA,CAAI,YAAY,GAAA,CAAI,UAAA;AACpB,MAAA,GAAA,CAAI,YAAY,GAAA,CAAI,UAAA;AAAA,IACtB;AAEA,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,GAAA,CAAI,WAAW,GAAA,CAAI,SAAA;AAAA,IACrB;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,UAAA,GAAqB;AAC3B,IAAA,OAAO,GAAG,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC7E;AAAA,EAEQ,gBAAgB,IAAA,EAAsB;AAC5C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAAyB;AAC7B,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,EAAG;AAC9C,MAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,IACzB;AACA,IAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,OAAA,CAAQ,IAAI,0DAA0D,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAe,EAAA,EAAyC;AAC5D,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,YAAY;AACzC,QAAA,OAAO,EAAA,CAAG,EAAE,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA;AAAA,MAC3B,CAAC,CAAA;AAED,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,EAAA,EAAG;AAClB,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChB,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EACd;AAAA,EAEA,KAAK,GAAA,EAAmB;AACtB,IAAA,IAAA,CAAK,EAAA,CAAG,KAAK,GAAG,CAAA;AAAA,EAClB;AAAA,EAEA,QAAQ,GAAA,EAAa;AACnB,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC5B;AACF;AAMO,SAAS,mBAAmB,OAAA,EAGlB;AACf,EAAA,OAAO,IAAI,YAAA,CAAa,OAAA,IAAW,EAAE,CAAA;AACvC;;;AC7YO,IAAe,aAAf,MAA0B;AAAA,EACxB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAqB,EAAC;AAAA,EACtB,cAA2C,EAAC;AAAA,EAC5C,UAAmC,EAAC;AAAA,EACpC,SAAiC,EAAC;AAAA,EAClC,aAGH,EAAE,WAAA,EAAa,EAAC,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,EAC5B,kBAAuC,EAAC;AAAA,EACxC,cAAwB,EAAC;AAAA,EACzB,gBAAA;AAAA,EACA,gBAAA;AAAA,EAEP,YAAY,IAAA,EAAc;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEA,MAAM,KAAM,GAAA,EAA+B;AAAA,EAE3C;AAAA,EAEA,MAAM,WAAY,GAAA,EAA+B;AAAA,EAEjD;AAAA,EAEA,MAAM,UAAW,GAAA,EAA+B;AAAA,EAEhD;AAAA,EAEA,cAAA,GAA+C;AAC7C,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,UAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AACF;AAMO,IAAM,gBAAN,MAAoB;AAAA,EACjB,OAAA,uBAAuC,GAAA,EAAI;AAAA,EAC3C,KAAA,uBAAiC,GAAA,EAAI;AAAA,EAE7C,SAAS,MAAA,EAA0B;AACjC,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,uBAAA,CAAyB,CAAA;AAAA,IACjE;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAGpC,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,IAAW,IAAK,EAAC;AAC5C,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC3D,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAA,CAAK,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mCAAA,EAAsC,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,EACjE;AAAA,EAEA,WAAW,IAAA,EAAoB;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,IAAW,IAAK,EAAC;AAC5C,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC3D,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAA,CAAK,cAAA,CAAe,OAAO,OAAO,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,IAAI,CAAA,CAAE,CAAA;AAAA,EAC5D;AAAA,EAEA,IAAI,IAAA,EAAsC;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAA,GAAuB;AACrB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,IAAI,IAAA,EAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,YAAA,CAAa,OAAe,OAAA,EAAqB;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1B,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,IAC1B;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,CAAG,KAAK,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,cAAA,CAAe,OAAe,OAAA,EAAqB;AACjD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AACrC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AACtC,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,QAAA,CAAS,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CAAY,KAAA,EAAe,IAAA,EAA0B;AACzD,IAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,EAAC;AAC3C,IAAA,IAAI,MAAA,GAAS,IAAA;AAEb,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAC1D,QAAA,IAAI,eAAe,KAAA,CAAA,EAAW;AAC5B,UAAA,MAAA,GAAS,UAAA;AAAA,QACX;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,GAAiD;AAC/C,IAAA,MAAM,cAA2C,EAAC;AAElD,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,cAAA,IAAiB,IAAK,EAAC;AACxD,MAAA,WAAA,CAAY,IAAA,CAAK,GAAG,iBAAiB,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,aAAA,GAAyC;AACvC,IAAA,MAAM,UAAmC,EAAC;AAE1C,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,UAAA,IAAa,IAAK,EAAC;AAChD,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,aAAa,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,YAAA,GAAuC;AACrC,IAAA,MAAM,SAAiC,EAAC;AAExC,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,kBAAA,GAA0C;AACxC,IAAA,MAAM,aAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,eAAe,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,cAAA,GAA2B;AACzB,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,WAAW,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAOO,IAAM,SAAA,GAAN,cAAwB,UAAA,CAAW;AAAA,EACxC,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,KAAK,CAAA;AACX,IAAA,IAAA,CAAK,WAAA,GAAc,2EAAA;AAEnB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,YAAY,KAAA,EAAO,gBAAA,EAAkB,cAAc,IAAA,EAAK;AAAA,QACjF,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,OAAO,oBAAA,EAAqB;AAAA,QACnE,EAAE,MAAM,cAAA,EAAgB,IAAA,EAAM,QAAQ,OAAA,EAAS,KAAA,EAAc,OAAO,eAAA,EAAgB;AAAA,QACpF,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,OAAO,sBAAA;AAAuB;AACjE,KACD,CAAA;AAAA,EACH;AACF;AAGO,IAAM,eAAA,GAAN,cAA8B,UAAA,CAAW;AAAA,EAC9C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,WAAW,CAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,0DAAA;AAEnB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,kBAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QAC7C,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,OAAO,kBAAA,EAAmB;AAAA,QAC9D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QAClD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,OAAO,SAAA,EAAU;AAAA,QACjD,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,OAAO,YAAA;AAAa;AACzD,KACD,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,CAAgB,oBAAoB,CAAA,GAAI,EAAC;AAAA,EAChD;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,UAAA,CAAW;AAAA,EAC7C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,UAAU,CAAA;AAChB,IAAA,IAAA,CAAK,WAAA,GAAc,0CAAA;AAEnB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,UAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,UAAU,IAAA,EAAK;AAAA,QACpD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QAC/C,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,QAC/B,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,cAAc,KAAA,EAAM;AAAA,QAC1D,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,OAAO,mBAAA,EAAoB;AAAA,QAC3D,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QACrD,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA;AAAK;AACrD,KACD,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,CAAgB,mBAAmB,CAAA,GAAI,EAAC;AAAA,EAC/C;AACF;AAGO,IAAM,aAAA,GAAN,cAA4B,UAAA,CAAW;AAAA,EAC5C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,SAAS,CAAA;AACf,IAAA,IAAA,CAAK,WAAA,GAAc,6BAAA;AAEnB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAE;AAAA,QACjE,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AAAA,QAC9B,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,UAAU,IAAA,EAAK;AAAA,QACpD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,cAAA,EAAgB,YAAY,WAAA,EAAY;AAAA,QAChE,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,gBAAgB,UAAA,EAAY,UAAA,EAAY,UAAU,IAAA,EAAK;AAAA,QAChF,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,cAAc,KAAA,EAAM;AAAA,QAC1D,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,OAAO,mBAAA,EAAoB;AAAA,QACjE,EAAE,MAAM,SAAA,EAAW,IAAA,EAAM,UAAU,KAAA,EAAO,eAAA,EAAiB,cAAc,CAAA;AAAE;AAC7E,KACD,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,CAAgB,kBAAkB,CAAA,GAAI,EAAC;AAAA,EAC9C;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,UAAA,CAAW;AAAA,EAC7C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,UAAU,CAAA;AAChB,IAAA,IAAA,CAAK,WAAA,GAAc,oBAAA;AAEnB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,gBAAgB,UAAA,EAAY,WAAA,EAAa,UAAU,IAAA,EAAK;AAAA,QAClF,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,KAAA,EAAO,eAAA,EAAiB,cAAc,aAAA,EAAc;AAAA,QAClF,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,QAAA,EAAU,KAAA,EAAO,SAAS,MAAA,EAAQ;AAAA,UACvD;AAAA,YACE,IAAA,EAAM,eAAA;AAAA,YACN,KAAA,EAAO,MAAA;AAAA,YACP,MAAA,EAAQ;AAAA,cACN,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,cAAA,EAAgB,YAAY,UAAA,EAAW;AAAA,cAChE,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,cAAc,CAAA,EAAE;AAAA,cACpD,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,MAAA,EAAO;AAAA,cAChC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAU,OAAA,EAAS;AAAA,gBAC3C,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,gBAC7B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,gBACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO,eACjC;AAAC;AACH;AACF,SACF;AAAC;AACH,KACD,CAAA;AAAA,EACH;AACF;AAGO,IAAM,aAAA,GAAgB;AAAA,EAC3B,GAAA,EAAK,SAAA;AAAA,EACL,SAAA,EAAW,eAAA;AAAA,EACX,QAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAS,aAAA;AAAA,EACT,QAAA,EAAU;AACZ;;;AChUO,IAAM,eAAN,MAAmB;AAAA,EAGxB,YAAoB,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA,EAAxB,MAAA;AAAA,EAFZ,MAAgB,EAAC;AAAA,EAIzB,OAAA,CAAQ,UAAkB,UAAA,EAA0C;AAClE,IAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CACpC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,KAAK,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CAC/B,KAAK,IAAI,CAAA;AACZ,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA;AAAA,EAAO,KAAK;AAAA,CAAA,CAAK,CAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAA,CAAc,YAAoB,KAAA,EAAuB;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,mBAAA,EAAsB,UAAU,CAAA;AAAA,EAAA,EAAU,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC;AAAA,CAAA,CAAK,CAAA;AAC/E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EAC7B;AACF;AAMO,SAAS,uBAAuB,KAAA,EAAyC;AAC9E,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,EAAC;AAAA,QACzB,UAAA,EAAY,KAAA,CAAM,KAAA,IAAS,EAAC;AAAA,QAC5B,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,QAC3B,YAAA,EAAc,KAAA,CAAM,YAAA,IAAgB,EAAC;AAAA,QACrC,SAAA,EAAW,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,QAC7B,OAAA,EAAS,KAAA,CAAM,WAAA,IAAe;AAAC;AACjC;AACF,GACF;AACF;AAMO,IAAM,iBAAA,GAAiC;AAAA,EAC5C,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACR;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,sCAAA;AAAA,IACN,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,+BAAA;AAAA,IACJ,EAAA,EAAI,iCAAA;AAAA,IACJ,EAAA,EAAI,mCAAA;AAAA,IACJ,EAAA,EAAI;AAAA;AAER;AAEO,IAAM,gBAAA,GAAgC;AAAA,EAC3C,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAO,iBAAA,CAAkB,KAAA;AAAA,EACzB,SAAS,iBAAA,CAAkB,OAAA;AAAA,EAC3B,cAAc,iBAAA,CAAkB,YAAA;AAAA,EAChC,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,8BAAA;AAAA,IACJ,EAAA,EAAI,iCAAA;AAAA,IACJ,EAAA,EAAI,mCAAA;AAAA,IACJ,EAAA,EAAI;AAAA;AAER;AAMO,IAAM,kBAAA,GAAkC;AAAA,EAC7C,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACR;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,2CAAA;AAAA,IACN,KAAA,EAAO,oCAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,EAAA,EAAI,GAAA;AAAA,IACJ,EAAA,EAAI,GAAA;AAAA,IACJ,EAAA,EAAI,GAAA;AAAA,IACJ,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,4BAAA;AAAA,IACJ,EAAA,EAAI,4BAAA;AAAA,IACJ,EAAA,EAAI,6BAAA;AAAA,IACJ,EAAA,EAAI;AAAA;AAER;AAMO,SAAS,qBAAqB,KAAA,EAA4B;AAC/D,EAAA,MAAM,YAAsB,EAAC;AAG7B,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,EAAG;AACvD,MAAA,SAAA,CAAU,IAAA,CAAK,CAAA,UAAA,EAAa,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9C;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AACtD,MAAA,SAAA,CAAU,IAAA,CAAK,CAAA,SAAA,EAAY,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7C;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACxD,MAAA,SAAA,CAAU,IAAA,CAAK,CAAA,YAAA,EAAe,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAChD;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,YAAA,EAAc;AACtB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,EAAG;AAC7D,MAAA,SAAA,CAAU,IAAA,CAAK,CAAA,WAAA,EAAc,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/C;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACxD,MAAA,SAAA,CAAU,IAAA,CAAK,CAAA,WAAA,EAAc,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AAAA,EAAY,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,CAAA;AACzC;AAaO,SAAS,mBAAmB,MAAA,EAAoC;AACrE,EAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,MAAA,CAAO,KAAA,IAAS,iBAAiB,CAAA;AACtE,EAAA,MAAM,kBAA4B,EAAC;AAGnC,EAAA,IAAI,OAAO,kBAAA,EAAoB;AAC7B,IAAA,KAAA,MAAW,CAAC,UAAU,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,kBAAkB,CAAA,EAAG;AAC1E,MAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAChC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,KAAK,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CAC/B,KAAK,IAAI,CAAA;AACZ,MAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,EAAO,KAAK;AAAA,CAAA,CAAK,CAAA;AAAA,IACnD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IAAA,EACH,OAAO;AAAA,IAAA,EACP,MAAA,CAAO,gBAAgB,EAAE;AAAA,IAAA,EACzB,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC;AAAA,EAAA,CAAA;AAEhC;AAcO,IAAM,mBAAA,GAAoD;AAAA,EAC/D,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,EAAE,YAAA,EAAc,mBAAA,EAAoB;AAAA,IAC7C,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,OAAA;AAAA,MACT,YAAA,EAAc,mBAAA;AAAA,MACd,UAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACT;AAAA,IACA,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,qCAAA;AAAA,MACT,MAAA,EAAQ,+BAAA;AAAA,MACR,YAAA,EAAc,kBAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,oBAAA;AAAA,MACP,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,EAAE,YAAA,EAAc,mBAAA,EAAoB;AAAA,IAC7C,OAAO,EAAE,OAAA,EAAS,SAAS,YAAA,EAAc,mBAAA,EAAqB,YAAY,KAAA,EAAM;AAAA,IAChF,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,qCAAA;AAAA,MACT,MAAA,EAAQ,+BAAA;AAAA,MACR,YAAA,EAAc;AAAA;AAChB,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,SAAS,EAAE,OAAA,EAAS,QAAQ,UAAA,EAAY,QAAA,EAAU,KAAK,mBAAA,EAAoB;AAAA,IAC3E,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,IACvC,KAAA,EAAO,EAAE,MAAA,EAAQ,SAAA;AAAU,GAC7B;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,EAAE,YAAA,EAAc,mBAAA,EAAoB;AAAA,IAC7C,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,qCAAA;AAAA,MACT,MAAA,EAAQ,+BAAA;AAAA,MACR,YAAA,EAAc,kBAAA;AAAA,MACd,eAAA,EAAiB;AAAA;AACnB;AAEJ;AC1WO,IAAM,oBAAN,MAA+C;AAAA,EAC5C,EAAA,GAA+B,IAAA;AAAA,EAC/B,IAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAAoC,EAAC,EAAG;AAClD,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,WAAA;AAC5B,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,EAAA;AACxC,IAAA,IAAA,CAAK,UAAA,GAAa,CAAC,CAAC,OAAA,CAAQ,EAAA;AAE5B,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAA;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,EAAA,EAAI;AAEb,IAAA,MAAM,QAAA,GAAA,CAAY,MAAM,OAAO,gBAAgB,CAAA,EAAG,OAAA;AAClD,IAAA,IAAA,CAAK,EAAA,GAAK,IAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAChC,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,oBAAoB,CAAA;AACnC,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,mBAAmB,CAAA;AAElC,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,IAAA,CAAK,EAAA,IAAM,CAAC,IAAA,CAAK,UAAA,EAAY;AAC/B,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACZ;AAAA,EACF;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AAEd,IAAA,IAAA,CAAK,GAAG,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAyCZ,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,IAAA,EAKK;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AACzC,IAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEnC,IAAA,MAAM,IAAA,GAAiB;AAAA,MACrB,EAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,WAAA,EAAY;AAAA,MAC9B,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,IAAA,EAAO,KAAK,IAAA,IAAQ,UAAA;AAAA,MACpB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC,CAAA;AAAA,qCAAA;AAAA,KAEF,CACC,GAAA;AAAA,MACC,EAAA;AAAA,MACA,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,YAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,GAAA;AAAA,MACA;AAAA,KACF;AAEF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,KAAA,EAAyC;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,GAAA,GAAM,KAAK,EAAA,CACd,OAAA,CAAQ,0CAA0C,CAAA,CAClD,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,CAAA;AAE1B,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,aAAa,MAAA,EAA0C;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CACd,QAAQ,uCAAuC,CAAA,CAC/C,IAAI,MAAM,CAAA;AAEb,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,IAAA,EAC0B;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAC/C,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,SAAoB,EAAC;AAE3B,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,MAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,CAAA;AAAA,IACtC;AACA,IAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,KAAK,mBAAmB,CAAA;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,YAAY,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACvB;AACA,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,MAAA,OAAA,CAAQ,KAAK,eAAe,CAAA;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAW;AACpC,MAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,aAAA,GAAgB,CAAA,GAAI,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,MAAA,OAAA,CAAQ,KAAK,YAAY,CAAA;AACzB,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,CAAC,CAAA;AAAA,IACjC;AACA,IAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,MAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,IAAA,CAAK,wBAAwB,MAAA,EAAW;AAC1C,MAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AACxC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,mBAAmB,CAAA;AAAA,IACtC;AAEA,IAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,IAAA,MAAA,CAAO,IAAA,CAAA,iBAAK,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA;AAEpC,IAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAElB,IAAA,IAAA,CAAK,EAAA,CACF,OAAA,CAAQ,CAAA,sBAAA,EAAyB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,aAAA,CAAe,CAAA,CAClE,GAAA,CAAI,GAAG,MAAM,CAAA;AAEhB,IAAA,OAAO,IAAA,CAAK,aAAa,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,WAAW,MAAA,EAAkC;AACjD,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,SAAS,IAAA,CAAK,EAAA,CACjB,QAAQ,qCAAqC,CAAA,CAC7C,IAAI,MAAM,CAAA;AAEb,IAAA,OAAO,OAAO,OAAA,GAAU,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,aAAa,QAAA,EAAmC;AACpD,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,cAAA,CAAe,QAAA,EAAkB,IAAA,EAAgC;AACrE,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,aAAA,CACJ,MAAA,EACA,IAAA,GAGI,EAAC,EACa;AAClB,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,EAAE,CAAA,CAAE,SAAS,WAAW,CAAA;AAClD,IAAA,MAAM,YAAA,GAAe,WAAA,CAAY,EAAE,CAAA,CAAE,SAAS,WAAW,CAAA;AACzD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,GAAA,CAAI,SAAQ,GAAI,KAAQ,EAAE,WAAA,EAAY;AAEjE,IAAA,MAAM,OAAA,GAAmB;AAAA,MACvB,EAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,IAAI,WAAA,EAAY;AAAA,MAC3B,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK;AAAA,KAClB;AAEA,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC,CAAA;AAAA,wCAAA;AAAA,KAEF,CACC,GAAA;AAAA,MACC,OAAA,CAAQ,EAAA;AAAA,MACR,OAAA,CAAQ,MAAA;AAAA,MACR,OAAA,CAAQ,KAAA;AAAA,MACR,OAAA,CAAQ,YAAA;AAAA,MACR,OAAA,CAAQ,SAAA;AAAA,MACR,OAAA,CAAQ,SAAA;AAAA,MACR,OAAA,CAAQ,SAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACV;AAEF,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,KAAA,EAAwC;AAC/D,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CACd,QAAQ,6CAA6C,CAAA,CACrD,IAAI,KAAK,CAAA;AAEZ,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,OAAO,IAAA,CAAK,aAAa,GAAG,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,0BACJ,YAAA,EACyB;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CACd,QAAQ,qDAAqD,CAAA,CAC7D,IAAI,YAAY,CAAA;AAEnB,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,OAAO,IAAA,CAAK,aAAa,GAAG,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,cAAc,SAAA,EAAqC;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,MAAA,GAAS,KAAK,EAAA,CACjB,OAAA,CAAQ,qDAAqD,CAAA,CAC7D,GAAA,CAAI,WAAW,SAAS,CAAA;AAE3B,IAAA,OAAO,OAAO,OAAA,GAAU,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,mBAAmB,MAAA,EAAiC;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,SAAS,IAAA,CAAK,EAAA,CACjB,QAAQ,6CAA6C,CAAA,CACrD,IAAI,MAAM,CAAA;AAEb,IAAA,OAAO,MAAA,CAAO,OAAA;AAAA,EAChB;AAAA,EAEA,MAAM,WAAA,GAAgC;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CACd,OAAA,CAAQ,0CAA0C,EAClD,GAAA,EAAI;AAEP,IAAA,OAAO,IAAI,KAAA,GAAQ,CAAA;AAAA,EACrB;AAAA,EAEA,MAAM,oBAAA,CACJ,MAAA,EACA,YAAA,EACe;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC;AAAA,KACF,CACC,IAAI,MAAA,EAAQ,YAAA,EAAA,qBAAkB,IAAA,EAAK,EAAE,aAAa,CAAA;AAErD,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC,CAAA;AAAA;AAAA,SAAA;AAAA,KAGF,CACC,IAAI,MAAM,CAAA;AAAA,EACf;AAAA,EAEA,MAAM,kBAAA,CACJ,MAAA,EACA,KAAA,GAAgB,CAAA,EACG;AACnB,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAM,IAAI,MAAM,eAAe,CAAA;AAE7C,IAAA,MAAM,IAAA,GAAO,KAAK,EAAA,CACf,OAAA;AAAA,MACC;AAAA,KACF,CACC,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AAEpB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AAAA,EACxC;AAAA,EAEQ,UAAU,GAAA,EAAwC;AACxD,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,cAAc,GAAA,CAAI,aAAA;AAAA,MAClB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,aAAA,EAAgB,IAAI,cAAA,KAA8B,CAAA;AAAA,MAClD,MAAA,EAAS,IAAI,MAAA,KAAsB,CAAA;AAAA,MACnC,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,mBAAA,EAAsB,IAAI,qBAAA,IAAoC,CAAA;AAAA,MAC9D,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AAAA,EAEQ,aAAa,GAAA,EAAuC;AAC1D,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,cAAc,GAAA,CAAI,aAAA;AAAA,MAClB,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AACF;;;AC9WO,IAAM,sBAAA,GAAwC;AAAA,EACnD,WAAA,EAAa,CAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA,EACd,UAAA,EAAY,IAAA;AAAA,EACZ,WAAA,EAAa,IAAA;AAAA,EACb,gBAAA,EAAkB;AACpB,CAAA;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EAER,YACE,KAAA,EACA,MAAA,GAAiC,EAAC,EAClC,SAAiB,eAAA,EACjB;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,sBAAA,EAAwB,GAAG,MAAA,EAAO;AAAA,EACvD;AAAA,EAEQ,QAAQ,MAAA,EAAwB;AACtC,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,MAAM,CAAA,CAAA;AAAA,EAChC;AAAA,EAEQ,WAAW,MAAA,EAAwB;AACzC,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,MAAM,CAAA,QAAA,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,aAAa,MAAA,EAAwC;AACzD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAG,CAAA;AAEzC,IAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,CAAO,KAAK,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAC3C,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,KAAA;AAAA,QACR,iBAAA,EAAmB,KAAK,MAAA,CAAO,WAAA;AAAA,QAC/B,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AAC3C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,GACrB,IAAI,IAAA,CAAK,SAAS,IAAA,CAAK,WAAA,EAAa,EAAE,CAAC,CAAA,GACvC,MAAA;AAEJ,IAAA,IAAI,WAAA,IAAe,WAAA,mBAAc,IAAI,IAAA,EAAK,EAAG;AAC3C,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,iBAAA,EAAmB,CAAA;AAAA,QACnB,WAAA;AAAA,QACA,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,IAAe,WAAA,oBAAe,IAAI,IAAA,EAAK,EAAG;AAC5C,MAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAC/B,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,KAAA;AAAA,QACR,iBAAA,EAAmB,KAAK,MAAA,CAAO,WAAA;AAAA,QAC/B,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,mBAAmB,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,cAAc,QAAQ,CAAA;AAAA,MACjE,aAAA,EAAe;AAAA,KACjB;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,MAAA,EAAwC;AAChE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACzC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA,EAAK,YAAY,CAAC,CAAA;AAC3D,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,aAAA,EAAe,GAAA,CAAI,UAAU,CAAA;AAExD,IAAA,MAAM,KAAK,KAAA,CAAM,KAAA,CAAM,UAAA,EAAY,GAAA,CAAI,UAAU,CAAA;AACjD,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,UAAA,EAAY,GAAG,EAAE,CAAA;AAExC,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa;AACtC,MAAA,MAAM,cAAc,IAAI,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,OAAO,YAAY,CAAA;AAC3D,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK;AAAA,QACzB,QAAA,EAAU,IAAI,QAAA,EAAS;AAAA,QACvB,WAAA,EAAa,WAAA,CAAY,OAAA,EAAQ,CAAE,QAAA;AAAS,OAC7C,CAAA;AACD,MAAA,MAAM,KAAK,KAAA,CAAM,MAAA;AAAA,QACf,GAAA;AAAA,QACA,KAAK,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,YAAA,GAAe,GAAI,CAAA,GAAI;AAAA,OAC/C;AAEA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,iBAAA,EAAmB,CAAA;AAAA,QACnB,WAAA;AAAA,QACA,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,mBAAmB,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,cAAc,OAAO,CAAA;AAAA,MAChE,aAAA,EAAe;AAAA,KACjB;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CAAY,MAAA,EAAgB,QAAA,EAAkC;AAClE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,YAAA,GAAe,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,YAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAK,GAAA,GAAM,YAAY,CAAA;AAE/C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AACrC,IAAA,QAAA,CAAS,KAAK,GAAA,EAAK;AAAA,MACjB,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,QAAA,EAAS;AAAA,MAC3C,QAAA,EAAU,IAAI,QAAA,EAAS;AAAA,MACvB,WAAA,EAAa,WAAA,CAAY,OAAA,EAAQ,CAAE,QAAA;AAAS,KAC7C,CAAA;AACD,IAAA,QAAA,CAAS,OAAO,GAAA,EAAK,IAAA,CAAK,KAAK,YAAA,GAAe,GAAI,IAAI,IAAI,CAAA;AAC1D,IAAA,MAAM,SAAS,IAAA,EAAK;AAAA,EACtB;AAAA,EAEA,MAAM,cAAc,MAAA,EAA+B;AACjD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,cAAc,MAAA,EAA+B;AACjD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAG,CAAA;AAEzC,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK;AAAA,QACzB,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU,EAAA;AAAA,QACV,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,iBAAA,CAAkB,MAAA,EAAgB,KAAA,GAAgB,EAAA,EAAqB;AAC3E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACzC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,UAAA,EAAY,CAAA,EAAG,QAAQ,CAAC,CAAA;AACnE,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,KAAO,IAAI,KAAK,QAAA,CAAS,EAAA,EAAI,EAAE,CAAC,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAKnB;AACD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AACzC,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,MAAM,MAAA,CAAO,UAAA,EAAY,GAAG,EAAE,CAAA;AAE5D,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM;AAC3C,MAAA,MAAM,aAAa,CAAA,GAAI,CAAA;AACvB,MAAA,OAAO,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,WAAA,KAAgB,CAAA;AAAA,IAClD,CAAC,CAAA,CAAE,MAAA;AAEH,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA;AAAA,MACvC,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,MACnB;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,qBAAqB,UAAA,CAAW,MAAA;AAAA,MAChC,YAAA,EAAc,QAAA;AAAA,MACd,WAAA,EAAa,kBACT,IAAI,IAAA,CAAK,SAAS,eAAA,EAAiB,EAAE,CAAC,CAAA,GACtC,IAAA;AAAA,MACJ,4BAAA,EAA8B,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,OAAO,WAAA,GAAc;AAAA,KACzE;AAAA,EACF;AAAA,EAEA,kBAAkB,eAAA,EAAkC;AAClD,IAAA,OACE,IAAA,CAAK,MAAA,CAAO,WAAA,IAAe,eAAA,IAAmB,KAAK,MAAA,CAAO,gBAAA;AAAA,EAE9D;AAAA,EAEA,SAAA,GAA2B;AACzB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA,EAEA,UAAU,MAAA,EAAsC;AAC9C,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAC5C;AACF;;;AC7MO,IAAM,mBAAA,GAAuD;AAAA,EAClE,YAAA,EAAc,EAAE,MAAA,EAAQ,GAAA,EAAQ,KAAK,CAAA,EAAE;AAAA,EACvC,eAAA,EAAiB,EAAE,MAAA,EAAQ,IAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EAC3C,aAAA,EAAe,EAAE,MAAA,EAAQ,IAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACzC,YAAA,EAAc,EAAE,MAAA,EAAQ,IAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACxC,aAAA,EAAe,EAAE,MAAA,EAAQ,IAAA,EAAS,KAAK,CAAA,EAAE;AAAA,EACzC,aAAA,EAAe,EAAE,MAAA,EAAQ,GAAA,EAAO,KAAK,GAAA,EAAI;AAAA,EACzC,mBAAA,EAAqB,EAAE,MAAA,EAAQ,GAAA,EAAO,KAAK,GAAA;AAC7C,CAAA;AAEO,IAAM,cAAN,MAAkB;AAAA,EACf,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EAER,WAAA,CACE,KAAA,EACA,MAAA,EACA,UAAA,EACA,SAAiB,iBAAA,EACjB;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,mBAAA,EAAqB,GAAG,MAAA,EAAO;AAClD,IAAA,IAAA,CAAK,aAAa,UAAA,IAAc;AAAA,MAC9B,UAAA,EAAY,EAAE,MAAA,EAAQ,GAAA,EAAO,KAAK,GAAA,EAAI;AAAA,MACtC,YAAA,EAAc,EAAE,MAAA,EAAQ,IAAA,EAAS,KAAK,GAAA;AAAI,KAC5C;AAAA,EACF;AAAA,EAEQ,MAAA,CAAO,MAAc,UAAA,EAA4B;AACvD,IAAA,OAAO,GAAG,IAAA,CAAK,MAAM,CAAA,EAAG,IAAI,IAAI,UAAU,CAAA,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAAc,UAAA,EAA8C;AACtE,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,IAAK,IAAA,CAAK,OAAO,aAAa,CAAA;AAC7D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA;AAExC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA;AAEjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AACrC,IAAA,QAAA,CAAS,gBAAA,CAAiB,GAAA,EAAK,CAAA,EAAG,WAAW,CAAA;AAC7C,IAAA,QAAA,CAAS,MAAM,GAAG,CAAA;AAClB,IAAA,QAAA,CAAS,IAAA,CAAK,KAAK,GAAA,EAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,CAAA;AACjD,IAAA,QAAA,CAAS,MAAA,CAAO,KAAK,IAAA,CAAK,IAAA,CAAK,OAAO,MAAA,GAAS,GAAI,IAAI,CAAC,CAAA;AAExD,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,MAAM,KAAA,GAAS,OAAA,GAAU,CAAC,CAAA,GAAI,CAAC,CAAA,IAAgB,CAAA;AAE/C,IAAA,IAAI,KAAA,IAAS,OAAO,GAAA,EAAK;AACvB,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAA,EAAK,CAAA,EAAG,GAAG,YAAY,CAAA;AACvE,MAAA,MAAM,OAAA,GACJ,eAAA,CAAgB,MAAA,GAAS,CAAA,GACrB,QAAA,CAAS,eAAA,CAAgB,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,GAC1C,MAAM,MAAA,CAAO,MAAA;AAEnB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,CAAA;AAAA,QACX,OAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,IAAA,CAAA,CAAM,OAAA,GAAU,OAAO,GAAI;AAAA,OAC9C;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAW,MAAA,CAAO,GAAA,GAAM,KAAA,GAAQ,CAAA;AAAA,MAChC,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CACJ,IAAA,EACA,MAAA,EACA,UAAA,EAC0B;AAC1B,IAAA,MAAM,SAAS,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,UAAU,CAAA;AAClE,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,MAAM,IAAI,UAAU,CAAA;AAE5D,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA;AAEjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS;AACrC,IAAA,QAAA,CAAS,gBAAA,CAAiB,GAAA,EAAK,CAAA,EAAG,WAAW,CAAA;AAC7C,IAAA,QAAA,CAAS,MAAM,GAAG,CAAA;AAClB,IAAA,QAAA,CAAS,IAAA,CAAK,KAAK,GAAA,EAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,CAAA;AACjD,IAAA,QAAA,CAAS,MAAA,CAAO,KAAK,IAAA,CAAK,IAAA,CAAK,OAAO,MAAA,GAAS,GAAI,IAAI,CAAC,CAAA;AAExD,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,IAAA,MAAM,KAAA,GAAS,OAAA,GAAU,CAAC,CAAA,GAAI,CAAC,CAAA,IAAgB,CAAA;AAE/C,IAAA,IAAI,KAAA,IAAS,OAAO,GAAA,EAAK;AACvB,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAA,EAAK,CAAA,EAAG,GAAG,YAAY,CAAA;AACvE,MAAA,MAAM,OAAA,GACJ,eAAA,CAAgB,MAAA,GAAS,CAAA,GACrB,QAAA,CAAS,eAAA,CAAgB,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,GAC1C,MAAM,MAAA,CAAO,MAAA;AAEnB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,CAAA;AAAA,QACX,OAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,IAAA,CAAA,CAAM,OAAA,GAAU,OAAO,GAAI;AAAA,OAC9C;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAW,MAAA,CAAO,GAAA,GAAM,KAAA,GAAQ,CAAA;AAAA,MAChC,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CAAM,IAAA,EAAc,UAAA,EAAmC;AAC3D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA;AACxC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,SAAA,CACJ,IAAA,EACA,MAAA,EACA,UAAA,EACe;AACf,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,MAAM,IAAI,UAAU,CAAA;AAC5D,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,SAAA,CACJ,IAAA,EACA,UAAA,EAMC;AACD,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,IAAK,IAAA,CAAK,OAAO,aAAa,CAAA;AAC7D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA;AAExC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA;AAEjC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,GAAA,EAAK,GAAG,WAAW,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,CAAA;AAExC,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAO,MAAA,CAAO,GAAA;AAAA,MACd,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,MACzC,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,KACxB;AAAA,EACF;AAAA,EAEA,QAAA,CAAS,MAAc,MAAA,EAA+B;AACpD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAAA,EACtB;AAAA,EAEA,YAAA,CAAa,MAAc,MAAA,EAA+B;AACxD,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,MAAA;AAAA,EAC1B;AACF;AC5GO,IAAM,cAAN,MAAkB;AAAA,EACf,KAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EAER,WAAA,CACE,KAAA,EACA,aAAA,GAAwB,EAAA,EACxB,SAAiB,aAAA,EACjB;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAAA,EAEA,MAAM,IAAI,IAAA,EAA2D;AACnE,IAAA,MAAM,EAAA,GAAKC,WAAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AACzC,IAAA,MAAM,SAAA,uBAAgB,IAAA,EAAK;AAE3B,IAAA,MAAM,GAAA,GAAgB;AAAA,MACpB,GAAG,IAAA;AAAA,MACH,EAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AACxC,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,MAAM,OAAO,EAAE,CAAA,CAAA;AAEvC,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,SAAS,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AACrD,IAAA,MAAM,IAAA,CAAK,MAAM,MAAA,CAAO,OAAA,EAAS,KAAK,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA;AAEzE,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,SAAA,CAAU,OAAA,IAAW,EAAE,CAAA;AAClD,IAAA,MAAM,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA,EAAK,KAAK,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA;AAErE,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,GAAS,CAAA,EAAG,KAAK,MAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,CAAA,GAAK,IAAA;AACtE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,WAAW,SAAA,CAAU,OAAA,IAAW,EAAE,CAAA;AACxD,MAAA,MAAM,KAAK,KAAA,CAAM,MAAA;AAAA,QACf,SAAA;AAAA,QACA,IAAA,CAAK,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK;AAAA,OACtC;AAAA,IACF;AAEA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAsC;AAC9C,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,MAAM,OAAO,EAAE,CAAA,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,OAAO,CAAA;AAE7C,IAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,CAAO,KAAK,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAC3C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,KAAA,CAAM,MAAA,GAAyB,EAAC,EAGnC;AACD,IAAA,MAAM,EAAE,KAAA,GAAQ,EAAA,EAAI,MAAA,GAAS,GAAE,GAAI,MAAA;AAEnC,IAAA,IAAI,OAAiB,EAAC;AAEtB,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,IAAA,CAAK,KAAK,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,KAAA,EAAQ,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,OAAA,EAAS;AAC7C,MAAA,IAAA,GAAO,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAAA,IAClE,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,IAAA,GAAO,IAAA,CAAK,mBAAA;AAAA,QACV,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAK,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAAA,QACjE;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,WAA+B,EAAC;AAEpC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAA,EAAK,CAAA,EAAG,IAAI,YAAY,CAAA;AAC9D,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,QAAA,QAAA,CAAS,IAAA,CAAK,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA;AAAA,MACtD;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAEnC,IAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AACvB,IAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,MAAA,EAAQ,MAAA,GAAS,KAAK,CAAA;AAEhD,IAAA,MAAM,OAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,CAAC,EAAE,CAAA,IAAK,QAAA,EAAU;AAC3B,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC7B,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA,EAAG;AACnC,UAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AAAA,EACvB;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,GAAgB,EAAA,EAAyB;AACvD,IAAA,MAAM,OAAmB,EAAC;AAC1B,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,OAAO,IAAA,CAAK,mBAAA;AAAA,MAChB,IAAI,KAAK,GAAA,CAAI,OAAA,KAAY,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAAA,MAChD;AAAA,KACF;AAEA,IAAA,IAAI,SAA6B,EAAC;AAElC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAA,EAAK,CAAA,EAAG,IAAI,YAAY,CAAA;AAC9D,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA;AAAA,MACpD;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAEjC,IAAA,KAAA,MAAW,CAAC,EAAE,CAAA,IAAK,OAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,EAAG;AACzC,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC7B,MAAA,IAAI,GAAA,EAAK,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAA,CACJ,MAAA,EACA,KAAA,GAAgB,EAAA,EACK;AACrB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAM,QAAQ,MAAM,CAAA,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAC,CAAA;AAErD,IAAA,MAAM,OAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC7B,MAAA,IAAI,GAAA,EAAK,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CACJ,SAAA,EACA,OAAA,EAOC;AACD,IAAA,MAAM,OAAO,IAAA,CAAK,mBAAA;AAAA,MAChB,SAAA,IAAa,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAAA,MAC3D,OAAA,wBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,MAAM,WAAmC,EAAC;AAC1C,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAEpC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA,EAAK,GAAG,EAAE,CAAA;AAE9C,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAC7B,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,WAAA,EAAA;AAEA,UAAA,QAAA,CAAS,IAAI,MAAM,CAAA,GAAA,CAAK,SAAS,GAAA,CAAI,MAAM,KAAK,CAAA,IAAK,CAAA;AAErD,UAAA,IAAI,IAAI,OAAA,EAAS;AACf,YAAA,YAAA,EAAA;AAAA,UACF;AAEA,UAAA,IAAI,GAAA,CAAI,WAAW,cAAA,EAAgB;AACjC,YAAA,YAAA,EAAA;AAAA,UACF;AAEA,UAAA,IAAI,IAAI,MAAA,EAAQ;AACd,YAAA,WAAA,CAAY,GAAA,CAAI,IAAI,MAAM,CAAA;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA,EAAa,WAAA,GAAc,CAAA,GAAI,YAAA,GAAe,WAAA,GAAc,CAAA;AAAA,MAC5D,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAA2B;AAC/B,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,EAAI,GAAI,KAAK,aAAA,GAAgB,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAEhE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,MAAA,CAAQ,CAAA;AACzD,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,YAAY,MAAM,IAAA,CAAK,MAAM,aAAA,CAAc,GAAA,EAAK,GAAG,MAAM,CAAA;AAE/D,MAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,QAAA,MAAM,IAAA,CAAK,MAAM,GAAA,CAAI,CAAA,EAAG,KAAK,MAAM,CAAA,IAAA,EAAO,EAAE,CAAA,CAAE,CAAA;AAC9C,QAAA,OAAA,EAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,GAAA,EAAK,GAAG,MAAM,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,cAAc,IAAA,EAAoB;AACxC,IAAA,MAAM,IAAA,GAAO,KAAK,WAAA,EAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,QAAA,KAAa,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACzD,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAClD,IAAA,OAAO,CAAA,EAAG,KAAK,MAAM,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,KAAK,IAAI,GAAG,CAAA,CAAA;AAAA,EACnD;AAAA,EAEQ,mBAAA,CAAoB,OAAc,GAAA,EAAsB;AAC9D,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,MAAM,SAAA,GACJ,KAAA,IAAS,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AACzE,IAAA,MAAM,OAAA,GAAU,GAAA,oBAAO,IAAI,IAAA,EAAK;AAEhC,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,SAAS,CAAA;AAClC,IAAA,OAAO,WAAW,OAAA,EAAS;AACzB,MAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,OAAO,CAAC,CAAA;AACrC,MAAA,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAQ,GAAI,CAAC,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAA,CAAc,KAAe,MAAA,EAAiC;AACpE,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,IACvC,MAAA,CAAO,MAAA,GACP,CAAC,MAAA,CAAO,MAAM,CAAA;AAClB,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,GAAG,OAAO,KAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,OAAO,QAAA,IAAY,GAAA,CAAI,QAAA,KAAa,MAAA,CAAO,UAAU,OAAO,KAAA;AAEhE,IAAA,IAAI,OAAO,UAAA,IAAc,GAAA,CAAI,UAAA,KAAe,MAAA,CAAO,YAAY,OAAO,KAAA;AAEtE,IAAA,IAAI,MAAA,CAAO,OAAA,KAAY,MAAA,IAAa,GAAA,CAAI,YAAY,MAAA,CAAO,OAAA;AACzD,MAAA,OAAO,KAAA;AAET,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAa,GAAA,EAAuC;AAC1D,IAAA,MAAM,MAAA,GAAiC;AAAA,MACrC,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,SAAA,EAAW,GAAA,CAAI,SAAA,CAAU,WAAA,EAAY;AAAA,MACrC,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,OAAA,EAAS,GAAA,CAAI,OAAA,GAAU,GAAA,GAAM;AAAA,KAC/B;AAEA,IAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,GAAA,CAAI,MAAA;AACpC,IAAA,IAAI,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,SAAA,GAAY,GAAA,CAAI,SAAA;AAC1C,IAAA,IAAI,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,GAAA,CAAI,IAAA;AAChC,IAAA,IAAI,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,UAAA,GAAa,GAAA,CAAI,UAAA;AAC5C,IAAA,IAAI,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,SAAA,GAAY,GAAA,CAAI,SAAA;AAC1C,IAAA,IAAI,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,SAAA,GAAY,GAAA,CAAI,SAAA;AAC1C,IAAA,IAAI,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,KAAA,GAAQ,GAAA,CAAI,KAAA;AAClC,IAAA,IAAI,IAAI,OAAA,EAAS,MAAA,CAAO,UAAU,IAAA,CAAK,SAAA,CAAU,IAAI,OAAO,CAAA;AAC5D,IAAA,IAAI,IAAI,QAAA,EAAU,MAAA,CAAO,WAAW,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAE/D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,eAAe,IAAA,EAAwC;AAC7D,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AAAA,MAClC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,OAAA,EAAS,KAAK,OAAA,KAAY,GAAA;AAAA,MAC1B,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA,GAAU,KAAK,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,GAAI,MAAA;AAAA,MACnD,UAAU,IAAA,CAAK,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,GAAI;AAAA,KACxD;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,GAAA,EAGjC;AACA,EAAA,OAAO;AAAA,IACL,WACE,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,iBAAiB,GAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAG,IAAA,EAAK,IACxD,IAAI,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,IAC3B,SAAA;AAAA,IACF,SAAA,EAAW,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,IAAK;AAAA,GAC9C;AACF;ACxSO,SAAS,oBAAoB,GAAA,EAA6B;AAC/D,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AAClD,EAAA,IAAI,UAAA,EAAY,UAAA,CAAW,SAAS,CAAA,EAAG;AACrC,IAAA,OAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAC7C,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,UAAU,MAAA,CAAO,WAAA;AAAA,MACrB,aAAa,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AAClC,QAAA,MAAM,CAAC,GAAA,EAAK,GAAG,GAAG,CAAA,GAAI,CAAA,CAAE,MAAM,GAAG,CAAA;AACjC,QAAA,OAAO,CAAC,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,MACnC,CAAC;AAAA,KACH;AACA,IAAA,OAAO,OAAA,CAAQ,YAAY,CAAA,IAAK,IAAA;AAAA,EAClC;AAEA,EAAA,OAAO,IAAA;AACT;AAeO,SAAS,aAAA,CACd,OAAA,EACA,MAAA,EACA,OAAA,GAII,EAAC,EACG;AACR,EAAA,OAAOC,IAAA,CAAI,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ;AAAA,IAC/B,SAAA,EAAY,QAAQ,SAAA,IAAa,KAAA;AAAA,IACjC,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,UAAU,OAAA,CAAQ;AAAA,GACnB,CAAA;AACH;;;ACjGO,IAAM,aAAN,MAAiB;AAAA,EACd,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,yBAAA;AAAA,EAER,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,KAAA;AAC3C,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA,CAAO,cAAA,IAAkB,IAAI,cAAA,EAAe;AAClE,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,uBAAA;AACjC,IAAA,IAAA,CAAK,yBAAA,GAA4B,OAAO,yBAAA,IAA6B,IAAA;AAAA,EACvE;AAAA,EAEA,MAAM,SAAS,GAAA,EAAiC;AAC9C,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAI,mBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,iBAAiB,SAAS,CAAA;AACrE,MAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,QAAA,OAAO,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,MACrC;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAI7B,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,CAAC,KAAK,QAAA,EAAU;AACjC,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,iCAAA,EAAmC,GAAG,CAAA;AAAA,MAClE;AAEA,MAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,eAAA,EAAiB;AAC1C,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,wBAAA,EAA0B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,cAAA,CAAe,QAAA,CAAS,KAAK,QAAQ,CAAA;AACrE,MAAA,IAAI,CAAC,mBAAmB,KAAA,EAAO;AAC7B,QAAA,OAAO,KAAK,aAAA,CAAc,kBAAA,CAAmB,OAAO,IAAA,CAAK,IAAI,GAAG,GAAG,CAAA;AAAA,MACrE;AAEA,MAAA,MAAM,eAAe,MAAM,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,KAAK,KAAK,CAAA;AAChE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,0BAAA,EAA4B,GAAG,CAAA;AAAA,MAC3D;AAEA,MAAA,MAAM,eAAe,MAAM,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,KAAK,QAAQ,CAAA;AAChE,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW;AAAA,QACvC,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,YAAA;AAAA,QACA,IAAA,EAAM,KAAK,IAAA,IAAQ,UAAA;AAAA,QACnB,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,IAAA,CAAK,yBAAA,IAA6B,IAAA,CAAK,KAAA,EAAO;AAChD,QAAA,MAAM,iBAAA,GAAoBD,WAAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AACxD,QAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,IAAA,CAAK,OAAO,0BAA0B,iBAAiB,CAAA,CAAA;AAElF,QAAA,MAAM,IAAA,CAAK,MAAM,aAAA,CAAc,IAAA,CAAK,IAAI,EAAE,SAAA,EAAW,WAAW,CAAA;AAChE,QAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CACnB,YAAA,GACA,WAAA,CAAY,eAAA,EAAiB,KAAK,KAAK,CAAA;AAC1C,QAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,IAAI,IAAA,CAAK,KAAA,EAAO,GAAG,QAAA,EAAU,CAAA;AAAA,MACvD;AAEA,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,UACzB,MAAA,EAAQ,UAAA;AAAA,UACR,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,WAAW,IAAA,CAAK,KAAA;AAAA,UAChB,QAAA,EAAU,MAAA;AAAA,UACV,SAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,QACV;AAAA,UACE,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,yBAAA;AAAA,UACT,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAAA,UAC5B,oBAAA,EAAsB,IAAA,CAAK,yBAAA,IAA6B,CAAC,CAAC,IAAA,CAAK;AAAA,SACjE;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,qBAAA,EAAuB,GAAG,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,GAAA,EAAiC;AAC3C,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAI,mBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,cAAc,SAAS,CAAA;AAClE,MAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,QAAA,OAAO,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,MACrC;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAE7B,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,CAAC,KAAK,QAAA,EAAU;AACjC,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,iCAAA,EAAmC,GAAG,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,KAAK,KAAK,CAAA;AACxD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,SAAA,EAAW,SAAS,CAAA;AACjD,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,qBAAA,EAAuB,GAAG,CAAA;AAAA,MACtD;AAEA,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,KAAK,EAAE,CAAA;AAC7D,QAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,UAAA,IAAI,KAAK,WAAA,EAAa;AACpB,YAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,cACzB,MAAA,EAAQ,cAAA;AAAA,cACR,QAAQ,IAAA,CAAK,EAAA;AAAA,cACb,WAAW,IAAA,CAAK,KAAA;AAAA,cAChB,QAAA,EAAU,MAAA;AAAA,cACV,SAAA;AAAA,cACA,SAAA;AAAA,cACA,OAAA,EAAS,KAAA;AAAA,cACT,KAAA,EAAO;AAAA,aACR,CAAA;AAAA,UACH;AACA,UAAA,OAAO,IAAA,CAAK,aAAA;AAAA,YACV,CAAA,6BAAA,EAAgC,IAAA,CAAK,IAAA,CAAA,CAAM,aAAA,CAAc,WAAA,CAAa,OAAA,EAAQ,GAAI,IAAA,CAAK,GAAA,EAAI,IAAK,GAAK,CAAC,CAAA,QAAA,CAAA;AAAA,YACtG;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,YAAA,GACvB,MAAM,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,YAAY,CAAA,GAChE,KAAA;AACJ,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,MAAM,KAAK,iBAAA,CAAkB,SAAA,EAAW,WAAW,IAAA,CAAK,EAAA,EAAI,KAAK,KAAK,CAAA;AACtE,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,qBAAA,EAAuB,GAAG,CAAA;AAAA,MACtD;AAEA,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,IAAA,CAAK,EAAE,CAAA;AAAA,MAC1C;AAEA,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,KAAK,EAAA,EAAI;AAAA,QACtD,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAsB;AAAA,QAC1B,KAAK,IAAA,CAAK,EAAA;AAAA,QACV,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,KAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAAA,QACjC,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAA,GAAI;AAAA,OACvC;AAEA,MAAA,MAAM,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,IAAA,CAAK,SAAA,EAAW;AAAA,QACzD,WAAW,IAAA,CAAK,YAAA;AAAA,QAChB,QAAQ,IAAA,CAAK,SAAA;AAAA,QACb,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,UACzB,MAAA,EAAQ,OAAA;AAAA,UACR,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,WAAW,IAAA,CAAK,KAAA;AAAA,UAChB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,QAAA,EAAU,MAAA;AAAA,UACV,SAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI;AAAA,QACnC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACnC,CAAA;AAED,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAAA,QAC5B,WAAA;AAAA,QACA,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,WAAW,IAAA,CAAK;AAAA,OACjB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB,GAAG,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,GAAA,EAAiC;AAC5C,IAAA,MAAM,KAAA,GAAQ,oBAAoB,GAAG,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,sBAAA,EAAwB,GAAG,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAI,mBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUC,IAAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAChC,MAAA,IAAI,OAAA,IAAW,QAAQ,GAAA,EAAK;AAC1B,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,kBAAA,CAAmB,OAAA,CAAQ,GAAG,CAAA;AAE/C,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,YACzB,MAAA,EAAQ,QAAA;AAAA,YACR,QAAQ,OAAA,CAAQ,GAAA;AAAA,YAChB,WAAW,OAAA,CAAQ,KAAA;AAAA,YACnB,QAAA,EAAU,MAAA;AAAA,YACV,SAAA;AAAA,YACA,SAAA;AAAA,YACA,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,eAAA,EAAiB,GAAG,CAAA;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,GAAA,EAAiC;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,MAAA,MAAM,EAAE,cAAa,GAAI,IAAA;AAEzB,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,wBAAA,EAA0B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa,EAAE,SAAS,IAAA,EAAM,WAAA,EAAa,IAAI,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,sBAAA,EAAwB,GAAG,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAM,GAAG,GAAA,EAAiC;AACxC,IAAA,MAAM,KAAA,GAAQ,oBAAoB,GAAG,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,MAAA,CAAO,KAAA,EAAO,KAAK,SAAA,EAAW;AAAA,QAChD,QAAQ,IAAA,CAAK,SAAA;AAAA,QACb,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAED,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,QAAQ,GAAG,CAAA;AACtD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,gBAAA,EAAkB,GAAG,CAAA;AAAA,MACjD;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAI;AAAA,OAC7B,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,uBAAA,EAAyB,GAAG,CAAA;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,GAAA,EAAiC;AACpD,IAAA,MAAM,KAAA,GAAQ,oBAAoB,GAAG,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mBAAA,EAAqB,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAI,mBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,MAAA,CAAO,KAAA,EAAO,KAAK,SAAS,CAAA;AAChD,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAK7B,MAAA,MAAM,EAAE,eAAA,EAAiB,WAAA,EAAa,eAAA,EAAgB,GAAI,IAAA;AAE1D,MAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,WAAA,EAAa;AACpC,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,mCAAA,EAAqC,GAAG,CAAA;AAAA,MACpE;AAEA,MAAA,IAAI,gBAAgB,eAAA,EAAiB;AACnC,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,wBAAA,EAA0B,GAAG,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,cAAA,CAAe,QAAA,CAAS,WAAW,CAAA;AACnE,MAAA,IAAI,CAAC,mBAAmB,KAAA,EAAO;AAC7B,QAAA,OAAO,KAAK,aAAA,CAAc,kBAAA,CAAmB,OAAO,IAAA,CAAK,IAAI,GAAG,GAAG,CAAA;AAAA,MACrE;AAEA,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,QAAQ,GAAG,CAAA;AACtD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,gBAAA,EAAkB,GAAG,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,YAAA,GACvB,MAAM,IAAA,CAAK,MAAM,cAAA,CAAe,eAAA,EAAiB,IAAA,CAAK,YAAY,CAAA,GAClE,KAAA;AACJ,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,+BAAA,EAAiC,GAAG,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,kBAAkB,MAAM,IAAA,CAAK,MAAM,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAC,CAAA;AACtE,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,mBAAA;AAAA,QAChC,WAAA;AAAA,QACA,IAAA,CAAK,EAAA;AAAA,QACL;AAAA,OACF;AACA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,IAAA,CAAK,aAAA;AAAA,UACV,gEAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,KAAA,CAAM,aAAa,WAAW,CAAA;AACjE,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,MAAM,KAAK,KAAA,CAAM,oBAAA,CAAqB,IAAA,CAAK,EAAA,EAAI,KAAK,YAAY,CAAA;AAAA,MAClE;AACA,MAAA,MAAM,IAAA,CAAK,MAAM,UAAA,CAAW,IAAA,CAAK,IAAI,EAAE,YAAA,EAAc,iBAAiB,CAAA;AAEtE,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA;AAE3C,MAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,YAAA,EAAc;AACzC,QAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,cAAa,CAAE,eAAA,CAAgB,KAAK,KAAK,CAAA;AACrE,QAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,IAAI,IAAA,CAAK,KAAA,EAAO,GAAG,QAAA,EAAU,CAAA;AAAA,MACvD;AAEA,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,UACzB,MAAA,EAAQ,iBAAA;AAAA,UACR,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,WAAW,IAAA,CAAK,KAAA;AAAA,UAChB,QAAA,EAAU,MAAA;AAAA,UACV,SAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,wBAAA,EAA0B,GAAG,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,GAAA,EAAiC;AACpD,IAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAI,mBAAmB,GAAG,CAAA;AAEvD,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,eAAe,SAAS,CAAA;AACnE,MAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,QAAA,OAAO,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,MACrC;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,MAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAElB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,gBAAA,EAAkB,GAAG,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,gBAAgB,KAAK,CAAA;AACnD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,KAAK,YAAA,CAAa;AAAA,UACvB,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,MAAM,UAAA,GAAaD,WAAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AACjD,QAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,OAAO,kCAAkC,UAAU,CAAA,CAAA;AAC5E,QAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CACnB,YAAA,GACA,aAAA,CAAc,QAAA,EAAU,KAAK,KAAK,CAAA;AACrC,QAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,IAAI,IAAA,CAAK,KAAA,EAAO,GAAG,QAAA,EAAU,CAAA;AAAA,MACvD;AAEA,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,UACzB,MAAA,EAAQ,wBAAA;AAAA,UACR,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,WAAW,IAAA,CAAK,KAAA;AAAA,UAChB,QAAA,EAAU,MAAA;AAAA,UACV,SAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,KAAK,YAAA,CAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,+BAAA,EAAiC,GAAG,CAAA;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,GAAA,EAAiC;AACjD,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAE1C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,6BAAA,EAA+B,GAAG,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,KAAK,YAAA,CAAa,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,kBAAkB,CAAA;AAAA,IACvE,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,2BAAA,EAA6B,GAAG,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAc,iBAAA,CACZ,SAAA,EACA,SAAA,EACA,QACA,SAAA,EACe;AACf,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,MAAA,IAAU,SAAS,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI;AAAA,QACzB,MAAA,EAAQ,cAAA;AAAA,QACR,MAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA,EAAU,MAAA;AAAA,QACV,SAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,aAAa,IAAA,EAAmC;AACtD,IAAA,MAAM,EAAE,YAAA,EAAc,GAAG,SAAA,EAAU,GAAI,IAAA;AACvC,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CAAa,IAAA,EAAW,MAAA,GAAiB,GAAA,EAAe;AAC9D,IAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,MACxC,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,aAAA,CAAc,SAAiB,MAAA,EAA0B;AAC/D,IAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG;AAAA,MACtE,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,kBAAkB,KAAA,EAA0C;AAClE,IAAA,OAAO,IAAI,QAAA;AAAA,MACT,KAAK,SAAA,CAAU;AAAA,QACb,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,mBAAA;AAAA,QACP,YAAY,KAAA,CAAM;AAAA,OACnB,CAAA;AAAA,MACD;AAAA,QACE,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,MAAA,CAAO,KAAA,CAAM,UAAA,IAAc,EAAE;AAAA;AAC9C;AACF,KACF;AAAA,EACF;AACF,CAAA;;;ACjhBA,SAAS,MAAA,CAAO,GAAA,EAAa,QAAA,GAAmB,EAAA,EAAY;AAC1D,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,IAAK,QAAA;AAC7B;AAEA,SAAS,UAAA,CAAW,GAAA,EAAa,QAAA,GAAoB,KAAA,EAAgB;AACnE,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,IAAI,CAAC,KAAK,OAAO,QAAA;AACjB,EAAA,OAAO,GAAA,CAAI,aAAY,KAAM,MAAA;AAC/B;AAEA,SAAS,SAAA,CAAU,GAAA,EAAa,QAAA,GAAmB,CAAA,EAAW;AAC5D,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,IAAI,CAAC,KAAK,OAAO,QAAA;AACjB,EAAA,OAAO,QAAA,CAAS,KAAK,EAAE,CAAA;AACzB;AAEA,eAAsB,gBAAA,GAA4C;AAChE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,EAAa,wBAAwB,CAAA;AAC7D,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,kBAAA,EAAoB,YAAY,CAAA;AAC9D,EAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,mBAAA,EAAqB,KAAK,CAAA;AAC5D,EAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,yBAAA,EAA2B,MAAM,CAAA;AAEnE,EAAA,MAAM,YAAA,GAAe,IAAI,gBAAA,CAAiB;AAAA,IACxC,GAAA,EAAK,QAAA;AAAA,IACL,SAAA,EAAW,cAAA;AAAA,IACX,eAAA,EAAiB,eAAA;AAAA,IACjB,sBAAA,EAAwB,eAAA;AAAA,IACxB,GAAA,EAAK,UAAA,CAAW,WAAA,EAAa,KAAK;AAAA,GACnC,CAAA;AAED,EAAA,MAAM,aAAa,OAAA,EAAQ;AAE3B,EAAA,MAAM,cAAe,YAAA,CAAqB,KAAA;AAE1C,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,MAAM,KAAA,GAAQ,WAAA,GAAc,IAAI,cAAA,CAAe,WAAW,CAAA,GAAI,MAAA;AAE9D,EAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe;AAAA,IACxC,SAAA,EAAW,SAAA,CAAU,qBAAA,EAAuB,EAAE,CAAA;AAAA,IAC9C,gBAAA,EAAkB,UAAA,CAAW,4BAAA,EAA8B,IAAI,CAAA;AAAA,IAC/D,gBAAA,EAAkB,UAAA,CAAW,4BAAA,EAA8B,IAAI,CAAA;AAAA,IAC/D,cAAA,EAAgB,UAAA,CAAW,0BAAA,EAA4B,IAAI,CAAA;AAAA,IAC3D,mBAAA,EAAqB,UAAA,CAAW,0BAAA,EAA4B,IAAI,CAAA;AAAA,IAChE,YAAA,EAAc,SAAA,CAAU,wBAAA,EAA0B,CAAC,CAAA;AAAA,IACnD,SAAA,EAAW,SAAA,CAAU,qBAAA,EAAuB,GAAG;AAAA,GAChD,CAAA;AAED,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,UAAA,CAAW,iBAAA,EAAmB,IAAI,CAAA,EAAG;AACvC,IAAA,OAAA,GAAU,IAAI,eAAe,WAAA,EAAa;AAAA,MACxC,WAAA,EAAa,SAAA,CAAU,sBAAA,EAAwB,CAAC,CAAA;AAAA,MAChD,YAAA,EAAc,SAAA,CAAU,0BAAA,EAA4B,EAAE,IAAI,EAAA,GAAK;AAAA,KAChE,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,UAAA,CAAW,oBAAA,EAAsB,IAAI,CAAA,EAAG;AAC1C,IAAA,WAAA,GAAc,IAAI,YAAY,WAAA,EAAa;AAAA,MACzC,YAAA,EAAc;AAAA,QACZ,MAAA,EAAQ,SAAA,CAAU,2BAAA,EAA6B,GAAM,CAAA;AAAA,QACrD,GAAA,EAAK,SAAA,CAAU,8BAAA,EAAgC,EAAE;AAAA,OACnD;AAAA,MACA,aAAA,EAAe;AAAA,QACb,MAAA,EAAQ,SAAA,CAAU,sBAAA,EAAwB,GAAK,CAAA;AAAA,QAC/C,GAAA,EAAK,SAAA,CAAU,yBAAA,EAA2B,GAAG;AAAA;AAC/C,KACD,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,UAAA,CAAW,mBAAA,EAAqB,IAAI,CAAA,EAAG;AACzC,IAAA,WAAA,GAAc,IAAI,WAAA;AAAA,MAChB,WAAA;AAAA,MACA,SAAA,CAAU,4BAA4B,EAAE;AAAA,KAC1C;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW;AAAA,IAC5B,KAAA,EAAO,YAAA;AAAA,IACP,KAAA;AAAA,IACA,SAAA,EAAW,MAAA,CAAO,YAAA,EAAc,WAAW,CAAA;AAAA,IAC3C,YAAA,EAAc,MAAA,CAAO,gBAAA,EAAkB,KAAK,CAAA;AAAA,IAC5C,SAAA,EAAW,MAAA,CAAO,YAAA,EAAc,UAAU,CAAA;AAAA,IAC1C,WAAA,EAAa,MAAA,CAAO,cAAA,EAAgB,iBAAiB,CAAA;AAAA,IACrD,cAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA,EAAS,MAAA,CAAO,gBAAA,EAAkB,uBAAuB,CAAA;AAAA,IACzD,yBAAA,EAA2B,UAAA,CAAW,6BAAA,EAA+B,IAAI;AAAA,GAC1E,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,WAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,cAAA,GAEK;AACZ,EAAA,MAAM,IAAA,GAAO,OAAO,WAAW,CAAA;AAC/B,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,IAAA,EAAM,SAAA,CAAU,WAAA,EAAa,GAAG,CAAA;AAAA,IAChC,MAAA,EAAQ,UAAA,CAAW,aAAA,EAAe,KAAK,CAAA;AAAA,IACvC,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,OAAO,WAAW,CAAA;AAAA,MACxB,IAAA,EAAM,OAAO,WAAW;AAAA,KAC1B;AAAA,IACA,IAAA,EAAM,MAAA,CAAO,WAAA,EAAa,qBAAqB,CAAA;AAAA,IAC/C,QAAA,EAAU,MAAA,CAAO,gBAAA,EAAkB,UAAU;AAAA,GAC/C;AACF;AAEO,IAAM,aAAa,gBAAA;;;ACrH1B,IAAM,mBAAA,GAAsB,EAAA;AAC5B,IAAM,kBAAA,GAAqB,KAAA;AAC3B,IAAM,0BAAA,GAA6B,IAAA;AAE5B,IAAM,OAAN,MAAW;AAAA,EACR,OAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,SAAsB,MAAA,EAAyB;AACzD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAA,EAAW,OAAO,SAAA,IAAa,kBAAA;AAAA,MAC/B,gBAAA,EAAkB,OAAO,gBAAA,IAAoB,0BAAA;AAAA,MAC7C,MAAA,EAAQ,OAAO,MAAA,IAAU,UAAA;AAAA,MACzB,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAC;AAAA,MAC9B,UAAA,EAAY,OAAO,UAAA,IAAc;AAAA,KACnC;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,IAAA,EAAyC;AACtD,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,KAAK,CAAA;AAC9D,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,0BAAA,EAA2B;AAAA,MAC7D;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,QAAQ,CAAA;AAC1D,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW;AAAA,QACzC,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,YAAA;AAAA,QACA,IAAA,EAAM,KAAK,IAAA,IAAQ,UAAA;AAAA,QACnB,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAED,MAAA,OAAO,IAAA,CAAK,qBAAqB,IAAI,CAAA;AAAA,IACvC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,WAAA,EAAoD;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,YAAY,KAAK,CAAA;AACjE,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,YAAA,EAAc;AAC/B,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,qBAAA,EAAsB;AAAA,MACxD;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA;AAAA,QAC/B,WAAA,CAAY,QAAA;AAAA,QACZ,IAAA,CAAK;AAAA,OACP;AACA,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,qBAAA,EAAsB;AAAA,MACxD;AAEA,MAAA,OAAO,IAAA,CAAK,qBAAqB,IAAI,CAAA;AAAA,IACvC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,KAAA,EAA8B;AACzC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,aAAa,YAAA,EAA2C;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,mBAAmB,YAAY,CAAA;AAClE,MAAA,IAAI,CAAC,WAAW,IAAI,IAAA,CAAK,QAAQ,SAAS,CAAA,mBAAI,IAAI,IAAA,EAAK,EAAG;AACxD,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,MACrE;AAEA,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAQ,MAAM,CAAA;AAC3D,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MACnD;AAEA,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,YAAY,CAAA;AAC7C,MAAA,OAAO,IAAA,CAAK,qBAAqB,IAAI,CAAA;AAAA,IACvC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,KAAA,EAA2C;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,UAAUC,IAAAA,CAAI,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,OAAO,MAAA,EAAQ;AAAA,QACpD,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,QACpB,QAAA,EACE,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,KAAA;AAAA,OAC/D,CAAA;AACD,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,KAAA,EAAyC;AAC9D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAC5C,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,cAAA,CACJ,MAAA,EACA,eAAA,EACA,WAAA,EACqB;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAa,MAAM,CAAA;AACnD,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,YAAA,EAAc;AAC/B,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MACnD;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA;AAAA,QAC/B,eAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AACA,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,+BAAA,EAAgC;AAAA,MAClE;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA;AACnD,MAAA,MAAM,KAAK,OAAA,CAAQ,UAAA,CAAW,QAAQ,EAAE,YAAA,EAAc,SAAS,CAAA;AAC/D,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,MAAM,CAAA;AAE5C,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAK;AAAA,IAC/B,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,CAAc,KAAA,EAAe,WAAA,EAA0C;AAC3E,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AACrD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MACnD;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA;AACxD,MAAA,MAAM,KAAK,OAAA,CAAQ,UAAA,CAAW,KAAK,EAAA,EAAI,EAAE,cAAc,CAAA;AACvD,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA;AAE7C,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAK;AAAA,IAC/B,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,MAAA,EAAqC;AACvD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAa,MAAM,CAAA;AACnD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MACnD;AAEA,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,MAAM,CAAA;AAC5C,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AAEpC,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB,IAAA,EAAqC;AACtE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAErC,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,EAAE,CAAA;AAExD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,IAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,cAAc,IAAA,EAAwB;AAC5C,IAAA,MAAM,OAAA,GAA2C;AAAA,MAC/C,KAAK,IAAA,CAAK,EAAA;AAAA,MACV,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK;AAAA,KACjB;AAEA,IAAA,MAAM,WAAA,GAA+B;AAAA,MACnC,WAAW,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI,GAAA;AAAA,MACxD,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,KACtB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,WAAA,CAAY,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAOA,KAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,QAAQ,WAAW,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAc,aAAa,QAAA,EAAmC;AAC5D,IAAA,OAAOC,OAAAA,CAAO,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EACrD;AAAA,EAEQ,eAAe,KAAA,EAAgC;AACrD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,iBAAiB,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACjC,IAAA,QAAQ,KAAA,CAAM,CAAC,CAAA;AAAG,MAChB,KAAK,GAAA;AACH,QAAA,OAAO,GAAA,GAAM,GAAA;AAAA,MACf,KAAK,GAAA;AACH,QAAA,OAAO,GAAA,GAAM,GAAA;AAAA,MACf,KAAK,GAAA;AACH,QAAA,OAAO,GAAA,GAAM,IAAA;AAAA,MACf,KAAK,GAAA;AACH,QAAA,OAAO,GAAA,GAAM,KAAA;AAAA,MACf;AACE,QAAA,OAAO,KAAA;AAAA;AACX,EACF;AACF;AAEO,SAAS,UAAA,CACd,SACA,MAAA,EACM;AACN,EAAA,OAAO,IAAI,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AACjC;;;AC9KO,SAAS,4BAAA,GAA6D;AAC3E,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,aAAA,EAAe,IAAA;AAAA,IACf,cAAA,EAAgB,IAAA;AAAA,IAChB,eAAA,EAAiB,KAAA;AAAA,IACjB,iBAAA,EAAmB,IAAA;AAAA,IACnB,sBAAA,EAAwB,EAAA;AAAA,IACxB,WAAA,EAAa,KAAA;AAAA,IACb,wBAAA,EAA0B;AAAA,GAC5B;AACF;;;AC7DO,IAAM,iBAAN,MAAkD;AAAA,EAC/C,OAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,SAAyB,MAAA,EAA6B;AAChE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,4BAAA,EAA6B,EAAG,GAAG,MAAA,EAAO;AAAA,EAC/D;AAAA,EAEA,MAAM,cAAc,OAAA,EAAwE;AAC1F,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAiB,OAAA,CAAQ,UAAA,EAAY,QAAQ,UAAU,CAAA;AAChG,IAAA,MAAM,WAAA,GAAA,CAAe,aAAA,EAAe,OAAA,IAAW,CAAA,IAAK,CAAA;AAEpD,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,GAAG,OAAA;AAAA,MACH,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAc,cAAc,CAAA;AAE/D,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,sBAAA,GAAyB,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,UAAA,EAAY,QAAQ,UAAU,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,OAAA,EAA+C;AAClE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAW,OAAA,CAAQ,UAAA,EAAY,QAAQ,SAAS,CAAA;AACnF,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,WAAA,EAAa;AAClC,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,iBAAA,CAAkB,UAAA,EAAoB,UAAA,EAAmC;AAC7E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY;AAAA,MAC9C,UAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,OAAA,CAAQ,WAAW,WAAA,EAAa;AAClC,QAAA,MAAM,KAAK,aAAA,CAAc;AAAA,UACvB,UAAA;AAAA,UACA,UAAA;AAAA,UACA,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,MAAA,EAAQ,OAAA;AAAA,UACR,SAAA,EAAW,QAAA;AAAA,UACX,iBAAA,EAAmB;AAAA,SACpB,CAAA;AACD,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,CACJ,UAAA,EACA,UAAA,EACA,WACA,MAAA,EACqB;AACrB,IAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,YAAY,SAAS,CAAA;AACzE,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB;AAAA,MACpD,UAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAA,CACJ,UAAA,EACA,YACA,KAAA,GAAQ,EAAA,EACR,SAAS,CAAA,EACc;AACvB,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,UAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,kBAAA,CACJ,UAAA,EACA,UAAA,EACA,UACA,QAAA,EACwB;AACxB,IAAA,OAAO,IAAA,CAAK,QAAQ,eAAA,CAAgB;AAAA,MAClC,UAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,cAAA,CACJ,UAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,UAAA,EAAY,UAAU,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,mBAAA,CACJ,UAAA,EACA,UAAA,EAC4B;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,UAAA,EAAY,UAAU,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,UAAA,CACJ,UAAA,EACA,SAAA,EAC4B;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,UAAA,EAAY,SAAS,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,eAAA,CACJ,UAAA,EACA,UAAA,EACA,WACA,YAAA,EACe;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,eAAA,EAAiB;AAChC,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,YAAY,SAAS,CAAA;AACnE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,oBAAA,CACJ,UAAA,EACA,UAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,UAAA,EAAY,UAAU,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAc,gBAAA,CACZ,UAAA,EACA,UAAA,EACe;AACf,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY;AAAA,MAC9C,UAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,sBAAA,GAAyB;AAAA,KAC7C,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,sBAAA,EAAwB;AACzD,MAAA;AAAA,IACF;AAEA,IAAqB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,sBAAsB;AACzE,IAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,OAAO,sBAAsB,CAAA;AAE1E,IAAA,KAAA,MAAW,WAAW,gBAAA,EAAkB;AACtC,MAAA,IAAI,OAAA,CAAQ,WAAW,WAAA,EAAa;AAClC,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,UAAA,EAAY,UAAU,CAAA;AACxD,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,oBAAA,CACd,SACA,MAAA,EACmB;AACnB,EAAA,OAAO,IAAI,cAAA,CAAkB,OAAA,EAAS,MAAM,CAAA;AAC9C;AAEO,SAAS,YAAY,MAAA,EAAgC;AAC1D,EAAA,OAAO,MAAA,KAAW,WAAA;AACpB;AAEO,SAAS,QAAQ,MAAA,EAAgC;AACtD,EAAA,OAAO,MAAA,KAAW,OAAA;AACpB;AAEO,SAAS,WAAW,MAAA,EAAgC;AACzD,EAAA,OAAO,MAAA,KAAW,UAAA;AACpB;;;AClOA,SAAS,qBACP,WAAA,EAIoB;AACpB,EAAA,IAAI,CAAC,WAAA,EAAa,OAAO,EAAC;AAC1B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG,OAAO,WAAA;AACvC,EAAA,OAAO,MAAA,CAAO,OAAO,WAAW,CAAA;AAClC;AAEA,SAAS,iBACP,OAAA,EACgB;AAChB,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAO,OAAA;AACnC,EAAA,OAAO,MAAA,CAAO,OAAO,OAAO,CAAA;AAC9B;AAEO,SAAS,aAAa,MAAA,EAcd;AACb,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,oBAAA,CAAqB,MAAA,CAAO,WAAW,CAAA;AAAA,IACpD,OAAA,EAAS,gBAAA,CAAiB,MAAA,CAAO,OAAO,CAAA;AAAA,IACxC,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAO,MAAA,CAAO;AAAA,GAChB;AACF","file":"index.js","sourcesContent":["import type { CollectionConfig, GlobalConfig } from './types.js';\nimport type { Field, Block } from '../fields/types.js';\n\n// ============================================================================\n// Validation Errors\n// ============================================================================\n\nexport class ConfigValidationError extends Error {\n public errors: string[];\n \n constructor(errors: string[]) {\n super(`Configuration validation failed:\\n${errors.join('\\n')}`);\n this.name = 'ConfigValidationError';\n this.errors = errors;\n }\n}\n\n// ============================================================================\n// Collection Validation\n// ============================================================================\n\nexport function validateCollection(config: CollectionConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Collection is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Collection slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Collection \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, config.slug);\n errors.push(...fieldErrors);\n }\n \n // Access validation\n if (config.access) {\n for (const [action, handler] of Object.entries(config.access)) {\n if (typeof handler !== 'boolean' && typeof handler !== 'function') {\n errors.push(`Collection \"${config.slug}\" has invalid access.${action} (must be boolean or function)`);\n }\n }\n }\n \n // Admin validation\n if (config.admin?.useAsTitle) {\n const fieldExists = config.fields.some(f => f.name === config.admin!.useAsTitle);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.useAsTitle references unknown field \"${config.admin.useAsTitle}\"`);\n }\n }\n \n if (config.admin?.defaultColumns) {\n for (const col of config.admin.defaultColumns) {\n const fieldExists = config.fields.some(f => f.name === col);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.defaultColumns references unknown field \"${col}\"`);\n }\n }\n }\n \n // Upload validation\n if (config.upload) {\n if (config.upload.fileSize && config.upload.fileSize <= 0) {\n errors.push(`Collection \"${config.slug}\" upload.fileSize must be positive`);\n }\n }\n \n // Versions validation\n if (config.versions) {\n if (config.versions.maxPerDoc && config.versions.maxPerDoc <= 0) {\n errors.push(`Collection \"${config.slug}\" versions.maxPerDoc must be positive`);\n }\n }\n \n // Auth validation\n if (config.auth) {\n const hasEmailField = config.fields.some(f => f.name === 'email');\n const hasPasswordField = config.fields.some(f => f.name === 'password');\n if (!hasEmailField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires an \"email\" field`);\n }\n if (!hasPasswordField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires a \"password\" field`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Global Validation\n// ============================================================================\n\nexport function validateGlobal(config: GlobalConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Global is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Global slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Global \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, `global:${config.slug}`);\n errors.push(...fieldErrors);\n }\n \n return errors;\n}\n\n// ============================================================================\n// Field Validation\n// ============================================================================\n\nexport function validateFields(fields: Field[], context: string): string[] {\n const errors: string[] = [];\n const fieldNames = new Set<string>();\n \n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n \n // Skip layout fields without names\n if (field.type === 'row' || field.type === 'collapsible' || field.type === 'tabs') {\n // Validate nested fields\n if ('fields' in field && field.fields) {\n const nestedErrors = validateFields(field.fields, context);\n errors.push(...nestedErrors);\n } else if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateFields(tab.fields, context);\n errors.push(...tabErrors);\n }\n }\n continue;\n }\n \n // Name validation\n const fieldName = field.name as string | undefined;\n if (!fieldName) {\n errors.push(`${context}: Field at index ${i} is missing a \"name\" property`);\n continue;\n }\n \n if (fieldNames.has(fieldName)) {\n errors.push(`${context}: Duplicate field name \"${fieldName}\"`);\n }\n fieldNames.add(fieldName);\n \n if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(fieldName)) {\n errors.push(`${context}: Field name \"${fieldName}\" must be alphanumeric with underscores`);\n }\n \n // Type validation\n if (!field.type) {\n errors.push(`${context}: Field \"${fieldName}\" is missing a \"type\" property`);\n continue;\n }\n \n // Field-specific validation\n switch (field.type) {\n case 'relationship':\n if (!field.relationTo) {\n errors.push(`${context}: Relationship field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n \n case 'array':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Array field \"${fieldName}\" has no fields defined`);\n } else {\n const arrayErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...arrayErrors);\n }\n break;\n \n case 'group':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Group field \"${fieldName}\" has no fields defined`);\n } else {\n const groupErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...groupErrors);\n }\n break;\n \n case 'blocks':\n if (!field.blocks || field.blocks.length === 0) {\n errors.push(`${context}: Blocks field \"${fieldName}\" has no blocks defined`);\n } else {\n const blockErrors = validateBlocks(field.blocks, `${context}.${fieldName}`);\n errors.push(...blockErrors);\n }\n break;\n \n case 'select':\n case 'radio':\n if (!field.options || field.options.length === 0) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has no options defined`);\n } else {\n const values = field.options.map((o: any) => o.value);\n const uniqueValues = new Set(values);\n if (values.length !== uniqueValues.size) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has duplicate option values`);\n }\n }\n break;\n \n case 'upload':\n if (!field.relationTo) {\n errors.push(`${context}: Upload field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n }\n \n // Min/Max validation\n if ('min' in field && 'max' in field && (field as any).min > (field as any).max) {\n errors.push(`${context}: Field \"${fieldName}\" has min greater than max`);\n }\n \n if ('minLength' in field && 'maxLength' in field && (field as any).minLength > (field as any).maxLength) {\n errors.push(`${context}: Field \"${fieldName}\" has minLength greater than maxLength`);\n }\n \n if ('minRows' in field && 'maxRows' in field && (field as any).minRows > (field as any).maxRows) {\n errors.push(`${context}: Field \"${fieldName}\" has minRows greater than maxRows`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Block Validation\n// ============================================================================\n\nexport function validateBlocks(blocks: Block[], context: string): string[] {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n for (const block of blocks) {\n if (!block.slug) {\n errors.push(`${context}: Block is missing a \"slug\" property`);\n continue;\n }\n \n if (slugs.has(block.slug)) {\n errors.push(`${context}: Duplicate block slug \"${block.slug}\"`);\n }\n slugs.add(block.slug);\n \n if (!block.label) {\n errors.push(`${context}: Block \"${block.slug}\" is missing a \"label\" property`);\n }\n \n if (!block.fields || block.fields.length === 0) {\n errors.push(`${context}: Block \"${block.slug}\" has no fields defined`);\n } else {\n const blockErrors = validateFields(block.fields, `${context}.${block.slug}`);\n errors.push(...blockErrors);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Full Configuration Validation\n// ============================================================================\n\nexport function validateConfig(collections: CollectionConfig[], globals: GlobalConfig[] = []): void {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n // Check for duplicate collection slugs\n for (const collection of collections) {\n if (slugs.has(collection.slug)) {\n errors.push(`Duplicate collection slug \"${collection.slug}\"`);\n }\n slugs.add(collection.slug);\n }\n \n // Check for duplicate global slugs\n for (const global of globals) {\n if (slugs.has(global.slug)) {\n errors.push(`Duplicate global slug \"${global.slug}\"`);\n }\n slugs.add(global.slug);\n }\n \n // Validate all collections\n for (const collection of collections) {\n const collectionErrors = validateCollection(collection);\n errors.push(...collectionErrors);\n }\n \n // Validate all globals\n for (const global of globals) {\n const globalErrors = validateGlobal(global);\n errors.push(...globalErrors);\n }\n \n // Validate relationships reference existing collections\n for (const collection of collections) {\n const relationshipErrors = validateRelationships(collection.fields, collections);\n errors.push(...relationshipErrors);\n }\n \n if (errors.length > 0) {\n throw new ConfigValidationError(errors);\n }\n}\n\nfunction validateRelationships(fields: Field[], collections: CollectionConfig[]): string[] {\n const errors: string[] = [];\n const collectionSlugs = new Set(collections.map(c => c.slug));\n \n for (const field of fields) {\n if (field.type === 'relationship') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Relationship field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if (field.type === 'upload') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Upload field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if ('fields' in field && field.fields) {\n const nestedErrors = validateRelationships(field.fields, collections);\n errors.push(...nestedErrors);\n }\n \n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateRelationships(tab.fields, collections);\n errors.push(...tabErrors);\n }\n }\n \n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n const blockErrors = validateRelationships(block.fields, collections);\n errors.push(...blockErrors);\n }\n }\n }\n \n return errors;\n}\n","import { z, type ZodTypeAny } from 'zod';\nimport type {\n Field,\n TextField,\n NumberField,\n CheckboxField,\n DateField,\n EmailField,\n PasswordField,\n TextareaField,\n SelectField,\n RadioField,\n ColorField,\n RichTextField,\n JSONField,\n CodeField,\n UploadField,\n MarkdownField,\n RelationshipField,\n ArrayField,\n GroupField,\n BlocksField,\n RowField,\n CollapsibleField,\n TabsField,\n ValidateOptions,\n} from '../fields/types.js';\nimport type { CollectionConfig, GlobalConfig } from './types.js';\n\n// ============================================================================\n// Field → Zod Schema Generator\n// ============================================================================\n\nexport function fieldToZod(field: Field): ZodTypeAny {\n switch (field.type) {\n case 'text':\n return textToZod(field);\n case 'number':\n return numberToZod(field);\n case 'checkbox':\n return checkboxToZod(field);\n case 'date':\n return dateToZod(field);\n case 'email':\n return emailToZod(field);\n case 'password':\n return passwordToZod(field);\n case 'textarea':\n return textareaToZod(field);\n case 'select':\n return selectToZod(field);\n case 'radio':\n return radioToZod(field);\n case 'color':\n return colorToZod(field);\n case 'richtext':\n return richTextToZod(field);\n case 'json':\n return jsonToZod(field);\n case 'code':\n return codeToZod(field);\n case 'upload':\n return uploadToZod(field);\n case 'markdown':\n return markdownToZod(field);\n case 'relationship':\n return relationshipToZod(field);\n case 'array':\n return arrayToZod(field);\n case 'group':\n return groupToZod(field);\n case 'blocks':\n return blocksToZod(field);\n case 'row':\n return rowToZod(field);\n case 'collapsible':\n return collapsibleToZod(field);\n case 'tabs':\n return tabsToZod(field);\n default:\n return z.any();\n }\n}\n\n// ============================================================================\n// Primitive Field Schemas\n// ============================================================================\n\nfunction textToZod(field: TextField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (field.pattern) schema = (schema as any).regex(new RegExp(field.pattern));\n if (field.variant === 'email') schema = (schema as any).email();\n if (field.variant === 'url') schema = (schema as any).url();\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction numberToZod(field: NumberField): ZodTypeAny {\n let schema: ZodTypeAny = field.integer ? z.number().int() : z.number();\n if (field.min !== undefined) schema = (schema as any).min(field.min);\n if (field.max !== undefined) schema = (schema as any).max(field.max);\n if (field.step) {\n schema = (schema as any).refine(\n (val: number) => Number.isInteger(val / field.step!),\n `Value must be divisible by ${field.step}`\n );\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction checkboxToZod(field: CheckboxField): ZodTypeAny {\n let schema: ZodTypeAny = z.boolean();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction dateToZod(field: DateField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().refine(\n (val) => !isNaN(Date.parse(val)),\n 'Invalid date format'\n );\n if (field.minDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) >= new Date(field.minDate!),\n `Date must be after ${field.minDate}`\n );\n }\n if (field.maxDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) <= new Date(field.maxDate!),\n `Date must be before ${field.maxDate}`\n );\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction emailToZod(field: EmailField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().email('Invalid email');\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction passwordToZod(field: PasswordField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().min(6, 'Password must be at least 6 characters');\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction textareaToZod(field: TextareaField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction selectToZod(field: SelectField): ZodTypeAny {\n const values = field.options.map(opt => opt.value);\n let schema: ZodTypeAny;\n if (field.hasMany) {\n schema = z.array(z.enum(values as [string, ...string[]]));\n } else {\n schema = z.enum(values as [string, ...string[]]);\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction radioToZod(field: RadioField): ZodTypeAny {\n const values = field.options.map(opt => opt.value);\n let schema: ZodTypeAny = z.enum(values as [string, ...string[]]);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction colorToZod(field: ColorField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.format === 'hex') schema = (schema as any).regex(/^#[0-9A-Fa-f]{6}$/);\n if (field.format === 'rgb') schema = (schema as any).regex(/^rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)$/);\n if (field.format === 'hsl') schema = (schema as any).regex(/^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Complex Field Schemas\n// ============================================================================\n\nfunction richTextToZod(field: RichTextField): ZodTypeAny {\n let schema: ZodTypeAny = z.array(z.object({\n type: z.string(),\n data: z.record(z.any()),\n children: z.array(z.any()).optional(),\n }));\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction jsonToZod(field: JSONField): ZodTypeAny {\n let schema: ZodTypeAny = z.record(z.any());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction codeToZod(field: CodeField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction uploadToZod(field: UploadField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.hasMany) schema = z.array(z.string());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction markdownToZod(field: MarkdownField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Relational Field Schemas\n// ============================================================================\n\nfunction relationshipToZod(field: RelationshipField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (Array.isArray(field.relationTo)) {\n schema = z.object({\n relationTo: z.enum(field.relationTo as [string, ...string[]]),\n value: z.string(),\n });\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = schema.optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction arrayToZod(field: ArrayField): ZodTypeAny {\n const itemSchema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n let schema: ZodTypeAny = z.array(itemSchema);\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction groupToZod(field: GroupField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n if (!field.required) return (schema as any).optional();\n return schema;\n}\n\nfunction blocksToZod(field: BlocksField): ZodTypeAny {\n const blockSchemas = field.blocks.map(block => {\n return z.object({\n blockType: z.literal(block.slug),\n ...Object.fromEntries(\n block.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n ),\n });\n });\n let schema: ZodTypeAny = z.array(z.discriminatedUnion('blockType', blockSchemas as any));\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction rowToZod(field: RowField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n return schema;\n}\n\nfunction collapsibleToZod(field: CollapsibleField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n return schema;\n}\n\nfunction tabsToZod(field: TabsField): ZodTypeAny {\n const schemas: Record<string, ZodTypeAny> = {};\n for (const tab of field.tabs) {\n for (const f of tab.fields) {\n if (f.name) {\n schemas[f.name] = fieldToZod(f);\n }\n }\n }\n return z.object(schemas);\n}\n\n// ============================================================================\n// Custom Validation Helper\n// ============================================================================\n\nfunction addCustomValidation(schema: ZodTypeAny, validate: (value: any, options: ValidateOptions) => string | true | Promise<string | true>): ZodTypeAny {\n return schema.refine(\n async (val: any) => {\n const result = await validate(val, { required: false });\n return result === true;\n },\n {\n message: 'Custom validation failed',\n }\n );\n}\n\n// ============================================================================\n// Collection Schema Generator\n// ============================================================================\n\nexport function collectionToZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n if (collection.timestamps) {\n shape['createdAt'] = z.string().optional();\n shape['updatedAt'] = z.string().optional();\n }\n \n if (collection.tenantScoped) {\n shape['tenantID'] = z.string().optional();\n }\n \n shape['id'] = z.string().optional();\n \n return z.object(shape);\n}\n\nexport function collectionToCreateZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n return z.object(shape);\n}\n\nexport function collectionToUpdateZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field).optional();\n }\n }\n \n return z.object(shape);\n}\n\nexport function collectionToWhereZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = z.object({\n equals: z.any().optional(),\n not_equals: z.any().optional(),\n in: z.array(z.any()).optional(),\n not_in: z.array(z.any()).optional(),\n greater_than: z.number().optional(),\n greater_than_equal: z.number().optional(),\n less_than: z.number().optional(),\n less_than_equal: z.number().optional(),\n like: z.string().optional(),\n not_like: z.string().optional(),\n contains: z.string().optional(),\n exists: z.boolean().optional(),\n }).optional();\n }\n }\n \n shape['AND'] = z.array(z.lazy(() => z.object(shape))).optional();\n shape['OR'] = z.array(z.lazy(() => z.object(shape))).optional();\n \n return z.object(shape).optional();\n}\n\n// ============================================================================\n// Global Schema Generator\n// ============================================================================\n\nexport function globalToZod(global: GlobalConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of global.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n shape['id'] = z.string().optional();\n \n return z.object(shape);\n}\n","import type { CollectionConfig, GlobalConfig, BaseAdapter, PluginConfig } from './types.js';\nimport type { Field } from '../fields/types.js';\nimport { validateConfig, validateCollection, validateGlobal } from './validator.js';\nimport { collectionToZod, collectionToCreateZod, collectionToUpdateZod, collectionToWhereZod, globalToZod, fieldToZod } from './zod-builder.js';\nimport type { ZodTypeAny } from 'zod';\n\n// ============================================================================\n// Registry Class\n// ============================================================================\n\nexport class Registry {\n private collections: Map<string, CollectionConfig> = new Map();\n private globals: Map<string, GlobalConfig> = new Map();\n private plugins: PluginConfig[] = [];\n private schemaCache: Map<string, ZodTypeAny> = new Map();\n private initialized = false;\n\n // ========================================================================\n // Collection Management\n // ========================================================================\n\n addCollection(config: CollectionConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add collections after Registry has been initialized');\n }\n\n // Apply plugin extensions\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendCollection) {\n finalConfig = plugin.extendCollection(finalConfig.slug, finalConfig);\n }\n }\n\n // Add default fields (id, createdAt, etc.) before validation\n finalConfig.fields = this.applyFieldDefaults(finalConfig);\n\n const errors = validateCollection(finalConfig);\n if (errors.length > 0) {\n throw new Error(`Invalid collection config: ${errors.join(', ')}`);\n }\n\n this.collections.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(finalConfig.slug);\n }\n\n addCollections(configs: CollectionConfig[]): void {\n for (const config of configs) {\n this.addCollection(config);\n }\n }\n\n getCollection(slug: string): CollectionConfig | undefined {\n return this.collections.get(slug);\n }\n\n getCollections(): CollectionConfig[] {\n return Array.from(this.collections.values());\n }\n\n getCollectionSlugs(): string[] {\n return Array.from(this.collections.keys());\n }\n\n hasCollection(slug: string): boolean {\n return this.collections.has(slug);\n }\n\n removeCollection(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove collections after Registry has been initialized');\n }\n this.clearSchemaCache(slug);\n return this.collections.delete(slug);\n }\n\n // ========================================================================\n // Global Management\n // ========================================================================\n\n addGlobal(config: GlobalConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add globals after Registry has been initialized');\n }\n\n const errors = validateGlobal(config);\n if (errors.length > 0) {\n throw new Error(`Invalid global config: ${errors.join(', ')}`);\n }\n\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendGlobal) {\n finalConfig = plugin.extendGlobal(finalConfig.slug, finalConfig);\n }\n }\n\n this.globals.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(`global:${finalConfig.slug}`);\n }\n\n addGlobals(configs: GlobalConfig[]): void {\n for (const config of configs) {\n this.addGlobal(config);\n }\n }\n\n getGlobal(slug: string): GlobalConfig | undefined {\n return this.globals.get(slug);\n }\n\n getGlobals(): GlobalConfig[] {\n return Array.from(this.globals.values());\n }\n\n getGlobalSlugs(): string[] {\n return Array.from(this.globals.keys());\n }\n\n hasGlobal(slug: string): boolean {\n return this.globals.has(slug);\n }\n\n removeGlobal(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove globals after Registry has been initialized');\n }\n this.clearSchemaCache(`global:${slug}`);\n return this.globals.delete(slug);\n }\n\n // ========================================================================\n // Plugin Management\n // ========================================================================\n\n addPlugin(plugin: PluginConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add plugins after Registry has been initialized');\n }\n this.plugins.push(plugin);\n }\n\n getPlugins(): PluginConfig[] {\n return [...this.plugins];\n }\n\n // ========================================================================\n // Schema Generation\n // ========================================================================\n\n getZodSchema(slug: string): ZodTypeAny {\n const cached = this.schemaCache.get(slug);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToZod(collection);\n this.schemaCache.set(slug, schema);\n return schema;\n }\n\n const global = this.globals.get(slug);\n if (global) {\n const schema = globalToZod(global);\n this.schemaCache.set(`global:${slug}`, schema);\n return schema;\n }\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getCreateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:create`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToCreateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getUpdateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:update`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToUpdateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getWhereZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:where`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToWhereZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getFieldZodSchema(field: Field): ZodTypeAny {\n return fieldToZod(field);\n }\n\n private clearSchemaCache(slug: string): void {\n this.schemaCache.delete(slug);\n this.schemaCache.delete(`${slug}:create`);\n this.schemaCache.delete(`${slug}:update`);\n this.schemaCache.delete(`${slug}:where`);\n }\n\n // ========================================================================\n // Field Helpers\n // ========================================================================\n\n private applyFieldDefaults(config: CollectionConfig): Field[] {\n const fields = [...config.fields];\n\n // Add id field if not present\n if (!fields.some(f => f.name === 'id')) {\n fields.unshift({\n name: 'id',\n type: 'text',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add tenantID field if tenantScoped\n if (config.tenantScoped && !fields.some(f => f.name === 'tenantID')) {\n fields.push({\n name: 'tenantID',\n type: 'text',\n required: true,\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add timestamp fields if enabled\n if (config.timestamps && !fields.some(f => f.name === 'createdAt')) {\n fields.push({\n name: 'createdAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n return fields;\n }\n\n getFields(slug: string): Field[] {\n const collection = this.collections.get(slug);\n if (collection) return collection.fields;\n\n const global = this.globals.get(slug);\n if (global) return global.fields;\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getFieldMap(slug: string): Map<string, Field> {\n const fields = this.getFields(slug);\n const map = new Map<string, Field>();\n\n const addFields = (fields: Field[]) => {\n for (const field of fields) {\n if (field.name) {\n map.set(field.name, field);\n }\n if ('fields' in field && field.fields) {\n addFields(field.fields);\n }\n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n addFields(tab.fields);\n }\n }\n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n addFields(block.fields);\n }\n }\n }\n };\n\n addFields(fields);\n return map;\n }\n\n getVisibleFields(slug: string): Field[] {\n const fields = this.getFields(slug);\n return fields.filter(f => !f.admin?.hidden);\n }\n\n // ========================================================================\n // Initialization\n // ========================================================================\n\n validate(): void {\n const collections = this.getCollections();\n const globals = this.getGlobals();\n validateConfig(collections, globals);\n }\n\n async init(): Promise<void> {\n this.validate();\n\n // Initialize plugins\n for (const plugin of this.plugins) {\n if (plugin.init) {\n await plugin.init(this);\n }\n }\n\n this.initialized = true;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n // ========================================================================\n // Query Helpers\n // ========================================================================\n\n getPaginationDefaults(slug: string): { defaultLimit: number; limits: number[] } {\n const collection = this.collections.get(slug);\n return {\n defaultLimit: collection?.admin?.pagination?.defaultLimit || 10,\n limits: collection?.admin?.pagination?.limits || [10, 25, 50, 100],\n };\n }\n\n getDefaultSort(slug: string): string {\n const collection = this.collections.get(slug);\n const useAsTitle = collection?.admin?.useAsTitle;\n if (useAsTitle) return useAsTitle;\n return 'createdAt';\n }\n\n getDefaultColumns(slug: string): string[] {\n const collection = this.collections.get(slug);\n if (collection?.admin?.defaultColumns) {\n return collection.admin.defaultColumns;\n }\n const fields = this.getVisibleFields(slug);\n return fields.slice(0, 4).map(f => f.name!);\n }\n\n // ========================================================================\n // Admin Helpers\n // ========================================================================\n\n getAdminTitle(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.label || collection?.admin?.description || slug;\n }\n\n getAdminLabel(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.singularLabel || collection?.label || slug;\n }\n\n getAdminGroup(slug: string): string | undefined {\n return this.collections.get(slug)?.admin?.group;\n }\n\n // ========================================================================\n // Debug / Stats\n // ========================================================================\n\n getStats(): {\n collections: number;\n globals: number;\n plugins: number;\n fields: number;\n } {\n let totalFields = 0;\n for (const collection of this.collections.values()) {\n totalFields += collection.fields.length;\n }\n for (const global of this.globals.values()) {\n totalFields += global.fields.length;\n }\n\n return {\n collections: this.collections.size,\n globals: this.globals.size,\n plugins: this.plugins.length,\n fields: totalFields,\n };\n }\n\n toJSON(): {\n collections: CollectionConfig[];\n globals: GlobalConfig[];\n } {\n return {\n collections: this.getCollections(),\n globals: this.getGlobals(),\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet instance: Registry | null = null;\n\nexport function getRegistry(): Registry {\n if (!instance) {\n instance = new Registry();\n }\n return instance;\n}\n\nexport function resetRegistry(): void {\n instance = null;\n}\n\nexport function createRegistry(): Registry {\n instance = new Registry();\n return instance;\n}\n","import { Registry, createRegistry } from './registry/index.js';\nimport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n} from './registry/types.js';\nimport { KyroPubSub, createWSServer, type KyroWSServer } from './api/ws/index.js';\nimport { createHonoApp } from './api/rest/index.js';\nimport { buildGraphQLSchema } from './api/graphql/index.js';\nimport { createKyroServer } from './api/trpc/index.js';\nimport type { User, Request } from './hooks/types.js';\n\n// ============================================================================\n// Kyro Instance\n// ============================================================================\n\nexport class Kyro {\n public registry: Registry;\n public db: BaseAdapter;\n public pubsub: KyroPubSub;\n private wsServer?: KyroWSServer;\n private config: KyroConfig;\n\n constructor(config: KyroConfig) {\n this.config = config;\n this.registry = createRegistry();\n this.db = config.adapter;\n this.pubsub = new KyroPubSub(this.registry);\n\n // Register collections\n if (config.collections) {\n this.registry.addCollections(config.collections);\n }\n\n // Register globals\n if (config.globals) {\n this.registry.addGlobals(config.globals);\n }\n\n // Register plugins\n if (config.plugins) {\n for (const plugin of config.plugins) {\n this.registry.addPlugin(plugin);\n }\n }\n }\n\n async init(): Promise<void> {\n // Initialize registry\n await this.registry.init();\n\n // Initialize database adapter\n await this.db.init(this.registry.getCollections(), this.registry.getGlobals());\n\n // Auto-register PubSub hooks\n this.pubsub.autoRegisterHooks();\n\n console.log('✅ Kyro CMS initialized');\n console.log(` Collections: ${this.registry.getCollections().length}`);\n console.log(` Globals: ${this.registry.getGlobals().length}`);\n }\n\n // ============================================================================\n // API Methods\n // ============================================================================\n\n getREST(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createHonoApp({\n registry: this.registry,\n db: this.db,\n ...options,\n cors: this.config.cors,\n });\n }\n\n getGraphQL(options?: { user?: User; req?: Request; tenantID?: string }) {\n return buildGraphQLSchema({\n registry: this.registry,\n db: this.db,\n ...options,\n });\n }\n\n getTRPC(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createKyroServer({\n registry: this.registry,\n db: this.db,\n req: options?.req || { headers: {} },\n ...options,\n });\n }\n\n async startWebSocket(options?: { port?: number; requireAuth?: boolean; verifyToken?: (token: string) => Promise<any> }) {\n this.wsServer = createWSServer({\n pubsub: this.pubsub,\n port: options?.port || 8080,\n requireAuth: options?.requireAuth,\n verifyToken: options?.verifyToken,\n });\n console.log(`🔌 WebSocket server started on port ${options?.port || 8080}`);\n return this.wsServer;\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n async shutdown(): Promise<void> {\n if (this.wsServer) {\n await this.wsServer.close();\n }\n await this.db.disconnect();\n console.log('👋 Kyro CMS shut down');\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createKyro(config: KyroConfig): Kyro {\n return new Kyro(config);\n}\n\n// ============================================================================\n// Convenience Exports\n// ============================================================================\n\nexport { Registry, createRegistry, getRegistry, resetRegistry } from './registry/index.js';\nexport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n CreateResult,\n} from './registry/types.js';\nexport type { Field, FieldType } from './fields/index.js';\nexport type { AccessControl, AccessArgs, WhereClause } from './access/index.js';\nexport type { Hook, HookArgs, User, Request } from './hooks/index.js';\nexport { DrizzleAdapter, createDrizzleAdapter } from './database/drizzle/index.js';\nexport { MongoDBAdapter, createMongoDBAdapter } from './database/mongodb/index.js';\nexport { KyroPubSub, KyroWSServer, createWSServer } from './api/ws/index.js';\nexport { createHonoApp } from './api/rest/index.js';\nexport { buildGraphQLSchema, createGraphQLSchema } from './api/graphql/index.js';\nexport { createKyroServer } from './api/trpc/index.js';\nexport { z } from 'zod';\n","// ============================================================================\n// Base Field Interface\n// ============================================================================\n\nexport interface FieldAdmin {\n description?: string;\n placeholder?: string;\n readOnly?: boolean;\n hidden?: boolean;\n width?: string;\n condition?: (data: Record<string, any>, siblingData: Record<string, any>) => boolean;\n position?: 'sidebar' | 'main';\n}\n\nexport interface BaseField {\n name: string;\n label?: string;\n required?: boolean;\n unique?: boolean;\n indexed?: boolean;\n defaultValue?: any;\n admin?: FieldAdmin;\n validate?: (value: any, options: ValidateOptions) => string | true | Promise<string | true>;\n hooks?: {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n };\n}\n\nexport interface ValidateOptions {\n data?: Record<string, any>;\n siblingData?: Record<string, any>;\n user?: any;\n operation?: string;\n required?: boolean;\n}\n\nexport type Hook = (args: any) => Promise<any> | any;\n\n// ============================================================================\n// Primitive Fields\n// ============================================================================\n\nexport type TextFieldVariant = 'text' | 'email' | 'password' | 'url' | 'id';\n\nexport interface TextField extends BaseField {\n type: 'text';\n variant?: TextFieldVariant;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n hasMany?: boolean;\n localized?: boolean;\n}\n\nexport interface NumberField extends BaseField {\n type: 'number';\n min?: number;\n max?: number;\n step?: number;\n integer?: boolean;\n hasMany?: boolean;\n}\n\nexport interface CheckboxField extends BaseField {\n type: 'checkbox';\n}\n\nexport interface DateField extends BaseField {\n type: 'date';\n minDate?: string;\n maxDate?: string;\n time?: boolean;\n}\n\nexport interface EmailField extends BaseField {\n type: 'email';\n}\n\nexport interface PasswordField extends BaseField {\n type: 'password';\n}\n\nexport interface TextareaField extends BaseField {\n type: 'textarea';\n minLength?: number;\n maxLength?: number;\n rows?: number;\n localized?: boolean;\n}\n\nexport interface SelectField extends BaseField {\n type: 'select';\n options: Array<{ label: string; value: string }>;\n hasMany?: boolean;\n defaultValue?: string | string[];\n}\n\nexport interface RadioField extends BaseField {\n type: 'radio';\n options: Array<{ label: string; value: string }>;\n defaultValue?: string;\n}\n\nexport interface ColorField extends BaseField {\n type: 'color';\n format?: 'hex' | 'rgb' | 'hsl';\n defaultValue?: string;\n}\n\n// ============================================================================\n// Complex Fields\n// ============================================================================\n\nexport interface RichTextBlock {\n type: string;\n data: Record<string, any>;\n children?: RichTextBlock[];\n}\n\nexport interface RichTextField extends BaseField {\n type: 'richtext';\n editor?: 'lexical' | 'slate' | 'blocks';\n defaultValue?: RichTextBlock[];\n localized?: boolean;\n}\n\nexport interface JSONField extends BaseField {\n type: 'json';\n defaultValue?: Record<string, any>;\n}\n\nexport interface CodeField extends BaseField {\n type: 'code';\n language?: string;\n defaultValue?: string;\n}\n\nexport interface UploadField extends BaseField {\n type: 'upload';\n relationTo: string;\n hasMany?: boolean;\n maxDepth?: number;\n defaultValue?: string;\n}\n\nexport interface MarkdownField extends BaseField {\n type: 'markdown';\n localized?: boolean;\n defaultValue?: string;\n}\n\n// ============================================================================\n// Relational Fields\n// ============================================================================\n\nexport interface RelationshipField extends BaseField {\n type: 'relationship';\n relationTo: string | string[];\n hasMany?: boolean;\n maxDepth?: number;\n filterOptions?: (args: { data: any; user: any }) => Record<string, any>;\n defaultValue?: string | string[];\n}\n\nexport interface ArrayField extends BaseField {\n type: 'array';\n fields: Field[];\n minRows?: number;\n maxRows?: number;\n labels?: { singular?: string; plural?: string };\n defaultValue?: Record<string, any>[];\n}\n\nexport interface GroupField extends BaseField {\n type: 'group';\n fields: Field[];\n defaultValue?: Record<string, any>;\n}\n\nexport interface Block {\n slug: string;\n label: string;\n fields: Field[];\n imageURL?: string;\n}\n\nexport interface BlocksField extends BaseField {\n type: 'blocks';\n blocks: Block[];\n minRows?: number;\n maxRows?: number;\n defaultValue?: Array<{ blockType: string; [key: string]: any }>;\n}\n\nexport interface RowField extends Omit<BaseField, 'name'> {\n type: 'row';\n fields: Field[];\n name?: string;\n}\n\nexport interface CollapsibleField extends Omit<BaseField, 'name'> {\n type: 'collapsible';\n fields: Field[];\n label: string;\n name?: string;\n}\n\nexport interface TabsField extends Omit<BaseField, 'name'> {\n type: 'tabs';\n tabs: Array<{\n label: string;\n fields: Field[];\n name?: string;\n }>;\n name?: string;\n}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\nexport type Field =\n | TextField\n | NumberField\n | CheckboxField\n | DateField\n | EmailField\n | PasswordField\n | TextareaField\n | SelectField\n | RadioField\n | ColorField\n | RichTextField\n | JSONField\n | CodeField\n | UploadField\n | MarkdownField\n | RelationshipField\n | ArrayField\n | GroupField\n | BlocksField\n | RowField\n | CollapsibleField\n | TabsField;\n\nexport type FieldType = Field['type'];\n\n// ============================================================================\n// Field Type Guards\n// ============================================================================\n\nexport function isTextField(field: Field): field is TextField {\n return field.type === 'text';\n}\n\nexport function isNumberField(field: Field): field is NumberField {\n return field.type === 'number';\n}\n\nexport function isRelationshipField(field: Field): field is RelationshipField {\n return field.type === 'relationship';\n}\n\nexport function isArrayField(field: Field): field is ArrayField {\n return field.type === 'array';\n}\n\nexport function isGroupField(field: Field): field is GroupField {\n return field.type === 'group';\n}\n\nexport function isBlocksField(field: Field): field is BlocksField {\n return field.type === 'blocks';\n}\n\nexport function isUploadField(field: Field): field is UploadField {\n return field.type === 'upload';\n}\n\nexport function isRichTextField(field: Field): field is RichTextField {\n return field.type === 'richtext';\n}\n\nexport function isSelectField(field: Field): field is SelectField {\n return field.type === 'select';\n}\n\nexport function isLayoutField(field: Field): field is RowField | CollapsibleField | TabsField {\n return field.type === 'row' || field.type === 'collapsible' || field.type === 'tabs';\n}\n\n// ============================================================================\n// Field Type List\n// ============================================================================\n\nexport const PRIMITIVE_FIELD_TYPES = [\n 'text', 'number', 'checkbox', 'date', 'email', 'password',\n 'textarea', 'select', 'radio', 'color',\n] as const;\n\nexport const COMPLEX_FIELD_TYPES = [\n 'richtext', 'json', 'code', 'upload', 'markdown',\n] as const;\n\nexport const RELATIONAL_FIELD_TYPES = [\n 'relationship', 'array', 'group', 'blocks',\n] as const;\n\nexport const LAYOUT_FIELD_TYPES = [\n 'row', 'collapsible', 'tabs',\n] as const;\n\nexport const ALL_FIELD_TYPES = [\n ...PRIMITIVE_FIELD_TYPES,\n ...COMPLEX_FIELD_TYPES,\n ...RELATIONAL_FIELD_TYPES,\n ...LAYOUT_FIELD_TYPES,\n] as const;\n","// ============================================================================\n// Hook Types\n// ============================================================================\n\nexport interface Request {\n body?: any;\n headers: Record<string, string>;\n method?: string;\n url?: string;\n cookies?: Record<string, string>;\n query?: Record<string, any>;\n}\n\nexport interface User {\n id: string;\n email: string;\n role: string;\n tenantID?: string;\n [key: string]: any;\n}\n\nexport interface HookArgs<T = any> {\n collection?: string;\n global?: string;\n data?: T;\n originalDoc?: T;\n doc?: T;\n req: Request;\n user?: User;\n operation: 'create' | 'read' | 'update' | 'delete';\n tenantID?: string;\n field?: string;\n siblingData?: Record<string, any>;\n value?: any;\n previousValue?: any;\n context?: Record<string, any>;\n}\n\nexport type Hook<T = any> = (args: HookArgs<T>) => Promise<T | void> | T | void;\n\nexport interface CollectionHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n beforeDelete?: Hook[];\n afterDelete?: Hook[];\n beforeLogin?: Hook[];\n afterLogin?: Hook[];\n afterLogout?: Hook[];\n afterRefresh?: Hook[];\n afterForgotPassword?: Hook[];\n}\n\nexport interface FieldHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n}\n\nexport interface GlobalHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n}\n\n// ============================================================================\n// Hook Runner\n// ============================================================================\n\nexport async function runHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n let result = args.data;\n \n for (const hook of hooks) {\n const hookResult = await hook({\n ...args,\n data: result,\n });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n }\n \n return result;\n}\n\nexport async function runFieldHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n return runHooks(hooks, args);\n}\n","import type Database from 'better-sqlite3';\nimport { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n} from '../../registry/types.js';\n\n// ============================================================================\n// SQLite / Local-First Adapter\n// ============================================================================\n\nexport class LocalAdapter extends AbstractBaseAdapter {\n private db: any;\n private path?: string;\n private migrations: Map<string, boolean> = new Map();\n\n constructor(options: {\n db?: any;\n path?: string;\n }) {\n super();\n this.path = options.path;\n\n if (options.db) {\n this.db = options.db;\n } else {\n this.db = null;\n }\n }\n\n async connect(): Promise<void> {\n if (!this.db) {\n const Database = (await import('better-sqlite3')).default;\n this.db = new Database(this.path || ':memory:');\n }\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.connected = true;\n console.log(`[LocalAdapter] Connected to SQLite (${this.path || 'memory'})`);\n }\n\n async disconnect(): Promise<void> {\n if (this.db) {\n this.db.close();\n }\n this.connected = false;\n console.log('[LocalAdapter] Disconnected');\n }\n\n // ========================================================================\n // Schema Management\n // ========================================================================\n\n private ensureTable(config: CollectionConfig): void {\n const tableName = this.getTableNameFor(config.slug);\n\n if (this.migrations.has(tableName)) return;\n\n const columns: string[] = [\n `id TEXT PRIMARY KEY`,\n ];\n\n for (const field of config.fields) {\n if (!field.name || field.name === 'id') continue;\n\n const colDef = this.fieldToSQL(field);\n if (colDef) columns.push(colDef);\n }\n\n if (config.timestamps) {\n columns.push(`created_at TEXT DEFAULT (datetime('now'))`);\n columns.push(`updated_at TEXT DEFAULT (datetime('now'))`);\n }\n\n if (config.tenantScoped) {\n columns.push(`tenant_id TEXT NOT NULL`);\n }\n\n const createSQL = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns.join(', ')})`;\n this.db.exec(createSQL);\n\n // Create indexes\n for (const field of config.fields) {\n if (field.name && field.indexed) {\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${tableName}_${field.name} ON ${tableName}(${field.name})`);\n }\n if (field.name && field.unique) {\n this.db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_${tableName}_${field.name}_unique ON ${tableName}(${field.name})`);\n }\n }\n\n this.migrations.set(tableName, true);\n }\n\n private fieldToSQL(field: any): string | null {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n case 'url':\n return `${field.name} TEXT`;\n case 'number':\n return `${field.name} REAL`;\n case 'checkbox':\n return `${field.name} INTEGER DEFAULT 0`;\n case 'date':\n return `${field.name} TEXT`;\n case 'select':\n case 'radio':\n return `${field.name} TEXT`;\n case 'relationship':\n case 'upload':\n return `${field.name} TEXT`;\n case 'json':\n case 'richtext':\n case 'array':\n case 'group':\n case 'blocks':\n return `${field.name} TEXT`;\n default:\n return null;\n }\n }\n\n // ========================================================================\n // CRUD Operations\n // ========================================================================\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName}`;\n const params: any[] = [];\n const conditions: string[] = [];\n\n if (tenantID && config.tenantScoped) {\n conditions.push(`tenant_id = ?`);\n params.push(tenantID);\n }\n\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' || key === 'OR') continue;\n \n if (typeof value === 'object' && value !== null) {\n if (value.equals !== undefined) {\n conditions.push(`${key} = ?`);\n params.push(value.equals);\n }\n if (value.in !== undefined) {\n conditions.push(`${key} IN (${value.in.map(() => '?').join(', ')})`);\n params.push(...value.in);\n }\n if (value.not_equals !== undefined) {\n conditions.push(`${key} != ?`);\n params.push(value.not_equals);\n }\n } else {\n conditions.push(`${key} = ?`);\n params.push(value);\n }\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n const sortField = sort?.replace('-', '') || 'created_at';\n const sortDir = sort?.startsWith('-') ? 'DESC' : 'ASC';\n sql += ` ORDER BY ${sortField} ${sortDir}`;\n\n const countSql = sql.replace('SELECT *', 'SELECT COUNT(*) as count');\n const countResult = this.db.prepare(countSql).get(...params) as { count: number };\n const totalDocs = countResult?.count || 0;\n\n sql += ` LIMIT ? OFFSET ?`;\n params.push(limit, (page - 1) * limit);\n\n const rows = this.db.prepare(sql).all(...params);\n const docs = rows.map((row: any) => this.rowToDoc(row, config));\n\n return {\n docs: docs as T[],\n totalDocs,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(totalDocs / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(totalDocs / limit) ? page + 1 : null,\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n const row = this.db.prepare(sql).get(...params);\n if (!row) return null;\n\n return this.rowToDoc(row as any, config) as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const id = data.id || this.generateId();\n \n const insertData = this.prepareData(data, config);\n insertData.id = id;\n insertData.created_at = new Date().toISOString();\n insertData.updated_at = new Date().toISOString();\n\n if (tenantID && config.tenantScoped) {\n insertData.tenant_id = tenantID;\n }\n\n const columns = Object.keys(insertData);\n const placeholders = columns.map(() => '?').join(', ');\n const values = Object.values(insertData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n this.db.prepare(\n `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`\n ).run(...values);\n\n return { ...insertData, id } as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const updateData = this.prepareData(data, config);\n updateData.updated_at = new Date().toISOString();\n\n const columns = Object.keys(updateData);\n const setClause = columns.map(c => `${c} = ?`).join(', ');\n const values = Object.values(updateData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n let sql = `UPDATE ${tableName} SET ${setClause} WHERE id = ?`;\n const params = [...values, id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return this.findByID<T>({ collection: slug, id, tenantID }) as Promise<T>;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const doc = await this.findByID<T>({ collection: slug, id, tenantID });\n if (!doc) throw new Error(`Document not found: ${slug}/${id}`);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `DELETE FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return doc;\n }\n\n async count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT COUNT(*) as count FROM ${tableName}`;\n const params: any[] = [];\n\n if (tenantID && config.tenantScoped) {\n sql += ` WHERE tenant_id = ?`;\n params.push(tenantID);\n }\n\n const result = this.db.prepare(sql).get(...params) as { count: number };\n return result?.count || 0;\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string }): Promise<any> {\n const result = await this.find({ ...args, limit: 1 });\n return result.docs[0] || null;\n }\n\n // ========================================================================\n // Version Support (Placeholder)\n // ========================================================================\n\n async findVersions(): Promise<FindResult<any>> {\n return { docs: [], totalDocs: 0, limit: 10, totalPages: 0, page: 1, pagingCounter: 0, hasPrevPage: false, hasNextPage: false, prevPage: null, nextPage: null };\n }\n\n async findVersionByID(): Promise<any> {\n return null;\n }\n\n async createVersion(): Promise<any> {\n return {};\n }\n\n async deleteVersions(): Promise<void> {}\n\n // ========================================================================\n // Helpers\n // ========================================================================\n\n private rowToDoc(row: any, config: CollectionConfig): any {\n const doc: any = { id: row.id };\n\n for (const field of config.fields) {\n if (!field.name || field.name === 'id') continue;\n\n let value = row[field.name];\n\n if (field.type === 'json' || field.type === 'richtext' || \n field.type === 'array' || field.type === 'group' || field.type === 'blocks') {\n try {\n value = value ? JSON.parse(value) : null;\n } catch {\n value = null;\n }\n }\n\n if (field.type === 'checkbox') {\n value = Boolean(value);\n }\n\n if (field.type === 'date' && value) {\n value = new Date(value).toISOString();\n }\n\n doc[field.name] = value;\n }\n\n if (config.timestamps) {\n doc.createdAt = row.created_at;\n doc.updatedAt = row.updated_at;\n }\n\n if (config.tenantScoped) {\n doc.tenantID = row.tenant_id;\n }\n\n return doc;\n }\n\n private generateId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private getTableNameFor(slug: string): string {\n return slug.replace(/-/g, '_');\n }\n\n // ========================================================================\n // Migrations\n // ========================================================================\n\n async migrate(): Promise<void> {\n for (const config of this.collections.values()) {\n this.ensureTable(config);\n }\n console.log('[LocalAdapter] Migrations complete');\n }\n\n async rollback(): Promise<void> {\n console.log('[LocalAdapter] Rollback not supported for schema changes');\n }\n\n // ========================================================================\n // Transaction Support\n // ========================================================================\n\n async transaction<T>(fn: (tx: any) => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n const tx = this.db.transaction(async () => {\n return fn({ db: this.db });\n });\n\n try {\n const result = tx();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n // ========================================================================\n // Direct DB Access\n // ========================================================================\n\n getDatabase(): any {\n return this.db;\n }\n\n exec(sql: string): void {\n this.db.exec(sql);\n }\n\n prepare(sql: string) {\n return this.db.prepare(sql);\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createLocalAdapter(options?: {\n db?: any;\n path?: string;\n}): LocalAdapter {\n return new LocalAdapter(options || {});\n}\n","import type { CollectionConfig, GlobalConfig } from '../registry/types.js';\nimport type { Field } from '../fields/types.js';\nimport type { Hook } from '../hooks/types.js';\n\n// ============================================================================\n// Plugin System\n// ============================================================================\n\nexport interface PluginHooks {\n beforeInit?: Hook[];\n afterInit?: Hook[];\n beforeRegisterCollections?: Hook[];\n afterRegisterCollections?: Hook[];\n beforeRegisterGlobals?: Hook[];\n afterRegisterGlobals?: Hook[];\n beforeServerStart?: Hook[];\n afterServerStart?: Hook[];\n beforeServerStop?: Hook[];\n afterServerStop?: Hook[];\n}\n\nexport interface PluginCollectionExtension {\n slug: string;\n config: Partial<CollectionConfig>;\n}\n\nexport interface PluginGlobalExtension {\n slug: string;\n config: Partial<GlobalConfig>;\n}\n\nexport interface PluginFieldExtension {\n collectionSlug: string;\n field: Field;\n}\n\nexport interface PluginAPI {\n registry: {\n getCollection: (slug: string) => CollectionConfig | undefined;\n getCollections: () => CollectionConfig[];\n getGlobal: (slug: string) => GlobalConfig | undefined;\n addCollection: (config: CollectionConfig) => void;\n addGlobal: (config: GlobalConfig) => void;\n extendCollection: (slug: string, extension: Partial<CollectionConfig>) => void;\n extendGlobal: (slug: string, extension: Partial<GlobalConfig>) => void;\n addField: (collectionSlug: string, field: Field, position?: number) => void;\n };\n hooks: {\n register: (event: string, handler: Hook) => void;\n unregister: (event: string, handler: Hook) => void;\n };\n config: {\n get: (key: string) => any;\n set: (key: string, value: any) => void;\n };\n db: any;\n}\n\n// ============================================================================\n// Base Plugin Class\n// ============================================================================\n\nexport abstract class KyroPlugin {\n public name: string;\n public version?: string;\n public description?: string;\n public hooks: PluginHooks = {};\n public collections: Partial<CollectionConfig>[] = [];\n public globals: Partial<GlobalConfig>[] = [];\n public fields: PluginFieldExtension[] = [];\n public extensions: {\n collections: PluginCollectionExtension[];\n globals: PluginGlobalExtension[];\n } = { collections: [], globals: [] };\n public adminComponents: Record<string, any> = {};\n public adminStyles: string[] = [];\n public serverMiddleware?: (app: any) => void;\n public clientMiddleware?: (req: any) => any;\n\n constructor(name: string) {\n this.name = name;\n }\n\n async init?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async beforeInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async afterInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n getCollections?(): Partial<CollectionConfig>[] {\n return this.collections;\n }\n\n getGlobals?(): Partial<GlobalConfig>[] {\n return this.globals;\n }\n\n getHooks?(): PluginHooks {\n return this.hooks;\n }\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: Map<string, KyroPlugin> = new Map();\n private hooks: Map<string, Hook[]> = new Map();\n\n register(plugin: KyroPlugin): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Register hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.registerHook(event, handler);\n }\n }\n }\n\n console.log(`[PluginManager] Registered plugin: ${plugin.name}`);\n }\n\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (!plugin) return;\n\n // Unregister hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.unregisterHook(event, handler);\n }\n }\n }\n\n this.plugins.delete(name);\n console.log(`[PluginManager] Unregistered plugin: ${name}`);\n }\n\n get(name: string): KyroPlugin | undefined {\n return this.plugins.get(name);\n }\n\n getAll(): KyroPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n registerHook(event: string, handler: Hook): void {\n if (!this.hooks.has(event)) {\n this.hooks.set(event, []);\n }\n this.hooks.get(event)!.push(handler);\n }\n\n unregisterHook(event: string, handler: Hook): void {\n const handlers = this.hooks.get(event);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n }\n\n async executeHook(event: string, args?: any): Promise<any> {\n const handlers = this.hooks.get(event) || [];\n let result = args;\n\n for (const handler of handlers) {\n try {\n const hookResult = await handler({ ...args, data: result });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n } catch (error) {\n console.error(`[PluginManager] Error in hook \"${event}\":`, error);\n }\n }\n\n return result;\n }\n\n // ========================================================================\n // Collection/Field Extensions\n // ========================================================================\n\n getAllCollections(): Partial<CollectionConfig>[] {\n const collections: Partial<CollectionConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginCollections = plugin.getCollections?.() || [];\n collections.push(...pluginCollections);\n }\n\n return collections;\n }\n\n getAllGlobals(): Partial<GlobalConfig>[] {\n const globals: Partial<GlobalConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginGlobals = plugin.getGlobals?.() || [];\n globals.push(...pluginGlobals);\n }\n\n return globals;\n }\n\n getAllFields(): PluginFieldExtension[] {\n const fields: PluginFieldExtension[] = [];\n\n for (const plugin of this.plugins.values()) {\n fields.push(...plugin.fields);\n }\n\n return fields;\n }\n\n getAdminComponents(): Record<string, any> {\n const components: Record<string, any> = {};\n\n for (const plugin of this.plugins.values()) {\n Object.assign(components, plugin.adminComponents);\n }\n\n return components;\n }\n\n getAdminStyles(): string[] {\n const styles: string[] = [];\n\n for (const plugin of this.plugins.values()) {\n styles.push(...plugin.adminStyles);\n }\n\n return styles;\n }\n}\n\n// ============================================================================\n// Preset Plugins\n// ============================================================================\n\n// SEO Plugin\nexport class SEOPLugin extends KyroPlugin {\n constructor() {\n super('seo');\n this.description = 'Advanced SEO features including sitemaps, robots.txt, and structured data';\n \n this.collections.push({\n slug: 'seo-settings',\n label: 'SEO Settings',\n fields: [\n { name: 'sitemap', type: 'checkbox', label: 'Enable Sitemap', defaultValue: true },\n { name: 'robotsTxt', type: 'textarea', label: 'robots.txt Content' },\n { name: 'canonicalUrl', type: 'text', variant: 'url' as any, label: 'Canonical URL' },\n { name: 'ogImage', type: 'text', label: 'Default OG Image URL' },\n ],\n });\n }\n}\n\n// Analytics Plugin\nexport class AnalyticsPlugin extends KyroPlugin {\n constructor() {\n super('analytics');\n this.description = 'Analytics integration for tracking page views and events';\n \n this.collections.push({\n slug: 'analytics-events',\n label: 'Analytics Events',\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'properties', type: 'json', label: 'Event Properties' },\n { name: 'timestamp', type: 'date', required: true },\n { name: 'userId', type: 'text', label: 'User ID' },\n { name: 'sessionId', type: 'text', label: 'Session ID' },\n ],\n });\n\n this.adminComponents['AnalyticsDashboard'] = {};\n }\n}\n\n// Comments Plugin\nexport class CommentsPlugin extends KyroPlugin {\n constructor() {\n super('comments');\n this.description = 'Commenting system for products and posts';\n \n this.collections.push({\n slug: 'comments',\n label: 'Comments',\n fields: [\n { name: 'content', type: 'textarea', required: true },\n { name: 'author', type: 'text', required: true },\n { name: 'email', type: 'email' },\n { name: 'approved', type: 'checkbox', defaultValue: false },\n { name: 'parent', type: 'text', label: 'Parent Comment ID' },\n { name: 'resourceType', type: 'text', required: true },\n { name: 'resourceId', type: 'text', required: true },\n ],\n });\n\n this.adminComponents['CommentModeration'] = {};\n }\n}\n\n// Reviews Plugin\nexport class ReviewsPlugin extends KyroPlugin {\n constructor() {\n super('reviews');\n this.description = 'Product reviews and ratings';\n \n this.collections.push({\n slug: 'reviews',\n label: 'Reviews',\n fields: [\n { name: 'rating', type: 'number', required: true, min: 1, max: 5 },\n { name: 'title', type: 'text' },\n { name: 'content', type: 'textarea', required: true },\n { name: 'author', type: 'relationship', relationTo: 'customers' },\n { name: 'product', type: 'relationship', relationTo: 'products', required: true },\n { name: 'approved', type: 'checkbox', defaultValue: false },\n { name: 'verified', type: 'checkbox', label: 'Verified Purchase' },\n { name: 'helpful', type: 'number', label: 'Helpful Count', defaultValue: 0 },\n ],\n });\n\n this.adminComponents['ReviewModeration'] = {};\n }\n}\n\n// Wishlist Plugin\nexport class WishlistPlugin extends KyroPlugin {\n constructor() {\n super('wishlist');\n this.description = 'Customer wishlists';\n \n this.collections.push({\n slug: 'wishlists',\n label: 'Wishlists',\n fields: [\n { name: 'customer', type: 'relationship', relationTo: 'customers', required: true },\n { name: 'name', type: 'text', label: 'Wishlist Name', defaultValue: 'My Wishlist' },\n { name: 'items', type: 'blocks', label: 'Items', blocks: [\n {\n slug: 'wishlist-item',\n label: 'Item',\n fields: [\n { name: 'product', type: 'relationship', relationTo: 'products' },\n { name: 'quantity', type: 'number', defaultValue: 1 },\n { name: 'addedAt', type: 'date' },\n { name: 'priority', type: 'select', options: [\n { label: 'Low', value: 'low' },\n { label: 'Medium', value: 'medium' },\n { label: 'High', value: 'high' },\n ]},\n ],\n },\n ]},\n ],\n });\n }\n}\n\n// Export preset plugins\nexport const presetPlugins = {\n SEO: SEOPLugin,\n Analytics: AnalyticsPlugin,\n Comments: CommentsPlugin,\n Reviews: ReviewsPlugin,\n Wishlist: WishlistPlugin,\n};\n","// ============================================================================\n// Styling System Abstraction\n// ============================================================================\n\nexport type StylingMode = 'css' | 'tailwind' | 'css-in-js' | 'styled-components' | 'vanilla-extract';\n\nexport interface StylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customProperties?: Record<string, string>;\n}\n\nexport interface ThemeConfig {\n colors?: ThemeColors;\n fonts?: ThemeFonts;\n spacing?: ThemeSpacing;\n borderRadius?: ThemeBorderRadius;\n shadows?: ThemeShadows;\n breakpoints?: Record<string, string>;\n}\n\nexport interface ThemeColors {\n primary?: string;\n secondary?: string;\n accent?: string;\n background?: string;\n surface?: string;\n text?: string;\n textMuted?: string;\n border?: string;\n error?: string;\n warning?: string;\n success?: string;\n info?: string;\n}\n\nexport interface ThemeFonts {\n sans?: string;\n serif?: string;\n mono?: string;\n}\n\nexport interface ThemeSpacing {\n xs?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n '2xl'?: string;\n '3xl'?: string;\n '4xl'?: string;\n}\n\nexport interface ThemeBorderRadius {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n full?: string;\n}\n\nexport interface ThemeShadows {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n}\n\n// ============================================================================\n// CSS Generator\n// ============================================================================\n\nexport class CSSGenerator {\n private css: string[] = [];\n\n constructor(private config: StylingConfig) {}\n\n addRule(selector: string, properties: Record<string, string>): this {\n const props = Object.entries(properties)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n this.css.push(`${selector} {\\n${props}\\n}`);\n return this;\n }\n\n addMediaQuery(breakpoint: string, rules: string[]): this {\n this.css.push(`@media (min-width: ${breakpoint}) {\\n ${rules.join('\\n ')}\\n}`);\n return this;\n }\n\n generate(): string {\n return this.css.join('\\n\\n');\n }\n}\n\n// ============================================================================\n// Tailwind Config Generator\n// ============================================================================\n\nexport function generateTailwindConfig(theme: ThemeConfig): Record<string, any> {\n return {\n theme: {\n extend: {\n colors: theme.colors || {},\n fontFamily: theme.fonts || {},\n spacing: theme.spacing || {},\n borderRadius: theme.borderRadius || {},\n boxShadow: theme.shadows || {},\n screens: theme.breakpoints || {},\n },\n },\n };\n}\n\n// ============================================================================\n// Default Themes\n// ============================================================================\n\nexport const defaultLightTheme: ThemeConfig = {\n colors: {\n primary: '#3b82f6',\n secondary: '#6366f1',\n accent: '#ec4899',\n background: '#ffffff',\n surface: '#f9fafb',\n text: '#111827',\n textMuted: '#6b7280',\n border: '#e5e7eb',\n error: '#ef4444',\n warning: '#f59e0b',\n success: '#10b981',\n info: '#3b82f6',\n },\n fonts: {\n sans: 'system-ui, -apple-system, sans-serif',\n serif: 'Georgia, serif',\n mono: 'Menlo, monospace',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n '2xl': '3rem',\n '3xl': '4rem',\n },\n borderRadius: {\n sm: '0.125rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1)',\n },\n};\n\nexport const defaultDarkTheme: ThemeConfig = {\n colors: {\n primary: '#60a5fa',\n secondary: '#818cf8',\n accent: '#f472b6',\n background: '#111827',\n surface: '#1f2937',\n text: '#f9fafb',\n textMuted: '#9ca3af',\n border: '#374151',\n error: '#f87171',\n warning: '#fbbf24',\n success: '#34d399',\n info: '#60a5fa',\n },\n fonts: defaultLightTheme.fonts,\n spacing: defaultLightTheme.spacing,\n borderRadius: defaultLightTheme.borderRadius,\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.3)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.4)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.5)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.6)',\n },\n};\n\n// ============================================================================\n// E-Commerce Theme (2026 Design Engine)\n// ============================================================================\n\nexport const ecommerce2026Theme: ThemeConfig = {\n colors: {\n primary: '#FF6B35',\n secondary: '#1A1A2E',\n accent: '#16C79A',\n background: '#FFFFFF',\n surface: '#F8F9FA',\n text: '#1A1A2E',\n textMuted: '#6B7280',\n border: '#E5E7EB',\n error: '#EF4444',\n warning: '#F59E0B',\n success: '#16C79A',\n info: '#3B82F6',\n },\n fonts: {\n sans: '\"Inter\", \"Satoshi\", system-ui, sans-serif',\n serif: '\"Playfair Display\", Georgia, serif',\n mono: '\"JetBrains Mono\", monospace',\n },\n spacing: {\n xs: '0.125rem',\n sm: '0.25rem',\n md: '0.5rem',\n lg: '1rem',\n xl: '1.5rem',\n '2xl': '2rem',\n '3xl': '3rem',\n '4xl': '4rem',\n },\n borderRadius: {\n sm: '0',\n md: '0',\n lg: '0',\n xl: '0',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px rgba(0,0,0,0.05)',\n md: '0 4px 6px rgba(0,0,0,0.07)',\n lg: '0 10px 15px rgba(0,0,0,0.1)',\n xl: '0 20px 25px rgba(0,0,0,0.15)',\n },\n};\n\n// ============================================================================\n// CSS Variables Generator\n// ============================================================================\n\nexport function generateCSSVariables(theme: ThemeConfig): string {\n const variables: string[] = [];\n\n // Colors\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n variables.push(` --color-${key}: ${value};`);\n }\n }\n\n // Fonts\n if (theme.fonts) {\n for (const [key, value] of Object.entries(theme.fonts)) {\n variables.push(` --font-${key}: ${value};`);\n }\n }\n\n // Spacing\n if (theme.spacing) {\n for (const [key, value] of Object.entries(theme.spacing)) {\n variables.push(` --spacing-${key}: ${value};`);\n }\n }\n\n // Border Radius\n if (theme.borderRadius) {\n for (const [key, value] of Object.entries(theme.borderRadius)) {\n variables.push(` --radius-${key}: ${value};`);\n }\n }\n\n // Shadows\n if (theme.shadows) {\n for (const [key, value] of Object.entries(theme.shadows)) {\n variables.push(` --shadow-${key}: ${value};`);\n }\n }\n\n return `:root {\\n${variables.join('\\n')}\\n}`;\n}\n\n// ============================================================================\n// Admin Styling Config\n// ============================================================================\n\nexport interface AdminStylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customStyles?: string;\n componentOverrides?: Record<string, Record<string, string>>;\n}\n\nexport function createAdminStyling(config: AdminStylingConfig): string {\n const cssVars = generateCSSVariables(config.theme || defaultLightTheme);\n const componentStyles: string[] = [];\n\n // Generate component overrides\n if (config.componentOverrides) {\n for (const [selector, styles] of Object.entries(config.componentOverrides)) {\n const props = Object.entries(styles)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n componentStyles.push(`${selector} {\\n${props}\\n}`);\n }\n }\n\n return `\n ${cssVars}\n ${config.customStyles || ''}\n ${componentStyles.join('\\n')}\n `;\n}\n\n// ============================================================================\n// Field Styling\n// ============================================================================\n\nexport interface FieldStyling {\n wrapper?: Record<string, string>;\n label?: Record<string, string>;\n input?: Record<string, string>;\n error?: Record<string, string>;\n description?: Record<string, string>;\n}\n\nexport const defaultFieldStyling: Record<string, FieldStyling> = {\n text: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { \n display: 'block', \n marginBottom: 'var(--spacing-xs)',\n fontWeight: '500',\n color: 'var(--color-text)',\n },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n fontSize: '0.875rem',\n },\n error: {\n color: 'var(--color-error)',\n fontSize: '0.75rem',\n marginTop: 'var(--spacing-xs)',\n },\n },\n number: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { display: 'block', marginBottom: 'var(--spacing-xs)', fontWeight: '500' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n },\n },\n checkbox: {\n wrapper: { display: 'flex', alignItems: 'center', gap: 'var(--spacing-sm)' },\n input: { width: '1rem', height: '1rem' },\n label: { cursor: 'pointer' },\n },\n select: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n backgroundColor: 'white',\n },\n },\n};\n","import type Database from \"better-sqlite3\";\nimport bcrypt from \"bcryptjs\";\nimport { randomBytes } from \"crypto\";\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\n\nexport interface SQLiteAuthAdapterOptions {\n path?: string;\n db?: Database.Database;\n saltRounds?: number;\n}\n\nexport class SQLiteAuthAdapter implements AuthAdapter {\n private db: Database.Database | null = null;\n private path: string;\n private saltRounds: number;\n private externalDb: boolean;\n\n constructor(options: SQLiteAuthAdapterOptions = {}) {\n this.path = options.path || \"./data.db\";\n this.saltRounds = options.saltRounds || 12;\n this.externalDb = !!options.db;\n\n if (options.db) {\n this.db = options.db;\n }\n }\n\n async connect(): Promise<void> {\n if (this.db) return;\n\n const Database = (await import(\"better-sqlite3\")).default;\n this.db = new Database(this.path);\n this.db.pragma(\"journal_mode = WAL\");\n this.db.pragma(\"foreign_keys = ON\");\n\n this.ensureTables();\n }\n\n async disconnect(): Promise<void> {\n if (this.db && !this.externalDb) {\n this.db.close();\n this.db = null;\n }\n }\n\n private ensureTables(): void {\n if (!this.db) return;\n\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS kyro_users (\n id TEXT PRIMARY KEY,\n email TEXT UNIQUE NOT NULL,\n password_hash TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'customer',\n tenant_id TEXT,\n email_verified INTEGER DEFAULT 0,\n locked INTEGER DEFAULT 0,\n last_login TEXT,\n failed_login_attempts INTEGER DEFAULT 0,\n locked_until TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS kyro_sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL,\n token TEXT NOT NULL,\n refresh_token TEXT,\n expires_at TEXT NOT NULL,\n created_at TEXT NOT NULL,\n ip_address TEXT,\n user_agent TEXT,\n FOREIGN KEY (user_id) REFERENCES kyro_users(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS kyro_password_history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id TEXT NOT NULL,\n password_hash TEXT NOT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (user_id) REFERENCES kyro_users(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_kyro_users_email ON kyro_users(email);\n CREATE INDEX IF NOT EXISTS idx_kyro_sessions_user_id ON kyro_sessions(user_id);\n CREATE INDEX IF NOT EXISTS idx_kyro_sessions_token ON kyro_sessions(token);\n CREATE INDEX IF NOT EXISTS idx_kyro_sessions_refresh_token ON kyro_sessions(refresh_token);\n CREATE INDEX IF NOT EXISTS idx_kyro_password_history_user_id ON kyro_password_history(user_id);\n `);\n }\n\n async createUser(data: {\n email: string;\n passwordHash: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const id = randomBytes(16).toString(\"hex\");\n const now = new Date().toISOString();\n\n const user: AuthUser = {\n id,\n email: data.email.toLowerCase(),\n passwordHash: data.passwordHash,\n role: (data.role || \"customer\") as UserRole,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n this.db\n .prepare(\n `INSERT INTO kyro_users (id, email, password_hash, role, tenant_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n id,\n user.email,\n user.passwordHash,\n user.role,\n user.tenantId,\n now,\n now,\n );\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const row = this.db\n .prepare(\"SELECT * FROM kyro_users WHERE email = ?\")\n .get(email.toLowerCase()) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return this.rowToUser(row);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const row = this.db\n .prepare(\"SELECT * FROM kyro_users WHERE id = ?\")\n .get(userId) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return this.rowToUser(row);\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updates: string[] = [];\n const values: unknown[] = [];\n\n if (data.email !== undefined) {\n updates.push(\"email = ?\");\n values.push(data.email.toLowerCase());\n }\n if (data.passwordHash !== undefined) {\n updates.push(\"password_hash = ?\");\n values.push(data.passwordHash);\n }\n if (data.role !== undefined) {\n updates.push(\"role = ?\");\n values.push(data.role);\n }\n if (data.tenantId !== undefined) {\n updates.push(\"tenant_id = ?\");\n values.push(data.tenantId);\n }\n if (data.emailVerified !== undefined) {\n updates.push(\"email_verified = ?\");\n values.push(data.emailVerified ? 1 : 0);\n }\n if (data.locked !== undefined) {\n updates.push(\"locked = ?\");\n values.push(data.locked ? 1 : 0);\n }\n if (data.lastLogin !== undefined) {\n updates.push(\"last_login = ?\");\n values.push(data.lastLogin);\n }\n if (data.failedLoginAttempts !== undefined) {\n updates.push(\"failed_login_attempts = ?\");\n values.push(data.failedLoginAttempts);\n }\n\n updates.push(\"updated_at = ?\");\n values.push(new Date().toISOString());\n\n values.push(userId);\n\n this.db\n .prepare(`UPDATE kyro_users SET ${updates.join(\", \")} WHERE id = ?`)\n .run(...values);\n\n return this.findUserById(userId);\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const result = this.db\n .prepare(\"DELETE FROM kyro_users WHERE id = ?\")\n .run(userId);\n\n return result.changes > 0;\n }\n\n async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, this.saltRounds);\n }\n\n async verifyPassword(password: string, hash: string): Promise<boolean> {\n return bcrypt.compare(password, hash);\n }\n\n async createSession(\n userId: string,\n data: {\n ipAddress?: string;\n userAgent?: string;\n } = {},\n ): Promise<Session> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const id = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n const expiresAt = new Date(now.getTime() + 86400000).toISOString();\n\n const session: Session = {\n id,\n userId,\n token,\n refreshToken,\n expiresAt,\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n this.db\n .prepare(\n `INSERT INTO kyro_sessions (id, user_id, token, refresh_token, expires_at, created_at, ip_address, user_agent)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n session.id,\n session.userId,\n session.token,\n session.refreshToken,\n session.expiresAt,\n session.createdAt,\n session.ipAddress,\n session.userAgent,\n );\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const row = this.db\n .prepare(\"SELECT * FROM kyro_sessions WHERE token = ?\")\n .get(token) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return this.rowToSession(row);\n }\n\n async findSessionByRefreshToken(\n refreshToken: string,\n ): Promise<Session | null> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const row = this.db\n .prepare(\"SELECT * FROM kyro_sessions WHERE refresh_token = ?\")\n .get(refreshToken) as Record<string, unknown> | undefined;\n\n if (!row) return null;\n return this.rowToSession(row);\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const result = this.db\n .prepare(\"DELETE FROM kyro_sessions WHERE id = ? OR token = ?\")\n .run(sessionId, sessionId);\n\n return result.changes > 0;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const result = this.db\n .prepare(\"DELETE FROM kyro_sessions WHERE user_id = ?\")\n .run(userId);\n\n return result.changes;\n }\n\n async hasAnyUsers(): Promise<boolean> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const row = this.db\n .prepare(\"SELECT COUNT(*) as count FROM kyro_users\")\n .get() as { count: number };\n\n return row.count > 0;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n if (!this.db) throw new Error(\"Not connected\");\n\n this.db\n .prepare(\n \"INSERT INTO kyro_password_history (user_id, password_hash, created_at) VALUES (?, ?, ?)\",\n )\n .run(userId, passwordHash, new Date().toISOString());\n\n this.db\n .prepare(\n `DELETE FROM kyro_password_history WHERE id IN (\n SELECT id FROM kyro_password_history WHERE user_id = ? ORDER BY created_at DESC LIMIT -1 OFFSET 5\n )`,\n )\n .run(userId);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n if (!this.db) throw new Error(\"Not connected\");\n\n const rows = this.db\n .prepare(\n \"SELECT password_hash FROM kyro_password_history WHERE user_id = ? ORDER BY created_at DESC LIMIT ?\",\n )\n .all(userId, count) as Array<{ password_hash: string }>;\n\n return rows.map((r) => r.password_hash);\n }\n\n private rowToUser(row: Record<string, unknown>): AuthUser {\n return {\n id: row.id as string,\n email: row.email as string,\n passwordHash: row.password_hash as string,\n role: row.role as UserRole,\n tenantId: row.tenant_id as string | undefined,\n emailVerified: (row.email_verified as number) === 1,\n locked: (row.locked as number) === 1,\n lastLogin: row.last_login as string | undefined,\n failedLoginAttempts: (row.failed_login_attempts as number) || 0,\n createdAt: row.created_at as string,\n updatedAt: row.updated_at as string,\n };\n }\n\n private rowToSession(row: Record<string, unknown>): Session {\n return {\n id: row.id as string,\n userId: row.user_id as string,\n token: row.token as string,\n refreshToken: row.refresh_token as string | undefined,\n expiresAt: row.expires_at as string,\n createdAt: row.created_at as string,\n ipAddress: row.ip_address as string | undefined,\n userAgent: row.user_agent as string | undefined,\n };\n }\n}\n","import Redis from \"ioredis\";\n\nexport interface LockoutConfig {\n maxAttempts: number;\n lockDuration: number;\n notifyUser: boolean;\n notifyAdmin: boolean;\n adminNotifyAfter: number;\n}\n\nexport interface LockoutStatus {\n locked: boolean;\n attemptsRemaining: number;\n lockedUntil?: Date;\n totalAttempts: number;\n}\n\nexport interface LockoutRecord {\n userId: string;\n attempts: number;\n lockedAt?: Date;\n lockedUntil?: Date;\n history: number[];\n}\n\nexport const DEFAULT_LOCKOUT_CONFIG: LockoutConfig = {\n maxAttempts: 5,\n lockDuration: 900000,\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n};\n\nexport class AccountLockout {\n private redis: Redis;\n private prefix: string;\n private config: LockoutConfig;\n\n constructor(\n redis: Redis,\n config: Partial<LockoutConfig> = {},\n prefix: string = \"kyro:lockout:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.config = { ...DEFAULT_LOCKOUT_CONFIG, ...config };\n }\n\n private lockKey(userId: string): string {\n return `${this.prefix}${userId}`;\n }\n\n private historyKey(userId: string): string {\n return `${this.prefix}${userId}:history`;\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (!data || Object.keys(data).length === 0) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const attempts = parseInt(data.attempts, 10);\n const lockedUntil = data.lockedUntil\n ? new Date(parseInt(data.lockedUntil, 10))\n : undefined;\n\n if (lockedUntil && lockedUntil > new Date()) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: attempts,\n };\n }\n\n if (lockedUntil && lockedUntil <= new Date()) {\n await this.unlockAccount(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const historyKey = this.historyKey(userId);\n const now = Date.now();\n\n const current = await this.redis.hincrby(key, \"attempts\", 1);\n await this.redis.hset(key, \"lastAttempt\", now.toString());\n\n await this.redis.lpush(historyKey, now.toString());\n await this.redis.ltrim(historyKey, 0, 99);\n\n if (current >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n await this.redis.hset(key, {\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n await this.redis.expire(\n key,\n Math.ceil(this.config.lockDuration / 1000) + 3600,\n );\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: current,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - current),\n totalAttempts: current,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const key = this.lockKey(userId);\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const pipeline = this.redis.pipeline();\n pipeline.hset(key, {\n attempts: this.config.maxAttempts.toString(),\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n pipeline.expire(key, Math.ceil(lockDuration / 1000) + 3600);\n await pipeline.exec();\n }\n\n async unlockAccount(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n await this.redis.del(key);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (data.lockedAt) {\n await this.redis.hset(key, {\n attempts: \"0\",\n lockedAt: \"\",\n lockedUntil: \"\",\n });\n } else {\n await this.redis.del(key);\n }\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, limit - 1);\n return timestamps.map((ts) => new Date(parseInt(ts, 10)));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, -1);\n\n const lockouts = timestamps.filter((_, i) => {\n const attemptNum = i + 1;\n return attemptNum % this.config.maxAttempts === 0;\n }).length;\n\n const lastLockoutData = await this.redis.hget(\n this.lockKey(userId),\n \"lockedAt\",\n );\n\n return {\n totalFailedAttempts: timestamps.length,\n lockoutCount: lockouts,\n lastLockout: lastLockoutData\n ? new Date(parseInt(lastLockoutData, 10))\n : null,\n averageAttemptsBeforeLockout: lockouts > 0 ? this.config.maxAttempts : 0,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n","import Redis from \"ioredis\";\n\nexport interface RateLimitConfig {\n window: number;\n max: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n remaining: number;\n resetAt: number;\n retryAfter?: number;\n}\n\nexport const DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n\nexport class RateLimiter {\n private redis: Redis;\n private prefix: string;\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n redis: Redis,\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n prefix: string = \"kyro:ratelimit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${this.prefix}${type}:${identifier}`;\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n await this.redis.del(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n await this.redis.del(key);\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n await this.redis.zremrangebyscore(key, 0, windowStart);\n const count = await this.redis.zcard(key);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createRateLimitMiddleware(rateLimiter: RateLimiter) {\n return async function rateLimit(\n type: string,\n getIdentifier: (req: Request) => string,\n checkUser: boolean = false,\n getUserId?: (req: Request) => string,\n ) {\n return async (req: Request): Promise<RateLimitResult> => {\n const identifier = getIdentifier(req);\n\n if (checkUser && getUserId) {\n const userId = getUserId(req);\n if (userId) {\n return rateLimiter.checkUser(type, userId, identifier);\n }\n }\n\n return rateLimiter.check(type, identifier);\n };\n };\n}\n","import Redis from \"ioredis\";\nimport { randomBytes } from \"crypto\";\n\nexport type AuditAction =\n | \"login\"\n | \"logout\"\n | \"login_failed\"\n | \"register\"\n | \"verify_email\"\n | \"password_change\"\n | \"password_reset\"\n | \"password_reset_request\"\n | \"role_change\"\n | \"permission_change\"\n | \"document_create\"\n | \"document_update\"\n | \"document_delete\"\n | \"settings_change\"\n | \"user_lockout\"\n | \"user_unlock\"\n | \"user_create\"\n | \"user_update\"\n | \"user_delete\"\n | \"api_request\"\n | \"api_key_create\"\n | \"api_key_delete\"\n | \"tenant_create\"\n | \"tenant_delete\";\n\nexport interface AuditLog {\n id: string;\n timestamp: Date;\n action: AuditAction;\n userId?: string;\n userEmail?: string;\n role?: string;\n resource: string;\n resourceId?: string;\n changes?: { field: string; old: any; new: any }[];\n ipAddress?: string;\n userAgent?: string;\n success: boolean;\n error?: string;\n metadata?: Record<string, any>;\n}\n\nexport interface AuditLogFilter {\n userId?: string;\n action?: AuditAction | AuditAction[];\n resource?: string;\n resourceId?: string;\n success?: boolean;\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n}\n\nexport interface AuditRetentionConfig {\n retentionDays: number;\n cleanupIntervalHours: number;\n}\n\nexport const DEFAULT_RETENTION_CONFIG: AuditRetentionConfig = {\n retentionDays: 30,\n cleanupIntervalHours: 24,\n};\n\nexport class AuditLogger {\n private redis: Redis;\n private prefix: string;\n private retentionDays: number;\n\n constructor(\n redis: Redis,\n retentionDays: number = 30,\n prefix: string = \"kyro:audit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.retentionDays = retentionDays;\n }\n\n async log(data: Omit<AuditLog, \"id\" | \"timestamp\">): Promise<string> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n\n const log: AuditLog = {\n ...data,\n id,\n timestamp,\n };\n\n const key = this.getKeyForDate(timestamp);\n const hashKey = `${this.prefix}log:${id}`;\n\n await this.redis.hset(hashKey, this.serializeLog(log));\n await this.redis.expire(hashKey, this.retentionDays * 24 * 60 * 60 + 3600);\n\n await this.redis.zadd(key, timestamp.getTime(), id);\n await this.redis.expire(key, this.retentionDays * 24 * 60 * 60 + 3600);\n\n const userIndex = data.userId ? `${this.prefix}user:${data.userId}` : null;\n if (userIndex) {\n await this.redis.zadd(userIndex, timestamp.getTime(), id);\n await this.redis.expire(\n userIndex,\n this.retentionDays * 24 * 60 * 60 + 3600,\n );\n }\n\n return id;\n }\n\n async get(id: string): Promise<AuditLog | null> {\n const hashKey = `${this.prefix}log:${id}`;\n const data = await this.redis.hgetall(hashKey);\n\n if (!data || Object.keys(data).length === 0) {\n return null;\n }\n\n return this.deserializeLog(data);\n }\n\n async query(filter: AuditLogFilter = {}): Promise<{\n logs: AuditLog[];\n total: number;\n }> {\n const { limit = 50, offset = 0 } = filter;\n\n let keys: string[] = [];\n\n if (filter.userId) {\n keys.push(`${this.prefix}user:${filter.userId}`);\n } else if (filter.startDate || filter.endDate) {\n keys = this.getKeysForDateRange(filter.startDate, filter.endDate);\n } else {\n const now = new Date();\n keys = this.getKeysForDateRange(\n new Date(now.getTime() - this.retentionDays * 24 * 60 * 60 * 1000),\n now,\n );\n }\n\n let idScores: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n idScores.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n idScores.sort((a, b) => b[1] - a[1]);\n\n const total = idScores.length;\n idScores = idScores.slice(offset, offset + limit);\n\n const logs: AuditLog[] = [];\n for (const [id] of idScores) {\n const log = await this.get(id);\n if (log) {\n if (this.matchesFilter(log, filter)) {\n logs.push(log);\n }\n }\n }\n\n return { logs, total };\n }\n\n async getRecent(limit: number = 50): Promise<AuditLog[]> {\n const logs: AuditLog[] = [];\n const now = new Date();\n const keys = this.getKeysForDateRange(\n new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000),\n now,\n );\n\n let allIds: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n allIds.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n allIds.sort((a, b) => b[1] - a[1]);\n\n for (const [id] of allIds.slice(0, limit)) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getUserActivity(\n userId: string,\n limit: number = 50,\n ): Promise<AuditLog[]> {\n const key = `${this.prefix}user:${userId}`;\n const ids = await this.redis.zrange(key, 0, limit - 1);\n\n const logs: AuditLog[] = [];\n for (const id of ids) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getStats(\n startDate?: Date,\n endDate?: Date,\n ): Promise<{\n totalEvents: number;\n byAction: Record<string, number>;\n successRate: number;\n failedLogins: number;\n uniqueUsers: Set<string>;\n }> {\n const keys = this.getKeysForDateRange(\n startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n endDate || new Date(),\n );\n\n const byAction: Record<string, number> = {};\n let totalEvents = 0;\n let failedLogins = 0;\n let successCount = 0;\n const uniqueUsers = new Set<string>();\n\n for (const key of keys) {\n const ids = await this.redis.zrange(key, 0, -1);\n\n for (const id of ids) {\n const log = await this.get(id);\n if (log) {\n totalEvents++;\n\n byAction[log.action] = (byAction[log.action] || 0) + 1;\n\n if (log.success) {\n successCount++;\n }\n\n if (log.action === \"login_failed\") {\n failedLogins++;\n }\n\n if (log.userId) {\n uniqueUsers.add(log.userId);\n }\n }\n }\n }\n\n return {\n totalEvents,\n byAction,\n successRate: totalEvents > 0 ? successCount / totalEvents : 1,\n failedLogins,\n uniqueUsers,\n };\n }\n\n async cleanup(): Promise<number> {\n const cutoff = Date.now() - this.retentionDays * 24 * 60 * 60 * 1000;\n\n const keys = await this.redis.keys(`${this.prefix}date:*`);\n let deleted = 0;\n\n for (const key of keys) {\n const timestamp = await this.redis.zrangebyscore(key, 0, cutoff);\n\n for (const id of timestamp) {\n await this.redis.del(`${this.prefix}log:${id}`);\n deleted++;\n }\n\n await this.redis.zremrangebyscore(key, 0, cutoff);\n }\n\n return deleted;\n }\n\n private getKeyForDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${this.prefix}date:${year}-${month}-${day}`;\n }\n\n private getKeysForDateRange(start?: Date, end?: Date): string[] {\n const keys: string[] = [];\n const startDate =\n start || new Date(Date.now() - this.retentionDays * 24 * 60 * 60 * 1000);\n const endDate = end || new Date();\n\n const current = new Date(startDate);\n while (current <= endDate) {\n keys.push(this.getKeyForDate(current));\n current.setDate(current.getDate() + 1);\n }\n\n return keys;\n }\n\n private matchesFilter(log: AuditLog, filter: AuditLogFilter): boolean {\n if (filter.action) {\n const actions = Array.isArray(filter.action)\n ? filter.action\n : [filter.action];\n if (!actions.includes(log.action)) return false;\n }\n\n if (filter.resource && log.resource !== filter.resource) return false;\n\n if (filter.resourceId && log.resourceId !== filter.resourceId) return false;\n\n if (filter.success !== undefined && log.success !== filter.success)\n return false;\n\n return true;\n }\n\n private serializeLog(log: AuditLog): Record<string, string> {\n const result: Record<string, string> = {\n id: log.id,\n timestamp: log.timestamp.toISOString(),\n action: log.action,\n resource: log.resource,\n success: log.success ? \"1\" : \"0\",\n };\n\n if (log.userId) result.userId = log.userId;\n if (log.userEmail) result.userEmail = log.userEmail;\n if (log.role) result.role = log.role;\n if (log.resourceId) result.resourceId = log.resourceId;\n if (log.ipAddress) result.ipAddress = log.ipAddress;\n if (log.userAgent) result.userAgent = log.userAgent;\n if (log.error) result.error = log.error;\n if (log.changes) result.changes = JSON.stringify(log.changes);\n if (log.metadata) result.metadata = JSON.stringify(log.metadata);\n\n return result;\n }\n\n private deserializeLog(data: Record<string, string>): AuditLog {\n return {\n id: data.id,\n timestamp: new Date(data.timestamp),\n action: data.action as AuditAction,\n userId: data.userId,\n userEmail: data.userEmail,\n role: data.role,\n resource: data.resource,\n resourceId: data.resourceId,\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n success: data.success === \"1\",\n error: data.error,\n changes: data.changes ? JSON.parse(data.changes) : undefined,\n metadata: data.metadata ? JSON.parse(data.metadata) : undefined,\n };\n }\n}\n\nexport function createAuditContext(req: Request): {\n ipAddress: string;\n userAgent: string;\n} {\n return {\n ipAddress:\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ||\n req.headers.get(\"x-real-ip\") ||\n \"unknown\",\n userAgent: req.headers.get(\"user-agent\") || \"unknown\",\n };\n}\n","import jwt from \"jsonwebtoken\";\nimport type { AuthUser, JWTPayload } from \"../../auth/types.js\";\nimport type { TenantContext } from \"../../auth/rls/tenant.js\";\n\nexport interface AuthMiddlewareConfig {\n secret: string;\n issuer?: string;\n audience?: string;\n extractToken?: (req: Request) => string | null;\n}\n\nexport interface AuthenticatedContext {\n user?: AuthUser;\n token?: string;\n tenantContext?: TenantContext;\n}\n\nexport interface AuthMiddlewareResult {\n user?: Partial<AuthUser>;\n token?: string;\n tenantContext?: TenantContext;\n error?: string;\n status: number;\n}\n\nexport function createAuthMiddleware(config: AuthMiddlewareConfig) {\n const {\n secret,\n issuer,\n audience,\n extractToken = defaultExtractToken,\n } = config;\n\n return async function authMiddleware(\n req: Request,\n ): Promise<AuthMiddlewareResult> {\n const token = extractToken(req);\n\n if (!token) {\n return {\n status: 401,\n error: \"No authentication token provided\",\n };\n }\n\n try {\n const payload = jwt.verify(token, secret, {\n issuer,\n audience,\n }) as JWTPayload;\n\n const user: Partial<AuthUser> = {\n id: payload.sub,\n email: payload.email,\n role: payload.role,\n tenantId: payload.tenantId,\n };\n\n return {\n user,\n token,\n tenantContext: createTenantContextFromUser(user),\n status: 200,\n };\n } catch (error) {\n if (error instanceof jwt.TokenExpiredError) {\n return {\n status: 401,\n error: \"Token has expired\",\n };\n }\n\n if (error instanceof jwt.JsonWebTokenError) {\n return {\n status: 401,\n error: \"Invalid token\",\n };\n }\n\n return {\n status: 401,\n error: \"Authentication failed\",\n };\n }\n };\n}\n\nexport function defaultExtractToken(req: Request): string | null {\n const authHeader = req.headers.get(\"Authorization\");\n if (authHeader?.startsWith(\"Bearer \")) {\n return authHeader.slice(7);\n }\n\n const cookieHeader = req.headers.get(\"Cookie\");\n if (cookieHeader) {\n const cookies = Object.fromEntries(\n cookieHeader.split(\"; \").map((c) => {\n const [key, ...val] = c.split(\"=\");\n return [key.trim(), val.join(\"=\")];\n }),\n );\n return cookies[\"auth_token\"] || null;\n }\n\n return null;\n}\n\nexport function createTenantContextFromUser(\n user: Partial<AuthUser>,\n): TenantContext {\n return {\n tenantId: user.tenantId || \"default\",\n userId: user.id || \"anonymous\",\n role: user.role || \"guest\",\n roles: [user.role || \"guest\"],\n permissions: [],\n isSuperAdmin: user.role === \"super_admin\",\n };\n}\n\nexport function generateToken(\n payload: JWTPayload,\n secret: string,\n options: {\n expiresIn?: string | number;\n issuer?: string;\n audience?: string;\n } = {},\n): string {\n return jwt.sign(payload, secret, {\n expiresIn: (options.expiresIn || \"24h\") as jwt.SignOptions[\"expiresIn\"],\n issuer: options.issuer,\n audience: options.audience,\n });\n}\n\nexport function verifyToken(\n token: string,\n secret: string,\n options: {\n issuer?: string;\n audience?: string;\n } = {},\n): JWTPayload | null {\n try {\n return jwt.verify(token, secret, options) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function decodeToken(token: string): JWTPayload | null {\n try {\n return jwt.decode(token) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function isTokenExpiringSoon(\n token: string,\n secret: string,\n thresholdMinutes: number = 30,\n): boolean {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return true;\n }\n\n const expirationTime = payload.exp * 1000;\n const thresholdTime = Date.now() + thresholdMinutes * 60 * 1000;\n\n return expirationTime < thresholdTime;\n}\n\nexport function getTokenExpiration(token: string, secret: string): Date | null {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return null;\n }\n\n return new Date(payload.exp * 1000);\n}\n\nexport function extractUserFromRequest(\n req: Request,\n config: AuthMiddlewareConfig,\n): Promise<AuthMiddlewareResult> {\n const middleware = createAuthMiddleware(config);\n return middleware(req);\n}\n","import jwt from \"jsonwebtoken\";\nimport { randomBytes } from \"crypto\";\nimport { RedisAuthAdapter } from \"../../auth/redis-adapter.js\";\nimport { EmailTransport } from \"../../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../../auth/security/password-policy.js\";\nimport { AccountLockout } from \"../../auth/security/lockout.js\";\nimport { RateLimiter } from \"../../auth/security/rate-limit.js\";\nimport {\n AuditLogger,\n createAuditContext,\n type AuditAction,\n} from \"../../auth/security/audit-log.js\";\nimport { generateToken, defaultExtractToken } from \"./auth-middleware.js\";\nimport type {\n AuthUser,\n JWTPayload,\n LoginCredentials,\n RegisterData,\n AuthResult,\n Session,\n} from \"../../auth/types.js\";\n\nexport interface AuthRoutesConfig {\n redis: RedisAuthAdapter;\n email?: EmailTransport;\n jwtSecret: string;\n jwtExpiresIn?: string;\n jwtIssuer?: string;\n jwtAudience?: string;\n passwordPolicy?: PasswordPolicy;\n lockout?: AccountLockout;\n rateLimiter?: RateLimiter;\n auditLogger?: AuditLogger;\n baseUrl?: string;\n emailVerificationRequired?: boolean;\n}\n\nexport class AuthRoutes {\n private redis: RedisAuthAdapter;\n private email?: EmailTransport;\n private jwtSecret: string;\n private jwtExpiresIn: string;\n private jwtIssuer?: string;\n private jwtAudience?: string;\n private passwordPolicy: PasswordPolicy;\n private lockout?: AccountLockout;\n private rateLimiter?: RateLimiter;\n private auditLogger?: AuditLogger;\n private baseUrl: string;\n private emailVerificationRequired: boolean;\n\n constructor(config: AuthRoutesConfig) {\n this.redis = config.redis;\n this.email = config.email;\n this.jwtSecret = config.jwtSecret;\n this.jwtExpiresIn = config.jwtExpiresIn || \"24h\";\n this.jwtIssuer = config.jwtIssuer;\n this.jwtAudience = config.jwtAudience;\n this.passwordPolicy = config.passwordPolicy || new PasswordPolicy();\n this.lockout = config.lockout;\n this.rateLimiter = config.rateLimiter;\n this.auditLogger = config.auditLogger;\n this.baseUrl = config.baseUrl || \"http://localhost:3000\";\n this.emailVerificationRequired = config.emailVerificationRequired ?? true;\n }\n\n async register(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:register\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as RegisterData & {\n confirmPassword?: string;\n };\n\n if (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n if (body.password !== body.confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(body.password);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const existingUser = await this.redis.findUserByEmail(body.email);\n if (existingUser) {\n return this.errorResponse(\"Email already registered\", 400);\n }\n\n const passwordHash = await this.redis.hashPassword(body.password);\n const user = await this.redis.createUser({\n email: body.email,\n passwordHash,\n role: body.role || \"customer\",\n tenantId: body.tenantId,\n });\n\n if (this.emailVerificationRequired && this.email) {\n const verificationToken = randomBytes(32).toString(\"hex\");\n const verificationUrl = `${this.baseUrl}/api/auth/verify?token=${verificationToken}`;\n\n await this.redis.createSession(user.id, { ipAddress, userAgent });\n const template = this.email\n .getTemplates()\n .verifyEmail(verificationUrl, body.email);\n await this.email.send({ to: body.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"register\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse(\n {\n success: true,\n message: \"Registration successful\",\n user: this.sanitizeUser(user),\n requiresVerification: this.emailVerificationRequired && !!this.email,\n },\n 201,\n );\n } catch (error) {\n return this.errorResponse(\"Registration failed\", 500);\n }\n }\n\n async login(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:login\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as LoginCredentials;\n\n if (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n const user = await this.redis.findUserByEmail(body.email);\n if (!user) {\n await this.recordFailedLogin(ipAddress, userAgent);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (this.lockout) {\n const lockoutStatus = await this.lockout.checkLockout(user.id);\n if (lockoutStatus.locked) {\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Account locked\",\n });\n }\n return this.errorResponse(\n `Account locked. Try again in ${Math.ceil((lockoutStatus.lockedUntil!.getTime() - Date.now()) / 60000)} minutes`,\n 423,\n );\n }\n }\n\n const validPassword = user.passwordHash\n ? await this.redis.verifyPassword(body.password, user.passwordHash)\n : false;\n if (!validPassword) {\n await this.recordFailedLogin(ipAddress, userAgent, user.id, user.email);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (this.lockout) {\n await this.lockout.resetAttempts(user.id);\n }\n\n const session = await this.redis.createSession(user.id, {\n ipAddress,\n userAgent,\n });\n\n const payload: JWTPayload = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 86400,\n };\n\n const accessToken = generateToken(payload, this.jwtSecret, {\n expiresIn: this.jwtExpiresIn,\n issuer: this.jwtIssuer,\n audience: this.jwtAudience,\n });\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login\",\n userId: user.id,\n userEmail: user.email,\n role: user.role,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n await this.redis.updateUser(user.id, {\n lastLogin: new Date().toISOString(),\n });\n\n return this.jsonResponse({\n success: true,\n user: this.sanitizeUser(user),\n accessToken,\n refreshToken: session.refreshToken,\n expiresIn: this.jwtExpiresIn,\n });\n } catch (error) {\n return this.errorResponse(\"Login failed\", 500);\n }\n }\n\n async logout(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"No session to logout\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const payload = jwt.decode(token) as JWTPayload;\n if (payload && payload.sub) {\n await this.redis.deleteUserSessions(payload.sub);\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"logout\",\n userId: payload.sub,\n userEmail: payload.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n }\n\n return this.jsonResponse({\n success: true,\n message: \"Logged out successfully\",\n });\n } catch (error) {\n return this.errorResponse(\"Logout failed\", 500);\n }\n }\n\n async refresh(req: Request): Promise<Response> {\n try {\n const body = (await req.json()) as { refreshToken?: string };\n const { refreshToken } = body;\n\n if (!refreshToken) {\n return this.errorResponse(\"Refresh token required\", 400);\n }\n\n return this.jsonResponse({ success: true, accessToken: \"\" });\n } catch (error) {\n return this.errorResponse(\"Token refresh failed\", 500);\n }\n }\n\n async me(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const payload = jwt.verify(token, this.jwtSecret, {\n issuer: this.jwtIssuer,\n audience: this.jwtAudience,\n }) as JWTPayload;\n\n const user = await this.redis.findUserById(payload.sub);\n if (!user) {\n return this.errorResponse(\"User not found\", 404);\n }\n\n return this.jsonResponse({\n success: true,\n user: this.sanitizeUser(user),\n });\n } catch (error) {\n return this.errorResponse(\"Authentication failed\", 401);\n }\n }\n\n async changePassword(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const payload = jwt.verify(token, this.jwtSecret) as JWTPayload;\n const body = (await req.json()) as {\n currentPassword?: string;\n newPassword?: string;\n confirmPassword?: string;\n };\n const { currentPassword, newPassword, confirmPassword } = body;\n\n if (!currentPassword || !newPassword) {\n return this.errorResponse(\"Current and new password required\", 400);\n }\n\n if (newPassword !== confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(newPassword);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const user = await this.redis.findUserById(payload.sub);\n if (!user) {\n return this.errorResponse(\"User not found\", 404);\n }\n\n const validPassword = user.passwordHash\n ? await this.redis.verifyPassword(currentPassword, user.passwordHash)\n : false;\n if (!validPassword) {\n return this.errorResponse(\"Current password is incorrect\", 401);\n }\n\n const passwordHistory = await this.redis.getPasswordHistory(user.id, 5);\n const isReused = await this.redis.isPasswordInHistory(\n newPassword,\n user.id,\n 5,\n );\n if (isReused) {\n return this.errorResponse(\n \"Password was recently used. Please choose a different password\",\n 400,\n );\n }\n\n const newPasswordHash = await this.redis.hashPassword(newPassword);\n if (user.passwordHash) {\n await this.redis.addPasswordToHistory(user.id, user.passwordHash);\n }\n await this.redis.updateUser(user.id, { passwordHash: newPasswordHash });\n\n await this.redis.deleteUserSessions(user.id);\n\n if (this.email && this.email.getTemplates) {\n const template = this.email.getTemplates().passwordChanged(user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_change\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"Password changed successfully\",\n });\n } catch (error) {\n return this.errorResponse(\"Password change failed\", 500);\n }\n }\n\n async forgotPassword(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:forgot\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as { email?: string };\n const { email } = body;\n\n if (!email) {\n return this.errorResponse(\"Email required\", 400);\n }\n\n const user = await this.redis.findUserByEmail(email);\n if (!user) {\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n }\n\n if (this.email) {\n const resetToken = randomBytes(32).toString(\"hex\");\n const resetUrl = `${this.baseUrl}/api/auth/reset-password?token=${resetToken}`;\n const template = this.email\n .getTemplates()\n .resetPassword(resetUrl, user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_reset_request\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n } catch (error) {\n return this.errorResponse(\"Password reset request failed\", 500);\n }\n }\n\n async verifyEmail(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const token = url.searchParams.get(\"token\");\n\n if (!token) {\n return this.errorResponse(\"Verification token required\", 400);\n }\n\n try {\n return this.jsonResponse({ success: true, message: \"Email verified\" });\n } catch (error) {\n return this.errorResponse(\"Email verification failed\", 500);\n }\n }\n\n private async recordFailedLogin(\n ipAddress: string,\n userAgent: string,\n userId?: string,\n userEmail?: string,\n ): Promise<void> {\n if (this.lockout) {\n await this.lockout.recordFailedAttempt(userId || ipAddress);\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId,\n userEmail,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Invalid credentials\",\n });\n }\n }\n\n private sanitizeUser(user: AuthUser): Partial<AuthUser> {\n const { passwordHash, ...sanitized } = user;\n return sanitized;\n }\n\n private jsonResponse(data: any, status: number = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n private errorResponse(message: string, status: number): Response {\n return new Response(JSON.stringify({ success: false, error: message }), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n private rateLimitResponse(limit: { retryAfter?: number }): Response {\n return new Response(\n JSON.stringify({\n success: false,\n error: \"Too many requests\",\n retryAfter: limit.retryAfter,\n }),\n {\n status: 429,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": String(limit.retryAfter || 60),\n },\n },\n );\n }\n}\n","import Redis from \"ioredis\";\nimport { RedisAuthAdapter } from \"../auth/redis-adapter.js\";\nimport { EmailTransport } from \"../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../auth/security/password-policy.js\";\nimport { AccountLockout } from \"../auth/security/lockout.js\";\nimport { RateLimiter } from \"../auth/security/rate-limit.js\";\nimport { AuditLogger } from \"../auth/security/audit-log.js\";\nimport { AuthRoutes } from \"../api/rest/auth-routes.js\";\n\nexport interface KyroAuthConfig {\n redis: RedisAuthAdapter;\n redisClient: Redis;\n email?: EmailTransport;\n passwordPolicy: PasswordPolicy;\n lockout?: AccountLockout;\n rateLimiter?: RateLimiter;\n auditLogger?: AuditLogger;\n routes: AuthRoutes;\n}\n\nfunction getEnv(key: string, fallback: string = \"\"): string {\n return process.env[key] || fallback;\n}\n\nfunction getEnvBool(key: string, fallback: boolean = false): boolean {\n const val = process.env[key];\n if (!val) return fallback;\n return val.toLowerCase() === \"true\";\n}\n\nfunction getEnvNum(key: string, fallback: number = 0): number {\n const val = process.env[key];\n if (!val) return fallback;\n return parseInt(val, 10);\n}\n\nexport async function createAuthConfig(): Promise<KyroAuthConfig> {\n const redisUrl = getEnv(\"REDIS_URL\", \"redis://localhost:6379\");\n const redisKeyPrefix = getEnv(\"REDIS_KEY_PREFIX\", \"kyro:auth:\");\n const redisSessionTTL = getEnvNum(\"REDIS_SESSION_TTL\", 86400);\n const redisRefreshTTL = getEnvNum(\"REDIS_REFRESH_TOKEN_TTL\", 604800);\n\n const redisAdapter = new RedisAuthAdapter({\n url: redisUrl,\n keyPrefix: redisKeyPrefix,\n tokenExpiration: redisSessionTTL,\n refreshTokenExpiration: redisRefreshTTL,\n tls: getEnvBool(\"REDIS_TLS\", false),\n });\n\n await redisAdapter.connect();\n\n const redisClient = (redisAdapter as any).redis as Redis;\n\n const emailConfig = getEmailConfig();\n const email = emailConfig ? new EmailTransport(emailConfig) : undefined;\n\n const passwordPolicy = new PasswordPolicy({\n minLength: getEnvNum(\"PASSWORD_MIN_LENGTH\", 12),\n requireUppercase: getEnvBool(\"PASSWORD_REQUIRE_UPPERCASE\", true),\n requireLowercase: getEnvBool(\"PASSWORD_REQUIRE_LOWERCASE\", true),\n requireNumbers: getEnvBool(\"PASSWORD_REQUIRE_NUMBERS\", true),\n requireSpecialChars: getEnvBool(\"PASSWORD_REQUIRE_SPECIAL\", true),\n preventReuse: getEnvNum(\"PASSWORD_PREVENT_REUSE\", 5),\n maxLength: getEnvNum(\"PASSWORD_MAX_LENGTH\", 128),\n });\n\n let lockout: AccountLockout | undefined;\n if (getEnvBool(\"LOCKOUT_ENABLED\", true)) {\n lockout = new AccountLockout(redisClient, {\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n }\n\n let rateLimiter: RateLimiter | undefined;\n if (getEnvBool(\"RATE_LIMIT_ENABLED\", true)) {\n rateLimiter = new RateLimiter(redisClient, {\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n }\n\n let auditLogger: AuditLogger | undefined;\n if (getEnvBool(\"AUDIT_LOG_ENABLED\", true)) {\n auditLogger = new AuditLogger(\n redisClient,\n getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30),\n );\n }\n\n const routes = new AuthRoutes({\n redis: redisAdapter,\n email,\n jwtSecret: getEnv(\"JWT_SECRET\", \"change-me\"),\n jwtExpiresIn: getEnv(\"JWT_EXPIRES_IN\", \"24h\"),\n jwtIssuer: getEnv(\"JWT_ISSUER\", \"kyro-cms\"),\n jwtAudience: getEnv(\"JWT_AUDIENCE\", \"kyro-cms-client\"),\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n baseUrl: getEnv(\"EMAIL_BASE_URL\", \"http://localhost:4321\"),\n emailVerificationRequired: getEnvBool(\"EMAIL_VERIFICATION_REQUIRED\", true),\n });\n\n return {\n redis: redisAdapter,\n redisClient,\n email,\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n routes,\n };\n}\n\nfunction getEmailConfig():\n | ConstructorParameters<typeof EmailTransport>[0]\n | undefined {\n const host = getEnv(\"SMTP_HOST\");\n if (!host) return undefined;\n\n return {\n host,\n port: getEnvNum(\"SMTP_PORT\", 587),\n secure: getEnvBool(\"SMTP_SECURE\", false),\n auth: {\n user: getEnv(\"SMTP_USER\"),\n pass: getEnv(\"SMTP_PASS\"),\n },\n from: getEnv(\"SMTP_FROM\", \"noreply@example.com\"),\n fromName: getEnv(\"SMTP_FROM_NAME\", \"Kyro CMS\"),\n };\n}\n\nexport const authConfig = createAuthConfig();\n","import bcrypt from \"bcrypt\";\nimport jwt from \"jsonwebtoken\";\nimport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nexport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nconst DEFAULT_SALT_ROUNDS = 12;\nconst DEFAULT_EXPIRES_IN = \"24h\";\nconst DEFAULT_REFRESH_EXPIRES_IN = \"7d\";\n\nexport class Auth {\n private adapter: AuthAdapter;\n private config: Required<AuthTokenConfig>;\n\n constructor(adapter: AuthAdapter, config: AuthTokenConfig) {\n this.adapter = adapter;\n this.config = {\n secret: config.secret,\n expiresIn: config.expiresIn ?? DEFAULT_EXPIRES_IN,\n refreshExpiresIn: config.refreshExpiresIn ?? DEFAULT_REFRESH_EXPIRES_IN,\n issuer: config.issuer ?? \"kyro-cms\",\n audience: config.audience ?? [],\n saltRounds: config.saltRounds ?? DEFAULT_SALT_ROUNDS,\n };\n }\n\n async register(data: RegisterData): Promise<AuthResult> {\n try {\n const existing = await this.adapter.findUserByEmail(data.email);\n if (existing) {\n return { success: false, error: \"Email already registered\" };\n }\n\n const passwordHash = await this.hashPassword(data.password);\n const user = await this.adapter.createUser({\n email: data.email,\n passwordHash,\n role: data.role ?? \"customer\",\n tenantId: data.tenantId,\n });\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async login(credentials: LoginCredentials): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserByEmail(credentials.email);\n if (!user || !user.passwordHash) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n credentials.password,\n user.passwordHash,\n );\n if (!valid) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async logout(token: string): Promise<void> {\n await this.adapter.deleteSession(token);\n }\n\n async refreshToken(refreshToken: string): Promise<AuthResult> {\n try {\n const session = await this.adapter.findSessionByToken(refreshToken);\n if (!session || new Date(session.expiresAt) < new Date()) {\n return { success: false, error: \"Invalid or expired refresh token\" };\n }\n\n const user = await this.adapter.findUserById(session.userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteSession(refreshToken);\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async verifyToken(token: string): Promise<JWTPayload | null> {\n try {\n const decoded = jwt.verify(token, this.config.secret, {\n issuer: this.config.issuer,\n audience:\n this.config.audience.length > 0 ? this.config.audience[0] : undefined,\n }) as unknown as JWTPayload;\n return decoded;\n } catch {\n return null;\n }\n }\n\n async getUserFromToken(token: string): Promise<AuthUser | null> {\n const payload = await this.verifyToken(token);\n if (!payload) return null;\n return this.adapter.findUserById(payload.sub);\n }\n\n async changePassword(\n userId: string,\n currentPassword: string,\n newPassword: string,\n ): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user || !user.passwordHash) {\n return { success: false, error: \"User not found\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n currentPassword,\n user.passwordHash,\n );\n if (!valid) {\n return { success: false, error: \"Current password is incorrect\" };\n }\n\n const newHash = await this.hashPassword(newPassword);\n await this.adapter.updateUser(userId, { passwordHash: newHash });\n await this.adapter.deleteUserSessions(userId);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async resetPassword(email: string, newPassword: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserByEmail(email);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n const passwordHash = await this.hashPassword(newPassword);\n await this.adapter.updateUser(user.id, { passwordHash });\n await this.adapter.deleteUserSessions(user.id);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async deleteAccount(userId: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteUserSessions(userId);\n await this.adapter.deleteUser(userId);\n\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n private async createSessionForUser(user: AuthUser): Promise<AuthResult> {\n const token = this.generateToken(user);\n\n const session = await this.adapter.createSession(user.id);\n\n return {\n success: true,\n user,\n session,\n token,\n };\n }\n\n private generateToken(user: AuthUser): string {\n const payload: Omit<JWTPayload, \"iat\" | \"exp\"> = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n };\n\n const signOptions: jwt.SignOptions = {\n expiresIn: this.parseExpiresIn(this.config.expiresIn) / 1000,\n issuer: this.config.issuer,\n };\n\n if (this.config.audience.length > 0) {\n signOptions.audience = this.config.audience[0];\n }\n\n return jwt.sign(payload, this.config.secret, signOptions);\n }\n\n private async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, this.config.saltRounds);\n }\n\n private parseExpiresIn(value: string | number): number {\n if (typeof value === \"number\") return value;\n const match = value.match(/^(\\d+)([smhd])$/);\n if (!match) return 86400000;\n const num = parseInt(match[1], 10);\n switch (match[2]) {\n case \"s\":\n return num * 1000;\n case \"m\":\n return num * 60000;\n case \"h\":\n return num * 3600000;\n case \"d\":\n return num * 86400000;\n default:\n return 86400000;\n }\n }\n}\n\nexport function createAuth(\n adapter: AuthAdapter,\n config: AuthTokenConfig,\n): Auth {\n return new Auth(adapter, config);\n}\n\nexport { RedisAuthAdapter } from \"./redis-adapter.js\";\nexport { SQLiteAuthAdapter } from \"./sqlite-adapter.js\";\nexport { EmailTransport } from \"./nodemailer-transport.js\";\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n} from \"./bootstrap.js\";\n\nexport {\n DEFAULT_ROLES,\n DEFAULT_PERMISSIONS,\n ROLE_PERMISSIONS,\n getRoleHierarchy,\n getRoleLevel,\n isRoleHigherOrEqual,\n canInheritRole,\n type Role,\n type Permission,\n} from \"./rbac/roles.js\";\n\nexport {\n hasPermission,\n hasRole,\n hasAnyRole,\n hasAllRoles,\n getUserPermissions,\n PermissionChecker,\n type PermissionContext,\n} from \"./rbac/checker.js\";\n\nexport {\n RLSPolicy,\n createTenantContext,\n applyRLS,\n canAccessDocument,\n filterDocumentsByRLS,\n type TenantContext,\n type OwnershipRule,\n type RLSConfig,\n} from \"./rls/tenant.js\";\n\nexport {\n PasswordPolicy,\n type PasswordPolicyConfig,\n type ValidationResult,\n} from \"./security/password-policy.js\";\n\nexport {\n AccountLockout,\n type LockoutConfig,\n type LockoutStatus,\n} from \"./security/lockout.js\";\n\nexport {\n RateLimiter,\n type RateLimitConfig,\n type RateLimitResult,\n} from \"./security/rate-limit.js\";\n\nexport {\n AuditLogger,\n createAuditContext,\n type AuditLog,\n type AuditAction,\n type AuditLogFilter,\n} from \"./security/audit-log.js\";\n\nexport {\n SecurityHeaders,\n createSecurityHeaders,\n getSecurityHeadersMiddleware,\n type SecurityHeadersConfig,\n} from \"./security/headers.js\";\n\nexport { createAuthConfig, authConfig } from \"./config.js\";\nexport type { KyroAuthConfig } from \"./config.js\";\n","export type VersionStatus = 'draft' | 'published' | 'archived';\n\nexport interface Version<T = Record<string, unknown>> {\n id: string;\n collection: string;\n documentId: string;\n version: number;\n status: VersionStatus;\n data: T;\n createdBy: string;\n createdAt: Date;\n publishedAt?: Date;\n changeDescription?: string;\n}\n\nexport interface VersionDiff {\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport interface VersionHistoryOptions {\n collection: string;\n documentId: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface CreateVersionOptions<T = Record<string, unknown>> {\n collection: string;\n documentId: string;\n data: T;\n status?: VersionStatus;\n createdBy: string;\n changeDescription?: string;\n}\n\nexport interface PublishVersionOptions {\n collection: string;\n documentId: string;\n versionId: string;\n publishedBy: string;\n}\n\nexport interface CompareVersionsOptions {\n collection: string;\n documentId: string;\n versionA: string | number;\n versionB: string | number;\n}\n\nexport interface VersionAdapter {\n createVersion<T>(options: CreateVersionOptions<T>): Promise<Version<T>>;\n getVersion<T>(collection: string, versionId: string): Promise<Version<T> | null>;\n getVersions<T>(options: VersionHistoryOptions): Promise<Version<T>[]>;\n getLatestVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n getPublishedVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n publishVersion(options: PublishVersionOptions): Promise<void>;\n revertToVersion<T>(options: { collection: string; documentId: string; versionId: string; userId: string }): Promise<Version<T>>;\n compareVersions<T>(options: CompareVersionsOptions): Promise<VersionDiff[]>;\n deleteVersions(collection: string, documentId: string): Promise<void>;\n}\n\nexport interface DraftPublishConfig {\n enabled?: boolean;\n draftsEnabled?: boolean;\n publishEnabled?: boolean;\n scheduleEnabled?: boolean;\n versioningEnabled?: boolean;\n maxVersionsPerDocument?: number;\n autoPublish?: boolean;\n requirePublishPermission?: boolean;\n}\n\nexport interface VersionPublishSchedule {\n versionId: string;\n scheduledFor: Date;\n status: 'pending' | 'published' | 'cancelled';\n}\n\nexport function getDefaultDraftPublishConfig(): Required<DraftPublishConfig> {\n return {\n enabled: true,\n draftsEnabled: true,\n publishEnabled: true,\n scheduleEnabled: false,\n versioningEnabled: true,\n maxVersionsPerDocument: 50,\n autoPublish: false,\n requirePublishPermission: true\n };\n}\n","import { randomUUID } from 'crypto';\nimport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\nimport { getDefaultDraftPublishConfig } from './types.js';\n\nexport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\n\nexport { getDefaultDraftPublishConfig } from './types.js';\n\nexport class VersionManager<T = Record<string, unknown>> {\n private adapter: VersionAdapter;\n private config: Required<DraftPublishConfig>;\n\n constructor(adapter: VersionAdapter, config?: DraftPublishConfig) {\n this.adapter = adapter;\n this.config = { ...getDefaultDraftPublishConfig(), ...config };\n }\n\n async createVersion(options: Omit<CreateVersionOptions<T>, 'version'>): Promise<Version<T>> {\n const latestVersion = await this.adapter.getLatestVersion(options.collection, options.documentId);\n const nextVersion = (latestVersion?.version ?? 0) + 1;\n\n const versionOptions = {\n ...options,\n version: nextVersion\n } as CreateVersionOptions<T>;\n\n const version = await this.adapter.createVersion(versionOptions);\n\n if (this.config.maxVersionsPerDocument > 0) {\n await this.pruneOldVersions(options.collection, options.documentId);\n }\n\n return version;\n }\n\n async publishVersion(options: PublishVersionOptions): Promise<void> {\n const version = await this.adapter.getVersion(options.collection, options.versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n\n if (version.status === 'published') {\n throw new Error('Version is already published');\n }\n\n await this.adapter.publishVersion(options);\n }\n\n async unpublishDocument(collection: string, documentId: string): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: 1000\n });\n\n for (const version of versions) {\n if (version.status === 'published') {\n await this.createVersion({\n collection,\n documentId,\n data: version.data as T,\n status: 'draft',\n createdBy: 'system',\n changeDescription: 'Unpublished document'\n });\n break;\n }\n }\n }\n\n async revertToVersion(\n collection: string,\n documentId: string,\n versionId: string,\n userId: string\n ): Promise<Version<T>> {\n const targetVersion = await this.adapter.getVersion(collection, versionId);\n if (!targetVersion) {\n throw new Error('Version not found');\n }\n\n const newVersion = await this.adapter.revertToVersion({\n collection,\n documentId,\n versionId,\n userId\n });\n\n return newVersion as Version<T>;\n }\n\n async getVersionHistory(\n collection: string,\n documentId: string,\n limit = 20,\n offset = 0\n ): Promise<Version<T>[]> {\n return this.adapter.getVersions({\n collection,\n documentId,\n limit,\n offset\n });\n }\n\n async compareTwoVersions(\n collection: string,\n documentId: string,\n versionA: string | number,\n versionB: string | number\n ): Promise<VersionDiff[]> {\n return this.adapter.compareVersions({\n collection,\n documentId,\n versionA,\n versionB\n });\n }\n\n async getLatestDraft(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getLatestVersion(collection, documentId);\n }\n\n async getPublishedVersion(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getPublishedVersion(collection, documentId);\n }\n\n async getVersion(\n collection: string,\n versionId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getVersion(collection, versionId);\n }\n\n async schedulePublish(\n collection: string,\n documentId: string,\n versionId: string,\n scheduledFor: Date\n ): Promise<void> {\n if (!this.config.scheduleEnabled) {\n throw new Error('Scheduled publishing is not enabled');\n }\n\n const version = await this.adapter.getVersion(collection, versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n }\n\n async deleteVersionHistory(\n collection: string,\n documentId: string\n ): Promise<void> {\n await this.adapter.deleteVersions(collection, documentId);\n }\n\n private async pruneOldVersions(\n collection: string,\n documentId: string\n ): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: this.config.maxVersionsPerDocument + 100\n });\n\n if (versions.length <= this.config.maxVersionsPerDocument) {\n return;\n }\n\n const keepVersions = versions.slice(0, this.config.maxVersionsPerDocument);\n const versionsToDelete = versions.slice(this.config.maxVersionsPerDocument);\n\n for (const version of versionsToDelete) {\n if (version.status !== 'published') {\n await this.adapter.deleteVersions(collection, documentId);\n break;\n }\n }\n }\n}\n\nexport function createVersionManager<T>(\n adapter: VersionAdapter,\n config?: DraftPublishConfig\n): VersionManager<T> {\n return new VersionManager<T>(adapter, config);\n}\n\nexport function isPublished(status: VersionStatus): boolean {\n return status === 'published';\n}\n\nexport function isDraft(status: VersionStatus): boolean {\n return status === 'draft';\n}\n\nexport function isArchived(status: VersionStatus): boolean {\n return status === 'archived';\n}\n","import type { KyroConfig, CollectionConfig, GlobalConfig } from \"./types.js\";\n\nfunction normalizeCollections(\n collections:\n | CollectionConfig[]\n | Record<string, CollectionConfig>\n | undefined,\n): CollectionConfig[] {\n if (!collections) return [];\n if (Array.isArray(collections)) return collections;\n return Object.values(collections);\n}\n\nfunction normalizeGlobals(\n globals: GlobalConfig[] | Record<string, GlobalConfig> | undefined,\n): GlobalConfig[] {\n if (!globals) return [];\n if (Array.isArray(globals)) return globals;\n return Object.values(globals);\n}\n\nexport function defineConfig(config: {\n collections?: CollectionConfig[] | Record<string, CollectionConfig>;\n globals?: GlobalConfig[] | Record<string, GlobalConfig>;\n adapter: KyroConfig[\"adapter\"];\n plugins?: KyroConfig[\"plugins\"];\n auth?: KyroConfig[\"auth\"];\n cors?: KyroConfig[\"cors\"];\n admin?: KyroConfig[\"admin\"];\n upload?: KyroConfig[\"upload\"];\n graphQL?: KyroConfig[\"graphQL\"];\n typescript?: KyroConfig[\"typescript\"];\n localization?: KyroConfig[\"localization\"];\n rateLimit?: KyroConfig[\"rateLimit\"];\n debug?: KyroConfig[\"debug\"];\n}): KyroConfig {\n return {\n collections: normalizeCollections(config.collections),\n globals: normalizeGlobals(config.globals),\n adapter: config.adapter,\n plugins: config.plugins,\n auth: config.auth,\n cors: config.cors,\n admin: config.admin,\n upload: config.upload,\n graphQL: config.graphQL,\n typescript: config.typescript,\n localization: config.localization,\n rateLimit: config.rateLimit,\n debug: config.debug,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/registry/validator.ts","../src/registry/zod-builder.ts","../src/registry/index.ts","../src/createKyro.ts","../src/fields/types.ts","../src/hooks/types.ts","../src/database/local/adapter.ts","../src/plugins/index.ts","../src/styling/index.ts","../src/auth/security/lockout.ts","../src/auth/security/rate-limit.ts","../src/auth/security/audit-log.ts","../src/auth/in-memory-adapter.ts","../src/auth/security/in-memory-rate-limit.ts","../src/auth/security/in-memory-lockout.ts","../src/auth/security/in-memory-audit-log.ts","../src/api/rest/auth-middleware.ts","../src/api/rest/auth-routes.ts","../src/auth/config.ts","../src/auth/index.ts","../src/versions/types.ts","../src/versions/index.ts","../src/registry/config.ts"],"names":["fields","randomBytes","bcrypt","DEFAULT_RATE_LIMITS","createAuditContext","jwt","RedisAuthAdapter"],"mappings":"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","file":"index.js","sourcesContent":["import type { CollectionConfig, GlobalConfig } from './types.js';\nimport type { Field, Block } from '../fields/types.js';\n\n// ============================================================================\n// Validation Errors\n// ============================================================================\n\nexport class ConfigValidationError extends Error {\n public errors: string[];\n \n constructor(errors: string[]) {\n super(`Configuration validation failed:\\n${errors.join('\\n')}`);\n this.name = 'ConfigValidationError';\n this.errors = errors;\n }\n}\n\n// ============================================================================\n// Collection Validation\n// ============================================================================\n\nexport function validateCollection(config: CollectionConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Collection is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Collection slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Collection \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, config.slug);\n errors.push(...fieldErrors);\n }\n \n // Access validation\n if (config.access) {\n for (const [action, handler] of Object.entries(config.access)) {\n if (typeof handler !== 'boolean' && typeof handler !== 'function') {\n errors.push(`Collection \"${config.slug}\" has invalid access.${action} (must be boolean or function)`);\n }\n }\n }\n \n // Admin validation\n if (config.admin?.useAsTitle) {\n const fieldExists = config.fields.some(f => f.name === config.admin!.useAsTitle);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.useAsTitle references unknown field \"${config.admin.useAsTitle}\"`);\n }\n }\n \n if (config.admin?.defaultColumns) {\n for (const col of config.admin.defaultColumns) {\n const fieldExists = config.fields.some(f => f.name === col);\n if (!fieldExists) {\n errors.push(`Collection \"${config.slug}\" admin.defaultColumns references unknown field \"${col}\"`);\n }\n }\n }\n \n // Upload validation\n if (config.upload) {\n if (config.upload.fileSize && config.upload.fileSize <= 0) {\n errors.push(`Collection \"${config.slug}\" upload.fileSize must be positive`);\n }\n }\n \n // Versions validation\n if (config.versions) {\n if (config.versions.maxPerDoc && config.versions.maxPerDoc <= 0) {\n errors.push(`Collection \"${config.slug}\" versions.maxPerDoc must be positive`);\n }\n }\n \n // Auth validation\n if (config.auth) {\n const hasEmailField = config.fields.some(f => f.name === 'email');\n const hasPasswordField = config.fields.some(f => f.name === 'password');\n if (!hasEmailField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires an \"email\" field`);\n }\n if (!hasPasswordField) {\n errors.push(`Collection \"${config.slug}\" with auth enabled requires a \"password\" field`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Global Validation\n// ============================================================================\n\nexport function validateGlobal(config: GlobalConfig): string[] {\n const errors: string[] = [];\n \n // Slug validation\n if (!config.slug) {\n errors.push(`Global is missing a \"slug\" property`);\n } else if (!/^[a-z][a-z0-9_-]*$/.test(config.slug)) {\n errors.push(`Global slug \"${config.slug}\" must be lowercase alphanumeric with dashes`);\n }\n \n // Fields validation\n if (!config.fields || config.fields.length === 0) {\n errors.push(`Global \"${config.slug}\" has no fields defined`);\n } else {\n const fieldErrors = validateFields(config.fields, `global:${config.slug}`);\n errors.push(...fieldErrors);\n }\n \n return errors;\n}\n\n// ============================================================================\n// Field Validation\n// ============================================================================\n\nexport function validateFields(fields: Field[], context: string): string[] {\n const errors: string[] = [];\n const fieldNames = new Set<string>();\n \n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n \n // Skip layout fields without names\n if (field.type === 'row' || field.type === 'collapsible' || field.type === 'tabs') {\n // Validate nested fields\n if ('fields' in field && field.fields) {\n const nestedErrors = validateFields(field.fields, context);\n errors.push(...nestedErrors);\n } else if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateFields(tab.fields, context);\n errors.push(...tabErrors);\n }\n }\n continue;\n }\n \n // Name validation\n const fieldName = field.name as string | undefined;\n if (!fieldName) {\n errors.push(`${context}: Field at index ${i} is missing a \"name\" property`);\n continue;\n }\n \n if (fieldNames.has(fieldName)) {\n errors.push(`${context}: Duplicate field name \"${fieldName}\"`);\n }\n fieldNames.add(fieldName);\n \n if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(fieldName)) {\n errors.push(`${context}: Field name \"${fieldName}\" must be alphanumeric with underscores`);\n }\n \n // Type validation\n if (!field.type) {\n errors.push(`${context}: Field \"${fieldName}\" is missing a \"type\" property`);\n continue;\n }\n \n // Field-specific validation\n switch (field.type) {\n case 'relationship':\n if (!field.relationTo) {\n errors.push(`${context}: Relationship field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n \n case 'array':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Array field \"${fieldName}\" has no fields defined`);\n } else {\n const arrayErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...arrayErrors);\n }\n break;\n \n case 'group':\n if (!field.fields || field.fields.length === 0) {\n errors.push(`${context}: Group field \"${fieldName}\" has no fields defined`);\n } else {\n const groupErrors = validateFields(field.fields, `${context}.${fieldName}`);\n errors.push(...groupErrors);\n }\n break;\n \n case 'blocks':\n if (!field.blocks || field.blocks.length === 0) {\n errors.push(`${context}: Blocks field \"${fieldName}\" has no blocks defined`);\n } else {\n const blockErrors = validateBlocks(field.blocks, `${context}.${fieldName}`);\n errors.push(...blockErrors);\n }\n break;\n \n case 'select':\n case 'radio':\n if (!field.options || field.options.length === 0) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has no options defined`);\n } else {\n const values = field.options.map((o: any) => o.value);\n const uniqueValues = new Set(values);\n if (values.length !== uniqueValues.size) {\n errors.push(`${context}: ${field.type} field \"${fieldName}\" has duplicate option values`);\n }\n }\n break;\n \n case 'upload':\n if (!field.relationTo) {\n errors.push(`${context}: Upload field \"${fieldName}\" is missing \"relationTo\"`);\n }\n break;\n }\n \n // Min/Max validation\n if ('min' in field && 'max' in field && (field as any).min > (field as any).max) {\n errors.push(`${context}: Field \"${fieldName}\" has min greater than max`);\n }\n \n if ('minLength' in field && 'maxLength' in field && (field as any).minLength > (field as any).maxLength) {\n errors.push(`${context}: Field \"${fieldName}\" has minLength greater than maxLength`);\n }\n \n if ('minRows' in field && 'maxRows' in field && (field as any).minRows > (field as any).maxRows) {\n errors.push(`${context}: Field \"${fieldName}\" has minRows greater than maxRows`);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Block Validation\n// ============================================================================\n\nexport function validateBlocks(blocks: Block[], context: string): string[] {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n for (const block of blocks) {\n if (!block.slug) {\n errors.push(`${context}: Block is missing a \"slug\" property`);\n continue;\n }\n \n if (slugs.has(block.slug)) {\n errors.push(`${context}: Duplicate block slug \"${block.slug}\"`);\n }\n slugs.add(block.slug);\n \n if (!block.label) {\n errors.push(`${context}: Block \"${block.slug}\" is missing a \"label\" property`);\n }\n \n if (!block.fields || block.fields.length === 0) {\n errors.push(`${context}: Block \"${block.slug}\" has no fields defined`);\n } else {\n const blockErrors = validateFields(block.fields, `${context}.${block.slug}`);\n errors.push(...blockErrors);\n }\n }\n \n return errors;\n}\n\n// ============================================================================\n// Full Configuration Validation\n// ============================================================================\n\nexport function validateConfig(collections: CollectionConfig[], globals: GlobalConfig[] = []): void {\n const errors: string[] = [];\n const slugs = new Set<string>();\n \n // Check for duplicate collection slugs\n for (const collection of collections) {\n if (slugs.has(collection.slug)) {\n errors.push(`Duplicate collection slug \"${collection.slug}\"`);\n }\n slugs.add(collection.slug);\n }\n \n // Check for duplicate global slugs\n for (const global of globals) {\n if (slugs.has(global.slug)) {\n errors.push(`Duplicate global slug \"${global.slug}\"`);\n }\n slugs.add(global.slug);\n }\n \n // Validate all collections\n for (const collection of collections) {\n const collectionErrors = validateCollection(collection);\n errors.push(...collectionErrors);\n }\n \n // Validate all globals\n for (const global of globals) {\n const globalErrors = validateGlobal(global);\n errors.push(...globalErrors);\n }\n \n // Validate relationships reference existing collections\n for (const collection of collections) {\n const relationshipErrors = validateRelationships(collection.fields, collections);\n errors.push(...relationshipErrors);\n }\n \n if (errors.length > 0) {\n throw new ConfigValidationError(errors);\n }\n}\n\nfunction validateRelationships(fields: Field[], collections: CollectionConfig[]): string[] {\n const errors: string[] = [];\n const collectionSlugs = new Set(collections.map(c => c.slug));\n \n for (const field of fields) {\n if (field.type === 'relationship') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Relationship field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if (field.type === 'upload') {\n const targets = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo];\n for (const target of targets) {\n if (!collectionSlugs.has(target)) {\n errors.push(`Upload field \"${field.name}\" references unknown collection \"${target}\"`);\n }\n }\n }\n \n if ('fields' in field && field.fields) {\n const nestedErrors = validateRelationships(field.fields, collections);\n errors.push(...nestedErrors);\n }\n \n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n const tabErrors = validateRelationships(tab.fields, collections);\n errors.push(...tabErrors);\n }\n }\n \n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n const blockErrors = validateRelationships(block.fields, collections);\n errors.push(...blockErrors);\n }\n }\n }\n \n return errors;\n}\n","import { z, type ZodTypeAny } from 'zod';\nimport type {\n Field,\n TextField,\n NumberField,\n CheckboxField,\n DateField,\n EmailField,\n PasswordField,\n TextareaField,\n SelectField,\n RadioField,\n ColorField,\n RichTextField,\n JSONField,\n CodeField,\n UploadField,\n MarkdownField,\n RelationshipField,\n ArrayField,\n GroupField,\n BlocksField,\n RowField,\n CollapsibleField,\n TabsField,\n ValidateOptions,\n} from '../fields/types.js';\nimport type { CollectionConfig, GlobalConfig } from './types.js';\n\n// ============================================================================\n// Field → Zod Schema Generator\n// ============================================================================\n\nexport function fieldToZod(field: Field): ZodTypeAny {\n switch (field.type) {\n case 'text':\n return textToZod(field);\n case 'number':\n return numberToZod(field);\n case 'checkbox':\n return checkboxToZod(field);\n case 'date':\n return dateToZod(field);\n case 'email':\n return emailToZod(field);\n case 'password':\n return passwordToZod(field);\n case 'textarea':\n return textareaToZod(field);\n case 'select':\n return selectToZod(field);\n case 'radio':\n return radioToZod(field);\n case 'color':\n return colorToZod(field);\n case 'richtext':\n return richTextToZod(field);\n case 'json':\n return jsonToZod(field);\n case 'code':\n return codeToZod(field);\n case 'upload':\n return uploadToZod(field);\n case 'markdown':\n return markdownToZod(field);\n case 'relationship':\n return relationshipToZod(field);\n case 'array':\n return arrayToZod(field);\n case 'group':\n return groupToZod(field);\n case 'blocks':\n return blocksToZod(field);\n case 'row':\n return rowToZod(field);\n case 'collapsible':\n return collapsibleToZod(field);\n case 'tabs':\n return tabsToZod(field);\n default:\n return z.any();\n }\n}\n\n// ============================================================================\n// Primitive Field Schemas\n// ============================================================================\n\nfunction textToZod(field: TextField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (field.pattern) schema = (schema as any).regex(new RegExp(field.pattern));\n if (field.variant === 'email') schema = (schema as any).email();\n if (field.variant === 'url') schema = (schema as any).url();\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction numberToZod(field: NumberField): ZodTypeAny {\n let schema: ZodTypeAny = field.integer ? z.number().int() : z.number();\n if (field.min !== undefined) schema = (schema as any).min(field.min);\n if (field.max !== undefined) schema = (schema as any).max(field.max);\n if (field.step) {\n schema = (schema as any).refine(\n (val: number) => Number.isInteger(val / field.step!),\n `Value must be divisible by ${field.step}`\n );\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction checkboxToZod(field: CheckboxField): ZodTypeAny {\n let schema: ZodTypeAny = z.boolean();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction dateToZod(field: DateField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().refine(\n (val) => !isNaN(Date.parse(val)),\n 'Invalid date format'\n );\n if (field.minDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) >= new Date(field.minDate!),\n `Date must be after ${field.minDate}`\n );\n }\n if (field.maxDate) {\n schema = (schema as any).refine(\n (val: string) => new Date(val) <= new Date(field.maxDate!),\n `Date must be before ${field.maxDate}`\n );\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction emailToZod(field: EmailField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().email('Invalid email');\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction passwordToZod(field: PasswordField): ZodTypeAny {\n let schema: ZodTypeAny = z.string().min(6, 'Password must be at least 6 characters');\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction textareaToZod(field: TextareaField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.minLength) schema = (schema as any).min(field.minLength);\n if (field.maxLength) schema = (schema as any).max(field.maxLength);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction selectToZod(field: SelectField): ZodTypeAny {\n const values = field.options.map(opt => opt.value);\n let schema: ZodTypeAny;\n if (field.hasMany) {\n schema = z.array(z.enum(values as [string, ...string[]]));\n } else {\n schema = z.enum(values as [string, ...string[]]);\n }\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction radioToZod(field: RadioField): ZodTypeAny {\n const values = field.options.map(opt => opt.value);\n let schema: ZodTypeAny = z.enum(values as [string, ...string[]]);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction colorToZod(field: ColorField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.format === 'hex') schema = (schema as any).regex(/^#[0-9A-Fa-f]{6}$/);\n if (field.format === 'rgb') schema = (schema as any).regex(/^rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)$/);\n if (field.format === 'hsl') schema = (schema as any).regex(/^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Complex Field Schemas\n// ============================================================================\n\nfunction richTextToZod(field: RichTextField): ZodTypeAny {\n let schema: ZodTypeAny = z.array(z.object({\n type: z.string(),\n data: z.record(z.any()),\n children: z.array(z.any()).optional(),\n }));\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction jsonToZod(field: JSONField): ZodTypeAny {\n let schema: ZodTypeAny = z.record(z.any());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction codeToZod(field: CodeField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction uploadToZod(field: UploadField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (field.hasMany) schema = z.array(z.string());\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction markdownToZod(field: MarkdownField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\n// ============================================================================\n// Relational Field Schemas\n// ============================================================================\n\nfunction relationshipToZod(field: RelationshipField): ZodTypeAny {\n let schema: ZodTypeAny = z.string();\n if (Array.isArray(field.relationTo)) {\n schema = z.object({\n relationTo: z.enum(field.relationTo as [string, ...string[]]),\n value: z.string(),\n });\n }\n if (field.hasMany) schema = z.array(schema);\n if (!field.required) schema = schema.optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction arrayToZod(field: ArrayField): ZodTypeAny {\n const itemSchema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n let schema: ZodTypeAny = z.array(itemSchema);\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction groupToZod(field: GroupField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n if (!field.required) return (schema as any).optional();\n return schema;\n}\n\nfunction blocksToZod(field: BlocksField): ZodTypeAny {\n const blockSchemas = field.blocks.map(block => {\n return z.object({\n blockType: z.literal(block.slug),\n ...Object.fromEntries(\n block.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n ),\n });\n });\n let schema: ZodTypeAny = z.array(z.discriminatedUnion('blockType', blockSchemas as any));\n if (field.minRows) schema = (schema as any).min(field.minRows);\n if (field.maxRows) schema = (schema as any).max(field.maxRows);\n if (!field.required) schema = (schema as any).optional();\n if (field.validate) schema = addCustomValidation(schema, field.validate);\n return schema;\n}\n\nfunction rowToZod(field: RowField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n return schema;\n}\n\nfunction collapsibleToZod(field: CollapsibleField): ZodTypeAny {\n const schema = z.object(\n Object.fromEntries(\n field.fields\n .filter(f => f.name)\n .map(f => [f.name!, fieldToZod(f)])\n )\n );\n return schema;\n}\n\nfunction tabsToZod(field: TabsField): ZodTypeAny {\n const schemas: Record<string, ZodTypeAny> = {};\n for (const tab of field.tabs) {\n for (const f of tab.fields) {\n if (f.name) {\n schemas[f.name] = fieldToZod(f);\n }\n }\n }\n return z.object(schemas);\n}\n\n// ============================================================================\n// Custom Validation Helper\n// ============================================================================\n\nfunction addCustomValidation(schema: ZodTypeAny, validate: (value: any, options: ValidateOptions) => string | true | Promise<string | true>): ZodTypeAny {\n return schema.refine(\n async (val: any) => {\n const result = await validate(val, { required: false });\n return result === true;\n },\n {\n message: 'Custom validation failed',\n }\n );\n}\n\n// ============================================================================\n// Collection Schema Generator\n// ============================================================================\n\nexport function collectionToZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n if (collection.timestamps) {\n shape['createdAt'] = z.string().optional();\n shape['updatedAt'] = z.string().optional();\n }\n \n if (collection.tenantScoped) {\n shape['tenantID'] = z.string().optional();\n }\n \n shape['id'] = z.string().optional();\n \n return z.object(shape);\n}\n\nexport function collectionToCreateZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n return z.object(shape);\n}\n\nexport function collectionToUpdateZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field).optional();\n }\n }\n \n return z.object(shape);\n}\n\nexport function collectionToWhereZod(collection: CollectionConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of collection.fields) {\n if (field.name) {\n shape[field.name] = z.object({\n equals: z.any().optional(),\n not_equals: z.any().optional(),\n in: z.array(z.any()).optional(),\n not_in: z.array(z.any()).optional(),\n greater_than: z.number().optional(),\n greater_than_equal: z.number().optional(),\n less_than: z.number().optional(),\n less_than_equal: z.number().optional(),\n like: z.string().optional(),\n not_like: z.string().optional(),\n contains: z.string().optional(),\n exists: z.boolean().optional(),\n }).optional();\n }\n }\n \n shape['AND'] = z.array(z.lazy(() => z.object(shape))).optional();\n shape['OR'] = z.array(z.lazy(() => z.object(shape))).optional();\n \n return z.object(shape).optional();\n}\n\n// ============================================================================\n// Global Schema Generator\n// ============================================================================\n\nexport function globalToZod(global: GlobalConfig): ZodTypeAny {\n const shape: Record<string, ZodTypeAny> = {};\n \n for (const field of global.fields) {\n if (field.name) {\n shape[field.name] = fieldToZod(field);\n }\n }\n \n shape['id'] = z.string().optional();\n \n return z.object(shape);\n}\n","import type { CollectionConfig, GlobalConfig, BaseAdapter, PluginConfig } from './types.js';\nimport type { Field } from '../fields/types.js';\nimport { validateConfig, validateCollection, validateGlobal } from './validator.js';\nimport { collectionToZod, collectionToCreateZod, collectionToUpdateZod, collectionToWhereZod, globalToZod, fieldToZod } from './zod-builder.js';\nimport type { ZodTypeAny } from 'zod';\n\n// ============================================================================\n// Registry Class\n// ============================================================================\n\nexport class Registry {\n private collections: Map<string, CollectionConfig> = new Map();\n private globals: Map<string, GlobalConfig> = new Map();\n private plugins: PluginConfig[] = [];\n private schemaCache: Map<string, ZodTypeAny> = new Map();\n private initialized = false;\n\n // ========================================================================\n // Collection Management\n // ========================================================================\n\n addCollection(config: CollectionConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add collections after Registry has been initialized');\n }\n\n // Apply plugin extensions\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendCollection) {\n finalConfig = plugin.extendCollection(finalConfig.slug, finalConfig);\n }\n }\n\n // Add default fields (id, createdAt, etc.) before validation\n finalConfig.fields = this.applyFieldDefaults(finalConfig);\n\n const errors = validateCollection(finalConfig);\n if (errors.length > 0) {\n throw new Error(`Invalid collection config: ${errors.join(', ')}`);\n }\n\n this.collections.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(finalConfig.slug);\n }\n\n addCollections(configs: CollectionConfig[]): void {\n for (const config of configs) {\n this.addCollection(config);\n }\n }\n\n getCollection(slug: string): CollectionConfig | undefined {\n return this.collections.get(slug);\n }\n\n getCollections(): CollectionConfig[] {\n return Array.from(this.collections.values());\n }\n\n getCollectionSlugs(): string[] {\n return Array.from(this.collections.keys());\n }\n\n hasCollection(slug: string): boolean {\n return this.collections.has(slug);\n }\n\n removeCollection(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove collections after Registry has been initialized');\n }\n this.clearSchemaCache(slug);\n return this.collections.delete(slug);\n }\n\n // ========================================================================\n // Global Management\n // ========================================================================\n\n addGlobal(config: GlobalConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add globals after Registry has been initialized');\n }\n\n const errors = validateGlobal(config);\n if (errors.length > 0) {\n throw new Error(`Invalid global config: ${errors.join(', ')}`);\n }\n\n let finalConfig = { ...config };\n for (const plugin of this.plugins) {\n if (plugin.extendGlobal) {\n finalConfig = plugin.extendGlobal(finalConfig.slug, finalConfig);\n }\n }\n\n this.globals.set(finalConfig.slug, finalConfig);\n this.clearSchemaCache(`global:${finalConfig.slug}`);\n }\n\n addGlobals(configs: GlobalConfig[]): void {\n for (const config of configs) {\n this.addGlobal(config);\n }\n }\n\n getGlobal(slug: string): GlobalConfig | undefined {\n return this.globals.get(slug);\n }\n\n getGlobals(): GlobalConfig[] {\n return Array.from(this.globals.values());\n }\n\n getGlobalSlugs(): string[] {\n return Array.from(this.globals.keys());\n }\n\n hasGlobal(slug: string): boolean {\n return this.globals.has(slug);\n }\n\n removeGlobal(slug: string): boolean {\n if (this.initialized) {\n throw new Error('Cannot remove globals after Registry has been initialized');\n }\n this.clearSchemaCache(`global:${slug}`);\n return this.globals.delete(slug);\n }\n\n // ========================================================================\n // Plugin Management\n // ========================================================================\n\n addPlugin(plugin: PluginConfig): void {\n if (this.initialized) {\n throw new Error('Cannot add plugins after Registry has been initialized');\n }\n this.plugins.push(plugin);\n }\n\n getPlugins(): PluginConfig[] {\n return [...this.plugins];\n }\n\n // ========================================================================\n // Schema Generation\n // ========================================================================\n\n getZodSchema(slug: string): ZodTypeAny {\n const cached = this.schemaCache.get(slug);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToZod(collection);\n this.schemaCache.set(slug, schema);\n return schema;\n }\n\n const global = this.globals.get(slug);\n if (global) {\n const schema = globalToZod(global);\n this.schemaCache.set(`global:${slug}`, schema);\n return schema;\n }\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getCreateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:create`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToCreateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getUpdateZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:update`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToUpdateZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getWhereZodSchema(slug: string): ZodTypeAny {\n const cacheKey = `${slug}:where`;\n const cached = this.schemaCache.get(cacheKey);\n if (cached) return cached;\n\n const collection = this.collections.get(slug);\n if (collection) {\n const schema = collectionToWhereZod(collection);\n this.schemaCache.set(cacheKey, schema);\n return schema;\n }\n\n throw new Error(`No collection found with slug \"${slug}\"`);\n }\n\n getFieldZodSchema(field: Field): ZodTypeAny {\n return fieldToZod(field);\n }\n\n private clearSchemaCache(slug: string): void {\n this.schemaCache.delete(slug);\n this.schemaCache.delete(`${slug}:create`);\n this.schemaCache.delete(`${slug}:update`);\n this.schemaCache.delete(`${slug}:where`);\n }\n\n // ========================================================================\n // Field Helpers\n // ========================================================================\n\n private applyFieldDefaults(config: CollectionConfig): Field[] {\n const fields = [...config.fields];\n\n // Add id field if not present\n if (!fields.some(f => f.name === 'id')) {\n fields.unshift({\n name: 'id',\n type: 'text',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add tenantID field if tenantScoped\n if (config.tenantScoped && !fields.some(f => f.name === 'tenantID')) {\n fields.push({\n name: 'tenantID',\n type: 'text',\n required: true,\n admin: { readOnly: true, hidden: true },\n });\n }\n\n // Add timestamp fields if enabled\n if (config.timestamps && !fields.some(f => f.name === 'createdAt')) {\n fields.push({\n name: 'createdAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: { readOnly: true, hidden: true },\n });\n }\n\n return fields;\n }\n\n getFields(slug: string): Field[] {\n const collection = this.collections.get(slug);\n if (collection) return collection.fields;\n\n const global = this.globals.get(slug);\n if (global) return global.fields;\n\n throw new Error(`No collection or global found with slug \"${slug}\"`);\n }\n\n getFieldMap(slug: string): Map<string, Field> {\n const fields = this.getFields(slug);\n const map = new Map<string, Field>();\n\n const addFields = (fields: Field[]) => {\n for (const field of fields) {\n if (field.name) {\n map.set(field.name, field);\n }\n if ('fields' in field && field.fields) {\n addFields(field.fields);\n }\n if ('tabs' in field) {\n for (const tab of (field as any).tabs) {\n addFields(tab.fields);\n }\n }\n if ('blocks' in field) {\n for (const block of (field as any).blocks) {\n addFields(block.fields);\n }\n }\n }\n };\n\n addFields(fields);\n return map;\n }\n\n getVisibleFields(slug: string): Field[] {\n const fields = this.getFields(slug);\n return fields.filter(f => !f.admin?.hidden);\n }\n\n // ========================================================================\n // Initialization\n // ========================================================================\n\n validate(): void {\n const collections = this.getCollections();\n const globals = this.getGlobals();\n validateConfig(collections, globals);\n }\n\n async init(): Promise<void> {\n this.validate();\n\n // Initialize plugins\n for (const plugin of this.plugins) {\n if (plugin.init) {\n await plugin.init(this);\n }\n }\n\n this.initialized = true;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n // ========================================================================\n // Query Helpers\n // ========================================================================\n\n getPaginationDefaults(slug: string): { defaultLimit: number; limits: number[] } {\n const collection = this.collections.get(slug);\n return {\n defaultLimit: collection?.admin?.pagination?.defaultLimit || 10,\n limits: collection?.admin?.pagination?.limits || [10, 25, 50, 100],\n };\n }\n\n getDefaultSort(slug: string): string {\n const collection = this.collections.get(slug);\n const useAsTitle = collection?.admin?.useAsTitle;\n if (useAsTitle) return useAsTitle;\n return 'createdAt';\n }\n\n getDefaultColumns(slug: string): string[] {\n const collection = this.collections.get(slug);\n if (collection?.admin?.defaultColumns) {\n return collection.admin.defaultColumns;\n }\n const fields = this.getVisibleFields(slug);\n return fields.slice(0, 4).map(f => f.name!);\n }\n\n // ========================================================================\n // Admin Helpers\n // ========================================================================\n\n getAdminTitle(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.label || collection?.admin?.description || slug;\n }\n\n getAdminLabel(slug: string): string {\n const collection = this.collections.get(slug);\n return collection?.singularLabel || collection?.label || slug;\n }\n\n getAdminGroup(slug: string): string | undefined {\n return this.collections.get(slug)?.admin?.group;\n }\n\n // ========================================================================\n // Debug / Stats\n // ========================================================================\n\n getStats(): {\n collections: number;\n globals: number;\n plugins: number;\n fields: number;\n } {\n let totalFields = 0;\n for (const collection of this.collections.values()) {\n totalFields += collection.fields.length;\n }\n for (const global of this.globals.values()) {\n totalFields += global.fields.length;\n }\n\n return {\n collections: this.collections.size,\n globals: this.globals.size,\n plugins: this.plugins.length,\n fields: totalFields,\n };\n }\n\n toJSON(): {\n collections: CollectionConfig[];\n globals: GlobalConfig[];\n } {\n return {\n collections: this.getCollections(),\n globals: this.getGlobals(),\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet instance: Registry | null = null;\n\nexport function getRegistry(): Registry {\n if (!instance) {\n instance = new Registry();\n }\n return instance;\n}\n\nexport function resetRegistry(): void {\n instance = null;\n}\n\nexport function createRegistry(): Registry {\n instance = new Registry();\n return instance;\n}\n","import { Registry, createRegistry } from './registry/index.js';\nimport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n} from './registry/types.js';\nimport { KyroPubSub, createWSServer, type KyroWSServer } from './api/ws/index.js';\nimport { createHonoApp } from './api/rest/index.js';\nimport { buildGraphQLSchema } from './api/graphql/index.js';\nimport { createKyroServer } from './api/trpc/index.js';\nimport type { User, Request } from './hooks/types.js';\n\n// ============================================================================\n// Kyro Instance\n// ============================================================================\n\nexport class Kyro {\n public registry: Registry;\n public db: BaseAdapter;\n public pubsub: KyroPubSub;\n private wsServer?: KyroWSServer;\n private config: KyroConfig;\n\n constructor(config: KyroConfig) {\n this.config = config;\n this.registry = createRegistry();\n this.db = config.adapter;\n this.pubsub = new KyroPubSub(this.registry);\n\n // Register collections\n if (config.collections) {\n this.registry.addCollections(config.collections);\n }\n\n // Register globals\n if (config.globals) {\n this.registry.addGlobals(config.globals);\n }\n\n // Register plugins\n if (config.plugins) {\n for (const plugin of config.plugins) {\n this.registry.addPlugin(plugin);\n }\n }\n }\n\n async init(): Promise<void> {\n // Initialize registry\n await this.registry.init();\n\n // Initialize database adapter\n await this.db.init(this.registry.getCollections(), this.registry.getGlobals());\n\n // Auto-register PubSub hooks\n this.pubsub.autoRegisterHooks();\n\n console.log('✅ Kyro CMS initialized');\n console.log(` Collections: ${this.registry.getCollections().length}`);\n console.log(` Globals: ${this.registry.getGlobals().length}`);\n }\n\n // ============================================================================\n // API Methods\n // ============================================================================\n\n getREST(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createHonoApp({\n registry: this.registry,\n db: this.db,\n ...options,\n cors: this.config.cors,\n });\n }\n\n getGraphQL(options?: { user?: User; req?: Request; tenantID?: string }) {\n return buildGraphQLSchema({\n registry: this.registry,\n db: this.db,\n ...options,\n });\n }\n\n getTRPC(options?: { user?: User; req?: Request; tenantID?: string }) {\n return createKyroServer({\n registry: this.registry,\n db: this.db,\n req: options?.req || { headers: {} },\n ...options,\n });\n }\n\n async startWebSocket(options?: { port?: number; requireAuth?: boolean; verifyToken?: (token: string) => Promise<any> }) {\n this.wsServer = createWSServer({\n pubsub: this.pubsub,\n port: options?.port || 8080,\n requireAuth: options?.requireAuth,\n verifyToken: options?.verifyToken,\n });\n console.log(`🔌 WebSocket server started on port ${options?.port || 8080}`);\n return this.wsServer;\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n async shutdown(): Promise<void> {\n if (this.wsServer) {\n await this.wsServer.close();\n }\n await this.db.disconnect();\n console.log('👋 Kyro CMS shut down');\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createKyro(config: KyroConfig): Kyro {\n return new Kyro(config);\n}\n\n// ============================================================================\n// Convenience Exports\n// ============================================================================\n\nexport { Registry, createRegistry, getRegistry, resetRegistry } from './registry/index.js';\nexport type {\n KyroConfig,\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n PluginConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n CreateResult,\n} from './registry/types.js';\nexport type { Field, FieldType } from './fields/index.js';\nexport type { AccessControl, AccessArgs, WhereClause } from './access/index.js';\nexport type { Hook, HookArgs, User, Request } from './hooks/index.js';\nexport { DrizzleAdapter, createDrizzleAdapter } from './database/drizzle/index.js';\nexport { MongoDBAdapter, createMongoDBAdapter } from './database/mongodb/index.js';\nexport { KyroPubSub, KyroWSServer, createWSServer } from './api/ws/index.js';\nexport { createHonoApp } from './api/rest/index.js';\nexport { buildGraphQLSchema, createGraphQLSchema } from './api/graphql/index.js';\nexport { createKyroServer } from './api/trpc/index.js';\nexport { z } from 'zod';\n","// ============================================================================\n// Base Field Interface\n// ============================================================================\n\nexport interface FieldAdmin {\n description?: string;\n placeholder?: string;\n readOnly?: boolean;\n hidden?: boolean;\n width?: string;\n condition?: (data: Record<string, any>, siblingData: Record<string, any>) => boolean;\n position?: 'sidebar' | 'main';\n}\n\nexport interface BaseField {\n name: string;\n label?: string;\n required?: boolean;\n unique?: boolean;\n indexed?: boolean;\n defaultValue?: any;\n admin?: FieldAdmin;\n validate?: (value: any, options: ValidateOptions) => string | true | Promise<string | true>;\n hooks?: {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n };\n}\n\nexport interface ValidateOptions {\n data?: Record<string, any>;\n siblingData?: Record<string, any>;\n user?: any;\n operation?: string;\n required?: boolean;\n}\n\nexport type Hook = (args: any) => Promise<any> | any;\n\n// ============================================================================\n// Primitive Fields\n// ============================================================================\n\nexport type TextFieldVariant = 'text' | 'email' | 'password' | 'url' | 'id';\n\nexport interface TextField extends BaseField {\n type: 'text';\n variant?: TextFieldVariant;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n hasMany?: boolean;\n localized?: boolean;\n}\n\nexport interface NumberField extends BaseField {\n type: 'number';\n min?: number;\n max?: number;\n step?: number;\n integer?: boolean;\n hasMany?: boolean;\n}\n\nexport interface CheckboxField extends BaseField {\n type: 'checkbox';\n}\n\nexport interface DateField extends BaseField {\n type: 'date';\n minDate?: string;\n maxDate?: string;\n time?: boolean;\n}\n\nexport interface EmailField extends BaseField {\n type: 'email';\n}\n\nexport interface PasswordField extends BaseField {\n type: 'password';\n}\n\nexport interface TextareaField extends BaseField {\n type: 'textarea';\n minLength?: number;\n maxLength?: number;\n rows?: number;\n localized?: boolean;\n}\n\nexport interface SelectField extends BaseField {\n type: 'select';\n options: Array<{ label: string; value: string }>;\n hasMany?: boolean;\n defaultValue?: string | string[];\n}\n\nexport interface RadioField extends BaseField {\n type: 'radio';\n options: Array<{ label: string; value: string }>;\n defaultValue?: string;\n}\n\nexport interface ColorField extends BaseField {\n type: 'color';\n format?: 'hex' | 'rgb' | 'hsl';\n defaultValue?: string;\n}\n\n// ============================================================================\n// Complex Fields\n// ============================================================================\n\nexport interface RichTextBlock {\n type: string;\n data: Record<string, any>;\n children?: RichTextBlock[];\n}\n\nexport interface RichTextField extends BaseField {\n type: 'richtext';\n editor?: 'lexical' | 'slate' | 'blocks';\n defaultValue?: RichTextBlock[];\n localized?: boolean;\n}\n\nexport interface JSONField extends BaseField {\n type: 'json';\n defaultValue?: Record<string, any>;\n}\n\nexport interface CodeField extends BaseField {\n type: 'code';\n language?: string;\n defaultValue?: string;\n}\n\nexport interface UploadField extends BaseField {\n type: 'upload';\n relationTo: string;\n hasMany?: boolean;\n maxDepth?: number;\n defaultValue?: string;\n}\n\nexport interface MarkdownField extends BaseField {\n type: 'markdown';\n localized?: boolean;\n defaultValue?: string;\n}\n\n// ============================================================================\n// Relational Fields\n// ============================================================================\n\nexport interface RelationshipField extends BaseField {\n type: 'relationship';\n relationTo: string | string[];\n hasMany?: boolean;\n maxDepth?: number;\n filterOptions?: (args: { data: any; user: any }) => Record<string, any>;\n defaultValue?: string | string[];\n}\n\nexport interface ArrayField extends BaseField {\n type: 'array';\n fields: Field[];\n minRows?: number;\n maxRows?: number;\n labels?: { singular?: string; plural?: string };\n defaultValue?: Record<string, any>[];\n}\n\nexport interface GroupField extends BaseField {\n type: 'group';\n fields: Field[];\n defaultValue?: Record<string, any>;\n}\n\nexport interface Block {\n slug: string;\n label: string;\n fields: Field[];\n imageURL?: string;\n}\n\nexport interface BlocksField extends BaseField {\n type: 'blocks';\n blocks: Block[];\n minRows?: number;\n maxRows?: number;\n defaultValue?: Array<{ blockType: string; [key: string]: any }>;\n}\n\nexport interface RowField extends Omit<BaseField, 'name'> {\n type: 'row';\n fields: Field[];\n name?: string;\n}\n\nexport interface CollapsibleField extends Omit<BaseField, 'name'> {\n type: 'collapsible';\n fields: Field[];\n label: string;\n name?: string;\n}\n\nexport interface TabsField extends Omit<BaseField, 'name'> {\n type: 'tabs';\n tabs: Array<{\n label: string;\n fields: Field[];\n name?: string;\n }>;\n name?: string;\n}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\nexport type Field =\n | TextField\n | NumberField\n | CheckboxField\n | DateField\n | EmailField\n | PasswordField\n | TextareaField\n | SelectField\n | RadioField\n | ColorField\n | RichTextField\n | JSONField\n | CodeField\n | UploadField\n | MarkdownField\n | RelationshipField\n | ArrayField\n | GroupField\n | BlocksField\n | RowField\n | CollapsibleField\n | TabsField;\n\nexport type FieldType = Field['type'];\n\n// ============================================================================\n// Field Type Guards\n// ============================================================================\n\nexport function isTextField(field: Field): field is TextField {\n return field.type === 'text';\n}\n\nexport function isNumberField(field: Field): field is NumberField {\n return field.type === 'number';\n}\n\nexport function isRelationshipField(field: Field): field is RelationshipField {\n return field.type === 'relationship';\n}\n\nexport function isArrayField(field: Field): field is ArrayField {\n return field.type === 'array';\n}\n\nexport function isGroupField(field: Field): field is GroupField {\n return field.type === 'group';\n}\n\nexport function isBlocksField(field: Field): field is BlocksField {\n return field.type === 'blocks';\n}\n\nexport function isUploadField(field: Field): field is UploadField {\n return field.type === 'upload';\n}\n\nexport function isRichTextField(field: Field): field is RichTextField {\n return field.type === 'richtext';\n}\n\nexport function isSelectField(field: Field): field is SelectField {\n return field.type === 'select';\n}\n\nexport function isLayoutField(field: Field): field is RowField | CollapsibleField | TabsField {\n return field.type === 'row' || field.type === 'collapsible' || field.type === 'tabs';\n}\n\n// ============================================================================\n// Field Type List\n// ============================================================================\n\nexport const PRIMITIVE_FIELD_TYPES = [\n 'text', 'number', 'checkbox', 'date', 'email', 'password',\n 'textarea', 'select', 'radio', 'color',\n] as const;\n\nexport const COMPLEX_FIELD_TYPES = [\n 'richtext', 'json', 'code', 'upload', 'markdown',\n] as const;\n\nexport const RELATIONAL_FIELD_TYPES = [\n 'relationship', 'array', 'group', 'blocks',\n] as const;\n\nexport const LAYOUT_FIELD_TYPES = [\n 'row', 'collapsible', 'tabs',\n] as const;\n\nexport const ALL_FIELD_TYPES = [\n ...PRIMITIVE_FIELD_TYPES,\n ...COMPLEX_FIELD_TYPES,\n ...RELATIONAL_FIELD_TYPES,\n ...LAYOUT_FIELD_TYPES,\n] as const;\n","// ============================================================================\n// Hook Types\n// ============================================================================\n\nexport interface Request {\n body?: any;\n headers: Record<string, string>;\n method?: string;\n url?: string;\n cookies?: Record<string, string>;\n query?: Record<string, any>;\n}\n\nexport interface User {\n id: string;\n email: string;\n role: string;\n tenantID?: string;\n [key: string]: any;\n}\n\nexport interface HookArgs<T = any> {\n collection?: string;\n global?: string;\n data?: T;\n originalDoc?: T;\n doc?: T;\n req: Request;\n user?: User;\n operation: 'create' | 'read' | 'update' | 'delete';\n tenantID?: string;\n field?: string;\n siblingData?: Record<string, any>;\n value?: any;\n previousValue?: any;\n context?: Record<string, any>;\n}\n\nexport type Hook<T = any> = (args: HookArgs<T>) => Promise<T | void> | T | void;\n\nexport interface CollectionHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n beforeDelete?: Hook[];\n afterDelete?: Hook[];\n beforeLogin?: Hook[];\n afterLogin?: Hook[];\n afterLogout?: Hook[];\n afterRefresh?: Hook[];\n afterForgotPassword?: Hook[];\n}\n\nexport interface FieldHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n}\n\nexport interface GlobalHooks {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n beforeRead?: Hook[];\n afterRead?: Hook[];\n}\n\n// ============================================================================\n// Hook Runner\n// ============================================================================\n\nexport async function runHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n let result = args.data;\n \n for (const hook of hooks) {\n const hookResult = await hook({\n ...args,\n data: result,\n });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n }\n \n return result;\n}\n\nexport async function runFieldHooks(\n hooks: Hook[],\n args: HookArgs\n): Promise<any> {\n return runHooks(hooks, args);\n}\n","import type Database from 'better-sqlite3';\nimport { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n} from '../../registry/types.js';\n\n// ============================================================================\n// SQLite / Local-First Adapter\n// ============================================================================\n\nexport class LocalAdapter extends AbstractBaseAdapter {\n private db: any;\n private path?: string;\n private migrations: Map<string, boolean> = new Map();\n\n constructor(options: {\n db?: any;\n path?: string;\n }) {\n super();\n this.path = options.path;\n\n if (options.db) {\n this.db = options.db;\n } else {\n this.db = null;\n }\n }\n\n async connect(): Promise<void> {\n if (!this.db) {\n const Database = (await import('better-sqlite3')).default;\n this.db = new Database(this.path || ':memory:');\n }\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.connected = true;\n console.log(`[LocalAdapter] Connected to SQLite (${this.path || 'memory'})`);\n }\n\n async disconnect(): Promise<void> {\n if (this.db) {\n this.db.close();\n }\n this.connected = false;\n console.log('[LocalAdapter] Disconnected');\n }\n\n // ========================================================================\n // Schema Management\n // ========================================================================\n\n private ensureTable(config: CollectionConfig): void {\n const tableName = this.getTableNameFor(config.slug);\n\n if (this.migrations.has(tableName)) return;\n\n const columns: string[] = [\n `id TEXT PRIMARY KEY`,\n ];\n\n for (const field of config.fields) {\n if (!field.name || field.name === 'id') continue;\n\n const colDef = this.fieldToSQL(field);\n if (colDef) columns.push(colDef);\n }\n\n if (config.timestamps) {\n columns.push(`created_at TEXT DEFAULT (datetime('now'))`);\n columns.push(`updated_at TEXT DEFAULT (datetime('now'))`);\n }\n\n if (config.tenantScoped) {\n columns.push(`tenant_id TEXT NOT NULL`);\n }\n\n const createSQL = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns.join(', ')})`;\n this.db.exec(createSQL);\n\n // Create indexes\n for (const field of config.fields) {\n if (field.name && field.indexed) {\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${tableName}_${field.name} ON ${tableName}(${field.name})`);\n }\n if (field.name && field.unique) {\n this.db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_${tableName}_${field.name}_unique ON ${tableName}(${field.name})`);\n }\n }\n\n this.migrations.set(tableName, true);\n }\n\n private fieldToSQL(field: any): string | null {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n case 'url':\n return `${field.name} TEXT`;\n case 'number':\n return `${field.name} REAL`;\n case 'checkbox':\n return `${field.name} INTEGER DEFAULT 0`;\n case 'date':\n return `${field.name} TEXT`;\n case 'select':\n case 'radio':\n return `${field.name} TEXT`;\n case 'relationship':\n case 'upload':\n return `${field.name} TEXT`;\n case 'json':\n case 'richtext':\n case 'array':\n case 'group':\n case 'blocks':\n return `${field.name} TEXT`;\n default:\n return null;\n }\n }\n\n // ========================================================================\n // CRUD Operations\n // ========================================================================\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName}`;\n const params: any[] = [];\n const conditions: string[] = [];\n\n if (tenantID && config.tenantScoped) {\n conditions.push(`tenant_id = ?`);\n params.push(tenantID);\n }\n\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' || key === 'OR') continue;\n \n if (typeof value === 'object' && value !== null) {\n if (value.equals !== undefined) {\n conditions.push(`${key} = ?`);\n params.push(value.equals);\n }\n if (value.in !== undefined) {\n conditions.push(`${key} IN (${value.in.map(() => '?').join(', ')})`);\n params.push(...value.in);\n }\n if (value.not_equals !== undefined) {\n conditions.push(`${key} != ?`);\n params.push(value.not_equals);\n }\n } else {\n conditions.push(`${key} = ?`);\n params.push(value);\n }\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n const sortField = sort?.replace('-', '') || 'created_at';\n const sortDir = sort?.startsWith('-') ? 'DESC' : 'ASC';\n sql += ` ORDER BY ${sortField} ${sortDir}`;\n\n const countSql = sql.replace('SELECT *', 'SELECT COUNT(*) as count');\n const countResult = this.db.prepare(countSql).get(...params) as { count: number };\n const totalDocs = countResult?.count || 0;\n\n sql += ` LIMIT ? OFFSET ?`;\n params.push(limit, (page - 1) * limit);\n\n const rows = this.db.prepare(sql).all(...params);\n const docs = rows.map((row: any) => this.rowToDoc(row, config));\n\n return {\n docs: docs as T[],\n totalDocs,\n limit,\n totalPages: Math.ceil(totalDocs / limit),\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < Math.ceil(totalDocs / limit),\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < Math.ceil(totalDocs / limit) ? page + 1 : null,\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT * FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n const row = this.db.prepare(sql).get(...params);\n if (!row) return null;\n\n return this.rowToDoc(row as any, config) as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const id = data.id || this.generateId();\n \n const insertData = this.prepareData(data, config);\n insertData.id = id;\n insertData.created_at = new Date().toISOString();\n insertData.updated_at = new Date().toISOString();\n\n if (tenantID && config.tenantScoped) {\n insertData.tenant_id = tenantID;\n }\n\n const columns = Object.keys(insertData);\n const placeholders = columns.map(() => '?').join(', ');\n const values = Object.values(insertData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n this.db.prepare(\n `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`\n ).run(...values);\n\n return { ...insertData, id } as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n const updateData = this.prepareData(data, config);\n updateData.updated_at = new Date().toISOString();\n\n const columns = Object.keys(updateData);\n const setClause = columns.map(c => `${c} = ?`).join(', ');\n const values = Object.values(updateData).map((v: any) => \n typeof v === 'object' ? JSON.stringify(v) : v\n );\n\n let sql = `UPDATE ${tableName} SET ${setClause} WHERE id = ?`;\n const params = [...values, id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return this.findByID<T>({ collection: slug, id, tenantID }) as Promise<T>;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const doc = await this.findByID<T>({ collection: slug, id, tenantID });\n if (!doc) throw new Error(`Document not found: ${slug}/${id}`);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `DELETE FROM ${tableName} WHERE id = ?`;\n const params: any[] = [id];\n\n if (tenantID && config.tenantScoped) {\n sql += ` AND tenant_id = ?`;\n params.push(tenantID);\n }\n\n this.db.prepare(sql).run(...params);\n\n return doc;\n }\n\n async count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, tenantID } = args;\n const config = this.getCollection(slug);\n this.ensureTable(config);\n\n const tableName = this.getTableNameFor(slug);\n let sql = `SELECT COUNT(*) as count FROM ${tableName}`;\n const params: any[] = [];\n\n if (tenantID && config.tenantScoped) {\n sql += ` WHERE tenant_id = ?`;\n params.push(tenantID);\n }\n\n const result = this.db.prepare(sql).get(...params) as { count: number };\n return result?.count || 0;\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string }): Promise<any> {\n const result = await this.find({ ...args, limit: 1 });\n return result.docs[0] || null;\n }\n\n // ========================================================================\n // Version Support (Placeholder)\n // ========================================================================\n\n async findVersions(): Promise<FindResult<any>> {\n return { docs: [], totalDocs: 0, limit: 10, totalPages: 0, page: 1, pagingCounter: 0, hasPrevPage: false, hasNextPage: false, prevPage: null, nextPage: null };\n }\n\n async findVersionByID(): Promise<any> {\n return null;\n }\n\n async createVersion(): Promise<any> {\n return {};\n }\n\n async deleteVersions(): Promise<void> {}\n\n // ========================================================================\n // Helpers\n // ========================================================================\n\n private rowToDoc(row: any, config: CollectionConfig): any {\n const doc: any = { id: row.id };\n\n for (const field of config.fields) {\n if (!field.name || field.name === 'id') continue;\n\n let value = row[field.name];\n\n if (field.type === 'json' || field.type === 'richtext' || \n field.type === 'array' || field.type === 'group' || field.type === 'blocks') {\n try {\n value = value ? JSON.parse(value) : null;\n } catch {\n value = null;\n }\n }\n\n if (field.type === 'checkbox') {\n value = Boolean(value);\n }\n\n if (field.type === 'date' && value) {\n value = new Date(value).toISOString();\n }\n\n doc[field.name] = value;\n }\n\n if (config.timestamps) {\n doc.createdAt = row.created_at;\n doc.updatedAt = row.updated_at;\n }\n\n if (config.tenantScoped) {\n doc.tenantID = row.tenant_id;\n }\n\n return doc;\n }\n\n private generateId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private getTableNameFor(slug: string): string {\n return slug.replace(/-/g, '_');\n }\n\n // ========================================================================\n // Migrations\n // ========================================================================\n\n async migrate(): Promise<void> {\n for (const config of this.collections.values()) {\n this.ensureTable(config);\n }\n console.log('[LocalAdapter] Migrations complete');\n }\n\n async rollback(): Promise<void> {\n console.log('[LocalAdapter] Rollback not supported for schema changes');\n }\n\n // ========================================================================\n // Transaction Support\n // ========================================================================\n\n async transaction<T>(fn: (tx: any) => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n const tx = this.db.transaction(async () => {\n return fn({ db: this.db });\n });\n\n try {\n const result = tx();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n // ========================================================================\n // Direct DB Access\n // ========================================================================\n\n getDatabase(): any {\n return this.db;\n }\n\n exec(sql: string): void {\n this.db.exec(sql);\n }\n\n prepare(sql: string) {\n return this.db.prepare(sql);\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createLocalAdapter(options?: {\n db?: any;\n path?: string;\n}): LocalAdapter {\n return new LocalAdapter(options || {});\n}\n","import type { CollectionConfig, GlobalConfig } from '../registry/types.js';\nimport type { Field } from '../fields/types.js';\nimport type { Hook } from '../hooks/types.js';\n\n// ============================================================================\n// Plugin System\n// ============================================================================\n\nexport interface PluginHooks {\n beforeInit?: Hook[];\n afterInit?: Hook[];\n beforeRegisterCollections?: Hook[];\n afterRegisterCollections?: Hook[];\n beforeRegisterGlobals?: Hook[];\n afterRegisterGlobals?: Hook[];\n beforeServerStart?: Hook[];\n afterServerStart?: Hook[];\n beforeServerStop?: Hook[];\n afterServerStop?: Hook[];\n}\n\nexport interface PluginCollectionExtension {\n slug: string;\n config: Partial<CollectionConfig>;\n}\n\nexport interface PluginGlobalExtension {\n slug: string;\n config: Partial<GlobalConfig>;\n}\n\nexport interface PluginFieldExtension {\n collectionSlug: string;\n field: Field;\n}\n\nexport interface PluginAPI {\n registry: {\n getCollection: (slug: string) => CollectionConfig | undefined;\n getCollections: () => CollectionConfig[];\n getGlobal: (slug: string) => GlobalConfig | undefined;\n addCollection: (config: CollectionConfig) => void;\n addGlobal: (config: GlobalConfig) => void;\n extendCollection: (slug: string, extension: Partial<CollectionConfig>) => void;\n extendGlobal: (slug: string, extension: Partial<GlobalConfig>) => void;\n addField: (collectionSlug: string, field: Field, position?: number) => void;\n };\n hooks: {\n register: (event: string, handler: Hook) => void;\n unregister: (event: string, handler: Hook) => void;\n };\n config: {\n get: (key: string) => any;\n set: (key: string, value: any) => void;\n };\n db: any;\n}\n\n// ============================================================================\n// Base Plugin Class\n// ============================================================================\n\nexport abstract class KyroPlugin {\n public name: string;\n public version?: string;\n public description?: string;\n public hooks: PluginHooks = {};\n public collections: Partial<CollectionConfig>[] = [];\n public globals: Partial<GlobalConfig>[] = [];\n public fields: PluginFieldExtension[] = [];\n public extensions: {\n collections: PluginCollectionExtension[];\n globals: PluginGlobalExtension[];\n } = { collections: [], globals: [] };\n public adminComponents: Record<string, any> = {};\n public adminStyles: string[] = [];\n public serverMiddleware?: (app: any) => void;\n public clientMiddleware?: (req: any) => any;\n\n constructor(name: string) {\n this.name = name;\n }\n\n async init?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async beforeInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n async afterInit?(api: PluginAPI): Promise<void> {\n // Override in subclass\n }\n\n getCollections?(): Partial<CollectionConfig>[] {\n return this.collections;\n }\n\n getGlobals?(): Partial<GlobalConfig>[] {\n return this.globals;\n }\n\n getHooks?(): PluginHooks {\n return this.hooks;\n }\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: Map<string, KyroPlugin> = new Map();\n private hooks: Map<string, Hook[]> = new Map();\n\n register(plugin: KyroPlugin): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already registered`);\n }\n\n this.plugins.set(plugin.name, plugin);\n\n // Register hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.registerHook(event, handler);\n }\n }\n }\n\n console.log(`[PluginManager] Registered plugin: ${plugin.name}`);\n }\n\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (!plugin) return;\n\n // Unregister hooks\n const pluginHooks = plugin.getHooks?.() || {};\n for (const [event, handlers] of Object.entries(pluginHooks)) {\n if (Array.isArray(handlers)) {\n for (const handler of handlers) {\n this.unregisterHook(event, handler);\n }\n }\n }\n\n this.plugins.delete(name);\n console.log(`[PluginManager] Unregistered plugin: ${name}`);\n }\n\n get(name: string): KyroPlugin | undefined {\n return this.plugins.get(name);\n }\n\n getAll(): KyroPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n registerHook(event: string, handler: Hook): void {\n if (!this.hooks.has(event)) {\n this.hooks.set(event, []);\n }\n this.hooks.get(event)!.push(handler);\n }\n\n unregisterHook(event: string, handler: Hook): void {\n const handlers = this.hooks.get(event);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n }\n\n async executeHook(event: string, args?: any): Promise<any> {\n const handlers = this.hooks.get(event) || [];\n let result = args;\n\n for (const handler of handlers) {\n try {\n const hookResult = await handler({ ...args, data: result });\n if (hookResult !== undefined) {\n result = hookResult;\n }\n } catch (error) {\n console.error(`[PluginManager] Error in hook \"${event}\":`, error);\n }\n }\n\n return result;\n }\n\n // ========================================================================\n // Collection/Field Extensions\n // ========================================================================\n\n getAllCollections(): Partial<CollectionConfig>[] {\n const collections: Partial<CollectionConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginCollections = plugin.getCollections?.() || [];\n collections.push(...pluginCollections);\n }\n\n return collections;\n }\n\n getAllGlobals(): Partial<GlobalConfig>[] {\n const globals: Partial<GlobalConfig>[] = [];\n\n for (const plugin of this.plugins.values()) {\n const pluginGlobals = plugin.getGlobals?.() || [];\n globals.push(...pluginGlobals);\n }\n\n return globals;\n }\n\n getAllFields(): PluginFieldExtension[] {\n const fields: PluginFieldExtension[] = [];\n\n for (const plugin of this.plugins.values()) {\n fields.push(...plugin.fields);\n }\n\n return fields;\n }\n\n getAdminComponents(): Record<string, any> {\n const components: Record<string, any> = {};\n\n for (const plugin of this.plugins.values()) {\n Object.assign(components, plugin.adminComponents);\n }\n\n return components;\n }\n\n getAdminStyles(): string[] {\n const styles: string[] = [];\n\n for (const plugin of this.plugins.values()) {\n styles.push(...plugin.adminStyles);\n }\n\n return styles;\n }\n}\n\n// ============================================================================\n// Preset Plugins\n// ============================================================================\n\n// SEO Plugin\nexport class SEOPLugin extends KyroPlugin {\n constructor() {\n super('seo');\n this.description = 'Advanced SEO features including sitemaps, robots.txt, and structured data';\n \n this.collections.push({\n slug: 'seo-settings',\n label: 'SEO Settings',\n fields: [\n { name: 'sitemap', type: 'checkbox', label: 'Enable Sitemap', defaultValue: true },\n { name: 'robotsTxt', type: 'textarea', label: 'robots.txt Content' },\n { name: 'canonicalUrl', type: 'text', variant: 'url' as any, label: 'Canonical URL' },\n { name: 'ogImage', type: 'text', label: 'Default OG Image URL' },\n ],\n });\n }\n}\n\n// Analytics Plugin\nexport class AnalyticsPlugin extends KyroPlugin {\n constructor() {\n super('analytics');\n this.description = 'Analytics integration for tracking page views and events';\n \n this.collections.push({\n slug: 'analytics-events',\n label: 'Analytics Events',\n fields: [\n { name: 'name', type: 'text', required: true },\n { name: 'properties', type: 'json', label: 'Event Properties' },\n { name: 'timestamp', type: 'date', required: true },\n { name: 'userId', type: 'text', label: 'User ID' },\n { name: 'sessionId', type: 'text', label: 'Session ID' },\n ],\n });\n\n this.adminComponents['AnalyticsDashboard'] = {};\n }\n}\n\n// Comments Plugin\nexport class CommentsPlugin extends KyroPlugin {\n constructor() {\n super('comments');\n this.description = 'Commenting system for products and posts';\n \n this.collections.push({\n slug: 'comments',\n label: 'Comments',\n fields: [\n { name: 'content', type: 'textarea', required: true },\n { name: 'author', type: 'text', required: true },\n { name: 'email', type: 'email' },\n { name: 'approved', type: 'checkbox', defaultValue: false },\n { name: 'parent', type: 'text', label: 'Parent Comment ID' },\n { name: 'resourceType', type: 'text', required: true },\n { name: 'resourceId', type: 'text', required: true },\n ],\n });\n\n this.adminComponents['CommentModeration'] = {};\n }\n}\n\n// Reviews Plugin\nexport class ReviewsPlugin extends KyroPlugin {\n constructor() {\n super('reviews');\n this.description = 'Product reviews and ratings';\n \n this.collections.push({\n slug: 'reviews',\n label: 'Reviews',\n fields: [\n { name: 'rating', type: 'number', required: true, min: 1, max: 5 },\n { name: 'title', type: 'text' },\n { name: 'content', type: 'textarea', required: true },\n { name: 'author', type: 'relationship', relationTo: 'customers' },\n { name: 'product', type: 'relationship', relationTo: 'products', required: true },\n { name: 'approved', type: 'checkbox', defaultValue: false },\n { name: 'verified', type: 'checkbox', label: 'Verified Purchase' },\n { name: 'helpful', type: 'number', label: 'Helpful Count', defaultValue: 0 },\n ],\n });\n\n this.adminComponents['ReviewModeration'] = {};\n }\n}\n\n// Wishlist Plugin\nexport class WishlistPlugin extends KyroPlugin {\n constructor() {\n super('wishlist');\n this.description = 'Customer wishlists';\n \n this.collections.push({\n slug: 'wishlists',\n label: 'Wishlists',\n fields: [\n { name: 'customer', type: 'relationship', relationTo: 'customers', required: true },\n { name: 'name', type: 'text', label: 'Wishlist Name', defaultValue: 'My Wishlist' },\n { name: 'items', type: 'blocks', label: 'Items', blocks: [\n {\n slug: 'wishlist-item',\n label: 'Item',\n fields: [\n { name: 'product', type: 'relationship', relationTo: 'products' },\n { name: 'quantity', type: 'number', defaultValue: 1 },\n { name: 'addedAt', type: 'date' },\n { name: 'priority', type: 'select', options: [\n { label: 'Low', value: 'low' },\n { label: 'Medium', value: 'medium' },\n { label: 'High', value: 'high' },\n ]},\n ],\n },\n ]},\n ],\n });\n }\n}\n\n// Export preset plugins\nexport const presetPlugins = {\n SEO: SEOPLugin,\n Analytics: AnalyticsPlugin,\n Comments: CommentsPlugin,\n Reviews: ReviewsPlugin,\n Wishlist: WishlistPlugin,\n};\n","// ============================================================================\n// Styling System Abstraction\n// ============================================================================\n\nexport type StylingMode = 'css' | 'tailwind' | 'css-in-js' | 'styled-components' | 'vanilla-extract';\n\nexport interface StylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customProperties?: Record<string, string>;\n}\n\nexport interface ThemeConfig {\n colors?: ThemeColors;\n fonts?: ThemeFonts;\n spacing?: ThemeSpacing;\n borderRadius?: ThemeBorderRadius;\n shadows?: ThemeShadows;\n breakpoints?: Record<string, string>;\n}\n\nexport interface ThemeColors {\n primary?: string;\n secondary?: string;\n accent?: string;\n background?: string;\n surface?: string;\n text?: string;\n textMuted?: string;\n border?: string;\n error?: string;\n warning?: string;\n success?: string;\n info?: string;\n}\n\nexport interface ThemeFonts {\n sans?: string;\n serif?: string;\n mono?: string;\n}\n\nexport interface ThemeSpacing {\n xs?: string;\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n '2xl'?: string;\n '3xl'?: string;\n '4xl'?: string;\n}\n\nexport interface ThemeBorderRadius {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n full?: string;\n}\n\nexport interface ThemeShadows {\n sm?: string;\n md?: string;\n lg?: string;\n xl?: string;\n}\n\n// ============================================================================\n// CSS Generator\n// ============================================================================\n\nexport class CSSGenerator {\n private css: string[] = [];\n\n constructor(private config: StylingConfig) {}\n\n addRule(selector: string, properties: Record<string, string>): this {\n const props = Object.entries(properties)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n this.css.push(`${selector} {\\n${props}\\n}`);\n return this;\n }\n\n addMediaQuery(breakpoint: string, rules: string[]): this {\n this.css.push(`@media (min-width: ${breakpoint}) {\\n ${rules.join('\\n ')}\\n}`);\n return this;\n }\n\n generate(): string {\n return this.css.join('\\n\\n');\n }\n}\n\n// ============================================================================\n// Tailwind Config Generator\n// ============================================================================\n\nexport function generateTailwindConfig(theme: ThemeConfig): Record<string, any> {\n return {\n theme: {\n extend: {\n colors: theme.colors || {},\n fontFamily: theme.fonts || {},\n spacing: theme.spacing || {},\n borderRadius: theme.borderRadius || {},\n boxShadow: theme.shadows || {},\n screens: theme.breakpoints || {},\n },\n },\n };\n}\n\n// ============================================================================\n// Default Themes\n// ============================================================================\n\nexport const defaultLightTheme: ThemeConfig = {\n colors: {\n primary: '#3b82f6',\n secondary: '#6366f1',\n accent: '#ec4899',\n background: '#ffffff',\n surface: '#f9fafb',\n text: '#111827',\n textMuted: '#6b7280',\n border: '#e5e7eb',\n error: '#ef4444',\n warning: '#f59e0b',\n success: '#10b981',\n info: '#3b82f6',\n },\n fonts: {\n sans: 'system-ui, -apple-system, sans-serif',\n serif: 'Georgia, serif',\n mono: 'Menlo, monospace',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n '2xl': '3rem',\n '3xl': '4rem',\n },\n borderRadius: {\n sm: '0.125rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1)',\n },\n};\n\nexport const defaultDarkTheme: ThemeConfig = {\n colors: {\n primary: '#60a5fa',\n secondary: '#818cf8',\n accent: '#f472b6',\n background: '#111827',\n surface: '#1f2937',\n text: '#f9fafb',\n textMuted: '#9ca3af',\n border: '#374151',\n error: '#f87171',\n warning: '#fbbf24',\n success: '#34d399',\n info: '#60a5fa',\n },\n fonts: defaultLightTheme.fonts,\n spacing: defaultLightTheme.spacing,\n borderRadius: defaultLightTheme.borderRadius,\n shadows: {\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.3)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.4)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.5)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.6)',\n },\n};\n\n// ============================================================================\n// E-Commerce Theme (2026 Design Engine)\n// ============================================================================\n\nexport const ecommerce2026Theme: ThemeConfig = {\n colors: {\n primary: '#FF6B35',\n secondary: '#1A1A2E',\n accent: '#16C79A',\n background: '#FFFFFF',\n surface: '#F8F9FA',\n text: '#1A1A2E',\n textMuted: '#6B7280',\n border: '#E5E7EB',\n error: '#EF4444',\n warning: '#F59E0B',\n success: '#16C79A',\n info: '#3B82F6',\n },\n fonts: {\n sans: '\"Inter\", \"Satoshi\", system-ui, sans-serif',\n serif: '\"Playfair Display\", Georgia, serif',\n mono: '\"JetBrains Mono\", monospace',\n },\n spacing: {\n xs: '0.125rem',\n sm: '0.25rem',\n md: '0.5rem',\n lg: '1rem',\n xl: '1.5rem',\n '2xl': '2rem',\n '3xl': '3rem',\n '4xl': '4rem',\n },\n borderRadius: {\n sm: '0',\n md: '0',\n lg: '0',\n xl: '0',\n full: '9999px',\n },\n shadows: {\n sm: '0 1px 2px rgba(0,0,0,0.05)',\n md: '0 4px 6px rgba(0,0,0,0.07)',\n lg: '0 10px 15px rgba(0,0,0,0.1)',\n xl: '0 20px 25px rgba(0,0,0,0.15)',\n },\n};\n\n// ============================================================================\n// CSS Variables Generator\n// ============================================================================\n\nexport function generateCSSVariables(theme: ThemeConfig): string {\n const variables: string[] = [];\n\n // Colors\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n variables.push(` --color-${key}: ${value};`);\n }\n }\n\n // Fonts\n if (theme.fonts) {\n for (const [key, value] of Object.entries(theme.fonts)) {\n variables.push(` --font-${key}: ${value};`);\n }\n }\n\n // Spacing\n if (theme.spacing) {\n for (const [key, value] of Object.entries(theme.spacing)) {\n variables.push(` --spacing-${key}: ${value};`);\n }\n }\n\n // Border Radius\n if (theme.borderRadius) {\n for (const [key, value] of Object.entries(theme.borderRadius)) {\n variables.push(` --radius-${key}: ${value};`);\n }\n }\n\n // Shadows\n if (theme.shadows) {\n for (const [key, value] of Object.entries(theme.shadows)) {\n variables.push(` --shadow-${key}: ${value};`);\n }\n }\n\n return `:root {\\n${variables.join('\\n')}\\n}`;\n}\n\n// ============================================================================\n// Admin Styling Config\n// ============================================================================\n\nexport interface AdminStylingConfig {\n mode: StylingMode;\n theme?: ThemeConfig;\n customStyles?: string;\n componentOverrides?: Record<string, Record<string, string>>;\n}\n\nexport function createAdminStyling(config: AdminStylingConfig): string {\n const cssVars = generateCSSVariables(config.theme || defaultLightTheme);\n const componentStyles: string[] = [];\n\n // Generate component overrides\n if (config.componentOverrides) {\n for (const [selector, styles] of Object.entries(config.componentOverrides)) {\n const props = Object.entries(styles)\n .map(([k, v]) => ` ${k}: ${v};`)\n .join('\\n');\n componentStyles.push(`${selector} {\\n${props}\\n}`);\n }\n }\n\n return `\n ${cssVars}\n ${config.customStyles || ''}\n ${componentStyles.join('\\n')}\n `;\n}\n\n// ============================================================================\n// Field Styling\n// ============================================================================\n\nexport interface FieldStyling {\n wrapper?: Record<string, string>;\n label?: Record<string, string>;\n input?: Record<string, string>;\n error?: Record<string, string>;\n description?: Record<string, string>;\n}\n\nexport const defaultFieldStyling: Record<string, FieldStyling> = {\n text: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { \n display: 'block', \n marginBottom: 'var(--spacing-xs)',\n fontWeight: '500',\n color: 'var(--color-text)',\n },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n fontSize: '0.875rem',\n },\n error: {\n color: 'var(--color-error)',\n fontSize: '0.75rem',\n marginTop: 'var(--spacing-xs)',\n },\n },\n number: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n label: { display: 'block', marginBottom: 'var(--spacing-xs)', fontWeight: '500' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n },\n },\n checkbox: {\n wrapper: { display: 'flex', alignItems: 'center', gap: 'var(--spacing-sm)' },\n input: { width: '1rem', height: '1rem' },\n label: { cursor: 'pointer' },\n },\n select: {\n wrapper: { marginBottom: 'var(--spacing-md)' },\n input: {\n width: '100%',\n padding: 'var(--spacing-sm) var(--spacing-md)',\n border: '1px solid var(--color-border)',\n borderRadius: 'var(--radius-md)',\n backgroundColor: 'white',\n },\n },\n};\n","import Redis from \"ioredis\";\n\nexport interface LockoutConfig {\n maxAttempts: number;\n lockDuration: number;\n notifyUser: boolean;\n notifyAdmin: boolean;\n adminNotifyAfter: number;\n}\n\nexport interface LockoutStatus {\n locked: boolean;\n attemptsRemaining: number;\n lockedUntil?: Date;\n totalAttempts: number;\n}\n\nexport interface LockoutRecord {\n userId: string;\n attempts: number;\n lockedAt?: Date;\n lockedUntil?: Date;\n history: number[];\n}\n\nexport const DEFAULT_LOCKOUT_CONFIG: LockoutConfig = {\n maxAttempts: 5,\n lockDuration: 900000,\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n};\n\nexport class AccountLockout {\n private redis: Redis;\n private prefix: string;\n private config: LockoutConfig;\n\n constructor(\n redis: Redis,\n config: Partial<LockoutConfig> = {},\n prefix: string = \"kyro:lockout:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.config = { ...DEFAULT_LOCKOUT_CONFIG, ...config };\n }\n\n private lockKey(userId: string): string {\n return `${this.prefix}${userId}`;\n }\n\n private historyKey(userId: string): string {\n return `${this.prefix}${userId}:history`;\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (!data || Object.keys(data).length === 0) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const attempts = parseInt(data.attempts, 10);\n const lockedUntil = data.lockedUntil\n ? new Date(parseInt(data.lockedUntil, 10))\n : undefined;\n\n if (lockedUntil && lockedUntil > new Date()) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: attempts,\n };\n }\n\n if (lockedUntil && lockedUntil <= new Date()) {\n await this.unlockAccount(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const key = this.lockKey(userId);\n const historyKey = this.historyKey(userId);\n const now = Date.now();\n\n const current = await this.redis.hincrby(key, \"attempts\", 1);\n await this.redis.hset(key, \"lastAttempt\", now.toString());\n\n await this.redis.lpush(historyKey, now.toString());\n await this.redis.ltrim(historyKey, 0, 99);\n\n if (current >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n await this.redis.hset(key, {\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n await this.redis.expire(\n key,\n Math.ceil(this.config.lockDuration / 1000) + 3600,\n );\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: current,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - current),\n totalAttempts: current,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const key = this.lockKey(userId);\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const pipeline = this.redis.pipeline();\n pipeline.hset(key, {\n attempts: this.config.maxAttempts.toString(),\n lockedAt: now.toString(),\n lockedUntil: lockedUntil.getTime().toString(),\n });\n pipeline.expire(key, Math.ceil(lockDuration / 1000) + 3600);\n await pipeline.exec();\n }\n\n async unlockAccount(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n await this.redis.del(key);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const key = this.lockKey(userId);\n const data = await this.redis.hgetall(key);\n\n if (data.lockedAt) {\n await this.redis.hset(key, {\n attempts: \"0\",\n lockedAt: \"\",\n lockedUntil: \"\",\n });\n } else {\n await this.redis.del(key);\n }\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, limit - 1);\n return timestamps.map((ts) => new Date(parseInt(ts, 10)));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const historyKey = this.historyKey(userId);\n const timestamps = await this.redis.lrange(historyKey, 0, -1);\n\n const lockouts = timestamps.filter((_, i) => {\n const attemptNum = i + 1;\n return attemptNum % this.config.maxAttempts === 0;\n }).length;\n\n const lastLockoutData = await this.redis.hget(\n this.lockKey(userId),\n \"lockedAt\",\n );\n\n return {\n totalFailedAttempts: timestamps.length,\n lockoutCount: lockouts,\n lastLockout: lastLockoutData\n ? new Date(parseInt(lastLockoutData, 10))\n : null,\n averageAttemptsBeforeLockout: lockouts > 0 ? this.config.maxAttempts : 0,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n","import Redis from \"ioredis\";\n\nexport interface RateLimitConfig {\n window: number;\n max: number;\n}\n\nexport interface RateLimitResult {\n allowed: boolean;\n remaining: number;\n resetAt: number;\n retryAfter?: number;\n}\n\nexport const DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n\nexport class RateLimiter {\n private redis: Redis;\n private prefix: string;\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n redis: Redis,\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n prefix: string = \"kyro:ratelimit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${this.prefix}${type}:${identifier}`;\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n const pipeline = this.redis.pipeline();\n pipeline.zremrangebyscore(key, 0, windowStart);\n pipeline.zcard(key);\n pipeline.zadd(key, now, `${now}:${Math.random()}`);\n pipeline.expire(key, Math.ceil(config.window / 1000) + 1);\n\n const results = await pipeline.exec();\n const count = (results?.[1]?.[1] as number) || 0;\n\n if (count >= config.max) {\n const oldestTimestamp = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n const resetAt =\n oldestTimestamp.length > 1\n ? parseInt(oldestTimestamp[1], 10) + config.window\n : now + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n await this.redis.del(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const key = this.getKey(`user:${type}:${userId}`, identifier);\n await this.redis.del(key);\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n const now = Date.now();\n const windowStart = now - config.window;\n\n await this.redis.zremrangebyscore(key, 0, windowStart);\n const count = await this.redis.zcard(key);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createRateLimitMiddleware(rateLimiter: RateLimiter) {\n return async function rateLimit(\n type: string,\n getIdentifier: (req: Request) => string,\n checkUser: boolean = false,\n getUserId?: (req: Request) => string,\n ) {\n return async (req: Request): Promise<RateLimitResult> => {\n const identifier = getIdentifier(req);\n\n if (checkUser && getUserId) {\n const userId = getUserId(req);\n if (userId) {\n return rateLimiter.checkUser(type, userId, identifier);\n }\n }\n\n return rateLimiter.check(type, identifier);\n };\n };\n}\n","import Redis from \"ioredis\";\nimport { randomBytes } from \"crypto\";\n\nexport type AuditAction =\n | \"login\"\n | \"logout\"\n | \"login_failed\"\n | \"register\"\n | \"verify_email\"\n | \"password_change\"\n | \"password_reset\"\n | \"password_reset_request\"\n | \"role_change\"\n | \"permission_change\"\n | \"document_create\"\n | \"document_update\"\n | \"document_delete\"\n | \"settings_change\"\n | \"user_lockout\"\n | \"user_unlock\"\n | \"user_create\"\n | \"user_update\"\n | \"user_delete\"\n | \"api_request\"\n | \"api_key_create\"\n | \"api_key_delete\"\n | \"tenant_create\"\n | \"tenant_delete\";\n\nexport interface AuditLog {\n id: string;\n timestamp: Date;\n action: AuditAction;\n userId?: string;\n userEmail?: string;\n role?: string;\n resource: string;\n resourceId?: string;\n changes?: { field: string; old: any; new: any }[];\n ipAddress?: string;\n userAgent?: string;\n success: boolean;\n error?: string;\n metadata?: Record<string, any>;\n}\n\nexport interface AuditLogFilter {\n userId?: string;\n action?: AuditAction | AuditAction[];\n resource?: string;\n resourceId?: string;\n success?: boolean;\n startDate?: Date;\n endDate?: Date;\n limit?: number;\n offset?: number;\n}\n\nexport interface AuditRetentionConfig {\n retentionDays: number;\n cleanupIntervalHours: number;\n}\n\nexport const DEFAULT_RETENTION_CONFIG: AuditRetentionConfig = {\n retentionDays: 30,\n cleanupIntervalHours: 24,\n};\n\nexport class AuditLogger {\n private redis: Redis;\n private prefix: string;\n private retentionDays: number;\n\n constructor(\n redis: Redis,\n retentionDays: number = 30,\n prefix: string = \"kyro:audit:\",\n ) {\n this.redis = redis;\n this.prefix = prefix;\n this.retentionDays = retentionDays;\n }\n\n async log(data: Omit<AuditLog, \"id\" | \"timestamp\">): Promise<string> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n\n const log: AuditLog = {\n ...data,\n id,\n timestamp,\n };\n\n const key = this.getKeyForDate(timestamp);\n const hashKey = `${this.prefix}log:${id}`;\n\n await this.redis.hset(hashKey, this.serializeLog(log));\n await this.redis.expire(hashKey, this.retentionDays * 24 * 60 * 60 + 3600);\n\n await this.redis.zadd(key, timestamp.getTime(), id);\n await this.redis.expire(key, this.retentionDays * 24 * 60 * 60 + 3600);\n\n const userIndex = data.userId ? `${this.prefix}user:${data.userId}` : null;\n if (userIndex) {\n await this.redis.zadd(userIndex, timestamp.getTime(), id);\n await this.redis.expire(\n userIndex,\n this.retentionDays * 24 * 60 * 60 + 3600,\n );\n }\n\n return id;\n }\n\n async get(id: string): Promise<AuditLog | null> {\n const hashKey = `${this.prefix}log:${id}`;\n const data = await this.redis.hgetall(hashKey);\n\n if (!data || Object.keys(data).length === 0) {\n return null;\n }\n\n return this.deserializeLog(data);\n }\n\n async query(filter: AuditLogFilter = {}): Promise<{\n logs: AuditLog[];\n total: number;\n }> {\n const { limit = 50, offset = 0 } = filter;\n\n let keys: string[] = [];\n\n if (filter.userId) {\n keys.push(`${this.prefix}user:${filter.userId}`);\n } else if (filter.startDate || filter.endDate) {\n keys = this.getKeysForDateRange(filter.startDate, filter.endDate);\n } else {\n const now = new Date();\n keys = this.getKeysForDateRange(\n new Date(now.getTime() - this.retentionDays * 24 * 60 * 60 * 1000),\n now,\n );\n }\n\n let idScores: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n idScores.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n idScores.sort((a, b) => b[1] - a[1]);\n\n const total = idScores.length;\n idScores = idScores.slice(offset, offset + limit);\n\n const logs: AuditLog[] = [];\n for (const [id] of idScores) {\n const log = await this.get(id);\n if (log) {\n if (this.matchesFilter(log, filter)) {\n logs.push(log);\n }\n }\n }\n\n return { logs, total };\n }\n\n async getRecent(limit: number = 50): Promise<AuditLog[]> {\n const logs: AuditLog[] = [];\n const now = new Date();\n const keys = this.getKeysForDateRange(\n new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000),\n now,\n );\n\n let allIds: [string, number][] = [];\n\n for (const key of keys) {\n const items = await this.redis.zrange(key, 0, -1, \"WITHSCORES\");\n for (let i = 0; i < items.length; i += 2) {\n allIds.push([items[i], parseInt(items[i + 1], 10)]);\n }\n }\n\n allIds.sort((a, b) => b[1] - a[1]);\n\n for (const [id] of allIds.slice(0, limit)) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getUserActivity(\n userId: string,\n limit: number = 50,\n ): Promise<AuditLog[]> {\n const key = `${this.prefix}user:${userId}`;\n const ids = await this.redis.zrange(key, 0, limit - 1);\n\n const logs: AuditLog[] = [];\n for (const id of ids) {\n const log = await this.get(id);\n if (log) logs.push(log);\n }\n\n return logs;\n }\n\n async getStats(\n startDate?: Date,\n endDate?: Date,\n ): Promise<{\n totalEvents: number;\n byAction: Record<string, number>;\n successRate: number;\n failedLogins: number;\n uniqueUsers: Set<string>;\n }> {\n const keys = this.getKeysForDateRange(\n startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n endDate || new Date(),\n );\n\n const byAction: Record<string, number> = {};\n let totalEvents = 0;\n let failedLogins = 0;\n let successCount = 0;\n const uniqueUsers = new Set<string>();\n\n for (const key of keys) {\n const ids = await this.redis.zrange(key, 0, -1);\n\n for (const id of ids) {\n const log = await this.get(id);\n if (log) {\n totalEvents++;\n\n byAction[log.action] = (byAction[log.action] || 0) + 1;\n\n if (log.success) {\n successCount++;\n }\n\n if (log.action === \"login_failed\") {\n failedLogins++;\n }\n\n if (log.userId) {\n uniqueUsers.add(log.userId);\n }\n }\n }\n }\n\n return {\n totalEvents,\n byAction,\n successRate: totalEvents > 0 ? successCount / totalEvents : 1,\n failedLogins,\n uniqueUsers,\n };\n }\n\n async cleanup(): Promise<number> {\n const cutoff = Date.now() - this.retentionDays * 24 * 60 * 60 * 1000;\n\n const keys = await this.redis.keys(`${this.prefix}date:*`);\n let deleted = 0;\n\n for (const key of keys) {\n const timestamp = await this.redis.zrangebyscore(key, 0, cutoff);\n\n for (const id of timestamp) {\n await this.redis.del(`${this.prefix}log:${id}`);\n deleted++;\n }\n\n await this.redis.zremrangebyscore(key, 0, cutoff);\n }\n\n return deleted;\n }\n\n private getKeyForDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${this.prefix}date:${year}-${month}-${day}`;\n }\n\n private getKeysForDateRange(start?: Date, end?: Date): string[] {\n const keys: string[] = [];\n const startDate =\n start || new Date(Date.now() - this.retentionDays * 24 * 60 * 60 * 1000);\n const endDate = end || new Date();\n\n const current = new Date(startDate);\n while (current <= endDate) {\n keys.push(this.getKeyForDate(current));\n current.setDate(current.getDate() + 1);\n }\n\n return keys;\n }\n\n private matchesFilter(log: AuditLog, filter: AuditLogFilter): boolean {\n if (filter.action) {\n const actions = Array.isArray(filter.action)\n ? filter.action\n : [filter.action];\n if (!actions.includes(log.action)) return false;\n }\n\n if (filter.resource && log.resource !== filter.resource) return false;\n\n if (filter.resourceId && log.resourceId !== filter.resourceId) return false;\n\n if (filter.success !== undefined && log.success !== filter.success)\n return false;\n\n return true;\n }\n\n private serializeLog(log: AuditLog): Record<string, string> {\n const result: Record<string, string> = {\n id: log.id,\n timestamp: log.timestamp.toISOString(),\n action: log.action,\n resource: log.resource,\n success: log.success ? \"1\" : \"0\",\n };\n\n if (log.userId) result.userId = log.userId;\n if (log.userEmail) result.userEmail = log.userEmail;\n if (log.role) result.role = log.role;\n if (log.resourceId) result.resourceId = log.resourceId;\n if (log.ipAddress) result.ipAddress = log.ipAddress;\n if (log.userAgent) result.userAgent = log.userAgent;\n if (log.error) result.error = log.error;\n if (log.changes) result.changes = JSON.stringify(log.changes);\n if (log.metadata) result.metadata = JSON.stringify(log.metadata);\n\n return result;\n }\n\n private deserializeLog(data: Record<string, string>): AuditLog {\n return {\n id: data.id,\n timestamp: new Date(data.timestamp),\n action: data.action as AuditAction,\n userId: data.userId,\n userEmail: data.userEmail,\n role: data.role,\n resource: data.resource,\n resourceId: data.resourceId,\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n success: data.success === \"1\",\n error: data.error,\n changes: data.changes ? JSON.parse(data.changes) : undefined,\n metadata: data.metadata ? JSON.parse(data.metadata) : undefined,\n };\n }\n}\n\nexport function createAuditContext(req: Request): {\n ipAddress: string;\n userAgent: string;\n} {\n return {\n ipAddress:\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ||\n req.headers.get(\"x-real-ip\") ||\n \"unknown\",\n userAgent: req.headers.get(\"user-agent\") || \"unknown\",\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type { AuthAdapter, AuthUser, Session, UserRole } from \"./types.js\";\n\nexport class InMemoryAuthAdapter implements AuthAdapter {\n private users: Map<string, AuthUser> = new Map();\n private sessions: Map<string, Session> = new Map();\n private refreshTokens: Map<string, string> = new Map(); // refreshToken -> sessionId\n private emailToUserId: Map<string, string> = new Map();\n private passwordHistory: Map<string, string[]> = new Map(); // userId -> passwordHash[]\n private externalDb: boolean = false;\n\n constructor() {}\n\n async connect(): Promise<void> {\n // No connection needed for in-memory adapter\n }\n\n async disconnect(): Promise<void> {\n // No disconnection needed for in-memory adapter\n this.users.clear();\n this.sessions.clear();\n this.refreshTokens.clear();\n this.emailToUserId.clear();\n this.passwordHistory.clear();\n }\n\n async createUser(data: {\n email: string;\n passwordHash: string;\n role?: UserRole;\n tenantId?: string;\n }): Promise<AuthUser> {\n const userId = randomBytes(16).toString(\"hex\");\n const now = new Date().toISOString();\n\n const user: AuthUser = {\n id: userId,\n email: data.email.toLowerCase(),\n passwordHash: data.passwordHash,\n role: (data.role || \"customer\") as UserRole,\n tenantId: data.tenantId,\n createdAt: now,\n updatedAt: now,\n };\n\n this.users.set(userId, user);\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n this.passwordHistory.set(userId, []);\n\n return user;\n }\n\n async findUserByEmail(email: string): Promise<AuthUser | null> {\n const userId = this.emailToUserId.get(email.toLowerCase());\n if (!userId) return null;\n return this.findUserById(userId);\n }\n\n async findUserById(userId: string): Promise<AuthUser | null> {\n return this.users.get(userId) || null;\n }\n\n async updateUser(\n userId: string,\n data: Partial<AuthUser>,\n ): Promise<AuthUser | null> {\n const existing = await this.findUserById(userId);\n if (!existing) return null;\n\n const updated: AuthUser = {\n ...existing,\n ...data,\n id: userId,\n updatedAt: new Date().toISOString(),\n };\n\n // Handle email change\n if (data.email && data.email !== existing.email) {\n this.emailToUserId.delete(existing.email.toLowerCase());\n this.emailToUserId.set(data.email.toLowerCase(), userId);\n }\n\n this.users.set(userId, updated);\n return updated;\n }\n\n async deleteUser(userId: string): Promise<boolean> {\n const user = await this.findUserById(userId);\n if (!user) return false;\n\n this.users.delete(userId);\n this.emailToUserId.delete(user.email.toLowerCase());\n this.refreshTokens.forEach((sessionId, refreshToken) => {\n if (this.sessions.get(sessionId)?.userId === userId) {\n this.refreshTokens.delete(refreshToken);\n this.sessions.delete(sessionId);\n }\n });\n this.passwordHistory.delete(userId);\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n this.sessions.delete(sessionId);\n }\n });\n\n return true;\n }\n\n async hashPassword(password: string): Promise<string> {\n const bcrypt = (await import(\"bcryptjs\")).default;\n return bcrypt.hash(password, 12);\n }\n\n async verifyPassword(password: string, hash: string): Promise<boolean> {\n const bcrypt = (await import(\"bcryptjs\")).default;\n return bcrypt.compare(password, hash);\n }\n\n async createSession(\n userId: string,\n data: {\n ipAddress?: string;\n userAgent?: string;\n } = {},\n ): Promise<Session> {\n const sessionId = randomBytes(32).toString(\"hex\");\n const token = randomBytes(32).toString(\"base64url\");\n const refreshToken = randomBytes(32).toString(\"base64url\");\n const now = new Date();\n\n const session: Session = {\n id: sessionId,\n userId,\n token,\n refreshToken,\n expiresAt: new Date(now.getTime() + 86400 * 1000).toISOString(), // 24 hours\n createdAt: now.toISOString(),\n ipAddress: data.ipAddress,\n userAgent: data.userAgent,\n };\n\n this.sessions.set(sessionId, session);\n this.refreshTokens.set(refreshToken, sessionId);\n\n return session;\n }\n\n async findSessionByToken(token: string): Promise<Session | null> {\n return this.sessions.get(token) || null;\n }\n\n async deleteSession(sessionId: string): Promise<boolean> {\n const session = this.sessions.get(sessionId);\n if (!session) return false;\n\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n return true;\n }\n\n async deleteUserSessions(userId: string): Promise<number> {\n let deleted = 0;\n this.sessions.forEach((session, sessionId) => {\n if (session.userId === userId) {\n if (session.refreshToken) {\n this.refreshTokens.delete(session.refreshToken);\n }\n this.sessions.delete(sessionId);\n deleted++;\n }\n });\n return deleted;\n }\n\n async addPasswordToHistory(\n userId: string,\n passwordHash: string,\n ): Promise<void> {\n const history = this.passwordHistory.get(userId) || [];\n history.push(passwordHash);\n // Keep only last 5 passwords\n if (history.length > 5) {\n history.splice(0, history.length - 5);\n }\n this.passwordHistory.set(userId, history);\n }\n\n async getPasswordHistory(\n userId: string,\n count: number = 5,\n ): Promise<string[]> {\n return this.passwordHistory.get(userId) || [];\n }\n\n async isPasswordInHistory(\n password: string,\n userId: string,\n historyCount: number = 5,\n ): Promise<boolean> {\n const history = await this.getPasswordHistory(userId, historyCount);\n const bcrypt = (await import(\"bcryptjs\")).default;\n\n for (const hash of history) {\n if (await bcrypt.compare(password, hash)) {\n return true;\n }\n }\n return false;\n }\n\n async hasAnyUsers(): Promise<boolean> {\n return this.users.size > 0;\n }\n}\n\nexport function createInMemoryAuthAdapter() {\n return new InMemoryAuthAdapter();\n}\n","import type { RateLimitConfig, RateLimitResult } from \"./rate-limit.js\";\n\nexport class InMemoryRateLimiter {\n private storage: Map<string, { timestamp: number; count: number }[]> =\n new Map();\n private userStorage: Map<\n string,\n Map<string, { timestamp: number; count: number }[]>\n > = new Map();\n private limits: Record<string, RateLimitConfig>;\n private userLimits: Record<string, RateLimitConfig>;\n\n constructor(\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n ) {\n this.limits = { ...DEFAULT_RATE_LIMITS, ...limits };\n this.userLimits = userLimits || {\n \"user:api\": { window: 60000, max: 500 },\n \"user:write\": { window: 3600000, max: 100 },\n };\n }\n\n private getKey(type: string, identifier: string): string {\n return `${type}:${identifier}`;\n }\n\n private getUserKey(type: string, userId: string, identifier: string): string {\n return `user:${type}:${userId}:${identifier}`;\n }\n\n private cleanupOldEntries(\n entries: { timestamp: number; count: number }[],\n window: number,\n ): void {\n const now = Date.now();\n const windowStart = now - window;\n\n // Remove entries older than the window\n while (entries.length > 0 && entries[0].timestamp < windowStart) {\n entries.shift();\n }\n }\n\n async check(type: string, identifier: string): Promise<RateLimitResult> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n let entries = this.storage.get(key);\n if (!entries) {\n entries = [];\n this.storage.set(key, entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n // Add current request\n entries.push({ timestamp: now, count: 1 });\n\n if (count >= config.max) {\n // Find the oldest entry in window to calculate reset time\n const oldestEntry = entries.reduce(\n (oldest, current) =>\n oldest.timestamp < current.timestamp ? oldest : current,\n entries[0],\n );\n\n const resetAt = oldestEntry.timestamp + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async checkUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<RateLimitResult> {\n const config = this.userLimits[type] || this.userLimits[\"user:api\"];\n const userMap = this.userStorage.get(userId);\n let entries: { timestamp: number; count: number }[] = [];\n\n if (userMap) {\n entries = userMap.get(this.getKey(type, identifier)) || [];\n } else {\n // Initialize user storage if not exists\n if (!this.userStorage.has(userId)) {\n this.userStorage.set(userId, new Map());\n }\n this.userStorage.get(userId)!.set(this.getKey(type, identifier), entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n // Add current request\n entries.push({ timestamp: now, count: 1 });\n\n if (count >= config.max) {\n // Find the oldest entry in window to calculate reset time\n const oldestEntry = entries.reduce(\n (oldest, current) =>\n oldest.timestamp < current.timestamp ? oldest : current,\n entries[0],\n );\n\n const resetAt = oldestEntry.timestamp + config.window;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt,\n retryAfter: Math.ceil((resetAt - now) / 1000),\n };\n }\n\n return {\n allowed: true,\n remaining: config.max - count - 1,\n resetAt: now + config.window,\n };\n }\n\n async reset(type: string, identifier: string): Promise<void> {\n const key = this.getKey(type, identifier);\n this.storage.delete(key);\n }\n\n async resetUser(\n type: string,\n userId: string,\n identifier: string,\n ): Promise<void> {\n const userMap = this.userStorage.get(userId);\n if (userMap) {\n const key = this.getKey(type, identifier);\n userMap.delete(key);\n }\n }\n\n async getStatus(\n type: string,\n identifier: string,\n ): Promise<{\n count: number;\n limit: number;\n remaining: number;\n resetAt: number;\n }> {\n const config = this.limits[type] || this.limits[\"api:general\"];\n const key = this.getKey(type, identifier);\n\n let entries = this.storage.get(key);\n if (!entries) {\n entries = [];\n this.storage.set(key, entries);\n }\n\n this.cleanupOldEntries(entries, config.window);\n\n const now = Date.now();\n const count = entries.reduce((sum, entry) => sum + entry.count, 0);\n\n return {\n count,\n limit: config.max,\n remaining: Math.max(0, config.max - count),\n resetAt: now + config.window,\n };\n }\n\n setLimit(type: string, config: RateLimitConfig): void {\n this.limits[type] = config;\n }\n\n setUserLimit(type: string, config: RateLimitConfig): void {\n this.userLimits[type] = config;\n }\n}\n\nexport function createInMemoryRateLimiter(\n limits?: Record<string, RateLimitConfig>,\n userLimits?: Record<string, RateLimitConfig>,\n) {\n return new InMemoryRateLimiter(limits, userLimits);\n}\n\nconst DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig> = {\n \"auth:login\": { window: 900000, max: 5 },\n \"auth:register\": { window: 3600000, max: 3 },\n \"auth:forgot\": { window: 3600000, max: 3 },\n \"auth:reset\": { window: 3600000, max: 5 },\n \"auth:verify\": { window: 3600000, max: 5 },\n \"api:general\": { window: 60000, max: 100 },\n \"api:authenticated\": { window: 60000, max: 200 },\n};\n","import type { LockoutConfig, LockoutStatus } from \"./lockout.js\";\n\nexport class InMemoryAccountLockout {\n private storage: Map<\n string,\n {\n attempts: number;\n lastAttempt: number | null;\n lockedAt: number | null;\n lockedUntil: number | null;\n }\n > = new Map();\n private history: Map<string, number[]> = new Map(); // userId -> attempt timestamps\n private config: LockoutConfig;\n\n constructor(config: Partial<LockoutConfig> = {}) {\n this.config = {\n maxAttempts: 5,\n lockDuration: 900000, // 15 minutes\n notifyUser: true,\n notifyAdmin: true,\n adminNotifyAfter: 3,\n ...config,\n };\n }\n\n async checkLockout(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId);\n\n // Clear expired locks\n if (record && record.lockedUntil !== null && record.lockedUntil <= now) {\n await this.resetAttempts(userId);\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n if (!record) {\n return {\n locked: false,\n attemptsRemaining: this.config.maxAttempts,\n totalAttempts: 0,\n };\n }\n\n const { attempts, lockedUntil } = record;\n\n if (lockedUntil !== null && lockedUntil > now) {\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil: new Date(lockedUntil),\n totalAttempts: attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - attempts),\n totalAttempts: attempts,\n };\n }\n\n async recordFailedAttempt(userId: string): Promise<LockoutStatus> {\n const now = Date.now();\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts += 1;\n record.lastAttempt = now;\n\n // Add to history\n let history = this.history.get(userId) || [];\n history.push(now);\n // Keep only last 100 attempts\n if (history.length > 100) {\n history.splice(0, history.length - 100);\n }\n this.history.set(userId, history);\n\n this.storage.set(userId, record);\n\n // Check if we should lock the account\n if (record.attempts >= this.config.maxAttempts) {\n const lockedUntil = new Date(now + this.config.lockDuration);\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n\n return {\n locked: true,\n attemptsRemaining: 0,\n lockedUntil,\n totalAttempts: record.attempts,\n };\n }\n\n return {\n locked: false,\n attemptsRemaining: Math.max(0, this.config.maxAttempts - record.attempts),\n totalAttempts: record.attempts,\n };\n }\n\n async lockAccount(userId: string, duration?: number): Promise<void> {\n const now = Date.now();\n const lockDuration = duration || this.config.lockDuration;\n const lockedUntil = new Date(now + lockDuration);\n\n const record = this.storage.get(userId) || {\n attempts: 0,\n lastAttempt: null,\n lockedAt: null,\n lockedUntil: null,\n };\n\n record.attempts = this.config.maxAttempts;\n record.lockedAt = now;\n record.lockedUntil = lockedUntil.getTime();\n this.storage.set(userId, record);\n }\n\n async unlockAccount(userId: string): Promise<void> {\n await this.resetAttempts(userId);\n }\n\n async resetAttempts(userId: string): Promise<void> {\n const record = this.storage.get(userId);\n if (record) {\n record.attempts = 0;\n record.lockedAt = null;\n record.lockedUntil = null;\n this.storage.set(userId, record);\n }\n\n // Clear history for this user\n this.history.delete(userId);\n }\n\n async getLockoutHistory(userId: string, limit: number = 10): Promise<Date[]> {\n const history = this.history.get(userId) || [];\n return history\n .slice(-limit)\n .reverse()\n .map((timestamp) => new Date(timestamp));\n }\n\n async getLockoutStats(userId: string): Promise<{\n totalFailedAttempts: number;\n lockoutCount: number;\n lastLockout: Date | null;\n averageAttemptsBeforeLockout: number;\n }> {\n const history = this.history.get(userId) || [];\n const totalFailedAttempts = history.length;\n const lockoutCount = Math.floor(\n totalFailedAttempts / this.config.maxAttempts,\n );\n\n let lastLockout: Date | null = null;\n const record = this.storage.get(userId);\n if (record && record.lockedAt !== null) {\n lastLockout = new Date(record.lockedAt);\n }\n\n // Average attempts before lockout is just the threshold for simplicity\n const averageAttemptsBeforeLockout =\n lockoutCount > 0 ? this.config.maxAttempts : 0;\n\n return {\n totalFailedAttempts,\n lockoutCount,\n lastLockout,\n averageAttemptsBeforeLockout,\n };\n }\n\n shouldNotifyAdmin(currentAttempts: number): boolean {\n return (\n this.config.notifyAdmin && currentAttempts >= this.config.adminNotifyAfter\n );\n }\n\n getConfig(): LockoutConfig {\n return { ...this.config };\n }\n\n setConfig(config: Partial<LockoutConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\nexport function createInMemoryAccountLockout(\n config: Partial<LockoutConfig> = {},\n) {\n return new InMemoryAccountLockout(config);\n}\n","import { randomBytes } from \"crypto\";\nimport type { AuditLog, AuditAction, AuditLogFilter } from \"./audit-log.js\";\nimport { DEFAULT_RETENTION_CONFIG } from \"./audit-log.js\";\n\nexport class InMemoryAuditLogger {\n private logs: AuditLog[] = [];\n private retentionDays: number;\n\n constructor(retentionDays: number = DEFAULT_RETENTION_CONFIG.retentionDays) {\n this.retentionDays = retentionDays;\n }\n\n async log(data: Omit<AuditLog, \"id\" | \"timestamp\">): Promise<string> {\n const id = randomBytes(16).toString(\"hex\");\n const timestamp = new Date();\n\n const log: AuditLog = {\n ...data,\n id,\n timestamp,\n };\n\n this.logs.push(log);\n this.cleanupOldLogs();\n\n return id;\n }\n\n async get(id: string): Promise<AuditLog | null> {\n return this.logs.find((log) => log.id === id) || null;\n }\n\n async query(filter: AuditLogFilter = {}): Promise<{\n logs: AuditLog[];\n total: number;\n }> {\n const { limit = 50, offset = 0 } = filter;\n\n let filteredLogs = [...this.logs]; // Create a copy to avoid modifying original\n\n if (filter.userId) {\n filteredLogs = filteredLogs.filter((log) => log.userId === filter.userId);\n }\n\n if (filter.action) {\n const actions = Array.isArray(filter.action)\n ? filter.action\n : [filter.action];\n filteredLogs = filteredLogs.filter((log) => actions.includes(log.action));\n }\n\n if (filter.resource) {\n filteredLogs = filteredLogs.filter(\n (log) => log.resource === filter.resource,\n );\n }\n\n if (filter.resourceId) {\n filteredLogs = filteredLogs.filter(\n (log) => log.resourceId === filter.resourceId,\n );\n }\n\n if (filter.success !== undefined) {\n filteredLogs = filteredLogs.filter(\n (log) => log.success === filter.success,\n );\n }\n\n const startDate = filter.startDate;\n const endDate = filter.endDate;\n\n if (startDate !== undefined) {\n filteredLogs = filteredLogs.filter((log) => log.timestamp >= startDate);\n }\n\n if (endDate !== undefined) {\n filteredLogs = filteredLogs.filter((log) => log.timestamp <= endDate);\n }\n\n // Sort by timestamp descending (newest first)\n filteredLogs.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n\n const total = filteredLogs.length;\n const paginatedLogs = filteredLogs.slice(offset, offset + limit);\n\n return { logs: paginatedLogs, total };\n }\n\n async getRecent(limit: number = 50): Promise<AuditLog[]> {\n const cutoffDate = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); // Last 7 days\n\n const recentLogs = this.logs\n .filter((log) => log.timestamp >= cutoffDate)\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n .slice(0, limit);\n\n return recentLogs;\n }\n\n async getUserActivity(\n userId: string,\n limit: number = 50,\n ): Promise<AuditLog[]> {\n const userLogs = this.logs\n .filter((log) => log.userId === userId)\n .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n .slice(0, limit);\n\n return userLogs;\n }\n\n async getStats(\n startDate?: Date,\n endDate?: Date,\n ): Promise<{\n totalEvents: number;\n byAction: Record<string, number>;\n successRate: number;\n failedLogins: number;\n uniqueUsers: Set<string>;\n }> {\n const start = startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // Last 30 days\n const end = endDate || new Date();\n\n const filteredLogs = this.logs.filter(\n (log) => log.timestamp >= start && log.timestamp <= end,\n );\n\n const byAction: Record<string, number> = {};\n let totalEvents = 0;\n let failedLogins = 0;\n let successCount = 0;\n const uniqueUsers = new Set<string>();\n\n for (const log of filteredLogs) {\n totalEvents++;\n\n const action = log.action;\n byAction[action] = (byAction[action] || 0) + 1;\n\n if (log.success) {\n successCount++;\n }\n\n if (log.action === \"login_failed\") {\n failedLogins++;\n }\n\n if (log.userId) {\n uniqueUsers.add(log.userId);\n }\n }\n\n return {\n totalEvents,\n byAction,\n successRate: totalEvents > 0 ? successCount / totalEvents : 1,\n failedLogins,\n uniqueUsers,\n };\n }\n\n async cleanup(): Promise<number> {\n const cutoffDate = new Date(\n Date.now() - this.retentionDays * 24 * 60 * 60 * 1000,\n );\n const initialCount = this.logs.length;\n\n this.logs = this.logs.filter((log) => log.timestamp >= cutoffDate);\n\n return initialCount - this.logs.length;\n }\n\n private cleanupOldLogs(): void {\n // This is called automatically after each log entry\n // In a production system, you might want to run this less frequently\n const cutoffDate = new Date(\n Date.now() - this.retentionDays * 24 * 60 * 60 * 1000,\n );\n const initialCount = this.logs.length;\n\n this.logs = this.logs.filter((log) => log.timestamp >= cutoffDate);\n }\n}\n\nexport function createInMemoryAuditLogger(\n retentionDays: number = DEFAULT_RETENTION_CONFIG.retentionDays,\n) {\n return new InMemoryAuditLogger(retentionDays);\n}\n\nexport function createAuditContext(req: Request): {\n ipAddress: string;\n userAgent: string;\n} {\n return {\n ipAddress:\n req.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ||\n req.headers.get(\"x-real-ip\") ||\n \"unknown\",\n userAgent: req.headers.get(\"user-agent\") || \"unknown\",\n };\n}\n","import jwt from \"jsonwebtoken\";\nimport type { AuthUser, JWTPayload } from \"../../auth/types.js\";\nimport type { TenantContext } from \"../../auth/rls/tenant.js\";\n\nexport interface AuthMiddlewareConfig {\n secret: string;\n issuer?: string;\n audience?: string;\n extractToken?: (req: Request) => string | null;\n}\n\nexport interface AuthenticatedContext {\n user?: AuthUser;\n token?: string;\n tenantContext?: TenantContext;\n}\n\nexport interface AuthMiddlewareResult {\n user?: Partial<AuthUser>;\n token?: string;\n tenantContext?: TenantContext;\n error?: string;\n status: number;\n}\n\nexport function createAuthMiddleware(config: AuthMiddlewareConfig) {\n const {\n secret,\n issuer,\n audience,\n extractToken = defaultExtractToken,\n } = config;\n\n return async function authMiddleware(\n req: Request,\n ): Promise<AuthMiddlewareResult> {\n const token = extractToken(req);\n\n if (!token) {\n return {\n status: 401,\n error: \"No authentication token provided\",\n };\n }\n\n try {\n const payload = jwt.verify(token, secret, {\n issuer,\n audience,\n }) as JWTPayload;\n\n const user: Partial<AuthUser> = {\n id: payload.sub,\n email: payload.email,\n role: payload.role,\n tenantId: payload.tenantId,\n };\n\n return {\n user,\n token,\n tenantContext: createTenantContextFromUser(user),\n status: 200,\n };\n } catch (error) {\n if (error instanceof jwt.TokenExpiredError) {\n return {\n status: 401,\n error: \"Token has expired\",\n };\n }\n\n if (error instanceof jwt.JsonWebTokenError) {\n return {\n status: 401,\n error: \"Invalid token\",\n };\n }\n\n return {\n status: 401,\n error: \"Authentication failed\",\n };\n }\n };\n}\n\nexport function defaultExtractToken(req: Request): string | null {\n const authHeader = req.headers.get(\"Authorization\");\n if (authHeader?.startsWith(\"Bearer \")) {\n return authHeader.slice(7);\n }\n\n const cookieHeader = req.headers.get(\"Cookie\");\n if (cookieHeader) {\n const cookies = Object.fromEntries(\n cookieHeader.split(\"; \").map((c) => {\n const [key, ...val] = c.split(\"=\");\n return [key.trim(), val.join(\"=\")];\n }),\n );\n return cookies[\"auth_token\"] || null;\n }\n\n return null;\n}\n\nexport function createTenantContextFromUser(\n user: Partial<AuthUser>,\n): TenantContext {\n return {\n tenantId: user.tenantId || \"default\",\n userId: user.id || \"anonymous\",\n role: user.role || \"guest\",\n roles: [user.role || \"guest\"],\n permissions: [],\n isSuperAdmin: user.role === \"super_admin\",\n };\n}\n\nexport function generateToken(\n payload: JWTPayload,\n secret: string,\n options: {\n expiresIn?: string | number;\n issuer?: string;\n audience?: string;\n } = {},\n): string {\n return jwt.sign(payload, secret, {\n expiresIn: (options.expiresIn || \"24h\") as jwt.SignOptions[\"expiresIn\"],\n issuer: options.issuer,\n audience: options.audience,\n });\n}\n\nexport function verifyToken(\n token: string,\n secret: string,\n options: {\n issuer?: string;\n audience?: string;\n } = {},\n): JWTPayload | null {\n try {\n return jwt.verify(token, secret, options) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function decodeToken(token: string): JWTPayload | null {\n try {\n return jwt.decode(token) as JWTPayload;\n } catch {\n return null;\n }\n}\n\nexport function isTokenExpiringSoon(\n token: string,\n secret: string,\n thresholdMinutes: number = 30,\n): boolean {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return true;\n }\n\n const expirationTime = payload.exp * 1000;\n const thresholdTime = Date.now() + thresholdMinutes * 60 * 1000;\n\n return expirationTime < thresholdTime;\n}\n\nexport function getTokenExpiration(token: string, secret: string): Date | null {\n const payload = decodeToken(token);\n if (!payload || !payload.exp) {\n return null;\n }\n\n return new Date(payload.exp * 1000);\n}\n\nexport function extractUserFromRequest(\n req: Request,\n config: AuthMiddlewareConfig,\n): Promise<AuthMiddlewareResult> {\n const middleware = createAuthMiddleware(config);\n return middleware(req);\n}\n","import jwt from \"jsonwebtoken\";\nimport { randomBytes } from \"crypto\";\nimport type { AuthAdapter } from \"../../auth/types.js\";\nimport { EmailTransport } from \"../../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../../auth/security/password-policy.js\";\nimport { InMemoryAccountLockout } from \"../../auth/security/in-memory-lockout.js\";\nimport { InMemoryRateLimiter } from \"../../auth/security/in-memory-rate-limit.js\";\nimport {\n InMemoryAuditLogger,\n createAuditContext,\n} from \"../../auth/security/in-memory-audit-log.js\";\nimport type { AuditAction } from \"../../auth/security/audit-log.js\";\nimport { generateToken, defaultExtractToken } from \"./auth-middleware.js\";\nimport type {\n AuthUser,\n JWTPayload,\n LoginCredentials,\n RegisterData,\n AuthResult,\n Session,\n} from \"../../auth/types.js\";\n\nexport interface AuthRoutesConfig {\n redis: AuthAdapter;\n email?: EmailTransport;\n jwtSecret: string;\n jwtExpiresIn?: string;\n jwtIssuer?: string;\n jwtAudience?: string;\n passwordPolicy?: PasswordPolicy;\n lockout?: InMemoryAccountLockout;\n rateLimiter?: InMemoryRateLimiter;\n auditLogger?: InMemoryAuditLogger;\n baseUrl?: string;\n emailVerificationRequired?: boolean;\n}\n\nexport class AuthRoutes {\n private authAdapter: AuthAdapter;\n private email?: EmailTransport;\n private jwtSecret: string;\n private jwtExpiresIn: string;\n private jwtIssuer?: string;\n private jwtAudience?: string;\n private passwordPolicy: PasswordPolicy;\n private lockout?: InMemoryAccountLockout;\n private rateLimiter?: InMemoryRateLimiter;\n private auditLogger?: InMemoryAuditLogger;\n private baseUrl: string;\n private emailVerificationRequired: boolean;\n\n constructor(config: AuthRoutesConfig) {\n this.authAdapter = config.redis;\n this.email = config.email;\n this.jwtSecret = config.jwtSecret;\n this.jwtExpiresIn = config.jwtExpiresIn || \"24h\";\n this.jwtIssuer = config.jwtIssuer;\n this.jwtAudience = config.jwtAudience;\n this.passwordPolicy = config.passwordPolicy || new PasswordPolicy();\n this.lockout = config.lockout;\n this.rateLimiter = config.rateLimiter;\n this.auditLogger = config.auditLogger;\n this.baseUrl = config.baseUrl || \"http://localhost:3000\";\n this.emailVerificationRequired = config.emailVerificationRequired ?? true;\n }\n\n async register(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:register\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as RegisterData & {\n confirmPassword?: string;\n };\n\n if (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n if (body.password !== body.confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(body.password);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const existingUser = await this.authAdapter.findUserByEmail(body.email);\n if (existingUser) {\n return this.errorResponse(\"Email already registered\", 400);\n }\n\n const passwordHash = await this.authAdapter.hashPassword(body.password);\n const user = await this.authAdapter.createUser({\n email: body.email,\n passwordHash,\n role: body.role || \"customer\",\n tenantId: body.tenantId,\n });\n\n if (this.emailVerificationRequired && this.email) {\n const verificationToken = randomBytes(32).toString(\"hex\");\n const verificationUrl = `${this.baseUrl}/api/auth/verify?token=${verificationToken}`;\n\n await this.authAdapter.createSession(user.id, { ipAddress, userAgent });\n const template = this.email\n .getTemplates()\n .verifyEmail(verificationUrl, body.email);\n await this.email.send({ to: body.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"register\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse(\n {\n success: true,\n message: \"Registration successful\",\n user: this.sanitizeUser(user),\n requiresVerification: this.emailVerificationRequired && !!this.email,\n },\n 201,\n );\n } catch (error) {\n return this.errorResponse(\"Registration failed\", 500);\n }\n }\n\n async login(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:login\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as LoginCredentials;\n\n if (!body.email || !body.password) {\n return this.errorResponse(\"Email and password are required\", 400);\n }\n\n const user = await this.authAdapter.findUserByEmail(body.email);\n if (!user) {\n await this.recordFailedLogin(ipAddress, userAgent);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (this.lockout) {\n const lockoutStatus = await this.lockout.checkLockout(user.id);\n if (lockoutStatus.locked) {\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Account locked\",\n });\n }\n return this.errorResponse(\n `Account locked. Try again in ${Math.ceil((lockoutStatus.lockedUntil!.getTime() - Date.now()) / 60000)} minutes`,\n 423,\n );\n }\n }\n\n const validPassword = user.passwordHash\n ? await this.authAdapter.verifyPassword(\n body.password,\n user.passwordHash,\n )\n : false;\n if (!validPassword) {\n await this.recordFailedLogin(ipAddress, userAgent, user.id, user.email);\n return this.errorResponse(\"Invalid credentials\", 401);\n }\n\n if (this.lockout) {\n await this.lockout.resetAttempts(user.id);\n }\n\n const session = await this.authAdapter.createSession(user.id, {\n ipAddress,\n userAgent,\n });\n\n const payload: JWTPayload = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 86400,\n };\n\n const accessToken = generateToken(payload, this.jwtSecret, {\n expiresIn: this.jwtExpiresIn,\n issuer: this.jwtIssuer,\n audience: this.jwtAudience,\n });\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login\",\n userId: user.id,\n userEmail: user.email,\n role: user.role,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n await this.authAdapter.updateUser(user.id, {\n lastLogin: new Date().toISOString(),\n });\n\n return this.jsonResponse({\n success: true,\n user: this.sanitizeUser(user),\n accessToken,\n refreshToken: session.refreshToken,\n expiresIn: this.jwtExpiresIn,\n });\n } catch (error) {\n return this.errorResponse(\"Login failed\", 500);\n }\n }\n\n async logout(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"No session to logout\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const payload = jwt.decode(token) as JWTPayload;\n if (payload && payload.sub) {\n await this.authAdapter.deleteUserSessions(payload.sub);\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"logout\",\n userId: payload.sub,\n userEmail: payload.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n }\n\n return this.jsonResponse({\n success: true,\n message: \"Logged out successfully\",\n });\n } catch (error) {\n return this.errorResponse(\"Logout failed\", 500);\n }\n }\n\n async refresh(req: Request): Promise<Response> {\n try {\n const body = (await req.json()) as { refreshToken?: string };\n const { refreshToken } = body;\n\n if (!refreshToken) {\n return this.errorResponse(\"Refresh token required\", 400);\n }\n\n return this.jsonResponse({ success: true, accessToken: \"\" });\n } catch (error) {\n return this.errorResponse(\"Token refresh failed\", 500);\n }\n }\n\n async me(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n try {\n const payload = jwt.verify(token, this.jwtSecret, {\n issuer: this.jwtIssuer,\n audience: this.jwtAudience,\n }) as JWTPayload;\n\n const user = await this.authAdapter.findUserById(payload.sub);\n if (!user) {\n return this.errorResponse(\"User not found\", 404);\n }\n\n return this.jsonResponse({\n success: true,\n user: this.sanitizeUser(user),\n });\n } catch (error) {\n return this.errorResponse(\"Authentication failed\", 401);\n }\n }\n\n async changePassword(req: Request): Promise<Response> {\n const token = defaultExtractToken(req);\n if (!token) {\n return this.errorResponse(\"Not authenticated\", 401);\n }\n\n const { ipAddress, userAgent } = createAuditContext(req);\n\n try {\n const payload = jwt.verify(token, this.jwtSecret) as JWTPayload;\n const body = (await req.json()) as {\n currentPassword?: string;\n newPassword?: string;\n confirmPassword?: string;\n };\n const { currentPassword, newPassword, confirmPassword } = body;\n\n if (!currentPassword || !newPassword) {\n return this.errorResponse(\"Current and new password required\", 400);\n }\n\n if (newPassword !== confirmPassword) {\n return this.errorResponse(\"Passwords do not match\", 400);\n }\n\n const passwordValidation = this.passwordPolicy.validate(newPassword);\n if (!passwordValidation.valid) {\n return this.errorResponse(passwordValidation.errors.join(\". \"), 400);\n }\n\n const user = await this.authAdapter.findUserById(payload.sub);\n if (!user) {\n return this.errorResponse(\"User not found\", 404);\n }\n\n const validPassword = user.passwordHash\n ? await this.authAdapter.verifyPassword(\n currentPassword,\n user.passwordHash,\n )\n : false;\n if (!validPassword) {\n return this.errorResponse(\"Current password is incorrect\", 401);\n }\n\n const passwordHistory = await this.authAdapter.getPasswordHistory?.(\n user.id,\n 5,\n );\n const isReused = await this.authAdapter.isPasswordInHistory?.(\n newPassword,\n user.id,\n 5,\n );\n if (isReused) {\n return this.errorResponse(\n \"Password was recently used. Please choose a different password\",\n 400,\n );\n }\n\n const newPasswordHash = await this.authAdapter.hashPassword(newPassword);\n if (user.passwordHash) {\n await this.authAdapter.addPasswordToHistory?.(\n user.id,\n user.passwordHash,\n );\n }\n await this.authAdapter.updateUser(user.id, {\n passwordHash: newPasswordHash,\n });\n\n await this.authAdapter.deleteUserSessions(user.id);\n\n if (this.email && this.email.getTemplates) {\n const template = this.email.getTemplates().passwordChanged(user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_change\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"Password changed successfully\",\n });\n } catch (error) {\n return this.errorResponse(\"Password change failed\", 500);\n }\n }\n\n async forgotPassword(req: Request): Promise<Response> {\n const { ipAddress, userAgent } = createAuditContext(req);\n\n if (this.rateLimiter) {\n const limit = await this.rateLimiter.check(\"auth:forgot\", ipAddress);\n if (!limit.allowed) {\n return this.rateLimitResponse(limit);\n }\n }\n\n try {\n const body = (await req.json()) as { email?: string };\n const { email } = body;\n\n if (!email) {\n return this.errorResponse(\"Email required\", 400);\n }\n\n const user = await this.authAdapter.findUserByEmail(email);\n if (!user) {\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n }\n\n if (this.email) {\n const resetToken = randomBytes(32).toString(\"hex\");\n const resetUrl = `${this.baseUrl}/api/auth/reset-password?token=${resetToken}`;\n const template = this.email\n .getTemplates()\n .resetPassword(resetUrl, user.email);\n await this.email.send({ to: user.email, ...template });\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"password_reset_request\",\n userId: user.id,\n userEmail: user.email,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: true,\n });\n }\n\n return this.jsonResponse({\n success: true,\n message: \"If the email exists, a reset link has been sent\",\n });\n } catch (error) {\n return this.errorResponse(\"Password reset request failed\", 500);\n }\n }\n\n async verifyEmail(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const token = url.searchParams.get(\"token\");\n\n if (!token) {\n return this.errorResponse(\"Verification token required\", 400);\n }\n\n try {\n return this.jsonResponse({ success: true, message: \"Email verified\" });\n } catch (error) {\n return this.errorResponse(\"Email verification failed\", 500);\n }\n }\n\n private async recordFailedLogin(\n ipAddress: string,\n userAgent: string,\n userId?: string,\n userEmail?: string,\n ): Promise<void> {\n if (this.lockout) {\n await this.lockout.recordFailedAttempt(userId || ipAddress);\n }\n\n if (this.auditLogger) {\n await this.auditLogger.log({\n action: \"login_failed\",\n userId,\n userEmail,\n resource: \"auth\",\n ipAddress,\n userAgent,\n success: false,\n error: \"Invalid credentials\",\n });\n }\n }\n\n private sanitizeUser(user: AuthUser): Partial<AuthUser> {\n const { passwordHash, ...sanitized } = user;\n return sanitized;\n }\n\n private jsonResponse(data: any, status: number = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n private errorResponse(message: string, status: number): Response {\n return new Response(JSON.stringify({ success: false, error: message }), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n private rateLimitResponse(limit: { retryAfter?: number }): Response {\n return new Response(\n JSON.stringify({\n success: false,\n error: \"Too many requests\",\n retryAfter: limit.retryAfter,\n }),\n {\n status: 429,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": String(limit.retryAfter || 60),\n },\n },\n );\n }\n}\n","import type { AuthAdapter } from \"./types.js\";\nimport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nimport { SQLiteAuthAdapter } from \"./sqlite-adapter.js\";\nimport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nimport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nimport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\nimport { EmailTransport } from \"../auth/nodemailer-transport.js\";\nimport { PasswordPolicy } from \"../auth/security/password-policy.js\";\nimport { AuthRoutes } from \"../api/rest/auth-routes.js\";\nimport { RedisAuthAdapter } from \"./redis-adapter.js\";\nimport { AccountLockout } from \"./security/lockout.js\";\nimport { RateLimiter } from \"./security/rate-limit.js\";\nimport { AuditLogger } from \"./security/audit-log.js\";\n\nexport type DatabaseType =\n | \"sqlite\"\n | \"postgres\"\n | \"mysql\"\n | \"mongodb\"\n | \"memory\";\n\nexport interface KyroAuthConfig {\n authAdapter: AuthAdapter;\n // Optional; when using distributed mode this can be set to 'distributed' or other markers\n databaseType?: string;\n email?: EmailTransport;\n passwordPolicy: PasswordPolicy;\n lockout?: InMemoryAccountLockout;\n rateLimiter?: InMemoryRateLimiter;\n auditLogger?: InMemoryAuditLogger;\n routes: AuthRoutes;\n}\n\nfunction getEnv(key: string, fallback: string = \"\"): string {\n return process.env[key] || fallback;\n}\n\nfunction getEnvBool(key: string, fallback: boolean = false): boolean {\n const val = process.env[key];\n if (!val) return fallback;\n return val.toLowerCase() === \"true\";\n}\n\nfunction getEnvNum(key: string, fallback: number = 0): number {\n const val = process.env[key];\n if (!val) return fallback;\n return parseInt(val, 10);\n}\n\nfunction detectDatabaseType(): DatabaseType {\n // Check environment variable first\n const envDb = process.env.KYRO_AUTH_DATABASE?.toLowerCase();\n if (\n envDb &&\n [\"sqlite\", \"postgres\", \"mysql\", \"mongodb\", \"memory\"].includes(envDb)\n ) {\n return envDb as DatabaseType;\n }\n\n // Try to detect from main kyro.config.ts\n try {\n const { readFileSync } = require(\"fs\");\n const { join } = require(\"path\");\n const configPath = join(process.cwd(), \"kyro.config.ts\");\n const configContent = readFileSync(configPath, \"utf8\");\n\n if (configContent.includes(\"createLocalAdapter\")) {\n return \"sqlite\";\n } else if (configContent.includes(\"createDrizzleAdapter\")) {\n // Check connection string for database type hints\n if (\n configContent.includes(\"postgres\") ||\n configContent.includes(\"postgresql\")\n ) {\n return \"postgres\";\n } else if (configContent.includes(\"mysql\")) {\n return \"mysql\";\n }\n return \"postgres\"; // Default for drizzle\n } else if (configContent.includes(\"createMongoDBAdapter\")) {\n return \"mongodb\";\n }\n } catch {\n // If we can't read config, default to memory\n }\n\n return \"memory\";\n}\n\nasync function createAuthAdapter(\n databaseType: DatabaseType,\n): Promise<AuthAdapter> {\n switch (databaseType) {\n case \"sqlite\":\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", \"./data/auth.db\"),\n });\n case \"postgres\":\n case \"mysql\":\n // Use SQLite for auth when using SQL databases (simpler than Redis)\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", \"./data/auth.db\"),\n });\n case \"mongodb\":\n // Use SQLite for auth when using MongoDB\n return new SQLiteAuthAdapter({\n path: getEnv(\"KYRO_AUTH_DB_PATH\", \"./data/auth.db\"),\n });\n case \"memory\":\n default:\n return new InMemoryAuthAdapter();\n }\n}\n\nexport async function createAuthConfig(\n databaseType?: string,\n): Promise<KyroAuthConfig> {\n const distributed = getEnvBool(\"KYRO_DISTRIBUTED\", false);\n let authAdapter: AuthAdapter;\n // Distributed mode uses Redis for shared state\n if (distributed) {\n // Dynamically import to avoid pulling Redis on dev builds\n const { RedisAuthAdapter } = await import(\"./redis-adapter.js\");\n const redisUrl = getEnv(\"REDIS_URL\", \"redis://localhost:6379\");\n const redisTls = getEnvBool(\"REDIS_TLS\", false);\n const redisAdapter = new RedisAuthAdapter({ url: redisUrl, tls: redisTls });\n await redisAdapter.connect?.();\n authAdapter = redisAdapter as any;\n } else {\n const initialDbType = (databaseType || detectDatabaseType()) as any;\n authAdapter = await createAuthAdapter(initialDbType);\n if ((authAdapter as any).connect) {\n await (authAdapter as any).connect();\n }\n }\n\n const emailConfig = getEmailConfig();\n const email = emailConfig ? new EmailTransport(emailConfig) : undefined;\n\n const passwordPolicy = new PasswordPolicy({\n minLength: getEnvNum(\"PASSWORD_MIN_LENGTH\", 12),\n requireUppercase: getEnvBool(\"PASSWORD_REQUIRE_UPPERCASE\", true),\n requireLowercase: getEnvBool(\"PASSWORD_REQUIRE_LOWERCASE\", true),\n requireNumbers: getEnvBool(\"PASSWORD_REQUIRE_NUMBERS\", true),\n requireSpecialChars: getEnvBool(\"PASSWORD_REQUIRE_SPECIAL\", true),\n preventReuse: getEnvNum(\"PASSWORD_PREVENT_REUSE\", 5),\n maxLength: getEnvNum(\"PASSWORD_MAX_LENGTH\", 128),\n });\n\n let lockout: any;\n let rateLimiter: any;\n let auditLogger: any;\n if (distributed) {\n // Redis-backed security features\n const redis = authAdapter as any;\n const redisClient = (redis as any).redis;\n lockout = new AccountLockout(redisClient, {\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new RateLimiter(redisClient, {\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = new AuditLogger(\n redisClient,\n getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30),\n );\n } else {\n lockout = new InMemoryAccountLockout({\n maxAttempts: getEnvNum(\"LOCKOUT_MAX_ATTEMPTS\", 5),\n lockDuration: getEnvNum(\"LOCKOUT_DURATION_MINUTES\", 15) * 60 * 1000,\n });\n rateLimiter = new InMemoryRateLimiter({\n \"auth:login\": {\n window: getEnvNum(\"RATE_LIMIT_AUTH_WINDOW_MS\", 900000),\n max: getEnvNum(\"RATE_LIMIT_AUTH_MAX_REQUESTS\", 10),\n },\n \"api:general\": {\n window: getEnvNum(\"RATE_LIMIT_WINDOW_MS\", 60000),\n max: getEnvNum(\"RATE_LIMIT_MAX_REQUESTS\", 100),\n },\n });\n auditLogger = getEnvBool(\"AUDIT_LOG_ENABLED\", true)\n ? new InMemoryAuditLogger(getEnvNum(\"AUDIT_LOG_RETENTION_DAYS\", 30))\n : undefined;\n }\n\n const routes = new AuthRoutes({\n redis: authAdapter as any,\n email,\n jwtSecret: getEnv(\"JWT_SECRET\", \"change-me\"),\n jwtExpiresIn: getEnv(\"JWT_EXPIRES_IN\", \"24h\"),\n jwtIssuer: getEnv(\"JWT_ISSUER\", \"kyro-cms\"),\n jwtAudience: getEnv(\"JWT_AUDIENCE\", \"kyro-cms-client\"),\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n baseUrl: getEnv(\"EMAIL_BASE_URL\", \"http://localhost:4321\"),\n emailVerificationRequired: getEnvBool(\"EMAIL_VERIFICATION_REQUIRED\", true),\n });\n\n const actualDbType = distributed\n ? \"distributed\"\n : ((databaseType || detectDatabaseType()) as string);\n return {\n authAdapter,\n databaseType: actualDbType,\n email,\n passwordPolicy,\n lockout,\n rateLimiter,\n auditLogger,\n routes,\n };\n}\n\nfunction getEmailConfig():\n | ConstructorParameters<typeof EmailTransport>[0]\n | undefined {\n const host = getEnv(\"SMTP_HOST\");\n if (!host) return undefined;\n\n return {\n host,\n port: getEnvNum(\"SMTP_PORT\", 587),\n secure: getEnvBool(\"SMTP_SECURE\", false),\n auth: {\n user: getEnv(\"SMTP_USER\"),\n pass: getEnv(\"SMTP_PASS\"),\n },\n from: getEnv(\"SMTP_FROM\", \"noreply@example.com\"),\n fromName: getEnv(\"SMTP_FROM_NAME\", \"Kyro CMS\"),\n };\n}\n\nexport const authConfig = createAuthConfig();\n","import bcrypt from \"bcrypt\";\nimport jwt from \"jsonwebtoken\";\nimport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nexport type {\n AuthTokenConfig,\n AuthResult,\n LoginCredentials,\n RegisterData,\n AuthUser,\n Session,\n JWTPayload,\n AuthAdapter,\n UserRole,\n} from \"./types.js\";\n\nconst DEFAULT_SALT_ROUNDS = 12;\nconst DEFAULT_EXPIRES_IN = \"24h\";\nconst DEFAULT_REFRESH_EXPIRES_IN = \"7d\";\n\nexport class Auth {\n private adapter: AuthAdapter;\n private config: Required<AuthTokenConfig>;\n\n constructor(adapter: AuthAdapter, config: AuthTokenConfig) {\n this.adapter = adapter;\n this.config = {\n secret: config.secret,\n expiresIn: config.expiresIn ?? DEFAULT_EXPIRES_IN,\n refreshExpiresIn: config.refreshExpiresIn ?? DEFAULT_REFRESH_EXPIRES_IN,\n issuer: config.issuer ?? \"kyro-cms\",\n audience: config.audience ?? [],\n saltRounds: config.saltRounds ?? DEFAULT_SALT_ROUNDS,\n };\n }\n\n async register(data: RegisterData): Promise<AuthResult> {\n try {\n const existing = await this.adapter.findUserByEmail(data.email);\n if (existing) {\n return { success: false, error: \"Email already registered\" };\n }\n\n const passwordHash = await this.hashPassword(data.password);\n const user = await this.adapter.createUser({\n email: data.email,\n passwordHash,\n role: data.role ?? \"customer\",\n tenantId: data.tenantId,\n });\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async login(credentials: LoginCredentials): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserByEmail(credentials.email);\n if (!user || !user.passwordHash) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n credentials.password,\n user.passwordHash,\n );\n if (!valid) {\n return { success: false, error: \"Invalid credentials\" };\n }\n\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async logout(token: string): Promise<void> {\n await this.adapter.deleteSession(token);\n }\n\n async refreshToken(refreshToken: string): Promise<AuthResult> {\n try {\n const session = await this.adapter.findSessionByToken(refreshToken);\n if (!session || new Date(session.expiresAt) < new Date()) {\n return { success: false, error: \"Invalid or expired refresh token\" };\n }\n\n const user = await this.adapter.findUserById(session.userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteSession(refreshToken);\n return this.createSessionForUser(user);\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async verifyToken(token: string): Promise<JWTPayload | null> {\n try {\n const decoded = jwt.verify(token, this.config.secret, {\n issuer: this.config.issuer,\n audience:\n this.config.audience.length > 0 ? this.config.audience[0] : undefined,\n }) as unknown as JWTPayload;\n return decoded;\n } catch {\n return null;\n }\n }\n\n async getUserFromToken(token: string): Promise<AuthUser | null> {\n const payload = await this.verifyToken(token);\n if (!payload) return null;\n return this.adapter.findUserById(payload.sub);\n }\n\n async changePassword(\n userId: string,\n currentPassword: string,\n newPassword: string,\n ): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user || !user.passwordHash) {\n return { success: false, error: \"User not found\" };\n }\n\n const valid = await this.adapter.verifyPassword(\n currentPassword,\n user.passwordHash,\n );\n if (!valid) {\n return { success: false, error: \"Current password is incorrect\" };\n }\n\n const newHash = await this.hashPassword(newPassword);\n await this.adapter.updateUser(userId, { passwordHash: newHash });\n await this.adapter.deleteUserSessions(userId);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async resetPassword(email: string, newPassword: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserByEmail(email);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n const passwordHash = await this.hashPassword(newPassword);\n await this.adapter.updateUser(user.id, { passwordHash });\n await this.adapter.deleteUserSessions(user.id);\n\n return { success: true, user };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n async deleteAccount(userId: string): Promise<AuthResult> {\n try {\n const user = await this.adapter.findUserById(userId);\n if (!user) {\n return { success: false, error: \"User not found\" };\n }\n\n await this.adapter.deleteUserSessions(userId);\n await this.adapter.deleteUser(userId);\n\n return { success: true };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n }\n\n private async createSessionForUser(user: AuthUser): Promise<AuthResult> {\n const token = this.generateToken(user);\n\n const session = await this.adapter.createSession(user.id);\n\n return {\n success: true,\n user,\n session,\n token,\n };\n }\n\n private generateToken(user: AuthUser): string {\n const payload: Omit<JWTPayload, \"iat\" | \"exp\"> = {\n sub: user.id,\n email: user.email,\n role: user.role,\n tenantId: user.tenantId,\n };\n\n const signOptions: jwt.SignOptions = {\n expiresIn: this.parseExpiresIn(this.config.expiresIn) / 1000,\n issuer: this.config.issuer,\n };\n\n if (this.config.audience.length > 0) {\n signOptions.audience = this.config.audience[0];\n }\n\n return jwt.sign(payload, this.config.secret, signOptions);\n }\n\n private async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, this.config.saltRounds);\n }\n\n private parseExpiresIn(value: string | number): number {\n if (typeof value === \"number\") return value;\n const match = value.match(/^(\\d+)([smhd])$/);\n if (!match) return 86400000;\n const num = parseInt(match[1], 10);\n switch (match[2]) {\n case \"s\":\n return num * 1000;\n case \"m\":\n return num * 60000;\n case \"h\":\n return num * 3600000;\n case \"d\":\n return num * 86400000;\n default:\n return 86400000;\n }\n }\n}\n\nexport function createAuth(\n adapter: AuthAdapter,\n config: AuthTokenConfig,\n): Auth {\n return new Auth(adapter, config);\n}\n\nexport { RedisAuthAdapter } from \"./redis-adapter.js\";\nexport { EmailTransport } from \"./nodemailer-transport.js\";\nexport {\n bootstrapAdmin,\n getBootstrapFromEnv,\n autoBootstrap,\n} from \"./bootstrap.js\";\n\nexport {\n DEFAULT_ROLES,\n DEFAULT_PERMISSIONS,\n ROLE_PERMISSIONS,\n getRoleHierarchy,\n getRoleLevel,\n isRoleHigherOrEqual,\n canInheritRole,\n type Role,\n type Permission,\n} from \"./rbac/roles.js\";\n\nexport {\n hasPermission,\n hasRole,\n hasAnyRole,\n hasAllRoles,\n getUserPermissions,\n PermissionChecker,\n type PermissionContext,\n} from \"./rbac/checker.js\";\n\nexport {\n RLSPolicy,\n createTenantContext,\n applyRLS,\n canAccessDocument,\n filterDocumentsByRLS,\n type TenantContext,\n type OwnershipRule,\n type RLSConfig,\n} from \"./rls/tenant.js\";\n\nexport {\n PasswordPolicy,\n type PasswordPolicyConfig,\n type ValidationResult,\n} from \"./security/password-policy.js\";\n\nexport {\n AccountLockout,\n type LockoutConfig,\n type LockoutStatus,\n} from \"./security/lockout.js\";\n\nexport {\n RateLimiter,\n type RateLimitConfig,\n type RateLimitResult,\n} from \"./security/rate-limit.js\";\n\nexport {\n AuditLogger,\n createAuditContext,\n type AuditLog,\n type AuditAction,\n type AuditLogFilter,\n} from \"./security/audit-log.js\";\n\nexport {\n SecurityHeaders,\n createSecurityHeaders,\n getSecurityHeadersMiddleware,\n type SecurityHeadersConfig,\n} from \"./security/headers.js\";\n\nexport { createAuthConfig, authConfig } from \"./config.js\";\nexport type { KyroAuthConfig, DatabaseType } from \"./config.js\";\n\nexport { InMemoryAuthAdapter } from \"./in-memory-adapter.js\";\nexport { InMemoryRateLimiter } from \"./security/in-memory-rate-limit.js\";\nexport { InMemoryAccountLockout } from \"./security/in-memory-lockout.js\";\nexport { InMemoryAuditLogger } from \"./security/in-memory-audit-log.js\";\n","export type VersionStatus = 'draft' | 'published' | 'archived';\n\nexport interface Version<T = Record<string, unknown>> {\n id: string;\n collection: string;\n documentId: string;\n version: number;\n status: VersionStatus;\n data: T;\n createdBy: string;\n createdAt: Date;\n publishedAt?: Date;\n changeDescription?: string;\n}\n\nexport interface VersionDiff {\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport interface VersionHistoryOptions {\n collection: string;\n documentId: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface CreateVersionOptions<T = Record<string, unknown>> {\n collection: string;\n documentId: string;\n data: T;\n status?: VersionStatus;\n createdBy: string;\n changeDescription?: string;\n}\n\nexport interface PublishVersionOptions {\n collection: string;\n documentId: string;\n versionId: string;\n publishedBy: string;\n}\n\nexport interface CompareVersionsOptions {\n collection: string;\n documentId: string;\n versionA: string | number;\n versionB: string | number;\n}\n\nexport interface VersionAdapter {\n createVersion<T>(options: CreateVersionOptions<T>): Promise<Version<T>>;\n getVersion<T>(collection: string, versionId: string): Promise<Version<T> | null>;\n getVersions<T>(options: VersionHistoryOptions): Promise<Version<T>[]>;\n getLatestVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n getPublishedVersion<T>(collection: string, documentId: string): Promise<Version<T> | null>;\n publishVersion(options: PublishVersionOptions): Promise<void>;\n revertToVersion<T>(options: { collection: string; documentId: string; versionId: string; userId: string }): Promise<Version<T>>;\n compareVersions<T>(options: CompareVersionsOptions): Promise<VersionDiff[]>;\n deleteVersions(collection: string, documentId: string): Promise<void>;\n}\n\nexport interface DraftPublishConfig {\n enabled?: boolean;\n draftsEnabled?: boolean;\n publishEnabled?: boolean;\n scheduleEnabled?: boolean;\n versioningEnabled?: boolean;\n maxVersionsPerDocument?: number;\n autoPublish?: boolean;\n requirePublishPermission?: boolean;\n}\n\nexport interface VersionPublishSchedule {\n versionId: string;\n scheduledFor: Date;\n status: 'pending' | 'published' | 'cancelled';\n}\n\nexport function getDefaultDraftPublishConfig(): Required<DraftPublishConfig> {\n return {\n enabled: true,\n draftsEnabled: true,\n publishEnabled: true,\n scheduleEnabled: false,\n versioningEnabled: true,\n maxVersionsPerDocument: 50,\n autoPublish: false,\n requirePublishPermission: true\n };\n}\n","import { randomUUID } from 'crypto';\nimport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\nimport { getDefaultDraftPublishConfig } from './types.js';\n\nexport type {\n Version,\n VersionStatus,\n VersionDiff,\n VersionAdapter,\n CreateVersionOptions,\n PublishVersionOptions,\n CompareVersionsOptions,\n VersionHistoryOptions,\n DraftPublishConfig,\n VersionPublishSchedule\n} from './types.js';\n\nexport { getDefaultDraftPublishConfig } from './types.js';\n\nexport class VersionManager<T = Record<string, unknown>> {\n private adapter: VersionAdapter;\n private config: Required<DraftPublishConfig>;\n\n constructor(adapter: VersionAdapter, config?: DraftPublishConfig) {\n this.adapter = adapter;\n this.config = { ...getDefaultDraftPublishConfig(), ...config };\n }\n\n async createVersion(options: Omit<CreateVersionOptions<T>, 'version'>): Promise<Version<T>> {\n const latestVersion = await this.adapter.getLatestVersion(options.collection, options.documentId);\n const nextVersion = (latestVersion?.version ?? 0) + 1;\n\n const versionOptions = {\n ...options,\n version: nextVersion\n } as CreateVersionOptions<T>;\n\n const version = await this.adapter.createVersion(versionOptions);\n\n if (this.config.maxVersionsPerDocument > 0) {\n await this.pruneOldVersions(options.collection, options.documentId);\n }\n\n return version;\n }\n\n async publishVersion(options: PublishVersionOptions): Promise<void> {\n const version = await this.adapter.getVersion(options.collection, options.versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n\n if (version.status === 'published') {\n throw new Error('Version is already published');\n }\n\n await this.adapter.publishVersion(options);\n }\n\n async unpublishDocument(collection: string, documentId: string): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: 1000\n });\n\n for (const version of versions) {\n if (version.status === 'published') {\n await this.createVersion({\n collection,\n documentId,\n data: version.data as T,\n status: 'draft',\n createdBy: 'system',\n changeDescription: 'Unpublished document'\n });\n break;\n }\n }\n }\n\n async revertToVersion(\n collection: string,\n documentId: string,\n versionId: string,\n userId: string\n ): Promise<Version<T>> {\n const targetVersion = await this.adapter.getVersion(collection, versionId);\n if (!targetVersion) {\n throw new Error('Version not found');\n }\n\n const newVersion = await this.adapter.revertToVersion({\n collection,\n documentId,\n versionId,\n userId\n });\n\n return newVersion as Version<T>;\n }\n\n async getVersionHistory(\n collection: string,\n documentId: string,\n limit = 20,\n offset = 0\n ): Promise<Version<T>[]> {\n return this.adapter.getVersions({\n collection,\n documentId,\n limit,\n offset\n });\n }\n\n async compareTwoVersions(\n collection: string,\n documentId: string,\n versionA: string | number,\n versionB: string | number\n ): Promise<VersionDiff[]> {\n return this.adapter.compareVersions({\n collection,\n documentId,\n versionA,\n versionB\n });\n }\n\n async getLatestDraft(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getLatestVersion(collection, documentId);\n }\n\n async getPublishedVersion(\n collection: string,\n documentId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getPublishedVersion(collection, documentId);\n }\n\n async getVersion(\n collection: string,\n versionId: string\n ): Promise<Version<T> | null> {\n return this.adapter.getVersion(collection, versionId);\n }\n\n async schedulePublish(\n collection: string,\n documentId: string,\n versionId: string,\n scheduledFor: Date\n ): Promise<void> {\n if (!this.config.scheduleEnabled) {\n throw new Error('Scheduled publishing is not enabled');\n }\n\n const version = await this.adapter.getVersion(collection, versionId);\n if (!version) {\n throw new Error('Version not found');\n }\n }\n\n async deleteVersionHistory(\n collection: string,\n documentId: string\n ): Promise<void> {\n await this.adapter.deleteVersions(collection, documentId);\n }\n\n private async pruneOldVersions(\n collection: string,\n documentId: string\n ): Promise<void> {\n const versions = await this.adapter.getVersions({\n collection,\n documentId,\n limit: this.config.maxVersionsPerDocument + 100\n });\n\n if (versions.length <= this.config.maxVersionsPerDocument) {\n return;\n }\n\n const keepVersions = versions.slice(0, this.config.maxVersionsPerDocument);\n const versionsToDelete = versions.slice(this.config.maxVersionsPerDocument);\n\n for (const version of versionsToDelete) {\n if (version.status !== 'published') {\n await this.adapter.deleteVersions(collection, documentId);\n break;\n }\n }\n }\n}\n\nexport function createVersionManager<T>(\n adapter: VersionAdapter,\n config?: DraftPublishConfig\n): VersionManager<T> {\n return new VersionManager<T>(adapter, config);\n}\n\nexport function isPublished(status: VersionStatus): boolean {\n return status === 'published';\n}\n\nexport function isDraft(status: VersionStatus): boolean {\n return status === 'draft';\n}\n\nexport function isArchived(status: VersionStatus): boolean {\n return status === 'archived';\n}\n","import type { KyroConfig, CollectionConfig, GlobalConfig } from \"./types.js\";\n\nfunction normalizeCollections(\n collections:\n | CollectionConfig[]\n | Record<string, CollectionConfig>\n | undefined,\n): CollectionConfig[] {\n if (!collections) return [];\n if (Array.isArray(collections)) return collections;\n return Object.values(collections);\n}\n\nfunction normalizeGlobals(\n globals: GlobalConfig[] | Record<string, GlobalConfig> | undefined,\n): GlobalConfig[] {\n if (!globals) return [];\n if (Array.isArray(globals)) return globals;\n return Object.values(globals);\n}\n\nexport function defineConfig(config: {\n collections?: CollectionConfig[] | Record<string, CollectionConfig>;\n globals?: GlobalConfig[] | Record<string, GlobalConfig>;\n adapter: KyroConfig[\"adapter\"];\n plugins?: KyroConfig[\"plugins\"];\n auth?: KyroConfig[\"auth\"];\n cors?: KyroConfig[\"cors\"];\n admin?: KyroConfig[\"admin\"];\n upload?: KyroConfig[\"upload\"];\n graphQL?: KyroConfig[\"graphQL\"];\n typescript?: KyroConfig[\"typescript\"];\n localization?: KyroConfig[\"localization\"];\n rateLimit?: KyroConfig[\"rateLimit\"];\n debug?: KyroConfig[\"debug\"];\n}): KyroConfig {\n return {\n collections: normalizeCollections(config.collections),\n globals: normalizeGlobals(config.globals),\n adapter: config.adapter,\n plugins: config.plugins,\n auth: config.auth,\n cors: config.cors,\n admin: config.admin,\n upload: config.upload,\n graphQL: config.graphQL,\n typescript: config.typescript,\n localization: config.localization,\n rateLimit: config.rateLimit,\n debug: config.debug,\n };\n}\n"]}