@keycloakify/angular 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/account/DefaultPage/DefaultPage.d.ts +2 -30
  2. package/esm2022/account/containers/template/template.component.mjs +6 -6
  3. package/esm2022/account/directives/kc-class/kc-class.directive.mjs +3 -3
  4. package/esm2022/account/pages/account/account.component.mjs +3 -3
  5. package/esm2022/account/pages/applications/applications.component.mjs +3 -3
  6. package/esm2022/account/pages/federatedIdentity/federatedIdentity.component.mjs +3 -3
  7. package/esm2022/account/pages/log/log.component.mjs +3 -3
  8. package/esm2022/account/pages/password/password.component.mjs +3 -3
  9. package/esm2022/account/pages/sessions/sessions.component.mjs +3 -3
  10. package/esm2022/account/pages/totp/totp.component.mjs +3 -3
  11. package/esm2022/account/services/account-resource-injector/account-resource-injector.service.mjs +3 -3
  12. package/esm2022/account/services/i18n/i18n.service.mjs +3 -3
  13. package/esm2022/lib/directives/attributes/attributes.directive.mjs +3 -3
  14. package/esm2022/lib/pipes/input-type/input-type.pipe.mjs +3 -3
  15. package/esm2022/lib/pipes/is-array-with-empty-object/is-array-with-empty-object.pipe.mjs +3 -3
  16. package/esm2022/lib/pipes/kc-sanitize/kc-sanitize.pipe.mjs +3 -3
  17. package/esm2022/lib/pipes/to-array/to-array.pipe.mjs +3 -3
  18. package/esm2022/lib/pipes/to-number/to-number.pipe.mjs +3 -3
  19. package/esm2022/lib/services/resource-injector/resource-injector.service.mjs +3 -3
  20. package/esm2022/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.mjs +7 -53
  21. package/esm2022/login/components/field-errors/field-errors.component.mjs +3 -3
  22. package/esm2022/login/components/group-label/group-label.component.mjs +3 -3
  23. package/esm2022/login/components/input-field-by-type/input-field-by-type.component.mjs +3 -3
  24. package/esm2022/login/components/input-tag/input-tag.component.mjs +3 -3
  25. package/esm2022/login/components/input-tag-selects/input-tag-selects.component.mjs +3 -3
  26. package/esm2022/login/components/logout-other-sessions/logout-other-sessions.component.mjs +3 -3
  27. package/esm2022/login/components/password-wrapper/password-wrapper.component.mjs +3 -3
  28. package/esm2022/login/components/select-tag/select-tag.component.mjs +3 -3
  29. package/esm2022/login/components/textarea-tag/textarea-tag.component.mjs +3 -3
  30. package/esm2022/login/components/user-profile-form-fields/user-profile-form-fields.component.mjs +15 -22
  31. package/esm2022/login/containers/template/template.component.mjs +6 -6
  32. package/esm2022/login/directives/kc-class/kc-class.directive.mjs +3 -3
  33. package/esm2022/login/pages/code/code.component.mjs +3 -3
  34. package/esm2022/login/pages/delete-account-confirm/delete-account-confirm.component.mjs +3 -3
  35. package/esm2022/login/pages/delete-credential/delete-credential.component.mjs +3 -3
  36. package/esm2022/login/pages/error/error.component.mjs +3 -3
  37. package/esm2022/login/pages/frontchannel-logout/frontchannel-logout.component.mjs +3 -3
  38. package/esm2022/login/pages/idp-review-user-profile/idp-review-user-profile.component.mjs +13 -15
  39. package/esm2022/login/pages/info/info.component.mjs +3 -3
  40. package/esm2022/login/pages/login/login.component.mjs +3 -3
  41. package/esm2022/login/pages/login-config-totp/login-config-totp.component.mjs +3 -3
  42. package/esm2022/login/pages/login-idp-link-confirm/login-idp-link-confirm.component.mjs +3 -3
  43. package/esm2022/login/pages/login-idp-link-confirm-override/login-idp-link-confirm-override.component.mjs +3 -3
  44. package/esm2022/login/pages/login-idp-link-email/login-idp-link-email.component.mjs +3 -3
  45. package/esm2022/login/pages/login-oauth-grant/login-oauth-grant.component.mjs +3 -3
  46. package/esm2022/login/pages/login-oauth2-device-verify-user-code/login-oauth2-device-verify-user-code.component.mjs +3 -3
  47. package/esm2022/login/pages/login-otp/login-otp.component.mjs +3 -3
  48. package/esm2022/login/pages/login-page-expired/login-page-expired.component.mjs +3 -3
  49. package/esm2022/login/pages/login-passkeys-conditional-authenticate/login-passkeys-conditional-authenticate.component.mjs +3 -3
  50. package/esm2022/login/pages/login-password/login-password.component.mjs +3 -3
  51. package/esm2022/login/pages/login-recovery-authn-code-config/login-recovery-authn-code-config.component.mjs +3 -3
  52. package/esm2022/login/pages/login-recovery-authn-code-input/login-recovery-authn-code-input.component.mjs +3 -3
  53. package/esm2022/login/pages/login-reset-otp/login-reset-otp.component.mjs +3 -3
  54. package/esm2022/login/pages/login-reset-password/login-reset-password.component.mjs +3 -3
  55. package/esm2022/login/pages/login-update-password/login-update-password.component.mjs +3 -3
  56. package/esm2022/login/pages/login-update-profile/login-update-profile.component.mjs +13 -15
  57. package/esm2022/login/pages/login-username/login-username.component.mjs +3 -3
  58. package/esm2022/login/pages/login-verify-email/login-verify-email.component.mjs +3 -3
  59. package/esm2022/login/pages/login-x509-info/login-x509-info.component.mjs +3 -3
  60. package/esm2022/login/pages/logout-confirm/logout-confirm.component.mjs +3 -3
  61. package/esm2022/login/pages/register/register.component.mjs +14 -16
  62. package/esm2022/login/pages/saml-post-form/saml-post-form.component.mjs +3 -3
  63. package/esm2022/login/pages/select-authenticator/select-authenticator.component.mjs +3 -3
  64. package/esm2022/login/pages/terms/terms.component.mjs +3 -3
  65. package/esm2022/login/pages/update-email/update-email.component.mjs +13 -15
  66. package/esm2022/login/pages/webauthn-authenticate/webauthn-authenticate.component.mjs +3 -3
  67. package/esm2022/login/pages/webauthn-error/webauthn-error.component.mjs +3 -3
  68. package/esm2022/login/pages/webauthn-register/webauthn-register.component.mjs +3 -3
  69. package/esm2022/login/services/i18n/i18n.service.mjs +3 -3
  70. package/esm2022/login/services/login-resource-injector/login-resource-injector.service.mjs +3 -3
  71. package/esm2022/login/services/user-profile-form/user-profile-form.service.mjs +56 -1004
  72. package/fesm2022/keycloakify-angular-account-containers-template.mjs +6 -6
  73. package/fesm2022/keycloakify-angular-account-directives-kc-class.mjs +3 -3
  74. package/fesm2022/keycloakify-angular-account-pages-account.mjs +3 -3
  75. package/fesm2022/keycloakify-angular-account-pages-applications.mjs +3 -3
  76. package/fesm2022/keycloakify-angular-account-pages-federatedIdentity.mjs +3 -3
  77. package/fesm2022/keycloakify-angular-account-pages-log.mjs +3 -3
  78. package/fesm2022/keycloakify-angular-account-pages-password.mjs +3 -3
  79. package/fesm2022/keycloakify-angular-account-pages-sessions.mjs +3 -3
  80. package/fesm2022/keycloakify-angular-account-pages-totp.mjs +3 -3
  81. package/fesm2022/keycloakify-angular-account-services-account-resource-injector.mjs +3 -3
  82. package/fesm2022/keycloakify-angular-account-services-i18n.mjs +3 -3
  83. package/fesm2022/keycloakify-angular-lib-directives-attributes.mjs +3 -3
  84. package/fesm2022/keycloakify-angular-lib-pipes-input-type.mjs +3 -3
  85. package/fesm2022/keycloakify-angular-lib-pipes-is-array-with-empty-object.mjs +3 -3
  86. package/fesm2022/keycloakify-angular-lib-pipes-kc-sanitize.mjs +3 -3
  87. package/fesm2022/keycloakify-angular-lib-pipes-to-array.mjs +3 -3
  88. package/fesm2022/keycloakify-angular-lib-pipes-to-number.mjs +3 -3
  89. package/fesm2022/keycloakify-angular-lib-services-resource-injector.mjs +3 -3
  90. package/fesm2022/keycloakify-angular-login-components-add-remove-buttons-multi-valued-attribute.mjs +6 -52
  91. package/fesm2022/keycloakify-angular-login-components-add-remove-buttons-multi-valued-attribute.mjs.map +1 -1
  92. package/fesm2022/keycloakify-angular-login-components-field-errors.mjs +3 -3
  93. package/fesm2022/keycloakify-angular-login-components-group-label.mjs +3 -3
  94. package/fesm2022/keycloakify-angular-login-components-input-field-by-type.mjs +3 -3
  95. package/fesm2022/keycloakify-angular-login-components-input-tag-selects.mjs +3 -3
  96. package/fesm2022/keycloakify-angular-login-components-input-tag.mjs +3 -3
  97. package/fesm2022/keycloakify-angular-login-components-logout-other-sessions.mjs +3 -3
  98. package/fesm2022/keycloakify-angular-login-components-password-wrapper.mjs +3 -3
  99. package/fesm2022/keycloakify-angular-login-components-select-tag.mjs +3 -3
  100. package/fesm2022/keycloakify-angular-login-components-textarea-tag.mjs +3 -3
  101. package/fesm2022/keycloakify-angular-login-components-user-profile-form-fields.mjs +14 -21
  102. package/fesm2022/keycloakify-angular-login-components-user-profile-form-fields.mjs.map +1 -1
  103. package/fesm2022/keycloakify-angular-login-containers-template.mjs +6 -6
  104. package/fesm2022/keycloakify-angular-login-directives-kc-class.mjs +3 -3
  105. package/fesm2022/keycloakify-angular-login-pages-code.mjs +3 -3
  106. package/fesm2022/keycloakify-angular-login-pages-delete-account-confirm.mjs +3 -3
  107. package/fesm2022/keycloakify-angular-login-pages-delete-credential.mjs +3 -3
  108. package/fesm2022/keycloakify-angular-login-pages-error.mjs +3 -3
  109. package/fesm2022/keycloakify-angular-login-pages-frontchannel-logout.mjs +3 -3
  110. package/fesm2022/keycloakify-angular-login-pages-idp-review-user-profile.mjs +12 -14
  111. package/fesm2022/keycloakify-angular-login-pages-idp-review-user-profile.mjs.map +1 -1
  112. package/fesm2022/keycloakify-angular-login-pages-info.mjs +3 -3
  113. package/fesm2022/keycloakify-angular-login-pages-login-config-totp.mjs +3 -3
  114. package/fesm2022/keycloakify-angular-login-pages-login-idp-link-confirm-override.mjs +3 -3
  115. package/fesm2022/keycloakify-angular-login-pages-login-idp-link-confirm.mjs +3 -3
  116. package/fesm2022/keycloakify-angular-login-pages-login-idp-link-email.mjs +3 -3
  117. package/fesm2022/keycloakify-angular-login-pages-login-oauth-grant.mjs +3 -3
  118. package/fesm2022/keycloakify-angular-login-pages-login-oauth2-device-verify-user-code.mjs +3 -3
  119. package/fesm2022/keycloakify-angular-login-pages-login-otp.mjs +3 -3
  120. package/fesm2022/keycloakify-angular-login-pages-login-page-expired.mjs +3 -3
  121. package/fesm2022/keycloakify-angular-login-pages-login-passkeys-conditional-authenticate.mjs +3 -3
  122. package/fesm2022/keycloakify-angular-login-pages-login-password.mjs +3 -3
  123. package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-config.mjs +3 -3
  124. package/fesm2022/keycloakify-angular-login-pages-login-recovery-authn-code-input.mjs +3 -3
  125. package/fesm2022/keycloakify-angular-login-pages-login-reset-otp.mjs +3 -3
  126. package/fesm2022/keycloakify-angular-login-pages-login-reset-password.mjs +3 -3
  127. package/fesm2022/keycloakify-angular-login-pages-login-update-password.mjs +3 -3
  128. package/fesm2022/keycloakify-angular-login-pages-login-update-profile.mjs +12 -14
  129. package/fesm2022/keycloakify-angular-login-pages-login-update-profile.mjs.map +1 -1
  130. package/fesm2022/keycloakify-angular-login-pages-login-username.mjs +3 -3
  131. package/fesm2022/keycloakify-angular-login-pages-login-verify-email.mjs +3 -3
  132. package/fesm2022/keycloakify-angular-login-pages-login-x509-info.mjs +3 -3
  133. package/fesm2022/keycloakify-angular-login-pages-login.mjs +3 -3
  134. package/fesm2022/keycloakify-angular-login-pages-logout-confirm.mjs +3 -3
  135. package/fesm2022/keycloakify-angular-login-pages-register.mjs +13 -15
  136. package/fesm2022/keycloakify-angular-login-pages-register.mjs.map +1 -1
  137. package/fesm2022/keycloakify-angular-login-pages-saml-post-form.mjs +3 -3
  138. package/fesm2022/keycloakify-angular-login-pages-select-authenticator.mjs +3 -3
  139. package/fesm2022/keycloakify-angular-login-pages-terms.mjs +3 -3
  140. package/fesm2022/keycloakify-angular-login-pages-update-email.mjs +12 -14
  141. package/fesm2022/keycloakify-angular-login-pages-update-email.mjs.map +1 -1
  142. package/fesm2022/keycloakify-angular-login-pages-webauthn-authenticate.mjs +3 -3
  143. package/fesm2022/keycloakify-angular-login-pages-webauthn-error.mjs +3 -3
  144. package/fesm2022/keycloakify-angular-login-pages-webauthn-register.mjs +3 -3
  145. package/fesm2022/keycloakify-angular-login-services-i18n.mjs +3 -3
  146. package/fesm2022/keycloakify-angular-login-services-login-resource-injector.mjs +3 -3
  147. package/fesm2022/keycloakify-angular-login-services-user-profile-form.mjs +55 -1003
  148. package/fesm2022/keycloakify-angular-login-services-user-profile-form.mjs.map +1 -1
  149. package/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.d.ts +0 -1
  150. package/login/components/user-profile-form-fields/user-profile-form-fields.component.d.ts +3 -13
  151. package/login/pages/idp-review-user-profile/idp-review-user-profile.component.d.ts +1 -2
  152. package/login/pages/login-update-profile/login-update-profile.component.d.ts +1 -2
  153. package/login/pages/register/register.component.d.ts +1 -2
  154. package/login/pages/update-email/update-email.component.d.ts +1 -2
  155. package/login/services/user-profile-form/user-profile-form.service.d.ts +20 -41
  156. package/package.json +2 -8
  157. package/src/login/components/add-remove-buttons-multi-valued-attribute/add-remove-buttons-multi-valued-attribute.component.ts +3 -69
  158. package/src/login/components/user-profile-form-fields/user-profile-form-fields.component.html +71 -68
  159. package/src/login/components/user-profile-form-fields/user-profile-form-fields.component.ts +6 -21
  160. package/src/login/pages/idp-review-user-profile/idp-review-user-profile.component.ts +6 -13
  161. package/src/login/pages/login-update-profile/login-update-profile.component.ts +6 -12
  162. package/src/login/pages/register/register.component.html +1 -4
  163. package/src/login/pages/register/register.component.ts +5 -10
  164. package/src/login/pages/update-email/update-email.component.ts +6 -12
  165. package/src/login/services/user-profile-form/user-profile-form.service.ts +103 -1433
  166. package/esm2022/login/services/submit/keycloakify-angular-login-services-submit.mjs +0 -5
  167. package/esm2022/login/services/submit/public-api.mjs +0 -2
  168. package/esm2022/login/services/submit/submit.service.mjs +0 -20
  169. package/fesm2022/keycloakify-angular-login-services-submit.mjs +0 -27
  170. package/fesm2022/keycloakify-angular-login-services-submit.mjs.map +0 -1
  171. package/login/services/submit/index.d.ts +0 -5
  172. package/login/services/submit/public-api.d.ts +0 -1
  173. package/login/services/submit/submit.service.d.ts +0 -9
  174. package/src/login/services/submit/index.ts +0 -1
  175. package/src/login/services/submit/submit.service.ts +0 -12
@@ -1 +1 @@
1
- {"version":3,"file":"keycloakify-angular-login-services-user-profile-form.mjs","sources":["../../src/login/services/user-profile-form/user-profile-form.service.ts","../../src/login/services/user-profile-form/keycloakify-angular-login-services-user-profile-form.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/ban-ts-comment */\n\nimport {\n computed,\n inject,\n Injectable,\n signal,\n Signal,\n WritableSignal\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport type { KcContext } from '@keycloakify/angular/login/KcContext';\nimport type { I18n } from '@keycloakify/angular/login/i18n';\nimport { LoginResourceInjectorService } from '@keycloakify/angular/login/services/login-resource-injector';\nimport { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';\nimport { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';\nimport { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens/make-user-confirm-password';\nimport {\n type Attribute,\n type PasswordPolicies,\n type Validators\n} from 'keycloakify/login/KcContext';\nimport type {\n KcContextLike as KcContextLike_i18n,\n MessageKey_defaultSet\n} from 'keycloakify/login/i18n/noJsx';\nimport { emailRegexp } from 'keycloakify/tools/emailRegExp';\nimport { formatNumber } from 'keycloakify/tools/formatNumber';\nimport { structuredCloneButFunctions } from 'keycloakify/tools/structuredCloneButFunctions';\nimport { assert, id } from 'tsafe';\n\ntype KcContextLike_useGetErrors = KcContextLike_i18n & {\n messagesPerField: Pick<KcContext['messagesPerField'], 'existsError' | 'get'>;\n passwordPolicies?: PasswordPolicies;\n};\nexport namespace FormFieldError {\n export type Source =\n | Source.Validator\n | Source.PasswordPolicy\n | Source.Server\n | Source.Other;\n\n export namespace Source {\n export type Validator = {\n type: 'validator';\n name: keyof Validators;\n };\n export type PasswordPolicy = {\n type: 'passwordPolicy';\n name: keyof PasswordPolicies;\n };\n export type Server = {\n type: 'server';\n };\n\n export type Other = {\n type: 'other';\n rule: 'passwordConfirmMatchesPassword' | 'requiredField';\n };\n }\n}\n\nexport type KcContextLike = KcContextLike_i18n &\n KcContextLike_useGetErrors & {\n profile: {\n attributesByName: Record<string, Attribute>;\n html5DataAnnotations?: Record<string, string>;\n };\n passwordRequired?: boolean;\n realm: { registrationEmailAsUsername: boolean };\n url: {\n resourcesPath: string;\n };\n };\nexport type FormFieldError = {\n errorMessage: SafeHtml; // this was jsx, be carefull\n errorMessageStr: string;\n source: FormFieldError.Source;\n fieldIndex: number | undefined;\n};\nnamespace internal {\n export type FormFieldState = {\n attribute: Attribute;\n errors: FormFieldError[];\n hasLostFocusAtLeastOnce: boolean | boolean[];\n valueOrValues: string | string[];\n };\n\n export type State = {\n formFieldStates: FormFieldState[];\n };\n}\ntype FormFieldState = {\n attribute: Attribute;\n displayableErrors: FormFieldError[];\n valueOrValues: string | string[];\n};\ntype FormState = {\n isFormSubmittable: boolean;\n formFieldStates: FormFieldState[];\n};\nexport type FormAction =\n | {\n action: 'update';\n name: string;\n valueOrValues: string | string[];\n /** Default false */\n displayErrorsImmediately?: boolean;\n }\n | {\n action: 'focus lost';\n name: string;\n fieldIndex: number | undefined;\n };\n\n@Injectable({ providedIn: 'root' })\nexport class UserProfileFormService {\n private kcContext: KcContextLike =\n inject<Extract<KcContext, { pageId: 'register.ftl' }>>(KC_LOGIN_CONTEXT);\n private i18n = inject<I18n>(LOGIN_I18N);\n private doMakeUserConfirmPassword = inject(DO_MAKE_USER_CONFIRM_PASSWORD);\n private loginResourceInjectorService = inject(LoginResourceInjectorService);\n private sanitizer: DomSanitizer = inject(DomSanitizer);\n private initialState: internal.State = (() => {\n const attributes: Attribute[] = (() => {\n mock_user_profile_attributes_for_older_keycloak_versions: {\n if (\n 'profile' in this.kcContext &&\n 'attributesByName' in this.kcContext.profile &&\n Object.keys(this.kcContext.profile.attributesByName).length !== 0\n ) {\n break mock_user_profile_attributes_for_older_keycloak_versions;\n }\n\n if (\n 'register' in this.kcContext &&\n this.kcContext.register instanceof Object &&\n 'formData' in this.kcContext.register\n ) {\n //NOTE: Handle legacy register.ftl page\n return (['firstName', 'lastName', 'email', 'username'] as const)\n .filter(name =>\n name !== 'username'\n ? true\n : !this.kcContext.realm.registrationEmailAsUsername\n )\n .map(name =>\n id<Attribute>({\n name: name,\n displayName: id<`\\${${MessageKey_defaultSet}}`>(\n `\\${${name}}`\n ),\n required: true,\n value:\n (this.kcContext as any).register.formData[name] ?? '',\n html5DataAnnotations: {},\n readOnly: false,\n validators: {},\n annotations: {},\n autocomplete: (() => {\n switch (name) {\n case 'email':\n return 'email';\n case 'username':\n return 'username';\n default:\n return undefined;\n }\n })()\n })\n );\n }\n\n if ('user' in this.kcContext && this.kcContext.user instanceof Object) {\n //NOTE: Handle legacy login-update-profile.ftl\n return (['username', 'email', 'firstName', 'lastName'] as const)\n .filter(name =>\n name !== 'username'\n ? true\n : (this.kcContext as any).user.editUsernameAllowed\n )\n .map(name =>\n id<Attribute>({\n name: name,\n displayName: id<`\\${${MessageKey_defaultSet}}`>(\n `\\${${name}}`\n ),\n required: true,\n value: (this.kcContext as any).user[name] ?? '',\n html5DataAnnotations: {},\n readOnly: false,\n validators: {},\n annotations: {},\n autocomplete: (() => {\n switch (name) {\n case 'email':\n return 'email';\n case 'username':\n return 'username';\n default:\n return undefined;\n }\n })()\n })\n );\n }\n\n if ('email' in this.kcContext && this.kcContext.email instanceof Object) {\n //NOTE: Handle legacy update-email.ftl\n return [\n id<Attribute>({\n name: 'email',\n displayName: id<`\\${${MessageKey_defaultSet}}`>(`\\${email}`),\n required: true,\n value: (this.kcContext.email as any).value ?? '',\n html5DataAnnotations: {},\n readOnly: false,\n validators: {},\n annotations: {},\n autocomplete: 'email'\n })\n ];\n }\n\n assert(false, 'Unable to mock user profile from the current kcContext');\n }\n\n return Object.values(this.kcContext.profile.attributesByName).map(\n structuredCloneButFunctions\n );\n })();\n // Retro-compatibility and consistency patches\n attributes.forEach(attribute => {\n patch_legacy_group: {\n if (typeof attribute.group !== 'string') {\n break patch_legacy_group;\n }\n\n const {\n group,\n groupDisplayHeader,\n groupDisplayDescription,\n groupAnnotations\n } = attribute as Attribute & {\n group: string;\n groupDisplayHeader?: string;\n groupDisplayDescription?: string;\n groupAnnotations: Record<string, string>;\n };\n\n delete attribute.group;\n // @ts-expect-error\n delete attribute.groupDisplayHeader;\n // @ts-expect-error\n delete attribute.groupDisplayDescription;\n // @ts-expect-error\n delete attribute.groupAnnotations;\n\n if (group === '') {\n break patch_legacy_group;\n }\n\n attribute.group = {\n name: group,\n displayHeader: groupDisplayHeader,\n displayDescription: groupDisplayDescription,\n annotations: groupAnnotations,\n html5DataAnnotations: {}\n };\n }\n\n // Attributes with options rendered by default as select inputs\n if (\n attribute.validators.options !== undefined &&\n attribute.annotations.inputType === undefined\n ) {\n attribute.annotations.inputType = 'select';\n }\n\n // Consistency patch on values/value property\n {\n if (this.getIsMultivaluedSingleField({ attribute })) {\n attribute.multivalued = true;\n }\n\n if (attribute.multivalued) {\n attribute.values ??=\n attribute.value !== undefined ? [attribute.value] : [];\n delete attribute.value;\n } else {\n attribute.value ??= attribute.values?.[0];\n delete attribute.values;\n }\n }\n });\n add_password_and_password_confirm: {\n if (!this.kcContext.passwordRequired) {\n break add_password_and_password_confirm;\n }\n\n attributes.forEach((attribute, i) => {\n if (\n attribute.name !==\n (this.kcContext.realm.registrationEmailAsUsername\n ? 'email'\n : 'username')\n ) {\n // NOTE: We want to add password and password-confirm after the field that identifies the user.\n // It's either email or username.\n return;\n }\n\n attributes.splice(\n i + 1,\n 0,\n {\n name: 'password',\n displayName: id<`\\${${MessageKey_defaultSet}}`>('${password}'),\n required: true,\n readOnly: false,\n validators: {},\n annotations: {},\n autocomplete: 'new-password',\n html5DataAnnotations: {}\n },\n {\n name: 'password-confirm',\n displayName:\n id<`\\${${MessageKey_defaultSet}}`>('${passwordConfirm}'),\n required: true,\n readOnly: false,\n validators: {},\n annotations: {},\n html5DataAnnotations: {},\n autocomplete: 'new-password'\n }\n );\n });\n }\n const initialFormFieldState: {\n attribute: Attribute;\n valueOrValues: string | string[];\n }[] = [];\n\n for (const attribute of attributes) {\n handle_multi_valued_attribute: {\n if (!attribute.multivalued) {\n break handle_multi_valued_attribute;\n }\n\n const values = attribute.values?.length ? attribute.values : [''];\n\n apply_validator_min_range: {\n if (this.getIsMultivaluedSingleField({ attribute })) {\n break apply_validator_min_range;\n }\n\n const validator = attribute.validators.multivalued;\n\n if (validator === undefined) {\n break apply_validator_min_range;\n }\n\n const { min: minStr } = validator;\n\n if (!minStr) {\n break apply_validator_min_range;\n }\n\n const min = parseInt(`${minStr}`);\n\n for (let index = values.length; index < min; index++) {\n values.push('');\n }\n }\n\n initialFormFieldState.push({\n attribute,\n valueOrValues: values\n });\n\n continue;\n }\n\n initialFormFieldState.push({\n attribute,\n valueOrValues: attribute.value ?? ''\n });\n }\n\n const initialState: internal.State = {\n formFieldStates: initialFormFieldState.map(\n ({ attribute, valueOrValues }) => ({\n attribute,\n errors: this.getErrors({\n attributeName: attribute.name,\n formFieldStates: initialFormFieldState\n }),\n hasLostFocusAtLeastOnce:\n valueOrValues instanceof Array &&\n !this.getIsMultivaluedSingleField({ attribute })\n ? valueOrValues.map(() => false)\n : false,\n valueOrValues: valueOrValues\n })\n )\n };\n return initialState;\n })();\n\n private state: WritableSignal<internal.State> = signal(this.initialState);\n\n formState: Signal<FormState> = computed(() => {\n const state: internal.State = this.state();\n return {\n formFieldStates: state.formFieldStates.map(\n ({\n errors,\n hasLostFocusAtLeastOnce: hasLostFocusAtLeastOnceOrArr,\n attribute,\n ...valueOrValuesWrap\n }) => ({\n displayableErrors: errors.filter(error => {\n const hasLostFocusAtLeastOnce =\n typeof hasLostFocusAtLeastOnceOrArr === 'boolean'\n ? hasLostFocusAtLeastOnceOrArr\n : error.fieldIndex !== undefined\n ? hasLostFocusAtLeastOnceOrArr[error.fieldIndex]\n : hasLostFocusAtLeastOnceOrArr[\n hasLostFocusAtLeastOnceOrArr.length - 1\n ];\n let value = false;\n switch (error.source.type) {\n case 'server':\n value = true;\n break;\n case 'other':\n switch (error.source.rule) {\n case 'requiredField':\n value = hasLostFocusAtLeastOnce;\n break;\n case 'passwordConfirmMatchesPassword':\n value = hasLostFocusAtLeastOnce;\n break;\n }\n // assert<Equals<typeof error.source.rule, never>>(false);\n break;\n case 'passwordPolicy':\n switch (error.source.name) {\n case 'length':\n value = hasLostFocusAtLeastOnce;\n break;\n case 'digits':\n value = hasLostFocusAtLeastOnce;\n break;\n case 'lowerCase':\n value = hasLostFocusAtLeastOnce;\n break;\n case 'upperCase':\n value = hasLostFocusAtLeastOnce;\n break;\n case 'specialChars':\n value = hasLostFocusAtLeastOnce;\n break;\n case 'notUsername':\n value = true;\n break;\n case 'notEmail':\n value = true;\n break;\n }\n // assert<Equals<typeof error.source, never>>(false);\n break;\n case 'validator':\n switch (error.source.name) {\n case 'length':\n value = hasLostFocusAtLeastOnce;\n break;\n case 'pattern':\n value = hasLostFocusAtLeastOnce;\n break;\n case 'email':\n value = hasLostFocusAtLeastOnce;\n break;\n case 'integer':\n value = hasLostFocusAtLeastOnce;\n break;\n case 'multivalued':\n value = hasLostFocusAtLeastOnce;\n break;\n case 'options':\n value = hasLostFocusAtLeastOnce;\n break;\n }\n // assert<Equals<typeof error.source, never>>(false);\n break;\n }\n return value;\n }),\n attribute,\n ...valueOrValuesWrap\n })\n ),\n isFormSubmittable: state.formFieldStates.every(\n ({ errors }) => errors.length === 0\n )\n };\n });\n\n constructor() {\n this.loginResourceInjectorService.insertAdditionalScripts(\n Object.keys(this.kcContext.profile?.html5DataAnnotations ?? {})\n .filter(key => key !== 'kcMultivalued' && key !== 'kcNumberFormat') // NOTE: Keycloakify handles it.\n .map(key => ({\n type: 'module',\n src: `${this.kcContext.url.resourcesPath}/js/${key}.js`,\n id: `${this.kcContext.url.resourcesPath}/js/${key}.js`\n }))\n );\n }\n\n public dispatchFormAction(formAction: FormAction) {\n if (!formAction) return;\n const state = this.state();\n const formFieldState = state.formFieldStates.find(\n ({ attribute }) => attribute.name === formAction.name\n );\n assert(formFieldState !== undefined);\n switch (formAction.action) {\n case 'update':\n formFieldState.valueOrValues = formAction.valueOrValues;\n\n apply_formatters: {\n const { attribute } = formFieldState;\n\n const { kcNumberFormat } = attribute.html5DataAnnotations ?? {};\n\n if (!kcNumberFormat) {\n break apply_formatters;\n }\n\n if (formFieldState.valueOrValues instanceof Array) {\n formFieldState.valueOrValues = formFieldState.valueOrValues.map(\n value => formatNumber(value, kcNumberFormat)\n );\n } else {\n formFieldState.valueOrValues = formatNumber(\n formFieldState.valueOrValues,\n kcNumberFormat\n );\n }\n }\n\n formFieldState.errors = this.getErrors({\n attributeName: formAction.name,\n formFieldStates: state.formFieldStates\n });\n\n simulate_focus_lost: {\n const { displayErrorsImmediately = false } = formAction;\n\n if (!displayErrorsImmediately) {\n break simulate_focus_lost;\n }\n\n for (const fieldIndex of formAction.valueOrValues instanceof Array\n ? formAction.valueOrValues.map((...[, index]) => index)\n : [undefined]) {\n this.dispatchFormAction({\n action: 'focus lost',\n name: formAction.name,\n fieldIndex\n });\n }\n }\n\n update_password_confirm: {\n if (this.doMakeUserConfirmPassword) {\n break update_password_confirm;\n }\n\n if (formAction.name !== 'password') {\n break update_password_confirm;\n }\n\n this.dispatchFormAction({\n action: 'update',\n name: 'password-confirm',\n valueOrValues: formAction.valueOrValues,\n displayErrorsImmediately: formAction.displayErrorsImmediately\n });\n }\n\n trigger_password_confirm_validation_on_password_change: {\n if (!this.doMakeUserConfirmPassword) {\n break trigger_password_confirm_validation_on_password_change;\n }\n\n if (formAction.name !== 'password') {\n break trigger_password_confirm_validation_on_password_change;\n }\n\n this.dispatchFormAction({\n action: 'update',\n name: 'password-confirm',\n valueOrValues: (() => {\n const formFieldState = state.formFieldStates.find(\n ({ attribute }) => attribute.name === 'password-confirm'\n );\n\n assert(formFieldState !== undefined);\n\n return formFieldState.valueOrValues;\n })(),\n displayErrorsImmediately: formAction.displayErrorsImmediately\n });\n }\n\n break;\n case 'focus lost':\n if (formFieldState.hasLostFocusAtLeastOnce instanceof Array) {\n const { fieldIndex } = formAction;\n assert(fieldIndex !== undefined);\n formFieldState.hasLostFocusAtLeastOnce[fieldIndex] = true;\n break;\n }\n\n formFieldState.hasLostFocusAtLeastOnce = true;\n break;\n }\n this.state.update(state => ({\n ...state,\n formFieldStates: state.formFieldStates.map(f => {\n if (f.attribute === formFieldState.attribute) return formFieldState;\n return f;\n })\n }));\n }\n\n private getIsMultivaluedSingleField(params: { attribute: Attribute }) {\n const { attribute } = params;\n\n return attribute.annotations.inputType?.startsWith('multiselect') ?? false;\n }\n\n private getErrors(params: {\n attributeName: string;\n formFieldStates: {\n attribute: Attribute;\n valueOrValues: string | string[];\n }[];\n }): FormFieldError[] {\n const { messagesPerField, passwordPolicies } = this.kcContext;\n\n const { msgStr, advancedMsgStr } = this.i18n;\n const { attributeName, formFieldStates } = params;\n\n const formFieldState = formFieldStates.find(\n ({ attribute }) => attribute.name === attributeName\n );\n\n assert(formFieldState !== undefined);\n\n const { attribute } = formFieldState;\n\n const valueOrValues = (() => {\n let { valueOrValues } = formFieldState;\n\n unFormat_number: {\n const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {};\n\n if (!kcNumberUnFormat) {\n break unFormat_number;\n }\n\n if (valueOrValues instanceof Array) {\n valueOrValues = valueOrValues.map(value =>\n formatNumber(value, kcNumberUnFormat)\n );\n } else {\n valueOrValues = formatNumber(valueOrValues, kcNumberUnFormat);\n }\n }\n\n return valueOrValues;\n })();\n\n assert(attribute !== undefined);\n\n server_side_error: {\n if (attribute.multivalued) {\n const defaultValues = attribute.values?.length ? attribute.values : [''];\n\n assert(valueOrValues instanceof Array);\n\n const values = valueOrValues;\n\n if (\n JSON.stringify(defaultValues) !==\n JSON.stringify(values.slice(0, defaultValues.length))\n ) {\n break server_side_error;\n }\n } else {\n const defaultValue = attribute.value ?? '';\n\n assert(typeof valueOrValues === 'string');\n\n const value = valueOrValues;\n\n if (defaultValue !== value) {\n break server_side_error;\n }\n }\n\n let doesErrorExist: boolean;\n\n try {\n doesErrorExist = messagesPerField.existsError(attributeName);\n } catch {\n break server_side_error;\n }\n\n if (!doesErrorExist) {\n break server_side_error;\n }\n\n const errorMessageStr = messagesPerField.get(attributeName);\n\n return [\n {\n errorMessageStr,\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span>${errorMessageStr}</span>`\n ),\n fieldIndex: undefined,\n source: {\n type: 'server'\n }\n }\n ];\n }\n\n handle_multi_valued_multi_fields: {\n if (!attribute.multivalued) {\n break handle_multi_valued_multi_fields;\n }\n\n if (this.getIsMultivaluedSingleField({ attribute })) {\n break handle_multi_valued_multi_fields;\n }\n\n assert(valueOrValues instanceof Array);\n\n const values = valueOrValues;\n\n const errors = values\n .map((...[, index]) => {\n const specificValueErrors = this.getErrors({\n attributeName,\n formFieldStates: formFieldStates.map(formFieldState => {\n if (formFieldState.attribute.name === attributeName) {\n assert(formFieldState.valueOrValues instanceof Array);\n return {\n attribute: {\n ...attribute,\n annotations: {\n ...attribute.annotations,\n inputType: undefined\n },\n multivalued: false\n },\n valueOrValues: formFieldState.valueOrValues[index]\n };\n }\n\n return formFieldState;\n })\n });\n\n return specificValueErrors\n .filter(error => {\n if (\n error.source.type === 'other' &&\n error.source.rule === 'requiredField'\n ) {\n return false;\n }\n\n return true;\n })\n .map(\n (error): FormFieldError => ({\n ...error,\n fieldIndex: index\n })\n );\n })\n .reduce((acc, errors) => [...acc, ...errors], []);\n\n required_field: {\n if (!attribute.required) {\n break required_field;\n }\n\n if (values.every(value => value !== '')) {\n break required_field;\n }\n\n const msgArgs = ['error-user-attribute-required'] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'other',\n rule: 'requiredField'\n }\n });\n }\n\n return errors;\n }\n\n handle_multi_valued_single_field: {\n if (!attribute.multivalued) {\n break handle_multi_valued_single_field;\n }\n\n if (!this.getIsMultivaluedSingleField({ attribute })) {\n break handle_multi_valued_single_field;\n }\n\n const validatorName = 'multivalued';\n\n const validator = attribute.validators[validatorName];\n\n if (validator === undefined) {\n return [];\n }\n\n const { min: minStr } = validator;\n\n const min = minStr ? parseInt(`${minStr}`) : attribute.required ? 1 : 0;\n\n assert(!isNaN(min));\n\n const { max: maxStr } = validator;\n\n const max = !maxStr ? Infinity : parseInt(`${maxStr}`);\n\n assert(!isNaN(max));\n\n assert(valueOrValues instanceof Array);\n\n const values = valueOrValues;\n\n if (min <= values.length && values.length <= max) {\n return [];\n }\n\n const msgArgs = [\n 'error-invalid-multivalued-size',\n `${min}`,\n `${max}`\n ] as const;\n\n return [\n {\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"0\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'validator',\n name: validatorName\n }\n }\n ];\n }\n\n assert(typeof valueOrValues === 'string');\n\n const value = valueOrValues;\n\n const errors: FormFieldError[] = [];\n\n check_password_policies: {\n if (attributeName !== 'password') {\n break check_password_policies;\n }\n\n if (passwordPolicies === undefined) {\n break check_password_policies;\n }\n\n check_password_policy_x: {\n const policyName = 'length';\n\n const policy = passwordPolicies[policyName];\n\n if (!policy) {\n break check_password_policy_x;\n }\n\n const minLength = policy;\n\n if (value.length >= minLength) {\n break check_password_policy_x;\n }\n\n const msgArgs = [\n 'invalidPasswordMinLengthMessage',\n `${minLength}`\n ] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'passwordPolicy',\n name: policyName\n }\n });\n }\n\n check_password_policy_x: {\n const policyName = 'digits';\n\n const policy = passwordPolicies[policyName];\n\n if (!policy) {\n break check_password_policy_x;\n }\n\n const minNumberOfDigits = policy;\n\n if (\n value.split('').filter(char => !isNaN(parseInt(char))).length >=\n minNumberOfDigits\n ) {\n break check_password_policy_x;\n }\n\n const msgArgs = [\n 'invalidPasswordMinDigitsMessage',\n `${minNumberOfDigits}`\n ] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'passwordPolicy',\n name: policyName\n }\n });\n }\n\n check_password_policy_x: {\n const policyName = 'lowerCase';\n\n const policy = passwordPolicies[policyName];\n\n if (!policy) {\n break check_password_policy_x;\n }\n\n const minNumberOfLowerCaseChar = policy;\n\n if (\n value\n .split('')\n .filter(\n char =>\n char === char.toLowerCase() && char !== char.toUpperCase()\n ).length >= minNumberOfLowerCaseChar\n ) {\n break check_password_policy_x;\n }\n\n const msgArgs = [\n 'invalidPasswordMinLowerCaseCharsMessage',\n `${minNumberOfLowerCaseChar}`\n ] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'passwordPolicy',\n name: policyName\n }\n });\n }\n\n check_password_policy_x: {\n const policyName = 'upperCase';\n\n const policy = passwordPolicies[policyName];\n\n if (!policy) {\n break check_password_policy_x;\n }\n\n const minNumberOfUpperCaseChar = policy;\n\n if (\n value\n .split('')\n .filter(\n char =>\n char === char.toUpperCase() && char !== char.toLowerCase()\n ).length >= minNumberOfUpperCaseChar\n ) {\n break check_password_policy_x;\n }\n\n const msgArgs = [\n 'invalidPasswordMinUpperCaseCharsMessage',\n `${minNumberOfUpperCaseChar}`\n ] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'passwordPolicy',\n name: policyName\n }\n });\n }\n\n check_password_policy_x: {\n const policyName = 'specialChars';\n\n const policy = passwordPolicies[policyName];\n\n if (!policy) {\n break check_password_policy_x;\n }\n\n const minNumberOfSpecialChar = policy;\n\n if (\n value.split('').filter(char => !char.match(/[a-zA-Z0-9]/)).length >=\n minNumberOfSpecialChar\n ) {\n break check_password_policy_x;\n }\n\n const msgArgs = [\n 'invalidPasswordMinSpecialCharsMessage',\n `${minNumberOfSpecialChar}`\n ] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'passwordPolicy',\n name: policyName\n }\n });\n }\n\n check_password_policy_x: {\n const policyName = 'notUsername';\n\n const notUsername = passwordPolicies[policyName];\n\n if (!notUsername) {\n break check_password_policy_x;\n }\n\n const usernameFormFieldState = formFieldStates.find(\n formFieldState => formFieldState.attribute.name === 'username'\n );\n\n if (!usernameFormFieldState) {\n break check_password_policy_x;\n }\n\n const usernameValue = (() => {\n let { valueOrValues } = usernameFormFieldState;\n\n assert(typeof valueOrValues === 'string');\n\n unFormat_number: {\n const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {};\n\n if (!kcNumberUnFormat) {\n break unFormat_number;\n }\n\n valueOrValues = formatNumber(valueOrValues, kcNumberUnFormat);\n }\n\n return valueOrValues;\n })();\n\n if (usernameValue === '') {\n break check_password_policy_x;\n }\n\n if (value !== usernameValue) {\n break check_password_policy_x;\n }\n\n const msgArgs = ['invalidPasswordNotUsernameMessage'] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'passwordPolicy',\n name: policyName\n }\n });\n }\n\n check_password_policy_x: {\n const policyName = 'notEmail';\n\n const notEmail = passwordPolicies[policyName];\n\n if (!notEmail) {\n break check_password_policy_x;\n }\n\n const emailFormFieldState = formFieldStates.find(\n formFieldState => formFieldState.attribute.name === 'email'\n );\n\n if (!emailFormFieldState) {\n break check_password_policy_x;\n }\n\n assert(typeof emailFormFieldState.valueOrValues === 'string');\n\n {\n const emailValue = emailFormFieldState.valueOrValues;\n\n if (emailValue === '') {\n break check_password_policy_x;\n }\n\n if (value !== emailValue) {\n break check_password_policy_x;\n }\n }\n\n const msgArgs = ['invalidPasswordNotEmailMessage'] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'passwordPolicy',\n name: policyName\n }\n });\n }\n }\n\n password_confirm_matches_password: {\n if (attributeName !== 'password-confirm') {\n break password_confirm_matches_password;\n }\n\n const passwordFormFieldState = formFieldStates.find(\n formFieldState => formFieldState.attribute.name === 'password'\n );\n\n assert(passwordFormFieldState !== undefined);\n\n assert(typeof passwordFormFieldState.valueOrValues === 'string');\n\n {\n const passwordValue = passwordFormFieldState.valueOrValues;\n\n if (value === passwordValue) {\n break password_confirm_matches_password;\n }\n }\n\n const msgArgs = ['invalidPasswordConfirmMessage'] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'other',\n rule: 'passwordConfirmMatchesPassword'\n }\n });\n }\n\n const { validators } = attribute;\n\n required_field: {\n if (!attribute.required) {\n break required_field;\n }\n\n if (value !== '') {\n break required_field;\n }\n\n const msgArgs = ['error-user-attribute-required'] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'other',\n rule: 'requiredField'\n }\n });\n }\n\n validator_x: {\n const validatorName = 'length';\n\n const validator = validators[validatorName];\n\n if (!validator) {\n break validator_x;\n }\n\n const {\n 'ignore.empty.value': ignoreEmptyValue = false,\n max,\n min\n } = validator;\n\n if (ignoreEmptyValue && value === '') {\n break validator_x;\n }\n\n const source: FormFieldError.Source = {\n type: 'validator',\n name: validatorName\n };\n\n if (max && value.length > parseInt(`${max}`)) {\n const msgArgs = ['error-invalid-length-too-long', `${max}`] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source\n });\n }\n\n if (min && value.length < parseInt(`${min}`)) {\n const msgArgs = ['error-invalid-length-too-short', `${min}`] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source\n });\n }\n }\n\n validator_x: {\n const validatorName = 'pattern';\n\n const validator = validators[validatorName];\n\n if (validator === undefined) {\n break validator_x;\n }\n\n const {\n 'ignore.empty.value': ignoreEmptyValue = false,\n pattern,\n 'error-message': errorMessageKey\n } = validator;\n\n if (ignoreEmptyValue && value === '') {\n break validator_x;\n }\n\n if (new RegExp(pattern).test(value)) {\n break validator_x;\n }\n\n const msgArgs = [\n errorMessageKey ?? id<MessageKey_defaultSet>('shouldMatchPattern'),\n pattern\n ] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${advancedMsgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: advancedMsgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'validator',\n name: validatorName\n }\n });\n }\n\n validator_x: {\n {\n const lastError = errors[errors.length - 1];\n if (\n lastError !== undefined &&\n lastError.source.type === 'validator' &&\n lastError.source.name === 'pattern'\n ) {\n break validator_x;\n }\n }\n\n const validatorName = 'email';\n\n const validator = validators[validatorName];\n\n if (validator === undefined) {\n break validator_x;\n }\n\n const { 'ignore.empty.value': ignoreEmptyValue = false } = validator;\n\n if (ignoreEmptyValue && value === '') {\n break validator_x;\n }\n\n if (emailRegexp.test(value)) {\n break validator_x;\n }\n\n const msgArgs = [id<MessageKey_defaultSet>('invalidEmailMessage')] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'validator',\n name: validatorName\n }\n });\n }\n\n validator_x: {\n const validatorName = 'integer';\n\n const validator = validators[validatorName];\n\n if (validator === undefined) {\n break validator_x;\n }\n\n const {\n 'ignore.empty.value': ignoreEmptyValue = false,\n max,\n min\n } = validator;\n\n if (ignoreEmptyValue && value === '') {\n break validator_x;\n }\n\n const intValue = parseInt(value);\n\n const source: FormFieldError.Source = {\n type: 'validator',\n name: validatorName\n };\n\n if (isNaN(intValue)) {\n const msgArgs = ['mustBeAnInteger'] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source\n });\n\n break validator_x;\n }\n\n if (max && intValue > parseInt(`${max}`)) {\n const msgArgs = ['error-number-out-of-range-too-big', `${max}`] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source\n });\n\n break validator_x;\n }\n\n if (min && intValue < parseInt(`${min}`)) {\n const msgArgs = [\n 'error-number-out-of-range-too-small',\n `${min}`\n ] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source\n });\n\n break validator_x;\n }\n }\n\n validator_x: {\n const validatorName = 'options';\n\n const validator = validators[validatorName];\n\n if (validator === undefined) {\n break validator_x;\n }\n\n if (value === '') {\n break validator_x;\n }\n\n if (validator.options.indexOf(value) >= 0) {\n break validator_x;\n }\n\n const msgArgs = [id<MessageKey_defaultSet>('notAValidOption')] as const;\n\n errors.push({\n errorMessage: this.sanitizer.bypassSecurityTrustHtml(\n `<span data-key=\"${attributeName}-${errors.length}\">${msgStr(...msgArgs)}</span>`\n ),\n errorMessageStr: msgStr(...msgArgs),\n fieldIndex: undefined,\n source: {\n type: 'validator',\n name: validatorName\n }\n });\n }\n\n //TODO: Implement missing validators. See Validators type definition.\n\n return errors;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA;AACA;MAoHa,sBAAsB,CAAA;AAyY/B,IAAA,WAAA,GAAA;AAxYQ,QAAA,IAAA,CAAA,SAAS,GACb,MAAM,CAAiD,gBAAgB,CAAC,CAAC;AACrE,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAO,UAAU,CAAC,CAAC;AAChC,QAAA,IAAA,CAAA,yBAAyB,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;AAClE,QAAA,IAAA,CAAA,4BAA4B,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AACpE,QAAA,IAAA,CAAA,SAAS,GAAiB,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAY,CAAA,YAAA,GAAmB,CAAC,MAAK;AACzC,YAAA,MAAM,UAAU,GAAgB,CAAC,MAAK;AAClC,gBAAA,wDAAwD,EAAE;AACtD,oBAAA,IACI,SAAS,IAAI,IAAI,CAAC,SAAS;AAC3B,wBAAA,kBAAkB,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO;AAC5C,wBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,MAAM,KAAK,CAAC,EACnE;AACE,wBAAA,MAAM,wDAAwD,CAAC;qBAClE;AAED,oBAAA,IACI,UAAU,IAAI,IAAI,CAAC,SAAS;AAC5B,wBAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,YAAY,MAAM;AACzC,wBAAA,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,EACvC;;wBAEE,OAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAW;AAC3D,6BAAA,MAAM,CAAC,IAAI,IACR,IAAI,KAAK,UAAU;AACf,8BAAE,IAAI;8BACJ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,2BAA2B,CAC1D;AACA,6BAAA,GAAG,CAAC,IAAI,IACL,EAAE,CAAY;AACV,4BAAA,IAAI,EAAE,IAAI;AACV,4BAAA,WAAW,EAAE,EAAE,CACX,CAAM,GAAA,EAAA,IAAI,GAAG,CAChB;AACD,4BAAA,QAAQ,EAAE,IAAI;AACd,4BAAA,KAAK,EACA,IAAI,CAAC,SAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;AACzD,4BAAA,oBAAoB,EAAE,EAAE;AACxB,4BAAA,QAAQ,EAAE,KAAK;AACf,4BAAA,UAAU,EAAE,EAAE;AACd,4BAAA,WAAW,EAAE,EAAE;4BACf,YAAY,EAAE,CAAC,MAAK;gCAChB,QAAQ,IAAI;AACR,oCAAA,KAAK,OAAO;AACR,wCAAA,OAAO,OAAO,CAAC;AACnB,oCAAA,KAAK,UAAU;AACX,wCAAA,OAAO,UAAU,CAAC;AACtB,oCAAA;AACI,wCAAA,OAAO,SAAS,CAAC;iCACxB;AACL,6BAAC,GAAG;AACP,yBAAA,CAAC,CACL,CAAC;qBACT;AAED,oBAAA,IAAI,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,YAAY,MAAM,EAAE;;wBAEnE,OAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAW;AAC3D,6BAAA,MAAM,CAAC,IAAI,IACR,IAAI,KAAK,UAAU;AACf,8BAAE,IAAI;8BACH,IAAI,CAAC,SAAiB,CAAC,IAAI,CAAC,mBAAmB,CACzD;AACA,6BAAA,GAAG,CAAC,IAAI,IACL,EAAE,CAAY;AACV,4BAAA,IAAI,EAAE,IAAI;AACV,4BAAA,WAAW,EAAE,EAAE,CACX,CAAM,GAAA,EAAA,IAAI,GAAG,CAChB;AACD,4BAAA,QAAQ,EAAE,IAAI;4BACd,KAAK,EAAG,IAAI,CAAC,SAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AAC/C,4BAAA,oBAAoB,EAAE,EAAE;AACxB,4BAAA,QAAQ,EAAE,KAAK;AACf,4BAAA,UAAU,EAAE,EAAE;AACd,4BAAA,WAAW,EAAE,EAAE;4BACf,YAAY,EAAE,CAAC,MAAK;gCAChB,QAAQ,IAAI;AACR,oCAAA,KAAK,OAAO;AACR,wCAAA,OAAO,OAAO,CAAC;AACnB,oCAAA,KAAK,UAAU;AACX,wCAAA,OAAO,UAAU,CAAC;AACtB,oCAAA;AACI,wCAAA,OAAO,SAAS,CAAC;iCACxB;AACL,6BAAC,GAAG;AACP,yBAAA,CAAC,CACL,CAAC;qBACT;AAED,oBAAA,IAAI,OAAO,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,MAAM,EAAE;;wBAErE,OAAO;AACH,4BAAA,EAAE,CAAY;AACV,gCAAA,IAAI,EAAE,OAAO;AACb,gCAAA,WAAW,EAAE,EAAE,CAAiC,CAAA,SAAA,CAAW,CAAC;AAC5D,gCAAA,QAAQ,EAAE,IAAI;gCACd,KAAK,EAAG,IAAI,CAAC,SAAS,CAAC,KAAa,CAAC,KAAK,IAAI,EAAE;AAChD,gCAAA,oBAAoB,EAAE,EAAE;AACxB,gCAAA,QAAQ,EAAE,KAAK;AACf,gCAAA,UAAU,EAAE,EAAE;AACd,gCAAA,WAAW,EAAE,EAAE;AACf,gCAAA,YAAY,EAAE,OAAO;6BACxB,CAAC;yBACL,CAAC;qBACL;AAED,oBAAA,MAAM,CAAC,KAAK,EAAE,wDAAwD,CAAC,CAAC;iBAC3E;AAED,gBAAA,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAC7D,2BAA2B,CAC9B,CAAC;aACL,GAAG,CAAC;;AAEL,YAAA,UAAU,CAAC,OAAO,CAAC,SAAS,IAAG;AAC3B,gBAAA,kBAAkB,EAAE;AAChB,oBAAA,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,EAAE;AACrC,wBAAA,MAAM,kBAAkB,CAAC;qBAC5B;oBAED,MAAM,EACF,KAAK,EACL,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EACnB,GAAG,SAKH,CAAC;oBAEF,OAAO,SAAS,CAAC,KAAK,CAAC;;oBAEvB,OAAO,SAAS,CAAC,kBAAkB,CAAC;;oBAEpC,OAAO,SAAS,CAAC,uBAAuB,CAAC;;oBAEzC,OAAO,SAAS,CAAC,gBAAgB,CAAC;AAElC,oBAAA,IAAI,KAAK,KAAK,EAAE,EAAE;AACd,wBAAA,MAAM,kBAAkB,CAAC;qBAC5B;oBAED,SAAS,CAAC,KAAK,GAAG;AACd,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,aAAa,EAAE,kBAAkB;AACjC,wBAAA,kBAAkB,EAAE,uBAAuB;AAC3C,wBAAA,WAAW,EAAE,gBAAgB;AAC7B,wBAAA,oBAAoB,EAAE,EAAE;qBAC3B,CAAC;iBACL;;AAGD,gBAAA,IACI,SAAS,CAAC,UAAU,CAAC,OAAO,KAAK,SAAS;AAC1C,oBAAA,SAAS,CAAC,WAAW,CAAC,SAAS,KAAK,SAAS,EAC/C;AACE,oBAAA,SAAS,CAAC,WAAW,CAAC,SAAS,GAAG,QAAQ,CAAC;iBAC9C;;gBAGD;oBACI,IAAI,IAAI,CAAC,2BAA2B,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;AACjD,wBAAA,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;qBAChC;AAED,oBAAA,IAAI,SAAS,CAAC,WAAW,EAAE;AACvB,wBAAA,SAAS,CAAC,MAAM;AACZ,4BAAA,SAAS,CAAC,KAAK,KAAK,SAAS,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;wBAC3D,OAAO,SAAS,CAAC,KAAK,CAAC;qBAC1B;yBAAM;wBACH,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAC1C,OAAO,SAAS,CAAC,MAAM,CAAC;qBAC3B;iBACJ;AACL,aAAC,CAAC,CAAC;AACH,YAAA,iCAAiC,EAAE;AAC/B,gBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE;AAClC,oBAAA,MAAM,iCAAiC,CAAC;iBAC3C;gBAED,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,KAAI;oBAChC,IACI,SAAS,CAAC,IAAI;AACd,yBAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,2BAA2B;AAC7C,8BAAE,OAAO;AACT,8BAAE,UAAU,CAAC,EACnB;;;wBAGE,OAAO;qBACV;oBAED,UAAU,CAAC,MAAM,CACb,CAAC,GAAG,CAAC,EACL,CAAC,EACD;AACI,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,WAAW,EAAE,EAAE,CAAiC,aAAa,CAAC;AAC9D,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,UAAU,EAAE,EAAE;AACd,wBAAA,WAAW,EAAE,EAAE;AACf,wBAAA,YAAY,EAAE,cAAc;AAC5B,wBAAA,oBAAoB,EAAE,EAAE;qBAC3B,EACD;AACI,wBAAA,IAAI,EAAE,kBAAkB;AACxB,wBAAA,WAAW,EACP,EAAE,CAAiC,oBAAoB,CAAC;AAC5D,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,QAAQ,EAAE,KAAK;AACf,wBAAA,UAAU,EAAE,EAAE;AACd,wBAAA,WAAW,EAAE,EAAE;AACf,wBAAA,oBAAoB,EAAE,EAAE;AACxB,wBAAA,YAAY,EAAE,cAAc;AAC/B,qBAAA,CACJ,CAAC;AACN,iBAAC,CAAC,CAAC;aACN;YACD,MAAM,qBAAqB,GAGrB,EAAE,CAAC;AAET,YAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;AAChC,gBAAA,6BAA6B,EAAE;AAC3B,oBAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AACxB,wBAAA,MAAM,6BAA6B,CAAC;qBACvC;AAED,oBAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;AAElE,oBAAA,yBAAyB,EAAE;wBACvB,IAAI,IAAI,CAAC,2BAA2B,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;AACjD,4BAAA,MAAM,yBAAyB,CAAC;yBACnC;AAED,wBAAA,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC;AAEnD,wBAAA,IAAI,SAAS,KAAK,SAAS,EAAE;AACzB,4BAAA,MAAM,yBAAyB,CAAC;yBACnC;AAED,wBAAA,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;wBAElC,IAAI,CAAC,MAAM,EAAE;AACT,4BAAA,MAAM,yBAAyB,CAAC;yBACnC;wBAED,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAA,CAAE,CAAC,CAAC;AAElC,wBAAA,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE;AAClD,4BAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;yBACnB;qBACJ;oBAED,qBAAqB,CAAC,IAAI,CAAC;wBACvB,SAAS;AACT,wBAAA,aAAa,EAAE,MAAM;AACxB,qBAAA,CAAC,CAAC;oBAEH,SAAS;iBACZ;gBAED,qBAAqB,CAAC,IAAI,CAAC;oBACvB,SAAS;AACT,oBAAA,aAAa,EAAE,SAAS,CAAC,KAAK,IAAI,EAAE;AACvC,iBAAA,CAAC,CAAC;aACN;AAED,YAAA,MAAM,YAAY,GAAmB;AACjC,gBAAA,eAAe,EAAE,qBAAqB,CAAC,GAAG,CACtC,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM;oBAC/B,SAAS;AACT,oBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,aAAa,EAAE,SAAS,CAAC,IAAI;AAC7B,wBAAA,eAAe,EAAE,qBAAqB;qBACzC,CAAC;oBACF,uBAAuB,EACnB,aAAa,YAAY,KAAK;AAC9B,wBAAA,CAAC,IAAI,CAAC,2BAA2B,CAAC,EAAE,SAAS,EAAE,CAAC;0BAC1C,aAAa,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;AAChC,0BAAE,KAAK;AACf,oBAAA,aAAa,EAAE,aAAa;AAC/B,iBAAA,CAAC,CACL;aACJ,CAAC;AACF,YAAA,OAAO,YAAY,CAAC;SACvB,GAAG,CAAC;AAEG,QAAA,IAAA,CAAA,KAAK,GAAmC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAE1E,QAAA,IAAA,CAAA,SAAS,GAAsB,QAAQ,CAAC,MAAK;AACzC,YAAA,MAAM,KAAK,GAAmB,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3C,OAAO;gBACH,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GAAG,CACtC,CAAC,EACG,MAAM,EACN,uBAAuB,EAAE,4BAA4B,EACrD,SAAS,EACT,GAAG,iBAAiB,EACvB,MAAM;AACH,oBAAA,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAG;AACrC,wBAAA,MAAM,uBAAuB,GACzB,OAAO,4BAA4B,KAAK,SAAS;AAC7C,8BAAE,4BAA4B;AAC9B,8BAAE,KAAK,CAAC,UAAU,KAAK,SAAS;AAC9B,kCAAE,4BAA4B,CAAC,KAAK,CAAC,UAAU,CAAC;kCAC9C,4BAA4B,CACxB,4BAA4B,CAAC,MAAM,GAAG,CAAC,CAC1C,CAAC;wBACd,IAAI,KAAK,GAAG,KAAK,CAAC;AAClB,wBAAA,QAAQ,KAAK,CAAC,MAAM,CAAC,IAAI;AACrB,4BAAA,KAAK,QAAQ;gCACT,KAAK,GAAG,IAAI,CAAC;gCACb,MAAM;AACV,4BAAA,KAAK,OAAO;AACR,gCAAA,QAAQ,KAAK,CAAC,MAAM,CAAC,IAAI;AACrB,oCAAA,KAAK,eAAe;wCAChB,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;AACV,oCAAA,KAAK,gCAAgC;wCACjC,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;iCACb;;gCAED,MAAM;AACV,4BAAA,KAAK,gBAAgB;AACjB,gCAAA,QAAQ,KAAK,CAAC,MAAM,CAAC,IAAI;AACrB,oCAAA,KAAK,QAAQ;wCACT,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;AACV,oCAAA,KAAK,QAAQ;wCACT,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;AACV,oCAAA,KAAK,WAAW;wCACZ,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;AACV,oCAAA,KAAK,WAAW;wCACZ,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;AACV,oCAAA,KAAK,cAAc;wCACf,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;AACV,oCAAA,KAAK,aAAa;wCACd,KAAK,GAAG,IAAI,CAAC;wCACb,MAAM;AACV,oCAAA,KAAK,UAAU;wCACX,KAAK,GAAG,IAAI,CAAC;wCACb,MAAM;iCACb;;gCAED,MAAM;AACV,4BAAA,KAAK,WAAW;AACZ,gCAAA,QAAQ,KAAK,CAAC,MAAM,CAAC,IAAI;AACrB,oCAAA,KAAK,QAAQ;wCACT,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;AACV,oCAAA,KAAK,SAAS;wCACV,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;AACV,oCAAA,KAAK,OAAO;wCACR,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;AACV,oCAAA,KAAK,SAAS;wCACV,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;AACV,oCAAA,KAAK,aAAa;wCACd,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;AACV,oCAAA,KAAK,SAAS;wCACV,KAAK,GAAG,uBAAuB,CAAC;wCAChC,MAAM;iCACb;;gCAED,MAAM;yBACb;AACD,wBAAA,OAAO,KAAK,CAAC;AACjB,qBAAC,CAAC;oBACF,SAAS;AACT,oBAAA,GAAG,iBAAiB;AACvB,iBAAA,CAAC,CACL;AACD,gBAAA,iBAAiB,EAAE,KAAK,CAAC,eAAe,CAAC,KAAK,CAC1C,CAAC,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,KAAK,CAAC,CACtC;aACJ,CAAC;AACN,SAAC,CAAC,CAAC;AAGC,QAAA,IAAI,CAAC,4BAA4B,CAAC,uBAAuB,CACrD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,oBAAoB,IAAI,EAAE,CAAC;AAC1D,aAAA,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,eAAe,IAAI,GAAG,KAAK,gBAAgB,CAAC;AAClE,aAAA,GAAG,CAAC,GAAG,KAAK;AACT,YAAA,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE,CAAG,EAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAO,IAAA,EAAA,GAAG,CAAK,GAAA,CAAA;YACvD,EAAE,EAAE,CAAG,EAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAO,IAAA,EAAA,GAAG,CAAK,GAAA,CAAA;SACzD,CAAC,CAAC,CACV,CAAC;KACL;AAEM,IAAA,kBAAkB,CAAC,UAAsB,EAAA;AAC5C,QAAA,IAAI,CAAC,UAAU;YAAE,OAAO;AACxB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAC7C,CAAC,EAAE,SAAS,EAAE,KAAK,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CACxD,CAAC;AACF,QAAA,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC;AACrC,QAAA,QAAQ,UAAU,CAAC,MAAM;AACrB,YAAA,KAAK,QAAQ;AACT,gBAAA,cAAc,CAAC,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;AAExD,gBAAA,gBAAgB,EAAE;AACd,oBAAA,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC;oBAErC,MAAM,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC,oBAAoB,IAAI,EAAE,CAAC;oBAEhE,IAAI,CAAC,cAAc,EAAE;AACjB,wBAAA,MAAM,gBAAgB,CAAC;qBAC1B;AAED,oBAAA,IAAI,cAAc,CAAC,aAAa,YAAY,KAAK,EAAE;wBAC/C,cAAc,CAAC,aAAa,GAAG,cAAc,CAAC,aAAa,CAAC,GAAG,CAC3D,KAAK,IAAI,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,CAC/C,CAAC;qBACL;yBAAM;wBACH,cAAc,CAAC,aAAa,GAAG,YAAY,CACvC,cAAc,CAAC,aAAa,EAC5B,cAAc,CACjB,CAAC;qBACL;iBACJ;AAED,gBAAA,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;oBACnC,aAAa,EAAE,UAAU,CAAC,IAAI;oBAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;AACzC,iBAAA,CAAC,CAAC;AAEH,gBAAA,mBAAmB,EAAE;AACjB,oBAAA,MAAM,EAAE,wBAAwB,GAAG,KAAK,EAAE,GAAG,UAAU,CAAC;oBAExD,IAAI,CAAC,wBAAwB,EAAE;AAC3B,wBAAA,MAAM,mBAAmB,CAAC;qBAC7B;AAED,oBAAA,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,aAAa,YAAY,KAAK;AAC9D,0BAAE,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC;AACvD,0BAAE,CAAC,SAAS,CAAC,EAAE;wBACf,IAAI,CAAC,kBAAkB,CAAC;AACpB,4BAAA,MAAM,EAAE,YAAY;4BACpB,IAAI,EAAE,UAAU,CAAC,IAAI;4BACrB,UAAU;AACb,yBAAA,CAAC,CAAC;qBACN;iBACJ;AAED,gBAAA,uBAAuB,EAAE;AACrB,oBAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;AAChC,wBAAA,MAAM,uBAAuB,CAAC;qBACjC;AAED,oBAAA,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE;AAChC,wBAAA,MAAM,uBAAuB,CAAC;qBACjC;oBAED,IAAI,CAAC,kBAAkB,CAAC;AACpB,wBAAA,MAAM,EAAE,QAAQ;AAChB,wBAAA,IAAI,EAAE,kBAAkB;wBACxB,aAAa,EAAE,UAAU,CAAC,aAAa;wBACvC,wBAAwB,EAAE,UAAU,CAAC,wBAAwB;AAChE,qBAAA,CAAC,CAAC;iBACN;AAED,gBAAA,sDAAsD,EAAE;AACpD,oBAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;AACjC,wBAAA,MAAM,sDAAsD,CAAC;qBAChE;AAED,oBAAA,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE;AAChC,wBAAA,MAAM,sDAAsD,CAAC;qBAChE;oBAED,IAAI,CAAC,kBAAkB,CAAC;AACpB,wBAAA,MAAM,EAAE,QAAQ;AAChB,wBAAA,IAAI,EAAE,kBAAkB;wBACxB,aAAa,EAAE,CAAC,MAAK;4BACjB,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAC7C,CAAC,EAAE,SAAS,EAAE,KAAK,SAAS,CAAC,IAAI,KAAK,kBAAkB,CAC3D,CAAC;AAEF,4BAAA,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC;4BAErC,OAAO,cAAc,CAAC,aAAa,CAAC;AACxC,yBAAC,GAAG;wBACJ,wBAAwB,EAAE,UAAU,CAAC,wBAAwB;AAChE,qBAAA,CAAC,CAAC;iBACN;gBAED,MAAM;AACV,YAAA,KAAK,YAAY;AACb,gBAAA,IAAI,cAAc,CAAC,uBAAuB,YAAY,KAAK,EAAE;AACzD,oBAAA,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC;AAClC,oBAAA,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;AACjC,oBAAA,cAAc,CAAC,uBAAuB,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;oBAC1D,MAAM;iBACT;AAED,gBAAA,cAAc,CAAC,uBAAuB,GAAG,IAAI,CAAC;gBAC9C,MAAM;SACb;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK;AACxB,YAAA,GAAG,KAAK;YACR,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAG;AAC3C,gBAAA,IAAI,CAAC,CAAC,SAAS,KAAK,cAAc,CAAC,SAAS;AAAE,oBAAA,OAAO,cAAc,CAAC;AACpE,gBAAA,OAAO,CAAC,CAAC;AACb,aAAC,CAAC;AACL,SAAA,CAAC,CAAC,CAAC;KACP;AAEO,IAAA,2BAA2B,CAAC,MAAgC,EAAA;AAChE,QAAA,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;AAE7B,QAAA,OAAO,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC;KAC9E;AAEO,IAAA,SAAS,CAAC,MAMjB,EAAA;QACG,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAE9D,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;AAC7C,QAAA,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;AAElD,QAAA,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACvC,CAAC,EAAE,SAAS,EAAE,KAAK,SAAS,CAAC,IAAI,KAAK,aAAa,CACtD,CAAC;AAEF,QAAA,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC;AAErC,QAAA,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC;AAErC,QAAA,MAAM,aAAa,GAAG,CAAC,MAAK;AACxB,YAAA,IAAI,EAAE,aAAa,EAAE,GAAG,cAAc,CAAC;AAEvC,YAAA,eAAe,EAAE;gBACb,MAAM,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC,oBAAoB,IAAI,EAAE,CAAC;gBAElE,IAAI,CAAC,gBAAgB,EAAE;AACnB,oBAAA,MAAM,eAAe,CAAC;iBACzB;AAED,gBAAA,IAAI,aAAa,YAAY,KAAK,EAAE;AAChC,oBAAA,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,IACnC,YAAY,CAAC,KAAK,EAAE,gBAAgB,CAAC,CACxC,CAAC;iBACL;qBAAM;AACH,oBAAA,aAAa,GAAG,YAAY,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;iBACjE;aACJ;AAED,YAAA,OAAO,aAAa,CAAC;SACxB,GAAG,CAAC;AAEL,QAAA,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;AAEhC,QAAA,iBAAiB,EAAE;AACf,YAAA,IAAI,SAAS,CAAC,WAAW,EAAE;AACvB,gBAAA,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;AAEzE,gBAAA,MAAM,CAAC,aAAa,YAAY,KAAK,CAAC,CAAC;gBAEvC,MAAM,MAAM,GAAG,aAAa,CAAC;AAE7B,gBAAA,IACI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;AAC7B,oBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,EACvD;AACE,oBAAA,MAAM,iBAAiB,CAAC;iBAC3B;aACJ;iBAAM;AACH,gBAAA,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;AAE3C,gBAAA,MAAM,CAAC,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC;gBAE1C,MAAM,KAAK,GAAG,aAAa,CAAC;AAE5B,gBAAA,IAAI,YAAY,KAAK,KAAK,EAAE;AACxB,oBAAA,MAAM,iBAAiB,CAAC;iBAC3B;aACJ;AAED,YAAA,IAAI,cAAuB,CAAC;AAE5B,YAAA,IAAI;AACA,gBAAA,cAAc,GAAG,gBAAgB,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;aAChE;AAAC,YAAA,MAAM;AACJ,gBAAA,MAAM,iBAAiB,CAAC;aAC3B;YAED,IAAI,CAAC,cAAc,EAAE;AACjB,gBAAA,MAAM,iBAAiB,CAAC;aAC3B;YAED,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAE5D,OAAO;AACH,gBAAA;oBACI,eAAe;oBACf,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,CAAA,MAAA,EAAS,eAAe,CAAA,OAAA,CAAS,CACpC;AACD,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,MAAM,EAAE;AACJ,wBAAA,IAAI,EAAE,QAAQ;AACjB,qBAAA;AACJ,iBAAA;aACJ,CAAC;SACL;AAED,QAAA,gCAAgC,EAAE;AAC9B,YAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AACxB,gBAAA,MAAM,gCAAgC,CAAC;aAC1C;YAED,IAAI,IAAI,CAAC,2BAA2B,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;AACjD,gBAAA,MAAM,gCAAgC,CAAC;aAC1C;AAED,YAAA,MAAM,CAAC,aAAa,YAAY,KAAK,CAAC,CAAC;YAEvC,MAAM,MAAM,GAAG,aAAa,CAAC;YAE7B,MAAM,MAAM,GAAG,MAAM;iBAChB,GAAG,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,KAAI;AAClB,gBAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC;oBACvC,aAAa;AACb,oBAAA,eAAe,EAAE,eAAe,CAAC,GAAG,CAAC,cAAc,IAAG;wBAClD,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,KAAK,aAAa,EAAE;AACjD,4BAAA,MAAM,CAAC,cAAc,CAAC,aAAa,YAAY,KAAK,CAAC,CAAC;4BACtD,OAAO;AACH,gCAAA,SAAS,EAAE;AACP,oCAAA,GAAG,SAAS;AACZ,oCAAA,WAAW,EAAE;wCACT,GAAG,SAAS,CAAC,WAAW;AACxB,wCAAA,SAAS,EAAE,SAAS;AACvB,qCAAA;AACD,oCAAA,WAAW,EAAE,KAAK;AACrB,iCAAA;AACD,gCAAA,aAAa,EAAE,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC;6BACrD,CAAC;yBACL;AAED,wBAAA,OAAO,cAAc,CAAC;AAC1B,qBAAC,CAAC;AACL,iBAAA,CAAC,CAAC;AAEH,gBAAA,OAAO,mBAAmB;qBACrB,MAAM,CAAC,KAAK,IAAG;AACZ,oBAAA,IACI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;AAC7B,wBAAA,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,EACvC;AACE,wBAAA,OAAO,KAAK,CAAC;qBAChB;AAED,oBAAA,OAAO,IAAI,CAAC;AAChB,iBAAC,CAAC;AACD,qBAAA,GAAG,CACA,CAAC,KAAK,MAAsB;AACxB,oBAAA,GAAG,KAAK;AACR,oBAAA,UAAU,EAAE,KAAK;AACpB,iBAAA,CAAC,CACL,CAAC;AACV,aAAC,CAAC;AACD,iBAAA,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AAEtD,YAAA,cAAc,EAAE;AACZ,gBAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;AACrB,oBAAA,MAAM,cAAc,CAAC;iBACxB;AAED,gBAAA,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC,EAAE;AACrC,oBAAA,MAAM,cAAc,CAAC;iBACxB;AAED,gBAAA,MAAM,OAAO,GAAG,CAAC,+BAA+B,CAAU,CAAC;gBAE3D,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,MAAM,EAAE;AACJ,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,IAAI,EAAE,eAAe;AACxB,qBAAA;AACJ,iBAAA,CAAC,CAAC;aACN;AAED,YAAA,OAAO,MAAM,CAAC;SACjB;AAED,QAAA,gCAAgC,EAAE;AAC9B,YAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AACxB,gBAAA,MAAM,gCAAgC,CAAC;aAC1C;YAED,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;AAClD,gBAAA,MAAM,gCAAgC,CAAC;aAC1C;YAED,MAAM,aAAa,GAAG,aAAa,CAAC;YAEpC,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAEtD,YAAA,IAAI,SAAS,KAAK,SAAS,EAAE;AACzB,gBAAA,OAAO,EAAE,CAAC;aACb;AAED,YAAA,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;YAElC,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAC,GAAG,SAAS,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAExE,YAAA,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEpB,YAAA,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;AAElC,YAAA,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAA,CAAE,CAAC,CAAC;AAEvD,YAAA,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEpB,YAAA,MAAM,CAAC,aAAa,YAAY,KAAK,CAAC,CAAC;YAEvC,MAAM,MAAM,GAAG,aAAa,CAAC;AAE7B,YAAA,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE;AAC9C,gBAAA,OAAO,EAAE,CAAC;aACb;AAED,YAAA,MAAM,OAAO,GAAG;gBACZ,gCAAgC;AAChC,gBAAA,CAAA,EAAG,GAAG,CAAE,CAAA;AACR,gBAAA,CAAA,EAAG,GAAG,CAAE,CAAA;aACF,CAAC;YAEX,OAAO;AACH,gBAAA;AACI,oBAAA,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,CAAsB,mBAAA,EAAA,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpD;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,MAAM,EAAE;AACJ,wBAAA,IAAI,EAAE,WAAW;AACjB,wBAAA,IAAI,EAAE,aAAa;AACtB,qBAAA;AACJ,iBAAA;aACJ,CAAC;SACL;AAED,QAAA,MAAM,CAAC,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,aAAa,CAAC;QAE5B,MAAM,MAAM,GAAqB,EAAE,CAAC;AAEpC,QAAA,uBAAuB,EAAE;AACrB,YAAA,IAAI,aAAa,KAAK,UAAU,EAAE;AAC9B,gBAAA,MAAM,uBAAuB,CAAC;aACjC;AAED,YAAA,IAAI,gBAAgB,KAAK,SAAS,EAAE;AAChC,gBAAA,MAAM,uBAAuB,CAAC;aACjC;AAED,YAAA,uBAAuB,EAAE;gBACrB,MAAM,UAAU,GAAG,QAAQ,CAAC;AAE5B,gBAAA,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAE5C,IAAI,CAAC,MAAM,EAAE;AACT,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;gBAED,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB,gBAAA,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE;AAC3B,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;AAED,gBAAA,MAAM,OAAO,GAAG;oBACZ,iCAAiC;AACjC,oBAAA,CAAA,EAAG,SAAS,CAAE,CAAA;iBACR,CAAC;gBAEX,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,MAAM,EAAE;AACJ,wBAAA,IAAI,EAAE,gBAAgB;AACtB,wBAAA,IAAI,EAAE,UAAU;AACnB,qBAAA;AACJ,iBAAA,CAAC,CAAC;aACN;AAED,YAAA,uBAAuB,EAAE;gBACrB,MAAM,UAAU,GAAG,QAAQ,CAAC;AAE5B,gBAAA,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAE5C,IAAI,CAAC,MAAM,EAAE;AACT,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;gBAED,MAAM,iBAAiB,GAAG,MAAM,CAAC;gBAEjC,IACI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM;AAC7D,oBAAA,iBAAiB,EACnB;AACE,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;AAED,gBAAA,MAAM,OAAO,GAAG;oBACZ,iCAAiC;AACjC,oBAAA,CAAA,EAAG,iBAAiB,CAAE,CAAA;iBAChB,CAAC;gBAEX,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,MAAM,EAAE;AACJ,wBAAA,IAAI,EAAE,gBAAgB;AACtB,wBAAA,IAAI,EAAE,UAAU;AACnB,qBAAA;AACJ,iBAAA,CAAC,CAAC;aACN;AAED,YAAA,uBAAuB,EAAE;gBACrB,MAAM,UAAU,GAAG,WAAW,CAAC;AAE/B,gBAAA,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAE5C,IAAI,CAAC,MAAM,EAAE;AACT,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;gBAED,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAExC,gBAAA,IACI,KAAK;qBACA,KAAK,CAAC,EAAE,CAAC;qBACT,MAAM,CACH,IAAI,IACA,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CACjE,CAAC,MAAM,IAAI,wBAAwB,EAC1C;AACE,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;AAED,gBAAA,MAAM,OAAO,GAAG;oBACZ,yCAAyC;AACzC,oBAAA,CAAA,EAAG,wBAAwB,CAAE,CAAA;iBACvB,CAAC;gBAEX,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,MAAM,EAAE;AACJ,wBAAA,IAAI,EAAE,gBAAgB;AACtB,wBAAA,IAAI,EAAE,UAAU;AACnB,qBAAA;AACJ,iBAAA,CAAC,CAAC;aACN;AAED,YAAA,uBAAuB,EAAE;gBACrB,MAAM,UAAU,GAAG,WAAW,CAAC;AAE/B,gBAAA,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAE5C,IAAI,CAAC,MAAM,EAAE;AACT,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;gBAED,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAExC,gBAAA,IACI,KAAK;qBACA,KAAK,CAAC,EAAE,CAAC;qBACT,MAAM,CACH,IAAI,IACA,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CACjE,CAAC,MAAM,IAAI,wBAAwB,EAC1C;AACE,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;AAED,gBAAA,MAAM,OAAO,GAAG;oBACZ,yCAAyC;AACzC,oBAAA,CAAA,EAAG,wBAAwB,CAAE,CAAA;iBACvB,CAAC;gBAEX,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,MAAM,EAAE;AACJ,wBAAA,IAAI,EAAE,gBAAgB;AACtB,wBAAA,IAAI,EAAE,UAAU;AACnB,qBAAA;AACJ,iBAAA,CAAC,CAAC;aACN;AAED,YAAA,uBAAuB,EAAE;gBACrB,MAAM,UAAU,GAAG,cAAc,CAAC;AAElC,gBAAA,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAE5C,IAAI,CAAC,MAAM,EAAE;AACT,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;gBAED,MAAM,sBAAsB,GAAG,MAAM,CAAC;gBAEtC,IACI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM;AACjE,oBAAA,sBAAsB,EACxB;AACE,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;AAED,gBAAA,MAAM,OAAO,GAAG;oBACZ,uCAAuC;AACvC,oBAAA,CAAA,EAAG,sBAAsB,CAAE,CAAA;iBACrB,CAAC;gBAEX,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,MAAM,EAAE;AACJ,wBAAA,IAAI,EAAE,gBAAgB;AACtB,wBAAA,IAAI,EAAE,UAAU;AACnB,qBAAA;AACJ,iBAAA,CAAC,CAAC;aACN;AAED,YAAA,uBAAuB,EAAE;gBACrB,MAAM,UAAU,GAAG,aAAa,CAAC;AAEjC,gBAAA,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAEjD,IAAI,CAAC,WAAW,EAAE;AACd,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;AAED,gBAAA,MAAM,sBAAsB,GAAG,eAAe,CAAC,IAAI,CAC/C,cAAc,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU,CACjE,CAAC;gBAEF,IAAI,CAAC,sBAAsB,EAAE;AACzB,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;AAED,gBAAA,MAAM,aAAa,GAAG,CAAC,MAAK;AACxB,oBAAA,IAAI,EAAE,aAAa,EAAE,GAAG,sBAAsB,CAAC;AAE/C,oBAAA,MAAM,CAAC,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC;AAE1C,oBAAA,eAAe,EAAE;wBACb,MAAM,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC,oBAAoB,IAAI,EAAE,CAAC;wBAElE,IAAI,CAAC,gBAAgB,EAAE;AACnB,4BAAA,MAAM,eAAe,CAAC;yBACzB;AAED,wBAAA,aAAa,GAAG,YAAY,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;qBACjE;AAED,oBAAA,OAAO,aAAa,CAAC;iBACxB,GAAG,CAAC;AAEL,gBAAA,IAAI,aAAa,KAAK,EAAE,EAAE;AACtB,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;AAED,gBAAA,IAAI,KAAK,KAAK,aAAa,EAAE;AACzB,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;AAED,gBAAA,MAAM,OAAO,GAAG,CAAC,mCAAmC,CAAU,CAAC;gBAE/D,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,MAAM,EAAE;AACJ,wBAAA,IAAI,EAAE,gBAAgB;AACtB,wBAAA,IAAI,EAAE,UAAU;AACnB,qBAAA;AACJ,iBAAA,CAAC,CAAC;aACN;AAED,YAAA,uBAAuB,EAAE;gBACrB,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,gBAAA,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAE9C,IAAI,CAAC,QAAQ,EAAE;AACX,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;AAED,gBAAA,MAAM,mBAAmB,GAAG,eAAe,CAAC,IAAI,CAC5C,cAAc,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,CAC9D,CAAC;gBAEF,IAAI,CAAC,mBAAmB,EAAE;AACtB,oBAAA,MAAM,uBAAuB,CAAC;iBACjC;gBAED,MAAM,CAAC,OAAO,mBAAmB,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC;gBAE9D;AACI,oBAAA,MAAM,UAAU,GAAG,mBAAmB,CAAC,aAAa,CAAC;AAErD,oBAAA,IAAI,UAAU,KAAK,EAAE,EAAE;AACnB,wBAAA,MAAM,uBAAuB,CAAC;qBACjC;AAED,oBAAA,IAAI,KAAK,KAAK,UAAU,EAAE;AACtB,wBAAA,MAAM,uBAAuB,CAAC;qBACjC;iBACJ;AAED,gBAAA,MAAM,OAAO,GAAG,CAAC,gCAAgC,CAAU,CAAC;gBAE5D,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;AACrB,oBAAA,MAAM,EAAE;AACJ,wBAAA,IAAI,EAAE,gBAAgB;AACtB,wBAAA,IAAI,EAAE,UAAU;AACnB,qBAAA;AACJ,iBAAA,CAAC,CAAC;aACN;SACJ;AAED,QAAA,iCAAiC,EAAE;AAC/B,YAAA,IAAI,aAAa,KAAK,kBAAkB,EAAE;AACtC,gBAAA,MAAM,iCAAiC,CAAC;aAC3C;AAED,YAAA,MAAM,sBAAsB,GAAG,eAAe,CAAC,IAAI,CAC/C,cAAc,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU,CACjE,CAAC;AAEF,YAAA,MAAM,CAAC,sBAAsB,KAAK,SAAS,CAAC,CAAC;YAE7C,MAAM,CAAC,OAAO,sBAAsB,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC;YAEjE;AACI,gBAAA,MAAM,aAAa,GAAG,sBAAsB,CAAC,aAAa,CAAC;AAE3D,gBAAA,IAAI,KAAK,KAAK,aAAa,EAAE;AACzB,oBAAA,MAAM,iCAAiC,CAAC;iBAC3C;aACJ;AAED,YAAA,MAAM,OAAO,GAAG,CAAC,+BAA+B,CAAU,CAAC;YAE3D,MAAM,CAAC,IAAI,CAAC;gBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,gBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,gBAAA,UAAU,EAAE,SAAS;AACrB,gBAAA,MAAM,EAAE;AACJ,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,IAAI,EAAE,gCAAgC;AACzC,iBAAA;AACJ,aAAA,CAAC,CAAC;SACN;AAED,QAAA,MAAM,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;AAEjC,QAAA,cAAc,EAAE;AACZ,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;AACrB,gBAAA,MAAM,cAAc,CAAC;aACxB;AAED,YAAA,IAAI,KAAK,KAAK,EAAE,EAAE;AACd,gBAAA,MAAM,cAAc,CAAC;aACxB;AAED,YAAA,MAAM,OAAO,GAAG,CAAC,+BAA+B,CAAU,CAAC;YAE3D,MAAM,CAAC,IAAI,CAAC;gBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,gBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,gBAAA,UAAU,EAAE,SAAS;AACrB,gBAAA,MAAM,EAAE;AACJ,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,IAAI,EAAE,eAAe;AACxB,iBAAA;AACJ,aAAA,CAAC,CAAC;SACN;AAED,QAAA,WAAW,EAAE;YACT,MAAM,aAAa,GAAG,QAAQ,CAAC;AAE/B,YAAA,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;YAE5C,IAAI,CAAC,SAAS,EAAE;AACZ,gBAAA,MAAM,WAAW,CAAC;aACrB;AAED,YAAA,MAAM,EACF,oBAAoB,EAAE,gBAAgB,GAAG,KAAK,EAC9C,GAAG,EACH,GAAG,EACN,GAAG,SAAS,CAAC;AAEd,YAAA,IAAI,gBAAgB,IAAI,KAAK,KAAK,EAAE,EAAE;AAClC,gBAAA,MAAM,WAAW,CAAC;aACrB;AAED,YAAA,MAAM,MAAM,GAA0B;AAClC,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,IAAI,EAAE,aAAa;aACtB,CAAC;AAEF,YAAA,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAG,EAAA,GAAG,CAAE,CAAA,CAAC,EAAE;gBAC1C,MAAM,OAAO,GAAG,CAAC,+BAA+B,EAAE,CAAG,EAAA,GAAG,CAAE,CAAA,CAAU,CAAC;gBAErE,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;oBACrB,MAAM;AACT,iBAAA,CAAC,CAAC;aACN;AAED,YAAA,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAG,EAAA,GAAG,CAAE,CAAA,CAAC,EAAE;gBAC1C,MAAM,OAAO,GAAG,CAAC,gCAAgC,EAAE,CAAG,EAAA,GAAG,CAAE,CAAA,CAAU,CAAC;gBAEtE,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;oBACrB,MAAM;AACT,iBAAA,CAAC,CAAC;aACN;SACJ;AAED,QAAA,WAAW,EAAE;YACT,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,YAAA,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AAE5C,YAAA,IAAI,SAAS,KAAK,SAAS,EAAE;AACzB,gBAAA,MAAM,WAAW,CAAC;aACrB;AAED,YAAA,MAAM,EACF,oBAAoB,EAAE,gBAAgB,GAAG,KAAK,EAC9C,OAAO,EACP,eAAe,EAAE,eAAe,EACnC,GAAG,SAAS,CAAC;AAEd,YAAA,IAAI,gBAAgB,IAAI,KAAK,KAAK,EAAE,EAAE;AAClC,gBAAA,MAAM,WAAW,CAAC;aACrB;YAED,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACjC,gBAAA,MAAM,WAAW,CAAC;aACrB;AAED,YAAA,MAAM,OAAO,GAAG;AACZ,gBAAA,eAAe,IAAI,EAAE,CAAwB,oBAAoB,CAAC;gBAClE,OAAO;aACD,CAAC;YAEX,MAAM,CAAC,IAAI,CAAC;gBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,cAAc,CAAC,GAAG,OAAO,CAAC,SAAS,CAC5F;AACD,gBAAA,eAAe,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC;AAC3C,gBAAA,UAAU,EAAE,SAAS;AACrB,gBAAA,MAAM,EAAE;AACJ,oBAAA,IAAI,EAAE,WAAW;AACjB,oBAAA,IAAI,EAAE,aAAa;AACtB,iBAAA;AACJ,aAAA,CAAC,CAAC;SACN;AAED,QAAA,WAAW,EAAE;YACT;gBACI,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC5C,IACI,SAAS,KAAK,SAAS;AACvB,oBAAA,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW;AACrC,oBAAA,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,EACrC;AACE,oBAAA,MAAM,WAAW,CAAC;iBACrB;aACJ;YAED,MAAM,aAAa,GAAG,OAAO,CAAC;AAE9B,YAAA,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AAE5C,YAAA,IAAI,SAAS,KAAK,SAAS,EAAE;AACzB,gBAAA,MAAM,WAAW,CAAC;aACrB;YAED,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,GAAG,KAAK,EAAE,GAAG,SAAS,CAAC;AAErE,YAAA,IAAI,gBAAgB,IAAI,KAAK,KAAK,EAAE,EAAE;AAClC,gBAAA,MAAM,WAAW,CAAC;aACrB;AAED,YAAA,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACzB,gBAAA,MAAM,WAAW,CAAC;aACrB;YAED,MAAM,OAAO,GAAG,CAAC,EAAE,CAAwB,qBAAqB,CAAC,CAAU,CAAC;YAE5E,MAAM,CAAC,IAAI,CAAC;gBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,gBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,gBAAA,UAAU,EAAE,SAAS;AACrB,gBAAA,MAAM,EAAE;AACJ,oBAAA,IAAI,EAAE,WAAW;AACjB,oBAAA,IAAI,EAAE,aAAa;AACtB,iBAAA;AACJ,aAAA,CAAC,CAAC;SACN;AAED,QAAA,WAAW,EAAE;YACT,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,YAAA,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AAE5C,YAAA,IAAI,SAAS,KAAK,SAAS,EAAE;AACzB,gBAAA,MAAM,WAAW,CAAC;aACrB;AAED,YAAA,MAAM,EACF,oBAAoB,EAAE,gBAAgB,GAAG,KAAK,EAC9C,GAAG,EACH,GAAG,EACN,GAAG,SAAS,CAAC;AAEd,YAAA,IAAI,gBAAgB,IAAI,KAAK,KAAK,EAAE,EAAE;AAClC,gBAAA,MAAM,WAAW,CAAC;aACrB;AAED,YAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAEjC,YAAA,MAAM,MAAM,GAA0B;AAClC,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,IAAI,EAAE,aAAa;aACtB,CAAC;AAEF,YAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;AACjB,gBAAA,MAAM,OAAO,GAAG,CAAC,iBAAiB,CAAU,CAAC;gBAE7C,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;oBACrB,MAAM;AACT,iBAAA,CAAC,CAAC;AAEH,gBAAA,MAAM,WAAW,CAAC;aACrB;YAED,IAAI,GAAG,IAAI,QAAQ,GAAG,QAAQ,CAAC,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC,EAAE;gBACtC,MAAM,OAAO,GAAG,CAAC,mCAAmC,EAAE,CAAG,EAAA,GAAG,CAAE,CAAA,CAAU,CAAC;gBAEzE,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;oBACrB,MAAM;AACT,iBAAA,CAAC,CAAC;AAEH,gBAAA,MAAM,WAAW,CAAC;aACrB;YAED,IAAI,GAAG,IAAI,QAAQ,GAAG,QAAQ,CAAC,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC,EAAE;AACtC,gBAAA,MAAM,OAAO,GAAG;oBACZ,qCAAqC;AACrC,oBAAA,CAAA,EAAG,GAAG,CAAE,CAAA;iBACF,CAAC;gBAEX,MAAM,CAAC,IAAI,CAAC;oBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,oBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,oBAAA,UAAU,EAAE,SAAS;oBACrB,MAAM;AACT,iBAAA,CAAC,CAAC;AAEH,gBAAA,MAAM,WAAW,CAAC;aACrB;SACJ;AAED,QAAA,WAAW,EAAE;YACT,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,YAAA,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AAE5C,YAAA,IAAI,SAAS,KAAK,SAAS,EAAE;AACzB,gBAAA,MAAM,WAAW,CAAC;aACrB;AAED,YAAA,IAAI,KAAK,KAAK,EAAE,EAAE;AACd,gBAAA,MAAM,WAAW,CAAC;aACrB;YAED,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AACvC,gBAAA,MAAM,WAAW,CAAC;aACrB;YAED,MAAM,OAAO,GAAG,CAAC,EAAE,CAAwB,iBAAiB,CAAC,CAAU,CAAC;YAExE,MAAM,CAAC,IAAI,CAAC;gBACR,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAChD,mBAAmB,aAAa,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CACpF;AACD,gBAAA,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AACnC,gBAAA,UAAU,EAAE,SAAS;AACrB,gBAAA,MAAM,EAAE;AACJ,oBAAA,IAAI,EAAE,WAAW;AACjB,oBAAA,IAAI,EAAE,aAAa;AACtB,iBAAA;AACJ,aAAA,CAAC,CAAC;SACN;;AAID,QAAA,OAAO,MAAM,CAAC;KACjB;8GAv2CQ,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cADT,MAAM,EAAA,CAAA,CAAA,EAAA;;2FACnB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACpHlC;;AAEG;;;;"}
1
+ {"version":3,"file":"keycloakify-angular-login-services-user-profile-form.mjs","sources":["../../src/login/services/user-profile-form/user-profile-form.service.ts","../../src/login/services/user-profile-form/keycloakify-angular-login-services-user-profile-form.ts"],"sourcesContent":["import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport type { I18n } from '@keycloakify/angular/login/i18n';\nimport { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';\nimport { KC_LOGIN_CONTEXT } from '@keycloakify/angular/login/tokens/kc-context';\nimport { DO_MAKE_USER_CONFIRM_PASSWORD } from '@keycloakify/angular/login/tokens/make-user-confirm-password';\nimport type {\n Attribute,\n PasswordPolicies,\n Validators\n} from 'keycloakify/login/KcContext';\nimport * as reactlessApi from 'keycloakify/login/lib/getUserProfileApi';\nimport { BehaviorSubject, map, Observable } from 'rxjs';\nimport { assert, type Equals } from 'tsafe/assert';\n\nexport { getButtonToDisplayForMultivaluedAttributeField } from 'keycloakify/login/lib/getUserProfileApi';\n\nexport type FormFieldError = {\n errorMessage: SafeHtml;\n errorMessageStr: string;\n source: FormFieldError.Source;\n fieldIndex: number | undefined;\n};\n\n{\n type A = Omit<FormFieldError, 'errorMessage' | 'errorMessageStr'>;\n type B = Omit<reactlessApi.FormFieldError, 'advancedMsgArgs'>;\n\n assert<Equals<A, B>>();\n}\n\nexport namespace FormFieldError {\n export type Source =\n | Source.Validator\n | Source.PasswordPolicy\n | Source.Server\n | Source.Other;\n\n export namespace Source {\n export type Validator = {\n type: 'validator';\n name: keyof Validators;\n };\n export type PasswordPolicy = {\n type: 'passwordPolicy';\n name: keyof PasswordPolicies;\n };\n export type Server = {\n type: 'server';\n };\n\n export type Other = {\n type: 'other';\n rule: 'passwordConfirmMatchesPassword' | 'requiredField';\n };\n }\n}\n\n{\n type A = FormFieldError.Source;\n type B = reactlessApi.FormFieldError.Source;\n\n assert<Equals<A, B>>();\n}\n\nexport type FormFieldState = {\n attribute: Attribute;\n displayableErrors: FormFieldError[];\n valueOrValues: string | string[];\n};\n\n{\n type A = Omit<FormFieldState, 'displayableErrors'>;\n type B = Omit<reactlessApi.FormFieldState, 'displayableErrors'>;\n\n assert<Equals<A, B>>();\n}\n\nexport type FormState = {\n isFormSubmittable: boolean;\n formFieldStates: FormFieldState[];\n};\n\n{\n type A = Omit<FormState, 'formFieldStates'>;\n type B = Omit<FormState, 'formFieldStates'>;\n\n assert<Equals<A, B>>();\n}\n\nexport type FormAction =\n | {\n action: 'update';\n name: string;\n valueOrValues: string | string[];\n /** Default false */\n displayErrorsImmediately?: boolean;\n }\n | {\n action: 'focus lost';\n name: string;\n fieldIndex: number | undefined;\n };\n\n{\n type A = FormAction;\n type B = reactlessApi.FormAction;\n\n assert<Equals<A, B>>();\n}\n\nexport type KcContextLike = reactlessApi.KcContextLike;\n\nexport type I18nLike = Pick<I18n, 'advancedMsgStr'>;\n\n@Injectable({ providedIn: 'root' })\nexport class UserProfileFormService implements OnDestroy {\n #kcContext = inject<KcContextLike>(KC_LOGIN_CONTEXT);\n #i18n = inject<I18nLike>(LOGIN_I18N);\n #doMakeUserConfirmPassword = inject(DO_MAKE_USER_CONFIRM_PASSWORD);\n #domSanitizer = inject(DomSanitizer);\n #internal_formState$: BehaviorSubject<reactlessApi.FormState>;\n #unsubscribe: (() => void) | undefined;\n public formState$: Observable<FormState>;\n public dispatchFormAction: (action: FormAction) => void;\n constructor() {\n const api = reactlessApi.getUserProfileApi({\n kcContext: this.#kcContext,\n doMakeUserConfirmPassword: this.#doMakeUserConfirmPassword\n });\n this.#internal_formState$ = new BehaviorSubject<reactlessApi.FormState>(\n api.getFormState()\n );\n this.#unsubscribe = api.subscribeToFormState(() => {\n this.#internal_formState$.next(api.getFormState());\n }).unsubscribe;\n this.formState$ = this.#internal_formState$.asObservable().pipe(\n takeUntilDestroyed(),\n map(formState_reactless => ({\n isFormSubmittable: formState_reactless.isFormSubmittable,\n formFieldStates: formState_reactless.formFieldStates.map(\n formFieldState_reactless => ({\n attribute: formFieldState_reactless.attribute,\n valueOrValues: formFieldState_reactless.valueOrValues,\n displayableErrors: formFieldState_reactless.displayableErrors.map(\n (formFieldError_reactless, i) => ({\n errorMessage: this.#domSanitizer.bypassSecurityTrustHtml(\n this.#i18n.advancedMsgStr(\n ...formFieldError_reactless.advancedMsgArgs\n )\n ),\n errorMessageStr: this.#i18n.advancedMsgStr(\n ...formFieldError_reactless.advancedMsgArgs\n ),\n source: formFieldError_reactless.source,\n fieldIndex: formFieldError_reactless.fieldIndex\n })\n )\n })\n )\n }))\n );\n this.dispatchFormAction = api.dispatchFormAction;\n }\n\n ngOnDestroy(): void {\n this.#internal_formState$.complete();\n this.#internal_formState$.unsubscribe();\n if (this.#unsubscribe) this.#unsubscribe();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -12,7 +12,6 @@ export declare class AddRemoveButtonsMultiValuedAttributeComponent {
12
12
  hasAdd: import("@angular/core").Signal<boolean>;
13
13
  onAdd(): void;
14
14
  onRemove(): void;
15
- private getButtonToDisplayForMultivaluedAttributeField;
16
15
  static ɵfac: i0.ɵɵFactoryDeclaration<AddRemoveButtonsMultiValuedAttributeComponent, never>;
17
16
  static ɵcmp: i0.ɵɵComponentDeclaration<AddRemoveButtonsMultiValuedAttributeComponent, "kc-add-remove-buttons-multi-valued-attribute", never, { "attribute": { "alias": "attribute"; "required": false; "isSignal": true; }; "values": { "alias": "values"; "required": false; "isSignal": true; }; "fieldIndex": { "alias": "fieldIndex"; "required": false; "isSignal": true; }; }, { "dispatchFormAction": "dispatchFormAction"; }, never, never, true, never>;
18
17
  }
@@ -2,30 +2,20 @@ import { TemplateRef } from '@angular/core';
2
2
  import { ComponentReference } from '@keycloakify/angular/login/classes/component-reference';
3
3
  import type { I18n } from '@keycloakify/angular/login/i18n';
4
4
  import type { KcContext } from '@keycloakify/angular/login/KcContext';
5
- import { type FormAction, UserProfileFormService } from '@keycloakify/angular/login/services/user-profile-form';
5
+ import { type FormAction } from '@keycloakify/angular/login/services/user-profile-form';
6
6
  import type { ClassKey } from 'keycloakify/login/lib/kcClsx';
7
7
  import * as i0 from "@angular/core";
8
8
  export declare class UserProfileFormFieldsComponent extends ComponentReference {
9
9
  #private;
10
10
  i18n: I18n;
11
11
  kcContext: KcContext;
12
- userProfileFormService: UserProfileFormService;
13
12
  doMakeUserConfirmPassword: boolean;
14
13
  doUseDefaultCss: boolean;
15
14
  classes: Partial<Record<ClassKey, string>>;
16
- onIsFormSubmittable: import("@angular/core").OutputEmitterRef<boolean>;
17
- formState: import("@angular/core").Signal<{
18
- isFormSubmittable: boolean;
19
- formFieldStates: {
20
- attribute: import("keycloakify/login/KcContext").Attribute;
21
- displayableErrors: import("@keycloakify/angular/login/services/user-profile-form").FormFieldError[];
22
- valueOrValues: string | string[];
23
- }[];
24
- }>;
15
+ formState$: import("rxjs").Observable<import("@keycloakify/angular/login/services/user-profile-form").FormState>;
25
16
  beforeField: TemplateRef<unknown> | undefined;
26
17
  afterField: TemplateRef<unknown> | undefined;
27
- constructor();
28
18
  onDispatch(formAction: FormAction): void;
29
19
  static ɵfac: i0.ɵɵFactoryDeclaration<UserProfileFormFieldsComponent, never>;
30
- static ɵcmp: i0.ɵɵComponentDeclaration<UserProfileFormFieldsComponent, "kc-user-profile-form-fields", never, {}, { "onIsFormSubmittable": "onIsFormSubmittable"; }, ["beforeField", "afterField"], never, true, never>;
20
+ static ɵcmp: i0.ɵɵComponentDeclaration<UserProfileFormFieldsComponent, "kc-user-profile-form-fields", never, {}, {}, ["beforeField", "afterField"], never, true, never>;
31
21
  }
@@ -20,8 +20,7 @@ export declare class IdpReviewUserProfileComponent extends ComponentReference {
20
20
  infoNode: import("@angular/core").Signal<TemplateRef<HTMLElement> | undefined>;
21
21
  socialProvidersNode: import("@angular/core").Signal<TemplateRef<HTMLElement> | undefined>;
22
22
  userProfileFormFields: import("@angular/core").InputSignal<Type<UserProfileFormFieldsComponent> | undefined>;
23
- isFormSubmittable: import("@angular/core").WritableSignal<boolean>;
24
- constructor();
23
+ isFormSubmittable: import("@angular/core").Signal<boolean>;
25
24
  onCallback(): void;
26
25
  static ɵfac: i0.ɵɵFactoryDeclaration<IdpReviewUserProfileComponent, never>;
27
26
  static ɵcmp: i0.ɵɵComponentDeclaration<IdpReviewUserProfileComponent, "kc-idp-review-user-profile", never, { "userProfileFormFields": { "alias": "userProfileFormFields"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -19,9 +19,8 @@ export declare class LoginUpdateProfileComponent extends ComponentReference {
19
19
  headerNode: import("@angular/core").Signal<TemplateRef<HTMLElement> | undefined>;
20
20
  infoNode: import("@angular/core").Signal<TemplateRef<HTMLElement> | undefined>;
21
21
  socialProvidersNode: import("@angular/core").Signal<TemplateRef<HTMLElement> | undefined>;
22
- isFormSubmittable: import("@angular/core").WritableSignal<boolean>;
22
+ isFormSubmittable: import("@angular/core").Signal<boolean>;
23
23
  userProfileFormFields: import("@angular/core").InputSignal<Type<UserProfileFormFieldsComponent> | undefined>;
24
- constructor();
25
24
  static ɵfac: i0.ɵɵFactoryDeclaration<LoginUpdateProfileComponent, never>;
26
25
  static ɵcmp: i0.ɵɵComponentDeclaration<LoginUpdateProfileComponent, "kc-login-update-profile", never, { "userProfileFormFields": { "alias": "userProfileFormFields"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
27
26
  }
@@ -19,10 +19,9 @@ export declare class RegisterComponent extends ComponentReference {
19
19
  headerNode: import("@angular/core").Signal<TemplateRef<HTMLElement> | undefined>;
20
20
  infoNode: import("@angular/core").Signal<TemplateRef<HTMLElement> | undefined>;
21
21
  socialProvidersNode: import("@angular/core").Signal<TemplateRef<HTMLElement> | undefined>;
22
- isFormSubmittable: import("@angular/core").WritableSignal<boolean>;
22
+ isFormSubmittable: import("@angular/core").Signal<boolean>;
23
23
  areTermsAccepted: import("@angular/core").WritableSignal<boolean>;
24
24
  userProfileFormFields: import("@angular/core").InputSignal<Type<UserProfileFormFieldsComponent> | undefined>;
25
- constructor();
26
25
  onCallback(): void;
27
26
  static ɵfac: i0.ɵɵFactoryDeclaration<RegisterComponent, never>;
28
27
  static ɵcmp: i0.ɵɵComponentDeclaration<RegisterComponent, "kc-register", never, { "userProfileFormFields": { "alias": "userProfileFormFields"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -17,8 +17,7 @@ export declare class UpdateEmailComponent extends ComponentReference {
17
17
  infoNode: import("@angular/core").Signal<TemplateRef<HTMLElement> | undefined>;
18
18
  socialProvidersNode: import("@angular/core").Signal<TemplateRef<HTMLElement> | undefined>;
19
19
  userProfileFormFields: import("@angular/core").InputSignal<Type<UserProfileFormFieldsComponent> | undefined>;
20
- isFormSubmittable: import("@angular/core").WritableSignal<boolean>;
21
- constructor();
20
+ isFormSubmittable: import("@angular/core").Signal<boolean>;
22
21
  static ɵfac: i0.ɵɵFactoryDeclaration<UpdateEmailComponent, never>;
23
22
  static ɵcmp: i0.ɵɵComponentDeclaration<UpdateEmailComponent, "kc-update-email", never, { "userProfileFormFields": { "alias": "userProfileFormFields"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
24
23
  }
@@ -1,12 +1,16 @@
1
- import { Signal } from '@angular/core';
1
+ import { OnDestroy } from '@angular/core';
2
2
  import { SafeHtml } from '@angular/platform-browser';
3
- import type { KcContext } from '@keycloakify/angular/login/KcContext';
4
- import { type Attribute, type PasswordPolicies, type Validators } from 'keycloakify/login/KcContext';
5
- import type { KcContextLike as KcContextLike_i18n } from 'keycloakify/login/i18n/noJsx';
3
+ import type { I18n } from '@keycloakify/angular/login/i18n';
4
+ import type { Attribute, PasswordPolicies, Validators } from 'keycloakify/login/KcContext';
5
+ import * as reactlessApi from 'keycloakify/login/lib/getUserProfileApi';
6
+ import { Observable } from 'rxjs';
6
7
  import * as i0 from "@angular/core";
7
- type KcContextLike_useGetErrors = KcContextLike_i18n & {
8
- messagesPerField: Pick<KcContext['messagesPerField'], 'existsError' | 'get'>;
9
- passwordPolicies?: PasswordPolicies;
8
+ export { getButtonToDisplayForMultivaluedAttributeField } from 'keycloakify/login/lib/getUserProfileApi';
9
+ export type FormFieldError = {
10
+ errorMessage: SafeHtml;
11
+ errorMessageStr: string;
12
+ source: FormFieldError.Source;
13
+ fieldIndex: number | undefined;
10
14
  };
11
15
  export declare namespace FormFieldError {
12
16
  type Source = Source.Validator | Source.PasswordPolicy | Source.Server | Source.Other;
@@ -28,31 +32,12 @@ export declare namespace FormFieldError {
28
32
  };
29
33
  }
30
34
  }
31
- export type KcContextLike = KcContextLike_i18n & KcContextLike_useGetErrors & {
32
- profile: {
33
- attributesByName: Record<string, Attribute>;
34
- html5DataAnnotations?: Record<string, string>;
35
- };
36
- passwordRequired?: boolean;
37
- realm: {
38
- registrationEmailAsUsername: boolean;
39
- };
40
- url: {
41
- resourcesPath: string;
42
- };
43
- };
44
- export type FormFieldError = {
45
- errorMessage: SafeHtml;
46
- errorMessageStr: string;
47
- source: FormFieldError.Source;
48
- fieldIndex: number | undefined;
49
- };
50
- type FormFieldState = {
35
+ export type FormFieldState = {
51
36
  attribute: Attribute;
52
37
  displayableErrors: FormFieldError[];
53
38
  valueOrValues: string | string[];
54
39
  };
55
- type FormState = {
40
+ export type FormState = {
56
41
  isFormSubmittable: boolean;
57
42
  formFieldStates: FormFieldState[];
58
43
  };
@@ -67,20 +52,14 @@ export type FormAction = {
67
52
  name: string;
68
53
  fieldIndex: number | undefined;
69
54
  };
70
- export declare class UserProfileFormService {
71
- private kcContext;
72
- private i18n;
73
- private doMakeUserConfirmPassword;
74
- private loginResourceInjectorService;
75
- private sanitizer;
76
- private initialState;
77
- private state;
78
- formState: Signal<FormState>;
55
+ export type KcContextLike = reactlessApi.KcContextLike;
56
+ export type I18nLike = Pick<I18n, 'advancedMsgStr'>;
57
+ export declare class UserProfileFormService implements OnDestroy {
58
+ #private;
59
+ formState$: Observable<FormState>;
60
+ dispatchFormAction: (action: FormAction) => void;
79
61
  constructor();
80
- dispatchFormAction(formAction: FormAction): void;
81
- private getIsMultivaluedSingleField;
82
- private getErrors;
62
+ ngOnDestroy(): void;
83
63
  static ɵfac: i0.ɵɵFactoryDeclaration<UserProfileFormService, never>;
84
64
  static ɵprov: i0.ɵɵInjectableDeclaration<UserProfileFormService>;
85
65
  }
86
- export {};
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@keycloakify/angular",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "peerDependencies": {
5
- "keycloakify": "^11.3.4",
5
+ "keycloakify": "^11.3.9",
6
6
  "@angular/core": "^18.0.0",
7
7
  "@angular/common": "^18.0.0",
8
8
  "@angular/platform-browser": "^18.0.0"
@@ -543,12 +543,6 @@
543
543
  "esm": "./esm2022/login/services/login-resource-injector/keycloakify-angular-login-services-login-resource-injector.mjs",
544
544
  "default": "./fesm2022/keycloakify-angular-login-services-login-resource-injector.mjs"
545
545
  },
546
- "./login/services/submit": {
547
- "types": "./login/services/submit/index.d.ts",
548
- "esm2022": "./esm2022/login/services/submit/keycloakify-angular-login-services-submit.mjs",
549
- "esm": "./esm2022/login/services/submit/keycloakify-angular-login-services-submit.mjs",
550
- "default": "./fesm2022/keycloakify-angular-login-services-submit.mjs"
551
- },
552
546
  "./login/services/user-profile-form": {
553
547
  "types": "./login/services/user-profile-form/index.d.ts",
554
548
  "esm2022": "./esm2022/login/services/user-profile-form/keycloakify-angular-login-services-user-profile-form.mjs",
@@ -1,5 +1,5 @@
1
1
  import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';
2
- import { type FormAction } from '@keycloakify/angular/login/services/user-profile-form';
2
+ import { getButtonToDisplayForMultivaluedAttributeField, type FormAction } from '@keycloakify/angular/login/services/user-profile-form';
3
3
  import { LOGIN_I18N } from '@keycloakify/angular/login/tokens/i18n';
4
4
  import { type Attribute } from 'keycloakify/login/KcContext';
5
5
  import type { I18n } from '@keycloakify/angular/login/i18n';
@@ -30,7 +30,7 @@ export class AddRemoveButtonsMultiValuedAttributeComponent {
30
30
  const values = this.values();
31
31
  const fieldIndex = this.fieldIndex();
32
32
  if (attribute && values && fieldIndex) {
33
- return this.getButtonToDisplayForMultivaluedAttributeField({
33
+ return getButtonToDisplayForMultivaluedAttributeField({
34
34
  attribute,
35
35
  values,
36
36
  fieldIndex
@@ -43,7 +43,7 @@ export class AddRemoveButtonsMultiValuedAttributeComponent {
43
43
  const values = this.values();
44
44
  const fieldIndex = this.fieldIndex();
45
45
  if (attribute && values && fieldIndex) {
46
- return this.getButtonToDisplayForMultivaluedAttributeField({
46
+ return getButtonToDisplayForMultivaluedAttributeField({
47
47
  attribute,
48
48
  values,
49
49
  fieldIndex
@@ -67,70 +67,4 @@ export class AddRemoveButtonsMultiValuedAttributeComponent {
67
67
  valueOrValues: (this.values() ?? []).filter((_, i) => i !== this.fieldIndex())
68
68
  });
69
69
  }
70
-
71
- private getButtonToDisplayForMultivaluedAttributeField(params: { attribute: Attribute; values: string[]; fieldIndex: number }) {
72
- const { attribute, values, fieldIndex } = params;
73
-
74
- const hasRemove = (() => {
75
- if (values.length === 1) {
76
- return false;
77
- }
78
-
79
- const minCount = (() => {
80
- const { multivalued } = attribute.validators;
81
-
82
- if (multivalued === undefined) {
83
- return undefined;
84
- }
85
-
86
- const minStr = multivalued.min;
87
-
88
- if (minStr === undefined) {
89
- return undefined;
90
- }
91
-
92
- return parseInt(`${minStr}`);
93
- })();
94
-
95
- if (minCount === undefined) {
96
- return true;
97
- }
98
-
99
- if (values.length === minCount) {
100
- return false;
101
- }
102
-
103
- return true;
104
- })();
105
-
106
- const hasAdd = (() => {
107
- if (fieldIndex + 1 !== values.length) {
108
- return false;
109
- }
110
-
111
- const maxCount = (() => {
112
- const { multivalued } = attribute.validators;
113
-
114
- if (multivalued === undefined) {
115
- return undefined;
116
- }
117
-
118
- const maxStr = multivalued.max;
119
-
120
- if (maxStr === undefined) {
121
- return undefined;
122
- }
123
-
124
- return parseInt(`${maxStr}`);
125
- })();
126
-
127
- if (maxCount === undefined) {
128
- return true;
129
- }
130
-
131
- return values.length !== maxCount;
132
- })();
133
-
134
- return { hasRemove, hasAdd };
135
- }
136
70
  }