joopjs 2.0.6 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/observables.md +28 -0
- package/.claude/skills/setup.md +14 -3
- package/.cursor/rules/joopjs.mdc +4 -5
- package/.github/copilot-instructions.md +3 -1
- package/.windsurf/rules/joopjs.md +4 -0
- package/CHANGELOG.md +31 -2
- package/README.md +19 -7
- package/ai-rules/AGENTS.md +21 -0
- package/ai-rules/GEMINI.md +17 -3
- package/dist/ai/index.js +15 -3
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/index.mjs +15 -3
- package/dist/ai/index.mjs.map +1 -1
- package/dist/analytics/index.js +10 -2
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/index.mjs +10 -2
- package/dist/analytics/index.mjs.map +1 -1
- package/dist/angular/index.d.mts +98 -27
- package/dist/angular/index.d.ts +98 -27
- package/dist/angular/index.js +44 -0
- package/dist/angular/index.js.map +1 -1
- package/dist/angular/index.mjs +39 -1
- package/dist/angular/index.mjs.map +1 -1
- package/dist/api/index.js +15 -3
- package/dist/api/index.js.map +1 -1
- package/dist/api/index.mjs +15 -3
- package/dist/api/index.mjs.map +1 -1
- package/dist/auth/index.js +15 -3
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/index.mjs +15 -3
- package/dist/auth/index.mjs.map +1 -1
- package/dist/banking/index.js +15 -3
- package/dist/banking/index.js.map +1 -1
- package/dist/banking/index.mjs +15 -3
- package/dist/banking/index.mjs.map +1 -1
- package/dist/cache/index.js +15 -3
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/index.mjs +15 -3
- package/dist/cache/index.mjs.map +1 -1
- package/dist/{index-DFqEoX_l.d.ts → consent.service-CIHNtx9h.d.ts} +1 -2
- package/dist/{index-B_ksKpS1.d.mts → consent.service-DQ-JAEJx.d.mts} +1 -2
- package/dist/core/index.d.mts +34 -1
- package/dist/core/index.d.ts +34 -1
- package/dist/core/index.js +56 -5
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +54 -6
- package/dist/core/index.mjs.map +1 -1
- package/dist/deeplink/index.js +15 -3
- package/dist/deeplink/index.js.map +1 -1
- package/dist/deeplink/index.mjs +15 -3
- package/dist/deeplink/index.mjs.map +1 -1
- package/dist/device/index.js +15 -3
- package/dist/device/index.js.map +1 -1
- package/dist/device/index.mjs +15 -3
- package/dist/device/index.mjs.map +1 -1
- package/dist/forms/index.js +15 -3
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/index.mjs +15 -3
- package/dist/forms/index.mjs.map +1 -1
- package/dist/i18n/index.js +15 -3
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/index.mjs +15 -3
- package/dist/i18n/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +50 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +50 -8
- package/dist/index.mjs.map +1 -1
- package/dist/{joop-CA3DMeOO.d.ts → joop-Dim2yEKG.d.ts} +1 -1
- package/dist/{joop-Bx7Iwj5p.d.mts → joop-GkQw13f9.d.mts} +1 -1
- package/dist/native-bridge/index.js +10 -2
- package/dist/native-bridge/index.js.map +1 -1
- package/dist/native-bridge/index.mjs +10 -2
- package/dist/native-bridge/index.mjs.map +1 -1
- package/dist/network/index.js +15 -3
- package/dist/network/index.js.map +1 -1
- package/dist/network/index.mjs +15 -3
- package/dist/network/index.mjs.map +1 -1
- package/dist/observability/index.js +15 -3
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/index.mjs +15 -3
- package/dist/observability/index.mjs.map +1 -1
- package/dist/pwa/index.js +15 -3
- package/dist/pwa/index.js.map +1 -1
- package/dist/pwa/index.mjs +15 -3
- package/dist/pwa/index.mjs.map +1 -1
- package/dist/react/index.d.mts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +15 -3
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +15 -3
- package/dist/react/index.mjs.map +1 -1
- package/dist/router/index.js +15 -3
- package/dist/router/index.js.map +1 -1
- package/dist/router/index.mjs +15 -3
- package/dist/router/index.mjs.map +1 -1
- package/dist/security/index.js +15 -3
- package/dist/security/index.js.map +1 -1
- package/dist/security/index.mjs +15 -3
- package/dist/security/index.mjs.map +1 -1
- package/dist/session/index.js +15 -3
- package/dist/session/index.js.map +1 -1
- package/dist/session/index.mjs +15 -3
- package/dist/session/index.mjs.map +1 -1
- package/dist/state/index.js +15 -3
- package/dist/state/index.js.map +1 -1
- package/dist/state/index.mjs +15 -3
- package/dist/state/index.mjs.map +1 -1
- package/dist/storage/index.js +15 -3
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +15 -3
- package/dist/storage/index.mjs.map +1 -1
- package/dist/sync/index.js +15 -3
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/index.mjs +15 -3
- package/dist/sync/index.mjs.map +1 -1
- package/dist/theme/index.js +15 -3
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +15 -3
- package/dist/theme/index.mjs.map +1 -1
- package/dist/ui/index.js +15 -3
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/index.mjs +15 -3
- package/dist/ui/index.mjs.map +1 -1
- package/dist/utilities/index.js +46 -4
- package/dist/utilities/index.js.map +1 -1
- package/dist/utilities/index.mjs +46 -4
- package/dist/utilities/index.mjs.map +1 -1
- package/dist/vue/index.d.mts +2 -2
- package/dist/vue/index.d.ts +2 -2
- package/dist/vue/index.js +15 -3
- package/dist/vue/index.js.map +1 -1
- package/dist/vue/index.mjs +15 -3
- package/dist/vue/index.mjs.map +1 -1
- package/dist/workflow/index.js +15 -3
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/index.mjs +15 -3
- package/dist/workflow/index.mjs.map +1 -1
- package/package.json +16 -2
package/dist/auth/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/events/index.ts","../../src/auth/auth.service.ts","../../src/auth/token.service.ts","../../src/auth/pkce.service.ts","../../src/auth/otp.service.ts","../../src/auth/otp-timer.service.ts","../../src/auth/biometric.service.ts","../../src/auth/mfa.service.ts","../../src/platform/platform.ts","../../src/auth/oidc-client.ts","../../src/auth/sso.service.ts"],"names":["window"],"mappings":";AAOO,IAAM,cAAN,MAAqB;AAAA,EAClB,aAA4B,EAAC;AAAA,EAErC,UAAU,QAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,QAAQ,CAAA;AAC7B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,QAAQ,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF;AAAA,EAEA,KAAK,KAAA,EAAgB;AACnB,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,UAAA,EAAY;AACtC,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,YAAA,GAAkC;AAChC,IAAA,OAAO,IAAI,cAAA,CAAkB,CAAA,QAAA,KAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAMO,IAAM,mBAAA,GAAN,cAAqC,WAAA,CAAe;AAAA,EACjD,MAAA;AAAA,EAER,YAAY,YAAA,EAAiB;AAC3B,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,YAAA;AAAA,EAChB;AAAA,EAEA,QAAA,GAAc;AACZ,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAES,KAAK,KAAA,EAAgB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAClB;AAAA,EAES,UAAU,QAAA,EAAoC;AACrD,IAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AACpB,IAAA,OAAO,KAAA,CAAM,UAAU,QAAQ,CAAA;AAAA,EACjC;AAAA,EAES,YAAA,GAAkC;AACzC,IAAA,OAAO,IAAI,cAAA,CAAkB,CAAA,QAAA,KAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAKO,IAAM,iBAAN,MAAwB;AAAA,EAC7B,YAAoB,YAAA,EAAsD;AAAtD,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAAuD;AAAA,EAAvD,YAAA;AAAA,EAEpB,UAAU,QAAA,EAAoC;AAC5C,IAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,OAAA,GAAyB;AACvB,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,CAAA,CAAA,KAAK;AAAE,MAAA,MAAA,GAAS,CAAA;AAAA,IAAG,CAAC,CAAA;AACjD,IAAA,KAAA,EAAM;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;;;ACzEO,IAAM,kBAAN,MAAsB;AAAA,EAG3B,YAA6B,QAAA,EAA2B;AAA3B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAA4B;AAAA,EAA5B,QAAA;AAAA,EAFZ,UAAA,GAAa,IAAI,mBAAA,CAA6B,KAAK,CAAA;AAAA,EAIpE,YAAY,UAAA,EAAqB,QAAA,GAA+B,EAAE,OAAA,EAAS,IAAG,EAAS;AACrF,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,UAAU,CAAA;AAC/B,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,QAAA,CAAS,YAAY,QAAQ,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAS,aAAA,EAAc;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,UAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,WAAW,QAAA,EAAS;AAAA,EAClC;AAAA,EAEA,WAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,WAAW,YAAA,EAAa;AAAA,EACtC;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,EACxB;AACF;;;ACpBO,IAAM,mBAAN,MAAuB;AAAA,EACpB,OAAA,GAAU,EAAA;AAAA,EACV,QAAA,GAAW,EAAA;AAAA,EACX,UAAA,GAA0D,IAAA;AAAA,EAC1D,MAAA,GAA+C,IAAA;AAAA,EAEvD,SAAA,CAAU,aAAqB,YAAA,EAA4B;AACzD,IAAA,IAAA,CAAK,OAAA,GAAU,WAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,YAAA;AAChB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA,EAEA,cAAA,GAAyB;AAAE,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAAS;AAAA,EAChD,eAAA,GAA0B;AAAE,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAAU;AAAA,EAElD,OAAO,KAAA,EAAwC;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC5D,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,UAAU,KAAA,EAAyB;AACjC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,KAAK,OAAO,CAAA;AACjD,IAAA,IAAI,CAAC,OAAA,EAAS,GAAA,EAAK,OAAO,IAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,IAAK,OAAA,CAAQ,GAAA,GAAM,GAAA;AAAA,EACrC;AAAA,EAEA,YAAY,KAAA,EAAwB;AAClC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,KAAK,OAAO,CAAA;AACjD,IAAA,IAAI,CAAC,OAAA,EAAS,GAAA,EAAK,OAAO,CAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,CAAQ,MAAM,GAAA,GAAO,IAAA,CAAK,KAAK,CAAA;AAAA,EACpD;AAAA,EAEA,gBAAgB,QAAA,EAA2D;AACzE,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA;AAAA,EACpB;AAAA,EAEA,MAAM,UAAA,GAA8B;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAY,MAAM,IAAI,MAAM,gCAAgC,CAAA;AACtE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,KAAK,QAAQ,CAAA;AACpD,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA;AACf,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,EAAA;AAChB,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,MAAM,EAAA,GAAK,KAAK,WAAA,EAAY;AAC5B,IAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,GAAA,GAAS,EAAA,GAAK,GAAA,GAAS,CAAA;AAC1C,IAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,UAAA,EAAY;AAChC,MAAA,IAAA,CAAK,SAAS,UAAA,CAAW,MAAM,KAAK,UAAA,EAAW,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,GAAG,KAAK,CAAA;AAAA,IACzE;AAAA,EACF;AACF;;;ACnEO,IAAM,kBAAN,MAAsB;AAAA,EACnB,SAAA,GAAY,EAAA;AAAA,EAEpB,MAAM,QAAA,GAAoC;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,IAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAA;AACvF,IAAA,MAAM,YAAY,IAAA,CAAK,UAAA,CAAW,IAAI,UAAA,CAAW,MAAM,CAAC,CAAA;AAExD,IAAA,OAAO,EAAE,YAAA,EAAc,QAAA,EAAU,aAAA,EAAe,SAAA,EAAW,qBAAqB,MAAA,EAAO;AAAA,EACzF;AAAA,EAEA,WAAA,GAAsB;AAAE,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAAW;AAAA,EAE/C,aAAA,GAAwB;AACtB,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,EAAE,CAAA;AAC7B,IAAA,MAAA,CAAO,gBAAgB,GAAG,CAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,WAAW,GAAG,CAAA;AAAA,EAC5B;AAAA,EAEA,YAAA,CAAa,SAAiB,MAAA,EAMnB;AACT,IAAA,MAAM,CAAA,GAAI,IAAI,eAAA,CAAgB;AAAA,MAC5B,aAAA,EAAe,MAAA;AAAA,MACf,WAAW,MAAA,CAAO,QAAA;AAAA,MAClB,cAAc,MAAA,CAAO,WAAA;AAAA,MACrB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,gBAAgB,MAAA,CAAO,aAAA;AAAA,MACvB,qBAAA,EAAuB;AAAA,KACxB,CAAA;AACD,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA,CAAA;AAAA,EACnC;AAAA,EAEQ,WAAW,GAAA,EAAyB;AAC1C,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA,CAAa,GAAG,GAAG,CAAC,CAAA,CACpC,OAAA,CAAQ,KAAA,EAAO,GAAG,EAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,EAC9D;AACF;;;ACpDO,IAAM,iBAAN,MAAqB;AAAA,EACT,OAAA,GAAU,EAAA;AAAA,EACV,OAAA,GAAU,CAAA;AAAA,EAE3B,MAAM,YAAA,CAAa,YAAA,EAAsB,IAAA,EAAgC;AACvE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,YAAY,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAA,CAAO,IAAA,IAAQ,KAAK,GAAA,EAAI,IAAK,GAAA,GAAO,IAAA,CAAK,OAAO,CAAA;AACrE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,UAAA,CAAW,KAAA,EAAe,YAAA,EAAsBA,UAAS,CAAA,EAAqB;AAClF,IAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,IAAA,CAAK,KAAI,GAAI,GAAA,GAAO,KAAK,OAAO,CAAA;AACvD,IAAA,KAAA,IAAS,CAAA,GAAI,CAACA,OAAAA,EAAQ,CAAA,IAAKA,SAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,aAAA,CAAc,YAAY,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA;AAC3E,MAAA,IAAI,QAAA,KAAa,OAAO,OAAO,IAAA;AAAA,IACjC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,kBAAA,CAAmB,SAAS,CAAA,EAAW;AACrC,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,MAAM,CAAA;AACjC,IAAA,MAAA,CAAO,gBAAgB,GAAG,CAAA;AAC1B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,GAAI,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,EACjD;AAAA,EAEA,uBAAA,CAAwB,SAAS,CAAA,EAAW;AAC1C,IAAA,MAAM,KAAA,GAAQ,sCAAA;AACd,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,MAAM,CAAA;AACjC,IAAA,MAAA,CAAO,gBAAgB,GAAG,CAAA;AAC1B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAClE;AAAA,EAEA,MAAc,KAAA,CAAM,GAAA,EAAiB,OAAA,EAAkC;AACrE,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,CAAC,CAAA;AAC7B,IAAA,IAAI,SAAS,GAAG,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,SAAS,KAAK,CAAA;AAC7C,IAAA,MAAM,UAAU,IAAI,UAAA,CAAW,IAAI,WAAA,CAAY,GAAA,CAAI,MAAM,CAAC,CAAA;AAC1D,IAAA,OAAA,CAAQ,IAAI,GAAG,CAAA;AACf,IAAA,MAAM,YAAY,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,OAAO,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,OAAA,EAAQ,EAAG,KAAA,EAAO,CAAC,MAAM,CAAC,CAAA;AAChH,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,MAAM,MAAA,CAAO,OAAO,IAAA,CAAK,MAAA,EAAQ,SAAA,EAAW,GAAG,CAAC,CAAA;AAC3E,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,EAAE,CAAA,GAAI,EAAA;AACzB,IAAA,MAAM,QAAS,GAAA,CAAI,MAAM,IAAI,GAAA,KAAS,EAAA,GAAO,IAAI,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA,GAAO,IAAI,MAAA,GAAS,CAAC,KAAK,CAAA,GAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AAC7G,IAAA,OAAO,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AAAA,EAC7E;AAAA,EAEQ,cAAc,CAAA,EAAuB;AAC3C,IAAA,MAAM,QAAA,GAAW,kCAAA;AACjB,IAAA,MAAM,QAAQ,CAAA,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,EAAE,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,SAAS,OAAA,CAAQ,CAAC,EAAE,QAAA,CAAS,CAAC,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC/F,IAAA,OAAO,IAAI,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,EAAE,CAAA;AAAA,EAC3E;AACF;;;ACnCO,IAAM,eAAN,MAAmB;AAAA,EACP,SAAA;AAAA,EACA,eAAA;AAAA,EAET,UAAA,GAAa,CAAA;AAAA,EACb,kBAAA,GAAqB,CAAA;AAAA,EACrB,MAAA,GAAqC,MAAA;AAAA,EACrC,OAAA,GAAiD,IAAA;AAAA,EACjD,eAAA,GAAyD,IAAA;AAAA,EAEhD,OAAA;AAAA,EAET,SAAA,GAAiC,IAAA;AAAA,EACjC,OAAA,GAAgD,IAAA;AAAA,EAExD,WAAA,CAAY,MAAA,GAA6B,EAAC,EAAG;AAC3C,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,QAAA,IAAY,EAAA;AACpC,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,cAAA,IAAkB,EAAA;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,mBAAA,CAAuC,IAAA,CAAK,WAAW,CAAA;AAC1E,IAAA,IAAI,MAAA,CAAO,SAAA,EAAW,IAAA,CAAK,KAAA,EAAM;AAAA,EACnC;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,SAAA;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,UAAA;AACd,IAAA,IAAA,CAAK,KAAA,EAAM;AAEX,IAAA,IAAA,CAAK,OAAA,GAAU,YAAY,MAAM;AAC/B,MAAA,IAAA,CAAK,UAAA,EAAA;AACL,MAAA,IAAA,CAAK,OAAA,GAAU,KAAK,UAAU,CAAA;AAC9B,MAAA,IAAI,IAAA,CAAK,cAAc,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,QAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,QAAA,IAAA,CAAK,SAAA,IAAY;AAAA,MACnB;AACA,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,GAAG,GAAI,CAAA;AAAA,EACT;AAAA,EAEA,MAAA,GAAkB;AAChB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,KAAA;AAC5B,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEA,SAAS,EAAA,EAAsB;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,EAAA,EAAuC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,SAAA,GAAoB;AAAE,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAAY;AAAA,EAClD,IAAI,KAAA,GAAoC;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAAQ;AAAA,EAC9D,IAAI,SAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,MAAA,KAAW,SAAA;AAAA,EAAW;AAAA,EAC7D,IAAI,UAAA,GAAsB;AAAE,IAAA,OAAO,KAAK,MAAA,KAAW,UAAA;AAAA,EAAY;AAAA,EAC/D,IAAI,SAAA,GAAqB;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,KAAW,UAAA,IAAc,IAAA,CAAK,kBAAA,KAAuB,CAAA;AAAA,EAAG;AAAA,EAE/F,UAAA,GAAqD;AAAE,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAAS;AAAA,EAE5E,QAAA,GAAmB;AACjB,IAAA,IAAI,IAAA,CAAK,SAAA,KAAc,CAAA,EAAG,OAAO,CAAA;AACjC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EAClE;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,qBAAqB,IAAA,CAAK,eAAA;AAC/B,IAAA,IAAA,CAAK,eAAA,GAAkB,YAAY,MAAM;AACvC,MAAA,IAAA,CAAK,kBAAA,EAAA;AACL,MAAA,IAAI,IAAA,CAAK,sBAAsB,CAAA,EAAG;AAChC,QAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,QAAA,aAAA,CAAc,KAAK,eAAgB,CAAA;AACnC,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MACzB;AACA,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,GAAG,GAAI,CAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,OAAA,EAAS;AAAE,MAAA,aAAA,CAAc,KAAK,OAAO,CAAA;AAAG,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IAAM;AAAA,EACxE;AAAA,EAEQ,SAAA,GAA+B;AACrC,IAAA,OAAO;AAAA,MACL,WAAmB,IAAA,CAAK,UAAA;AAAA,MACxB,OAAmB,IAAA,CAAK,MAAA;AAAA,MACxB,WAAmB,IAAA,CAAK,SAAA;AAAA,MACxB,mBAAmB,IAAA,CAAK;AAAA,KAC1B;AAAA,EACF;AAAA,EAEQ,KAAA,GAAc;AACpB,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,EACpC;AACF;;;AClIO,IAAM,uBAAN,MAA2B;AAAA,EAChC,WAAA,GAAuB;AACrB,IAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IACpB,aAAA,IAAiB,aACjB,qBAAA,IAAyB,MAAA;AAAA,EAChC;AAAA,EAEA,MAAM,WAAA,GAAgC;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG,OAAO,KAAA;AAChC,IAAA,OAAO,oBAAoB,6CAAA,EAA8C;AAAA,EAC3E;AAAA,EAEA,MAAM,SAAS,OAAA,EAOkB;AAC/B,IAAA,MAAM,aAAA,GAAoD;AAAA,MACxD,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,IAAI,EAAE,EAAA,EAAI,QAAQ,IAAA,EAAM,IAAA,EAAM,QAAQ,MAAA,EAAO;AAAA,MAC7C,IAAA,EAAM;AAAA,QACJ,IAAI,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,QAC3C,MAAM,OAAA,CAAQ,QAAA;AAAA,QACd,aAAa,OAAA,CAAQ;AAAA,OACvB;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,EAAE,GAAA,EAAK,EAAA,EAAI,IAAA,EAAM,YAAA,EAAa;AAAA;AAAA,QAC9B,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,YAAA;AAAa;AAAA,OAClC;AAAA,MACA,sBAAA,EAAwB;AAAA,QACtB,uBAAA,EAAyB,UAAA;AAAA,QACzB,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AACA,IAAA,OAAO,UAAU,WAAA,CAAY,MAAA,CAAO,EAAE,SAAA,EAAW,eAAe,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,aAAa,OAAA,EAIc;AAC/B,IAAA,MAAM,UAAA,GAAgD;AAAA,MACpD,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,gBAAA,EAAkB,OAAA,CAAQ,gBAAA,IAAoB,EAAC;AAAA,MAC/C,gBAAA,EAAkB,UAAA;AAAA,MAClB,OAAA,EAAS;AAAA,KACX;AACA,IAAA,OAAO,UAAU,WAAA,CAAY,GAAA,CAAI,EAAE,SAAA,EAAW,YAAY,CAAA;AAAA,EAC5D;AAAA,EAEA,iBAAA,GAAiC;AAC/B,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,EAAE,CAAA;AAC7B,IAAA,MAAA,CAAO,gBAAgB,GAAG,CAAA;AAC1B,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AAAA,EAEA,qBAAqB,EAAA,EAAyB;AAC5C,IAAA,OAAO,IAAA,CAAK,OAAO,YAAA,CAAa,GAAG,IAAI,UAAA,CAAW,EAAE,CAAC,CAAC,CAAA;AAAA,EACxD;AACF;;;ACrCA,IAAM,YAAA,GAAe,kCAAA;AAEd,IAAM,iBAAN,MAAqB;AAAA,EAClB,IAAA,GAAO,IAAI,cAAA,EAAe;AAAA,EAC1B,IAAA,GAAO,IAAI,oBAAA,EAAqB;AAAA,EAChC,WAAA,uBAAkB,GAAA,EAAmD;AAAA,EACrE,SAAA,GAAY,IAAI,WAAA,EAAoB;AAAA;AAAA,EAI5C,kBAAA,CAAmB,SAAS,EAAA,EAAY;AACtC,IAAA,MAAM,QAAQ,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,MAAM,CAAC,CAAA;AAC3D,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,MAAA,IAAU,YAAA,CAAa,OAAO,EAAE,CAAA;AAC1D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,MAAA,EAAgB,OAAA,EAAiB,MAAA,GAAS,SAAA,EAAmB;AACtE,IAAA,MAAM,QAAQ,kBAAA,CAAmB,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AACvD,IAAA,OAAO,kBAAkB,KAAK,CAAA,QAAA,EAAW,MAAM,CAAA,QAAA,EAAW,kBAAA,CAAmB,MAAM,CAAC,CAAA,kCAAA,CAAA;AAAA,EACtF;AAAA,EAEA,MAAM,SAAA,CAAU,OAAA,EAAiB,MAAA,EAA4C;AAC3E,IAAA,MAAM,MAAA,GAAS,KAAK,kBAAA,EAAmB;AACvC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,SAAS,MAAM,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,KAAK,mBAAA,EAAoB;AAC7C,IAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,WAAA,EAAY;AAAA,EACpC;AAAA,EAEA,MAAM,UAAA,CAAW,KAAA,EAAe,MAAA,EAAgBA,UAAS,CAAA,EAAqB;AAC5E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,QAAQA,OAAM,CAAA;AAAA,EACnD;AAAA;AAAA,EAIA,eAAA,CACE,aACA,OAAA,EACA,KAAA,GAAQ,IAAI,EAAA,GAAK,GAAA,EACjB,cAAc,CAAA,EACwB;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,CAAC,CAAA;AAC3C,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,OAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,MACxB,QAAA,EAAU,CAAA;AAAA,MACV,WAAA;AAAA,MACA,QAAA,EAAU,KAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AACA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,SAAS,CAAA;AAC5C,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,IAAI,SAAA,CAAU,EAAE,GAAG,QAAA,EAAU;AACjD,QAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA;AACpC,QAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA;AAAA,MAClC;AAAA,IACF,GAAG,KAAK,CAAA;AACR,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBAAgB,WAAA,EAAoC;AAClD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,GAAG,KAAA,IAAS,IAAA;AAAA,EACrD;AAAA,EAEA,eAAA,CAAgB,aAAqB,KAAA,EAAoC;AACvE,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,CAAA;AAC3C,IAAA,IAAI,CAAC,EAAA,EAAI,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,QAAQ,qBAAA,EAAsB;AAChE,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,CAAG,SAAA,EAAW;AAAE,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,WAAW,CAAA;AAAG,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAU;AAAA,IAAG;AACrH,IAAA,IAAI,GAAG,QAAA,EAAU,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,QAAQ,kBAAA,EAAmB;AACrE,IAAA,EAAA,CAAG,QAAA,EAAA;AACH,IAAA,IAAI,EAAA,CAAG,UAAU,KAAA,EAAO;AACtB,MAAA,MAAM,YAAA,GAAe,EAAA,CAAG,WAAA,GAAc,EAAA,CAAG,QAAA;AACzC,MAAA,IAAI,YAAA,IAAgB,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,OAAO,WAAW,CAAA;AAC1D,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,gBAAgB,YAAA,EAAa;AAAA,IAChE;AACA,IAAA,EAAA,CAAG,QAAA,GAAW,IAAA;AACd,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA,EAIA,mBAAA,CAAoB,KAAA,GAAQ,EAAA,EAAI,MAAA,GAAS,CAAA,EAAa;AACpD,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG,MAAM,IAAA,CAAK,IAAA,CAAK,uBAAA,CAAwB,MAAM,CAAC,CAAA;AAAA,EACtF;AAAA,EAEA,MAAM,gBAAgB,KAAA,EAAoC;AACxD,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAC,CAAA;AAChF,MAAA,MAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,IAAI,WAAW,GAAG,CAAC,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAChG;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAA,CACJ,IAAA,EACA,WAAA,EACkD;AAClD,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAAA,MACjB,IAAI,UAAA,CAAW,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAC,CAAC;AAAA,KACtF,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAA;AACpC,IAAA,IAAI,QAAQ,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,WAAW,WAAA,EAAY;AAC9D,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,GAAG,CAAA,EAAE;AAAA,EAC3E;AAAA;AAAA,EAIA,MAAM,oBAAA,GAAyC;AAAE,IAAA,OAAO,IAAA,CAAK,KAAK,WAAA,EAAY;AAAA,EAAG;AAAA,EAEjF,MAAM,iBAAA,CAAkB,MAAA,EAAgB,WAAA,EAAoD;AAC1F,IAAA,MAAM,iBAAiB,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAChE,IAAA,OAAO,IAAA,CAAK,KAAK,QAAA,CAAS;AAAA,MACxB,WAAW,cAAA,CAAe,MAAA;AAAA,MAC1B,IAAA,EAAM,OAAO,QAAA,CAAS,QAAA;AAAA,MACtB,MAAA,EAAQ,SAAS,KAAA,IAAS,SAAA;AAAA,MAC1B,MAAA;AAAA,MACA,QAAA,EAAU,MAAA;AAAA,MACV,iBAAiB,WAAA,IAAe;AAAA,KACjC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,YAAA,EAAwC;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,iBAAiB,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAChE,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa;AAAA,QAC1C,WAAW,cAAA,CAAe,MAAA;AAAA,QAC1B,IAAA,EAAM,OAAO,QAAA,CAAS,QAAA;AAAA,QACtB,gBAAA,EAAkB,CAAC,EAAE,EAAA,EAAI,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,YAAY,CAAA,EAAG,IAAA,EAAM,YAAA,EAAc;AAAA,OACtF,CAAA;AACD,MAAA,OAAO,CAAC,CAAC,MAAA;AAAA,IACX,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAAA,EAC1B;AAAA;AAAA,EAIA,mBAAmB,OAAA,EAA2C;AAC5D,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA;AAAA,EACzC;AAAA,EAEA,sBAAA,GAAiC;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,KAAK,WAAA,EAAa;AACvC,MAAA,IAAI,GAAA,GAAM,GAAG,SAAA,EAAW;AAAE,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAAG,QAAA,OAAA,EAAA;AAAA,MAAW;AAAA,IACpE;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,aAAa,EAAA,EAAqC;AAChD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,IAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,GAAG,MAAK,GAAI,EAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACnKA,IAAM,WAAA,GAAc,CAAC,KAAA,MAAwC;AAAA,EAC3D,OAAA,EAAY,CAAC,CAAA,KAAM,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,EAClC,SAAY,CAAC,CAAA,EAAG,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,EACxC,UAAA,EAAY,CAAC,CAAA,KAAM,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,EACrC,KAAA,EAAY,MAAM,KAAA,CAAM,KAAA;AAC1B,CAAA,CAAA;AAEA,IAAM,kBAAN,MAAoD;AAAA,EAC1C,EAAA,uBAAS,GAAA,EAAoB;AAAA,EACrC,QAAQ,CAAA,EAAmB;AAAE,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,IAAK,IAAA;AAAA,EAAM;AAAA,EAC5D,OAAA,CAAQ,GAAW,CAAA,EAAW;AAAE,IAAA,IAAA,CAAK,EAAA,CAAG,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EAAG;AAAA,EACnD,WAAW,CAAA,EAAgB;AAAE,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,CAAC,CAAA;AAAA,EAAG;AAAA,EAChD,KAAA,GAA2B;AAAE,IAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,EAAG;AAChD,CAAA;AAMA,SAAS,OAAA,GAA4B;AAEnC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,OAAA,KAAY,eAAe,OAAO,cAAA;AAEpF,EAAA,MAAM,KAAA,GAAS,WAAuC,SAAS,CAAA;AAC/D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,KAAA,EAAO,QAAA,EAAU,MAAM,OAAO,MAAA;AAEnE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,OAAO,SAAA;AACT;AAMO,IAAM,eAAN,MAAmB;AAAA,EACxB,OAAe,QAA0B,OAAA,EAAQ;AAAA,EACjD,OAAe,WAAsC,EAAC;AAAA,EACtD,OAAe,WAAA,GAAyC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBxD,OAAO,IAAA,CAAK,MAAA,GAA6B,EAAC,EAAS;AACjD,IAAA,IAAI,MAAA,CAAO,QAAA,EAAU,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,QAAA;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,IAAA,CAAK,UAAU,GAAI,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG;AAAA,EAChE;AAAA;AAAA,EAGA,WAAW,IAAA,GAAyB;AAAE,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAAO;AAAA,EAEzD,OAAO,GAAG,IAAA,EAAiC;AAAE,IAAA,OAAO,KAAK,KAAA,KAAU,IAAA;AAAA,EAAM;AAAA,EACzE,OAAO,QAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,KAAA,KAAU,cAAA;AAAA,EAAgB;AAAA,EACpE,OAAO,KAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,KAAA,KAAU,KAAA;AAAA,EAAO;AAAA,EAC3D,OAAO,MAAA,GAAqB;AAAE,IAAA,OAAO,KAAK,KAAA,KAAU,MAAA;AAAA,EAAQ;AAAA;AAAA,EAG5D,OAAO,UAAA,GAAwC;AAAE,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvE,OAAO,UAAA,GAAiC;AACtC,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,OAAO,KAAK,QAAA,CAAS,OAAA;AAChD,IAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,YAAY,YAAY,CAAA;AACxE,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,WAAA,GAAc,IAAI,eAAA,EAAgB;AAC9D,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,iBAAA,GAAwC;AAC7C,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,OAAO,KAAK,QAAA,CAAS,OAAA;AAChD,IAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,EAAa,OAAO,YAAY,cAAc,CAAA;AAC5E,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,WAAA,GAAc,IAAI,eAAA,EAAgB;AAC9D,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA,EAGA,OAAO,YAAA,GAAiC;AACtC,IAAA,OAAO;AAAA,MACL,aAAkB,OAAO,iBAAA,KAAsB,eAAe,CAAC,CAAC,KAAK,QAAA,CAAS,WAAA;AAAA,MAC9E,SAAkB,OAAO,MAAA,KAAW,eAAe,CAAC,CAAC,KAAK,QAAA,CAAS,MAAA;AAAA,MACnE,cAAkB,CAAC,EAAE,OAAO,UAAA,KAAe,WAAA,IAAgB,WAAuD,MAAA,EAAQ,MAAA,CAAA;AAAA,MAC1H,mBAAmB,OAAO,YAAA,KAAiB,eAAe,CAAC,CAAC,KAAK,QAAA,CAAS,OAAA;AAAA,MAC1E,GAAA,EAAkB,OAAO,QAAA,KAAa,WAAA;AAAA,MACtC,aAAA,EAAkB,OAAO,SAAA,KAAc,WAAA,IAAe,eAAA,IAAmB;AAAA,KAC3E;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,MAAA,GAAe;AACpB,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AACrB,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AACF,CAAA;;;ACrGO,IAAM,iBAAN,MAAqB;AAAA,EAClB,IAAA;AAAA,EACA,SAAA,GAAqC,IAAA;AAAA,EACrC,QAAA,GAAW,IAAI,mBAAA,CAA2C,IAAI,CAAA;AAAA,EAC9D,QAAA;AAAA,EACA,WAAA,GAAoD,IAAA;AAAA,EAC3C,IAAA,GAAY,kBAAA;AAAA,EACZ,QAAA,GAAY,oBAAA;AAAA,EACZ,UAAA,GAAa,iBAAA;AAAA,EAE9B,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,OAAO,EAAE,KAAA,EAAO,wBAAwB,YAAA,EAAc,MAAA,EAAQ,GAAG,MAAA,EAAO;AAE7E,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,OAAA,IAAW,YAAA,CAAa,iBAAA,EAAkB;AACjE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,IAAI,CAAA;AAC9C,IAAA,IAAI,MAAA,EAAQ;AAAE,MAAA,IAAI;AAAE,QAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IAAE;AAAA,EACzE;AAAA,EAEA,MAAM,QAAA,GAAsC;AAC1C,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAChC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,iCAAA,CAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACnE,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,IAAA,CAAK,SAAA,GAAY;AAAA,MACf,uBAAuB,IAAA,CAAK,sBAAA;AAAA,MAC5B,eAAe,IAAA,CAAK,cAAA;AAAA,MACpB,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,kBAAkB,IAAA,CAAK,iBAAA;AAAA,MACvB,oBAAoB,IAAA,CAAK;AAAA,KAC3B;AACA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,MAAM,KAAA,CAAM,OAAA,GAA4B,EAAC,EAAkB;AACzD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,EAAS;AACjC,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,MAAM,aAAA,EAAc;AACpD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,aAAA,CAAc,EAAE,CAAA;AAE/C,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAC7C,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAE5C,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,aAAA,EAAe,KAAK,IAAA,CAAK,YAAA;AAAA,MACzB,SAAA,EAAW,KAAK,IAAA,CAAK,QAAA;AAAA,MACrB,YAAA,EAAc,KAAK,IAAA,CAAK,WAAA;AAAA,MACxB,KAAA,EAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACjB,KAAA;AAAA,MACA,cAAA,EAAgB,SAAA;AAAA,MAChB,qBAAA,EAAuB,MAAA;AAAA,MACvB,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,aAAA,CAAc,EAAE,CAAA;AAAA,MACxC,GAAI,QAAQ,MAAA,GAAa,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW,EAAC;AAAA,MACvD,GAAI,QAAQ,SAAA,GAAa,EAAE,YAAY,OAAA,CAAQ,SAAA,KAAc,EAAC;AAAA,MAC9D,GAAG,OAAA,CAAQ;AAAA,KACZ,CAAA;AAGD,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,SAAS,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,qBAAqB,IAAI,MAAM,CAAA,CAAA;AAAA,IAChE,CAAA,MAAO;AAEL,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAA,CAAc,OAAA,GAA4B,EAAC,EAAoB;AACnE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,EAAS;AACjC,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,MAAM,aAAA,EAAc;AACpD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,aAAA,CAAc,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAC7C,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,aAAA,EAAe,KAAK,IAAA,CAAK,YAAA;AAAA,MACzB,SAAA,EAAW,KAAK,IAAA,CAAK,QAAA;AAAA,MACrB,YAAA,EAAc,KAAK,IAAA,CAAK,WAAA;AAAA,MACxB,KAAA,EAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACjB,KAAA;AAAA,MACA,cAAA,EAAgB,SAAA;AAAA,MAChB,qBAAA,EAAuB,MAAA;AAAA,MACvB,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,aAAA,CAAc,EAAE,CAAA;AAAA,MACxC,GAAI,QAAQ,MAAA,GAAY,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW,EAAC;AAAA,MACtD,GAAI,QAAQ,SAAA,GAAY,EAAE,YAAY,OAAA,CAAQ,SAAA,KAAc,EAAC;AAAA,MAC7D,GAAG,OAAA,CAAQ;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,qBAAqB,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,eAAe,GAAA,GAAM,OAAO,aAAa,WAAA,GAAc,QAAA,CAAS,OAAO,EAAA,EAA6B;AACxG,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAE,CAAA;AAC1D,IAAA,MAAM,IAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAEhC,IAAA,IAAI,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,KAAK,CAAA,QAAA,EAAM,MAAA,CAAO,GAAA,CAAI,mBAAmB,CAAA,IAAK,EAAE,CAAA,CAAE,CAAA;AAC5F,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAExD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,UAAU,CAAA;AACzD,IAAA,IAAI,eAAe,KAAA,KAAU,WAAA,EAAa,MAAM,IAAI,MAAM,uCAAuC,CAAA;AACjG,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,IAAK,EAAA;AACzD,IAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA;AACtC,IAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAExC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,EAAS;AACjC,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA,CAAK,aAAA,EAAe;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,mCAAA,EAAoC;AAAA,MAC/D,MAAM,IAAI,eAAA,CAAgB,EAAE,UAAA,EAAY,sBAAsB,IAAA,EAAM,YAAA,EAAc,IAAA,CAAK,IAAA,CAAK,aAAa,SAAA,EAAW,IAAA,CAAK,KAAK,QAAA,EAAU,aAAA,EAAe,UAAU;AAAA,KAClK,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,MAAM,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,CAAA;AAC9E,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,MAAM,GAAA,CAAI,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,YAAA,GAAwC;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,QAAA,EAAS;AACtC,IAAA,IAAI,CAAC,MAAA,EAAQ,YAAA,EAAc,MAAM,IAAI,MAAM,4BAA4B,CAAA;AACvE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,EAAS;AACjC,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA,CAAK,aAAA,EAAe;AAAA,MAC1C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,mCAAA,EAAoC;AAAA,MAC/D,IAAA,EAAM,IAAI,eAAA,CAAgB,EAAE,UAAA,EAAY,eAAA,EAAiB,aAAA,EAAe,MAAA,CAAO,YAAA,EAAc,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,UAAU;AAAA,KAC7H,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AAAE,MAAA,IAAA,CAAK,MAAA,EAAO;AAAG,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAAG;AACtF,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,MAAM,GAAA,CAAI,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,WAAA,GAAgD;AACpD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,EAAS;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,EAAkB,MAAM,IAAI,MAAM,uCAAuC,CAAA;AACnF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,QAAA,EAAS;AACtC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAChD,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA,CAAK,kBAAkB,EAAE,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAA,CAAO,WAAW,CAAA,CAAA,IAAM,CAAA;AAC7G,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAC7D,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAM,MAAA,CAAO,OAAA,GAAoC,EAAC,EAAkB;AAClE,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AACvB,IAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAClC,IAAA,IAAI,KAAK,WAAA,EAAa;AAAE,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAAG,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IAAM;AACjF,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,kBAAA,IAAsB,OAAO,WAAW,WAAA,EAAa;AACvE,MAAA,MAAM,SAAS,IAAI,eAAA,CAAgB,EAAE,SAAA,EAAW,IAAA,CAAK,KAAK,QAAA,EAAU,GAAI,OAAA,CAAQ,WAAA,GAAc,EAAE,wBAAA,EAA0B,OAAA,CAAQ,aAAY,GAAI,IAAK,CAAA;AACvJ,MAAA,MAAA,CAAO,SAAS,IAAA,GAAO,CAAA,EAAG,KAAK,SAAA,CAAU,kBAAkB,IAAI,MAAM,CAAA,CAAA;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,WAAA,CAAY,gBAAgB,GAAA,EAAa;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,QAAA,EAAS;AACtC,IAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,aAAa,CAAA;AACvE,IAAA,IAAI,IAAA,CAAK,WAAA,EAAa,YAAA,CAAa,IAAA,CAAK,WAAW,CAAA;AACnD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAW,YAAY;AACxC,MAAA,IAAI;AAAE,QAAA,MAAM,KAAK,YAAA,EAAa;AAAG,QAAA,IAAA,CAAK,YAAY,aAAa,CAAA;AAAA,MAAG,CAAA,CAAA,MAC5D;AAAE,QAAA,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MAAG;AAAA,IACpC,GAAG,KAAK,CAAA;AAAA,EACV;AAAA,EAEA,eAAA,GAA2B;AACzB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAA,EAAS;AACjC,IAAA,OAAO,CAAC,CAAC,CAAA,IAAK,CAAA,CAAE,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,EACvC;AAAA,EAEA,SAAA,GAAmC;AAAE,IAAA,OAAO,IAAA,CAAK,SAAS,QAAA,EAAS;AAAA,EAAG;AAAA,EACtE,OAAA,GAAU;AAAE,IAAA,OAAO,IAAA,CAAK,SAAS,YAAA,EAAa;AAAA,EAAG;AAAA,EAEzC,aAAa,IAAA,EAA+C;AAClE,IAAA,MAAM,MAAA,GAAyB;AAAA,MAC7B,aAAc,IAAA,CAAK,YAAA;AAAA,MACnB,SAAc,IAAA,CAAK,QAAA;AAAA,MACnB,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,WAAc,IAAA,CAAK,GAAA,EAAI,GAAA,CAAM,IAAA,CAAK,cAAwB,IAAA,IAAQ,GAAA;AAAA,MAClE,SAAA,EAAe,KAAK,UAAA,IAAyB,QAAA;AAAA,MAC7C,OAAc,IAAA,CAAK;AAAA,KACrB;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,MAAM,CAAA;AACzB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,eAAe,aAAA,GAAkE;AAC/E,EAAA,MAAM,QAAA,GAAW,cAAc,EAAE,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAA;AACrF,EAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,YAAA,CAAa,GAAG,IAAI,UAAA,CAAW,IAAI,CAAC,CAAC,EAChE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAC3D,EAAA,OAAO,EAAE,UAAU,SAAA,EAAU;AAC/B;AAEA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,KAAK,CAAA;AAChC,EAAA,MAAA,CAAO,gBAAgB,GAAG,CAAA;AAC1B,EAAA,OAAO,KAAK,MAAA,CAAO,YAAA,CAAa,GAAG,GAAG,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,EAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA;AACnG;;;AC3MO,IAAM,iBAAN,MAAqB;AAAA,EACT,OAAA;AAAA,EACT,MAAA,GAA8B,IAAA;AAAA,EACrB,WAAA;AAAA,EAEjB,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,UAAA,IAAc,kBAAA;AACxC,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA;AAAA,EAIA,SAAS,KAAA,EAA2B;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,cAAA,CAAe,QAAQ,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,QAAA,GAAgC;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAAQ;AAAA,EAEtD,eAAA,GAA2B;AACzB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,MAAA,IAAU,KAAK,MAAA,CAAO,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,EAC3D;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,cAAA,CAAe,UAAA,CAAW,KAAK,WAAW,CAAA;AAAA,EAC5C;AAAA;AAAA,EAIA,MAAM,SAAS,GAAA,EAAoD;AACjE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,eAAe,MAAM,IAAI,MAAM,uCAAuC,CAAA;AACxF,IAAA,MAAM,IAAA,GAA+B;AAAA,MACnC,UAAA,EAAc,oBAAA;AAAA,MACd,MAAc,GAAA,CAAI,IAAA;AAAA,MAClB,cAAc,GAAA,CAAI;AAAA,KACpB;AACA,IAAA,IAAI,GAAA,CAAI,YAAA,EAAc,IAAA,CAAK,eAAe,IAAI,GAAA,CAAI,YAAA;AAElD,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA,CAAK,QAAQ,aAAA,EAAe;AAAA,MAClD,MAAA,EAAS,MAAA;AAAA,MACT,OAAA,EAAS,EAAE,cAAA,EAAgB,mCAAA,EAAoC;AAAA,MAC/D,IAAA,EAAS,IAAI,eAAA,CAAgB,IAAI,EAAE,QAAA;AAAS,KAC7C,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,GAAA,CAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AAC7E,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAI5B,IAAA,MAAM,KAAA,GAAsB;AAAA,MAC1B,aAAc,IAAA,CAAK,YAAA;AAAA,MACnB,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,SAAc,IAAA,CAAK,QAAA;AAAA,MACnB,WAAc,IAAA,CAAK,GAAA,EAAI,GAAA,CAAK,IAAA,CAAK,cAAc,IAAA,IAAQ,GAAA;AAAA,MACvD,MAAA,EAAA,CAAe,KAAK,KAAA,IAAS,EAAA,EAAI,MAAM,GAAG,CAAA,CAAE,OAAO,OAAO;AAAA,KAC5D;AACA,IAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAA,CAAa,GAAA,EAAa,MAAA,GAA4B,OAAA,EAAkB;AACtE,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA,EAAG;AAC/B,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,kCAAA,EAAqC,GAAG,CAAA,oCAAA,CAAiC,CAAA;AACtF,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACzC,IAAA,MAAA,CAAO,IAAA,GAAS,GAAA;AAChB,IAAA,MAAA,CAAO,SAAS,MAAA,KAAW,MAAA,GAAS,OAAA,GAAU,MAAA,KAAW,WAAW,SAAA,GAAY,QAAA;AAChF,IAAA,MAAA,CAAO,GAAA,GAAS,qBAAA;AAChB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,IAAA,MAAA,CAAO,KAAA,EAAM;AACb,IAAA,MAAA,CAAO,MAAA,EAAO;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBAAgB,GAAA,EAAsB;AACpC,IAAA,OAAO,IAAA,CAAK,iBAAiB,GAAG,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CAAsB,GAAA,EAAa,IAAA,GAAoB,EAAC,EAAe;AAC3E,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,GAAG,CAAA,yBAAA,CAA2B,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AACxC,IAAA,IAAI,KAAA,EAAO,aAAa,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA,OAAA,EAAU,KAAA,CAAM,WAAW,CAAA,CAAE,CAAA;AAClF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,SAAS,CAAA;AACjD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACxE,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAS,MAAA;AAAA,EACxC;AAAA;AAAA,EAIA,OAAO,WAAA,EAA4B;AACjC,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,MAAM,GAAA,GAAM,WAAA,GACR,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,0BAAA,EAA6B,kBAAA,CAAmB,WAAW,CAAC,CAAA,CAAA,GACrF,IAAA,CAAK,OAAA,CAAQ,SAAA;AACjB,MAAA,MAAA,CAAO,SAAS,IAAA,GAAO,GAAA;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAIQ,iBAAiB,GAAA,EAAsB;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,MAAA;AAC5B,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,IAAA,CAAK,CAAA,OAAA,KAAW;AACjD,QAAA,MAAM,OAAA,GAAU,QAAQ,QAAA,CAAS,GAAG,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,OAAA;AAC/D,QAAA,OAAO,MAAA,KAAW,OAAA,IAAW,MAAA,CAAO,QAAA,CAAS,MAAM,OAAO,CAAA;AAAA,MAC5D,CAAC,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAAA,EAC1B;AAAA,EAEQ,eAAe,GAAA,EAAsB;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,QAAQ,OAAO,IAAA;AAChD,IAAA,OAAO,IAAA,CAAK,QAAQ,aAAA,CAAc,IAAA,CAAK,UAAQ,GAAA,CAAI,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EACrE;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA;AACnD,MAAA,IAAI,GAAA,EAAK,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvC,CAAA,CAAA,MAAQ;AAAA,IAAe;AAAA,EACzB;AACF","file":"index.mjs","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject, JoopObservable } from '../events';\nimport { JoopDataStorage } from '../storage/data-storage.service';\n\nexport class JoopAuthService {\n private readonly _loggedIn$ = new JoopBehaviorSubject<boolean>(false);\n\n constructor(private readonly _storage: JoopDataStorage) {}\n\n setLoggedIn(isLoggedIn: boolean, menuData: { menuObj: any[] } = { menuObj: [] }): void {\n this._loggedIn$.next(isLoggedIn);\n if (isLoggedIn) {\n this._storage.setMenuData(menuData);\n } else {\n this._storage.clearMenuData();\n }\n }\n\n isLoggedIn(): boolean {\n return this._loggedIn$.getValue();\n }\n\n isLoggedIn$(): JoopObservable<boolean> {\n return this._loggedIn$.asObservable();\n }\n\n logout(): void {\n this.setLoggedIn(false);\n }\n}\n","export interface JoopTokenPayload {\n sub?: string;\n exp?: number;\n iat?: number;\n jti?: string;\n [key: string]: unknown;\n}\n\nexport class JoopTokenService {\n private _access = '';\n private _refresh = '';\n private _refreshCb: ((token: string) => Promise<string>) | null = null;\n private _timer: ReturnType<typeof setTimeout> | null = null;\n\n setTokens(accessToken: string, refreshToken: string): void {\n this._access = accessToken;\n this._refresh = refreshToken;\n this._scheduleRefresh();\n }\n\n getAccessToken(): string { return this._access; }\n getRefreshToken(): string { return this._refresh; }\n\n decode(token: string): JoopTokenPayload | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const padded = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n return JSON.parse(atob(padded)) as JoopTokenPayload;\n } catch {\n return null;\n }\n }\n\n isExpired(token?: string): boolean {\n const payload = this.decode(token ?? this._access);\n if (!payload?.exp) return true;\n return Date.now() >= payload.exp * 1000;\n }\n\n expiresInMs(token?: string): number {\n const payload = this.decode(token ?? this._access);\n if (!payload?.exp) return 0;\n return Math.max(0, payload.exp * 1000 - Date.now());\n }\n\n onRefreshNeeded(callback: (refreshToken: string) => Promise<string>): void {\n this._refreshCb = callback;\n }\n\n async refreshNow(): Promise<string> {\n if (!this._refreshCb) throw new Error('No refresh callback registered');\n const newToken = await this._refreshCb(this._refresh);\n this._access = newToken;\n this._scheduleRefresh();\n return newToken;\n }\n\n clear(): void {\n this._access = '';\n this._refresh = '';\n if (this._timer) clearTimeout(this._timer);\n this._timer = null;\n }\n\n private _scheduleRefresh(): void {\n if (this._timer) clearTimeout(this._timer);\n const ms = this.expiresInMs();\n const delay = ms > 30_000 ? ms - 30_000 : 0;\n if (delay > 0 && this._refreshCb) {\n this._timer = setTimeout(() => this.refreshNow().catch(() => {}), delay);\n }\n }\n}\n","export interface JoopPKCEParams {\n codeVerifier: string;\n codeChallenge: string;\n codeChallengeMethod: 'S256';\n}\n\nexport class JoopPKCEService {\n private _verifier = '';\n\n async generate(): Promise<JoopPKCEParams> {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n const verifier = this._base64url(array);\n this._verifier = verifier;\n\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));\n const challenge = this._base64url(new Uint8Array(digest));\n\n return { codeVerifier: verifier, codeChallenge: challenge, codeChallengeMethod: 'S256' };\n }\n\n getVerifier(): string { return this._verifier; }\n\n generateState(): string {\n const arr = new Uint8Array(16);\n crypto.getRandomValues(arr);\n return this._base64url(arr);\n }\n\n buildAuthUrl(baseUrl: string, params: {\n clientId: string;\n redirectUri: string;\n scope: string;\n state: string;\n codeChallenge: string;\n }): string {\n const q = new URLSearchParams({\n response_type: 'code',\n client_id: params.clientId,\n redirect_uri: params.redirectUri,\n scope: params.scope,\n state: params.state,\n code_challenge: params.codeChallenge,\n code_challenge_method: 'S256',\n });\n return `${baseUrl}?${q.toString()}`;\n }\n\n private _base64url(buf: Uint8Array): string {\n return btoa(String.fromCharCode(...buf))\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n }\n}\n","export class JoopOtpService {\n private readonly _period = 30;\n private readonly _digits = 6;\n\n async generateTOTP(secretBase32: string, time?: number): Promise<string> {\n const key = this._base32Decode(secretBase32);\n const counter = Math.floor((time ?? Date.now()) / 1000 / this._period);\n return this._hotp(key, counter);\n }\n\n async verifyTOTP(token: string, secretBase32: string, window = 1): Promise<boolean> {\n const now = Math.floor(Date.now() / 1000 / this._period);\n for (let i = -window; i <= window; i++) {\n const expected = await this._hotp(this._base32Decode(secretBase32), now + i);\n if (expected === token) return true;\n }\n return false;\n }\n\n generateNumericOTP(length = 6): string {\n const arr = new Uint8Array(length);\n crypto.getRandomValues(arr);\n return Array.from(arr).map(b => b % 10).join('');\n }\n\n generateAlphanumericOTP(length = 8): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n const arr = new Uint8Array(length);\n crypto.getRandomValues(arr);\n return Array.from(arr).map(b => chars[b % chars.length]).join('');\n }\n\n private async _hotp(key: Uint8Array, counter: number): Promise<string> {\n const buf = new ArrayBuffer(8);\n new DataView(buf).setUint32(4, counter, false);\n const safeKey = new Uint8Array(new ArrayBuffer(key.length));\n safeKey.set(key);\n const cryptoKey = await crypto.subtle.importKey('raw', safeKey, { name: 'HMAC', hash: 'SHA-1' }, false, ['sign']);\n const sig = new Uint8Array(await crypto.subtle.sign('HMAC', cryptoKey, buf));\n const offset = sig[19] & 0x0f;\n const code = ((sig[offset] & 0x7f) << 24) | (sig[offset + 1] << 16) | (sig[offset + 2] << 8) | sig[offset + 3];\n return String(code % Math.pow(10, this._digits)).padStart(this._digits, '0');\n }\n\n private _base32Decode(s: string): Uint8Array {\n const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n const clean = s.toUpperCase().replace(/=+$/, '');\n const bits = clean.split('').map(c => alphabet.indexOf(c).toString(2).padStart(5, '0')).join('');\n return new Uint8Array(bits.match(/.{8}/g)?.map(b => parseInt(b, 2)) ?? []);\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopOtpTimerConfig {\n duration?: number; // seconds, default 60\n resendCooldown?: number; // seconds, default 30\n autoStart?: boolean;\n}\n\nexport interface JoopOtpTimerState {\n remaining: number;\n phase: 'idle' | 'counting' | 'expired' | 'cooldown';\n canResend: boolean;\n cooldownRemaining: number;\n}\n\nexport class JoopOtpTimer {\n private readonly _duration: number;\n private readonly _resendCooldown: number;\n\n private _remaining = 0;\n private _cooldownRemaining = 0;\n private _phase: JoopOtpTimerState['phase'] = 'idle';\n private _ticker: ReturnType<typeof setInterval> | null = null;\n private _cooldownTicker: ReturnType<typeof setInterval> | null = null;\n\n private readonly _state$: JoopBehaviorSubject<JoopOtpTimerState>;\n\n private _onExpire: (() => void) | null = null;\n private _onTick: ((remaining: number) => void) | null = null;\n\n constructor(config: JoopOtpTimerConfig = {}) {\n this._duration = config.duration ?? 60;\n this._resendCooldown = config.resendCooldown ?? 30;\n this._state$ = new JoopBehaviorSubject<JoopOtpTimerState>(this._snapshot());\n if (config.autoStart) this.start();\n }\n\n start(): void {\n this._clearTickers();\n this._remaining = this._duration;\n this._phase = 'counting';\n this._emit();\n\n this._ticker = setInterval(() => {\n this._remaining--;\n this._onTick?.(this._remaining);\n if (this._remaining <= 0) {\n this._clearTickers();\n this._phase = 'expired';\n this._remaining = 0;\n this._onExpire?.();\n }\n this._emit();\n }, 1000);\n }\n\n resend(): boolean {\n if (!this.canResend) return false;\n this._startCooldown();\n this.start();\n return true;\n }\n\n stop(): void {\n this._clearTickers();\n this._phase = 'idle';\n this._remaining = 0;\n this._emit();\n }\n\n reset(): void {\n this.stop();\n }\n\n onExpire(fn: () => void): this {\n this._onExpire = fn;\n return this;\n }\n\n onTick(fn: (remaining: number) => void): this {\n this._onTick = fn;\n return this;\n }\n\n get remaining(): number { return this._remaining; }\n get phase(): JoopOtpTimerState['phase'] { return this._phase; }\n get isExpired(): boolean { return this._phase === 'expired'; }\n get isCounting(): boolean { return this._phase === 'counting'; }\n get canResend(): boolean { return this._phase !== 'cooldown' && this._cooldownRemaining === 0; }\n\n remaining$(): JoopBehaviorSubject<JoopOtpTimerState> { return this._state$; }\n\n progress(): number {\n if (this._duration === 0) return 0;\n return Math.max(0, Math.min(1, this._remaining / this._duration));\n }\n\n destroy(): void {\n this._clearTickers();\n }\n\n private _startCooldown(): void {\n this._cooldownRemaining = this._resendCooldown;\n this._cooldownTicker = setInterval(() => {\n this._cooldownRemaining--;\n if (this._cooldownRemaining <= 0) {\n this._cooldownRemaining = 0;\n clearInterval(this._cooldownTicker!);\n this._cooldownTicker = null;\n }\n this._emit();\n }, 1000);\n }\n\n private _clearTickers(): void {\n if (this._ticker) { clearInterval(this._ticker); this._ticker = null; }\n }\n\n private _snapshot(): JoopOtpTimerState {\n return {\n remaining: this._remaining,\n phase: this._phase,\n canResend: this.canResend,\n cooldownRemaining: this._cooldownRemaining,\n };\n }\n\n private _emit(): void {\n this._state$.next(this._snapshot());\n }\n}\n","export class JoopBiometricService {\n isSupported(): boolean {\n return typeof window !== 'undefined'\n && 'credentials' in navigator\n && 'PublicKeyCredential' in window;\n }\n\n async isAvailable(): Promise<boolean> {\n if (!this.isSupported()) return false;\n return PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n }\n\n async register(options: {\n rpId: string;\n rpName: string;\n userId: string;\n userName: string;\n userDisplayName: string;\n challenge: ArrayBuffer;\n }): Promise<PublicKeyCredential> {\n const createOptions: PublicKeyCredentialCreationOptions = {\n challenge: options.challenge,\n rp: { id: options.rpId, name: options.rpName },\n user: {\n id: new TextEncoder().encode(options.userId),\n name: options.userName,\n displayName: options.userDisplayName,\n },\n pubKeyCredParams: [\n { alg: -7, type: 'public-key' }, // ES256\n { alg: -257, type: 'public-key' }, // RS256\n ],\n authenticatorSelection: {\n authenticatorAttachment: 'platform',\n userVerification: 'required',\n },\n timeout: 60_000,\n };\n return navigator.credentials.create({ publicKey: createOptions }) as Promise<PublicKeyCredential>;\n }\n\n async authenticate(options: {\n rpId: string;\n challenge: ArrayBuffer;\n allowCredentials?: PublicKeyCredentialDescriptor[];\n }): Promise<PublicKeyCredential> {\n const getOptions: PublicKeyCredentialRequestOptions = {\n challenge: options.challenge,\n rpId: options.rpId,\n allowCredentials: options.allowCredentials ?? [],\n userVerification: 'required',\n timeout: 60_000,\n };\n return navigator.credentials.get({ publicKey: getOptions }) as Promise<PublicKeyCredential>;\n }\n\n generateChallenge(): ArrayBuffer {\n const buf = new Uint8Array(32);\n crypto.getRandomValues(buf);\n return buf.buffer;\n }\n\n credentialIdToBase64(id: ArrayBuffer): string {\n return btoa(String.fromCharCode(...new Uint8Array(id)));\n }\n}\n","import { JoopOtpService } from './otp.service';\nimport { JoopBiometricService } from './biometric.service';\nimport { JoopSubject } from '../events';\n\nexport type JoopMfaChannel = 'totp' | 'sms' | 'email' | 'biometric' | 'backup';\n\nexport interface JoopMfaChallenge {\n id: string;\n channel: JoopMfaChannel;\n destination?: string;\n expiresAt: number;\n attempts: number;\n maxAttempts: number;\n verified: boolean;\n}\n\nexport interface JoopMfaVerifyResult {\n success: boolean;\n reason?: string;\n attemptsLeft?: number;\n}\n\nexport interface JoopMfaTotpSetup {\n secret: string; // base32 secret for authenticator app\n uri: string; // otpauth:// URI for QR code\n backupCodes: string[]; // plaintext backup codes (show once)\n}\n\nconst BASE32_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n\nexport class JoopMfaService {\n private _otp = new JoopOtpService();\n private _bio = new JoopBiometricService();\n private _challenges = new Map<string, JoopMfaChallenge & { _code?: string }>();\n private _expired$ = new JoopSubject<string>();\n\n // ── TOTP ──────────────────────────────────────────────────────────────────\n\n generateTotpSecret(length = 20): string {\n const bytes = crypto.getRandomValues(new Uint8Array(length));\n let result = '';\n for (const byte of bytes) result += BASE32_CHARS[byte % 32];\n return result;\n }\n\n getTotpUri(secret: string, account: string, issuer = 'JoopApp'): string {\n const label = encodeURIComponent(`${issuer}:${account}`);\n return `otpauth://totp/${label}?secret=${secret}&issuer=${encodeURIComponent(issuer)}&algorithm=SHA1&digits=6&period=30`;\n }\n\n async setupTotp(account: string, issuer?: string): Promise<JoopMfaTotpSetup> {\n const secret = this.generateTotpSecret();\n const uri = this.getTotpUri(secret, account, issuer);\n const backupCodes = this.generateBackupCodes();\n return { secret, uri, backupCodes };\n }\n\n async verifyTotp(token: string, secret: string, window = 1): Promise<boolean> {\n return this._otp.verifyTOTP(token, secret, window);\n }\n\n // ── OTP Challenge (SMS/Email) ──────────────────────────────────────────────\n\n createChallenge(\n destination: string,\n channel: 'sms' | 'email',\n ttlMs = 5 * 60 * 1000,\n maxAttempts = 3,\n ): JoopMfaChallenge & { _code: string } {\n const code = this._otp.generateNumericOTP(6);\n const challenge = {\n id: crypto.randomUUID(),\n channel: channel as JoopMfaChannel,\n destination,\n expiresAt: Date.now() + ttlMs,\n attempts: 0,\n maxAttempts,\n verified: false,\n _code: code,\n };\n this._challenges.set(challenge.id, challenge);\n setTimeout(() => {\n if (!this._challenges.get(challenge.id)?.verified) {\n this._challenges.delete(challenge.id);\n this._expired$.next(challenge.id);\n }\n }, ttlMs);\n return challenge;\n }\n\n /** Get the OTP code for a challenge (pass to your SMS/email sendFn) */\n getChallengeOtp(challengeId: string): string | null {\n return this._challenges.get(challengeId)?._code ?? null;\n }\n\n verifyChallenge(challengeId: string, token: string): JoopMfaVerifyResult {\n const ch = this._challenges.get(challengeId);\n if (!ch) return { success: false, reason: 'challenge_not_found' };\n if (Date.now() > ch.expiresAt) { this._challenges.delete(challengeId); return { success: false, reason: 'expired' }; }\n if (ch.verified) return { success: false, reason: 'already_verified' };\n ch.attempts++;\n if (ch._code !== token) {\n const attemptsLeft = ch.maxAttempts - ch.attempts;\n if (attemptsLeft <= 0) this._challenges.delete(challengeId);\n return { success: false, reason: 'invalid_code', attemptsLeft };\n }\n ch.verified = true;\n return { success: true };\n }\n\n // ── Backup Codes ──────────────────────────────────────────────────────────\n\n generateBackupCodes(count = 10, length = 8): string[] {\n return Array.from({ length: count }, () => this._otp.generateAlphanumericOTP(length));\n }\n\n async hashBackupCodes(codes: string[]): Promise<string[]> {\n const hashed: string[] = [];\n for (const code of codes) {\n const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(code));\n hashed.push(Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, '0')).join(''));\n }\n return hashed;\n }\n\n async verifyBackupCode(\n code: string,\n hashedCodes: string[],\n ): Promise<{ valid: boolean; remaining: string[] }> {\n const hash = Array.from(\n new Uint8Array(await crypto.subtle.digest('SHA-256', new TextEncoder().encode(code))),\n ).map(b => b.toString(16).padStart(2, '0')).join('');\n const idx = hashedCodes.indexOf(hash);\n if (idx === -1) return { valid: false, remaining: hashedCodes };\n return { valid: true, remaining: hashedCodes.filter((_, i) => i !== idx) };\n }\n\n // ── Biometric ─────────────────────────────────────────────────────────────\n\n async isBiometricAvailable(): Promise<boolean> { return this._bio.isAvailable(); }\n\n async registerBiometric(userId: string, displayName?: string): Promise<PublicKeyCredential> {\n const challengeBytes = crypto.getRandomValues(new Uint8Array(32));\n return this._bio.register({\n challenge: challengeBytes.buffer as ArrayBuffer,\n rpId: window.location.hostname,\n rpName: document.title || 'JoopApp',\n userId,\n userName: userId,\n userDisplayName: displayName ?? userId,\n });\n }\n\n async verifyBiometric(credentialId: string): Promise<boolean> {\n try {\n const challengeBytes = crypto.getRandomValues(new Uint8Array(32));\n const result = await this._bio.authenticate({\n challenge: challengeBytes.buffer as ArrayBuffer,\n rpId: window.location.hostname,\n allowCredentials: [{ id: new TextEncoder().encode(credentialId), type: 'public-key' }],\n });\n return !!result;\n } catch { return false; }\n }\n\n // ── Challenge state ────────────────────────────────────────────────────────\n\n onChallengeExpired(handler: (id: string) => void): () => void {\n return this._expired$.subscribe(handler);\n }\n\n clearExpiredChallenges(): number {\n const now = Date.now();\n let removed = 0;\n for (const [id, ch] of this._challenges) {\n if (now > ch.expiresAt) { this._challenges.delete(id); removed++; }\n }\n return removed;\n }\n\n getChallenge(id: string): JoopMfaChallenge | null {\n const ch = this._challenges.get(id);\n if (!ch) return null;\n const { _code: _, ...safe } = ch;\n return safe;\n }\n}\n","import type { JoopPlatformAdapterConfig, JoopStorageAdapter } from './adapters';\n\nexport type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';\n\nexport interface JoopCapabilities {\n compression: boolean;\n workers: boolean;\n cryptoSubtle: boolean;\n persistentStorage: boolean;\n dom: boolean;\n serviceWorker: boolean;\n}\n\nexport interface JoopPlatformConfig {\n adapter?: JoopPlatformAdapterConfig;\n /** Override auto-detection — useful in tests or SSR */\n platform?: JoopPlatformType;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in storage adapters\n// ---------------------------------------------------------------------------\n\nconst _webStorage = (store: Storage): JoopStorageAdapter => ({\n getItem: (k) => store.getItem(k),\n setItem: (k, v) => store.setItem(k, v),\n removeItem: (k) => store.removeItem(k),\n clear: () => store.clear(),\n});\n\nclass _MemStorageImpl implements JoopStorageAdapter {\n private _m = new Map<string, string>();\n getItem(k: string) { return this._m.get(k) ?? null; }\n setItem(k: string, v: string) { this._m.set(k, v); }\n removeItem(k: string) { this._m.delete(k); }\n clear() { this._m.clear(); }\n}\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction _detect(): JoopPlatformType {\n // React Native sets navigator.product = 'ReactNative'\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return 'react-native';\n // Node.js: no window, has globalThis.process.versions.node\n const _proc = (globalThis as Record<string, unknown>)['process'] as { versions?: { node?: string } } | undefined;\n if (typeof window === 'undefined' && _proc?.versions?.node) return 'node';\n // Browser\n if (typeof window !== 'undefined') return 'web';\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// JoopPlatform\n// ---------------------------------------------------------------------------\n\nexport class JoopPlatform {\n private static _type: JoopPlatformType = _detect();\n private static _adapter: JoopPlatformAdapterConfig = {};\n private static _memStorage: JoopStorageAdapter | null = null;\n\n /**\n * Call once at app startup to configure adapters for your platform.\n *\n * Web (default — no call needed):\n * JoopPlatform.init();\n *\n * React Native with react-native-mmkv:\n * import { MMKV } from 'react-native-mmkv';\n * const mmkv = new MMKV();\n * JoopPlatform.init({ adapter: { storage: mmkv } });\n *\n * React Native with custom compression (fflate):\n * import { gzip, ungzip } from 'fflate';\n * JoopPlatform.init({\n * adapter: {\n * compression: {\n * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),\n * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),\n * },\n * },\n * });\n */\n static init(config: JoopPlatformConfig = {}): void {\n if (config.platform) this._type = config.platform;\n this._adapter = { ...this._adapter, ...(config.adapter ?? {}) };\n }\n\n /** Current detected or overridden platform type */\n static get type(): JoopPlatformType { return this._type; }\n\n static is(type: JoopPlatformType): boolean { return this._type === type; }\n static isMobile(): boolean { return this._type === 'react-native'; }\n static isWeb(): boolean { return this._type === 'web'; }\n static isNode(): boolean { return this._type === 'node'; }\n\n /** Raw adapter config registered via init() */\n static getAdapter(): JoopPlatformAdapterConfig { return this._adapter; }\n\n /**\n * Returns the best available storage adapter:\n * 1. Custom adapter registered via init()\n * 2. localStorage (web)\n * 3. In-memory fallback (Node / RN without adapter)\n */\n static getStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof localStorage !== 'undefined') return _webStorage(localStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /**\n * Returns the best available session-scoped storage:\n * 1. Custom adapter registered via init()\n * 2. sessionStorage (web)\n * 3. Shared in-memory fallback\n */\n static getSessionStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof sessionStorage !== 'undefined') return _webStorage(sessionStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /** What APIs are available in the current environment */\n static capabilities(): JoopCapabilities {\n return {\n compression: typeof CompressionStream !== 'undefined' || !!this._adapter.compression,\n workers: typeof Worker !== 'undefined' || !!this._adapter.worker,\n cryptoSubtle: !!(typeof globalThis !== 'undefined' && (globalThis as typeof globalThis & { crypto?: Crypto }).crypto?.subtle),\n persistentStorage: typeof localStorage !== 'undefined' || !!this._adapter.storage,\n dom: typeof document !== 'undefined',\n serviceWorker: typeof navigator !== 'undefined' && 'serviceWorker' in navigator,\n };\n }\n\n /** Reset to auto-detected defaults — useful between tests */\n static _reset(): void {\n this._type = _detect();\n this._adapter = {};\n this._memStorage = null;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\nimport { JoopPlatform } from '../platform/platform';\nimport type { JoopStorageAdapter } from '../platform/adapters';\n\nexport interface JoopOIDCConfig {\n issuer: string; // e.g. https://accounts.google.com\n clientId: string;\n redirectUri: string;\n scope?: string; // default: 'openid profile email'\n responseType?: string; // default: 'code'\n /**\n * Storage for PKCE verifier, state, and tokens.\n * Accepts any JoopStorageAdapter (localStorage, sessionStorage, MMKV, custom).\n * Default: sessionStorage on web, JoopPlatform.getSessionStorage() on other platforms.\n */\n storage?: JoopStorageAdapter;\n}\n\nexport interface JoopOIDCMetadata {\n authorizationEndpoint: string;\n tokenEndpoint: string;\n jwksUri: string;\n userInfoEndpoint?: string;\n endSessionEndpoint?: string;\n}\n\nexport interface JoopOIDCTokens {\n accessToken: string;\n idToken?: string;\n refreshToken?: string;\n expiresAt: number; // Unix ms\n tokenType: string;\n scope?: string;\n}\n\nexport interface JoopLoginOptions {\n prompt?: 'none' | 'login' | 'consent' | 'select_account';\n loginHint?: string;\n state?: string;\n nonce?: string;\n extraParams?: Record<string, string>;\n}\n\nexport class JoopOIDCClient {\n private _cfg: JoopOIDCConfig;\n private _metadata: JoopOIDCMetadata | null = null;\n private _tokens$ = new JoopBehaviorSubject<JoopOIDCTokens | null>(null);\n private _storage: JoopStorageAdapter;\n private _renewTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly _KEY = 'joop_oidc_tokens';\n private readonly _VER_KEY = 'joop_oidc_verifier';\n private readonly _STATE_KEY = 'joop_oidc_state';\n\n constructor(config: JoopOIDCConfig) {\n this._cfg = { scope: 'openid profile email', responseType: 'code', ...config };\n // Use explicit storage → sessionStorage → platform adapter (RN: MMKV or mem)\n this._storage = config.storage ?? JoopPlatform.getSessionStorage();\n const stored = this._storage.getItem(this._KEY);\n if (stored) { try { this._tokens$.next(JSON.parse(stored)); } catch {} }\n }\n\n async discover(): Promise<JoopOIDCMetadata> {\n if (this._metadata) return this._metadata;\n const url = `${this._cfg.issuer}/.well-known/openid-configuration`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`OIDC discovery failed: ${res.status}`);\n const json = await res.json();\n this._metadata = {\n authorizationEndpoint: json.authorization_endpoint,\n tokenEndpoint: json.token_endpoint,\n jwksUri: json.jwks_uri,\n userInfoEndpoint: json.userinfo_endpoint,\n endSessionEndpoint: json.end_session_endpoint,\n };\n return this._metadata;\n }\n\n async login(options: JoopLoginOptions = {}): Promise<void> {\n const meta = await this.discover();\n const { verifier, challenge } = await _generatePKCE();\n const state = options.state ?? _randomBase64(16);\n\n this._storage.setItem(this._VER_KEY, verifier);\n this._storage.setItem(this._STATE_KEY, state);\n\n const params = new URLSearchParams({\n response_type: this._cfg.responseType!,\n client_id: this._cfg.clientId,\n redirect_uri: this._cfg.redirectUri,\n scope: this._cfg.scope!,\n state,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n nonce: options.nonce ?? _randomBase64(16),\n ...(options.prompt ? { prompt: options.prompt } : {}),\n ...(options.loginHint ? { login_hint: options.loginHint } : {}),\n ...options.extraParams,\n });\n\n // Web: redirect. React Native: caller handles the URL (deep link).\n if (typeof window !== 'undefined') {\n window.location.href = `${meta.authorizationEndpoint}?${params}`;\n } else {\n // Return the URL so RN callers can open it in a browser/WebView\n return Promise.resolve() as unknown as void;\n }\n }\n\n /** Returns the authorization URL without redirecting (useful for React Native) */\n async buildLoginUrl(options: JoopLoginOptions = {}): Promise<string> {\n const meta = await this.discover();\n const { verifier, challenge } = await _generatePKCE();\n const state = options.state ?? _randomBase64(16);\n this._storage.setItem(this._VER_KEY, verifier);\n this._storage.setItem(this._STATE_KEY, state);\n const params = new URLSearchParams({\n response_type: this._cfg.responseType!,\n client_id: this._cfg.clientId,\n redirect_uri: this._cfg.redirectUri,\n scope: this._cfg.scope!,\n state,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n nonce: options.nonce ?? _randomBase64(16),\n ...(options.prompt ? { prompt: options.prompt } : {}),\n ...(options.loginHint ? { login_hint: options.loginHint } : {}),\n ...options.extraParams,\n });\n return `${meta.authorizationEndpoint}?${params}`;\n }\n\n async handleCallback(url = typeof location !== 'undefined' ? location.href : ''): Promise<JoopOIDCTokens> {\n const params = new URLSearchParams(url.split('?')[1] ?? '');\n const code = params.get('code');\n const state = params.get('state');\n const error = params.get('error');\n\n if (error) throw new Error(`OIDC error: ${error} — ${params.get('error_description') ?? ''}`);\n if (!code) throw new Error('OIDC callback: missing code');\n\n const storedState = this._storage.getItem(this._STATE_KEY);\n if (storedState && state !== storedState) throw new Error('OIDC callback: state mismatch (CSRF?)');\n const verifier = this._storage.getItem(this._VER_KEY) ?? '';\n this._storage.removeItem(this._VER_KEY);\n this._storage.removeItem(this._STATE_KEY);\n\n const meta = await this.discover();\n const res = await fetch(meta.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ grant_type: 'authorization_code', code, redirect_uri: this._cfg.redirectUri, client_id: this._cfg.clientId, code_verifier: verifier }),\n });\n if (!res.ok) throw new Error(`OIDC token exchange failed: ${await res.text()}`);\n return this._storeTokens(await res.json());\n }\n\n async refreshToken(): Promise<JoopOIDCTokens> {\n const tokens = this._tokens$.getValue();\n if (!tokens?.refreshToken) throw new Error('No refresh token available');\n const meta = await this.discover();\n const res = await fetch(meta.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ grant_type: 'refresh_token', refresh_token: tokens.refreshToken, client_id: this._cfg.clientId }),\n });\n if (!res.ok) { this.logout(); throw new Error(`Token refresh failed: ${res.status}`); }\n return this._storeTokens(await res.json());\n }\n\n async getUserInfo(): Promise<Record<string, unknown>> {\n const meta = await this.discover();\n if (!meta.userInfoEndpoint) throw new Error('No userInfo endpoint in OIDC metadata');\n const tokens = this._tokens$.getValue();\n if (!tokens) throw new Error('Not authenticated');\n const res = await fetch(meta.userInfoEndpoint, { headers: { Authorization: `Bearer ${tokens.accessToken}` } });\n if (!res.ok) throw new Error(`UserInfo failed: ${res.status}`);\n return res.json();\n }\n\n async logout(options: { redirectUri?: string } = {}): Promise<void> {\n this._tokens$.next(null);\n this._storage.removeItem(this._KEY);\n if (this._renewTimer) { clearTimeout(this._renewTimer); this._renewTimer = null; }\n if (this._metadata?.endSessionEndpoint && typeof window !== 'undefined') {\n const params = new URLSearchParams({ client_id: this._cfg.clientId, ...(options.redirectUri ? { post_logout_redirect_uri: options.redirectUri } : {}) });\n window.location.href = `${this._metadata.endSessionEndpoint}?${params}`;\n }\n }\n\n silentRenew(renewBeforeMs = 60000): void {\n const tokens = this._tokens$.getValue();\n if (!tokens?.refreshToken) return;\n const delay = Math.max(0, tokens.expiresAt - Date.now() - renewBeforeMs);\n if (this._renewTimer) clearTimeout(this._renewTimer);\n this._renewTimer = setTimeout(async () => {\n try { await this.refreshToken(); this.silentRenew(renewBeforeMs); }\n catch { this._tokens$.next(null); }\n }, delay);\n }\n\n isAuthenticated(): boolean {\n const t = this._tokens$.getValue();\n return !!t && t.expiresAt > Date.now();\n }\n\n getTokens(): JoopOIDCTokens | null { return this._tokens$.getValue(); }\n tokens$() { return this._tokens$.asObservable(); }\n\n private _storeTokens(json: Record<string, unknown>): JoopOIDCTokens {\n const tokens: JoopOIDCTokens = {\n accessToken: json.access_token as string,\n idToken: json.id_token as string | undefined,\n refreshToken: json.refresh_token as string | undefined,\n expiresAt: Date.now() + ((json.expires_in as number ?? 3600) * 1000),\n tokenType: (json.token_type as string) ?? 'Bearer',\n scope: json.scope as string | undefined,\n };\n this._tokens$.next(tokens);\n this._storage.setItem(this._KEY, JSON.stringify(tokens));\n return tokens;\n }\n}\n\nasync function _generatePKCE(): Promise<{ verifier: string; challenge: string }> {\n const verifier = _randomBase64(32);\n const hash = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));\n const challenge = btoa(String.fromCharCode(...new Uint8Array(hash)))\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n return { verifier, challenge };\n}\n\nfunction _randomBase64(bytes: number): string {\n const buf = new Uint8Array(bytes);\n crypto.getRandomValues(buf);\n return btoa(String.fromCharCode(...buf)).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n","// SSO: Single Sign-On service\n// Handles external URL whitelisting, token exchange, and internal API passthrough\n\nexport interface JoopSsoConfig {\n /** Allowed external origins for SSO redirects */\n allowedOrigins: string[];\n /** Allowed internal API base URLs */\n internalBases?: string[];\n /** Token exchange endpoint */\n tokenEndpoint?: string;\n /** SSO logout URL */\n logoutUrl?: string;\n /** Store token key in sessionStorage */\n storageKey?: string;\n}\n\nexport interface JoopSsoToken {\n accessToken: string;\n refreshToken?: string;\n idToken?: string;\n expiresAt: number;\n scopes: string[];\n}\n\nexport interface JoopSsoExchangeRequest {\n code: string;\n redirectUri: string;\n codeVerifier?: string;\n}\n\nexport type JoopSsoLinkTarget = 'self' | 'blank' | 'parent';\n\nexport class JoopSsoService {\n private readonly _config: JoopSsoConfig;\n private _token: JoopSsoToken | null = null;\n private readonly _storageKey: string;\n\n constructor(config: JoopSsoConfig) {\n this._config = config;\n this._storageKey = config.storageKey ?? '__joop_sso_token';\n this._loadFromStorage();\n }\n\n // ── Token management ────────────────────────────────────────────────────────\n\n setToken(token: JoopSsoToken): void {\n this._token = token;\n sessionStorage.setItem(this._storageKey, JSON.stringify(token));\n }\n\n getToken(): JoopSsoToken | null { return this._token; }\n\n isAuthenticated(): boolean {\n return !!this._token && this._token.expiresAt > Date.now();\n }\n\n clearToken(): void {\n this._token = null;\n sessionStorage.removeItem(this._storageKey);\n }\n\n // ── Token exchange (Authorization Code → Access Token) ─────────────────────\n\n async exchange(req: JoopSsoExchangeRequest): Promise<JoopSsoToken> {\n if (!this._config.tokenEndpoint) throw new Error('JoopSso: tokenEndpoint not configured');\n const body: Record<string, string> = {\n grant_type: 'authorization_code',\n code: req.code,\n redirect_uri: req.redirectUri,\n };\n if (req.codeVerifier) body['code_verifier'] = req.codeVerifier;\n\n const res = await fetch(this._config.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams(body).toString(),\n });\n if (!res.ok) throw new Error(`JoopSso: token exchange failed (${res.status})`);\n const data = await res.json() as {\n access_token: string; refresh_token?: string; id_token?: string;\n expires_in?: number; scope?: string;\n };\n const token: JoopSsoToken = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n idToken: data.id_token,\n expiresAt: Date.now() + (data.expires_in ?? 3600) * 1000,\n scopes: (data.scope ?? '').split(' ').filter(Boolean),\n };\n this.setToken(token);\n return token;\n }\n\n // ── Whitelist-based external link opening ───────────────────────────────────\n\n /**\n * Open an external URL only if its origin is in allowedOrigins.\n * Prevents open-redirect attacks.\n */\n openExternal(url: string, target: JoopSsoLinkTarget = 'blank'): boolean {\n if (!this._isOriginAllowed(url)) {\n console.warn(`JoopSso: blocked external link to ${url} — origin not in allowedOrigins`);\n return false;\n }\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.target = target === 'self' ? '_self' : target === 'parent' ? '_parent' : '_blank';\n anchor.rel = 'noopener noreferrer';\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n return true;\n }\n\n /** Check whether a URL's origin is whitelisted. */\n isOriginAllowed(url: string): boolean {\n return this._isOriginAllowed(url);\n }\n\n // ── Internal API passthrough ────────────────────────────────────────────────\n\n /**\n * Make an authenticated internal API call.\n * Automatically attaches the SSO bearer token.\n * Rejects if the URL does not match internalBases.\n */\n async callInternal<T = any>(url: string, init: RequestInit = {}): Promise<T> {\n if (!this._isInternalUrl(url)) {\n throw new Error(`JoopSso: URL \"${url}\" is not in internalBases`);\n }\n const token = this.getToken();\n const headers = new Headers(init.headers);\n if (token?.accessToken) headers.set('Authorization', `Bearer ${token.accessToken}`);\n const res = await fetch(url, { ...init, headers });\n if (!res.ok) throw new Error(`JoopSso: internal API error ${res.status}`);\n const text = await res.text();\n return text ? JSON.parse(text) as T : undefined as unknown as T;\n }\n\n // ── SSO Logout ──────────────────────────────────────────────────────────────\n\n logout(redirectUri?: string): void {\n this.clearToken();\n if (this._config.logoutUrl) {\n const url = redirectUri\n ? `${this._config.logoutUrl}?post_logout_redirect_uri=${encodeURIComponent(redirectUri)}`\n : this._config.logoutUrl;\n window.location.href = url;\n }\n }\n\n // ── Helpers ─────────────────────────────────────────────────────────────────\n\n private _isOriginAllowed(url: string): boolean {\n try {\n const origin = new URL(url).origin;\n return this._config.allowedOrigins.some(allowed => {\n const aOrigin = allowed.endsWith('/') ? allowed.slice(0, -1) : allowed;\n return origin === aOrigin || origin.endsWith('.' + aOrigin);\n });\n } catch { return false; }\n }\n\n private _isInternalUrl(url: string): boolean {\n if (!this._config.internalBases?.length) return true;\n return this._config.internalBases.some(base => url.startsWith(base));\n }\n\n private _loadFromStorage(): void {\n try {\n const raw = sessionStorage.getItem(this._storageKey);\n if (raw) this._token = JSON.parse(raw) as JoopSsoToken;\n } catch { /* ignore */ }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/events/index.ts","../../src/auth/auth.service.ts","../../src/auth/token.service.ts","../../src/auth/pkce.service.ts","../../src/auth/otp.service.ts","../../src/auth/otp-timer.service.ts","../../src/auth/biometric.service.ts","../../src/auth/mfa.service.ts","../../src/platform/platform.ts","../../src/auth/oidc-client.ts","../../src/auth/sso.service.ts"],"names":["window"],"mappings":"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","file":"index.mjs","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Reports a subscriber that threw during emission, without aborting delivery\n * to the remaining subscribers. Defaults to console.error; override to route\n * to your own logger (e.g. in a banking app where dropped events matter).\n */\nlet _onListenerError: (error: unknown) => void = (error) => {\n // eslint-disable-next-line no-console\n console.error('[joopjs] a subject subscriber threw during emission:', error);\n};\n\n/** Override how subscriber errors are reported during emission. */\nexport function setSubjectErrorHandler(handler: (error: unknown) => void): void {\n _onListenerError = handler;\n}\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n // Snapshot so a subscribe()/unsubscribe() triggered by a listener can't\n // disturb this emission, and isolate each listener so one that throws\n // doesn't deprive later subscribers of the value.\n const listeners = this._listeners.slice();\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n _onListenerError(error);\n }\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n try {\n listener(this._value);\n } catch (error) {\n _onListenerError(error);\n }\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject, JoopObservable } from '../events';\nimport { JoopDataStorage } from '../storage/data-storage.service';\n\nexport class JoopAuthService {\n private readonly _loggedIn$ = new JoopBehaviorSubject<boolean>(false);\n\n constructor(private readonly _storage: JoopDataStorage) {}\n\n setLoggedIn(isLoggedIn: boolean, menuData: { menuObj: any[] } = { menuObj: [] }): void {\n this._loggedIn$.next(isLoggedIn);\n if (isLoggedIn) {\n this._storage.setMenuData(menuData);\n } else {\n this._storage.clearMenuData();\n }\n }\n\n isLoggedIn(): boolean {\n return this._loggedIn$.getValue();\n }\n\n isLoggedIn$(): JoopObservable<boolean> {\n return this._loggedIn$.asObservable();\n }\n\n logout(): void {\n this.setLoggedIn(false);\n }\n}\n","export interface JoopTokenPayload {\n sub?: string;\n exp?: number;\n iat?: number;\n jti?: string;\n [key: string]: unknown;\n}\n\nexport class JoopTokenService {\n private _access = '';\n private _refresh = '';\n private _refreshCb: ((token: string) => Promise<string>) | null = null;\n private _timer: ReturnType<typeof setTimeout> | null = null;\n\n setTokens(accessToken: string, refreshToken: string): void {\n this._access = accessToken;\n this._refresh = refreshToken;\n this._scheduleRefresh();\n }\n\n getAccessToken(): string { return this._access; }\n getRefreshToken(): string { return this._refresh; }\n\n decode(token: string): JoopTokenPayload | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const padded = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n return JSON.parse(atob(padded)) as JoopTokenPayload;\n } catch {\n return null;\n }\n }\n\n isExpired(token?: string): boolean {\n const payload = this.decode(token ?? this._access);\n if (!payload?.exp) return true;\n return Date.now() >= payload.exp * 1000;\n }\n\n expiresInMs(token?: string): number {\n const payload = this.decode(token ?? this._access);\n if (!payload?.exp) return 0;\n return Math.max(0, payload.exp * 1000 - Date.now());\n }\n\n onRefreshNeeded(callback: (refreshToken: string) => Promise<string>): void {\n this._refreshCb = callback;\n }\n\n async refreshNow(): Promise<string> {\n if (!this._refreshCb) throw new Error('No refresh callback registered');\n const newToken = await this._refreshCb(this._refresh);\n this._access = newToken;\n this._scheduleRefresh();\n return newToken;\n }\n\n clear(): void {\n this._access = '';\n this._refresh = '';\n if (this._timer) clearTimeout(this._timer);\n this._timer = null;\n }\n\n private _scheduleRefresh(): void {\n if (this._timer) clearTimeout(this._timer);\n const ms = this.expiresInMs();\n const delay = ms > 30_000 ? ms - 30_000 : 0;\n if (delay > 0 && this._refreshCb) {\n this._timer = setTimeout(() => this.refreshNow().catch(() => {}), delay);\n }\n }\n}\n","export interface JoopPKCEParams {\n codeVerifier: string;\n codeChallenge: string;\n codeChallengeMethod: 'S256';\n}\n\nexport class JoopPKCEService {\n private _verifier = '';\n\n async generate(): Promise<JoopPKCEParams> {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n const verifier = this._base64url(array);\n this._verifier = verifier;\n\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));\n const challenge = this._base64url(new Uint8Array(digest));\n\n return { codeVerifier: verifier, codeChallenge: challenge, codeChallengeMethod: 'S256' };\n }\n\n getVerifier(): string { return this._verifier; }\n\n generateState(): string {\n const arr = new Uint8Array(16);\n crypto.getRandomValues(arr);\n return this._base64url(arr);\n }\n\n buildAuthUrl(baseUrl: string, params: {\n clientId: string;\n redirectUri: string;\n scope: string;\n state: string;\n codeChallenge: string;\n }): string {\n const q = new URLSearchParams({\n response_type: 'code',\n client_id: params.clientId,\n redirect_uri: params.redirectUri,\n scope: params.scope,\n state: params.state,\n code_challenge: params.codeChallenge,\n code_challenge_method: 'S256',\n });\n return `${baseUrl}?${q.toString()}`;\n }\n\n private _base64url(buf: Uint8Array): string {\n return btoa(String.fromCharCode(...buf))\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n }\n}\n","export class JoopOtpService {\n private readonly _period = 30;\n private readonly _digits = 6;\n\n async generateTOTP(secretBase32: string, time?: number): Promise<string> {\n const key = this._base32Decode(secretBase32);\n const counter = Math.floor((time ?? Date.now()) / 1000 / this._period);\n return this._hotp(key, counter);\n }\n\n async verifyTOTP(token: string, secretBase32: string, window = 1): Promise<boolean> {\n const now = Math.floor(Date.now() / 1000 / this._period);\n for (let i = -window; i <= window; i++) {\n const expected = await this._hotp(this._base32Decode(secretBase32), now + i);\n if (expected === token) return true;\n }\n return false;\n }\n\n generateNumericOTP(length = 6): string {\n const arr = new Uint8Array(length);\n crypto.getRandomValues(arr);\n return Array.from(arr).map(b => b % 10).join('');\n }\n\n generateAlphanumericOTP(length = 8): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n const arr = new Uint8Array(length);\n crypto.getRandomValues(arr);\n return Array.from(arr).map(b => chars[b % chars.length]).join('');\n }\n\n private async _hotp(key: Uint8Array, counter: number): Promise<string> {\n const buf = new ArrayBuffer(8);\n new DataView(buf).setUint32(4, counter, false);\n const safeKey = new Uint8Array(new ArrayBuffer(key.length));\n safeKey.set(key);\n const cryptoKey = await crypto.subtle.importKey('raw', safeKey, { name: 'HMAC', hash: 'SHA-1' }, false, ['sign']);\n const sig = new Uint8Array(await crypto.subtle.sign('HMAC', cryptoKey, buf));\n const offset = sig[19] & 0x0f;\n const code = ((sig[offset] & 0x7f) << 24) | (sig[offset + 1] << 16) | (sig[offset + 2] << 8) | sig[offset + 3];\n return String(code % Math.pow(10, this._digits)).padStart(this._digits, '0');\n }\n\n private _base32Decode(s: string): Uint8Array {\n const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n const clean = s.toUpperCase().replace(/=+$/, '');\n const bits = clean.split('').map(c => alphabet.indexOf(c).toString(2).padStart(5, '0')).join('');\n return new Uint8Array(bits.match(/.{8}/g)?.map(b => parseInt(b, 2)) ?? []);\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopOtpTimerConfig {\n duration?: number; // seconds, default 60\n resendCooldown?: number; // seconds, default 30\n autoStart?: boolean;\n}\n\nexport interface JoopOtpTimerState {\n remaining: number;\n phase: 'idle' | 'counting' | 'expired' | 'cooldown';\n canResend: boolean;\n cooldownRemaining: number;\n}\n\nexport class JoopOtpTimer {\n private readonly _duration: number;\n private readonly _resendCooldown: number;\n\n private _remaining = 0;\n private _cooldownRemaining = 0;\n private _phase: JoopOtpTimerState['phase'] = 'idle';\n private _ticker: ReturnType<typeof setInterval> | null = null;\n private _cooldownTicker: ReturnType<typeof setInterval> | null = null;\n\n private readonly _state$: JoopBehaviorSubject<JoopOtpTimerState>;\n\n private _onExpire: (() => void) | null = null;\n private _onTick: ((remaining: number) => void) | null = null;\n\n constructor(config: JoopOtpTimerConfig = {}) {\n this._duration = config.duration ?? 60;\n this._resendCooldown = config.resendCooldown ?? 30;\n this._state$ = new JoopBehaviorSubject<JoopOtpTimerState>(this._snapshot());\n if (config.autoStart) this.start();\n }\n\n start(): void {\n this._clearTickers();\n this._remaining = this._duration;\n this._phase = 'counting';\n this._emit();\n\n this._ticker = setInterval(() => {\n this._remaining--;\n this._onTick?.(this._remaining);\n if (this._remaining <= 0) {\n this._clearTickers();\n this._phase = 'expired';\n this._remaining = 0;\n this._onExpire?.();\n }\n this._emit();\n }, 1000);\n }\n\n resend(): boolean {\n if (!this.canResend) return false;\n this._startCooldown();\n this.start();\n return true;\n }\n\n stop(): void {\n this._clearTickers();\n this._phase = 'idle';\n this._remaining = 0;\n this._emit();\n }\n\n reset(): void {\n this.stop();\n }\n\n onExpire(fn: () => void): this {\n this._onExpire = fn;\n return this;\n }\n\n onTick(fn: (remaining: number) => void): this {\n this._onTick = fn;\n return this;\n }\n\n get remaining(): number { return this._remaining; }\n get phase(): JoopOtpTimerState['phase'] { return this._phase; }\n get isExpired(): boolean { return this._phase === 'expired'; }\n get isCounting(): boolean { return this._phase === 'counting'; }\n get canResend(): boolean { return this._phase !== 'cooldown' && this._cooldownRemaining === 0; }\n\n remaining$(): JoopBehaviorSubject<JoopOtpTimerState> { return this._state$; }\n\n progress(): number {\n if (this._duration === 0) return 0;\n return Math.max(0, Math.min(1, this._remaining / this._duration));\n }\n\n destroy(): void {\n this._clearTickers();\n }\n\n private _startCooldown(): void {\n this._cooldownRemaining = this._resendCooldown;\n this._cooldownTicker = setInterval(() => {\n this._cooldownRemaining--;\n if (this._cooldownRemaining <= 0) {\n this._cooldownRemaining = 0;\n clearInterval(this._cooldownTicker!);\n this._cooldownTicker = null;\n }\n this._emit();\n }, 1000);\n }\n\n private _clearTickers(): void {\n if (this._ticker) { clearInterval(this._ticker); this._ticker = null; }\n }\n\n private _snapshot(): JoopOtpTimerState {\n return {\n remaining: this._remaining,\n phase: this._phase,\n canResend: this.canResend,\n cooldownRemaining: this._cooldownRemaining,\n };\n }\n\n private _emit(): void {\n this._state$.next(this._snapshot());\n }\n}\n","export class JoopBiometricService {\n isSupported(): boolean {\n return typeof window !== 'undefined'\n && 'credentials' in navigator\n && 'PublicKeyCredential' in window;\n }\n\n async isAvailable(): Promise<boolean> {\n if (!this.isSupported()) return false;\n return PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n }\n\n async register(options: {\n rpId: string;\n rpName: string;\n userId: string;\n userName: string;\n userDisplayName: string;\n challenge: ArrayBuffer;\n }): Promise<PublicKeyCredential> {\n const createOptions: PublicKeyCredentialCreationOptions = {\n challenge: options.challenge,\n rp: { id: options.rpId, name: options.rpName },\n user: {\n id: new TextEncoder().encode(options.userId),\n name: options.userName,\n displayName: options.userDisplayName,\n },\n pubKeyCredParams: [\n { alg: -7, type: 'public-key' }, // ES256\n { alg: -257, type: 'public-key' }, // RS256\n ],\n authenticatorSelection: {\n authenticatorAttachment: 'platform',\n userVerification: 'required',\n },\n timeout: 60_000,\n };\n return navigator.credentials.create({ publicKey: createOptions }) as Promise<PublicKeyCredential>;\n }\n\n async authenticate(options: {\n rpId: string;\n challenge: ArrayBuffer;\n allowCredentials?: PublicKeyCredentialDescriptor[];\n }): Promise<PublicKeyCredential> {\n const getOptions: PublicKeyCredentialRequestOptions = {\n challenge: options.challenge,\n rpId: options.rpId,\n allowCredentials: options.allowCredentials ?? [],\n userVerification: 'required',\n timeout: 60_000,\n };\n return navigator.credentials.get({ publicKey: getOptions }) as Promise<PublicKeyCredential>;\n }\n\n generateChallenge(): ArrayBuffer {\n const buf = new Uint8Array(32);\n crypto.getRandomValues(buf);\n return buf.buffer;\n }\n\n credentialIdToBase64(id: ArrayBuffer): string {\n return btoa(String.fromCharCode(...new Uint8Array(id)));\n }\n}\n","import { JoopOtpService } from './otp.service';\nimport { JoopBiometricService } from './biometric.service';\nimport { JoopSubject } from '../events';\n\nexport type JoopMfaChannel = 'totp' | 'sms' | 'email' | 'biometric' | 'backup';\n\nexport interface JoopMfaChallenge {\n id: string;\n channel: JoopMfaChannel;\n destination?: string;\n expiresAt: number;\n attempts: number;\n maxAttempts: number;\n verified: boolean;\n}\n\nexport interface JoopMfaVerifyResult {\n success: boolean;\n reason?: string;\n attemptsLeft?: number;\n}\n\nexport interface JoopMfaTotpSetup {\n secret: string; // base32 secret for authenticator app\n uri: string; // otpauth:// URI for QR code\n backupCodes: string[]; // plaintext backup codes (show once)\n}\n\nconst BASE32_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n\nexport class JoopMfaService {\n private _otp = new JoopOtpService();\n private _bio = new JoopBiometricService();\n private _challenges = new Map<string, JoopMfaChallenge & { _code?: string }>();\n private _expired$ = new JoopSubject<string>();\n\n // ── TOTP ──────────────────────────────────────────────────────────────────\n\n generateTotpSecret(length = 20): string {\n const bytes = crypto.getRandomValues(new Uint8Array(length));\n let result = '';\n for (const byte of bytes) result += BASE32_CHARS[byte % 32];\n return result;\n }\n\n getTotpUri(secret: string, account: string, issuer = 'JoopApp'): string {\n const label = encodeURIComponent(`${issuer}:${account}`);\n return `otpauth://totp/${label}?secret=${secret}&issuer=${encodeURIComponent(issuer)}&algorithm=SHA1&digits=6&period=30`;\n }\n\n async setupTotp(account: string, issuer?: string): Promise<JoopMfaTotpSetup> {\n const secret = this.generateTotpSecret();\n const uri = this.getTotpUri(secret, account, issuer);\n const backupCodes = this.generateBackupCodes();\n return { secret, uri, backupCodes };\n }\n\n async verifyTotp(token: string, secret: string, window = 1): Promise<boolean> {\n return this._otp.verifyTOTP(token, secret, window);\n }\n\n // ── OTP Challenge (SMS/Email) ──────────────────────────────────────────────\n\n createChallenge(\n destination: string,\n channel: 'sms' | 'email',\n ttlMs = 5 * 60 * 1000,\n maxAttempts = 3,\n ): JoopMfaChallenge & { _code: string } {\n const code = this._otp.generateNumericOTP(6);\n const challenge = {\n id: crypto.randomUUID(),\n channel: channel as JoopMfaChannel,\n destination,\n expiresAt: Date.now() + ttlMs,\n attempts: 0,\n maxAttempts,\n verified: false,\n _code: code,\n };\n this._challenges.set(challenge.id, challenge);\n setTimeout(() => {\n if (!this._challenges.get(challenge.id)?.verified) {\n this._challenges.delete(challenge.id);\n this._expired$.next(challenge.id);\n }\n }, ttlMs);\n return challenge;\n }\n\n /** Get the OTP code for a challenge (pass to your SMS/email sendFn) */\n getChallengeOtp(challengeId: string): string | null {\n return this._challenges.get(challengeId)?._code ?? null;\n }\n\n verifyChallenge(challengeId: string, token: string): JoopMfaVerifyResult {\n const ch = this._challenges.get(challengeId);\n if (!ch) return { success: false, reason: 'challenge_not_found' };\n if (Date.now() > ch.expiresAt) { this._challenges.delete(challengeId); return { success: false, reason: 'expired' }; }\n if (ch.verified) return { success: false, reason: 'already_verified' };\n ch.attempts++;\n if (ch._code !== token) {\n const attemptsLeft = ch.maxAttempts - ch.attempts;\n if (attemptsLeft <= 0) this._challenges.delete(challengeId);\n return { success: false, reason: 'invalid_code', attemptsLeft };\n }\n ch.verified = true;\n return { success: true };\n }\n\n // ── Backup Codes ──────────────────────────────────────────────────────────\n\n generateBackupCodes(count = 10, length = 8): string[] {\n return Array.from({ length: count }, () => this._otp.generateAlphanumericOTP(length));\n }\n\n async hashBackupCodes(codes: string[]): Promise<string[]> {\n const hashed: string[] = [];\n for (const code of codes) {\n const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(code));\n hashed.push(Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, '0')).join(''));\n }\n return hashed;\n }\n\n async verifyBackupCode(\n code: string,\n hashedCodes: string[],\n ): Promise<{ valid: boolean; remaining: string[] }> {\n const hash = Array.from(\n new Uint8Array(await crypto.subtle.digest('SHA-256', new TextEncoder().encode(code))),\n ).map(b => b.toString(16).padStart(2, '0')).join('');\n const idx = hashedCodes.indexOf(hash);\n if (idx === -1) return { valid: false, remaining: hashedCodes };\n return { valid: true, remaining: hashedCodes.filter((_, i) => i !== idx) };\n }\n\n // ── Biometric ─────────────────────────────────────────────────────────────\n\n async isBiometricAvailable(): Promise<boolean> { return this._bio.isAvailable(); }\n\n async registerBiometric(userId: string, displayName?: string): Promise<PublicKeyCredential> {\n const challengeBytes = crypto.getRandomValues(new Uint8Array(32));\n return this._bio.register({\n challenge: challengeBytes.buffer as ArrayBuffer,\n rpId: window.location.hostname,\n rpName: document.title || 'JoopApp',\n userId,\n userName: userId,\n userDisplayName: displayName ?? userId,\n });\n }\n\n async verifyBiometric(credentialId: string): Promise<boolean> {\n try {\n const challengeBytes = crypto.getRandomValues(new Uint8Array(32));\n const result = await this._bio.authenticate({\n challenge: challengeBytes.buffer as ArrayBuffer,\n rpId: window.location.hostname,\n allowCredentials: [{ id: new TextEncoder().encode(credentialId), type: 'public-key' }],\n });\n return !!result;\n } catch { return false; }\n }\n\n // ── Challenge state ────────────────────────────────────────────────────────\n\n onChallengeExpired(handler: (id: string) => void): () => void {\n return this._expired$.subscribe(handler);\n }\n\n clearExpiredChallenges(): number {\n const now = Date.now();\n let removed = 0;\n for (const [id, ch] of this._challenges) {\n if (now > ch.expiresAt) { this._challenges.delete(id); removed++; }\n }\n return removed;\n }\n\n getChallenge(id: string): JoopMfaChallenge | null {\n const ch = this._challenges.get(id);\n if (!ch) return null;\n const { _code: _, ...safe } = ch;\n return safe;\n }\n}\n","import type { JoopPlatformAdapterConfig, JoopStorageAdapter } from './adapters';\n\nexport type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';\n\nexport interface JoopCapabilities {\n compression: boolean;\n workers: boolean;\n cryptoSubtle: boolean;\n persistentStorage: boolean;\n dom: boolean;\n serviceWorker: boolean;\n}\n\nexport interface JoopPlatformConfig {\n adapter?: JoopPlatformAdapterConfig;\n /** Override auto-detection — useful in tests or SSR */\n platform?: JoopPlatformType;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in storage adapters\n// ---------------------------------------------------------------------------\n\nconst _webStorage = (store: Storage): JoopStorageAdapter => ({\n getItem: (k) => store.getItem(k),\n setItem: (k, v) => store.setItem(k, v),\n removeItem: (k) => store.removeItem(k),\n clear: () => store.clear(),\n});\n\nclass _MemStorageImpl implements JoopStorageAdapter {\n private _m = new Map<string, string>();\n getItem(k: string) { return this._m.get(k) ?? null; }\n setItem(k: string, v: string) { this._m.set(k, v); }\n removeItem(k: string) { this._m.delete(k); }\n clear() { this._m.clear(); }\n}\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction _detect(): JoopPlatformType {\n // React Native sets navigator.product = 'ReactNative'\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return 'react-native';\n // Node.js: no window, has globalThis.process.versions.node\n const _proc = (globalThis as Record<string, unknown>)['process'] as { versions?: { node?: string } } | undefined;\n if (typeof window === 'undefined' && _proc?.versions?.node) return 'node';\n // Browser\n if (typeof window !== 'undefined') return 'web';\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// JoopPlatform\n// ---------------------------------------------------------------------------\n\nexport class JoopPlatform {\n private static _type: JoopPlatformType = _detect();\n private static _adapter: JoopPlatformAdapterConfig = {};\n private static _memStorage: JoopStorageAdapter | null = null;\n\n /**\n * Call once at app startup to configure adapters for your platform.\n *\n * Web (default — no call needed):\n * JoopPlatform.init();\n *\n * React Native with react-native-mmkv:\n * import { MMKV } from 'react-native-mmkv';\n * const mmkv = new MMKV();\n * JoopPlatform.init({ adapter: { storage: mmkv } });\n *\n * React Native with custom compression (fflate):\n * import { gzip, ungzip } from 'fflate';\n * JoopPlatform.init({\n * adapter: {\n * compression: {\n * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),\n * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),\n * },\n * },\n * });\n */\n static init(config: JoopPlatformConfig = {}): void {\n if (config.platform) this._type = config.platform;\n this._adapter = { ...this._adapter, ...(config.adapter ?? {}) };\n }\n\n /** Current detected or overridden platform type */\n static get type(): JoopPlatformType { return this._type; }\n\n static is(type: JoopPlatformType): boolean { return this._type === type; }\n static isMobile(): boolean { return this._type === 'react-native'; }\n static isWeb(): boolean { return this._type === 'web'; }\n static isNode(): boolean { return this._type === 'node'; }\n\n /** Raw adapter config registered via init() */\n static getAdapter(): JoopPlatformAdapterConfig { return this._adapter; }\n\n /**\n * Returns the best available storage adapter:\n * 1. Custom adapter registered via init()\n * 2. localStorage (web)\n * 3. In-memory fallback (Node / RN without adapter)\n */\n static getStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof localStorage !== 'undefined') return _webStorage(localStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /**\n * Returns the best available session-scoped storage:\n * 1. Custom adapter registered via init()\n * 2. sessionStorage (web)\n * 3. Shared in-memory fallback\n */\n static getSessionStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof sessionStorage !== 'undefined') return _webStorage(sessionStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /** What APIs are available in the current environment */\n static capabilities(): JoopCapabilities {\n return {\n compression: typeof CompressionStream !== 'undefined' || !!this._adapter.compression,\n workers: typeof Worker !== 'undefined' || !!this._adapter.worker,\n cryptoSubtle: !!(typeof globalThis !== 'undefined' && (globalThis as typeof globalThis & { crypto?: Crypto }).crypto?.subtle),\n persistentStorage: typeof localStorage !== 'undefined' || !!this._adapter.storage,\n dom: typeof document !== 'undefined',\n serviceWorker: typeof navigator !== 'undefined' && 'serviceWorker' in navigator,\n };\n }\n\n /** Reset to auto-detected defaults — useful between tests */\n static _reset(): void {\n this._type = _detect();\n this._adapter = {};\n this._memStorage = null;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\nimport { JoopPlatform } from '../platform/platform';\nimport type { JoopStorageAdapter } from '../platform/adapters';\n\nexport interface JoopOIDCConfig {\n issuer: string; // e.g. https://accounts.google.com\n clientId: string;\n redirectUri: string;\n scope?: string; // default: 'openid profile email'\n responseType?: string; // default: 'code'\n /**\n * Storage for PKCE verifier, state, and tokens.\n * Accepts any JoopStorageAdapter (localStorage, sessionStorage, MMKV, custom).\n * Default: sessionStorage on web, JoopPlatform.getSessionStorage() on other platforms.\n */\n storage?: JoopStorageAdapter;\n}\n\nexport interface JoopOIDCMetadata {\n authorizationEndpoint: string;\n tokenEndpoint: string;\n jwksUri: string;\n userInfoEndpoint?: string;\n endSessionEndpoint?: string;\n}\n\nexport interface JoopOIDCTokens {\n accessToken: string;\n idToken?: string;\n refreshToken?: string;\n expiresAt: number; // Unix ms\n tokenType: string;\n scope?: string;\n}\n\nexport interface JoopLoginOptions {\n prompt?: 'none' | 'login' | 'consent' | 'select_account';\n loginHint?: string;\n state?: string;\n nonce?: string;\n extraParams?: Record<string, string>;\n}\n\nexport class JoopOIDCClient {\n private _cfg: JoopOIDCConfig;\n private _metadata: JoopOIDCMetadata | null = null;\n private _tokens$ = new JoopBehaviorSubject<JoopOIDCTokens | null>(null);\n private _storage: JoopStorageAdapter;\n private _renewTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly _KEY = 'joop_oidc_tokens';\n private readonly _VER_KEY = 'joop_oidc_verifier';\n private readonly _STATE_KEY = 'joop_oidc_state';\n\n constructor(config: JoopOIDCConfig) {\n this._cfg = { scope: 'openid profile email', responseType: 'code', ...config };\n // Use explicit storage → sessionStorage → platform adapter (RN: MMKV or mem)\n this._storage = config.storage ?? JoopPlatform.getSessionStorage();\n const stored = this._storage.getItem(this._KEY);\n if (stored) { try { this._tokens$.next(JSON.parse(stored)); } catch {} }\n }\n\n async discover(): Promise<JoopOIDCMetadata> {\n if (this._metadata) return this._metadata;\n const url = `${this._cfg.issuer}/.well-known/openid-configuration`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`OIDC discovery failed: ${res.status}`);\n const json = await res.json();\n this._metadata = {\n authorizationEndpoint: json.authorization_endpoint,\n tokenEndpoint: json.token_endpoint,\n jwksUri: json.jwks_uri,\n userInfoEndpoint: json.userinfo_endpoint,\n endSessionEndpoint: json.end_session_endpoint,\n };\n return this._metadata;\n }\n\n async login(options: JoopLoginOptions = {}): Promise<void> {\n const meta = await this.discover();\n const { verifier, challenge } = await _generatePKCE();\n const state = options.state ?? _randomBase64(16);\n\n this._storage.setItem(this._VER_KEY, verifier);\n this._storage.setItem(this._STATE_KEY, state);\n\n const params = new URLSearchParams({\n response_type: this._cfg.responseType!,\n client_id: this._cfg.clientId,\n redirect_uri: this._cfg.redirectUri,\n scope: this._cfg.scope!,\n state,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n nonce: options.nonce ?? _randomBase64(16),\n ...(options.prompt ? { prompt: options.prompt } : {}),\n ...(options.loginHint ? { login_hint: options.loginHint } : {}),\n ...options.extraParams,\n });\n\n // Web: redirect. React Native: caller handles the URL (deep link).\n if (typeof window !== 'undefined') {\n window.location.href = `${meta.authorizationEndpoint}?${params}`;\n } else {\n // Return the URL so RN callers can open it in a browser/WebView\n return Promise.resolve() as unknown as void;\n }\n }\n\n /** Returns the authorization URL without redirecting (useful for React Native) */\n async buildLoginUrl(options: JoopLoginOptions = {}): Promise<string> {\n const meta = await this.discover();\n const { verifier, challenge } = await _generatePKCE();\n const state = options.state ?? _randomBase64(16);\n this._storage.setItem(this._VER_KEY, verifier);\n this._storage.setItem(this._STATE_KEY, state);\n const params = new URLSearchParams({\n response_type: this._cfg.responseType!,\n client_id: this._cfg.clientId,\n redirect_uri: this._cfg.redirectUri,\n scope: this._cfg.scope!,\n state,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n nonce: options.nonce ?? _randomBase64(16),\n ...(options.prompt ? { prompt: options.prompt } : {}),\n ...(options.loginHint ? { login_hint: options.loginHint } : {}),\n ...options.extraParams,\n });\n return `${meta.authorizationEndpoint}?${params}`;\n }\n\n async handleCallback(url = typeof location !== 'undefined' ? location.href : ''): Promise<JoopOIDCTokens> {\n const params = new URLSearchParams(url.split('?')[1] ?? '');\n const code = params.get('code');\n const state = params.get('state');\n const error = params.get('error');\n\n if (error) throw new Error(`OIDC error: ${error} — ${params.get('error_description') ?? ''}`);\n if (!code) throw new Error('OIDC callback: missing code');\n\n const storedState = this._storage.getItem(this._STATE_KEY);\n if (storedState && state !== storedState) throw new Error('OIDC callback: state mismatch (CSRF?)');\n const verifier = this._storage.getItem(this._VER_KEY) ?? '';\n this._storage.removeItem(this._VER_KEY);\n this._storage.removeItem(this._STATE_KEY);\n\n const meta = await this.discover();\n const res = await fetch(meta.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ grant_type: 'authorization_code', code, redirect_uri: this._cfg.redirectUri, client_id: this._cfg.clientId, code_verifier: verifier }),\n });\n if (!res.ok) throw new Error(`OIDC token exchange failed: ${await res.text()}`);\n return this._storeTokens(await res.json());\n }\n\n async refreshToken(): Promise<JoopOIDCTokens> {\n const tokens = this._tokens$.getValue();\n if (!tokens?.refreshToken) throw new Error('No refresh token available');\n const meta = await this.discover();\n const res = await fetch(meta.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ grant_type: 'refresh_token', refresh_token: tokens.refreshToken, client_id: this._cfg.clientId }),\n });\n if (!res.ok) { this.logout(); throw new Error(`Token refresh failed: ${res.status}`); }\n return this._storeTokens(await res.json());\n }\n\n async getUserInfo(): Promise<Record<string, unknown>> {\n const meta = await this.discover();\n if (!meta.userInfoEndpoint) throw new Error('No userInfo endpoint in OIDC metadata');\n const tokens = this._tokens$.getValue();\n if (!tokens) throw new Error('Not authenticated');\n const res = await fetch(meta.userInfoEndpoint, { headers: { Authorization: `Bearer ${tokens.accessToken}` } });\n if (!res.ok) throw new Error(`UserInfo failed: ${res.status}`);\n return res.json();\n }\n\n async logout(options: { redirectUri?: string } = {}): Promise<void> {\n this._tokens$.next(null);\n this._storage.removeItem(this._KEY);\n if (this._renewTimer) { clearTimeout(this._renewTimer); this._renewTimer = null; }\n if (this._metadata?.endSessionEndpoint && typeof window !== 'undefined') {\n const params = new URLSearchParams({ client_id: this._cfg.clientId, ...(options.redirectUri ? { post_logout_redirect_uri: options.redirectUri } : {}) });\n window.location.href = `${this._metadata.endSessionEndpoint}?${params}`;\n }\n }\n\n silentRenew(renewBeforeMs = 60000): void {\n const tokens = this._tokens$.getValue();\n if (!tokens?.refreshToken) return;\n const delay = Math.max(0, tokens.expiresAt - Date.now() - renewBeforeMs);\n if (this._renewTimer) clearTimeout(this._renewTimer);\n this._renewTimer = setTimeout(async () => {\n try { await this.refreshToken(); this.silentRenew(renewBeforeMs); }\n catch { this._tokens$.next(null); }\n }, delay);\n }\n\n isAuthenticated(): boolean {\n const t = this._tokens$.getValue();\n return !!t && t.expiresAt > Date.now();\n }\n\n getTokens(): JoopOIDCTokens | null { return this._tokens$.getValue(); }\n tokens$() { return this._tokens$.asObservable(); }\n\n private _storeTokens(json: Record<string, unknown>): JoopOIDCTokens {\n const tokens: JoopOIDCTokens = {\n accessToken: json.access_token as string,\n idToken: json.id_token as string | undefined,\n refreshToken: json.refresh_token as string | undefined,\n expiresAt: Date.now() + ((json.expires_in as number ?? 3600) * 1000),\n tokenType: (json.token_type as string) ?? 'Bearer',\n scope: json.scope as string | undefined,\n };\n this._tokens$.next(tokens);\n this._storage.setItem(this._KEY, JSON.stringify(tokens));\n return tokens;\n }\n}\n\nasync function _generatePKCE(): Promise<{ verifier: string; challenge: string }> {\n const verifier = _randomBase64(32);\n const hash = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));\n const challenge = btoa(String.fromCharCode(...new Uint8Array(hash)))\n .replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n return { verifier, challenge };\n}\n\nfunction _randomBase64(bytes: number): string {\n const buf = new Uint8Array(bytes);\n crypto.getRandomValues(buf);\n return btoa(String.fromCharCode(...buf)).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n","// SSO: Single Sign-On service\n// Handles external URL whitelisting, token exchange, and internal API passthrough\n\nexport interface JoopSsoConfig {\n /** Allowed external origins for SSO redirects */\n allowedOrigins: string[];\n /** Allowed internal API base URLs */\n internalBases?: string[];\n /** Token exchange endpoint */\n tokenEndpoint?: string;\n /** SSO logout URL */\n logoutUrl?: string;\n /** Store token key in sessionStorage */\n storageKey?: string;\n}\n\nexport interface JoopSsoToken {\n accessToken: string;\n refreshToken?: string;\n idToken?: string;\n expiresAt: number;\n scopes: string[];\n}\n\nexport interface JoopSsoExchangeRequest {\n code: string;\n redirectUri: string;\n codeVerifier?: string;\n}\n\nexport type JoopSsoLinkTarget = 'self' | 'blank' | 'parent';\n\nexport class JoopSsoService {\n private readonly _config: JoopSsoConfig;\n private _token: JoopSsoToken | null = null;\n private readonly _storageKey: string;\n\n constructor(config: JoopSsoConfig) {\n this._config = config;\n this._storageKey = config.storageKey ?? '__joop_sso_token';\n this._loadFromStorage();\n }\n\n // ── Token management ────────────────────────────────────────────────────────\n\n setToken(token: JoopSsoToken): void {\n this._token = token;\n sessionStorage.setItem(this._storageKey, JSON.stringify(token));\n }\n\n getToken(): JoopSsoToken | null { return this._token; }\n\n isAuthenticated(): boolean {\n return !!this._token && this._token.expiresAt > Date.now();\n }\n\n clearToken(): void {\n this._token = null;\n sessionStorage.removeItem(this._storageKey);\n }\n\n // ── Token exchange (Authorization Code → Access Token) ─────────────────────\n\n async exchange(req: JoopSsoExchangeRequest): Promise<JoopSsoToken> {\n if (!this._config.tokenEndpoint) throw new Error('JoopSso: tokenEndpoint not configured');\n const body: Record<string, string> = {\n grant_type: 'authorization_code',\n code: req.code,\n redirect_uri: req.redirectUri,\n };\n if (req.codeVerifier) body['code_verifier'] = req.codeVerifier;\n\n const res = await fetch(this._config.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams(body).toString(),\n });\n if (!res.ok) throw new Error(`JoopSso: token exchange failed (${res.status})`);\n const data = await res.json() as {\n access_token: string; refresh_token?: string; id_token?: string;\n expires_in?: number; scope?: string;\n };\n const token: JoopSsoToken = {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n idToken: data.id_token,\n expiresAt: Date.now() + (data.expires_in ?? 3600) * 1000,\n scopes: (data.scope ?? '').split(' ').filter(Boolean),\n };\n this.setToken(token);\n return token;\n }\n\n // ── Whitelist-based external link opening ───────────────────────────────────\n\n /**\n * Open an external URL only if its origin is in allowedOrigins.\n * Prevents open-redirect attacks.\n */\n openExternal(url: string, target: JoopSsoLinkTarget = 'blank'): boolean {\n if (!this._isOriginAllowed(url)) {\n console.warn(`JoopSso: blocked external link to ${url} — origin not in allowedOrigins`);\n return false;\n }\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.target = target === 'self' ? '_self' : target === 'parent' ? '_parent' : '_blank';\n anchor.rel = 'noopener noreferrer';\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n return true;\n }\n\n /** Check whether a URL's origin is whitelisted. */\n isOriginAllowed(url: string): boolean {\n return this._isOriginAllowed(url);\n }\n\n // ── Internal API passthrough ────────────────────────────────────────────────\n\n /**\n * Make an authenticated internal API call.\n * Automatically attaches the SSO bearer token.\n * Rejects if the URL does not match internalBases.\n */\n async callInternal<T = any>(url: string, init: RequestInit = {}): Promise<T> {\n if (!this._isInternalUrl(url)) {\n throw new Error(`JoopSso: URL \"${url}\" is not in internalBases`);\n }\n const token = this.getToken();\n const headers = new Headers(init.headers);\n if (token?.accessToken) headers.set('Authorization', `Bearer ${token.accessToken}`);\n const res = await fetch(url, { ...init, headers });\n if (!res.ok) throw new Error(`JoopSso: internal API error ${res.status}`);\n const text = await res.text();\n return text ? JSON.parse(text) as T : undefined as unknown as T;\n }\n\n // ── SSO Logout ──────────────────────────────────────────────────────────────\n\n logout(redirectUri?: string): void {\n this.clearToken();\n if (this._config.logoutUrl) {\n const url = redirectUri\n ? `${this._config.logoutUrl}?post_logout_redirect_uri=${encodeURIComponent(redirectUri)}`\n : this._config.logoutUrl;\n window.location.href = url;\n }\n }\n\n // ── Helpers ─────────────────────────────────────────────────────────────────\n\n private _isOriginAllowed(url: string): boolean {\n try {\n const origin = new URL(url).origin;\n return this._config.allowedOrigins.some(allowed => {\n const aOrigin = allowed.endsWith('/') ? allowed.slice(0, -1) : allowed;\n return origin === aOrigin || origin.endsWith('.' + aOrigin);\n });\n } catch { return false; }\n }\n\n private _isInternalUrl(url: string): boolean {\n if (!this._config.internalBases?.length) return true;\n return this._config.internalBases.some(base => url.startsWith(base));\n }\n\n private _loadFromStorage(): void {\n try {\n const raw = sessionStorage.getItem(this._storageKey);\n if (raw) this._token = JSON.parse(raw) as JoopSsoToken;\n } catch { /* ignore */ }\n }\n}\n"]}
|
package/dist/banking/index.js
CHANGED
|
@@ -447,6 +447,9 @@ function validateCvv(cvv, network = "unknown") {
|
|
|
447
447
|
}
|
|
448
448
|
|
|
449
449
|
// src/events/index.ts
|
|
450
|
+
var _onListenerError = (error) => {
|
|
451
|
+
console.error("[joopjs] a subject subscriber threw during emission:", error);
|
|
452
|
+
};
|
|
450
453
|
var JoopSubject = class {
|
|
451
454
|
_listeners = [];
|
|
452
455
|
subscribe(listener) {
|
|
@@ -456,8 +459,13 @@ var JoopSubject = class {
|
|
|
456
459
|
};
|
|
457
460
|
}
|
|
458
461
|
next(value) {
|
|
459
|
-
|
|
460
|
-
|
|
462
|
+
const listeners = this._listeners.slice();
|
|
463
|
+
for (const listener of listeners) {
|
|
464
|
+
try {
|
|
465
|
+
listener(value);
|
|
466
|
+
} catch (error) {
|
|
467
|
+
_onListenerError(error);
|
|
468
|
+
}
|
|
461
469
|
}
|
|
462
470
|
}
|
|
463
471
|
asObservable() {
|
|
@@ -478,7 +486,11 @@ var JoopBehaviorSubject = class extends JoopSubject {
|
|
|
478
486
|
super.next(value);
|
|
479
487
|
}
|
|
480
488
|
subscribe(listener) {
|
|
481
|
-
|
|
489
|
+
try {
|
|
490
|
+
listener(this._value);
|
|
491
|
+
} catch (error) {
|
|
492
|
+
_onListenerError(error);
|
|
493
|
+
}
|
|
482
494
|
return super.subscribe(listener);
|
|
483
495
|
}
|
|
484
496
|
asObservable() {
|