UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

116 lines 20.6 kB
import { Component, Input, Output, EventEmitter } from '@angular/core'; import { PasswordService } from './password.service'; import { LoginService } from '../login/login.service'; import { assign } from 'lodash-es'; import { gettext } from '../i18n/gettext'; import * as i0 from "@angular/core"; import * as i1 from "../login/login.service"; import * as i2 from "./password.service"; import * as i3 from "../common/icon.directive"; import * as i4 from "../i18n/c8y-translate.directive"; import * as i5 from "@angular/common"; import * as i6 from "../i18n/c8y-translate.pipe"; export class PasswordCheckListComponent { set password(password) { if (typeof password === 'string') { this.onPasswordChange(password); } } constructor(loginService, passwordStrengthChecker, passwordService) { this.loginService = loginService; this.passwordStrengthChecker = passwordStrengthChecker; this.passwordService = passwordService; this.strengthEnforced = false; this.onRequirementsFulfilled = new EventEmitter(); this.minGreenLength = 8; this.enhancedStrengthCheckList = [ { label: gettext('Include lowercase characters (for example, abcdef)'), check: this.passwordStrengthChecker.hasLowerCase, icon: '', contextualColor: '', textColor: '' }, { label: gettext('Include uppercase characters (for example, ABCDEF)'), check: this.passwordStrengthChecker.hasUpperCase, icon: '', contextualColor: '', textColor: '' }, { label: gettext('Include numbers (for example, 123456)'), check: this.passwordStrengthChecker.hasNumbers, icon: '', contextualColor: '', textColor: '' }, { label: gettext('Include symbols (for example, !@#$%^)'), check: this.passwordStrengthChecker.hasSpecialChars, icon: '', contextualColor: '', textColor: '' } ]; this.basicChecklist = [ { label: gettext('Must have at least {{length}} characters'), check: password => password.length >= this.minGreenLength, icon: '', contextualColor: '', textColor: '' } ]; this.combinedChecklist = []; } async ngOnInit() { this.minGreenLength = await this.loginService.getGreenMinLength(); if (!this.minGreenLength) { this.minGreenLength = this.passwordService.getDefaultPasswordMinLength(); } this.onPasswordChange(''); } get translateParams() { return { length: this.minGreenLength }; } checkRequirement(requirement, password) { const checked = requirement.check(password); assign(requirement, { icon: checked ? 'check-circle' : 'radio-button-unchecked', contextualColor: checked ? 'text-success' : 'text-muted', textColor: checked ? '' : 'text-muted' }); return requirement; } onPasswordChange(password) { this.basicChecklist.forEach(requirement => { this.checkRequirement(requirement, password); }); this.enhancedStrengthCheckList.forEach(requirement => { this.checkRequirement(requirement, password); }); this.combinedChecklist = [...this.basicChecklist, ...this.enhancedStrengthCheckList]; this.onRequirementsFulfilled.emit(this.isPasswordValid()); } isPasswordValid() { const checklist = this.strengthEnforced ? this.combinedChecklist : this.basicChecklist; return checklist.every(requirement => requirement.icon !== 'radio-button-unchecked'); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PasswordCheckListComponent, deps: [{ token: i1.LoginService }, { token: i2.PasswordService }, { token: i2.PasswordService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PasswordCheckListComponent, selector: "c8y-password-check-list", inputs: { strengthEnforced: "strengthEnforced", password: "password" }, outputs: { onRequirementsFulfilled: "onRequirementsFulfilled" }, ngImport: i0, template: "<div *ngIf=\"strengthEnforced\">\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of combinedChecklist\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n</div>\n\n<div *ngIf=\"!strengthEnforced\">\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of basicChecklist\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n\n <div class=\"m-b-8\">\n {{ 'We recommend you to meet these conditions for a stronger password:' | translate }}\n </div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of enhancedStrengthCheckList\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n</div>\n", dependencies: [{ kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i6.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PasswordCheckListComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-password-check-list', template: "<div *ngIf=\"strengthEnforced\">\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of combinedChecklist\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n</div>\n\n<div *ngIf=\"!strengthEnforced\">\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of basicChecklist\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n\n <div class=\"m-b-8\">\n {{ 'We recommend you to meet these conditions for a stronger password:' | translate }}\n </div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of enhancedStrengthCheckList\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.LoginService }, { type: i2.PasswordService }, { type: i2.PasswordService }], propDecorators: { strengthEnforced: [{ type: Input }], password: [{ type: Input, args: ['password'] }], onRequirementsFulfilled: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2stbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2F1dGhlbnRpY2F0aW9uL3Bhc3N3b3JkLWNoZWNrLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS9hdXRoZW50aWNhdGlvbi9wYXNzd29yZC1jaGVjay1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7QUFPMUMsTUFBTSxPQUFPLDBCQUEwQjtJQUlyQyxJQUNJLFFBQVEsQ0FBQyxRQUFnQjtRQUMzQixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQWdERCxZQUNTLFlBQTBCLEVBQ3pCLHVCQUF3QyxFQUN4QyxlQUFnQztRQUZqQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN6Qiw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQWlCO1FBQ3hDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQTFEMUMscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBU3pCLDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFdEQsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFFbkIsOEJBQXlCLEdBQUc7WUFDMUI7Z0JBQ0UsS0FB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QUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDdkYsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7K0dBckdVLDBCQUEwQjttR0FBMUIsMEJBQTBCLHdNQ1h2QyxxdURBMkRBOzs0RkRoRGEsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHlCQUF5Qjs2SUFNbkMsZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSUYsUUFBUTtzQkFEWCxLQUFLO3VCQUFDLFVBQVU7Z0JBT2pCLHVCQUF1QjtzQkFEdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBhc3N3b3JkU2VydmljZSB9IGZyb20gJy4vcGFzc3dvcmQuc2VydmljZSc7XG5pbXBvcnQgeyBMb2dpblNlcnZpY2UgfSBmcm9tICcuLi9sb2dpbi9sb2dpbi5zZXJ2aWNlJztcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vaTE4bi9nZXR0ZXh0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXBhc3N3b3JkLWNoZWNrLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFzc3dvcmQtY2hlY2stbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW11cbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRDaGVja0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBzdHJlbmd0aEVuZm9yY2VkID0gZmFsc2U7XG5cbiAgQElucHV0KCdwYXNzd29yZCcpXG4gIHNldCBwYXNzd29yZChwYXNzd29yZDogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBwYXNzd29yZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMub25QYXNzd29yZENoYW5nZShwYXNzd29yZCk7XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoKVxuICBvblJlcXVpcmVtZW50c0Z1bGZpbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBtaW5HcmVlbkxlbmd0aCA9IDg7XG5cbiAgZW5oYW5jZWRTdHJlbmd0aENoZWNrTGlzdCA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnSW5jbHVkZSBsb3dlcmNhc2UgY2hhcmFjdGVycyAoZm9yIGV4YW1wbGUsIGFiY2RlZiknKSxcbiAgICAgIGNoZWNrOiB0aGlzLnBhc3N3b3JkU3RyZW5ndGhDaGVja2VyLmhhc0xvd2VyQ2FzZSxcbiAgICAgIGljb246ICcnLFxuICAgICAgY29udGV4dHVhbENvbG9yOiAnJyxcbiAgICAgIHRleHRDb2xvcjogJydcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBnZXR0ZXh0KCdJbmNsdWRlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIChmb3IgZXhhbXBsZSwgQUJDREVGKScpLFxuICAgICAgY2hlY2s6IHRoaXMucGFzc3dvcmRTdHJlbmd0aENoZWNrZXIuaGFzVXBwZXJDYXNlLFxuICAgICAgaWNvbjogJycsXG4gICAgICBjb250ZXh0dWFsQ29sb3I6ICcnLFxuICAgICAgdGV4dENvbG9yOiAnJ1xuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ0luY2x1ZGUgbnVtYmVycyAoZm9yIGV4YW1wbGUsIDEyMzQ1NiknKSxcbiAgICAgIGNoZWNrOiB0aGlzLnBhc3N3b3JkU3RyZW5ndGhDaGVja2VyLmhhc051bWJlcnMsXG4gICAgICBpY29uOiAnJyxcbiAgICAgIGNvbnRleHR1YWxDb2xvcjogJycsXG4gICAgICB0ZXh0Q29sb3I6ICcnXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnSW5jbHVkZSBzeW1ib2xzIChmb3IgZXhhbXBsZSwgIUAjJCVeKScpLFxuICAgICAgY2hlY2s6IHRoaXMucGFzc3dvcmRTdHJlbmd0aENoZWNrZXIuaGFzU3BlY2lhbENoYXJzLFxuICAgICAgaWNvbjogJycsXG4gICAgICBjb250ZXh0dWFsQ29sb3I6ICcnLFxuICAgICAgdGV4dENvbG9yOiAnJ1xuICAgIH1cbiAgXTtcblxuICBiYXNpY0NoZWNrbGlzdCA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnTXVzdCBoYXZlIGF0IGxlYXN0IHt7bGVuZ3RofX0gY2hhcmFjdGVycycpLFxuICAgICAgY2hlY2s6IHBhc3N3b3JkID0+IHBhc3N3b3JkLmxlbmd0aCA+PSB0aGlzLm1pbkdyZWVuTGVuZ3RoLFxuICAgICAgaWNvbjogJycsXG4gICAgICBjb250ZXh0dWFsQ29sb3I6ICcnLFxuICAgICAgdGV4dENvbG9yOiAnJ1xuICAgIH1cbiAgXTtcbiAgY29tYmluZWRDaGVja2xpc3QgPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbG9naW5TZXJ2aWNlOiBMb2dpblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwYXNzd29yZFN0cmVuZ3RoQ2hlY2tlcjogUGFzc3dvcmRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGFzc3dvcmRTZXJ2aWNlOiBQYXNzd29yZFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMubWluR3JlZW5MZW5ndGggPSBhd2FpdCB0aGlzLmxvZ2luU2VydmljZS5nZXRHcmVlbk1pbkxlbmd0aCgpO1xuICAgIGlmICghdGhpcy5taW5HcmVlbkxlbmd0aCkge1xuICAgICAgdGhpcy5taW5HcmVlbkxlbmd0aCA9IHRoaXMucGFzc3dvcmRTZXJ2aWNlLmdldERlZmF1bHRQYXNzd29yZE1pbkxlbmd0aCgpO1xuICAgIH1cbiAgICB0aGlzLm9uUGFzc3dvcmRDaGFuZ2UoJycpO1xuICB9XG5cbiAgZ2V0IHRyYW5zbGF0ZVBhcmFtcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVuZ3RoOiB0aGlzLm1pbkdyZWVuTGVuZ3RoXG4gICAgfTtcbiAgfVxuXG4gIGNoZWNrUmVxdWlyZW1lbnQocmVxdWlyZW1lbnQsIHBhc3N3b3JkKSB7XG4gICAgY29uc3QgY2hlY2tlZCA9IHJlcXVpcmVtZW50LmNoZWNrKHBhc3N3b3JkKTtcbiAgICBhc3NpZ24ocmVxdWlyZW1lbnQsIHtcbiAgICAgIGljb246IGNoZWNrZWQgPyAnY2hlY2stY2lyY2xlJyA6ICdyYWRpby1idXR0b24tdW5jaGVja2VkJyxcbiAgICAgIGNvbnRleHR1YWxDb2xvcjogY2hlY2tlZCA/ICd0ZXh0LXN1Y2Nlc3MnIDogJ3RleHQtbXV0ZWQnLFxuICAgICAgdGV4dENvbG9yOiBjaGVja2VkID8gJycgOiAndGV4dC1tdXRlZCdcbiAgICB9KTtcbiAgICByZXR1cm4gcmVxdWlyZW1lbnQ7XG4gIH1cblxuICBvblBhc3N3b3JkQ2hhbmdlKHBhc3N3b3JkKSB7XG4gICAgdGhpcy5iYXNpY0NoZWNrbGlzdC5mb3JFYWNoKHJlcXVpcmVtZW50ID0+IHtcbiAgICAgIHRoaXMuY2hlY2tSZXF1aXJlbWVudChyZXF1aXJlbWVudCwgcGFzc3dvcmQpO1xuICAgIH0pO1xuICAgIHRoaXMuZW5oYW5jZWRTdHJlbmd0aENoZWNrTGlzdC5mb3JFYWNoKHJlcXVpcmVtZW50ID0+IHtcbiAgICAgIHRoaXMuY2hlY2tSZXF1aXJlbWVudChyZXF1aXJlbWVudCwgcGFzc3dvcmQpO1xuICAgIH0pO1xuICAgIHRoaXMuY29tYmluZWRDaGVja2xpc3QgPSBbLi4udGhpcy5iYXNpY0NoZWNrbGlzdCwgLi4udGhpcy5lbmhhbmNlZFN0cmVuZ3RoQ2hlY2tMaXN0XTtcbiAgICB0aGlzLm9uUmVxdWlyZW1lbnRzRnVsZmlsbGVkLmVtaXQodGhpcy5pc1Bhc3N3b3JkVmFsaWQoKSk7XG4gIH1cblxuICBpc1Bhc3N3b3JkVmFsaWQoKSB7XG4gICAgY29uc3QgY2hlY2tsaXN0ID0gdGhpcy5zdHJlbmd0aEVuZm9yY2VkID8gdGhpcy5jb21iaW5lZENoZWNrbGlzdCA6IHRoaXMuYmFzaWNDaGVja2xpc3Q7XG4gICAgcmV0dXJuIGNoZWNrbGlzdC5ldmVyeShyZXF1aXJlbWVudCA9PiByZXF1aXJlbWVudC5pY29uICE9PSAncmFkaW8tYnV0dG9uLXVuY2hlY2tlZCcpO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwic3RyZW5ndGhFbmZvcmNlZFwiPlxuICA8ZGl2IGNsYXNzPVwibS1iLThcIj57eyAnUGFzc3dvcmQgbXVzdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgYmVsb3c6JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkXCI+XG4gICAgPGxpXG4gICAgICBjbGFzcz1cInNtYWxsIGQtZmxleFwiXG4gICAgICAqbmdGb3I9XCJsZXQgcmVxdWlyZW1lbnQgb2YgY29tYmluZWRDaGVja2xpc3RcIlxuICAgID5cbiAgICAgIDxpXG4gICAgICAgIGNsYXNzPVwie3sgcmVxdWlyZW1lbnQuY29udGV4dHVhbENvbG9yIH19XCJcbiAgICAgICAgW2M4eUljb25dPVwicmVxdWlyZW1lbnQuaWNvblwiXG4gICAgICA+PC9pPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJtLWwtNCBzbWFsbCB7eyByZXF1aXJlbWVudC50ZXh0Q29sb3IgfX1cIlxuICAgICAgICBbdHJhbnNsYXRlXT1cInJlcXVpcmVtZW50LmxhYmVsXCJcbiAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ0aGlzLnRyYW5zbGF0ZVBhcmFtc1wiXG4gICAgICA+PC9zcGFuPlxuICAgIDwvbGk+XG4gIDwvdWw+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cIiFzdHJlbmd0aEVuZm9yY2VkXCI+XG4gIDxkaXYgY2xhc3M9XCJtLWItOFwiPnt7ICdQYXNzd29yZCBtdXN0IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBiZWxvdzonIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWRcIj5cbiAgICA8bGlcbiAgICAgIGNsYXNzPVwic21hbGwgZC1mbGV4XCJcbiAgICAgICpuZ0Zvcj1cImxldCByZXF1aXJlbWVudCBvZiBiYXNpY0NoZWNrbGlzdFwiXG4gICAgPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJ7eyByZXF1aXJlbWVudC5jb250ZXh0dWFsQ29sb3IgfX1cIlxuICAgICAgICBbYzh5SWNvbl09XCJyZXF1aXJlbWVudC5pY29uXCJcbiAgICAgID48L2k+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cIm0tbC00IHNtYWxsIHt7IHJlcXVpcmVtZW50LnRleHRDb2xvciB9fVwiXG4gICAgICAgIFt0cmFuc2xhdGVdPVwicmVxdWlyZW1lbnQubGFiZWxcIlxuICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInRoaXMudHJhbnNsYXRlUGFyYW1zXCJcbiAgICAgID48L3NwYW4+XG4gICAgPC9saT5cbiAgPC91bD5cblxuICA8ZGl2IGNsYXNzPVwibS1iLThcIj5cbiAgICB7eyAnV2UgcmVjb21tZW5kIHlvdSB0byBtZWV0IHRoZXNlIGNvbmRpdGlvbnMgZm9yIGEgc3Ryb25nZXIgcGFzc3dvcmQ6JyB8IHRyYW5zbGF0ZSB9fVxuICA8L2Rpdj5cbiAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZFwiPlxuICAgIDxsaVxuICAgICAgY2xhc3M9XCJzbWFsbCBkLWZsZXhcIlxuICAgICAgKm5nRm9yPVwibGV0IHJlcXVpcmVtZW50IG9mIGVuaGFuY2VkU3RyZW5ndGhDaGVja0xpc3RcIlxuICAgID5cbiAgICAgIDxpXG4gICAgICAgIGNsYXNzPVwie3sgcmVxdWlyZW1lbnQuY29udGV4dHVhbENvbG9yIH19XCJcbiAgICAgICAgW2M4eUljb25dPVwicmVxdWlyZW1lbnQuaWNvblwiXG4gICAgICA+PC9pPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJtLWwtNCBzbWFsbCB7eyByZXF1aXJlbWVudC50ZXh0Q29sb3IgfX1cIlxuICAgICAgICBbdHJhbnNsYXRlXT1cInJlcXVpcmVtZW50LmxhYmVsXCJcbiAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ0aGlzLnRyYW5zbGF0ZVBhcmFtc1wiXG4gICAgICA+PC9zcGFuPlxuICAgIDwvbGk+XG4gIDwvdWw+XG48L2Rpdj5cbiJdfQ==