@cqa-lib/cqa-ui 1.1.215 → 1.1.217

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.
@@ -3,11 +3,11 @@ import { STEP_DETAILS_DRAWER_REF } from './step-details-drawer-ref';
3
3
  import { STEP_DETAILS_DRAWER_DATA } from './step-details-drawer-data';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@angular/forms";
6
- import * as i2 from "@angular/material/icon";
7
- import * as i3 from "../../custom-input/custom-input.component";
8
- import * as i4 from "../../custom-textarea/custom-textarea.component";
9
- import * as i5 from "../../custom-toggle/custom-toggle.component";
10
- import * as i6 from "../../dynamic-select/dynamic-select-field.component";
6
+ import * as i2 from "../../custom-input/custom-input.component";
7
+ import * as i3 from "../../custom-textarea/custom-textarea.component";
8
+ import * as i4 from "../../custom-toggle/custom-toggle.component";
9
+ import * as i5 from "../../dynamic-select/dynamic-select-field.component";
10
+ import * as i6 from "@angular/material/icon";
11
11
  import * as i7 from "../../button/button.component";
12
12
  import * as i8 from "@angular/common";
13
13
  import * as i9 from "./step-details-drawer-ref";
@@ -206,10 +206,10 @@ export class StepDetailsDrawerComponent {
206
206
  }
207
207
  }
208
208
  StepDetailsDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerComponent, deps: [{ token: STEP_DETAILS_DRAWER_REF }, { token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: STEP_DETAILS_DRAWER_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
209
- StepDetailsDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepDetailsDrawerComponent, selector: "cqa-step-details-drawer", inputs: { stepData: "stepData", stepNumberInput: "stepNumberInput", dynamicFieldsInput: "dynamicFieldsInput", drawerTitle: "drawerTitle" }, outputs: { saveChanges: "saveChanges", cancel: "cancel", saveAsTemplate: "saveAsTemplate" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<!-- Step Details Drawer \u2013 Edit In Depth. Fully dynamic from DynamicFieldConfig[]. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ displayTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: all fields from dynamicFields array (main + constraints in order, then advanced grouped) -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"dynamicFields.length > 0\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <!-- All non-advanced fields in array order with section headers -->\n <ng-container *ngFor=\"let field of dynamicFields; let i = index\">\n <ng-container *ngIf=\"isNonAdvancedField(i)\">\n <p *ngIf=\"isFirstInSection(i, 'main')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n <p *ngIf=\"isFirstInSection(i, 'constraints')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n\n <!-- string / undefined \u2192 text input -->\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- number -->\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea -->\n <div *ngIf=\"field.type === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <span *ngIf=\"field.required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"field.rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"field.tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ field.tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"field.type === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- boolean \u2192 toggle -->\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ field.label }}</p>\n <span *ngIf=\"field.subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n\n <!-- dropdown -->\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Advanced: expandable (all advanced fields from array) -->\n <ng-container *ngIf=\"advancedFields.length > 0\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <ng-container *ngFor=\"let field of advancedFields\">\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ field.label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"field.subLabel\">{{ field.subLabel }}</span>\n </div>\n </div>\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Other Locators section (matching old UI) -->\n <ng-container *ngIf=\"pwLocator && pwLocator.length > 0\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Other Locators</p>\n <div *ngFor=\"let locator of pwLocator; let i = index\" class=\"cqa-mb-3\">\n <div *ngIf=\"locator !== ''\" class=\"cqa-relative cqa-flex cqa-items-center\">\n <input\n type=\"text\"\n [value]=\"locator\"\n #locatorInput\n readonly\n class=\"cqa-w-full cqa-px-3 cqa-py-2 cqa-pr-20 cqa-border cqa-border-[#E5E7EB] cqa-rounded cqa-text-[14px] cqa-bg-white\"\n style=\"padding-left: 26px;\">\n <button\n type=\"button\"\n (click)=\"copyLocator(locatorInput)\"\n class=\"cqa-absolute cqa-left-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#374151]\"\n title=\"Click to Copy\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">content_copy</mat-icon>\n </button>\n <button\n type=\"button\"\n (click)=\"deleteLocator(i)\"\n class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#DC2626]\"\n title=\"Delete\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">delete</mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"dynamicFields.length === 0\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">No fields configured for this step.</p>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i4.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i5.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i6.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
209
+ StepDetailsDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepDetailsDrawerComponent, selector: "cqa-step-details-drawer", inputs: { stepData: "stepData", stepNumberInput: "stepNumberInput", dynamicFieldsInput: "dynamicFieldsInput", drawerTitle: "drawerTitle" }, outputs: { saveChanges: "saveChanges", cancel: "cancel", saveAsTemplate: "saveAsTemplate" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<!-- Step Details Drawer \u2013 Edit In Depth. Fully dynamic from DynamicFieldConfig[]. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2 cqa-bg-white\"\n style=\"border-bottom: 1px solid #E5E5E5;\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 20L14 16L18 12\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[19px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ displayTitle }}\n </h2>\n <span class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[5px] cqa-bg-[#D8D9FC] cqa-text-[#090A60] cqa-text-[12px]\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M19 9L9 19\" stroke=\"#4A5565\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M9 9L19 19\" stroke=\"#4A5565\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- Content: all fields from dynamicFields array (main + constraints in order, then advanced grouped) -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-p-4 cqa-flex cqa-flex-col cqa-gap-1.5\">\n <ng-container *ngIf=\"dynamicFields.length > 0\">\n <!-- All non-advanced fields in array order with section headers -->\n <ng-container *ngFor=\"let field of dynamicFields; let i = index\">\n <ng-container *ngIf=\"isNonAdvancedField(i)\">\n <p *ngIf=\"isFirstInSection(i, 'main')\"\n class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text[#0A0A0A] cqa-mb-1\">Attributes</p>\n <p *ngIf=\"isFirstInSection(i, 'constraints')\"\n class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text[#0A0A0A] cqa-mb-1\">Constraints</p>\n\n <!-- string / undefined \u2192 text input -->\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <label class=\"cqa-text-[14px] cqa-leading-[17px] cqa-font-medium cqa-text-[#161617]\">{{ field.label }}</label>\n <cqa-custom-input [placeholder]=\"field.placeholder || ''\" [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\" (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- number -->\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <label class=\"cqa-text-[14px] cqa-leading-[17px] cqa-font-medium cqa-text-[#161617]\">{{ field.label }}</label>\n <cqa-custom-input type=\"number\" [placeholder]=\"field.placeholder || ''\" [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\" (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea -->\n <div *ngIf=\"field.type === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[14px] cqa-leading-[17px] cqa-font-medium cqa-text-[#161617]\">{{ field.label }}</label>\n <span *ngIf=\"field.required\"\n class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <cqa-custom-textarea [placeholder]=\"field.placeholder || ''\" [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\" [rows]=\"field.rows || 4\" customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"field.tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa--mt-1.5\">{{ field.tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"field.type === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-textarea [placeholder]=\"field.placeholder || ''\" [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- boolean \u2192 toggle -->\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ field.label }}</p>\n <span *ngIf=\"field.subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{\n field.subLabel }}</span>\n </div>\n <cqa-custom-toggle [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n\n <!-- dropdown -->\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Advanced: expandable (all advanced fields from array) -->\n <ng-container *ngIf=\"advancedFields.length > 0\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <ng-container *ngFor=\"let field of advancedFields\">\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input [placeholder]=\"field.placeholder || ''\" [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\" (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input type=\"number\" [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\" [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-toggle [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ field.label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"field.subLabel\">{{ field.subLabel }}</span>\n </div>\n </div>\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Other Locators section (matching old UI) -->\n <ng-container *ngIf=\"pwLocator && pwLocator.length > 0\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Other Locators</p>\n <div *ngFor=\"let locator of pwLocator; let i = index\" class=\"cqa-mb-3\">\n <div *ngIf=\"locator !== ''\" class=\"cqa-relative cqa-flex cqa-items-center\">\n <input type=\"text\" [value]=\"locator\" #locatorInput readonly\n class=\"cqa-w-full cqa-px-3 cqa-py-2 cqa-pr-20 cqa-border cqa-border-[#E5E7EB] cqa-rounded cqa-text-[14px] cqa-bg-white\"\n style=\"padding-left: 26px;\">\n <button type=\"button\" (click)=\"copyLocator(locatorInput)\"\n class=\"cqa-absolute cqa-left-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#374151]\"\n title=\"Click to Copy\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">content_copy</mat-icon>\n </button>\n <button type=\"button\" (click)=\"deleteLocator(i)\"\n class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#DC2626]\"\n title=\"Delete\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">delete</mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n <p *ngIf=\"dynamicFields.length === 0\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">No fields configured for this step.\n </p>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-white\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>", components: [{ type: i2.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i3.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i4.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i5.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
210
210
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerComponent, decorators: [{
211
211
  type: Component,
212
- args: [{ selector: 'cqa-step-details-drawer', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Step Details Drawer \u2013 Edit In Depth. Fully dynamic from DynamicFieldConfig[]. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ displayTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: all fields from dynamicFields array (main + constraints in order, then advanced grouped) -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"dynamicFields.length > 0\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <!-- All non-advanced fields in array order with section headers -->\n <ng-container *ngFor=\"let field of dynamicFields; let i = index\">\n <ng-container *ngIf=\"isNonAdvancedField(i)\">\n <p *ngIf=\"isFirstInSection(i, 'main')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n <p *ngIf=\"isFirstInSection(i, 'constraints')\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n\n <!-- string / undefined \u2192 text input -->\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- number -->\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea -->\n <div *ngIf=\"field.type === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <span *ngIf=\"field.required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"field.rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"field.tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ field.tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"field.type === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- boolean \u2192 toggle -->\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ field.label }}</p>\n <span *ngIf=\"field.subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n\n <!-- dropdown -->\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Advanced: expandable (all advanced fields from array) -->\n <ng-container *ngIf=\"advancedFields.length > 0\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <ng-container *ngFor=\"let field of advancedFields\">\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input\n type=\"number\"\n [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-toggle\n [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ field.label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"field.subLabel\">{{ field.subLabel }}</span>\n </div>\n </div>\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Other Locators section (matching old UI) -->\n <ng-container *ngIf=\"pwLocator && pwLocator.length > 0\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Other Locators</p>\n <div *ngFor=\"let locator of pwLocator; let i = index\" class=\"cqa-mb-3\">\n <div *ngIf=\"locator !== ''\" class=\"cqa-relative cqa-flex cqa-items-center\">\n <input\n type=\"text\"\n [value]=\"locator\"\n #locatorInput\n readonly\n class=\"cqa-w-full cqa-px-3 cqa-py-2 cqa-pr-20 cqa-border cqa-border-[#E5E7EB] cqa-rounded cqa-text-[14px] cqa-bg-white\"\n style=\"padding-left: 26px;\">\n <button\n type=\"button\"\n (click)=\"copyLocator(locatorInput)\"\n class=\"cqa-absolute cqa-left-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#374151]\"\n title=\"Click to Copy\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">content_copy</mat-icon>\n </button>\n <button\n type=\"button\"\n (click)=\"deleteLocator(i)\"\n class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#DC2626]\"\n title=\"Delete\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">delete</mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"dynamicFields.length === 0\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">No fields configured for this step.</p>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n" }]
212
+ args: [{ selector: 'cqa-step-details-drawer', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Step Details Drawer \u2013 Edit In Depth. Fully dynamic from DynamicFieldConfig[]. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2 cqa-bg-white\"\n style=\"border-bottom: 1px solid #E5E5E5;\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 20L14 16L18 12\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[19px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ displayTitle }}\n </h2>\n <span class=\"cqa-px-2 cqa-py-[2px] cqa-rounded-[5px] cqa-bg-[#D8D9FC] cqa-text-[#090A60] cqa-text-[12px]\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M19 9L9 19\" stroke=\"#4A5565\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M9 9L19 19\" stroke=\"#4A5565\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <!-- Content: all fields from dynamicFields array (main + constraints in order, then advanced grouped) -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-p-4 cqa-flex cqa-flex-col cqa-gap-1.5\">\n <ng-container *ngIf=\"dynamicFields.length > 0\">\n <!-- All non-advanced fields in array order with section headers -->\n <ng-container *ngFor=\"let field of dynamicFields; let i = index\">\n <ng-container *ngIf=\"isNonAdvancedField(i)\">\n <p *ngIf=\"isFirstInSection(i, 'main')\"\n class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text[#0A0A0A] cqa-mb-1\">Attributes</p>\n <p *ngIf=\"isFirstInSection(i, 'constraints')\"\n class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text[#0A0A0A] cqa-mb-1\">Constraints</p>\n\n <!-- string / undefined \u2192 text input -->\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <label class=\"cqa-text-[14px] cqa-leading-[17px] cqa-font-medium cqa-text-[#161617]\">{{ field.label }}</label>\n <cqa-custom-input [placeholder]=\"field.placeholder || ''\" [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\" (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- number -->\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <label class=\"cqa-text-[14px] cqa-leading-[17px] cqa-font-medium cqa-text-[#161617]\">{{ field.label }}</label>\n <cqa-custom-input type=\"number\" [placeholder]=\"field.placeholder || ''\" [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\" (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea -->\n <div *ngIf=\"field.type === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[14px] cqa-leading-[17px] cqa-font-medium cqa-text-[#161617]\">{{ field.label }}</label>\n <span *ngIf=\"field.required\"\n class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <cqa-custom-textarea [placeholder]=\"field.placeholder || ''\" [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\" [rows]=\"field.rows || 4\" customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"field.tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa--mt-1.5\">{{ field.tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"field.type === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-textarea [placeholder]=\"field.placeholder || ''\" [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\" [rows]=\"8\" resize=\"vertical\" customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- boolean \u2192 toggle -->\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ field.label }}</p>\n <span *ngIf=\"field.subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{\n field.subLabel }}</span>\n </div>\n <cqa-custom-toggle [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n\n <!-- dropdown -->\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n\n <!-- Advanced: expandable (all advanced fields from array) -->\n <ng-container *ngIf=\"advancedFields.length > 0\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <ng-container *ngFor=\"let field of advancedFields\">\n <div *ngIf=\"(field.type ?? 'string') === 'string'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input [placeholder]=\"field.placeholder || ''\" [value]=\"form.get(field.key)?.value\"\n [fullWidth]=\"true\" (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'number'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-custom-input type=\"number\" [placeholder]=\"field.placeholder || ''\"\n [value]=\"form.get(field.key)?.value\" [fullWidth]=\"true\"\n (valueChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n <div *ngIf=\"field.type === 'boolean'\" class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <cqa-custom-toggle [checked]=\"form.get(field.key)?.value\"\n (checkedChange)=\"form.get(field.key)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ field.label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"field.subLabel\">{{ field.subLabel }}</span>\n </div>\n </div>\n <div *ngIf=\"field.type === 'dropdown' && getSelectConfig(field) && form.contains(field.key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ field.label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(field)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Other Locators section (matching old UI) -->\n <ng-container *ngIf=\"pwLocator && pwLocator.length > 0\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Other Locators</p>\n <div *ngFor=\"let locator of pwLocator; let i = index\" class=\"cqa-mb-3\">\n <div *ngIf=\"locator !== ''\" class=\"cqa-relative cqa-flex cqa-items-center\">\n <input type=\"text\" [value]=\"locator\" #locatorInput readonly\n class=\"cqa-w-full cqa-px-3 cqa-py-2 cqa-pr-20 cqa-border cqa-border-[#E5E7EB] cqa-rounded cqa-text-[14px] cqa-bg-white\"\n style=\"padding-left: 26px;\">\n <button type=\"button\" (click)=\"copyLocator(locatorInput)\"\n class=\"cqa-absolute cqa-left-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#374151]\"\n title=\"Click to Copy\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">content_copy</mat-icon>\n </button>\n <button type=\"button\" (click)=\"deleteLocator(i)\"\n class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-p-1 cqa-text-[#6B7280] hover:cqa-text-[#DC2626]\"\n title=\"Delete\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">delete</mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n <p *ngIf=\"dynamicFields.length === 0\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">No fields configured for this step.\n </p>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-white\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>" }]
213
213
  }], ctorParameters: function () { return [{ type: i9.StepDetailsDrawerRef, decorators: [{
214
214
  type: Inject,
215
215
  args: [STEP_DETAILS_DRAWER_REF]
@@ -233,4 +233,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
233
233
  }], drawerTitle: [{
234
234
  type: Input
235
235
  }] } });
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBd0IsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRixPQUFPLEVBQUUsd0JBQXdCLEVBQTZDLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBT2pIOzs7O0dBSUc7QUFPSCxNQUFNLE9BQU8sMEJBQTBCO0lBNERyQyxZQUMyQyxHQUF5QixFQUMxRCxFQUFlLEVBQ2YsR0FBc0IsRUFDZ0IsSUFBNEI7UUFIakMsUUFBRyxHQUFILEdBQUcsQ0FBc0I7UUFDMUQsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBOUR0QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ3JELFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2xDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFFekQsYUFBUSxHQUE4QixJQUFJLENBQUM7UUFDM0Msb0JBQWUsR0FBMkIsSUFBSSxDQUFDO1FBQ3hELDZGQUE2RjtRQUNwRix1QkFBa0IsR0FBZ0MsSUFBSSxDQUFDO1FBQ2hFLHdFQUF3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N0MsT0FBTztTQUNSLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELDhGQUE4RjtJQUM5RixJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDOzt1SEFwTlUsMEJBQTBCLGtCQTZEM0IsdUJBQXVCLHlFQUdYLHdCQUF3QjsyR0FoRW5DLDBCQUEwQixzV0NqQ3ZDLG9tWUFnTkE7MkZEL0thLDBCQUEwQjtrQkFOdEMsU0FBUzsrQkFDRSx5QkFBeUIsUUFFN0IsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLG1CQUNiLHVCQUF1QixDQUFDLE1BQU07OzBCQStENUMsTUFBTTsyQkFBQyx1QkFBdUI7OzBCQUc5QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHdCQUF3Qjs0Q0EvRHBDLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUUsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfUkVGLCBTdGVwRGV0YWlsc0RyYXdlclJlZiB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1yZWYnO1xuaW1wb3J0IHsgU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLCBTdGVwRGV0YWlsc0RyYXdlckRhdGEsIER5bmFtaWNGaWVsZENvbmZpZyB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1kYXRhJztcbmltcG9ydCB7IFRlc3RDYXNlU3RlcENvbmZpZyB9IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgdHlwZSB7XG4gIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyxcbiAgU2VsZWN0T3B0aW9uLFxufSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFN0ZXAgRGV0YWlscyBEcmF3ZXIgKEVkaXQgSW4gRGVwdGgpLlxuICogUmVuZGVycyBvbmx5IGZyb20gdGhlIHByb3ZpZGVkIER5bmFtaWNGaWVsZENvbmZpZ1tdOyBubyBmaWx0ZXJpbmcgb3Igc3RlcC10eXBlLWJhc2VkIGZpZWxkIGxvZ2ljLlxuICogRWFjaCBzdGVwIGluc3RhbmNlIHJlY2VpdmVzIGl0cyBvd24gY29tcGxldGUgZmllbGQgY29uZmlndXJhdGlvbi4gR2VuZXJpYyBrZXktYmFzZWQgc3RlcCByZWFkL3dyaXRlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1kZXRhaWxzLWRyYXdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU3RlcERldGFpbHNEcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBPdXRwdXQoKSBzYXZlQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VTdGVwQ29uZmlnPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgc2F2ZUFzVGVtcGxhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlU3RlcENvbmZpZz4oKTtcblxuICBASW5wdXQoKSBzdGVwRGF0YTogVGVzdENhc2VTdGVwQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXJJbnB1dDogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGVuIHByb3ZpZGVkIChlLmcuIFN0b3J5Ym9vayksIHVzZSBpbnN0ZWFkIG9mIFNURVBfREVUQUlMU19EUkFXRVJfREFUQS5keW5hbWljRmllbGRzLiAqL1xuICBASW5wdXQoKSBkeW5hbWljRmllbGRzSW5wdXQ6IER5bmFtaWNGaWVsZENvbmZpZ1tdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCB1c2UgYXMgZHJhd2VyIGhlYWRlciB0aXRsZSAob3ZlcnJpZGVzIGRhdGEudGl0bGUpLiAqL1xuICBASW5wdXQoKSBkcmF3ZXJUaXRsZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnO1xuICBzdGVwTnVtYmVyOiBudW1iZXIgfCBzdHJpbmc7XG4gIGR5bmFtaWNGaWVsZHM6IER5bmFtaWNGaWVsZENvbmZpZ1tdID0gW107XG4gIGRyYXdlclRpdGxlVmFsdWUgPSAnU3RlcCBEZXRhaWxzJztcbiAgYWR2YW5jZWRFeHBhbmRlZCA9IGZhbHNlO1xuICBmb3JtOiBGb3JtR3JvdXA7XG4gIHB3TG9jYXRvcjogc3RyaW5nW10gPSBbXTtcblxuICAvKiogQ2FjaGVkIHNlbGVjdCBjb25maWdzIHBlciBmaWVsZCBrZXkgKHN0YWJsZSByZWZzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uKS4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RDb25maWdDYWNoZTogUmVjb3JkPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IHt9O1xuXG4gIC8qKiBBbGwgZmllbGRzIGZyb20gdGhlIHByb3ZpZGVkIGFycmF5IChzYW1lIHJlZmVyZW5jZTsgdXNlZCBmb3Igc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBpbiB0ZW1wbGF0ZSkuICovXG4gIGdldCBhbGxGaWVsZHMoKTogRHluYW1pY0ZpZWxkQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNGaWVsZHM7XG4gIH1cblxuICAvKiogRmllbGRzIGluIG1haW4gc2VjdGlvbiAoc2VjdGlvbiA9PT0gJ21haW4nIG9yIHVuZGVmaW5lZCkuICovXG4gIGdldCBtYWluRmllbGRzKCk6IER5bmFtaWNGaWVsZENvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRmllbGRzLmZpbHRlcigoZikgPT4gKGYuc2VjdGlvbiA/PyAnbWFpbicpID09PSAnbWFpbicpO1xuICB9XG5cbiAgLyoqIEZpZWxkcyBpbiBjb25zdHJhaW50cyBzZWN0aW9uLiAqL1xuICBnZXQgY29uc3RyYWludHNGaWVsZHMoKTogRHluYW1pY0ZpZWxkQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNGaWVsZHMuZmlsdGVyKChmKSA9PiBmLnNlY3Rpb24gPT09ICdjb25zdHJhaW50cycpO1xuICB9XG5cbiAgLyoqIEZpZWxkcyBpbiBhZHZhbmNlZCBzZWN0aW9uIChpbnNpZGUgZXhwYW5kYWJsZSBibG9jaykuICovXG4gIGdldCBhZHZhbmNlZEZpZWxkcygpOiBEeW5hbWljRmllbGRDb25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY0ZpZWxkcy5maWx0ZXIoKGYpID0+IGYuc2VjdGlvbiA9PT0gJ2FkdmFuY2VkJyk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBmaWVsZCBhdCBpbmRleCBpcyB0aGUgZmlyc3QgaW4gaXRzIHNlY3Rpb24gKGZvciBzaG93aW5nIHNlY3Rpb24gaGVhZGVycykuICovXG4gIGlzRmlyc3RJblNlY3Rpb24oaW5kZXg6IG51bWJlciwgc2VjdGlvbjogJ21haW4nIHwgJ2NvbnN0cmFpbnRzJyB8ICdhZHZhbmNlZCcpOiBib29sZWFuIHtcbiAgICBjb25zdCBmID0gdGhpcy5keW5hbWljRmllbGRzW2luZGV4XTtcbiAgICBpZiAoIWYpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBmU2VjdGlvbiA9IGYuc2VjdGlvbiA/PyAnbWFpbic7XG4gICAgaWYgKGZTZWN0aW9uICE9PSBzZWN0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGluZGV4ID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy5keW5hbWljRmllbGRzW2luZGV4IC0gMV07XG4gICAgcmV0dXJuIChwcmV2Py5zZWN0aW9uID8/ICdtYWluJykgIT09IHNlY3Rpb247XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBmaWVsZCBhdCBpbmRleCBpcyBub3QgaW4gdGhlIGFkdmFuY2VkIHNlY3Rpb24gKHJlbmRlciBpbiBtYWluIGZsb3cpLiAqL1xuICBpc05vbkFkdmFuY2VkRmllbGQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGYgPSB0aGlzLmR5bmFtaWNGaWVsZHNbaW5kZXhdO1xuICAgIHJldHVybiBmICE9IG51bGwgJiYgKGYuc2VjdGlvbiA/PyAnbWFpbicpICE9PSAnYWR2YW5jZWQnO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChTVEVQX0RFVEFJTFNfRFJBV0VSX1JFRikgcHJpdmF0ZSByZWY6IFN0ZXBEZXRhaWxzRHJhd2VyUmVmLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNURVBfREVUQUlMU19EUkFXRVJfREFUQSkgZGF0YT86IFN0ZXBEZXRhaWxzRHJhd2VyRGF0YVxuICApIHtcbiAgICB0aGlzLnN0ZXAgPSBkYXRhPy5zdGVwID8/ICh7fSBhcyBUZXN0Q2FzZVN0ZXBDb25maWcpO1xuICAgIHRoaXMuc3RlcE51bWJlciA9IGRhdGE/LnN0ZXBOdW1iZXIgPz8gMTtcbiAgICB0aGlzLmR5bmFtaWNGaWVsZHMgPSBkYXRhPy5keW5hbWljRmllbGRzID8/IFtdO1xuICAgIHRoaXMuZHJhd2VyVGl0bGVWYWx1ZSA9IGRhdGE/LnRpdGxlID8/ICdTdGVwIERldGFpbHMnO1xuICAgIHRoaXMucHdMb2NhdG9yID0gZGF0YT8ucHdMb2NhdG9yID8/ICh0aGlzLnN0ZXAgYXMgYW55KS5wd0xvY2F0b3IgPz8gW107XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgdGhpcy5idWlsZEZvcm1Gcm9tRHluYW1pY0ZpZWxkcygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCB8fCB0aGlzLmR5bmFtaWNGaWVsZHNJbnB1dCAhPSBudWxsIHx8IHRoaXMuZHJhd2VyVGl0bGUgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXJJbnB1dCA/PyAodGhpcy5zdGVwRGF0YSBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gMTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBwd0xvY2F0b3IgZnJvbSBzdGVwRGF0YSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSB7XG4gICAgICAgICAgdGhpcy5wd0xvY2F0b3IgPSBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSA/IFsuLi4odGhpcy5zdGVwRGF0YSBhcyBhbnkpLnB3TG9jYXRvcl0gOiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHluYW1pY0ZpZWxkc0lucHV0ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5keW5hbWljRmllbGRzID0gdGhpcy5keW5hbWljRmllbGRzSW5wdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcmF3ZXJUaXRsZSAhPSBudWxsICYmIHRoaXMuZHJhd2VyVGl0bGUgIT09ICcnKSB7XG4gICAgICAgIHRoaXMuZHJhd2VyVGl0bGVWYWx1ZSA9IHRoaXMuZHJhd2VyVGl0bGU7XG4gICAgICB9XG4gICAgICB0aGlzLmJ1aWxkRm9ybUZyb21EeW5hbWljRmllbGRzKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3N0ZXBEYXRhJ10gfHwgY2hhbmdlc1snc3RlcE51bWJlcklucHV0J10gfHwgY2hhbmdlc1snZHluYW1pY0ZpZWxkc0lucHV0J10gfHwgY2hhbmdlc1snZHJhd2VyVGl0bGUnXSkge1xuICAgICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXJJbnB1dCA/PyAodGhpcy5zdGVwRGF0YSBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gMTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBwd0xvY2F0b3IgZnJvbSBzdGVwRGF0YSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSB7XG4gICAgICAgICAgdGhpcy5wd0xvY2F0b3IgPSBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSA/IFsuLi4odGhpcy5zdGVwRGF0YSBhcyBhbnkpLnB3TG9jYXRvcl0gOiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHluYW1pY0ZpZWxkc0lucHV0ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5keW5hbWljRmllbGRzID0gdGhpcy5keW5hbWljRmllbGRzSW5wdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcmF3ZXJUaXRsZSAhPSBudWxsICYmIHRoaXMuZHJhd2VyVGl0bGUgIT09ICcnKSB7XG4gICAgICAgIHRoaXMuZHJhd2VyVGl0bGVWYWx1ZSA9IHRoaXMuZHJhd2VyVGl0bGU7XG4gICAgICB9XG4gICAgICB0aGlzLmJ1aWxkRm9ybUZyb21EeW5hbWljRmllbGRzKCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvcm1Gcm9tRHluYW1pY0ZpZWxkcygpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZHluYW1pY0ZpZWxkcykge1xuICAgICAgY29uc3QgcmF3ID0gdGhpcy5nZXRTdGVwVmFsdWUoZmllbGQua2V5KTtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpICYmIGZpZWxkLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBmaWVsZC5kZWZhdWx0VmFsdWVcbiAgICAgICAgICA6IHJhdztcbiAgICAgIGdyb3VwW2ZpZWxkLmtleV0gPSBbdmFsdWVdO1xuICAgIH1cbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKGdyb3VwKTtcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlID0ge307XG4gIH1cblxuICAvKiogUmVhZCB2YWx1ZSBmcm9tIHN0ZXAgYnkga2V5LiBObyBzdGVwLXR5cGUgbG9naWM7IHN0ZXAgaXMgYSBnZW5lcmljIGtleS12YWx1ZSBiYWcuICovXG4gIGdldFN0ZXBWYWx1ZShrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXAgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByYXcgPSBzdGVwW2tleV07XG4gICAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gbnVsbCkgcmV0dXJuICcnO1xuICAgIHJldHVybiByYXc7XG4gIH1cblxuICAvKiogV3JpdGUgdmFsdWUgdG8gc3RlcCBieSBrZXkuIE5vIHN0ZXAtdHlwZSBsb2dpYzsgc3RlcCBpcyBhIGdlbmVyaWMga2V5LXZhbHVlIGJhZy4gKi9cbiAgc2V0U3RlcFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXAgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBzdGVwW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uU2F2ZUFzVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseUZvcm1Ub1N0ZXAoKTtcbiAgICB0aGlzLnNhdmVBc1RlbXBsYXRlLmVtaXQodGhpcy5zdGVwKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh7IGFjdGlvbjogJ3NhdmVBc1RlbXBsYXRlJywgc3RlcDogdGhpcy5zdGVwIH0pO1xuICB9XG5cbiAgb25TYXZlQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5Rm9ybVRvU3RlcCgpO1xuICAgIHRoaXMuc2F2ZUNoYW5nZXMuZW1pdCh0aGlzLnN0ZXApO1xuICAgIHRoaXMucmVmLmNsb3NlKHsgYWN0aW9uOiAnc2F2ZUNoYW5nZXMnLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Rm9ybVRvU3RlcCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZHluYW1pY0ZpZWxkcykge1xuICAgICAgaWYgKHRoaXMuZm9ybS5jb250YWlucyhmaWVsZC5rZXkpKSB7XG4gICAgICAgIHRoaXMuc2V0U3RlcFZhbHVlKGZpZWxkLmtleSwgdGhpcy5mb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNhdmUgcHdMb2NhdG9yIChPdGhlciBMb2NhdG9ycylcbiAgICAodGhpcy5zdGVwIGFzIGFueSkucHdMb2NhdG9yID0gWy4uLnRoaXMucHdMb2NhdG9yXTtcbiAgfVxuXG4gIGNvcHlMb2NhdG9yKGlucHV0RWxlbWVudDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgIGlucHV0RWxlbWVudC5zZWxlY3QoKTtcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICAgIGlucHV0RWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTtcbiAgICBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGRlbGV0ZUxvY2F0b3IoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5wd0xvY2F0b3IubGVuZ3RoKSB7XG4gICAgICB0aGlzLnB3TG9jYXRvci5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIHNlbGVjdCBjb25maWcgZm9yIGRyb3Bkb3duIGZpZWxkIChjYWNoZWQgcGVyIGtleSkuICovXG4gIGdldFNlbGVjdENvbmZpZyhmaWVsZDogRHluYW1pY0ZpZWxkQ29uZmlnKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKGZpZWxkLnR5cGUgIT09ICdkcm9wZG93bicgfHwgIWZpZWxkLm9wdGlvbnM/Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGVbZmllbGQua2V5XSkgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGVbZmllbGQua2V5XTtcbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IGZpZWxkLm9wdGlvbnMubWFwKChvKSA9PiAoeyB2YWx1ZTogby52YWx1ZSwgbGFiZWw6IG8ubGFiZWwgfSkpO1xuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGVbZmllbGQua2V5XSA9IHtcbiAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgcGxhY2Vob2xkZXI6IGZpZWxkLnBsYWNlaG9sZGVyID8/IGZpZWxkLmxhYmVsLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlW2ZpZWxkLmtleV07XG4gIH1cblxuICAvKiogUmVzb2x2ZWQgaGVhZGVyIHRpdGxlIGZvciB0ZW1wbGF0ZTogQElucHV0IGRyYXdlclRpdGxlID4gaW5qZWN0ZWQgZGF0YS50aXRsZSA+IGRlZmF1bHQuICovXG4gIGdldCBkaXNwbGF5VGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kcmF3ZXJUaXRsZVZhbHVlO1xuICB9XG59XG4iLCI8IS0tIFN0ZXAgRGV0YWlscyBEcmF3ZXIg4oCTIEVkaXQgSW4gRGVwdGguIEZ1bGx5IGR5bmFtaWMgZnJvbSBEeW5hbWljRmllbGRDb25maWdbXS4gLS0+XG48ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLXctZnVsbCBjcWEtbWF4LXctWzQ4MHB4XSBjcWEtYm94LWJvcmRlclwiPlxuICA8IS0tIEhlYWRlcjogYmFjayBjaGV2cm9uLCB0aXRsZSwgU3RlcCBOIHBpbGwsIGNsb3NlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMyBjcWEtcHgtNCBjcWEtcHktNCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtdC1bMTJweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTVFNUU1XVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQmFjaygpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy04IGNxYS1oLTggY3FhLXJvdW5kZWQgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS1iZy1bI0YzRjRGNl0gY3FhLXAtMFwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJCYWNrXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy01ICFjcWEtaC01ICFjcWEtdGV4dC1bMjBweF1cIj5jaGV2cm9uX2xlZnQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTZweF0gY3FhLWxlYWRpbmctWzI0cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS1mbGV4LTFcIj5cbiAgICAgICAge3sgZGlzcGxheVRpdGxlIH19XG4gICAgICA8L2gyPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMi41IGNxYS1weS0xIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0VERTlGRV0gY3FhLXRleHQtWyM3QzNBRURdIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgICAgU3RlcCB7eyBzdGVwTnVtYmVyIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1taW4taC1bMjhweF0gY3FhLW1pbi13LVsyOHB4XSBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtcC0wXCJcbiAgICAgIHRpdGxlPVwiQ2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy01ICFjcWEtaC01ICFjcWEtdGV4dC1bMjBweF1cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdXCI+IDwvZGl2PlxuXG4gIDwhLS0gQ29udGVudDogYWxsIGZpZWxkcyBmcm9tIGR5bmFtaWNGaWVsZHMgYXJyYXkgKG1haW4gKyBjb25zdHJhaW50cyBpbiBvcmRlciwgdGhlbiBhZHZhbmNlZCBncm91cGVkKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtYmctd2hpdGUgY3FhLXB4LTQgY3FhLXB5LTRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZHluYW1pY0ZpZWxkcy5sZW5ndGggPiAwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNFwiPlxuICAgICAgICA8IS0tIEFsbCBub24tYWR2YW5jZWQgZmllbGRzIGluIGFycmF5IG9yZGVyIHdpdGggc2VjdGlvbiBoZWFkZXJzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBkeW5hbWljRmllbGRzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTm9uQWR2YW5jZWRGaWVsZChpKVwiPlxuICAgICAgICAgICAgPHAgKm5nSWY9XCJpc0ZpcnN0SW5TZWN0aW9uKGksICdtYWluJylcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tYi0zIGNxYS1tdC0wXCI+QXR0cmlidXRlczwvcD5cbiAgICAgICAgICAgIDxwICpuZ0lmPVwiaXNGaXJzdEluU2VjdGlvbihpLCAnY29uc3RyYWludHMnKVwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW1iLTIgY3FhLW10LTBcIj5Db25zdHJhaW50czwvcD5cblxuICAgICAgICAgICAgPCEtLSBzdHJpbmcgLyB1bmRlZmluZWQg4oaSIHRleHQgaW5wdXQgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGZpZWxkLnR5cGUgPz8gJ3N0cmluZycpID09PSAnc3RyaW5nJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIG51bWJlciAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnbnVtYmVyJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIHRleHRhcmVhIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICd0ZXh0YXJlYSdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLVsjRkVFMkUyXSBjcWEtdGV4dC1bI0RDMjYyNl0gY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bVwiPlJlcXVpcmVkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdGV4dGFyZWFcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJydcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbcm93c109XCJmaWVsZC5yb3dzIHx8IDRcIlxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiY3FhLXAtMiBjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzIwcHhdXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoZmllbGQua2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDxwICpuZ0lmPVwiZmllbGQudGlwXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTBcIj57eyBmaWVsZC50aXAgfX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBjb2RlIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdjb2RlJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtyb3dzXT1cIjhcIlxuICAgICAgICAgICAgICAgIHJlc2l6ZT1cInZlcnRpY2FsXCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1wLTIgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsyMHB4XVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gYm9vbGVhbiDihpIgdG9nZ2xlIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdib29sZWFuJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wXCI+e3sgZmllbGQubGFiZWwgfX08L3A+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5zdWJMYWJlbFwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5zdWJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZVxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBkcm9wZG93biAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnZHJvcGRvd24nICYmIGdldFNlbGVjdENvbmZpZyhmaWVsZCkgJiYgZm9ybS5jb250YWlucyhmaWVsZC5rZXkpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLXN0ZXAtZGV0YWlscy1kcmF3ZXItc2VsZWN0XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImZvcm1cIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyhmaWVsZCkhXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQWR2YW5jZWQ6IGV4cGFuZGFibGUgKGFsbCBhZHZhbmNlZCBmaWVsZHMgZnJvbSBhcnJheSkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhZHZhbmNlZEZpZWxkcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtcHktMiBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1bI0U1RTdFQl1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VkRXhwYW5kZWQgPSAhYWR2YW5jZWRFeHBhbmRlZFwiPlxuICAgICAgICAgICAgPHNwYW4+QWR2YW5jZWQ8L3NwYW4+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMjBweF0gY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIGV4cGFuZF9sZXNzXG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1wdC0yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBhZHZhbmNlZEZpZWxkc1wiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGZpZWxkLnR5cGUgPz8gJ3N0cmluZycpID09PSAnc3RyaW5nJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoZmllbGQua2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnYm9vbGVhbidcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJmb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM3MzczNzNdXCI+e3sgZmllbGQubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzBBMEEwQV1cIiAqbmdJZj1cImZpZWxkLnN1YkxhYmVsXCI+e3sgZmllbGQuc3ViTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2Ryb3Bkb3duJyAmJiBnZXRTZWxlY3RDb25maWcoZmllbGQpICYmIGZvcm0uY29udGFpbnMoZmllbGQua2V5KVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLXN0ZXAtZGV0YWlscy1kcmF3ZXItc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJmb3JtXCIgW2NvbmZpZ109XCJnZXRTZWxlY3RDb25maWcoZmllbGQpIVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIE90aGVyIExvY2F0b3JzIHNlY3Rpb24gKG1hdGNoaW5nIG9sZCBVSSkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwd0xvY2F0b3IgJiYgcHdMb2NhdG9yLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tYi0zIGNxYS1tdC0wXCI+T3RoZXIgTG9jYXRvcnM8L3A+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbG9jYXRvciBvZiBwd0xvY2F0b3I7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImNxYS1tYi0zXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibG9jYXRvciAhPT0gJydcIiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwibG9jYXRvclwiXG4gICAgICAgICAgICAgICAgI2xvY2F0b3JJbnB1dFxuICAgICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1weC0zIGNxYS1weS0yIGNxYS1wci0yMCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsxNHB4XSBjcWEtYmctd2hpdGVcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAyNnB4O1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvcHlMb2NhdG9yKGxvY2F0b3JJbnB1dClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1sZWZ0LTIgY3FhLXRvcC0xLzIgY3FhLXRyYW5zZm9ybSBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcC0xIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtdGV4dC1bIzM3NDE1MV1cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiQ2xpY2sgdG8gQ29weVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy00ICFjcWEtaC00ICFjcWEtdGV4dC1bMTZweF1cIj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVMb2NhdG9yKGkpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcmlnaHQtMiBjcWEtdG9wLTEvMiBjcWEtdHJhbnNmb3JtIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wLTEgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjREMyNjI2XVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJEZWxldGVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNSAhY3FhLWgtNSAhY3FhLXRleHQtWzIwcHhdXCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxwICpuZ0lmPVwiZHluYW1pY0ZpZWxkcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtdGV4dC1bIzZCNzI4MF1cIj5ObyBmaWVsZHMgY29uZmlndXJlZCBmb3IgdGhpcyBzdGVwLjwvcD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTVFNV1cIj4gPC9kaXY+XG4gIDwhLS0gRm9vdGVyIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1zdGFydCBjcWEtZ2FwLTIgY3FhLXB4LTQgY3FhLXB5LTQgY3FhLWJvcmRlci10IGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1iZy1bI0Y1RjVGNTREXVwiPlxuICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJ0ZXh0XCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ0NhbmNlbCdcIiAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtdGV4dC1bIzM3NDE1MV0nXCI+PC9jcWEtYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+PC9kaXY+XG4gICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ1NhdmUgYXMgVGVtcGxhdGUnXCIgKGNsaWNrZWQpPVwib25TYXZlQXNUZW1wbGF0ZSgpXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjNDE0MTQ2XSdcIj48L2NxYS1idXR0b24+XG4gICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidTYXZlIENoYW5nZXMnXCIgKGNsaWNrZWQpPVwib25TYXZlQ2hhbmdlcygpXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtYmctWyMzRjQzRUVdIGNxYS1ib3JkZXItWyMzRjQzRUVdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBd0IsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRixPQUFPLEVBQUUsd0JBQXdCLEVBQTZDLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBT2pIOzs7O0dBSUc7QUFPSCxNQUFNLE9BQU8sMEJBQTBCO0lBNERyQyxZQUMyQyxHQUF5QixFQUMxRCxFQUFlLEVBQ2YsR0FBc0IsRUFDZ0IsSUFBNEI7UUFIakMsUUFBRyxHQUFILEdBQUcsQ0FBc0I7UUFDMUQsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBOUR0QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ3JELFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2xDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFFekQsYUFBUSxHQUE4QixJQUFJLENBQUM7UUFDM0Msb0JBQWUsR0FBMkIsSUFBSSxDQUFDO1FBQ3hELDZGQUE2RjtRQUNwRix1QkFBa0IsR0FBZ0MsSUFBSSxDQUFDO1FBQ2hFLHdFQUF3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N0MsT0FBTztTQUNSLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELDhGQUE4RjtJQUM5RixJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDOzt1SEFwTlUsMEJBQTBCLGtCQTZEM0IsdUJBQXVCLHlFQUdYLHdCQUF3QjsyR0FoRW5DLDBCQUEwQixzV0NqQ3ZDLHl6WEF5TE07MkZEeEpPLDBCQUEwQjtrQkFOdEMsU0FBUzsrQkFDRSx5QkFBeUIsUUFFN0IsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLG1CQUNiLHVCQUF1QixDQUFDLE1BQU07OzBCQStENUMsTUFBTTsyQkFBQyx1QkFBdUI7OzBCQUc5QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHdCQUF3Qjs0Q0EvRHBDLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUUsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfUkVGLCBTdGVwRGV0YWlsc0RyYXdlclJlZiB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1yZWYnO1xuaW1wb3J0IHsgU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLCBTdGVwRGV0YWlsc0RyYXdlckRhdGEsIER5bmFtaWNGaWVsZENvbmZpZyB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1kYXRhJztcbmltcG9ydCB7IFRlc3RDYXNlU3RlcENvbmZpZyB9IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgdHlwZSB7XG4gIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyxcbiAgU2VsZWN0T3B0aW9uLFxufSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFN0ZXAgRGV0YWlscyBEcmF3ZXIgKEVkaXQgSW4gRGVwdGgpLlxuICogUmVuZGVycyBvbmx5IGZyb20gdGhlIHByb3ZpZGVkIER5bmFtaWNGaWVsZENvbmZpZ1tdOyBubyBmaWx0ZXJpbmcgb3Igc3RlcC10eXBlLWJhc2VkIGZpZWxkIGxvZ2ljLlxuICogRWFjaCBzdGVwIGluc3RhbmNlIHJlY2VpdmVzIGl0cyBvd24gY29tcGxldGUgZmllbGQgY29uZmlndXJhdGlvbi4gR2VuZXJpYyBrZXktYmFzZWQgc3RlcCByZWFkL3dyaXRlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1kZXRhaWxzLWRyYXdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU3RlcERldGFpbHNEcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBPdXRwdXQoKSBzYXZlQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VTdGVwQ29uZmlnPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgc2F2ZUFzVGVtcGxhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlU3RlcENvbmZpZz4oKTtcblxuICBASW5wdXQoKSBzdGVwRGF0YTogVGVzdENhc2VTdGVwQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXJJbnB1dDogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGVuIHByb3ZpZGVkIChlLmcuIFN0b3J5Ym9vayksIHVzZSBpbnN0ZWFkIG9mIFNURVBfREVUQUlMU19EUkFXRVJfREFUQS5keW5hbWljRmllbGRzLiAqL1xuICBASW5wdXQoKSBkeW5hbWljRmllbGRzSW5wdXQ6IER5bmFtaWNGaWVsZENvbmZpZ1tdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCB1c2UgYXMgZHJhd2VyIGhlYWRlciB0aXRsZSAob3ZlcnJpZGVzIGRhdGEudGl0bGUpLiAqL1xuICBASW5wdXQoKSBkcmF3ZXJUaXRsZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnO1xuICBzdGVwTnVtYmVyOiBudW1iZXIgfCBzdHJpbmc7XG4gIGR5bmFtaWNGaWVsZHM6IER5bmFtaWNGaWVsZENvbmZpZ1tdID0gW107XG4gIGRyYXdlclRpdGxlVmFsdWUgPSAnU3RlcCBEZXRhaWxzJztcbiAgYWR2YW5jZWRFeHBhbmRlZCA9IGZhbHNlO1xuICBmb3JtOiBGb3JtR3JvdXA7XG4gIHB3TG9jYXRvcjogc3RyaW5nW10gPSBbXTtcblxuICAvKiogQ2FjaGVkIHNlbGVjdCBjb25maWdzIHBlciBmaWVsZCBrZXkgKHN0YWJsZSByZWZzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uKS4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RDb25maWdDYWNoZTogUmVjb3JkPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IHt9O1xuXG4gIC8qKiBBbGwgZmllbGRzIGZyb20gdGhlIHByb3ZpZGVkIGFycmF5IChzYW1lIHJlZmVyZW5jZTsgdXNlZCBmb3Igc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBpbiB0ZW1wbGF0ZSkuICovXG4gIGdldCBhbGxGaWVsZHMoKTogRHluYW1pY0ZpZWxkQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNGaWVsZHM7XG4gIH1cblxuICAvKiogRmllbGRzIGluIG1haW4gc2VjdGlvbiAoc2VjdGlvbiA9PT0gJ21haW4nIG9yIHVuZGVmaW5lZCkuICovXG4gIGdldCBtYWluRmllbGRzKCk6IER5bmFtaWNGaWVsZENvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRmllbGRzLmZpbHRlcigoZikgPT4gKGYuc2VjdGlvbiA/PyAnbWFpbicpID09PSAnbWFpbicpO1xuICB9XG5cbiAgLyoqIEZpZWxkcyBpbiBjb25zdHJhaW50cyBzZWN0aW9uLiAqL1xuICBnZXQgY29uc3RyYWludHNGaWVsZHMoKTogRHluYW1pY0ZpZWxkQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNGaWVsZHMuZmlsdGVyKChmKSA9PiBmLnNlY3Rpb24gPT09ICdjb25zdHJhaW50cycpO1xuICB9XG5cbiAgLyoqIEZpZWxkcyBpbiBhZHZhbmNlZCBzZWN0aW9uIChpbnNpZGUgZXhwYW5kYWJsZSBibG9jaykuICovXG4gIGdldCBhZHZhbmNlZEZpZWxkcygpOiBEeW5hbWljRmllbGRDb25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY0ZpZWxkcy5maWx0ZXIoKGYpID0+IGYuc2VjdGlvbiA9PT0gJ2FkdmFuY2VkJyk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBmaWVsZCBhdCBpbmRleCBpcyB0aGUgZmlyc3QgaW4gaXRzIHNlY3Rpb24gKGZvciBzaG93aW5nIHNlY3Rpb24gaGVhZGVycykuICovXG4gIGlzRmlyc3RJblNlY3Rpb24oaW5kZXg6IG51bWJlciwgc2VjdGlvbjogJ21haW4nIHwgJ2NvbnN0cmFpbnRzJyB8ICdhZHZhbmNlZCcpOiBib29sZWFuIHtcbiAgICBjb25zdCBmID0gdGhpcy5keW5hbWljRmllbGRzW2luZGV4XTtcbiAgICBpZiAoIWYpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBmU2VjdGlvbiA9IGYuc2VjdGlvbiA/PyAnbWFpbic7XG4gICAgaWYgKGZTZWN0aW9uICE9PSBzZWN0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGluZGV4ID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy5keW5hbWljRmllbGRzW2luZGV4IC0gMV07XG4gICAgcmV0dXJuIChwcmV2Py5zZWN0aW9uID8/ICdtYWluJykgIT09IHNlY3Rpb247XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBmaWVsZCBhdCBpbmRleCBpcyBub3QgaW4gdGhlIGFkdmFuY2VkIHNlY3Rpb24gKHJlbmRlciBpbiBtYWluIGZsb3cpLiAqL1xuICBpc05vbkFkdmFuY2VkRmllbGQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGYgPSB0aGlzLmR5bmFtaWNGaWVsZHNbaW5kZXhdO1xuICAgIHJldHVybiBmICE9IG51bGwgJiYgKGYuc2VjdGlvbiA/PyAnbWFpbicpICE9PSAnYWR2YW5jZWQnO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChTVEVQX0RFVEFJTFNfRFJBV0VSX1JFRikgcHJpdmF0ZSByZWY6IFN0ZXBEZXRhaWxzRHJhd2VyUmVmLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNURVBfREVUQUlMU19EUkFXRVJfREFUQSkgZGF0YT86IFN0ZXBEZXRhaWxzRHJhd2VyRGF0YVxuICApIHtcbiAgICB0aGlzLnN0ZXAgPSBkYXRhPy5zdGVwID8/ICh7fSBhcyBUZXN0Q2FzZVN0ZXBDb25maWcpO1xuICAgIHRoaXMuc3RlcE51bWJlciA9IGRhdGE/LnN0ZXBOdW1iZXIgPz8gMTtcbiAgICB0aGlzLmR5bmFtaWNGaWVsZHMgPSBkYXRhPy5keW5hbWljRmllbGRzID8/IFtdO1xuICAgIHRoaXMuZHJhd2VyVGl0bGVWYWx1ZSA9IGRhdGE/LnRpdGxlID8/ICdTdGVwIERldGFpbHMnO1xuICAgIHRoaXMucHdMb2NhdG9yID0gZGF0YT8ucHdMb2NhdG9yID8/ICh0aGlzLnN0ZXAgYXMgYW55KS5wd0xvY2F0b3IgPz8gW107XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgdGhpcy5idWlsZEZvcm1Gcm9tRHluYW1pY0ZpZWxkcygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCB8fCB0aGlzLmR5bmFtaWNGaWVsZHNJbnB1dCAhPSBudWxsIHx8IHRoaXMuZHJhd2VyVGl0bGUgIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXJJbnB1dCA/PyAodGhpcy5zdGVwRGF0YSBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gMTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBwd0xvY2F0b3IgZnJvbSBzdGVwRGF0YSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSB7XG4gICAgICAgICAgdGhpcy5wd0xvY2F0b3IgPSBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSA/IFsuLi4odGhpcy5zdGVwRGF0YSBhcyBhbnkpLnB3TG9jYXRvcl0gOiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHluYW1pY0ZpZWxkc0lucHV0ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5keW5hbWljRmllbGRzID0gdGhpcy5keW5hbWljRmllbGRzSW5wdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcmF3ZXJUaXRsZSAhPSBudWxsICYmIHRoaXMuZHJhd2VyVGl0bGUgIT09ICcnKSB7XG4gICAgICAgIHRoaXMuZHJhd2VyVGl0bGVWYWx1ZSA9IHRoaXMuZHJhd2VyVGl0bGU7XG4gICAgICB9XG4gICAgICB0aGlzLmJ1aWxkRm9ybUZyb21EeW5hbWljRmllbGRzKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3N0ZXBEYXRhJ10gfHwgY2hhbmdlc1snc3RlcE51bWJlcklucHV0J10gfHwgY2hhbmdlc1snZHluYW1pY0ZpZWxkc0lucHV0J10gfHwgY2hhbmdlc1snZHJhd2VyVGl0bGUnXSkge1xuICAgICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXJJbnB1dCA/PyAodGhpcy5zdGVwRGF0YSBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gMTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBwd0xvY2F0b3IgZnJvbSBzdGVwRGF0YSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSB7XG4gICAgICAgICAgdGhpcy5wd0xvY2F0b3IgPSBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXBEYXRhIGFzIGFueSkucHdMb2NhdG9yKSA/IFsuLi4odGhpcy5zdGVwRGF0YSBhcyBhbnkpLnB3TG9jYXRvcl0gOiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHluYW1pY0ZpZWxkc0lucHV0ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5keW5hbWljRmllbGRzID0gdGhpcy5keW5hbWljRmllbGRzSW5wdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcmF3ZXJUaXRsZSAhPSBudWxsICYmIHRoaXMuZHJhd2VyVGl0bGUgIT09ICcnKSB7XG4gICAgICAgIHRoaXMuZHJhd2VyVGl0bGVWYWx1ZSA9IHRoaXMuZHJhd2VyVGl0bGU7XG4gICAgICB9XG4gICAgICB0aGlzLmJ1aWxkRm9ybUZyb21EeW5hbWljRmllbGRzKCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZvcm1Gcm9tRHluYW1pY0ZpZWxkcygpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZHluYW1pY0ZpZWxkcykge1xuICAgICAgY29uc3QgcmF3ID0gdGhpcy5nZXRTdGVwVmFsdWUoZmllbGQua2V5KTtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpICYmIGZpZWxkLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBmaWVsZC5kZWZhdWx0VmFsdWVcbiAgICAgICAgICA6IHJhdztcbiAgICAgIGdyb3VwW2ZpZWxkLmtleV0gPSBbdmFsdWVdO1xuICAgIH1cbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKGdyb3VwKTtcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlID0ge307XG4gIH1cblxuICAvKiogUmVhZCB2YWx1ZSBmcm9tIHN0ZXAgYnkga2V5LiBObyBzdGVwLXR5cGUgbG9naWM7IHN0ZXAgaXMgYSBnZW5lcmljIGtleS12YWx1ZSBiYWcuICovXG4gIGdldFN0ZXBWYWx1ZShrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXAgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByYXcgPSBzdGVwW2tleV07XG4gICAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gbnVsbCkgcmV0dXJuICcnO1xuICAgIHJldHVybiByYXc7XG4gIH1cblxuICAvKiogV3JpdGUgdmFsdWUgdG8gc3RlcCBieSBrZXkuIE5vIHN0ZXAtdHlwZSBsb2dpYzsgc3RlcCBpcyBhIGdlbmVyaWMga2V5LXZhbHVlIGJhZy4gKi9cbiAgc2V0U3RlcFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXAgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBzdGVwW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uU2F2ZUFzVGVtcGxhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseUZvcm1Ub1N0ZXAoKTtcbiAgICB0aGlzLnNhdmVBc1RlbXBsYXRlLmVtaXQodGhpcy5zdGVwKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh7IGFjdGlvbjogJ3NhdmVBc1RlbXBsYXRlJywgc3RlcDogdGhpcy5zdGVwIH0pO1xuICB9XG5cbiAgb25TYXZlQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGx5Rm9ybVRvU3RlcCgpO1xuICAgIHRoaXMuc2F2ZUNoYW5nZXMuZW1pdCh0aGlzLnN0ZXApO1xuICAgIHRoaXMucmVmLmNsb3NlKHsgYWN0aW9uOiAnc2F2ZUNoYW5nZXMnLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Rm9ybVRvU3RlcCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZHluYW1pY0ZpZWxkcykge1xuICAgICAgaWYgKHRoaXMuZm9ybS5jb250YWlucyhmaWVsZC5rZXkpKSB7XG4gICAgICAgIHRoaXMuc2V0U3RlcFZhbHVlKGZpZWxkLmtleSwgdGhpcy5mb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNhdmUgcHdMb2NhdG9yIChPdGhlciBMb2NhdG9ycylcbiAgICAodGhpcy5zdGVwIGFzIGFueSkucHdMb2NhdG9yID0gWy4uLnRoaXMucHdMb2NhdG9yXTtcbiAgfVxuXG4gIGNvcHlMb2NhdG9yKGlucHV0RWxlbWVudDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgIGlucHV0RWxlbWVudC5zZWxlY3QoKTtcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICAgIGlucHV0RWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTtcbiAgICBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIGRlbGV0ZUxvY2F0b3IoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5wd0xvY2F0b3IubGVuZ3RoKSB7XG4gICAgICB0aGlzLnB3TG9jYXRvci5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIHNlbGVjdCBjb25maWcgZm9yIGRyb3Bkb3duIGZpZWxkIChjYWNoZWQgcGVyIGtleSkuICovXG4gIGdldFNlbGVjdENvbmZpZyhmaWVsZDogRHluYW1pY0ZpZWxkQ29uZmlnKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKGZpZWxkLnR5cGUgIT09ICdkcm9wZG93bicgfHwgIWZpZWxkLm9wdGlvbnM/Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGVbZmllbGQua2V5XSkgcmV0dXJuIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGVbZmllbGQua2V5XTtcbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IGZpZWxkLm9wdGlvbnMubWFwKChvKSA9PiAoeyB2YWx1ZTogby52YWx1ZSwgbGFiZWw6IG8ubGFiZWwgfSkpO1xuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGVbZmllbGQua2V5XSA9IHtcbiAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgcGxhY2Vob2xkZXI6IGZpZWxkLnBsYWNlaG9sZGVyID8/IGZpZWxkLmxhYmVsLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlW2ZpZWxkLmtleV07XG4gIH1cblxuICAvKiogUmVzb2x2ZWQgaGVhZGVyIHRpdGxlIGZvciB0ZW1wbGF0ZTogQElucHV0IGRyYXdlclRpdGxlID4gaW5qZWN0ZWQgZGF0YS50aXRsZSA+IGRlZmF1bHQuICovXG4gIGdldCBkaXNwbGF5VGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kcmF3ZXJUaXRsZVZhbHVlO1xuICB9XG59XG4iLCI8IS0tIFN0ZXAgRGV0YWlscyBEcmF3ZXIg4oCTIEVkaXQgSW4gRGVwdGguIEZ1bGx5IGR5bmFtaWMgZnJvbSBEeW5hbWljRmllbGRDb25maWdbXS4gLS0+XG48ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLXctZnVsbCBjcWEtbWF4LXctWzQ4MHB4XSBjcWEtYm94LWJvcmRlclwiPlxuICA8IS0tIEhlYWRlcjogYmFjayBjaGV2cm9uLCB0aXRsZSwgU3RlcCBOIHBpbGwsIGNsb3NlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMyBjcWEtcHgtMyBjcWEtcHktMiBjcWEtYmctd2hpdGVcIlxuICAgIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFNUU1RTU7XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25CYWNrKClcIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTggY3FhLWgtOCBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtcC0wXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkJhY2tcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk0xOCAyMEwxNCAxNkwxOCAxMlwiIHN0cm9rZT1cIiMwQTBBMEFcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTZweF0gY3FhLWxlYWRpbmctWzE5cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS1mbGV4LTFcIj5cbiAgICAgICAge3sgZGlzcGxheVRpdGxlIH19XG4gICAgICA8L2gyPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktWzJweF0gY3FhLXJvdW5kZWQtWzVweF0gY3FhLWJnLVsjRDhEOUZDXSBjcWEtdGV4dC1bIzA5MEE2MF0gY3FhLXRleHQtWzEycHhdXCI+XG4gICAgICAgIFN0ZXAge3sgc3RlcE51bWJlciB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNsb3NlKClcIlxuICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWluLWgtWzI4cHhdIGNxYS1taW4tdy1bMjhweF0gY3FhLXJvdW5kZWQgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS1iZy1bI0YzRjRGNl0gY3FhLXAtMFwiXG4gICAgICB0aXRsZT1cIkNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMjhcIiBoZWlnaHQ9XCIyOFwiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xOSA5TDkgMTlcIiBzdHJva2U9XCIjNEE1NTY1XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDxwYXRoIGQ9XCJNOSA5TDE5IDE5XCIgc3Ryb2tlPVwiIzRBNTU2NVwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQ29udGVudDogYWxsIGZpZWxkcyBmcm9tIGR5bmFtaWNGaWVsZHMgYXJyYXkgKG1haW4gKyBjb25zdHJhaW50cyBpbiBvcmRlciwgdGhlbiBhZHZhbmNlZCBncm91cGVkKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtYmctd2hpdGUgY3FhLXAtNCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZHluYW1pY0ZpZWxkcy5sZW5ndGggPiAwXCI+XG4gICAgICA8IS0tIEFsbCBub24tYWR2YW5jZWQgZmllbGRzIGluIGFycmF5IG9yZGVyIHdpdGggc2VjdGlvbiBoZWFkZXJzIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZHluYW1pY0ZpZWxkczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNOb25BZHZhbmNlZEZpZWxkKGkpXCI+XG4gICAgICAgICAgPHAgKm5nSWY9XCJpc0ZpcnN0SW5TZWN0aW9uKGksICdtYWluJylcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dFsjMEEwQTBBXSBjcWEtbWItMVwiPkF0dHJpYnV0ZXM8L3A+XG4gICAgICAgICAgPHAgKm5nSWY9XCJpc0ZpcnN0SW5TZWN0aW9uKGksICdjb25zdHJhaW50cycpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHRbIzBBMEEwQV0gY3FhLW1iLTFcIj5Db25zdHJhaW50czwvcD5cblxuICAgICAgICAgIDwhLS0gc3RyaW5nIC8gdW5kZWZpbmVkIOKGkiB0ZXh0IGlucHV0IC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIoZmllbGQudHlwZSA/PyAnc3RyaW5nJykgPT09ICdzdHJpbmcnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzE2MTYxN11cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJydcIiBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIiAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoZmllbGQua2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBudW1iZXIgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdudW1iZXInXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzE2MTYxN11cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCB0eXBlPVwibnVtYmVyXCIgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCIgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gdGV4dGFyZWEgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICd0ZXh0YXJlYSdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLWxlYWRpbmctWzE3cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzE2MTYxN11cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LTAuNSBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0ZFRTJFMl0gY3FhLXRleHQtWyNEQzI2MjZdIGNxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW1cIj5SZXF1aXJlZDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGNxYS1jdXN0b20tdGV4dGFyZWEgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCIgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW3Jvd3NdPVwiZmllbGQucm93cyB8fCA0XCIgY3VzdG9tQ2xhc3M9XCJjcWEtcC0yIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMjBweF1cIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoZmllbGQua2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgICAgICAgICAgPHAgKm5nSWY9XCJmaWVsZC50aXBcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLS1tdC0xLjVcIj57eyBmaWVsZC50aXAgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIGNvZGUgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdjb2RlJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYSBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJydcIiBbdmFsdWVdPVwiZm9ybS5nZXQoZmllbGQua2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIiBbcm93c109XCI4XCIgcmVzaXplPVwidmVydGljYWxcIiBjdXN0b21DbGFzcz1cImNxYS1wLTIgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsyMHB4XVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmb3JtLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIGJvb2xlYW4g4oaSIHRvZ2dsZSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ2Jvb2xlYW4nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMFwiPnt7IGZpZWxkLmxhYmVsIH19PC9wPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnN1YkxhYmVsXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7XG4gICAgICAgICAgICAgICAgZmllbGQuc3ViTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJmb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIGRyb3Bkb3duIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnZHJvcGRvd24nICYmIGdldFNlbGVjdENvbmZpZyhmaWVsZCkgJiYgZm9ybS5jb250YWlucyhmaWVsZC5rZXkpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1zdGVwLWRldGFpbHMtZHJhd2VyLXNlbGVjdFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImZvcm1cIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyhmaWVsZCkhXCI+XG4gICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBBZHZhbmNlZDogZXhwYW5kYWJsZSAoYWxsIGFkdmFuY2VkIGZpZWxkcyBmcm9tIGFycmF5KSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhZHZhbmNlZEZpZWxkcy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtdGV4dC1sZWZ0IGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1weS0yIGNxYS1ib3JkZXItYiBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiXG4gICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VkRXhwYW5kZWQgPSAhYWR2YW5jZWRFeHBhbmRlZFwiPlxuICAgICAgICAgIDxzcGFuPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsyMHB4XSBjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiBbY2xhc3MuY3FhLXJvdGF0ZS0xODBdPVwiIWFkdmFuY2VkRXhwYW5kZWRcIj5cbiAgICAgICAgICAgIGV4cGFuZF9sZXNzXG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJhZHZhbmNlZEV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1wdC0yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgYWR2YW5jZWRGaWVsZHNcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoZmllbGQudHlwZSA/PyAnc3RyaW5nJykgPT09ICdzdHJpbmcnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiIFt2YWx1ZV09XCJmb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ251bWJlcidcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgdHlwZT1cIm51bWJlclwiIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGZpZWxkLmtleSk/LnZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoZmllbGQua2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnYm9vbGVhbidcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJmb3JtLmdldChmaWVsZC5rZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwiZm9ybS5nZXQoZmllbGQua2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNzM3MzczXVwiPnt7IGZpZWxkLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjMEEwQTBBXVwiICpuZ0lmPVwiZmllbGQuc3ViTGFiZWxcIj57eyBmaWVsZC5zdWJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnZHJvcGRvd24nICYmIGdldFNlbGVjdENvbmZpZyhmaWVsZCkgJiYgZm9ybS5jb250YWlucyhmaWVsZC5rZXkpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLXN0ZXAtZGV0YWlscy1kcmF3ZXItc2VsZWN0XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGQubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImZvcm1cIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyhmaWVsZCkhXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gT3RoZXIgTG9jYXRvcnMgc2VjdGlvbiAobWF0Y2hpbmcgb2xkIFVJKSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwd0xvY2F0b3IgJiYgcHdMb2NhdG9yLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWItMyBjcWEtbXQtMFwiPk90aGVyIExvY2F0b3JzPC9wPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBsb2NhdG9yIG9mIHB3TG9jYXRvcjsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiY3FhLW1iLTNcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwibG9jYXRvciAhPT0gJydcIiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbdmFsdWVdPVwibG9jYXRvclwiICNsb2NhdG9ySW5wdXQgcmVhZG9ubHlcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1weC0zIGNxYS1weS0yIGNxYS1wci0yMCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsxNHB4XSBjcWEtYmctd2hpdGVcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctbGVmdDogMjZweDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjb3B5TG9jYXRvcihsb2NhdG9ySW5wdXQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWxlZnQtMiBjcWEtdG9wLTEvMiBjcWEtdHJhbnNmb3JtIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wLTEgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjMzc0MTUxXVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ2xpY2sgdG8gQ29weVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNCAhY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdXCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZUxvY2F0b3IoaSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcmlnaHQtMiBjcWEtdG9wLTEvMiBjcWEtdHJhbnNmb3JtIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wLTEgY3FhLXRleHQtWyM2QjcyODBdIGhvdmVyOmNxYS10ZXh0LVsjREMyNjI2XVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiRGVsZXRlXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy01ICFjcWEtaC01ICFjcWEtdGV4dC1bMjBweF1cIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8cCAqbmdJZj1cImR5bmFtaWNGaWVsZHMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLXRleHQtWyM2QjcyODBdXCI+Tm8gZmllbGRzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgc3RlcC5cbiAgICA8L3A+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdXCI+IDwvZGl2PlxuICA8IS0tIEZvb3RlciAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1zdGFydCBjcWEtZ2FwLTIgY3FhLXB4LTQgY3FhLXB5LTQgY3FhLWJvcmRlci10IGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1iZy13aGl0ZVwiPlxuICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJ0ZXh0XCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ0NhbmNlbCdcIiAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtdGV4dC1bIzM3NDE1MV0nXCI+PC9jcWEtYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+PC9kaXY+XG4gICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ1NhdmUgYXMgVGVtcGxhdGUnXCIgKGNsaWNrZWQpPVwib25TYXZlQXNUZW1wbGF0ZSgpXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjNDE0MTQ2XSdcIj48L2NxYS1idXR0b24+XG4gICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidTYXZlIENoYW5nZXMnXCIgKGNsaWNrZWQpPVwib25TYXZlQ2hhbmdlcygpXCJcbiAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtYmctWyMzRjQzRUVdIGNxYS1ib3JkZXItWyMzRjQzRUVdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
@@ -25,22 +25,22 @@ export class StepDetailsDrawerService {
25
25
  open(data) {
26
26
  if (this.currentRef)
27
27
  return this.currentRef;
28
- const drawerWidth = 480;
28
+ // const drawerWidth = 480;
29
29
  // Always use right-side drawer positioning (same as Element popup)
30
30
  const positionStrategy = this.overlay
31
31
  .position()
32
32
  .global()
33
33
  .right('0')
34
34
  .top('0')
35
- .bottom('0')
36
- .width(`${drawerWidth}px`);
35
+ .bottom('0');
36
+ // .width(`${drawerWidth}px`);
37
37
  const overlayRef = this.overlay.create(new OverlayConfig({
38
38
  hasBackdrop: true,
39
39
  backdropClass: 'cdk-overlay-transparent-backdrop',
40
40
  scrollStrategy: this.overlay.scrollStrategies.block(),
41
41
  positionStrategy,
42
42
  panelClass: ['cqa-step-details-drawer-panel', 'cqa-ui-root'],
43
- width: `${drawerWidth}px`,
43
+ // width: `${drawerWidth}px`,
44
44
  maxWidth: '100vw',
45
45
  height: '100%',
46
46
  }));
@@ -70,4 +70,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
70
70
  type: Injectable,
71
71
  args: [{ providedIn: 'root' }]
72
72
  }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }]; } });
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9zdGVwLWRldGFpbHMtZHJhd2VyL3N0ZXAtZGV0YWlscy1kcmF3ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsd0JBQXdCLEVBQXlCLE1BQU0sNEJBQTRCLENBQUM7OztBQU83Rjs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sd0JBQXdCO0lBR25DLFlBQTZCLE9BQWdCLEVBQW1CLFFBQWtCO1FBQXJELFlBQU8sR0FBUCxPQUFPLENBQVM7UUFBbUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUYxRSxlQUFVLEdBQXlELElBQUksQ0FBQztJQUVLLENBQUM7SUFFdEY7OztPQUdHO0lBQ0gsSUFBSSxDQUNGLElBQTJCO1FBRTNCLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFNUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBRXhCLG1FQUFtRTtRQUNuRSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPO2FBQ2xDLFFBQVEsRUFBRTthQUNWLE1BQU0sRUFBRTthQUNSLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixHQUFHLENBQUMsR0FBRyxDQUFDO2FBQ1IsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUNYLEtBQUssQ0FBQyxHQUFHLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFFN0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3BDLElBQUksYUFBYSxDQUFDO1lBQ2hCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGFBQWEsRUFBRSxrQ0FBa0M7WUFDakQsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO1lBQ3JELGdCQUFnQjtZQUNoQixVQUFVLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxhQUFhLENBQUM7WUFDNUQsS0FBSyxFQUFFLEdBQUcsV0FBVyxJQUFJO1lBQ3pCLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUNILENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxJQUFJLG9CQUFvQixDQUEwQixVQUFVLENBQUMsQ0FBQztRQUNoRixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNyQixTQUFTLEVBQUU7Z0JBQ1QsRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtnQkFDekQsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTthQUN0RDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLDBCQUEwQixFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRixVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLFVBQVU7YUFDUCxhQUFhLEVBQUU7YUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQzthQUN6RSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFMUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzs7cUhBM0RVLHdCQUF3Qjt5SEFBeEIsd0JBQXdCLGNBRFgsTUFBTTsyRkFDbkIsd0JBQXdCO2tCQURwQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUZXN0Q2FzZVN0ZXBDb25maWcgfSBmcm9tICcuLi90ZXN0LWNhc2Utc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHsgU3RlcERldGFpbHNEcmF3ZXJDb21wb25lbnQgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN0ZXBEZXRhaWxzRHJhd2VyUmVmIH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLXJlZic7XG5pbXBvcnQgeyBTVEVQX0RFVEFJTFNfRFJBV0VSX1JFRiB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1yZWYnO1xuaW1wb3J0IHsgU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLCBTdGVwRGV0YWlsc0RyYXdlckRhdGEgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItZGF0YSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcERldGFpbHNEcmF3ZXJSZXN1bHQge1xuICBhY3Rpb246ICdzYXZlQ2hhbmdlcycgfCAnc2F2ZUFzVGVtcGxhdGUnIHwgJ2NhbmNlbCc7XG4gIHN0ZXA/OiBUZXN0Q2FzZVN0ZXBDb25maWc7XG59XG5cbi8qKlxuICogT3BlbnMgdGhlIFN0ZXAgRGV0YWlscyBEcmF3ZXIgKEVkaXQgSW4gRGVwdGgpIGFzIGEgcmlnaHQtc2lkZSBkcmF3ZXIgb3ZlcmxheS5cbiAqIE1hdGNoZXMgdGhlIGJlaGF2aW9yIG9mIEVsZW1lbnQgcG9wdXAgLSBvcGVucyBhcyBhIHJpZ2h0LXNpZGUgZHJhd2VyIHBhbmVsLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFN0ZXBEZXRhaWxzRHJhd2VyU2VydmljZSB7XG4gIHByaXZhdGUgY3VycmVudFJlZjogU3RlcERldGFpbHNEcmF3ZXJSZWY8U3RlcERldGFpbHNEcmF3ZXJSZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvdmVybGF5OiBPdmVybGF5LCBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3Rvcikge31cblxuICAvKipcbiAgICogT3BlbnMgdGhlIFN0ZXAgRGV0YWlscyBEcmF3ZXIgYXMgYSByaWdodC1zaWRlIGRyYXdlciBvdmVybGF5LlxuICAgKiBAcGFyYW0gZGF0YSBTdGVwIGRldGFpbHMgZHJhd2VyIGRhdGFcbiAgICovXG4gIG9wZW4oXG4gICAgZGF0YTogU3RlcERldGFpbHNEcmF3ZXJEYXRhXG4gICk6IFN0ZXBEZXRhaWxzRHJhd2VyUmVmPFN0ZXBEZXRhaWxzRHJhd2VyUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuY3VycmVudFJlZikgcmV0dXJuIHRoaXMuY3VycmVudFJlZjtcblxuICAgIGNvbnN0IGRyYXdlcldpZHRoID0gNDgwO1xuXG4gICAgLy8gQWx3YXlzIHVzZSByaWdodC1zaWRlIGRyYXdlciBwb3NpdGlvbmluZyAoc2FtZSBhcyBFbGVtZW50IHBvcHVwKVxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlcbiAgICAgIC5wb3NpdGlvbigpXG4gICAgICAuZ2xvYmFsKClcbiAgICAgIC5yaWdodCgnMCcpXG4gICAgICAudG9wKCcwJylcbiAgICAgIC5ib3R0b20oJzAnKVxuICAgICAgLndpZHRoKGAke2RyYXdlcldpZHRofXB4YCk7XG5cbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgIG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcsXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ibG9jaygpLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgICBwYW5lbENsYXNzOiBbJ2NxYS1zdGVwLWRldGFpbHMtZHJhd2VyLXBhbmVsJywgJ2NxYS11aS1yb290J10sXG4gICAgICAgIHdpZHRoOiBgJHtkcmF3ZXJXaWR0aH1weGAsXG4gICAgICAgIG1heFdpZHRoOiAnMTAwdncnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGRyYXdlclJlZiA9IG5ldyBTdGVwRGV0YWlsc0RyYXdlclJlZjxTdGVwRGV0YWlsc0RyYXdlclJlc3VsdD4ob3ZlcmxheVJlZik7XG4gICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogU1RFUF9ERVRBSUxTX0RSQVdFUl9SRUYsIHVzZVZhbHVlOiBkcmF3ZXJSZWYgfSxcbiAgICAgICAgeyBwcm92aWRlOiBTVEVQX0RFVEFJTFNfRFJBV0VSX0RBVEEsIHVzZVZhbHVlOiBkYXRhIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChTdGVwRGV0YWlsc0RyYXdlckNvbXBvbmVudCwgdW5kZWZpbmVkLCBpbmplY3Rvcik7XG4gICAgb3ZlcmxheVJlZi5hdHRhY2gocG9ydGFsKTtcblxuICAgIHRoaXMuY3VycmVudFJlZiA9IGRyYXdlclJlZjtcbiAgICBkcmF3ZXJSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4geyB0aGlzLmN1cnJlbnRSZWYgPSBudWxsOyB9KTtcbiAgICBvdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gZHJhd2VyUmVmLmNsb3NlKHsgYWN0aW9uOiAnY2FuY2VsJyB9KSk7XG4gICAgb3ZlcmxheVJlZlxuICAgICAgLmtleWRvd25FdmVudHMoKVxuICAgICAgLnBpcGUoZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiBlLmtleSA9PT0gJ0VzY2FwZScgfHwgZS5rZXkgPT09ICdFc2MnKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gZHJhd2VyUmVmLmNsb3NlKHsgYWN0aW9uOiAnY2FuY2VsJyB9KSk7XG5cbiAgICByZXR1cm4gZHJhd2VyUmVmO1xuICB9XG59XG4iXX0=
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9zdGVwLWRldGFpbHMtZHJhd2VyL3N0ZXAtZGV0YWlscy1kcmF3ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsd0JBQXdCLEVBQXlCLE1BQU0sNEJBQTRCLENBQUM7OztBQU83Rjs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sd0JBQXdCO0lBR25DLFlBQTZCLE9BQWdCLEVBQW1CLFFBQWtCO1FBQXJELFlBQU8sR0FBUCxPQUFPLENBQVM7UUFBbUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUYxRSxlQUFVLEdBQXlELElBQUksQ0FBQztJQUVLLENBQUM7SUFFdEY7OztPQUdHO0lBQ0gsSUFBSSxDQUNGLElBQTJCO1FBRTNCLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFNUMsMkJBQTJCO1FBRTNCLG1FQUFtRTtRQUNuRSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPO2FBQ2xDLFFBQVEsRUFBRTthQUNWLE1BQU0sRUFBRTthQUNSLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixHQUFHLENBQUMsR0FBRyxDQUFDO2FBQ1IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ1osOEJBQThCO1FBRWhDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNwQyxJQUFJLGFBQWEsQ0FBQztZQUNoQixXQUFXLEVBQUUsSUFBSTtZQUNqQixhQUFhLEVBQUUsa0NBQWtDO1lBQ2pELGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRTtZQUNyRCxnQkFBZ0I7WUFDaEIsVUFBVSxFQUFFLENBQUMsK0JBQStCLEVBQUUsYUFBYSxDQUFDO1lBQzVELDZCQUE2QjtZQUM3QixRQUFRLEVBQUUsT0FBTztZQUNqQixNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUMsQ0FDSCxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxvQkFBb0IsQ0FBMEIsVUFBVSxDQUFDLENBQUM7UUFDaEYsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDckIsU0FBUyxFQUFFO2dCQUNULEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7Z0JBQ3pELEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7YUFDdEQ7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQywwQkFBMEIsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEYsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRixVQUFVO2FBQ1AsYUFBYSxFQUFFO2FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7YUFDekUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTFELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7O3FIQTNEVSx3QkFBd0I7eUhBQXhCLHdCQUF3QixjQURYLE1BQU07MkZBQ25CLHdCQUF3QjtrQkFEcEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVGVzdENhc2VTdGVwQ29uZmlnIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFN0ZXBEZXRhaWxzRHJhd2VyQ29tcG9uZW50IH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdGVwRGV0YWlsc0RyYXdlclJlZiB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1yZWYnO1xuaW1wb3J0IHsgU1RFUF9ERVRBSUxTX0RSQVdFUl9SRUYgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItcmVmJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfREFUQSwgU3RlcERldGFpbHNEcmF3ZXJEYXRhIH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLWRhdGEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBEZXRhaWxzRHJhd2VyUmVzdWx0IHtcbiAgYWN0aW9uOiAnc2F2ZUNoYW5nZXMnIHwgJ3NhdmVBc1RlbXBsYXRlJyB8ICdjYW5jZWwnO1xuICBzdGVwPzogVGVzdENhc2VTdGVwQ29uZmlnO1xufVxuXG4vKipcbiAqIE9wZW5zIHRoZSBTdGVwIERldGFpbHMgRHJhd2VyIChFZGl0IEluIERlcHRoKSBhcyBhIHJpZ2h0LXNpZGUgZHJhd2VyIG92ZXJsYXkuXG4gKiBNYXRjaGVzIHRoZSBiZWhhdmlvciBvZiBFbGVtZW50IHBvcHVwIC0gb3BlbnMgYXMgYSByaWdodC1zaWRlIGRyYXdlciBwYW5lbC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTdGVwRGV0YWlsc0RyYXdlclNlcnZpY2Uge1xuICBwcml2YXRlIGN1cnJlbnRSZWY6IFN0ZXBEZXRhaWxzRHJhd2VyUmVmPFN0ZXBEZXRhaWxzRHJhd2VyUmVzdWx0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheTogT3ZlcmxheSwgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBTdGVwIERldGFpbHMgRHJhd2VyIGFzIGEgcmlnaHQtc2lkZSBkcmF3ZXIgb3ZlcmxheS5cbiAgICogQHBhcmFtIGRhdGEgU3RlcCBkZXRhaWxzIGRyYXdlciBkYXRhXG4gICAqL1xuICBvcGVuKFxuICAgIGRhdGE6IFN0ZXBEZXRhaWxzRHJhd2VyRGF0YVxuICApOiBTdGVwRGV0YWlsc0RyYXdlclJlZjxTdGVwRGV0YWlsc0RyYXdlclJlc3VsdD4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRSZWYpIHJldHVybiB0aGlzLmN1cnJlbnRSZWY7XG5cbiAgICAvLyBjb25zdCBkcmF3ZXJXaWR0aCA9IDQ4MDtcblxuICAgIC8vIEFsd2F5cyB1c2UgcmlnaHQtc2lkZSBkcmF3ZXIgcG9zaXRpb25pbmcgKHNhbWUgYXMgRWxlbWVudCBwb3B1cClcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmdsb2JhbCgpXG4gICAgICAucmlnaHQoJzAnKVxuICAgICAgLnRvcCgnMCcpXG4gICAgICAuYm90dG9tKCcwJylcbiAgICAgIC8vIC53aWR0aChgJHtkcmF3ZXJXaWR0aH1weGApO1xuXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICBiYWNrZHJvcENsYXNzOiAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneSxcbiAgICAgICAgcGFuZWxDbGFzczogWydjcWEtc3RlcC1kZXRhaWxzLWRyYXdlci1wYW5lbCcsICdjcWEtdWktcm9vdCddLFxuICAgICAgICAvLyB3aWR0aDogYCR7ZHJhd2VyV2lkdGh9cHhgLFxuICAgICAgICBtYXhXaWR0aDogJzEwMHZ3JyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBkcmF3ZXJSZWYgPSBuZXcgU3RlcERldGFpbHNEcmF3ZXJSZWY8U3RlcERldGFpbHNEcmF3ZXJSZXN1bHQ+KG92ZXJsYXlSZWYpO1xuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvcixcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IFNURVBfREVUQUlMU19EUkFXRVJfUkVGLCB1c2VWYWx1ZTogZHJhd2VyUmVmIH0sXG4gICAgICAgIHsgcHJvdmlkZTogU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLCB1c2VWYWx1ZTogZGF0YSB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoU3RlcERldGFpbHNEcmF3ZXJDb21wb25lbnQsIHVuZGVmaW5lZCwgaW5qZWN0b3IpO1xuICAgIG92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG5cbiAgICB0aGlzLmN1cnJlbnRSZWYgPSBkcmF3ZXJSZWY7XG4gICAgZHJhd2VyUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5jdXJyZW50UmVmID0gbnVsbDsgfSk7XG4gICAgb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IGRyYXdlclJlZi5jbG9zZSh7IGFjdGlvbjogJ2NhbmNlbCcgfSkpO1xuICAgIG92ZXJsYXlSZWZcbiAgICAgIC5rZXlkb3duRXZlbnRzKClcbiAgICAgIC5waXBlKGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5ID09PSAnRXNjJykpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IGRyYXdlclJlZi5jbG9zZSh7IGFjdGlvbjogJ2NhbmNlbCcgfSkpO1xuXG4gICAgcmV0dXJuIGRyYXdlclJlZjtcbiAgfVxufVxuIl19