UNPKG

@vendasta/store

Version:

Components and data for Store

249 lines 32.6 kB
import { Component, Input } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { combineLatest } from 'rxjs'; import { TranslateService } from '@ngx-translate/core'; import * as i0 from "@angular/core"; import * as i1 from "@ngx-translate/core"; import * as i2 from "@angular/material/expansion"; import * as i3 from "@angular/material/icon"; import * as i4 from "../fields/field.component"; import * as i5 from "@angular/common"; export class DropDownFormSectionComponent { constructor(translateService) { this.translateService = translateService; this.startOpen = false; this.displayAutoTitle = false; this.titleText = ''; this.displayAutoDescription = true; this.descriptionText = ''; this.editingHint = ''; this.expandable = true; this.autoDescriptionText = ''; this.iconName = 'help_outline'; this.subscriptions = []; this.uniqueIndex = 1; this.autoTitleText = ''; } ngOnInit() { const allFieldsHidden = this.fields.reduce((p, c, i, a) => p && c.hidden, true); if (allFieldsHidden) { this.expandable = false; } while (this.parentForm.controls.hasOwnProperty(this.titleText + this.uniqueIndex)) { this.uniqueIndex += 1; } this.parentForm.addControl(this.titleText + this.uniqueIndex, this.toFormGroup(this.fields)); const form = this.parentForm.controls[this.titleText + this.uniqueIndex]; for (const key in form.controls) { if (form.controls.hasOwnProperty(key)) { if (this.prepopulatedData != null && this.prepopulatedData.hasOwnProperty(key)) { form.controls[key].setValue(this.prepopulatedData[key]); } } } this.subscriptions.push(combineLatest([form.statusChanges, this.translateService.stream('FRONTEND.STORE.AUTO_TITLE_TEXT')]).subscribe(([change, autoTitleText]) => { let missingFields = false; for (const control in form.controls) { if (!form.controls[control].value || (form.controls[control].value.constructor === Array && !form.controls[control].value[0])) { this.iconName = 'help_outline'; missingFields = true; if (change === 'INVALID') { this.autoTitleText = autoTitleText.SOME_FIELDS_INVALID; if (form.controls[control].dirty || form.controls[control].touched) { this.iconName = 'warning'; break; } } else { this.autoTitleText = autoTitleText.OPTIONAL_FIELDS_UNANSWERED; } } } if (!missingFields) { this.iconName = 'check_circle'; this.autoTitleText = autoTitleText.COMPLETE; } })); if (this.displayAutoDescription) { this.subscriptions.push(form.valueChanges.subscribe((changes) => { let description = ''; for (const key in changes) { if (changes.hasOwnProperty(key) && changes[key] != null && changes[key].length > 0) { if (changes[key][0].name) { for (const fileKey in changes[key]) { if (changes[key][fileKey] != null) { description += changes[key][fileKey].name; description += ', '; } } } else { description += changes[key]; description += ', '; } } } this.autoDescriptionText = description.substring(0, description.length - 2); })); } form.updateValueAndValidity({ onlySelf: false, emitEvent: true }); } toFormGroup(formFields) { const group = {}; formFields.forEach((field) => { let validations; if (!field.required || field.hidden) { validations = field.validator; } else if (field.controlType === 'checkbox') { validations = [Validators.requiredTrue, field.validator]; } else { validations = [Validators.required, field.validator]; } const formControl = new FormControl({ value: field.value, disabled: field.disabled }, validations); group[field.id] = formControl; this.subscriptions.push(formControl.valueChanges.subscribe((value) => (field.value = value))); }); return new FormGroup(group); } ngOnDestroy() { this.subscriptions.forEach((subscription) => subscription.unsubscribe()); } } DropDownFormSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: DropDownFormSectionComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); DropDownFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: DropDownFormSectionComponent, selector: "app-dropdown-form-section", inputs: { prepopulatedData: "prepopulatedData", startOpen: "startOpen", parentForm: "parentForm", displayAutoTitle: "displayAutoTitle", titleText: "titleText", displayAutoDescription: "displayAutoDescription", descriptionText: "descriptionText", fields: "fields", editingHint: "editingHint", expandable: "expandable" }, ngImport: i0, template: ` <mat-expansion-panel [ngClass]="{ 'form-hidden': !expandable }" [expanded]="startOpen" class="display"> <mat-expansion-panel-header [collapsedHeight]="'*'" [expandedHeight]="'*'"> <mat-panel-title> <div class="dropdown-form-header"> <mat-icon [ngClass]="{ invalid: iconName == 'warning', valid: iconName == 'check_circle', question: iconName == 'help_outline' }" > {{ iconName }} </mat-icon> <div *ngIf="!displayAutoTitle" class="title">{{ titleText }}</div> <div *ngIf="displayAutoTitle" [ngClass]="{ valid: iconName == 'check_circle', invalid: iconName == 'warning' }" > <div class="title">{{ titleText }}</div> <div class="auto-title"> <ng-container>{{ autoTitleText }}</ng-container> </div> </div> </div> </mat-panel-title> <mat-panel-description class="description"> <div class="description-text" *ngIf="displayAutoDescription" [ngClass]="{ invalid: iconName == 'warning' }"> {{ autoDescriptionText }} </div> <div class="description-text" *ngIf="!displayAutoDescription" [ngClass]="{ invalid: iconName == 'warning' }"> {{ descriptionText }} </div> </mat-panel-description> </mat-expansion-panel-header> <div class="expansion-panel-body"> <app-order-field *ngFor="let field of fields" [field]="field" [form]="parentForm.controls[titleText + uniqueIndex]" ></app-order-field> <p *ngIf="editingHint != ''" class="editing-hint"> <i>{{ editingHint }}</i> </p> </div> </mat-expansion-panel> <div class="print"> <div class="title">{{ titleText }}</div> <app-order-field *ngFor="let field of fields" [field]="field" [form]="parentForm.controls[titleText + uniqueIndex]" ></app-order-field> </div> `, isInline: true, styles: [":host-context(va-dropdown-form-section){font-size:14px}:host-context(va-dropdown-form-section) .expansion-panel-body{margin-top:-10px;display:block}.mat-expanded,.mat-expansion-panel{transition:margin .4s}mat-expansion-panel-header{min-height:48px;padding:12px 24px}.dropdown-form-header{display:flex}.description{align-self:center;color:rgba(0,0,0,.54)}.description .invalid{color:#c62828;color:var(--error-text-color, #c62828)}mat-icon{margin-right:7px;align-self:center}mat-icon.valid{color:#2e7d32;color:var(--success-icon-color, #2e7d32)}mat-icon.invalid{color:#c62828;color:var(--error-text-color, #c62828)}mat-icon.question{color:#9e9e9e;color:var(--tertiary-text-color, #9e9e9e)}mat-panel-title{flex:none;margin-right:16px;display:flex;max-width:100%}mat-panel-title div{display:flex}mat-panel-title.valid{color:#2e7d32;color:var(--success-text-color, #2e7d32)}mat-panel-title.invalid{color:#c62828;color:var(--error-text-color, #c62828)}.editing-hint{color:#9e9e9e;color:var(--tertiary-text-color, #9e9e9e)}.title{color:#212121;color:var(--primary-text-color, #212121);align-self:center}.auto-title{font-style:italic;margin-left:8px;align-self:center;white-space:nowrap}.not-expandable-card{background:white;cursor:default;font-size:15px;display:flex;height:48px;align-items:center;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 1px 5px rgba(0,0,0,.12)}.not-expandable-card .not-expandable-icon{margin-left:24px}.not-expandable-card .not-expandable-header{display:flex}.not-expandable-card .not-expandable-description{margin-left:22px}.not-expandable-card .valid{color:#2e7d32;color:var(--success-text-color, #2e7d32)}@media print{.display{display:none}}.print{display:none}@media print{.print{display:block}.print .title{font-size:24px;font-weight:500;padding:8px 0;margin:4px 0}}.form-hidden{display:none!important}@media only screen and (max-width: 600px){:host::ng-deep mat-expansion-panel-header{height:auto;padding:8px 16px}:host::ng-deep mat-expansion-panel-header.mat-expanded{height:auto}:host::ng-deep mat-expansion-panel-header .mat-content{flex-direction:column}:host::ng-deep mat-panel-description{display:block;font-size:12px}}\n"], components: [{ type: i2.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i2.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4.FieldComponent, selector: "app-order-field", inputs: ["field", "form"] }], directives: [{ type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.MatExpansionPanelTitle, selector: "mat-panel-title" }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatExpansionPanelDescription, selector: "mat-panel-description" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: DropDownFormSectionComponent, decorators: [{ type: Component, args: [{ selector: 'app-dropdown-form-section', template: ` <mat-expansion-panel [ngClass]="{ 'form-hidden': !expandable }" [expanded]="startOpen" class="display"> <mat-expansion-panel-header [collapsedHeight]="'*'" [expandedHeight]="'*'"> <mat-panel-title> <div class="dropdown-form-header"> <mat-icon [ngClass]="{ invalid: iconName == 'warning', valid: iconName == 'check_circle', question: iconName == 'help_outline' }" > {{ iconName }} </mat-icon> <div *ngIf="!displayAutoTitle" class="title">{{ titleText }}</div> <div *ngIf="displayAutoTitle" [ngClass]="{ valid: iconName == 'check_circle', invalid: iconName == 'warning' }" > <div class="title">{{ titleText }}</div> <div class="auto-title"> <ng-container>{{ autoTitleText }}</ng-container> </div> </div> </div> </mat-panel-title> <mat-panel-description class="description"> <div class="description-text" *ngIf="displayAutoDescription" [ngClass]="{ invalid: iconName == 'warning' }"> {{ autoDescriptionText }} </div> <div class="description-text" *ngIf="!displayAutoDescription" [ngClass]="{ invalid: iconName == 'warning' }"> {{ descriptionText }} </div> </mat-panel-description> </mat-expansion-panel-header> <div class="expansion-panel-body"> <app-order-field *ngFor="let field of fields" [field]="field" [form]="parentForm.controls[titleText + uniqueIndex]" ></app-order-field> <p *ngIf="editingHint != ''" class="editing-hint"> <i>{{ editingHint }}</i> </p> </div> </mat-expansion-panel> <div class="print"> <div class="title">{{ titleText }}</div> <app-order-field *ngFor="let field of fields" [field]="field" [form]="parentForm.controls[titleText + uniqueIndex]" ></app-order-field> </div> `, styles: [":host-context(va-dropdown-form-section){font-size:14px}:host-context(va-dropdown-form-section) .expansion-panel-body{margin-top:-10px;display:block}.mat-expanded,.mat-expansion-panel{transition:margin .4s}mat-expansion-panel-header{min-height:48px;padding:12px 24px}.dropdown-form-header{display:flex}.description{align-self:center;color:rgba(0,0,0,.54)}.description .invalid{color:#c62828;color:var(--error-text-color, #c62828)}mat-icon{margin-right:7px;align-self:center}mat-icon.valid{color:#2e7d32;color:var(--success-icon-color, #2e7d32)}mat-icon.invalid{color:#c62828;color:var(--error-text-color, #c62828)}mat-icon.question{color:#9e9e9e;color:var(--tertiary-text-color, #9e9e9e)}mat-panel-title{flex:none;margin-right:16px;display:flex;max-width:100%}mat-panel-title div{display:flex}mat-panel-title.valid{color:#2e7d32;color:var(--success-text-color, #2e7d32)}mat-panel-title.invalid{color:#c62828;color:var(--error-text-color, #c62828)}.editing-hint{color:#9e9e9e;color:var(--tertiary-text-color, #9e9e9e)}.title{color:#212121;color:var(--primary-text-color, #212121);align-self:center}.auto-title{font-style:italic;margin-left:8px;align-self:center;white-space:nowrap}.not-expandable-card{background:white;cursor:default;font-size:15px;display:flex;height:48px;align-items:center;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 1px 5px rgba(0,0,0,.12)}.not-expandable-card .not-expandable-icon{margin-left:24px}.not-expandable-card .not-expandable-header{display:flex}.not-expandable-card .not-expandable-description{margin-left:22px}.not-expandable-card .valid{color:#2e7d32;color:var(--success-text-color, #2e7d32)}@media print{.display{display:none}}.print{display:none}@media print{.print{display:block}.print .title{font-size:24px;font-weight:500;padding:8px 0;margin:4px 0}}.form-hidden{display:none!important}@media only screen and (max-width: 600px){:host::ng-deep mat-expansion-panel-header{height:auto;padding:8px 16px}:host::ng-deep mat-expansion-panel-header.mat-expanded{height:auto}:host::ng-deep mat-expansion-panel-header .mat-content{flex-direction:column}:host::ng-deep mat-panel-description{display:block;font-size:12px}}\n"] }] }], ctorParameters: function () { return [{ type: i1.TranslateService }]; }, propDecorators: { prepopulatedData: [{ type: Input }], startOpen: [{ type: Input }], parentForm: [{ type: Input }], displayAutoTitle: [{ type: Input }], titleText: [{ type: Input }], displayAutoDescription: [{ type: Input }], descriptionText: [{ type: Input }], fields: [{ type: Input }], editingHint: [{ type: Input }], expandable: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tZm9ybS1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9vcmRlci1mb3JtL2Ryb3Bkb3duLWZvcm0tc2VjdGlvbi9kcm9wZG93bi1mb3JtLXNlY3Rpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUsYUFBYSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQTZEdkQsTUFBTSxPQUFPLDRCQUE0QjtJQWlCdkMsWUFBb0IsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFmN0MsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLDJCQUFzQixHQUFHLElBQUksQ0FBQztRQUM5QixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUVyQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzNCLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUN6QixhQUFRLEdBQUcsY0FBYyxDQUFDO1FBQzFCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztJQUVzQyxDQUFDO0lBRTFELFFBQVE7UUFDTixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFD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LENBQUMsQ0FBQztJQUMzRSxDQUFDOzt5SEFuSFUsNEJBQTRCOzZHQUE1Qiw0QkFBNEIsaVlBekQ3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0RUOzJGQUdVLDRCQUE0QjtrQkEzRHhDLFNBQVM7K0JBQ0UsMkJBQTJCLFlBQzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzRFQ7dUdBSVEsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZEJhc2UgfSBmcm9tICcuLi9maWVsZHMvZmllbGQtYmFzZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWRyb3Bkb3duLWZvcm0tc2VjdGlvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG1hdC1leHBhbnNpb24tcGFuZWwgW25nQ2xhc3NdPVwieyAnZm9ybS1oaWRkZW4nOiAhZXhwYW5kYWJsZSB9XCIgW2V4cGFuZGVkXT1cInN0YXJ0T3BlblwiIGNsYXNzPVwiZGlzcGxheVwiPlxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIFtjb2xsYXBzZWRIZWlnaHRdPVwiJyonXCIgW2V4cGFuZGVkSGVpZ2h0XT1cIicqJ1wiPlxuICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1mb3JtLWhlYWRlclwiPlxuICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICBpbnZhbGlkOiBpY29uTmFtZSA9PSAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgdmFsaWQ6IGljb25OYW1lID09ICdjaGVja19jaXJjbGUnLFxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uOiBpY29uTmFtZSA9PSAnaGVscF9vdXRsaW5lJ1xuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgaWNvbk5hbWUgfX1cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWRpc3BsYXlBdXRvVGl0bGVcIiBjbGFzcz1cInRpdGxlXCI+e3sgdGl0bGVUZXh0IH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiZGlzcGxheUF1dG9UaXRsZVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgdmFsaWQ6IGljb25OYW1lID09ICdjaGVja19jaXJjbGUnLCBpbnZhbGlkOiBpY29uTmFtZSA9PSAnd2FybmluZycgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7IHRpdGxlVGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXV0by10aXRsZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+e3sgYXV0b1RpdGxlVGV4dCB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgPG1hdC1wYW5lbC1kZXNjcmlwdGlvbiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uLXRleHRcIiAqbmdJZj1cImRpc3BsYXlBdXRvRGVzY3JpcHRpb25cIiBbbmdDbGFzc109XCJ7IGludmFsaWQ6IGljb25OYW1lID09ICd3YXJuaW5nJyB9XCI+XG4gICAgICAgICAgICB7eyBhdXRvRGVzY3JpcHRpb25UZXh0IH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uLXRleHRcIiAqbmdJZj1cIiFkaXNwbGF5QXV0b0Rlc2NyaXB0aW9uXCIgW25nQ2xhc3NdPVwieyBpbnZhbGlkOiBpY29uTmFtZSA9PSAnd2FybmluZycgfVwiPlxuICAgICAgICAgICAge3sgZGVzY3JpcHRpb25UZXh0IH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LXBhbmVsLWRlc2NyaXB0aW9uPlxuICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJleHBhbnNpb24tcGFuZWwtYm9keVwiPlxuICAgICAgICA8YXBwLW9yZGVyLWZpZWxkXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZpZWxkc1wiXG4gICAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICAgICAgICBbZm9ybV09XCJwYXJlbnRGb3JtLmNvbnRyb2xzW3RpdGxlVGV4dCArIHVuaXF1ZUluZGV4XVwiXG4gICAgICAgID48L2FwcC1vcmRlci1maWVsZD5cbiAgICAgICAgPHAgKm5nSWY9XCJlZGl0aW5nSGludCAhPSAnJ1wiIGNsYXNzPVwiZWRpdGluZy1oaW50XCI+XG4gICAgICAgICAgPGk+e3sgZWRpdGluZ0hpbnQgfX08L2k+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICA8ZGl2IGNsYXNzPVwicHJpbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7IHRpdGxlVGV4dCB9fTwvZGl2PlxuICAgICAgPGFwcC1vcmRlci1maWVsZFxuICAgICAgICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzXCJcbiAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICAgICAgW2Zvcm1dPVwicGFyZW50Rm9ybS5jb250cm9sc1t0aXRsZVRleHQgKyB1bmlxdWVJbmRleF1cIlxuICAgICAgPjwvYXBwLW9yZGVyLWZpZWxkPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi1mb3JtLXNlY3Rpb24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRHJvcERvd25Gb3JtU2VjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcHJlcG9wdWxhdGVkRGF0YToge307XG4gIEBJbnB1dCgpIHN0YXJ0T3BlbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwYXJlbnRGb3JtOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGRpc3BsYXlBdXRvVGl0bGUgPSBmYWxzZTtcbiAgQElucHV0KCkgdGl0bGVUZXh0ID0gJyc7XG4gIEBJbnB1dCgpIGRpc3BsYXlBdXRvRGVzY3JpcHRpb24gPSB0cnVlO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvblRleHQgPSAnJztcbiAgQElucHV0KCkgZmllbGRzOiBGaWVsZEJhc2U8YW55PltdO1xuICBASW5wdXQoKSBlZGl0aW5nSGludCA9ICcnO1xuICBASW5wdXQoKSBleHBhbmRhYmxlID0gdHJ1ZTtcbiAgYXV0b0Rlc2NyaXB0aW9uVGV4dCA9ICcnO1xuICBpY29uTmFtZSA9ICdoZWxwX291dGxpbmUnO1xuICBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICB1bmlxdWVJbmRleCA9IDE7XG4gIGF1dG9UaXRsZVRleHQgPSAnJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsRmllbGRzSGlkZGVuID0gdGhpcy5maWVsZHMucmVkdWNlKChwLCBjLCBpLCBhKSA9PiBwICYmIGMuaGlkZGVuLCB0cnVlKTtcbiAgICBpZiAoYWxsRmllbGRzSGlkZGVuKSB7XG4gICAgICB0aGlzLmV4cGFuZGFibGUgPSBmYWxzZTtcbiAgICB9XG4gICAgd2hpbGUgKHRoaXMucGFyZW50Rm9ybS5jb250cm9scy5oYXNPd25Qcm9wZXJ0eSh0aGlzLnRpdGxlVGV4dCArIHRoaXMudW5pcXVlSW5kZXgpKSB7XG4gICAgICB0aGlzLnVuaXF1ZUluZGV4ICs9IDE7XG4gICAgfVxuICAgIHRoaXMucGFyZW50Rm9ybS5hZGRDb250cm9sKHRoaXMudGl0bGVUZXh0ICsgdGhpcy51bmlxdWVJbmRleCwgdGhpcy50b0Zvcm1Hcm91cCh0aGlzLmZpZWxkcykpO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLnBhcmVudEZvcm0uY29udHJvbHNbdGhpcy50aXRsZVRleHQgKyB0aGlzLnVuaXF1ZUluZGV4XSBhcyBGb3JtR3JvdXA7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtLmNvbnRyb2xzKSB7XG4gICAgICBpZiAoZm9ybS5jb250cm9scy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0aGlzLnByZXBvcHVsYXRlZERhdGEgIT0gbnVsbCAmJiB0aGlzLnByZXBvcHVsYXRlZERhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGZvcm0uY29udHJvbHNba2V5XS5zZXRWYWx1ZSh0aGlzLnByZXBvcHVsYXRlZERhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjb21iaW5lTGF0ZXN0KFtmb3JtLnN0YXR1c0NoYW5nZXMsIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ0ZST05URU5ELlNUT1JFLkFVVE9fVElUTEVfVEVYVCcpXSkuc3Vic2NyaWJlKFxuICAgICAgICAoW2NoYW5nZSwgYXV0b1RpdGxlVGV4dF0pID0+IHtcbiAgICAgICAgICBsZXQgbWlzc2luZ0ZpZWxkcyA9IGZhbHNlO1xuICAgICAgICAgIGZvciAoY29uc3QgY29udHJvbCBpbiBmb3JtLmNvbnRyb2xzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFmb3JtLmNvbnRyb2xzW2NvbnRyb2xdLnZhbHVlIHx8XG4gICAgICAgICAgICAgIChmb3JtLmNvbnRyb2xzW2NvbnRyb2xdLnZhbHVlLmNvbnN0cnVjdG9yID09PSBBcnJheSAmJiAhZm9ybS5jb250cm9sc1tjb250cm9sXS52YWx1ZVswXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLmljb25OYW1lID0gJ2hlbHBfb3V0bGluZSc7XG4gICAgICAgICAgICAgIG1pc3NpbmdGaWVsZHMgPSB0cnVlO1xuICAgICAgICAgICAgICBpZiAoY2hhbmdlID09PSAnSU5WQUxJRCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9UaXRsZVRleHQgPSBhdXRvVGl0bGVUZXh0LlNPTUVfRklFTERTX0lOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm0uY29udHJvbHNbY29udHJvbF0uZGlydHkgfHwgZm9ybS5jb250cm9sc1tjb250cm9sXS50b3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmljb25OYW1lID0gJ3dhcm5pbmcnO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0b1RpdGxlVGV4dCA9IGF1dG9UaXRsZVRleHQuT1BUSU9OQUxfRklFTERTX1VOQU5TV0VSRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFtaXNzaW5nRmllbGRzKSB7XG4gICAgICAgICAgICB0aGlzLmljb25OYW1lID0gJ2NoZWNrX2NpcmNsZSc7XG4gICAgICAgICAgICB0aGlzLmF1dG9UaXRsZVRleHQgPSBhdXRvVGl0bGVUZXh0LkNPTVBMRVRFO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmRpc3BsYXlBdXRvRGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICBmb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGNoYW5nZXMpID0+IHtcbiAgICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGNoYW5nZXNba2V5XSAhPSBudWxsICYmIGNoYW5nZXNba2V5XS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGlmIChjaGFuZ2VzW2tleV1bMF0ubmFtZSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZUtleSBpbiBjaGFuZ2VzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzW2tleV1bZmlsZUtleV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBjaGFuZ2VzW2tleV1bZmlsZUtleV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gJywgJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gY2hhbmdlc1trZXldO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICcsICc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hdXRvRGVzY3JpcHRpb25UZXh0ID0gZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIGRlc2NyaXB0aW9uLmxlbmd0aCAtIDIpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIGZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiBmYWxzZSwgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICB9XG5cbiAgdG9Gb3JtR3JvdXAoZm9ybUZpZWxkczogRmllbGRCYXNlPGFueT5bXSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgIGZvcm1GaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGxldCB2YWxpZGF0aW9ucztcbiAgICAgIGlmICghZmllbGQucmVxdWlyZWQgfHwgZmllbGQuaGlkZGVuKSB7XG4gICAgICAgIHZhbGlkYXRpb25zID0gZmllbGQudmFsaWRhdG9yO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZC5jb250cm9sVHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICB2YWxpZGF0aW9ucyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkVHJ1ZSwgZmllbGQudmFsaWRhdG9yXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRpb25zID0gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGZpZWxkLnZhbGlkYXRvcl07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGZpZWxkLnZhbHVlLCBkaXNhYmxlZDogZmllbGQuZGlzYWJsZWQgfSwgdmFsaWRhdGlvbnMpO1xuICAgICAgZ3JvdXBbZmllbGQuaWRdID0gZm9ybUNvbnRyb2w7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChmb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gKGZpZWxkLnZhbHVlID0gdmFsdWUpKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IEZvcm1Hcm91cChncm91cCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3Vic2NyaXB0aW9uKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiJdfQ==