@churchillliving/se-ui-toolkit 6.54.441 → 6.54.442
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.
- package/esm2022/lib/components/base/form/form.component.mjs +48 -17
- package/esm2022/lib/components/base/splitter/splitter.compnent.mjs +2 -2
- package/fesm2022/churchillliving-se-ui-toolkit.mjs +47 -16
- package/fesm2022/churchillliving-se-ui-toolkit.mjs.map +1 -1
- package/lib/components/base/form/form.component.d.ts +3 -1
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@ import { EPermissionType } from '../../../models/user-info.model';
|
|
|
5
5
|
import * as utilities from '../../../services/utilities.service';
|
|
6
6
|
import { IframeComponent } from '../iframe/iframe.component';
|
|
7
7
|
import { interval } from 'rxjs';
|
|
8
|
-
import { draggableDialog } from '../../../services/utilities.service';
|
|
8
|
+
import { currentUrl, draggableDialog } from '../../../services/utilities.service';
|
|
9
9
|
import { take } from 'rxjs/operators';
|
|
10
10
|
import * as i0 from "@angular/core";
|
|
11
11
|
import * as i1 from "../../../services/authentication.service";
|
|
@@ -75,6 +75,7 @@ export class FormComponent {
|
|
|
75
75
|
this.hideCancelButton = false;
|
|
76
76
|
this.formButtons = [];
|
|
77
77
|
this.loading = false;
|
|
78
|
+
this.modelSplitScreen = false;
|
|
78
79
|
this.saveForm = new EventEmitter();
|
|
79
80
|
this.cancelForm = new EventEmitter();
|
|
80
81
|
this.dropDownChangeEvent = new EventEmitter();
|
|
@@ -95,8 +96,17 @@ export class FormComponent {
|
|
|
95
96
|
// apply checked/unChecked prop for CheckBox of the Form
|
|
96
97
|
this.checked = true;
|
|
97
98
|
this.unChecked = false;
|
|
99
|
+
this.dynamicFormId = "se-form-component-div";
|
|
98
100
|
}
|
|
99
101
|
ngOnInit() {
|
|
102
|
+
this.gridService.incrementCalls();
|
|
103
|
+
if (this.gridService.getNumberOfCalls() === 1) {
|
|
104
|
+
this.dynamicFormId = 'se-form-component-div';
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
this.dynamicFormId = `Form_${currentUrl()}_${this.gridService.getNumberOfCalls()}`;
|
|
108
|
+
}
|
|
109
|
+
this.renderer2.addClass(this.el.nativeElement, this.dynamicFormId);
|
|
100
110
|
}
|
|
101
111
|
// browser tab close event
|
|
102
112
|
beforeunloadHandler(event) {
|
|
@@ -322,9 +332,6 @@ export class FormComponent {
|
|
|
322
332
|
* Subscribes to the events passed to the components
|
|
323
333
|
* Finally forces Angular to detech changes
|
|
324
334
|
*/
|
|
325
|
-
loadSplitView() {
|
|
326
|
-
//if should dynmically create component instead of ngIf in the html for split component
|
|
327
|
-
}
|
|
328
335
|
loadDynamicComponents() {
|
|
329
336
|
this.componentsList = [];
|
|
330
337
|
this.form?.formSections?.forEach((formSection) => {
|
|
@@ -452,16 +459,40 @@ export class FormComponent {
|
|
|
452
459
|
}
|
|
453
460
|
listenToSplitScreenChange() {
|
|
454
461
|
utilities.onScreenSplitChange().subscribe(res => {
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
462
|
+
let lookupModal = document.getElementsByClassName('p-dialog')[0];
|
|
463
|
+
if (lookupModal) {
|
|
464
|
+
this.seFormObj = lookupModal ? lookupModal?.querySelector(`#${this.dynamicFormId}`) : null;
|
|
465
|
+
if (this.seFormObj && this.seFormObj['nativeElement'] === undefined) {
|
|
466
|
+
this.seFormObj['nativeElement'] = this.seFormObj;
|
|
467
|
+
this.panelInfo = {};
|
|
468
|
+
this.panelInfo.existingCopmonent = this.seFormObj;
|
|
469
|
+
this.panelInfo.panelComponent = res.panelComponent;
|
|
470
|
+
this.splitScreen = true;
|
|
471
|
+
this.modelSplitScreen = true;
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
if (this.seFormObj) {
|
|
475
|
+
this.panelInfo = {};
|
|
476
|
+
this.panelInfo.existingCopmonent = this.seFormObj;
|
|
477
|
+
this.panelInfo.panelComponent = res.panelComponent;
|
|
478
|
+
this.splitScreen = true;
|
|
479
|
+
this.modelSplitScreen = true;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
this.panelInfo = {};
|
|
485
|
+
this.panelInfo.panelComponent = res.panelComponent;
|
|
486
|
+
this.panelInfo.configData = res.configData;
|
|
487
|
+
this.panelInfo.existingCopmonent = this.viewContainerFormRef;
|
|
488
|
+
this.splitScreen = true;
|
|
489
|
+
this.modelSplitScreen = false;
|
|
490
|
+
const saveButton = document.querySelector('.form-save-button');
|
|
491
|
+
if (saveButton) {
|
|
492
|
+
saveButton.classList?.add('p-save-button');
|
|
493
|
+
}
|
|
494
|
+
this.appendViewContainerToDiv();
|
|
463
495
|
}
|
|
464
|
-
this.appendViewContainerToDiv();
|
|
465
496
|
});
|
|
466
497
|
}
|
|
467
498
|
closePanel() {
|
|
@@ -473,7 +504,7 @@ export class FormComponent {
|
|
|
473
504
|
this.appendViewContainerToDiv();
|
|
474
505
|
}
|
|
475
506
|
appendViewContainerToDiv() {
|
|
476
|
-
let formContainerElement = this.
|
|
507
|
+
let formContainerElement = this.modelSplitScreen ? this.seFormObj?.nativeElement : this.viewContainerFormRef.nativeElement;
|
|
477
508
|
this.ngZone.onStable
|
|
478
509
|
.pipe(take(1))
|
|
479
510
|
.subscribe(() => {
|
|
@@ -1443,11 +1474,11 @@ export class FormComponent {
|
|
|
1443
1474
|
overlayPanel?.hide();
|
|
1444
1475
|
}
|
|
1445
1476
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormComponent, deps: [{ token: i1.AuthenticationService }, { token: i2.FormService }, { token: i3.AlertService }, { token: i4.DialogService }, { token: i0.ComponentFactoryResolver }, { token: i5.HyperlinkService }, { token: i0.ChangeDetectorRef }, { token: i6.Router }, { token: i0.ElementRef }, { token: i7.DatePipe }, { token: i8.GridService }, { token: i9.PageLoggerService }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1446
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: FormComponent, selector: "se-form", inputs: { stickyActions: "stickyActions", form: "form", saveButtonLabel: "saveButtonLabel", cancelButtonLabel: "cancelButtonLabel", hideSaveButton: "hideSaveButton", hideCancelButton: "hideCancelButton", formButtons: "formButtons", loading: "loading", activeTestMode: "activeTestMode" }, outputs: { saveForm: "saveForm", cancelForm: "cancelForm", dropDownChangeEvent: "dropDownChangeEvent", sectionClickedEvent: "sectionClickedEvent" }, host: { listeners: { "window:beforeunload": "beforeunloadHandler($event)" } }, viewQueries: [{ propertyName: "panelOverlayViewContainer", first: true, predicate: ["viewContainerRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "viewContainerFormRef", first: true, predicate: ["viewContainerFormRef"], descendants: true }, { propertyName: "getTargetedFormDiv", first: true, predicate: ["appendForm"], descendants: true }, { propertyName: "dynamicComponentContainer", predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingComponent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n <!--Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control\n [formField]=\"headerField\"\n (changeEvent)=\"onChangeEvent($event)\"\n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" \n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n <!-- Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control \n [formField]=\"formField\"\n (changeEvent)=\"onChangeEvent($event)\" \n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>\n<div *ngIf=\"!splitScreen\">\n <div #appendForm></div>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i10.Header, selector: "p-header" }, { kind: "directive", type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i11.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i12.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i13.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration"] }, { kind: "component", type: i14.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i14.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "component", type: i15.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "component", type: i16.OverlayPanel, selector: "p-overlayPanel", inputs: ["dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i17.TextInputComponent, selector: "input-control", inputs: ["field"], outputs: ["changePassword", "changeEvent", "clickEvent", "focusEvent"] }, { kind: "component", type: i18.NumericInputComponent, selector: "numeric-control", inputs: ["field"], outputs: ["changeEvent", "selectLookup", "focusOutEvent"] }, { kind: "component", type: i19.CheckboxComponent, selector: "checkbox-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i20.PasswordComponent, selector: "password-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i21.SpacerControlComponent, selector: "spacer-control", inputs: ["formField"] }, { kind: "component", type: i22.TextAreaComponent, selector: "textArea-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i23.CalendarComponent, selector: "calendar-control", inputs: ["defaultDate", "calendarFormat", "formField"], outputs: ["ngModelChange", "onClick", "onFocusOut", "onShow", "onInput"] }, { kind: "component", type: i24.DropdownControlComponent, selector: "dropdown-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "keyupTab"] }, { kind: "component", type: i25.AutoCompleteControlComponent, selector: "autoComplete-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "completeMethod"] }, { kind: "component", type: i26.MultiSelectControlComponent, selector: "multiselect-control", inputs: ["formField"], outputs: ["onChange", "focusOutEvent"] }, { kind: "component", type: i27.HyperlinkControlComponent, selector: "hyperlink-control", inputs: ["formField"], outputs: ["onHyperlinkDialogClick", "onClick", "iframLoadEvent"] }, { kind: "component", type: i28.LookupControlComponent, selector: "lookup-control", inputs: ["formField"], outputs: ["onClick", "onClearLookupValue", "keyupTab"] }, { kind: "component", type: i29.SelectButtonControlComponent, selector: "select-button-control", inputs: ["formField"], outputs: ["onChange", "onFocusOut"] }, { kind: "component", type: i30.NoteDetailControlComponent, selector: "note-detail-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i31.SectionHeaderControlComponent, selector: "section-header-control", inputs: ["formField"] }, { kind: "component", type: i32.AddButtonControlComponent, selector: "add-button-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i33.InputSwitchControlComponent, selector: "Input-switch-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i34.LabelControlComponent, selector: "label-control", inputs: ["formField", "overlayPanel", "labelDisplay"], outputs: ["onMouseEnter", "onMouseLeave", "onClick", "onLoadLabelControlIFrameClick", "onSelectLookupLabelClick"] }, { kind: "component", type: i35.FileUploadComponent, selector: "se-file-upload", inputs: ["acceptFileTypes", "allowMultiple", "fields", "isAzureUpload"], outputs: ["fileUrl", "uploadFileOnReturn"] }, { kind: "component", type: i36.CardComponent, selector: "se-card", inputs: ["data", "width", "height", "card", "setCardData"], outputs: ["selectedCard"] }, { kind: "component", type: i37.GenerateReportBtnComponent, selector: "se-generate-report-btn", inputs: ["repInfo", "mappedFields", "label", "icon", "params", "class", "reportHeader", "reportFooter", "reportType", "showDialog", "form"] }, { kind: "component", type: i38.SplitterComponent, selector: "se-splitter", inputs: ["panelComponent", "existingComponent", "configData"], outputs: ["closePanelEmitter"] }, { kind: "component", type: i39.EditorControlComponent, selector: "se-editor-control", inputs: ["formField"], outputs: ["changeEvent", "clickEvent", "focusEvent"] }] }); }
|
|
1477
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: FormComponent, selector: "se-form", inputs: { stickyActions: "stickyActions", form: "form", saveButtonLabel: "saveButtonLabel", cancelButtonLabel: "cancelButtonLabel", hideSaveButton: "hideSaveButton", hideCancelButton: "hideCancelButton", formButtons: "formButtons", loading: "loading", activeTestMode: "activeTestMode" }, outputs: { saveForm: "saveForm", cancelForm: "cancelForm", dropDownChangeEvent: "dropDownChangeEvent", sectionClickedEvent: "sectionClickedEvent" }, host: { listeners: { "window:beforeunload": "beforeunloadHandler($event)" } }, viewQueries: [{ propertyName: "panelOverlayViewContainer", first: true, predicate: ["viewContainerRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "viewContainerFormRef", first: true, predicate: ["viewContainerFormRef"], descendants: true }, { propertyName: "getTargetedFormDiv", first: true, predicate: ["appendForm"], descendants: true }, { propertyName: "dynamicComponentContainer", predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingComponent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div [id]=\"dynamicFormId\" #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n <!--Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control\n [formField]=\"headerField\"\n (changeEvent)=\"onChangeEvent($event)\"\n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" \n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n <!-- Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control \n [formField]=\"formField\"\n (changeEvent)=\"onChangeEvent($event)\" \n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>\n<div *ngIf=\"!splitScreen\">\n <div #appendForm></div>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i10.Header, selector: "p-header" }, { kind: "directive", type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i11.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i12.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i13.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration"] }, { kind: "component", type: i14.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i14.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "component", type: i15.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "component", type: i16.OverlayPanel, selector: "p-overlayPanel", inputs: ["dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i17.TextInputComponent, selector: "input-control", inputs: ["field"], outputs: ["changePassword", "changeEvent", "clickEvent", "focusEvent"] }, { kind: "component", type: i18.NumericInputComponent, selector: "numeric-control", inputs: ["field"], outputs: ["changeEvent", "selectLookup", "focusOutEvent"] }, { kind: "component", type: i19.CheckboxComponent, selector: "checkbox-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i20.PasswordComponent, selector: "password-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i21.SpacerControlComponent, selector: "spacer-control", inputs: ["formField"] }, { kind: "component", type: i22.TextAreaComponent, selector: "textArea-control", inputs: ["formField"], outputs: ["onChange", "onClick", "onFocusOut"] }, { kind: "component", type: i23.CalendarComponent, selector: "calendar-control", inputs: ["defaultDate", "calendarFormat", "formField"], outputs: ["ngModelChange", "onClick", "onFocusOut", "onShow", "onInput"] }, { kind: "component", type: i24.DropdownControlComponent, selector: "dropdown-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "keyupTab"] }, { kind: "component", type: i25.AutoCompleteControlComponent, selector: "autoComplete-control", inputs: ["formField"], outputs: ["onChange", "onClick", "focusOutEvent", "completeMethod"] }, { kind: "component", type: i26.MultiSelectControlComponent, selector: "multiselect-control", inputs: ["formField"], outputs: ["onChange", "focusOutEvent"] }, { kind: "component", type: i27.HyperlinkControlComponent, selector: "hyperlink-control", inputs: ["formField"], outputs: ["onHyperlinkDialogClick", "onClick", "iframLoadEvent"] }, { kind: "component", type: i28.LookupControlComponent, selector: "lookup-control", inputs: ["formField"], outputs: ["onClick", "onClearLookupValue", "keyupTab"] }, { kind: "component", type: i29.SelectButtonControlComponent, selector: "select-button-control", inputs: ["formField"], outputs: ["onChange", "onFocusOut"] }, { kind: "component", type: i30.NoteDetailControlComponent, selector: "note-detail-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i31.SectionHeaderControlComponent, selector: "section-header-control", inputs: ["formField"] }, { kind: "component", type: i32.AddButtonControlComponent, selector: "add-button-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i33.InputSwitchControlComponent, selector: "Input-switch-control-control", inputs: ["formField"], outputs: ["onClick"] }, { kind: "component", type: i34.LabelControlComponent, selector: "label-control", inputs: ["formField", "overlayPanel", "labelDisplay"], outputs: ["onMouseEnter", "onMouseLeave", "onClick", "onLoadLabelControlIFrameClick", "onSelectLookupLabelClick"] }, { kind: "component", type: i35.FileUploadComponent, selector: "se-file-upload", inputs: ["acceptFileTypes", "allowMultiple", "fields", "isAzureUpload"], outputs: ["fileUrl", "uploadFileOnReturn"] }, { kind: "component", type: i36.CardComponent, selector: "se-card", inputs: ["data", "width", "height", "card", "setCardData"], outputs: ["selectedCard"] }, { kind: "component", type: i37.GenerateReportBtnComponent, selector: "se-generate-report-btn", inputs: ["repInfo", "mappedFields", "label", "icon", "params", "class", "reportHeader", "reportFooter", "reportType", "showDialog", "form"] }, { kind: "component", type: i38.SplitterComponent, selector: "se-splitter", inputs: ["panelComponent", "existingComponent", "configData"], outputs: ["closePanelEmitter"] }, { kind: "component", type: i39.EditorControlComponent, selector: "se-editor-control", inputs: ["formField"], outputs: ["changeEvent", "clickEvent", "focusEvent"] }] }); }
|
|
1447
1478
|
}
|
|
1448
1479
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormComponent, decorators: [{
|
|
1449
1480
|
type: Component,
|
|
1450
|
-
args: [{ selector: 'se-form', template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingComponent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n <!--Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control\n [formField]=\"headerField\"\n (changeEvent)=\"onChangeEvent($event)\"\n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" \n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n <!-- Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control \n [formField]=\"formField\"\n (changeEvent)=\"onChangeEvent($event)\" \n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>\n<div *ngIf=\"!splitScreen\">\n <div #appendForm></div>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"] }]
|
|
1481
|
+
args: [{ selector: 'se-form', template: "<se-splitter \n *ngIf=\"splitScreen\"\n [existingComponent]=\"panelInfo.existingCopmonent\" \n [panelComponent]=\"panelInfo.panelComponent\" \n [configData]=\"panelInfo.configData\" \n (closePanelEmitter)=\"closePanel()\"\n></se-splitter>\n<p-confirmDialog [style]=\"{ width: '50vw' }\" key=\"cancelButton\"></p-confirmDialog>\n<div [id]=\"dynamicFormId\" #viewContainerFormRef>\n <form *ngIf=\"!isFormHidden && form\">\n <div *ngIf=\"loading\">\n <p-progressSpinner class=\"progress-spinner p-progress-spinner-circle custom-spinner\"></p-progressSpinner>\n </div>\n <div class=\"flex-wrap\">\n <span [ngClass]=\"{ 'fixed-height': stickyActions }\">\n <div *ngFor=\"let formSection of form.formSections\" [class]=\"!formSection.hidden ? 'card w-100' : ''\">\n <span (click)=\"clickedSection(formSection)\">\n <div *ngIf=\"!formSection ? '' : sectionDisabled(formSection)\">\n <div [class]=\"formSection.hidden ? 'hidden' : formSection.class\">\n <p-accordion>\n <p-accordionTab [selected]=\"formSection.expanded === false ? false : true\"\n [disabled]=\"formSection.accordionDisabled\"\n [ngClass]=\"!formSection.showAccordion ? 'hide-accordian' : ''\">\n <p-header>\n <i [class]=\"formSection.icon\" [title]=\"formSection.name\" class=\"mr-1 pl-2\"></i>\n <span class=\"subsection-header\">{{ formSection.name\n }}</span>\n </p-header>\n\n <div class=\"flex align-items-center p-col form-component accordion-header-wrapper\">\n <label *ngIf=\"!formSection.showAccordion\" for=\"name\"\n class=\"accordionHeaderName flex align-items-center\">\n <i [title]=\"formSection.name\" [class]=\"formSection.icon\" class=\"\"></i>\n <div> {{ formSection.name }} </div>\n </label>\n\n <div *ngFor=\"let link of formSection.links\">\n <label class=\"mr-3 custom-link\" data-title-element=\"self\"\n [class]=\"link.name &&!formSection.disabled&&!link.disabled ? 'custom-link' : 'disabled-link'\"\n (click)=\"onLinkClick(link, formSection)\">\n {{ link.name }}\n </label>\n </div>\n <div class=\"flex flex-wrap form-component form-body-wrapper header-fields-wrapper\">\n <div [class]=\"(headerField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(headerField.column)\n ? 'col-' + headerField.column + setClassName(headerField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(headerField)\n : headerField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(headerField))\"\n [ngClass]=\"headerField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let headerField of formSection.headerFields; let headerFieldIndex = index\">\n\n <span [ngSwitch]=\"headerField.control\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"headerField?.label?.labelControl\">\n <label-control [formField]=\"headerField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent($event)\" (onClick)=\"onClickEvent($event)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame($event)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"headerField.label.icon\" [class]=\"headerField.label.icon\"></i>\n <span *ngIf=\"!headerField.label.icon\"> {{headerField.label.name}}</span>\n </ng-template>\n\n <!-- Input Control -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"headerField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n <!-- Numeric Input Control -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"headerField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n <!-- Checkbox Control -->\n <span *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"headerField\" (onClick)=\"onClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </checkbox-control>\n </span>\n <!-- Password Input Control -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\" (onFocusOut)=\"onFocusOutEvent($event)\">\n </password-control>\n </span>\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"headerField\"></spacer-control>\n </span>\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"headerField\" (onClick)=\"handleClickEvent($event)\"\n (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></textArea-control>\n </span>\n <!--Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control\n [formField]=\"headerField\"\n (changeEvent)=\"onChangeEvent($event)\"\n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n\n <!-- Calendar Control-->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"headerField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate($event)\"\n (onClick)=\"handleClickEvent($event)\" (ngModelChange)=\"calendarChangeValue($event)\"\n (onInput)=\"calendarInputValue($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"headerField\" (keyupTab)=\"tabFocusEvent($event)\"\n (onClick)=\"clearDropdownValue($event)\" (focusOutEvent)=\"onFocusOutEvent($event)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onClick)=\"handleClickEvent($event)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"headerField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent($event)\"\n (iframLoadEvent)=\"loadIFrame($event)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"headerField\" (keyupTab)=\"selectLookupField($event)\"\n (onClick)=\"selectLookupField($event)\"\n (onClearLookupValue)=\"lookupClearValue($event)\"></lookup-control>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"headerField\" (onChange)=\"onChangeEvent($event)\"\n (onFocusOut)=\"onFocusOutEvent($event)\"></select-button-control>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"headerField\"\n (onClick)=\"handleNoteFieldDialog($event)\"></note-detail-control>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"headerField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!headerField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"headerField\" [label]=\"headerField.label\"\n [title]=\"headerField.label\" [params]=\"headerField.params\"\n [showDialog]=\"headerField.showDialog\" [reportType]=\" headerField.reportType\"\n [reportHeader]=\"headerField.reportHeader\" [reportFooter]=\"headerField.reportFooter\"\n [form]=\"form\" [icon]=\"headerField.icon\"\n [class]=\"headerField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"headerField\"\n (onClick)=\"onClickEvent($event)\"></Input-switch-control-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"headerField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{headerFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\">\n </div>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"headerField.selectMultipleFiles\"\n [acceptFileTypes]=\"headerField.SetfileTypes\" [fields]=\"headerField\"\n (fileUrl)=\"setFileUrls($event)\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Display Card field -->\n <span *ngIf=\"!headerField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"headerField.disabled ? 'disabled-link' : ''\">\n <label data-title-element=\"self\">\n {{ headerField.label }}\n <span *ngIf=\"headerField.requiredField\"\n [class]=\"'required-star ' + (headerField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"headerField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n headerField.errorMessage\n }}</span>\n </div>\n </span>\n\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-wrap form-component form-body-wrapper\">\n <div [class]=\"(formField.control==='add_button'? ' form-button-field-wrapper ':'')+\n ( isValidColumn(formField.column)\n ? 'col-' + formField.column + setClassName(formField)\n : isValidColumn(form.column)\n ? 'col-' + form.column + setClassName(formField)\n : formField.column || form.column\n ? ' col '\n : 'col-12 md:col-3 flex flex-column' + setClassName(formField))\"\n [ngClass]=\"formField.control === 'break_line' ? 'break-line' : ''\"\n *ngFor=\"let formField of formSection.fields; let formFieldIndex = index\">\n\n <!-- labelControl Hyperlink on lookup Control Field-->\n <span *ngIf=\"formField?.label?.labelControl\">\n <label-control [formField]=\"formField\" [overlayPanel]=\"overlayPanel\"\n [labelDisplay]=\"labelDisplay\" (onMouseEnter)=\"addDynamicPanelOverlayComponent($event)\"\n (onMouseLeave)=\"mouseLeaveEvent(overlayPanel)\" (onClick)=\"onClickEvent(formField)\"\n (onLoadLabelControlIFrameClick)=\"loadLabelControlIFrame(formField)\"\n (onSelectLookupLabelClick)=\"selectLookupLabel($event?.formField, $event?.event)\"></label-control>\n </span>\n <ng-template #labelDisplay>\n <i *ngIf=\"formField.label.icon\" [class]=\"formField.label.icon\"></i>\n <span *ngIf=\"!formField.label.icon\"> {{formField.label.name}}</span>\n </ng-template>\n\n <div [ngSwitch]=\"formField.control\">\n\n <!-- Spacer Control -->\n <span *ngSwitchCase=\"dynamicCase.SPACER\">\n <spacer-control [formField]=\"formField\"></spacer-control>\n </span>\n\n <!-- Input TextArea -->\n <span *ngSwitchCase=\"dynamicCase.TEXTAREA\">\n <textArea-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></textArea-control>\n </span>\n\n <!-- Text Input -->\n <span *ngSwitchCase=\"dynamicCase.INPUT\">\n <input-control [field]=\"formField\" (changePassword)=\"changePasswordType($event)\"\n (changeEvent)=\"onChangeEvent($event)\" (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\"></input-control>\n </span>\n\n <!-- Number Input -->\n <span *ngSwitchCase=\"dynamicCase.NUMERIC\">\n <numeric-control [field]=\"formField\" (changeEvent)=\"onChangeEvent($event)\"\n (selectLookup)=\"selectLookupField($event)\"\n (focusOutEvent)=\"onFocusOutEvent($event)\"></numeric-control>\n </span>\n\n <!-- Password Input -->\n <span *ngSwitchCase=\"dynamicCase.PASSWORD\">\n <password-control [formField]=\"formField\" (onClick)=\"handleClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </password-control>\n </span>\n\n <!-- Checkbox -->\n <div *ngSwitchCase=\"dynamicCase.CHECKBOX\">\n <checkbox-control [formField]=\"formField\" (onClick)=\"onClickEvent(formField)\"\n (onChange)=\"onChangeEvent(formField)\" (onFocusOut)=\"onFocusOutEvent(formField)\">\n </checkbox-control>\n </div>\n\n <!-- Calendar -->\n <span *ngSwitchCase=\"dynamicCase.CALENDAR\">\n <calendar-control [formField]=\"formField\" [defaultDate]=\"defaultDate\"\n [calendarFormat]=\"calendarFormat\" (onShow)=\"setCalendarDate(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (ngModelChange)=\"calendarChangeValue(formField)\"\n (onInput)=\"calendarInputValue(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></calendar-control>\n </span>\n\n <!-- Dropdown -->\n <span *ngSwitchCase=\"dynamicCase.DROPDOWN\">\n <dropdown-control [formField]=\"formField\" (keyupTab)=\"tabFocusEvent(formField)\"\n (onClick)=\"clearDropdownValue(formField)\" (focusOutEvent)=\"onFocusOutEvent(formField)\"\n (onChange)=\"onClearValue($event)\"></dropdown-control>\n </span>\n\n <!-- AutoComplete Search -->\n <span *ngSwitchCase=\"dynamicCase.AUTOCOMPLETE\">\n <autoComplete-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onClick)=\"handleClickEvent(formField)\" (completeMethod)=\"autoSearch($event)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></autoComplete-control>\n </span>\n\n <!-- Multi-select -->\n <span *ngSwitchCase=\"dynamicCase.MULTISELECT\">\n <multiselect-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (focusOutEvent)=\"onFocusOutEvent(formField)\"></multiselect-control>\n </span>\n\n <!-- Hyperlink-->\n <span *ngSwitchCase=\"dynamicCase.HYPERLINK\">\n <hyperlink-control [formField]=\"formField\"\n (onHyperlinkDialogClick)=\"hyperlinkDialog($event)\" (onClick)=\"handleClickEvent(formField)\"\n (iframLoadEvent)=\"loadIFrame(formField)\">\n </hyperlink-control>\n </span>\n\n <!-- Lookup Control Field -->\n <span *ngSwitchCase=\"dynamicCase.LOOKUP_INPUT\">\n <lookup-control [formField]=\"formField\" (keyupTab)=\"selectLookupField(formField)\"\n (onClick)=\"selectLookupField(formField)\"\n (onClearLookupValue)=\"lookupClearValue(formField)\"></lookup-control>\n </span>\n\n <!-- File Upload Field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.FILE_UPLOAD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n <se-file-upload [allowMultiple]=\"formField.selectMultipleFiles\"\n [acceptFileTypes]=\"formField.SetfileTypes\" [fields]=\"formField\" \n (fileUrl)=\"setFileUrls($event)\" [isAzureUpload]=\"formField.isAzureUpload == false ? formField.isAzureUpload : true\"\n (uploadFileOnReturn)=\"fileOnchangeEvent()\"></se-file-upload>\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Select Button Field -->\n <span *ngSwitchCase=\"dynamicCase.SELECTBUTTON\">\n <select-button-control [formField]=\"formField\" (onChange)=\"onChangeEvent(formField)\"\n (onFocusOut)=\"onFocusOutEvent(formField)\"></select-button-control>\n </span>\n\n\n <!-- Display Card field -->\n <span *ngIf=\"!formField.hidden\">\n <div class=\"flex flex-column\" *ngSwitchCase=\"dynamicCase.CARD\">\n <span [class]=\"\n formField.disabled ? 'disabled-link' : ''\n \">\n <label data-title-element=\"self\">\n {{ formField.label }}\n <span *ngIf=\"formField.requiredField\"\n [class]=\"'required-star ' + (formField?.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n </span>\n\n <se-card [card]=\"formField.card\" [setCardData]=\"setCardData\"\n (selectedCard)=\"selectedCardClickEvent($event)\"></se-card>\n\n <span *ngIf=\"showfileUploadError\" data-title-element=\"self\" class=\"error\">{{\n formField.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Note Detail Field -->\n <span *ngSwitchCase=\"dynamicCase.NOTE_FIELD\">\n <note-detail-control [formField]=\"formField\"\n (onClick)=\"handleNoteFieldDialog(formField)\"></note-detail-control>\n </span>\n\n <!-- Dynamic Component Container-->\n <span [class]=\"formField.hidden ? 'hidden' : ''\">\n <div id=\"{{formSection.name}}-{{formFieldIndex}}\" #dynamicComponentContainer\n *ngSwitchCase=\"dynamicCase.COMPONENT\"></div>\n </span>\n\n <!-- Header component-->\n <span *ngSwitchCase=\"dynamicCase.SECTION_HEADER\">\n <section-header-control [formField]=\"formField\"></section-header-control>\n </span>\n\n <!-- Add OnClick Button -->\n <span *ngSwitchCase=\"dynamicCase.ADD_BUTTON\">\n <add-button-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></add-button-control-control>\n </span>\n\n <!-- Add Generate Report Button -->\n <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.REPORT\">\n <se-generate-report-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-generate-report-btn>\n </div>\n </span>\n\n <!-- Add Generate Email Button -->\n <!-- <span *ngIf=\"!formField.hidden\">\n <div *ngSwitchCase=\"dynamicCase.EMAIL\">\n <se-email-generate-btn [repInfo]=\"formField\" [label]=\"formField.label\"\n [title]=\"formField.label\" [params]=\"formField.params\"\n [showDialog]=\"formField.showDialog\" [reportType]=\" formField.reportType\"\n [reportHeader]=\"formField.reportHeader\" [reportFooter]=\"formField.reportFooter\"\n [form]=\"form\" [icon]=\"formField.icon\"\n [class]=\"formField.class\"></se-email-generate-btn>\n </div>\n </span> -->\n\n <!-- Add Input Switch -->\n <span *ngSwitchCase=\"dynamicCase.SWITCH\">\n <Input-switch-control-control [formField]=\"formField\"\n (onClick)=\"onClickEvent(formField)\"></Input-switch-control-control>\n </span>\n\n <!-- Add Editor Control -->\n <span *ngSwitchCase=\"dynamicCase.TEXT_EDITOR\">\n <se-editor-control \n [formField]=\"formField\"\n (changeEvent)=\"onChangeEvent($event)\" \n (clickEvent)=\"handleClickEvent($event)\"\n (focusEvent)=\"onFocusOutEvent($event)\">\n </se-editor-control>\n </span>\n </div>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </div>\n </div>\n </span>\n </div>\n </span>\n\n <!-- save and close buttons -->\n <div class=\"col-12 actions-buttons-main-wrapper flex justify-content-end\" [ngClass]=\"{ sticky: stickyActions }\">\n <div class=\"inner-sticky form-component actions-buttons-wrapper-div\">\n <!-- save button -->\n <button *ngIf=\"!hideSaveButton\" [disabled]=\"isFormDisabled\" pButton type=\"button\" icon=\"pi pi-check\"\n [label]=\"saveButtonLabel ? saveButtonLabel : 'Save'\" class=\"p-button-success form-save-button\"\n (click)=\"onSaveForm()\"></button>\n <!-- close button -->\n <button *ngIf=\"!hideCancelButton\" [disabled]=\"isFormDisabled\" (click)=\"onCancelForm()\" pButton type=\"button\"\n icon=\"pi pi-times\" [label]=\"cancelButtonLabel ? cancelButtonLabel : 'Cancel'\"\n class=\"p-button-danger ml-3\"></button>\n <!-- dynamic buttons -->\n <ng-container *ngFor=\"let button of formButtons\">\n <button *ngIf=\"!button.hidden\" pButton type=\"button\" [label]=\"button.label\"\n [icon]=\"button.icon ? button.icon : ''\" class=\"p-button-success ml-3\" (click)=\"onNewButtonClick(button)\"\n [disabled]=\"button.disabled ? button.disabled : false\">\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </form>\n <p-overlayPanel [style]=\"overlayPanelStyle\" #overlayPanel>\n <ng-container #viewContainerRef></ng-container>\n </p-overlayPanel>\n</div>\n<div *ngIf=\"!splitScreen\">\n <div #appendForm></div>\n</div>", styles: [".custom-link{color:#4e87f1;text-decoration:none}.custom-link:not(.disabled-link){cursor:pointer}.break-line{width:100%}:host ::ng-deep .wrap-chips .p-multiselect,:host ::ng-deep .wrap-chips .p-multiselect-label{white-space:wrap;text-overflow:unset!important;height:auto!important}:host ::ng-deep .toFrontForTooltip{position:relative;z-index:2}:host ::ng-deep [data-title]{position:static}:host ::ng-deep [data-title]:not([input]):hover:before{position:absolute;content:attr(data-title);background-color:#fff;color:#000;border:.5px solid black;padding:.17em .5em;z-index:3;margin-left:10px}:host ::ng-deep [data-title]:not([input]):hover:before:is(label){margin-top:10px}:host ::ng-deep [data-title]:not([input]):hover:before:not(label){margin-top:28px}:host ::ng-deep .hide-accordian .p-accordion-header{display:none}:host ::ng-deep .splitter-wrapper .p-splitter-panel-nested{overflow:auto}:host ::ng-deep .hide-today-btn{visibility:hidden}.error{color:red}.hidden{display:none!important}.disabled-link,.disabled-link a,.disabled-link label,.disabled-link span,.disabled-link div,.disable-label-control,.disabled-link.custom-link,.disabled-link.custom-link a,.disabled-link.custom-link label,.disabled-link.custom-link span,.disabled-link.custom-link div,.disable-label-control.custom-link{pointer-events:none;color:#83baf8}.progress-spinner{z-index:999}.progress-spinner:before{content:\"\"}.toggleForm{visibility:hidden}\n"] }]
|
|
1451
1482
|
}], ctorParameters: function () { return [{ type: i1.AuthenticationService }, { type: i2.FormService }, { type: i3.AlertService }, { type: i4.DialogService }, { type: i0.ComponentFactoryResolver }, { type: i5.HyperlinkService }, { type: i0.ChangeDetectorRef }, { type: i6.Router }, { type: i0.ElementRef }, { type: i7.DatePipe }, { type: i8.GridService }, { type: i9.PageLoggerService }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { panelOverlayViewContainer: [{
|
|
1452
1483
|
type: ViewChild,
|
|
1453
1484
|
args: ['viewContainerRef', { read: ViewContainerRef, static: true }]
|
|
@@ -1490,4 +1521,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
|
|
|
1490
1521
|
type: HostListener,
|
|
1491
1522
|
args: ['window:beforeunload', ['$event']]
|
|
1492
1523
|
}] } });
|
|
1493
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUErQyxZQUFZLEVBQStCLGdCQUFnQixFQUFjLFlBQVksRUFBcUIsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBSWxQLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBMEMsVUFBVSxFQUE2QixXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFFL0UsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNN0QsT0FBTyxFQUFnQixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRdEMsTUFBTSxPQUFPLGFBQWE7SUFvQnhCLElBQWEsY0FBYyxDQUFDLEdBQVE7UUFDbEMsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ2hCLFFBQVEsQ0FBQztT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QUM7SUFDRCxlQUFlLENBQUMsWUFBWTtRQUMxQixZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztpSUFwaURVLGFBQWE7cUhBQWIsYUFBYSw2cEJBQ2MsZ0JBQWdCLG9WQUVILGdCQUFnQixrREM3QnJFLHEyaENBOGdCTTs7MkZEcGZPLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsU0FBUzsrY0FNWix5QkFBeUI7c0JBRC9CLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFDLElBQUksRUFBQztnQkFHcEUseUJBQXlCO3NCQUR4QixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUdsQyxvQkFBb0I7c0JBQXRELFNBQVM7dUJBQUMsc0JBQXNCO2dCQUNXLGtCQUFrQjtzQkFBN0QsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVqQyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFJTyxjQUFjO3NCQUExQixLQUFLO2dCQUtJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQWdEUCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgQ29tcG9uZW50RmFjdG9yeSwgVmlld0NvbnRhaW5lclJlZiwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBSZW5kZXJlcjIsIE5nWm9uZSwgVmlld0NoaWxkLCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlLCBEeW5hbWljRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7IE5vdGVzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL25vdGVzL25vdGVzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFRm9ybUNvbnRyb2wsIEVIeXBlcmxpbmssIElGb3JtRmllbGQsIElEeW5hbWljRm9ybSwgSUZvcm1TZWN0aW9uLCBFVmFsaWRhdG9yLCBJRHluYW1pY0NhcmQsIElGb3JtQnV0dG9uLCBFRm9ybWF0VHlwZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9mb3JtLm1vZGVsJztcbmltcG9ydCB7IEVQZXJtaXNzaW9uVHlwZSwgSVBlcm1pc3Npb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvdXNlci1pbmZvLm1vZGVsJztcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGhlbnRpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgdXRpbGl0aWVzIGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdGllcy5zZXJ2aWNlJztcbmltcG9ydCB7IElmcmFtZUNvbXBvbmVudCB9IGZyb20gJy4uL2lmcmFtZS9pZnJhbWUuY29tcG9uZW50JztcbmltcG9ydCB7IElEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbW1vbi5tb2RlbCc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgR3JpZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFnZUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYWdlLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh5cGVybGlua1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9oeXBlcmxpbmsuc2VydmljZSc7XG5pbXBvcnQgeyBkcmFnZ2FibGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSU92ZXJsYXlQYW5lbERhdGEgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ3JpZC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NlLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3ZpZXdDb250YWluZXJSZWYnLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOnRydWV9KVxuICBwdWJsaWMgcGFuZWxPdmVybGF5Vmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZHJlbignZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyOiBRdWVyeUxpc3Q8Vmlld0NvbnRhaW5lclJlZj47XG5cbiAgQFZpZXdDaGlsZCgndmlld0NvbnRhaW5lckZvcm1SZWYnKSB2aWV3Q29udGFpbmVyRm9ybVJlZiE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2FwcGVuZEZvcm0nLCB7IHN0YXRpYzogZmFsc2UgfSkgZ2V0VGFyZ2V0ZWRGb3JtRGl2OiBFbGVtZW50UmVmO1xuICBcbiAgQElucHV0KCkgc3RpY2t5QWN0aW9uczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGZvcm06IElEeW5hbWljRm9ybTtcbiAgQElucHV0KCkgc2F2ZUJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgY2FuY2VsQnV0dG9uTGFiZWw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBoaWRlU2F2ZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBoaWRlQ2FuY2VsQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZvcm1CdXR0b25zOiBJRm9ybUJ1dHRvbltdID0gW107XG4gIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBvdmVybGF5UGFuZWxTdHlsZToge307XG4gIHBhbmVsSW5mbzogYW55O1xuICBASW5wdXQoKSBzZXQgYWN0aXZlVGVzdE1vZGUodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpIHNhdmVGb3JtOiBFdmVudEVtaXR0ZXI8SUZvcm1TZWN0aW9uW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY2FuY2VsRm9ybTogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGRyb3BEb3duQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2VjdGlvbkNsaWNrZWRFdmVudDogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZHluYW1pY0Nhc2UgPSBFRm9ybUNvbnRyb2w7XG4gIHNhdmVGb3JtUGFnZTogU3Vic2NyaXB0aW9uO1xuICBwZXJtaXNzaW9uVHlwZSA9IEVQZXJtaXNzaW9uVHlwZTtcbiAgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gIGlzRm9ybURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRm9ybUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjb21wb25lbnRzTGlzdDogSURpY3Rpb25hcnlbXSA9IFtdO1xuICBmaWxlVXBsb2FkVXJsczogYW55O1xuICBzaG93ZmlsZVVwbG9hZEVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIGNhcmRMaXN0OiBJRHluYW1pY0NhcmQ7XG4gIGNhbGVuZGFyUHJldmlvdXNWYWx1ZTogc3RyaW5nID0gJyc7XG4gIGRlZmF1bHREYXRlOiBzdHJpbmcgPSAnJztcbiAgbG9va3VwRm9jdXNPdXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2FsZW5kYXJGb3JtYXQ6IHN0cmluZyA9ICdtbS9kZC95eSc7XG4gIHNldENhcmREYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHNwbGl0U2NyZWVuIDogYm9vbGVhbj0gZmFsc2U7XG4gIGRpYWxvZ1JlZjogYW55O1xuXG4gIC8vIGFwcGx5IGNoZWNrZWQvdW5DaGVja2VkIHByb3AgZm9yIENoZWNrQm94IG9mIHRoZSBGb3JtXG4gIGNoZWNrZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICB1bkNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtU2VydmljZTogRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwdWJsaWMgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgaHlwZXJsaW5rU2VydmljZSA6IEh5cGVybGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcbiAgICBwcml2YXRlIGdyaWRTZXJ2aWNlOiBHcmlkU2VydmljZSxcbiAgICBwcml2YXRlIHBhZ2VMb2dnZXJTZXJ2aWNlOiBQYWdlTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIC8vIGJyb3dzZXIgdGFiIGNsb3NlIGV2ZW50XG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpiZWZvcmV1bmxvYWQnLCBbJyRldmVudCddKVxuICBiZWZvcmV1bmxvYWRIYW5kbGVyKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgfHwgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIC8vIHRoaXMuZm9ybVNlcnZpY2Uuc2V0VG9vbHRpcCgpO1xuICAgIC8vIGFwcGx5IHVzZXIgcm9sZSBwZXJtaXNzaW9ucyBvbiBmb3JtXG4gICAgdGhpcy5yb2xlcyA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VXNlclJvbGVzKCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5mb3JtICYmXG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zICYmXG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIC8vIHN0YXJ0IGNhcmRMaXN0IHJlZmVyZW5jZSBicmVhayBmdW5jdGlvbmFsaXR5XG4gICAgICBsZXQgZm9ybVZhbHVlcyA9IHsgLi4udGhpcy5mb3JtIH07XG5cbiAgICAgIGZvcm1WYWx1ZXMuZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzKSB7XG4gICAgICAgICAgaWYoZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzPy5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIGZvcm1TZWN0aW9uLmhlYWRlckZpZWxkcy5mb3JFYWNoKChoZWFkZXJGaWVsZCk9PntcbiAgICAgICAgICAgICAgdGhpcy5jaGVja0ZpZWxkUmVxdWlyZWQoaGVhZGVyRmllbGQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tGaWVsZFJlcXVpcmVkKGZpZWxkKTtcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc1Bhc3N3b3JkKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnRleHRUeXBlID0gJ3Bhc3N3b3JkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHRpbWUgaW50byBkYXRlXG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQUxFTkRBUiAmJiBmaWVsZD8ub25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgZmllbGRbJ3ByZXZpb3VzVmFsdWUnXSA9IGZpZWxkPy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQUxFTkRBUiAmJlxuICAgICAgICAgICAgICBmaWVsZD8udGltZU9ubHkgJiZcbiAgICAgICAgICAgICAgKGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fFxuICAgICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXRUaW1lSW5EYXRlKGZpZWxkLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlICYmXG4gICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQ/LnZhbHVlLm1hcChcbiAgICAgICAgICAgICAgICAodmFsdWU6IGFueSkgPT4gdmFsdWVbZmllbGQ/LmRpc3BsYXlGaWVsZF1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgKHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCc7JykgfHxcbiAgICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnLCcsICc7JylcbiAgICAgICAgICAgICAgICAgID8uc3BsaXQoJzsnKVxuICAgICAgICAgICAgICAgICAgPy5tYXAoKHZhbDogYW55KSA9PiAoeyBbZmllbGQ/LmRpc3BsYXlGaWVsZF06IHZhbCB9KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIG11bHRpU2VsZWN0IHN0cmluZyB2YWx1ZSBpbiBhcnJheVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLk1VTFRJU0VMRUNUICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlICYmXG4gICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUucmVwbGFjZSgvXFxzKixcXHMqL2csIFwiLFwiKT8udG9TdHJpbmcoKT8uc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IFtmaWVsZC52YWx1ZV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpIHtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtID0ge307XG4gICAgICAgICAgICAgIGZpZWxkPy5jYXJkPy5kYXRhPy5mb3JFYWNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBmaWVsZD8uY2FyZD8uZm9ybVNlY3Rpb25zICYmXG4gICAgICAgICAgICAgICAgICBmaWVsZD8uY2FyZD8uZm9ybVNlY3Rpb25zPy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICB4LmR5bmFtaWNGb3JtID0ge1xuICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbnM6IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZmllbGQ/LmNhcmQ/LmZvcm1TZWN0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtID0gZm9ybVZhbHVlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVuZCBjYXJkTGlzdCByZWZlcmVuY2UgYnJlYWsgZnVuY3Rpb25hbGl0eVxuICAgICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPVxuICAgICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgICAgICAgICBmaWVsZD8udmFsdWU/LnRvU3RyaW5nKCk/LnRvTG93ZXJDYXNlKCkgPT09ICd5JyB8fFxuICAgICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpID09PSAnMSdcbiAgICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5IWVBFUkxJTkspIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLmh5cGVybGluaz8udGFyZ2V0VXNlVXNlclByZWYgJiYgZmllbGQuaHlwZXJsaW5rPy5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhmaWVsZC5oeXBlcmxpbmsucGFyYW1zKT8uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBnZXRLZXlWYWx1ZSA9IHV0aWxpdGllcy5nZXRGb3JtRmllbGRWYWx1ZSh0aGlzLmZvcm0sIGtleSk7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5oeXBlcmxpbmsucGFyYW1zW2tleV0gPSBnZXRLZXlWYWx1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwbHlVc2VyUGVybWlzc2lvbnMoKTtcbiAgICAgIHRoaXMucmVtb3ZlV2hpdGVTcGFjZXMoKTtcbiAgICAgIHRoaXMuc2V0SHlwZXJsaW5rQ29tcG9uZW50Um91dGUoKTtcbiAgICAgIHRoaXMuc2V0Q2FsYW5kZXJXaWR0aCgpO1xuICAgICAgdGhpcy5vcmRlckZvcm1TZWN0aW9ucygpO1xuICAgICAgdGhpcy5vbkR5bmFtaWNGb3JtU3RhdGVDaGFuZ2UoKTtcbiAgICAgIHRoaXMubGlzdGVuVG9TcGxpdFNjcmVlbkNoYW5nZSgpO1xuICAgIH1cbiAgfVxuICBvcmRlckZvcm1TZWN0aW9ucygpIHtcbiAgICBpZiAodGhpcy5mb3JtICYmIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVc2VySW5mbyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0N1cnJlbnRVc2VySW5mbycpKTtcbiAgICAgIGxldCB1c2VyU2VjdGlvbiA9IGN1cnJlbnRVc2VySW5mbz8ucGFnZVNlY3Rpb25zPy5sZW5ndGggPiAwID8gY3VycmVudFVzZXJJbmZvLnBhZ2VTZWN0aW9ucyA6IFtdO1xuICAgICAgY29uc3QgcGFnZVVybCA9IHRoaXMucGFnZU5hbWUoKTtcbiAgICAgIGlmICh1c2VyU2VjdGlvbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICB1c2VyU2VjdGlvbiA9IHVzZXJTZWN0aW9uLnNvcnQoKGEsIGIpID0+IGIuaWQgLSBhLmlkKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJ1c2VyU2VjdGlvbjpcIiwgdXNlclNlY3Rpb24pXG4gICAgICAgIHVzZXJTZWN0aW9uLmZvckVhY2goKHBhZ2VTZWN0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlZE5hbWU6IGJvb2xlYW4gPSB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5zb21lKChzZWN0aW9uKSA9PiBwYWdlU2VjdGlvbj8uc2VjdGlvbj8udG9Mb3dlckNhc2UoKSA9PT0gc2VjdGlvbj8ubmFtZT8udG9Mb3dlckNhc2UoKSkgJiYgcGFnZVNlY3Rpb24/LnBhZ2U/LnRvTG93ZXJDYXNlKCkgPT09IHBhZ2VVcmw/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKG1hdGNoZWROYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZpbmRJbmRleCgoc2VjdGlvbikgPT4gcGFnZVNlY3Rpb24/LnNlY3Rpb24/LnRvTG93ZXJDYXNlKCkgPT09IHNlY3Rpb24/Lm5hbWU/LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgaWYgKHBhZ2VTZWN0aW9uLnJvbGUpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZXM/Lmxlbmd0aCA+IDAgJiYgdGhpcy5yb2xlcy5pbmNsdWRlcyhwYWdlU2VjdGlvbi5yb2xlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3dhcFNlY3Rpb25zKHBhZ2VTZWN0aW9uLm9yZGVyIC0gMSwgaW5kZXgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dhcFNlY3Rpb25zKHBhZ2VTZWN0aW9uLm9yZGVyIC0gMSwgaW5kZXgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuICBzd2FwU2VjdGlvbnMob3JkZXI6IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJlT3JkZXJTZWN0aW9uID0geyAuLi50aGlzLmZvcm0uZm9ybVNlY3Rpb25zW29yZGVyXSB9O1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbb3JkZXJdID0gdGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tpbmRleF07XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tpbmRleF0gPSByZU9yZGVyU2VjdGlvbjtcbiAgfVxuICBwYWdlTmFtZSgpIHtcbiAgICBsZXQgdXJsID0gdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSk7XG4gICAgaWYgKHVybD8uaW5jbHVkZXMoJz8nKSkge1xuICAgICAgdXJsID0gdXJsLnNwbGl0KCc/JylbMF07XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgc2V0Rm9ybVNlY3Rpb24oc2VjdGlvbiwgaW5kZXgsIHBhZ2VTZWN0aW9uKSB7XG4gICAgY29uc3QgcmVPcmRlclNlY3Rpb24gPSB7IC4uLnNlY3Rpb24gfTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5zcGxpY2UocGFnZVNlY3Rpb24/Lm9yZGVyIC0gMSwgMCwgcmVPcmRlclNlY3Rpb24pO1xuICB9XG4gIGNoZWNrRmllbGRSZXF1aXJlZChmaWVsZDogYW55KSB7XG4gICBpZihmaWVsZC52YWxpZGF0aW9ucz8uZmluZCh2YWxpZGF0aW9uPT52YWxpZGF0aW9uLnR5cGU9PT1FVmFsaWRhdG9yLlJFUVVJUkVEKSl7XG4gICAgICBmaWVsZC5yZXF1aXJlZEZpZWxkID0gdHJ1ZTtcbiAgIH1cbiAgfVxuXG4gIC8vIHNldCBjYWxlbmRhciAyIE9yIDQgZGlnaXQgeWVhciBmb3JtYXRcbiAgY2FsZW5kYXJJbnB1dFZhbHVlKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmKCFmb3JtRmllbGQudGltZU9ubHkpe1xuICAgICAgZG9jdW1lbnRcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGZvcm1GaWVsZC5maWVsZClbMF1cbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAodmFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCF2YWw/LnRhcmdldD8udmFsdWU/LmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgICBpZiAodmFsPy50YXJnZXQ/LnZhbHVlPy5sZW5ndGggPT0gOCB8fCBmb3JtRmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gRUZvcm1hdFR5cGUuU0hPUlREQVRFKSB7XG4gICAgICAgICAgICB2YWwudGFyZ2V0LnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlPy5yZXBsYWNlKC8oXFxkezJ9KShcXGR7Mn0pKFxcZHs0fSkvLCAnJDEvJDIvJDMnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAodmFsPy50YXJnZXQ/LnZhbHVlLmxlbmd0aCA9PSA2KSB7XG4gICAgICAgICAgICB2YWwudGFyZ2V0LnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlPy5yZXBsYWNlKC8oXFxkezJ9KSg/PVxcZCkvZywgJyQxLycpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB2YWw/LnRhcmdldD8udmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHllYXIgPSB2YWw/LnRhcmdldD8udmFsdWU/LnRvU3RyaW5nKCkuc3BsaXQoJy8nKVsyXTtcbiAgICAgICAgaWYgKHllYXI/Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveXknO1xuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IG5ldyBEYXRlKHZhbD8udGFyZ2V0Py52YWx1ZSk/LnRvTG9jYWxlRGF0ZVN0cmluZyhcbiAgICAgICAgICAgICdlbi1VUydcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXI/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveSc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAgXG4gIH1cblxuICAvLyBzZXQgcGVyY2VudCBhbmQgZGVjaW1hbCB2YWx1ZXNcbiAgc2V0bnVtZXJpY3ZhbHVlcygpIHtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5OVU1FUklDKSB7XG4gICAgICAgICAgICBjb25zdCBkaWdpdHNJbmZvID0gZmllbGQ/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgICAgaWYgKGZpZWxkLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZD8uZm9ybWF0Py50eXBlID09PSAncGVyY2VudCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmFsbG93Q2FsY3VsYXRlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgICAgKGZpZWxkLnZhbHVlICogMTAwKT8udG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICApLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlICogMTAwO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KGZpZWxkLnZhbHVlKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZD8uZm9ybWF0Py50eXBlID09PSAnZGVjaW1hbCcpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoXG4gICAgICAgICAgICAgICAgICBkaWdpdHNJbmZvID8gZGlnaXRzSW5mbyA6IDJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBmb3JtIGhhcyBhbnkgZmllbGQgd2l0aCBkeW5hbWljIGNvbXBvbmVudDtcbiAgICogQ3JlYXRlcyBjb21wb25lbnQgaW5zdGFuY2UgdXNpbmcgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG4gICAqIEluamVjdHMgY29tcG9uZW50IHRocm91Z2ggdmlld1JlZi5jcmVhdGVDb21wb25lbnQoKVxuICAgKiBQYXNzZXMgZGF0YSB0byBjb21wb25lbnRcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgZXZlbnRzIHBhc3NlZCB0byB0aGUgY29tcG9uZW50c1xuICAgKiBGaW5hbGx5IGZvcmNlcyBBbmd1bGFyIHRvIGRldGVjaCBjaGFuZ2VzXG4gICAqL1xuICBsb2FkU3BsaXRWaWV3KCl7XG4vL2lmIHNob3VsZCBkeW5taWNhbGx5IGNyZWF0ZSBjb21wb25lbnQgaW5zdGVhZCBvZiBuZ0lmIGluIHRoZSBodG1sIGZvciBzcGxpdCBjb21wb25lbnRcbiAgfVxuICBsb2FkRHluYW1pY0NvbXBvbmVudHMoKSB7XG4gICAgdGhpcy5jb21wb25lbnRzTGlzdCA9IFtdO1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnksIGZpZWxkSW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DT01QT05FTlQpIHtcbiAgICAgICAgICBjb25zdCB2aWV3UmVmOiBhbnkgPSB0aGlzLmR5bmFtaWNDb21wb25lbnRDb250YWluZXIuZmluZChcbiAgICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgICB4LmVsZW1lbnQubmF0aXZlRWxlbWVudC5pZCA9PSBgJHtmb3JtU2VjdGlvbi5uYW1lfS0ke2ZpZWxkSW5kZXh9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgY29tcG9uZW50OiBDb21wb25lbnQsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgaGFuZGxlcnMsXG4gICAgICAgICAgfSA9IGZpZWxkLmNvbXBvbmVudENvbnRyb2w7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxhbnk+ID1cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KENvbXBvbmVudCk7XG4gICAgICAgICAgLy8gUGFzc2luZyBkYXRhIHRvIGNvbXBvbmVudFxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHZpZXdSZWY/LmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICBpZihmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQpe1xuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyhjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgZmllbGQuY29tcG9uZW50Q29udHJvbC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhID8/IHt9KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgbmFtZTogZmllbGQuY29tcG9uZW50Q29udHJvbD8uaWQsXG4gICAgICAgICAgICAgIHZhbHVlOiBjb21wb25lbnRSZWYsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFN1YnNjcmliZXMgdG8gdGhlIGV2ZW50cyBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudHNcbiAgICAgICAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhoYW5kbGVycykuZm9yRWFjaCgoW2V2ZW50LCBoYW5kbGVyXTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtldmVudF0gYXMgRXZlbnRFbWl0dGVyPGFueT4pPy5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGludm9rZSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vaW52b2tlIHdoZW4gZmlsZSB1cGxvYWQgT1IgZGVsZXRlIGEgZmlsZVxuICBmaWxlT25jaGFuZ2VFdmVudCgpIHtcbiAgICB0aGlzLnNldENhcmREYXRhID0gIXRoaXMuc2V0Q2FyZERhdGE7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gbG9hZCBkeW5hbWljIGNvbXBvbmVudHMgaWYgZXhpc3QgaW4gZm9ybVxuICAgIHRoaXMuc2V0bnVtZXJpY3ZhbHVlcygpO1xuICAgIHRoaXMub25EeW5hbWljRm9ybVN0YXRlQ2hhbmdlKCk7XG4gICAgdGhpcy5saXN0ZW5Ub1NwbGl0U2NyZWVuQ2hhbmdlKCk7XG4gICAgdGhpcy5sb2FkRHluYW1pY0NvbXBvbmVudHMoKTtcbiAgICB0aGlzLnNldENhcmRSZXNwb25zZUlkKCk7XG4gIH1cblxuICBzZXRDYXJkUmVzcG9uc2VJZCgpIHtcbiAgICB1dGlsaXRpZXMub25EeW5hbWljQ2FyZFN0YXRlQ2hhbmdlKCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmKHJlcy5kYXRhPy5pc1NhdmUpe1xuICAgICAgICB0aGlzLnNldENhcmRJZHMocmVzLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXREZWxldGVDYXJkSWQocmVzLmRhdGE/LmNhcmREYXRhLCByZXMuZGF0YT8uZHluYW1pY0Zvcm0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0RGVsZXRlQ2FyZElkKHVwZGF0ZWRDYXJkRGF0YTphbnksIGR5bmFtaWNGb3JtOiBJRHluYW1pY0Zvcm0pe1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChzZWN0aW9uOklGb3JtU2VjdGlvbik9PntcbiAgICAgIGNvbnN0IGNhcmRDb250cm9sID0gc2VjdGlvbi5maWVsZHMuZmluZCgoZmllbGQ6SUZvcm1GaWVsZCk9PiBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCk7XG4gICAgICBpZihjYXJkQ29udHJvbCl7XG4gICAgICAgIGNhcmRDb250cm9sLmNhcmQuZGF0YSA9IHVwZGF0ZWRDYXJkRGF0YTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgZHluYW1pY0Zvcm0gPSB0aGlzLmZvcm07XG4gIH1cblxuICBzZXRDYXJkSWRzKHJlcykge1xuICAgIHJlcy5yZWNvcmRzID0gdGhpcy5ncmlkU2VydmljZS5zZXREYXRhRmllbGRzKHJlcy5yZWNvcmRzKTtcbiAgICByZXMucmVjb3Jkcz8uZm9yRWFjaCgocmVjb3JkOiBhbnksIHJlY29yZEluZGV4OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoQ2FyZCA9IHJlcy5jYXJkc0luZm8/LmZpbmQoXG4gICAgICAgIChpbmZvLCBjYXJkSW5kZXgpID0+XG4gICAgICAgICAgcmVjb3JkSW5kZXggPT09IGNhcmRJbmRleCAmJiByZWNvcmRbcmVzLmZpZWxkTmFtZT8udG9Mb3dlckNhc2UoKV1cbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hDYXJkICYmIE9iamVjdC5rZXlzKG1hdGNoQ2FyZCk/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgbWF0Y2hDYXJkW3Jlcy5maWVsZE5hbWVdID0gcmVjb3JkW3Jlcy5maWVsZE5hbWU/LnRvTG93ZXJDYXNlKCldO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGZvcm1GaWVsZDogSUZvcm1GaWVsZDtcbiAgICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmKHJlcy5jYXJkSWQpe1xuICAgICAgICAgIGZvcm1GaWVsZCA9IGZvcm1TZWN0aW9uLmZpZWxkcz8uZmluZChcbiAgICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQgJiYgZmllbGQuaWQgPT09IHJlcy5jYXJkSWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1GaWVsZCA9IGZvcm1TZWN0aW9uLmZpZWxkcz8uZmluZChcbiAgICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoZm9ybUZpZWxkKSB7XG4gICAgICAgICAgaWYgKHJlcy5jYXJkc0luZm8/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlcy5jYXJkc0luZm8/LmZvckVhY2goKGNhcmRJZCkgPT4ge1xuICAgICAgICAgICAgICBjYXJkSWQuaWQgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvcm1GaWVsZC5jYXJkLmRhdGEgPSByZXMuY2FyZHNJbmZvO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZXRDYXJkRGF0YSA9ICF0aGlzLnNldENhcmREYXRhO1xuICB9XG5cbiAgcmVtb3ZlV2hpdGVTcGFjZXMoKSB7XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uLmNsYXNzKSBzZWN0aW9uLmNsYXNzID0gc2VjdGlvbi5jbGFzcy5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0SHlwZXJsaW5rQ29tcG9uZW50Um91dGUoKSB7XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5IWVBFUkxJTksgJiZcbiAgICAgICAgICBmaWVsZC5oeXBlcmxpbms/LmNvbXBvbmVudFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5yZXNldENvbmZpZyhbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhdGg6ICdoeXBlcmxpbmsnICsgZmllbGQubGFiZWwsXG4gICAgICAgICAgICAgIGNvbXBvbmVudDogZmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi50aGlzLnJvdXRlci5jb25maWcsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYnJvd3NlclRhYkNsb3NlRXZlbnQoZXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0ID0gZXZlbnQ7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpe1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG4gIGxpc3RlblRvU3BsaXRTY3JlZW5DaGFuZ2UoKSB7XG4gICAgdXRpbGl0aWVzLm9uU2NyZWVuU3BsaXRDaGFuZ2UoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIHRoaXMucGFuZWxJbmZvID0ge307XG4gICAgICB0aGlzLnBhbmVsSW5mby5wYW5lbENvbXBvbmVudCA9IHJlcy5wYW5lbENvbXBvbmVudDtcbiAgICAgIHRoaXMucGFuZWxJbmZvLmNvbmZpZ0RhdGEgPSByZXMuY29uZmlnRGF0YTtcbiAgICAgIHRoaXMucGFuZWxJbmZvLmV4aXN0aW5nQ29wbW9uZW50ID0gdGhpcy52aWV3Q29udGFpbmVyRm9ybVJlZjtcbiAgICAgIHRoaXMuc3BsaXRTY3JlZW4gPSB0cnVlO1xuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mb3JtLXNhdmUtYnV0dG9uJyk7XG4gICAgICBpZiAoc2F2ZUJ1dHRvbikge1xuICAgICAgICAgIHNhdmVCdXR0b24uY2xhc3NMaXN0Py5hZGQoJ3Atc2F2ZS1idXR0b24nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kVmlld0NvbnRhaW5lclRvRGl2KClcbiAgICB9KVxuICB9XG5cbiAgY2xvc2VQYW5lbCgpIHtcbiAgICB0aGlzLnNwbGl0U2NyZWVuID0gZmFsc2U7XG4gICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLXNhdmUtYnV0dG9uJyk7XG4gICAgaWYgKHNhdmVCdXR0b24pIHtcbiAgICAgICAgc2F2ZUJ1dHRvbi5jbGFzc0xpc3Q/LnJlbW92ZSgncC1zYXZlLWJ1dHRvbicpO1xuICAgIH1cbiAgICB0aGlzLmFwcGVuZFZpZXdDb250YWluZXJUb0RpdigpO1xuICB9XG5cbiAgYXBwZW5kVmlld0NvbnRhaW5lclRvRGl2KCkge1xuICAgIGxldCBmb3JtQ29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQgPSB0aGlzLnZpZXdDb250YWluZXJGb3JtUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSlcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmdldFRhcmdldGVkRm9ybURpdj8ubmF0aXZlRWxlbWVudCAmJiBmb3JtQ29udGFpbmVyRWxlbWVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlcjI/LmFwcGVuZENoaWxkKHRoaXMuZ2V0VGFyZ2V0ZWRGb3JtRGl2Py5uYXRpdmVFbGVtZW50LCBmb3JtQ29udGFpbmVyRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIExpc3RlbnMgYW55IGNoYW5nZSBpbiBEeW5hbWljIEZvcm0gY29tcG9uZW50IFN0YXRlXG4gICAqL1xuXG4gIG9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHV0aWxpdGllcy5vbkR5bmFtaWNGb3JtU3RhdGVDaGFuZ2UoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UuaWQgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWZPYmogPSB0aGlzLmNvbXBvbmVudHNMaXN0LmZpbmQoXG4gICAgICAgICAgKHgpID0+IHgubmFtZSA9PT0gcmVzcG9uc2UuaWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZk9iaikge1xuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlLmRhdGEgPz8ge30pLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgY29tcG9uZW50UmVmT2JqLnZhbHVlLmluc3RhbmNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZihyZXNwb25zZT8ubG9hZENvbXBvbmVudCl7XG4gICAgICAgICAgICBjb21wb25lbnRSZWZPYmoudmFsdWUuaW5zdGFuY2UubmdPbkluaXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gYXBwbHkgdXNlciByb2xlIHBlcm1pc3Npb25zXG4gIGFwcGx5VXNlclBlcm1pc3Npb25zKCkge1xuICAgIGlmICh0aGlzLmZvcm0gJiYgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucykge1xuICAgICAgbGV0IHRvdGFsRmllbGRzOiBudW1iZXIgPSAwO1xuICAgICAgbGV0IGRpc2FibGVkRmllbGRzOiBudW1iZXIgPSAwO1xuICAgICAgbGV0IGhpZGRlbkZpZWxkczogbnVtYmVyID0gMDtcblxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzKSB7XG4gICAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZvcm1GaWVsZCkgPT4ge1xuICAgICAgICAgICAgbGV0IHBlcm1pc3Npb25zOiBhbnkgPSBmb3JtRmllbGQucGVybWlzc2lvbnM7XG4gICAgICAgICAgICBsZXQgc2VjdGlvblBlcm1pc3Npb25zOiBhbnkgPSBbXTtcbiAgICAgICAgICAgIGlmICghcGVybWlzc2lvbnMpIHNlY3Rpb25QZXJtaXNzaW9ucyA9IGZvcm1TZWN0aW9uLnBlcm1pc3Npb25zO1xuICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9ucykgcGVybWlzc2lvbnMgPSB0aGlzLmZvcm0ucGVybWlzc2lvbnM7XG4gICAgICAgICAgICBsZXQgaGFzVmFsaWRFZGl0UGVybWlzc2lvbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoc2VjdGlvblBlcm1pc3Npb25zICYmIHNlY3Rpb25QZXJtaXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHNlY3Rpb25QZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXNWYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb24ucm9sZXMuZm9yRWFjaCgocm9sZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQgJiYgdGhpcy5yb2xlcyAmJiB0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuVklFVykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5FRElUKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uYWNjb3JkaW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9ucyAmJiBwZXJtaXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb246IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24ucm9sZXMgJiYgcGVybWlzc2lvbi5yb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLnJvbGVzLmZvckVhY2goKHJvbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQgJiYgdGhpcy5yb2xlcyAmJiB0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5WSUVXICYmXG4gICAgICAgICAgICAgICAgICAgICFoYXNWYWxpZEVkaXRQZXJtaXNzaW9uXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkVESVQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLnBlcm1pc3Npb25zICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQucGVybWlzc2lvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybVNlY3Rpb24uZGlzYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uYWNjb3JkaW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uYWNjb3JkaW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0b3RhbEZpZWxkcysrO1xuXG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgIGRpc2FibGVkRmllbGRzKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQuaGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGRlbkZpZWxkcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pc0Zvcm1EaXNhYmxlZCA9IHRvdGFsRmllbGRzID4gMCAmJiB0b3RhbEZpZWxkcyA9PT0gZGlzYWJsZWRGaWVsZHM7XG4gICAgICB0aGlzLmlzRm9ybUhpZGRlbiA9IHRvdGFsRmllbGRzID4gMCAmJiB0b3RhbEZpZWxkcyA9PT0gaGlkZGVuRmllbGRzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIElGcmFtZSBpbiBoeXBlcmxpbmsgQ29udHJvbFxuICAgKi9cbiAgc2VjdGlvbkRpc2FibGVkKGZvcm1TZWN0aW9uOiBJRm9ybVNlY3Rpb24pIHtcbiAgICBpZiAoZm9ybVNlY3Rpb24uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkU2VjdGlvbkZpZWxkcyhmb3JtU2VjdGlvbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmKGZvcm1TZWN0aW9uLmRpc2FibGVkID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRTZWN0aW9uRmllbGRzKGZvcm1TZWN0aW9uLCBmYWxzZSk7XG4gICAgfWVsc2Uge1xuICAgICAgcmV0dXJuIGZvcm1TZWN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGRpc2FibGVkU2VjdGlvbkZpZWxkcyhmb3JtU2VjdGlvbjogSUZvcm1TZWN0aW9uLCBkaXNhYmxlZDogYm9vbGVhbil7XG4gICAgZm9ybVNlY3Rpb24uZmllbGRzLm1hcCgoZmllbGQ6IElGb3JtRmllbGQpID0+IHtcbiAgICAgIGZpZWxkLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZvcm1TZWN0aW9uO1xuICB9XG5cbiAgbG9hZElGcmFtZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICB0aGlzLmhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihJZnJhbWVDb21wb25lbnQsIHtcbiAgICAgIGhlYWRlcjogJ0h5cGVybGluaycsXG4gICAgICB3aWR0aDogZm9ybUZpZWxkLmh5cGVybGluaz8ud2lkdGggPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoIDogJzkwJScsXG4gICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5oeXBlcmxpbms/LmhlaWdodCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0IDogJzgwJScsXG4gICAgICBkYXRhOiB7IHZhbHVlOiBmb3JtRmllbGQuaHlwZXJsaW5rPy5saW5rLCBpRnJhbWVJZDogZm9ybUZpZWxkLmxhYmVsIH0sXG4gICAgfSk7XG4gICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHJlZik7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCk7XG4gICAgfSk7XG4gICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgaWYgKGZvcm1GaWVsZC5vblJldHVybikge1xuICAgICAgICAgIGZvcm1GaWVsZC5vblJldHVybihyZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBEaWFsb2cgaW4gaHlwZXJsaW5rIENvbnRyb2xcbiAgICovXG4gIGh5cGVybGlua0RpYWxvZyhldmVudDogYW55KSB7XG4gICAgbGV0IGZvcm1GaWVsZDogSUZvcm1GaWVsZCA9IGV2ZW50LmZvcm1GaWVsZDtcbiAgICBpZiAoZm9ybUZpZWxkLmh5cGVybGluaz8udGFyZ2V0ID09PSBFSHlwZXJsaW5rLkJMQU5LKSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKFtmb3JtRmllbGQubGFiZWxdLCB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBmb3JtRmllbGQuaHlwZXJsaW5rPy5wYXJhbXMsXG4gICAgICB9KT8udG9TdHJpbmcoKTtcblxuICAgICAgd2luZG93Py5vcGVuKHVybCwgJ19ibGFuaycpO1xuICAgICAgXG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuU0VMRikge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydoeXBlcmxpbmsnICsgZm9ybUZpZWxkLmxhYmVsXSwge1xuICAgICAgICBxdWVyeVBhcmFtczogZm9ybUZpZWxkLmh5cGVybGluay5wYXJhbXMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC5oeXBlcmxpbms/LnRhcmdldCA9PT0gRUh5cGVybGluay5ESUFMT0cpIHtcbiAgICAgIHRoaXMub25DbGlja0V2ZW50KGZvcm1GaWVsZCk7XG4gICAgICBpZiAoKGV2ZW50ICYmIGV2ZW50LmV2ZW50LmN0cmxLZXkgJiYgZm9ybUZpZWxkLmh5cGVybGluay5jb21wb25lbnQpIHx8IGZvcm1GaWVsZC5vcGVuSW5OZXdUYWIpIHtcbiAgICAgICAgdGhpcy5oeXBlcmxpbmtTZXJ2aWNlLm9wZW5EaWFsb2dJbk5ld1RhYihmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCwgZm9ybUZpZWxkLmh5cGVybGluaz8ucGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKGZvcm1GaWVsZC5oeXBlcmxpbmsuY29tcG9uZW50LCB7XG4gICAgICAgICAgaGVhZGVyOiBmb3JtRmllbGQuaHlwZXJsaW5rLmRhdGE/LmhlYWRlclxuICAgICAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmRhdGE/LmhlYWRlclxuICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICB3aWR0aDogZm9ybUZpZWxkLmh5cGVybGluay53aWR0aCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggOiAnJyxcbiAgICAgICAgICBzdHlsZTogZm9ybUZpZWxkLmh5cGVybGluay53aWR0aCA/IHt9IDogeyAnbWF4LXdpZHRoJzogJ2ZpdC1jb250ZW50JyB9LFxuICAgICAgICAgIGhlaWdodDogZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHQgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodCA6ICc4MCUnLFxuICAgICAgICAgIGRhdGE6IGZvcm1GaWVsZC5oeXBlcmxpbmsucGFyYW1zXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgfHwgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQpIHtcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSA9IHRoaXMuaW50ZXJjZXB0RGlhbG9nQ2xvc2UuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYodGhpcy5kaWFsb2dSZWYpO1xuICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gZm9ybUZpZWxkLmh5cGVybGluaz8uY29tcG9uZW50Py5uYW1lO1xuICAgICAgICBpZiAoY29tcG9uZW50TmFtZSkge1xuICAgICAgICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkID8gZm9ybUZpZWxkPy5maWVsZCA6IGZvcm1GaWVsZD8ubGFiZWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5vbkNsb3NlLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZC5vblJldHVybikge1xuICAgICAgICAgICAgICBmb3JtRmllbGQub25SZXR1cm4ocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIElmcmFtZSBvbiBMYWJlbFxuICAgKi9cbiAgbG9hZExhYmVsQ29udHJvbElGcmFtZShmb3JtRmllbGQ6IGFueSkge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKElmcmFtZUNvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiBmb3JtRmllbGQubGFiZWwubmFtZSxcbiAgICAgIHdpZHRoOiBmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmh5cGVybGluay53aWR0aFxuICAgICAgICA/IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGhcbiAgICAgICAgOiAnOTAlJyxcbiAgICAgIGhlaWdodDogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbms/LmhlaWdodFxuICAgICAgICA/IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0XG4gICAgICAgIDogJzgwJScsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHZhbHVlOiBmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmh5cGVybGluaz8ubGlua1xuICAgICAgICAgID8gZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbmsubGlua1xuICAgICAgICAgIDogJycsXG4gICAgICAgIGlGcmFtZUlkOiBmb3JtRmllbGQubGFiZWwubmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHJlZik7XG4gICAgdGhpcy5wYWdlTG9nZ2VyU2VydmljZS5zYXZlUGFnZUxvZ2dlckluZm8oXG4gICAgICB0aGlzLnJvdXRlci51cmw/LnN1YnN0cmluZygxKSxcbiAgICAgICdJZnJhbWVDb21wb25lbnQnXG4gICAgKTtcbiAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkID8gZm9ybUZpZWxkPy5maWVsZCA6IGZvcm1GaWVsZD8ubGFiZWwpO1xuICAgICAgfSk7XG4gICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgaWYgKGZvcm1GaWVsZC5vblJldHVybikge1xuICAgICAgICAgIGZvcm1GaWVsZC5vblJldHVybihyZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGZvcm1GaWVsZCAmJiBmb3JtRmllbGQub25DbGljaykge1xuICAgICAgZm9ybUZpZWxkLm9uQ2xpY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZmluZCB0aGUgcmVxdWlyZWQgZmllbGQgaW4gZm9ybVxuICAgKi9cbi8vICAgYXBwbHlSZXF1aXJlZEZpZWxkVmFsaWRhdGlvbigpIHtcbi8vIGNvbnNvbGUubG9nKCdhcHBseWluZyByZXF1aXJlZGZpbGVkIHZhbGlkYXRpb25zJylcbi8vICAgICBpZiAoXG4vLyAgICAgICB0aGlzLmZvcm0gJiZcbi8vICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbi8vICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuLy8gICAgICkge1xuLy8gICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XG4vLyAgICAgICAgIHNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4vLyAgICAgICAgICAgY29uc29sZS5sb2coJ2ZpZWxkJywgZmllbGQpXG4vLyAgICAgICAgICAgaWYgKGZpZWxkLnZhbGlkYXRpb25zICYmIGZpZWxkLnZhbGlkYXRpb25zLmxlbmd0aCA+IDApIHtcbi8vICAgICAgICAgICAgIGZpZWxkLnZhbGlkYXRpb25zLmZvckVhY2goKHZhbGlkKSA9PiB7XG4vLyAgICAgICAgICAgICAgIGlmICh2YWxpZC50eXBlID09PSBFVmFsaWRhdG9yLlJFUVVJUkVEKSB7XG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2ZpZWxkJyxmaWVsZCwnaXMgcmVxdWlyZWQnKVxuLy8gICAgICAgICAgICAgICAgIGZpZWxkLnJlcXVpcmVkRmllbGQgPSB0cnVlO1xuLy8gICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICB9XG4vLyAgICAgICAgIH0pO1xuLy8gICAgICAgfSk7XG4vLyAgICAgfVxuLy8gICB9XG5cbiAgc2V0RmlsZVVybHMoZmlsZVVybHM6IGFueSkge1xuICAgIGlmIChmaWxlVXJscyAmJiBmaWxlVXJscy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZpbGVVcGxvYWRVcmxzID0gZmlsZVVybHM7XG4gICAgICB0aGlzLnNob3dmaWxlVXBsb2FkRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjaGVja0ZpZWxkc1ZhbGl0aW9ucyhmaWVsZHM6IElGb3JtRmllbGRbXSl7XG4gICAgbGV0IGVycm9yTWVzc2FnZURldGFpbHMgPSAnJztcbiAgICBsZXQgdmFsaWRpdHkgPSB0cnVlO1xuICAgIGlmIChmaWVsZHMpIHtcbiAgICAgIGlmICghdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KGZpZWxkcykpIHtcbiAgICAgICAgZmllbGRzPy5mb3JFYWNoKChmb3JtRmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChmb3JtRmllbGQuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VEZXRhaWxzID0gZXJyb3JNZXNzYWdlRGV0YWlsc1xuICAgICAgICAgICAgICA/IGVycm9yTWVzc2FnZURldGFpbHMgKyAnICwgJyArIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgOiBmb3JtRmllbGQuZXJyb3JNZXNzYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBmaWVsZCA9IGZpZWxkcy5zb21lKFxuICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQucmVxdWlyZWRGaWVsZCAmJiBmaWVsZC5lcnJvck1lc3NhZ2UgJiYgIWZpZWxkLnZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIGlmICh2YWxpZGl0eSAmJiBmaWVsZCkge1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyxcbiAgICAgICAgICAgIDUwMDAsXG4gICAgICAgICAgICAnUkVRVUlSRUQgRklFTEQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2VEZXRhaWxzLCA1MDAwLCAnSU5WQUxJRCBGSUVMRCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhbGlkaXR5ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgIC8vIHNldCB1cGxvYWRGaWxlIFVSTCBpbiBGb3JtRmllbGQgaW4gY2FzZSBvZiBGSUxFX1VQTE9BRFxuICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkZJTEVfVVBMT0FEKSB7XG4gICAgICAgICAgZmllbGQudmFsdWUgPSB0aGlzLmZpbGVVcGxvYWRVcmxzO1xuXG4gICAgICAgICAgaWYgKGZpZWxkLnZhbGlkYXRpb25zICYmIGZpZWxkLnZhbGlkYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZpZWxkLnZhbGlkYXRpb25zLmZvckVhY2goKHg6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoeC50eXBlID09PSBFVmFsaWRhdG9yLlJFUVVJUkVEICYmICFmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd2ZpbGVVcGxvYWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgIGlmIChmaWVsZC5jYXJkICYmIGZpZWxkLmNhcmQuZGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHNlbGVjdGVkRGF0YSA9IGZpZWxkLmNhcmQuZGF0YS5maWx0ZXIoXG4gICAgICAgICAgICAgICh4OiBhbnkpID0+IHguc2VsZWN0ZWRDYXJkICYmIHguc2VsZWN0ZWRDYXJkLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRhICYmIHNlbGVjdGVkRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGZpZWxkLmNhcmQuZGF0YSA9IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGl0eTtcbiAgfVxuICBvblNhdmVGb3JtKCkge1xuICAgIGxldCB2YWxpZGl0eSA9IHRydWU7XG4gICAgbGV0IGlzQWxsRmllbGRzVmFsaWQgPSBbXTtcbiAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgIGxldCBtdWxpU2VsZWN0VmFsdWUgPSB7fTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgaWYgKGZvcm1TZWN0aW9uLmZpZWxkcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICBpc0FsbEZpZWxkc1ZhbGlkLnB1c2godGhpcy5jaGVja0ZpZWxkc1ZhbGl0aW9ucyhmb3JtU2VjdGlvbi5maWVsZHMpKTtcbiAgICAgICAgdmFsaWRpdHkgPSBpc0FsbEZpZWxkc1ZhbGlkLmV2ZXJ5KChmaWVsZCkgPT4gZmllbGQgPT0gdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFsaWRpdHkgPSB0aGlzLmNoZWNrRmllbGRzVmFsaXRpb25zKGZvcm1TZWN0aW9uLmhlYWRlckZpZWxkcyk7XG4gICAgICAgIGlzQWxsRmllbGRzVmFsaWQucHVzaCh0aGlzLmNoZWNrRmllbGRzVmFsaXRpb25zKGZvcm1TZWN0aW9uLmZpZWxkcykpO1xuICAgICAgICB2YWxpZGl0eSA9IGlzQWxsRmllbGRzVmFsaWQuZXZlcnkoKGZpZWxkKSA9PiBmaWVsZCA9PSB0cnVlKTtcbiAgICAgIH1cblxuICAgIH0pO1xuICAgIGlmICh2YWxpZGl0eSkge1xuICAgICAgLy8gU2F2ZSBncmlkIG9uIGZvcm1TYXZlIEJ1dHRvblxuICAgICAgbGV0IGN1c3RvbUNvbXBvbmVudDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgbGV0IHRlbXBWYWx1ZTogYW55ID0gW107XG4gICAgICBsZXQgc2F2ZUFsbEdyaWQ6IGFueSA9IFtdO1xuICAgICAgbGV0IGdldEJ0bnM6IGFueSA9IFtdO1xuICAgICAgbGV0IGdldFNhdmVidXR0b246IGFueSA9IFtdO1xuICAgICAgLy8gc2V0IHZhbHVlIGFzIDEgb3IgMCBpbiBjYXNlIG9mIGNoZWNrYm94XG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzICYmIHZhbGlkaXR5KSB7XG4gICAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSA9PT0gJycgfHwgZmllbGQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NvbnZlcnQgZGF0ZSBpbnRvIHRpbWUgYXMgc3RyaW5nXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQUxFTkRBUiAmJlxuICAgICAgICAgICAgICBmaWVsZC50aW1lT25seSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fCBmaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUoZmllbGQudmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChmaWVsZC5zaG93VGltZSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmllbGQudmFsdWUsICd5eXl5LU1NLWRkIEhIOm1tOnNzJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnQU0nKSAmJlxuICAgICAgICAgICAgICAgICFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ1BNJykpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAnaGg6bW0gYScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5OVU1FUklDKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBmaWVsZD8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZD8uZm9ybWF0Py50eXBlID09PSAncGVyY2VudCcpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcuJykgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGN1bGF0ZWRWYWx1ZSA/IGZpZWxkLnZhbHVlIDogZmllbGQudmFsdWUgLyAxMDApPy50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJy4nKSAmJiAhY2FsY3VsYXRlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSAvIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChmaWVsZC52YWx1ZSkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc2V0IHZhbHVlIG9mIGF1dG9Db21wbGV0ZSBhcyBzdHJpbmdzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgICAgIWZpZWxkLnNob3dBbGxWYWx1ZSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZS5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC52YWx1ZS5tYXAoXG4gICAgICAgICAgICAgICAgKHZhbHVlOiBhbnkpID0+IHZhbHVlW2ZpZWxkLmRpc3BsYXlGaWVsZF1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgKHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCc7JykgfHxcbiAgICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRlbXBWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCcsJywgJzsnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCBtdWx0aVNlbGVjdCBhcnJheSBpbnRvIHN0cmluZ1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTVVMVElTRUxFQ1QgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSkgJiZcbiAgICAgICAgICAgICAgZmllbGQuc2F2ZUFzU3RyaW5nICE9PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG11bGlTZWxlY3RWYWx1ZVtmaWVsZC5maWVsZF0gPSBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlPy50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlID8gMSA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTYXZlIGdyaWQgb24gZm9ybVNhdmUgQnV0dG9uXG4gICAgICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNPTVBPTkVOVCAmJiAhY3VzdG9tQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudCA9IHRydWU7XG4gICAgICAgICAgICAgIHNhdmVBbGxHcmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnI3NhdmVBbGxHcmlkVmFsdWVzJyk7XG4gICAgICAgICAgICAgIGdldEJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGZpZWxkPy5jb21wb25lbnRDb250cm9sPy5pZCArICcgJyArICcuc2F2ZVJvdycpO1xuICAgICAgICAgICAgICBpZiAoc2F2ZUFsbEdyaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2F2ZUFsbEdyaWRbMF0uY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtUGFnZSA9IGludGVydmFsKDc1MCkuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtUGFnZS51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGdldEJ0bnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNhdmVSb3dCdG4gb2YgZ2V0QnRucykge1xuICAgICAgICAgICAgICAgICAgc2F2ZVJvd0J0bj8uY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgICBpZighdGhpcy5zcGxpdFNjcmVlbil7XG4gICAgICAgICAgIGdldFNhdmVidXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucC1zYXZlLWJ1dHRvbicpO1xuICAgICAgICAgICBpZihnZXRTYXZlYnV0dG9uKXtcbiAgICAgICAgICAgICBnZXRTYXZlYnV0dG9uPy5jbGljaygpO1xuICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQoZmFsc2UpO1xuICAgICAgaWYgKCFzYXZlQWxsR3JpZC5sZW5ndGggJiYgIWdldEJ0bnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2F2ZUZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIgJiZcbiAgICAgICAgICAgICAgZmllbGQudGltZU9ubHkgJiYgZmllbGQuc2hvd1RpbWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBpZiAodHlwZW9mIGZpZWxkLnZhbHVlID09PSAnc3RyaW5nJyAmJiAvXlxcZHsyfTpcXGR7Mn0gW0FQXU0kLy50ZXN0KGZpZWxkLnZhbHVlKSkge1xuICAgICAgICAgICAgICAvLyAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAnaGg6bW0gYScpO1xuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5NVUxUSVNFTEVDVCAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gbXVsaVNlbGVjdFZhbHVlW2ZpZWxkLmZpZWxkXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgICAgIWZpZWxkLnNob3dBbGxWYWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGVtcFZhbHVlXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnLCcsICc7JylcbiAgICAgICAgICAgICAgICA/LnNwbGl0KCc7JylcbiAgICAgICAgICAgICAgICA/Lm1hcCgodmFsOiBhbnkpID0+ICh7IFtmaWVsZC5kaXNwbGF5RmllbGRdOiB2YWwgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSA9PT0gMSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBmaWVsZD8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgICAoZmllbGQudmFsdWUgKiAxMDApPy50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgKiAxMDA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2FuY2VsRm9ybSgpIHtcbiAgICBpZiAodGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgfHwgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZVxuICAgICAgICAuY29uZmlybSh7XG4gICAgICAgICAga2V5OiAnY2FuY2VsQnV0dG9uJyxcbiAgICAgICAgICBtZXNzYWdlOiAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT8nLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc1swXS5kZXRhaWwgPT09ICdZZXMnKSB7XG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICAgICAgICB1dGlsaXRpZXMucmVtb3ZlQWN0aXZlSWNvbkNsYXNzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW5jZWxGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICB1dGlsaXRpZXMucmVtb3ZlQWN0aXZlSWNvbkNsYXNzKCk7XG4gICAgfVxuICB9XG5cbiAgbG9va3VwQ2xlYXJWYWx1ZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLnZhbHVlKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUgPSAnJztcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgfVxuICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgIH1cbiAgIC8vIHRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGNhbGVuZGFyIHdpZHRoXG4gICAqL1xuICBzZXRDYWxhbmRlcldpZHRoKCkge1xuICAgIGNvbnN0IGNhbGFuZGVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wLWNhbGVuZGFyJyk7XG4gICAgbGV0IGZvcm06IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0nKTtcbiAgICBsZXQgd2lkdGggPSBmb3JtPy5jbGllbnRXaWR0aDtcbiAgICBjYWxhbmRlckVsZW1lbnQ/LmZvckVhY2goKGNhbGFuZGVyOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGNhbGFuZGVyT2ZzZXRMZWZ0ID0gY2FsYW5kZXIub2Zmc2V0TGVmdDtcbiAgICAgIGlmIChjYWxhbmRlck9mc2V0TGVmdCA8PSB3aWR0aCAvIDIpIHtcbiAgICAgICAgY2FsYW5kZXIuY2xhc3NMaXN0LmFkZCgnb3Blbi1yaWdodC1zaWRlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IHRoZSBkeW5hbWljIGRpYWxvZyBkYXRhXG4gICAqL1xuICBzZXREaWFsb2dEYXRhKGZvcm1GaWVsZDogSUZvcm1GaWVsZCwgZGF0YTogYW55KTogYW55IHtcbiAgICBpZiAoZGF0YSAmJiBmb3JtRmllbGQpIHtcbiAgICAgIGxldCB2YWx1ZTogYW55O1xuICAgICAgZGF0YSA9IHV0aWxpdGllcy5vYmpDb252ZXJ0VG9Mb3dlcihkYXRhKTtcbiAgICAgIGxldCBzZWxlY3Rpb246IHN0cmluZyA9ICcnO1xuICAgICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAmJiB0eXBlb2YgZm9ybUZpZWxkLnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQgJiZcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUudGV4dC50b1N0cmluZygpLnRyaW0oKVxuICAgICAgICApIHtcbiAgICAgICAgICBzZWxlY3Rpb24gPSBmb3JtRmllbGQudmFsdWUudGV4dD8udG9TdHJpbmcoKT8udHJpbSgpO1xuICAgICAgICAgIGlmIChmb3JtRmllbGQuZGlzcGxheUZpZWxkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGZvcm1GaWVsZC52YWx1ZT8udmFsdWU/LnRvU3RyaW5nKCk/LnRyaW0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLnZhbHVlICYmIGZvcm1GaWVsZC52YWx1ZS50b1N0cmluZygpLnRyaW0oKSkge1xuICAgICAgICBzZWxlY3Rpb24gPSBmb3JtRmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBkYXRhLmNvbXBvbmVudD8ubmFtZTtcbiAgICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihkYXRhLmNvbXBvbmVudCwge1xuICAgICAgICAuLi5kYXRhLmRhdGEsXG4gICAgICAgIHN0eWxlQ2xhc3M6ICdsb29rdXAtbW9kZWwnLFxuICAgICAgICBoZWlnaHQ6IGRhdGEuZGF0YT8uaGVpZ2h0ID8gZGF0YS5kYXRhPy5oZWlnaHQgOiAnOTB2aCcsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbixcbiAgICAgICAgICBmaWVsZDogZm9ybUZpZWxkLmZpZWxkLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICB2YWx1ZUZpZWxkOiBkYXRhLmRhdGE/LnZhbHVlRmllbGQsXG4gICAgICAgICAgLi4uZGF0YS5kYXRhLmRhdGEsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZDogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicgKyBmb3JtRmllbGQuZmllbGRcbiAgICApO1xuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZS5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLm9uQ2xpY2sgJiYgZm9ybUZpZWxkLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICBmb3JtRmllbGQub25DbGljayhmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGxhYmVsXG4gICAqL1xuICBzZWxlY3RMb29rdXBMYWJlbChmb3JtRmllbGQ6IGFueSwgZXZlbnQ/OiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICBmb3JtRmllbGQubGFiZWwgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbFxuICAgICkge1xuICAgICAgaWYgKChldmVudC5jdHJsS2V5ICYmIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uY29tcG9uZW50KSB8fCBmb3JtRmllbGQ/LmxhYmVsPy5sYWJlbENvbnRyb2w/Lm9wZW5Jbk5ld1RhYikge1xuICAgICAgICB0aGlzLmh5cGVybGlua1NlcnZpY2Uub3BlbkRpYWxvZ0luTmV3VGFiKGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbC5jb21wb25lbnQsIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uZGF0YS5kYXRhKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCByZWY6IGFueSA9IHRoaXMuc2V0RGlhbG9nRGF0YShcbiAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkID8gZm9ybUZpZWxkPy5maWVsZCA6IGZvcm1GaWVsZD8ubGFiZWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXREaWFsb2dSZXNwb25zZShcbiAgICAgICAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgICAgICAgZm9ybUZpZWxkPy5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbCxcbiAgICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLmxhYmVsLm9uUmV0dXJuKVxuICAgICAgICAgICAgICBmb3JtRmllbGQubGFiZWwub25SZXR1cm4oZm9ybUZpZWxkLnZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICh7IGVycm9yIH06IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIGRpYWxvZyByZWYgd2hlbiBwb3B1cCBvcGVuXG4gICAqL1xuICBzZXREeW5hbWljRGlhbG9nUmVmKHJlZjogYW55KXtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2UuZGlhbG9nQ29tcG9uZW50UmVmTWFwLmdldChyZWYpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnQgPSBkaWFsb2dSZWY/Lmluc3RhbmNlIGFzIER5bmFtaWNEaWFsb2dDb21wb25lbnQ7XG4gICAgY29uc3QgYXJpYUxhYmVsbGVkQnkgPSBkeW5hbWljQ29tcG9uZW50LmdldEFyaWFMYWJlbGxlZEJ5KCk7XG4gICAgZHluYW1pY0NvbXBvbmVudC5nZXRBcmlhTGFiZWxsZWRCeSA9ICgpID0+IGFyaWFMYWJlbGxlZEJ5O1xuICB9XG5cbiAgaW50ZXJjZXB0RGlhbG9nQ2xvc2UoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgfHwgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQpIHtcbiAgICAgIGlmIChjb25maXJtKFwiWW91IHdpbGwgbG9zZSBjaGFuZ2VzIG5vdCBzYXZlZCBvbiBwYWdlLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT9cIikgPT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBkaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZFxuICAgKi9cbiAgc2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKGZvcm1GaWVsZC5sb29rdXBDb250cm9sKSB7XG4gICAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICB0aGlzLmxvb2t1cEZvY3VzT3V0ID0gdHJ1ZTtcbiAgICAgIGxldCB2YWx1ZSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5zZXREaWFsb2dEYXRhKGZvcm1GaWVsZCwgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wpO1xuICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQgPyBmb3JtRmllbGQ/LmZpZWxkIDogZm9ybUZpZWxkPy5sYWJlbCk7XG4gICAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCB8fCB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSA9IHRoaXMuaW50ZXJjZXB0RGlhbG9nQ2xvc2UuYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKFxuICAgICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnVzZXJTZWFyY2hlZD1mYWxzZTtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmZpZWxkKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtRmllbGQuZmllbGQpPy5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0RGlhbG9nUmVzcG9uc2UoXG4gICAgICAgICAgICAgIGZvcm1GaWVsZCxcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wsXG4gICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubG9va3VwRm9jdXNPdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIGZvcm1GaWVsZC5vblJldHVybihmb3JtRmllbGQudmFsdWUsIHJlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgICAgICAgY29uc3QgZm9ybUZpZWxkVmFsdWUgPVxuICAgICAgICAgICAgdHlwZW9mIGZvcm1GaWVsZC52YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgPyBmb3JtRmllbGQudmFsdWUudGV4dFxuICAgICAgICAgICAgICA6IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgICAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZT8udGV4dCA6IHZhbHVlO1xuICAgICAgICAgIGlmIChmb3JtRmllbGRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgZXJyb3IgfTogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvbkNsaWNrIGV2ZW50IGludm9rZWQgJiYgb3BlbiBEaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZC9sYWJlbFxuICAgKi9cbiAgaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgIGlmIChmb3JtRmllbGQgJiYgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wpIHtcbiAgICAgIHRoaXMuc2VsZWN0TG9va3VwTGFiZWwoZm9ybUZpZWxkKTtcbiAgICAgIHRoaXMuc2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2V0IENhbGVuZGFyIERhdGUgRm9ybWF0ICYmIHNldCBEYXRlIE1pbnV0ZSBpbnRlcnZhbFxuICAgKi9cbiAgc2V0Q2FsZW5kYXJEYXRlKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSKSB7XG4gICAgICAvLyBjb252ZXJ0IHRpbWUgaW50byBkYXRlIGZvcm1hdFxuICAgICAgaWYgKFxuICAgICAgICBmb3JtRmllbGQudGltZU9ubHkgJiZcbiAgICAgICAgKGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fFxuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSlcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0VGltZUluRGF0ZShmb3JtRmllbGQudmFsdWUpO1xuICAgICAgfWVsc2UgaWYgKFxuICAgICAgICAoZm9ybUZpZWxkLnNob3dUaW1lIHx8IGZvcm1GaWVsZC50aW1lT25seSkgJiZcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgIGZvcm1GaWVsZC5taW51dGVzSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZShcbiAgICAgICAgICB1dGlsaXRpZXMuc2V0TWludXRlc0ludGVydmFsKGZvcm1GaWVsZC52YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChmb3JtRmllbGQuc2hvd1RpbWUgfHwgZm9ybUZpZWxkLnRpbWVPbmx5KSAmJlxuICAgICAgICAhZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgIGZvcm1GaWVsZC5taW51dGVzSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZSh1dGlsaXRpZXMuc2V0TWludXRlc0ludGVydmFsKG5ldyBEYXRlKCkpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsZW5kYXJQcmV2aW91c1ZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgIH1cbiAgfVxuICBjYWxlbmRhckNoYW5nZVZhbHVlKGZvcm1GaWVsZDogYW55KSB7XG4gICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAhPT0gZm9ybUZpZWxkLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICAgIGZvcm1GaWVsZC5wcmV2aW91c1ZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgICAgICBmb3JtRmllbGQub25DaGFuZ2UoZm9ybUZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaW52b2tlZCBzZWN0aW9uIENsaWNrZWQgZXZlbnRcbiAgICovXG4gIGNsaWNrZWRTZWN0aW9uKHNlY3Rpb246IElGb3JtU2VjdGlvbikge1xuICAgIHRoaXMuc2VjdGlvbkNsaWNrZWRFdmVudC5lbWl0KHNlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gZGlhbG9nIGluIE5vdGVfRmllbGQgY29ucnRyb2xcbiAgICovXG4gIGhhbmRsZU5vdGVGaWVsZERpYWxvZyhmb3JtZmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihOb3Rlc0NvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiBmb3JtZmllbGQubGFiZWwgYXMgc3RyaW5nLFxuICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybWZpZWxkLnZhbHVlLFxuICAgICAgICBkaXNhYmxlZFRleHQ6IGZvcm1maWVsZC5kaXNhYmxlZFRleHQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1maWVsZD8uZmllbGQgPyBmb3JtZmllbGQ/LmZpZWxkIDogZm9ybWZpZWxkPy5sYWJlbCk7XG4gICAgICB9KTtcbiAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhICYmIGZvcm1maWVsZC5vblJldHVybikge1xuICAgICAgICAgIGZvcm1maWVsZC5vblJldHVybihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICh7IGVycm9yIH0pID0+IHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBzZXRDbGFzc05hbWUoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKTogc3RyaW5nIHtcbiAgICBpZiAoZm9ybUZpZWxkLmhpZGRlbikgcmV0dXJuICcgaGlkZGVuJztcbiAgICBlbHNlIHJldHVybiAnJztcbiAgfVxuXG4gIGF1dG9TZWFyY2goZXZlbnQ6IGFueSkge1xuICAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQgPSBldmVudC5mb3JtRmllbGRcbiAgICBpZiAoZm9ybUZpZWxkICYmIGV2ZW50ICYmIGV2ZW50LmV2ZW50KSB7XG4gICAgICBmb3JtRmllbGQub25SZXR1cm4oZXZlbnQuZXZlbnQucXVlcnksIGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGludm9rZWQgb25Gb2N1c091dCBFdmVudFxuICAgKi9cbiAgb25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGxldCByZWNvcmQ6IGFueSA9IHt9O1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKHNlY3Rpb24pID0+IHtcbiAgICAgIHNlY3Rpb24/LmZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChmb3JtRmllbGQuZmllbGQpIHtcbiAgICAgICAgICByZWNvcmRbZm9ybUZpZWxkLmZpZWxkXSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdXRpbGl0aWVzLnNldEh5cGVybGlua1BhcmFtVmFsdWUocmVjb3JkLCB0aGlzLmZvcm0pO1xuICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgICBpZiAoZm9ybUZpZWxkICYmIGZvcm1GaWVsZC5vbkZvY3VzT3V0ICYmIHRoaXMubG9va3VwRm9jdXNPdXQgPT09IGZhbHNlKSB7XG4gICAgICBmb3JtRmllbGQub25Gb2N1c091dChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIG9uQmFja1NwYWNlRXZlbnQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKHR5cGVvZiBmb3JtRmllbGQudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUudGV4dCA9IGZvcm1GaWVsZC52YWx1ZS50ZXh0LnN1YnN0cmluZyhcbiAgICAgICAgMCxcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQubGVuZ3RoIC0gMVxuICAgICAgKTtcbiAgICAgIGlmIChmb3JtRmllbGQudmFsdWUudGV4dC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAvL3RoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb3JtRmllbGQudmFsdWUgJiYgZm9ybUZpZWxkLnZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAvLyB0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjbGVhciB0aGUgZHJvcGRvd24gdmFsdWUgd2hlbiBjbGljayBvbiB4XG4gICAqL1xuICBvbkNsZWFyVmFsdWUoZXZlbnQ6IGFueSkge1xuICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQgPSBldmVudC5mb3JtRmllbGQ7XG4gICAgdGhpcy5vbkNoYW5nZUV2ZW50KGZvcm1GaWVsZCk7XG4gICAgdGhpcy5kcm9wRG93bkNoYW5nZUV2ZW50LmVtaXQoZm9ybUZpZWxkKTtcbiAgICBpZiAoIWV2ZW50LmV2ZW50LnZhbHVlKSB7XG4gICAgICB0aGlzLm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRHJvcGRvd25WYWx1ZShmb3JtRmllbGQ6IGFueSkge1xuICAgIHRoaXMub25DbGlja0V2ZW50KGZvcm1GaWVsZCk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIG9uQ2hhbmdlIEV2ZW50IHdoZW4gVmFsdWUgQ2hhbmdlZFxuICAgKi9cbiAgb25DaGFuZ2VFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KHRydWUpO1xuICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIHR5cGVPZih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZva2Ugb24gZHluYW1pYyBidXR0b25zIGNsaWNrXG4gICAqL1xuICBvbk5ld0J1dHRvbkNsaWNrKGJ1dHRvbikge1xuICAgIGxldCBzYXZlQWxsR3JpZDogYW55ID0gW107XG4gICAgbGV0IGdldEJ0bnM6IGFueSA9IFtdO1xuICAgIGxldCB2YWxpZGl0eSA9IHRydWU7XG4gICAgbGV0IGVycm9yTWVzc2FnZURldGFpbHMgPSAnJztcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShmb3JtU2VjdGlvbi5maWVsZHMpKSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyA9IGVycm9yTWVzc2FnZURldGFpbHNcbiAgICAgICAgICAgICAgPyBlcnJvck1lc3NhZ2VEZXRhaWxzICsgJyAsICcgKyBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgIDogZm9ybUZpZWxkLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHMuc29tZShcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLnJlcXVpcmVkRmllbGQgJiYgZmllbGQuZXJyb3JNZXNzYWdlICYmICFmaWVsZC52YWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsaWRpdHkgJiYgZmllbGQpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgICA1MDAwLFxuICAgICAgICAgICAgJ1JFUVVJUkVEIEZJRUxEJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlRGV0YWlscywgNTAwMCwgJ0lOVkFMSUQgRklFTEQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbGlkaXR5KSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIHNhdmVBbGxHcmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnI3NhdmVBbGxHcmlkVmFsdWVzJyk7XG4gICAgICAgICAgZ2V0QnRucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkICsgJyAnICsgJy5zYXZlUm93Jyk7XG4gICAgICAgICAgaWYgKHNhdmVBbGxHcmlkLmxlbmd0aCkge1xuICAgICAgICAgICAgc2F2ZUFsbEdyaWRbMF0uY2xpY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoZ2V0QnRucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzYXZlUm93QnRuIG9mIGdldEJ0bnMpIHtcbiAgICAgICAgICAgICAgc2F2ZVJvd0J0bj8uY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICBidXR0b24uZnVuYygpO1xuICB9XG5cbiAgc2VsZWN0ZWRDYXJkQ2xpY2tFdmVudChkYXRhOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm0gJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgICAgaWYgKGZpZWxkLmNhcmQgJiYgZmllbGQuY2FyZC5kYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCBvYmogPSBmaWVsZC5jYXJkLmRhdGFbZGF0YS5pbmRleF07XG4gICAgICAgICAgICAgIGlmIChvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqLnNlbGVjdGVkQ2FyZCkge1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5zZWxlY3RlZENhcmQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG9ialsnc2VsZWN0ZWRDYXJkJ10gPSAnY2FyZC1hY3RpdmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGRhdGEuc2VsZWN0ZWRDYXJkKSB7XG4gICAgICBkYXRhWydzZWxlY3RlZENhcmQnXSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhWydzZWxlY3RlZENhcmQnXSA9ICdjYXJkLWFjdGl2ZSc7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlUGFzc3dvcmRUeXBlKGZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQudGV4dFR5cGUgPT0gJ3RleHQnKSB7XG4gICAgICBmb3JtRmllbGQudGV4dFR5cGUgPSAncGFzc3dvcmQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtRmllbGQudGV4dFR5cGUgPSAndGV4dCc7XG4gICAgfVxuICB9XG4gIG9uTGlua0NsaWNrKGxpbmssIGZvcm1TZWN0aW9uKXtcbiAgICBpZighbGluay5kaXNhYmxlZCAmJiAhZm9ybVNlY3Rpb24uZGlzYWJsZWQpe1xuICAgICAgbGluay5vbkNsaWNrKCk7XG4gICAgfVxuICB9XG4gIGlzVmFsaWRDb2x1bW4oY29sOiBhbnkpe1xuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29sKSAmJiBjb2wgPiAwICYmIGNvbCA8PSAxMlxuICB9XG4gYXN5bmMgYWRkRHluYW1pY1BhbmVsT3ZlcmxheUNvbXBvbmVudChldmVudCk6IFByb21pc2U8dm9pZD57XG4gIGxldCBob3ZlckRhdGEgOklPdmVybGF5UGFuZWxEYXRhID0gZXZlbnQ/LmhvdmVyRGF0YTtcbiAgbGV0IG92ZXJsYXlQYW5lbDogYW55ID0gZXZlbnQ/Lm92ZXJsYXlQYW5lbDtcbiAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCk9PntcbiAgICAgIGNvbnN0IGRhdGEgPSB7Li4uaG92ZXJEYXRhPy5kYXRhfTtcbiAgICAgIGlmKE9iamVjdD8ua2V5cyhkYXRhKT8ubGVuZ3RoID4gMCl7XG4gICAgICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0Py5rZXlzKGhvdmVyRGF0YT8uZGF0YSk7XG4gICAgICAgIGlmKGRhdGFLZXlzPy5sZW5ndGggPjAgKXtcbiAgICAgICAgICBkYXRhS2V5cy5mb3JFYWNoKGtleT0+e1xuICAgICAgICAgICAgdmFyIHZhbHVlID1kYXRhW2tleV07XG4gICAgICAgICAgICBpZih2YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ3snKSAmJiB2YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ30nKSl7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZVRvRmluZCA9IHZhbHVlLnJlcGxhY2UoJ3snLCcnKS5yZXBsYWNlKCd9JywnJyk7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT0gdXRpbGl0aWVzLmdldEZvcm1GaWVsZFZhbHVlKHRoaXMuZm9ybSwgdmFsdWVUb0ZpbmQpO1xuICAgICAgICAgICAgfWVsc2UgaWYoIXZhbHVlKXtcbiAgICAgICAgICAgICAgdmFyIG1hdGNoZWRLZXlWYWx1ZSA9IHV0aWxpdGllcy5nZXRGb3JtRmllbGRWYWx1ZSh0aGlzLmZvcm0sIGtleSk7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT1tYXRjaGVkS2V5VmFsdWU7IFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaG92ZXJEYXRhPy5zdHlsZSA/ICh0aGlzLm92ZXJsYXlQYW5lbFN0eWxlID0gaG92ZXJEYXRhLnN0eWxlKSA6ICcnO1xuICAgICAgdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWY6YW55ID0gdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyPy5jcmVhdGVDb21wb25lbnQoaG92ZXJEYXRhPy5jb21wb25lbnQpO1xuICAgICAgY29uc29sZS5sb2coY29tcG9uZW50UmVmKVxuICAgICAgaWYoaG92ZXJEYXRhLmRhdGEpe1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuY29uZmlnID0gW107XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcuZGF0YSA9IGRhdGE7XG4gICAgICB9XG4gICAgICBvdmVybGF5UGFuZWwuc2hvdyhldmVudD8uZXZlbnQpO1xuICAgICAgXG4gICAgIH0pXG4gIH1cbiAgbW91c2VMZWF2ZUV2ZW50KG92ZXJsYXlQYW5lbCl7XG4gICAgb3ZlcmxheVBhbmVsPy5oaWRlKCk7XG4gIH1cblxufVxuXG4iLCI8c2Utc3BsaXR0ZXIgXG4gICpuZ0lmPVwic3BsaXRTY3JlZW5cIlxuICBbZXhpc3RpbmdDb21wb25lbnRdPVwicGFuZWxJbmZvLmV4aXN0aW5nQ29wbW9uZW50XCIgXG4gIFtwYW5lbENvbXBvbmVudF09XCJwYW5lbEluZm8ucGFuZWxDb21wb25lbnRcIiBcbiAgW2NvbmZpZ0RhdGFdPVwicGFuZWxJbmZvLmNvbmZpZ0RhdGFcIiBcbiAgKGNsb3NlUGFuZWxFbWl0dGVyKT1cImNsb3NlUGFuZWwoKVwiXG4+PC9zZS1zcGxpdHRlcj5cbjxwLWNvbmZpcm1EaWFsb2cgW3N0eWxlXT1cInsgd2lkdGg6ICc1MHZ3JyB9XCIga2V5PVwiY2FuY2VsQnV0dG9uXCI+PC9wLWNvbmZpcm1EaWFsb2c+XG48ZGl2ICN2aWV3Q29udGFpbmVyRm9ybVJlZj5cbiAgPGZvcm0gKm5nSWY9XCIhaXNGb3JtSGlkZGVuICYmIGZvcm1cIj5cbiAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyIGNsYXNzPVwicHJvZ3Jlc3Mtc3Bpbm5lciBwLXByb2dyZXNzLXNwaW5uZXItY2lyY2xlIGN1c3RvbS1zcGlubmVyXCI+PC9wLXByb2dyZXNzU3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleC13cmFwXCI+XG4gICAgICA8c3BhbiBbbmdDbGFzc109XCJ7ICdmaXhlZC1oZWlnaHQnOiBzdGlja3lBY3Rpb25zIH1cIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZm9ybVNlY3Rpb24gb2YgZm9ybS5mb3JtU2VjdGlvbnNcIiBbY2xhc3NdPVwiIWZvcm1TZWN0aW9uLmhpZGRlbiA/ICdjYXJkIHctMTAwJyA6ICcnXCI+XG4gICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImNsaWNrZWRTZWN0aW9uKGZvcm1TZWN0aW9uKVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFmb3JtU2VjdGlvbiA/ICcnIDogc2VjdGlvbkRpc2FibGVkKGZvcm1TZWN0aW9uKVwiPlxuICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJmb3JtU2VjdGlvbi5oaWRkZW4gPyAnaGlkZGVuJyA6IGZvcm1TZWN0aW9uLmNsYXNzXCI+XG4gICAgICAgICAgICAgICAgPHAtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICAgICAgPHAtYWNjb3JkaW9uVGFiIFtzZWxlY3RlZF09XCJmb3JtU2VjdGlvbi5leHBhbmRlZCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybVNlY3Rpb24uYWNjb3JkaW9uRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIhZm9ybVNlY3Rpb24uc2hvd0FjY29yZGlvbiA/ICdoaWRlLWFjY29yZGlhbicgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8cC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cImZvcm1TZWN0aW9uLmljb25cIiBbdGl0bGVdPVwiZm9ybVNlY3Rpb24ubmFtZVwiIGNsYXNzPVwibXItMSBwbC0yXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Vic2VjdGlvbi1oZWFkZXJcIj57eyBmb3JtU2VjdGlvbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9wLWhlYWRlcj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcC1jb2wgZm9ybS1jb21wb25lbnQgYWNjb3JkaW9uLWhlYWRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwiIWZvcm1TZWN0aW9uLnNob3dBY2NvcmRpb25cIiBmb3I9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uSGVhZGVyTmFtZSBmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgW3RpdGxlXT1cImZvcm1TZWN0aW9uLm5hbWVcIiBbY2xhc3NdPVwiZm9ybVNlY3Rpb24uaWNvblwiIGNsYXNzPVwiXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4ge3sgZm9ybVNlY3Rpb24ubmFtZSB9fSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbGluayBvZiBmb3JtU2VjdGlvbi5saW5rc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibXItMyBjdXN0b20tbGlua1wiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwibGluay5uYW1lICYmIWZvcm1TZWN0aW9uLmRpc2FibGVkJiYhbGluay5kaXNhYmxlZCAgPyAnY3VzdG9tLWxpbmsnIDogJ2Rpc2FibGVkLWxpbmsnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTGlua0NsaWNrKGxpbmssIGZvcm1TZWN0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsaW5rLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGZvcm0tY29tcG9uZW50IGZvcm0tYm9keS13cmFwcGVyIGhlYWRlci1maWVsZHMtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiKGhlYWRlckZpZWxkLmNvbnRyb2w9PT0nYWRkX2J1dHRvbic/ICcgZm9ybS1idXR0b24tZmllbGQtd3JhcHBlciAnOicnKStcbiAgICAgICAgICAgICAgICAgICAgICAgICggaXNWYWxpZENvbHVtbihoZWFkZXJGaWVsZC5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGhlYWRlckZpZWxkLmNvbHVtbiArIHNldENsYXNzTmFtZShoZWFkZXJGaWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXNWYWxpZENvbHVtbihmb3JtLmNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2NvbC0nICsgZm9ybS5jb2x1bW4gKyBzZXRDbGFzc05hbWUoaGVhZGVyRmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGhlYWRlckZpZWxkLmNvbHVtbiB8fCBmb3JtLmNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnIGNvbCAnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdjb2wtMTIgbWQ6Y29sLTMgZmxleCBmbGV4LWNvbHVtbicgKyBzZXRDbGFzc05hbWUoaGVhZGVyRmllbGQpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImhlYWRlckZpZWxkLmNvbnRyb2wgPT09ICdicmVha19saW5lJyA/ICdicmVhay1saW5lJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGhlYWRlckZpZWxkIG9mIGZvcm1TZWN0aW9uLmhlYWRlckZpZWxkczsgbGV0IGhlYWRlckZpZWxkSW5kZXggPSBpbmRleFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ1N3aXRjaF09XCJoZWFkZXJGaWVsZC5jb250cm9sXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGxhYmVsQ29udHJvbCBIeXBlcmxpbmsgb24gbG9va3VwICBDb250cm9sIEZpZWxkLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJoZWFkZXJGaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIFtvdmVybGF5UGFuZWxdPVwib3ZlcmxheVBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsRGlzcGxheV09XCJsYWJlbERpc3BsYXlcIiAob25Nb3VzZUVudGVyKT1cImFkZER5bmFtaWNQYW5lbE92ZXJsYXlDb21wb25lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbk1vdXNlTGVhdmUpPVwibW91c2VMZWF2ZUV2ZW50KCRldmVudClcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkxvYWRMYWJlbENvbnRyb2xJRnJhbWVDbGljayk9XCJsb2FkTGFiZWxDb250cm9sSUZyYW1lKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RMb29rdXBMYWJlbENsaWNrKT1cInNlbGVjdExvb2t1cExhYmVsKCRldmVudD8uZm9ybUZpZWxkLCAkZXZlbnQ/LmV2ZW50KVwiPjwvbGFiZWwtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsYWJlbERpc3BsYXk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cImhlYWRlckZpZWxkLmxhYmVsLmljb25cIiBbY2xhc3NdPVwiaGVhZGVyRmllbGQubGFiZWwuaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmxhYmVsLmljb25cIj4ge3toZWFkZXJGaWVsZC5sYWJlbC5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dC1jb250cm9sIFtmaWVsZF09XCJoZWFkZXJGaWVsZFwiIChjaGFuZ2VQYXNzd29yZCk9XCJjaGFuZ2VQYXNzd29yZFR5cGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvaW5wdXQtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOdW1lcmljIElucHV0IENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5VTUVSSUNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxudW1lcmljLWNvbnRyb2wgW2ZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RMb29rdXApPVwic2VsZWN0TG9va3VwRmllbGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9udW1lcmljLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2hlY2tib3ggQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0hFQ0tCT1hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaGVja2JveC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jaGVja2JveC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBhc3N3b3JkIElucHV0IENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlBBU1NXT1JEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFzc3dvcmQtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Bhc3N3b3JkLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU3BhY2VyIENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNQQUNFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYWNlci1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIj48L3NwYWNlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElucHV0IFRleHRBcmVhIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5URVhUQVJFQVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRBcmVhLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvdGV4dEFyZWEtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUFkZCBFZGl0b3IgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuVEVYVF9FRElUT1JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1lZGl0b3ItY29udHJvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZS1lZGl0b3ItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENhbGVuZGFyIENvbnRyb2wtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FMRU5EQVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYWxlbmRhci1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiBbZGVmYXVsdERhdGVdPVwiZGVmYXVsdERhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FsZW5kYXJGb3JtYXRdPVwiY2FsZW5kYXJGb3JtYXRcIiAob25TaG93KT1cInNldENhbGVuZGFyRGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY2FsZW5kYXJDaGFuZ2VWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwiY2FsZW5kYXJJbnB1dFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvY2FsZW5kYXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5EUk9QRE9XTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRyb3Bkb3duLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChrZXl1cFRhYik9XCJ0YWJGb2N1c0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJjbGVhckRyb3Bkb3duVmFsdWUoJGV2ZW50KVwiIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2xlYXJWYWx1ZSgkZXZlbnQpXCI+PC9kcm9wZG93bi1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQXV0b0NvbXBsZXRlIFNlYXJjaCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQVVUT0NPTVBMRVRFXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXV0b0NvbXBsZXRlLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIiAoY29tcGxldGVNZXRob2QpPVwiYXV0b1NlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L2F1dG9Db21wbGV0ZS1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTXVsdGktc2VsZWN0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5NVUxUSVNFTEVDVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvbXVsdGlzZWxlY3QtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEh5cGVybGluay0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5IWVBFUkxJTktcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoeXBlcmxpbmstY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSHlwZXJsaW5rRGlhbG9nQ2xpY2spPVwiaHlwZXJsaW5rRGlhbG9nKCRldmVudClcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWZyYW1Mb2FkRXZlbnQpPVwibG9hZElGcmFtZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2h5cGVybGluay1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTG9va3VwIENvbnRyb2wgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkxPT0tVUF9JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvb2t1cC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAoa2V5dXBUYWIpPVwic2VsZWN0TG9va3VwRmllbGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhckxvb2t1cFZhbHVlKT1cImxvb2t1cENsZWFyVmFsdWUoJGV2ZW50KVwiPjwvbG9va3VwLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWxlY3QgQnV0dG9uIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TRUxFQ1RCVVRUT05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QtYnV0dG9uLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvc2VsZWN0LWJ1dHRvbi1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZSBEZXRhaWwgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk5PVEVfRklFTERcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxub3RlLWRldGFpbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVOb3RlRmllbGREaWFsb2coJGV2ZW50KVwiPjwvbm90ZS1kZXRhaWwtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhlYWRlciBjb21wb25lbnQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VDVElPTl9IRUFERVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uLWhlYWRlci1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIj48L3NlY3Rpb24taGVhZGVyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgT25DbGljayBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkFERF9CVVRUT05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KCRldmVudClcIj48L2FkZC1idXR0b24tY29udHJvbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEdlbmVyYXRlIFJlcG9ydCBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5SRVBPUlRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWdlbmVyYXRlLXJlcG9ydC1idG4gW3JlcEluZm9dPVwiaGVhZGVyRmllbGRcIiBbbGFiZWxdPVwiaGVhZGVyRmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJoZWFkZXJGaWVsZC5sYWJlbFwiIFtwYXJhbXNdPVwiaGVhZGVyRmllbGQucGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0RpYWxvZ109XCJoZWFkZXJGaWVsZC5zaG93RGlhbG9nXCIgW3JlcG9ydFR5cGVdPVwiIGhlYWRlckZpZWxkLnJlcG9ydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXBvcnRIZWFkZXJdPVwiaGVhZGVyRmllbGQucmVwb3J0SGVhZGVyXCIgW3JlcG9ydEZvb3Rlcl09XCJoZWFkZXJGaWVsZC5yZXBvcnRGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBbaWNvbl09XCJoZWFkZXJGaWVsZC5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaGVhZGVyRmllbGQuY2xhc3NcIj48L3NlLWdlbmVyYXRlLXJlcG9ydC1idG4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBHZW5lcmF0ZSBFbWFpbCBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkVNQUlMXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1lbWFpbC1nZW5lcmF0ZS1idG4gW3JlcEluZm9dPVwiaGVhZGVyRmllbGRcIiBbbGFiZWxdPVwiaGVhZGVyRmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJoZWFkZXJGaWVsZC5sYWJlbFwiIFtwYXJhbXNdPVwiaGVhZGVyRmllbGQucGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0RpYWxvZ109XCJoZWFkZXJGaWVsZC5zaG93RGlhbG9nXCIgW3JlcG9ydFR5cGVdPVwiIGhlYWRlckZpZWxkLnJlcG9ydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXBvcnRIZWFkZXJdPVwiaGVhZGVyRmllbGQucmVwb3J0SGVhZGVyXCIgW3JlcG9ydEZvb3Rlcl09XCJoZWFkZXJGaWVsZC5yZXBvcnRGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBbaWNvbl09XCJoZWFkZXJGaWVsZC5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaGVhZGVyRmllbGQuY2xhc3NcIj48L3NlLWVtYWlsLWdlbmVyYXRlLWJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBJbnB1dCBTd2l0Y2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNXSVRDSFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudCgkZXZlbnQpXCI+PC9JbnB1dC1zd2l0Y2gtY29udHJvbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHluYW1pYyBDb21wb25lbnQgQ29udGFpbmVyLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImhlYWRlckZpZWxkLmhpZGRlbiA/ICdoaWRkZW4nIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ7e2Zvcm1TZWN0aW9uLm5hbWV9fS17e2hlYWRlckZpZWxkSW5kZXh9fVwiICNkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DT01QT05FTlRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmlsZSBVcGxvYWQgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5GSUxFX1VQTE9BRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiaGVhZGVyRmllbGQuZGlzYWJsZWQgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBoZWFkZXJGaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJoZWFkZXJGaWVsZC5yZXF1aXJlZEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoaGVhZGVyRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1maWxlLXVwbG9hZCBbYWxsb3dNdWx0aXBsZV09XCJoZWFkZXJGaWVsZC5zZWxlY3RNdWx0aXBsZUZpbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0RmlsZVR5cGVzXT1cImhlYWRlckZpZWxkLlNldGZpbGVUeXBlc1wiIFtmaWVsZHNdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlVXJsKT1cInNldEZpbGVVcmxzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cGxvYWRGaWxlT25SZXR1cm4pPVwiZmlsZU9uY2hhbmdlRXZlbnQoKVwiPjwvc2UtZmlsZS11cGxvYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJGaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGlzcGxheSAgQ2FyZCBmaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBUkRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImhlYWRlckZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaGVhZGVyRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGhlYWRlckZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1jYXJkIFtjYXJkXT1cImhlYWRlckZpZWxkLmNhcmRcIiBbc2V0Q2FyZERhdGFdPVwic2V0Q2FyZERhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZENhcmQpPVwic2VsZWN0ZWRDYXJkQ2xpY2tFdmVudCgkZXZlbnQpXCI+PC9zZS1jYXJkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJGaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGZvcm0tY29tcG9uZW50IGZvcm0tYm9keS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiKGZvcm1GaWVsZC5jb250cm9sPT09J2FkZF9idXR0b24nPyAnIGZvcm0tYnV0dG9uLWZpZWxkLXdyYXBwZXIgJzonJykrXG4gICAgICAgICAgICAgICAgICAgICggaXNWYWxpZENvbHVtbihmb3JtRmllbGQuY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGZvcm1GaWVsZC5jb2x1bW4gKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKVxuICAgICAgICAgICAgICAgICAgICA6IGlzVmFsaWRDb2x1bW4oZm9ybS5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgID8gJ2NvbC0nICsgZm9ybS5jb2x1bW4gKyBzZXRDbGFzc05hbWUoZm9ybUZpZWxkKVxuICAgICAgICAgICAgICAgICAgICA6IGZvcm1GaWVsZC5jb2x1bW4gfHwgZm9ybS5jb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgPyAnIGNvbCAnXG4gICAgICAgICAgICAgICAgICAgIDogJ2NvbC0xMiBtZDpjb2wtMyBmbGV4IGZsZXgtY29sdW1uJyArIHNldENsYXNzTmFtZShmb3JtRmllbGQpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtRmllbGQuY29udHJvbCA9PT0gJ2JyZWFrX2xpbmUnID8gJ2JyZWFrLWxpbmUnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZvcm1GaWVsZCBvZiBmb3JtU2VjdGlvbi5maWVsZHM7IGxldCBmb3JtRmllbGRJbmRleCA9IGluZGV4XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGFiZWxDb250cm9sIEh5cGVybGluayBvbiBsb29rdXAgIENvbnRyb2wgRmllbGQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkPy5sYWJlbD8ubGFiZWxDb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgW292ZXJsYXlQYW5lbF09XCJvdmVybGF5UGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbERpc3BsYXldPVwibGFiZWxEaXNwbGF5XCIgKG9uTW91c2VFbnRlcik9XCJhZGREeW5hbWljUGFuZWxPdmVybGF5Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbk1vdXNlTGVhdmUpPVwibW91c2VMZWF2ZUV2ZW50KG92ZXJsYXlQYW5lbClcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uTG9hZExhYmVsQ29udHJvbElGcmFtZUNsaWNrKT1cImxvYWRMYWJlbENvbnRyb2xJRnJhbWUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0TG9va3VwTGFiZWxDbGljayk9XCJzZWxlY3RMb29rdXBMYWJlbCgkZXZlbnQ/LmZvcm1GaWVsZCwgJGV2ZW50Py5ldmVudClcIj48L2xhYmVsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsRGlzcGxheT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJmb3JtRmllbGQubGFiZWwuaWNvblwiIFtjbGFzc109XCJmb3JtRmllbGQubGFiZWwuaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmxhYmVsLmljb25cIj4ge3tmb3JtRmllbGQubGFiZWwubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiZm9ybUZpZWxkLmNvbnRyb2xcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1BBQ0VSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYWNlci1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCI+PC9zcGFjZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgVGV4dEFyZWEgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5URVhUQVJFQVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0QXJlYS1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L3RleHRBcmVhLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dC1jb250cm9sIFtmaWVsZF09XCJmb3JtRmllbGRcIiAoY2hhbmdlUGFzc3dvcmQpPVwiY2hhbmdlUGFzc3dvcmRUeXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvaW5wdXQtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTlVNRVJJQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxudW1lcmljLWNvbnRyb2wgW2ZpZWxkXT1cImZvcm1GaWVsZFwiIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdExvb2t1cCk9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9udW1lcmljLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBhc3N3b3JkIElucHV0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUEFTU1dPUkRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFzc3dvcmQtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCIgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Bhc3N3b3JkLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENoZWNrYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DSEVDS0JPWFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaGVja2JveC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jaGVja2JveC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENhbGVuZGFyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FMRU5EQVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FsZW5kYXItY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIFtkZWZhdWx0RGF0ZV09XCJkZWZhdWx0RGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FsZW5kYXJGb3JtYXRdPVwiY2FsZW5kYXJGb3JtYXRcIiAob25TaG93KT1cInNldENhbGVuZGFyRGF0ZShmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiIChuZ01vZGVsQ2hhbmdlKT1cImNhbGVuZGFyQ2hhbmdlVmFsdWUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25JbnB1dCk9XCJjYWxlbmRhcklucHV0VmFsdWUoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvY2FsZW5kYXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHJvcGRvd24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5EUk9QRE9XTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkcm9wZG93bi1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKGtleXVwVGFiKT1cInRhYkZvY3VzRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJjbGVhckRyb3Bkb3duVmFsdWUoZm9ybUZpZWxkKVwiIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNsZWFyVmFsdWUoJGV2ZW50KVwiPjwvZHJvcGRvd24tY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQXV0b0NvbXBsZXRlIFNlYXJjaCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkFVVE9DT01QTEVURVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdXRvQ29tcGxldGUtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpXCIgKGNvbXBsZXRlTWV0aG9kKT1cImF1dG9TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvYXV0b0NvbXBsZXRlLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpLXNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk1VTFRJU0VMRUNUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+PC9tdWx0aXNlbGVjdC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIeXBlcmxpbmstLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkhZUEVSTElOS1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoeXBlcmxpbmstY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25IeXBlcmxpbmtEaWFsb2dDbGljayk9XCJoeXBlcmxpbmtEaWFsb2coJGV2ZW50KVwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWZyYW1Mb2FkRXZlbnQpPVwibG9hZElGcmFtZShmb3JtRmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oeXBlcmxpbmstY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTG9va3VwIENvbnRyb2wgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5MT09LVVBfSU5QVVRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9va3VwLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAoa2V5dXBUYWIpPVwic2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsZWFyTG9va3VwVmFsdWUpPVwibG9va3VwQ2xlYXJWYWx1ZShmb3JtRmllbGQpXCI+PC9sb29rdXAtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmlsZSBVcGxvYWQgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5GSUxFX1VQTE9BRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9ybUZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQucmVxdWlyZWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChmb3JtRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1maWxlLXVwbG9hZCBbYWxsb3dNdWx0aXBsZV09XCJmb3JtRmllbGQuc2VsZWN0TXVsdGlwbGVGaWxlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRGaWxlVHlwZXNdPVwiZm9ybUZpZWxkLlNldGZpbGVUeXBlc1wiIFtmaWVsZHNdPVwiZm9ybUZpZWxkXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlVXJsKT1cInNldEZpbGVVcmxzKCRldmVudClcIiBbaXNBenVyZVVwbG9hZF09XCJmb3JtRmllbGQuaXNBenVyZVVwbG9hZCA9PSBmYWxzZSA/IGZvcm1GaWVsZC5pc0F6dXJlVXBsb2FkIDogdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cGxvYWRGaWxlT25SZXR1cm4pPVwiZmlsZU9uY2hhbmdlRXZlbnQoKVwiPjwvc2UtZmlsZS11cGxvYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdCBCdXR0b24gRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TRUxFQ1RCVVRUT05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0LWJ1dHRvbi1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvc2VsZWN0LWJ1dHRvbi1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERpc3BsYXkgIENhcmQgZmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZvcm1GaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtblwiICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DQVJEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZC5yZXF1aXJlZEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGZvcm1GaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtY2FyZCBbY2FyZF09XCJmb3JtRmllbGQuY2FyZFwiIFtzZXRDYXJkRGF0YV09XCJzZXRDYXJkRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZENhcmQpPVwic2VsZWN0ZWRDYXJkQ2xpY2tFdmVudCgkZXZlbnQpXCI+PC9zZS1jYXJkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dmaWxlVXBsb2FkRXJyb3JcIiBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdGUgRGV0YWlsIEZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTk9URV9GSUVMRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxub3RlLWRldGFpbC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZU5vdGVGaWVsZERpYWxvZyhmb3JtRmllbGQpXCI+PC9ub3RlLWRldGFpbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEeW5hbWljIENvbXBvbmVudCBDb250YWluZXItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImZvcm1GaWVsZC5oaWRkZW4gPyAnaGlkZGVuJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInt7Zm9ybVNlY3Rpb24ubmFtZX19LXt7Zm9ybUZpZWxkSW5kZXh9fVwiICNkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ09NUE9ORU5UXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhlYWRlciBjb21wb25lbnQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNFQ1RJT05fSEVBREVSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24taGVhZGVyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIj48L3NlY3Rpb24taGVhZGVyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBPbkNsaWNrIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkFERF9CVVRUT05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkLWJ1dHRvbi1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIj48L2FkZC1idXR0b24tY29udHJvbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgR2VuZXJhdGUgUmVwb3J0IEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlJFUE9SVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWdlbmVyYXRlLXJlcG9ydC1idG4gW3JlcEluZm9dPVwiZm9ybUZpZWxkXCIgW2xhYmVsXT1cImZvcm1GaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJmb3JtRmllbGQubGFiZWxcIiBbcGFyYW1zXT1cImZvcm1GaWVsZC5wYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0RpYWxvZ109XCJmb3JtRmllbGQuc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiBmb3JtRmllbGQucmVwb3J0VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXBvcnRIZWFkZXJdPVwiZm9ybUZpZWxkLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwiZm9ybUZpZWxkLnJlcG9ydEZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBbaWNvbl09XCJmb3JtRmllbGQuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJmb3JtRmllbGQuY2xhc3NcIj48L3NlLWdlbmVyYXRlLXJlcG9ydC1idG4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBHZW5lcmF0ZSBFbWFpbCBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkVNQUlMXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZW1haWwtZ2VuZXJhdGUtYnRuIFtyZXBJbmZvXT1cImZvcm1GaWVsZFwiIFtsYWJlbF09XCJmb3JtRmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZm9ybUZpZWxkLmxhYmVsXCIgW3BhcmFtc109XCJmb3JtRmllbGQucGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEaWFsb2ddPVwiZm9ybUZpZWxkLnNob3dEaWFsb2dcIiBbcmVwb3J0VHlwZV09XCIgZm9ybUZpZWxkLnJlcG9ydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVwb3J0SGVhZGVyXT1cImZvcm1GaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImZvcm1GaWVsZC5yZXBvcnRGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCIgW2ljb25dPVwiZm9ybUZpZWxkLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9ybUZpZWxkLmNsYXNzXCI+PC9zZS1lbWFpbC1nZW5lcmF0ZS1idG4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgSW5wdXQgU3dpdGNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1dJVENIXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KGZvcm1GaWVsZClcIj48L0lucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBFZGl0b3IgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlRFWFRfRURJVE9SXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWVkaXRvci1jb250cm9sIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2UtZWRpdG9yLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XG4gICAgICAgICAgICAgICAgPC9wLWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIHNhdmUgYW5kIGNsb3NlIGJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGFjdGlvbnMtYnV0dG9ucy1tYWluLXdyYXBwZXIgZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCIgW25nQ2xhc3NdPVwieyBzdGlja3k6IHN0aWNreUFjdGlvbnMgfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXItc3RpY2t5IGZvcm0tY29tcG9uZW50IGFjdGlvbnMtYnV0dG9ucy13cmFwcGVyLWRpdlwiPlxuICAgICAgICAgIDwhLS0gc2F2ZSBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFoaWRlU2F2ZUJ1dHRvblwiIFtkaXNhYmxlZF09XCJpc0Zvcm1EaXNhYmxlZFwiIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgICBbbGFiZWxdPVwic2F2ZUJ1dHRvbkxhYmVsID8gc2F2ZUJ1dHRvbkxhYmVsIDogJ1NhdmUnXCIgY2xhc3M9XCJwLWJ1dHRvbi1zdWNjZXNzIGZvcm0tc2F2ZS1idXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2F2ZUZvcm0oKVwiPjwvYnV0dG9uPlxuICAgICAgICAgIDwhLS0gY2xvc2UgYnV0dG9uIC0tPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhaGlkZUNhbmNlbEJ1dHRvblwiIFtkaXNhYmxlZF09XCJpc0Zvcm1EaXNhYmxlZFwiIChjbGljayk9XCJvbkNhbmNlbEZvcm0oKVwiIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIiBbbGFiZWxdPVwiY2FuY2VsQnV0dG9uTGFiZWwgPyBjYW5jZWxCdXR0b25MYWJlbCA6ICdDYW5jZWwnXCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tZGFuZ2VyIG1sLTNcIj48L2J1dHRvbj5cbiAgICAgICAgICA8IS0tIGR5bmFtaWMgYnV0dG9ucyAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidXR0b24gb2YgZm9ybUJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhYnV0dG9uLmhpZGRlblwiIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIFtsYWJlbF09XCJidXR0b24ubGFiZWxcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJidXR0b24uaWNvbiA/IGJ1dHRvbi5pY29uIDogJydcIiBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3MgbWwtM1wiIChjbGljayk9XCJvbk5ld0J1dHRvbkNsaWNrKGJ1dHRvbilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnV0dG9uLmRpc2FibGVkID8gYnV0dG9uLmRpc2FibGVkIDogZmFsc2VcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG4gIDxwLW92ZXJsYXlQYW5lbCBbc3R5bGVdPVwib3ZlcmxheVBhbmVsU3R5bGVcIiAjb3ZlcmxheVBhbmVsPlxuICAgIDxuZy1jb250YWluZXIgI3ZpZXdDb250YWluZXJSZWY+PC9uZy1jb250YWluZXI+XG4gIDwvcC1vdmVybGF5UGFuZWw+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCIhc3BsaXRTY3JlZW5cIj5cbiAgPGRpdiAjYXBwZW5kRm9ybT48L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
1524
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZS11aS10b29sa2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUErQyxZQUFZLEVBQStCLGdCQUFnQixFQUFjLFlBQVksRUFBcUIsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBSWxQLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBMEMsVUFBVSxFQUE2QixXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsZUFBZSxFQUFlLE1BQU0saUNBQWlDLENBQUM7QUFFL0UsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNN0QsT0FBTyxFQUFnQixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXRDLE1BQU0sT0FBTyxhQUFhO0lBc0J4QixJQUFhLGNBQWMsQ0FBQyxHQUFRO1FBQ2xDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtZQUNoQixR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RUFBRTtnQkFFakMsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBTU8sY0FBYztzQkFBMUIsS0FBSztnQkFLSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkF3RFAsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIENvbXBvbmVudEZhY3RvcnksIFZpZXdDb250YWluZXJSZWYsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgUmVuZGVyZXIyLCBOZ1pvbmUsIFZpZXdDaGlsZCwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XG5pbXBvcnQgeyBOb3Rlc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9ub3Rlcy9ub3Rlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRUZvcm1Db250cm9sLCBFSHlwZXJsaW5rLCBJRm9ybUZpZWxkLCBJRHluYW1pY0Zvcm0sIElGb3JtU2VjdGlvbiwgRVZhbGlkYXRvciwgSUR5bmFtaWNDYXJkLCBJRm9ybUJ1dHRvbiwgRUZvcm1hdFR5cGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBFUGVybWlzc2lvblR5cGUsIElQZXJtaXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3VzZXItaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIHV0aWxpdGllcyBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBJZnJhbWVDb21wb25lbnQgfSBmcm9tICcuLi9pZnJhbWUvaWZyYW1lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb21tb24ubW9kZWwnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IFBhZ2VMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFnZS1sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGludGVydmFsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBIeXBlcmxpbmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaHlwZXJsaW5rLnNlcnZpY2UnO1xuaW1wb3J0IHsgY3VycmVudFVybCwgZHJhZ2dhYmxlRGlhbG9nIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElPdmVybGF5UGFuZWxEYXRhIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dyaWQubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkKCd2aWV3Q29udGFpbmVyUmVmJywge3JlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzp0cnVlfSlcbiAgcHVibGljIHBhbmVsT3ZlcmxheVZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGRyZW4oJ2R5bmFtaWNDb21wb25lbnRDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcjogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+O1xuXG4gIEBWaWV3Q2hpbGQoJ3ZpZXdDb250YWluZXJGb3JtUmVmJykgdmlld0NvbnRhaW5lckZvcm1SZWYhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdhcHBlbmRGb3JtJywgeyBzdGF0aWM6IGZhbHNlIH0pIGdldFRhcmdldGVkRm9ybURpdjogRWxlbWVudFJlZjtcbiAgXG4gIEBJbnB1dCgpIHN0aWNreUFjdGlvbnM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBmb3JtOiBJRHluYW1pY0Zvcm07XG4gIEBJbnB1dCgpIHNhdmVCdXR0b25MYWJlbDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGNhbmNlbEJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgaGlkZVNhdmVCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaGlkZUNhbmNlbEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBmb3JtQnV0dG9uczogSUZvcm1CdXR0b25bXSA9IFtdO1xuICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgb3ZlcmxheVBhbmVsU3R5bGU6IHt9O1xuICBwYW5lbEluZm86IGFueTtcbiAgc2VGb3JtT2JqOiBhbnk7XG4gIG1vZGVsU3BsaXRTY3JlZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2V0IGFjdGl2ZVRlc3RNb2RlKHZhbDogYW55KSB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgICAgZGVidWdnZXI7XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoKSBzYXZlRm9ybTogRXZlbnRFbWl0dGVyPElGb3JtU2VjdGlvbltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGNhbmNlbEZvcm06IEV2ZW50RW1pdHRlcjxJRm9ybVNlY3Rpb25bXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBkcm9wRG93bkNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNlY3Rpb25DbGlja2VkRXZlbnQ6IEV2ZW50RW1pdHRlcjxJRm9ybVNlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGR5bmFtaWNDYXNlID0gRUZvcm1Db250cm9sO1xuICBzYXZlRm9ybVBhZ2U6IFN1YnNjcmlwdGlvbjtcbiAgcGVybWlzc2lvblR5cGUgPSBFUGVybWlzc2lvblR5cGU7XG4gIHJvbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBpc0Zvcm1EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0Zvcm1IaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29tcG9uZW50c0xpc3Q6IElEaWN0aW9uYXJ5W10gPSBbXTtcbiAgZmlsZVVwbG9hZFVybHM6IGFueTtcbiAgc2hvd2ZpbGVVcGxvYWRFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBjYXJkTGlzdDogSUR5bmFtaWNDYXJkO1xuICBjYWxlbmRhclByZXZpb3VzVmFsdWU6IHN0cmluZyA9ICcnO1xuICBkZWZhdWx0RGF0ZTogc3RyaW5nID0gJyc7XG4gIGxvb2t1cEZvY3VzT3V0OiBib29sZWFuID0gZmFsc2U7XG4gIGNhbGVuZGFyRm9ybWF0OiBzdHJpbmcgPSAnbW0vZGQveXknO1xuICBzZXRDYXJkRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBzcGxpdFNjcmVlbiA6IGJvb2xlYW49IGZhbHNlO1xuICBkaWFsb2dSZWY6IGFueTtcblxuICAvLyBhcHBseSBjaGVja2VkL3VuQ2hlY2tlZCBwcm9wIGZvciBDaGVja0JveCBvZiB0aGUgRm9ybVxuICBjaGVja2VkOiBib29sZWFuID0gdHJ1ZTtcbiAgdW5DaGVja2VkOiBib29sZWFuID0gZmFsc2U7XG4gIGR5bmFtaWNGb3JtSWQgPSBcInNlLWZvcm0tY29tcG9uZW50LWRpdlwiO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhlbnRpY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1TZXJ2aWNlOiBGb3JtU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBoeXBlcmxpbmtTZXJ2aWNlIDogSHlwZXJsaW5rU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLFxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IEdyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGFnZUxvZ2dlclNlcnZpY2U6IFBhZ2VMb2dnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UuaW5jcmVtZW50Q2FsbHMoKTtcbiAgICBpZiAodGhpcy5ncmlkU2VydmljZS5nZXROdW1iZXJPZkNhbGxzKCkgPT09IDEpIHtcbiAgICAgIHRoaXMuZHluYW1pY0Zvcm1JZCA9ICdzZS1mb3JtLWNvbXBvbmVudC1kaXYnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmR5bmFtaWNGb3JtSWQgPSBgRm9ybV8ke2N1cnJlbnRVcmwoKX1fJHt0aGlzLmdyaWRTZXJ2aWNlLmdldE51bWJlck9mQ2FsbHMoKX1gO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZHluYW1pY0Zvcm1JZCk7XG4gIH1cblxuICAvLyBicm93c2VyIHRhYiBjbG9zZSBldmVudFxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6YmVmb3JldW5sb2FkJywgWyckZXZlbnQnXSlcbiAgYmVmb3JldW5sb2FkSGFuZGxlcihldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuZm9ybVNlcnZpY2UuZmllbGRGb2N1c2VkT3V0IHx8IHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICAvLyB0aGlzLmZvcm1TZXJ2aWNlLnNldFRvb2x0aXAoKTtcbiAgICAvLyBhcHBseSB1c2VyIHJvbGUgcGVybWlzc2lvbnMgb24gZm9ybVxuICAgIHRoaXMucm9sZXMgPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFVzZXJSb2xlcygpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuZm9ybSAmJlxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucyAmJlxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICAvLyBzdGFydCBjYXJkTGlzdCByZWZlcmVuY2UgYnJlYWsgZnVuY3Rpb25hbGl0eVxuICAgICAgbGV0IGZvcm1WYWx1ZXMgPSB7IC4uLnRoaXMuZm9ybSB9O1xuXG4gICAgICBmb3JtVmFsdWVzLmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKGZvcm1TZWN0aW9uLmZpZWxkcykge1xuICAgICAgICAgIGlmKGZvcm1TZWN0aW9uLmhlYWRlckZpZWxkcz8ubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICBmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHMuZm9yRWFjaCgoaGVhZGVyRmllbGQpPT57XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tGaWVsZFJlcXVpcmVkKGhlYWRlckZpZWxkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrRmllbGRSZXF1aXJlZChmaWVsZCk7XG4gICAgICAgICAgICBpZiAoZmllbGQuaXNQYXNzd29yZCkge1xuICAgICAgICAgICAgICBmaWVsZC50ZXh0VHlwZSA9ICdwYXNzd29yZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB0aW1lIGludG8gZGF0ZVxuICAgICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIgJiYgZmllbGQ/Lm9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgIGZpZWxkWydwcmV2aW91c1ZhbHVlJ10gPSBmaWVsZD8udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIgJiZcbiAgICAgICAgICAgICAgZmllbGQ/LnRpbWVPbmx5ICYmXG4gICAgICAgICAgICAgIChmaWVsZD8udmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0FNJykgfHxcbiAgICAgICAgICAgICAgICBmaWVsZD8udmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1BNJykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0VGltZUluRGF0ZShmaWVsZC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQVVUT0NPTVBMRVRFICYmXG4gICAgICAgICAgICAgIGZpZWxkPy52YWx1ZSAmJlxuICAgICAgICAgICAgICBmaWVsZD8udmFsdWU/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkPy52YWx1ZS5tYXAoXG4gICAgICAgICAgICAgICAgKHZhbHVlOiBhbnkpID0+IHZhbHVlW2ZpZWxkPy5kaXNwbGF5RmllbGRdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgICh2YWx1ZS50b1N0cmluZygpPy5pbmNsdWRlcygnOycpIHx8XG4gICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpPy5pbmNsdWRlcygnLCcpKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJywnLCAnOycpXG4gICAgICAgICAgICAgICAgICA/LnNwbGl0KCc7JylcbiAgICAgICAgICAgICAgICAgID8ubWFwKCh2YWw6IGFueSkgPT4gKHsgW2ZpZWxkPy5kaXNwbGF5RmllbGRdOiB2YWwgfSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSBtdWx0aVNlbGVjdCBzdHJpbmcgdmFsdWUgaW4gYXJyYXlcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5NVUxUSVNFTEVDVCAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSAmJlxuICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlLnJlcGxhY2UoL1xccyosXFxzKi9nLCBcIixcIik/LnRvU3RyaW5nKCk/LnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBbZmllbGQudmFsdWVdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEKSB7XG4gICAgICAgICAgICAgIHRoaXMuZm9ybSA9IHt9O1xuICAgICAgICAgICAgICBmaWVsZD8uY2FyZD8uZGF0YT8uZm9yRWFjaCgoeDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgZmllbGQ/LmNhcmQ/LmZvcm1TZWN0aW9ucyAmJlxuICAgICAgICAgICAgICAgICAgZmllbGQ/LmNhcmQ/LmZvcm1TZWN0aW9ucz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgeC5keW5hbWljRm9ybSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb25zOiBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGZpZWxkPy5jYXJkPy5mb3JtU2VjdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuZm9ybSA9IGZvcm1WYWx1ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFbmQgY2FyZExpc3QgcmVmZXJlbmNlIGJyZWFrIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgICAgIGlmIChmaWVsZD8uY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNIRUNLQk9YKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID1cbiAgICAgICAgICAgICAgICBmaWVsZD8udmFsdWU/LnRvU3RyaW5nKCk/LnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyB8fFxuICAgICAgICAgICAgICAgICAgZmllbGQ/LnZhbHVlPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpID09PSAneScgfHxcbiAgICAgICAgICAgICAgICAgIGZpZWxkPy52YWx1ZT8udG9TdHJpbmcoKSA9PT0gJzEnXG4gICAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuSFlQRVJMSU5LKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC5oeXBlcmxpbms/LnRhcmdldFVzZVVzZXJQcmVmICYmIGZpZWxkLmh5cGVybGluaz8ucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZmllbGQuaHlwZXJsaW5rLnBhcmFtcyk/LmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0S2V5VmFsdWUgPSB1dGlsaXRpZXMuZ2V0Rm9ybUZpZWxkVmFsdWUodGhpcy5mb3JtLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgZmllbGQuaHlwZXJsaW5rLnBhcmFtc1trZXldID0gZ2V0S2V5VmFsdWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmFwcGx5VXNlclBlcm1pc3Npb25zKCk7XG4gICAgICB0aGlzLnJlbW92ZVdoaXRlU3BhY2VzKCk7XG4gICAgICB0aGlzLnNldEh5cGVybGlua0NvbXBvbmVudFJvdXRlKCk7XG4gICAgICB0aGlzLnNldENhbGFuZGVyV2lkdGgoKTtcbiAgICAgIHRoaXMub3JkZXJGb3JtU2VjdGlvbnMoKTtcbiAgICAgIHRoaXMub25EeW5hbWljRm9ybVN0YXRlQ2hhbmdlKCk7XG4gICAgICB0aGlzLmxpc3RlblRvU3BsaXRTY3JlZW5DaGFuZ2UoKTtcbiAgICB9XG4gIH1cbiAgb3JkZXJGb3JtU2VjdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuZm9ybSAmJiB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50VXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdDdXJyZW50VXNlckluZm8nKSk7XG4gICAgICBsZXQgdXNlclNlY3Rpb24gPSBjdXJyZW50VXNlckluZm8/LnBhZ2VTZWN0aW9ucz8ubGVuZ3RoID4gMCA/IGN1cnJlbnRVc2VySW5mby5wYWdlU2VjdGlvbnMgOiBbXTtcbiAgICAgIGNvbnN0IHBhZ2VVcmwgPSB0aGlzLnBhZ2VOYW1lKCk7XG4gICAgICBpZiAodXNlclNlY3Rpb24/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXNlclNlY3Rpb24gPSB1c2VyU2VjdGlvbi5zb3J0KChhLCBiKSA9PiBiLmlkIC0gYS5pZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwidXNlclNlY3Rpb246XCIsIHVzZXJTZWN0aW9uKVxuICAgICAgICB1c2VyU2VjdGlvbi5mb3JFYWNoKChwYWdlU2VjdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hdGNoZWROYW1lOiBib29sZWFuID0gdGhpcy5mb3JtLmZvcm1TZWN0aW9ucz8uc29tZSgoc2VjdGlvbikgPT4gcGFnZVNlY3Rpb24/LnNlY3Rpb24/LnRvTG93ZXJDYXNlKCkgPT09IHNlY3Rpb24/Lm5hbWU/LnRvTG93ZXJDYXNlKCkpICYmIHBhZ2VTZWN0aW9uPy5wYWdlPy50b0xvd2VyQ2FzZSgpID09PSBwYWdlVXJsPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChtYXRjaGVkTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5maW5kSW5kZXgoKHNlY3Rpb24pID0+IHBhZ2VTZWN0aW9uPy5zZWN0aW9uPy50b0xvd2VyQ2FzZSgpID09PSBzZWN0aW9uPy5uYW1lPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmIChwYWdlU2VjdGlvbi5yb2xlKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVzPy5sZW5ndGggPiAwICYmIHRoaXMucm9sZXMuaW5jbHVkZXMocGFnZVNlY3Rpb24ucm9sZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN3YXBTZWN0aW9ucyhwYWdlU2VjdGlvbi5vcmRlciAtIDEsIGluZGV4KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zW2luZGV4XS5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnN3YXBTZWN0aW9ucyhwYWdlU2VjdGlvbi5vcmRlciAtIDEsIGluZGV4KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH07XG4gIH1cbiAgc3dhcFNlY3Rpb25zKG9yZGVyOiBudW1iZXIsIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByZU9yZGVyU2VjdGlvbiA9IHsgLi4udGhpcy5mb3JtLmZvcm1TZWN0aW9uc1tvcmRlcl0gfTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zW29yZGVyXSA9IHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdO1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnNbaW5kZXhdID0gcmVPcmRlclNlY3Rpb247XG4gIH1cbiAgcGFnZU5hbWUoKSB7XG4gICAgbGV0IHVybCA9IHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpO1xuICAgIGlmICh1cmw/LmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIHVybCA9IHVybC5zcGxpdCgnPycpWzBdO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHNldEZvcm1TZWN0aW9uKHNlY3Rpb24sIGluZGV4LCBwYWdlU2VjdGlvbikge1xuICAgIGNvbnN0IHJlT3JkZXJTZWN0aW9uID0geyAuLi5zZWN0aW9uIH07XG4gICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMuc3BsaWNlKHBhZ2VTZWN0aW9uPy5vcmRlciAtIDEsIDAsIHJlT3JkZXJTZWN0aW9uKTtcbiAgfVxuICBjaGVja0ZpZWxkUmVxdWlyZWQoZmllbGQ6IGFueSkge1xuICAgaWYoZmllbGQudmFsaWRhdGlvbnM/LmZpbmQodmFsaWRhdGlvbj0+dmFsaWRhdGlvbi50eXBlPT09RVZhbGlkYXRvci5SRVFVSVJFRCkpe1xuICAgICAgZmllbGQucmVxdWlyZWRGaWVsZCA9IHRydWU7XG4gICB9XG4gIH1cblxuICAvLyBzZXQgY2FsZW5kYXIgMiBPciA0IGRpZ2l0IHllYXIgZm9ybWF0XG4gIGNhbGVuZGFySW5wdXRWYWx1ZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZighZm9ybUZpZWxkLnRpbWVPbmx5KXtcbiAgICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmb3JtRmllbGQuZmllbGQpWzBdXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKHZhbDogYW55KSA9PiB7XG4gICAgICAgIGlmICghdmFsPy50YXJnZXQ/LnZhbHVlPy5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgaWYgKHZhbD8udGFyZ2V0Py52YWx1ZT8ubGVuZ3RoID09IDggfHwgZm9ybUZpZWxkPy5mb3JtYXQ/LnR5cGUgPT09IEVGb3JtYXRUeXBlLlNIT1JUREFURSkge1xuICAgICAgICAgICAgdmFsLnRhcmdldC52YWx1ZSA9IHZhbD8udGFyZ2V0Py52YWx1ZT8ucmVwbGFjZSgvKFxcZHsyfSkoXFxkezJ9KShcXGR7NH0pLywgJyQxLyQyLyQzJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHZhbD8udGFyZ2V0Py52YWx1ZS5sZW5ndGggPT0gNikge1xuICAgICAgICAgICAgdmFsLnRhcmdldC52YWx1ZSA9IHZhbD8udGFyZ2V0Py52YWx1ZT8ucmVwbGFjZSgvKFxcZHsyfSkoPz1cXGQpL2csICckMS8nKS50b1N0cmluZygpO1xuICAgICAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdmFsPy50YXJnZXQ/LnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB5ZWFyID0gdmFsPy50YXJnZXQ/LnZhbHVlPy50b1N0cmluZygpLnNwbGl0KCcvJylbMl07XG4gICAgICAgIGlmICh5ZWFyPy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3l5JztcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZSh2YWw/LnRhcmdldD8udmFsdWUpPy50b0xvY2FsZURhdGVTdHJpbmcoXG4gICAgICAgICAgICAnZW4tVVMnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3knO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgIFxuICB9XG5cbiAgLy8gc2V0IHBlcmNlbnQgYW5kIGRlY2ltYWwgdmFsdWVzXG4gIHNldG51bWVyaWN2YWx1ZXMoKSB7XG4gICAgdGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzKSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGZpZWxkPy5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTlVNRVJJQykge1xuICAgICAgICAgICAgY29uc3QgZGlnaXRzSW5mbyA9IGZpZWxkPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcbiAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5hbGxvd0NhbGN1bGF0ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICAgIChmaWVsZC52YWx1ZSAqIDEwMCk/LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSAqIDEwMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZ2l0c0luZm8pIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChmaWVsZC52YWx1ZSkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnKSB7XG4gICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KGZpZWxkLnZhbHVlKS50b0ZpeGVkKFxuICAgICAgICAgICAgICAgICAgZGlnaXRzSW5mbyA/IGRpZ2l0c0luZm8gOiAyXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZm9ybSBoYXMgYW55IGZpZWxkIHdpdGggZHluYW1pYyBjb21wb25lbnQ7XG4gICAqIENyZWF0ZXMgY29tcG9uZW50IGluc3RhbmNlIHVzaW5nIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxuICAgKiBJbmplY3RzIGNvbXBvbmVudCB0aHJvdWdoIHZpZXdSZWYuY3JlYXRlQ29tcG9uZW50KClcbiAgICogUGFzc2VzIGRhdGEgdG8gY29tcG9uZW50XG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIGV2ZW50cyBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudHNcbiAgICogRmluYWxseSBmb3JjZXMgQW5ndWxhciB0byBkZXRlY2ggY2hhbmdlc1xuICAgKi9cbiBcbiAgbG9hZER5bmFtaWNDb21wb25lbnRzKCkge1xuICAgIHRoaXMuY29tcG9uZW50c0xpc3QgPSBbXTtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoZm9ybVNlY3Rpb24pID0+IHtcbiAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55LCBmaWVsZEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ09NUE9ORU5UKSB7XG4gICAgICAgICAgY29uc3Qgdmlld1JlZjogYW55ID0gdGhpcy5keW5hbWljQ29tcG9uZW50Q29udGFpbmVyLmZpbmQoXG4gICAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgICAgeC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaWQgPT0gYCR7Zm9ybVNlY3Rpb24ubmFtZX0tJHtmaWVsZEluZGV4fWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogQ29tcG9uZW50LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGhhbmRsZXJzLFxuICAgICAgICAgIH0gPSBmaWVsZC5jb21wb25lbnRDb250cm9sO1xuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PiA9XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShDb21wb25lbnQpO1xuICAgICAgICAgIC8vIFBhc3NpbmcgZGF0YSB0byBjb21wb25lbnRcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB2aWV3UmVmPy5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgaWYoZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkKXtcbiAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlcjIuYWRkQ2xhc3MoY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIGZpZWxkLmNvbXBvbmVudENvbnRyb2wuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSA/PyB7fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xpc3QucHVzaCh7XG4gICAgICAgICAgICAgIG5hbWU6IGZpZWxkLmNvbXBvbmVudENvbnRyb2w/LmlkLFxuICAgICAgICAgICAgICB2YWx1ZTogY29tcG9uZW50UmVmLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBTdWJzY3JpYmVzIHRvIHRoZSBldmVudHMgcGFzc2VkIHRvIHRoZSBjb21wb25lbnRzXG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaGFuZGxlcnMpLmZvckVhY2goKFtldmVudCwgaGFuZGxlcl06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIChjb21wb25lbnRSZWYuaW5zdGFuY2VbZXZlbnRdIGFzIEV2ZW50RW1pdHRlcjxhbnk+KT8uc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpbnZva2UgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvL2ludm9rZSB3aGVuIGZpbGUgdXBsb2FkIE9SIGRlbGV0ZSBhIGZpbGVcbiAgZmlsZU9uY2hhbmdlRXZlbnQoKSB7XG4gICAgdGhpcy5zZXRDYXJkRGF0YSA9ICF0aGlzLnNldENhcmREYXRhO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIGxvYWQgZHluYW1pYyBjb21wb25lbnRzIGlmIGV4aXN0IGluIGZvcm1cbiAgICB0aGlzLnNldG51bWVyaWN2YWx1ZXMoKTtcbiAgICB0aGlzLm9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpO1xuICAgIHRoaXMubGlzdGVuVG9TcGxpdFNjcmVlbkNoYW5nZSgpO1xuICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnRzKCk7XG4gICAgdGhpcy5zZXRDYXJkUmVzcG9uc2VJZCgpO1xuICB9XG5cbiAgc2V0Q2FyZFJlc3BvbnNlSWQoKSB7XG4gICAgdXRpbGl0aWVzLm9uRHluYW1pY0NhcmRTdGF0ZUNoYW5nZSgpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZihyZXMuZGF0YT8uaXNTYXZlKXtcbiAgICAgICAgdGhpcy5zZXRDYXJkSWRzKHJlcy5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0RGVsZXRlQ2FyZElkKHJlcy5kYXRhPy5jYXJkRGF0YSwgcmVzLmRhdGE/LmR5bmFtaWNGb3JtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldERlbGV0ZUNhcmRJZCh1cGRhdGVkQ2FyZERhdGE6YW55LCBkeW5hbWljRm9ybTogSUR5bmFtaWNGb3JtKXtcbiAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucz8uZm9yRWFjaCgoc2VjdGlvbjpJRm9ybVNlY3Rpb24pPT57XG4gICAgICBjb25zdCBjYXJkQ29udHJvbCA9IHNlY3Rpb24uZmllbGRzLmZpbmQoKGZpZWxkOklGb3JtRmllbGQpPT4gZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBUkQpO1xuICAgICAgaWYoY2FyZENvbnRyb2wpe1xuICAgICAgICBjYXJkQ29udHJvbC5jYXJkLmRhdGEgPSB1cGRhdGVkQ2FyZERhdGE7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIGR5bmFtaWNGb3JtID0gdGhpcy5mb3JtO1xuICB9XG5cbiAgc2V0Q2FyZElkcyhyZXMpIHtcbiAgICByZXMucmVjb3JkcyA9IHRoaXMuZ3JpZFNlcnZpY2Uuc2V0RGF0YUZpZWxkcyhyZXMucmVjb3Jkcyk7XG4gICAgcmVzLnJlY29yZHM/LmZvckVhY2goKHJlY29yZDogYW55LCByZWNvcmRJbmRleDogYW55KSA9PiB7XG4gICAgICBjb25zdCBtYXRjaENhcmQgPSByZXMuY2FyZHNJbmZvPy5maW5kKFxuICAgICAgICAoaW5mbywgY2FyZEluZGV4KSA9PlxuICAgICAgICAgIHJlY29yZEluZGV4ID09PSBjYXJkSW5kZXggJiYgcmVjb3JkW3Jlcy5maWVsZE5hbWU/LnRvTG93ZXJDYXNlKCldXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoQ2FyZCAmJiBPYmplY3Qua2V5cyhtYXRjaENhcmQpPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1hdGNoQ2FyZFtyZXMuZmllbGROYW1lXSA9IHJlY29yZFtyZXMuZmllbGROYW1lPy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGhpcy5mb3JtPy5mb3JtU2VjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQ7XG4gICAgICB0aGlzLmZvcm0/LmZvcm1TZWN0aW9ucy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZihyZXMuY2FyZElkKXtcbiAgICAgICAgICBmb3JtRmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHM/LmZpbmQoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEICYmIGZpZWxkLmlkID09PSByZXMuY2FyZElkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHM/LmZpbmQoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQVJEXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGZvcm1GaWVsZCkge1xuICAgICAgICAgIGlmIChyZXMuY2FyZHNJbmZvPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXMuY2FyZHNJbmZvPy5mb3JFYWNoKChjYXJkSWQpID0+IHtcbiAgICAgICAgICAgICAgY2FyZElkLmlkID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JtRmllbGQuY2FyZC5kYXRhID0gcmVzLmNhcmRzSW5mbztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2V0Q2FyZERhdGEgPSAhdGhpcy5zZXRDYXJkRGF0YTtcbiAgfVxuXG4gIHJlbW92ZVdoaXRlU3BhY2VzKCkge1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoc2VjdGlvbi5jbGFzcykgc2VjdGlvbi5jbGFzcyA9IHNlY3Rpb24uY2xhc3MucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldEh5cGVybGlua0NvbXBvbmVudFJvdXRlKCkge1xuICAgIHRoaXMuZm9ybT8uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuSFlQRVJMSU5LICYmXG4gICAgICAgICAgZmllbGQuaHlwZXJsaW5rPy5jb21wb25lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIucmVzZXRDb25maWcoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiAnaHlwZXJsaW5rJyArIGZpZWxkLmxhYmVsLFxuICAgICAgICAgICAgICBjb21wb25lbnQ6IGZpZWxkLmh5cGVybGluay5jb21wb25lbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4udGhpcy5yb3V0ZXIuY29uZmlnLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGJyb3dzZXJUYWJDbG9zZUV2ZW50KGV2ZW50OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGV2ZW50O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKXtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuICBsaXN0ZW5Ub1NwbGl0U2NyZWVuQ2hhbmdlKCkge1xuICAgIHV0aWxpdGllcy5vblNjcmVlblNwbGl0Q2hhbmdlKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICBsZXQgbG9va3VwTW9kYWw6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3AtZGlhbG9nJylbMF07XG4gICAgICBpZiAobG9va3VwTW9kYWwpIHtcbiAgICAgICAgdGhpcy5zZUZvcm1PYmogPSBsb29rdXBNb2RhbCA/IGxvb2t1cE1vZGFsPy5xdWVyeVNlbGVjdG9yKGAjJHt0aGlzLmR5bmFtaWNGb3JtSWR9YCkgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5zZUZvcm1PYmogJiYgdGhpcy5zZUZvcm1PYmpbJ25hdGl2ZUVsZW1lbnQnXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5zZUZvcm1PYmpbJ25hdGl2ZUVsZW1lbnQnXSA9IHRoaXMuc2VGb3JtT2JqO1xuICAgICAgICAgIHRoaXMucGFuZWxJbmZvID0ge307XG4gICAgICAgICAgdGhpcy5wYW5lbEluZm8uZXhpc3RpbmdDb3Btb25lbnQgPSB0aGlzLnNlRm9ybU9iajtcbiAgICAgICAgICB0aGlzLnBhbmVsSW5mby5wYW5lbENvbXBvbmVudCA9IHJlcy5wYW5lbENvbXBvbmVudDtcbiAgICAgICAgICB0aGlzLnNwbGl0U2NyZWVuID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLm1vZGVsU3BsaXRTY3JlZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLnNlRm9ybU9iaikge1xuICAgICAgICAgICAgdGhpcy5wYW5lbEluZm8gPSB7fTtcbiAgICAgICAgICAgIHRoaXMucGFuZWxJbmZvLmV4aXN0aW5nQ29wbW9uZW50ID0gdGhpcy5zZUZvcm1PYmo7XG4gICAgICAgICAgICB0aGlzLnBhbmVsSW5mby5wYW5lbENvbXBvbmVudCA9IHJlcy5wYW5lbENvbXBvbmVudDtcbiAgICAgICAgICAgIHRoaXMuc3BsaXRTY3JlZW4gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5tb2RlbFNwbGl0U2NyZWVuID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnBhbmVsSW5mbyA9IHt9O1xuICAgICAgICB0aGlzLnBhbmVsSW5mby5wYW5lbENvbXBvbmVudCA9IHJlcy5wYW5lbENvbXBvbmVudDtcbiAgICAgICAgdGhpcy5wYW5lbEluZm8uY29uZmlnRGF0YSA9IHJlcy5jb25maWdEYXRhO1xuICAgICAgICB0aGlzLnBhbmVsSW5mby5leGlzdGluZ0NvcG1vbmVudCA9IHRoaXMudmlld0NvbnRhaW5lckZvcm1SZWY7XG4gICAgICAgIHRoaXMuc3BsaXRTY3JlZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLm1vZGVsU3BsaXRTY3JlZW4gPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mb3JtLXNhdmUtYnV0dG9uJyk7XG4gICAgICAgIGlmIChzYXZlQnV0dG9uKSB7XG4gICAgICAgICAgc2F2ZUJ1dHRvbi5jbGFzc0xpc3Q/LmFkZCgncC1zYXZlLWJ1dHRvbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kVmlld0NvbnRhaW5lclRvRGl2KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZVBhbmVsKCkge1xuICAgIHRoaXMuc3BsaXRTY3JlZW4gPSBmYWxzZTtcbiAgICBjb25zdCBzYXZlQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnAtc2F2ZS1idXR0b24nKTtcbiAgICBpZiAoc2F2ZUJ1dHRvbikge1xuICAgICAgICBzYXZlQnV0dG9uLmNsYXNzTGlzdD8ucmVtb3ZlKCdwLXNhdmUtYnV0dG9uJyk7XG4gICAgfVxuICAgIHRoaXMuYXBwZW5kVmlld0NvbnRhaW5lclRvRGl2KCk7XG4gIH1cblxuICBhcHBlbmRWaWV3Q29udGFpbmVyVG9EaXYoKSB7XG4gICAgbGV0IGZvcm1Db250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMubW9kZWxTcGxpdFNjcmVlbiA/IHRoaXMuc2VGb3JtT2JqPy5uYXRpdmVFbGVtZW50IDogdGhpcy52aWV3Q29udGFpbmVyRm9ybVJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgLnBpcGUodGFrZSgxKSlcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmdldFRhcmdldGVkRm9ybURpdj8ubmF0aXZlRWxlbWVudCAmJiBmb3JtQ29udGFpbmVyRWxlbWVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlcjI/LmFwcGVuZENoaWxkKHRoaXMuZ2V0VGFyZ2V0ZWRGb3JtRGl2Py5uYXRpdmVFbGVtZW50LCBmb3JtQ29udGFpbmVyRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIExpc3RlbnMgYW55IGNoYW5nZSBpbiBEeW5hbWljIEZvcm0gY29tcG9uZW50IFN0YXRlXG4gICAqL1xuXG4gIG9uRHluYW1pY0Zvcm1TdGF0ZUNoYW5nZSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHV0aWxpdGllcy5vbkR5bmFtaWNGb3JtU3RhdGVDaGFuZ2UoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UuaWQgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWZPYmogPSB0aGlzLmNvbXBvbmVudHNMaXN0LmZpbmQoXG4gICAgICAgICAgKHgpID0+IHgubmFtZSA9PT0gcmVzcG9uc2UuaWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZk9iaikge1xuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlLmRhdGEgPz8ge30pLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgY29tcG9uZW50UmVmT2JqLnZhbHVlLmluc3RhbmNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZihyZXNwb25zZT8ubG9hZENvbXBvbmVudCl7XG4gICAgICAgICAgICBjb21wb25lbnRSZWZPYmoudmFsdWUuaW5zdGFuY2UubmdPbkluaXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gYXBwbHkgdXNlciByb2xlIHBlcm1pc3Npb25zXG4gIGFwcGx5VXNlclBlcm1pc3Npb25zKCkge1xuICAgIGlmICh0aGlzLmZvcm0gJiYgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucykge1xuICAgICAgbGV0IHRvdGFsRmllbGRzOiBudW1iZXIgPSAwO1xuICAgICAgbGV0IGRpc2FibGVkRmllbGRzOiBudW1iZXIgPSAwO1xuICAgICAgbGV0IGhpZGRlbkZpZWxkczogbnVtYmVyID0gMDtcblxuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzKSB7XG4gICAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZvcm1GaWVsZCkgPT4ge1xuICAgICAgICAgICAgbGV0IHBlcm1pc3Npb25zOiBhbnkgPSBmb3JtRmllbGQucGVybWlzc2lvbnM7XG4gICAgICAgICAgICBsZXQgc2VjdGlvblBlcm1pc3Npb25zOiBhbnkgPSBbXTtcbiAgICAgICAgICAgIGlmICghcGVybWlzc2lvbnMpIHNlY3Rpb25QZXJtaXNzaW9ucyA9IGZvcm1TZWN0aW9uLnBlcm1pc3Npb25zO1xuICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9ucykgcGVybWlzc2lvbnMgPSB0aGlzLmZvcm0ucGVybWlzc2lvbnM7XG4gICAgICAgICAgICBsZXQgaGFzVmFsaWRFZGl0UGVybWlzc2lvbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoc2VjdGlvblBlcm1pc3Npb25zICYmIHNlY3Rpb25QZXJtaXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHNlY3Rpb25QZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXNWYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb24ucm9sZXMuZm9yRWFjaCgocm9sZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQgJiYgdGhpcy5yb2xlcyAmJiB0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbi50eXBlID09PSBFUGVybWlzc2lvblR5cGUuVklFVykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5FRElUKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uYWNjb3JkaW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1TZWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9ucyAmJiBwZXJtaXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb246IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHBlcm1pc3Npb24ucm9sZXMgJiYgcGVybWlzc2lvbi5yb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLnJvbGVzLmZvckVhY2goKHJvbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQgJiYgdGhpcy5yb2xlcyAmJiB0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLnR5cGUgPT09IEVQZXJtaXNzaW9uVHlwZS5WSUVXICYmXG4gICAgICAgICAgICAgICAgICAgICFoYXNWYWxpZEVkaXRQZXJtaXNzaW9uXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1pc3Npb24udHlwZSA9PT0gRVBlcm1pc3Npb25UeXBlLkVESVQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBoYXNWYWxpZEVkaXRQZXJtaXNzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQuaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLnBlcm1pc3Npb25zICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGQucGVybWlzc2lvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybVNlY3Rpb24uZGlzYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtU2VjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uYWNjb3JkaW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVNlY3Rpb24uYWNjb3JkaW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0b3RhbEZpZWxkcysrO1xuXG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgIGRpc2FibGVkRmllbGRzKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQuaGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGRlbkZpZWxkcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pc0Zvcm1EaXNhYmxlZCA9IHRvdGFsRmllbGRzID4gMCAmJiB0b3RhbEZpZWxkcyA9PT0gZGlzYWJsZWRGaWVsZHM7XG4gICAgICB0aGlzLmlzRm9ybUhpZGRlbiA9IHRvdGFsRmllbGRzID4gMCAmJiB0b3RhbEZpZWxkcyA9PT0gaGlkZGVuRmllbGRzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIElGcmFtZSBpbiBoeXBlcmxpbmsgQ29udHJvbFxuICAgKi9cbiAgc2VjdGlvbkRpc2FibGVkKGZvcm1TZWN0aW9uOiBJRm9ybVNlY3Rpb24pIHtcbiAgICBpZiAoZm9ybVNlY3Rpb24uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkU2VjdGlvbkZpZWxkcyhmb3JtU2VjdGlvbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmKGZvcm1TZWN0aW9uLmRpc2FibGVkID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRTZWN0aW9uRmllbGRzKGZvcm1TZWN0aW9uLCBmYWxzZSk7XG4gICAgfWVsc2Uge1xuICAgICAgcmV0dXJuIGZvcm1TZWN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGRpc2FibGVkU2VjdGlvbkZpZWxkcyhmb3JtU2VjdGlvbjogSUZvcm1TZWN0aW9uLCBkaXNhYmxlZDogYm9vbGVhbil7XG4gICAgZm9ybVNlY3Rpb24uZmllbGRzLm1hcCgoZmllbGQ6IElGb3JtRmllbGQpID0+IHtcbiAgICAgIGZpZWxkLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZvcm1TZWN0aW9uO1xuICB9XG5cbiAgbG9hZElGcmFtZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICB0aGlzLmhhbmRsZUNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihJZnJhbWVDb21wb25lbnQsIHtcbiAgICAgIGhlYWRlcjogJ0h5cGVybGluaycsXG4gICAgICB3aWR0aDogZm9ybUZpZWxkLmh5cGVybGluaz8ud2lkdGggPyBmb3JtRmllbGQuaHlwZXJsaW5rLndpZHRoIDogJzkwJScsXG4gICAgICBoZWlnaHQ6IGZvcm1GaWVsZC5oeXBlcmxpbms/LmhlaWdodCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0IDogJzgwJScsXG4gICAgICBkYXRhOiB7IHZhbHVlOiBmb3JtRmllbGQuaHlwZXJsaW5rPy5saW5rLCBpRnJhbWVJZDogZm9ybUZpZWxkLmxhYmVsIH0sXG4gICAgfSk7XG4gICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHJlZik7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBkcmFnZ2FibGVEaWFsb2coZm9ybUZpZWxkPy5maWVsZCk7XG4gICAgfSk7XG4gICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgaWYgKGZvcm1GaWVsZC5vblJldHVybikge1xuICAgICAgICAgIGZvcm1GaWVsZC5vblJldHVybihyZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBEaWFsb2cgaW4gaHlwZXJsaW5rIENvbnRyb2xcbiAgICovXG4gIGh5cGVybGlua0RpYWxvZyhldmVudDogYW55KSB7XG4gICAgbGV0IGZvcm1GaWVsZDogSUZvcm1GaWVsZCA9IGV2ZW50LmZvcm1GaWVsZDtcbiAgICBpZiAoZm9ybUZpZWxkLmh5cGVybGluaz8udGFyZ2V0ID09PSBFSHlwZXJsaW5rLkJMQU5LKSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKFtmb3JtRmllbGQubGFiZWxdLCB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBmb3JtRmllbGQuaHlwZXJsaW5rPy5wYXJhbXMsXG4gICAgICB9KT8udG9TdHJpbmcoKTtcblxuICAgICAgd2luZG93Py5vcGVuKHVybCwgJ19ibGFuaycpO1xuICAgICAgXG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGQuaHlwZXJsaW5rPy50YXJnZXQgPT09IEVIeXBlcmxpbmsuU0VMRikge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydoeXBlcmxpbmsnICsgZm9ybUZpZWxkLmxhYmVsXSwge1xuICAgICAgICBxdWVyeVBhcmFtczogZm9ybUZpZWxkLmh5cGVybGluay5wYXJhbXMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC5oeXBlcmxpbms/LnRhcmdldCA9PT0gRUh5cGVybGluay5ESUFMT0cpIHtcbiAgICAgIHRoaXMub25DbGlja0V2ZW50KGZvcm1GaWVsZCk7XG4gICAgICBpZiAoKGV2ZW50ICYmIGV2ZW50LmV2ZW50LmN0cmxLZXkgJiYgZm9ybUZpZWxkLmh5cGVybGluay5jb21wb25lbnQpIHx8IGZvcm1GaWVsZC5vcGVuSW5OZXdUYWIpIHtcbiAgICAgICAgdGhpcy5oeXBlcmxpbmtTZXJ2aWNlLm9wZW5EaWFsb2dJbk5ld1RhYihmb3JtRmllbGQuaHlwZXJsaW5rLmNvbXBvbmVudCwgZm9ybUZpZWxkLmh5cGVybGluaz8ucGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKGZvcm1GaWVsZC5oeXBlcmxpbmsuY29tcG9uZW50LCB7XG4gICAgICAgICAgaGVhZGVyOiBmb3JtRmllbGQuaHlwZXJsaW5rLmRhdGE/LmhlYWRlclxuICAgICAgICAgICAgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmRhdGE/LmhlYWRlclxuICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICB3aWR0aDogZm9ybUZpZWxkLmh5cGVybGluay53aWR0aCA/IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGggOiAnJyxcbiAgICAgICAgICBzdHlsZTogZm9ybUZpZWxkLmh5cGVybGluay53aWR0aCA/IHt9IDogeyAnbWF4LXdpZHRoJzogJ2ZpdC1jb250ZW50JyB9LFxuICAgICAgICAgIGhlaWdodDogZm9ybUZpZWxkLmh5cGVybGluay5oZWlnaHQgPyBmb3JtRmllbGQuaHlwZXJsaW5rLmhlaWdodCA6ICc4MCUnLFxuICAgICAgICAgIGRhdGE6IGZvcm1GaWVsZC5oeXBlcmxpbmsucGFyYW1zXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgfHwgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQpIHtcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSA9IHRoaXMuaW50ZXJjZXB0RGlhbG9nQ2xvc2UuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldER5bmFtaWNEaWFsb2dSZWYodGhpcy5kaWFsb2dSZWYpO1xuICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gZm9ybUZpZWxkLmh5cGVybGluaz8uY29tcG9uZW50Py5uYW1lO1xuICAgICAgICBpZiAoY29tcG9uZW50TmFtZSkge1xuICAgICAgICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIudXJsPy5zdWJzdHJpbmcoMSksXG4gICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkID8gZm9ybUZpZWxkPy5maWVsZCA6IGZvcm1GaWVsZD8ubGFiZWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5vbkNsb3NlLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZC5vblJldHVybikge1xuICAgICAgICAgICAgICBmb3JtRmllbGQub25SZXR1cm4ocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIElmcmFtZSBvbiBMYWJlbFxuICAgKi9cbiAgbG9hZExhYmVsQ29udHJvbElGcmFtZShmb3JtRmllbGQ6IGFueSkge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKElmcmFtZUNvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiBmb3JtRmllbGQubGFiZWwubmFtZSxcbiAgICAgIHdpZHRoOiBmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmh5cGVybGluay53aWR0aFxuICAgICAgICA/IGZvcm1GaWVsZC5oeXBlcmxpbmsud2lkdGhcbiAgICAgICAgOiAnOTAlJyxcbiAgICAgIGhlaWdodDogZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbms/LmhlaWdodFxuICAgICAgICA/IGZvcm1GaWVsZC5oeXBlcmxpbmsuaGVpZ2h0XG4gICAgICAgIDogJzgwJScsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHZhbHVlOiBmb3JtRmllbGQubGFiZWwubGFiZWxDb250cm9sLmh5cGVybGluaz8ubGlua1xuICAgICAgICAgID8gZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5oeXBlcmxpbmsubGlua1xuICAgICAgICAgIDogJycsXG4gICAgICAgIGlGcmFtZUlkOiBmb3JtRmllbGQubGFiZWwubmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHJlZik7XG4gICAgdGhpcy5wYWdlTG9nZ2VyU2VydmljZS5zYXZlUGFnZUxvZ2dlckluZm8oXG4gICAgICB0aGlzLnJvdXRlci51cmw/LnN1YnN0cmluZygxKSxcbiAgICAgICdJZnJhbWVDb21wb25lbnQnXG4gICAgKTtcbiAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkID8gZm9ybUZpZWxkPy5maWVsZCA6IGZvcm1GaWVsZD8ubGFiZWwpO1xuICAgICAgfSk7XG4gICAgcmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgaWYgKGZvcm1GaWVsZC5vblJldHVybikge1xuICAgICAgICAgIGZvcm1GaWVsZC5vblJldHVybihyZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGZvcm1GaWVsZCAmJiBmb3JtRmllbGQub25DbGljaykge1xuICAgICAgZm9ybUZpZWxkLm9uQ2xpY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZmluZCB0aGUgcmVxdWlyZWQgZmllbGQgaW4gZm9ybVxuICAgKi9cbi8vICAgYXBwbHlSZXF1aXJlZEZpZWxkVmFsaWRhdGlvbigpIHtcbi8vIGNvbnNvbGUubG9nKCdhcHBseWluZyByZXF1aXJlZGZpbGVkIHZhbGlkYXRpb25zJylcbi8vICAgICBpZiAoXG4vLyAgICAgICB0aGlzLmZvcm0gJiZcbi8vICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbi8vICAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuLy8gICAgICkge1xuLy8gICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XG4vLyAgICAgICAgIHNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4vLyAgICAgICAgICAgY29uc29sZS5sb2coJ2ZpZWxkJywgZmllbGQpXG4vLyAgICAgICAgICAgaWYgKGZpZWxkLnZhbGlkYXRpb25zICYmIGZpZWxkLnZhbGlkYXRpb25zLmxlbmd0aCA+IDApIHtcbi8vICAgICAgICAgICAgIGZpZWxkLnZhbGlkYXRpb25zLmZvckVhY2goKHZhbGlkKSA9PiB7XG4vLyAgICAgICAgICAgICAgIGlmICh2YWxpZC50eXBlID09PSBFVmFsaWRhdG9yLlJFUVVJUkVEKSB7XG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2ZpZWxkJyxmaWVsZCwnaXMgcmVxdWlyZWQnKVxuLy8gICAgICAgICAgICAgICAgIGZpZWxkLnJlcXVpcmVkRmllbGQgPSB0cnVlO1xuLy8gICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICB9XG4vLyAgICAgICAgIH0pO1xuLy8gICAgICAgfSk7XG4vLyAgICAgfVxuLy8gICB9XG5cbiAgc2V0RmlsZVVybHMoZmlsZVVybHM6IGFueSkge1xuICAgIGlmIChmaWxlVXJscyAmJiBmaWxlVXJscy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZpbGVVcGxvYWRVcmxzID0gZmlsZVVybHM7XG4gICAgICB0aGlzLnNob3dmaWxlVXBsb2FkRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjaGVja0ZpZWxkc1ZhbGl0aW9ucyhmaWVsZHM6IElGb3JtRmllbGRbXSl7XG4gICAgbGV0IGVycm9yTWVzc2FnZURldGFpbHMgPSAnJztcbiAgICBsZXQgdmFsaWRpdHkgPSB0cnVlO1xuICAgIGlmIChmaWVsZHMpIHtcbiAgICAgIGlmICghdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KGZpZWxkcykpIHtcbiAgICAgICAgZmllbGRzPy5mb3JFYWNoKChmb3JtRmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChmb3JtRmllbGQuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VEZXRhaWxzID0gZXJyb3JNZXNzYWdlRGV0YWlsc1xuICAgICAgICAgICAgICA/IGVycm9yTWVzc2FnZURldGFpbHMgKyAnICwgJyArIGZvcm1GaWVsZC5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgOiBmb3JtRmllbGQuZXJyb3JNZXNzYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBmaWVsZCA9IGZpZWxkcy5zb21lKFxuICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQucmVxdWlyZWRGaWVsZCAmJiBmaWVsZC5lcnJvck1lc3NhZ2UgJiYgIWZpZWxkLnZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIGlmICh2YWxpZGl0eSAmJiBmaWVsZCkge1xuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmVycm9yKFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyxcbiAgICAgICAgICAgIDUwMDAsXG4gICAgICAgICAgICAnUkVRVUlSRUQgRklFTEQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihlcnJvck1lc3NhZ2VEZXRhaWxzLCA1MDAwLCAnSU5WQUxJRCBGSUVMRCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhbGlkaXR5ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgIC8vIHNldCB1cGxvYWRGaWxlIFVSTCBpbiBGb3JtRmllbGQgaW4gY2FzZSBvZiBGSUxFX1VQTE9BRFxuICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkZJTEVfVVBMT0FEKSB7XG4gICAgICAgICAgZmllbGQudmFsdWUgPSB0aGlzLmZpbGVVcGxvYWRVcmxzO1xuXG4gICAgICAgICAgaWYgKGZpZWxkLnZhbGlkYXRpb25zICYmIGZpZWxkLnZhbGlkYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZpZWxkLnZhbGlkYXRpb25zLmZvckVhY2goKHg6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoeC50eXBlID09PSBFVmFsaWRhdG9yLlJFUVVJUkVEICYmICFmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd2ZpbGVVcGxvYWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgIGlmIChmaWVsZC5jYXJkICYmIGZpZWxkLmNhcmQuZGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHNlbGVjdGVkRGF0YSA9IGZpZWxkLmNhcmQuZGF0YS5maWx0ZXIoXG4gICAgICAgICAgICAgICh4OiBhbnkpID0+IHguc2VsZWN0ZWRDYXJkICYmIHguc2VsZWN0ZWRDYXJkLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRhICYmIHNlbGVjdGVkRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGZpZWxkLmNhcmQuZGF0YSA9IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGl0eTtcbiAgfVxuICBvblNhdmVGb3JtKCkge1xuICAgIGxldCB2YWxpZGl0eSA9IHRydWU7XG4gICAgbGV0IGlzQWxsRmllbGRzVmFsaWQgPSBbXTtcbiAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgIGxldCBtdWxpU2VsZWN0VmFsdWUgPSB7fTtcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgaWYgKGZvcm1TZWN0aW9uLmZpZWxkcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICBpc0FsbEZpZWxkc1ZhbGlkLnB1c2godGhpcy5jaGVja0ZpZWxkc1ZhbGl0aW9ucyhmb3JtU2VjdGlvbi5maWVsZHMpKTtcbiAgICAgICAgdmFsaWRpdHkgPSBpc0FsbEZpZWxkc1ZhbGlkLmV2ZXJ5KChmaWVsZCkgPT4gZmllbGQgPT0gdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtU2VjdGlvbi5oZWFkZXJGaWVsZHM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFsaWRpdHkgPSB0aGlzLmNoZWNrRmllbGRzVmFsaXRpb25zKGZvcm1TZWN0aW9uLmhlYWRlckZpZWxkcyk7XG4gICAgICAgIGlzQWxsRmllbGRzVmFsaWQucHVzaCh0aGlzLmNoZWNrRmllbGRzVmFsaXRpb25zKGZvcm1TZWN0aW9uLmZpZWxkcykpO1xuICAgICAgICB2YWxpZGl0eSA9IGlzQWxsRmllbGRzVmFsaWQuZXZlcnkoKGZpZWxkKSA9PiBmaWVsZCA9PSB0cnVlKTtcbiAgICAgIH1cblxuICAgIH0pO1xuICAgIGlmICh2YWxpZGl0eSkge1xuICAgICAgLy8gU2F2ZSBncmlkIG9uIGZvcm1TYXZlIEJ1dHRvblxuICAgICAgbGV0IGN1c3RvbUNvbXBvbmVudDogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgbGV0IHRlbXBWYWx1ZTogYW55ID0gW107XG4gICAgICBsZXQgc2F2ZUFsbEdyaWQ6IGFueSA9IFtdO1xuICAgICAgbGV0IGdldEJ0bnM6IGFueSA9IFtdO1xuICAgICAgbGV0IGdldFNhdmVidXR0b246IGFueSA9IFtdO1xuICAgICAgLy8gc2V0IHZhbHVlIGFzIDEgb3IgMCBpbiBjYXNlIG9mIGNoZWNrYm94XG4gICAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zPy5mb3JFYWNoKChmb3JtU2VjdGlvbikgPT4ge1xuICAgICAgICBpZiAoZm9ybVNlY3Rpb24uZmllbGRzICYmIHZhbGlkaXR5KSB7XG4gICAgICAgICAgZm9ybVNlY3Rpb24uZmllbGRzLmZvckVhY2goKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSA9PT0gJycgfHwgZmllbGQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NvbnZlcnQgZGF0ZSBpbnRvIHRpbWUgYXMgc3RyaW5nXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DQUxFTkRBUiAmJlxuICAgICAgICAgICAgICBmaWVsZC50aW1lT25seSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fCBmaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdXRpbGl0aWVzLnNldFRpbWVJbkRhdGUoZmllbGQudmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChmaWVsZC5zaG93VGltZSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmllbGQudmFsdWUsICd5eXl5LU1NLWRkIEhIOm1tOnNzJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpZWxkLnZhbHVlPy50b1N0cmluZygpPy5pbmNsdWRlcygnQU0nKSAmJlxuICAgICAgICAgICAgICAgICFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ1BNJykpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAnaGg6bW0gYScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmllbGQ/LmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5OVU1FUklDKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBmaWVsZD8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZD8uZm9ybWF0Py50eXBlID09PSAncGVyY2VudCcpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gZmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcuJykgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGN1bGF0ZWRWYWx1ZSA/IGZpZWxkLnZhbHVlIDogZmllbGQudmFsdWUgLyAxMDApPy50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgKS50b0ZpeGVkKGRpZ2l0c0luZm8pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZC52YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJy4nKSAmJiAhY2FsY3VsYXRlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSAvIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChmaWVsZC52YWx1ZSkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc2V0IHZhbHVlIG9mIGF1dG9Db21wbGV0ZSBhcyBzdHJpbmdzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgICAgIWZpZWxkLnNob3dBbGxWYWx1ZSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZS5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC52YWx1ZS5tYXAoXG4gICAgICAgICAgICAgICAgKHZhbHVlOiBhbnkpID0+IHZhbHVlW2ZpZWxkLmRpc3BsYXlGaWVsZF1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgKHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCc7JykgfHxcbiAgICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCk/LmluY2x1ZGVzKCcsJykpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRlbXBWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCcsJywgJzsnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29udmVydCBtdWx0aVNlbGVjdCBhcnJheSBpbnRvIHN0cmluZ1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuTVVMVElTRUxFQ1QgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgJiZcbiAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSkgJiZcbiAgICAgICAgICAgICAgZmllbGQuc2F2ZUFzU3RyaW5nICE9PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG11bGlTZWxlY3RWYWx1ZVtmaWVsZC5maWVsZF0gPSBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlPy50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGZpZWxkLnZhbHVlID8gMSA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTYXZlIGdyaWQgb24gZm9ybVNhdmUgQnV0dG9uXG4gICAgICAgICAgICBpZiAoZmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNPTVBPTkVOVCAmJiAhY3VzdG9tQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudCA9IHRydWU7XG4gICAgICAgICAgICAgIHNhdmVBbGxHcmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnI3NhdmVBbGxHcmlkVmFsdWVzJyk7XG4gICAgICAgICAgICAgIGdldEJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGZpZWxkPy5jb21wb25lbnRDb250cm9sPy5pZCArICcgJyArICcuc2F2ZVJvdycpO1xuICAgICAgICAgICAgICBpZiAoc2F2ZUFsbEdyaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2F2ZUFsbEdyaWRbMF0uY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtUGFnZSA9IGludGVydmFsKDc1MCkuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNhdmVGb3JtUGFnZS51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGdldEJ0bnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNhdmVSb3dCdG4gb2YgZ2V0QnRucykge1xuICAgICAgICAgICAgICAgICAgc2F2ZVJvd0J0bj8uY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlRm9ybS5lbWl0KHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgICBpZighdGhpcy5zcGxpdFNjcmVlbil7XG4gICAgICAgICAgIGdldFNhdmVidXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucC1zYXZlLWJ1dHRvbicpO1xuICAgICAgICAgICBpZihnZXRTYXZlYnV0dG9uKXtcbiAgICAgICAgICAgICBnZXRTYXZlYnV0dG9uPy5jbGljaygpO1xuICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQoZmFsc2UpO1xuICAgICAgaWYgKCFzYXZlQWxsR3JpZC5sZW5ndGggJiYgIWdldEJ0bnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2F2ZUZvcm0uZW1pdCh0aGlzLmZvcm0uZm9ybVNlY3Rpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChmb3JtU2VjdGlvbi5maWVsZHMpIHtcbiAgICAgICAgICBmb3JtU2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FMRU5EQVIgJiZcbiAgICAgICAgICAgICAgZmllbGQudGltZU9ubHkgJiYgZmllbGQuc2hvd1RpbWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBpZiAodHlwZW9mIGZpZWxkLnZhbHVlID09PSAnc3RyaW5nJyAmJiAvXlxcZHsyfTpcXGR7Mn0gW0FQXU0kLy50ZXN0KGZpZWxkLnZhbHVlKSkge1xuICAgICAgICAgICAgICAvLyAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkLnZhbHVlLCAnaGg6bW0gYScpO1xuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5NVUxUSVNFTEVDVCAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gbXVsaVNlbGVjdFZhbHVlW2ZpZWxkLmZpZWxkXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmNvbnRyb2wgPT09IEVGb3JtQ29udHJvbC5BVVRPQ09NUExFVEUgJiZcbiAgICAgICAgICAgICAgIWZpZWxkLnNob3dBbGxWYWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gdGVtcFZhbHVlXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnLCcsICc7JylcbiAgICAgICAgICAgICAgICA/LnNwbGl0KCc7JylcbiAgICAgICAgICAgICAgICA/Lm1hcCgodmFsOiBhbnkpID0+ICh7IFtmaWVsZC5kaXNwbGF5RmllbGRdOiB2YWwgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSBmaWVsZC52YWx1ZSA9PT0gMSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQ/LmZvcm1hdD8udHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZ2l0c0luZm8gPSBmaWVsZD8uZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm87XG4gICAgICAgICAgICAgIGlmIChmaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uYWxsb3dDYWxjdWxhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgICAoZmllbGQudmFsdWUgKiAxMDApPy50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICkudG9GaXhlZChkaWdpdHNJbmZvKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gZmllbGQudmFsdWUgKiAxMDA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHBhcnNlRmxvYXQoZmllbGQudmFsdWUpLnRvRml4ZWQoZGlnaXRzSW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2FuY2VsRm9ybSgpIHtcbiAgICBpZiAodGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQgfHwgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZVxuICAgICAgICAuY29uZmlybSh7XG4gICAgICAgICAga2V5OiAnY2FuY2VsQnV0dG9uJyxcbiAgICAgICAgICBtZXNzYWdlOiAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT8nLFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc1swXS5kZXRhaWwgPT09ICdZZXMnKSB7XG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICAgICAgICB1dGlsaXRpZXMucmVtb3ZlQWN0aXZlSWNvbkNsYXNzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW5jZWxGb3JtLmVtaXQodGhpcy5mb3JtLmZvcm1TZWN0aW9ucyk7XG4gICAgICB1dGlsaXRpZXMucmVtb3ZlQWN0aXZlSWNvbkNsYXNzKCk7XG4gICAgfVxuICB9XG5cbiAgbG9va3VwQ2xlYXJWYWx1ZShmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLnZhbHVlKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUgPSAnJztcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgfVxuICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgIH1cbiAgIC8vIHRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGNhbGVuZGFyIHdpZHRoXG4gICAqL1xuICBzZXRDYWxhbmRlcldpZHRoKCkge1xuICAgIGNvbnN0IGNhbGFuZGVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wLWNhbGVuZGFyJyk7XG4gICAgbGV0IGZvcm06IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0nKTtcbiAgICBsZXQgd2lkdGggPSBmb3JtPy5jbGllbnRXaWR0aDtcbiAgICBjYWxhbmRlckVsZW1lbnQ/LmZvckVhY2goKGNhbGFuZGVyOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGNhbGFuZGVyT2ZzZXRMZWZ0ID0gY2FsYW5kZXIub2Zmc2V0TGVmdDtcbiAgICAgIGlmIChjYWxhbmRlck9mc2V0TGVmdCA8PSB3aWR0aCAvIDIpIHtcbiAgICAgICAgY2FsYW5kZXIuY2xhc3NMaXN0LmFkZCgnb3Blbi1yaWdodC1zaWRlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogc2V0IHRoZSBkeW5hbWljIGRpYWxvZyBkYXRhXG4gICAqL1xuICBzZXREaWFsb2dEYXRhKGZvcm1GaWVsZDogSUZvcm1GaWVsZCwgZGF0YTogYW55KTogYW55IHtcbiAgICBpZiAoZGF0YSAmJiBmb3JtRmllbGQpIHtcbiAgICAgIGxldCB2YWx1ZTogYW55O1xuICAgICAgZGF0YSA9IHV0aWxpdGllcy5vYmpDb252ZXJ0VG9Mb3dlcihkYXRhKTtcbiAgICAgIGxldCBzZWxlY3Rpb246IHN0cmluZyA9ICcnO1xuICAgICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAmJiB0eXBlb2YgZm9ybUZpZWxkLnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQgJiZcbiAgICAgICAgICBmb3JtRmllbGQudmFsdWUudGV4dC50b1N0cmluZygpLnRyaW0oKVxuICAgICAgICApIHtcbiAgICAgICAgICBzZWxlY3Rpb24gPSBmb3JtRmllbGQudmFsdWUudGV4dD8udG9TdHJpbmcoKT8udHJpbSgpO1xuICAgICAgICAgIGlmIChmb3JtRmllbGQuZGlzcGxheUZpZWxkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGZvcm1GaWVsZC52YWx1ZT8udmFsdWU/LnRvU3RyaW5nKCk/LnRyaW0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLnZhbHVlICYmIGZvcm1GaWVsZC52YWx1ZS50b1N0cmluZygpLnRyaW0oKSkge1xuICAgICAgICBzZWxlY3Rpb24gPSBmb3JtRmllbGQudmFsdWU/LnRvU3RyaW5nKCk/LnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBkYXRhLmNvbXBvbmVudD8ubmFtZTtcbiAgICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICAgIHRoaXMucGFnZUxvZ2dlclNlcnZpY2Uuc2F2ZVBhZ2VMb2dnZXJJbmZvKFxuICAgICAgICAgIHRoaXMucm91dGVyLnVybD8uc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihkYXRhLmNvbXBvbmVudCwge1xuICAgICAgICAuLi5kYXRhLmRhdGEsXG4gICAgICAgIHN0eWxlQ2xhc3M6ICdsb29rdXAtbW9kZWwnLFxuICAgICAgICBoZWlnaHQ6IGRhdGEuZGF0YT8uaGVpZ2h0ID8gZGF0YS5kYXRhPy5oZWlnaHQgOiAnOTB2aCcsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbixcbiAgICAgICAgICBmaWVsZDogZm9ybUZpZWxkLmZpZWxkLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICB2YWx1ZUZpZWxkOiBkYXRhLmRhdGE/LnZhbHVlRmllbGQsXG4gICAgICAgICAgLi4uZGF0YS5kYXRhLmRhdGEsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0YWJGb2N1c0V2ZW50KGZvcm1GaWVsZDogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicgKyBmb3JtRmllbGQuZmllbGRcbiAgICApO1xuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZS5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBpZiAoZm9ybUZpZWxkLm9uQ2xpY2sgJiYgZm9ybUZpZWxkLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICBmb3JtRmllbGQub25DbGljayhmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGxhYmVsXG4gICAqL1xuICBzZWxlY3RMb29rdXBMYWJlbChmb3JtRmllbGQ6IGFueSwgZXZlbnQ/OiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICBmb3JtRmllbGQubGFiZWwgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wgJiZcbiAgICAgIGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbFxuICAgICkge1xuICAgICAgaWYgKChldmVudC5jdHJsS2V5ICYmIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uY29tcG9uZW50KSB8fCBmb3JtRmllbGQ/LmxhYmVsPy5sYWJlbENvbnRyb2w/Lm9wZW5Jbk5ld1RhYikge1xuICAgICAgICB0aGlzLmh5cGVybGlua1NlcnZpY2Uub3BlbkRpYWxvZ0luTmV3VGFiKGZvcm1GaWVsZC5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbC5jb21wb25lbnQsIGZvcm1GaWVsZD8ubGFiZWw/LmxhYmVsQ29udHJvbD8ubG9va3VwQ29udHJvbD8uZGF0YS5kYXRhKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCByZWY6IGFueSA9IHRoaXMuc2V0RGlhbG9nRGF0YShcbiAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgZm9ybUZpZWxkLmxhYmVsLmxhYmVsQ29udHJvbC5sb29rdXBDb250cm9sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGRyYWdnYWJsZURpYWxvZyhmb3JtRmllbGQ/LmZpZWxkID8gZm9ybUZpZWxkPy5maWVsZCA6IGZvcm1GaWVsZD8ubGFiZWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZSA9IHV0aWxpdGllcy5zZXREaWFsb2dSZXNwb25zZShcbiAgICAgICAgICAgICAgICBmb3JtRmllbGQsXG4gICAgICAgICAgICAgICAgZm9ybUZpZWxkPy5sYWJlbC5sYWJlbENvbnRyb2wubG9va3VwQ29udHJvbCxcbiAgICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLmxhYmVsLm9uUmV0dXJuKVxuICAgICAgICAgICAgICBmb3JtRmllbGQubGFiZWwub25SZXR1cm4oZm9ybUZpZWxkLnZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICh7IGVycm9yIH06IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbkNsaWNrRXZlbnQoZm9ybUZpZWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIGRpYWxvZyByZWYgd2hlbiBwb3B1cCBvcGVuXG4gICAqL1xuICBzZXREeW5hbWljRGlhbG9nUmVmKHJlZjogYW55KXtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2UuZGlhbG9nQ29tcG9uZW50UmVmTWFwLmdldChyZWYpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnQgPSBkaWFsb2dSZWY/Lmluc3RhbmNlIGFzIER5bmFtaWNEaWFsb2dDb21wb25lbnQ7XG4gICAgY29uc3QgYXJpYUxhYmVsbGVkQnkgPSBkeW5hbWljQ29tcG9uZW50LmdldEFyaWFMYWJlbGxlZEJ5KCk7XG4gICAgZHluYW1pY0NvbXBvbmVudC5nZXRBcmlhTGFiZWxsZWRCeSA9ICgpID0+IGFyaWFMYWJlbGxlZEJ5O1xuICB9XG5cbiAgaW50ZXJjZXB0RGlhbG9nQ2xvc2UoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmNvbHVtbkZvY3VzZWRPdXQgfHwgdGhpcy5mb3JtU2VydmljZS5maWVsZEZvY3VzZWRPdXQpIHtcbiAgICAgIGlmIChjb25maXJtKFwiWW91IHdpbGwgbG9zZSBjaGFuZ2VzIG5vdCBzYXZlZCBvbiBwYWdlLiBXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZT9cIikgPT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogb3BlbiBkaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZFxuICAgKi9cbiAgc2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKGZvcm1GaWVsZC5sb29rdXBDb250cm9sKSB7XG4gICAgICB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCA9IGZhbHNlO1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5jb2x1bW5Gb2N1c2VkT3V0ID0gZmFsc2U7XG4gICAgICB0aGlzLmxvb2t1cEZvY3VzT3V0ID0gdHJ1ZTtcbiAgICAgIGxldCB2YWx1ZSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5zZXREaWFsb2dEYXRhKGZvcm1GaWVsZCwgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wpO1xuICAgICAgdGhpcy5zZXREeW5hbWljRGlhbG9nUmVmKHRoaXMuZGlhbG9nUmVmKTtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1GaWVsZD8uZmllbGQgPyBmb3JtRmllbGQ/LmZpZWxkIDogZm9ybUZpZWxkPy5sYWJlbCk7XG4gICAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuY29sdW1uRm9jdXNlZE91dCB8fCB0aGlzLmZvcm1TZXJ2aWNlLmZpZWxkRm9jdXNlZE91dCkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSA9IHRoaXMuaW50ZXJjZXB0RGlhbG9nQ2xvc2UuYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKFxuICAgICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLnVzZXJTZWFyY2hlZD1mYWxzZTtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmZpZWxkKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtRmllbGQuZmllbGQpPy5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0RGlhbG9nUmVzcG9uc2UoXG4gICAgICAgICAgICAgIGZvcm1GaWVsZCxcbiAgICAgICAgICAgICAgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wsXG4gICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubG9va3VwRm9jdXNPdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGQub25SZXR1cm4pIGZvcm1GaWVsZC5vblJldHVybihmb3JtRmllbGQudmFsdWUsIHJlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZCk7XG4gICAgICAgICAgY29uc3QgZm9ybUZpZWxkVmFsdWUgPVxuICAgICAgICAgICAgdHlwZW9mIGZvcm1GaWVsZC52YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgPyBmb3JtRmllbGQudmFsdWUudGV4dFxuICAgICAgICAgICAgICA6IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgICAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZT8udGV4dCA6IHZhbHVlO1xuICAgICAgICAgIGlmIChmb3JtRmllbGRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgZXJyb3IgfTogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvbkNsaWNrIGV2ZW50IGludm9rZWQgJiYgb3BlbiBEaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZC9sYWJlbFxuICAgKi9cbiAgaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICB0aGlzLm9uQ2xpY2tFdmVudChmb3JtRmllbGQpO1xuICAgIGlmIChmb3JtRmllbGQgJiYgZm9ybUZpZWxkLmxvb2t1cENvbnRyb2wpIHtcbiAgICAgIHRoaXMuc2VsZWN0TG9va3VwTGFiZWwoZm9ybUZpZWxkKTtcbiAgICAgIHRoaXMuc2VsZWN0TG9va3VwRmllbGQoZm9ybUZpZWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2V0IENhbGVuZGFyIERhdGUgRm9ybWF0ICYmIHNldCBEYXRlIE1pbnV0ZSBpbnRlcnZhbFxuICAgKi9cbiAgc2V0Q2FsZW5kYXJEYXRlKGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQuY29udHJvbCA9PT0gRUZvcm1Db250cm9sLkNBTEVOREFSKSB7XG4gICAgICAvLyBjb252ZXJ0IHRpbWUgaW50byBkYXRlIGZvcm1hdFxuICAgICAgaWYgKFxuICAgICAgICBmb3JtRmllbGQudGltZU9ubHkgJiZcbiAgICAgICAgKGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnQU0nKSB8fFxuICAgICAgICAgIGZvcm1GaWVsZC52YWx1ZT8udG9TdHJpbmcoKS5pbmNsdWRlcygnUE0nKSlcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSB1dGlsaXRpZXMuc2V0VGltZUluRGF0ZShmb3JtRmllbGQudmFsdWUpO1xuICAgICAgfWVsc2UgaWYgKFxuICAgICAgICAoZm9ybUZpZWxkLnNob3dUaW1lIHx8IGZvcm1GaWVsZC50aW1lT25seSkgJiZcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgIGZvcm1GaWVsZC5taW51dGVzSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZShcbiAgICAgICAgICB1dGlsaXRpZXMuc2V0TWludXRlc0ludGVydmFsKGZvcm1GaWVsZC52YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChmb3JtRmllbGQuc2hvd1RpbWUgfHwgZm9ybUZpZWxkLnRpbWVPbmx5KSAmJlxuICAgICAgICAhZm9ybUZpZWxkLnZhbHVlICYmXG4gICAgICAgIGZvcm1GaWVsZC5taW51dGVzSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICBmb3JtRmllbGQudmFsdWUgPSBuZXcgRGF0ZSh1dGlsaXRpZXMuc2V0TWludXRlc0ludGVydmFsKG5ldyBEYXRlKCkpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsZW5kYXJQcmV2aW91c1ZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgIH1cbiAgfVxuICBjYWxlbmRhckNoYW5nZVZhbHVlKGZvcm1GaWVsZDogYW55KSB7XG4gICAgaWYgKGZvcm1GaWVsZC52YWx1ZSAhPT0gZm9ybUZpZWxkLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMuYnJvd3NlclRhYkNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgICBpZiAoZm9ybUZpZWxkLm9uQ2hhbmdlKSB7XG4gICAgICAgIGZvcm1GaWVsZC5wcmV2aW91c1ZhbHVlID0gZm9ybUZpZWxkLnZhbHVlO1xuICAgICAgICBmb3JtRmllbGQub25DaGFuZ2UoZm9ybUZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaW52b2tlZCBzZWN0aW9uIENsaWNrZWQgZXZlbnRcbiAgICovXG4gIGNsaWNrZWRTZWN0aW9uKHNlY3Rpb246IElGb3JtU2VjdGlvbikge1xuICAgIHRoaXMuc2VjdGlvbkNsaWNrZWRFdmVudC5lbWl0KHNlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIG9wZW4gZGlhbG9nIGluIE5vdGVfRmllbGQgY29ucnRyb2xcbiAgICovXG4gIGhhbmRsZU5vdGVGaWVsZERpYWxvZyhmb3JtZmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihOb3Rlc0NvbXBvbmVudCwge1xuICAgICAgaGVhZGVyOiBmb3JtZmllbGQubGFiZWwgYXMgc3RyaW5nLFxuICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZTogZm9ybWZpZWxkLnZhbHVlLFxuICAgICAgICBkaXNhYmxlZFRleHQ6IGZvcm1maWVsZC5kaXNhYmxlZFRleHQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RHluYW1pY0RpYWxvZ1JlZihyZWYpO1xuICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlRGlhbG9nKGZvcm1maWVsZD8uZmllbGQgPyBmb3JtZmllbGQ/LmZpZWxkIDogZm9ybWZpZWxkPy5sYWJlbCk7XG4gICAgICB9KTtcbiAgICByZWYub25DbG9zZS5zdWJzY3JpYmUoXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhICYmIGZvcm1maWVsZC5vblJldHVybikge1xuICAgICAgICAgIGZvcm1maWVsZC5vblJldHVybihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICh7IGVycm9yIH0pID0+IHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYXBpRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBzZXRDbGFzc05hbWUoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKTogc3RyaW5nIHtcbiAgICBpZiAoZm9ybUZpZWxkLmhpZGRlbikgcmV0dXJuICcgaGlkZGVuJztcbiAgICBlbHNlIHJldHVybiAnJztcbiAgfVxuXG4gIGF1dG9TZWFyY2goZXZlbnQ6IGFueSkge1xuICAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQgPSBldmVudC5mb3JtRmllbGRcbiAgICBpZiAoZm9ybUZpZWxkICYmIGV2ZW50ICYmIGV2ZW50LmV2ZW50KSB7XG4gICAgICBmb3JtRmllbGQub25SZXR1cm4oZXZlbnQuZXZlbnQucXVlcnksIGZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGludm9rZWQgb25Gb2N1c091dCBFdmVudFxuICAgKi9cbiAgb25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZDogSUZvcm1GaWVsZCkge1xuICAgIGxldCByZWNvcmQ6IGFueSA9IHt9O1xuICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnM/LmZvckVhY2goKHNlY3Rpb24pID0+IHtcbiAgICAgIHNlY3Rpb24/LmZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkKSA9PiB7XG4gICAgICAgIGlmIChmb3JtRmllbGQuZmllbGQpIHtcbiAgICAgICAgICByZWNvcmRbZm9ybUZpZWxkLmZpZWxkXSA9IGZvcm1GaWVsZC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdXRpbGl0aWVzLnNldEh5cGVybGlua1BhcmFtVmFsdWUocmVjb3JkLCB0aGlzLmZvcm0pO1xuICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgICBpZiAoZm9ybUZpZWxkICYmIGZvcm1GaWVsZC5vbkZvY3VzT3V0ICYmIHRoaXMubG9va3VwRm9jdXNPdXQgPT09IGZhbHNlKSB7XG4gICAgICBmb3JtRmllbGQub25Gb2N1c091dChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIG9uQmFja1NwYWNlRXZlbnQoZm9ybUZpZWxkOiBJRm9ybUZpZWxkKSB7XG4gICAgaWYgKHR5cGVvZiBmb3JtRmllbGQudmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3JtRmllbGQudmFsdWUudGV4dCA9IGZvcm1GaWVsZC52YWx1ZS50ZXh0LnN1YnN0cmluZyhcbiAgICAgICAgMCxcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlLnRleHQubGVuZ3RoIC0gMVxuICAgICAgKTtcbiAgICAgIGlmIChmb3JtRmllbGQudmFsdWUudGV4dC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAvL3RoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShbZm9ybUZpZWxkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb3JtRmllbGQudmFsdWUgJiYgZm9ybUZpZWxkLnZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZm9ybUZpZWxkLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAvLyB0aGlzLmZvcm1TZXJ2aWNlLmNoZWNrVmFsaWRpdHkoW2Zvcm1GaWVsZF0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjbGVhciB0aGUgZHJvcGRvd24gdmFsdWUgd2hlbiBjbGljayBvbiB4XG4gICAqL1xuICBvbkNsZWFyVmFsdWUoZXZlbnQ6IGFueSkge1xuICAgLy8gdGhpcy5mb3JtU2VydmljZS5jaGVja1ZhbGlkaXR5KFtmb3JtRmllbGRdKTtcbiAgIGxldCBmb3JtRmllbGQ6IElGb3JtRmllbGQgPSBldmVudC5mb3JtRmllbGQ7XG4gICAgdGhpcy5vbkNoYW5nZUV2ZW50KGZvcm1GaWVsZCk7XG4gICAgdGhpcy5kcm9wRG93bkNoYW5nZUV2ZW50LmVtaXQoZm9ybUZpZWxkKTtcbiAgICBpZiAoIWV2ZW50LmV2ZW50LnZhbHVlKSB7XG4gICAgICB0aGlzLm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRHJvcGRvd25WYWx1ZShmb3JtRmllbGQ6IGFueSkge1xuICAgIHRoaXMub25DbGlja0V2ZW50KGZvcm1GaWVsZCk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIG9uQ2hhbmdlIEV2ZW50IHdoZW4gVmFsdWUgQ2hhbmdlZFxuICAgKi9cbiAgb25DaGFuZ2VFdmVudChmb3JtRmllbGQ6IElGb3JtRmllbGQpIHtcbiAgICB0aGlzLmJyb3dzZXJUYWJDbG9zZUV2ZW50KHRydWUpO1xuICAgIGlmIChmb3JtRmllbGQub25DaGFuZ2UpIHtcbiAgICAgIGZvcm1GaWVsZC5vbkNoYW5nZShmb3JtRmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIHR5cGVPZih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZva2Ugb24gZHluYW1pYyBidXR0b25zIGNsaWNrXG4gICAqL1xuICBvbk5ld0J1dHRvbkNsaWNrKGJ1dHRvbikge1xuICAgIGxldCBzYXZlQWxsR3JpZDogYW55ID0gW107XG4gICAgbGV0IGdldEJ0bnM6IGFueSA9IFtdO1xuICAgIGxldCB2YWxpZGl0eSA9IHRydWU7XG4gICAgbGV0IGVycm9yTWVzc2FnZURldGFpbHMgPSAnJztcbiAgICB0aGlzLmZvcm0uZm9ybVNlY3Rpb25zLmZvckVhY2goKGZvcm1TZWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZm9ybVNlcnZpY2UuY2hlY2tWYWxpZGl0eShmb3JtU2VjdGlvbi5maWVsZHMpKSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcz8uZm9yRWFjaCgoZm9ybUZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZm9ybUZpZWxkLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlRGV0YWlscyA9IGVycm9yTWVzc2FnZURldGFpbHNcbiAgICAgICAgICAgICAgPyBlcnJvck1lc3NhZ2VEZXRhaWxzICsgJyAsICcgKyBmb3JtRmllbGQuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgIDogZm9ybUZpZWxkLmVycm9yTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZmllbGQgPSBmb3JtU2VjdGlvbi5maWVsZHMuc29tZShcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLnJlcXVpcmVkRmllbGQgJiYgZmllbGQuZXJyb3JNZXNzYWdlICYmICFmaWVsZC52YWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsaWRpdHkgJiYgZmllbGQpIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5lcnJvcihcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZURldGFpbHMsXG4gICAgICAgICAgICA1MDAwLFxuICAgICAgICAgICAgJ1JFUVVJUkVEIEZJRUxEJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZXJyb3IoZXJyb3JNZXNzYWdlRGV0YWlscywgNTAwMCwgJ0lOVkFMSUQgRklFTEQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbGlkaXR5KSB7XG4gICAgICAgIGZvcm1TZWN0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIHNhdmVBbGxHcmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBmaWVsZD8uY29tcG9uZW50Q29udHJvbD8uaWQgKyAnICcgKyAnI3NhdmVBbGxHcmlkVmFsdWVzJyk7XG4gICAgICAgICAgZ2V0QnRucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZmllbGQ/LmNvbXBvbmVudENvbnRyb2w/LmlkICsgJyAnICsgJy5zYXZlUm93Jyk7XG4gICAgICAgICAgaWYgKHNhdmVBbGxHcmlkLmxlbmd0aCkge1xuICAgICAgICAgICAgc2F2ZUFsbEdyaWRbMF0uY2xpY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoZ2V0QnRucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzYXZlUm93QnRuIG9mIGdldEJ0bnMpIHtcbiAgICAgICAgICAgICAgc2F2ZVJvd0J0bj8uY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICBidXR0b24uZnVuYygpO1xuICB9XG5cbiAgc2VsZWN0ZWRDYXJkQ2xpY2tFdmVudChkYXRhOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm0gJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMgJiZcbiAgICAgIHRoaXMuZm9ybS5mb3JtU2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5mb3JtLmZvcm1TZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChmaWVsZC5jb250cm9sID09PSBFRm9ybUNvbnRyb2wuQ0FSRCkge1xuICAgICAgICAgICAgaWYgKGZpZWxkLmNhcmQgJiYgZmllbGQuY2FyZC5kYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxldCBvYmogPSBmaWVsZC5jYXJkLmRhdGFbZGF0YS5pbmRleF07XG4gICAgICAgICAgICAgIGlmIChvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqLnNlbGVjdGVkQ2FyZCkge1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iai5zZWxlY3RlZENhcmQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG9ialsnc2VsZWN0ZWRDYXJkJ10gPSAnY2FyZC1hY3RpdmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGRhdGEuc2VsZWN0ZWRDYXJkKSB7XG4gICAgICBkYXRhWydzZWxlY3RlZENhcmQnXSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhWydzZWxlY3RlZENhcmQnXSA9ICdjYXJkLWFjdGl2ZSc7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlUGFzc3dvcmRUeXBlKGZvcm1GaWVsZCkge1xuICAgIGlmIChmb3JtRmllbGQudGV4dFR5cGUgPT0gJ3RleHQnKSB7XG4gICAgICBmb3JtRmllbGQudGV4dFR5cGUgPSAncGFzc3dvcmQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtRmllbGQudGV4dFR5cGUgPSAndGV4dCc7XG4gICAgfVxuICB9XG4gIG9uTGlua0NsaWNrKGxpbmssIGZvcm1TZWN0aW9uKXtcbiAgICBpZighbGluay5kaXNhYmxlZCAmJiAhZm9ybVNlY3Rpb24uZGlzYWJsZWQpe1xuICAgICAgbGluay5vbkNsaWNrKCk7XG4gICAgfVxuICB9XG4gIGlzVmFsaWRDb2x1bW4oY29sOiBhbnkpe1xuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29sKSAmJiBjb2wgPiAwICYmIGNvbCA8PSAxMlxuICB9XG4gYXN5bmMgYWRkRHluYW1pY1BhbmVsT3ZlcmxheUNvbXBvbmVudChldmVudCk6IFByb21pc2U8dm9pZD57XG4gIGxldCBob3ZlckRhdGEgOklPdmVybGF5UGFuZWxEYXRhID0gZXZlbnQ/LmhvdmVyRGF0YTtcbiAgbGV0IG92ZXJsYXlQYW5lbDogYW55ID0gZXZlbnQ/Lm92ZXJsYXlQYW5lbDtcbiAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCk9PntcbiAgICAgIGNvbnN0IGRhdGEgPSB7Li4uaG92ZXJEYXRhPy5kYXRhfTtcbiAgICAgIGlmKE9iamVjdD8ua2V5cyhkYXRhKT8ubGVuZ3RoID4gMCl7XG4gICAgICAgIGNvbnN0IGRhdGFLZXlzID0gT2JqZWN0Py5rZXlzKGhvdmVyRGF0YT8uZGF0YSk7XG4gICAgICAgIGlmKGRhdGFLZXlzPy5sZW5ndGggPjAgKXtcbiAgICAgICAgICBkYXRhS2V5cy5mb3JFYWNoKGtleT0+e1xuICAgICAgICAgICAgdmFyIHZhbHVlID1kYXRhW2tleV07XG4gICAgICAgICAgICBpZih2YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ3snKSAmJiB2YWx1ZT8udG9TdHJpbmcoKT8uaW5jbHVkZXMoJ30nKSl7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZVRvRmluZCA9IHZhbHVlLnJlcGxhY2UoJ3snLCcnKS5yZXBsYWNlKCd9JywnJyk7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT0gdXRpbGl0aWVzLmdldEZvcm1GaWVsZFZhbHVlKHRoaXMuZm9ybSwgdmFsdWVUb0ZpbmQpO1xuICAgICAgICAgICAgfWVsc2UgaWYoIXZhbHVlKXtcbiAgICAgICAgICAgICAgdmFyIG1hdGNoZWRLZXlWYWx1ZSA9IHV0aWxpdGllcy5nZXRGb3JtRmllbGRWYWx1ZSh0aGlzLmZvcm0sIGtleSk7XG4gICAgICAgICAgICAgIGRhdGFba2V5XT1tYXRjaGVkS2V5VmFsdWU7IFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaG92ZXJEYXRhPy5zdHlsZSA/ICh0aGlzLm92ZXJsYXlQYW5lbFN0eWxlID0gaG92ZXJEYXRhLnN0eWxlKSA6ICcnO1xuICAgICAgdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWY6YW55ID0gdGhpcy5wYW5lbE92ZXJsYXlWaWV3Q29udGFpbmVyPy5jcmVhdGVDb21wb25lbnQoaG92ZXJEYXRhPy5jb21wb25lbnQpO1xuICAgICAgY29uc29sZS5sb2coY29tcG9uZW50UmVmKVxuICAgICAgaWYoaG92ZXJEYXRhLmRhdGEpe1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuY29uZmlnID0gW107XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb25maWcuZGF0YSA9IGRhdGE7XG4gICAgICB9XG4gICAgICBvdmVybGF5UGFuZWwuc2hvdyhldmVudD8uZXZlbnQpO1xuICAgICAgXG4gICAgIH0pXG4gIH1cbiAgbW91c2VMZWF2ZUV2ZW50KG92ZXJsYXlQYW5lbCl7XG4gICAgb3ZlcmxheVBhbmVsPy5oaWRlKCk7XG4gIH1cblxufVxuXG4iLCI8c2Utc3BsaXR0ZXIgXG4gICpuZ0lmPVwic3BsaXRTY3JlZW5cIlxuICBbZXhpc3RpbmdDb21wb25lbnRdPVwicGFuZWxJbmZvLmV4aXN0aW5nQ29wbW9uZW50XCIgXG4gIFtwYW5lbENvbXBvbmVudF09XCJwYW5lbEluZm8ucGFuZWxDb21wb25lbnRcIiBcbiAgW2NvbmZpZ0RhdGFdPVwicGFuZWxJbmZvLmNvbmZpZ0RhdGFcIiBcbiAgKGNsb3NlUGFuZWxFbWl0dGVyKT1cImNsb3NlUGFuZWwoKVwiXG4+PC9zZS1zcGxpdHRlcj5cbjxwLWNvbmZpcm1EaWFsb2cgW3N0eWxlXT1cInsgd2lkdGg6ICc1MHZ3JyB9XCIga2V5PVwiY2FuY2VsQnV0dG9uXCI+PC9wLWNvbmZpcm1EaWFsb2c+XG48ZGl2IFtpZF09XCJkeW5hbWljRm9ybUlkXCIgI3ZpZXdDb250YWluZXJGb3JtUmVmPlxuICA8Zm9ybSAqbmdJZj1cIiFpc0Zvcm1IaWRkZW4gJiYgZm9ybVwiPlxuICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgY2xhc3M9XCJwcm9ncmVzcy1zcGlubmVyIHAtcHJvZ3Jlc3Mtc3Bpbm5lci1jaXJjbGUgY3VzdG9tLXNwaW5uZXJcIj48L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LXdyYXBcIj5cbiAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsgJ2ZpeGVkLWhlaWdodCc6IHN0aWNreUFjdGlvbnMgfVwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmb3JtU2VjdGlvbiBvZiBmb3JtLmZvcm1TZWN0aW9uc1wiIFtjbGFzc109XCIhZm9ybVNlY3Rpb24uaGlkZGVuID8gJ2NhcmQgdy0xMDAnIDogJydcIj5cbiAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiY2xpY2tlZFNlY3Rpb24oZm9ybVNlY3Rpb24pXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWZvcm1TZWN0aW9uID8gJycgOiBzZWN0aW9uRGlzYWJsZWQoZm9ybVNlY3Rpb24pXCI+XG4gICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImZvcm1TZWN0aW9uLmhpZGRlbiA/ICdoaWRkZW4nIDogZm9ybVNlY3Rpb24uY2xhc3NcIj5cbiAgICAgICAgICAgICAgICA8cC1hY2NvcmRpb24+XG4gICAgICAgICAgICAgICAgICA8cC1hY2NvcmRpb25UYWIgW3NlbGVjdGVkXT1cImZvcm1TZWN0aW9uLmV4cGFuZGVkID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtU2VjdGlvbi5hY2NvcmRpb25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIiFmb3JtU2VjdGlvbi5zaG93QWNjb3JkaW9uID8gJ2hpZGUtYWNjb3JkaWFuJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiZm9ybVNlY3Rpb24uaWNvblwiIFt0aXRsZV09XCJmb3JtU2VjdGlvbi5uYW1lXCIgY2xhc3M9XCJtci0xIHBsLTJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdWJzZWN0aW9uLWhlYWRlclwiPnt7IGZvcm1TZWN0aW9uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3AtaGVhZGVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwLWNvbCBmb3JtLWNvbXBvbmVudCBhY2NvcmRpb24taGVhZGVyLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCIhZm9ybVNlY3Rpb24uc2hvd0FjY29yZGlvblwiIGZvcj1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb25IZWFkZXJOYW1lIGZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBbdGl0bGVdPVwiZm9ybVNlY3Rpb24ubmFtZVwiIFtjbGFzc109XCJmb3JtU2VjdGlvbi5pY29uXCIgY2xhc3M9XCJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PiB7eyBmb3JtU2VjdGlvbi5uYW1lIH19IDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBsaW5rIG9mIGZvcm1TZWN0aW9uLmxpbmtzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtci0zIGN1c3RvbS1saW5rXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJsaW5rLm5hbWUgJiYhZm9ybVNlY3Rpb24uZGlzYWJsZWQmJiFsaW5rLmRpc2FibGVkICA/ICdjdXN0b20tbGluaycgOiAnZGlzYWJsZWQtbGluaydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25MaW5rQ2xpY2sobGluaywgZm9ybVNlY3Rpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxpbmsubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZm9ybS1jb21wb25lbnQgZm9ybS1ib2R5LXdyYXBwZXIgaGVhZGVyLWZpZWxkcy13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCIoaGVhZGVyRmllbGQuY29udHJvbD09PSdhZGRfYnV0dG9uJz8gJyBmb3JtLWJ1dHRvbi1maWVsZC13cmFwcGVyICc6JycpK1xuICAgICAgICAgICAgICAgICAgICAgICAgKCBpc1ZhbGlkQ29sdW1uKGhlYWRlckZpZWxkLmNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2NvbC0nICsgaGVhZGVyRmllbGQuY29sdW1uICsgc2V0Q2xhc3NOYW1lKGhlYWRlckZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpc1ZhbGlkQ29sdW1uKGZvcm0uY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnY29sLScgKyBmb3JtLmNvbHVtbiArIHNldENsYXNzTmFtZShoZWFkZXJGaWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaGVhZGVyRmllbGQuY29sdW1uIHx8IGZvcm0uY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICcgY29sICdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2NvbC0xMiBtZDpjb2wtMyBmbGV4IGZsZXgtY29sdW1uJyArIHNldENsYXNzTmFtZShoZWFkZXJGaWVsZCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaGVhZGVyRmllbGQuY29udHJvbCA9PT0gJ2JyZWFrX2xpbmUnID8gJ2JyZWFrLWxpbmUnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaGVhZGVyRmllbGQgb2YgZm9ybVNlY3Rpb24uaGVhZGVyRmllbGRzOyBsZXQgaGVhZGVyRmllbGRJbmRleCA9IGluZGV4XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nU3dpdGNoXT1cImhlYWRlckZpZWxkLmNvbnRyb2xcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGFiZWxDb250cm9sIEh5cGVybGluayBvbiBsb29rdXAgIENvbnRyb2wgRmllbGQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImhlYWRlckZpZWxkPy5sYWJlbD8ubGFiZWxDb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgW292ZXJsYXlQYW5lbF09XCJvdmVybGF5UGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxEaXNwbGF5XT1cImxhYmVsRGlzcGxheVwiIChvbk1vdXNlRW50ZXIpPVwiYWRkRHluYW1pY1BhbmVsT3ZlcmxheUNvbXBvbmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uTW91c2VMZWF2ZSk9XCJtb3VzZUxlYXZlRXZlbnQoJGV2ZW50KVwiIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uTG9hZExhYmVsQ29udHJvbElGcmFtZUNsaWNrKT1cImxvYWRMYWJlbENvbnRyb2xJRnJhbWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdExvb2t1cExhYmVsQ2xpY2spPVwic2VsZWN0TG9va3VwTGFiZWwoJGV2ZW50Py5mb3JtRmllbGQsICRldmVudD8uZXZlbnQpXCI+PC9sYWJlbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsRGlzcGxheT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiaGVhZGVyRmllbGQubGFiZWwuaWNvblwiIFtjbGFzc109XCJoZWFkZXJGaWVsZC5sYWJlbC5pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVhZGVyRmllbGQubGFiZWwuaWNvblwiPiB7e2hlYWRlckZpZWxkLmxhYmVsLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbnB1dCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0LWNvbnRyb2wgW2ZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGNoYW5nZVBhc3N3b3JkKT1cImNoYW5nZVBhc3N3b3JkVHlwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c0V2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9pbnB1dC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE51bWVyaWMgSW5wdXQgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTlVNRVJJQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG51bWVyaWMtY29udHJvbCBbZmllbGRdPVwiaGVhZGVyRmllbGRcIiAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdExvb2t1cCk9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L251bWVyaWMtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDaGVja2JveCBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DSEVDS0JPWFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNoZWNrYm94LWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NoZWNrYm94LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUGFzc3dvcmQgSW5wdXQgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUEFTU1dPUkRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXNzd29yZC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFzc3dvcmQtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTcGFjZXIgQ29udHJvbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1BBQ0VSXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhY2VyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiPjwvc3BhY2VyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgVGV4dEFyZWEgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlRFWFRBUkVBXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEFyZWEtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC90ZXh0QXJlYS1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tQWRkIEVkaXRvciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5URVhUX0VESVRPUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWVkaXRvci1jb250cm9sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c0V2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlLWVkaXRvci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2FsZW5kYXIgQ29udHJvbC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DQUxFTkRBUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbGVuZGFyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIFtkZWZhdWx0RGF0ZV09XCJkZWZhdWx0RGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYWxlbmRhckZvcm1hdF09XCJjYWxlbmRhckZvcm1hdFwiIChvblNob3cpPVwic2V0Q2FsZW5kYXJEYXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIiAobmdNb2RlbENoYW5nZSk9XCJjYWxlbmRhckNoYW5nZVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25JbnB1dCk9XCJjYWxlbmRhcklucHV0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9jYWxlbmRhci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHJvcGRvd24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkRST1BET1dOXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHJvcGRvd24tY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKGtleXVwVGFiKT1cInRhYkZvY3VzRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImNsZWFyRHJvcGRvd25WYWx1ZSgkZXZlbnQpXCIgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DbGVhclZhbHVlKCRldmVudClcIj48L2Ryb3Bkb3duLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRvQ29tcGxldGUgU2VhcmNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5BVVRPQ09NUExFVEVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdXRvQ29tcGxldGUtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiIChjb21wbGV0ZU1ldGhvZCk9XCJhdXRvU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXNPdXRFdmVudCk9XCJvbkZvY3VzT3V0RXZlbnQoJGV2ZW50KVwiPjwvYXV0b0NvbXBsZXRlLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aS1zZWxlY3QgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLk1VTFRJU0VMRUNUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9tdWx0aXNlbGVjdC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSHlwZXJsaW5rLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkhZUEVSTElOS1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGh5cGVybGluay1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25IeXBlcmxpbmtEaWFsb2dDbGljayk9XCJoeXBlcmxpbmtEaWFsb2coJGV2ZW50KVwiIChvbkNsaWNrKT1cImhhbmRsZUNsaWNrRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZnJhbUxvYWRFdmVudCk9XCJsb2FkSUZyYW1lKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaHlwZXJsaW5rLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBMb29rdXAgQ29udHJvbCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTE9PS1VQX0lOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9va3VwLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiIChrZXl1cFRhYik9XCJzZWxlY3RMb29rdXBGaWVsZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2VsZWN0TG9va3VwRmllbGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsZWFyTG9va3VwVmFsdWUpPVwibG9va3VwQ2xlYXJWYWx1ZSgkZXZlbnQpXCI+PC9sb29rdXAtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdCBCdXR0b24gRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNFTEVDVEJVVFRPTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdC1idXR0b24tY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9zZWxlY3QtYnV0dG9uLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3RlIERldGFpbCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTk9URV9GSUVMRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5vdGUtZGV0YWlsLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZU5vdGVGaWVsZERpYWxvZygkZXZlbnQpXCI+PC9ub3RlLWRldGFpbC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGNvbXBvbmVudC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TRUNUSU9OX0hFQURFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24taGVhZGVyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJoZWFkZXJGaWVsZFwiPjwvc2VjdGlvbi1oZWFkZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBPbkNsaWNrIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQUREX0JVVFRPTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZC1idXR0b24tY29udHJvbC1jb250cm9sIFtmb3JtRmllbGRdPVwiaGVhZGVyRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoJGV2ZW50KVwiPjwvYWRkLWJ1dHRvbi1jb250cm9sLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgR2VuZXJhdGUgUmVwb3J0IEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlJFUE9SVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZ2VuZXJhdGUtcmVwb3J0LWJ0biBbcmVwSW5mb109XCJoZWFkZXJGaWVsZFwiIFtsYWJlbF09XCJoZWFkZXJGaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImhlYWRlckZpZWxkLmxhYmVsXCIgW3BhcmFtc109XCJoZWFkZXJGaWVsZC5wYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RGlhbG9nXT1cImhlYWRlckZpZWxkLnNob3dEaWFsb2dcIiBbcmVwb3J0VHlwZV09XCIgaGVhZGVyRmllbGQucmVwb3J0VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcG9ydEhlYWRlcl09XCJoZWFkZXJGaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImhlYWRlckZpZWxkLnJlcG9ydEZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiIFtpY29uXT1cImhlYWRlckZpZWxkLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJoZWFkZXJGaWVsZC5jbGFzc1wiPjwvc2UtZ2VuZXJhdGUtcmVwb3J0LWJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEdlbmVyYXRlIEVtYWlsIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRU1BSUxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWVtYWlsLWdlbmVyYXRlLWJ0biBbcmVwSW5mb109XCJoZWFkZXJGaWVsZFwiIFtsYWJlbF09XCJoZWFkZXJGaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImhlYWRlckZpZWxkLmxhYmVsXCIgW3BhcmFtc109XCJoZWFkZXJGaWVsZC5wYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RGlhbG9nXT1cImhlYWRlckZpZWxkLnNob3dEaWFsb2dcIiBbcmVwb3J0VHlwZV09XCIgaGVhZGVyRmllbGQucmVwb3J0VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcG9ydEhlYWRlcl09XCJoZWFkZXJGaWVsZC5yZXBvcnRIZWFkZXJcIiBbcmVwb3J0Rm9vdGVyXT1cImhlYWRlckZpZWxkLnJlcG9ydEZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiIFtpY29uXT1cImhlYWRlckZpZWxkLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJoZWFkZXJGaWVsZC5jbGFzc1wiPjwvc2UtZW1haWwtZ2VuZXJhdGUtYnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIElucHV0IFN3aXRjaCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU1dJVENIXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXQtc3dpdGNoLWNvbnRyb2wtY29udHJvbCBbZm9ybUZpZWxkXT1cImhlYWRlckZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0V2ZW50KCRldmVudClcIj48L0lucHV0LXN3aXRjaC1jb250cm9sLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEeW5hbWljIENvbXBvbmVudCBDb250YWluZXItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiaGVhZGVyRmllbGQuaGlkZGVuID8gJ2hpZGRlbicgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInt7Zm9ybVNlY3Rpb24ubmFtZX19LXt7aGVhZGVyRmllbGRJbmRleH19XCIgI2R5bmFtaWNDb21wb25lbnRDb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNPTVBPTkVOVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWxlIFVwbG9hZCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFoZWFkZXJGaWVsZC5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkZJTEVfVVBMT0FEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJoZWFkZXJGaWVsZC5kaXNhYmxlZCA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhlYWRlckZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImhlYWRlckZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChoZWFkZXJGaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWZpbGUtdXBsb2FkIFthbGxvd011bHRpcGxlXT1cImhlYWRlckZpZWxkLnNlbGVjdE11bHRpcGxlRmlsZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRGaWxlVHlwZXNdPVwiaGVhZGVyRmllbGQuU2V0ZmlsZVR5cGVzXCIgW2ZpZWxkc109XCJoZWFkZXJGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVVcmwpPVwic2V0RmlsZVVybHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwbG9hZEZpbGVPblJldHVybik9XCJmaWxlT25jaGFuZ2VFdmVudCgpXCI+PC9zZS1maWxlLXVwbG9hZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93ZmlsZVVwbG9hZEVycm9yXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckZpZWxkLmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEaXNwbGF5ICBDYXJkIGZpZWxkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlYWRlckZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW5cIiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQ0FSRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiaGVhZGVyRmllbGQuZGlzYWJsZWQgPyAnZGlzYWJsZWQtbGluaycgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBkYXRhLXRpdGxlLWVsZW1lbnQ9XCJzZWxmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBoZWFkZXJGaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJoZWFkZXJGaWVsZC5yZXF1aXJlZEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoaGVhZGVyRmllbGQ/LmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWNhcmQgW2NhcmRdPVwiaGVhZGVyRmllbGQuY2FyZFwiIFtzZXRDYXJkRGF0YV09XCJzZXRDYXJkRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2FyZCk9XCJzZWxlY3RlZENhcmRDbGlja0V2ZW50KCRldmVudClcIj48L3NlLWNhcmQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93ZmlsZVVwbG9hZEVycm9yXCIgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckZpZWxkLmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZm9ybS1jb21wb25lbnQgZm9ybS1ib2R5LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCIoZm9ybUZpZWxkLmNvbnRyb2w9PT0nYWRkX2J1dHRvbic/ICcgZm9ybS1idXR0b24tZmllbGQtd3JhcHBlciAnOicnKStcbiAgICAgICAgICAgICAgICAgICAgKCBpc1ZhbGlkQ29sdW1uKGZvcm1GaWVsZC5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgID8gJ2NvbC0nICsgZm9ybUZpZWxkLmNvbHVtbiArIHNldENsYXNzTmFtZShmb3JtRmllbGQpXG4gICAgICAgICAgICAgICAgICAgIDogaXNWYWxpZENvbHVtbihmb3JtLmNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgPyAnY29sLScgKyBmb3JtLmNvbHVtbiArIHNldENsYXNzTmFtZShmb3JtRmllbGQpXG4gICAgICAgICAgICAgICAgICAgIDogZm9ybUZpZWxkLmNvbHVtbiB8fCBmb3JtLmNvbHVtblxuICAgICAgICAgICAgICAgICAgICA/ICcgY29sICdcbiAgICAgICAgICAgICAgICAgICAgOiAnY29sLTEyIG1kOmNvbC0zIGZsZXggZmxleC1jb2x1bW4nICsgc2V0Q2xhc3NOYW1lKGZvcm1GaWVsZCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvcm1GaWVsZC5jb250cm9sID09PSAnYnJlYWtfbGluZScgPyAnYnJlYWstbGluZScgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZm9ybUZpZWxkIG9mIGZvcm1TZWN0aW9uLmZpZWxkczsgbGV0IGZvcm1GaWVsZEluZGV4ID0gaW5kZXhcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBsYWJlbENvbnRyb2wgSHlwZXJsaW5rIG9uIGxvb2t1cCAgQ29udHJvbCBGaWVsZC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmb3JtRmllbGQ/LmxhYmVsPy5sYWJlbENvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiBbb3ZlcmxheVBhbmVsXT1cIm92ZXJsYXlQYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsRGlzcGxheV09XCJsYWJlbERpc3BsYXlcIiAob25Nb3VzZUVudGVyKT1cImFkZER5bmFtaWNQYW5lbE92ZXJsYXlDb21wb25lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uTW91c2VMZWF2ZSk9XCJtb3VzZUxlYXZlRXZlbnQob3ZlcmxheVBhbmVsKVwiIChvbkNsaWNrKT1cIm9uQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Mb2FkTGFiZWxDb250cm9sSUZyYW1lQ2xpY2spPVwibG9hZExhYmVsQ29udHJvbElGcmFtZShmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RMb29rdXBMYWJlbENsaWNrKT1cInNlbGVjdExvb2t1cExhYmVsKCRldmVudD8uZm9ybUZpZWxkLCAkZXZlbnQ/LmV2ZW50KVwiPjwvbGFiZWwtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGFiZWxEaXNwbGF5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cImZvcm1GaWVsZC5sYWJlbC5pY29uXCIgW2NsYXNzXT1cImZvcm1GaWVsZC5sYWJlbC5pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQubGFiZWwuaWNvblwiPiB7e2Zvcm1GaWVsZC5sYWJlbC5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJmb3JtRmllbGQuY29udHJvbFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU3BhY2VyIENvbnRyb2wgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TUEFDRVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhY2VyLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIj48L3NwYWNlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbnB1dCBUZXh0QXJlYSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlRFWFRBUkVBXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRBcmVhLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPjwvdGV4dEFyZWEtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGV4dCBJbnB1dCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLklOUFVUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0LWNvbnRyb2wgW2ZpZWxkXT1cImZvcm1GaWVsZFwiIChjaGFuZ2VQYXNzd29yZCk9XCJjaGFuZ2VQYXNzd29yZFR5cGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlRXZlbnQpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCIgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c0V2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+PC9pbnB1dC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOdW1iZXIgSW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5OVU1FUklDXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG51bWVyaWMtY29udHJvbCBbZmllbGRdPVwiZm9ybUZpZWxkXCIgKGNoYW5nZUV2ZW50KT1cIm9uQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0TG9va3VwKT1cInNlbGVjdExvb2t1cEZpZWxkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KCRldmVudClcIj48L251bWVyaWMtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUGFzc3dvcmQgSW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5QQVNTV09SRFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXNzd29yZC1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIiAob25Gb2N1c091dCk9XCJvbkZvY3VzT3V0RXZlbnQoZm9ybUZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFzc3dvcmQtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2hlY2tib3ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNIRUNLQk9YXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNoZWNrYm94LWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCIgKG9uRm9jdXNPdXQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NoZWNrYm94LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2FsZW5kYXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DQUxFTkRBUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYWxlbmRhci1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgW2RlZmF1bHREYXRlXT1cImRlZmF1bHREYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYWxlbmRhckZvcm1hdF09XCJjYWxlbmRhckZvcm1hdFwiIChvblNob3cpPVwic2V0Q2FsZW5kYXJEYXRlKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY2FsZW5kYXJDaGFuZ2VWYWx1ZShmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbklucHV0KT1cImNhbGVuZGFySW5wdXRWYWx1ZShmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+PC9jYWxlbmRhci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkRST1BET1dOXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRyb3Bkb3duLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAoa2V5dXBUYWIpPVwidGFiRm9jdXNFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImNsZWFyRHJvcGRvd25WYWx1ZShmb3JtRmllbGQpXCIgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2xlYXJWYWx1ZSgkZXZlbnQpXCI+PC9kcm9wZG93bi1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRvQ29tcGxldGUgU2VhcmNoIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQVVUT0NPTVBMRVRFXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF1dG9Db21wbGV0ZS1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlRXZlbnQoZm9ybUZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVDbGlja0V2ZW50KGZvcm1GaWVsZClcIiAoY29tcGxldGVNZXRob2QpPVwiYXV0b1NlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c091dEV2ZW50KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+PC9hdXRvQ29tcGxldGUtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTXVsdGktc2VsZWN0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuTVVMVElTRUxFQ1RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUV2ZW50KGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzT3V0RXZlbnQpPVwib25Gb2N1c091dEV2ZW50KGZvcm1GaWVsZClcIj48L211bHRpc2VsZWN0LWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEh5cGVybGluay0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuSFlQRVJMSU5LXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGh5cGVybGluay1jb250cm9sIFtmb3JtRmllbGRdPVwiZm9ybUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkh5cGVybGlua0RpYWxvZ0NsaWNrKT1cImh5cGVybGlua0RpYWxvZygkZXZlbnQpXCIgKG9uQ2xpY2spPVwiaGFuZGxlQ2xpY2tFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZnJhbUxvYWRFdmVudCk9XCJsb2FkSUZyYW1lKGZvcm1GaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2h5cGVybGluay1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBMb29rdXAgQ29udHJvbCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkxPT0tVUF9JTlBVVFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb29rdXAtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiIChrZXl1cFRhYik9XCJzZWxlY3RMb29rdXBGaWVsZChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInNlbGVjdExvb2t1cEZpZWxkKGZvcm1GaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xlYXJMb29rdXBWYWx1ZSk9XCJsb29rdXBDbGVhclZhbHVlKGZvcm1GaWVsZClcIj48L2xvb2t1cC1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWxlIFVwbG9hZCBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkZJTEVfVVBMT0FEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZC5kaXNhYmxlZCA/ICdkaXNhYmxlZC1saW5rJyA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtRmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1GaWVsZC5yZXF1aXJlZEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGZvcm1GaWVsZD8uZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlLWZpbGUtdXBsb2FkIFthbGxvd011bHRpcGxlXT1cImZvcm1GaWVsZC5zZWxlY3RNdWx0aXBsZUZpbGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdEZpbGVUeXBlc109XCJmb3JtRmllbGQuU2V0ZmlsZVR5cGVzXCIgW2ZpZWxkc109XCJmb3JtRmllbGRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVVcmwpPVwic2V0RmlsZVVybHMoJGV2ZW50KVwiIFtpc0F6dXJlVXBsb2FkXT1cImZvcm1GaWVsZC5pc0F6dXJlVXBsb2FkID09IGZhbHNlID8gZm9ybUZpZWxkLmlzQXp1cmVVcGxvYWQgOiB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwbG9hZEZpbGVPblJldHVybik9XCJmaWxlT25jaGFuZ2VFdmVudCgpXCI+PC9zZS1maWxlLXVwbG9hZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0IEJ1dHRvbiBGaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLlNFTEVDVEJVVFRPTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QtYnV0dG9uLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIiAob25DaGFuZ2UpPVwib25DaGFuZ2VFdmVudChmb3JtRmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzT3V0KT1cIm9uRm9jdXNPdXRFdmVudChmb3JtRmllbGQpXCI+PC9zZWxlY3QtYnV0dG9uLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGlzcGxheSAgQ2FyZCBmaWVsZCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uXCIgKm5nU3dpdGNoQ2FzZT1cImR5bmFtaWNDYXNlLkNBUkRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmRpc2FibGVkID8gJ2Rpc2FibGVkLWxpbmsnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS10aXRsZS1lbGVtZW50PVwic2VsZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1GaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZm9ybUZpZWxkLnJlcXVpcmVkRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZm9ybUZpZWxkPy5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1jYXJkIFtjYXJkXT1cImZvcm1GaWVsZC5jYXJkXCIgW3NldENhcmREYXRhXT1cInNldENhcmREYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2FyZCk9XCJzZWxlY3RlZENhcmRDbGlja0V2ZW50KCRldmVudClcIj48L3NlLWNhcmQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2ZpbGVVcGxvYWRFcnJvclwiIGRhdGEtdGl0bGUtZWxlbWVudD1cInNlbGZcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLmVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZSBEZXRhaWwgRmllbGQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5OT1RFX0ZJRUxEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5vdGUtZGV0YWlsLWNvbnRyb2wgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlTm90ZUZpZWxkRGlhbG9nKGZvcm1GaWVsZClcIj48L25vdGUtZGV0YWlsLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER5bmFtaWMgQ29tcG9uZW50IENvbnRhaW5lci0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiZm9ybUZpZWxkLmhpZGRlbiA/ICdoaWRkZW4nIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwie3tmb3JtU2VjdGlvbi5uYW1lfX0te3tmb3JtRmllbGRJbmRleH19XCIgI2R5bmFtaWNDb21wb25lbnRDb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5DT01QT05FTlRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGNvbXBvbmVudC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuU0VDVElPTl9IRUFERVJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbi1oZWFkZXItY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiPjwvc2VjdGlvbi1oZWFkZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIE9uQ2xpY2sgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuQUREX0JVVFRPTlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGQtYnV0dG9uLWNvbnRyb2wtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiPjwvYWRkLWJ1dHRvbi1jb250cm9sLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBHZW5lcmF0ZSBSZXBvcnQgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuUkVQT1JUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZ2VuZXJhdGUtcmVwb3J0LWJ0biBbcmVwSW5mb109XCJmb3JtRmllbGRcIiBbbGFiZWxdPVwiZm9ybUZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImZvcm1GaWVsZC5sYWJlbFwiIFtwYXJhbXNdPVwiZm9ybUZpZWxkLnBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93RGlhbG9nXT1cImZvcm1GaWVsZC5zaG93RGlhbG9nXCIgW3JlcG9ydFR5cGVdPVwiIGZvcm1GaWVsZC5yZXBvcnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcG9ydEhlYWRlcl09XCJmb3JtRmllbGQucmVwb3J0SGVhZGVyXCIgW3JlcG9ydEZvb3Rlcl09XCJmb3JtRmllbGQucmVwb3J0Rm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiIFtpY29uXT1cImZvcm1GaWVsZC5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvcm1GaWVsZC5jbGFzc1wiPjwvc2UtZ2VuZXJhdGUtcmVwb3J0LWJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEdlbmVyYXRlIEVtYWlsIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuRU1BSUxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZS1lbWFpbC1nZW5lcmF0ZS1idG4gW3JlcEluZm9dPVwiZm9ybUZpZWxkXCIgW2xhYmVsXT1cImZvcm1GaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJmb3JtRmllbGQubGFiZWxcIiBbcGFyYW1zXT1cImZvcm1GaWVsZC5wYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0RpYWxvZ109XCJmb3JtRmllbGQuc2hvd0RpYWxvZ1wiIFtyZXBvcnRUeXBlXT1cIiBmb3JtRmllbGQucmVwb3J0VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXBvcnRIZWFkZXJdPVwiZm9ybUZpZWxkLnJlcG9ydEhlYWRlclwiIFtyZXBvcnRGb290ZXJdPVwiZm9ybUZpZWxkLnJlcG9ydEZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBbaWNvbl09XCJmb3JtRmllbGQuaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJmb3JtRmllbGQuY2xhc3NcIj48L3NlLWVtYWlsLWdlbmVyYXRlLWJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBJbnB1dCBTd2l0Y2ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJkeW5hbWljQ2FzZS5TV0lUQ0hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXQtc3dpdGNoLWNvbnRyb2wtY29udHJvbCBbZm9ybUZpZWxkXT1cImZvcm1GaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkNsaWNrRXZlbnQoZm9ybUZpZWxkKVwiPjwvSW5wdXQtc3dpdGNoLWNvbnRyb2wtY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIEVkaXRvciBDb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiZHluYW1pY0Nhc2UuVEVYVF9FRElUT1JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2UtZWRpdG9yLWNvbnRyb2wgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1GaWVsZF09XCJmb3JtRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VFdmVudCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1c0V2ZW50KT1cIm9uRm9jdXNPdXRFdmVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZS1lZGl0b3ItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cbiAgICAgICAgICAgICAgICA8L3AtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gc2F2ZSBhbmQgY2xvc2UgYnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgYWN0aW9ucy1idXR0b25zLW1haW4td3JhcHBlciBmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIiBbbmdDbGFzc109XCJ7IHN0aWNreTogc3RpY2t5QWN0aW9ucyB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lci1zdGlja3kgZm9ybS1jb21wb25lbnQgYWN0aW9ucy1idXR0b25zLXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgPCEtLSBzYXZlIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWhpZGVTYXZlQnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRm9ybURpc2FibGVkXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJzYXZlQnV0dG9uTGFiZWwgPyBzYXZlQnV0dG9uTGFiZWwgOiAnU2F2ZSdcIiBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3MgZm9ybS1zYXZlLWJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25TYXZlRm9ybSgpXCI+PC9idXR0b24+XG4gICAgICAgICAgPCEtLSBjbG9zZSBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFoaWRlQ2FuY2VsQnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRm9ybURpc2FibGVkXCIgKGNsaWNrKT1cIm9uQ2FuY2VsRm9ybSgpXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIFtsYWJlbF09XCJjYW5jZWxCdXR0b25MYWJlbCA/IGNhbmNlbEJ1dHRvbkxhYmVsIDogJ0NhbmNlbCdcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIgbWwtM1wiPjwvYnV0dG9uPlxuICAgICAgICAgIDwhLS0gZHluYW1pYyBidXR0b25zIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBmb3JtQnV0dG9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFidXR0b24uaGlkZGVuXCIgcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2xhYmVsXT1cImJ1dHRvbi5sYWJlbFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImJ1dHRvbi5pY29uID8gYnV0dG9uLmljb24gOiAnJ1wiIGNsYXNzPVwicC1idXR0b24tc3VjY2VzcyBtbC0zXCIgKGNsaWNrKT1cIm9uTmV3QnV0dG9uQ2xpY2soYnV0dG9uKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWQgPyBidXR0b24uZGlzYWJsZWQgOiBmYWxzZVwiPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbiAgPHAtb3ZlcmxheVBhbmVsIFtzdHlsZV09XCJvdmVybGF5UGFuZWxTdHlsZVwiICNvdmVybGF5UGFuZWw+XG4gICAgPG5nLWNvbnRhaW5lciAjdmlld0NvbnRhaW5lclJlZj48L25nLWNvbnRhaW5lcj5cbiAgPC9wLW92ZXJsYXlQYW5lbD5cbjwvZGl2PlxuPGRpdiAqbmdJZj1cIiFzcGxpdFNjcmVlblwiPlxuICA8ZGl2ICNhcHBlbmRGb3JtPjwvZGl2PlxuPC9kaXY+Il19
|