UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

65 lines 30.6 kB
import { Component, ViewChild } from '@angular/core'; import { FormBuilder, Validators } from '@angular/forms'; import { C8yStepper, gettext, OptionsService, WizardComponent } from '@c8y/ngx-components'; import { uniqBy } from 'lodash-es'; import { TranslateService } from '@ngx-translate/core'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/ngx-components"; import * as i2 from "@angular/forms"; import * as i3 from "@ngx-translate/core"; import * as i4 from "@angular/common"; import * as i5 from "@angular/cdk/stepper"; import * as i6 from "./license-view.component"; export class LicenseConfirmModalComponent { constructor(wizardComponent, fb, optionsService, translateService) { this.wizardComponent = wizardComponent; this.fb = fb; this.optionsService = optionsService; this.translateService = translateService; this.licenses = []; } ngOnInit() { const { pluginsToInstall } = this.wizardComponent.componentInitialState; this.formGroupAccept = this.fb.group({ confirmed: [false, Validators.required] }); this.formGroupLicenses = this.fb.group({ acceptAll: [false, Validators.required] }); const allLicenses = pluginsToInstall.map(app => ({ appName: app.name, url: `/apps/${app.contextPath}@${app.version}/LICENSE.txt`, licenseName: app.license })); const uniqByUrl = uniqBy(allLicenses, 'url').map(license => ({ ...license, pluginName: allLicenses .filter(({ url }) => url === license.url) .map(({ appName: pluginName }) => pluginName) .join(', ') })); const companyName = this.optionsService.get('companyName', 'Cumulocity'); const disclaimerHtmlWithCompany = gettext('These plugins and/or blueprints are provided <strong>as-is and without warranty or support</strong>, and they do not constitute part of the {{ companyName }} product suite. Users are free to use subject to the license agreement.'); const disclaimerHtmlWithoutCompany = gettext('These plugins and/or blueprints are provided <strong>as-is and without warranty or support</strong>, and they do not constitute part of the product suite. Users are free to use subject to the license agreement.'); this.disclaimerHtml = this.translateService.instant(companyName ? disclaimerHtmlWithCompany : disclaimerHtmlWithoutCompany, { companyName }); this.licenses = uniqByUrl; } cancel() { this.wizardComponent.close(false); } done() { this.wizardComponent.close(true); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LicenseConfirmModalComponent, deps: [{ token: i1.WizardComponent }, { token: i2.FormBuilder }, { token: i1.OptionsService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LicenseConfirmModalComponent, selector: "c8y-license-confirm-modal", viewQueries: [{ propertyName: "stepper", first: true, predicate: C8yStepper, descendants: true, static: true }], ngImport: i0, template: "<c8y-wizard-header>\n <i c8yIcon=\"privacy-policy\"></i>\n <div\n class=\"modal-title h4\"\n id=\"modal-title\"\n translate\n >\n Accept license(s)`dialog title`\n </div>\n</c8y-wizard-header>\n<c8y-wizard-body>\n <div class=\"m-t-16 m-l-32 m-r-32\">\n <c8y-stepper>\n <cdk-step\n [stepControl]=\"formGroupAccept\"\n [label]=\"'Disclaimer' | translate\"\n >\n <div class=\"m-t-8\">\n <div class=\"text-center m-b-16 h4\">\n <i\n class=\"text-info d-block icon-40 m-b-8\"\n c8yIcon=\"info-circle\"\n ></i>\n {{ 'About community packages' | translate }}\n </div>\n <p\n class=\"m-b-16\"\n [innerHTML]=\"disclaimerHtml\"\n ></p>\n <hr style=\"margin: 16px -24px 16px\" />\n <div class=\"text-center\">\n <c8y-form-group class=\"d-inline-block\">\n <div\n class=\"d-flex d-col a-i-center\"\n [formGroup]=\"formGroupAccept\"\n >\n <label class=\"c8y-checkbox\">\n <input\n class=\"form-control\"\n type=\"checkbox\"\n required\n formControlName=\"confirmed\"\n />\n <span></span>\n <span translate>Understood and agreed.</span>\n </label>\n <c8y-messages class=\"d-inline-block\">\n <c8y-message\n [name]=\"'required'\"\n [text]=\"'Accept the maintenance disclaimer.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-wizard-footer *ngIf=\"stepper.selectedIndex === 0\">\n <c8y-stepper-buttons\n [title]=\"'Confirm agreement' | translate\"\n [showButtons]=\"{ next: true, cancel: true, back: false, custom: false }\"\n (onCancel)=\"cancel()\"\n ></c8y-stepper-buttons>\n </c8y-wizard-footer>\n </cdk-step>\n <cdk-step\n state=\"final\"\n [stepControl]=\"formGroupLicenses\"\n [label]=\"'Licenses' | translate\"\n >\n <div\n class=\"p-t-24\"\n *ngFor=\"let license of licenses\"\n >\n <label\n class=\"text-normal\"\n *ngIf=\"license.licenseName\"\n translate\n [translateParams]=\"{ appName: license.appName, licenseName: license.licenseName }\"\n ngNonBindable\n >\n <b>{{ appName }}</b>\n uses\n <b>{{ licenseName }}</b>\n license\n </label>\n <label\n class=\"text-normal\"\n *ngIf=\"!license.licenseName\"\n translate\n [translateParams]=\"{ appName: license.appName, licenseName: license.licenseName }\"\n ngNonBindable\n >\n <b>{{ appName }}</b>\n uses\n <b>no license</b>\n </label>\n <c8y-license-view\n [url]=\"license.url\"\n [name]=\"license.licenseName\"\n ></c8y-license-view>\n </div>\n <c8y-wizard-footer *ngIf=\"stepper.selectedIndex === 1\">\n <c8y-form-group class=\"text-center d-inline-block\">\n <div\n class=\"d-flex d-col a-i-center\"\n [formGroup]=\"formGroupLicenses\"\n >\n <label class=\"c8y-checkbox\">\n <input\n class=\"form-control\"\n type=\"checkbox\"\n required\n formControlName=\"acceptAll\"\n />\n <span></span>\n <span\n *ngIf=\"licenses.length === 1\"\n translate\n >\n Accept license.`formal agreement`\n </span>\n <span\n *ngIf=\"licenses.length > 1\"\n translate\n >\n Accept all licenses.`formal agreement`\n </span>\n </label>\n <c8y-messages class=\"d-inline-block\">\n <c8y-message\n [name]=\"'required'\"\n [text]=\"'You need to accept the license agreement(s)' | translate\"\n ></c8y-message>\n </c8y-messages>\n </div>\n </c8y-form-group>\n <hr style=\"margin: 0 -24px 16px\" />\n <c8y-stepper-buttons\n [showButtons]=\"{ next: true, cancel: true, back: false, custom: false }\"\n (onCancel)=\"cancel()\"\n (onNext)=\"done()\"\n ></c8y-stepper-buttons>\n </c8y-wizard-footer>\n </cdk-step>\n </c8y-stepper>\n </div>\n</c8y-wizard-body>\n", dependencies: [{ kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.CheckboxRequiredValidator, selector: "input[type=checkbox][required][formControlName],input[type=checkbox][required][formControl],input[type=checkbox][required][ngModel]" }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i1.C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: i5.CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "component", type: i1.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i1.WizardHeaderComponent, selector: "c8y-wizard-header" }, { kind: "component", type: i1.WizardBodyComponent, selector: "c8y-wizard-body" }, { kind: "component", type: i1.WizardFooterComponent, selector: "c8y-wizard-footer" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.LicenseViewComponent, selector: "c8y-license-view", inputs: ["url", "name"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LicenseConfirmModalComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-license-confirm-modal', template: "<c8y-wizard-header>\n <i c8yIcon=\"privacy-policy\"></i>\n <div\n class=\"modal-title h4\"\n id=\"modal-title\"\n translate\n >\n Accept license(s)`dialog title`\n </div>\n</c8y-wizard-header>\n<c8y-wizard-body>\n <div class=\"m-t-16 m-l-32 m-r-32\">\n <c8y-stepper>\n <cdk-step\n [stepControl]=\"formGroupAccept\"\n [label]=\"'Disclaimer' | translate\"\n >\n <div class=\"m-t-8\">\n <div class=\"text-center m-b-16 h4\">\n <i\n class=\"text-info d-block icon-40 m-b-8\"\n c8yIcon=\"info-circle\"\n ></i>\n {{ 'About community packages' | translate }}\n </div>\n <p\n class=\"m-b-16\"\n [innerHTML]=\"disclaimerHtml\"\n ></p>\n <hr style=\"margin: 16px -24px 16px\" />\n <div class=\"text-center\">\n <c8y-form-group class=\"d-inline-block\">\n <div\n class=\"d-flex d-col a-i-center\"\n [formGroup]=\"formGroupAccept\"\n >\n <label class=\"c8y-checkbox\">\n <input\n class=\"form-control\"\n type=\"checkbox\"\n required\n formControlName=\"confirmed\"\n />\n <span></span>\n <span translate>Understood and agreed.</span>\n </label>\n <c8y-messages class=\"d-inline-block\">\n <c8y-message\n [name]=\"'required'\"\n [text]=\"'Accept the maintenance disclaimer.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-wizard-footer *ngIf=\"stepper.selectedIndex === 0\">\n <c8y-stepper-buttons\n [title]=\"'Confirm agreement' | translate\"\n [showButtons]=\"{ next: true, cancel: true, back: false, custom: false }\"\n (onCancel)=\"cancel()\"\n ></c8y-stepper-buttons>\n </c8y-wizard-footer>\n </cdk-step>\n <cdk-step\n state=\"final\"\n [stepControl]=\"formGroupLicenses\"\n [label]=\"'Licenses' | translate\"\n >\n <div\n class=\"p-t-24\"\n *ngFor=\"let license of licenses\"\n >\n <label\n class=\"text-normal\"\n *ngIf=\"license.licenseName\"\n translate\n [translateParams]=\"{ appName: license.appName, licenseName: license.licenseName }\"\n ngNonBindable\n >\n <b>{{ appName }}</b>\n uses\n <b>{{ licenseName }}</b>\n license\n </label>\n <label\n class=\"text-normal\"\n *ngIf=\"!license.licenseName\"\n translate\n [translateParams]=\"{ appName: license.appName, licenseName: license.licenseName }\"\n ngNonBindable\n >\n <b>{{ appName }}</b>\n uses\n <b>no license</b>\n </label>\n <c8y-license-view\n [url]=\"license.url\"\n [name]=\"license.licenseName\"\n ></c8y-license-view>\n </div>\n <c8y-wizard-footer *ngIf=\"stepper.selectedIndex === 1\">\n <c8y-form-group class=\"text-center d-inline-block\">\n <div\n class=\"d-flex d-col a-i-center\"\n [formGroup]=\"formGroupLicenses\"\n >\n <label class=\"c8y-checkbox\">\n <input\n class=\"form-control\"\n type=\"checkbox\"\n required\n formControlName=\"acceptAll\"\n />\n <span></span>\n <span\n *ngIf=\"licenses.length === 1\"\n translate\n >\n Accept license.`formal agreement`\n </span>\n <span\n *ngIf=\"licenses.length > 1\"\n translate\n >\n Accept all licenses.`formal agreement`\n </span>\n </label>\n <c8y-messages class=\"d-inline-block\">\n <c8y-message\n [name]=\"'required'\"\n [text]=\"'You need to accept the license agreement(s)' | translate\"\n ></c8y-message>\n </c8y-messages>\n </div>\n </c8y-form-group>\n <hr style=\"margin: 0 -24px 16px\" />\n <c8y-stepper-buttons\n [showButtons]=\"{ next: true, cancel: true, back: false, custom: false }\"\n (onCancel)=\"cancel()\"\n (onNext)=\"done()\"\n ></c8y-stepper-buttons>\n </c8y-wizard-footer>\n </cdk-step>\n </c8y-stepper>\n </div>\n</c8y-wizard-body>\n" }] }], ctorParameters: () => [{ type: i1.WizardComponent }, { type: i2.FormBuilder }, { type: i1.OptionsService }, { type: i3.TranslateService }], propDecorators: { stepper: [{ type: ViewChild, args: [C8yStepper, { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGljZW5zZS1jb25maXJtLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Vjb3N5c3RlbS9saWNlbnNlLWNvbmZpcm0vbGljZW5zZS1jb25maXJtLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL2Vjb3N5c3RlbS9saWNlbnNlLWNvbmZpcm0vbGljZW5zZS1jb25maXJtLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7O0FBZ0J2RCxNQUFNLE9BQU8sNEJBQTRCO0lBUXZDLFlBQ1UsZUFBcUQsRUFDckQsRUFBZSxFQUNmLGNBQThCLEVBQzlCLGdCQUFrQztRQUhsQyxvQkFBZSxHQUFmLGVBQWUsQ0FBc0M7UUFDckQsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBUDVDLGFBQVEsR0FBYyxFQUFFLENBQUM7SUFRdEIsQ0FBQztJQUVKLFFBQVE7UUFDTixNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDO1FBRXhFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDeEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3JDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ3hDLENBQUMsQ0FBQztRQUVILE1BQU0sV0FBVyxHQUFjLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUQsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2pCLEdBQUcsRUFBRSxTQUFTLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLE9BQU8sY0FBYztZQUMxRCxXQUFXLEVBQUUsR0FBRyxDQUFDLE9BQU87U0FDekIsQ0FBQyxDQUFDLENBQUM7UUFFSixNQUFNLFNBQVMsR0FBSSxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUUsR0FBRyxPQUFPO1lBQ1YsVUFBVSxFQUFFLFdBQVc7aUJBQ3BCLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDO2lCQUN4QyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDO2lCQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ2QsQ0FBQyxDQUFDLENBQUM7UUFFSixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDekUsTUFBTSx5QkFBeUIsR0FBRyxPQUFPLENBQ3ZDLHNPQUFzTyxDQUN2TyxDQUFDO1FBQ0YsTUFBTSw0QkFBNEIsR0FBRyxPQUFPLENBQzFDLG9OQUFvTixDQUNyTixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUNqRCxXQUFXLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyw0QkFBNEIsRUFDdEU7WUFDRSxXQUFXO1NBQ1osQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDNUIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7K0dBaEVVLDRCQUE0QjttR0FBNUIsNEJBQTRCLDBHQUc1QixVQUFVLDhEQ3hCdkIsazVKQW9KQTs7NEZEL0hhLDRCQUE0QjtrQkFKeEMsU0FBUzsrQkFDRSwyQkFBMkI7MEtBT3JDLE9BQU87c0JBRE4sU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEM4eVN0ZXBwZXIsIGdldHRleHQsIE9wdGlvbnNTZXJ2aWNlLCBXaXphcmRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IHVuaXFCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBMaWNlbnNlZEFwcGxpY2F0aW9uUGx1Z2luIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9lY29zeXN0ZW0vc2hhcmVkJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW50ZXJmYWNlIENvbmZpcm1JbnN0YWxsTW9kYWwge1xuICBwbHVnaW5zVG9JbnN0YWxsOiBMaWNlbnNlZEFwcGxpY2F0aW9uUGx1Z2luW107XG59XG5cbmludGVyZmFjZSBMaWNlbnNlIHtcbiAgbGljZW5zZU5hbWU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGFwcE5hbWU6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWxpY2Vuc2UtY29uZmlybS1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9saWNlbnNlLWNvbmZpcm0tbW9kYWwuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIExpY2Vuc2VDb25maXJtTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBmb3JtR3JvdXBBY2NlcHQ6IEZvcm1Hcm91cDtcbiAgZm9ybUdyb3VwTGljZW5zZXM6IEZvcm1Hcm91cDtcbiAgQFZpZXdDaGlsZChDOHlTdGVwcGVyLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBzdGVwcGVyOiBDOHlTdGVwcGVyO1xuICBsaWNlbnNlczogTGljZW5zZVtdID0gW107XG4gIGRpc2NsYWltZXJIdG1sOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB3aXphcmRDb21wb25lbnQ6IFdpemFyZENvbXBvbmVudDxDb25maXJtSW5zdGFsbE1vZGFsPixcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIG9wdGlvbnNTZXJ2aWNlOiBPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgcGx1Z2luc1RvSW5zdGFsbCB9ID0gdGhpcy53aXphcmRDb21wb25lbnQuY29tcG9uZW50SW5pdGlhbFN0YXRlO1xuXG4gICAgdGhpcy5mb3JtR3JvdXBBY2NlcHQgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNvbmZpcm1lZDogW2ZhbHNlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtR3JvdXBMaWNlbnNlcyA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgYWNjZXB0QWxsOiBbZmFsc2UsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGxMaWNlbnNlczogTGljZW5zZVtdID0gcGx1Z2luc1RvSW5zdGFsbC5tYXAoYXBwID0+ICh7XG4gICAgICBhcHBOYW1lOiBhcHAubmFtZSxcbiAgICAgIHVybDogYC9hcHBzLyR7YXBwLmNvbnRleHRQYXRofUAke2FwcC52ZXJzaW9ufS9MSUNFTlNFLnR4dGAsXG4gICAgICBsaWNlbnNlTmFtZTogYXBwLmxpY2Vuc2VcbiAgICB9KSk7XG5cbiAgICBjb25zdCB1bmlxQnlVcmwgPSAodW5pcUJ5KGFsbExpY2Vuc2VzLCAndXJsJykgYXMgTGljZW5zZVtdKS5tYXAobGljZW5zZSA9PiAoe1xuICAgICAgLi4ubGljZW5zZSxcbiAgICAgIHBsdWdpbk5hbWU6IGFsbExpY2Vuc2VzXG4gICAgICAgIC5maWx0ZXIoKHsgdXJsIH0pID0+IHVybCA9PT0gbGljZW5zZS51cmwpXG4gICAgICAgIC5tYXAoKHsgYXBwTmFtZTogcGx1Z2luTmFtZSB9KSA9PiBwbHVnaW5OYW1lKVxuICAgICAgICAuam9pbignLCAnKVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNvbXBhbnlOYW1lID0gdGhpcy5vcHRpb25zU2VydmljZS5nZXQoJ2NvbXBhbnlOYW1lJywgJ0N1bXVsb2NpdHknKTtcbiAgICBjb25zdCBkaXNjbGFpbWVySHRtbFdpdGhDb21wYW55ID0gZ2V0dGV4dChcbiAgICAgICdUaGVzZSBwbHVnaW5zIGFuZC9vciBibHVlcHJpbnRzIGFyZSBwcm92aWRlZCA8c3Ryb25nPmFzLWlzIGFuZCB3aXRob3V0IHdhcnJhbnR5IG9yIHN1cHBvcnQ8L3N0cm9uZz4sIGFuZCB0aGV5IGRvIG5vdCBjb25zdGl0dXRlIHBhcnQgb2YgdGhlIHt7IGNvbXBhbnlOYW1lIH19IHByb2R1Y3Qgc3VpdGUuIFVzZXJzIGFyZSBmcmVlIHRvIHVzZSBzdWJqZWN0IHRvIHRoZSBsaWNlbnNlIGFncmVlbWVudC4nXG4gICAgKTtcbiAgICBjb25zdCBkaXNjbGFpbWVySHRtbFdpdGhvdXRDb21wYW55ID0gZ2V0dGV4dChcbiAgICAgICdUaGVzZSBwbHVnaW5zIGFuZC9vciBibHVlcHJpbnRzIGFyZSBwcm92aWRlZCA8c3Ryb25nPmFzLWlzIGFuZCB3aXRob3V0IHdhcnJhbnR5IG9yIHN1cHBvcnQ8L3N0cm9uZz4sIGFuZCB0aGV5IGRvIG5vdCBjb25zdGl0dXRlIHBhcnQgb2YgdGhlIHByb2R1Y3Qgc3VpdGUuIFVzZXJzIGFyZSBmcmVlIHRvIHVzZSBzdWJqZWN0IHRvIHRoZSBsaWNlbnNlIGFncmVlbWVudC4nXG4gICAgKTtcblxuICAgIHRoaXMuZGlzY2xhaW1lckh0bWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgIGNvbXBhbnlOYW1lID8gZGlzY2xhaW1lckh0bWxXaXRoQ29tcGFueSA6IGRpc2NsYWltZXJIdG1sV2l0aG91dENvbXBhbnksXG4gICAgICB7XG4gICAgICAgIGNvbXBhbnlOYW1lXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMubGljZW5zZXMgPSB1bmlxQnlVcmw7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy53aXphcmRDb21wb25lbnQuY2xvc2UoZmFsc2UpO1xuICB9XG5cbiAgZG9uZSgpIHtcbiAgICB0aGlzLndpemFyZENvbXBvbmVudC5jbG9zZSh0cnVlKTtcbiAgfVxufVxuIiwiPGM4eS13aXphcmQtaGVhZGVyPlxuICA8aSBjOHlJY29uPVwicHJpdmFjeS1wb2xpY3lcIj48L2k+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm1vZGFsLXRpdGxlIGg0XCJcbiAgICBpZD1cIm1vZGFsLXRpdGxlXCJcbiAgICB0cmFuc2xhdGVcbiAgPlxuICAgIEFjY2VwdCBsaWNlbnNlKHMpYGRpYWxvZyB0aXRsZWBcbiAgPC9kaXY+XG48L2M4eS13aXphcmQtaGVhZGVyPlxuPGM4eS13aXphcmQtYm9keT5cbiAgPGRpdiBjbGFzcz1cIm0tdC0xNiBtLWwtMzIgbS1yLTMyXCI+XG4gICAgPGM4eS1zdGVwcGVyPlxuICAgICAgPGNkay1zdGVwXG4gICAgICAgIFtzdGVwQ29udHJvbF09XCJmb3JtR3JvdXBBY2NlcHRcIlxuICAgICAgICBbbGFiZWxdPVwiJ0Rpc2NsYWltZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tdC04XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG0tYi0xNiBoNFwiPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWluZm8gZC1ibG9jayBpY29uLTQwIG0tYi04XCJcbiAgICAgICAgICAgICAgYzh5SWNvbj1cImluZm8tY2lyY2xlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICB7eyAnQWJvdXQgY29tbXVuaXR5IHBhY2thZ2VzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwXG4gICAgICAgICAgICBjbGFzcz1cIm0tYi0xNlwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cImRpc2NsYWltZXJIdG1sXCJcbiAgICAgICAgICA+PC9wPlxuICAgICAgICAgIDxociBzdHlsZT1cIm1hcmdpbjogMTZweCAtMjRweCAxNnB4XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cImQtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBkLWNvbCBhLWktY2VudGVyXCJcbiAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cEFjY2VwdFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbmZpcm1lZFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlVuZGVyc3Rvb2QgYW5kIGFncmVlZC48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VzIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCIncmVxdWlyZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ0FjY2VwdCB0aGUgbWFpbnRlbmFuY2UgZGlzY2xhaW1lci4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgID48L2M4eS1tZXNzYWdlPlxuICAgICAgICAgICAgICAgIDwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjOHktd2l6YXJkLWZvb3RlciAqbmdJZj1cInN0ZXBwZXIuc2VsZWN0ZWRJbmRleCA9PT0gMFwiPlxuICAgICAgICAgIDxjOHktc3RlcHBlci1idXR0b25zXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0NvbmZpcm0gYWdyZWVtZW50JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwieyBuZXh0OiB0cnVlLCBjYW5jZWw6IHRydWUsIGJhY2s6IGZhbHNlLCBjdXN0b206IGZhbHNlIH1cIlxuICAgICAgICAgICAgKG9uQ2FuY2VsKT1cImNhbmNlbCgpXCJcbiAgICAgICAgICA+PC9jOHktc3RlcHBlci1idXR0b25zPlxuICAgICAgICA8L2M4eS13aXphcmQtZm9vdGVyPlxuICAgICAgPC9jZGstc3RlcD5cbiAgICAgIDxjZGstc3RlcFxuICAgICAgICBzdGF0ZT1cImZpbmFsXCJcbiAgICAgICAgW3N0ZXBDb250cm9sXT1cImZvcm1Hcm91cExpY2Vuc2VzXCJcbiAgICAgICAgW2xhYmVsXT1cIidMaWNlbnNlcycgfCB0cmFuc2xhdGVcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJwLXQtMjRcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBsaWNlbnNlIG9mIGxpY2Vuc2VzXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LW5vcm1hbFwiXG4gICAgICAgICAgICAqbmdJZj1cImxpY2Vuc2UubGljZW5zZU5hbWVcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInsgYXBwTmFtZTogbGljZW5zZS5hcHBOYW1lLCBsaWNlbnNlTmFtZTogbGljZW5zZS5saWNlbnNlTmFtZSB9XCJcbiAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Yj57eyBhcHBOYW1lIH19PC9iPlxuICAgICAgICAgICAgdXNlc1xuICAgICAgICAgICAgPGI+e3sgbGljZW5zZU5hbWUgfX08L2I+XG4gICAgICAgICAgICBsaWNlbnNlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ub3JtYWxcIlxuICAgICAgICAgICAgKm5nSWY9XCIhbGljZW5zZS5saWNlbnNlTmFtZVwiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBhcHBOYW1lOiBsaWNlbnNlLmFwcE5hbWUsIGxpY2Vuc2VOYW1lOiBsaWNlbnNlLmxpY2Vuc2VOYW1lIH1cIlxuICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxiPnt7IGFwcE5hbWUgfX08L2I+XG4gICAgICAgICAgICB1c2VzXG4gICAgICAgICAgICA8Yj5ubyBsaWNlbnNlPC9iPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGM4eS1saWNlbnNlLXZpZXdcbiAgICAgICAgICAgIFt1cmxdPVwibGljZW5zZS51cmxcIlxuICAgICAgICAgICAgW25hbWVdPVwibGljZW5zZS5saWNlbnNlTmFtZVwiXG4gICAgICAgICAgPjwvYzh5LWxpY2Vuc2Utdmlldz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxjOHktd2l6YXJkLWZvb3RlciAqbmdJZj1cInN0ZXBwZXIuc2VsZWN0ZWRJbmRleCA9PT0gMVwiPlxuICAgICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cInRleHQtY2VudGVyIGQtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGQtY29sIGEtaS1jZW50ZXJcIlxuICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cExpY2Vuc2VzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFjY2VwdEFsbFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwibGljZW5zZXMubGVuZ3RoID09PSAxXCJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEFjY2VwdCBsaWNlbnNlLmBmb3JtYWwgYWdyZWVtZW50YFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJsaWNlbnNlcy5sZW5ndGggPiAxXCJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEFjY2VwdCBhbGwgbGljZW5zZXMuYGZvcm1hbCBhZ3JlZW1lbnRgXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VzIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidyZXF1aXJlZCdcIlxuICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ1lvdSBuZWVkIHRvIGFjY2VwdCB0aGUgbGljZW5zZSBhZ3JlZW1lbnQocyknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICAgICAgICAgICAgPC9jOHktbWVzc2FnZXM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDxociBzdHlsZT1cIm1hcmdpbjogMCAtMjRweCAxNnB4XCIgLz5cbiAgICAgICAgICA8Yzh5LXN0ZXBwZXItYnV0dG9uc1xuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cInsgbmV4dDogdHJ1ZSwgY2FuY2VsOiB0cnVlLCBiYWNrOiBmYWxzZSwgY3VzdG9tOiBmYWxzZSB9XCJcbiAgICAgICAgICAgIChvbkNhbmNlbCk9XCJjYW5jZWwoKVwiXG4gICAgICAgICAgICAob25OZXh0KT1cImRvbmUoKVwiXG4gICAgICAgICAgPjwvYzh5LXN0ZXBwZXItYnV0dG9ucz5cbiAgICAgICAgPC9jOHktd2l6YXJkLWZvb3Rlcj5cbiAgICAgIDwvY2RrLXN0ZXA+XG4gICAgPC9jOHktc3RlcHBlcj5cbiAgPC9kaXY+XG48L2M4eS13aXphcmQtYm9keT5cbiJdfQ==