{"version":3,"file":"c8y-ngx-components-trusted-certificates.mjs","sources":["../../trusted-certificates/factories/trusted-certificates-navigation.factory.ts","../../trusted-certificates/pattern-messages.data.ts","../../trusted-certificates/factories/tabs.factory.ts","../../trusted-certificates/crl/crl-check-settings.component.ts","../../trusted-certificates/crl/crl-check-settings.component.html","../../trusted-certificates/crl/crl-settings.component.ts","../../trusted-certificates/crl/crl-settings.component.html","../../trusted-certificates/crl/crl-settings.module.ts","../../trusted-certificates/list/trusted-certificate.model.ts","../../trusted-certificates/list/add-trusted-certificate.component.ts","../../trusted-certificates/list/add-trusted-certificate.component.html","../../trusted-certificates/list/trusted-certificate-list.component.ts","../../trusted-certificates/list/trusted-certificate-list.component.html","../../trusted-certificates/list/trusted-certificate-list.module.ts","../../trusted-certificates/trusted-certificates.module.ts","../../trusted-certificates/c8y-ngx-components-trusted-certificates.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class TrustedCertificatesNavigationFactory implements NavigatorNodeFactory {\n  navs: NavigatorNode[] = [];\n\n  async get() {\n    if (this.navs.length === 0) {\n      this.navs.push(\n        new NavigatorNode({\n          label: gettext('Trusted certificates'),\n          icon: 'certificate',\n          path: '/trusted-certificates/certificates',\n          parent: gettext('Management'),\n          priority: 100\n        })\n      );\n    }\n    return this.navs;\n  }\n}\n","/* tslint:disable:max-line-length */\nimport { gettext } from '@c8y/ngx-components';\n\nexport const MESSAGES_TRUSTED_CERTIFICATES = {\n  '^Cannot find certificate with fingerprint (.+?).$': {\n    gettext: gettext('Could not find {{ fingerprint }} certificate.'),\n    placeholders: {\n      fingerprint: '$1'\n    }\n  },\n  '^Wrong proof of possession verification code used for tenant (.+?). Certificate (.+?), usage not granted.$':\n    {\n      gettext: gettext(\n        'Could not confirm the ownership of {{ fingerprint }} certificate: invalid proof of possession verification code provided, sign verification code with private key.'\n      ),\n      placeholders: {\n        tenant: '$1',\n        fingerprint: '$2'\n      }\n    },\n  '^Proof of possession verification code used for tenant (.+?) expired. Certificate (.+?), usage not granted.':\n    {\n      gettext: gettext(\n        'Could not confirm the ownership of {{ fingerprint }} certificate: proof of possession verification code has expired, generate a new code and try again.'\n      ),\n      placeholders: {\n        tenant: '$1',\n        fingerprint: '$2'\n      }\n    }\n} as const;\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { gettext, Tab, TabFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class TabsFactory implements TabFactory {\n  constructor(public router: Router) {}\n  get(): Tab[] {\n    const tabs: Tab[] = [];\n\n    if (this.router.url.match(/trusted-certificates/g)) {\n      tabs.push({\n        icon: 'certificate',\n        priority: 1000,\n        label: gettext('Certificates'),\n        path: 'trusted-certificates/certificates',\n        orientation: 'horizontal'\n      } as Tab);\n\n      tabs.push({\n        icon: 'settings',\n        priority: 900,\n        label: gettext('Settings'),\n        path: 'trusted-certificates/settings',\n        orientation: 'horizontal'\n      } as Tab);\n    }\n\n    return tabs;\n  }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { ITenantOption, TenantOptionsService } from '@c8y/client';\nimport { AlertService, gettext, OptionsService } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-crl-check-settings',\n  templateUrl: './crl-check-settings.component.html'\n})\nexport class CrlCheckSettingsComponent implements OnInit {\n  crlCheck: { online: boolean; offline: boolean } = { online: false, offline: false };\n\n  constructor(\n    private optionsService: OptionsService,\n    private tenantOptionsService: TenantOptionsService,\n    private alertService: AlertService\n  ) {}\n\n  async ngOnInit() {\n    this.crlCheck = {\n      offline: (await this.optionsService.getTenantOption<boolean>(\n        'configuration',\n        'crl.offline.check.enabled',\n        false\n      )) as boolean,\n      online: (await this.optionsService.getTenantOption<boolean>(\n        'configuration',\n        'crl.online.check.enabled',\n        false\n      )) as boolean\n    };\n  }\n\n  async updateTenantOption(tenantOption: ITenantOption) {\n    try {\n      await this.tenantOptionsService.update(tenantOption);\n      this.alertService.success(gettext('CRL check configuration saved.'));\n    } catch (er) {\n      this.alertService.addServerFailure(er);\n    }\n  }\n}\n","<c8y-action-bar-item [placement]=\"'right'\">\n  <div\n    class=\"dropdown\"\n    dropdown\n    [insideClick]=\"true\"\n  >\n    <button\n      class=\"dropdown-toggle c8y-dropdown d-flex a-i-center\"\n      title=\"{{ 'CRL check' | translate }}\"\n      aria-haspopup=\"true\"\n      type=\"button\"\n      dropdownToggle\n    >\n      <i\n        class=\"m-r-4\"\n        [c8yIcon]=\"'check-document'\"\n      ></i>\n      <span\n        class=\"text-truncate\"\n        translate\n      >\n        CRL check\n      </span>\n      <i\n        class=\"m-l-4 text-primary\"\n        [c8yIcon]=\"'caret-down'\"\n      ></i>\n    </button>\n    <ul\n      class=\"dropdown-menu dropdown-menu-right hidden-xs\"\n      data-cy=\"register-device--dropdown\"\n      *dropdownMenu\n    >\n      <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n    </ul>\n\n    <ul class=\"dropdown-menu dropdown-menu-right visible-xs\">\n      <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n    </ul>\n\n    <ng-template #dropdown>\n      <li>\n        <label\n          class=\"c8y-checkbox d-flex a-i-center\"\n          title=\"{{ 'Online`type of checking`' | translate }}\"\n        >\n          <input\n            type=\"checkbox\"\n            [(ngModel)]=\"crlCheck.online\"\n            (ngModelChange)=\"\n              updateTenantOption({\n                category: 'configuration',\n                key: 'crl.online.check.enabled',\n                value: $event\n              })\n            \"\n          />\n          <span class=\"m-r-4\"></span>\n          {{ 'Online`type of checking`' | translate }}\n        </label>\n      </li>\n      <li>\n        <label\n          class=\"c8y-checkbox d-flex a-i-center\"\n          title=\"{{ 'Offline`type of checking`' | translate }}\"\n        >\n          <input\n            type=\"checkbox\"\n            [(ngModel)]=\"crlCheck.offline\"\n            (ngModelChange)=\"\n              updateTenantOption({\n                category: 'configuration',\n                key: 'crl.offline.check.enabled',\n                value: $event\n              })\n            \"\n          />\n          <span class=\"m-r-4\"></span>\n          {{ 'Offline`type of checking`' | translate }}\n        </label>\n      </li>\n    </ng-template>\n  </div>\n</c8y-action-bar-item>\n","import { Component } from '@angular/core';\nimport { isEmpty, pull } from 'lodash-es';\nimport { CrlService, ICertificateRevocation } from '@c8y/client';\nimport { AlertService, DroppedFile, gettext, ModalService, Status } from '@c8y/ngx-components';\nimport { saveAs } from 'file-saver';\n\n@Component({\n  selector: 'c8y-crl-settings',\n  templateUrl: './crl-settings.component.html'\n})\nexport class CrlSettingsComponent {\n  crls: ICertificateRevocation[] = [this.getEmptyCertificateRevocation()];\n  droppedFiles: DroppedFile[] = [];\n  today: Date = new Date();\n\n  MANUAL_ENTRY_POPOVER = gettext(\n    'In this section, you can override or add individual entries to the CRL. Providing the serial number is mandatory. In case the revocation date is not set, it will be configured to the current date.'\n  );\n\n  FILE_UPLOAD_POPOVER = gettext(\n    'In this section, you can upload a file with the list of certificates to be revoked. The file must be in CSV format, and it should include the serial number and revocation date. If the revocation date is empty, it will be set to the current date.'\n  );\n\n  constructor(\n    private crlService: CrlService,\n    private alertService: AlertService,\n    private modalService: ModalService\n  ) {}\n\n  async downloadCrl() {\n    let arrayBuffer: ArrayBuffer;\n    try {\n      const res = await this.crlService.downloadCrlFile();\n      arrayBuffer = await res.arrayBuffer();\n      const fileBinary = new File([arrayBuffer], 'cumulocity.crl', {\n        type: 'application/pkix-crl'\n      });\n      saveAs(fileBinary);\n    } catch (ex) {\n      this.alertService.addServerFailure(ex);\n    }\n  }\n\n  downloadCrlTemplate() {\n    const blob = new Blob([`SERIALNO,DATE\\nSERIAL_NO1,${new Date().toISOString()}`], {\n      type: 'text/csv;charset=utf-8;'\n    });\n    const fileName = 'crl-template';\n    saveAs(blob, `${fileName}.csv`);\n  }\n\n  addCertificateRevocation() {\n    this.crls.push(this.getEmptyCertificateRevocation());\n  }\n\n  removeCertificateRevocation(certificateRevocation) {\n    pull(this.crls, certificateRevocation);\n    if (this.crls.length === 0) {\n      this.addCertificateRevocation();\n    }\n  }\n\n  async save() {\n    try {\n      await this.confirm();\n      await this.saveCrls();\n      await this.uploadCrlFile();\n      await this.clearSavedData();\n      this.alertService.success(gettext('CRL saved.'));\n    } catch (er) {\n      this.alertService.addServerFailure(er);\n    }\n  }\n\n  get isListEmpty() {\n    return this.crls.length === 1 && isEmpty(this.crls[0].serialNumberInHex);\n  }\n\n  get isFileDropped() {\n    return !!(this.droppedFiles && this.droppedFiles[0]);\n  }\n\n  private async confirm() {\n    const isOverrideManualEntries = !this.isListEmpty && this.isFileDropped;\n    const status = isOverrideManualEntries ? Status.DANGER : Status.WARNING;\n    const body = isOverrideManualEntries\n      ? gettext(\n          'You are about to update the CRL. The CRL file content will override manual entries. Do you want to proceed?'\n        )\n      : gettext('You are about to update the CRL. Do you want to proceed?');\n\n    await this.modalService.confirm(gettext('Update the CRL'), body, status, {\n      ok: gettext('Update')\n    });\n  }\n\n  private clearSavedData() {\n    this.droppedFiles = [];\n    this.crls = [this.getEmptyCertificateRevocation()];\n  }\n\n  private async saveCrls() {\n    if (!this.isListEmpty) {\n      await this.crlService.uploadCrls(this.crls);\n    }\n  }\n\n  private async uploadCrlFile() {\n    if (this.isFileDropped) {\n      await this.crlService.uploadCrlFile(this.droppedFiles[0].file);\n    }\n  }\n\n  private getEmptyCertificateRevocation(): ICertificateRevocation {\n    return {\n      serialNumberInHex: ''\n    };\n  }\n}\n","<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    icon=\"c8y-management\"\n    label=\"{{ 'Management' | translate }}\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    icon=\"certificate\"\n    label=\"{{ 'Trusted certificates' | translate }}\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-crl-check-settings></c8y-crl-check-settings>\n\n<c8y-help\n  src=\"/docs/device-management-application/managing-device-data/#managing-trusted-certificate-settings\"\n  [icon]=\"'settings'\"\n></c8y-help>\n\n<form\n  class=\"card card--fullpage\"\n  #crlManualForm=\"ngForm\"\n  novalidate\n>\n  <div class=\"card-header separator\">\n    <div class=\"card-title\">\n      {{ 'Offline configuration of Certificate Revocation List (CRL)' | translate }}\n    </div>\n  </div>\n  <div class=\"inner-scroll\">\n    <div class=\"card-block\">\n      <div\n        class=\"legend form-block\"\n      >\n        {{ 'Manual' | translate }}\n        <button\n          class=\"btn-help btn-help--sm\"\n          [attr.aria-label]=\"'Help' | translate\"\n          popover=\"{{ MANUAL_ENTRY_POPOVER | translate }}\"\n          placement=\"right\"\n          triggers=\"focus\"\n          container=\"body\"\n          type=\"button\"\n        ></button>\n      </div>\n\n      <div\n        class=\"row tight-grid\"\n        data-cy=\"c8y-row-grid--new-row\"\n        *ngFor=\"let certificateRevocation of crls; index as index; last as isLast\"\n      >\n        <div class=\"col-sm-5\">\n          <c8y-form-group>\n            <label\n              [for]=\"'serialNumber' + index\"\n              translate\n            >\n              Serial number\n            </label>\n            <input\n              class=\"form-control\"\n              required\n              [name]=\"'serialNumber' + index\"\n              [id]=\"'serialNumber' + index\"\n              [(ngModel)]=\"certificateRevocation.serialNumberInHex\"\n              [placeholder]=\"'e.g. {{ example }}' | translate: { example: '8ab34fe5476' }\"\n              c8yDefaultValidation=\"colonedHexNumber\"\n            />\n          </c8y-form-group>\n        </div>\n        <div class=\"col-sm-5\">\n          <c8y-form-group class=\"datepicker\">\n            <label [for]=\"'validTillPicker' + index\">\n              {{ 'Valid till' | translate }}\n            </label>\n            <input\n              class=\"form-control\"\n              [attr.aria-label]=\"'Date to' | translate\"\n              placeholder=\"{{ 'Date to' | translate }}\"\n              [name]=\"'validTillPicker' + index\"\n              [id]=\"'validTillPicker' + index\"\n              [(ngModel)]=\"certificateRevocation.revocationDate\"\n              [bsConfig]=\"{ customTodayClass: 'today' }\"\n              bsDatepicker\n              [maxDate]=\"today\"\n            />\n          </c8y-form-group>\n        </div>\n        <div class=\"col-sm-2\">\n          <c8y-form-group>\n            <div class=\"p-t-24\">\n              <button\n                *ngIf=\"crls.length > 1\"\n                class=\"btn btn-link hidden-xs hidden-sm\"\n                title=\"{{ 'Remove' | translate }}\"\n                type=\"button\"\n                (click)=\"removeCertificateRevocation(certificateRevocation)\"\n              >\n                <i\n                  class=\"text-danger\"\n                  c8yIcon=\"minus-circle\"\n                ></i>\n              </button>\n              <button\n                class=\"btn btn-link hidden-xs hidden-sm\"\n                title=\"{{ 'Add' | translate }}\"\n                type=\"button\"\n                (click)=\"addCertificateRevocation()\"\n                *ngIf=\"isLast\"\n              >\n                <i\n                  class=\"text-primary\"\n                  c8yIcon=\"plus-circle\"\n                ></i>\n              </button>\n\n              <button\n                *ngIf=\"crls.length > 1\"\n                class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n                title=\"{{ 'Remove' | translate }}\"\n                type=\"button\"\n                (click)=\"removeCertificateRevocation(certificateRevocation)\"\n              >\n                <i c8yIcon=\"minus-circle\"></i>\n                {{ 'Remove' | translate }}\n              </button>\n              <button\n                class=\"btn btn-primary btn-block btn-sm visible-xs visible-sm\"\n                title=\"{{ 'Add' | translate }}\"\n                type=\"button\"\n                (click)=\"addCertificateRevocation()\"\n                *ngIf=\"isLast\"\n              >\n                <i c8yIcon=\"plus-circle\"></i>\n                {{ 'Add' | translate }}\n              </button>\n            </div>\n          </c8y-form-group>\n        </div>\n      </div>\n      <div class=\"legend form-block center\">\n        {{ 'or' | translate }}\n      </div>\n      <div\n        class=\"legend form-block\"\n      >\n        {{ 'File upload' | translate }}\n        <button\n          class=\"btn-help btn-help--sm\"\n          [attr.aria-label]=\"'Help' | translate\"\n          popover=\"{{ FILE_UPLOAD_POPOVER | translate }}\"\n          placement=\"right\"\n          triggers=\"focus\"\n          container=\"body\"\n          type=\"button\"\n        ></button>\n      </div>\n\n      <c8y-drop-area\n        class=\"drop-area-sm\"\n        [title]=\"'Upload CRL file (.csv format)' | translate\"\n        name=\"uploadCrlDropArea\"\n        [(ngModel)]=\"droppedFiles\"\n        [message]=\"'Upload CRL file (.csv format)' | translate\"\n        [loadingMessage]=\"'Uploading…' | translate\"\n        [accept]=\"'.csv'\"\n        [maxAllowedFiles]=\"1\"\n      ></c8y-drop-area>\n      <p class=\"help-block has-info text-muted m-t-4\">\n        {{ 'CRL file content will override manual entries.' | translate }}\n      </p>\n\n      <button\n        class=\"btn btn-sm btn-default m-t-16\"\n        title=\"{{ 'Download template' | translate }}\"\n        type=\"button\"\n        (click)=\"downloadCrlTemplate()\"\n      >\n        <i\n          class=\"m-r-4\"\n          c8yIcon=\"template\"\n        ></i>\n        {{ 'Download template' | translate }}\n      </button>\n    </div>\n  </div>\n  <div class=\"card-footer separator\">\n    <button\n      class=\"btn btn-default\"\n      title=\"{{ 'Download CRL file' | translate }}\"\n      type=\"button\"\n      (click)=\"downloadCrl()\"\n    >\n      <i\n        class=\"m-r-4\"\n        c8yIcon=\"download\"\n      ></i>\n      {{ 'Download CRL file' | translate }}\n    </button>\n    <button\n      class=\"btn btn-primary\"\n      title=\"{{ 'Save' | translate }}\"\n      type=\"submit\"\n      (click)=\"save()\"\n      [disabled]=\"!(crlManualForm.form.valid || isListEmpty) || (isListEmpty && !isFileDropped)\"\n    >\n      {{ 'Save' | translate }}\n    </button>\n  </div>\n</form>\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { BsDatepickerModule } from 'ngx-bootstrap/datepicker';\nimport { CrlSettingsComponent } from './crl-settings.component';\nimport { CrlCheckSettingsComponent } from './crl-check-settings.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\n\nconst trustedCertificatesSettingsRoutes: Route[] = [\n  {\n    path: 'trusted-certificates/settings',\n    component: CrlSettingsComponent,\n    pathMatch: 'full'\n  }\n];\n\n@NgModule({\n  declarations: [CrlSettingsComponent, CrlCheckSettingsComponent],\n  exports: [],\n  imports: [\n    CoreModule,\n    CommonModule,\n    RouterModule.forChild(trustedCertificatesSettingsRoutes),\n    BsDropdownModule.forRoot(),\n    BsDatepickerModule,\n    PopoverModule\n  ]\n})\nexport class CrlSettingsModule {}\n","import { ITrustedCertificate } from '@c8y/client';\n\nexport interface TrustedCertificate extends ITrustedCertificate {\n  signedVerificationCode?: string;\n}\n\nexport const PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES = {\n  EVENT: 'trustedCertificate',\n  CERTIFICATES: {\n    COMPONENTS: {\n      TRUSTED_CERTIFICATE: 'trusted-certificate'\n    },\n    ACTIONS: {\n      ADD: 'add',\n      UPDATE: 'update',\n      DELETE: 'delete'\n    },\n    RESULTS: {\n      ADD_SUCCESS: 'certificateAdded',\n      UPDATE_SUCCESS: 'certificateUpdated',\n      DELETE_SUCCESS: 'certificateDeleted'\n    }\n  },\n  VERIFICATION_CODE: {\n    COMPONENTS: {\n      REGENERATE_CODE: 'regenerate-unsigned-verification-code',\n      VERIFY_CODE: 'verify-signed-verification-code',\n      DOWNLOAD_CODE: 'download-unsigned-verification-code'\n    },\n    ACTIONS: {\n      REGENERATE: 'regenerate',\n      VERIFY: 'verify',\n      DOWNLOAD: 'download'\n    },\n    RESULTS: {\n      REGENERATE_SUCCESS: 'unsignedVerificationCodeRegenerated',\n      VERIFY_SUCCESS: 'signedCodeVerified',\n      VERIFY_FAILED: 'signedCodeVerificationFailed'\n    }\n  }\n} as const;\n","import { Component } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { DroppedFile, GainsightService } from '@c8y/ngx-components';\nimport { ITrustedCertificate, TrustedCertificateService } from '@c8y/client';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES } from './trusted-certificate.model';\n\n@Component({\n  selector: 'c8y-add-trusted-certificate',\n  templateUrl: './add-trusted-certificate.component.html'\n})\nexport class AddTrustedCertificateComponent {\n  maxAllowedFiles = 1;\n  AUTO_REGISTRATION_POPOVER = gettext(\n    'Devices using the MQTT protocol with credentials signed by this certificate will be able to communicate with the platform without prior registration. The option does not support devices using the LWM2M protocol.'\n  );\n  trustedCertificate: Partial<ITrustedCertificate> = {\n    status: 'DISABLED'\n  };\n  fileIsUploaded = false;\n\n  result: Promise<any> = new Promise((resolve, reject) => {\n    this._save = resolve;\n    this._cancel = reject;\n  });\n  private _save;\n  private _cancel;\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES;\n\n  constructor(\n    private modal: BsModalRef,\n    private trustedCertificateService: TrustedCertificateService,\n    private alertService: AlertService,\n    private gainsightService: GainsightService\n  ) {}\n\n  uploadFile(dropped: DroppedFile[]) {\n    this.fileIsUploaded = false;\n    if (dropped) {\n      const reader = new FileReader();\n      reader.onload = () => {\n        this.fileIsUploaded = true;\n        this.trustedCertificate.certInPemFormat = reader.result as string;\n      };\n      reader.readAsText(dropped[0].file);\n    }\n  }\n\n  async save() {\n    try {\n      await this.trustedCertificateService.create(this.trustedCertificate);\n      this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n        component:\n          PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n        result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.RESULTS.ADD_SUCCESS,\n        action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.ACTIONS.ADD\n      });\n      this.alertService.success(gettext('Certificate saved.'));\n      this._save();\n    } catch (ex) {\n      this.alertService.addServerFailure(ex);\n    }\n  }\n\n  close() {\n    this._cancel();\n    this.modal.hide();\n  }\n}\n","<div class=\"viewport-modal\">\n  <div class=\"modal-header dialog-header\">\n    <i c8yIcon=\"certificate\"></i>\n    <div\n      class=\"modal-title\"\n      id=\"addCertificateModalTitle\"\n      translate\n    >\n      Add trusted certificate\n    </div>\n  </div>\n  <form\n    #addTrustedCertificateForm=\"ngForm\"\n    (ngSubmit)=\"addTrustedCertificateForm.form.valid && fileIsUploaded && save()\"\n  >\n    <div class=\"modal-inner-scroll\">\n      <div\n        class=\"modal-body\"\n        id=\"addCertificateModalDescription\"\n      >\n        <c8y-form-group>\n          <label\n            for=\"certificateName\"\n            translate\n          >\n            Certificate name\n          </label>\n          <input\n            class=\"form-control\"\n            id=\"certificateName\"\n            placeholder=\"{{ 'e.g. My certificate' | translate }}\"\n            name=\"certificateName\"\n            type=\"text\"\n            autocomplete=\"off\"\n            required\n            [(ngModel)]=\"trustedCertificate.name\"\n          />\n        </c8y-form-group>\n        <c8y-form-group>\n          <label\n            for=\"certificate\"\n            translate\n          >\n            Certificate\n          </label>\n          <c8y-drop-area\n            class=\"drop-area-sm\"\n            [title]=\"'Paste the certificate in PEM format.' | translate\"\n            (dropped)=\"uploadFile($event)\"\n            [loadingMessage]=\"'Importing, please wait.' | translate\"\n            [maxAllowedFiles]=\"maxAllowedFiles\"\n          ></c8y-drop-area>\n        </c8y-form-group>\n        <c8y-form-group>\n          <label\n            class=\"c8y-checkbox\"\n            title=\"{{ 'Auto registration' | translate }}\"\n          >\n            <input\n              id=\"autoRegistration\"\n              name=\"autoRegistration\"\n              type=\"checkbox\"\n              [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n            />\n            <span></span>\n            <span>{{ 'Auto registration' | translate }}</span>\n            <button\n              class=\"btn-help\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n              placement=\"right\"\n              triggers=\"focus\"\n              container=\"body\"\n              type=\"button\"\n            ></button>\n          </label>\n        </c8y-form-group>\n        <button\n          class=\"btn\"\n          name=\"certificateStatus\"\n          type=\"button\"\n          [(ngModel)]=\"trustedCertificate.status\"\n          btnCheckbox\n          btnCheckboxTrue=\"ENABLED\"\n          btnCheckboxFalse=\"DISABLED\"\n        >\n          <span\n            title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n            [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n          >\n            {{ 'Disabled`trusted certificate status`' | translate }}\n          </span>\n          <span\n            title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n            [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n          >\n            {{ 'Enabled`trusted certificate status`' | translate }}\n          </span>\n        </button>\n      </div>\n    </div>\n    <div class=\"modal-footer\">\n      <button\n        class=\"btn btn-default\"\n        title=\"{{ 'Cancel' | translate }}\"\n        type=\"button\"\n        (click)=\"close()\"\n      >\n        {{ 'Cancel' | translate }}\n      </button>\n\n      <button\n        class=\"btn btn-primary\"\n        title=\"{{ 'Add certificate' | translate }}\"\n        type=\"submit\"\n        [disabled]=\"\n          addTrustedCertificateForm.form.invalid ||\n          addTrustedCertificateForm.form.pristine ||\n          !fileIsUploaded\n        \"\n      >\n        {{ 'Add certificate' | translate }}\n      </button>\n    </div>\n  </form>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport {\n  AlertService,\n  ClipboardService,\n  ForOfFilterPipe,\n  GainsightService,\n  gettext,\n  ModalService,\n  Status\n} from '@c8y/ngx-components';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport {\n  FeatureService,\n  IResultList,\n  ITrustedCertificate,\n  SystemOptionsService,\n  TrustedCertificateService\n} from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\nimport { tap, switchMap, shareReplay } from 'rxjs/operators';\nimport { pipe, BehaviorSubject, Observable } from 'rxjs';\nimport { saveAs } from 'file-saver';\nimport { assign } from 'lodash-es';\nimport {\n  PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES,\n  TrustedCertificate\n} from './trusted-certificate.model';\n\n@Component({\n  selector: 'c8y-trusted-certificates',\n  templateUrl: './trusted-certificate-list.component.html'\n})\nexport class TrustedCertificateListComponent implements OnInit {\n  PROOF_OF_POSSESSION_POPOVER = gettext(\n    '\"Proof of possession\" is a security method used to prove that whoever sends a message is also in the possession of the particular cryptographic key.'\n  );\n  SIGNED_VERIFICATION_CODE_POPOVER = gettext(\n    'Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt> | openssl base64 -A'\n  );\n\n  AUTO_REGISTRATION_POPOVER = gettext(\n    'Devices using the MQTT protocol with credentials signed by this certificate will be able to communicate with the platform without prior registration. The option does not support devices using the LWM2M protocol.'\n  );\n\n  reloading: BehaviorSubject<boolean> = new BehaviorSubject(false);\n  reload: BehaviorSubject<void> = new BehaviorSubject(null);\n  trustedCertificates: Observable<IResultList<ITrustedCertificate>> = this.reload.pipe(\n    tap(() => this.reloading.next(true)),\n    switchMap(() => this.getTrustedCertificates()),\n    tap(reponse => {\n      this.certificateAuthorityExists = reponse.data.some(\n        value => value.tenantCertificateAuthority\n      );\n    }),\n    tap(() => this.reloading.next(false)),\n    shareReplay(1)\n  );\n  sortByExpirationDateAsc: ForOfFilterPipe<ITrustedCertificate> = pipe(\n    tap(results => {\n      return results.sort((n1, n2) => {\n        if (n1.tenantCertificateAuthority !== n2.tenantCertificateAuthority) {\n          return n1.tenantCertificateAuthority ? -1 : 1;\n        }\n        return n1.notAfter.localeCompare(n2.notAfter);\n      });\n    })\n  );\n\n  certificateAuthorityExists = false;\n  signedVerificationCode: string;\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES;\n  certificateAuthorityFeatureEnabled = false;\n\n  constructor(\n    private bsModal: BsModalService,\n    private alertService: AlertService,\n    private trustedCertificateService: TrustedCertificateService,\n    private modalService: ModalService,\n    private translateService: TranslateService,\n    private clipboardService: ClipboardService,\n    private gainsightService: GainsightService,\n    private systemOptionsService: SystemOptionsService,\n    private featureService: FeatureService\n  ) {}\n\n  async ngOnInit() {\n    await this.loadTrustedCertificates();\n    this.showLimitationAlert();\n    this.checkCertificateAuthorityFeature();\n  }\n\n  async loadTrustedCertificates() {\n    this.reload.next();\n  }\n\n  getTrustedCertificates() {\n    const filter: object = {\n      pageSize: 1000,\n      withTotalPages: true\n    };\n    return this.trustedCertificateService.list(filter);\n  }\n\n  async addTrustedCertificate() {\n    const modal = this.bsModal.show(AddTrustedCertificateComponent, {\n      class: 'modal-sm',\n      ariaDescribedby: 'addCertificateModalDescription',\n      ariaLabelledBy: 'addCertificateModalTitle',\n      ignoreBackdropClick: true,\n      keyboard: false\n    }).content as AddTrustedCertificateComponent;\n    try {\n      await modal.result;\n      modal.close();\n      this.reload.next();\n    } catch (ex) {\n      // do nothing\n    }\n  }\n\n  async addCACertificate() {\n    try {\n      await this.trustedCertificateService.generateCertificateAuthority();\n      this.alertService.createSuccess('Certificate authority');\n      this.reload.next();\n    } catch (error) {\n      this.alertService.addServerFailure(error);\n    }\n  }\n\n  async deleteTrustedCertificate(certificate) {\n    const title = gettext('Delete trusted certificate');\n    const confirmationText = gettext(\n      'You are about to delete a trusted certificate \"{{ certificateName }}\".'\n    );\n    const finalQuestion = gettext('Do you want to proceed?');\n    const certificateName = certificate.name;\n    const body = [\n      this.translateService.instant(confirmationText, {\n        certificateName\n      }),\n      this.translateService.instant(finalQuestion)\n    ].join(' ');\n\n    try {\n      await this.modalService.confirm(title, body, Status.DANGER, { ok: gettext('Delete') });\n      await this.trustedCertificateService.delete(certificate.fingerprint);\n      this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n        component:\n          PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n        result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.RESULTS.DELETE_SUCCESS,\n        action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.ACTIONS.DELETE\n      });\n      this.alertService.success(gettext('Certificate deleted.'));\n      this.reload.next();\n    } catch (ex) {\n      this.alertService.addServerFailure(ex);\n    }\n  }\n\n  async updateCertificate(\n    trustedCertificate: ITrustedCertificate,\n    updatingPart: Partial<ITrustedCertificate>\n  ) {\n    try {\n      await this.trustedCertificateService.update({\n        fingerprint: trustedCertificate.fingerprint,\n        ...updatingPart\n      });\n      this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n        component:\n          PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n        result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.RESULTS.UPDATE_SUCCESS,\n        action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.CERTIFICATES.ACTIONS.UPDATE\n      });\n      this.alertService.success(gettext('Certificate saved.'));\n    } catch (ex) {\n      this.alertService.addServerFailure(ex);\n    }\n  }\n\n  highlightDependingOnExpirationStatus(item: ITrustedCertificate) {\n    const warningOffset = 24 * 60 * 60 * 1000 * 90; // 90 days\n    const todayTimestamp = new Date().getTime();\n    const warningTimestamp = new Date().getTime() + warningOffset;\n    const notAfterTimestamp = new Date(item.notAfter).getTime();\n    const expired = notAfterTimestamp < todayTimestamp;\n    const expiresInLessThan90Days = notAfterTimestamp < warningTimestamp;\n    if (expired) {\n      return 'text-danger';\n    }\n    if (expiresInLessThan90Days) {\n      return 'text-warning';\n    }\n    return '';\n  }\n\n  regenerateUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n    this.trustedCertificateService.regeneratePoPVerificationCode(trustedCertificate).then(\n      ({ data }) => {\n        assign(trustedCertificate, data);\n        this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n          component:\n            PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.COMPONENTS.REGENERATE_CODE,\n          result:\n            PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.RESULTS.REGENERATE_SUCCESS,\n          action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.ACTIONS.REGENERATE\n        });\n        this.alertService.success(gettext('Verification code regenerated.'));\n      },\n      ex => this.alertService.addServerFailure(ex)\n    );\n  }\n\n  verifySignedVerificationCode(trustedCertificate: TrustedCertificate) {\n    this.trustedCertificateService\n      .verifySignedVerificationCode(trustedCertificate, trustedCertificate.signedVerificationCode)\n      .then(\n        ({ data }) => {\n          assign(trustedCertificate, data);\n          this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n            component:\n              PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.COMPONENTS.VERIFY_CODE,\n            result:\n              PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.RESULTS.VERIFY_SUCCESS,\n            action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.ACTIONS.VERIFY\n          });\n          this.alertService.success(gettext('Signed verification code verified.'));\n        },\n        ex => {\n          this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.EVENT, {\n            component:\n              PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.COMPONENTS.VERIFY_CODE,\n            result: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.RESULTS.VERIFY_FAILED,\n            action: PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES.VERIFICATION_CODE.ACTIONS.VERIFY\n          });\n          this.alertService.addServerFailure(ex);\n        }\n      );\n  }\n\n  downloadUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n    const blob = new Blob([trustedCertificate.proofOfPossessionUnsignedVerificationCode]);\n    const fileName = trustedCertificate.name;\n    saveAs(blob, `${fileName}.txt`);\n  }\n\n  copyUnsignedVerificationCodeToClipboard(trustedCertificate: ITrustedCertificate) {\n    this.clipboardService.writeText(trustedCertificate.proofOfPossessionUnsignedVerificationCode);\n  }\n\n  onFileInput(event, trustedCertificate: TrustedCertificate) {\n    const input = event.target;\n    const reader = new FileReader();\n    reader.onload = () => {\n      trustedCertificate.signedVerificationCode = reader.result as string;\n    };\n    reader.readAsText(input.files[0]);\n  }\n\n  private async showLimitationAlert() {\n    const { data } = await this.systemOptionsService.detail({\n      category: 'ssl',\n      key: 'shared-truststore.enabled'\n    });\n    const sharedTruststoreEnabled = data.value.toLowerCase();\n    if (sharedTruststoreEnabled === 'true') {\n      this.alertService.warning(\n        gettext(\n          'Shared trusted certificates are enabled in this instance. Devices may not be able to connect if certificates from the same chain are distributed across different tenants: MQTT connections will not be possible and REST connections will require an explicit tenant ID.'\n        )\n      );\n    }\n  }\n\n  private checkCertificateAuthorityFeature() {\n    this.featureService.detail('certificate-authority').then(({ data }) => {\n      this.certificateAuthorityFeatureEnabled = data.active;\n    });\n  }\n}\n","<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    icon=\"c8y-management\"\n    label=\"{{ 'Management' | translate }}\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    icon=\"certificate\"\n    label=\"{{ 'Trusted certificates' | translate }}\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n  [placement]=\"'right'\"\n  *ngIf=\"certificateAuthorityFeatureEnabled\"\n>\n  <button\n    class=\"btn btn-link\"\n    title=\"{{ 'Add CA certificate' | translate }}\"\n    type=\"button\"\n    [disabled]=\"certificateAuthorityExists\"\n    (click)=\"addCACertificate()\"\n  >\n    <i c8yIcon=\"contract\"></i>\n    {{ 'Add CA certificate' | translate }}\n  </button>\n  <button\n    class=\"btn-help btn-help--sm\"\n    [attr.aria-label]=\"'Help' | translate\"\n    popover=\"{{\n      'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections. Only one certificate is allowed, which is why the button is disabled.'\n        | translate\n    }}\"\n    placement=\"bottom\"\n    triggers=\"focus\"\n    type=\"button\"\n    *ngIf=\"certificateAuthorityExists\"\n  ></button>\n  <button\n    class=\"btn-help btn-help--sm\"\n    [attr.aria-label]=\"'Help' | translate\"\n    popover=\"{{\n      'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections.'\n        | translate\n    }}\"\n    placement=\"bottom\"\n    triggers=\"focus\"\n    type=\"button\"\n    *ngIf=\"!certificateAuthorityExists\"\n  ></button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    class=\"btn btn-link\"\n    title=\"{{ 'Add trusted certificate' | translate }}\"\n    type=\"button\"\n    (click)=\"addTrustedCertificate()\"\n  >\n    <i c8yIcon=\"plus-circle\"></i>\n    {{ 'Add trusted certificate' | translate }}\n  </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    class=\"btn btn-link\"\n    title=\"{{ 'Reload' | translate }}\"\n    type=\"button\"\n    (click)=\"loadTrustedCertificates()\"\n  >\n    <i\n      c8yIcon=\"refresh\"\n      [ngClass]=\"{ 'icon-spin': reloading | async }\"\n    ></i>\n    {{ 'Reload' | translate }}\n  </button>\n</c8y-action-bar-item>\n\n<c8y-help\n  src=\"/docs/device-management-application/managing-device-data/#managing-trusted-certificates\"\n></c8y-help>\n\n<c8y-ui-empty-state\n  [icon]=\"'certificate'\"\n  [title]=\"'No trusted certificates to display.' | translate\"\n  [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n  *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n>\n  <button\n    class=\"btn btn-primary\"\n    title=\"{{ 'Add trusted certificate' | translate }}\"\n    type=\"button\"\n    (click)=\"addTrustedCertificate()\"\n  >\n    {{ 'Add trusted certificate' | translate }}\n  </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n  <div\n    class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n    *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n  >\n    <div class=\"c8y-list__item__block\">\n      <div class=\"c8y-list__item__icon\">\n        <i\n          class=\"invisible\"\n          c8yIcon=\"certificate\"\n        ></i>\n      </div>\n      <div class=\"c8y-list__item__body\">\n        <div class=\"content-flex-60\">\n          <div class=\"col-2\">\n            <span\n              class=\"text-truncate\"\n              title=\" {{ 'Certificate' | translate }} \"\n            >\n              {{ 'Certificate' | translate }}\n            </span>\n          </div>\n          <div class=\"col-2\">\n            <span\n              class=\"text-truncate\"\n              title=\"{{ 'Status' | translate }}\"\n            >\n              {{ 'Status' | translate }}\n            </span>\n          </div>\n          <div class=\"col-2\">\n            <span\n              class=\"text-truncate\"\n              title=\"{{ 'Algorithm' | translate }}\"\n            >\n              {{ 'Algorithm' | translate }}\n            </span>\n          </div>\n          <div class=\"col-2\">\n            <span\n              class=\"text-truncate\"\n              title=\"{{ 'Expiration date' | translate }}\"\n            >\n              {{ 'Expiration date' | translate }}\n            </span>\n          </div>\n          <div class=\"col-2\">\n            <span\n              class=\"text-truncate\"\n              title=\" {{ 'Auto registration' | translate }}\"\n            >\n              {{ 'Auto registration' | translate }}\n            </span>\n          </div>\n          <div class=\"col-2\">\n            <span\n              class=\"text-truncate\"\n              title=\" {{ 'Proof of possession' | translate }}\"\n            >\n              {{ 'Proof of possession' | translate }}\n            </span>\n          </div>\n        </div>\n      </div>\n      <div class=\"c8y-list__item__actions\"></div>\n    </div>\n  </div>\n\n  <c8y-li\n    *c8yFor=\"\n      let trustedCertificate of trustedCertificates | async;\n      let i = index;\n      pipe: sortByExpirationDateAsc;\n      loadMore: 'none'\n    \"\n    #listItem\n    data-cy=\"c8y-trusted-certificates-list--item-block\"\n  >\n    <c8y-li-icon>\n      <button\n        class=\"btn-clean\"\n        attr.aria-label=\"{{ 'Certificate' | translate }}\"\n        tooltip=\"{{ 'Certificate' | translate }}\"\n        type=\"button\"\n        [delay]=\"500\"\n        *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n      >\n        <i c8yIcon=\"certificate\"></i>\n      </button>\n      <button\n        class=\"btn-clean\"\n        attr.aria-label=\"{{ 'CA certificate' | translate }}\"\n        tooltip=\"{{ 'CA certificate' | translate }}\"\n        type=\"button\"\n        [delay]=\"500\"\n        *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n      >\n        <i c8yIcon=\"contract\"></i>\n      </button>\n    </c8y-li-icon>\n\n    <c8y-li-body class=\"content-flex-60\">\n      <div class=\"col-2\">\n        <button\n          class=\"btn-clean text-truncate\"\n          title=\"{{ trustedCertificate.name }}\"\n          type=\"button\"\n          (click)=\"listItem.toggleCollapsed()\"\n        >\n          {{ trustedCertificate.name }}\n        </button>\n      </div>\n      <div class=\"col-2\">\n        <div class=\"visible-xs p-8\"></div>\n        <button\n          class=\"btn c8y-btn-checkbox--inline\"\n          name=\"certificateStatus\"\n          type=\"button\"\n          [(ngModel)]=\"trustedCertificate.status\"\n          btnCheckbox\n          btnCheckboxTrue=\"ENABLED\"\n          btnCheckboxFalse=\"DISABLED\"\n          (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n        >\n          <small\n            title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n            [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n          >\n            {{ 'Disabled`trusted certificate status`' | translate }}\n          </small>\n          <small\n            title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n            [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n          >\n            {{ 'Enabled`trusted certificate status`' | translate }}\n          </small>\n        </button>\n        <div class=\"visible-xs p-8\"></div>\n      </div>\n      <div class=\"col-2\">\n        <div\n          class=\"text-truncate\"\n          title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n        >\n          <span\n            class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n            translate\n          >\n            Algorithm\n          </span>\n          {{ trustedCertificate.algorithmName }}\n        </div>\n      </div>\n\n      <div class=\"col-2\">\n        <div\n          class=\"text-truncate\"\n          title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n        >\n          <span\n            class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n            translate\n          >\n            Expiration date\n          </span>\n          <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n            <i\n              class=\"m-r-4\"\n              c8yIcon=\"calendar\"\n              *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n            ></i>\n            <i\n              class=\"m-r-4\"\n              c8yIcon=\"warning\"\n              *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n            ></i>\n            <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n          </small>\n        </div>\n      </div>\n      <div class=\"col-2\">\n        <div class=\"text-truncate\">\n          <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n            {{ 'Auto registration' | translate }}\n          </span>\n          <span\n            title=\"{{ 'Auto registration' | translate }}:  {{\n              'Enabled`auto registration`' | translate\n            }}\"\n            *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n          >\n            {{ 'Enabled`auto registration`' | translate }}\n          </span>\n          <span\n            title=\"{{ 'Auto registration' | translate }}:  {{\n              'Disabled`auto registration`' | translate\n            }}\"\n            *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n          >\n            {{ 'Disabled`auto registration`' | translate }}\n          </span>\n          <button\n            class=\"btn-help btn-help--sm\"\n            [attr.aria-label]=\"'Help' | translate\"\n            popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n            placement=\"right\"\n            triggers=\"focus\"\n            container=\"body\"\n            type=\"button\"\n            type=\"button\"\n          ></button>\n        </div>\n      </div>\n      <div class=\"col-2 d-flex\">\n        <div class=\"text-truncate\">\n          <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n            {{ 'Proof of possession' | translate }}\n          </span>\n          <span\n            title=\"{{ 'Proof of possession' | translate }}: {{ 'N/A' | translate }}\"\n            *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n          >\n            {{ 'N/A' | translate }}\n          </span>\n          <span *ngIf=\"!trustedCertificate.tenantCertificateAuthority\">\n            <span\n              title=\"{{ 'Proof of possession' | translate }}:  {{\n                'Complete`proof of possession`' | translate\n              }}\"\n              *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n            >\n              <div class=\"icon-flex\">\n                <i\n                  class=\"text-success\"\n                  c8yIcon=\"success\"\n                ></i>\n                {{ 'Complete`proof of possession`' | translate }}\n              </div>\n            </span>\n            <span\n              title=\"{{ 'Proof of possession' | translate }}:  {{\n                'Incomplete`proof of possession`' | translate\n              }}\"\n              *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n            >\n              <div class=\"icon-flex\">\n                <i\n                  class=\"text-warning\"\n                  c8yIcon=\"warning\"\n                ></i>\n                {{ 'Incomplete`proof of possession`' | translate }}\n              </div>\n            </span>\n          </span>\n        </div>\n        <button\n          class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n          [attr.aria-label]=\"'Delete' | translate\"\n          tooltip=\"{{ 'Delete' | translate }}\"\n          placement=\"right\"\n          type=\"button\"\n          data-cy=\"c8y-trusted-certificate--delete\"\n          [delay]=\"500\"\n          (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n        >\n          <i c8yIcon=\"delete\"></i>\n        </button>\n      </div>\n    </c8y-li-body>\n\n    <c8y-li-collapse>\n      <div class=\"p-t-16 p-b-16\">\n        <div class=\"row\">\n          <div class=\"col-md-4\">\n            <c8y-form-group>\n              <label class=\"control-label\">\n                {{ 'Certificate name' | translate }}\n              </label>\n              <div class=\"input-group input-group-editable\">\n                <input\n                  class=\"form-control\"\n                  type=\"text\"\n                  required\n                  data-cy=\"c8y-trusted-certificates--edit-certificate-name\"\n                  [(ngModel)]=\"trustedCertificate.name\"\n                />\n                <span></span>\n                <div class=\"input-group-btn\">\n                  <button\n                    class=\"btn btn-primary\"\n                    title=\"{{ 'Update certificate name' | translate }}\"\n                    type=\"button\"\n                    (click)=\"\n                      updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n                    \"\n                    [disabled]=\"!trustedCertificate.name\"\n                  >\n                    {{ 'Save' | translate }}\n                  </button>\n                </div>\n              </div>\n            </c8y-form-group>\n          </div>\n          <div class=\"col-md-1\"></div>\n          <div class=\"col-md-7\">\n            <c8y-form-group>\n              <label\n                class=\"control-label\"\n                for=\"certInPemFormat\"\n                translate\n              >\n                Certificate\n              </label>\n              <textarea\n                class=\"form-control no-resize\"\n                id=\"certInPemFormat\"\n                name=\"certInPemFormat\"\n                type=\"text\"\n                rows=\"7\"\n                readonly\n                [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n              ></textarea>\n            </c8y-form-group>\n            <c8y-form-group>\n              <label\n                class=\"c8y-checkbox\"\n                title=\"{{ 'Auto registration' | translate }}\"\n              >\n                <input\n                  type=\"checkbox\"\n                  [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n                  (ngModelChange)=\"\n                    updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n                  \"\n                />\n                <span></span>\n                <span>{{ 'Auto registration' | translate }}</span>\n                <button\n                  class=\"btn-help btn-help--sm\"\n                  [attr.aria-label]=\"'Help' | translate\"\n                  popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n                  placement=\"right\"\n                  triggers=\"focus\"\n                  container=\"body\"\n                  type=\"button\"\n                  type=\"button\"\n                ></button>\n              </label>\n            </c8y-form-group>\n          </div>\n        </div>\n        <div class=\"row\">\n          <div class=\"col-md-4\">\n            <div\n              class=\"legend form-block\"\n              translate\n            >\n              Additional properties\n            </div>\n            <ul class=\"list-unstyled\">\n              <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n                <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n                  {{ 'Algorithm' | translate }}\n                </label>\n                <span class=\"m-l-auto text-break-word\">\n                  {{ trustedCertificate.algorithmName }}\n                </span>\n              </li>\n              <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n                <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n                  {{ 'Version' | translate }}\n                </label>\n                <span class=\"m-l-auto text-break-word\">\n                  {{ trustedCertificate.version }}\n                </span>\n              </li>\n              <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n                <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n                  {{ 'Valid from' | translate }}\n                </label>\n                <span class=\"m-l-auto text-break-word\">\n                  {{ trustedCertificate.notBefore | c8yDate }}\n                </span>\n              </li>\n              <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n                <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n                  {{ 'Issuer' | translate }}\n                </label>\n                <span class=\"m-l-auto text-break-word\">\n                  {{ trustedCertificate.issuer }}\n                </span>\n              </li>\n              <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n                <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n                  {{ 'Expiration date' | translate }}\n                </label>\n                <span class=\"m-l-auto text-break-word\">\n                  {{ trustedCertificate.notAfter | c8yDate }}\n                </span>\n              </li>\n              <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n                <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n                  {{ 'Serial number' | translate }}\n                </label>\n                <span class=\"m-l-auto text-break-word\">\n                  {{ trustedCertificate.serialNumber }}\n                </span>\n              </li>\n              <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n                <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n                  {{ 'Subject`of a certificate`' | translate }}\n                </label>\n                <span class=\"m-l-auto text-break-word\">\n                  {{ trustedCertificate.subject }}\n                </span>\n              </li>\n            </ul>\n          </div>\n          <div class=\"col-md-1\"></div>\n          <div\n            class=\"col-md-7\"\n            *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n          >\n            <div class=\"legend form-block\">\n              {{ 'Proof of possession' | translate }}\n              <button\n                class=\"btn-help btn-help--sm\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n                placement=\"right\"\n                triggers=\"focus\"\n                container=\"body\"\n                type=\"button\"\n                type=\"button\"\n              ></button>\n            </div>\n            <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n              <span\n                class=\"icon-flex\"\n                title=\"{{ 'Proof of possession' | translate }}:  {{\n                  'Complete`proof of possession`' | translate\n                }}\"\n              >\n                <i\n                  class=\"text-success\"\n                  c8yIcon=\"success\"\n                ></i>\n                {{ 'Complete`proof of possession`' | translate }}\n              </span>\n            </div>\n            <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n              <div class=\"row m-b-16\">\n                <div class=\"col-md-6\">\n                  <span\n                    class=\"icon-flex\"\n                    title=\"{{ 'Proof of possession' | translate }}:  {{\n                      'Incomplete`proof of possession`' | translate\n                    }}\"\n                  >\n                    <i\n                      class=\"text-warning\"\n                      c8yIcon=\"warning\"\n                    ></i>\n                    {{ 'Incomplete`proof of possession`' | translate }}\n                  </span>\n                </div>\n                <div class=\"col-md-6 col-lg-6 text-right-md\">\n                  <span class=\"text-label-small m-r-4\">\n                    {{ 'Verification code expires/expired on' | translate }}\n                  </span>\n                  {{\n                    (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n                      '---'\n                  }}\n                </div>\n              </div>\n              <div class=\"row\">\n                <div class=\"col-md-6 col-lg-6\">\n                  <c8y-form-group>\n                    <label\n                      class=\"control-label\"\n                      for=\"unsignedVerificationCode\"\n                      translate\n                    >\n                      Verification code\n                    </label>\n                    <textarea\n                      class=\"form-control no-resize\"\n                      id=\"unsignedVerificationCode\"\n                      name=\"unsignedVerificationCode\"\n                      type=\"text\"\n                      rows=\"5\"\n                      readonly\n                      [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n                    ></textarea>\n                  </c8y-form-group>\n                  <div class=\"d-flex\">\n                    <button\n                      class=\"btn btn-primary btn-sm\"\n                      title=\"{{ 'Regenerate verification code' | translate }}\"\n                      type=\"button\"\n                      (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n                    >\n                      {{ 'Regenerate`verification code`' | translate }}\n                    </button>\n\n                    <button\n                      class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n                      [attr.aria-label]=\"'Copy to clipboard' | translate\"\n                      tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n                      placement=\"right\"\n                      type=\"button\"\n                      data-cy=\"c8y-trusted-certificates--copy-to-clipboard\"\n                      [delay]=\"500\"\n                      [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n                      (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n                    >\n                      <i c8yIcon=\"clipboard\"></i>\n                    </button>\n                    <button\n                      class=\"btn btn-default btn-sm\"\n                      [attr.aria-label]=\"'Download as file' | translate\"\n                      tooltip=\"{{ 'Download as file' | translate }}\"\n                      type=\"button\"\n                      data-cy=\"c8y-trusted-certificates--download-as-file\"\n                      [delay]=\"500\"\n                      [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n                      (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n                      c8yProductExperience\n                      [actionName]=\"PRODUCT_EXPERIENCE.EVENT\"\n                      [actionData]=\"{\n                        component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.DOWNLOAD_CODE,\n                        action: PRODUCT_EXPERIENCE.VERIFICATION_CODE.ACTIONS.DOWNLOAD\n                      }\"\n                    >\n                      <i c8yIcon=\"download\"></i>\n                    </button>\n                  </div>\n                </div>\n\n                <div class=\"col-md-6 col-lg-6\">\n                  <c8y-form-group>\n                    <label\n                      class=\"control-label\"\n                      for=\"signedVerificationCode\"\n                    >\n                      {{ 'Signed verification code' | translate }}\n                      <button\n                        class=\"btn-help btn-help--sm\"\n                        [attr.aria-label]=\"'Help' | translate\"\n                        popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n                        placement=\"top\"\n                        container=\"body\"\n                        type=\"button\"\n                        data-cy=\"c8y-trusted-certificates--signed-verification-code-popup\"\n                        [outsideClick]=\"true\"\n                      ></button>\n                    </label>\n                    <textarea\n                      class=\"form-control no-resize\"\n                      id=\"signedVerificationCode\"\n                      name=\"signedVerificationCode\"\n                      type=\"text\"\n                      rows=\"5\"\n                      [(ngModel)]=\"trustedCertificate.signedVerificationCode\"\n                    ></textarea>\n                  </c8y-form-group>\n                  <div class=\"d-flex\">\n                    <button\n                      class=\"btn btn-primary btn-sm\"\n                      title=\"{{ 'Verify signed verification code' | translate }}\"\n                      type=\"button\"\n                      (click)=\"verifySignedVerificationCode(trustedCertificate)\"\n                      [disabled]=\"!trustedCertificate.signedVerificationCode\"\n                    >\n                      {{ 'Verify`signed verification code`' | translate }}\n                    </button>\n                    <button\n                      class=\"btn btn-sm btn-default m-l-auto\"\n                      [attr.aria-label]=\"'Upload file' | translate\"\n                      tooltip=\"{{ 'Upload file' | translate }}\"\n                      type=\"button\"\n                      [delay]=\"500\"\n                      (click)=\"fileInput.click()\"\n                    >\n                      <i c8yIcon=\"upload\"></i>\n                    </button>\n                    <input\n                      class=\"hidden\"\n                      type=\"file\"\n                      #fileInput\n                      (change)=\"onFileInput($event, trustedCertificate)\"\n                    />\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </c8y-li-collapse>\n  </c8y-li>\n</c8y-list-group>\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { TrustedCertificateListComponent } from './trusted-certificate-list.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nconst trustedCertificatesRoutes: Route[] = [\n  {\n    path: 'trusted-certificates/certificates',\n    component: TrustedCertificateListComponent,\n    pathMatch: 'full'\n  }\n];\n\n@NgModule({\n  declarations: [TrustedCertificateListComponent, AddTrustedCertificateComponent],\n  exports: [],\n  imports: [\n    CoreModule,\n    CommonModule,\n    RouterModule.forChild(trustedCertificatesRoutes),\n    BsDropdownModule.forRoot(),\n    TooltipModule,\n    ReactiveFormsModule,\n    ButtonsModule,\n    PopoverModule\n  ]\n})\nexport class TrustedCertificateListModule {}\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { hookNavigator, hookPatternMessages, hookTab } from '@c8y/ngx-components';\nimport { TrustedCertificatesNavigationFactory } from './factories/trusted-certificates-navigation.factory';\nimport { MESSAGES_TRUSTED_CERTIFICATES } from './pattern-messages.data';\nimport { TabsFactory } from './factories/tabs.factory';\nimport { CrlSettingsModule } from './crl/crl-settings.module';\nimport { TrustedCertificateListModule } from './list/trusted-certificate-list.module';\n\nconst trustedCertificatesRedirectRoutes: Route[] = [\n  {\n    path: 'trusted-certificates',\n    pathMatch: 'full',\n    redirectTo: 'trusted-certificates/certificates'\n  }\n];\n\n@NgModule({\n  exports: [],\n  imports: [\n    RouterModule.forChild(trustedCertificatesRedirectRoutes),\n    CrlSettingsModule,\n    TrustedCertificateListModule\n  ],\n  providers: [\n    hookNavigator(TrustedCertificatesNavigationFactory),\n    hookPatternMessages(MESSAGES_TRUSTED_CERTIFICATES),\n    hookTab(TabsFactory)\n  ]\n})\nexport class TrustedCertificatesModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3","i5","i7.CrlCheckSettingsComponent","i4","i6","i8","i9"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;MAIa,oCAAoC,CAAA;AADjD,IAAA,WAAA,GAAA;QAEE,IAAI,CAAA,IAAA,GAAoB,EAAE,CAAC;AAgB5B,KAAA;AAdC,IAAA,MAAM,GAAG,GAAA;QACP,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CACZ,IAAI,aAAa,CAAC;AAChB,gBAAA,KAAK,EAAE,OAAO,CAAC,sBAAsB,CAAC;AACtC,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,IAAI,EAAE,oCAAoC;AAC1C,gBAAA,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;AAC7B,gBAAA,QAAQ,EAAE,GAAG;AACd,aAAA,CAAC,CACH,CAAC;SACH;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;KAClB;+GAhBU,oCAAoC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;mHAApC,oCAAoC,EAAA,CAAA,CAAA,EAAA;;4FAApC,oCAAoC,EAAA,UAAA,EAAA,CAAA;kBADhD,UAAU;;;ACHX;AAGO,MAAM,6BAA6B,GAAG;AAC3C,IAAA,mDAAmD,EAAE;AACnD,QAAA,OAAO,EAAE,OAAO,CAAC,+CAA+C,CAAC;AACjE,QAAA,YAAY,EAAE;AACZ,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA;AACF,KAAA;AACD,IAAA,4GAA4G,EAC1G;AACE,QAAA,OAAO,EAAE,OAAO,CACd,oKAAoK,CACrK;AACD,QAAA,YAAY,EAAE;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA;AACF,KAAA;AACH,IAAA,6GAA6G,EAC3G;AACE,QAAA,OAAO,EAAE,OAAO,CACd,yJAAyJ,CAC1J;AACD,QAAA,YAAY,EAAE;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA;AACF,KAAA;CACK;;MCzBG,WAAW,CAAA;AACtB,IAAA,WAAA,CAAmB,MAAc,EAAA;QAAd,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;KAAI;IACrC,GAAG,GAAA;QACD,MAAM,IAAI,GAAU,EAAE,CAAC;QAEvB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE;YAClD,IAAI,CAAC,IAAI,CAAC;AACR,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC;AAC9B,gBAAA,IAAI,EAAE,mCAAmC;AACzC,gBAAA,WAAW,EAAE,YAAY;AACnB,aAAA,CAAC,CAAC;YAEV,IAAI,CAAC,IAAI,CAAC;AACR,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,QAAQ,EAAE,GAAG;AACb,gBAAA,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;AAC1B,gBAAA,IAAI,EAAE,+BAA+B;AACrC,gBAAA,WAAW,EAAE,YAAY;AACnB,aAAA,CAAC,CAAC;SACX;AAED,QAAA,OAAO,IAAI,CAAC;KACb;+GAxBU,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;mHAAX,WAAW,EAAA,CAAA,CAAA,EAAA;;4FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBADvB,UAAU;;;MCIE,yBAAyB,CAAA;AAGpC,IAAA,WAAA,CACU,cAA8B,EAC9B,oBAA0C,EAC1C,YAA0B,EAAA;QAF1B,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;QAC9B,IAAoB,CAAA,oBAAA,GAApB,oBAAoB,CAAsB;QAC1C,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QALpC,IAAQ,CAAA,QAAA,GAA0C,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;KAMhF;AAEJ,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,CAAC,QAAQ,GAAG;AACd,YAAA,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CACjD,eAAe,EACf,2BAA2B,EAC3B,KAAK,CACN,CAAY;AACb,YAAA,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAChD,eAAe,EACf,0BAA0B,EAC1B,KAAK,CACN,CAAY;SACd,CAAC;KACH;IAED,MAAM,kBAAkB,CAAC,YAA2B,EAAA;AAClD,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACrD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAC;SACtE;QAAC,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SACxC;KACF;+GA/BU,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,8DCRtC,myEAoFA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FD5Ea,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAJrC,SAAS;+BACE,wBAAwB,EAAA,QAAA,EAAA,myEAAA,EAAA,CAAA;;;MEKvB,oBAAoB,CAAA;AAa/B,IAAA,WAAA,CACU,UAAsB,EACtB,YAA0B,EAC1B,YAA0B,EAAA;QAF1B,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACtB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAC1B,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAfpC,QAAA,IAAA,CAAA,IAAI,GAA6B,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,CAAC;QACxE,IAAY,CAAA,YAAA,GAAkB,EAAE,CAAC;AACjC,QAAA,IAAA,CAAA,KAAK,GAAS,IAAI,IAAI,EAAE,CAAC;AAEzB,QAAA,IAAA,CAAA,oBAAoB,GAAG,OAAO,CAC5B,sMAAsM,CACvM,CAAC;AAEF,QAAA,IAAA,CAAA,mBAAmB,GAAG,OAAO,CAC3B,uPAAuP,CACxP,CAAC;KAME;AAEJ,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,IAAI,WAAwB,CAAC;AAC7B,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;AACpD,YAAA,WAAW,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,EAAE,gBAAgB,EAAE;AAC3D,gBAAA,IAAI,EAAE,sBAAsB;AAC7B,aAAA,CAAC,CAAC;YACH,MAAM,CAAC,UAAU,CAAC,CAAC;SACpB;QAAC,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SACxC;KACF;IAED,mBAAmB,GAAA;AACjB,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAA,0BAAA,EAA6B,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA,CAAE,CAAC,EAAE;AAC/E,YAAA,IAAI,EAAE,yBAAyB;AAChC,SAAA,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC;AAChC,QAAA,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAA,IAAA,CAAM,CAAC,CAAC;KACjC;IAED,wBAAwB,GAAA;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,CAAC;KACtD;AAED,IAAA,2BAA2B,CAAC,qBAAqB,EAAA;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1B,IAAI,CAAC,wBAAwB,EAAE,CAAC;SACjC;KACF;AAED,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;AACrB,YAAA,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AACtB,YAAA,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;AAC3B,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;SAClD;QAAC,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SACxC;KACF;AAED,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;KAC1E;AAED,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;KACtD;AAEO,IAAA,MAAM,OAAO,GAAA;QACnB,MAAM,uBAAuB,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,CAAC;AACxE,QAAA,MAAM,MAAM,GAAG,uBAAuB,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;QACxE,MAAM,IAAI,GAAG,uBAAuB;AAClC,cAAE,OAAO,CACL,6GAA6G,CAC9G;AACH,cAAE,OAAO,CAAC,0DAA0D,CAAC,CAAC;AAExE,QAAA,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;AACvE,YAAA,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC;AACtB,SAAA,CAAC,CAAC;KACJ;IAEO,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,CAAC;KACpD;AAEO,IAAA,MAAM,QAAQ,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7C;KACF;AAEO,IAAA,MAAM,aAAa,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAChE;KACF;IAEO,6BAA6B,GAAA;QACnC,OAAO;AACL,YAAA,iBAAiB,EAAE,EAAE;SACtB,CAAC;KACH;+GA3GU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,wDCVjC,ozNAmNA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,wBAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,aAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,yBAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDzMa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,SAAS;+BACE,kBAAkB,EAAA,QAAA,EAAA,ozNAAA,EAAA,CAAA;;;AEE9B,MAAM,iCAAiC,GAAY;AACjD,IAAA;AACE,QAAA,IAAI,EAAE,+BAA+B;AACrC,QAAA,SAAS,EAAE,oBAAoB;AAC/B,QAAA,SAAS,EAAE,MAAM;AAClB,KAAA;CACF,CAAC;MAcW,iBAAiB,CAAA;+GAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,EAXb,YAAA,EAAA,CAAA,oBAAoB,EAAE,yBAAyB,aAG5D,UAAU;AACV,YAAA,YAAY,wCAGZ,kBAAkB;YAClB,aAAa,CAAA,EAAA,CAAA,CAAA,EAAA;AAGJ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,YAR1B,UAAU;YACV,YAAY;AACZ,YAAA,YAAY,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACxD,gBAAgB,CAAC,OAAO,EAAE;YAC1B,kBAAkB;YAClB,aAAa,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAGJ,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAZ7B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,CAAC,oBAAoB,EAAE,yBAAyB,CAAC;AAC/D,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,OAAO,EAAE;wBACP,UAAU;wBACV,YAAY;AACZ,wBAAA,YAAY,CAAC,QAAQ,CAAC,iCAAiC,CAAC;wBACxD,gBAAgB,CAAC,OAAO,EAAE;wBAC1B,kBAAkB;wBAClB,aAAa;AACd,qBAAA;AACF,iBAAA,CAAA;;;ACtBM,MAAM,uCAAuC,GAAG;AACrD,IAAA,KAAK,EAAE,oBAAoB;AAC3B,IAAA,YAAY,EAAE;AACZ,QAAA,UAAU,EAAE;AACV,YAAA,mBAAmB,EAAE,qBAAqB;AAC3C,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,MAAM,EAAE,QAAQ;AACjB,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,WAAW,EAAE,kBAAkB;AAC/B,YAAA,cAAc,EAAE,oBAAoB;AACpC,YAAA,cAAc,EAAE,oBAAoB;AACrC,SAAA;AACF,KAAA;AACD,IAAA,iBAAiB,EAAE;AACjB,QAAA,UAAU,EAAE;AACV,YAAA,eAAe,EAAE,uCAAuC;AACxD,YAAA,WAAW,EAAE,iCAAiC;AAC9C,YAAA,aAAa,EAAE,qCAAqC;AACrD,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,UAAU,EAAE,YAAY;AACxB,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,QAAQ,EAAE,UAAU;AACrB,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,kBAAkB,EAAE,qCAAqC;AACzD,YAAA,cAAc,EAAE,oBAAoB;AACpC,YAAA,aAAa,EAAE,8BAA8B;AAC9C,SAAA;AACF,KAAA;CACO;;MC7BG,8BAA8B,CAAA;AAkBzC,IAAA,WAAA,CACU,KAAiB,EACjB,yBAAoD,EACpD,YAA0B,EAC1B,gBAAkC,EAAA;QAHlC,IAAK,CAAA,KAAA,GAAL,KAAK,CAAY;QACjB,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;QACpD,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAC1B,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QArB5C,IAAe,CAAA,eAAA,GAAG,CAAC,CAAC;AACpB,QAAA,IAAA,CAAA,yBAAyB,GAAG,OAAO,CACjC,qNAAqN,CACtN,CAAC;AACF,QAAA,IAAA,CAAA,kBAAkB,GAAiC;AACjD,YAAA,MAAM,EAAE,UAAU;SACnB,CAAC;QACF,IAAc,CAAA,cAAA,GAAG,KAAK,CAAC;QAEvB,IAAM,CAAA,MAAA,GAAiB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrD,YAAA,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;AACrB,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;AACxB,SAAC,CAAC,CAAC;QAGH,IAAkB,CAAA,kBAAA,GAAG,uCAAuC,CAAC;KAOzD;AAEJ,IAAA,UAAU,CAAC,OAAsB,EAAA;AAC/B,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,OAAO,EAAE;AACX,YAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;AAChC,YAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AACnB,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,IAAI,CAAC,kBAAkB,CAAC,eAAe,GAAG,MAAM,CAAC,MAAgB,CAAC;AACpE,aAAC,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACpC;KACF;AAED,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACrE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,uCAAuC,CAAC,KAAK,EAAE;AAChF,gBAAA,SAAS,EACP,uCAAuC,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB;AACrF,gBAAA,MAAM,EAAE,uCAAuC,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW;AAChF,gBAAA,MAAM,EAAE,uCAAuC,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG;AACzE,aAAA,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;QAAC,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SACxC;KACF;IAED,KAAK,GAAA;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;KACnB;+GAxDU,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAJ,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,mECX3C,83HA8HA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,wBAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDnHa,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAJ1C,SAAS;+BACE,6BAA6B,EAAA,QAAA,EAAA,83HAAA,EAAA,CAAA;;;MEyB5B,+BAA+B,CAAA;AAyC1C,IAAA,WAAA,CACU,OAAuB,EACvB,YAA0B,EAC1B,yBAAoD,EACpD,YAA0B,EAC1B,gBAAkC,EAClC,gBAAkC,EAClC,gBAAkC,EAClC,oBAA0C,EAC1C,cAA8B,EAAA;QAR9B,IAAO,CAAA,OAAA,GAAP,OAAO,CAAgB;QACvB,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAC1B,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;QACpD,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAC1B,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAoB,CAAA,oBAAA,GAApB,oBAAoB,CAAsB;QAC1C,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;AAjDxC,QAAA,IAAA,CAAA,2BAA2B,GAAG,OAAO,CACnC,sJAAsJ,CACvJ,CAAC;AACF,QAAA,IAAA,CAAA,gCAAgC,GAAG,OAAO,CACxC,gKAAgK,CACjK,CAAC;AAEF,QAAA,IAAA,CAAA,yBAAyB,GAAG,OAAO,CACjC,qNAAqN,CACtN,CAAC;AAEF,QAAA,IAAA,CAAA,SAAS,GAA6B,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;AACjE,QAAA,IAAA,CAAA,MAAM,GAA0B,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;AAC1D,QAAA,IAAA,CAAA,mBAAmB,GAAiD,IAAI,CAAC,MAAM,CAAC,IAAI,CAClF,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EACpC,SAAS,CAAC,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC,EAC9C,GAAG,CAAC,OAAO,IAAG;AACZ,YAAA,IAAI,CAAC,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CACjD,KAAK,IAAI,KAAK,CAAC,0BAA0B,CAC1C,CAAC;SACH,CAAC,EACF,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EACrC,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AACF,QAAA,IAAA,CAAA,uBAAuB,GAAyC,IAAI,CAClE,GAAG,CAAC,OAAO,IAAG;YACZ,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,KAAI;gBAC7B,IAAI,EAAE,CAAC,0BAA0B,KAAK,EAAE,CAAC,0BAA0B,EAAE;AACnE,oBAAA,OAAO,EAAE,CAAC,0BAA0B,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;iBAC/C;gBACD,OAAO,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AAChD,aAAC,CAAC,CAAC;SACJ,CAAC,CACH,CAAC;QAEF,IAA0B,CAAA,0BAAA,GAAG,KAAK,CAAC;QAEnC,IAAkB,CAAA,kBAAA,GAAG,uCAAuC,CAAC;QAC7D,IAAkC,CAAA,kCAAA,GAAG,KAAK,CAAC;KAYvC;AAEJ,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACrC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,gCAAgC,EAAE,CAAC;KACzC;AAED,IAAA,MAAM,uBAAuB,GAAA;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;KACpB;IAED,sBAAsB,GAAA;AACpB,QAAA,MAAM,MAAM,GAAW;AACrB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,cAAc,EAAE,IAAI;SACrB,CAAC;QACF,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACpD;AAED,IAAA,MAAM,qBAAqB,GAAA;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE;AAC9D,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,eAAe,EAAE,gCAAgC;AACjD,YAAA,cAAc,EAAE,0BAA0B;AAC1C,YAAA,mBAAmB,EAAE,IAAI;AACzB,YAAA,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC,OAAyC,CAAC;AAC7C,QAAA,IAAI;YACF,MAAM,KAAK,CAAC,MAAM,CAAC;YACnB,KAAK,CAAC,KAAK,EAAE,CAAC;AACd,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SACpB;QAAC,OAAO,EAAE,EAAE;;SAEZ;KACF;AAED,IAAA,MAAM,gBAAgB,GAAA;AACpB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,yBAAyB,CAAC,4BAA4B,EAAE,CAAC;AACpE,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SACpB;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC3C;KACF;IAED,MAAM,wBAAwB,CAAC,WAAW,EAAA;AACxC,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;AACpD,QAAA,MAAM,gBAAgB,GAAG,OAAO,CAC9B,wEAAwE,CACzE,CAAC;AACF,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;AACzD,QAAA,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC;AACzC,QAAA,MAAM,IAAI,GAAG;AACX,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBAC9C,eAAe;aAChB,CAAC;AACF,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC;AAC7C,SAAA,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACvF,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YACrE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,uCAAuC,CAAC,KAAK,EAAE;AAChF,gBAAA,SAAS,EACP,uCAAuC,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB;AACrF,gBAAA,MAAM,EAAE,uCAAuC,CAAC,YAAY,CAAC,OAAO,CAAC,cAAc;AACnF,gBAAA,MAAM,EAAE,uCAAuC,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM;AAC5E,aAAA,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAC3D,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SACpB;QAAC,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SACxC;KACF;AAED,IAAA,MAAM,iBAAiB,CACrB,kBAAuC,EACvC,YAA0C,EAAA;AAE1C,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC;gBAC1C,WAAW,EAAE,kBAAkB,CAAC,WAAW;AAC3C,gBAAA,GAAG,YAAY;AAChB,aAAA,CAAC,CAAC;YACH,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,uCAAuC,CAAC,KAAK,EAAE;AAChF,gBAAA,SAAS,EACP,uCAAuC,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB;AACrF,gBAAA,MAAM,EAAE,uCAAuC,CAAC,YAAY,CAAC,OAAO,CAAC,cAAc;AACnF,gBAAA,MAAM,EAAE,uCAAuC,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM;AAC5E,aAAA,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;SAC1D;QAAC,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SACxC;KACF;AAED,IAAA,oCAAoC,CAAC,IAAyB,EAAA;AAC5D,QAAA,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;QAC/C,MAAM,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,gBAAgB,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC;AAC9D,QAAA,MAAM,iBAAiB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5D,QAAA,MAAM,OAAO,GAAG,iBAAiB,GAAG,cAAc,CAAC;AACnD,QAAA,MAAM,uBAAuB,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;QACrE,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,aAAa,CAAC;SACtB;QACD,IAAI,uBAAuB,EAAE;AAC3B,YAAA,OAAO,cAAc,CAAC;SACvB;AACD,QAAA,OAAO,EAAE,CAAC;KACX;AAED,IAAA,kCAAkC,CAAC,kBAAuC,EAAA;AACxE,QAAA,IAAI,CAAC,yBAAyB,CAAC,6BAA6B,CAAC,kBAAkB,CAAC,CAAC,IAAI,CACnF,CAAC,EAAE,IAAI,EAAE,KAAI;AACX,YAAA,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,uCAAuC,CAAC,KAAK,EAAE;AAChF,gBAAA,SAAS,EACP,uCAAuC,CAAC,iBAAiB,CAAC,UAAU,CAAC,eAAe;AACtF,gBAAA,MAAM,EACJ,uCAAuC,CAAC,iBAAiB,CAAC,OAAO,CAAC,kBAAkB;AACtF,gBAAA,MAAM,EAAE,uCAAuC,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU;AACrF,aAAA,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAC;AACvE,SAAC,EACD,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAC7C,CAAC;KACH;AAED,IAAA,4BAA4B,CAAC,kBAAsC,EAAA;AACjE,QAAA,IAAI,CAAC,yBAAyB;AAC3B,aAAA,4BAA4B,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,sBAAsB,CAAC;AAC3F,aAAA,IAAI,CACH,CAAC,EAAE,IAAI,EAAE,KAAI;AACX,YAAA,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,uCAAuC,CAAC,KAAK,EAAE;AAChF,gBAAA,SAAS,EACP,uCAAuC,CAAC,iBAAiB,CAAC,UAAU,CAAC,WAAW;AAClF,gBAAA,MAAM,EACJ,uCAAuC,CAAC,iBAAiB,CAAC,OAAO,CAAC,cAAc;AAClF,gBAAA,MAAM,EAAE,uCAAuC,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM;AACjF,aAAA,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,CAAC;SAC1E,EACD,EAAE,IAAG;YACH,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,uCAAuC,CAAC,KAAK,EAAE;AAChF,gBAAA,SAAS,EACP,uCAAuC,CAAC,iBAAiB,CAAC,UAAU,CAAC,WAAW;AAClF,gBAAA,MAAM,EAAE,uCAAuC,CAAC,iBAAiB,CAAC,OAAO,CAAC,aAAa;AACvF,gBAAA,MAAM,EAAE,uCAAuC,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM;AACjF,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AACzC,SAAC,CACF,CAAC;KACL;AAED,IAAA,gCAAgC,CAAC,kBAAuC,EAAA;QACtE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,kBAAkB,CAAC,yCAAyC,CAAC,CAAC,CAAC;AACtF,QAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC;AACzC,QAAA,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAA,IAAA,CAAM,CAAC,CAAC;KACjC;AAED,IAAA,uCAAuC,CAAC,kBAAuC,EAAA;QAC7E,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,CAAC,yCAAyC,CAAC,CAAC;KAC/F;IAED,WAAW,CAAC,KAAK,EAAE,kBAAsC,EAAA;AACvD,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;AAC3B,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;AAChC,QAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AACnB,YAAA,kBAAkB,CAAC,sBAAsB,GAAG,MAAM,CAAC,MAAgB,CAAC;AACtE,SAAC,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KACnC;AAEO,IAAA,MAAM,mBAAmB,GAAA;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;AACtD,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,GAAG,EAAE,2BAA2B;AACjC,SAAA,CAAC,CAAC;QACH,MAAM,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AACzD,QAAA,IAAI,uBAAuB,KAAK,MAAM,EAAE;YACtC,IAAI,CAAC,YAAY,CAAC,OAAO,CACvB,OAAO,CACL,2QAA2Q,CAC5Q,CACF,CAAC;SACH;KACF;IAEO,gCAAgC,GAAA;AACtC,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAI;AACpE,YAAA,IAAI,CAAC,kCAAkC,GAAG,IAAI,CAAC,MAAM,CAAC;AACxD,SAAC,CAAC,CAAC;KACJ;+GAvPU,+BAA+B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAK,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,gECjC5C,mg0BA+rBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,2BAAA,EAAA,gCAAA,EAAA,6BAAA,EAAA,oCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,cAAA,EAAA,yBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,aAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FD9pBa,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAJ3C,SAAS;+BACE,0BAA0B,EAAA,QAAA,EAAA,mg0BAAA,EAAA,CAAA;;;AEnBtC,MAAM,yBAAyB,GAAY;AACzC,IAAA;AACE,QAAA,IAAI,EAAE,mCAAmC;AACzC,QAAA,SAAS,EAAE,+BAA+B;AAC1C,QAAA,SAAS,EAAE,MAAM;AAClB,KAAA;CACF,CAAC;MAgBW,4BAA4B,CAAA;+GAA5B,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4BAA4B,EAbxB,YAAA,EAAA,CAAA,+BAA+B,EAAE,8BAA8B,aAG5E,UAAU;AACV,YAAA,YAAY,wCAGZ,aAAa;YACb,mBAAmB;YACnB,aAAa;YACb,aAAa,CAAA,EAAA,CAAA,CAAA,EAAA;AAGJ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4BAA4B,YAVrC,UAAU;YACV,YAAY;AACZ,YAAA,YAAY,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAChD,gBAAgB,CAAC,OAAO,EAAE;YAC1B,aAAa;YACb,mBAAmB;YACnB,aAAa;YACb,aAAa,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAGJ,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAdxC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,CAAC,+BAA+B,EAAE,8BAA8B,CAAC;AAC/E,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,OAAO,EAAE;wBACP,UAAU;wBACV,YAAY;AACZ,wBAAA,YAAY,CAAC,QAAQ,CAAC,yBAAyB,CAAC;wBAChD,gBAAgB,CAAC,OAAO,EAAE;wBAC1B,aAAa;wBACb,mBAAmB;wBACnB,aAAa;wBACb,aAAa;AACd,qBAAA;AACF,iBAAA,CAAA;;;ACvBD,MAAM,iCAAiC,GAAY;AACjD,IAAA;AACE,QAAA,IAAI,EAAE,sBAAsB;AAC5B,QAAA,SAAS,EAAE,MAAM;AACjB,QAAA,UAAU,EAAE,mCAAmC;AAChD,KAAA;CACF,CAAC;MAeW,yBAAyB,CAAA;+GAAzB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,6BATlC,iBAAiB;YACjB,4BAA4B,CAAA,EAAA,CAAA,CAAA,EAAA;AAQnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,EANzB,SAAA,EAAA;YACT,aAAa,CAAC,oCAAoC,CAAC;YACnD,mBAAmB,CAAC,6BAA6B,CAAC;YAClD,OAAO,CAAC,WAAW,CAAC;AACrB,SAAA,EAAA,OAAA,EAAA,CARC,YAAY,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACxD,iBAAiB;YACjB,4BAA4B,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAQnB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAbrC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,OAAO,EAAE;AACP,wBAAA,YAAY,CAAC,QAAQ,CAAC,iCAAiC,CAAC;wBACxD,iBAAiB;wBACjB,4BAA4B;AAC7B,qBAAA;AACD,oBAAA,SAAS,EAAE;wBACT,aAAa,CAAC,oCAAoC,CAAC;wBACnD,mBAAmB,CAAC,6BAA6B,CAAC;wBAClD,OAAO,CAAC,WAAW,CAAC;AACrB,qBAAA;AACF,iBAAA,CAAA;;;AC7BD;;AAEG;;;;"}