@c8y/ngx-components 1018.0.59 → 1018.0.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-trusted-certificates.mjs","sources":["../../trusted-certificates/trusted-certificate.model.ts","../../trusted-certificates/add-trusted-certificate.component.ts","../../trusted-certificates/add-trusted-certificate.component.html","../../trusted-certificates/trusted-certificates.component.ts","../../trusted-certificates/trusted-certificates.component.html","../../trusted-certificates/trusted-certificates-navigation.factory.ts","../../trusted-certificates/pattern-messages.data.ts","../../trusted-certificates/trusted-certificates.module.ts","../../trusted-certificates/c8y-ngx-components-trusted-certificates.ts"],"sourcesContent":["export const PRODUCT_EXPERIENCE = {\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: 'regenrate',\n VERIFY: 'verify',\n DOWNLOAD: 'download'\n },\n RESULTS: {\n REGENERATE_SUCCESS: 'unsignedVerificationCodeRegenerated',\n VERIFY_SUCCESS: 'signedCodeVerified',\n VERIFY_FAILED: 'signedCodeVerificationFailed'\n }\n }\n};\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 } 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 'All devices with credentials signed by this certificate will be able to communicate with the platform without a prior registration.'\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;\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.EVENT, {\n component: PRODUCT_EXPERIENCE.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE.CERTIFICATES.RESULTS.ADD_SUCCESS,\n action: PRODUCT_EXPERIENCE.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 class=\"modal-title\" id=\"addCertificateModalTitle\" translate>Add trusted certificate</div>\n </div>\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addCertificateModalDescription\">\n <form #addTrustedCertificateForm=\"ngForm\">\n <c8y-form-group>\n <label translate for=\"certificateName\">Certificate name</label>\n <input\n id=\"certificateName\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"certificateName\"\n [(ngModel)]=\"trustedCertificate.name\"\n placeholder=\"{{ 'e.g. My certificate' | translate }}\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"certificate\">Certificate</label>\n <c8y-drop-area\n class=\"drop-area-sm\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n [title]=\"'Paste the certificate in PEM format.' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n id=\"autoRegistration\"\n type=\"checkbox\"\n name=\"autoRegistration\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </c8y-form-group>\n <button\n class=\"btn\"\n type=\"button\"\n name=\"certificateStatus\"\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 </form>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Add certificate' | translate }}\"\n (click)=\"save()\"\n [disabled]=\"\n addTrustedCertificateForm.form.invalid ||\n addTrustedCertificateForm.form.pristine ||\n !fileIsUploaded\n \"\n >\n {{ 'Add certificate' | translate }}\n </button>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport {\n AlertService,\n ClipboardService,\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 { ITrustedCertificate, TrustedCertificateService, IResultList } from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\nimport { tap, switchMap } from 'rxjs/operators';\nimport { pipe, BehaviorSubject, Observable } from 'rxjs';\nimport { saveAs } from 'file-saver';\nimport { assign } from 'lodash-es';\nimport { PRODUCT_EXPERIENCE } from './trusted-certificate.model';\n\n@Component({\n selector: 'c8y-trusted-certificates',\n templateUrl: './trusted-certificates.component.html'\n})\nexport class TrustedCertificatesComponent 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 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(() => this.reloading.next(false))\n );\n sortByExpirationDateAsc = pipe(\n tap((results: ITrustedCertificate[]) => {\n return results.sort((n1, n2) => n1.notAfter.localeCompare(n2.notAfter));\n })\n );\n\n signedVerificationCode: string;\n PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE;\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 ) {}\n\n async ngOnInit() {\n await this.loadTrustedCertificates();\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 }).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 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.EVENT, {\n component: PRODUCT_EXPERIENCE.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE.CERTIFICATES.RESULTS.DELETE_SUCCESS,\n action: PRODUCT_EXPERIENCE.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.EVENT, {\n component: PRODUCT_EXPERIENCE.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE.CERTIFICATES.RESULTS.UPDATE_SUCCESS,\n action: PRODUCT_EXPERIENCE.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.EVENT, {\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.REGENERATE_CODE,\n result: PRODUCT_EXPERIENCE.VERIFICATION_CODE.RESULTS.REGENERATE_SUCCESS,\n action: PRODUCT_EXPERIENCE.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(\n trustedCertificate: ITrustedCertificate,\n signedVerificationCode: string\n ) {\n this.trustedCertificateService\n .verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n .then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.EVENT, {\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.VERIFY_CODE,\n result: PRODUCT_EXPERIENCE.VERIFICATION_CODE.RESULTS.VERIFY_SUCCESS,\n action: PRODUCT_EXPERIENCE.VERIFICATION_CODE.ACTIONS.VERIFY\n });\n this.alertService.success(gettext('Signed verification code verified.'));\n },\n ex => {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.EVENT, {\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.VERIFY_CODE,\n result: PRODUCT_EXPERIENCE.VERIFICATION_CODE.RESULTS.VERIFY_FAILED,\n action: PRODUCT_EXPERIENCE.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) {\n const input = event.target;\n const reader = new FileReader();\n reader.onload = () => {\n this.signedVerificationCode = reader.result as string;\n };\n reader.readAsText(input.files[0]);\n }\n}\n","<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ 'Trusted certificates' | translate }}\"\n icon=\"certificate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\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 type=\"button\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/device-management/#trusted-certificates\"></c8y-help>\n\n<c8y-ui-empty-state\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n>\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\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 *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"certificate\" class=\"invisible\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Certificate' | translate }} \">\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Status' | translate }}\">\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Algorithm' | translate }}\">\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Expiration date' | translate }}\">\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Auto registration' | translate }}\">\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Proof of possession' | translate }}\">\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 >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\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 type=\"button\"\n title=\"{{ trustedCertificate.name }}\"\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 type=\"button\"\n name=\"certificateStatus\"\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 class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>Algorithm</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 class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n c8yIcon=\"calendar\"\n class=\"m-r-4\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n c8yIcon=\"warning\"\n class=\"m-r-4\"\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 *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\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 *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n type=\"button\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\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 type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"trustedCertificate.name\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n title=\"{{ 'Update certificate name' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\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 for=\"certInPemFormat\" class=\"control-label\" translate>Certificate</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 title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\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 </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div class=\"legend form-block\" translate>Additional properties</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 class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"success\" class=\"text-success\"></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 title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"warning\" class=\"text-warning\"></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 for=\"unsignedVerificationCode\" class=\"control-label\" translate>\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"unsignedVerificationCode\"\n id=\"unsignedVerificationCode\"\n readonly\n type=\"text\"\n rows=\"5\"\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 type=\"button\"\n title=\"{{ 'Regenerate verification code' | translate }}\"\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 type=\"button\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n placement=\"right\"\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 type=\"button\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Download as file' | translate\"\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 for=\"signedVerificationCode\" class=\"control-label\">\n {{ 'Signed verification code' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n container=\"body\"\n placement=\"top\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"signedVerificationCode\"\n id=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n type=\"button\"\n title=\"{{ 'Verify signed verification code' | translate }}\"\n (click)=\"\n verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n \"\n [disabled]=\"!signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n type=\"button\"\n [attr.aria-label]=\"'Upload file' | translate\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n [delay]=\"500\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input #fileInput type=\"file\" (change)=\"onFileInput($event)\" class=\"hidden\" />\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 { 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',\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 = {\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};\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule, hookNavigator, hookPatternMessages } from '@c8y/ngx-components';\nimport { TrustedCertificatesComponent } from './trusted-certificates.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { TrustedCertificatesNavigationFactory } from './trusted-certificates-navigation.factory';\nimport { MESSAGES } from './pattern-messages.data';\n\nconst trustedCertificatesRoutes: Route[] = [\n {\n path: 'trusted-certificates',\n component: TrustedCertificatesComponent\n }\n];\n\n@NgModule({\n declarations: [TrustedCertificatesComponent, 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 entryComponents: [TrustedCertificatesComponent, AddTrustedCertificateComponent],\n providers: [hookNavigator(TrustedCertificatesNavigationFactory), hookPatternMessages(MESSAGES)]\n})\nexport class TrustedCertificatesModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3","i2","i4","i5","i6","i8","i9"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-trusted-certificates.mjs","sources":["../../trusted-certificates/trusted-certificate.model.ts","../../trusted-certificates/add-trusted-certificate.component.ts","../../trusted-certificates/add-trusted-certificate.component.html","../../trusted-certificates/trusted-certificates.component.ts","../../trusted-certificates/trusted-certificates.component.html","../../trusted-certificates/trusted-certificates-navigation.factory.ts","../../trusted-certificates/pattern-messages.data.ts","../../trusted-certificates/trusted-certificates.module.ts","../../trusted-certificates/c8y-ngx-components-trusted-certificates.ts"],"sourcesContent":["import { ITrustedCertificate } from '@c8y/client';\n\nexport interface TrustedCertificate extends ITrustedCertificate {\n signedVerificationCode?: string;\n}\n\nexport const PRODUCT_EXPERIENCE = {\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};\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 } 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 'All devices with credentials signed by this certificate will be able to communicate with the platform without a prior registration.'\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;\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.EVENT, {\n component: PRODUCT_EXPERIENCE.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE.CERTIFICATES.RESULTS.ADD_SUCCESS,\n action: PRODUCT_EXPERIENCE.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 class=\"modal-title\" id=\"addCertificateModalTitle\" translate>Add trusted certificate</div>\n </div>\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addCertificateModalDescription\">\n <form #addTrustedCertificateForm=\"ngForm\">\n <c8y-form-group>\n <label translate for=\"certificateName\">Certificate name</label>\n <input\n id=\"certificateName\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"certificateName\"\n [(ngModel)]=\"trustedCertificate.name\"\n placeholder=\"{{ 'e.g. My certificate' | translate }}\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"certificate\">Certificate</label>\n <c8y-drop-area\n class=\"drop-area-sm\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n [title]=\"'Paste the certificate in PEM format.' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n id=\"autoRegistration\"\n type=\"checkbox\"\n name=\"autoRegistration\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </c8y-form-group>\n <button\n class=\"btn\"\n type=\"button\"\n name=\"certificateStatus\"\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 </form>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Add certificate' | translate }}\"\n (click)=\"save()\"\n [disabled]=\"\n addTrustedCertificateForm.form.invalid ||\n addTrustedCertificateForm.form.pristine ||\n !fileIsUploaded\n \"\n >\n {{ 'Add certificate' | translate }}\n </button>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport {\n AlertService,\n ClipboardService,\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 { IResultList, ITrustedCertificate, TrustedCertificateService } from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\nimport { tap, switchMap } from 'rxjs/operators';\nimport { pipe, BehaviorSubject, Observable } from 'rxjs';\nimport { saveAs } from 'file-saver';\nimport { assign } from 'lodash-es';\nimport { PRODUCT_EXPERIENCE, TrustedCertificate } from './trusted-certificate.model';\n\n@Component({\n selector: 'c8y-trusted-certificates',\n templateUrl: './trusted-certificates.component.html'\n})\nexport class TrustedCertificatesComponent 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 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(() => this.reloading.next(false))\n );\n sortByExpirationDateAsc = pipe(\n tap((results: ITrustedCertificate[]) => {\n return results.sort((n1, n2) => n1.notAfter.localeCompare(n2.notAfter));\n })\n );\n\n signedVerificationCode: string;\n PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE;\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 ) {}\n\n async ngOnInit() {\n await this.loadTrustedCertificates();\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 }).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 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.EVENT, {\n component: PRODUCT_EXPERIENCE.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE.CERTIFICATES.RESULTS.DELETE_SUCCESS,\n action: PRODUCT_EXPERIENCE.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.EVENT, {\n component: PRODUCT_EXPERIENCE.CERTIFICATES.COMPONENTS.TRUSTED_CERTIFICATE,\n result: PRODUCT_EXPERIENCE.CERTIFICATES.RESULTS.UPDATE_SUCCESS,\n action: PRODUCT_EXPERIENCE.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.EVENT, {\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.REGENERATE_CODE,\n result: PRODUCT_EXPERIENCE.VERIFICATION_CODE.RESULTS.REGENERATE_SUCCESS,\n action: PRODUCT_EXPERIENCE.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.EVENT, {\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.VERIFY_CODE,\n result: PRODUCT_EXPERIENCE.VERIFICATION_CODE.RESULTS.VERIFY_SUCCESS,\n action: PRODUCT_EXPERIENCE.VERIFICATION_CODE.ACTIONS.VERIFY\n });\n this.alertService.success(gettext('Signed verification code verified.'));\n },\n ex => {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.EVENT, {\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.VERIFY_CODE,\n result: PRODUCT_EXPERIENCE.VERIFICATION_CODE.RESULTS.VERIFY_FAILED,\n action: PRODUCT_EXPERIENCE.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","<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ 'Trusted certificates' | translate }}\"\n icon=\"certificate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\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 type=\"button\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/device-management/#trusted-certificates\"></c8y-help>\n\n<c8y-ui-empty-state\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n>\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\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 *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"certificate\" class=\"invisible\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Certificate' | translate }} \">\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Status' | translate }}\">\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Algorithm' | translate }}\">\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Expiration date' | translate }}\">\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Auto registration' | translate }}\">\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Proof of possession' | translate }}\">\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 >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\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 type=\"button\"\n title=\"{{ trustedCertificate.name }}\"\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 type=\"button\"\n name=\"certificateStatus\"\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 class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>Algorithm</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 class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n c8yIcon=\"calendar\"\n class=\"m-r-4\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n c8yIcon=\"warning\"\n class=\"m-r-4\"\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 *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\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 *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n type=\"button\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\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 type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"trustedCertificate.name\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n title=\"{{ 'Update certificate name' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\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 for=\"certInPemFormat\" class=\"control-label\" translate>Certificate</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 title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\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 </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div class=\"legend form-block\" translate>Additional properties</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 class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"success\" class=\"text-success\"></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 title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"warning\" class=\"text-warning\"></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 for=\"unsignedVerificationCode\" class=\"control-label\" translate>\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"unsignedVerificationCode\"\n id=\"unsignedVerificationCode\"\n readonly\n type=\"text\"\n rows=\"5\"\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 type=\"button\"\n title=\"{{ 'Regenerate verification code' | translate }}\"\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 type=\"button\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n placement=\"right\"\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 type=\"button\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Download as file' | translate\"\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 for=\"signedVerificationCode\" class=\"control-label\">\n {{ 'Signed verification code' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n container=\"body\"\n placement=\"top\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"signedVerificationCode\"\n id=\"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 type=\"button\"\n title=\"{{ 'Verify signed verification code' | translate }}\"\n (click)=\"\n verifySignedVerificationCode(trustedCertificate)\n \"\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 type=\"button\"\n [attr.aria-label]=\"'Upload file' | translate\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n [delay]=\"500\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input #fileInput type=\"file\" (change)=\"onFileInput($event, trustedCertificate)\" class=\"hidden\" />\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 { 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',\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 = {\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};\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule, hookNavigator, hookPatternMessages } from '@c8y/ngx-components';\nimport { TrustedCertificatesComponent } from './trusted-certificates.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { TrustedCertificatesNavigationFactory } from './trusted-certificates-navigation.factory';\nimport { MESSAGES } from './pattern-messages.data';\n\nconst trustedCertificatesRoutes: Route[] = [\n {\n path: 'trusted-certificates',\n component: TrustedCertificatesComponent\n }\n];\n\n@NgModule({\n declarations: [TrustedCertificatesComponent, 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 entryComponents: [TrustedCertificatesComponent, AddTrustedCertificateComponent],\n providers: [hookNavigator(TrustedCertificatesNavigationFactory), hookPatternMessages(MESSAGES)]\n})\nexport class TrustedCertificatesModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3","i2","i4","i5","i6","i8","i9"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,MAAM,kBAAkB,GAAG;AAChC,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;CACF;;MC7BY,8BAA8B,CAAA;AAkBzC,IAAA,WAAA,CACU,KAAiB,EACjB,yBAAoD,EACpD,YAA0B,EAC1B,gBAAkC,EAAA;AAHlC,QAAA,IAAK,CAAA,KAAA,GAAL,KAAK,CAAY;AACjB,QAAA,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;AACpD,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AArB5C,QAAA,IAAe,CAAA,eAAA,GAAG,CAAC,CAAC;AACpB,QAAA,IAAA,CAAA,yBAAyB,GAAG,OAAO,CACjC,qIAAqI,CACtI,CAAC;QACF,IAAA,CAAA,kBAAkB,GAAiC;AACjD,YAAA,MAAM,EAAE,UAAU;SACnB,CAAC;AACF,QAAA,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;AAGH,QAAA,IAAkB,CAAA,kBAAA,GAAG,kBAAkB,CAAC;KAOpC;AAEJ,IAAA,UAAU,CAAC,OAAsB,EAAA;AAC/B,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;AAC5B,QAAA,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;AACpC,SAAA;KACF;IAEK,IAAI,GAAA;;YACR,IAAI;gBACF,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACrE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC3D,oBAAA,SAAS,EAAE,kBAAkB,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB;AACzE,oBAAA,MAAM,EAAE,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW;AAC3D,oBAAA,MAAM,EAAE,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG;AACpD,iBAAA,CAAC,CAAC;gBACH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBACzD,IAAI,CAAC,KAAK,EAAE,CAAC;AACd,aAAA;AAAC,YAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AACxC,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;IAED,KAAK,GAAA;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;KACnB;;2HAvDU,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,8BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,mECX3C,qiHAsGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,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,IAAA,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,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,EAAAA,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FD3Fa,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAJ1C,SAAS;+BACE,6BAA6B,EAAA,QAAA,EAAA,qiHAAA,EAAA,CAAA;;;MEe5B,4BAA4B,CAAA;AAwBvC,IAAA,WAAA,CACU,OAAuB,EACvB,YAA0B,EAC1B,yBAAoD,EACpD,YAA0B,EAC1B,gBAAkC,EAClC,gBAAkC,EAClC,gBAAkC,EAAA;AANlC,QAAA,IAAO,CAAA,OAAA,GAAP,OAAO,CAAgB;AACvB,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA2B;AACpD,QAAA,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAC1B,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AAClC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AAClC,QAAA,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;AA9B5C,QAAA,IAAA,CAAA,2BAA2B,GAAG,OAAO,CACnC,sJAAsJ,CACvJ,CAAC;AACF,QAAA,IAAA,CAAA,gCAAgC,GAAG,OAAO,CACxC,gKAAgK,CACjK,CAAC;QAEF,IAAA,CAAA,SAAS,GAA6B,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;QACjE,IAAA,CAAA,MAAM,GAA0B,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAmB,CAAA,mBAAA,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,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACtC,CAAC;QACF,IAAuB,CAAA,uBAAA,GAAG,IAAI,CAC5B,GAAG,CAAC,CAAC,OAA8B,KAAI;YACrC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;SACzE,CAAC,CACH,CAAC;AAGF,QAAA,IAAkB,CAAA,kBAAA,GAAG,kBAAkB,CAAC;KAUpC;IAEE,QAAQ,GAAA;;AACZ,YAAA,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;SACtC,CAAA,CAAA;AAAA,KAAA;IAEK,uBAAuB,GAAA;;AAC3B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SACpB,CAAA,CAAA;AAAA,KAAA;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;IAEK,qBAAqB,GAAA;;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE;AAC9D,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,eAAe,EAAE,gCAAgC;AACjD,gBAAA,cAAc,EAAE,0BAA0B;AAC1C,gBAAA,mBAAmB,EAAE,IAAI;aAC1B,CAAC,CAAC,OAAyC,CAAC;YAC7C,IAAI;gBACF,MAAM,KAAK,CAAC,MAAM,CAAC;gBACnB,KAAK,CAAC,KAAK,EAAE,CAAC;AACd,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACpB,aAAA;AAAC,YAAA,OAAO,EAAE,EAAE;;AAEZ,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;AAEK,IAAA,wBAAwB,CAAC,WAAW,EAAA;;AACxC,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;AACpD,YAAA,MAAM,gBAAgB,GAAG,OAAO,CAC9B,wEAAwE,CACzE,CAAC;AACF,YAAA,MAAM,aAAa,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;AACzD,YAAA,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC;AACzC,YAAA,MAAM,IAAI,GAAG;AACX,gBAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,gBAAgB,EAAE;oBAC9C,eAAe;iBAChB,CAAC;AACF,gBAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC;AAC7C,aAAA,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEZ,IAAI;gBACF,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;gBACvF,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;gBACrE,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC3D,oBAAA,SAAS,EAAE,kBAAkB,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB;AACzE,oBAAA,MAAM,EAAE,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,cAAc;AAC9D,oBAAA,MAAM,EAAE,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM;AACvD,iBAAA,CAAC,CAAC;gBACH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAC3D,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACpB,aAAA;AAAC,YAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AACxC,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;IAEK,iBAAiB,CACrB,kBAAuC,EACvC,YAA0C,EAAA;;YAE1C,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CACzC,MAAA,CAAA,MAAA,CAAA,EAAA,WAAW,EAAE,kBAAkB,CAAC,WAAW,EACxC,EAAA,YAAY,EACf,CAAC;gBACH,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAC3D,oBAAA,SAAS,EAAE,kBAAkB,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB;AACzE,oBAAA,MAAM,EAAE,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,cAAc;AAC9D,oBAAA,MAAM,EAAE,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM;AACvD,iBAAA,CAAC,CAAC;gBACH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAC1D,aAAA;AAAC,YAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AACxC,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;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;AACrE,QAAA,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,aAAa,CAAC;AACtB,SAAA;AACD,QAAA,IAAI,uBAAuB,EAAE;AAC3B,YAAA,OAAO,cAAc,CAAC;AACvB,SAAA;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,kBAAkB,CAAC,KAAK,EAAE;AAC3D,gBAAA,SAAS,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,UAAU,CAAC,eAAe;AAC1E,gBAAA,MAAM,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC,kBAAkB;AACvE,gBAAA,MAAM,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC,UAAU;AAChE,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,kBAAkB,CAAC,KAAK,EAAE;AAC3D,gBAAA,SAAS,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,UAAU,CAAC,WAAW;AACtE,gBAAA,MAAM,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC,cAAc;AACnE,gBAAA,MAAM,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM;AAC5D,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,kBAAkB,CAAC,KAAK,EAAE;AAC3D,gBAAA,SAAS,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,UAAU,CAAC,WAAW;AACtE,gBAAA,MAAM,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC,aAAa;AAClE,gBAAA,MAAM,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM;AAC5D,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;;yHA3LU,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,EAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,4BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,gECvBzC,8yqBAwhBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,EAAAA,IAAA,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,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,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,EAAAF,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,2BAAA,EAAA,gCAAA,EAAA,6BAAA,EAAA,oCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,EAAAH,IAAA,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,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,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,EAAAA,IAAA,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,EAAAI,EAAA,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,EAAAL,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,QAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,CAAA,CAAA;2FDjgBa,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAJxC,SAAS;+BACE,0BAA0B,EAAA,QAAA,EAAA,8yqBAAA,EAAA,CAAA;;;MEhBzB,oCAAoC,CAAA;AADjD,IAAA,WAAA,GAAA;AAEE,QAAA,IAAI,CAAA,IAAA,GAAoB,EAAE,CAAC;KAgB5B;IAdO,GAAG,GAAA;;AACP,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,gBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CACZ,IAAI,aAAa,CAAC;AAChB,oBAAA,KAAK,EAAE,OAAO,CAAC,sBAAsB,CAAC;AACtC,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,IAAI,EAAE,uBAAuB;AAC7B,oBAAA,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;AAC7B,oBAAA,QAAQ,EAAE,GAAG;AACd,iBAAA,CAAC,CACH,CAAC;AACH,aAAA;YACD,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB,CAAA,CAAA;AAAA,KAAA;;iIAhBU,oCAAoC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;qIAApC,oCAAoC,EAAA,CAAA,CAAA;2FAApC,oCAAoC,EAAA,UAAA,EAAA,CAAA;kBADhD,UAAU;;;ACHX;AAGO,MAAM,QAAQ,GAAG;AACtB,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;CACJ;;ACjBD,MAAM,yBAAyB,GAAY;AACzC,IAAA;AACE,QAAA,IAAI,EAAE,sBAAsB;AAC5B,QAAA,SAAS,EAAE,4BAA4B;AACxC,KAAA;CACF,CAAC;MAkBW,yBAAyB,CAAA;;sHAAzB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAzB,yBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,EAfrB,YAAA,EAAA,CAAA,4BAA4B,EAAE,8BAA8B,aAGzE,UAAU;QACV,YAAY,4CAGZ,aAAa;QACb,mBAAmB;QACnB,aAAa;QACb,aAAa,CAAA,EAAA,CAAA,CAAA;AAKJ,yBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,EAFzB,SAAA,EAAA,CAAC,aAAa,CAAC,oCAAoC,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,YAV7F,UAAU;QACV,YAAY;AACZ,QAAA,YAAY,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAChD,gBAAgB,CAAC,OAAO,EAAE;QAC1B,aAAa;QACb,mBAAmB;QACnB,aAAa;QACb,aAAa,CAAA,EAAA,CAAA,CAAA;2FAKJ,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAhBrC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,CAAC,4BAA4B,EAAE,8BAA8B,CAAC;AAC5E,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;AACD,oBAAA,eAAe,EAAE,CAAC,4BAA4B,EAAE,8BAA8B,CAAC;oBAC/E,SAAS,EAAE,CAAC,aAAa,CAAC,oCAAoC,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;iBAChG,CAAA;;;ACnCD;;AAEG;;;;"}
@@ -1057,7 +1057,7 @@ const validationMethodConfig = {
1057
1057
  [ValidationMethod.INTROSPECTION]: {
1058
1058
  name: 'INTROSPECTION',
1059
1059
  value: 'INTROSPECTION',
1060
- label: gettext('Introspection`Method of validating access token from external AIM system`'),
1060
+ label: gettext('Introspection`Method of validating access token from external IAM system`'),
1061
1061
  defaults: {
1062
1062
  method: 'POST',
1063
1063
  body: 'token=${accessToken}&client_id=${clientId}&client_secret=',
@@ -1070,7 +1070,7 @@ const validationMethodConfig = {
1070
1070
  [ValidationMethod.USERINFO]: {
1071
1071
  name: 'USERINFO',
1072
1072
  value: 'USERINFO',
1073
- label: gettext('User info`Method of validating access token from external AIM system`'),
1073
+ label: gettext('User info`Method of validating access token from external IAM system`'),
1074
1074
  defaults: {
1075
1075
  url: '',
1076
1076
  method: 'GET',
@@ -1695,10 +1695,10 @@ class ExternalTokenConfigComponent {
1695
1695
  }
1696
1696
  }
1697
1697
  ExternalTokenConfigComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ExternalTokenConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1698
- ExternalTokenConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ExternalTokenConfigComponent, selector: "c8y-external-token-config", inputs: { templateModel: "templateModel" }, ngImport: i0, template: "<div class=\"col-md-12 p-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>\n External token configuration\n </div>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9 p-0\" *ngIf=\"templateModel\">\n <div class=\"row p-l-4\">\n <div class=\"col-md-8\">\n <label\n for=\"enabled\"\n title=\"{{\n 'Allow authentication with access token from external AIM system' | translate\n }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"enabled\"\n name=\"enabled\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.enabled\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Allow authentication with access token from external AIM system' | translate }}\n </span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.enabled\">\n <c8y-user-id-configuration\n [userIdConfig]=\"externalTokenConfig.userOrAppIdConfig\"\n [withHeader]=\"false\"\n ></c8y-user-id-configuration>\n <div class=\"row p-l-4\">\n <div class=\"col-sm-6\">\n <label\n for=\"validationRequired\"\n title=\"{{ 'Validate access token' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"validationRequired\"\n name=\"validationRequired\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.validationRequired\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Validate access token' | translate }}</span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.validationRequired\">\n <div class=\"row\">\n <div class=\"col-sm-6 m-t-16 m-l-8\">\n <label for=\"validationMethod\" class=\"control-label\" translate>\n Validation method\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"validationMethod\"\n name=\"validationMethod\"\n [ngModel]=\"externalTokenConfig.validationMethod\"\n (ngModelChange)=\"onValidationMethodChange($event)\"\n >\n <option\n *ngFor=\"let validationMethod of validationMethods | keyvalue\"\n [ngValue]=\"validationMethod.key\"\n >\n {{ validationMethod.value.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <c8y-request-configuration\n [templateModel]=\"externalTokenConfig\"\n [requestName]=\"'Token validation request' | translate\"\n [requestType]=\"'tokenValidationRequest'\"\n ></c8y-request-configuration>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6 m-l-8\">\n <c8y-form-group>\n <label\n for=\"accessTokenValidityCheckIntervalInMinutes\"\n class=\"control-label\"\n translate\n >\n Access token validation frequency\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"accessTokenValidityCheckIntervalInMinutes\"\n name=\"accessTokenValidityCheckIntervalInMinutes\"\n [(ngModel)]=\"externalTokenConfig.accessTokenValidityCheckIntervalInMinutes\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '1' }\"\n step=\"1\"\n required\n [min]=\"1\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i3$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3$1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: RequestConfigurationComponent, selector: "c8y-request-configuration", inputs: ["templateModel", "requestName", "requestType"] }, { kind: "component", type: UserIdConfigurationComponent, selector: "c8y-user-id-configuration", inputs: ["userIdConfig", "withHeader"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
1698
+ ExternalTokenConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ExternalTokenConfigComponent, selector: "c8y-external-token-config", inputs: { templateModel: "templateModel" }, ngImport: i0, template: "<div class=\"col-md-12 p-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>\n External token configuration\n </div>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9 p-0\" *ngIf=\"templateModel\">\n <div class=\"row p-l-4\">\n <div class=\"col-md-8\">\n <label\n for=\"enabled\"\n title=\"{{\n 'Allow authentication with access token from external IAM system' | translate\n }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"enabled\"\n name=\"enabled\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.enabled\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Allow authentication with access token from external IAM system' | translate }}\n </span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.enabled\">\n <c8y-user-id-configuration\n [userIdConfig]=\"externalTokenConfig.userOrAppIdConfig\"\n [withHeader]=\"false\"\n ></c8y-user-id-configuration>\n <div class=\"row p-l-4\">\n <div class=\"col-sm-6\">\n <label\n for=\"validationRequired\"\n title=\"{{ 'Validate access token' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"validationRequired\"\n name=\"validationRequired\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.validationRequired\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Validate access token' | translate }}</span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.validationRequired\">\n <div class=\"row\">\n <div class=\"col-sm-6 m-t-16 m-l-8\">\n <label for=\"validationMethod\" class=\"control-label\" translate>\n Validation method\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"validationMethod\"\n name=\"validationMethod\"\n [ngModel]=\"externalTokenConfig.validationMethod\"\n (ngModelChange)=\"onValidationMethodChange($event)\"\n >\n <option\n *ngFor=\"let validationMethod of validationMethods | keyvalue\"\n [ngValue]=\"validationMethod.key\"\n >\n {{ validationMethod.value.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <c8y-request-configuration\n [templateModel]=\"externalTokenConfig\"\n [requestName]=\"'Token validation request' | translate\"\n [requestType]=\"'tokenValidationRequest'\"\n ></c8y-request-configuration>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6 m-l-8\">\n <c8y-form-group>\n <label\n for=\"accessTokenValidityCheckIntervalInMinutes\"\n class=\"control-label\"\n translate\n >\n Access token validation frequency\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"accessTokenValidityCheckIntervalInMinutes\"\n name=\"accessTokenValidityCheckIntervalInMinutes\"\n [(ngModel)]=\"externalTokenConfig.accessTokenValidityCheckIntervalInMinutes\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '1' }\"\n step=\"1\"\n required\n [min]=\"1\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i3$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3$1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: RequestConfigurationComponent, selector: "c8y-request-configuration", inputs: ["templateModel", "requestName", "requestType"] }, { kind: "component", type: UserIdConfigurationComponent, selector: "c8y-user-id-configuration", inputs: ["userIdConfig", "withHeader"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
1699
1699
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ExternalTokenConfigComponent, decorators: [{
1700
1700
  type: Component,
1701
- args: [{ selector: 'c8y-external-token-config', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div class=\"col-md-12 p-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>\n External token configuration\n </div>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9 p-0\" *ngIf=\"templateModel\">\n <div class=\"row p-l-4\">\n <div class=\"col-md-8\">\n <label\n for=\"enabled\"\n title=\"{{\n 'Allow authentication with access token from external AIM system' | translate\n }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"enabled\"\n name=\"enabled\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.enabled\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Allow authentication with access token from external AIM system' | translate }}\n </span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.enabled\">\n <c8y-user-id-configuration\n [userIdConfig]=\"externalTokenConfig.userOrAppIdConfig\"\n [withHeader]=\"false\"\n ></c8y-user-id-configuration>\n <div class=\"row p-l-4\">\n <div class=\"col-sm-6\">\n <label\n for=\"validationRequired\"\n title=\"{{ 'Validate access token' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"validationRequired\"\n name=\"validationRequired\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.validationRequired\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Validate access token' | translate }}</span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.validationRequired\">\n <div class=\"row\">\n <div class=\"col-sm-6 m-t-16 m-l-8\">\n <label for=\"validationMethod\" class=\"control-label\" translate>\n Validation method\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"validationMethod\"\n name=\"validationMethod\"\n [ngModel]=\"externalTokenConfig.validationMethod\"\n (ngModelChange)=\"onValidationMethodChange($event)\"\n >\n <option\n *ngFor=\"let validationMethod of validationMethods | keyvalue\"\n [ngValue]=\"validationMethod.key\"\n >\n {{ validationMethod.value.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <c8y-request-configuration\n [templateModel]=\"externalTokenConfig\"\n [requestName]=\"'Token validation request' | translate\"\n [requestType]=\"'tokenValidationRequest'\"\n ></c8y-request-configuration>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6 m-l-8\">\n <c8y-form-group>\n <label\n for=\"accessTokenValidityCheckIntervalInMinutes\"\n class=\"control-label\"\n translate\n >\n Access token validation frequency\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"accessTokenValidityCheckIntervalInMinutes\"\n name=\"accessTokenValidityCheckIntervalInMinutes\"\n [(ngModel)]=\"externalTokenConfig.accessTokenValidityCheckIntervalInMinutes\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '1' }\"\n step=\"1\"\n required\n [min]=\"1\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n" }]
1701
+ args: [{ selector: 'c8y-external-token-config', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div class=\"col-md-12 p-16\">\n <div class=\"row m-l-8 m-r-8\">\n <div class=\"col-xs-12 col-sm-3 col-md-2\">\n <div class=\"h4 text-normal text-right text-left-xs\" translate>\n External token configuration\n </div>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9 p-0\" *ngIf=\"templateModel\">\n <div class=\"row p-l-4\">\n <div class=\"col-md-8\">\n <label\n for=\"enabled\"\n title=\"{{\n 'Allow authentication with access token from external IAM system' | translate\n }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"enabled\"\n name=\"enabled\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.enabled\"\n />\n <span></span>\n <span class=\"control-label\">\n {{ 'Allow authentication with access token from external IAM system' | translate }}\n </span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.enabled\">\n <c8y-user-id-configuration\n [userIdConfig]=\"externalTokenConfig.userOrAppIdConfig\"\n [withHeader]=\"false\"\n ></c8y-user-id-configuration>\n <div class=\"row p-l-4\">\n <div class=\"col-sm-6\">\n <label\n for=\"validationRequired\"\n title=\"{{ 'Validate access token' | translate }}\"\n class=\"c8y-switch\"\n >\n <input\n id=\"validationRequired\"\n name=\"validationRequired\"\n type=\"checkbox\"\n [(ngModel)]=\"externalTokenConfig.validationRequired\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Validate access token' | translate }}</span>\n </label>\n </div>\n </div>\n <ng-container *ngIf=\"externalTokenConfig.validationRequired\">\n <div class=\"row\">\n <div class=\"col-sm-6 m-t-16 m-l-8\">\n <label for=\"validationMethod\" class=\"control-label\" translate>\n Validation method\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"validationMethod\"\n name=\"validationMethod\"\n [ngModel]=\"externalTokenConfig.validationMethod\"\n (ngModelChange)=\"onValidationMethodChange($event)\"\n >\n <option\n *ngFor=\"let validationMethod of validationMethods | keyvalue\"\n [ngValue]=\"validationMethod.key\"\n >\n {{ validationMethod.value.label | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <c8y-request-configuration\n [templateModel]=\"externalTokenConfig\"\n [requestName]=\"'Token validation request' | translate\"\n [requestType]=\"'tokenValidationRequest'\"\n ></c8y-request-configuration>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6 m-l-8\">\n <c8y-form-group>\n <label\n for=\"accessTokenValidityCheckIntervalInMinutes\"\n class=\"control-label\"\n translate\n >\n Access token validation frequency\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"accessTokenValidityCheckIntervalInMinutes\"\n name=\"accessTokenValidityCheckIntervalInMinutes\"\n [(ngModel)]=\"externalTokenConfig.accessTokenValidityCheckIntervalInMinutes\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '1' }\"\n step=\"1\"\n required\n [min]=\"1\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n" }]
1702
1702
  }], propDecorators: { templateModel: [{
1703
1703
  type: Input
1704
1704
  }] } });