saas-backend-kit 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +170 -1
  2. package/dist/auth/index.js +1 -0
  3. package/dist/auth/index.js.map +1 -1
  4. package/dist/auth/index.mjs +1 -0
  5. package/dist/auth/index.mjs.map +1 -1
  6. package/dist/config/index.js +1 -0
  7. package/dist/config/index.js.map +1 -1
  8. package/dist/config/index.mjs +1 -0
  9. package/dist/config/index.mjs.map +1 -1
  10. package/dist/index.js +75 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +73 -1
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/logger/index.js +1 -0
  15. package/dist/logger/index.js.map +1 -1
  16. package/dist/logger/index.mjs +1 -0
  17. package/dist/logger/index.mjs.map +1 -1
  18. package/dist/notifications/index.js +1 -0
  19. package/dist/notifications/index.js.map +1 -1
  20. package/dist/notifications/index.mjs +1 -0
  21. package/dist/notifications/index.mjs.map +1 -1
  22. package/dist/queue/index.js +1 -0
  23. package/dist/queue/index.js.map +1 -1
  24. package/dist/queue/index.mjs +1 -0
  25. package/dist/queue/index.mjs.map +1 -1
  26. package/dist/rate-limit/index.js +1 -0
  27. package/dist/rate-limit/index.js.map +1 -1
  28. package/dist/rate-limit/index.mjs +1 -0
  29. package/dist/rate-limit/index.mjs.map +1 -1
  30. package/dist/upload/index.js +1 -0
  31. package/dist/upload/index.js.map +1 -1
  32. package/dist/upload/index.mjs +1 -0
  33. package/dist/upload/index.mjs.map +1 -1
  34. package/package.json +18 -3
  35. package/CHANGELOG.md +0 -31
  36. package/PUBLISHING.md +0 -133
  37. package/copy-dts.js +0 -314
  38. package/examples/express/.env.example +0 -41
  39. package/examples/express/app.ts +0 -203
  40. package/jest-output.json +0 -72
  41. package/jest.config.js +0 -19
  42. package/saas-banner.svg +0 -239
  43. package/src/auth/express.ts +0 -250
  44. package/src/auth/fastify.ts +0 -65
  45. package/src/auth/index.ts +0 -6
  46. package/src/auth/jwt.ts +0 -47
  47. package/src/auth/oauth.ts +0 -117
  48. package/src/auth/rbac.ts +0 -82
  49. package/src/auth/types.ts +0 -69
  50. package/src/config/index.ts +0 -125
  51. package/src/index.ts +0 -18
  52. package/src/logger/index.ts +0 -110
  53. package/src/notifications/index.ts +0 -262
  54. package/src/plugin.ts +0 -192
  55. package/src/queue/index.ts +0 -208
  56. package/src/rate-limit/express.ts +0 -145
  57. package/src/rate-limit/fastify.ts +0 -47
  58. package/src/rate-limit/index.ts +0 -2
  59. package/src/response/index.ts +0 -206
  60. package/src/upload/index.ts +0 -268
  61. package/src/utils/index.ts +0 -180
  62. package/tests/auth.test.ts +0 -134
  63. package/tests/config.test.ts +0 -36
  64. package/tests/logger.test.ts +0 -47
  65. package/tests/notifications.test.ts +0 -19
  66. package/tests/rate-limit.test.ts +0 -50
  67. package/tests/upload.test.ts +0 -33
  68. package/tsconfig.json +0 -30
  69. package/tsconfig.test.json +0 -14
  70. package/tsup.config.ts +0 -25
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth/types.ts","../src/config/index.ts","../src/auth/rbac.ts","../src/logger/index.ts","../src/queue/index.ts","../src/rate-limit/express.ts","../src/auth/index.ts","../src/auth/jwt.ts","../src/auth/oauth.ts","../src/auth/express.ts","../src/index.ts","../src/notifications/index.ts","../src/rate-limit/index.ts","../src/response/index.ts","../src/upload/index.ts","../src/plugin.ts"],"names":["config","z","logger","pino","QueueManager","createQueue","queue","Queue","Worker","jwt","response","bcrypt","nodemailer","data","S3Client","PutObjectCommand","DeleteObjectCommand","GetObjectCommand","getSignedUrl","ListObjectsV2Command","app"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IA4Ca,mBAAA;AA5Cb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mBAAA,GAAA;AA4CO,IAAM,mBAAA,GAAuC;AAAA,MAClD,KAAA,EAAO,CAAC,GAAG,CAAA;AAAA,MACX,IAAA,EAAM,CAAC,MAAA,EAAQ,WAAW,CAAA;AAAA,MAC1B,KAAA,EAAO,CAAC,aAAa;AAAA,KACvB;AAAA,EAAA;AAAA,CAAA,CAAA;AChDA,IAEa,SAAA,CAAA,CAuCP,eAqEA,YAAA,CAAA,CAEOA;AAhHb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AAEO,IAAM,SAAA,GAAYC,MAAE,MAAA,CAAO;AAAA,MAChC,QAAA,EAAUA,KAAA,CAAE,IAAA,CAAK,CAAC,aAAA,EAAe,cAAc,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,aAAa,CAAA;AAAA,MAC7E,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,MAAM,CAAA;AAAA,MAC/B,YAAA,EAAcA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAClC,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,wBAAwB,CAAA;AAAA,MACtD,YAAYA,KAAA,CAAE,MAAA,GAAS,GAAA,CAAI,EAAE,EAAE,QAAA,EAAS;AAAA,MACxC,cAAA,EAAgBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,IAAI,CAAA;AAAA,MACvC,oBAAoBA,KAAA,CAAE,MAAA,GAAS,GAAA,CAAI,EAAE,EAAE,QAAA,EAAS;AAAA,MAChD,sBAAA,EAAwBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,KAAK,CAAA;AAAA,MAChD,gBAAA,EAAkBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACtC,oBAAA,EAAsBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC1C,mBAAA,EAAqBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACzC,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC/B,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,KAAK,CAAA;AAAA,MACnC,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC/B,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC/B,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC/B,kBAAA,EAAoBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACxC,iBAAA,EAAmBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACvC,mBAAA,EAAqBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACzC,iBAAA,EAAmBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACvC,iBAAA,EAAmBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,IAAI,CAAA;AAAA,MAC1C,gBAAA,EAAkBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,KAAK,CAAA;AAAA,MAC1C,SAAA,EAAWA,KAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,MACtF,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,WAAW,CAAA;AAAA,MAC1C,iBAAA,EAAmBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACvC,qBAAA,EAAuBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC3C,aAAA,EAAeA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACnC,YAAA,EAAcA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,KACnC,CAAA;AAUD,IAAM,gBAAN,MAAoB;AAAA,MACV,MAAA,GAA2B,IAAA;AAAA,MAC3B,MAAA;AAAA,MACA,QAAA;AAAA,MAER,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AACvC,QAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,SAAA;AAChC,QAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,IAAA;AAAA,MACtC;AAAA,MAEA,IAAA,GAAkB;AAChB,QAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAA;AAE7B,QAAA,MAAM,MAA0C,EAAC;AAEjD,QAAA,KAAA,MAAW,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,EAAG;AAChD,UAAA,GAAA,CAAI,GAAG,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAAA,QAC5B;AAEA,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA;AACxC,UAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,YAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,OAAO,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC1F,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,MAAM,CAAA,CAAE,CAAA;AAAA,UACvD;AACA,UAAA,IAAA,CAAK,SAAS,MAAA,CAAO,IAAA;AAAA,QACvB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAA,GAAS,GAAA;AAAA,QAChB;AAEA,QAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACd;AAAA,MAEA,IAA+B,GAAA,EAAsB;AACnD,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAK;AAC5B,QAAA,OAAO,IAAA,CAAK,OAAQ,GAAG,CAAA;AAAA,MACzB;AAAA,MAEA,IAAI,GAAA,EAA8B;AAChC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC1B,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,QAAA,CAAS,OAAO,EAAE,CAAA;AACxD,QAAA,OAAO,OAAO,KAAK,CAAA;AAAA,MACrB;AAAA,MAEA,KAAK,GAAA,EAA+B;AAClC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC1B,QAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,KAAA;AACvC,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA,CAAM,aAAY,KAAM,MAAA;AAC9D,QAAA,OAAO,QAAQ,KAAK,CAAA;AAAA,MACtB;AAAA,MAEA,YAAA,GAAwB;AACtB,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,KAAM,YAAA;AAAA,MAClC;AAAA,MAEA,aAAA,GAAyB;AACvB,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,KAAM,aAAA;AAAA,MAClC;AAAA,MAEA,MAAA,GAAkB;AAChB,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,KAAM,MAAA;AAAA,MAClC;AAAA,MAEA,MAAA,GAAoB;AAClB,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAK;AAC5B,QAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACd;AAAA,KACF;AAEA,IAAM,YAAA,GAAe,IAAI,aAAA,EAAc;AAEhC,IAAMD,cAAA,GAAS;AAAA,MACpB,IAAA,EAAM,MAAM,YAAA,CAAa,IAAA,EAAK;AAAA,MAC9B,GAAA,EAAK,CAA4B,GAAA,KAAW,YAAA,CAAa,IAAI,GAAG,CAAA;AAAA,MAChE,GAAA,EAAK,CAAC,GAAA,KAAyB,YAAA,CAAa,IAAI,GAAG,CAAA;AAAA,MACnD,IAAA,EAAM,CAAC,GAAA,KAAyB,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,MACrD,YAAA,EAAc,MAAM,YAAA,CAAa,YAAA,EAAa;AAAA,MAC9C,aAAA,EAAe,MAAM,YAAA,CAAa,aAAA,EAAc;AAAA,MAChD,MAAA,EAAQ,MAAM,YAAA,CAAa,MAAA,EAAO;AAAA,MAClC,MAAA,EAAQ,MAAM,YAAA,CAAa,MAAA,EAAO;AAAA,MAClC,MAAA,EAAQ,CAAC,OAAA,KAA4B,IAAI,cAAc,OAAO;AAAA,KAChE;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1HA,IAEa,WAAA,EA+EA,WAAA;AAjFb,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kBAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AAEO,IAAM,cAAN,MAAkB;AAAA,MACf,WAAA;AAAA,MAER,WAAA,CAAY,cAA+B,mBAAA,EAAqB;AAC9D,QAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,MACrB;AAAA,MAEA,eAAe,WAAA,EAAoC;AACjD,QAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,MACrB;AAAA,MAEA,aAAA,CAAc,MAAY,UAAA,EAA8B;AACtD,QAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,EAAG;AAC3B,UAAA,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,GAAI,EAAC;AAAA,QAC5B;AACA,QAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG;AAChD,UAAA,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,CAAE,IAAA,CAAK,UAAU,CAAA;AAAA,QACxC;AAAA,MACF;AAAA,MAEA,gBAAA,CAAiB,MAAY,UAAA,EAA8B;AACzD,QAAA,IAAI,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,EAAG;AAC1B,UAAA,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,UAAU,CAAA;AAAA,QAC9E;AAAA,MACF;AAAA,MAEA,eAAe,IAAA,EAA0B;AACvC,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,IAAK,EAAC;AAAA,MACpC;AAAA,MAEA,aAAA,CAAc,MAAY,kBAAA,EAAyC;AACjE,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAEhD,QAAA,IAAI,eAAA,CAAgB,QAAA,CAAS,GAAG,CAAA,EAAG;AACjC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,eAAA,CAAgB,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAChD,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,CAAC,cAAA,EAAgB,aAAa,CAAA,GAAI,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAEpE,QAAA,KAAA,MAAW,QAAQ,eAAA,EAAiB;AAClC,UAAA,MAAM,CAAC,MAAA,EAAQ,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAEtC,UAAA,IAAI,MAAA,KAAW,GAAA,KAAQ,KAAA,KAAU,GAAA,IAAO,UAAU,aAAA,CAAA,EAAgB;AAChE,YAAA,OAAO,IAAA;AAAA,UACT;AAEA,UAAA,IAAI,MAAA,KAAW,cAAA,KAAmB,KAAA,KAAU,GAAA,IAAO,UAAU,aAAA,CAAA,EAAgB;AAC3E,YAAA,OAAO,IAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,MAEA,OAAA,CAAQ,UAAgB,YAAA,EAA6B;AACnD,QAAA,MAAM,SAAA,GAAoB,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AACnD,QAAA,MAAM,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,QAAe,CAAA;AACnD,QAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,OAAA,CAAQ,YAAmB,CAAA;AAE3D,QAAA,IAAI,SAAA,KAAc,EAAA,IAAM,aAAA,KAAkB,EAAA,EAAI;AAC5C,UAAA,OAAO,QAAA,KAAa,YAAA;AAAA,QACtB;AAEA,QAAA,OAAO,SAAA,IAAa,aAAA;AAAA,MACtB;AAAA,MAEA,UAAU,UAAA,EAAwB;AAChC,QAAA,OAAO,CAAC,IAAA,KAAwB,IAAA,CAAK,aAAA,CAAc,MAAM,UAAU,CAAA;AAAA,MACrE;AAAA,MAEA,cAAc,YAAA,EAAoB;AAChC,QAAA,OAAO,CAAC,IAAA,KAAwB,IAAA,CAAK,OAAA,CAAQ,MAAM,YAAY,CAAA;AAAA,MACjE;AAAA,KACF;AAEO,IAAM,WAAA,GAAc,IAAI,WAAA,EAAY;AAAA,EAAA;AAAA,CAAA,CAAA;ACjF3C,IAgBM,eAmDA,aAAA,CAAA,CAEOE;AArEb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AACA,IAAA,WAAA,EAAA;AAeA,IAAM,gBAAN,MAAoB;AAAA,MACV,OAAA,uBAAmC,GAAA,EAAI;AAAA,MACvC,aAAA;AAAA,MAER,WAAA,GAAc;AACZ,QAAA,MAAM,KAAA,GAASF,cAAA,CAAO,GAAA,CAAI,WAAW,CAAA,IAAkB,MAAA;AACvD,QAAA,IAAA,CAAK,gBAAgBG,qBAAA,CAAK;AAAA,UACxB,KAAA;AAAA,UACA,IAAA,EAAM,kBAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,QAAA,EAAU,CAAC,QAAA,MAAwB;AAAA,cACjC,GAAG,QAAA;AAAA,cACH,OAAA,EAAS;AAAA,aACX;AAAA;AACF,SACD,CAAA;AAAA,MACH;AAAA,MAEA,YAAA,CAAa,OAAA,GAAwB,EAAC,EAAW;AAC/C,QAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,SAAA;AAE7B,QAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1B,UAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,QAC9B;AAEA,QAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,IAAUH,cAAA,CAAO,GAAA,CAAI,WAAW,CAAA,IAAkB,MAAA;AAExE,QAAA,MAAME,UAASC,qBAAA,CAAK;AAAA,UAClB,KAAA;AAAA,UACA,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,GAAG;AAAA,SACJ,CAAA;AAED,QAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAMD,OAAM,CAAA;AAC7B,QAAA,OAAOA,OAAAA;AAAA,MACT;AAAA,MAEA,UAAU,IAAA,EAAuB;AAC/B,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,KAAK,IAAA,CAAK,aAAA;AAAA,QACxC;AACA,QAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACd;AAAA,MAEA,KAAA,CAAM,UAAoB,OAAA,EAAqC;AAC7D,QAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,OAAA;AAC9B,QAAA,MAAM,SAAS,OAAA,EAAS,IAAA,GAAO,KAAK,SAAA,CAAU,IAAI,IAAI,IAAA,CAAK,aAAA;AAC3D,QAAA,OAAO,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,MAC9B;AAAA,KACF;AAEA,IAAM,aAAA,GAAgB,IAAI,aAAA,EAAc;AAEjC,IAAMA,cAAA,GAAS;AAAA,MACpB,IAAA,EAAM,CAAC,OAAA,EAAA,GAAoB,IAAA,KAAoB,aAAA,CAAc,WAAU,CAAE,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,MAC9F,IAAA,EAAM,CAAC,OAAA,EAAA,GAAoB,IAAA,KAAoB,aAAA,CAAc,WAAU,CAAE,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,MAC9F,KAAA,EAAO,CAAC,OAAA,EAAA,GAAoB,IAAA,KAAoB,aAAA,CAAc,WAAU,CAAE,KAAA,CAAM,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,MAChG,KAAA,EAAO,CAAC,OAAA,EAAA,GAAoB,IAAA,KAAoB,aAAA,CAAc,WAAU,CAAE,KAAA,CAAM,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,MAChG,KAAA,EAAO,CAAC,OAAA,EAAA,GAAoB,IAAA,KAAoB,aAAA,CAAc,WAAU,CAAE,KAAA,CAAM,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,MAChG,KAAA,EAAO,CAAC,OAAA,EAAA,GAAoB,IAAA,KAAoB,aAAA,CAAc,WAAU,CAAE,KAAA,CAAM,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,MAChG,OAAO,CAAC,QAAA,EAAoB,YAAgC,aAAA,CAAc,KAAA,CAAM,UAAU,OAAO,CAAA;AAAA,MACjG,MAAA,EAAQ,CAAC,OAAA,KAA2B,aAAA,CAAc,aAAa,OAAO,CAAA;AAAA,MACtE,GAAA,EAAK,CAAC,IAAA,KAAkB,aAAA,CAAc,UAAU,IAAI;AAAA,KACtD;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/EA,IAAA,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,YAAA,EAAA,MAAAE,oBAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,WAAA,EAAA,MAAAC,mBAAA;AAAA,EAAA,OAAA,EAAA,MAAA,aAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,KAAA,EAAA,MAAAC;AAAA,CAAA,CAAA;AAuBMF,6BAAA,CAAA,KAoJA,YAAA,CAAA,CAEOC,4BAAA,CAAA,KAIA,MAAA,CAAA,CASA,YAQAC,sBAAA,CAAA,KAaN;AA/MP,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oBAAA,GAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,WAAA,EAAA;AAqBA,IAAMF,uBAAN,MAAmB;AAAA,MACT,MAAA,uBAAiC,GAAA,EAAI;AAAA,MACrC,OAAA,uBAAmC,GAAA,EAAI;AAAA,MACvC,YAAA;AAAA,MAER,WAAA,GAAc;AACZ,QAAA,MAAM,QAAA,GAAWJ,cAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AACvC,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,CAAK,YAAA,GAAe,EAAE,GAAA,EAAK,QAAA,EAAS;AAAA,QACtC,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,YAAA,GAAe;AAAA,YAClB,IAAA,EAAM,WAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACR;AAAA,QACF;AAAA,MACF;AAAA,MAEA,gBAAgB,OAAA,EAA6B;AAC3C,QAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AAAA,MACtB;AAAA,MAEA,WAAA,CAAY,MAAc,OAAA,EAAwC;AAChE,QAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG;AACzB,UAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,QAC7B;AAEA,QAAA,MAAMM,MAAAA,GAAQ,IAAIC,YAAA,CAAM,IAAA,EAAM;AAAA,UAC5B,YAAY,IAAA,CAAK,YAAA;AAAA,UACjB,iBAAA,EAAmB,SAAS,iBAAA,IAAqB;AAAA,YAC/C,gBAAA,EAAkB,GAAA;AAAA,YAClB,YAAA,EAAc;AAAA;AAChB,SACD,CAAA;AAED,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAMD,MAAK,CAAA;AAC3B,QAAAJ,cAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,SAAA,CAAW,CAAA;AAErC,QAAA,OAAOI,MAAAA;AAAA,MACT;AAAA,MAEA,SAAS,IAAA,EAAiC;AACxC,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,MAC7B;AAAA,MAEA,MAAM,MAAA,CACJ,SAAA,EACA,OAAA,EACA,MACA,OAAA,EACc;AACd,QAAA,MAAMA,SAAQ,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,IAAK,IAAA,CAAK,YAAY,SAAS,CAAA;AACpE,QAAA,MAAM,MAAM,MAAMA,MAAAA,CAAM,GAAA,CAAI,OAAA,EAAS,MAAM,OAAO,CAAA;AAClD,QAAAJ,cAAA,CAAO,KAAA,CAAM,CAAA,KAAA,EAAQ,OAAO,CAAA,kBAAA,EAAqB,SAAS,KAAK,EAAE,KAAA,EAAO,GAAA,CAAI,EAAA,EAAI,CAAA;AAChF,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,MAEA,MAAM,WAAA,CACJ,SAAA,EACA,IAAA,EACgB;AAChB,QAAA,MAAMI,SAAQ,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,IAAK,IAAA,CAAK,YAAY,SAAS,CAAA;AACpE,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,UAChC,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,GAAG,GAAA,CAAI;AAAA,SACT,CAAE,CAAA;AACF,QAAA,MAAM,MAAA,GAAS,MAAMA,MAAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA;AAC3C,QAAAJ,cAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAA,CAAG,CAAA;AAChE,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MAEA,UAAA,CACE,SAAA,EACA,SAAA,EACA,OAAA,EACQ;AACR,QAAc,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,IAAK,IAAA,CAAK,YAAY,SAAS;AAEpE,QAAA,MAAM,MAAA,GAAS,IAAIM,aAAA,CAAO,SAAA,EAAW,OAAO,GAAA,KAAQ;AAClD,UAAAN,cAAA,CAAO,KAAA,CAAM,CAAA,gBAAA,EAAmB,GAAA,CAAI,IAAI,CAAA,CAAA,CAAA,EAAK,EAAE,KAAA,EAAO,GAAA,CAAI,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,CAAA;AAChF,UAAA,OAAO,MAAM,UAAU,GAAG,CAAA;AAAA,QAC5B,CAAA,EAAG;AAAA,UACD,YAAY,IAAA,CAAK,YAAA;AAAA,UACjB,WAAA,EAAa,SAAS,WAAA,IAAe,CAAA;AAAA,UACrC,GAAG;AAAA,SACJ,CAAA;AAED,QAAA,MAAA,CAAO,EAAA,CAAG,WAAA,EAAa,CAAC,GAAA,KAAQ;AAC9B,UAAAA,cAAA,CAAO,KAAA,CAAM,iBAAiB,EAAE,KAAA,EAAO,IAAI,EAAA,EAAI,KAAA,EAAO,WAAW,CAAA;AAAA,QACnE,CAAC,CAAA;AAED,QAAA,MAAA,CAAO,EAAA,CAAG,QAAA,EAAU,CAAC,GAAA,EAAK,GAAA,KAAQ;AAChC,UAAAA,cAAA,CAAO,KAAA,CAAM,CAAA,UAAA,CAAA,EAAc,EAAE,KAAA,EAAO,GAAA,EAAK,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,GAAA,CAAI,OAAA,EAAS,CAAA;AAAA,QACrF,CAAC,CAAA;AAED,QAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC1B,UAAAA,cAAA,CAAO,KAAA,CAAM,gBAAgB,EAAE,KAAA,EAAO,WAAW,KAAA,EAAO,GAAA,CAAI,SAAS,CAAA;AAAA,QACvE,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AAClC,QAAAA,cAAA,CAAO,IAAA,CAAK,CAAA,0BAAA,EAA6B,SAAS,CAAA,CAAA,CAAG,CAAA;AAErD,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MAEA,MAAM,aAAa,SAAA,EAAoD;AACrE,QAAA,MAAMI,MAAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AACrC,QAAA,IAAI,CAACA,MAAAA,EAAO;AACV,UAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,WAAW,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE;AAAA,QACtE;AACA,QAAA,OAAO,MAAMA,OAAM,YAAA,EAAa;AAAA,MAClC;AAAA,MAEA,MAAM,OAAA,CAAQ,SAAA,EAAmB,KAAA,GAAgB,CAAA,EAAG,MAAc,EAAA,EAAoB;AACpF,QAAA,MAAMA,MAAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AACrC,QAAA,IAAI,CAACA,MAAAA,EAAO,OAAO,EAAC;AACpB,QAAA,OAAO,MAAMA,MAAAA,CAAM,OAAA,CAAQ,CAAC,SAAA,EAAW,UAAU,WAAA,EAAa,QAAQ,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AAAA,MACrF;AAAA,MAEA,MAAM,WAAW,IAAA,EAA6B;AAC5C,QAAA,MAAMA,MAAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAClC,QAAA,IAAIA,MAAAA,EAAO;AACT,UAAA,MAAMA,OAAM,KAAA,EAAM;AAClB,UAAA,IAAA,CAAK,MAAA,CAAO,OAAO,IAAI,CAAA;AACvB,UAAAJ,cAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAU,CAAA;AAAA,QACtC;AAAA,MACF;AAAA,MAEA,MAAM,YAAY,IAAA,EAA6B;AAC7C,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,OAAO,KAAA,EAAM;AACnB,UAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxB,UAAAA,cAAA,CAAO,IAAA,CAAK,CAAA,kBAAA,EAAqB,IAAI,CAAA,QAAA,CAAU,CAAA;AAAA,QACjD;AAAA,MACF;AAAA,MAEA,MAAM,QAAA,GAA0B;AAC9B,QAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,UAChB,GAAG,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,EAAO,CAAA;AAAA,UACtD,GAAG,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,EAAO;AAAA,SACxD,CAAA;AACD,QAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,QAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,QAAAA,cAAA,CAAO,KAAK,+BAA+B,CAAA;AAAA,MAC7C;AAAA,KACF;AAEA,IAAM,YAAA,GAAe,IAAIE,oBAAA,EAAa;AAE/B,IAAMC,mBAAA,GAAc,CAAC,IAAA,EAAc,OAAA,KAA2C;AACnF,MAAA,OAAO,YAAA,CAAa,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AAAA,IAC/C,CAAA;AAEO,IAAM,MAAA,GAAS,CACpB,SAAA,EACA,OAAA,EACA,MACA,OAAA,KACiB;AACjB,MAAA,OAAO,YAAA,CAAa,MAAA,CAAO,SAAA,EAAW,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,IAC9D,CAAA;AAEO,IAAM,UAAA,GAAa,CACxB,SAAA,EACA,SAAA,EACA,OAAA,KACW;AACX,MAAA,OAAO,YAAA,CAAa,UAAA,CAAW,SAAA,EAAW,SAAA,EAAW,OAAO,CAAA;AAAA,IAC9D,CAAA;AAEO,IAAMC,aAAA,GAAQ;AAAA,MACnB,MAAA,EAAQD,mBAAA;AAAA,MACR,GAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAS,UAAA;AAAA,MACT,GAAA,EAAK,CAAC,IAAA,KAAiB,YAAA,CAAa,SAAS,IAAI,CAAA;AAAA,MACjD,YAAA,EAAc,CAAC,IAAA,KAAiB,YAAA,CAAa,aAAa,IAAI,CAAA;AAAA,MAC9D,OAAA,EAAS,CAAC,IAAA,EAAc,KAAA,EAAgB,QAAiB,YAAA,CAAa,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AAAA,MAC9F,KAAA,EAAO,CAAC,IAAA,KAAiB,YAAA,CAAa,WAAW,IAAI,CAAA;AAAA,MACrD,QAAA,EAAU,MAAM,YAAA,CAAa,QAAA,EAAS;AAAA,MACtC,eAAA,EAAiB,CAAC,OAAA,KAA0B,YAAA,CAAa,gBAAgB,OAAO;AAAA,KAClF;AAGA,IAAO,aAAA,GAAQC,aAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACxER,SAAS,SAAA,CAAU,OAAA,GAA4B,EAAC,EAAmB;AACxE,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,CAAY,OAAO,CAAA;AACvC,EAAA,OAAO,QAAQ,UAAA,EAAW;AAC5B;AAEO,SAAS,kBAAkB,OAAA,EAAwC;AACxE,EAAA,OAAO,IAAI,YAAY,OAAO,CAAA;AAChC;AA9IA,IAkBM,mBAAA,EAyCA,WAAA;AA3DN,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AACA,IAAA,WAAA,EAAA;AAiBA,IAAM,sBAAN,MAA0B;AAAA,MAChB,KAAA,uBAA0C,GAAA,EAAI;AAAA,MAC9C,eAAA;AAAA,MAER,WAAA,GAAc;AACZ,QAAA,IAAA,CAAK,kBAAkB,WAAA,CAAY,MAAM,IAAA,CAAK,OAAA,IAAW,GAAK,CAAA;AAC9D,QAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,MAC7B;AAAA,MAEQ,OAAA,GAAgB;AACtB,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,SAAQ,EAAG;AAChD,UAAA,IAAI,MAAA,CAAO,YAAY,GAAA,EAAK;AAC1B,YAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,SAAA,CAAU,KAAa,QAAA,EAAmC;AACxD,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAEjC,QAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,SAAA,GAAY,GAAA,EAAK;AACrC,UAAA,MAAM,YAAY,GAAA,GAAM,QAAA;AACxB,UAAA,IAAA,CAAK,MAAM,GAAA,CAAI,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,EAAG,WAAW,CAAA;AAC3C,UAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,SAAA,EAAU;AAAA,QAC/B;AAEA,QAAA,MAAA,CAAO,KAAA,EAAA;AACP,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,MAEA,IAAI,GAAA,EAA0C;AAC5C,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,MAC3B;AAAA,MAEA,OAAA,GAAgB;AACd,QAAA,aAAA,CAAc,KAAK,eAAe,CAAA;AAAA,MACpC;AAAA,KACF;AAEA,IAAM,cAAN,MAAkB;AAAA,MACR,OAAA;AAAA,MACA,KAAA;AAAA,MAER,WAAA,CAAY,OAAA,GAA4B,EAAC,EAAG;AAC1C,QAAA,MAAM,aAAA,GAAgBN,cAAA,CAAO,GAAA,CAAI,mBAAmB,CAAA,IAAK,IAAA;AACzD,QAAA,MAAM,eAAe,QAAA,CAASA,cAAA,CAAO,IAAI,kBAAkB,CAAA,IAAK,OAAO,EAAE,CAAA;AAEzE,QAAA,IAAA,CAAK,OAAA,GAAU;AAAA,UACb,MAAA,EAAQ,QAAQ,MAAA,IAAU,aAAA;AAAA,UAC1B,KAAA,EAAO,QAAQ,KAAA,IAAS,YAAA;AAAA,UACxB,cAAc,OAAA,CAAQ,YAAA,KAAiB,CAAC,GAAA,KAAiB,IAAI,EAAA,IAAM,SAAA,CAAA;AAAA,UACnE,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,cAAA;AAAA,UACjC,sBAAA,EAAwB,QAAQ,sBAAA,IAA0B,KAAA;AAAA,UAC1D,kBAAA,EAAoB,QAAQ,kBAAA,IAAsB,KAAA;AAAA,UAClD,IAAA,EAAM,OAAA,CAAQ,IAAA,KAAS,MAAM,KAAA;AAAA,SAC/B;AAEA,QAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,mBAAA,EAAoB;AAAA,MACvC;AAAA,MAEQ,WAAA,GAAsB;AAC5B,QAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,MAAA;AAC5B,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,kBAAkB,CAAA;AAC7C,QAAA,IAAI,CAAC,OAAO,OAAO,GAAA;AAEnB,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACnC,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAEpB,QAAA,QAAQ,IAAA;AAAM,UACZ,KAAK,GAAA;AAAK,YAAA,OAAO,KAAA,GAAQ,GAAA;AAAA,UACzB,KAAK,GAAA;AAAK,YAAA,OAAO,QAAQ,EAAA,GAAK,GAAA;AAAA,UAC9B,KAAK,GAAA;AAAK,YAAA,OAAO,KAAA,GAAQ,KAAK,EAAA,GAAK,GAAA;AAAA,UACnC,KAAK,GAAA;AAAK,YAAA,OAAO,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA,UACxC;AAAS,YAAA,OAAO,GAAA;AAAA;AAClB,MACF;AAAA,MAEQ,cAAA,CAAe,KAAc,GAAA,EAAqB;AACxD,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,UACnB,KAAA,EAAO,mBAAA;AAAA,UACP,OAAA,EAAS,CAAA,4CAAA;AAAA,SACV,CAAA;AAAA,MACH;AAAA,MAEA,UAAA,GAA6B;AAC3B,QAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAElC,QAAA,OAAO,CAAC,GAAA,EAAc,GAAA,EAAe,IAAA,KAAuB;AAC1D,UAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG;AAC1B,YAAA,OAAO,IAAA,EAAK;AAAA,UACd;AAEA,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,GAAG,CAAA;AACzC,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAK,QAAQ,CAAA;AAEjD,UAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,OAAA,CAAQ,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC/D,UAAkB,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS;AAE3C,UAAA,GAAA,CAAI,SAAA,CAAU,mBAAA,EAAqB,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AACrD,UAAA,GAAA,CAAI,SAAA,CAAU,yBAAyB,SAAS,CAAA;AAChD,UAAA,GAAA,CAAI,UAAU,mBAAA,EAAqB,IAAA,CAAK,KAAK,MAAA,CAAO,SAAA,GAAY,GAAI,CAAC,CAAA;AAErE,UAAA,IAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AACrC,YAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,UACtC;AAEA,UAAA,IAAA,EAAK;AAAA,QACP,CAAA;AAAA,MACF;AAAA,MAEA,OAAA,GAAgB;AACd,QAAA,IAAA,CAAK,MAAM,OAAA,EAAQ;AAAA,MACrB;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrIA,UAAA,EAAA;;;ACEA,WAAA,EAAA;AAEO,IAAM,aAAN,MAAiB;AAAA,EACd,MAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAA4G,EAAC,EAAG;AAC1H,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,SAAA,IAAaA,cAAA,CAAO,GAAA,CAAI,YAAY,CAAA,IAAK,qCAAA;AAC/D,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,YAAA,IAAgBA,cAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,IAAK,IAAA;AACzE,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA,IAAiBA,eAAO,GAAA,CAAI,oBAAoB,KAAK,IAAA,CAAK,MAAA;AACvF,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,gBAAA,IAAoBA,cAAA,CAAO,GAAA,CAAI,wBAAwB,CAAA,IAAK,KAAA;AAAA,EAC9F;AAAA,EAEA,cAAc,OAAA,EAA6B;AACzC,IAAA,OAAOS,oBAAA,CAAI,KAAK,OAAA,EAAS,IAAA,CAAK,QAAQ,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,EACrE;AAAA,EAEA,qBAAqB,OAAA,EAA6B;AAChD,IAAA,OAAOA,oBAAA,CAAI,KAAK,OAAA,EAAS,IAAA,CAAK,eAAe,EAAE,SAAA,EAAW,IAAA,CAAK,gBAAA,EAAkB,CAAA;AAAA,EACnF;AAAA,EAEA,kBAAkB,OAAA,EAAgC;AAChD,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAAA,MACvC,YAAA,EAAc,IAAA,CAAK,oBAAA,CAAqB,OAAO;AAAA,KACjD;AAAA,EACF;AAAA,EAEA,YAAY,KAAA,EAA2B;AACrC,IAAA,OAAOA,oBAAA,CAAI,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EACtC;AAAA,EAEA,mBAAmB,KAAA,EAA2B;AAC5C,IAAA,OAAOA,oBAAA,CAAI,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,aAAa,CAAA;AAAA,EAC7C;AAAA,EAEA,cAAc,YAAA,EAAiC;AAC7C,IAAA,MAAM,EAAE,KAAK,GAAA,EAAK,GAAA,EAAK,GAAG,OAAA,EAAQ,GAAI,IAAA,CAAK,kBAAA,CAAmB,YAAY,CAAA;AAC1E,IAAA,OAAO,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,EACvC;AACF,CAAA;AAEO,IAAM,UAAA,GAAa,IAAI,UAAA,EAAW;;;AD5CzC,SAAA,EAAA;;;AEDA,WAAA,EAAA;AASO,IAAM,eAAN,MAAmB;AAAA,EAChB,SAAA,uBAA4C,GAAA,EAAI;AAAA,EAExD,WAAA,GAAc;AACZ,IAAA,MAAM,cAAA,GAAiBT,cAAA,CAAO,GAAA,CAAI,kBAAkB,CAAA;AACpD,IAAA,MAAM,kBAAA,GAAqBA,cAAA,CAAO,GAAA,CAAI,sBAAsB,CAAA;AAC5D,IAAA,MAAM,iBAAA,GAAoBA,cAAA,CAAO,GAAA,CAAI,qBAAqB,CAAA;AAE1D,IAAA,IAAI,cAAA,IAAkB,sBAAsB,iBAAA,EAAmB;AAC7D,MAAA,IAAA,CAAK,iBAAiB,QAAA,EAAU;AAAA,QAC9B,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,cAAA;AAAA,QACV,YAAA,EAAc,kBAAA;AAAA,QACd,WAAA,EAAa,iBAAA;AAAA,QACb,gBAAA,EAAkB,8CAAA;AAAA,QAClB,QAAA,EAAU,qCAAA;AAAA,QACV,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,gBAAA,CAAiB,MAAc,QAAA,EAA+B;AAC5D,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,QAAQ,CAAA;AAAA,EACnC;AAAA,EAEA,YAAY,IAAA,EAAyC;AACnD,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,mBAAA,CAAoB,cAAsB,KAAA,EAAwB;AAChE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,YAAY,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,YAAY,CAAA,eAAA,CAAiB,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,WAAW,QAAA,CAAS,QAAA;AAAA,MACpB,cAAc,QAAA,CAAS,WAAA;AAAA,MACvB,aAAA,EAAe,MAAA;AAAA,MACf,KAAA,EAAO,sBAAA;AAAA,MACP,OAAO,KAAA,IAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAO,GAAG,QAAA,CAAS,gBAAgB,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,YAAA,CAAa,YAAA,EAAsB,IAAA,EAAuE;AAC9G,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,YAAY,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,YAAY,CAAA,eAAA,CAAiB,CAAA;AAAA,IACjE;AAEA,IAAA,MAAMU,SAAAA,GAAW,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAI,eAAA,CAAgB;AAAA,QACxB,WAAW,QAAA,CAAS,QAAA;AAAA,QACpB,eAAe,QAAA,CAAS,YAAA;AAAA,QACxB,IAAA;AAAA,QACA,UAAA,EAAY,oBAAA;AAAA,QACZ,cAAc,QAAA,CAAS;AAAA,OACxB;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAACA,UAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAMA,SAAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAE,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,IAAA,GAAO,MAAMA,SAAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,aAAa,IAAA,CAAK,YAAA;AAAA,MAClB,cAAc,IAAA,CAAK;AAAA,KACrB;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CAAY,YAAA,EAAsB,WAAA,EAA6C;AACnF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,YAAY,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,YAAY,CAAA,eAAA,CAAiB,CAAA;AAAA,IACjE;AAEA,IAAA,MAAMA,SAAAA,GAAW,MAAM,KAAA,CAAM,QAAA,CAAS,WAAA,EAAa;AAAA,MACjD,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,UAAU,WAAW,CAAA;AAAA;AACtC,KACD,CAAA;AAED,IAAA,IAAI,CAACA,UAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAMA,SAAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,IAAA,GAAO,MAAMA,SAAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AACF,CAAA;AAEO,IAAM,YAAA,GAAe,IAAI,YAAA,EAAa;AChH7C,SAAA,EAAA;AAwBA,IAAM,oBAAN,MAA6C;AAAA,EACnC,KAAA,uBAA+B,GAAA,EAAI;AAAA,EAE3C,MAAM,YAAY,KAAA,EAAqC;AACrD,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,KAAA,EAAO,OAAO,IAAA;AAAA,IACnC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,EAAA,EAAkC;AAC/C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAO,IAAA,EAAmC;AAC9C,IAAA,MAAM,EAAA,GAAK,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AACjD,IAAA,MAAM,iBAAiB,MAAMC,uBAAA,CAAO,IAAA,CAAK,IAAA,CAAK,UAAU,EAAE,CAAA;AAC1D,IAAA,MAAM,IAAA,GAAa;AAAA,MACjB,EAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU,cAAA;AAAA,MACV,IAAA,EAAM,KAAK,IAAA,IAAQ,MAAA;AAAA,MACnB,MAAM,IAAA,CAAK;AAAA,KACb;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAAoC;AAC3D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAC9B,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,gBAAgB,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,EAAM,GAAG,IAAA,EAAK;AACnC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAC1B,IAAA,OAAO,OAAA;AAAA,EACT;AACF,CAAA;AAEO,IAAM,cAAN,MAAkB;AAAA,EACf,SAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAuB,KAAA;AAAA,EAE/B,WAAA,CAAY,OAAA,GAAuB,EAAC,EAAG,SAAA,EAAuB;AAC5D,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,IAAI,UAAA,IAAc,qCAAA;AAAA,MAC1D,YAAA,EAAc,QAAQ,YAAA,IAAgB,IAAA;AAAA,MACtC,aAAA,EAAe,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,IAAI,kBAAA,IAAsB,qCAAA;AAAA,MAC1E,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,KAAA;AAAA,MAC9C,cAAA,EAAgB,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,IAAI,gBAAA,IAAoB,EAAA;AAAA,MAC1E,kBAAA,EAAoB,OAAA,CAAQ,kBAAA,IAAsB,OAAA,CAAQ,IAAI,oBAAA,IAAwB,EAAA;AAAA,MACtF,iBAAA,EAAmB,OAAA,CAAQ,iBAAA,IAAqB,OAAA,CAAQ,IAAI,mBAAA,IAAuB;AAAA,KACrF;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA,IAAa,IAAI,iBAAA,EAAkB;AAAA,EACtD;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,IAAA,CAAK,QAAQ,cAAA,IAAkB,IAAA,CAAK,QAAQ,kBAAA,IAAsB,IAAA,CAAK,QAAQ,iBAAA,EAAmB;AACpG,MAAA,YAAA,CAAa,iBAAiB,QAAA,EAAU;AAAA,QACtC,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,KAAK,OAAA,CAAQ,cAAA;AAAA,QACvB,YAAA,EAAc,KAAK,OAAA,CAAQ,kBAAA;AAAA,QAC3B,WAAA,EAAa,KAAK,OAAA,CAAQ,iBAAA;AAAA,QAC1B,gBAAA,EAAkB,8CAAA;AAAA,QAClB,QAAA,EAAU,qCAAA;AAAA,QACV,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA,EAEA,MAAM,SAAS,IAAA,EAAoG;AACjH,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,KAAK,KAAK,CAAA;AAC5D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,IAAI,CAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,WAAW,iBAAA,CAAkB;AAAA,MAC1C,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA;AAED,IAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AAAA,EACxB;AAAA,EAEA,MAAM,MAAM,WAAA,EAA+G;AACzH,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,YAAY,KAAK,CAAA;AAC/D,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,QAAA,EAAU;AAC3B,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,UAAU,MAAMA,uBAAA,CAAO,QAAQ,WAAA,CAAY,QAAA,EAAU,KAAK,QAAQ,CAAA;AACxE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,MAAA,GAAS,WAAW,iBAAA,CAAkB;AAAA,MAC1C,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA;AAED,IAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AAAA,EACxB;AAAA,EAEA,MAAM,QAAQ,YAAA,EAA8E;AAC1F,IAAA,OAAO,UAAA,CAAW,cAAc,YAAY,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,iBAAiB,KAAA,EAAiC;AACtD,IAAA,OAAO,YAAA,CAAa,mBAAA,CAAoB,QAAA,EAAU,KAAK,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,qBAAqB,IAAA,EAA8F;AACvH,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,YAAA,CAAa,YAAA,CAAa,UAAU,IAAI,CAAA;AACtE,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,WAAA,CAAY,UAAU,WAAW,CAAA;AAErE,IAAA,IAAI,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,SAAS,KAAK,CAAA;AAE1D,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO;AAAA,QACjC,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,QAAA,EAAU,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,EAAE,CAAA;AAAA,QACjD,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,WAAW,iBAAA,CAAkB;AAAA,MAC1C,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA;AAED,IAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AAAA,EACxB;AAAA,EAEA,aAAA,GAAgC;AAC9B,IAAA,OAAO,CAAC,GAAA,EAAc,GAAA,EAAe,IAAA,KAAuB;AAC1D,MAAA,MAAM,UAAA,GAAa,IAAI,OAAA,CAAQ,aAAA;AAE/B,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA,EAAG;AACpD,QAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,qBAAqB,CAAA;AAAA,MAC5D;AAEA,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,SAAA,CAAU,CAAC,CAAA;AAEpC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,UAAA,CAAW,WAAA,CAAY,KAAK,CAAA;AAC5C,QAAA,GAAA,CAAI,IAAA,GAAO;AAAA,UACT,GAAG,OAAA;AAAA,UACH,IAAI,OAAA,CAAQ;AAAA,SACd;AACA,QAAA,IAAA,EAAK;AAAA,MACP,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,iBAAiB,CAAA;AAAA,MACxD;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,WAAA,GAA8B;AAC5B,IAAA,OAAO,CAAC,GAAA,EAAc,GAAA,EAAe,IAAA,KAAuB;AAC1D,MAAA,IAAI,CAAC,IAAI,IAAA,EAAM;AACb,QAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,2BAA2B,CAAA;AAAA,MAClE;AACA,MAAA,IAAA,EAAK;AAAA,IACP,CAAA;AAAA,EACF;AAAA,EAEA,YAAY,IAAA,EAA8B;AACxC,IAAA,OAAO,CAAC,GAAA,EAAc,GAAA,EAAe,IAAA,KAAuB;AAC1D,MAAA,IAAI,CAAC,IAAI,IAAA,EAAM;AACb,QAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,2BAA2B,CAAA;AAAA,MAClE;AACA,MAAA,IAAI,CAAC,WAAA,CAAY,OAAA,CAAQ,IAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA,EAAG;AAC7C,QAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,4BAA4B,CAAA;AAAA,MACnE;AACA,MAAA,IAAA,EAAK;AAAA,IACP,CAAA;AAAA,EACF;AAAA,EAEA,kBAAkB,UAAA,EAAoC;AACpD,IAAA,OAAO,CAAC,GAAA,EAAc,GAAA,EAAe,IAAA,KAAuB;AAC1D,MAAA,IAAI,CAAC,IAAI,IAAA,EAAM;AACb,QAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,2BAA2B,CAAA;AAAA,MAClE;AACA,MAAA,IAAI,CAAC,WAAA,CAAY,aAAA,CAAc,IAAI,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA,EAAG;AACzD,QAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,4BAA4B,CAAA;AAAA,MACnE;AACA,MAAA,IAAA,EAAK;AAAA,IACP,CAAA;AAAA,EACF;AACF;AAEA,IAAI,mBAAA,GAA0C,IAAA;AAEvC,SAAS,UAAA,CAAW,SAAuB,SAAA,EAAoC;AACpF,EAAA,mBAAA,GAAsB,IAAI,WAAA,CAAY,OAAA,EAAS,SAAS,CAAA;AACxD,EAAA,OAAO,mBAAA;AACT;AAEO,SAAS,IAAA,GAAoB;AAClC,EAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,IAAA,mBAAA,GAAsB,IAAI,WAAA,EAAY;AAAA,EACxC;AACA,EAAA,OAAO,mBAAA;AACT;AAEO,IAAM,IAAA,GAAO;AAAA,EAClB,UAAA,EAAY,CAAC,OAAA,KAA0B;AACrC,IAAA,MAAM,OAAA,GAAU,WAAW,OAAO,CAAA;AAClC,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,aAAA,EAAe,MAAM,OAAA,CAAQ,aAAA,EAAc;AAAA,MAC3C,WAAA,EAAa,MAAM,OAAA,CAAQ,WAAA,EAAY;AAAA,MACvC,WAAA,EAAa,CAAC,IAAA,KAAiB,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,MACvD,iBAAA,EAAmB,CAAC,UAAA,KAAuB,OAAA,CAAQ,kBAAkB,UAAU;AAAA,KACjF;AAAA,EACF;AACF;;;ACxPA,UAAA,EAAA;;;ACAA,WAAA,EAAA;AACA,WAAA,EAAA;AA2DA,IAAM,eAAN,MAAmB;AAAA,EACT,WAAA,GAAkC,IAAA;AAAA,EAClC,IAAA;AAAA,EAER,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAA,GAAOX,cAAA,CAAO,GAAA,CAAI,WAAW,CAAA,IAAK,qBAAA;AACvC,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,MAAM,IAAA,GAAOA,cAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AACnC,IAAA,MAAM,OAAO,QAAA,CAASA,cAAA,CAAO,IAAI,WAAW,CAAA,IAAK,OAAO,EAAE,CAAA;AAC1D,IAAA,MAAM,IAAA,GAAOA,cAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AACnC,IAAA,MAAM,IAAA,GAAOA,cAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AAEnC,IAAA,IAAI,IAAA,IAAQ,QAAQ,IAAA,EAAM;AACxB,MAAA,IAAA,CAAK,WAAA,GAAcY,4BAAW,eAAA,CAAgB;AAAA,QAC5C,IAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAQ,IAAA,KAAS,GAAA;AAAA,QACjB,IAAA,EAAM;AAAA,UACJ,IAAA;AAAA,UACA;AAAA;AACF,OACD,CAAA;AACD,MAAAV,cAAA,CAAO,KAAK,2BAA2B,CAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,eAAe,WAAA,EAAgC;AAC7C,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA,EAEA,MAAM,KAAK,OAAA,EAAuD;AAChE,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAAA,cAAA,CAAO,KAAK,kDAAkD,CAAA;AAC9D,MAAA,OAAO,EAAE,WAAW,iBAAA,EAAkB;AAAA,IACxC;AAEA,IAAA,MAAM,WAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,IAAA,CAAK,IAAA;AAAA,MAC3B,EAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA,GAAI,OAAA,CAAQ,EAAA,CAAG,IAAA,CAAK,IAAI,CAAA,GAAI,OAAA,CAAQ,EAAA;AAAA,MAChE,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA,CAAK,eAAe,OAAA,CAAQ,QAAA,EAAU,QAAQ,YAAY,CAAA;AAAA,MAChF,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,aAAa,OAAA,CAAQ;AAAA,KACvB;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,SAAS,WAAW,CAAA;AAC1D,IAAAA,cAAA,CAAO,IAAA,CAAK,iBAAiB,OAAA,CAAQ,EAAE,IAAI,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,CAAA;AAC1E,IAAA,OAAO,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU;AAAA,EACvC;AAAA,EAEQ,cAAA,CAAe,cAAuB,IAAA,EAAoD;AAChG,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,IAAA,EAAM,OAAO,MAAA;AAEnC,IAAA,MAAM,SAAA,GAAuE;AAAA,MAC3E,OAAA,EAAS,CAACW,KAAAA,KAAS;AAAA,qBAAA,EACFA,KAAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,iCAAA,EACPA,KAAAA,CAAK,WAAW,cAAc,CAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MAG3D,aAAA,EAAe,CAACA,KAAAA,KAAS;AAAA;AAAA,0BAAA,EAEHA,MAAK,QAAQ,CAAA;AAAA,gCAAA,EACPA,KAAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,MAAA,CAAA;AAAA,MAEnD,YAAA,EAAc,CAACA,KAAAA,KAAS;AAAA;AAAA,0BAAA,EAEFA,MAAK,SAAS,CAAA;AAAA,MAAA;AAAA,KAEtC;AAEA,IAAA,MAAM,QAAA,GAAW,UAAU,YAAY,CAAA;AACvC,IAAA,OAAO,QAAA,GAAW,QAAA,CAAS,IAAI,CAAA,GAAI,MAAA;AAAA,EACrC;AACF,CAAA;AAEA,IAAM,aAAN,MAAiB;AAAA,EACP,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA,GAAuB,KAAA;AAAA,EAE/B,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAA,GAAab,cAAA,CAAO,GAAA,CAAI,oBAAoB,CAAA,IAAK,EAAA;AACtD,IAAA,IAAA,CAAK,SAAA,GAAYA,cAAA,CAAO,GAAA,CAAI,mBAAmB,CAAA,IAAK,EAAA;AACpD,IAAA,IAAA,CAAK,WAAA,GAAcA,cAAA,CAAO,GAAA,CAAI,qBAAqB,CAAA,IAAK,EAAA;AACxD,IAAA,IAAA,CAAK,cAAc,CAAC,EAAE,KAAK,UAAA,IAAc,IAAA,CAAK,aAAa,IAAA,CAAK,WAAA,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,KAAK,OAAA,EAA+C;AACxD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAAE,cAAA,CAAO,KAAK,qCAAqC,CAAA;AACjD,MAAA,OAAO,EAAE,KAAK,UAAA,EAAW;AAAA,IAC3B;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAO,QAAQ,CAAA;AACpC,MAAA,MAAM,SAAS,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,KAAK,SAAS,CAAA;AAE7D,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO;AAAA,QAC1C,MAAM,OAAA,CAAQ,OAAA;AAAA,QACd,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,IAAA,CAAK,WAAA;AAAA,QAC3B,IAAI,OAAA,CAAQ;AAAA,OACb,CAAA;AAED,MAAAA,cAAA,CAAO,IAAA,CAAK,eAAe,OAAA,CAAQ,EAAE,IAAI,EAAE,GAAA,EAAK,MAAA,CAAO,GAAA,EAAK,CAAA;AAC5D,MAAA,OAAO,EAAE,GAAA,EAAK,MAAA,CAAO,GAAA,EAAI;AAAA,IAC3B,SAAS,KAAA,EAAO;AACd,MAAAA,cAAA,CAAO,KAAA,CAAM,oBAAA,EAAsB,EAAE,KAAA,EAAO,CAAA;AAC5C,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF,CAAA;AAEA,IAAM,iBAAN,MAAqB;AAAA,EACnB,MAAM,KAAK,OAAA,EAAqE;AAC9E,IAAA,MAAMQ,SAAAA,GAAW,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK;AAAA,MACxC,MAAA,EAAQ,QAAQ,MAAA,IAAU,MAAA;AAAA,MAC1B,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG,OAAA,CAAQ;AAAA,OACb;AAAA,MACA,MAAM,OAAA,CAAQ,IAAA,GAAO,KAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,GAAI,MAAA;AAAA,MACpD,QAAQ,OAAA,CAAQ,OAAA,GAAU,YAAY,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,GAAI;AAAA,KAClE,CAAA;AAED,IAAA,MAAM,OAAO,MAAMA,SAAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AACnD,IAAAR,cAAA,CAAO,IAAA,CAAK,mBAAmB,OAAA,CAAQ,GAAG,IAAI,EAAE,MAAA,EAAQQ,SAAAA,CAAS,MAAA,EAAQ,CAAA;AACzE,IAAA,OAAO,EAAE,MAAA,EAAQA,SAAAA,CAAS,MAAA,EAAQ,IAAA,EAAK;AAAA,EACzC;AACF,CAAA;AAEA,IAAM,eAAN,MAAmB;AAAA,EACT,UAAA;AAAA,EAER,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAA,GAAaV,cAAA,CAAO,GAAA,CAAI,mBAAmB,CAAA,IAAK,EAAA;AAAA,EACvD;AAAA,EAEA,cAAc,GAAA,EAAmB;AAC/B,IAAA,IAAA,CAAK,UAAA,GAAa,GAAA;AAAA,EACpB;AAAA,EAEA,MAAM,KAAK,OAAA,EAAiD;AAC1D,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAAE,cAAA,CAAO,KAAK,gDAAgD,CAAA;AAC5D,MAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,IACrB;AAEA,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,YAAY,OAAA,CAAQ;AAAA,KACtB;AAEA,IAAA,MAAMQ,SAAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,UAAA,EAAY;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAED,IAAA,MAAM,KAAKA,SAAAA,CAAS,EAAA;AACpB,IAAA,IAAI,EAAA,EAAI;AACN,MAAAR,cAAA,CAAO,KAAK,oBAAoB,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAAA,cAAA,CAAO,MAAM,8BAA8B,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,EAAE,EAAA,EAAG;AAAA,EACd;AACF,CAAA;AAEA,IAAM,sBAAN,MAA0B;AAAA,EACxB,KAAA;AAAA,EACA,GAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,YAAA,EAAa;AAC9B,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,UAAA,EAAW;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,cAAA,EAAe;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,YAAA,EAAa;AAAA,EAChC;AACF,CAAA;AAEO,IAAM,MAAA,GAAS,IAAI,mBAAA;AAEnB,IAAM,YAAA,GAAe;AAAA,EAC1B,OAAO,CAAC,OAAA,KAA0B,MAAA,CAAO,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,EAC3D,KAAK,CAAC,OAAA,KAAwB,MAAA,CAAO,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,EACrD,SAAS,CAAC,OAAA,KAA4B,MAAA,CAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EACjE,OAAO,CAAC,OAAA,KAA0B,MAAA,CAAO,KAAA,CAAM,KAAK,OAAO;AAC7D;;;ADhQA,WAAA,EAAA;;;AEHA,YAAA,EAAA;;;AFKA,WAAA,EAAA;;;AG2BO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,OAAO,OAAA,CAAW,GAAA,EAAe,IAAA,EAAU,OAAA,EAAkB,aAAqB,GAAA,EAAe;AAC/F,IAAA,MAAMQ,SAAAA,GAA2B;AAAA,MAC/B,OAAA,EAAS,IAAA;AAAA,MACT,IAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,UAAU,CAAA,CAAE,KAAKA,SAAQ,CAAA;AAAA,EAC7C;AAAA,EAEA,OAAO,OAAA,CAAW,GAAA,EAAe,IAAA,EAAU,UAAkB,kBAAA,EAA8B;AACzF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,IAAA,EAAM,SAAS,GAAG,CAAA;AAAA,EAC7C;AAAA,EAEA,OAAO,OAAA,CAAW,GAAA,EAAe,IAAA,EAAU,UAAkB,kBAAA,EAA8B;AACzF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,IAAA,EAAM,SAAS,GAAG,CAAA;AAAA,EAC7C;AAAA,EAEA,OAAO,OAAA,CAAQ,GAAA,EAAe,OAAA,GAAkB,kBAAA,EAA8B;AAC5E,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,IAAA,EAAM,SAAS,GAAG,CAAA;AAAA,EAC7C;AAAA,EAEA,OAAO,KAAA,CACL,GAAA,EACA,OACA,UAAA,GAAqB,GAAA,EACrB,MACA,OAAA,EACU;AACV,IAAA,MAAMA,SAAAA,GAA0B;AAAA,MAC9B,OAAA,EAAS,KAAA;AAAA,MACT,KAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAI,OAAA,IAAW,EAAE,OAAA;AAAQ,KAC3B;AACA,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,UAAU,CAAA,CAAE,KAAKA,SAAQ,CAAA;AAAA,EAC7C;AAAA,EAEA,OAAO,UAAA,CAAW,GAAA,EAAe,KAAA,GAAgB,eAAe,IAAA,EAAyB;AACvF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,KAAK,IAAI,CAAA;AAAA,EACzC;AAAA,EAEA,OAAO,YAAA,CAAa,GAAA,EAAe,KAAA,GAAgB,gBAAgB,IAAA,EAAyB;AAC1F,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,KAAK,IAAI,CAAA;AAAA,EACzC;AAAA,EAEA,OAAO,SAAA,CAAU,GAAA,EAAe,KAAA,GAAgB,aAAa,IAAA,EAAyB;AACpF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,KAAK,IAAI,CAAA;AAAA,EACzC;AAAA,EAEA,OAAO,QAAA,CAAS,GAAA,EAAe,KAAA,GAAgB,sBAAsB,IAAA,EAAyB;AAC5F,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,KAAK,IAAI,CAAA;AAAA,EACzC;AAAA,EAEA,OAAO,QAAA,CAAS,GAAA,EAAe,KAAA,GAAgB,YAAY,IAAA,EAAyB;AAClF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,KAAK,IAAI,CAAA;AAAA,EACzC;AAAA,EAEA,OAAO,eAAA,CAAgB,GAAA,EAAe,KAAA,EAAe,OAAA,EAA6C;AAChG,IAAA,OAAO,KAAK,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,GAAA,EAAK,oBAAoB,OAAO,CAAA;AAAA,EAChE;AAAA,EAEA,OAAO,aAAA,CAAc,GAAA,EAAe,KAAA,GAAgB,uBAAA,EAAmC;AACrF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,KAAA,EAAO,KAAK,gBAAgB,CAAA;AAAA,EACrD;AAAA,EAEA,OAAO,SAAA,CACL,GAAA,EACA,IAAA,EACA,IAAA,EACA,OACA,KAAA,EACgC;AAChC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAA;AAC1C,IAAA,MAAMA,SAAAA,GAAiC;AAAA,MACrC,OAAA,EAAS,IAAA;AAAA,MACT,IAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA;AACF,KACF;AACA,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,KAAKA,SAAQ,CAAA;AAAA,EACtC;AAAA,EAEA,OAAO,UAAU,GAAA,EAAyB;AACxC,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,EAC9B;AACF;AAsBA,IAAI;AAEF,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAQ,SAAS,CAAA,CAAE,QAAA;AACjC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,CAAM,OAAA,GAAU,SAA6B,IAAA,EAAU,OAAA,EAAkB,aAAqB,GAAA,EAAK;AACjG,MAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,IAAA,EAAM,IAAA,EAAM,SAAS,UAAU,CAAA;AAAA,IAC/D,CAAA;AAEA,IAAA,KAAA,CAAM,OAAA,GAAU,SAA6B,IAAA,EAAU,OAAA,EAAkB;AACvE,MAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AAAA,IACnD,CAAA;AAEA,IAAA,KAAA,CAAM,OAAA,GAAU,SAA6B,IAAA,EAAU,OAAA,EAAkB;AACvE,MAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AAAA,IACnD,CAAA;AAEA,IAAA,KAAA,CAAM,OAAA,GAAU,SAA0B,OAAA,EAAkB;AAC1D,MAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AAAA,IAC7C,CAAA;AAEA,IAAA,KAAA,CAAM,QAAQ,SAA0B,KAAA,EAAe,UAAA,GAAqB,GAAA,EAAK,MAAe,OAAA,EAAmC;AACjI,MAAA,OAAO,eAAe,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,MAAM,OAAO,CAAA;AAAA,IACpE,CAAA;AAEA,IAAA,KAAA,CAAM,UAAA,GAAa,SAA0B,KAAA,EAAgB,IAAA,EAAe;AAC1E,MAAA,OAAO,cAAA,CAAe,UAAA,CAAW,IAAA,EAAM,KAAA,EAAO,IAAI,CAAA;AAAA,IACpD,CAAA;AAEA,IAAA,KAAA,CAAM,YAAA,GAAe,SAA0B,KAAA,EAAgB,IAAA,EAAe;AAC5E,MAAA,OAAO,cAAA,CAAe,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,IAAI,CAAA;AAAA,IACtD,CAAA;AAEA,IAAA,KAAA,CAAM,SAAA,GAAY,SAA0B,KAAA,EAAgB,IAAA,EAAe;AACzE,MAAA,OAAO,cAAA,CAAe,SAAA,CAAU,IAAA,EAAM,KAAA,EAAO,IAAI,CAAA;AAAA,IACnD,CAAA;AAEA,IAAA,KAAA,CAAM,QAAA,GAAW,SAA0B,KAAA,EAAgB,IAAA,EAAe;AACxE,MAAA,OAAO,cAAA,CAAe,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,IAAI,CAAA;AAAA,IAClD,CAAA;AAEA,IAAA,KAAA,CAAM,QAAA,GAAW,SAA0B,KAAA,EAAgB,IAAA,EAAe;AACxE,MAAA,OAAO,cAAA,CAAe,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,IAAI,CAAA;AAAA,IAClD,CAAA;AAEA,IAAA,KAAA,CAAM,eAAA,GAAkB,SAA0B,KAAA,EAAe,OAAA,EAAmC;AAClG,MAAA,OAAO,cAAA,CAAe,eAAA,CAAgB,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AAAA,IAC5D,CAAA;AAEA,IAAA,KAAA,CAAM,aAAA,GAAgB,SAA0B,KAAA,EAAgB;AAC9D,MAAA,OAAO,cAAA,CAAe,aAAA,CAAc,IAAA,EAAM,KAAK,CAAA;AAAA,IACjD,CAAA;AAEA,IAAA,KAAA,CAAM,SAAA,GAAY,SAA6B,IAAA,EAAW,IAAA,EAAc,OAAe,KAAA,EAAe;AACpG,MAAA,OAAO,eAAe,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,KAAK,CAAA;AAAA,IAChE,CAAA;AAAA,EACF;AACF,CAAA,CAAA,MAAQ;AAER;AAEO,IAAM,QAAA,GAAW;;;AC1MxB,WAAA,EAAA;AACA,WAAA,EAAA;AAqCA,IAAM,YAAN,MAAgB;AAAA,EACN,MAAA,GAA0B,IAAA;AAAA,EAC1B,MAAA;AAAA,EACA,WAAA,GAAuB,KAAA;AAAA,EAE/B,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AAAA,EAChB;AAAA,EAEA,WAAWV,OAAAA,EAAwB;AACjC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAIc,iBAAA,CAAS;AAAA,MACzB,MAAA,EAAQd,QAAO,MAAA,IAAU,WAAA;AAAA,MACzB,WAAA,EAAaA,OAAAA,CAAO,WAAA,IAAeA,OAAAA,CAAO,eAAA,GACtC;AAAA,QACE,aAAaA,OAAAA,CAAO,WAAA;AAAA,QACpB,iBAAiBA,OAAAA,CAAO;AAAA,OAC1B,GACA,MAAA;AAAA,MACJ,UAAUA,OAAAA,CAAO,QAAA;AAAA,MACjB,cAAA,EAAgBA,QAAO,cAAA,IAAkB;AAAA,KAC1C,CAAA;AAED,IAAA,IAAA,CAAK,SAASA,OAAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAAE,cAAA,CAAO,KAAK,wBAAA,EAA0B,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC/D;AAAA,EAEA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,MAAA,GAASF,cAAA,CAAO,GAAA,CAAI,YAAY,CAAA,IAAK,WAAA;AAC3C,MAAA,MAAM,MAAA,GAASA,cAAA,CAAO,GAAA,CAAI,eAAe,CAAA,IAAK,EAAA;AAE9C,MAAA,IAAA,CAAK,UAAA,CAAW;AAAA,QACd,MAAA;AAAA,QACA,WAAA,EAAaA,cAAA,CAAO,GAAA,CAAI,mBAAmB,CAAA;AAAA,QAC3C,eAAA,EAAiBA,cAAA,CAAO,GAAA,CAAI,uBAAuB,CAAA;AAAA,QACnD,MAAA;AAAA,QACA,QAAA,EAAUA,cAAA,CAAO,GAAA,CAAI,cAAc;AAAA,OACpC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,CACJ,IAAA,EACA,OAAA,GAAyB,EAAC,EACH;AACvB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,WAAA,EAAY;AAC5C,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,iBAAiB,GAAG,CAAA;AAEpE,IAAA,MAAM,OAAA,GAAU,IAAIe,yBAAA,CAAiB;AAAA,MACnC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,WAAA,EAAa,WAAA;AAAA,MACb,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,MAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAE/B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,IAAA,EAAM,CAAA;AAEjF,IAAAb,cAAA,CAAO,IAAA,CAAK,uBAAuB,EAAE,GAAA,EAAK,QAAQ,IAAA,CAAK,MAAA,EAAQ,aAAa,CAAA;AAE5E,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,GAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CACJ,IAAA,EACA,QAAA,EACA,OAAA,GAAyB,EAAC,EACH;AACvB,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,CAAA,OAAA,EAAU,KAAK,GAAA,EAAK,IAAI,QAAQ,CAAA,CAAA;AAE3D,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,EAAM;AAAA,MACvB,GAAG,OAAA;AAAA,MACH,GAAA;AAAA,MACA,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,oBAAoB,QAAQ;AAAA,KACtE,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CACJ,IAAA,EACA,QAAA,EACA,OAAA,GAAyB,EAAC,EACH;AACvB,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,CAAA,OAAA,EAAU,KAAK,GAAA,EAAK,IAAI,QAAQ,CAAA,CAAA;AAE3D,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,EAAM;AAAA,MACvB,GAAG,OAAA;AAAA,MACH,GAAA;AAAA,MACA,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,oBAAoB,QAAQ;AAAA,KACtE,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,GAAA,EAA4B;AACvC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,OAAA,GAAU,IAAIc,4BAAA,CAAoB;AAAA,MACtC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,GAAA,EAAK;AAAA,KACN,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,MAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAC/B,IAAAd,cAAA,CAAO,KAAK,sBAAA,EAAwB,EAAE,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,YAAA,CAAa,GAAA,EAAa,OAAA,GAA4B,EAAC,EAAoB;AAC/E,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,OAAA,GAAU,IAAIe,yBAAA,CAAiB;AAAA,MACnC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,GAAA,EAAK;AAAA,KACN,CAAA;AAED,IAAA,OAAOC,+BAAA,CAAa,IAAA,CAAK,MAAA,EAAS,OAAA,EAAS;AAAA,MACzC,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,KACjC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,GAAA,EAA8B;AAC/C,IAAA,OAAO,CAAA,QAAA,EAAW,IAAA,CAAK,MAAM,CAAA,IAAA,EAAOlB,cAAA,CAAO,IAAI,YAAY,CAAA,IAAK,WAAW,CAAA,eAAA,EAAkB,GAAG,CAAA,CAAA;AAAA,EAClG;AAAA,EAEA,MAAM,SAAA,CAAU,MAAA,EAAiB,OAAA,GAAkB,GAAA,EAA6B;AAC9E,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,OAAA,GAAU,IAAImB,6BAAA,CAAqB;AAAA,MACvC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,MAAMT,SAAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAQ,KAAK,OAAO,CAAA;AAEhD,IAAA,OAAA,CAAQA,UAAS,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC9C,GAAA,EAAK,KAAK,GAAA,IAAO,EAAA;AAAA,MACjB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,MAAM,IAAA,CAAK;AAAA,KACb,CAAE,CAAA;AAAA,EACJ;AAAA,EAEQ,WAAA,GAAsB;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AACzD,IAAA,OAAO,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,EACvC;AAAA,EAEQ,iBAAiB,GAAA,EAAqB;AAC5C,IAAA,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AAE9C,IAAA,MAAM,YAAA,GAAuC;AAAA,MAC3C,GAAA,EAAK,YAAA;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,GAAA,EAAK,WAAA;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,GAAA,EAAK,eAAA;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,GAAA,EAAK,iBAAA;AAAA,MACL,GAAA,EAAK,iBAAA;AAAA,MACL,GAAA,EAAK,iBAAA;AAAA,MACL,IAAA,EAAM,kBAAA;AAAA,MACN,GAAA,EAAK;AAAA,KACP;AAEA,IAAA,OAAO,YAAA,CAAa,GAAA,IAAO,EAAE,CAAA,IAAK,0BAAA;AAAA,EACpC;AAAA,EAEQ,oBAAoB,QAAA,EAA0B;AACpD,IAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AACnD,IAAA,MAAM,UAAA,GAAqC;AAAA,MACzC,GAAA,EAAK,YAAA;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,GAAA,EAAK,WAAA;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,GAAA,EAAK;AAAA,KACP;AACA,IAAA,OAAO,UAAA,CAAW,GAAA,IAAO,EAAE,CAAA,IAAK,YAAA;AAAA,EAClC;AAAA,EAEQ,oBAAoB,QAAA,EAA0B;AACpD,IAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AACnD,IAAA,MAAM,UAAA,GAAqC;AAAA,MACzC,GAAA,EAAK,WAAA;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,GAAA,EAAK,iBAAA;AAAA,MACL,GAAA,EAAK,iBAAA;AAAA,MACL,GAAA,EAAK,kBAAA;AAAA,MACL,GAAA,EAAK;AAAA,KACP;AACA,IAAA,OAAO,UAAA,CAAW,GAAA,IAAO,EAAE,CAAA,IAAK,WAAA;AAAA,EAClC;AACF,CAAA;AAEO,IAAM,SAAA,GAAY,IAAI,SAAA;AAEtB,IAAM,MAAA,GAAS;AAAA,EACpB,UAAA,EAAY,CAACV,OAAAA,KAAqB,SAAA,CAAU,WAAWA,OAAM,CAAA;AAAA,EAE7D,MAAM,CAAC,IAAA,EAAoC,YACzC,SAAA,CAAU,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,EAEhC,KAAA,EAAO,CAAC,IAAA,EAAoC,QAAA,EAAkB,YAC5D,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAAA,EAE/C,KAAA,EAAO,CAAC,IAAA,EAAoC,QAAA,EAAkB,YAC5D,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAAA,EAE/C,MAAA,EAAQ,CAAC,GAAA,KAAgB,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,EAC7C,cAAc,CAAC,GAAA,EAAa,YAA+B,SAAA,CAAU,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,EAC9F,YAAA,EAAc,CAAC,GAAA,KAAgB,SAAA,CAAU,aAAa,GAAG,CAAA;AAAA,EACzD,WAAW,CAAC,MAAA,EAAiB,YAAqB,SAAA,CAAU,SAAA,CAAU,QAAQ,OAAO;AACvF;;;ACpQA,WAAA,EAAA;AAEA,WAAA,EAAA;AAmCA,IAAM,gBAAN,MAAoB;AAAA,EACV,OAAA,uBAAmC,GAAA,EAAI;AAAA,EACvC,GAAA,GAA4C,IAAA;AAAA,EAC5C,WAAA,GAAkC,IAAA;AAAA,EAClC,YAAA,GAAoC,IAAA;AAAA,EAE5C,SAAS,MAAA,EAAsB;AAC7B,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AACpC,IAAAE,cAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,YAAA,CAAc,CAAA;AAAA,EAClD;AAAA,EAEA,WAAW,IAAA,EAAoB;AAC7B,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxB,IAAAA,cAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,IAAI,CAAA,cAAA,CAAgB,CAAA;AAAA,EAC7C;AAAA,EAEA,IAAI,IAAA,EAAkC;AACpC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAA,GAAmB;AACjB,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,MAAM,cAAc,GAAA,EAAmD;AACrE,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAEX,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC1C,MAAAA,cAAA,CAAO,IAAA,CAAK,CAAA,qBAAA,EAAwB,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAClD,MAAA,MAAM,MAAA,CAAO,WAAW,GAAG,CAAA;AAE3B,MAAA,IAAI,MAAA,CAAO,UAAA,IAAc,KAAA,IAAS,GAAA,EAAK;AACrC,QAAA,KAAA,MAAW,EAAA,IAAM,OAAO,UAAA,EAAY;AAClC,UAAC,GAAA,CAAoB,IAAI,EAAE,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,OAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA,GAAuB,KAAA;AAAA,EAE/B,WAAA,CAAY,OAAA,GAAsB,EAAC,EAAG;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,EAAc;AAAA,EACzC;AAAA,EAEA,IAAI,MAAA,EAAsB;AACxB,IAAA,IAAA,CAAK,aAAA,CAAc,SAAS,MAAM,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,GAAA,EAAmD;AAClE,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAAF,cAAA,CAAO,IAAA,EAAK;AAEZ,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,KAAA,EAAO;AACjC,MAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAW,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,EAAC;AACvF,MAAAE,cAAA,CAAO,OAAO,aAAa,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,KAAA,EAAO;AAC/B,MAAA,MAAM,WAAA,GAAc,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,GAAO,EAAC;AACjF,MAAA,IAAA,CAAK,WAAA,GAAc,WAAW,WAAW,CAAA;AACzC,MAAA,MAAM,IAAA,CAAK,YAAY,UAAA,EAAW;AAElC,MAAA,IAAA,CAAK,cAAc,QAAA,CAAS;AAAA,QAC1B,IAAA,EAAM,MAAA;AAAA,QACN,UAAA,EAAY,CAACkB,IAAAA,KAAQ;AACnB,UAAA,IAAI,SAASA,IAAAA,EAAK;AAChB,YAACA,IAAAA,CAAoB,GAAA,CAAI,IAAA,CAAK,WAAA,CAAa,eAAe,CAAA;AAAA,UAC5D;AAAA,QACF,CAAA;AAAA,QACA,UAAA,EAAY,CAAC,IAAA,CAAK,WAAA,CAAa,eAAe;AAAA,OAC/C,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,KAAA,EAAO;AAChC,MAAA,MAAM,YAAA,GAAe,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAU,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,EAAC;AACpF,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAA,CAAC,MAAM,6DAAmB,KAAA,CAAM,eAAA,CAAgB,EAAE,GAAA,EAAK,YAAA,CAAa,UAAU,CAAA;AAAA,MAChF;AAEA,MAAA,IAAA,CAAK,cAAc,QAAA,CAAS;AAAA,QAC1B,IAAA,EAAM,OAAA;AAAA,QACN,YAAY,MAAM;AAAA,QAAC;AAAA,OACpB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAA,KAAc,KAAA,EAAO;AACpC,MAAA,MAAM,gBAAA,GAAmB,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAc,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,EAAC;AAEhG,MAAA,IAAA,CAAK,cAAc,QAAA,CAAS;AAAA,QAC1B,IAAA,EAAM,YAAA;AAAA,QACN,UAAA,EAAY,CAACA,IAAAA,KAAQ;AACnB,UAAA,IAAI,SAASA,IAAAA,EAAK;AAChB,YAACA,IAAAA,CAAoB,GAAA,CAAI,SAAA,CAAU,gBAAgB,CAAC,CAAA;AAAA,UACtD;AAAA,QACF,CAAA;AAAA,QACA,UAAA,EAAY,CAAC,SAAA,CAAU,gBAAgB,CAAC;AAAA,OACzC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,aAAA,KAAkB,KAAA,EAAO;AACxC,MAAA,IAAA,CAAK,cAAc,QAAA,CAAS;AAAA,QAC1B,IAAA,EAAM,eAAA;AAAA,QACN,YAAY,MAAM;AAAA,QAAC;AAAA,OACpB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,aAAA,CAAc,GAAG,CAAA;AAC1C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAAlB,cAAA,CAAO,KAAK,sBAAsB,CAAA;AAAA,EACpC;AAAA,EAEA,OAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,gBAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AACF;AAEO,SAAS,SAAA,CAAU,OAAA,GAAsB,EAAC,EAAmB;AAClE,EAAA,OAAO,IAAI,eAAe,OAAO,CAAA;AACnC;AAEO,SAAS,gBAAA,CAAiB,OAAA,GAAsB,EAAC,EAAgB;AACtE,EAAA,MAAM,OAAA,GAAU,UAAQ,SAAS,CAAA;AACjC,EAAA,MAAM,MAAM,OAAA,EAAQ;AAEpB,EAAA,MAAM,UAAU,SAAA,CAAU,EAAE,GAAG,OAAA,EAAS,SAAA,EAAW,WAAW,CAAA;AAC9D,EAAA,OAAA,CAAQ,WAAW,GAAG,CAAA;AAEtB,EAAA,OAAO,GAAA;AACT;;;ALlLA,UAAA,EAAA;AACA,UAAA,EAAA;AAEA,WAAA,EAAA;AAEA,WAAA,EAAA","file":"index.js","sourcesContent":["export type Role = 'admin' | 'user' | 'guest' | string;\n\nexport interface User {\n id: string;\n email: string;\n password?: string;\n role: Role;\n name?: string;\n picture?: string;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport interface JWTPayload {\n userId: string;\n email: string;\n role: Role;\n}\n\nexport interface TokenPair {\n accessToken: string;\n refreshToken: string;\n}\n\nexport interface AuthOptions {\n jwtSecret?: string;\n jwtExpiresIn?: string;\n refreshSecret?: string;\n refreshExpiresIn?: string;\n googleClientId?: string;\n googleClientSecret?: string;\n googleRedirectUri?: string;\n}\n\nexport interface AuthUserRequest extends Request {\n user?: JWTPayload;\n}\n\nexport type Permission = string;\n\nexport interface RolePermissions {\n [role: string]: Permission[];\n}\n\nexport const DEFAULT_PERMISSIONS: RolePermissions = {\n admin: ['*'],\n user: ['read', 'write:own'],\n guest: ['read:public'],\n};\n\nexport interface LoginCredentials {\n email: string;\n password: string;\n}\n\nexport interface RegisterData extends LoginCredentials {\n name?: string;\n role?: Role;\n}\n\nexport interface OAuthProvider {\n name: string;\n clientId: string;\n clientSecret: string;\n redirectUri: string;\n authorizationUrl: string;\n tokenUrl: string;\n userInfoUrl: string;\n}\n","import { z } from 'zod';\n\nexport const envSchema = z.object({\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z.string().default('3000'),\n DATABASE_URL: z.string().optional(),\n REDIS_URL: z.string().default('redis://localhost:6379'),\n JWT_SECRET: z.string().min(32).optional(),\n JWT_EXPIRES_IN: z.string().default('7d'),\n JWT_REFRESH_SECRET: z.string().min(32).optional(),\n JWT_REFRESH_EXPIRES_IN: z.string().default('30d'),\n GOOGLE_CLIENT_ID: z.string().optional(),\n GOOGLE_CLIENT_SECRET: z.string().optional(),\n GOOGLE_REDIRECT_URI: z.string().optional(),\n SMTP_HOST: z.string().optional(),\n SMTP_PORT: z.string().default('587'),\n SMTP_USER: z.string().optional(),\n SMTP_PASS: z.string().optional(),\n SMTP_FROM: z.string().optional(),\n TWILIO_ACCOUNT_SID: z.string().optional(),\n TWILIO_AUTH_TOKEN: z.string().optional(),\n TWILIO_PHONE_NUMBER: z.string().optional(),\n SLACK_WEBHOOK_URL: z.string().optional(),\n RATE_LIMIT_WINDOW: z.string().default('1m'),\n RATE_LIMIT_LIMIT: z.string().default('100'),\n LOG_LEVEL: z.enum(['fatal', 'error', 'warn', 'info', 'debug', 'trace']).default('info'),\n AWS_REGION: z.string().default('us-east-1'),\n AWS_ACCESS_KEY_ID: z.string().optional(),\n AWS_SECRET_ACCESS_KEY: z.string().optional(),\n AWS_S3_BUCKET: z.string().optional(),\n AWS_ENDPOINT: z.string().optional(),\n});\n\nexport type EnvConfig = z.infer<typeof envSchema>;\n\nexport interface ConfigOptions {\n schema?: z.ZodSchema;\n envPath?: string;\n validate?: boolean;\n}\n\nclass ConfigManager {\n private config: EnvConfig | null = null;\n private schema: z.ZodSchema;\n private validate: boolean;\n\n constructor(options: ConfigOptions = {}) {\n this.schema = options.schema || envSchema;\n this.validate = options.validate ?? true;\n }\n\n load(): EnvConfig {\n if (this.config) return this.config;\n\n const env: Record<string, string | undefined> = {};\n \n for (const key of Object.keys(this.schema.shape)) {\n env[key] = process.env[key];\n }\n\n if (this.validate) {\n const result = this.schema.safeParse(env);\n if (!result.success) {\n const errors = result.error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');\n throw new Error(`Config validation failed: ${errors}`);\n }\n this.config = result.data;\n } else {\n this.config = env as EnvConfig;\n }\n\n return this.config;\n }\n\n get<K extends keyof EnvConfig>(key: K): EnvConfig[K] {\n if (!this.config) this.load();\n return this.config![key];\n }\n\n int(key: keyof EnvConfig): number {\n const value = this.get(key);\n if (typeof value === 'string') return parseInt(value, 10);\n return Number(value);\n }\n\n bool(key: keyof EnvConfig): boolean {\n const value = this.get(key);\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value.toLowerCase() === 'true';\n return Boolean(value);\n }\n\n isProduction(): boolean {\n return this.get('NODE_ENV') === 'production';\n }\n\n isDevelopment(): boolean {\n return this.get('NODE_ENV') === 'development';\n }\n\n isTest(): boolean {\n return this.get('NODE_ENV') === 'test';\n }\n\n getAll(): EnvConfig {\n if (!this.config) this.load();\n return this.config!;\n }\n}\n\nconst globalConfig = new ConfigManager();\n\nexport const config = {\n load: () => globalConfig.load(),\n get: <K extends keyof EnvConfig>(key: K) => globalConfig.get(key),\n int: (key: keyof EnvConfig) => globalConfig.int(key),\n bool: (key: keyof EnvConfig) => globalConfig.bool(key),\n isProduction: () => globalConfig.isProduction(),\n isDevelopment: () => globalConfig.isDevelopment(),\n isTest: () => globalConfig.isTest(),\n getAll: () => globalConfig.getAll(),\n create: (options?: ConfigOptions) => new ConfigManager(options),\n};\n\nexport default config;\n","import { Role, Permission, RolePermissions, DEFAULT_PERMISSIONS } from './types';\n\nexport class RBACService {\n private permissions: RolePermissions;\n\n constructor(permissions: RolePermissions = DEFAULT_PERMISSIONS) {\n this.permissions = permissions;\n }\n\n setPermissions(permissions: RolePermissions): void {\n this.permissions = permissions;\n }\n\n addPermission(role: Role, permission: Permission): void {\n if (!this.permissions[role]) {\n this.permissions[role] = [];\n }\n if (!this.permissions[role].includes(permission)) {\n this.permissions[role].push(permission);\n }\n }\n\n removePermission(role: Role, permission: Permission): void {\n if (this.permissions[role]) {\n this.permissions[role] = this.permissions[role].filter(p => p !== permission);\n }\n }\n\n getPermissions(role: Role): Permission[] {\n return this.permissions[role] || [];\n }\n\n hasPermission(role: Role, requiredPermission: Permission): boolean {\n const rolePermissions = this.getPermissions(role);\n \n if (rolePermissions.includes('*')) {\n return true;\n }\n\n if (rolePermissions.includes(requiredPermission)) {\n return true;\n }\n\n const [requiredAction, requiredScope] = requiredPermission.split(':');\n \n for (const perm of rolePermissions) {\n const [action, scope] = perm.split(':');\n \n if (action === '*' && (scope === '*' || scope === requiredScope)) {\n return true;\n }\n \n if (action === requiredAction && (scope === '*' || scope === requiredScope)) {\n return true;\n }\n }\n\n return false;\n }\n\n hasRole(userRole: Role, requiredRole: Role): boolean {\n const hierarchy: Role[] = ['guest', 'user', 'admin'];\n const userIndex = hierarchy.indexOf(userRole as any);\n const requiredIndex = hierarchy.indexOf(requiredRole as any);\n \n if (userIndex === -1 || requiredIndex === -1) {\n return userRole === requiredRole;\n }\n \n return userIndex >= requiredIndex;\n }\n\n authorize(permission: Permission) {\n return (role: Role): boolean => this.hasPermission(role, permission);\n }\n\n authorizeRole(requiredRole: Role) {\n return (role: Role): boolean => this.hasRole(role, requiredRole);\n }\n}\n\nexport const rbacService = new RBACService();\n","import pino, { Logger, LoggerOptions, Bindings } from 'pino';\nimport { config } from '../config';\n\nexport type LogLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\nexport interface LoggerConfig extends Partial<LoggerOptions> {\n level?: LogLevel;\n name?: string;\n prettyPrint?: boolean;\n}\n\nexport interface RequestLoggerOptions {\n logLevel?: LogLevel;\n autoLogging?: boolean;\n}\n\nclass LoggerManager {\n private loggers: Map<string, Logger> = new Map();\n private defaultLogger: Logger;\n\n constructor() {\n const level = (config.get('LOG_LEVEL') as LogLevel) || 'info';\n this.defaultLogger = pino({\n level,\n name: 'saas-backend-kit',\n formatters: {\n bindings: (bindings: Bindings) => ({\n ...bindings,\n service: 'saas-backend-kit',\n }),\n },\n });\n }\n\n createLogger(options: LoggerConfig = {}): Logger {\n const name = options.name || 'default';\n \n if (this.loggers.has(name)) {\n return this.loggers.get(name)!;\n }\n\n const level = options.level || (config.get('LOG_LEVEL') as LogLevel) || 'info';\n \n const logger = pino({\n level,\n name: options.name,\n ...options,\n });\n\n this.loggers.set(name, logger);\n return logger;\n }\n\n getLogger(name?: string): Logger {\n if (name) {\n return this.loggers.get(name) || this.defaultLogger;\n }\n return this.defaultLogger;\n }\n\n child(bindings: Bindings, options?: { name?: string }): Logger {\n const name = options?.name || 'child';\n const parent = options?.name ? this.getLogger(name) : this.defaultLogger;\n return parent.child(bindings);\n }\n}\n\nconst loggerManager = new LoggerManager();\n\nexport const logger = {\n info: (message: string, ...args: unknown[]) => loggerManager.getLogger().info(message, ...args),\n warn: (message: string, ...args: unknown[]) => loggerManager.getLogger().warn(message, ...args),\n error: (message: string, ...args: unknown[]) => loggerManager.getLogger().error(message, ...args),\n debug: (message: string, ...args: unknown[]) => loggerManager.getLogger().debug(message, ...args),\n trace: (message: string, ...args: unknown[]) => loggerManager.getLogger().trace(message, ...args),\n fatal: (message: string, ...args: unknown[]) => loggerManager.getLogger().fatal(message, ...args),\n child: (bindings: Bindings, options?: { name?: string }) => loggerManager.child(bindings, options),\n create: (options?: LoggerConfig) => loggerManager.createLogger(options),\n get: (name?: string) => loggerManager.getLogger(name),\n};\n\nexport function createRequestLogger(options: RequestLoggerOptions = {}) {\n const logLevel = options.logLevel || 'info';\n const logger = loggerManager.getLogger('http');\n\n return function requestLogger(\n req: { method: string; url: string; headers: Record<string, string | string[] | undefined> },\n res: { statusCode: number; statusMessage?: string },\n elapsed: number\n ) {\n const log = logger.child({\n method: req.method,\n url: req.url,\n status: res.statusCode,\n responseTime: elapsed,\n ip: req.headers['x-forwarded-for'] || req.headers['x-real-ip'] || 'unknown',\n userAgent: req.headers['user-agent'],\n });\n\n if (res.statusCode >= 500) {\n log.error(`Request completed`);\n } else if (res.statusCode >= 400) {\n log.warn(`Request completed`);\n } else {\n log.info(`Request completed`);\n }\n };\n}\n\nexport default logger;\n","import { Queue, Worker, Job, JobsOptions, WorkerOptions } from 'bullmq';\nimport { config } from '../config';\nimport { logger } from '../logger';\n\nexport interface QueueOptions {\n name: string;\n defaultJobOptions?: JobsOptions;\n}\n\nexport interface RedisOptions {\n host?: string;\n port?: number;\n password?: string;\n db?: number;\n url?: string;\n}\n\nexport interface JobData {\n [key: string]: unknown;\n}\n\nexport type JobProcessor = (job: Job<JobData>) => Promise<unknown>;\n\nclass QueueManager {\n private queues: Map<string, Queue> = new Map();\n private workers: Map<string, Worker> = new Map();\n private redisOptions: RedisOptions;\n\n constructor() {\n const redisUrl = config.get('REDIS_URL');\n if (redisUrl) {\n this.redisOptions = { url: redisUrl };\n } else {\n this.redisOptions = {\n host: 'localhost',\n port: 6379,\n };\n }\n }\n\n setRedisOptions(options: RedisOptions): void {\n this.redisOptions = options;\n }\n\n createQueue(name: string, options?: Partial<QueueOptions>): Queue {\n if (this.queues.has(name)) {\n return this.queues.get(name)!;\n }\n\n const queue = new Queue(name, {\n connection: this.redisOptions as any,\n defaultJobOptions: options?.defaultJobOptions || {\n removeOnComplete: 100,\n removeOnFail: 100,\n },\n });\n\n this.queues.set(name, queue);\n logger.info(`Queue \"${name}\" created`);\n\n return queue;\n }\n\n getQueue(name: string): Queue | undefined {\n return this.queues.get(name);\n }\n\n async addJob(\n queueName: string,\n jobName: string,\n data: JobData,\n options?: JobsOptions\n ): Promise<Job> {\n const queue = this.getQueue(queueName) || this.createQueue(queueName);\n const job = await queue.add(jobName, data, options);\n logger.debug(`Job \"${jobName}\" added to queue \"${queueName}\"`, { jobId: job.id });\n return job;\n }\n\n async addBulkJobs(\n queueName: string,\n jobs: Array<{ name: string; data: JobData; options?: JobsOptions }>\n ): Promise<Job[]> {\n const queue = this.getQueue(queueName) || this.createQueue(queueName);\n const bulkJobs = jobs.map(job => ({\n name: job.name,\n data: job.data,\n ...job.options,\n }));\n const result = await queue.addBulk(bulkJobs);\n logger.debug(`${jobs.length} jobs added to queue \"${queueName}\"`);\n return result;\n }\n\n processJob(\n queueName: string,\n processor: JobProcessor,\n options?: WorkerOptions\n ): Worker {\n const queue = this.getQueue(queueName) || this.createQueue(queueName);\n \n const worker = new Worker(queueName, async (job) => {\n logger.debug(`Processing job \"${job.name}\"`, { jobId: job.id, queue: queueName });\n return await processor(job);\n }, {\n connection: this.redisOptions as any,\n concurrency: options?.concurrency || 1,\n ...options,\n });\n\n worker.on('completed', (job) => {\n logger.debug(`Job completed`, { jobId: job.id, queue: queueName });\n });\n\n worker.on('failed', (job, err) => {\n logger.error(`Job failed`, { jobId: job?.id, queue: queueName, error: err.message });\n });\n\n worker.on('error', (err) => {\n logger.error(`Worker error`, { queue: queueName, error: err.message });\n });\n\n this.workers.set(queueName, worker);\n logger.info(`Worker started for queue \"${queueName}\"`);\n\n return worker;\n }\n\n async getJobCounts(queueName: string): Promise<Record<string, number>> {\n const queue = this.getQueue(queueName);\n if (!queue) {\n return { waiting: 0, active: 0, completed: 0, failed: 0, delayed: 0 };\n }\n return await queue.getJobCounts();\n }\n\n async getJobs(queueName: string, start: number = 0, end: number = 10): Promise<Job[]> {\n const queue = this.getQueue(queueName);\n if (!queue) return [];\n return await queue.getJobs(['waiting', 'active', 'completed', 'failed'], start, end);\n }\n\n async closeQueue(name: string): Promise<void> {\n const queue = this.queues.get(name);\n if (queue) {\n await queue.close();\n this.queues.delete(name);\n logger.info(`Queue \"${name}\" closed`);\n }\n }\n\n async closeWorker(name: string): Promise<void> {\n const worker = this.workers.get(name);\n if (worker) {\n await worker.close();\n this.workers.delete(name);\n logger.info(`Worker for queue \"${name}\" closed`);\n }\n }\n\n async closeAll(): Promise<void> {\n await Promise.all([\n ...Array.from(this.queues.values()).map(q => q.close()),\n ...Array.from(this.workers.values()).map(w => w.close()),\n ]);\n this.queues.clear();\n this.workers.clear();\n logger.info('All queues and workers closed');\n }\n}\n\nconst queueManager = new QueueManager();\n\nexport const createQueue = (name: string, options?: Partial<QueueOptions>): Queue => {\n return queueManager.createQueue(name, options);\n};\n\nexport const addJob = (\n queueName: string,\n jobName: string,\n data: JobData,\n options?: JobsOptions\n): Promise<Job> => {\n return queueManager.addJob(queueName, jobName, data, options);\n};\n\nexport const processJob = (\n queueName: string,\n processor: JobProcessor,\n options?: WorkerOptions\n): Worker => {\n return queueManager.processJob(queueName, processor, options);\n};\n\nexport const queue = {\n create: createQueue,\n add: addJob,\n process: processJob,\n get: (name: string) => queueManager.getQueue(name),\n getJobCounts: (name: string) => queueManager.getJobCounts(name),\n getJobs: (name: string, start?: number, end?: number) => queueManager.getJobs(name, start, end),\n close: (name: string) => queueManager.closeQueue(name),\n closeAll: () => queueManager.closeAll(),\n setRedisOptions: (options: RedisOptions) => queueManager.setRedisOptions(options),\n};\n\nexport { QueueManager };\nexport default queue;\n","import { Request, Response, NextFunction, RequestHandler } from 'express';\nimport { config } from '../config';\n\nexport interface RateLimitOptions {\n window?: string;\n limit?: number;\n keyGenerator?: (req: Request) => string;\n handler?: (req: Request, res: Response) => void;\n skipSuccessfulRequests?: boolean;\n skipFailedRequests?: boolean;\n skip?: (req: Request) => boolean;\n}\n\ninterface RateLimitRecord {\n count: number;\n resetTime: number;\n}\n\nclass InMemoryRateLimiter {\n private store: Map<string, RateLimitRecord> = new Map();\n private cleanupInterval: NodeJS.Timeout;\n\n constructor() {\n this.cleanupInterval = setInterval(() => this.cleanup(), 60000);\n this.cleanupInterval.unref();\n }\n\n private cleanup(): void {\n const now = Date.now();\n for (const [key, record] of this.store.entries()) {\n if (record.resetTime < now) {\n this.store.delete(key);\n }\n }\n }\n\n increment(key: string, windowMs: number): RateLimitRecord {\n const now = Date.now();\n const record = this.store.get(key);\n\n if (!record || record.resetTime < now) {\n const resetTime = now + windowMs;\n this.store.set(key, { count: 1, resetTime });\n return { count: 1, resetTime };\n }\n\n record.count++;\n return record;\n }\n\n get(key: string): RateLimitRecord | undefined {\n return this.store.get(key);\n }\n\n destroy(): void {\n clearInterval(this.cleanupInterval);\n }\n}\n\nclass RateLimiter {\n private options: Required<RateLimitOptions>;\n private store: InMemoryRateLimiter;\n\n constructor(options: RateLimitOptions = {}) {\n const defaultWindow = config.get('RATE_LIMIT_WINDOW') || '1m';\n const defaultLimit = parseInt(config.get('RATE_LIMIT_LIMIT') || '100', 10);\n\n this.options = {\n window: options.window || defaultWindow,\n limit: options.limit || defaultLimit,\n keyGenerator: options.keyGenerator || ((req: Request) => req.ip || 'unknown'),\n handler: options.handler || this.defaultHandler,\n skipSuccessfulRequests: options.skipSuccessfulRequests || false,\n skipFailedRequests: options.skipFailedRequests || false,\n skip: options.skip || (() => false),\n };\n\n this.store = new InMemoryRateLimiter();\n }\n\n private getWindowMs(): number {\n const window = this.options.window;\n const match = window.match(/^(\\d+)(s|m|h|d)$/);\n if (!match) return 60000;\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 's': return value * 1000;\n case 'm': return value * 60 * 1000;\n case 'h': return value * 60 * 60 * 1000;\n case 'd': return value * 24 * 60 * 60 * 1000;\n default: return 60000;\n }\n }\n\n private defaultHandler(req: Request, res: Response): void {\n res.status(429).json({\n error: 'Too many requests',\n message: `Rate limit exceeded. Please try again later.`,\n });\n }\n\n middleware(): RequestHandler {\n const windowMs = this.getWindowMs();\n\n return (req: Request, res: Response, next: NextFunction) => {\n if (this.options.skip(req)) {\n return next();\n }\n\n const key = this.options.keyGenerator(req);\n const record = this.store.increment(key, windowMs);\n\n const remaining = Math.max(0, this.options.limit - record.count);\n const resetTime = new Date(record.resetTime);\n\n res.setHeader('X-RateLimit-Limit', this.options.limit);\n res.setHeader('X-RateLimit-Remaining', remaining);\n res.setHeader('X-RateLimit-Reset', Math.ceil(record.resetTime / 1000));\n\n if (record.count > this.options.limit) {\n return this.options.handler(req, res);\n }\n\n next();\n };\n }\n\n destroy(): void {\n this.store.destroy();\n }\n}\n\nexport function rateLimit(options: RateLimitOptions = {}): RequestHandler {\n const limiter = new RateLimiter(options);\n return limiter.middleware();\n}\n\nexport function createRateLimiter(options: RateLimitOptions): RateLimiter {\n return new RateLimiter(options);\n}\n\nexport default rateLimit;\n","export * from './types';\nexport * from './jwt';\nexport * from './rbac';\nexport * from './oauth';\nexport * from './express';\nexport * from './fastify';\n","import jwt from 'jsonwebtoken';\nimport { JWTPayload, TokenPair } from './types';\nimport { config } from '../config';\n\nexport class JWTService {\n private secret: string;\n private expiresIn: string;\n private refreshSecret: string;\n private refreshExpiresIn: string;\n\n constructor(options: { jwtSecret?: string; jwtExpiresIn?: string; refreshSecret?: string; refreshExpiresIn?: string } = {}) {\n this.secret = options.jwtSecret || config.get('JWT_SECRET') || 'default-secret-change-in-production';\n this.expiresIn = options.jwtExpiresIn || config.get('JWT_EXPIRES_IN') || '7d';\n this.refreshSecret = options.refreshSecret || config.get('JWT_REFRESH_SECRET') || this.secret;\n this.refreshExpiresIn = options.refreshExpiresIn || config.get('JWT_REFRESH_EXPIRES_IN') || '30d';\n }\n\n generateToken(payload: JWTPayload): string {\n return jwt.sign(payload, this.secret, { expiresIn: this.expiresIn });\n }\n\n generateRefreshToken(payload: JWTPayload): string {\n return jwt.sign(payload, this.refreshSecret, { expiresIn: this.refreshExpiresIn });\n }\n\n generateTokenPair(payload: JWTPayload): TokenPair {\n return {\n accessToken: this.generateToken(payload),\n refreshToken: this.generateRefreshToken(payload),\n };\n }\n\n verifyToken(token: string): JWTPayload {\n return jwt.verify(token, this.secret) as JWTPayload;\n }\n\n verifyRefreshToken(token: string): JWTPayload {\n return jwt.verify(token, this.refreshSecret) as JWTPayload;\n }\n\n refreshTokens(refreshToken: string): TokenPair {\n const { iat, exp, nbf, ...payload } = this.verifyRefreshToken(refreshToken) as JWTPayload & { iat?: number; exp?: number; nbf?: number };\n return this.generateTokenPair(payload);\n }\n}\n\nexport const jwtService = new JWTService();\n","import { OAuthProvider } from './types';\nimport { config } from '../config';\n\nexport interface OAuthUserInfo {\n id: string;\n email: string;\n name?: string;\n picture?: string;\n}\n\nexport class OAuthService {\n private providers: Map<string, OAuthProvider> = new Map();\n\n constructor() {\n const googleClientId = config.get('GOOGLE_CLIENT_ID');\n const googleClientSecret = config.get('GOOGLE_CLIENT_SECRET');\n const googleRedirectUri = config.get('GOOGLE_REDIRECT_URI');\n\n if (googleClientId && googleClientSecret && googleRedirectUri) {\n this.registerProvider('google', {\n name: 'google',\n clientId: googleClientId,\n clientSecret: googleClientSecret,\n redirectUri: googleRedirectUri,\n authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n });\n }\n }\n\n registerProvider(name: string, provider: OAuthProvider): void {\n this.providers.set(name, provider);\n }\n\n getProvider(name: string): OAuthProvider | undefined {\n return this.providers.get(name);\n }\n\n getAuthorizationUrl(providerName: string, state?: string): string {\n const provider = this.getProvider(providerName);\n if (!provider) {\n throw new Error(`OAuth provider ${providerName} not registered`);\n }\n\n const params = new URLSearchParams({\n client_id: provider.clientId,\n redirect_uri: provider.redirectUri,\n response_type: 'code',\n scope: 'openid email profile',\n state: state || '',\n });\n\n return `${provider.authorizationUrl}?${params.toString()}`;\n }\n\n async exchangeCode(providerName: string, code: string): Promise<{ accessToken: string; refreshToken?: string }> {\n const provider = this.getProvider(providerName);\n if (!provider) {\n throw new Error(`OAuth provider ${providerName} not registered`);\n }\n\n const response = await fetch(provider.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n client_id: provider.clientId,\n client_secret: provider.clientSecret,\n code,\n grant_type: 'authorization_code',\n redirect_uri: provider.redirectUri,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OAuth token exchange failed: ${error}`);\n }\n\n const data = await response.json();\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n };\n }\n\n async getUserInfo(providerName: string, accessToken: string): Promise<OAuthUserInfo> {\n const provider = this.getProvider(providerName);\n if (!provider) {\n throw new Error(`OAuth provider ${providerName} not registered`);\n }\n\n const response = await fetch(provider.userInfoUrl, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OAuth user info fetch failed: ${error}`);\n }\n\n const data = await response.json();\n\n return {\n id: data.id,\n email: data.email,\n name: data.name,\n picture: data.picture,\n };\n }\n}\n\nexport const oauthService = new OAuthService();\n","import bcrypt from 'bcryptjs';\nimport { Request, Response, NextFunction, RequestHandler } from 'express';\nimport { JWTPayload, LoginCredentials, RegisterData, User, AuthOptions } from './types';\nimport { jwtService } from './jwt';\nimport { rbacService } from './rbac';\nimport { oauthService } from './oauth';\n\nexport interface AuthUser extends JWTPayload {\n id: string;\n email: string;\n role: string;\n}\n\ndeclare global {\n namespace Express {\n interface Request {\n user?: AuthUser;\n }\n }\n}\n\nexport interface UserStore {\n findByEmail(email: string): Promise<User | null>;\n findById(id: string): Promise<User | null>;\n create(data: RegisterData): Promise<User>;\n update(id: string, data: Partial<User>): Promise<User>;\n}\n\nclass InMemoryUserStore implements UserStore {\n private users: Map<string, User> = new Map();\n\n async findByEmail(email: string): Promise<User | null> {\n for (const user of this.users.values()) {\n if (user.email === email) return user;\n }\n return null;\n }\n\n async findById(id: string): Promise<User | null> {\n return this.users.get(id) || null;\n }\n\n async create(data: RegisterData): Promise<User> {\n const id = Math.random().toString(36).substr(2, 9);\n const hashedPassword = await bcrypt.hash(data.password, 10);\n const user: User = {\n id,\n email: data.email,\n password: hashedPassword,\n role: data.role || 'user',\n name: data.name,\n };\n this.users.set(id, user);\n return user;\n }\n\n async update(id: string, data: Partial<User>): Promise<User> {\n const user = this.users.get(id);\n if (!user) throw new Error('User not found');\n const updated = { ...user, ...data };\n this.users.set(id, updated);\n return updated;\n }\n}\n\nexport class AuthService {\n private userStore: UserStore;\n private options: Required<AuthOptions>;\n private initialized: boolean = false;\n\n constructor(options: AuthOptions = {}, userStore?: UserStore) {\n this.options = {\n jwtSecret: options.jwtSecret || process.env.JWT_SECRET || 'default-secret-change-in-production',\n jwtExpiresIn: options.jwtExpiresIn || '7d',\n refreshSecret: options.refreshSecret || process.env.JWT_REFRESH_SECRET || 'default-secret-change-in-production',\n refreshExpiresIn: options.refreshExpiresIn || '30d',\n googleClientId: options.googleClientId || process.env.GOOGLE_CLIENT_ID || '',\n googleClientSecret: options.googleClientSecret || process.env.GOOGLE_CLIENT_SECRET || '',\n googleRedirectUri: options.googleRedirectUri || process.env.GOOGLE_REDIRECT_URI || '',\n };\n\n this.userStore = userStore || new InMemoryUserStore();\n }\n\n async initialize(): Promise<void> {\n if (this.options.googleClientId && this.options.googleClientSecret && this.options.googleRedirectUri) {\n oauthService.registerProvider('google', {\n name: 'google',\n clientId: this.options.googleClientId,\n clientSecret: this.options.googleClientSecret,\n redirectUri: this.options.googleRedirectUri,\n authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n });\n }\n this.initialized = true;\n }\n\n async register(data: RegisterData): Promise<{ user: User; tokens: { accessToken: string; refreshToken: string } }> {\n const existing = await this.userStore.findByEmail(data.email);\n if (existing) {\n throw new Error('User already exists');\n }\n\n const user = await this.userStore.create(data);\n const tokens = jwtService.generateTokenPair({\n userId: user.id,\n email: user.email,\n role: user.role,\n });\n\n return { user, tokens };\n }\n\n async login(credentials: LoginCredentials): Promise<{ user: User; tokens: { accessToken: string; refreshToken: string } }> {\n const user = await this.userStore.findByEmail(credentials.email);\n if (!user || !user.password) {\n throw new Error('Invalid credentials');\n }\n\n const isValid = await bcrypt.compare(credentials.password, user.password);\n if (!isValid) {\n throw new Error('Invalid credentials');\n }\n\n const tokens = jwtService.generateTokenPair({\n userId: user.id,\n email: user.email,\n role: user.role,\n });\n\n return { user, tokens };\n }\n\n async refresh(refreshToken: string): Promise<{ accessToken: string; refreshToken: string }> {\n return jwtService.refreshTokens(refreshToken);\n }\n\n async getGoogleAuthUrl(state?: string): Promise<string> {\n return oauthService.getAuthorizationUrl('google', state);\n }\n\n async handleGoogleCallback(code: string): Promise<{ user: User; tokens: { accessToken: string; refreshToken: string } }> {\n const { accessToken } = await oauthService.exchangeCode('google', code);\n const userInfo = await oauthService.getUserInfo('google', accessToken);\n\n let user = await this.userStore.findByEmail(userInfo.email);\n \n if (!user) {\n user = await this.userStore.create({\n email: userInfo.email,\n password: Math.random().toString(36).substr(2, 20),\n name: userInfo.name,\n role: 'user',\n });\n }\n\n const tokens = jwtService.generateTokenPair({\n userId: user.id,\n email: user.email,\n role: user.role,\n });\n\n return { user, tokens };\n }\n\n getMiddleware(): RequestHandler {\n return (req: Request, res: Response, next: NextFunction) => {\n const authHeader = req.headers.authorization;\n \n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n return res.status(401).json({ error: 'No token provided' });\n }\n\n const token = authHeader.substring(7);\n \n try {\n const payload = jwtService.verifyToken(token);\n req.user = {\n ...payload,\n id: payload.userId,\n };\n next();\n } catch (error) {\n return res.status(401).json({ error: 'Invalid token' });\n }\n };\n }\n\n requireUser(): RequestHandler {\n return (req: Request, res: Response, next: NextFunction) => {\n if (!req.user) {\n return res.status(401).json({ error: 'Authentication required' });\n }\n next();\n };\n }\n\n requireRole(role: string): RequestHandler {\n return (req: Request, res: Response, next: NextFunction) => {\n if (!req.user) {\n return res.status(401).json({ error: 'Authentication required' });\n }\n if (!rbacService.hasRole(req.user.role, role)) {\n return res.status(403).json({ error: 'Insufficient permissions' });\n }\n next();\n };\n }\n\n requirePermission(permission: string): RequestHandler {\n return (req: Request, res: Response, next: NextFunction) => {\n if (!req.user) {\n return res.status(401).json({ error: 'Authentication required' });\n }\n if (!rbacService.hasPermission(req.user.role, permission)) {\n return res.status(403).json({ error: 'Insufficient permissions' });\n }\n next();\n };\n }\n}\n\nlet authServiceInstance: AuthService | null = null;\n\nexport function createAuth(options?: AuthOptions, userStore?: UserStore): AuthService {\n authServiceInstance = new AuthService(options, userStore);\n return authServiceInstance;\n}\n\nexport function auth(): AuthService {\n if (!authServiceInstance) {\n authServiceInstance = new AuthService();\n }\n return authServiceInstance;\n}\n\nexport const Auth = {\n initialize: (options?: AuthOptions) => {\n const service = createAuth(options);\n return {\n service,\n getMiddleware: () => service.getMiddleware(),\n requireUser: () => service.requireUser(),\n requireRole: (role: string) => service.requireRole(role),\n requirePermission: (permission: string) => service.requirePermission(permission),\n };\n },\n};\n","export { AuthService, createAuth, auth, Auth } from './auth';\nexport { QueueManager, createQueue, queue } from './queue';\nexport { notify, notification } from './notifications';\nexport { logger } from './logger';\nexport { rateLimit, createRateLimiter } from './rate-limit';\nexport { config } from './config';\nexport { ResponseHelper, response } from './response';\nexport { upload, s3Service, S3Service } from './upload';\nexport { createApp, createExpressApp, SaaSAppBuilder, PluginManager, Plugin, AppOptions } from './plugin';\n\nexport { AuthOptions, User, JWTPayload, TokenPair, LoginCredentials, RegisterData, Role, Permission, RolePermissions } from './auth/types';\nexport { QueueOptions, JobData, JobProcessor } from './queue';\nexport { EmailOptions, SMSOptions, WebhookOptions, SlackOptions } from './notifications';\nexport { LoggerConfig, LogLevel } from './logger';\nexport { RateLimitOptions } from './rate-limit';\nexport { EnvConfig, ConfigOptions } from './config';\nexport { ApiResponse, PaginatedResponse, ErrorResponse } from './response';\nexport { S3Config, UploadOptions, UploadResult, SignedUrlOptions, FileObject } from './upload';\n","import nodemailer, { Transporter, SendMailOptions } from 'nodemailer';\nimport { config } from '../config';\nimport { logger } from '../logger';\n\nexport interface EmailOptions {\n to: string | string[];\n subject: string;\n text?: string;\n html?: string;\n template?: string;\n templateData?: Record<string, unknown>;\n from?: string;\n cc?: string | string[];\n bcc?: string | string[];\n attachments?: Array<{\n filename: string;\n content?: Buffer | string;\n path?: string;\n contentType?: string;\n }>;\n}\n\nexport interface SMSOptions {\n to: string;\n message: string;\n from?: string;\n}\n\nexport interface WebhookOptions {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH';\n headers?: Record<string, string>;\n body?: unknown;\n timeout?: number;\n}\n\nexport interface SlackOptions {\n text?: string;\n blocks?: Array<{\n type: string;\n text?: { type: string; text: string; emoji?: boolean };\n elements?: Array<{ type: string; text?: { type: string; text: string } }>;\n accessory?: { type: string; image_url?: string; alt_text?: string };\n }>;\n channel?: string;\n username?: string;\n iconEmoji?: string;\n}\n\nexport interface NotificationTransporter {\n email: Transporter;\n twilio?: {\n accountSid: string;\n authToken: string;\n phoneNumber: string;\n };\n slack?: {\n webhookUrl: string;\n };\n}\n\nclass EmailService {\n private transporter: Transporter | null = null;\n private from: string;\n\n constructor() {\n this.from = config.get('SMTP_FROM') || 'noreply@example.com';\n this.initialize();\n }\n\n private initialize(): void {\n const host = config.get('SMTP_HOST');\n const port = parseInt(config.get('SMTP_PORT') || '587', 10);\n const user = config.get('SMTP_USER');\n const pass = config.get('SMTP_PASS');\n\n if (host && user && pass) {\n this.transporter = nodemailer.createTransport({\n host,\n port,\n secure: port === 465,\n auth: {\n user,\n pass,\n },\n });\n logger.info('Email service initialized');\n }\n }\n\n setTransporter(transporter: Transporter): void {\n this.transporter = transporter;\n }\n\n async send(options: EmailOptions): Promise<{ messageId: string }> {\n if (!this.transporter) {\n logger.warn('Email transporter not configured, skipping email');\n return { messageId: 'mock-message-id' };\n }\n\n const mailOptions: SendMailOptions = {\n from: options.from || this.from,\n to: Array.isArray(options.to) ? options.to.join(', ') : options.to,\n subject: options.subject,\n text: options.text,\n html: options.html || this.renderTemplate(options.template, options.templateData),\n cc: options.cc,\n bcc: options.bcc,\n attachments: options.attachments,\n };\n\n const result = await this.transporter.sendMail(mailOptions);\n logger.info(`Email sent to ${options.to}`, { messageId: result.messageId });\n return { messageId: result.messageId };\n }\n\n private renderTemplate(templateName?: string, data?: Record<string, unknown>): string | undefined {\n if (!templateName || !data) return undefined;\n\n const templates: Record<string, (data: Record<string, unknown>) => string> = {\n welcome: (data) => `\n <h1>Welcome, ${data.name || 'User'}!</h1>\n <p>Thank you for joining ${data.appName || 'our platform'}.</p>\n <p>Get started by verifying your email.</p>\n `,\n passwordReset: (data) => `\n <h1>Password Reset</h1>\n <p>Click <a href=\"${data.resetUrl}\">here</a> to reset your password.</p>\n <p>This link expires in ${data.expiry || '1 hour'}.</p>\n `,\n verification: (data) => `\n <h1>Verify Your Email</h1>\n <p>Click <a href=\"${data.verifyUrl}\">here</a> to verify your email.</p>\n `,\n };\n\n const template = templates[templateName];\n return template ? template(data) : undefined;\n }\n}\n\nclass SMSService {\n private accountSid: string;\n private authToken: string;\n private phoneNumber: string;\n private initialized: boolean = false;\n\n constructor() {\n this.accountSid = config.get('TWILIO_ACCOUNT_SID') || '';\n this.authToken = config.get('TWILIO_AUTH_TOKEN') || '';\n this.phoneNumber = config.get('TWILIO_PHONE_NUMBER') || '';\n this.initialized = !!(this.accountSid && this.authToken && this.phoneNumber);\n }\n\n async send(options: SMSOptions): Promise<{ sid: string }> {\n if (!this.initialized) {\n logger.warn('Twilio not configured, skipping SMS');\n return { sid: 'mock-sid' };\n }\n\n try {\n const twilio = await import('twilio');\n const client = twilio.default(this.accountSid, this.authToken);\n\n const result = await client.messages.create({\n body: options.message,\n from: options.from || this.phoneNumber,\n to: options.to,\n });\n\n logger.info(`SMS sent to ${options.to}`, { sid: result.sid });\n return { sid: result.sid };\n } catch (error) {\n logger.error('Failed to send SMS', { error });\n throw error;\n }\n }\n}\n\nclass WebhookService {\n async send(options: WebhookOptions): Promise<{ status: number; body: unknown }> {\n const response = await fetch(options.url, {\n method: options.method || 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: options.timeout ? AbortSignal.timeout(options.timeout) : undefined,\n });\n\n const body = await response.json().catch(() => null);\n logger.info(`Webhook sent to ${options.url}`, { status: response.status });\n return { status: response.status, body };\n }\n}\n\nclass SlackService {\n private webhookUrl: string;\n\n constructor() {\n this.webhookUrl = config.get('SLACK_WEBHOOK_URL') || '';\n }\n\n setWebhookUrl(url: string): void {\n this.webhookUrl = url;\n }\n\n async send(options: SlackOptions): Promise<{ ok: boolean }> {\n if (!this.webhookUrl) {\n logger.warn('Slack webhook not configured, skipping message');\n return { ok: false };\n }\n\n const payload = {\n text: options.text,\n blocks: options.blocks,\n channel: options.channel,\n username: options.username,\n icon_emoji: options.iconEmoji,\n };\n\n const response = await fetch(this.webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n const ok = response.ok;\n if (ok) {\n logger.info('Slack message sent');\n } else {\n logger.error('Failed to send Slack message');\n }\n return { ok };\n }\n}\n\nclass NotificationService {\n email: EmailService;\n sms: SMSService;\n webhook: WebhookService;\n slack: SlackService;\n\n constructor() {\n this.email = new EmailService();\n this.sms = new SMSService();\n this.webhook = new WebhookService();\n this.slack = new SlackService();\n }\n}\n\nexport const notify = new NotificationService();\n\nexport const notification = {\n email: (options: EmailOptions) => notify.email.send(options),\n sms: (options: SMSOptions) => notify.sms.send(options),\n webhook: (options: WebhookOptions) => notify.webhook.send(options),\n slack: (options: SlackOptions) => notify.slack.send(options),\n};\n\nexport default notification;\n","export * from './express';\nexport * from './fastify';\n","import { Response } from 'express';\n\nexport interface ApiResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n meta?: {\n page?: number;\n limit?: number;\n total?: number;\n totalPages?: number;\n };\n}\n\nexport interface PaginatedResponse<T> extends Omit<ApiResponse<T[]>, 'data'> {\n data: T[];\n meta: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n}\n\nexport interface ErrorResponse {\n success: false;\n error: string;\n code?: string;\n details?: Record<string, unknown>;\n}\n\nexport class ResponseHelper {\n static success<T>(res: Response, data?: T, message?: string, statusCode: number = 200): Response {\n const response: ApiResponse<T> = {\n success: true,\n data,\n message,\n };\n return res.status(statusCode).json(response);\n }\n\n static created<T>(res: Response, data?: T, message: string = 'Resource created'): Response {\n return this.success(res, data, message, 201);\n }\n\n static updated<T>(res: Response, data?: T, message: string = 'Resource updated'): Response {\n return this.success(res, data, message, 200);\n }\n\n static deleted(res: Response, message: string = 'Resource deleted'): Response {\n return this.success(res, null, message, 200);\n }\n\n static error(\n res: Response,\n error: string,\n statusCode: number = 400,\n code?: string,\n details?: Record<string, unknown>\n ): Response {\n const response: ErrorResponse = {\n success: false,\n error,\n code,\n ...(details && { details }),\n };\n return res.status(statusCode).json(response);\n }\n\n static badRequest(res: Response, error: string = 'Bad request', code?: string): Response {\n return this.error(res, error, 400, code);\n }\n\n static unauthorized(res: Response, error: string = 'Unauthorized', code?: string): Response {\n return this.error(res, error, 401, code);\n }\n\n static forbidden(res: Response, error: string = 'Forbidden', code?: string): Response {\n return this.error(res, error, 403, code);\n }\n\n static notFound(res: Response, error: string = 'Resource not found', code?: string): Response {\n return this.error(res, error, 404, code);\n }\n\n static conflict(res: Response, error: string = 'Conflict', code?: string): Response {\n return this.error(res, error, 409, code);\n }\n\n static validationError(res: Response, error: string, details?: Record<string, unknown>): Response {\n return this.error(res, error, 422, 'VALIDATION_ERROR', details);\n }\n\n static internalError(res: Response, error: string = 'Internal server error'): Response {\n return this.error(res, error, 500, 'INTERNAL_ERROR');\n }\n\n static paginated<T>(\n res: Response,\n data: T[],\n page: number,\n limit: number,\n total: number\n ): Response<PaginatedResponse<T>> {\n const totalPages = Math.ceil(total / limit);\n const response: PaginatedResponse<T> = {\n success: true,\n data,\n meta: {\n page,\n limit,\n total,\n totalPages,\n },\n };\n return res.status(200).json(response);\n }\n\n static noContent(res: Response): Response {\n return res.status(204).send();\n }\n}\n\ndeclare global {\n namespace Express {\n interface Response {\n success<T>(data?: T, message?: string, statusCode?: number): Response;\n created<T>(data?: T, message?: string): Response;\n updated<T>(data?: T, message?: string): Response;\n deleted(message?: string): Response;\n error(error: string, statusCode?: number, code?: string, details?: Record<string, unknown>): Response;\n badRequest(error?: string, code?: string): Response;\n unauthorized(error?: string, code?: string): Response;\n forbidden(error?: string, code?: string): Response;\n notFound(error?: string, code?: string): Response;\n conflict(error?: string, code?: string): Response;\n validationError(error: string, details?: Record<string, unknown>): Response;\n internalError(error?: string): Response;\n paginated<T>(data: T[], page: number, limit: number, total: number): Response;\n }\n }\n}\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const proto = require('express').response;\n if (proto) {\n proto.success = function <T>(this: Response, data?: T, message?: string, statusCode: number = 200) {\n return ResponseHelper.success(this, data, message, statusCode);\n };\n\n proto.created = function <T>(this: Response, data?: T, message?: string) {\n return ResponseHelper.created(this, data, message);\n };\n\n proto.updated = function <T>(this: Response, data?: T, message?: string) {\n return ResponseHelper.updated(this, data, message);\n };\n\n proto.deleted = function (this: Response, message?: string) {\n return ResponseHelper.deleted(this, message);\n };\n\n proto.error = function (this: Response, error: string, statusCode: number = 400, code?: string, details?: Record<string, unknown>) {\n return ResponseHelper.error(this, error, statusCode, code, details);\n };\n\n proto.badRequest = function (this: Response, error?: string, code?: string) {\n return ResponseHelper.badRequest(this, error, code);\n };\n\n proto.unauthorized = function (this: Response, error?: string, code?: string) {\n return ResponseHelper.unauthorized(this, error, code);\n };\n\n proto.forbidden = function (this: Response, error?: string, code?: string) {\n return ResponseHelper.forbidden(this, error, code);\n };\n\n proto.notFound = function (this: Response, error?: string, code?: string) {\n return ResponseHelper.notFound(this, error, code);\n };\n\n proto.conflict = function (this: Response, error?: string, code?: string) {\n return ResponseHelper.conflict(this, error, code);\n };\n\n proto.validationError = function (this: Response, error: string, details?: Record<string, unknown>) {\n return ResponseHelper.validationError(this, error, details);\n };\n\n proto.internalError = function (this: Response, error?: string) {\n return ResponseHelper.internalError(this, error);\n };\n\n proto.paginated = function <T>(this: Response, data: T[], page: number, limit: number, total: number) {\n return ResponseHelper.paginated(this, data, page, limit, total);\n };\n }\n} catch {\n // express not available at runtime\n}\n\nexport const response = ResponseHelper;\nexport default ResponseHelper;\n","import { S3Client, PutObjectCommand, DeleteObjectCommand, GetObjectCommand, ListObjectsV2Command } from '@aws-sdk/client-s3';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { config } from '../config';\nimport { logger } from '../logger';\n\nexport interface S3Config {\n region?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n bucket: string;\n endpoint?: string;\n forcePathStyle?: boolean;\n}\n\nexport interface UploadOptions {\n key?: string;\n contentType?: string;\n expiresIn?: number;\n metadata?: Record<string, string>;\n}\n\nexport interface UploadResult {\n key: string;\n url: string;\n bucket: string;\n contentType?: string;\n size?: number;\n}\n\nexport interface SignedUrlOptions {\n expiresIn?: number;\n}\n\nexport interface FileObject {\n key: string;\n lastModified?: Date;\n size?: number;\n contentType?: string;\n}\n\nclass S3Service {\n private client: S3Client | null = null;\n private bucket: string;\n private initialized: boolean = false;\n\n constructor() {\n this.bucket = '';\n }\n\n initialize(config: S3Config): void {\n this.client = new S3Client({\n region: config.region || 'us-east-1',\n credentials: config.accessKeyId && config.secretAccessKey\n ? {\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n }\n : undefined,\n endpoint: config.endpoint,\n forcePathStyle: config.forcePathStyle || false,\n });\n\n this.bucket = config.bucket;\n this.initialized = true;\n logger.info('S3 service initialized', { bucket: this.bucket });\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n const region = config.get('AWS_REGION') || 'us-east-1';\n const bucket = config.get('AWS_S3_BUCKET') || '';\n \n this.initialize({\n region,\n accessKeyId: config.get('AWS_ACCESS_KEY_ID'),\n secretAccessKey: config.get('AWS_SECRET_ACCESS_KEY'),\n bucket,\n endpoint: config.get('AWS_ENDPOINT'),\n });\n }\n }\n\n async upload(\n file: Buffer | Uint8Array | string,\n options: UploadOptions = {}\n ): Promise<UploadResult> {\n this.ensureInitialized();\n\n const key = options.key || this.generateKey();\n const contentType = options.contentType || this.guessContentType(key);\n\n const command = new PutObjectCommand({\n Bucket: this.bucket,\n Key: key,\n Body: file,\n ContentType: contentType,\n Metadata: options.metadata,\n });\n\n await this.client!.send(command);\n\n const url = await this.getSignedUrl(key, { expiresIn: options.expiresIn || 3600 });\n\n logger.info('File uploaded to S3', { key, bucket: this.bucket, contentType });\n\n return {\n key,\n url,\n bucket: this.bucket,\n contentType,\n };\n }\n\n async uploadImage(\n file: Buffer | Uint8Array | string,\n filename: string,\n options: UploadOptions = {}\n ): Promise<UploadResult> {\n const key = options.key || `images/${Date.now()}-${filename}`;\n \n return this.upload(file, {\n ...options,\n key,\n contentType: options.contentType || this.getImageContentType(filename),\n });\n }\n\n async uploadVideo(\n file: Buffer | Uint8Array | string,\n filename: string,\n options: UploadOptions = {}\n ): Promise<UploadResult> {\n const key = options.key || `videos/${Date.now()}-${filename}`;\n \n return this.upload(file, {\n ...options,\n key,\n contentType: options.contentType || this.getVideoContentType(filename),\n });\n }\n\n async delete(key: string): Promise<void> {\n this.ensureInitialized();\n\n const command = new DeleteObjectCommand({\n Bucket: this.bucket,\n Key: key,\n });\n\n await this.client!.send(command);\n logger.info('File deleted from S3', { key, bucket: this.bucket });\n }\n\n async getSignedUrl(key: string, options: SignedUrlOptions = {}): Promise<string> {\n this.ensureInitialized();\n\n const command = new GetObjectCommand({\n Bucket: this.bucket,\n Key: key,\n });\n\n return getSignedUrl(this.client!, command, {\n expiresIn: options.expiresIn || 3600,\n });\n }\n\n async getPublicUrl(key: string): Promise<string> {\n return `https://${this.bucket}.s3.${config.get('AWS_REGION') || 'us-east-1'}.amazonaws.com/${key}`;\n }\n\n async listFiles(prefix?: string, maxKeys: number = 1000): Promise<FileObject[]> {\n this.ensureInitialized();\n\n const command = new ListObjectsV2Command({\n Bucket: this.bucket,\n Prefix: prefix,\n MaxKeys: maxKeys,\n });\n\n const response = await this.client!.send(command);\n \n return (response.Contents || []).map((item) => ({\n key: item.Key || '',\n lastModified: item.LastModified,\n size: item.Size,\n }));\n }\n\n private generateKey(): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return `uploads/${timestamp}-${random}`;\n }\n\n private guessContentType(key: string): string {\n const ext = key.split('.').pop()?.toLowerCase();\n \n const contentTypes: Record<string, string> = {\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n avi: 'video/x-msvideo',\n pdf: 'application/pdf',\n json: 'application/json',\n txt: 'text/plain',\n };\n\n return contentTypes[ext || ''] || 'application/octet-stream';\n }\n\n private getImageContentType(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n const imageTypes: Record<string, string> = {\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n };\n return imageTypes[ext || ''] || 'image/jpeg';\n }\n\n private getVideoContentType(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n const videoTypes: Record<string, string> = {\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n avi: 'video/x-msvideo',\n mkv: 'video/x-matroska',\n ogv: 'video/ogg',\n };\n return videoTypes[ext || ''] || 'video/mp4';\n }\n}\n\nexport const s3Service = new S3Service();\n\nexport const upload = {\n initialize: (config: S3Config) => s3Service.initialize(config),\n \n file: (file: Buffer | Uint8Array | string, options?: UploadOptions) => \n s3Service.upload(file, options),\n \n image: (file: Buffer | Uint8Array | string, filename: string, options?: UploadOptions) =>\n s3Service.uploadImage(file, filename, options),\n \n video: (file: Buffer | Uint8Array | string, filename: string, options?: UploadOptions) =>\n s3Service.uploadVideo(file, filename, options),\n \n delete: (key: string) => s3Service.delete(key),\n getSignedUrl: (key: string, options?: SignedUrlOptions) => s3Service.getSignedUrl(key, options),\n getPublicUrl: (key: string) => s3Service.getPublicUrl(key),\n listFiles: (prefix?: string, maxKeys?: number) => s3Service.listFiles(prefix, maxKeys),\n};\n\nexport default upload;\n","import { Application, Request, Response, NextFunction, RequestHandler } from 'express';\nimport { FastifyInstance } from 'fastify';\nimport { createAuth, AuthService } from './auth';\nimport { createQueue, QueueManager } from './queue';\nimport { notify, notification } from './notifications';\nimport { logger } from './logger';\nimport { rateLimit } from './rate-limit';\nimport { config } from './config';\nimport { ResponseHelper } from './response';\n\nexport interface AppOptions {\n framework?: 'express' | 'fastify';\n auth?: boolean | {\n jwtSecret?: string;\n jwtExpiresIn?: string;\n refreshSecret?: string;\n refreshExpiresIn?: string;\n googleClientId?: string;\n googleClientSecret?: string;\n googleRedirectUri?: string;\n };\n queue?: boolean | {\n redisUrl?: string;\n };\n notifications?: boolean;\n rateLimit?: boolean | {\n window?: string;\n limit?: number;\n };\n logger?: boolean | {\n level?: string;\n prettyPrint?: boolean;\n };\n config?: boolean;\n}\n\nexport interface Plugin {\n name: string;\n initialize: (app: Application | FastifyInstance) => Promise<void> | void;\n middleware?: RequestHandler[];\n}\n\nclass PluginManager {\n private plugins: Map<string, Plugin> = new Map();\n private app: Application | FastifyInstance | null = null;\n private authService: AuthService | null = null;\n private queueManager: QueueManager | null = null;\n\n register(plugin: Plugin): void {\n this.plugins.set(plugin.name, plugin);\n logger.info(`Plugin \"${plugin.name}\" registered`);\n }\n\n unregister(name: string): void {\n this.plugins.delete(name);\n logger.info(`Plugin \"${name}\" unregistered`);\n }\n\n get(name: string): Plugin | undefined {\n return this.plugins.get(name);\n }\n\n getAll(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n async initializeAll(app: Application | FastifyInstance): Promise<void> {\n this.app = app;\n \n for (const plugin of this.plugins.values()) {\n logger.info(`Initializing plugin \"${plugin.name}\"`);\n await plugin.initialize(app);\n \n if (plugin.middleware && 'use' in app) {\n for (const mw of plugin.middleware) {\n (app as Application).use(mw);\n }\n }\n }\n }\n}\n\nexport class SaaSAppBuilder {\n private options: AppOptions;\n private pluginManager: PluginManager;\n private initialized: boolean = false;\n\n constructor(options: AppOptions = {}) {\n this.options = options;\n this.pluginManager = new PluginManager();\n }\n\n use(plugin: Plugin): this {\n this.pluginManager.register(plugin);\n return this;\n }\n\n async initialize(app: Application | FastifyInstance): Promise<void> {\n if (this.initialized) {\n throw new Error('App already initialized');\n }\n\n config.load();\n\n if (this.options.logger !== false) {\n const loggerOptions = typeof this.options.logger === 'object' ? this.options.logger : {};\n logger.create(loggerOptions);\n }\n\n if (this.options.auth !== false) {\n const authOptions = typeof this.options.auth === 'object' ? this.options.auth : {};\n this.authService = createAuth(authOptions);\n await this.authService.initialize();\n \n this.pluginManager.register({\n name: 'auth',\n initialize: (app) => {\n if ('use' in app) {\n (app as Application).use(this.authService!.getMiddleware());\n }\n },\n middleware: [this.authService!.getMiddleware()],\n });\n }\n\n if (this.options.queue !== false) {\n const queueOptions = typeof this.options.queue === 'object' ? this.options.queue : {};\n if (queueOptions.redisUrl) {\n (await import('./queue')).queue.setRedisOptions({ url: queueOptions.redisUrl });\n }\n \n this.pluginManager.register({\n name: 'queue',\n initialize: () => {},\n });\n }\n\n if (this.options.rateLimit !== false) {\n const rateLimitOptions = typeof this.options.rateLimit === 'object' ? this.options.rateLimit : {};\n \n this.pluginManager.register({\n name: 'rate-limit',\n initialize: (app) => {\n if ('use' in app) {\n (app as Application).use(rateLimit(rateLimitOptions));\n }\n },\n middleware: [rateLimit(rateLimitOptions)],\n });\n }\n\n if (this.options.notifications !== false) {\n this.pluginManager.register({\n name: 'notifications',\n initialize: () => {},\n });\n }\n\n await this.pluginManager.initializeAll(app);\n this.initialized = true;\n logger.info('SaaS App initialized');\n }\n\n getAuth(): AuthService | null {\n return this.authService;\n }\n\n getPluginManager(): PluginManager {\n return this.pluginManager;\n }\n}\n\nexport function createApp(options: AppOptions = {}): SaaSAppBuilder {\n return new SaaSAppBuilder(options);\n}\n\nexport function createExpressApp(options: AppOptions = {}): Application {\n const express = require('express');\n const app = express();\n \n const builder = createApp({ ...options, framework: 'express' });\n builder.initialize(app);\n \n return app;\n}\n\nexport { PluginManager, Plugin };\nexport default createApp;\n"]}
1
+ {"version":3,"sources":["../src/auth/types.ts","../src/config/index.ts","../src/auth/rbac.ts","../src/logger/index.ts","../src/queue/index.ts","../src/rate-limit/express.ts","../src/auth/index.ts","../src/auth/jwt.ts","../src/auth/oauth.ts","../src/auth/express.ts","../src/index.ts","../src/notifications/index.ts","../src/rate-limit/index.ts","../src/response/index.ts","../src/upload/index.ts","../src/plugin.ts","../src/database/index.ts"],"names":["config","z","logger","pino","QueueManager","createQueue","queue","Queue","Worker","jwt","response","bcrypt","nodemailer","data","S3Client","PutObjectCommand","DeleteObjectCommand","GetObjectCommand","getSignedUrl","ListObjectsV2Command","app","MongoClient"],"mappings":"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","file":"index.js","sourcesContent":["export type Role = 'admin' | 'user' | 'guest' | string;\n\nexport interface User {\n id: string;\n email: string;\n password?: string;\n role: Role;\n name?: string;\n picture?: string;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport interface JWTPayload {\n userId: string;\n email: string;\n role: Role;\n}\n\nexport interface TokenPair {\n accessToken: string;\n refreshToken: string;\n}\n\nexport interface AuthOptions {\n jwtSecret?: string;\n jwtExpiresIn?: string;\n refreshSecret?: string;\n refreshExpiresIn?: string;\n googleClientId?: string;\n googleClientSecret?: string;\n googleRedirectUri?: string;\n}\n\nexport interface AuthUserRequest extends Request {\n user?: JWTPayload;\n}\n\nexport type Permission = string;\n\nexport interface RolePermissions {\n [role: string]: Permission[];\n}\n\nexport const DEFAULT_PERMISSIONS: RolePermissions = {\n admin: ['*'],\n user: ['read', 'write:own'],\n guest: ['read:public'],\n};\n\nexport interface LoginCredentials {\n email: string;\n password: string;\n}\n\nexport interface RegisterData extends LoginCredentials {\n name?: string;\n role?: Role;\n}\n\nexport interface OAuthProvider {\n name: string;\n clientId: string;\n clientSecret: string;\n redirectUri: string;\n authorizationUrl: string;\n tokenUrl: string;\n userInfoUrl: string;\n}\n","import { z } from 'zod';\n\nexport const envSchema = z.object({\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z.string().default('3000'),\n DATABASE_URL: z.string().optional(),\n MONGODB_URL: z.string().optional(),\n REDIS_URL: z.string().default('redis://localhost:6379'),\n JWT_SECRET: z.string().min(32).optional(),\n JWT_EXPIRES_IN: z.string().default('7d'),\n JWT_REFRESH_SECRET: z.string().min(32).optional(),\n JWT_REFRESH_EXPIRES_IN: z.string().default('30d'),\n GOOGLE_CLIENT_ID: z.string().optional(),\n GOOGLE_CLIENT_SECRET: z.string().optional(),\n GOOGLE_REDIRECT_URI: z.string().optional(),\n SMTP_HOST: z.string().optional(),\n SMTP_PORT: z.string().default('587'),\n SMTP_USER: z.string().optional(),\n SMTP_PASS: z.string().optional(),\n SMTP_FROM: z.string().optional(),\n TWILIO_ACCOUNT_SID: z.string().optional(),\n TWILIO_AUTH_TOKEN: z.string().optional(),\n TWILIO_PHONE_NUMBER: z.string().optional(),\n SLACK_WEBHOOK_URL: z.string().optional(),\n RATE_LIMIT_WINDOW: z.string().default('1m'),\n RATE_LIMIT_LIMIT: z.string().default('100'),\n LOG_LEVEL: z.enum(['fatal', 'error', 'warn', 'info', 'debug', 'trace']).default('info'),\n AWS_REGION: z.string().default('us-east-1'),\n AWS_ACCESS_KEY_ID: z.string().optional(),\n AWS_SECRET_ACCESS_KEY: z.string().optional(),\n AWS_S3_BUCKET: z.string().optional(),\n AWS_ENDPOINT: z.string().optional(),\n});\n\nexport type EnvConfig = z.infer<typeof envSchema>;\n\nexport interface ConfigOptions {\n schema?: z.ZodSchema;\n envPath?: string;\n validate?: boolean;\n}\n\nclass ConfigManager {\n private config: EnvConfig | null = null;\n private schema: z.ZodSchema;\n private validate: boolean;\n\n constructor(options: ConfigOptions = {}) {\n this.schema = options.schema || envSchema;\n this.validate = options.validate ?? true;\n }\n\n load(): EnvConfig {\n if (this.config) return this.config;\n\n const env: Record<string, string | undefined> = {};\n \n for (const key of Object.keys(this.schema.shape)) {\n env[key] = process.env[key];\n }\n\n if (this.validate) {\n const result = this.schema.safeParse(env);\n if (!result.success) {\n const errors = result.error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');\n throw new Error(`Config validation failed: ${errors}`);\n }\n this.config = result.data;\n } else {\n this.config = env as EnvConfig;\n }\n\n return this.config;\n }\n\n get<K extends keyof EnvConfig>(key: K): EnvConfig[K] {\n if (!this.config) this.load();\n return this.config![key];\n }\n\n int(key: keyof EnvConfig): number {\n const value = this.get(key);\n if (typeof value === 'string') return parseInt(value, 10);\n return Number(value);\n }\n\n bool(key: keyof EnvConfig): boolean {\n const value = this.get(key);\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value.toLowerCase() === 'true';\n return Boolean(value);\n }\n\n isProduction(): boolean {\n return this.get('NODE_ENV') === 'production';\n }\n\n isDevelopment(): boolean {\n return this.get('NODE_ENV') === 'development';\n }\n\n isTest(): boolean {\n return this.get('NODE_ENV') === 'test';\n }\n\n getAll(): EnvConfig {\n if (!this.config) this.load();\n return this.config!;\n }\n}\n\nconst globalConfig = new ConfigManager();\n\nexport const config = {\n load: () => globalConfig.load(),\n get: <K extends keyof EnvConfig>(key: K) => globalConfig.get(key),\n int: (key: keyof EnvConfig) => globalConfig.int(key),\n bool: (key: keyof EnvConfig) => globalConfig.bool(key),\n isProduction: () => globalConfig.isProduction(),\n isDevelopment: () => globalConfig.isDevelopment(),\n isTest: () => globalConfig.isTest(),\n getAll: () => globalConfig.getAll(),\n create: (options?: ConfigOptions) => new ConfigManager(options),\n};\n\nexport default config;\n","import { Role, Permission, RolePermissions, DEFAULT_PERMISSIONS } from './types';\n\nexport class RBACService {\n private permissions: RolePermissions;\n\n constructor(permissions: RolePermissions = DEFAULT_PERMISSIONS) {\n this.permissions = permissions;\n }\n\n setPermissions(permissions: RolePermissions): void {\n this.permissions = permissions;\n }\n\n addPermission(role: Role, permission: Permission): void {\n if (!this.permissions[role]) {\n this.permissions[role] = [];\n }\n if (!this.permissions[role].includes(permission)) {\n this.permissions[role].push(permission);\n }\n }\n\n removePermission(role: Role, permission: Permission): void {\n if (this.permissions[role]) {\n this.permissions[role] = this.permissions[role].filter(p => p !== permission);\n }\n }\n\n getPermissions(role: Role): Permission[] {\n return this.permissions[role] || [];\n }\n\n hasPermission(role: Role, requiredPermission: Permission): boolean {\n const rolePermissions = this.getPermissions(role);\n \n if (rolePermissions.includes('*')) {\n return true;\n }\n\n if (rolePermissions.includes(requiredPermission)) {\n return true;\n }\n\n const [requiredAction, requiredScope] = requiredPermission.split(':');\n \n for (const perm of rolePermissions) {\n const [action, scope] = perm.split(':');\n \n if (action === '*' && (scope === '*' || scope === requiredScope)) {\n return true;\n }\n \n if (action === requiredAction && (scope === '*' || scope === requiredScope)) {\n return true;\n }\n }\n\n return false;\n }\n\n hasRole(userRole: Role, requiredRole: Role): boolean {\n const hierarchy: Role[] = ['guest', 'user', 'admin'];\n const userIndex = hierarchy.indexOf(userRole as any);\n const requiredIndex = hierarchy.indexOf(requiredRole as any);\n \n if (userIndex === -1 || requiredIndex === -1) {\n return userRole === requiredRole;\n }\n \n return userIndex >= requiredIndex;\n }\n\n authorize(permission: Permission) {\n return (role: Role): boolean => this.hasPermission(role, permission);\n }\n\n authorizeRole(requiredRole: Role) {\n return (role: Role): boolean => this.hasRole(role, requiredRole);\n }\n}\n\nexport const rbacService = new RBACService();\n","import pino, { Logger, LoggerOptions, Bindings } from 'pino';\nimport { config } from '../config';\n\nexport type LogLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\nexport interface LoggerConfig extends Partial<LoggerOptions> {\n level?: LogLevel;\n name?: string;\n prettyPrint?: boolean;\n}\n\nexport interface RequestLoggerOptions {\n logLevel?: LogLevel;\n autoLogging?: boolean;\n}\n\nclass LoggerManager {\n private loggers: Map<string, Logger> = new Map();\n private defaultLogger: Logger;\n\n constructor() {\n const level = (config.get('LOG_LEVEL') as LogLevel) || 'info';\n this.defaultLogger = pino({\n level,\n name: 'saas-backend-kit',\n formatters: {\n bindings: (bindings: Bindings) => ({\n ...bindings,\n service: 'saas-backend-kit',\n }),\n },\n });\n }\n\n createLogger(options: LoggerConfig = {}): Logger {\n const name = options.name || 'default';\n \n if (this.loggers.has(name)) {\n return this.loggers.get(name)!;\n }\n\n const level = options.level || (config.get('LOG_LEVEL') as LogLevel) || 'info';\n \n const logger = pino({\n level,\n name: options.name,\n ...options,\n });\n\n this.loggers.set(name, logger);\n return logger;\n }\n\n getLogger(name?: string): Logger {\n if (name) {\n return this.loggers.get(name) || this.defaultLogger;\n }\n return this.defaultLogger;\n }\n\n child(bindings: Bindings, options?: { name?: string }): Logger {\n const name = options?.name || 'child';\n const parent = options?.name ? this.getLogger(name) : this.defaultLogger;\n return parent.child(bindings);\n }\n}\n\nconst loggerManager = new LoggerManager();\n\nexport const logger = {\n info: (message: string, ...args: unknown[]) => loggerManager.getLogger().info(message, ...args),\n warn: (message: string, ...args: unknown[]) => loggerManager.getLogger().warn(message, ...args),\n error: (message: string, ...args: unknown[]) => loggerManager.getLogger().error(message, ...args),\n debug: (message: string, ...args: unknown[]) => loggerManager.getLogger().debug(message, ...args),\n trace: (message: string, ...args: unknown[]) => loggerManager.getLogger().trace(message, ...args),\n fatal: (message: string, ...args: unknown[]) => loggerManager.getLogger().fatal(message, ...args),\n child: (bindings: Bindings, options?: { name?: string }) => loggerManager.child(bindings, options),\n create: (options?: LoggerConfig) => loggerManager.createLogger(options),\n get: (name?: string) => loggerManager.getLogger(name),\n};\n\nexport function createRequestLogger(options: RequestLoggerOptions = {}) {\n const logLevel = options.logLevel || 'info';\n const logger = loggerManager.getLogger('http');\n\n return function requestLogger(\n req: { method: string; url: string; headers: Record<string, string | string[] | undefined> },\n res: { statusCode: number; statusMessage?: string },\n elapsed: number\n ) {\n const log = logger.child({\n method: req.method,\n url: req.url,\n status: res.statusCode,\n responseTime: elapsed,\n ip: req.headers['x-forwarded-for'] || req.headers['x-real-ip'] || 'unknown',\n userAgent: req.headers['user-agent'],\n });\n\n if (res.statusCode >= 500) {\n log.error(`Request completed`);\n } else if (res.statusCode >= 400) {\n log.warn(`Request completed`);\n } else {\n log.info(`Request completed`);\n }\n };\n}\n\nexport default logger;\n","import { Queue, Worker, Job, JobsOptions, WorkerOptions } from 'bullmq';\nimport { config } from '../config';\nimport { logger } from '../logger';\n\nexport interface QueueOptions {\n name: string;\n defaultJobOptions?: JobsOptions;\n}\n\nexport interface RedisOptions {\n host?: string;\n port?: number;\n password?: string;\n db?: number;\n url?: string;\n}\n\nexport interface JobData {\n [key: string]: unknown;\n}\n\nexport type JobProcessor = (job: Job<JobData>) => Promise<unknown>;\n\nclass QueueManager {\n private queues: Map<string, Queue> = new Map();\n private workers: Map<string, Worker> = new Map();\n private redisOptions: RedisOptions;\n\n constructor() {\n const redisUrl = config.get('REDIS_URL');\n if (redisUrl) {\n this.redisOptions = { url: redisUrl };\n } else {\n this.redisOptions = {\n host: 'localhost',\n port: 6379,\n };\n }\n }\n\n setRedisOptions(options: RedisOptions): void {\n this.redisOptions = options;\n }\n\n createQueue(name: string, options?: Partial<QueueOptions>): Queue {\n if (this.queues.has(name)) {\n return this.queues.get(name)!;\n }\n\n const queue = new Queue(name, {\n connection: this.redisOptions as any,\n defaultJobOptions: options?.defaultJobOptions || {\n removeOnComplete: 100,\n removeOnFail: 100,\n },\n });\n\n this.queues.set(name, queue);\n logger.info(`Queue \"${name}\" created`);\n\n return queue;\n }\n\n getQueue(name: string): Queue | undefined {\n return this.queues.get(name);\n }\n\n async addJob(\n queueName: string,\n jobName: string,\n data: JobData,\n options?: JobsOptions\n ): Promise<Job> {\n const queue = this.getQueue(queueName) || this.createQueue(queueName);\n const job = await queue.add(jobName, data, options);\n logger.debug(`Job \"${jobName}\" added to queue \"${queueName}\"`, { jobId: job.id });\n return job;\n }\n\n async addBulkJobs(\n queueName: string,\n jobs: Array<{ name: string; data: JobData; options?: JobsOptions }>\n ): Promise<Job[]> {\n const queue = this.getQueue(queueName) || this.createQueue(queueName);\n const bulkJobs = jobs.map(job => ({\n name: job.name,\n data: job.data,\n ...job.options,\n }));\n const result = await queue.addBulk(bulkJobs);\n logger.debug(`${jobs.length} jobs added to queue \"${queueName}\"`);\n return result;\n }\n\n processJob(\n queueName: string,\n processor: JobProcessor,\n options?: WorkerOptions\n ): Worker {\n const queue = this.getQueue(queueName) || this.createQueue(queueName);\n \n const worker = new Worker(queueName, async (job) => {\n logger.debug(`Processing job \"${job.name}\"`, { jobId: job.id, queue: queueName });\n return await processor(job);\n }, {\n connection: this.redisOptions as any,\n concurrency: options?.concurrency || 1,\n ...options,\n });\n\n worker.on('completed', (job) => {\n logger.debug(`Job completed`, { jobId: job.id, queue: queueName });\n });\n\n worker.on('failed', (job, err) => {\n logger.error(`Job failed`, { jobId: job?.id, queue: queueName, error: err.message });\n });\n\n worker.on('error', (err) => {\n logger.error(`Worker error`, { queue: queueName, error: err.message });\n });\n\n this.workers.set(queueName, worker);\n logger.info(`Worker started for queue \"${queueName}\"`);\n\n return worker;\n }\n\n async getJobCounts(queueName: string): Promise<Record<string, number>> {\n const queue = this.getQueue(queueName);\n if (!queue) {\n return { waiting: 0, active: 0, completed: 0, failed: 0, delayed: 0 };\n }\n return await queue.getJobCounts();\n }\n\n async getJobs(queueName: string, start: number = 0, end: number = 10): Promise<Job[]> {\n const queue = this.getQueue(queueName);\n if (!queue) return [];\n return await queue.getJobs(['waiting', 'active', 'completed', 'failed'], start, end);\n }\n\n async closeQueue(name: string): Promise<void> {\n const queue = this.queues.get(name);\n if (queue) {\n await queue.close();\n this.queues.delete(name);\n logger.info(`Queue \"${name}\" closed`);\n }\n }\n\n async closeWorker(name: string): Promise<void> {\n const worker = this.workers.get(name);\n if (worker) {\n await worker.close();\n this.workers.delete(name);\n logger.info(`Worker for queue \"${name}\" closed`);\n }\n }\n\n async closeAll(): Promise<void> {\n await Promise.all([\n ...Array.from(this.queues.values()).map(q => q.close()),\n ...Array.from(this.workers.values()).map(w => w.close()),\n ]);\n this.queues.clear();\n this.workers.clear();\n logger.info('All queues and workers closed');\n }\n}\n\nconst queueManager = new QueueManager();\n\nexport const createQueue = (name: string, options?: Partial<QueueOptions>): Queue => {\n return queueManager.createQueue(name, options);\n};\n\nexport const addJob = (\n queueName: string,\n jobName: string,\n data: JobData,\n options?: JobsOptions\n): Promise<Job> => {\n return queueManager.addJob(queueName, jobName, data, options);\n};\n\nexport const processJob = (\n queueName: string,\n processor: JobProcessor,\n options?: WorkerOptions\n): Worker => {\n return queueManager.processJob(queueName, processor, options);\n};\n\nexport const queue = {\n create: createQueue,\n add: addJob,\n process: processJob,\n get: (name: string) => queueManager.getQueue(name),\n getJobCounts: (name: string) => queueManager.getJobCounts(name),\n getJobs: (name: string, start?: number, end?: number) => queueManager.getJobs(name, start, end),\n close: (name: string) => queueManager.closeQueue(name),\n closeAll: () => queueManager.closeAll(),\n setRedisOptions: (options: RedisOptions) => queueManager.setRedisOptions(options),\n};\n\nexport { QueueManager };\nexport default queue;\n","import { Request, Response, NextFunction, RequestHandler } from 'express';\nimport { config } from '../config';\n\nexport interface RateLimitOptions {\n window?: string;\n limit?: number;\n keyGenerator?: (req: Request) => string;\n handler?: (req: Request, res: Response) => void;\n skipSuccessfulRequests?: boolean;\n skipFailedRequests?: boolean;\n skip?: (req: Request) => boolean;\n}\n\ninterface RateLimitRecord {\n count: number;\n resetTime: number;\n}\n\nclass InMemoryRateLimiter {\n private store: Map<string, RateLimitRecord> = new Map();\n private cleanupInterval: NodeJS.Timeout;\n\n constructor() {\n this.cleanupInterval = setInterval(() => this.cleanup(), 60000);\n this.cleanupInterval.unref();\n }\n\n private cleanup(): void {\n const now = Date.now();\n for (const [key, record] of this.store.entries()) {\n if (record.resetTime < now) {\n this.store.delete(key);\n }\n }\n }\n\n increment(key: string, windowMs: number): RateLimitRecord {\n const now = Date.now();\n const record = this.store.get(key);\n\n if (!record || record.resetTime < now) {\n const resetTime = now + windowMs;\n this.store.set(key, { count: 1, resetTime });\n return { count: 1, resetTime };\n }\n\n record.count++;\n return record;\n }\n\n get(key: string): RateLimitRecord | undefined {\n return this.store.get(key);\n }\n\n destroy(): void {\n clearInterval(this.cleanupInterval);\n }\n}\n\nclass RateLimiter {\n private options: Required<RateLimitOptions>;\n private store: InMemoryRateLimiter;\n\n constructor(options: RateLimitOptions = {}) {\n const defaultWindow = config.get('RATE_LIMIT_WINDOW') || '1m';\n const defaultLimit = parseInt(config.get('RATE_LIMIT_LIMIT') || '100', 10);\n\n this.options = {\n window: options.window || defaultWindow,\n limit: options.limit || defaultLimit,\n keyGenerator: options.keyGenerator || ((req: Request) => req.ip || 'unknown'),\n handler: options.handler || this.defaultHandler,\n skipSuccessfulRequests: options.skipSuccessfulRequests || false,\n skipFailedRequests: options.skipFailedRequests || false,\n skip: options.skip || (() => false),\n };\n\n this.store = new InMemoryRateLimiter();\n }\n\n private getWindowMs(): number {\n const window = this.options.window;\n const match = window.match(/^(\\d+)(s|m|h|d)$/);\n if (!match) return 60000;\n\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 's': return value * 1000;\n case 'm': return value * 60 * 1000;\n case 'h': return value * 60 * 60 * 1000;\n case 'd': return value * 24 * 60 * 60 * 1000;\n default: return 60000;\n }\n }\n\n private defaultHandler(req: Request, res: Response): void {\n res.status(429).json({\n error: 'Too many requests',\n message: `Rate limit exceeded. Please try again later.`,\n });\n }\n\n middleware(): RequestHandler {\n const windowMs = this.getWindowMs();\n\n return (req: Request, res: Response, next: NextFunction) => {\n if (this.options.skip(req)) {\n return next();\n }\n\n const key = this.options.keyGenerator(req);\n const record = this.store.increment(key, windowMs);\n\n const remaining = Math.max(0, this.options.limit - record.count);\n const resetTime = new Date(record.resetTime);\n\n res.setHeader('X-RateLimit-Limit', this.options.limit);\n res.setHeader('X-RateLimit-Remaining', remaining);\n res.setHeader('X-RateLimit-Reset', Math.ceil(record.resetTime / 1000));\n\n if (record.count > this.options.limit) {\n return this.options.handler(req, res);\n }\n\n next();\n };\n }\n\n destroy(): void {\n this.store.destroy();\n }\n}\n\nexport function rateLimit(options: RateLimitOptions = {}): RequestHandler {\n const limiter = new RateLimiter(options);\n return limiter.middleware();\n}\n\nexport function createRateLimiter(options: RateLimitOptions): RateLimiter {\n return new RateLimiter(options);\n}\n\nexport default rateLimit;\n","export * from './types';\nexport * from './jwt';\nexport * from './rbac';\nexport * from './oauth';\nexport * from './express';\nexport * from './fastify';\n","import jwt from 'jsonwebtoken';\nimport { JWTPayload, TokenPair } from './types';\nimport { config } from '../config';\n\nexport class JWTService {\n private secret: string;\n private expiresIn: string;\n private refreshSecret: string;\n private refreshExpiresIn: string;\n\n constructor(options: { jwtSecret?: string; jwtExpiresIn?: string; refreshSecret?: string; refreshExpiresIn?: string } = {}) {\n this.secret = options.jwtSecret || config.get('JWT_SECRET') || 'default-secret-change-in-production';\n this.expiresIn = options.jwtExpiresIn || config.get('JWT_EXPIRES_IN') || '7d';\n this.refreshSecret = options.refreshSecret || config.get('JWT_REFRESH_SECRET') || this.secret;\n this.refreshExpiresIn = options.refreshExpiresIn || config.get('JWT_REFRESH_EXPIRES_IN') || '30d';\n }\n\n generateToken(payload: JWTPayload): string {\n return jwt.sign(payload, this.secret, { expiresIn: this.expiresIn });\n }\n\n generateRefreshToken(payload: JWTPayload): string {\n return jwt.sign(payload, this.refreshSecret, { expiresIn: this.refreshExpiresIn });\n }\n\n generateTokenPair(payload: JWTPayload): TokenPair {\n return {\n accessToken: this.generateToken(payload),\n refreshToken: this.generateRefreshToken(payload),\n };\n }\n\n verifyToken(token: string): JWTPayload {\n return jwt.verify(token, this.secret) as JWTPayload;\n }\n\n verifyRefreshToken(token: string): JWTPayload {\n return jwt.verify(token, this.refreshSecret) as JWTPayload;\n }\n\n refreshTokens(refreshToken: string): TokenPair {\n const { iat, exp, nbf, ...payload } = this.verifyRefreshToken(refreshToken) as JWTPayload & { iat?: number; exp?: number; nbf?: number };\n return this.generateTokenPair(payload);\n }\n}\n\nexport const jwtService = new JWTService();\n","import { OAuthProvider } from './types';\nimport { config } from '../config';\n\nexport interface OAuthUserInfo {\n id: string;\n email: string;\n name?: string;\n picture?: string;\n}\n\nexport class OAuthService {\n private providers: Map<string, OAuthProvider> = new Map();\n\n constructor() {\n const googleClientId = config.get('GOOGLE_CLIENT_ID');\n const googleClientSecret = config.get('GOOGLE_CLIENT_SECRET');\n const googleRedirectUri = config.get('GOOGLE_REDIRECT_URI');\n\n if (googleClientId && googleClientSecret && googleRedirectUri) {\n this.registerProvider('google', {\n name: 'google',\n clientId: googleClientId,\n clientSecret: googleClientSecret,\n redirectUri: googleRedirectUri,\n authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n });\n }\n }\n\n registerProvider(name: string, provider: OAuthProvider): void {\n this.providers.set(name, provider);\n }\n\n getProvider(name: string): OAuthProvider | undefined {\n return this.providers.get(name);\n }\n\n getAuthorizationUrl(providerName: string, state?: string): string {\n const provider = this.getProvider(providerName);\n if (!provider) {\n throw new Error(`OAuth provider ${providerName} not registered`);\n }\n\n const params = new URLSearchParams({\n client_id: provider.clientId,\n redirect_uri: provider.redirectUri,\n response_type: 'code',\n scope: 'openid email profile',\n state: state || '',\n });\n\n return `${provider.authorizationUrl}?${params.toString()}`;\n }\n\n async exchangeCode(providerName: string, code: string): Promise<{ accessToken: string; refreshToken?: string }> {\n const provider = this.getProvider(providerName);\n if (!provider) {\n throw new Error(`OAuth provider ${providerName} not registered`);\n }\n\n const response = await fetch(provider.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n client_id: provider.clientId,\n client_secret: provider.clientSecret,\n code,\n grant_type: 'authorization_code',\n redirect_uri: provider.redirectUri,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OAuth token exchange failed: ${error}`);\n }\n\n const data = await response.json();\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n };\n }\n\n async getUserInfo(providerName: string, accessToken: string): Promise<OAuthUserInfo> {\n const provider = this.getProvider(providerName);\n if (!provider) {\n throw new Error(`OAuth provider ${providerName} not registered`);\n }\n\n const response = await fetch(provider.userInfoUrl, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OAuth user info fetch failed: ${error}`);\n }\n\n const data = await response.json();\n\n return {\n id: data.id,\n email: data.email,\n name: data.name,\n picture: data.picture,\n };\n }\n}\n\nexport const oauthService = new OAuthService();\n","import bcrypt from 'bcryptjs';\nimport { Request, Response, NextFunction, RequestHandler } from 'express';\nimport { JWTPayload, LoginCredentials, RegisterData, User, AuthOptions } from './types';\nimport { jwtService } from './jwt';\nimport { rbacService } from './rbac';\nimport { oauthService } from './oauth';\n\nexport interface AuthUser extends JWTPayload {\n id: string;\n email: string;\n role: string;\n}\n\ndeclare global {\n namespace Express {\n interface Request {\n user?: AuthUser;\n }\n }\n}\n\nexport interface UserStore {\n findByEmail(email: string): Promise<User | null>;\n findById(id: string): Promise<User | null>;\n create(data: RegisterData): Promise<User>;\n update(id: string, data: Partial<User>): Promise<User>;\n}\n\nclass InMemoryUserStore implements UserStore {\n private users: Map<string, User> = new Map();\n\n async findByEmail(email: string): Promise<User | null> {\n for (const user of this.users.values()) {\n if (user.email === email) return user;\n }\n return null;\n }\n\n async findById(id: string): Promise<User | null> {\n return this.users.get(id) || null;\n }\n\n async create(data: RegisterData): Promise<User> {\n const id = Math.random().toString(36).substr(2, 9);\n const hashedPassword = await bcrypt.hash(data.password, 10);\n const user: User = {\n id,\n email: data.email,\n password: hashedPassword,\n role: data.role || 'user',\n name: data.name,\n };\n this.users.set(id, user);\n return user;\n }\n\n async update(id: string, data: Partial<User>): Promise<User> {\n const user = this.users.get(id);\n if (!user) throw new Error('User not found');\n const updated = { ...user, ...data };\n this.users.set(id, updated);\n return updated;\n }\n}\n\nexport class AuthService {\n private userStore: UserStore;\n private options: Required<AuthOptions>;\n private initialized: boolean = false;\n\n constructor(options: AuthOptions = {}, userStore?: UserStore) {\n this.options = {\n jwtSecret: options.jwtSecret || process.env.JWT_SECRET || 'default-secret-change-in-production',\n jwtExpiresIn: options.jwtExpiresIn || '7d',\n refreshSecret: options.refreshSecret || process.env.JWT_REFRESH_SECRET || 'default-secret-change-in-production',\n refreshExpiresIn: options.refreshExpiresIn || '30d',\n googleClientId: options.googleClientId || process.env.GOOGLE_CLIENT_ID || '',\n googleClientSecret: options.googleClientSecret || process.env.GOOGLE_CLIENT_SECRET || '',\n googleRedirectUri: options.googleRedirectUri || process.env.GOOGLE_REDIRECT_URI || '',\n };\n\n this.userStore = userStore || new InMemoryUserStore();\n }\n\n async initialize(): Promise<void> {\n if (this.options.googleClientId && this.options.googleClientSecret && this.options.googleRedirectUri) {\n oauthService.registerProvider('google', {\n name: 'google',\n clientId: this.options.googleClientId,\n clientSecret: this.options.googleClientSecret,\n redirectUri: this.options.googleRedirectUri,\n authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',\n });\n }\n this.initialized = true;\n }\n\n async register(data: RegisterData): Promise<{ user: User; tokens: { accessToken: string; refreshToken: string } }> {\n const existing = await this.userStore.findByEmail(data.email);\n if (existing) {\n throw new Error('User already exists');\n }\n\n const user = await this.userStore.create(data);\n const tokens = jwtService.generateTokenPair({\n userId: user.id,\n email: user.email,\n role: user.role,\n });\n\n return { user, tokens };\n }\n\n async login(credentials: LoginCredentials): Promise<{ user: User; tokens: { accessToken: string; refreshToken: string } }> {\n const user = await this.userStore.findByEmail(credentials.email);\n if (!user || !user.password) {\n throw new Error('Invalid credentials');\n }\n\n const isValid = await bcrypt.compare(credentials.password, user.password);\n if (!isValid) {\n throw new Error('Invalid credentials');\n }\n\n const tokens = jwtService.generateTokenPair({\n userId: user.id,\n email: user.email,\n role: user.role,\n });\n\n return { user, tokens };\n }\n\n async refresh(refreshToken: string): Promise<{ accessToken: string; refreshToken: string }> {\n return jwtService.refreshTokens(refreshToken);\n }\n\n async getGoogleAuthUrl(state?: string): Promise<string> {\n return oauthService.getAuthorizationUrl('google', state);\n }\n\n async handleGoogleCallback(code: string): Promise<{ user: User; tokens: { accessToken: string; refreshToken: string } }> {\n const { accessToken } = await oauthService.exchangeCode('google', code);\n const userInfo = await oauthService.getUserInfo('google', accessToken);\n\n let user = await this.userStore.findByEmail(userInfo.email);\n \n if (!user) {\n user = await this.userStore.create({\n email: userInfo.email,\n password: Math.random().toString(36).substr(2, 20),\n name: userInfo.name,\n role: 'user',\n });\n }\n\n const tokens = jwtService.generateTokenPair({\n userId: user.id,\n email: user.email,\n role: user.role,\n });\n\n return { user, tokens };\n }\n\n getMiddleware(): RequestHandler {\n return (req: Request, res: Response, next: NextFunction) => {\n const authHeader = req.headers.authorization;\n \n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n return res.status(401).json({ error: 'No token provided' });\n }\n\n const token = authHeader.substring(7);\n \n try {\n const payload = jwtService.verifyToken(token);\n req.user = {\n ...payload,\n id: payload.userId,\n };\n next();\n } catch (error) {\n return res.status(401).json({ error: 'Invalid token' });\n }\n };\n }\n\n requireUser(): RequestHandler {\n return (req: Request, res: Response, next: NextFunction) => {\n if (!req.user) {\n return res.status(401).json({ error: 'Authentication required' });\n }\n next();\n };\n }\n\n requireRole(role: string): RequestHandler {\n return (req: Request, res: Response, next: NextFunction) => {\n if (!req.user) {\n return res.status(401).json({ error: 'Authentication required' });\n }\n if (!rbacService.hasRole(req.user.role, role)) {\n return res.status(403).json({ error: 'Insufficient permissions' });\n }\n next();\n };\n }\n\n requirePermission(permission: string): RequestHandler {\n return (req: Request, res: Response, next: NextFunction) => {\n if (!req.user) {\n return res.status(401).json({ error: 'Authentication required' });\n }\n if (!rbacService.hasPermission(req.user.role, permission)) {\n return res.status(403).json({ error: 'Insufficient permissions' });\n }\n next();\n };\n }\n}\n\nlet authServiceInstance: AuthService | null = null;\n\nexport function createAuth(options?: AuthOptions, userStore?: UserStore): AuthService {\n authServiceInstance = new AuthService(options, userStore);\n return authServiceInstance;\n}\n\nexport function auth(): AuthService {\n if (!authServiceInstance) {\n authServiceInstance = new AuthService();\n }\n return authServiceInstance;\n}\n\nexport const Auth = {\n initialize: (options?: AuthOptions) => {\n const service = createAuth(options);\n return {\n service,\n getMiddleware: () => service.getMiddleware(),\n requireUser: () => service.requireUser(),\n requireRole: (role: string) => service.requireRole(role),\n requirePermission: (permission: string) => service.requirePermission(permission),\n };\n },\n};\n","export { AuthService, createAuth, auth, Auth } from './auth';\nexport { QueueManager, createQueue, queue } from './queue';\nexport { notify, notification } from './notifications';\nexport { logger } from './logger';\nexport { rateLimit, createRateLimiter } from './rate-limit';\nexport { config } from './config';\nexport { ResponseHelper, response } from './response';\nexport { upload, s3Service, S3Service } from './upload';\nexport { createApp, createExpressApp, SaaSAppBuilder, PluginManager, Plugin, AppOptions } from './plugin';\nexport { database, db, DatabaseManager, DatabaseConfig, DatabaseOptions } from './database';\n\nexport { AuthOptions, User, JWTPayload, TokenPair, LoginCredentials, RegisterData, Role, Permission, RolePermissions } from './auth/types';\nexport { QueueOptions, JobData, JobProcessor } from './queue';\nexport { EmailOptions, SMSOptions, WebhookOptions, SlackOptions } from './notifications';\nexport { LoggerConfig, LogLevel } from './logger';\nexport { RateLimitOptions } from './rate-limit';\nexport { EnvConfig, ConfigOptions } from './config';\nexport { ApiResponse, PaginatedResponse, ErrorResponse } from './response';\nexport { S3Config, UploadOptions, UploadResult, SignedUrlOptions, FileObject } from './upload';\n","import nodemailer, { Transporter, SendMailOptions } from 'nodemailer';\nimport { config } from '../config';\nimport { logger } from '../logger';\n\nexport interface EmailOptions {\n to: string | string[];\n subject: string;\n text?: string;\n html?: string;\n template?: string;\n templateData?: Record<string, unknown>;\n from?: string;\n cc?: string | string[];\n bcc?: string | string[];\n attachments?: Array<{\n filename: string;\n content?: Buffer | string;\n path?: string;\n contentType?: string;\n }>;\n}\n\nexport interface SMSOptions {\n to: string;\n message: string;\n from?: string;\n}\n\nexport interface WebhookOptions {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH';\n headers?: Record<string, string>;\n body?: unknown;\n timeout?: number;\n}\n\nexport interface SlackOptions {\n text?: string;\n blocks?: Array<{\n type: string;\n text?: { type: string; text: string; emoji?: boolean };\n elements?: Array<{ type: string; text?: { type: string; text: string } }>;\n accessory?: { type: string; image_url?: string; alt_text?: string };\n }>;\n channel?: string;\n username?: string;\n iconEmoji?: string;\n}\n\nexport interface NotificationTransporter {\n email: Transporter;\n twilio?: {\n accountSid: string;\n authToken: string;\n phoneNumber: string;\n };\n slack?: {\n webhookUrl: string;\n };\n}\n\nclass EmailService {\n private transporter: Transporter | null = null;\n private from: string;\n\n constructor() {\n this.from = config.get('SMTP_FROM') || 'noreply@example.com';\n this.initialize();\n }\n\n private initialize(): void {\n const host = config.get('SMTP_HOST');\n const port = parseInt(config.get('SMTP_PORT') || '587', 10);\n const user = config.get('SMTP_USER');\n const pass = config.get('SMTP_PASS');\n\n if (host && user && pass) {\n this.transporter = nodemailer.createTransport({\n host,\n port,\n secure: port === 465,\n auth: {\n user,\n pass,\n },\n });\n logger.info('Email service initialized');\n }\n }\n\n setTransporter(transporter: Transporter): void {\n this.transporter = transporter;\n }\n\n async send(options: EmailOptions): Promise<{ messageId: string }> {\n if (!this.transporter) {\n logger.warn('Email transporter not configured, skipping email');\n return { messageId: 'mock-message-id' };\n }\n\n const mailOptions: SendMailOptions = {\n from: options.from || this.from,\n to: Array.isArray(options.to) ? options.to.join(', ') : options.to,\n subject: options.subject,\n text: options.text,\n html: options.html || this.renderTemplate(options.template, options.templateData),\n cc: options.cc,\n bcc: options.bcc,\n attachments: options.attachments,\n };\n\n const result = await this.transporter.sendMail(mailOptions);\n logger.info(`Email sent to ${options.to}`, { messageId: result.messageId });\n return { messageId: result.messageId };\n }\n\n private renderTemplate(templateName?: string, data?: Record<string, unknown>): string | undefined {\n if (!templateName || !data) return undefined;\n\n const templates: Record<string, (data: Record<string, unknown>) => string> = {\n welcome: (data) => `\n <h1>Welcome, ${data.name || 'User'}!</h1>\n <p>Thank you for joining ${data.appName || 'our platform'}.</p>\n <p>Get started by verifying your email.</p>\n `,\n passwordReset: (data) => `\n <h1>Password Reset</h1>\n <p>Click <a href=\"${data.resetUrl}\">here</a> to reset your password.</p>\n <p>This link expires in ${data.expiry || '1 hour'}.</p>\n `,\n verification: (data) => `\n <h1>Verify Your Email</h1>\n <p>Click <a href=\"${data.verifyUrl}\">here</a> to verify your email.</p>\n `,\n };\n\n const template = templates[templateName];\n return template ? template(data) : undefined;\n }\n}\n\nclass SMSService {\n private accountSid: string;\n private authToken: string;\n private phoneNumber: string;\n private initialized: boolean = false;\n\n constructor() {\n this.accountSid = config.get('TWILIO_ACCOUNT_SID') || '';\n this.authToken = config.get('TWILIO_AUTH_TOKEN') || '';\n this.phoneNumber = config.get('TWILIO_PHONE_NUMBER') || '';\n this.initialized = !!(this.accountSid && this.authToken && this.phoneNumber);\n }\n\n async send(options: SMSOptions): Promise<{ sid: string }> {\n if (!this.initialized) {\n logger.warn('Twilio not configured, skipping SMS');\n return { sid: 'mock-sid' };\n }\n\n try {\n const twilio = await import('twilio');\n const client = twilio.default(this.accountSid, this.authToken);\n\n const result = await client.messages.create({\n body: options.message,\n from: options.from || this.phoneNumber,\n to: options.to,\n });\n\n logger.info(`SMS sent to ${options.to}`, { sid: result.sid });\n return { sid: result.sid };\n } catch (error) {\n logger.error('Failed to send SMS', { error });\n throw error;\n }\n }\n}\n\nclass WebhookService {\n async send(options: WebhookOptions): Promise<{ status: number; body: unknown }> {\n const response = await fetch(options.url, {\n method: options.method || 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: options.timeout ? AbortSignal.timeout(options.timeout) : undefined,\n });\n\n const body = await response.json().catch(() => null);\n logger.info(`Webhook sent to ${options.url}`, { status: response.status });\n return { status: response.status, body };\n }\n}\n\nclass SlackService {\n private webhookUrl: string;\n\n constructor() {\n this.webhookUrl = config.get('SLACK_WEBHOOK_URL') || '';\n }\n\n setWebhookUrl(url: string): void {\n this.webhookUrl = url;\n }\n\n async send(options: SlackOptions): Promise<{ ok: boolean }> {\n if (!this.webhookUrl) {\n logger.warn('Slack webhook not configured, skipping message');\n return { ok: false };\n }\n\n const payload = {\n text: options.text,\n blocks: options.blocks,\n channel: options.channel,\n username: options.username,\n icon_emoji: options.iconEmoji,\n };\n\n const response = await fetch(this.webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n\n const ok = response.ok;\n if (ok) {\n logger.info('Slack message sent');\n } else {\n logger.error('Failed to send Slack message');\n }\n return { ok };\n }\n}\n\nclass NotificationService {\n email: EmailService;\n sms: SMSService;\n webhook: WebhookService;\n slack: SlackService;\n\n constructor() {\n this.email = new EmailService();\n this.sms = new SMSService();\n this.webhook = new WebhookService();\n this.slack = new SlackService();\n }\n}\n\nexport const notify = new NotificationService();\n\nexport const notification = {\n email: (options: EmailOptions) => notify.email.send(options),\n sms: (options: SMSOptions) => notify.sms.send(options),\n webhook: (options: WebhookOptions) => notify.webhook.send(options),\n slack: (options: SlackOptions) => notify.slack.send(options),\n};\n\nexport default notification;\n","export * from './express';\nexport * from './fastify';\n","import { Response } from 'express';\n\nexport interface ApiResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n meta?: {\n page?: number;\n limit?: number;\n total?: number;\n totalPages?: number;\n };\n}\n\nexport interface PaginatedResponse<T> extends Omit<ApiResponse<T[]>, 'data'> {\n data: T[];\n meta: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n}\n\nexport interface ErrorResponse {\n success: false;\n error: string;\n code?: string;\n details?: Record<string, unknown>;\n}\n\nexport class ResponseHelper {\n static success<T>(res: Response, data?: T, message?: string, statusCode: number = 200): Response {\n const response: ApiResponse<T> = {\n success: true,\n data,\n message,\n };\n return res.status(statusCode).json(response);\n }\n\n static created<T>(res: Response, data?: T, message: string = 'Resource created'): Response {\n return this.success(res, data, message, 201);\n }\n\n static updated<T>(res: Response, data?: T, message: string = 'Resource updated'): Response {\n return this.success(res, data, message, 200);\n }\n\n static deleted(res: Response, message: string = 'Resource deleted'): Response {\n return this.success(res, null, message, 200);\n }\n\n static error(\n res: Response,\n error: string,\n statusCode: number = 400,\n code?: string,\n details?: Record<string, unknown>\n ): Response {\n const response: ErrorResponse = {\n success: false,\n error,\n code,\n ...(details && { details }),\n };\n return res.status(statusCode).json(response);\n }\n\n static badRequest(res: Response, error: string = 'Bad request', code?: string): Response {\n return this.error(res, error, 400, code);\n }\n\n static unauthorized(res: Response, error: string = 'Unauthorized', code?: string): Response {\n return this.error(res, error, 401, code);\n }\n\n static forbidden(res: Response, error: string = 'Forbidden', code?: string): Response {\n return this.error(res, error, 403, code);\n }\n\n static notFound(res: Response, error: string = 'Resource not found', code?: string): Response {\n return this.error(res, error, 404, code);\n }\n\n static conflict(res: Response, error: string = 'Conflict', code?: string): Response {\n return this.error(res, error, 409, code);\n }\n\n static validationError(res: Response, error: string, details?: Record<string, unknown>): Response {\n return this.error(res, error, 422, 'VALIDATION_ERROR', details);\n }\n\n static internalError(res: Response, error: string = 'Internal server error'): Response {\n return this.error(res, error, 500, 'INTERNAL_ERROR');\n }\n\n static paginated<T>(\n res: Response,\n data: T[],\n page: number,\n limit: number,\n total: number\n ): Response<PaginatedResponse<T>> {\n const totalPages = Math.ceil(total / limit);\n const response: PaginatedResponse<T> = {\n success: true,\n data,\n meta: {\n page,\n limit,\n total,\n totalPages,\n },\n };\n return res.status(200).json(response);\n }\n\n static noContent(res: Response): Response {\n return res.status(204).send();\n }\n}\n\ndeclare global {\n namespace Express {\n interface Response {\n success<T>(data?: T, message?: string, statusCode?: number): Response;\n created<T>(data?: T, message?: string): Response;\n updated<T>(data?: T, message?: string): Response;\n deleted(message?: string): Response;\n error(error: string, statusCode?: number, code?: string, details?: Record<string, unknown>): Response;\n badRequest(error?: string, code?: string): Response;\n unauthorized(error?: string, code?: string): Response;\n forbidden(error?: string, code?: string): Response;\n notFound(error?: string, code?: string): Response;\n conflict(error?: string, code?: string): Response;\n validationError(error: string, details?: Record<string, unknown>): Response;\n internalError(error?: string): Response;\n paginated<T>(data: T[], page: number, limit: number, total: number): Response;\n }\n }\n}\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const proto = require('express').response;\n if (proto) {\n proto.success = function <T>(this: Response, data?: T, message?: string, statusCode: number = 200) {\n return ResponseHelper.success(this, data, message, statusCode);\n };\n\n proto.created = function <T>(this: Response, data?: T, message?: string) {\n return ResponseHelper.created(this, data, message);\n };\n\n proto.updated = function <T>(this: Response, data?: T, message?: string) {\n return ResponseHelper.updated(this, data, message);\n };\n\n proto.deleted = function (this: Response, message?: string) {\n return ResponseHelper.deleted(this, message);\n };\n\n proto.error = function (this: Response, error: string, statusCode: number = 400, code?: string, details?: Record<string, unknown>) {\n return ResponseHelper.error(this, error, statusCode, code, details);\n };\n\n proto.badRequest = function (this: Response, error?: string, code?: string) {\n return ResponseHelper.badRequest(this, error, code);\n };\n\n proto.unauthorized = function (this: Response, error?: string, code?: string) {\n return ResponseHelper.unauthorized(this, error, code);\n };\n\n proto.forbidden = function (this: Response, error?: string, code?: string) {\n return ResponseHelper.forbidden(this, error, code);\n };\n\n proto.notFound = function (this: Response, error?: string, code?: string) {\n return ResponseHelper.notFound(this, error, code);\n };\n\n proto.conflict = function (this: Response, error?: string, code?: string) {\n return ResponseHelper.conflict(this, error, code);\n };\n\n proto.validationError = function (this: Response, error: string, details?: Record<string, unknown>) {\n return ResponseHelper.validationError(this, error, details);\n };\n\n proto.internalError = function (this: Response, error?: string) {\n return ResponseHelper.internalError(this, error);\n };\n\n proto.paginated = function <T>(this: Response, data: T[], page: number, limit: number, total: number) {\n return ResponseHelper.paginated(this, data, page, limit, total);\n };\n }\n} catch {\n // express not available at runtime\n}\n\nexport const response = ResponseHelper;\nexport default ResponseHelper;\n","import { S3Client, PutObjectCommand, DeleteObjectCommand, GetObjectCommand, ListObjectsV2Command } from '@aws-sdk/client-s3';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { config } from '../config';\nimport { logger } from '../logger';\n\nexport interface S3Config {\n region?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n bucket: string;\n endpoint?: string;\n forcePathStyle?: boolean;\n}\n\nexport interface UploadOptions {\n key?: string;\n contentType?: string;\n expiresIn?: number;\n metadata?: Record<string, string>;\n}\n\nexport interface UploadResult {\n key: string;\n url: string;\n bucket: string;\n contentType?: string;\n size?: number;\n}\n\nexport interface SignedUrlOptions {\n expiresIn?: number;\n}\n\nexport interface FileObject {\n key: string;\n lastModified?: Date;\n size?: number;\n contentType?: string;\n}\n\nclass S3Service {\n private client: S3Client | null = null;\n private bucket: string;\n private initialized: boolean = false;\n\n constructor() {\n this.bucket = '';\n }\n\n initialize(config: S3Config): void {\n this.client = new S3Client({\n region: config.region || 'us-east-1',\n credentials: config.accessKeyId && config.secretAccessKey\n ? {\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n }\n : undefined,\n endpoint: config.endpoint,\n forcePathStyle: config.forcePathStyle || false,\n });\n\n this.bucket = config.bucket;\n this.initialized = true;\n logger.info('S3 service initialized', { bucket: this.bucket });\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n const region = config.get('AWS_REGION') || 'us-east-1';\n const bucket = config.get('AWS_S3_BUCKET') || '';\n \n this.initialize({\n region,\n accessKeyId: config.get('AWS_ACCESS_KEY_ID'),\n secretAccessKey: config.get('AWS_SECRET_ACCESS_KEY'),\n bucket,\n endpoint: config.get('AWS_ENDPOINT'),\n });\n }\n }\n\n async upload(\n file: Buffer | Uint8Array | string,\n options: UploadOptions = {}\n ): Promise<UploadResult> {\n this.ensureInitialized();\n\n const key = options.key || this.generateKey();\n const contentType = options.contentType || this.guessContentType(key);\n\n const command = new PutObjectCommand({\n Bucket: this.bucket,\n Key: key,\n Body: file,\n ContentType: contentType,\n Metadata: options.metadata,\n });\n\n await this.client!.send(command);\n\n const url = await this.getSignedUrl(key, { expiresIn: options.expiresIn || 3600 });\n\n logger.info('File uploaded to S3', { key, bucket: this.bucket, contentType });\n\n return {\n key,\n url,\n bucket: this.bucket,\n contentType,\n };\n }\n\n async uploadImage(\n file: Buffer | Uint8Array | string,\n filename: string,\n options: UploadOptions = {}\n ): Promise<UploadResult> {\n const key = options.key || `images/${Date.now()}-${filename}`;\n \n return this.upload(file, {\n ...options,\n key,\n contentType: options.contentType || this.getImageContentType(filename),\n });\n }\n\n async uploadVideo(\n file: Buffer | Uint8Array | string,\n filename: string,\n options: UploadOptions = {}\n ): Promise<UploadResult> {\n const key = options.key || `videos/${Date.now()}-${filename}`;\n \n return this.upload(file, {\n ...options,\n key,\n contentType: options.contentType || this.getVideoContentType(filename),\n });\n }\n\n async delete(key: string): Promise<void> {\n this.ensureInitialized();\n\n const command = new DeleteObjectCommand({\n Bucket: this.bucket,\n Key: key,\n });\n\n await this.client!.send(command);\n logger.info('File deleted from S3', { key, bucket: this.bucket });\n }\n\n async getSignedUrl(key: string, options: SignedUrlOptions = {}): Promise<string> {\n this.ensureInitialized();\n\n const command = new GetObjectCommand({\n Bucket: this.bucket,\n Key: key,\n });\n\n return getSignedUrl(this.client!, command, {\n expiresIn: options.expiresIn || 3600,\n });\n }\n\n async getPublicUrl(key: string): Promise<string> {\n return `https://${this.bucket}.s3.${config.get('AWS_REGION') || 'us-east-1'}.amazonaws.com/${key}`;\n }\n\n async listFiles(prefix?: string, maxKeys: number = 1000): Promise<FileObject[]> {\n this.ensureInitialized();\n\n const command = new ListObjectsV2Command({\n Bucket: this.bucket,\n Prefix: prefix,\n MaxKeys: maxKeys,\n });\n\n const response = await this.client!.send(command);\n \n return (response.Contents || []).map((item) => ({\n key: item.Key || '',\n lastModified: item.LastModified,\n size: item.Size,\n }));\n }\n\n private generateKey(): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return `uploads/${timestamp}-${random}`;\n }\n\n private guessContentType(key: string): string {\n const ext = key.split('.').pop()?.toLowerCase();\n \n const contentTypes: Record<string, string> = {\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n avi: 'video/x-msvideo',\n pdf: 'application/pdf',\n json: 'application/json',\n txt: 'text/plain',\n };\n\n return contentTypes[ext || ''] || 'application/octet-stream';\n }\n\n private getImageContentType(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n const imageTypes: Record<string, string> = {\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n };\n return imageTypes[ext || ''] || 'image/jpeg';\n }\n\n private getVideoContentType(filename: string): string {\n const ext = filename.split('.').pop()?.toLowerCase();\n const videoTypes: Record<string, string> = {\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n avi: 'video/x-msvideo',\n mkv: 'video/x-matroska',\n ogv: 'video/ogg',\n };\n return videoTypes[ext || ''] || 'video/mp4';\n }\n}\n\nexport const s3Service = new S3Service();\n\nexport const upload = {\n initialize: (config: S3Config) => s3Service.initialize(config),\n \n file: (file: Buffer | Uint8Array | string, options?: UploadOptions) => \n s3Service.upload(file, options),\n \n image: (file: Buffer | Uint8Array | string, filename: string, options?: UploadOptions) =>\n s3Service.uploadImage(file, filename, options),\n \n video: (file: Buffer | Uint8Array | string, filename: string, options?: UploadOptions) =>\n s3Service.uploadVideo(file, filename, options),\n \n delete: (key: string) => s3Service.delete(key),\n getSignedUrl: (key: string, options?: SignedUrlOptions) => s3Service.getSignedUrl(key, options),\n getPublicUrl: (key: string) => s3Service.getPublicUrl(key),\n listFiles: (prefix?: string, maxKeys?: number) => s3Service.listFiles(prefix, maxKeys),\n};\n\nexport default upload;\n","import { Application, Request, Response, NextFunction, RequestHandler } from 'express';\nimport { FastifyInstance } from 'fastify';\nimport { createAuth, AuthService } from './auth';\nimport { createQueue, QueueManager } from './queue';\nimport { notify, notification } from './notifications';\nimport { logger } from './logger';\nimport { rateLimit } from './rate-limit';\nimport { config } from './config';\nimport { ResponseHelper } from './response';\n\nexport interface AppOptions {\n framework?: 'express' | 'fastify';\n auth?: boolean | {\n jwtSecret?: string;\n jwtExpiresIn?: string;\n refreshSecret?: string;\n refreshExpiresIn?: string;\n googleClientId?: string;\n googleClientSecret?: string;\n googleRedirectUri?: string;\n };\n queue?: boolean | {\n redisUrl?: string;\n };\n notifications?: boolean;\n rateLimit?: boolean | {\n window?: string;\n limit?: number;\n };\n logger?: boolean | {\n level?: string;\n prettyPrint?: boolean;\n };\n config?: boolean;\n}\n\nexport interface Plugin {\n name: string;\n initialize: (app: Application | FastifyInstance) => Promise<void> | void;\n middleware?: RequestHandler[];\n}\n\nclass PluginManager {\n private plugins: Map<string, Plugin> = new Map();\n private app: Application | FastifyInstance | null = null;\n private authService: AuthService | null = null;\n private queueManager: QueueManager | null = null;\n\n register(plugin: Plugin): void {\n this.plugins.set(plugin.name, plugin);\n logger.info(`Plugin \"${plugin.name}\" registered`);\n }\n\n unregister(name: string): void {\n this.plugins.delete(name);\n logger.info(`Plugin \"${name}\" unregistered`);\n }\n\n get(name: string): Plugin | undefined {\n return this.plugins.get(name);\n }\n\n getAll(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n has(name: string): boolean {\n return this.plugins.has(name);\n }\n\n async initializeAll(app: Application | FastifyInstance): Promise<void> {\n this.app = app;\n \n for (const plugin of this.plugins.values()) {\n logger.info(`Initializing plugin \"${plugin.name}\"`);\n await plugin.initialize(app);\n \n if (plugin.middleware && 'use' in app) {\n for (const mw of plugin.middleware) {\n (app as Application).use(mw);\n }\n }\n }\n }\n}\n\nexport class SaaSAppBuilder {\n private options: AppOptions;\n private pluginManager: PluginManager;\n private initialized: boolean = false;\n\n constructor(options: AppOptions = {}) {\n this.options = options;\n this.pluginManager = new PluginManager();\n }\n\n use(plugin: Plugin): this {\n this.pluginManager.register(plugin);\n return this;\n }\n\n async initialize(app: Application | FastifyInstance): Promise<void> {\n if (this.initialized) {\n throw new Error('App already initialized');\n }\n\n config.load();\n\n if (this.options.logger !== false) {\n const loggerOptions = typeof this.options.logger === 'object' ? this.options.logger : {};\n logger.create(loggerOptions);\n }\n\n if (this.options.auth !== false) {\n const authOptions = typeof this.options.auth === 'object' ? this.options.auth : {};\n this.authService = createAuth(authOptions);\n await this.authService.initialize();\n \n this.pluginManager.register({\n name: 'auth',\n initialize: (app) => {\n if ('use' in app) {\n (app as Application).use(this.authService!.getMiddleware());\n }\n },\n middleware: [this.authService!.getMiddleware()],\n });\n }\n\n if (this.options.queue !== false) {\n const queueOptions = typeof this.options.queue === 'object' ? this.options.queue : {};\n if (queueOptions.redisUrl) {\n (await import('./queue')).queue.setRedisOptions({ url: queueOptions.redisUrl });\n }\n \n this.pluginManager.register({\n name: 'queue',\n initialize: () => {},\n });\n }\n\n if (this.options.rateLimit !== false) {\n const rateLimitOptions = typeof this.options.rateLimit === 'object' ? this.options.rateLimit : {};\n \n this.pluginManager.register({\n name: 'rate-limit',\n initialize: (app) => {\n if ('use' in app) {\n (app as Application).use(rateLimit(rateLimitOptions));\n }\n },\n middleware: [rateLimit(rateLimitOptions)],\n });\n }\n\n if (this.options.notifications !== false) {\n this.pluginManager.register({\n name: 'notifications',\n initialize: () => {},\n });\n }\n\n await this.pluginManager.initializeAll(app);\n this.initialized = true;\n logger.info('SaaS App initialized');\n }\n\n getAuth(): AuthService | null {\n return this.authService;\n }\n\n getPluginManager(): PluginManager {\n return this.pluginManager;\n }\n}\n\nexport function createApp(options: AppOptions = {}): SaaSAppBuilder {\n return new SaaSAppBuilder(options);\n}\n\nexport function createExpressApp(options: AppOptions = {}): Application {\n const express = require('express');\n const app = express();\n \n const builder = createApp({ ...options, framework: 'express' });\n builder.initialize(app);\n \n return app;\n}\n\nexport { PluginManager, Plugin };\nexport default createApp;\n","import { MongoClient, Db, Collection, MongoClientOptions } from 'mongodb';\n\nexport interface DatabaseConfig {\n url?: string;\n options?: MongoClientOptions;\n}\n\nexport interface DatabaseOptions {\n url: string;\n options?: MongoClientOptions;\n}\n\nclass DatabaseManager {\n private client: MongoClient | null = null;\n private db: Db | null = null;\n private url: string | null = null;\n\n async connect(options: DatabaseOptions): Promise<Db> {\n if (this.db) return this.db;\n\n this.url = options.url;\n const clientOptions: MongoClientOptions = {\n ...options.options,\n maxPoolSize: 10,\n minPoolSize: 1,\n serverSelectionTimeoutMS: 5000,\n socketTimeoutMS: 45000,\n };\n\n this.client = new MongoClient(this.url, clientOptions);\n await this.client.connect();\n this.db = this.client.db();\n\n return this.db;\n }\n\n async connectTo(uri: string, dbName?: string, options?: MongoClientOptions): Promise<Db> {\n if (this.db) return this.db;\n\n const clientOptions: MongoClientOptions = {\n ...options,\n maxPoolSize: 10,\n minPoolSize: 1,\n serverSelectionTimeoutMS: 5000,\n socketTimeoutMS: 45000,\n };\n\n this.client = new MongoClient(uri, clientOptions);\n await this.client.connect();\n this.db = this.client.db(dbName);\n\n return this.db;\n }\n\n getDb(): Db {\n if (!this.db) {\n throw new Error('Database not connected. Call connect() first.');\n }\n return this.db;\n }\n\n getClient(): MongoClient {\n if (!this.client) {\n throw new Error('Database not connected. Call connect() first.');\n }\n return this.client;\n }\n\n collection<T = any>(name: string): Collection<T> {\n return this.getDb().collection<T>(name);\n }\n\n async close(): Promise<void> {\n if (this.client) {\n await this.client.close();\n this.client = null;\n this.db = null;\n }\n }\n\n isConnected(): boolean {\n return this.client !== null && this.db !== null;\n }\n}\n\nconst databaseManager = new DatabaseManager();\n\nexport const database = {\n connect: (options: DatabaseOptions) => databaseManager.connect(options),\n connectTo: (uri: string, dbName?: string, options?: MongoClientOptions) => \n databaseManager.connectTo(uri, dbName, options),\n getDb: () => databaseManager.getDb(),\n getClient: () => databaseManager.getClient(),\n collection: <T = any>(name: string) => databaseManager.collection<T>(name),\n close: () => databaseManager.close(),\n isConnected: () => databaseManager.isConnected(),\n};\n\nexport const db = database;\n\nexport { DatabaseManager };\nexport default database;\n"]}