{"version":3,"file":"form-validator.mjs","sources":["../../../../src/moj/components/form-validator/form-validator.mjs"],"sourcesContent":["import { ConfigurableComponent } from 'govuk-frontend'\n\nimport { addAttributeValue, removeAttributeValue } from '../../helpers.mjs'\n\n/**\n * @augments {ConfigurableComponent<FormValidatorConfig, HTMLFormElement>}\n */\nexport class FormValidator extends ConfigurableComponent {\n  /**\n   * @param {Element | null} $root - HTML element to use for form validator\n   * @param {FormValidatorConfig} [config] - Form validator config\n   */\n  constructor($root, config = {}) {\n    super($root, config)\n\n    const $summary =\n      this.config.summary.element ||\n      document.querySelector(this.config.summary.selector)\n\n    if (!$summary || !($summary instanceof HTMLElement)) {\n      return this\n    }\n\n    this.$summary = $summary\n\n    this.errors = /** @type {ValidationError[]} */ ([])\n    this.validators = /** @type {Validator[]} */ ([])\n    this.originalTitle = document.title\n\n    this.$root.addEventListener('submit', this.onSubmit.bind(this))\n  }\n\n  escapeHtml(string = '') {\n    return String(string).replace(\n      /[&<>\"'`=/]/g,\n      (name) => FormValidator.entityMap[name]\n    )\n  }\n\n  resetTitle() {\n    document.title = this.originalTitle\n  }\n\n  updateTitle() {\n    document.title = `${this.errors.length} errors - ${document.title}`\n  }\n\n  showSummary() {\n    this.$summary.innerHTML = this.getSummaryHtml()\n    this.$summary.classList.remove('moj-hidden')\n    this.$summary.setAttribute('aria-labelledby', 'errorSummary-heading')\n    this.$summary.focus()\n  }\n\n  getSummaryHtml() {\n    let html =\n      '<h2 id=\"error-summary-title\" class=\"govuk-error-summary__title\">There is a problem</h2>'\n    html += '<div class=\"govuk-error-summary__body\">'\n    html += '<ul class=\"govuk-list govuk-error-summary__list\">'\n    for (const error of this.errors) {\n      html += '<li>'\n      html += `<a href=\"#${this.escapeHtml(error.fieldName)}\">`\n      html += this.escapeHtml(error.message)\n      html += '</a>'\n      html += '</li>'\n    }\n    html += '</ul>'\n    html += '</div>'\n    return html\n  }\n\n  hideSummary() {\n    this.$summary.classList.add('moj-hidden')\n    this.$summary.removeAttribute('aria-labelledby')\n  }\n\n  /**\n   * @param {SubmitEvent} event - Form submit event\n   */\n  onSubmit(event) {\n    this.removeInlineErrors()\n    this.hideSummary()\n    this.resetTitle()\n    if (!this.validate()) {\n      event.preventDefault()\n      this.updateTitle()\n      this.showSummary()\n      this.showInlineErrors()\n    }\n  }\n\n  showInlineErrors() {\n    for (const error of this.errors) {\n      this.showInlineError(error)\n    }\n  }\n\n  /**\n   * @param {ValidationError} error\n   */\n  showInlineError(error) {\n    const $errorSpan = document.createElement('span')\n    $errorSpan.id = `${error.fieldName}-error`\n    $errorSpan.classList.add('govuk-error-message')\n    $errorSpan.innerHTML = this.escapeHtml(error.message)\n\n    const $control = document.querySelector(`#${error.fieldName}`)\n    const $fieldset = $control.closest('.govuk-fieldset')\n    const $fieldContainer = ($fieldset || $control).closest('.govuk-form-group')\n\n    const $label = $fieldContainer.querySelector('label')\n    const $legend = $fieldContainer.querySelector('legend')\n\n    $fieldContainer.classList.add('govuk-form-group--error')\n\n    if ($fieldset && $legend) {\n      $legend.after($errorSpan)\n      $fieldContainer.setAttribute('aria-invalid', 'true')\n      addAttributeValue($fieldset, 'aria-describedby', $errorSpan.id)\n    } else if ($label && $control) {\n      $label.after($errorSpan)\n      $control.setAttribute('aria-invalid', 'true')\n      addAttributeValue($control, 'aria-describedby', $errorSpan.id)\n    }\n  }\n\n  removeInlineErrors() {\n    for (const error of this.errors) {\n      this.removeInlineError(error)\n    }\n  }\n\n  /**\n   * @param {ValidationError} error\n   */\n  removeInlineError(error) {\n    const $errorSpan = document.querySelector(`#${error.fieldName}-error`)\n\n    const $control = document.querySelector(`#${error.fieldName}`)\n    const $fieldset = $control.closest('.govuk-fieldset')\n    const $fieldContainer = ($fieldset || $control).closest('.govuk-form-group')\n\n    const $label = $fieldContainer.querySelector('label')\n    const $legend = $fieldContainer.querySelector('legend')\n\n    $errorSpan.remove()\n    $fieldContainer.classList.remove('govuk-form-group--error')\n\n    if ($fieldset && $legend) {\n      $fieldContainer.removeAttribute('aria-invalid')\n      removeAttributeValue($fieldset, 'aria-describedby', $errorSpan.id)\n    } else if ($label && $control) {\n      $control.removeAttribute('aria-invalid')\n      removeAttributeValue($control, 'aria-describedby', $errorSpan.id)\n    }\n  }\n\n  /**\n   * @param {string} fieldName - Field name\n   * @param {ValidationRule[]} rules - Validation rules\n   */\n  addValidator(fieldName, rules) {\n    this.validators.push({\n      fieldName,\n      rules,\n      field: this.$root.elements.namedItem(fieldName)\n    })\n  }\n\n  validate() {\n    this.errors = []\n\n    /** @type {Validator | null} */\n    let validator = null\n\n    /** @type {boolean | string} */\n    let validatorReturnValue = true\n\n    let i\n    let j\n\n    for (i = 0; i < this.validators.length; i++) {\n      validator = this.validators[i]\n      for (j = 0; j < validator.rules.length; j++) {\n        validatorReturnValue = validator.rules[j].method(\n          validator.field,\n          validator.rules[j].params\n        )\n\n        if (\n          typeof validatorReturnValue === 'boolean' &&\n          !validatorReturnValue\n        ) {\n          this.errors.push({\n            fieldName: validator.fieldName,\n            message: validator.rules[j].message\n          })\n          break\n        } else if (typeof validatorReturnValue === 'string') {\n          this.errors.push({\n            fieldName: validatorReturnValue,\n            message: validator.rules[j].message\n          })\n          break\n        }\n      }\n    }\n    return this.errors.length === 0\n  }\n\n  /**\n   * @type {Record<string, string>}\n   */\n  static entityMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;',\n    '/': '&#x2F;',\n    '`': '&#x60;',\n    '=': '&#x3D;'\n  }\n\n  /**\n   * Name for the component used when initialising using data-module attributes.\n   */\n  static moduleName = 'moj-form-validator'\n\n  /**\n   * Multi file upload default config\n   *\n   * @type {FormValidatorConfig}\n   */\n  static defaults = Object.freeze({\n    summary: {\n      selector: '.govuk-error-summary'\n    }\n  })\n\n  /**\n   * Multi file upload config schema\n   *\n   * @satisfies {Schema<FormValidatorConfig>}\n   */\n  static schema = Object.freeze(\n    /** @type {const} */ ({\n      properties: {\n        summary: { type: 'object' }\n      }\n    })\n  )\n}\n\n/**\n * @typedef {object} FormValidatorConfig\n * @property {object} [summary] - Error summary config\n * @property {string} [summary.selector] - Selector for error summary\n * @property {Element | null} [summary.element] - HTML element for error summary\n */\n\n/**\n * @typedef {object} ValidationRule\n * @property {(field: Validator['field'], params: Record<string, Validator['field']>) => boolean | string} method - Validation method\n * @property {string} message - Error message\n * @property {Record<string, Validator['field']>} [params] - Parameters for validation\n */\n\n/**\n * @typedef {object} ValidationError\n * @property {string} fieldName - Name of the field\n * @property {string} message - Validation error message\n */\n\n/**\n * @typedef {object} Validator\n * @property {string} fieldName - Name of the field\n * @property {ValidationRule[]} rules - Validation rules\n * @property {Element | RadioNodeList} field - Form field\n */\n\n/**\n * @import { Schema } from 'govuk-frontend/dist/govuk/common/configuration.mjs'\n */\n"],"names":["FormValidator","ConfigurableComponent","constructor","$root","config","$summary","summary","element","document","querySelector","selector","HTMLElement","errors","validators","originalTitle","title","addEventListener","onSubmit","bind","escapeHtml","string","String","replace","name","entityMap","resetTitle","updateTitle","length","showSummary","innerHTML","getSummaryHtml","classList","remove","setAttribute","focus","html","error","fieldName","message","hideSummary","add","removeAttribute","event","removeInlineErrors","validate","preventDefault","showInlineErrors","showInlineError","$errorSpan","createElement","id","$control","$fieldset","closest","$fieldContainer","$label","$legend","after","addAttributeValue","removeInlineError","removeAttributeValue","addValidator","rules","push","field","elements","namedItem","validator","validatorReturnValue","i","j","method","params","moduleName","defaults","Object","freeze","schema","properties","type"],"mappings":";;;AAIA;AACA;AACA;AACO,MAAMA,aAAa,SAASC,qBAAqB,CAAC;AACvD;AACF;AACA;AACA;AACEC,EAAAA,WAAWA,CAACC,KAAK,EAAEC,MAAM,GAAG,EAAE,EAAE;AAC9B,IAAA,KAAK,CAACD,KAAK,EAAEC,MAAM,CAAC;IAEpB,MAAMC,QAAQ,GACZ,IAAI,CAACD,MAAM,CAACE,OAAO,CAACC,OAAO,IAC3BC,QAAQ,CAACC,aAAa,CAAC,IAAI,CAACL,MAAM,CAACE,OAAO,CAACI,QAAQ,CAAC;IAEtD,IAAI,CAACL,QAAQ,IAAI,EAAEA,QAAQ,YAAYM,WAAW,CAAC,EAAE;AACnD,MAAA,OAAO,IAAI;AACb,IAAA;IAEA,IAAI,CAACN,QAAQ,GAAGA,QAAQ;AAExB,IAAA,IAAI,CAACO,MAAM,mCAAqC,EAAG;AACnD,IAAA,IAAI,CAACC,UAAU,6BAA+B,EAAG;AACjD,IAAA,IAAI,CAACC,aAAa,GAAGN,QAAQ,CAACO,KAAK;AAEnC,IAAA,IAAI,CAACZ,KAAK,CAACa,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAACC,QAAQ,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjE,EAAA;AAEAC,EAAAA,UAAUA,CAACC,MAAM,GAAG,EAAE,EAAE;AACtB,IAAA,OAAOC,MAAM,CAACD,MAAM,CAAC,CAACE,OAAO,CAC3B,aAAa,EACZC,IAAI,IAAKvB,aAAa,CAACwB,SAAS,CAACD,IAAI,CACxC,CAAC;AACH,EAAA;AAEAE,EAAAA,UAAUA,GAAG;AACXjB,IAAAA,QAAQ,CAACO,KAAK,GAAG,IAAI,CAACD,aAAa;AACrC,EAAA;AAEAY,EAAAA,WAAWA,GAAG;AACZlB,IAAAA,QAAQ,CAACO,KAAK,GAAG,CAAA,EAAG,IAAI,CAACH,MAAM,CAACe,MAAM,CAAA,UAAA,EAAanB,QAAQ,CAACO,KAAK,CAAA,CAAE;AACrE,EAAA;AAEAa,EAAAA,WAAWA,GAAG;IACZ,IAAI,CAACvB,QAAQ,CAACwB,SAAS,GAAG,IAAI,CAACC,cAAc,EAAE;IAC/C,IAAI,CAACzB,QAAQ,CAAC0B,SAAS,CAACC,MAAM,CAAC,YAAY,CAAC;IAC5C,IAAI,CAAC3B,QAAQ,CAAC4B,YAAY,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;AACrE,IAAA,IAAI,CAAC5B,QAAQ,CAAC6B,KAAK,EAAE;AACvB,EAAA;AAEAJ,EAAAA,cAAcA,GAAG;IACf,IAAIK,IAAI,GACN,yFAAyF;AAC3FA,IAAAA,IAAI,IAAI,yCAAyC;AACjDA,IAAAA,IAAI,IAAI,mDAAmD;AAC3D,IAAA,KAAK,MAAMC,KAAK,IAAI,IAAI,CAACxB,MAAM,EAAE;AAC/BuB,MAAAA,IAAI,IAAI,MAAM;MACdA,IAAI,IAAI,CAAA,UAAA,EAAa,IAAI,CAAChB,UAAU,CAACiB,KAAK,CAACC,SAAS,CAAC,CAAA,EAAA,CAAI;MACzDF,IAAI,IAAI,IAAI,CAAChB,UAAU,CAACiB,KAAK,CAACE,OAAO,CAAC;AACtCH,MAAAA,IAAI,IAAI,MAAM;AACdA,MAAAA,IAAI,IAAI,OAAO;AACjB,IAAA;AACAA,IAAAA,IAAI,IAAI,OAAO;AACfA,IAAAA,IAAI,IAAI,QAAQ;AAChB,IAAA,OAAOA,IAAI;AACb,EAAA;AAEAI,EAAAA,WAAWA,GAAG;IACZ,IAAI,CAAClC,QAAQ,CAAC0B,SAAS,CAACS,GAAG,CAAC,YAAY,CAAC;AACzC,IAAA,IAAI,CAACnC,QAAQ,CAACoC,eAAe,CAAC,iBAAiB,CAAC;AAClD,EAAA;;AAEA;AACF;AACA;EACExB,QAAQA,CAACyB,KAAK,EAAE;IACd,IAAI,CAACC,kBAAkB,EAAE;IACzB,IAAI,CAACJ,WAAW,EAAE;IAClB,IAAI,CAACd,UAAU,EAAE;AACjB,IAAA,IAAI,CAAC,IAAI,CAACmB,QAAQ,EAAE,EAAE;MACpBF,KAAK,CAACG,cAAc,EAAE;MACtB,IAAI,CAACnB,WAAW,EAAE;MAClB,IAAI,CAACE,WAAW,EAAE;MAClB,IAAI,CAACkB,gBAAgB,EAAE;AACzB,IAAA;AACF,EAAA;AAEAA,EAAAA,gBAAgBA,GAAG;AACjB,IAAA,KAAK,MAAMV,KAAK,IAAI,IAAI,CAACxB,MAAM,EAAE;AAC/B,MAAA,IAAI,CAACmC,eAAe,CAACX,KAAK,CAAC;AAC7B,IAAA;AACF,EAAA;;AAEA;AACF;AACA;EACEW,eAAeA,CAACX,KAAK,EAAE;AACrB,IAAA,MAAMY,UAAU,GAAGxC,QAAQ,CAACyC,aAAa,CAAC,MAAM,CAAC;AACjDD,IAAAA,UAAU,CAACE,EAAE,GAAG,GAAGd,KAAK,CAACC,SAAS,CAAA,MAAA,CAAQ;AAC1CW,IAAAA,UAAU,CAACjB,SAAS,CAACS,GAAG,CAAC,qBAAqB,CAAC;IAC/CQ,UAAU,CAACnB,SAAS,GAAG,IAAI,CAACV,UAAU,CAACiB,KAAK,CAACE,OAAO,CAAC;IAErD,MAAMa,QAAQ,GAAG3C,QAAQ,CAACC,aAAa,CAAC,CAAA,CAAA,EAAI2B,KAAK,CAACC,SAAS,CAAA,CAAE,CAAC;AAC9D,IAAA,MAAMe,SAAS,GAAGD,QAAQ,CAACE,OAAO,CAAC,iBAAiB,CAAC;IACrD,MAAMC,eAAe,GAAG,CAACF,SAAS,IAAID,QAAQ,EAAEE,OAAO,CAAC,mBAAmB,CAAC;AAE5E,IAAA,MAAME,MAAM,GAAGD,eAAe,CAAC7C,aAAa,CAAC,OAAO,CAAC;AACrD,IAAA,MAAM+C,OAAO,GAAGF,eAAe,CAAC7C,aAAa,CAAC,QAAQ,CAAC;AAEvD6C,IAAAA,eAAe,CAACvB,SAAS,CAACS,GAAG,CAAC,yBAAyB,CAAC;IAExD,IAAIY,SAAS,IAAII,OAAO,EAAE;AACxBA,MAAAA,OAAO,CAACC,KAAK,CAACT,UAAU,CAAC;AACzBM,MAAAA,eAAe,CAACrB,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC;MACpDyB,iBAAiB,CAACN,SAAS,EAAE,kBAAkB,EAAEJ,UAAU,CAACE,EAAE,CAAC;AACjE,IAAA,CAAC,MAAM,IAAIK,MAAM,IAAIJ,QAAQ,EAAE;AAC7BI,MAAAA,MAAM,CAACE,KAAK,CAACT,UAAU,CAAC;AACxBG,MAAAA,QAAQ,CAAClB,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC;MAC7CyB,iBAAiB,CAACP,QAAQ,EAAE,kBAAkB,EAAEH,UAAU,CAACE,EAAE,CAAC;AAChE,IAAA;AACF,EAAA;AAEAP,EAAAA,kBAAkBA,GAAG;AACnB,IAAA,KAAK,MAAMP,KAAK,IAAI,IAAI,CAACxB,MAAM,EAAE;AAC/B,MAAA,IAAI,CAAC+C,iBAAiB,CAACvB,KAAK,CAAC;AAC/B,IAAA;AACF,EAAA;;AAEA;AACF;AACA;EACEuB,iBAAiBA,CAACvB,KAAK,EAAE;IACvB,MAAMY,UAAU,GAAGxC,QAAQ,CAACC,aAAa,CAAC,CAAA,CAAA,EAAI2B,KAAK,CAACC,SAAS,CAAA,MAAA,CAAQ,CAAC;IAEtE,MAAMc,QAAQ,GAAG3C,QAAQ,CAACC,aAAa,CAAC,CAAA,CAAA,EAAI2B,KAAK,CAACC,SAAS,CAAA,CAAE,CAAC;AAC9D,IAAA,MAAMe,SAAS,GAAGD,QAAQ,CAACE,OAAO,CAAC,iBAAiB,CAAC;IACrD,MAAMC,eAAe,GAAG,CAACF,SAAS,IAAID,QAAQ,EAAEE,OAAO,CAAC,mBAAmB,CAAC;AAE5E,IAAA,MAAME,MAAM,GAAGD,eAAe,CAAC7C,aAAa,CAAC,OAAO,CAAC;AACrD,IAAA,MAAM+C,OAAO,GAAGF,eAAe,CAAC7C,aAAa,CAAC,QAAQ,CAAC;IAEvDuC,UAAU,CAAChB,MAAM,EAAE;AACnBsB,IAAAA,eAAe,CAACvB,SAAS,CAACC,MAAM,CAAC,yBAAyB,CAAC;IAE3D,IAAIoB,SAAS,IAAII,OAAO,EAAE;AACxBF,MAAAA,eAAe,CAACb,eAAe,CAAC,cAAc,CAAC;MAC/CmB,oBAAoB,CAACR,SAAS,EAAE,kBAAkB,EAAEJ,UAAU,CAACE,EAAE,CAAC;AACpE,IAAA,CAAC,MAAM,IAAIK,MAAM,IAAIJ,QAAQ,EAAE;AAC7BA,MAAAA,QAAQ,CAACV,eAAe,CAAC,cAAc,CAAC;MACxCmB,oBAAoB,CAACT,QAAQ,EAAE,kBAAkB,EAAEH,UAAU,CAACE,EAAE,CAAC;AACnE,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;AACEW,EAAAA,YAAYA,CAACxB,SAAS,EAAEyB,KAAK,EAAE;AAC7B,IAAA,IAAI,CAACjD,UAAU,CAACkD,IAAI,CAAC;MACnB1B,SAAS;MACTyB,KAAK;MACLE,KAAK,EAAE,IAAI,CAAC7D,KAAK,CAAC8D,QAAQ,CAACC,SAAS,CAAC7B,SAAS;AAChD,KAAC,CAAC;AACJ,EAAA;AAEAO,EAAAA,QAAQA,GAAG;IACT,IAAI,CAAChC,MAAM,GAAG,EAAE;;AAEhB;IACA,IAAIuD,SAAS,GAAG,IAAI;;AAEpB;IACA,IAAIC,oBAAoB,GAAG,IAAI;AAE/B,IAAA,IAAIC,CAAC;AACL,IAAA,IAAIC,CAAC;AAEL,IAAA,KAAKD,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAACxD,UAAU,CAACc,MAAM,EAAE0C,CAAC,EAAE,EAAE;AAC3CF,MAAAA,SAAS,GAAG,IAAI,CAACtD,UAAU,CAACwD,CAAC,CAAC;AAC9B,MAAA,KAAKC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,SAAS,CAACL,KAAK,CAACnC,MAAM,EAAE2C,CAAC,EAAE,EAAE;QAC3CF,oBAAoB,GAAGD,SAAS,CAACL,KAAK,CAACQ,CAAC,CAAC,CAACC,MAAM,CAC9CJ,SAAS,CAACH,KAAK,EACfG,SAAS,CAACL,KAAK,CAACQ,CAAC,CAAC,CAACE,MACrB,CAAC;AAED,QAAA,IACE,OAAOJ,oBAAoB,KAAK,SAAS,IACzC,CAACA,oBAAoB,EACrB;AACA,UAAA,IAAI,CAACxD,MAAM,CAACmD,IAAI,CAAC;YACf1B,SAAS,EAAE8B,SAAS,CAAC9B,SAAS;AAC9BC,YAAAA,OAAO,EAAE6B,SAAS,CAACL,KAAK,CAACQ,CAAC,CAAC,CAAChC;AAC9B,WAAC,CAAC;AACF,UAAA;AACF,QAAA,CAAC,MAAM,IAAI,OAAO8B,oBAAoB,KAAK,QAAQ,EAAE;AACnD,UAAA,IAAI,CAACxD,MAAM,CAACmD,IAAI,CAAC;AACf1B,YAAAA,SAAS,EAAE+B,oBAAoB;AAC/B9B,YAAAA,OAAO,EAAE6B,SAAS,CAACL,KAAK,CAACQ,CAAC,CAAC,CAAChC;AAC9B,WAAC,CAAC;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA,OAAO,IAAI,CAAC1B,MAAM,CAACe,MAAM,KAAK,CAAC;AACjC,EAAA;;AAEA;AACF;AACA;AAwCA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AApRa3B,aAAa,CA8MjBwB,SAAS,GAAG;AACjB,EAAA,GAAG,EAAE,OAAO;AACZ,EAAA,GAAG,EAAE,MAAM;AACX,EAAA,GAAG,EAAE,MAAM;AACX,EAAA,GAAG,EAAE,QAAQ;AACb,EAAA,GAAG,EAAE,OAAO;AACZ,EAAA,GAAG,EAAE,QAAQ;AACb,EAAA,GAAG,EAAE,QAAQ;AACb,EAAA,GAAG,EAAE;AACP,CAAC;AAED;AACF;AACA;AA3NaxB,aAAa,CA4NjByE,UAAU,GAAG,oBAAoB;AAExC;AACF;AACA;AACA;AACA;AAlOazE,aAAa,CAmOjB0E,QAAQ,GAAGC,MAAM,CAACC,MAAM,CAAC;AAC9BtE,EAAAA,OAAO,EAAE;AACPI,IAAAA,QAAQ,EAAE;AACZ;AACF,CAAC,CAAC;AAEF;AACF;AACA;AACA;AACA;AA7OaV,aAAa,CA8OjB6E,MAAM,GAAGF,MAAM,CAACC,MAAM,qBACL;AACpBE,EAAAA,UAAU,EAAE;AACVxE,IAAAA,OAAO,EAAE;AAAEyE,MAAAA,IAAI,EAAE;AAAS;AAC5B;AACF,CACF,CAAC;;;;"}