@pega/angular-sdk-components 0.23.6 → 0.24.1

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.
Files changed (45) hide show
  1. package/esm2022/lib/_bridge/angular-pconnect.mjs +14 -2
  2. package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +3 -1
  3. package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +6 -3
  4. package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +9 -5
  5. package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +2 -2
  6. package/esm2022/lib/_components/field/check-box/check-box.component.mjs +107 -42
  7. package/esm2022/lib/_components/field/group/group.component.mjs +6 -3
  8. package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +311 -0
  9. package/esm2022/lib/_components/field/multiselect/utils.mjs +187 -0
  10. package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +3 -3
  11. package/esm2022/lib/_components/field/time/time.component.mjs +5 -3
  12. package/esm2022/lib/_components/field/url/url.component.mjs +5 -3
  13. package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +6 -6
  14. package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +3 -3
  15. package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +6 -3
  16. package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +33 -4
  17. package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +8 -3
  18. package/esm2022/lib/_components/template/list-view/list-view.component.mjs +23 -25
  19. package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +2 -2
  20. package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +41 -12
  21. package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +5 -3
  22. package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +7 -3
  23. package/esm2022/lib/_helpers/instructions-utils.mjs +36 -0
  24. package/esm2022/lib/_helpers/utils.mjs +2 -2
  25. package/fesm2022/pega-angular-sdk-components.mjs +778 -112
  26. package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
  27. package/lib/_bridge/angular-pconnect.d.ts +2 -0
  28. package/lib/_bridge/helpers/sdk-pega-component-map.d.ts +2 -0
  29. package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +2 -0
  30. package/lib/_components/designSystemExtension/operator/operator.component.d.ts +2 -1
  31. package/lib/_components/field/check-box/check-box.component.d.ts +18 -0
  32. package/lib/_components/field/multiselect/multiselect.component.d.ts +64 -0
  33. package/lib/_components/field/multiselect/utils.d.ts +8 -0
  34. package/lib/_components/field/time/time.component.d.ts +1 -0
  35. package/lib/_components/field/url/url.component.d.ts +1 -0
  36. package/lib/_components/infra/navbar/navbar.component.d.ts +2 -0
  37. package/lib/_components/template/case-summary/case-summary.component.d.ts +2 -0
  38. package/lib/_components/template/field-value-list/field-value-list.component.d.ts +2 -1
  39. package/lib/_components/template/list-view/list-view.component.d.ts +0 -2
  40. package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +2 -0
  41. package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +2 -0
  42. package/lib/_components/widget/attachment/attachment.component.d.ts +4 -0
  43. package/lib/_helpers/instructions-utils.d.ts +4 -0
  44. package/lib/doc/KeyReleaseUpdates.md +1 -1
  45. package/package.json +1 -1
@@ -73,8 +73,10 @@ export class SimpleTableManualComponent {
73
73
  this.arFilterMainButtons$ = [];
74
74
  this.arFilterSecondaryButtons$ = [];
75
75
  this.allowEditingInModal = false;
76
+ this.isInitialized = false;
76
77
  }
77
78
  ngOnInit() {
79
+ this.isInitialized = true;
78
80
  // First thing in initialization is registering and subscribing to the AngularPConnect service
79
81
  this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
80
82
  this.configProps$ = this.pConn$.getConfigProps();
@@ -178,6 +180,7 @@ export class SimpleTableManualComponent {
178
180
  // unchanged config info. For now, much of the info here is carried over from
179
181
  // Nebula and we may not end up using it all.
180
182
  this.fieldDefs = buildFieldsForTable(rawFields, resolvedFields, showDeleteButton);
183
+ this.initializeDefaultPageInstructions();
181
184
  // end of from Nebula
182
185
  // Here, we use the "name" field in fieldDefs since that has the assoicated property
183
186
  // (if one exists for the field). If no "name", use "cellRenderer" (typically get DELETE_ICON)
@@ -217,6 +220,18 @@ export class SimpleTableManualComponent {
217
220
  // Note that the "property" shown in the column ("FirstName" in the above examples) is what
218
221
  // ties the 3 data structures together.
219
222
  }
223
+ initializeDefaultPageInstructions() {
224
+ if (this.isInitialized) {
225
+ this.isInitialized = false;
226
+ if (this.allowEditingInModal) {
227
+ this.pConn$.getListActions().initDefaultPageInstructions(this.pConn$.getReferenceList(), this.fieldDefs.filter(item => item.name).map(item => item.name));
228
+ }
229
+ else {
230
+ // @ts-ignore - An argument for 'fields' was not provided
231
+ this.pConn$.getListActions().initDefaultPageInstructions(this.pConn$.getReferenceList());
232
+ }
233
+ }
234
+ }
220
235
  getResultsText() {
221
236
  const recordsCount = this.readOnlyMode ? this.rowData?.data.length : this.referenceList?.length;
222
237
  return `${recordsCount} result${recordsCount > 1 ? 's' : ''}`;
@@ -234,13 +249,27 @@ export class SimpleTableManualComponent {
234
249
  return result;
235
250
  }
236
251
  }
237
- if (aValue === bValue) {
238
- return 0;
252
+ //
253
+ switch (this.arrowDirection) {
254
+ case 'up':
255
+ if (!aValue || aValue < bValue) {
256
+ return -1;
257
+ }
258
+ if (!bValue || aValue > bValue) {
259
+ return 1;
260
+ }
261
+ break;
262
+ case 'down':
263
+ if (!bValue || aValue > bValue) {
264
+ return -1;
265
+ }
266
+ if (!aValue || aValue < bValue) {
267
+ return 1;
268
+ }
269
+ break;
270
+ default:
271
+ break;
239
272
  }
240
- if (this.arrowDirection === 'up')
241
- return aValue - bValue;
242
- if (this.arrowDirection === 'down')
243
- return bValue - aValue;
244
273
  return 0;
245
274
  }
246
275
  compareByColumnPxRefObjectInsName(aValue, bValue) {
@@ -680,13 +709,13 @@ export class SimpleTableManualComponent {
680
709
  .getActionsApi()
681
710
  .openEmbeddedDataModal(this.defaultView, this.pConn$, this.referenceListStr, this.referenceList.length, PCore.getConstants().RESOURCE_STATUS.CREATE);
682
711
  }
683
- else if (PCore.getPCoreVersion()?.includes('8.7')) {
684
- this.pConn$.getListActions().insert({ classID: this.contextClass }, this.referenceList.length, this.pageReference);
685
- }
686
712
  else {
687
713
  // @ts-ignore - second parameter "pageRef" is optional for insert method
688
714
  this.pConn$.getListActions().insert({ classID: this.contextClass }, this.referenceList.length);
689
715
  }
716
+ this.pConn$.clearErrorMessages({
717
+ property: this.pConn$.getStateProps()?.referenceList?.substring(1)
718
+ });
690
719
  }
691
720
  editRecord(data, index) {
692
721
  if (data) {
@@ -732,7 +761,7 @@ export class SimpleTableManualComponent {
732
761
  this.elementsData = eleData;
733
762
  }
734
763
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SimpleTableManualComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i3.DatapageService }], target: i0.ɵɵFactoryTarget.Component }); }
735
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SimpleTableManualComponent, isStandalone: true, selector: "app-simple-table-manual", inputs: { pConn$: "pConn$", formGroup$: "formGroup$" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"bVisible$\">\n <div class=\"simple-table-wrapper\">\n <h3 *ngIf=\"label\" className=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <table *ngIf=\"readOnlyMode || allowEditingInModal\" mat-table [dataSource]=\"rowData\" class=\"mat-elevation-z8\" id=\"readonly-table\" matSort>\n <ng-container *ngFor=\"let dCol of processedFields\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n <div>{{ dCol.config.label }}</div>\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] }}</td>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <div *ngIf=\"allowEditingInModal\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <div class=\"header-icon\">\n <button mat-icon-button [matMenuTriggerFor]=\"utilityMenu\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ settingsSvgIcon$ }}\" />\n </button>\n <mat-menu #utilityMenu=\"matMenu\" overlapTrigger=\"false\">\n <button mat-menu-item (click)=\"editRecord(element, j)\">Edit</button>\n <button mat-menu-item (click)=\"deleteRecord(j)\">Delete</button>\n </mat-menu>\n </div>\n </td>\n </div>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <table *ngIf=\"editableMode && !allowEditingInModal\" mat-table [dataSource]=\"elementsData\" class=\"mat-elevation-z8\" id=\"editable-table\">\n <ng-container *ngFor=\"let dCol of fieldDefs; let i = index\">\n <ng-container *ngIf=\"dCol.name != 'DeleteIcon'\" [matColumnDef]=\"dCol.name\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\">{{ dCol.label }}</th>\n <td mat-cell *matCellDef=\"let element\">\n <component-mapper\n [name]=\"element[i].getPConnect().getComponentName()\"\n [props]=\"{\n pConn$: element[i].getPConnect(),\n formGroup$: formGroup$\n }\"\n errorMsg=\"Table wants component not yet available: {{ element[i].getPConnect().getComponentName() }}\"\n ></component-mapper>\n </td>\n </ng-container>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <button id=\"delete-button\" mat-icon-button (click)=\"deleteRecord(j)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ menuIconOverride$ }}\" />\n </button>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"editableMode && referenceList?.length === 0\">No Records Found.</div>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"readOnlyMode && rowData?.data?.length === 0\">No Records Found.</div>\n </div>\n <button *ngIf=\"showAddRowButton\" mat-button color=\"primary\" style=\"font-size: 16px\" (click)=\"addRecord()\">+ Add</button>\n</ng-container>\n\n<!-- pop overs for filters-->\n<div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n", styles: [".simple-table-wrapper{width:100%;margin-top:.5rem;margin-bottom:.5rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:normal}::ng-deep td.mat-mdc-cell{white-space:normal}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{border-right:1px solid var(--app-neutral-light-color);padding:8px!important}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:-moz-fit-content;width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:normal;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem}.psdk-icon-search{vertical-align:sub;padding:0rem .125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{display:inline-grid}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}tr.mat-mdc-row{cursor:pointer}tr.mat-mdc-header-row{background:var(--app-table-header-background-color)}.psdk-data-readonly{margin-top:.625rem;width:100%}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none;background:var(--app-form-color)}.psdk-utility-card-action-svg-icon{width:1.4rem}.label{margin:8px}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(function () { return CommonModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i4.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatTableModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i5.MatTable; }), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatHeaderCellDef; }), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatHeaderRowDef; }), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatColumnDef; }), selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatCellDef; }), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatRowDef; }), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatHeaderCell; }), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatCell; }), selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i0.forwardRef(function () { return i5.MatHeaderRow; }), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(function () { return i5.MatRow; }), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatButtonModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i6.MatButton; }), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(function () { return i6.MatIconButton; }), selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatSortModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i7.MatSort; }), selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(function () { return i7.MatSortHeader; }), selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatMenuModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i8.MatMenu; }), selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(function () { return i8.MatMenuItem; }), selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(function () { return i8.MatMenuTrigger; }), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatFormFieldModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i9.MatFormField; }), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(function () { return i9.MatLabel; }), selector: "mat-label" }, { kind: "directive", type: i0.forwardRef(function () { return i9.MatSuffix; }), selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatDatepickerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i10.MatDatepicker; }), selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i0.forwardRef(function () { return i10.MatDatepickerInput; }), selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i0.forwardRef(function () { return i10.MatDatepickerToggle; }), selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatOptionModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i11.MatOption; }), selector: "mat-option", exportAs: ["matOption"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatSelectModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i12.MatSelect; }), selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatInputModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i13.MatInput; }), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i0.forwardRef(function () { return ComponentMapperComponent; }), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
764
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SimpleTableManualComponent, isStandalone: true, selector: "app-simple-table-manual", inputs: { pConn$: "pConn$", formGroup$: "formGroup$" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"bVisible$\">\n <div class=\"simple-table-wrapper\">\n <h3 *ngIf=\"label\" className=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <table *ngIf=\"readOnlyMode || allowEditingInModal\" mat-table [dataSource]=\"rowData\" class=\"mat-elevation-z8\" id=\"readonly-table\" matSort>\n <ng-container *ngFor=\"let dCol of processedFields\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n <div>{{ dCol.config.label }}</div>\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <div *ngIf=\"allowEditingInModal\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <div class=\"header-icon\">\n <button mat-icon-button [matMenuTriggerFor]=\"utilityMenu\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ settingsSvgIcon$ }}\" />\n </button>\n <mat-menu #utilityMenu=\"matMenu\" overlapTrigger=\"false\">\n <button mat-menu-item (click)=\"editRecord(element, j)\">Edit</button>\n <button mat-menu-item (click)=\"deleteRecord(j)\">Delete</button>\n </mat-menu>\n </div>\n </td>\n </div>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <table *ngIf=\"editableMode && !allowEditingInModal\" mat-table [dataSource]=\"elementsData\" class=\"mat-elevation-z8\" id=\"editable-table\">\n <ng-container *ngFor=\"let dCol of fieldDefs; let i = index\">\n <ng-container *ngIf=\"dCol.name != 'DeleteIcon'\" [matColumnDef]=\"dCol.name\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\">{{ dCol.label }}</th>\n <td mat-cell *matCellDef=\"let element\">\n <component-mapper\n [name]=\"element[i].getPConnect().getComponentName()\"\n [props]=\"{\n pConn$: element[i].getPConnect(),\n formGroup$: formGroup$\n }\"\n errorMsg=\"Table wants component not yet available: {{ element[i].getPConnect().getComponentName() }}\"\n ></component-mapper>\n </td>\n </ng-container>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <button id=\"delete-button\" mat-icon-button (click)=\"deleteRecord(j)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ menuIconOverride$ }}\" />\n </button>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"editableMode && referenceList?.length === 0\">No Records Found.</div>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"readOnlyMode && rowData?.data?.length === 0\">No Records Found.</div>\n </div>\n <button *ngIf=\"showAddRowButton\" mat-button color=\"primary\" style=\"font-size: 16px\" (click)=\"addRecord()\">+ Add</button>\n</ng-container>\n\n<!-- pop overs for filters-->\n<div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n", styles: [".simple-table-wrapper{width:100%;margin-top:.5rem;margin-bottom:.5rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:normal}::ng-deep td.mat-mdc-cell{white-space:normal}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{border-right:1px solid var(--app-neutral-light-color);padding:8px!important}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:-moz-fit-content;width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:normal;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem}.psdk-icon-search{vertical-align:sub;padding:0rem .125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{display:inline-grid}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}tr.mat-mdc-row{cursor:pointer}tr.mat-mdc-header-row{background:var(--app-table-header-background-color)}.psdk-data-readonly{margin-top:.625rem;width:100%}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none;background:var(--app-form-color)}.psdk-utility-card-action-svg-icon{width:1.4rem}.label{margin:8px}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(function () { return CommonModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i4.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i4.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatTableModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i5.MatTable; }), selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatHeaderCellDef; }), selector: "[matHeaderCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatHeaderRowDef; }), selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatColumnDef; }), selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatCellDef; }), selector: "[matCellDef]" }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatRowDef; }), selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatHeaderCell; }), selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i0.forwardRef(function () { return i5.MatCell; }), selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i0.forwardRef(function () { return i5.MatHeaderRow; }), selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i0.forwardRef(function () { return i5.MatRow; }), selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatButtonModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i6.MatButton; }), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(function () { return i6.MatIconButton; }), selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatSortModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i7.MatSort; }), selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i0.forwardRef(function () { return i7.MatSortHeader; }), selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatMenuModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i8.MatMenu; }), selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(function () { return i8.MatMenuItem; }), selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(function () { return i8.MatMenuTrigger; }), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatFormFieldModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i9.MatFormField; }), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(function () { return i9.MatLabel; }), selector: "mat-label" }, { kind: "directive", type: i0.forwardRef(function () { return i9.MatSuffix; }), selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatDatepickerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i10.MatDatepicker; }), selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i0.forwardRef(function () { return i10.MatDatepickerInput; }), selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i0.forwardRef(function () { return i10.MatDatepickerToggle; }), selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatOptionModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i11.MatOption; }), selector: "mat-option", exportAs: ["matOption"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatSelectModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i12.MatSelect; }), selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatInputModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i13.MatInput; }), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i0.forwardRef(function () { return ComponentMapperComponent; }), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
736
765
  }
737
766
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SimpleTableManualComponent, decorators: [{
738
767
  type: Component,
@@ -748,7 +777,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
748
777
  MatSelectModule,
749
778
  MatInputModule,
750
779
  forwardRef(() => ComponentMapperComponent)
751
- ], template: "<ng-container *ngIf=\"bVisible$\">\n <div class=\"simple-table-wrapper\">\n <h3 *ngIf=\"label\" className=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <table *ngIf=\"readOnlyMode || allowEditingInModal\" mat-table [dataSource]=\"rowData\" class=\"mat-elevation-z8\" id=\"readonly-table\" matSort>\n <ng-container *ngFor=\"let dCol of processedFields\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n <div>{{ dCol.config.label }}</div>\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] }}</td>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <div *ngIf=\"allowEditingInModal\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <div class=\"header-icon\">\n <button mat-icon-button [matMenuTriggerFor]=\"utilityMenu\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ settingsSvgIcon$ }}\" />\n </button>\n <mat-menu #utilityMenu=\"matMenu\" overlapTrigger=\"false\">\n <button mat-menu-item (click)=\"editRecord(element, j)\">Edit</button>\n <button mat-menu-item (click)=\"deleteRecord(j)\">Delete</button>\n </mat-menu>\n </div>\n </td>\n </div>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <table *ngIf=\"editableMode && !allowEditingInModal\" mat-table [dataSource]=\"elementsData\" class=\"mat-elevation-z8\" id=\"editable-table\">\n <ng-container *ngFor=\"let dCol of fieldDefs; let i = index\">\n <ng-container *ngIf=\"dCol.name != 'DeleteIcon'\" [matColumnDef]=\"dCol.name\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\">{{ dCol.label }}</th>\n <td mat-cell *matCellDef=\"let element\">\n <component-mapper\n [name]=\"element[i].getPConnect().getComponentName()\"\n [props]=\"{\n pConn$: element[i].getPConnect(),\n formGroup$: formGroup$\n }\"\n errorMsg=\"Table wants component not yet available: {{ element[i].getPConnect().getComponentName() }}\"\n ></component-mapper>\n </td>\n </ng-container>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <button id=\"delete-button\" mat-icon-button (click)=\"deleteRecord(j)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ menuIconOverride$ }}\" />\n </button>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"editableMode && referenceList?.length === 0\">No Records Found.</div>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"readOnlyMode && rowData?.data?.length === 0\">No Records Found.</div>\n </div>\n <button *ngIf=\"showAddRowButton\" mat-button color=\"primary\" style=\"font-size: 16px\" (click)=\"addRecord()\">+ Add</button>\n</ng-container>\n\n<!-- pop overs for filters-->\n<div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n", styles: [".simple-table-wrapper{width:100%;margin-top:.5rem;margin-bottom:.5rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:normal}::ng-deep td.mat-mdc-cell{white-space:normal}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{border-right:1px solid var(--app-neutral-light-color);padding:8px!important}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:-moz-fit-content;width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:normal;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem}.psdk-icon-search{vertical-align:sub;padding:0rem .125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{display:inline-grid}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}tr.mat-mdc-row{cursor:pointer}tr.mat-mdc-header-row{background:var(--app-table-header-background-color)}.psdk-data-readonly{margin-top:.625rem;width:100%}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none;background:var(--app-form-color)}.psdk-utility-card-action-svg-icon{width:1.4rem}.label{margin:8px}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}\n"] }]
780
+ ], template: "<ng-container *ngIf=\"bVisible$\">\n <div class=\"simple-table-wrapper\">\n <h3 *ngIf=\"label\" className=\"label\" style=\"font-weight: bold\">\n {{ label }} <span class=\"results-count\">{{ getResultsText() }}</span>\n </h3>\n <table *ngIf=\"readOnlyMode || allowEditingInModal\" mat-table [dataSource]=\"rowData\" class=\"mat-elevation-z8\" id=\"readonly-table\" matSort>\n <ng-container *ngFor=\"let dCol of processedFields\" [matColumnDef]=\"dCol.config.name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header (click)=\"_headerSortClick($event, dCol)\" arrowPosition=\"before\">\n <div>{{ dCol.config.label }}</div>\n <div class=\"psdk-mat-header-filter\">\n <img class=\"psdk-filter-svg-icon\" name=\"filterOnIcon\" />\n </div>\n <div (click)=\"$event.stopPropagation()\">\n <button mat-icon-button [matMenuTriggerFor]=\"groupMenu\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ menuSvgIcon$ }}\" />\n </button>\n <mat-menu #groupMenu>\n <button mat-menu-item (click)=\"_groupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Group By</span>\n </button>\n <button *ngIf=\"_showUnGroupBy(dCol) && bGrouping$\" mat-menu-item (click)=\"_unGroupBy($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ groupBySvgIcon$ }}\" /><span>Ungroup</span>\n </button>\n <button mat-menu-item (click)=\"_filter($event, dCol)\">\n <img class=\"psdk-list-view-svg-icon\" src=\"{{ filterSvgIcon$ }}\" /><span>Filter</span>\n </button>\n </mat-menu>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let element\">{{ element[dCol.config.name] || '---' }}</td>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <div *ngIf=\"allowEditingInModal\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <div class=\"header-icon\">\n <button mat-icon-button [matMenuTriggerFor]=\"utilityMenu\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ settingsSvgIcon$ }}\" />\n </button>\n <mat-menu #utilityMenu=\"matMenu\" overlapTrigger=\"false\">\n <button mat-menu-item (click)=\"editRecord(element, j)\">Edit</button>\n <button mat-menu-item (click)=\"deleteRecord(j)\">Delete</button>\n </mat-menu>\n </div>\n </td>\n </div>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <table *ngIf=\"editableMode && !allowEditingInModal\" mat-table [dataSource]=\"elementsData\" class=\"mat-elevation-z8\" id=\"editable-table\">\n <ng-container *ngFor=\"let dCol of fieldDefs; let i = index\">\n <ng-container *ngIf=\"dCol.name != 'DeleteIcon'\" [matColumnDef]=\"dCol.name\">\n <th mat-header-cell *matHeaderCellDef class=\"psdk-mat-header\">{{ dCol.label }}</th>\n <td mat-cell *matCellDef=\"let element\">\n <component-mapper\n [name]=\"element[i].getPConnect().getComponentName()\"\n [props]=\"{\n pConn$: element[i].getPConnect(),\n formGroup$: formGroup$\n }\"\n errorMsg=\"Table wants component not yet available: {{ element[i].getPConnect().getComponentName() }}\"\n ></component-mapper>\n </td>\n </ng-container>\n </ng-container>\n <ng-container matColumnDef=\"DeleteIcon\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element; index as j\">\n <button id=\"delete-button\" mat-icon-button (click)=\"deleteRecord(j)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ menuIconOverride$ }}\" />\n </button>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"editableMode && referenceList?.length === 0\">No Records Found.</div>\n <div class=\"psdk-no-records\" id=\"no-records\" *ngIf=\"readOnlyMode && rowData?.data?.length === 0\">No Records Found.</div>\n </div>\n <button *ngIf=\"showAddRowButton\" mat-button color=\"primary\" style=\"font-size: 16px\" (click)=\"addRecord()\">+ Add</button>\n</ng-container>\n\n<!-- pop overs for filters-->\n<div *ngIf=\"bShowFilterPopover$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h4>\n Filter:<b> {{ filterContainsLabel$ }}</b>\n </h4>\n <div *ngIf=\"bContains$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"contains\">Contains</mat-option>\n <mat-option value=\"equals\">Equals</mat-option>\n <mat-option value=\"startswith\">Starts with</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"psdk-full-width\">\n <input matInput type=\"text\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsValue($event)\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"bDateTime$\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-select [value]=\"filterContainsType$\" (selectionChange)=\"_filterContainsType($event)\">\n <mat-option value=\"notequal\">is not equal to</mat-option>\n <mat-option value=\"after\">after</mat-option>\n <mat-option value=\"before\">before</mat-option>\n <mat-option value=\"null\">is null</mat-option>\n <mat-option value=\"notnull\">is not null</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDate$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date</mat-label>\n <input\n matInput\n #dateInput\n [matDatepicker]=\"pegadate\"\n type=\"text\"\n [value]=\"filterContainsValue$\"\n (dateChange)=\"_filterContainsDateValue($event, dateInput.value)\"\n />\n <mat-datepicker-toggle matSuffix [for]=\"pegadate\"></mat-datepicker-toggle>\n <mat-datepicker #pegadate [startAt]=\"filterContainsValue$\"></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsDateTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Date time</mat-label>\n <input matInput type=\"datetime-local\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsDateTimeValue($event)\" />\n </mat-form-field>\n\n <mat-form-field *ngIf=\"bIsTime$ && filterContainsType$ !== 'null' && filterContainsType$ != 'notnull'\" class=\"psdk-full-width\">\n <mat-label>Time</mat-label>\n <input matInput type=\"time\" [value]=\"filterContainsValue$\" (change)=\"_filterContainsTimeValue($event)\" />\n </mat-form-field>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFilterMainButtons$, arSecondaryButtons$: arFilterSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: _onFilterActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n", styles: [".simple-table-wrapper{width:100%;margin-top:.5rem;margin-bottom:.5rem}table{width:100%}::ng-deep .mat-sort-header-content{white-space:normal}::ng-deep td.mat-mdc-cell{white-space:normal}::ng-deep th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{border-right:1px solid var(--app-neutral-light-color);padding:8px!important}::ng-deep .mat-mdc-button{padding:0;text-align:left}.mat-mdc-icon-button{width:-moz-fit-content;width:fit-content}.mat-mdc-row .mat-mdc-cell{text-align:left}.psdk-mat-header{white-space:normal;padding-right:5px}.psdk-mat-header-button{display:inline-grid}.psdk-mat-header-arrow,.psdk-mat-header-filter{display:inline-grid;vertical-align:middle}.psdk-full-width{width:100%}.psdk-search{padding-left:.625rem}.psdk-icon-search{vertical-align:sub;padding:0rem .125rem;min-width:unset;width:1.1rem}.psdk-outer-div-in-form{display:inline-grid}.psdk-inner-div-in-form{height:auto;position:relative;width:100%;overflow:auto;max-height:550px;min-height:auto}.psdk-list-view-svg-icon{width:1.4rem;display:inline-block;vertical-align:middle;filter:var(--app-primary-color-filter)}.psdk-filter-svg-icon,.psdk-arrow-svg-icon{width:1rem;display:inline-block;vertical-align:middle;filter:var(--app-neutral-color-filter)}.psdk-filter-popover{display:table;margin:auto;min-width:100px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color);position:absolute;z-index:99}.psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top{display:table;margin:auto;min-width:150px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}tr.mat-mdc-row{cursor:pointer}tr.mat-mdc-header-row{background:var(--app-table-header-background-color)}.psdk-data-readonly{margin-top:.625rem;width:100%}.psdk-no-records{height:56px;justify-content:center;display:flex;align-items:center;border:1px solid var(--app-neutral-light-color);border-top:none;background:var(--app-form-color)}.psdk-utility-card-action-svg-icon{width:1.4rem}.label{margin:8px}.results-count{opacity:.7;font-size:.8rem;font-weight:700;margin-inline-start:.625rem}\n"] }]
752
781
  }], ctorParameters: function () { return [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i3.DatapageService }]; }, propDecorators: { sort: [{
753
782
  type: ViewChild,
754
783
  args: [MatSort]
@@ -757,4 +786,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
757
786
  }], formGroup$: [{
758
787
  type: Input
759
788
  }] } });
760
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXRhYmxlLW1hbnVhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvdGVtcGxhdGUvc2ltcGxlLXRhYmxlLW1hbnVhbC9zaW1wbGUtdGFibGUtbWFudWFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9zaW1wbGUtdGFibGUtbWFudWFsL3NpbXBsZS10YWJsZS1tYW51YWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseUNBQXlDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxF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QUFNLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQztJQUM5QixDQUFDOytHQXQyQlUsMEJBQTBCO21HQUExQiwwQkFBMEIsaUxBQzFCLE9BQU8sZ0RDL0VwQiwwblBBbUpBLG0rRURsRkksWUFBWSxvWEFDWixjQUFjLDY3Q0FDZCxlQUFlLDZoQkFDZixhQUFhLHNrQkFDYixhQUFhLDJpQkFDYixrQkFBa0IsdWtCQUNsQixtQkFBbUIsZ3FCQUNuQixlQUFlLHlNQUNmLGVBQWUsMFNBQ2YsY0FBYywwYkFDRyx3QkFBd0I7OzRGQUdoQywwQkFBMEI7a0JBbkJ0QyxTQUFTOytCQUNFLHlCQUF5QixjQUd2QixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixjQUFjO3dCQUNkLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixhQUFhO3dCQUNiLGtCQUFrQjt3QkFDbEIsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7cUJBQzNDOytKQUdtQixJQUFJO3NCQUF2QixTQUFTO3VCQUFDLE9BQU87Z0JBRVQsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIGZvcndhcmRSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbCc7XG5cbmltcG9ydCB7IENvbXBvbmVudE1hcHBlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL19icmlkZ2UvY29tcG9uZW50LW1hcHBlci9jb21wb25lbnQtbWFwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbmd1bGFyUENvbm5lY3REYXRhLCBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9hbmd1bGFyLXBjb25uZWN0JztcbmltcG9ydCB7IERhdGFwYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19zZXJ2aWNlcy9kYXRhcGFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IGdldFJlZmVyZW5jZUxpc3QgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy9maWVsZC1ncm91cC11dGlscyc7XG5pbXBvcnQgeyBidWlsZEZpZWxkc0ZvclRhYmxlLCBmaWx0ZXJEYXRhQnlDb21tb25GaWVsZHMsIGZpbHRlckRhdGFCeURhdGUsIGdldENvbnRleHQgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy91dGlscyc7XG5pbXBvcnQgeyBnZXRTZWNvbmRzIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvY29tbW9uJztcblxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IGFueTtcblxuaW50ZXJmYWNlIFNpbXBsZVRhYmxlTWFudWFsUHJvcHMge1xuICAvLyBJZiBhbnksIGVudGVyIGFkZGl0aW9uYWwgcHJvcHMgdGhhdCBvbmx5IGV4aXN0IG9uIHRoaXMgY29tcG9uZW50XG4gIHZpc2liaWxpdHk/OiBib29sZWFuO1xuICBncm91cGluZz86IGFueTtcbiAgcmVmZXJlbmNlTGlzdD86IGFueVtdO1xuICBjaGlsZHJlbj86IGFueVtdO1xuICByZW5kZXJNb2RlPzogc3RyaW5nO1xuICBwcmVzZXRzPzogYW55W107XG4gIGxhYmVsPzogc3RyaW5nO1xuICBzaG93TGFiZWw/OiBib29sZWFuO1xuICBkYXRhUGFnZU5hbWU/OiBzdHJpbmc7XG4gIGNvbnRleHRDbGFzcz86IHN0cmluZztcbiAgcHJvcGVydHlMYWJlbD86IHN0cmluZztcbiAgZmllbGRNZXRhZGF0YT86IGFueTtcbiAgYWxsb3dUYWJsZUVkaXQ/OiBib29sZWFuO1xuICBlZGl0TW9kZT86IHN0cmluZztcbiAgYWRkQW5kRWRpdFJvd3NXaXRoaW4/OiBhbnk7XG4gIHZpZXdGb3JBZGRBbmRFZGl0TW9kYWw/OiBhbnk7XG4gIGVkaXRNb2RlQ29uZmlnPzogYW55O1xuICBkaXNwbGF5TW9kZT86IHN0cmluZztcbiAgdXNlU2VwYXJhdGVWaWV3Rm9yRWRpdDogYW55O1xuICB2aWV3Rm9yRWRpdE1vZGFsOiBhbnk7XG59XG5cbmNsYXNzIEdyb3VwIHtcbiAgbGV2ZWwgPSAwO1xuICBwYXJlbnQ6IEdyb3VwO1xuICBleHBhbmRlZCA9IHRydWU7XG4gIHRvdGFsQ291bnRzID0gMDtcbiAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnBhcmVudCB8fCAodGhpcy5wYXJlbnQudmlzaWJsZSAmJiB0aGlzLnBhcmVudC5leHBhbmRlZCk7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNpbXBsZS10YWJsZS1tYW51YWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2ltcGxlLXRhYmxlLW1hbnVhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NpbXBsZS10YWJsZS1tYW51YWwuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRUYWJsZU1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0U29ydE1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICAgIE1hdE9wdGlvbk1vZHVsZSxcbiAgICBNYXRTZWxlY3RNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgZm9yd2FyZFJlZigoKSA9PiBDb21wb25lbnRNYXBwZXJDb21wb25lbnQpXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU2ltcGxlVGFibGVNYW51YWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydDogTWF0U29ydDtcblxuICBASW5wdXQoKSBwQ29ubiQ6IHR5cGVvZiBQQ29ubmVjdDtcbiAgQElucHV0KCkgZm9ybUdyb3VwJDogRm9ybUdyb3VwO1xuXG4gIC8vIFVzZWQgd2l0aCBBbmd1bGFyUENvbm5lY3RcbiAgYW5ndWxhclBDb25uZWN0RGF0YTogQW5ndWxhclBDb25uZWN0RGF0YSA9IHt9O1xuICBjb25maWdQcm9wcyQ6IFNpbXBsZVRhYmxlTWFudWFsUHJvcHM7XG4gIGZpZWxkcyQ6IGFueVtdO1xuXG4gIGJWaXNpYmxlJCA9IHRydWU7XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gIHJvd0RhdGE6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xuICBvcmlnaW5hbERhdGE6IGFueVtdID0gW107XG4gIHByb2Nlc3NlZEZpZWxkczogYW55W10gPSBbXTtcbiAgZmllbGREZWZzOiBhbnlbXSA9IFtdO1xuICByZXF1ZXN0ZWRSZWFkT25seU1vZGUgPSBmYWxzZTtcbiAgcmVhZE9ubHlNb2RlID0gZmFsc2U7XG4gIGVkaXRhYmxlTW9kZTogYm9vbGVhbjtcbiAgbWVudUljb25PdmVycmlkZSQ6IHN0cmluZztcbiAgcGFnZVJlZmVyZW5jZTogc3RyaW5nO1xuICByZWZlcmVuY2VMaXN0OiBhbnk7XG4gIGNvbnRleHRDbGFzczogYW55O1xuICBzaG93QWRkUm93QnV0dG9uOiBib29sZWFuO1xuICBwcmV2UmVmZXJlbmNlTGlzdDogYW55W10gPSBbXTtcbiAgZWxlbWVudHNEYXRhOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcbiAgcmF3RmllbGRzOiBhbnk7XG4gIGxhYmVsPzogc3RyaW5nID0gJyc7XG4gIHNlYXJjaEljb24kOiBzdHJpbmc7XG5cbiAgYlNob3dTZWFyY2gkID0gZmFsc2U7XG4gIGJDb2x1bW5SZW9yZGVyJCA9IGZhbHNlO1xuICBiR3JvdXBpbmckID0gZmFsc2U7XG5cbiAgcGVyZkZpbHRlcjogc3RyaW5nO1xuICBzZWFyY2hGaWx0ZXI6IHN0cmluZztcblxuICBtZW51U3ZnSWNvbiQ6IHN0cmluZztcbiAgYXJyb3dTdmdJY29uJCA9ICcnO1xuICBhcnJvd0Rvd25TdmdJY29uJDogc3RyaW5nO1xuICBhcnJvd1VwU3ZnSWNvbiQ6IHN0cmluZztcblxuICBmaWx0ZXJTdmdJY29uJDogc3RyaW5nO1xuICBmaWx0ZXJPblN2Z0ljb24kOiBzdHJpbmc7XG4gIGdyb3VwQnlTdmdJY29uJDogc3RyaW5nO1xuXG4gIGdyb3VwQnlDb2x1bW5zJDogc3RyaW5nW10gPSBbXTtcbiAgY29tcGFyZVR5cGU6IHN0cmluZztcbiAgY29tcGFyZVJlZjogc3RyaW5nO1xuICBhcnJvd0RpcmVjdGlvbiA9ICdkb3duJztcbiAgZmlsdGVyQnlDb2x1bW5zOiBhbnlbXSA9IFtdO1xuICBjdXJyZW50RmlsdGVyUmVmRGF0YTogYW55O1xuICBmaWx0ZXJDb250YWluc0xhYmVsJCA9ICcnO1xuICBmaWx0ZXJDb250YWluc1R5cGUkID0gJ2NvbnRhaW5zJztcbiAgZmlsdGVyQ29udGFpbnNWYWx1ZSQ6IGFueTtcbiAgYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuICBiQ29udGFpbnMkID0gdHJ1ZTtcbiAgYkRhdGVUaW1lJCA9IGZhbHNlO1xuXG4gIGJJc0RhdGUkID0gZmFsc2U7XG4gIGJJc0RhdGVUaW1lJCA9IGZhbHNlO1xuICBiSXNUaW1lJCA9IGZhbHNlO1xuICBjdXJyZW50RmlsdGVySW1hZ2VFbDogYW55O1xuXG4gIGFyRmlsdGVyTWFpbkJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuICBhckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuICBzZWxlY3Rpb25Nb2RlOiBzdHJpbmc7XG4gIHNpbmdsZVNlbGVjdGlvbk1vZGU6IGJvb2xlYW47XG4gIG11bHRpU2VsZWN0aW9uTW9kZTogYm9vbGVhbjtcbiAgcm93SUQ6IGFueTtcbiAgcmVzcG9uc2U6IGFueTtcbiAgY29tcG9zaXRlS2V5czogYW55O1xuICBwYXJhbWV0ZXJzOiBhbnk7XG4gIGFsbG93RWRpdGluZ0luTW9kYWwgPSBmYWxzZTtcbiAgZGVmYXVsdFZpZXc6IGFueTtcbiAgcmVmZXJlbmNlTGlzdFN0cjogYW55O1xuICBiVXNlU2VwYXJhdGVWaWV3Rm9yRWRpdDogYW55O1xuICBlZGl0VmlldzogYW55O1xuICBzZXR0aW5nc1N2Z0ljb24kOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbmd1bGFyUENvbm5lY3Q6IEFuZ3VsYXJQQ29ubmVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsczogVXRpbHMsXG4gICAgcHJpdmF0ZSBkYXRhUGFnZVNlcnZpY2U6IERhdGFwYWdlU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gRmlyc3QgdGhpbmcgaW4gaW5pdGlhbGl6YXRpb24gaXMgcmVnaXN0ZXJpbmcgYW5kIHN1YnNjcmliaW5nIHRvIHRoZSBBbmd1bGFyUENvbm5lY3Qgc2VydmljZVxuICAgIHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YSA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnJlZ2lzdGVyQW5kU3Vic2NyaWJlQ29tcG9uZW50KHRoaXMsIHRoaXMub25TdGF0ZUNoYW5nZSk7XG4gICAgdGhpcy5jb25maWdQcm9wcyQgPSB0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpIGFzIFNpbXBsZVRhYmxlTWFudWFsUHJvcHM7XG4gICAgLy8gVGhlbiwgY29udGludWUgb24gd2l0aCBvdGhlciBpbml0aWFsaXphdGlvblxuICAgIHRoaXMubWVudUljb25PdmVycmlkZSQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCd0cmFzaCcsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgICAvLyBjYWxsIGNoZWNrQW5kVXBkYXRlIHdoZW4gaW5pdGlhbGl6aW5nXG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICAgIHRoaXMuZmlsdGVyU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdmaWx0ZXInLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5maWx0ZXJPblN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnZmlsdGVyLW9uJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuZ3JvdXBCeVN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygncm93JywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuYkdyb3VwaW5nJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKHRoaXMuY29uZmlnUHJvcHMkLmdyb3VwaW5nKTtcbiAgICB0aGlzLm1lbnVTdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ21vcmUnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG5cbiAgICB0aGlzLmFyRmlsdGVyTWFpbkJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ3N1Ym1pdCcsIGpzQWN0aW9uOiAnc3VibWl0JywgbmFtZTogJ1N1Ym1pdCcgfSk7XG4gICAgdGhpcy5hckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ2NhbmNlbCcsIGpzQWN0aW9uOiAnY2FuY2VsJywgbmFtZTogJ0NhbmNlbCcgfSk7XG5cbiAgICB0aGlzLnNlYXJjaEljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnc2VhcmNoJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuXG4gICAgdGhpcy5zZXR0aW5nc1N2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnbW9yZScsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0FuZFVwZGF0ZSgpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGNoZWNrIHRoZSBicmlkZ2UgdG8gc2VlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkXG4gICAgLy8gdXBkYXRlIGl0c2VsZiAocmUtcmVuZGVyKVxuICAgIGNvbnN0IGJVcGRhdGVTZWxmID0gdGhpcy5hbmd1bGFyUENvbm5lY3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKHRoaXMpO1xuXG4gICAgLy8gT05MWSBjYWxsIHVwZGF0ZVNlbGYgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGVcbiAgICBpZiAoYlVwZGF0ZVNlbGYpIHtcbiAgICAgIHRoaXMudXBkYXRlU2VsZigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHVwZGF0ZVNlbGZcbiAgdXBkYXRlU2VsZigpOiB2b2lkIHtcbiAgICAvLyBtb3ZlZCB0aGlzIGZyb20gbmdPbkluaXQoKSBhbmQgY2FsbCB0aGlzIGZyb20gdGhlcmUgaW5zdGVhZC4uLlxuICAgIHRoaXMuY29uZmlnUHJvcHMkID0gdGhpcy5wQ29ubiQucmVzb2x2ZUNvbmZpZ1Byb3BzKHRoaXMucENvbm4kLmdldENvbmZpZ1Byb3BzKCkpIGFzIFNpbXBsZVRhYmxlTWFudWFsUHJvcHM7XG5cbiAgICBpZiAodGhpcy5jb25maWdQcm9wcyQudmlzaWJpbGl0eSAhPSBudWxsKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbXVsdGktYXNzaWduXG4gICAgICB0aGlzLmJWaXNpYmxlJCA9IHRoaXMuYlZpc2libGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQudmlzaWJpbGl0eSk7XG4gICAgfVxuXG4gICAgLy8gTk9URTogZ2V0Q29uZmlnUHJvcHMoKSBoYXMgZWFjaCBjaGlsZC5jb25maWcgd2l0aCBkYXRhc291cmNlIGFuZCB2YWx1ZSB1bmRlZmluZWRcbiAgICAvLyAgYnV0IGdldFJhd01ldGFkYXRhKCkgaGFzIGVhY2ggY2hpbGQuY29uZmlnIHdpdGggZGF0YXNvdXJjZSBhbmQgdmFsdWUgc2hvd2luZyB0aGVpciB1bnJlc29sdmVkIHZhbHVlcyAoZXg6IFwiQFAgdGhlUHJvcE5hbWVcIilcbiAgICAvLyAgV2UgbmVlZCB0byB1c2UgdGhlIHByb3AgbmFtZSBhcyB0aGUgXCJnbHVlXCIgdG8gdGllIHRoZSBBbmd1bGFyIE1hdGVyaWFsIHRhYmxlIGRhdGFTb3VyY2UsIGRpc3BsYXlDb2x1bW5zIGFuZCBkYXRhIHRvZ2V0aGVyLlxuICAgIC8vICBTbywgaW4gdGhlIGNvZGUgYmVsb3csIHdlJ2xsIHVzZSB0aGUgdW5yZXNvbHZlZCBjb25maWcudmFsdWUgKGJ1dCByZXBsYWNpbmcgdGhlIHNwYWNlIHdpdGggYW4gdW5kZXJzY29yZSB0byBrZWVwIHRoaW5ncyBoYXBweSlcbiAgICBjb25zdCByYXdNZXRhZGF0YTogYW55ID0gdGhpcy5wQ29ubiQuZ2V0UmF3TWV0YWRhdGEoKTtcblxuICAgIC8vIEFkYXB0ZWQgZnJvbSBOZWJ1bGFcbiAgICBjb25zdCB7XG4gICAgICByZWZlcmVuY2VMaXN0ID0gW10sIC8vIGlmIHJlZmVyZW5jZUxpc3Qgbm90IGluIGNvbmZpZ1Byb3BzJCwgZGVmYXVsdCB0byBlbXB5IGxpc3RcbiAgICAgIHJlbmRlck1vZGUsXG4gICAgICBjaGlsZHJlbiwgLy8gZGVzdHJ1Y3R1cmUgY2hpbGRyZW4gaW50byBhbiBhcnJheSB2YXI6IFwicmVzb2x2ZWRGaWVsZHNcIlxuICAgICAgcHJlc2V0cyxcbiAgICAgIGFsbG93VGFibGVFZGl0LFxuICAgICAgbGFiZWw6IGxhYmVsUHJvcCxcbiAgICAgIHByb3BlcnR5TGFiZWwsXG4gICAgICBmaWVsZE1ldGFkYXRhLFxuICAgICAgZWRpdE1vZGUsXG4gICAgICBhZGRBbmRFZGl0Um93c1dpdGhpbixcbiAgICAgIHZpZXdGb3JBZGRBbmRFZGl0TW9kYWwsXG4gICAgICBlZGl0TW9kZUNvbmZpZyxcbiAgICAgIGRpc3BsYXlNb2RlLFxuICAgICAgdXNlU2VwYXJhdGVWaWV3Rm9yRWRpdCxcbiAgICAgIHZpZXdGb3JFZGl0TW9kYWxcbiAgICB9ID0gdGhpcy5jb25maWdQcm9wcyQ7XG5cbiAgICB0aGlzLnJlZmVyZW5jZUxpc3RTdHIgPSBnZXRDb250ZXh0KHRoaXMucENvbm4kKS5yZWZlcmVuY2VMaXN0U3RyO1xuICAgIHRoaXMubGFiZWwgPSBsYWJlbFByb3AgfHwgcHJvcGVydHlMYWJlbDtcbiAgICB0aGlzLnBhcmFtZXRlcnMgPSBmaWVsZE1ldGFkYXRhPy5kYXRhc291cmNlPy5wYXJhbWV0ZXJzO1xuXG4gICAgY29uc3QgaGlkZUFkZFJvdyA9IGFsbG93VGFibGVFZGl0ID09PSBmYWxzZTtcbiAgICBjb25zdCBoaWRlRGVsZXRlUm93ID0gYWxsb3dUYWJsZUVkaXQgPT09IGZhbHNlO1xuICAgIGxldCB7IGNvbnRleHRDbGFzcyB9ID0gdGhpcy5jb25maWdQcm9wcyQ7XG4gICAgdGhpcy5yZWZlcmVuY2VMaXN0ID0gcmVmZXJlbmNlTGlzdDtcbiAgICBpZiAoIWNvbnRleHRDbGFzcykge1xuICAgICAgLy8gQHRzLWlnbm9yZSAtIFByb3BlcnR5ICdnZXRDb21wb25lbnRDb25maWcnIGlzIHByaXZhdGUgYW5kIG9ubHkgYWNjZXNzaWJsZSB3aXRoaW4gY2xhc3MgJ0MxMW5FbnYnXG4gICAgICBsZXQgbGlzdE5hbWUgPSB0aGlzLnBDb25uJC5nZXRDb21wb25lbnRDb25maWcoKS5yZWZlcmVuY2VMaXN0O1xuICAgICAgbGlzdE5hbWUgPSBQQ29yZS5nZXRBbm5vdGF0aW9uVXRpbHMoKS5nZXRQcm9wZXJ0eU5hbWUobGlzdE5hbWUpO1xuICAgICAgLy8gQHRzLWlnbm9yZSAtIFByb3BlcnR5ICdnZXRGaWVsZE1ldGFkYXRhJyBpcyBwcml2YXRlIGFuZCBvbmx5IGFjY2Vzc2libGUgd2l0aGluIGNsYXNzICdDMTFuRW52J1xuICAgICAgY29udGV4dENsYXNzID0gdGhpcy5wQ29ubiQuZ2V0RmllbGRNZXRhZGF0YShsaXN0TmFtZSk/LnBhZ2VDbGFzcztcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0Q2xhc3MgPSBjb250ZXh0Q2xhc3M7XG5cbiAgICBjb25zdCByZXNvbHZlZEZpZWxkcyA9IGNoaWxkcmVuPy5bMF0/LmNoaWxkcmVuIHx8IHByZXNldHM/LlswXS5jaGlsZHJlbj8uWzBdLmNoaWxkcmVuO1xuICAgIC8vIGdldCByYXcgY29uZmlnIGFzIEBQIGFuZCBvdGhlciBhbm5vdGF0aW9ucyBhcmUgcHJvY2Vzc2VkIGFuZCBkb24ndCBhcHBlYXIgaW4gdGhlIHJlc29sdmVkIGNvbmZpZy5cbiAgICAvLyAgRGVzdHJ1Y3R1cmUgXCJyYXdcIiBjaGlsZHJlbiBpbnRvIGFycmF5IHZhcjogXCJyYXdGaWVsZHNcIlxuICAgIC8vICBOT1RFOiB3aGVuIGNvbmZpZy5saXN0VHlwZSA9PSBcImFzc29jaWF0ZWRcIiwgdGhlIHByb3BlcnR5IGNhbiBiZSBmb3VuZCBpbiBlaXRoZXJcbiAgICAvLyAgICBjb25maWcudmFsdWUgKGV4OiBcIkBQIC5EZWNsYXJhbnRDaG9pY2VcIikgb3JcbiAgICAvLyAgICBjb25maWcuZGF0YXNvdXJjZSAoZXg6IFwiQEFTU09DSUFURUQgLkRlY2xhcmFudENob2ljZVwiKVxuICAgIC8vICBOZWl0aGVyIG9mIHRoZXNlIGFwcGVhciBpbiB0aGUgcmVzb2x2ZWQgKHRoaXMuY29uZmlnUHJvcHMkKVxuICAgIGNvbnN0IHJhd0NvbmZpZyA9IHJhd01ldGFkYXRhPy5jb25maWc7XG4gICAgY29uc3QgcmF3RmllbGRzID0gcmF3Q29uZmlnPy5jaGlsZHJlbj8uWzBdPy5jaGlsZHJlbiB8fCByYXdDb25maWc/LnByZXNldHM/LlswXS5jaGlsZHJlbj8uWzBdPy5jaGlsZHJlbjtcbiAgICB0aGlzLnJhd0ZpZWxkcyA9IHJhd0ZpZWxkcztcbiAgICAvLyBBdCB0aGlzIHBvaW50LCBmaWVsZHMgaGFzIHJlc29sdmVkRmllbGRzIGFuZCByYXdGaWVsZHMgd2UgY2FuIHVzZVxuXG4gICAgLy8gc3RhcnQgb2YgZnJvbSBOZWJ1bGFcbiAgICAvLyBnZXQgY29udGV4dCBuYW1lIGFuZCByZWZlcmVuY2VMaXN0IHdoaWNoIHdpbGwgYmUgdXNlZCB0byBwcmVwYXJlIGNvbmZpZyBvZiBQQ29ubmVjdFxuICAgIC8vIGNvbnN0IHsgY29udGV4dE5hbWUsIHJlZmVyZW5jZUxpc3RTdHIsIHBhZ2VSZWZlcmVuY2VGb3JSb3dzIH0gPSBnZXRDb250ZXh0KHRoaXMucENvbm4kKTtcblxuICAgIGNvbnN0IHJlc29sdmVkTGlzdCA9IGdldFJlZmVyZW5jZUxpc3QodGhpcy5wQ29ubiQpO1xuICAgIHRoaXMucGFnZVJlZmVyZW5jZSA9IGAke3RoaXMucENvbm4kLmdldFBhZ2VSZWZlcmVuY2UoKX0ke3Jlc29sdmVkTGlzdH1gO1xuICAgIHRoaXMucENvbm4kLnNldFJlZmVyZW5jZUxpc3QocmVzb2x2ZWRMaXN0KTtcblxuICAgIC8vIFRoaXMgZ2l2ZXMgdXAgdGhlIFwicHJvcGVydGllc1wiIHdlIG5lZWQgdG8gbWFwIHRvIHJvdy9jb2x1bW4gdmFsdWVzIGxhdGVyXG4gICAgLy8gY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHBvcHVsYXRlUm93S2V5KHJlZmVyZW5jZUxpc3QpO1xuXG4gICAgdGhpcy5yZXF1ZXN0ZWRSZWFkT25seU1vZGUgPSByZW5kZXJNb2RlID09PSAnUmVhZE9ubHknO1xuICAgIHRoaXMucmVhZE9ubHlNb2RlID0gcmVuZGVyTW9kZSA9PT0gJ1JlYWRPbmx5JztcbiAgICB0aGlzLmVkaXRhYmxlTW9kZSA9IHJlbmRlck1vZGUgPT09ICdFZGl0YWJsZSc7XG4gICAgY29uc3QgaXNEaXNwbGF5TW9kZUVuYWJsZWQgPSBkaXNwbGF5TW9kZSA9PT0gJ0RJU1BMQVlfT05MWSc7XG4gICAgdGhpcy5zaG93QWRkUm93QnV0dG9uID0gIXRoaXMucmVhZE9ubHlNb2RlICYmICFoaWRlQWRkUm93O1xuICAgIHRoaXMuYWxsb3dFZGl0aW5nSW5Nb2RhbCA9XG4gICAgICAoZWRpdE1vZGUgPyBlZGl0TW9kZSA9PT0gJ21vZGFsJyA6IGFkZEFuZEVkaXRSb3dzV2l0aGluID09PSAnbW9kYWwnKSAmJiAhKHJlbmRlck1vZGUgPT09ICdSZWFkT25seScgfHwgaXNEaXNwbGF5TW9kZUVuYWJsZWQpO1xuICAgIGNvbnN0IHNob3dEZWxldGVCdXR0b24gPSB0aGlzLmVkaXRhYmxlTW9kZSAmJiAhaGlkZURlbGV0ZVJvdztcbiAgICB0aGlzLmRlZmF1bHRWaWV3ID0gZWRpdE1vZGVDb25maWcgPyBlZGl0TW9kZUNvbmZpZy5kZWZhdWx0VmlldyA6IHZpZXdGb3JBZGRBbmRFZGl0TW9kYWw7XG4gICAgdGhpcy5iVXNlU2VwYXJhdGVWaWV3Rm9yRWRpdCA9IGVkaXRNb2RlQ29uZmlnID8gZWRpdE1vZGVDb25maWcudXNlU2VwYXJhdGVWaWV3Rm9yRWRpdCA6IHVzZVNlcGFyYXRlVmlld0ZvckVkaXQ7XG4gICAgdGhpcy5lZGl0VmlldyA9IGVkaXRNb2RlQ29uZmlnID8gZWRpdE1vZGVDb25maWcuZWRpdFZpZXcgOiB2aWV3Rm9yRWRpdE1vZGFsO1xuICAgIC8vIGNvbnN0IHNob3dEZWxldGVCdXR0b24gPSAhdGhpcy5yZWFkT25seU1vZGUgJiYgIWhpZGVEZWxldGVSb3c7XG5cbiAgICAvLyBOZWJ1bGEgaGFzIG90aGVyIGhhbmRsaW5nIGZvciBpc1JlYWRPbmx5TW9kZSBidXQgaGFzIENvc21vcy1zcGVjaWZpYyBjb2RlXG4gICAgLy8gIHNvIGlnbm9yaW5nIHRoYXQgZm9yIG5vdy4uLlxuICAgIC8vIGZpZWxkRGVmcyB3aWxsIGJlIGFuIGFycmF5IHdoZXJlIGVhY2ggZW50cnkgd2lsbCBoYXZlIGEgXCJuYW1lXCIgd2hpY2ggd2lsbCBiZSB0aGVcbiAgICAvLyAgXCJyZXNvbHZlZFwiIHByb3BlcnR5IG5hbWUgKHRoYXQgd2UgY2FuIHVzZSBhcyB0aGUgY29sSWQpIHRob3VnaCBpdCdzIG5vdCByZWFsbHlcbiAgICAvLyAgcmVzb2x2ZWQuIFRoZSBidWlsZEZpZWxkc0ZvclRhYmxlIGhlbHBlciBqdXN0IHJlbW92ZXMgdGhlIFwiQFAgXCIgKHdoaWNoIGlzIHdoYXRcbiAgICAvLyAgTmVidWxhIGRvZXMpLiBJdCB3aWxsIGFsc28gaGF2ZSB0aGUgXCJsYWJlbFwiLCBhbmQgXCJtZXRhXCIgY29udGFpbnMgdGhlIG9yaWdpbmFsLFxuICAgIC8vICB1bmNoYW5nZWQgY29uZmlnIGluZm8uIEZvciBub3csIG11Y2ggb2YgdGhlIGluZm8gaGVyZSBpcyBjYXJyaWVkIG92ZXIgZnJvbVxuICAgIC8vICBOZWJ1bGEgYW5kIHdlIG1heSBub3QgZW5kIHVwIHVzaW5nIGl0IGFsbC5cbiAgICB0aGlzLmZpZWxkRGVmcyA9IGJ1aWxkRmllbGRzRm9yVGFibGUocmF3RmllbGRzLCByZXNvbHZlZEZpZWxkcywgc2hvd0RlbGV0ZUJ1dHRvbik7XG5cbiAgICAvLyBlbmQgb2YgZnJvbSBOZWJ1bGFcblxuICAgIC8vIEhlcmUsIHdlIHVzZSB0aGUgXCJuYW1lXCIgZmllbGQgaW4gZmllbGREZWZzIHNpbmNlIHRoYXQgaGFzIHRoZSBhc3NvaWNhdGVkIHByb3BlcnR5XG4gICAgLy8gIChpZiBvbmUgZXhpc3RzIGZvciB0aGUgZmllbGQpLiBJZiBubyBcIm5hbWVcIiwgdXNlIFwiY2VsbFJlbmRlcmVyXCIgKHR5cGljYWxseSBnZXQgREVMRVRFX0lDT04pXG4gICAgLy8gIGZvciBvdXIgY29sdW1ucy5cbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmZpZWxkRGVmcz8ubWFwKGZpZWxkID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5uYW1lID8gZmllbGQubmFtZSA6IGZpZWxkLmNlbGxSZW5kZXJlcjtcbiAgICB9KTtcblxuICAgIC8vIEFuZCBub3cgd2UgY2FuIHByb2Nlc3MgdGhlIHJlc29sdmVkRmllbGRzIHRvIGFkZCBpbiB0aGUgXCJuYW1lXCJcbiAgICAvLyAgZnJvbSBmcm9tIHRoZSBmaWVsZERlZnMuIFRoaXMgXCJuYW1lXCIgaXMgdGhlIHZhbHVlIHRoYXRcbiAgICAvLyAgd2UnbGwgc2hhcmUgdG8gY29ubmVjdCB0aGluZ3MgdG9nZXRoZXIgaW4gdGhlIHRhYmxlLlxuXG4gICAgdGhpcy5wcm9jZXNzZWRGaWVsZHMgPSBbXTtcblxuICAgIHRoaXMucHJvY2Vzc2VkRmllbGRzID0gcmVzb2x2ZWRGaWVsZHMubWFwKChmaWVsZCwgaSkgPT4ge1xuICAgICAgZmllbGQuY29uZmlnLm5hbWUgPSB0aGlzLmRpc3BsYXllZENvbHVtbnNbaV07IC8vIC5jb25maWdbXCJ2YWx1ZVwiXS5yZXBsYWNlKC8gLi9nLFwiX1wiKTsgICAvLyByZXBsYWNlIHNwYWNlIGRvdCB3aXRoIHVuZGVyc2NvcmVcbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9KTtcblxuICAgIC8vIGZvciBhZGRpbmcgcm93cyB0byB0YWJsZSB3aGVuIGVkaXRhYmxlIGFuZCBub3QgbW9kYWwgdmlld1xuICAgIGlmICh0aGlzLnByZXZSZWZlcmVuY2VMaXN0Lmxlbmd0aCAhPT0gdGhpcy5yZWZlcmVuY2VMaXN0Lmxlbmd0aCAmJiB0aGlzLmVkaXRhYmxlTW9kZSAmJiAhdGhpcy5hbGxvd0VkaXRpbmdJbk1vZGFsKSB7XG4gICAgICB0aGlzLmJ1aWxkRWxlbWVudHNGb3JUYWJsZSgpO1xuICAgIH1cblxuICAgIC8vIGZvciBlZGl0IGFuZCBhZGRpbmcgcm93cyBpbiBtb2RhbCB2aWV3IGFuZCB0byBnZW5lcmF0ZSByZWFkb25seSBsaXN0XG4gICAgaWYgKCFpc0VxdWFsKHRoaXMucHJldlJlZmVyZW5jZUxpc3QsIHRoaXMucmVmZXJlbmNlTGlzdCkgJiYgKHRoaXMucmVhZE9ubHlNb2RlIHx8IHRoaXMuYWxsb3dFZGl0aW5nSW5Nb2RhbCkpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVSb3dzRGF0YSgpO1xuICAgIH1cblxuICAgIHRoaXMucHJldlJlZmVyZW5jZUxpc3QgPSB0aGlzLnJlZmVyZW5jZUxpc3Q7XG5cbiAgICAvLyBUaGVzZSBhcmUgdGhlIGRhdGEgc3RydWN0dXJlcyByZWZlcnJlZCB0byBpbiB0aGUgaHRtbCBmaWxlLlxuICAgIC8vICBUaGVzZSBhcmUgdGhlIHJlbGF0aW9uc2hpcHMgdGhhdCBtYWtlIHRoZSB0YWJsZSB3b3JrXG4gICAgLy8gIGRpc3BsYXllZENvbHVtbnM6IGtleS92YWx1ZSBwYWlycyB3aGVyZSBrZXkgaXMgb3JkZXIgb2YgY29sdW1uIGFuZFxuICAgIC8vICAgIHZhbHVlIGlzIHRoZSBwcm9wZXJ0eSBzaG93biBpbiB0aGF0IGNvbHVtbi4gRXg6IDE6IFwiRmlyc3ROYW1lXCJcbiAgICAvLyAgcHJvY2Vzc2VkRmllbGRzOiBrZXkvdmFsdWUgcGFpcnMgd2hlcmUgZWFjaCBrZXkgaXMgb3JkZXIgb2YgY29sdW1uXG4gICAgLy8gICAgYW5kIGVhY2ggdmFsdWUgaXMgYW4gb2JqZWN0IG9mIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhhdFxuICAgIC8vICAgIGNvbHVtbi5cbiAgICAvLyAgcm93RGF0YTogYXJyYXkgb2YgZWFjaCByb3cncyBrZXkvdmFsdWUgcGFpcnMuIEluc2lkZSBlYWNoIHJvdyxcbiAgICAvLyAgICBlYWNoIGtleSBpcyBhbiBlbnRyeSBpbiBkaXNwbGF5ZWRDb2x1bW5zOiBleDogXCJGaXJzdE5hbWVcIjogXCJDaGFybGVzXCJcbiAgICAvLyAgICBFeDogeyAxOiB7Y29uZmlnOiB7bGFiZWw6IFwiRmlyc3QgTmFtZVwiLCByZWFkT25seTogdHJ1ZTogbmFtZTogXCJGaXJzdE5hbWVcIn19LCB0eXBlOiBcIlRleHRJbnB1dFwiIH1cbiAgICAvLyAgICBUaGUgXCJ0eXBlXCIgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNvbXBvbmVudCB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBlZGl0aW5nICh3aGVuIGVkaXRpbmcgaXMgZW5hYmxlZClcbiAgICAvL1xuICAgIC8vICBOb3RlIHRoYXQgdGhlIFwicHJvcGVydHlcIiBzaG93biBpbiB0aGUgY29sdW1uIChcIkZpcnN0TmFtZVwiIGluIHRoZSBhYm92ZSBleGFtcGxlcykgaXMgd2hhdFxuICAgIC8vICB0aWVzIHRoZSAzIGRhdGEgc3RydWN0dXJlcyB0b2dldGhlci5cbiAgfVxuXG4gIGdldFJlc3VsdHNUZXh0KCkge1xuICAgIGNvbnN0IHJlY29yZHNDb3VudCA9IHRoaXMucmVhZE9ubHlNb2RlID8gdGhpcy5yb3dEYXRhPy5kYXRhLmxlbmd0aCA6IHRoaXMucmVmZXJlbmNlTGlzdD8ubGVuZ3RoO1xuICAgIHJldHVybiBgJHtyZWNvcmRzQ291bnR9IHJlc3VsdCR7cmVjb3Jkc0NvdW50ID4gMSA/ICdzJyA6ICcnfWA7XG4gIH1cblxuICBzb3J0Q29tcGFyZShhLCBiKTogbnVtYmVyIHtcbiAgICBsZXQgYVZhbHVlID0gYVt0aGlzLmNvbXBhcmVSZWZdO1xuICAgIGxldCBiVmFsdWUgPSBiW3RoaXMuY29tcGFyZVJlZl07XG5cbiAgICBpZiAodGhpcy5jb21wYXJlVHlwZSA9PSAnRGF0ZScgfHwgdGhpcy5jb21wYXJlVHlwZSA9PSAnRGF0ZVRpbWUnKSB7XG4gICAgICBhVmFsdWUgPSBnZXRTZWNvbmRzKGFWYWx1ZSk7XG4gICAgICBiVmFsdWUgPSBnZXRTZWNvbmRzKGJWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29tcGFyZVJlZiA9PSAncHhSZWZPYmplY3RJbnNOYW1lJykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb21wYXJlQnlDb2x1bW5QeFJlZk9iamVjdEluc05hbWUoYVZhbHVlLCBiVmFsdWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFWYWx1ZSA9PT0gYlZhbHVlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hcnJvd0RpcmVjdGlvbiA9PT0gJ3VwJykgcmV0dXJuIGFWYWx1ZSAtIGJWYWx1ZTtcbiAgICBpZiAodGhpcy5hcnJvd0RpcmVjdGlvbiA9PT0gJ2Rvd24nKSByZXR1cm4gYlZhbHVlIC0gYVZhbHVlO1xuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb21wYXJlQnlDb2x1bW5QeFJlZk9iamVjdEluc05hbWUoYVZhbHVlLCBiVmFsdWUpIHtcbiAgICBjb25zdCBwcmVmaXhYID0gYVZhbHVlLnNwbGl0KCctJyk7XG4gICAgY29uc3QgcHJlZml4WSA9IGJWYWx1ZS5zcGxpdCgnLScpO1xuICAgIHN3aXRjaCAodGhpcy5hcnJvd0RpcmVjdGlvbikge1xuICAgICAgY2FzZSAndXAnOlxuICAgICAgICBpZiAocHJlZml4WFswXSAhPT0gcHJlZml4WVswXSkge1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdIDwgcHJlZml4WVswXSkgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdID4gcHJlZml4WVswXSkgcmV0dXJuIDE7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZWZpeFhbMV0gLSBwcmVmaXhZWzFdO1xuICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgIGlmIChwcmVmaXhYWzBdICE9PSBwcmVmaXhZWzBdKSB7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPiBwcmVmaXhZWzBdKSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKHByZWZpeFhbMF0gPCBwcmVmaXhZWzBdKSByZXR1cm4gMTtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlZml4WVsxXSAtIHByZWZpeFhbMV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdXBkYXRlRmlsdGVyRGlzcGxheSh0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc1RpbWUkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICB0aGlzLmJDb250YWlucyQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc0RhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ2NvbnRhaW5zJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBfZmlsdGVyKGV2ZW50LCBjb2x1bW5EYXRhKSB7XG4gICAgLy8gYWRkIGNsaWNrQXdheSBsaXN0ZW5lclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YSA9IGNvbHVtbkRhdGE7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc0xhYmVsJCA9IGNvbHVtbkRhdGEuY29uZmlnLmxhYmVsO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlckRpc3BsYXkoY29sdW1uRGF0YS50eXBlKTtcblxuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJWYXJzV2l0aEN1cnJlbnQoY29sdW1uRGF0YSk7XG5cbiAgICAgIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBfY2xpY2tBd2F5KGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgYkluUG9wVXAgPSBmYWxzZTtcblxuICAgIC8vIHJ1biB0aHJvdWdoIGxpc3Qgb2YgZWxlbWVudHMgaW4gcGF0aCwgaWYgbWVudSBub3QgaW4gdGggcGF0aCwgdGhlbiB3YW50IHRvXG4gICAgLy8gaGlkZSAodG9nZ2xlKSB0aGUgbWVudVxuICAgIGNvbnN0IGV2ZW50UGF0aCA9IGV2ZW50LnBhdGg7XG4gICAgZm9yIChsZXQgZXZlbnRJbmRleCA9IDA7IGV2ZW50SW5kZXggPCBldmVudFBhdGgubGVuZ3RoOyBldmVudEluZGV4KyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnRQYXRoW2V2ZW50SW5kZXhdLmNsYXNzTmFtZSA9PSAncHNkay1tb2RhbC1maWxlLXRvcCcgfHxcbiAgICAgICAgZXZlbnRQYXRoW2V2ZW50SW5kZXhdLnRhZ05hbWUgPT0gJ0JVVFRPTicgfHxcbiAgICAgICAgZXZlbnRQYXRoW2V2ZW50SW5kZXhdLnRhZ05hbWUgPT0gJ01BVC1PUFRJT04nIHx8XG4gICAgICAgIGV2ZW50UGF0aFtldmVudEluZGV4XS50YWdOYW1lID09ICdNQVQtSU5QVVQnXG4gICAgICApIHtcbiAgICAgICAgYkluUG9wVXAgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFiSW5Qb3BVcCkge1xuICAgICAgLy8gdGhpcy5iU2hvd0ZpbHRlclBvcG92ZXIkID0gZmFsc2U7XG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIF9maWx0ZXJDb250YWluc1R5cGUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSBldmVudC52YWx1ZTtcbiAgfVxuXG4gIF9maWx0ZXJDb250YWluc1ZhbHVlKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIF9maWx0ZXJDb250YWluc0RhdGVWYWx1ZShldmVudCwgdmFsdWUpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gdmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNEYXRlVGltZVZhbHVlKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIF9maWx0ZXJDb250YWluc1RpbWVWYWx1ZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cblxuICBfb25GaWx0ZXJBY3Rpb25CdXR0b25DbGljayhldmVudDogYW55KSB7XG4gICAgLy8gbW9kYWwgYnV0dG9uc1xuICAgIHN3aXRjaCAoZXZlbnQuYWN0aW9uKSB7XG4gICAgICBjYXNlICdjYW5jZWwnOlxuICAgICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhID0gW107XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJXaXRoSW5mbygpO1xuICAgICAgICB0aGlzLmZpbHRlclNvcnRHcm91cEJ5KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5iU2hvd0ZpbHRlclBvcG92ZXIkID0gZmFsc2U7XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcldpdGhJbmZvKCkge1xuICAgIGxldCBiRm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGZpbHRlck9iaiBvZiB0aGlzLmZpbHRlckJ5Q29sdW1ucykge1xuICAgICAgaWYgKGZpbHRlck9iai5yZWYgPT09IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEuY29uZmlnLm5hbWUpIHtcbiAgICAgICAgZmlsdGVyT2JqLnR5cGUgPSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLnR5cGU7XG4gICAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlciA9IHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJDtcbiAgICAgICAgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUgPSB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkO1xuXG4gICAgICAgIGJGb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYkZvdW5kKSB7XG4gICAgICAvLyBhZGQgaW5cbiAgICAgIGNvbnN0IGZpbHRlck9iajogYW55ID0ge307XG4gICAgICBmaWx0ZXJPYmoucmVmID0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS5jb25maWcubmFtZTtcbiAgICAgIGZpbHRlck9iai50eXBlID0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS50eXBlO1xuICAgICAgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyID0gdGhpcy5maWx0ZXJDb250YWluc1R5cGUkO1xuICAgICAgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUgPSB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkO1xuXG4gICAgICB0aGlzLmZpbHRlckJ5Q29sdW1ucy5wdXNoKGZpbHRlck9iaik7XG4gICAgfVxuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGZpbHRlcnMgYW5kIHVwZGF0ZSBmaWx0ZXJPbiBpY29uXG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5zRmlsdGVyVmFsdWUgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZTtcbiAgICAgIGNvbnN0IGNvbnRhaW5zRmlsdGVyID0gZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyO1xuICAgICAgY29uc3QgZmlsdGVyUmVmID0gZmlsdGVyT2JqLnJlZjtcbiAgICAgIGNvbnN0IGZpbHRlckluZGV4ID0gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmluZGV4T2YoZmlsdGVyUmVmKTtcbiAgICAgIGNvbnN0IGFyRmlsdGVySW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ2ZpbHRlck9uSWNvbicpO1xuICAgICAgY29uc3QgZmlsdGVySW1nOiBhbnkgPSBhckZpbHRlckltZ1tmaWx0ZXJJbmRleF07XG4gICAgICBpZiAoY29udGFpbnNGaWx0ZXJWYWx1ZSA9PSAnJyAmJiBjb250YWluc0ZpbHRlciAhPSAnbnVsbCcgJiYgY29udGFpbnNGaWx0ZXIgIT0gJ25vdG51bGwnKSB7XG4gICAgICAgIC8vIGNsZWFyIGljb25cbiAgICAgICAgZmlsdGVySW1nLnNyYyA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2hvdyBpY29uXG4gICAgICAgIGZpbHRlckltZy5zcmMgPSB0aGlzLmZpbHRlck9uU3ZnSWNvbiQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRmlsdGVyVmFyc1dpdGhDdXJyZW50KGNvbHVtbkRhdGEpIHtcbiAgICAvLyBmaW5kIGN1cnJlbnQgcmVmLCBpZiBleGlzdHMsIG1vdmUgZGF0YSB0byB2YXJpYWJsZSB0byBkaXNwbGF5XG5cbiAgICBsZXQgYkZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmoucmVmID09PSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLmNvbmZpZy5uYW1lKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlcjtcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlO1xuXG4gICAgICAgIGJGb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYkZvdW5kKSB7XG4gICAgICBzd2l0Y2ggKGNvbHVtbkRhdGEudHlwZSkge1xuICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnbm90ZXF1YWwnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdjb250YWlucyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSAnJztcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJEYXRhKGl0ZW06IGFueSkge1xuICAgIGxldCBiS2VlcCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZSAhPSAnJyB8fCBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPT0gJ251bGwnIHx8IGZpbHRlck9iai5jb250YWluc0ZpbHRlciA9PSAnbm90bnVsbCcpIHtcbiAgICAgICAgc3dpdGNoIChmaWx0ZXJPYmoudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgICAgIGJLZWVwID0gZmlsdGVyRGF0YUJ5RGF0ZShpdGVtLCBmaWx0ZXJPYmopO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJLZWVwID0gZmlsdGVyRGF0YUJ5Q29tbW9uRmllbGRzKGl0ZW0sIGZpbHRlck9iaik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBkb24ndCBrZWVwIHN0b3AgZmlsdGVyaW5nXG4gICAgICBpZiAoIWJLZWVwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiS2VlcDtcbiAgfVxuXG4gIGZpbHRlclNvcnRHcm91cEJ5KCkge1xuICAgIGxldCB0aGVEYXRhID0gdGhpcy5vcmlnaW5hbERhdGEuc2xpY2UoKTtcblxuICAgIC8vIGxhc3QgZmlsdGVyIGNvbmZpZyBkYXRhIGlzIGdsb2JhbFxuICAgIHRoZURhdGEgPSB0aGVEYXRhLmZpbHRlcih0aGlzLmZpbHRlckRhdGEuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBsYXN0IHNvcnQgY29uZmlnIGRhdGEgaXMgZ2xvYmFsXG4gICAgdGhlRGF0YS5zb3J0KHRoaXMuc29ydENvbXBhcmUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5yb3dEYXRhLmRhdGEgPSB0aGVEYXRhO1xuICB9XG5cbiAgX2hlYWRlclNvcnRDbGljayhldmVudCwgY29sdW1uRGF0YSkge1xuICAgIC8vIGltYWdlcyAwIC0gZmlsdGVyLCAxIC0gYXJyb3csIDIgLSBtb3JlXG5cbiAgICAvKiogQ29tbWVudGluZyB0aGlzIGNvZGUgZm9yIG5vdyBhcyBpdCBpcyBnaXZpbmcgZXJyb3JzIG5vdCBzdXJlIGlmIGl0IGV2ZXIgd29ya2VkICovXG4gICAgLy8gbGV0IGFycm93SW1hZ2UgPSBldmVudC5zcmNFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKVsxXTtcbiAgICAvLyBsZXQgYXJyb3dBdHRyID0gYXJyb3dJbWFnZS5nZXRBdHRyaWJ1dGUoJ2Fycm93Jyk7XG5cbiAgICAvLyB0aGlzLmNsZWFyT3V0QXJyb3dzKGV2ZW50LCBjb2x1bW5EYXRhKTtcblxuICAgIC8vIHN3aXRjaCAoYXJyb3dBdHRyKSB7XG4gICAgLy8gICBjYXNlICd1cCc6XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc3JjID0gdGhpcy5hcnJvd0Rvd25TdmdJY29uJDtcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zZXRBdHRyaWJ1dGUoJ2Fycm93JywgJ2Rvd24nKTtcbiAgICAvLyAgICAgYnJlYWs7XG4gICAgLy8gICBjYXNlICdkb3duJzpcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zcmMgPSAnJztcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zZXRBdHRyaWJ1dGUoJ2Fycm93JywgJ25vbmUnKTtcbiAgICAvLyAgICAgYnJlYWs7XG4gICAgLy8gICBkZWZhdWx0OlxuICAgIC8vICAgICBhcnJvd0ltYWdlLnNyYyA9IHRoaXMuYXJyb3dVcFN2Z0ljb24kO1xuICAgIC8vICAgICBhcnJvd0ltYWdlLnNldEF0dHJpYnV0ZSgnYXJyb3cnLCAndXAnKTtcbiAgICAvLyAgICAgYnJlYWs7XG4gICAgLy8gfVxuXG4gICAgdGhpcy5jb21wYXJlVHlwZSA9IGNvbHVtbkRhdGEudHlwZTtcbiAgICB0aGlzLmNvbXBhcmVSZWYgPSBjb2x1bW5EYXRhLmNvbmZpZy5uYW1lO1xuICAgIC8vIHRoaXMuYXJyb3dEaXJlY3Rpb24gPSBhcnJvd0ltYWdlLmdldEF0dHJpYnV0ZSgnYXJyb3cnKTtcbiAgICB0aGlzLmFycm93RGlyZWN0aW9uID0gdGhpcy5hcnJvd0RpcmVjdGlvbiA9PT0gJ3VwJyA/ICdkb3duJyA6ICd1cCc7XG5cbiAgICB0aGlzLmZpbHRlclNvcnRHcm91cEJ5KCk7XG4gIH1cblxuICBfc2hvd1VuR3JvdXBCeShjb2x1bW5EYXRhKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5ncm91cEJ5Q29sdW1ucyQpIHtcbiAgICAgIGlmICh2YWwgPT0gY29sdW1uRGF0YS5jb25maWcubmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBfZ3JvdXBCeShldmVudCwgY29sdW1uRGF0YSkge1xuICAgIHRoaXMuY2hlY2tHcm91cEJ5Q29sdW1uKGNvbHVtbkRhdGEuY29uZmlnLm5hbWUsIHRydWUpO1xuXG4gICAgdGhpcy5maWx0ZXJTb3J0R3JvdXBCeSgpO1xuICB9XG5cbiAgX3VuR3JvdXBCeShldmVudCwgY29sdW1uRGF0YSkge1xuICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuY2hlY2tHcm91cEJ5Q29sdW1uKGNvbHVtbkRhdGEuY29uZmlnLm5hbWUsIGZhbHNlKTtcblxuICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgfVxuXG4gIGNoZWNrR3JvdXBCeUNvbHVtbihmaWVsZCwgYWRkKSB7XG4gICAgbGV0IGZvdW5kOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLmdyb3VwQnlDb2x1bW5zJCkge1xuICAgICAgaWYgKGNvbHVtbiA9PT0gZmllbGQpIHtcbiAgICAgICAgZm91bmQgPSB0aGlzLmdyb3VwQnlDb2x1bW5zJC5pbmRleE9mKGNvbHVtbiwgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb3VuZCAhPSBudWxsICYmIGZvdW5kID49IDApIHtcbiAgICAgIGlmICghYWRkKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBCeUNvbHVtbnMkLnNwbGljZShmb3VuZCwgMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhZGQpIHtcbiAgICAgIHRoaXMuZ3JvdXBCeUNvbHVtbnMkLnB1c2goZmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRHcm91cE5hbWUoZmllbGROYW1lKSB7XG4gICAgZm9yIChsZXQgZmllbGRJbmRleCA9IDA7IGZpZWxkSW5kZXggPCB0aGlzLmZpZWxkcyQubGVuZ3RoOyBmaWVsZEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMkW2ZpZWxkSW5kZXhdO1xuICAgICAgaWYgKGZpZWxkLmNvbmZpZy5uYW1lID09IGZpZWxkTmFtZSkge1xuICAgICAgICByZXR1cm4gZmllbGQuY29uZmlnLmxhYmVsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBhZGRHcm91cHMoZGF0YTogYW55W10sIGdyb3VwQnlDb2x1bW5zOiBzdHJpbmdbXSk6IGFueVtdIHtcbiAgICBjb25zdCByb290R3JvdXAgPSBuZXcgR3JvdXAoKTtcbiAgICByb290R3JvdXAuZXhwYW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLmdldFN1YmxldmVsKGRhdGEsIDAsIGdyb3VwQnlDb2x1bW5zLCByb290R3JvdXApO1xuICB9XG5cbiAgZ2V0U3VibGV2ZWwoZGF0YTogYW55W10sIGxldmVsOiBudW1iZXIsIGdyb3VwQnlDb2x1bW5zOiBzdHJpbmdbXSwgcGFyZW50OiBHcm91cCk6IGFueVtdIHtcbiAgICBpZiAobGV2ZWwgPj0gZ3JvdXBCeUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgY29uc3QgZ3JvdXBzID0gdGhpcy51bmlxdWVCeShcbiAgICAgIGRhdGEubWFwKHJvdyA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBHcm91cCgpO1xuICAgICAgICByZXN1bHQubGV2ZWwgPSBsZXZlbCArIDE7XG4gICAgICAgIHJlc3VsdC5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxldmVsOyBpKyspIHtcbiAgICAgICAgICByZXN1bHRbZ3JvdXBCeUNvbHVtbnNbaV1dID0gcm93W2dyb3VwQnlDb2x1bW5zW2ldXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSksXG4gICAgICBKU09OLnN0cmluZ2lmeVxuICAgICk7XG5cbiAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gZ3JvdXBCeUNvbHVtbnNbbGV2ZWxdO1xuICAgIGxldCBzdWJHcm91cHM6IGFueSA9IFtdO1xuICAgIGdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgIGNvbnN0IHJvd3NJbkdyb3VwID0gZGF0YS5maWx0ZXIocm93ID0+IGdyb3VwW2N1cnJlbnRDb2x1bW5dID09PSByb3dbY3VycmVudENvbHVtbl0pO1xuICAgICAgZ3JvdXAudG90YWxDb3VudHMgPSByb3dzSW5Hcm91cC5sZW5ndGg7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IHRoaXMuZ2V0U3VibGV2ZWwocm93c0luR3JvdXAsIGxldmVsICsgMSwgZ3JvdXBCeUNvbHVtbnMsIGdyb3VwKTtcbiAgICAgIHN1Ykdyb3VwLnVuc2hpZnQoZ3JvdXApO1xuICAgICAgc3ViR3JvdXBzID0gc3ViR3JvdXBzLmNvbmNhdChzdWJHcm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1Ykdyb3VwcztcbiAgfVxuXG4gIHVuaXF1ZUJ5KGEsIGtleSkge1xuICAgIGNvbnN0IHNlZW4gPSB7fTtcbiAgICByZXR1cm4gYS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCBrID0ga2V5KGl0ZW0pO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJldHVybi1hc3NpZ24sIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgcmV0dXJuIHNlZW4uaGFzT3duUHJvcGVydHkoaykgPyBmYWxzZSA6IChzZWVuW2tdID0gdHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpc0dyb3VwKGluZGV4LCBpdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGl0ZW0ubGV2ZWw7XG4gIH1cblxuICBfZ3JvdXBIZWFkZXJDbGljayhyb3cpIHtcbiAgICByb3cuZXhwYW5kZWQgPSAhcm93LmV4cGFuZGVkO1xuICAgIC8vIHRoaXMucmVwZWF0TGlzdCQuZmlsdGVyID0gXCJcIjtcbiAgICB0aGlzLnBlcmZGaWx0ZXIgPSBwZXJmb3JtYW5jZS5ub3coKS50b1N0cmluZygpO1xuICAgIHRoaXMucm93RGF0YS5maWx0ZXIgPSB0aGlzLnBlcmZGaWx0ZXI7XG4gIH1cblxuICAvLyBiZWxvdyBpcyBmb3IgZ3JpZCByb3cgZ3JvdXBpbmdcbiAgY3VzdG9tRmlsdGVyUHJlZGljYXRlKGRhdGE6IGFueSB8IEdyb3VwLCBmaWx0ZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkYXRhIGluc3RhbmNlb2YgR3JvdXAgPyBkYXRhLnZpc2libGUgOiB0aGlzLmdldERhdGFSb3dWaXNpYmxlV2l0aEZpbHRlcihkYXRhLCBmaWx0ZXIpO1xuICB9XG5cbiAgZ2V0RGF0YVJvd1Zpc2libGUoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ3JvdXBSb3dzID0gdGhpcy5yb3dEYXRhLmRhdGEuZmlsdGVyKHJvdyA9PiB7XG4gICAgICBpZiAoIShyb3cgaW5zdGFuY2VvZiBHcm91cCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgbGV0IG1hdGNoID0gdHJ1ZTtcbiAgICAgIHRoaXMuZ3JvdXBCeUNvbHVtbnMkLmZvckVhY2goY29sdW1uID0+IHtcbiAgICAgICAgaWYgKCFyb3dbY29sdW1uXSB8fCAhZGF0YVtjb2x1bW5dIHx8IHJvd1tjb2x1bW5dICE9PSBkYXRhW2NvbHVtbl0pIHtcbiAgICAgICAgICBtYXRjaCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcblxuICAgIGlmIChncm91cFJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gZ3JvdXBSb3dzWzBdIGFzIEdyb3VwO1xuICAgIHJldHVybiBwYXJlbnQudmlzaWJsZSAmJiBwYXJlbnQuZXhwYW5kZWQ7XG4gIH1cblxuICBnZXREYXRhUm93VmlzaWJsZVdpdGhGaWx0ZXIoZGF0YSwgZmlsdGVyKSB7XG4gICAgLy8gZmlzdCBjaGVjayBpZiByb3cgaXMgdmlzaWJsZSB3aXRoIGdyb3VwaW5nXG4gICAgbGV0IGJWaXNpYmxlID0gdGhpcy5nZXREYXRhUm93VmlzaWJsZShkYXRhKTtcblxuICAgIGlmIChiVmlzaWJsZSAmJiBmaWx0ZXIgJiYgZmlsdGVyICE9ICcnICYmIGZpbHRlciAhPSB0aGlzLnBlcmZGaWx0ZXIpIHtcbiAgICAgIC8vIG5vdyBjaGVjayBpZiByb3cgaXMgZmlsdGVyZWQuXG5cbiAgICAgIC8vIGFzc3VtZSBub3QgdGhlcmUgdW5sZXNzIHdlIGZpbmQgaXRcbiAgICAgIGJWaXNpYmxlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLmRpc3BsYXllZENvbHVtbnMpIHtcbiAgICAgICAgLy8gZmlsdGVyIGlzIGxvd2VyIGNhc2VcbiAgICAgICAgaWYgKGRhdGFbY29sXSAmJiBkYXRhW2NvbF0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZmlsdGVyKSA+PSAwKSB7XG4gICAgICAgICAgYlZpc2libGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJWaXNpYmxlO1xuICB9XG5cbiAgZ2V0RGlzcGxheUNvbHVtbnMoZmllbGRzID0gW10pIHtcbiAgICByZXR1cm4gZmllbGRzLm1hcCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgbGV0IHRoZUZpZWxkID0gZmllbGQuY29uZmlnLnZhbHVlLnN1YnN0cmluZyhmaWVsZC5jb25maWcudmFsdWUuaW5kZXhPZignICcpICsgMSk7XG4gICAgICBpZiAodGhlRmllbGQuaW5kZXhPZignLicpID09IDApIHtcbiAgICAgICAgdGhlRmllbGQgPSB0aGVGaWVsZC5zdWJzdHJpbmcoMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGVGaWVsZDtcbiAgICB9KTtcbiAgfVxuXG4gIF9nZXRJY29uU3R5bGUobGV2ZWwpOiBzdHJpbmcge1xuICAgIGxldCBzUmV0dXJuID0gJyc7XG4gICAgbGV0IG5MZXZlbCA9IHBhcnNlSW50KGxldmVsLCAxMCk7XG4gICAgbkxldmVsLS07XG4gICAgbkxldmVsICo9IDE1O1xuICAgIHNSZXR1cm4gPSBgcGFkZGluZy1sZWZ0OiAke25MZXZlbH1weDsgdmVydGljYWwtYWxpZ246IG1pZGRsZWA7XG5cbiAgICByZXR1cm4gc1JldHVybjtcbiAgfVxuXG4gIC8vIENhbGxiYWNrIHBhc3NlZCB3aGVuIHN1YnNjcmliaW5nIHRvIHN0b3JlIGNoYW5nZVxuICBvblN0YXRlQ2hhbmdlKCkge1xuICAgIHRoaXMuY2hlY2tBbmRVcGRhdGUoKTtcbiAgfVxuXG4gIC8vIHJldHVybiB0aGUgdmFsdWUgdGhhdCBzaG91bGQgYmUgc2hvd24gYXMgdGhlIGNvbnRlbnRzIGZvciB0aGUgZ2l2ZW4gcm93IGRhdGFcbiAgLy8gIG9mIHRoZSBnaXZlbiByb3cgZmllbGRcbiAgZ2V0Um93VmFsdWUoaW5Sb3dEYXRhOiBPYmplY3QsIGluQ29sS2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIC8vIFNlZSB3aGF0IGRhdGEgKGlmIGFueSkgd2UgaGF2ZSB0byBkaXNwbGF5XG4gICAgY29uc3QgcmVmS2V5czogc3RyaW5nW10gPSBpbkNvbEtleS5zcGxpdCgnLicpO1xuICAgIGxldCB2YWxCdWlsZGVyID0gaW5Sb3dEYXRhO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlZktleXMpIHtcbiAgICAgIHZhbEJ1aWxkZXIgPSB2YWxCdWlsZGVyW2tleV07XG4gICAgfVxuICAgIHJldHVybiB2YWxCdWlsZGVyO1xuICB9XG5cbiAgZ2VuZXJhdGVSb3dzRGF0YSgpIHtcbiAgICBjb25zdCB7IGRhdGFQYWdlTmFtZSwgcmVmZXJlbmNlTGlzdCB9ID0gdGhpcy5jb25maWdQcm9wcyQ7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCk7XG4gICAgLy8gaWYgZGF0YVBhZ2VOYW1lIHByb3BlcnR5IHZhbHVlIGV4aXN0cyB0aGVuIG1ha2UgYSBkYXRhcGFnZSBmZXRjaCBjYWxsIGFuZCBnZXQgdGhlIGxpc3Qgb2YgZGF0YS5cbiAgICBpZiAoZGF0YVBhZ2VOYW1lKSB7XG4gICAgICB0aGlzLmRhdGFQYWdlU2VydmljZS5nZXREYXRhUGFnZURhdGEoZGF0YVBhZ2VOYW1lLCB0aGlzLnBhcmFtZXRlcnMsIGNvbnRleHQpLnRoZW4obGlzdERhdGEgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5mb3JtYXRSb3dzRGF0YShsaXN0RGF0YSk7XG4gICAgICAgIHRoaXMub3JpZ2luYWxEYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5yb3dEYXRhID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShkYXRhKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmVmZXJlbmNlTGlzdCBwcm9wIGhhcyB0aGUgSlNPTiBkYXRhIGZvciBlYWNoIHJvdyB0byBiZSBkaXNwbGF5ZWRcbiAgICAgIC8vICBpbiB0aGUgdGFibGUuIFNvLCBpdGVyYXRlIG92ZXIgcmVmZXJlbmNlTGlzdCB0byBjcmVhdGUgdGhlIGRhdGFSb3dzIHRoYXRcbiAgICAgIC8vICB3ZSdyZSB1c2luZyBhcyB0aGUgdGFibGUncyBkYXRhU291cmNlXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5mb3JtYXRSb3dzRGF0YShyZWZlcmVuY2VMaXN0KTtcbiAgICAgIHRoaXMub3JpZ2luYWxEYXRhID0gZGF0YTtcbiAgICAgIHRoaXMucm93RGF0YSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0Um93c0RhdGEoZGF0YSkge1xuICAgIHJldHVybiBkYXRhPy5tYXAoaXRlbSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnJlZHVjZSgoZGF0YUZvclJvdywgY29sS2V5KSA9PiB7XG4gICAgICAgIGRhdGFGb3JSb3dbY29sS2V5XSA9IHRoaXMuZ2V0Um93VmFsdWUoaXRlbSwgY29sS2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGFGb3JSb3c7XG4gICAgICB9LCB7fSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRSZWNvcmQoKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dFZGl0aW5nSW5Nb2RhbCAmJiB0aGlzLmRlZmF1bHRWaWV3KSB7XG4gICAgICB0aGlzLnBDb25uJFxuICAgICAgICAuZ2V0QWN0aW9uc0FwaSgpXG4gICAgICAgIC5vcGVuRW1iZWRkZWREYXRhTW9kYWwoXG4gICAgICAgICAgdGhpcy5kZWZhdWx0VmlldyxcbiAgICAgICAgICB0aGlzLnBDb25uJCxcbiAgICAgICAgICB0aGlzLnJlZmVyZW5jZUxpc3RTdHIsXG4gICAgICAgICAgdGhpcy5yZWZlcmVuY2VMaXN0Lmxlbmd0aCxcbiAgICAgICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5SRVNPVVJDRV9TVEFUVVMuQ1JFQVRFXG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChQQ29yZS5nZXRQQ29yZVZlcnNpb24oKT8uaW5jbHVkZXMoJzguNycpKSB7XG4gICAgICB0aGlzLnBDb25uJC5nZXRMaXN0QWN0aW9ucygpLmluc2VydCh7IGNsYXNzSUQ6IHRoaXMuY29udGV4dENsYXNzIH0sIHRoaXMucmVmZXJlbmNlTGlzdC5sZW5ndGgsIHRoaXMucGFnZVJlZmVyZW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgLSBzZWNvbmQgcGFyYW1ldGVyIFwicGFnZVJlZlwiIGlzIG9wdGlvbmFsIGZvciBpbnNlcnQgbWV0aG9kXG4gICAgICB0aGlzLnBDb25uJC5nZXRMaXN0QWN0aW9ucygpLmluc2VydCh7IGNsYXNzSUQ6IHRoaXMuY29udGV4dENsYXNzIH0sIHRoaXMucmVmZXJlbmNlTGlzdC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuXG4gIGVkaXRSZWNvcmQoZGF0YSwgaW5kZXgpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy5wQ29ubiRcbiAgICAgICAgLmdldEFjdGlvbnNBcGkoKVxuICAgICAgICAub3BlbkVtYmVkZGVkRGF0YU1vZGFsKFxuICAgICAgICAgIHRoaXMuYlVzZVNlcGFyYXRlVmlld0ZvckVkaXQgPyB0aGlzLmVkaXRWaWV3IDogdGhpcy5kZWZhdWx0VmlldyxcbiAgICAgICAgICB0aGlzLnBDb25uJCxcbiAgICAgICAgICB0aGlzLnJlZmVyZW5jZUxpc3RTdHIsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUkVTT1VSQ0VfU1RBVFVTLlVQREFURVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVJlY29yZChpbmRleCkge1xuICAgIGlmIChQQ29yZS5nZXRQQ29yZVZlcnNpb24oKT8uaW5jbHVkZXMoJzguNycpKSB7XG4gICAgICB0aGlzLnBDb25uJC5nZXRMaXN0QWN0aW9ucygpLmRlbGV0ZUVudHJ5KGluZGV4LCB0aGlzLnBhZ2VSZWZlcmVuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBAdHMtaWdub3JlIC0gc2Vjb25kIHBhcmFtZXRlciBcInBhZ2VSZWZcIiBpcyBvcHRpb25hbCBmb3IgZGVsZXRlRW50cnkgbWV0aG9kXG4gICAgICB0aGlzLnBDb25uJC5nZXRMaXN0QWN0aW9ucygpLmRlbGV0ZUVudHJ5KGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBidWlsZEVsZW1lbnRzRm9yVGFibGUoKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCk7XG4gICAgY29uc3QgZWxlRGF0YTogYW55ID0gW107XG4gICAgdGhpcy5yZWZlcmVuY2VMaXN0LmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBkYXRhOiBhbnkgPSBbXTtcbiAgICAgIHRoaXMucmF3RmllbGRzPy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VMaXN0RGF0YSA9IGdldFJlZmVyZW5jZUxpc3QodGhpcy5wQ29ubiQpO1xuICAgICAgICBjb25zdCBpc0RhdGFwYWdlID0gcmVmZXJlbmNlTGlzdERhdGEuc3RhcnRzV2l0aCgnRF8nKTtcbiAgICAgICAgY29uc3QgcGFnZVJlZmVyZW5jZVZhbHVlID0gaXNEYXRhcGFnZVxuICAgICAgICAgID8gYCR7cmVmZXJlbmNlTGlzdERhdGF9WyR7aW5kZXh9XWBcbiAgICAgICAgICA6IGAke3RoaXMucENvbm4kLmdldFBhZ2VSZWZlcmVuY2UoKX0ke3JlZmVyZW5jZUxpc3REYXRhLnN1YnN0cmluZyhyZWZlcmVuY2VMaXN0RGF0YS5sYXN0SW5kZXhPZignLicpKX1bJHtpbmRleH1dYDtcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgIG1ldGE6IGl0ZW0sXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIHBhZ2VSZWZlcmVuY2U6IHBhZ2VSZWZlcmVuY2VWYWx1ZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZUxpc3Q6IHJlZmVyZW5jZUxpc3REYXRhLFxuICAgICAgICAgICAgaGFzRm9ybTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdmlldyA9IFBDb3JlLmNyZWF0ZVBDb25uZWN0KGNvbmZpZyk7XG4gICAgICAgIGRhdGEucHVzaCh2aWV3KTtcbiAgICAgIH0pO1xuICAgICAgZWxlRGF0YS5wdXNoKGRhdGEpO1xuICAgIH0pO1xuICAgIHRoaXMuZWxlbWVudHNEYXRhID0gZWxlRGF0YTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImJWaXNpYmxlJFwiPlxuICA8ZGl2IGNsYXNzPVwic2ltcGxlLXRhYmxlLXdyYXBwZXJcIj5cbiAgICA8aDMgKm5nSWY9XCJsYWJlbFwiIGNsYXNzTmFtZT1cImxhYmVsXCIgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZFwiPlxuICAgICAge3sgbGFiZWwgfX0gPHNwYW4gY2xhc3M9XCJyZXN1bHRzLWNvdW50XCI+e3sgZ2V0UmVzdWx0c1RleHQoKSB9fTwvc3Bhbj5cbiAgICA8L2gzPlxuICAgIDx0YWJsZSAqbmdJZj1cInJlYWRPbmx5TW9kZSB8fCBhbGxvd0VkaXRpbmdJbk1vZGFsXCIgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInJvd0RhdGFcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejhcIiBpZD1cInJlYWRvbmx5LXRhYmxlXCIgbWF0U29ydD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgcHJvY2Vzc2VkRmllbGRzXCIgW21hdENvbHVtbkRlZl09XCJkQ29sLmNvbmZpZy5uYW1lXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIChjbGljayk9XCJfaGVhZGVyU29ydENsaWNrKCRldmVudCwgZENvbClcIiBhcnJvd1Bvc2l0aW9uPVwiYmVmb3JlXCI+XG4gICAgICAgICAgPGRpdj57eyBkQ29sLmNvbmZpZy5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1hdC1oZWFkZXItZmlsdGVyXCI+XG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1maWx0ZXItc3ZnLWljb25cIiBuYW1lPVwiZmlsdGVyT25JY29uXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJncm91cE1lbnVcIj5cbiAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgbWVudVN2Z0ljb24kIH19XCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1tZW51ICNncm91cE1lbnU+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2dyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+R3JvdXAgQnk8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiX3Nob3dVbkdyb3VwQnkoZENvbCkgJiYgYkdyb3VwaW5nJFwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIl91bkdyb3VwQnkoJGV2ZW50LCBkQ29sKVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWxpc3Qtdmlldy1zdmctaWNvblwiIHNyYz1cInt7IGdyb3VwQnlTdmdJY29uJCB9fVwiIC8+PHNwYW4+VW5ncm91cDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX2ZpbHRlcigkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZmlsdGVyU3ZnSWNvbiQgfX1cIiAvPjxzcGFuPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnRbZENvbC5jb25maWcubmFtZV0gfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkRlbGV0ZUljb25cIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImFsbG93RWRpdGluZ0luTW9kYWxcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGluZGV4IGFzIGpcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItaWNvblwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidXRpbGl0eU1lbnVcIj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay11dGlsaXR5LWNhcmQtYWN0aW9ucy1zdmctaWNvblwiIHNyYz1cInt7IHNldHRpbmdzU3ZnSWNvbiQgfX1cIiAvPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPG1hdC1tZW51ICN1dGlsaXR5TWVudT1cIm1hdE1lbnVcIiBvdmVybGFwVHJpZ2dlcj1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJlZGl0UmVjb3JkKGVsZW1lbnQsIGopXCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlUmVjb3JkKGopXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICA8L3RhYmxlPlxuICAgIDx0YWJsZSAqbmdJZj1cImVkaXRhYmxlTW9kZSAmJiAhYWxsb3dFZGl0aW5nSW5Nb2RhbFwiIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJlbGVtZW50c0RhdGFcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejhcIiBpZD1cImVkaXRhYmxlLXRhYmxlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkQ29sIG9mIGZpZWxkRGVmczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZENvbC5uYW1lICE9ICdEZWxldGVJY29uJ1wiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5uYW1lXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInBzZGstbWF0LWhlYWRlclwiPnt7IGRDb2wubGFiZWwgfX08L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8Y29tcG9uZW50LW1hcHBlclxuICAgICAgICAgICAgICBbbmFtZV09XCJlbGVtZW50W2ldLmdldFBDb25uZWN0KCkuZ2V0Q29tcG9uZW50TmFtZSgpXCJcbiAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICBwQ29ubiQ6IGVsZW1lbnRbaV0uZ2V0UENvbm5lY3QoKSxcbiAgICAgICAgICAgICAgICBmb3JtR3JvdXAkOiBmb3JtR3JvdXAkXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICBlcnJvck1zZz1cIlRhYmxlIHdhbnRzIGNvbXBvbmVudCBub3QgeWV0IGF2YWlsYWJsZToge3sgZWxlbWVudFtpXS5nZXRQQ29ubmVjdCgpLmdldENvbXBvbmVudE5hbWUoKSB9fVwiXG4gICAgICAgICAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkRlbGV0ZUljb25cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgaW5kZXggYXMgalwiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkZWxldGUtYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJkZWxldGVSZWNvcmQoailcIj5cbiAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLXV0aWxpdHktY2FyZC1hY3Rpb24tc3ZnLWljb25cIiBzcmM9XCJ7eyBtZW51SWNvbk92ZXJyaWRlJCB9fVwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgPC90YWJsZT5cbiAgICA8ZGl2IGNsYXNzPVwicHNkay1uby1yZWNvcmRzXCIgaWQ9XCJuby1yZWNvcmRzXCIgKm5nSWY9XCJlZGl0YWJsZU1vZGUgJiYgcmVmZXJlbmNlTGlzdD8ubGVuZ3RoID09PSAwXCI+Tm8gUmVjb3JkcyBGb3VuZC48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHNkay1uby1yZWNvcmRzXCIgaWQ9XCJuby1yZWNvcmRzXCIgKm5nSWY9XCJyZWFkT25seU1vZGUgJiYgcm93RGF0YT8uZGF0YT8ubGVuZ3RoID09PSAwXCI+Tm8gUmVjb3JkcyBGb3VuZC48L2Rpdj5cbiAgPC9kaXY+XG4gIDxidXR0b24gKm5nSWY9XCJzaG93QWRkUm93QnV0dG9uXCIgbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTZweFwiIChjbGljayk9XCJhZGRSZWNvcmQoKVwiPisgQWRkPC9idXR0b24+XG48L25nLWNvbnRhaW5lcj5cblxuPCEtLSBwb3Agb3ZlcnMgZm9yIGZpbHRlcnMtLT5cbjxkaXYgKm5nSWY9XCJiU2hvd0ZpbHRlclBvcG92ZXIkXCIgY2xhc3M9XCJwc2RrLWRpYWxvZy1iYWNrZ3JvdW5kXCI+XG4gIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWZpbGUtdG9wXCI+XG4gICAgPGg0PlxuICAgICAgRmlsdGVyOjxiPiB7eyBmaWx0ZXJDb250YWluc0xhYmVsJCB9fTwvYj5cbiAgICA8L2g0PlxuICAgIDxkaXYgKm5nSWY9XCJiQ29udGFpbnMkXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgPG1hdC1zZWxlY3QgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVHlwZSRcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIl9maWx0ZXJDb250YWluc1R5cGUoJGV2ZW50KVwiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiY29udGFpbnNcIj5Db250YWluczwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImVxdWFsc1wiPkVxdWFsczwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cInN0YXJ0c3dpdGhcIj5TdGFydHMgd2l0aDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiIChjaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVmFsdWUoJGV2ZW50KVwiIC8+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cImJEYXRlVGltZSRcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICA8bWF0LXNlbGVjdCBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNUeXBlJFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVHlwZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJub3RlcXVhbFwiPmlzIG5vdCBlcXVhbCB0bzwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImFmdGVyXCI+YWZ0ZXI8L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJiZWZvcmVcIj5iZWZvcmU8L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJudWxsXCI+aXMgbnVsbDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm5vdG51bGxcIj5pcyBub3QgbnVsbDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiYklzRGF0ZSQgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPT0gJ251bGwnICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT0gJ25vdG51bGwnXCIgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5EYXRlPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgI2RhdGVJbnB1dFxuICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBlZ2FkYXRlXCJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCJcbiAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNEYXRlVmFsdWUoJGV2ZW50LCBkYXRlSW5wdXQudmFsdWUpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwZWdhZGF0ZVwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BlZ2FkYXRlIFtzdGFydEF0XT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCI+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImJJc0RhdGVUaW1lJCAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9PSAnbnVsbCcgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPSAnbm90bnVsbCdcIiBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICA8bWF0LWxhYmVsPkRhdGUgdGltZTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNEYXRlVGltZVZhbHVlKCRldmVudClcIiAvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiYklzVGltZSQgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPT0gJ251bGwnICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT0gJ25vdG51bGwnXCIgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5UaW1lPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGltZVwiIFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1ZhbHVlJFwiIChjaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVGltZVZhbHVlKCRldmVudClcIiAvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxjb21wb25lbnQtbWFwcGVyXG4gICAgICBuYW1lPVwiQWN0aW9uQnV0dG9uc1wiXG4gICAgICBbcHJvcHNdPVwieyBhck1haW5CdXR0b25zJDogYXJGaWx0ZXJNYWluQnV0dG9ucyQsIGFyU2Vjb25kYXJ5QnV0dG9ucyQ6IGFyRmlsdGVyU2Vjb25kYXJ5QnV0dG9ucyQgfVwiXG4gICAgICBbcGFyZW50XT1cInRoaXNcIlxuICAgICAgW291dHB1dEV2ZW50c109XCJ7IGFjdGlvbkJ1dHRvbkNsaWNrOiBfb25GaWx0ZXJBY3Rpb25CdXR0b25DbGljayB9XCJcbiAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
789
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXRhYmxlLW1hbnVhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvdGVtcGxhdGUvc2ltcGxlLXRhYmxlLW1hbnVhbC9zaW1wbGUtdGFibGUtbWFudWFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy90ZW1wbGF0ZS9zaW1wbGUtdGFibGUtbWFudWFsL3NpbXBsZS10YWJsZS1tYW51YWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseUNBQXlDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxF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Q0FBQztJQUM5QixDQUFDOytHQTM0QlUsMEJBQTBCO21HQUExQiwwQkFBMEIsaUxBQzFCLE9BQU8sZ0RDL0VwQixtb1BBbUpBLG0rRURsRkksWUFBWSxvWEFDWixjQUFjLDY3Q0FDZCxlQUFlLDZoQkFDZixhQUFhLHNrQkFDYixhQUFhLDJpQkFDYixrQkFBa0IsdWtCQUNsQixtQkFBbUIsZ3FCQUNuQixlQUFlLHlNQUNmLGVBQWUsMFNBQ2YsY0FBYywwYkFDRyx3QkFBd0I7OzRGQUdoQywwQkFBMEI7a0JBbkJ0QyxTQUFTOytCQUNFLHlCQUF5QixjQUd2QixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixjQUFjO3dCQUNkLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixhQUFhO3dCQUNiLGtCQUFrQjt3QkFDbEIsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7cUJBQzNDOytKQUdtQixJQUFJO3NCQUF2QixTQUFTO3VCQUFDLE9BQU87Z0JBRVQsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIGZvcndhcmRSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbCc7XG5cbmltcG9ydCB7IENvbXBvbmVudE1hcHBlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL19icmlkZ2UvY29tcG9uZW50LW1hcHBlci9jb21wb25lbnQtbWFwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbmd1bGFyUENvbm5lY3REYXRhLCBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9hbmd1bGFyLXBjb25uZWN0JztcbmltcG9ydCB7IERhdGFwYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19zZXJ2aWNlcy9kYXRhcGFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IGdldFJlZmVyZW5jZUxpc3QgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy9maWVsZC1ncm91cC11dGlscyc7XG5pbXBvcnQgeyBidWlsZEZpZWxkc0ZvclRhYmxlLCBmaWx0ZXJEYXRhQnlDb21tb25GaWVsZHMsIGZpbHRlckRhdGFCeURhdGUsIGdldENvbnRleHQgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy91dGlscyc7XG5pbXBvcnQgeyBnZXRTZWNvbmRzIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvY29tbW9uJztcblxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IGFueTtcblxuaW50ZXJmYWNlIFNpbXBsZVRhYmxlTWFudWFsUHJvcHMge1xuICAvLyBJZiBhbnksIGVudGVyIGFkZGl0aW9uYWwgcHJvcHMgdGhhdCBvbmx5IGV4aXN0IG9uIHRoaXMgY29tcG9uZW50XG4gIHZpc2liaWxpdHk/OiBib29sZWFuO1xuICBncm91cGluZz86IGFueTtcbiAgcmVmZXJlbmNlTGlzdD86IGFueVtdO1xuICBjaGlsZHJlbj86IGFueVtdO1xuICByZW5kZXJNb2RlPzogc3RyaW5nO1xuICBwcmVzZXRzPzogYW55W107XG4gIGxhYmVsPzogc3RyaW5nO1xuICBzaG93TGFiZWw/OiBib29sZWFuO1xuICBkYXRhUGFnZU5hbWU/OiBzdHJpbmc7XG4gIGNvbnRleHRDbGFzcz86IHN0cmluZztcbiAgcHJvcGVydHlMYWJlbD86IHN0cmluZztcbiAgZmllbGRNZXRhZGF0YT86IGFueTtcbiAgYWxsb3dUYWJsZUVkaXQ/OiBib29sZWFuO1xuICBlZGl0TW9kZT86IHN0cmluZztcbiAgYWRkQW5kRWRpdFJvd3NXaXRoaW4/OiBhbnk7XG4gIHZpZXdGb3JBZGRBbmRFZGl0TW9kYWw/OiBhbnk7XG4gIGVkaXRNb2RlQ29uZmlnPzogYW55O1xuICBkaXNwbGF5TW9kZT86IHN0cmluZztcbiAgdXNlU2VwYXJhdGVWaWV3Rm9yRWRpdDogYW55O1xuICB2aWV3Rm9yRWRpdE1vZGFsOiBhbnk7XG59XG5cbmNsYXNzIEdyb3VwIHtcbiAgbGV2ZWwgPSAwO1xuICBwYXJlbnQ6IEdyb3VwO1xuICBleHBhbmRlZCA9IHRydWU7XG4gIHRvdGFsQ291bnRzID0gMDtcbiAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnBhcmVudCB8fCAodGhpcy5wYXJlbnQudmlzaWJsZSAmJiB0aGlzLnBhcmVudC5leHBhbmRlZCk7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNpbXBsZS10YWJsZS1tYW51YWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2ltcGxlLXRhYmxlLW1hbnVhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NpbXBsZS10YWJsZS1tYW51YWwuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRUYWJsZU1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0U29ydE1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICAgIE1hdE9wdGlvbk1vZHVsZSxcbiAgICBNYXRTZWxlY3RNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgZm9yd2FyZFJlZigoKSA9PiBDb21wb25lbnRNYXBwZXJDb21wb25lbnQpXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU2ltcGxlVGFibGVNYW51YWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydDogTWF0U29ydDtcblxuICBASW5wdXQoKSBwQ29ubiQ6IHR5cGVvZiBQQ29ubmVjdDtcbiAgQElucHV0KCkgZm9ybUdyb3VwJDogRm9ybUdyb3VwO1xuXG4gIC8vIFVzZWQgd2l0aCBBbmd1bGFyUENvbm5lY3RcbiAgYW5ndWxhclBDb25uZWN0RGF0YTogQW5ndWxhclBDb25uZWN0RGF0YSA9IHt9O1xuICBjb25maWdQcm9wcyQ6IFNpbXBsZVRhYmxlTWFudWFsUHJvcHM7XG4gIGZpZWxkcyQ6IGFueVtdO1xuXG4gIGJWaXNpYmxlJCA9IHRydWU7XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gIHJvd0RhdGE6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xuICBvcmlnaW5hbERhdGE6IGFueVtdID0gW107XG4gIHByb2Nlc3NlZEZpZWxkczogYW55W10gPSBbXTtcbiAgZmllbGREZWZzOiBhbnlbXSA9IFtdO1xuICByZXF1ZXN0ZWRSZWFkT25seU1vZGUgPSBmYWxzZTtcbiAgcmVhZE9ubHlNb2RlID0gZmFsc2U7XG4gIGVkaXRhYmxlTW9kZTogYm9vbGVhbjtcbiAgbWVudUljb25PdmVycmlkZSQ6IHN0cmluZztcbiAgcGFnZVJlZmVyZW5jZTogc3RyaW5nO1xuICByZWZlcmVuY2VMaXN0OiBhbnk7XG4gIGNvbnRleHRDbGFzczogYW55O1xuICBzaG93QWRkUm93QnV0dG9uOiBib29sZWFuO1xuICBwcmV2UmVmZXJlbmNlTGlzdDogYW55W10gPSBbXTtcbiAgZWxlbWVudHNEYXRhOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcbiAgcmF3RmllbGRzOiBhbnk7XG4gIGxhYmVsPzogc3RyaW5nID0gJyc7XG4gIHNlYXJjaEljb24kOiBzdHJpbmc7XG5cbiAgYlNob3dTZWFyY2gkID0gZmFsc2U7XG4gIGJDb2x1bW5SZW9yZGVyJCA9IGZhbHNlO1xuICBiR3JvdXBpbmckID0gZmFsc2U7XG5cbiAgcGVyZkZpbHRlcjogc3RyaW5nO1xuICBzZWFyY2hGaWx0ZXI6IHN0cmluZztcblxuICBtZW51U3ZnSWNvbiQ6IHN0cmluZztcbiAgYXJyb3dTdmdJY29uJCA9ICcnO1xuICBhcnJvd0Rvd25TdmdJY29uJDogc3RyaW5nO1xuICBhcnJvd1VwU3ZnSWNvbiQ6IHN0cmluZztcblxuICBmaWx0ZXJTdmdJY29uJDogc3RyaW5nO1xuICBmaWx0ZXJPblN2Z0ljb24kOiBzdHJpbmc7XG4gIGdyb3VwQnlTdmdJY29uJDogc3RyaW5nO1xuXG4gIGdyb3VwQnlDb2x1bW5zJDogc3RyaW5nW10gPSBbXTtcbiAgY29tcGFyZVR5cGU6IHN0cmluZztcbiAgY29tcGFyZVJlZjogc3RyaW5nO1xuICBhcnJvd0RpcmVjdGlvbiA9ICdkb3duJztcbiAgZmlsdGVyQnlDb2x1bW5zOiBhbnlbXSA9IFtdO1xuICBjdXJyZW50RmlsdGVyUmVmRGF0YTogYW55O1xuICBmaWx0ZXJDb250YWluc0xhYmVsJCA9ICcnO1xuICBmaWx0ZXJDb250YWluc1R5cGUkID0gJ2NvbnRhaW5zJztcbiAgZmlsdGVyQ29udGFpbnNWYWx1ZSQ6IGFueTtcbiAgYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuICBiQ29udGFpbnMkID0gdHJ1ZTtcbiAgYkRhdGVUaW1lJCA9IGZhbHNlO1xuXG4gIGJJc0RhdGUkID0gZmFsc2U7XG4gIGJJc0RhdGVUaW1lJCA9IGZhbHNlO1xuICBiSXNUaW1lJCA9IGZhbHNlO1xuICBjdXJyZW50RmlsdGVySW1hZ2VFbDogYW55O1xuXG4gIGFyRmlsdGVyTWFpbkJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuICBhckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuICBzZWxlY3Rpb25Nb2RlOiBzdHJpbmc7XG4gIHNpbmdsZVNlbGVjdGlvbk1vZGU6IGJvb2xlYW47XG4gIG11bHRpU2VsZWN0aW9uTW9kZTogYm9vbGVhbjtcbiAgcm93SUQ6IGFueTtcbiAgcmVzcG9uc2U6IGFueTtcbiAgY29tcG9zaXRlS2V5czogYW55O1xuICBwYXJhbWV0ZXJzOiBhbnk7XG4gIGFsbG93RWRpdGluZ0luTW9kYWwgPSBmYWxzZTtcbiAgZGVmYXVsdFZpZXc6IGFueTtcbiAgcmVmZXJlbmNlTGlzdFN0cjogYW55O1xuICBiVXNlU2VwYXJhdGVWaWV3Rm9yRWRpdDogYW55O1xuICBlZGl0VmlldzogYW55O1xuICBzZXR0aW5nc1N2Z0ljb24kOiBzdHJpbmc7XG5cbiAgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYW5ndWxhclBDb25uZWN0OiBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbHM6IFV0aWxzLFxuICAgIHByaXZhdGUgZGF0YVBhZ2VTZXJ2aWNlOiBEYXRhcGFnZVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgLy8gRmlyc3QgdGhpbmcgaW4gaW5pdGlhbGl6YXRpb24gaXMgcmVnaXN0ZXJpbmcgYW5kIHN1YnNjcmliaW5nIHRvIHRoZSBBbmd1bGFyUENvbm5lY3Qgc2VydmljZVxuICAgIHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YSA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnJlZ2lzdGVyQW5kU3Vic2NyaWJlQ29tcG9uZW50KHRoaXMsIHRoaXMub25TdGF0ZUNoYW5nZSk7XG4gICAgdGhpcy5jb25maWdQcm9wcyQgPSB0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpIGFzIFNpbXBsZVRhYmxlTWFudWFsUHJvcHM7XG4gICAgLy8gVGhlbiwgY29udGludWUgb24gd2l0aCBvdGhlciBpbml0aWFsaXphdGlvblxuICAgIHRoaXMubWVudUljb25PdmVycmlkZSQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCd0cmFzaCcsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgICAvLyBjYWxsIGNoZWNrQW5kVXBkYXRlIHdoZW4gaW5pdGlhbGl6aW5nXG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICAgIHRoaXMuZmlsdGVyU3ZnSWNvbiQgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdmaWx0ZXInLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5maWx0ZXJPblN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnZmlsdGVyLW9uJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuZ3JvdXBCeVN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygncm93JywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuICAgIHRoaXMuYkdyb3VwaW5nJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKHRoaXMuY29uZmlnUHJvcHMkLmdyb3VwaW5nKTtcbiAgICB0aGlzLm1lbnVTdmdJY29uJCA9IHRoaXMudXRpbHMuZ2V0SW1hZ2VTcmMoJ21vcmUnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG5cbiAgICB0aGlzLmFyRmlsdGVyTWFpbkJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ3N1Ym1pdCcsIGpzQWN0aW9uOiAnc3VibWl0JywgbmFtZTogJ1N1Ym1pdCcgfSk7XG4gICAgdGhpcy5hckZpbHRlclNlY29uZGFyeUJ1dHRvbnMkLnB1c2goeyBhY3Rpb25JRDogJ2NhbmNlbCcsIGpzQWN0aW9uOiAnY2FuY2VsJywgbmFtZTogJ0NhbmNlbCcgfSk7XG5cbiAgICB0aGlzLnNlYXJjaEljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnc2VhcmNoJywgdGhpcy51dGlscy5nZXRTREtTdGF0aWNDb250ZW50VXJsKCkpO1xuXG4gICAgdGhpcy5zZXR0aW5nc1N2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygnbW9yZScsIHRoaXMudXRpbHMuZ2V0U0RLU3RhdGljQ29udGVudFVybCgpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0FuZFVwZGF0ZSgpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGNoZWNrIHRoZSBicmlkZ2UgdG8gc2VlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkXG4gICAgLy8gdXBkYXRlIGl0c2VsZiAocmUtcmVuZGVyKVxuICAgIGNvbnN0IGJVcGRhdGVTZWxmID0gdGhpcy5hbmd1bGFyUENvbm5lY3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKHRoaXMpO1xuXG4gICAgLy8gT05MWSBjYWxsIHVwZGF0ZVNlbGYgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGVcbiAgICBpZiAoYlVwZGF0ZVNlbGYpIHtcbiAgICAgIHRoaXMudXBkYXRlU2VsZigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHVwZGF0ZVNlbGZcbiAgdXBkYXRlU2VsZigpOiB2b2lkIHtcbiAgICAvLyBtb3ZlZCB0aGlzIGZyb20gbmdPbkluaXQoKSBhbmQgY2FsbCB0aGlzIGZyb20gdGhlcmUgaW5zdGVhZC4uLlxuICAgIHRoaXMuY29uZmlnUHJvcHMkID0gdGhpcy5wQ29ubiQucmVzb2x2ZUNvbmZpZ1Byb3BzKHRoaXMucENvbm4kLmdldENvbmZpZ1Byb3BzKCkpIGFzIFNpbXBsZVRhYmxlTWFudWFsUHJvcHM7XG5cbiAgICBpZiAodGhpcy5jb25maWdQcm9wcyQudmlzaWJpbGl0eSAhPSBudWxsKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbXVsdGktYXNzaWduXG4gICAgICB0aGlzLmJWaXNpYmxlJCA9IHRoaXMuYlZpc2libGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUodGhpcy5jb25maWdQcm9wcyQudmlzaWJpbGl0eSk7XG4gICAgfVxuXG4gICAgLy8gTk9URTogZ2V0Q29uZmlnUHJvcHMoKSBoYXMgZWFjaCBjaGlsZC5jb25maWcgd2l0aCBkYXRhc291cmNlIGFuZCB2YWx1ZSB1bmRlZmluZWRcbiAgICAvLyAgYnV0IGdldFJhd01ldGFkYXRhKCkgaGFzIGVhY2ggY2hpbGQuY29uZmlnIHdpdGggZGF0YXNvdXJjZSBhbmQgdmFsdWUgc2hvd2luZyB0aGVpciB1bnJlc29sdmVkIHZhbHVlcyAoZXg6IFwiQFAgdGhlUHJvcE5hbWVcIilcbiAgICAvLyAgV2UgbmVlZCB0byB1c2UgdGhlIHByb3AgbmFtZSBhcyB0aGUgXCJnbHVlXCIgdG8gdGllIHRoZSBBbmd1bGFyIE1hdGVyaWFsIHRhYmxlIGRhdGFTb3VyY2UsIGRpc3BsYXlDb2x1bW5zIGFuZCBkYXRhIHRvZ2V0aGVyLlxuICAgIC8vICBTbywgaW4gdGhlIGNvZGUgYmVsb3csIHdlJ2xsIHVzZSB0aGUgdW5yZXNvbHZlZCBjb25maWcudmFsdWUgKGJ1dCByZXBsYWNpbmcgdGhlIHNwYWNlIHdpdGggYW4gdW5kZXJzY29yZSB0byBrZWVwIHRoaW5ncyBoYXBweSlcbiAgICBjb25zdCByYXdNZXRhZGF0YTogYW55ID0gdGhpcy5wQ29ubiQuZ2V0UmF3TWV0YWRhdGEoKTtcblxuICAgIC8vIEFkYXB0ZWQgZnJvbSBOZWJ1bGFcbiAgICBjb25zdCB7XG4gICAgICByZWZlcmVuY2VMaXN0ID0gW10sIC8vIGlmIHJlZmVyZW5jZUxpc3Qgbm90IGluIGNvbmZpZ1Byb3BzJCwgZGVmYXVsdCB0byBlbXB5IGxpc3RcbiAgICAgIHJlbmRlck1vZGUsXG4gICAgICBjaGlsZHJlbiwgLy8gZGVzdHJ1Y3R1cmUgY2hpbGRyZW4gaW50byBhbiBhcnJheSB2YXI6IFwicmVzb2x2ZWRGaWVsZHNcIlxuICAgICAgcHJlc2V0cyxcbiAgICAgIGFsbG93VGFibGVFZGl0LFxuICAgICAgbGFiZWw6IGxhYmVsUHJvcCxcbiAgICAgIHByb3BlcnR5TGFiZWwsXG4gICAgICBmaWVsZE1ldGFkYXRhLFxuICAgICAgZWRpdE1vZGUsXG4gICAgICBhZGRBbmRFZGl0Um93c1dpdGhpbixcbiAgICAgIHZpZXdGb3JBZGRBbmRFZGl0TW9kYWwsXG4gICAgICBlZGl0TW9kZUNvbmZpZyxcbiAgICAgIGRpc3BsYXlNb2RlLFxuICAgICAgdXNlU2VwYXJhdGVWaWV3Rm9yRWRpdCxcbiAgICAgIHZpZXdGb3JFZGl0TW9kYWxcbiAgICB9ID0gdGhpcy5jb25maWdQcm9wcyQ7XG5cbiAgICB0aGlzLnJlZmVyZW5jZUxpc3RTdHIgPSBnZXRDb250ZXh0KHRoaXMucENvbm4kKS5yZWZlcmVuY2VMaXN0U3RyO1xuICAgIHRoaXMubGFiZWwgPSBsYWJlbFByb3AgfHwgcHJvcGVydHlMYWJlbDtcbiAgICB0aGlzLnBhcmFtZXRlcnMgPSBmaWVsZE1ldGFkYXRhPy5kYXRhc291cmNlPy5wYXJhbWV0ZXJzO1xuXG4gICAgY29uc3QgaGlkZUFkZFJvdyA9IGFsbG93VGFibGVFZGl0ID09PSBmYWxzZTtcbiAgICBjb25zdCBoaWRlRGVsZXRlUm93ID0gYWxsb3dUYWJsZUVkaXQgPT09IGZhbHNlO1xuICAgIGxldCB7IGNvbnRleHRDbGFzcyB9ID0gdGhpcy5jb25maWdQcm9wcyQ7XG4gICAgdGhpcy5yZWZlcmVuY2VMaXN0ID0gcmVmZXJlbmNlTGlzdDtcbiAgICBpZiAoIWNvbnRleHRDbGFzcykge1xuICAgICAgLy8gQHRzLWlnbm9yZSAtIFByb3BlcnR5ICdnZXRDb21wb25lbnRDb25maWcnIGlzIHByaXZhdGUgYW5kIG9ubHkgYWNjZXNzaWJsZSB3aXRoaW4gY2xhc3MgJ0MxMW5FbnYnXG4gICAgICBsZXQgbGlzdE5hbWUgPSB0aGlzLnBDb25uJC5nZXRDb21wb25lbnRDb25maWcoKS5yZWZlcmVuY2VMaXN0O1xuICAgICAgbGlzdE5hbWUgPSBQQ29yZS5nZXRBbm5vdGF0aW9uVXRpbHMoKS5nZXRQcm9wZXJ0eU5hbWUobGlzdE5hbWUpO1xuICAgICAgLy8gQHRzLWlnbm9yZSAtIFByb3BlcnR5ICdnZXRGaWVsZE1ldGFkYXRhJyBpcyBwcml2YXRlIGFuZCBvbmx5IGFjY2Vzc2libGUgd2l0aGluIGNsYXNzICdDMTFuRW52J1xuICAgICAgY29udGV4dENsYXNzID0gdGhpcy5wQ29ubiQuZ2V0RmllbGRNZXRhZGF0YShsaXN0TmFtZSk/LnBhZ2VDbGFzcztcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0Q2xhc3MgPSBjb250ZXh0Q2xhc3M7XG5cbiAgICBjb25zdCByZXNvbHZlZEZpZWxkcyA9IGNoaWxkcmVuPy5bMF0/LmNoaWxkcmVuIHx8IHByZXNldHM/LlswXS5jaGlsZHJlbj8uWzBdLmNoaWxkcmVuO1xuICAgIC8vIGdldCByYXcgY29uZmlnIGFzIEBQIGFuZCBvdGhlciBhbm5vdGF0aW9ucyBhcmUgcHJvY2Vzc2VkIGFuZCBkb24ndCBhcHBlYXIgaW4gdGhlIHJlc29sdmVkIGNvbmZpZy5cbiAgICAvLyAgRGVzdHJ1Y3R1cmUgXCJyYXdcIiBjaGlsZHJlbiBpbnRvIGFycmF5IHZhcjogXCJyYXdGaWVsZHNcIlxuICAgIC8vICBOT1RFOiB3aGVuIGNvbmZpZy5saXN0VHlwZSA9PSBcImFzc29jaWF0ZWRcIiwgdGhlIHByb3BlcnR5IGNhbiBiZSBmb3VuZCBpbiBlaXRoZXJcbiAgICAvLyAgICBjb25maWcudmFsdWUgKGV4OiBcIkBQIC5EZWNsYXJhbnRDaG9pY2VcIikgb3JcbiAgICAvLyAgICBjb25maWcuZGF0YXNvdXJjZSAoZXg6IFwiQEFTU09DSUFURUQgLkRlY2xhcmFudENob2ljZVwiKVxuICAgIC8vICBOZWl0aGVyIG9mIHRoZXNlIGFwcGVhciBpbiB0aGUgcmVzb2x2ZWQgKHRoaXMuY29uZmlnUHJvcHMkKVxuICAgIGNvbnN0IHJhd0NvbmZpZyA9IHJhd01ldGFkYXRhPy5jb25maWc7XG4gICAgY29uc3QgcmF3RmllbGRzID0gcmF3Q29uZmlnPy5jaGlsZHJlbj8uWzBdPy5jaGlsZHJlbiB8fCByYXdDb25maWc/LnByZXNldHM/LlswXS5jaGlsZHJlbj8uWzBdPy5jaGlsZHJlbjtcbiAgICB0aGlzLnJhd0ZpZWxkcyA9IHJhd0ZpZWxkcztcbiAgICAvLyBBdCB0aGlzIHBvaW50LCBmaWVsZHMgaGFzIHJlc29sdmVkRmllbGRzIGFuZCByYXdGaWVsZHMgd2UgY2FuIHVzZVxuXG4gICAgLy8gc3RhcnQgb2YgZnJvbSBOZWJ1bGFcbiAgICAvLyBnZXQgY29udGV4dCBuYW1lIGFuZCByZWZlcmVuY2VMaXN0IHdoaWNoIHdpbGwgYmUgdXNlZCB0byBwcmVwYXJlIGNvbmZpZyBvZiBQQ29ubmVjdFxuICAgIC8vIGNvbnN0IHsgY29udGV4dE5hbWUsIHJlZmVyZW5jZUxpc3RTdHIsIHBhZ2VSZWZlcmVuY2VGb3JSb3dzIH0gPSBnZXRDb250ZXh0KHRoaXMucENvbm4kKTtcblxuICAgIGNvbnN0IHJlc29sdmVkTGlzdCA9IGdldFJlZmVyZW5jZUxpc3QodGhpcy5wQ29ubiQpO1xuICAgIHRoaXMucGFnZVJlZmVyZW5jZSA9IGAke3RoaXMucENvbm4kLmdldFBhZ2VSZWZlcmVuY2UoKX0ke3Jlc29sdmVkTGlzdH1gO1xuICAgIHRoaXMucENvbm4kLnNldFJlZmVyZW5jZUxpc3QocmVzb2x2ZWRMaXN0KTtcblxuICAgIC8vIFRoaXMgZ2l2ZXMgdXAgdGhlIFwicHJvcGVydGllc1wiIHdlIG5lZWQgdG8gbWFwIHRvIHJvdy9jb2x1bW4gdmFsdWVzIGxhdGVyXG4gICAgLy8gY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHBvcHVsYXRlUm93S2V5KHJlZmVyZW5jZUxpc3QpO1xuXG4gICAgdGhpcy5yZXF1ZXN0ZWRSZWFkT25seU1vZGUgPSByZW5kZXJNb2RlID09PSAnUmVhZE9ubHknO1xuICAgIHRoaXMucmVhZE9ubHlNb2RlID0gcmVuZGVyTW9kZSA9PT0gJ1JlYWRPbmx5JztcbiAgICB0aGlzLmVkaXRhYmxlTW9kZSA9IHJlbmRlck1vZGUgPT09ICdFZGl0YWJsZSc7XG4gICAgY29uc3QgaXNEaXNwbGF5TW9kZUVuYWJsZWQgPSBkaXNwbGF5TW9kZSA9PT0gJ0RJU1BMQVlfT05MWSc7XG4gICAgdGhpcy5zaG93QWRkUm93QnV0dG9uID0gIXRoaXMucmVhZE9ubHlNb2RlICYmICFoaWRlQWRkUm93O1xuICAgIHRoaXMuYWxsb3dFZGl0aW5nSW5Nb2RhbCA9XG4gICAgICAoZWRpdE1vZGUgPyBlZGl0TW9kZSA9PT0gJ21vZGFsJyA6IGFkZEFuZEVkaXRSb3dzV2l0aGluID09PSAnbW9kYWwnKSAmJiAhKHJlbmRlck1vZGUgPT09ICdSZWFkT25seScgfHwgaXNEaXNwbGF5TW9kZUVuYWJsZWQpO1xuICAgIGNvbnN0IHNob3dEZWxldGVCdXR0b24gPSB0aGlzLmVkaXRhYmxlTW9kZSAmJiAhaGlkZURlbGV0ZVJvdztcbiAgICB0aGlzLmRlZmF1bHRWaWV3ID0gZWRpdE1vZGVDb25maWcgPyBlZGl0TW9kZUNvbmZpZy5kZWZhdWx0VmlldyA6IHZpZXdGb3JBZGRBbmRFZGl0TW9kYWw7XG4gICAgdGhpcy5iVXNlU2VwYXJhdGVWaWV3Rm9yRWRpdCA9IGVkaXRNb2RlQ29uZmlnID8gZWRpdE1vZGVDb25maWcudXNlU2VwYXJhdGVWaWV3Rm9yRWRpdCA6IHVzZVNlcGFyYXRlVmlld0ZvckVkaXQ7XG4gICAgdGhpcy5lZGl0VmlldyA9IGVkaXRNb2RlQ29uZmlnID8gZWRpdE1vZGVDb25maWcuZWRpdFZpZXcgOiB2aWV3Rm9yRWRpdE1vZGFsO1xuICAgIC8vIGNvbnN0IHNob3dEZWxldGVCdXR0b24gPSAhdGhpcy5yZWFkT25seU1vZGUgJiYgIWhpZGVEZWxldGVSb3c7XG5cbiAgICAvLyBOZWJ1bGEgaGFzIG90aGVyIGhhbmRsaW5nIGZvciBpc1JlYWRPbmx5TW9kZSBidXQgaGFzIENvc21vcy1zcGVjaWZpYyBjb2RlXG4gICAgLy8gIHNvIGlnbm9yaW5nIHRoYXQgZm9yIG5vdy4uLlxuICAgIC8vIGZpZWxkRGVmcyB3aWxsIGJlIGFuIGFycmF5IHdoZXJlIGVhY2ggZW50cnkgd2lsbCBoYXZlIGEgXCJuYW1lXCIgd2hpY2ggd2lsbCBiZSB0aGVcbiAgICAvLyAgXCJyZXNvbHZlZFwiIHByb3BlcnR5IG5hbWUgKHRoYXQgd2UgY2FuIHVzZSBhcyB0aGUgY29sSWQpIHRob3VnaCBpdCdzIG5vdCByZWFsbHlcbiAgICAvLyAgcmVzb2x2ZWQuIFRoZSBidWlsZEZpZWxkc0ZvclRhYmxlIGhlbHBlciBqdXN0IHJlbW92ZXMgdGhlIFwiQFAgXCIgKHdoaWNoIGlzIHdoYXRcbiAgICAvLyAgTmVidWxhIGRvZXMpLiBJdCB3aWxsIGFsc28gaGF2ZSB0aGUgXCJsYWJlbFwiLCBhbmQgXCJtZXRhXCIgY29udGFpbnMgdGhlIG9yaWdpbmFsLFxuICAgIC8vICB1bmNoYW5nZWQgY29uZmlnIGluZm8uIEZvciBub3csIG11Y2ggb2YgdGhlIGluZm8gaGVyZSBpcyBjYXJyaWVkIG92ZXIgZnJvbVxuICAgIC8vICBOZWJ1bGEgYW5kIHdlIG1heSBub3QgZW5kIHVwIHVzaW5nIGl0IGFsbC5cbiAgICB0aGlzLmZpZWxkRGVmcyA9IGJ1aWxkRmllbGRzRm9yVGFibGUocmF3RmllbGRzLCByZXNvbHZlZEZpZWxkcywgc2hvd0RlbGV0ZUJ1dHRvbik7XG5cbiAgICB0aGlzLmluaXRpYWxpemVEZWZhdWx0UGFnZUluc3RydWN0aW9ucygpO1xuXG4gICAgLy8gZW5kIG9mIGZyb20gTmVidWxhXG5cbiAgICAvLyBIZXJlLCB3ZSB1c2UgdGhlIFwibmFtZVwiIGZpZWxkIGluIGZpZWxkRGVmcyBzaW5jZSB0aGF0IGhhcyB0aGUgYXNzb2ljYXRlZCBwcm9wZXJ0eVxuICAgIC8vICAoaWYgb25lIGV4aXN0cyBmb3IgdGhlIGZpZWxkKS4gSWYgbm8gXCJuYW1lXCIsIHVzZSBcImNlbGxSZW5kZXJlclwiICh0eXBpY2FsbHkgZ2V0IERFTEVURV9JQ09OKVxuICAgIC8vICBmb3Igb3VyIGNvbHVtbnMuXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5maWVsZERlZnM/Lm1hcChmaWVsZCA9PiB7XG4gICAgICByZXR1cm4gZmllbGQubmFtZSA/IGZpZWxkLm5hbWUgOiBmaWVsZC5jZWxsUmVuZGVyZXI7XG4gICAgfSk7XG5cbiAgICAvLyBBbmQgbm93IHdlIGNhbiBwcm9jZXNzIHRoZSByZXNvbHZlZEZpZWxkcyB0byBhZGQgaW4gdGhlIFwibmFtZVwiXG4gICAgLy8gIGZyb20gZnJvbSB0aGUgZmllbGREZWZzLiBUaGlzIFwibmFtZVwiIGlzIHRoZSB2YWx1ZSB0aGF0XG4gICAgLy8gIHdlJ2xsIHNoYXJlIHRvIGNvbm5lY3QgdGhpbmdzIHRvZ2V0aGVyIGluIHRoZSB0YWJsZS5cblxuICAgIHRoaXMucHJvY2Vzc2VkRmllbGRzID0gW107XG5cbiAgICB0aGlzLnByb2Nlc3NlZEZpZWxkcyA9IHJlc29sdmVkRmllbGRzLm1hcCgoZmllbGQsIGkpID0+IHtcbiAgICAgIGZpZWxkLmNvbmZpZy5uYW1lID0gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zW2ldOyAvLyAuY29uZmlnW1widmFsdWVcIl0ucmVwbGFjZSgvIC4vZyxcIl9cIik7ICAgLy8gcmVwbGFjZSBzcGFjZSBkb3Qgd2l0aCB1bmRlcnNjb3JlXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfSk7XG5cbiAgICAvLyBmb3IgYWRkaW5nIHJvd3MgdG8gdGFibGUgd2hlbiBlZGl0YWJsZSBhbmQgbm90IG1vZGFsIHZpZXdcbiAgICBpZiAodGhpcy5wcmV2UmVmZXJlbmNlTGlzdC5sZW5ndGggIT09IHRoaXMucmVmZXJlbmNlTGlzdC5sZW5ndGggJiYgdGhpcy5lZGl0YWJsZU1vZGUgJiYgIXRoaXMuYWxsb3dFZGl0aW5nSW5Nb2RhbCkge1xuICAgICAgdGhpcy5idWlsZEVsZW1lbnRzRm9yVGFibGUoKTtcbiAgICB9XG5cbiAgICAvLyBmb3IgZWRpdCBhbmQgYWRkaW5nIHJvd3MgaW4gbW9kYWwgdmlldyBhbmQgdG8gZ2VuZXJhdGUgcmVhZG9ubHkgbGlzdFxuICAgIGlmICghaXNFcXVhbCh0aGlzLnByZXZSZWZlcmVuY2VMaXN0LCB0aGlzLnJlZmVyZW5jZUxpc3QpICYmICh0aGlzLnJlYWRPbmx5TW9kZSB8fCB0aGlzLmFsbG93RWRpdGluZ0luTW9kYWwpKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlUm93c0RhdGEoKTtcbiAgICB9XG5cbiAgICB0aGlzLnByZXZSZWZlcmVuY2VMaXN0ID0gdGhpcy5yZWZlcmVuY2VMaXN0O1xuXG4gICAgLy8gVGhlc2UgYXJlIHRoZSBkYXRhIHN0cnVjdHVyZXMgcmVmZXJyZWQgdG8gaW4gdGhlIGh0bWwgZmlsZS5cbiAgICAvLyAgVGhlc2UgYXJlIHRoZSByZWxhdGlvbnNoaXBzIHRoYXQgbWFrZSB0aGUgdGFibGUgd29ya1xuICAgIC8vICBkaXNwbGF5ZWRDb2x1bW5zOiBrZXkvdmFsdWUgcGFpcnMgd2hlcmUga2V5IGlzIG9yZGVyIG9mIGNvbHVtbiBhbmRcbiAgICAvLyAgICB2YWx1ZSBpcyB0aGUgcHJvcGVydHkgc2hvd24gaW4gdGhhdCBjb2x1bW4uIEV4OiAxOiBcIkZpcnN0TmFtZVwiXG4gICAgLy8gIHByb2Nlc3NlZEZpZWxkczoga2V5L3ZhbHVlIHBhaXJzIHdoZXJlIGVhY2gga2V5IGlzIG9yZGVyIG9mIGNvbHVtblxuICAgIC8vICAgIGFuZCBlYWNoIHZhbHVlIGlzIGFuIG9iamVjdCBvZiBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoYXRcbiAgICAvLyAgICBjb2x1bW4uXG4gICAgLy8gIHJvd0RhdGE6IGFycmF5IG9mIGVhY2ggcm93J3Mga2V5L3ZhbHVlIHBhaXJzLiBJbnNpZGUgZWFjaCByb3csXG4gICAgLy8gICAgZWFjaCBrZXkgaXMgYW4gZW50cnkgaW4gZGlzcGxheWVkQ29sdW1uczogZXg6IFwiRmlyc3ROYW1lXCI6IFwiQ2hhcmxlc1wiXG4gICAgLy8gICAgRXg6IHsgMToge2NvbmZpZzoge2xhYmVsOiBcIkZpcnN0IE5hbWVcIiwgcmVhZE9ubHk6IHRydWU6IG5hbWU6IFwiRmlyc3ROYW1lXCJ9fSwgdHlwZTogXCJUZXh0SW5wdXRcIiB9XG4gICAgLy8gICAgVGhlIFwidHlwZVwiIGluZGljYXRlcyB0aGUgdHlwZSBvZiBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgZWRpdGluZyAod2hlbiBlZGl0aW5nIGlzIGVuYWJsZWQpXG4gICAgLy9cbiAgICAvLyAgTm90ZSB0aGF0IHRoZSBcInByb3BlcnR5XCIgc2hvd24gaW4gdGhlIGNvbHVtbiAoXCJGaXJzdE5hbWVcIiBpbiB0aGUgYWJvdmUgZXhhbXBsZXMpIGlzIHdoYXRcbiAgICAvLyAgdGllcyB0aGUgMyBkYXRhIHN0cnVjdHVyZXMgdG9nZXRoZXIuXG4gIH1cblxuICBpbml0aWFsaXplRGVmYXVsdFBhZ2VJbnN0cnVjdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5hbGxvd0VkaXRpbmdJbk1vZGFsKSB7XG4gICAgICAgIHRoaXMucENvbm4kLmdldExpc3RBY3Rpb25zKCkuaW5pdERlZmF1bHRQYWdlSW5zdHJ1Y3Rpb25zKFxuICAgICAgICAgIHRoaXMucENvbm4kLmdldFJlZmVyZW5jZUxpc3QoKSxcbiAgICAgICAgICB0aGlzLmZpZWxkRGVmcy5maWx0ZXIoaXRlbSA9PiBpdGVtLm5hbWUpLm1hcChpdGVtID0+IGl0ZW0ubmFtZSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgLSBBbiBhcmd1bWVudCBmb3IgJ2ZpZWxkcycgd2FzIG5vdCBwcm92aWRlZFxuICAgICAgICB0aGlzLnBDb25uJC5nZXRMaXN0QWN0aW9ucygpLmluaXREZWZhdWx0UGFnZUluc3RydWN0aW9ucyh0aGlzLnBDb25uJC5nZXRSZWZlcmVuY2VMaXN0KCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFJlc3VsdHNUZXh0KCkge1xuICAgIGNvbnN0IHJlY29yZHNDb3VudCA9IHRoaXMucmVhZE9ubHlNb2RlID8gdGhpcy5yb3dEYXRhPy5kYXRhLmxlbmd0aCA6IHRoaXMucmVmZXJlbmNlTGlzdD8ubGVuZ3RoO1xuICAgIHJldHVybiBgJHtyZWNvcmRzQ291bnR9IHJlc3VsdCR7cmVjb3Jkc0NvdW50ID4gMSA/ICdzJyA6ICcnfWA7XG4gIH1cblxuICBzb3J0Q29tcGFyZShhLCBiKTogbnVtYmVyIHtcbiAgICBsZXQgYVZhbHVlID0gYVt0aGlzLmNvbXBhcmVSZWZdO1xuICAgIGxldCBiVmFsdWUgPSBiW3RoaXMuY29tcGFyZVJlZl07XG5cbiAgICBpZiAodGhpcy5jb21wYXJlVHlwZSA9PSAnRGF0ZScgfHwgdGhpcy5jb21wYXJlVHlwZSA9PSAnRGF0ZVRpbWUnKSB7XG4gICAgICBhVmFsdWUgPSBnZXRTZWNvbmRzKGFWYWx1ZSk7XG4gICAgICBiVmFsdWUgPSBnZXRTZWNvbmRzKGJWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29tcGFyZVJlZiA9PSAncHhSZWZPYmplY3RJbnNOYW1lJykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb21wYXJlQnlDb2x1bW5QeFJlZk9iamVjdEluc05hbWUoYVZhbHVlLCBiVmFsdWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICBzd2l0Y2ggKHRoaXMuYXJyb3dEaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgaWYgKCFhVmFsdWUgfHwgYVZhbHVlIDwgYlZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYlZhbHVlIHx8IGFWYWx1ZSA+IGJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgIGlmICghYlZhbHVlIHx8IGFWYWx1ZSA+IGJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFWYWx1ZSB8fCBhVmFsdWUgPCBiVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29tcGFyZUJ5Q29sdW1uUHhSZWZPYmplY3RJbnNOYW1lKGFWYWx1ZSwgYlZhbHVlKSB7XG4gICAgY29uc3QgcHJlZml4WCA9IGFWYWx1ZS5zcGxpdCgnLScpO1xuICAgIGNvbnN0IHByZWZpeFkgPSBiVmFsdWUuc3BsaXQoJy0nKTtcbiAgICBzd2l0Y2ggKHRoaXMuYXJyb3dEaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgaWYgKHByZWZpeFhbMF0gIT09IHByZWZpeFlbMF0pIHtcbiAgICAgICAgICBpZiAocHJlZml4WFswXSA8IHByZWZpeFlbMF0pIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAocHJlZml4WFswXSA+IHByZWZpeFlbMF0pIHJldHVybiAxO1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVmaXhYWzFdIC0gcHJlZml4WVsxXTtcbiAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICBpZiAocHJlZml4WFswXSAhPT0gcHJlZml4WVswXSkge1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdID4gcHJlZml4WVswXSkgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmIChwcmVmaXhYWzBdIDwgcHJlZml4WVswXSkgcmV0dXJuIDE7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZWZpeFlbMV0gLSBwcmVmaXhYWzFdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlckRpc3BsYXkodHlwZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdub3RlcXVhbCc7XG4gICAgICAgIHRoaXMuYkNvbnRhaW5zJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJEYXRlVGltZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGUkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNUaW1lJCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgdGhpcy5iQ29udGFpbnMkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYklzRGF0ZSQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iSXNEYXRlVGltZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc1RpbWUkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGltZSc6XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdub3RlcXVhbCc7XG4gICAgICAgIHRoaXMuYkNvbnRhaW5zJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJEYXRlVGltZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJJc0RhdGUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJCA9ICdjb250YWlucyc7XG4gICAgICAgIHRoaXMuYkNvbnRhaW5zJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYkRhdGVUaW1lJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJJc0RhdGUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzRGF0ZVRpbWUkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYklzVGltZSQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgX2ZpbHRlcihldmVudCwgY29sdW1uRGF0YSkge1xuICAgIC8vIGFkZCBjbGlja0F3YXkgbGlzdGVuZXJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEgPSBjb2x1bW5EYXRhO1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNMYWJlbCQgPSBjb2x1bW5EYXRhLmNvbmZpZy5sYWJlbDtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJEaXNwbGF5KGNvbHVtbkRhdGEudHlwZSk7XG5cbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyVmFyc1dpdGhDdXJyZW50KGNvbHVtbkRhdGEpO1xuXG4gICAgICB0aGlzLmJTaG93RmlsdGVyUG9wb3ZlciQgPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgX2NsaWNrQXdheShldmVudDogYW55KSB7XG4gICAgbGV0IGJJblBvcFVwID0gZmFsc2U7XG5cbiAgICAvLyBydW4gdGhyb3VnaCBsaXN0IG9mIGVsZW1lbnRzIGluIHBhdGgsIGlmIG1lbnUgbm90IGluIHRoIHBhdGgsIHRoZW4gd2FudCB0b1xuICAgIC8vIGhpZGUgKHRvZ2dsZSkgdGhlIG1lbnVcbiAgICBjb25zdCBldmVudFBhdGggPSBldmVudC5wYXRoO1xuICAgIGZvciAobGV0IGV2ZW50SW5kZXggPSAwOyBldmVudEluZGV4IDwgZXZlbnRQYXRoLmxlbmd0aDsgZXZlbnRJbmRleCsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGV2ZW50UGF0aFtldmVudEluZGV4XS5jbGFzc05hbWUgPT0gJ3BzZGstbW9kYWwtZmlsZS10b3AnIHx8XG4gICAgICAgIGV2ZW50UGF0aFtldmVudEluZGV4XS50YWdOYW1lID09ICdCVVRUT04nIHx8XG4gICAgICAgIGV2ZW50UGF0aFtldmVudEluZGV4XS50YWdOYW1lID09ICdNQVQtT1BUSU9OJyB8fFxuICAgICAgICBldmVudFBhdGhbZXZlbnRJbmRleF0udGFnTmFtZSA9PSAnTUFULUlOUFVUJ1xuICAgICAgKSB7XG4gICAgICAgIGJJblBvcFVwID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYkluUG9wVXApIHtcbiAgICAgIC8vIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNUeXBlKGV2ZW50KSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gZXZlbnQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNWYWx1ZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNEYXRlVmFsdWUoZXZlbnQsIHZhbHVlKSB7XG4gICAgdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJCA9IHZhbHVlO1xuICB9XG5cbiAgX2ZpbHRlckNvbnRhaW5zRGF0ZVRpbWVWYWx1ZShldmVudCkge1xuICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH1cblxuICBfZmlsdGVyQ29udGFpbnNUaW1lVmFsdWUoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgX29uRmlsdGVyQWN0aW9uQnV0dG9uQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIC8vIG1vZGFsIGJ1dHRvbnNcbiAgICBzd2l0Y2ggKGV2ZW50LmFjdGlvbikge1xuICAgICAgY2FzZSAnY2FuY2VsJzpcbiAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YSA9IFtdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyV2l0aEluZm8oKTtcbiAgICAgICAgdGhpcy5maWx0ZXJTb3J0R3JvdXBCeSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuYlNob3dGaWx0ZXJQb3BvdmVyJCA9IGZhbHNlO1xuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9jbGlja0F3YXkuYmluZCh0aGlzKSk7XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJXaXRoSW5mbygpIHtcbiAgICBsZXQgYkZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBmaWx0ZXJPYmogb2YgdGhpcy5maWx0ZXJCeUNvbHVtbnMpIHtcbiAgICAgIGlmIChmaWx0ZXJPYmoucmVmID09PSB0aGlzLmN1cnJlbnRGaWx0ZXJSZWZEYXRhLmNvbmZpZy5uYW1lKSB7XG4gICAgICAgIGZpbHRlck9iai50eXBlID0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS50eXBlO1xuICAgICAgICBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPSB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQ7XG4gICAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJDtcblxuICAgICAgICBiRm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWJGb3VuZCkge1xuICAgICAgLy8gYWRkIGluXG4gICAgICBjb25zdCBmaWx0ZXJPYmo6IGFueSA9IHt9O1xuICAgICAgZmlsdGVyT2JqLnJlZiA9IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEuY29uZmlnLm5hbWU7XG4gICAgICBmaWx0ZXJPYmoudHlwZSA9IHRoaXMuY3VycmVudEZpbHRlclJlZkRhdGEudHlwZTtcbiAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlciA9IHRoaXMuZmlsdGVyQ29udGFpbnNUeXBlJDtcbiAgICAgIGZpbHRlck9iai5jb250YWluc0ZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJDb250YWluc1ZhbHVlJDtcblxuICAgICAgdGhpcy5maWx0ZXJCeUNvbHVtbnMucHVzaChmaWx0ZXJPYmopO1xuICAgIH1cblxuICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBmaWx0ZXJzIGFuZCB1cGRhdGUgZmlsdGVyT24gaWNvblxuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBjb25zdCBjb250YWluc0ZpbHRlclZhbHVlID0gZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWU7XG4gICAgICBjb25zdCBjb250YWluc0ZpbHRlciA9IGZpbHRlck9iai5jb250YWluc0ZpbHRlcjtcbiAgICAgIGNvbnN0IGZpbHRlclJlZiA9IGZpbHRlck9iai5yZWY7XG4gICAgICBjb25zdCBmaWx0ZXJJbmRleCA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5pbmRleE9mKGZpbHRlclJlZik7XG4gICAgICBjb25zdCBhckZpbHRlckltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdmaWx0ZXJPbkljb24nKTtcbiAgICAgIGNvbnN0IGZpbHRlckltZzogYW55ID0gYXJGaWx0ZXJJbWdbZmlsdGVySW5kZXhdO1xuICAgICAgaWYgKGNvbnRhaW5zRmlsdGVyVmFsdWUgPT0gJycgJiYgY29udGFpbnNGaWx0ZXIgIT0gJ251bGwnICYmIGNvbnRhaW5zRmlsdGVyICE9ICdub3RudWxsJykge1xuICAgICAgICAvLyBjbGVhciBpY29uXG4gICAgICAgIGZpbHRlckltZy5zcmMgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNob3cgaWNvblxuICAgICAgICBmaWx0ZXJJbWcuc3JjID0gdGhpcy5maWx0ZXJPblN2Z0ljb24kO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUZpbHRlclZhcnNXaXRoQ3VycmVudChjb2x1bW5EYXRhKSB7XG4gICAgLy8gZmluZCBjdXJyZW50IHJlZiwgaWYgZXhpc3RzLCBtb3ZlIGRhdGEgdG8gdmFyaWFibGUgdG8gZGlzcGxheVxuXG4gICAgbGV0IGJGb3VuZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBpZiAoZmlsdGVyT2JqLnJlZiA9PT0gdGhpcy5jdXJyZW50RmlsdGVyUmVmRGF0YS5jb25maWcubmFtZSkge1xuICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXI7XG4gICAgICAgIHRoaXMuZmlsdGVyQ29udGFpbnNWYWx1ZSQgPSBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXJWYWx1ZTtcblxuICAgICAgICBiRm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWJGb3VuZCkge1xuICAgICAgc3dpdGNoIChjb2x1bW5EYXRhLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgY2FzZSAnVGltZSc6XG4gICAgICAgICAgdGhpcy5maWx0ZXJDb250YWluc1R5cGUkID0gJ25vdGVxdWFsJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVHlwZSQgPSAnY29udGFpbnMnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpbHRlckNvbnRhaW5zVmFsdWUkID0gJyc7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyRGF0YShpdGVtOiBhbnkpIHtcbiAgICBsZXQgYktlZXAgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyT2JqIG9mIHRoaXMuZmlsdGVyQnlDb2x1bW5zKSB7XG4gICAgICBpZiAoZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyVmFsdWUgIT0gJycgfHwgZmlsdGVyT2JqLmNvbnRhaW5zRmlsdGVyID09ICdudWxsJyB8fCBmaWx0ZXJPYmouY29udGFpbnNGaWx0ZXIgPT0gJ25vdG51bGwnKSB7XG4gICAgICAgIHN3aXRjaCAoZmlsdGVyT2JqLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgICAgICAgY2FzZSAnVGltZSc6XG4gICAgICAgICAgICBiS2VlcCA9IGZpbHRlckRhdGFCeURhdGUoaXRlbSwgZmlsdGVyT2JqKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBiS2VlcCA9IGZpbHRlckRhdGFCeUNvbW1vbkZpZWxkcyhpdGVtLCBmaWx0ZXJPYmopO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaWYgZG9uJ3Qga2VlcCBzdG9wIGZpbHRlcmluZ1xuICAgICAgaWYgKCFiS2VlcCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYktlZXA7XG4gIH1cblxuICBmaWx0ZXJTb3J0R3JvdXBCeSgpIHtcbiAgICBsZXQgdGhlRGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhLnNsaWNlKCk7XG5cbiAgICAvLyBsYXN0IGZpbHRlciBjb25maWcgZGF0YSBpcyBnbG9iYWxcbiAgICB0aGVEYXRhID0gdGhlRGF0YS5maWx0ZXIodGhpcy5maWx0ZXJEYXRhLmJpbmQodGhpcykpO1xuXG4gICAgLy8gbGFzdCBzb3J0IGNvbmZpZyBkYXRhIGlzIGdsb2JhbFxuICAgIHRoZURhdGEuc29ydCh0aGlzLnNvcnRDb21wYXJlLmJpbmQodGhpcykpO1xuICAgIHRoaXMucm93RGF0YS5kYXRhID0gdGhlRGF0YTtcbiAgfVxuXG4gIF9oZWFkZXJTb3J0Q2xpY2soZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICAvLyBpbWFnZXMgMCAtIGZpbHRlciwgMSAtIGFycm93LCAyIC0gbW9yZVxuXG4gICAgLyoqIENvbW1lbnRpbmcgdGhpcyBjb2RlIGZvciBub3cgYXMgaXQgaXMgZ2l2aW5nIGVycm9ycyBub3Qgc3VyZSBpZiBpdCBldmVyIHdvcmtlZCAqL1xuICAgIC8vIGxldCBhcnJvd0ltYWdlID0gZXZlbnQuc3JjRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJylbMV07XG4gICAgLy8gbGV0IGFycm93QXR0ciA9IGFycm93SW1hZ2UuZ2V0QXR0cmlidXRlKCdhcnJvdycpO1xuXG4gICAgLy8gdGhpcy5jbGVhck91dEFycm93cyhldmVudCwgY29sdW1uRGF0YSk7XG5cbiAgICAvLyBzd2l0Y2ggKGFycm93QXR0cikge1xuICAgIC8vICAgY2FzZSAndXAnOlxuICAgIC8vICAgICBhcnJvd0ltYWdlLnNyYyA9IHRoaXMuYXJyb3dEb3duU3ZnSWNvbiQ7XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc2V0QXR0cmlidXRlKCdhcnJvdycsICdkb3duJyk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vICAgY2FzZSAnZG93bic6XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc3JjID0gJyc7XG4gICAgLy8gICAgIGFycm93SW1hZ2Uuc2V0QXR0cmlidXRlKCdhcnJvdycsICdub25lJyk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vICAgZGVmYXVsdDpcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zcmMgPSB0aGlzLmFycm93VXBTdmdJY29uJDtcbiAgICAvLyAgICAgYXJyb3dJbWFnZS5zZXRBdHRyaWJ1dGUoJ2Fycm93JywgJ3VwJyk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vIH1cblxuICAgIHRoaXMuY29tcGFyZVR5cGUgPSBjb2x1bW5EYXRhLnR5cGU7XG4gICAgdGhpcy5jb21wYXJlUmVmID0gY29sdW1uRGF0YS5jb25maWcubmFtZTtcbiAgICAvLyB0aGlzLmFycm93RGlyZWN0aW9uID0gYXJyb3dJbWFnZS5nZXRBdHRyaWJ1dGUoJ2Fycm93Jyk7XG4gICAgdGhpcy5hcnJvd0RpcmVjdGlvbiA9IHRoaXMuYXJyb3dEaXJlY3Rpb24gPT09ICd1cCcgPyAnZG93bicgOiAndXAnO1xuXG4gICAgdGhpcy5maWx0ZXJTb3J0R3JvdXBCeSgpO1xuICB9XG5cbiAgX3Nob3dVbkdyb3VwQnkoY29sdW1uRGF0YSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuZ3JvdXBCeUNvbHVtbnMkKSB7XG4gICAgICBpZiAodmFsID09IGNvbHVtbkRhdGEuY29uZmlnLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX2dyb3VwQnkoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW5EYXRhLmNvbmZpZy5uYW1lLCB0cnVlKTtcblxuICAgIHRoaXMuZmlsdGVyU29ydEdyb3VwQnkoKTtcbiAgfVxuXG4gIF91bkdyb3VwQnkoZXZlbnQsIGNvbHVtbkRhdGEpIHtcbiAgICAvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW5EYXRhLmNvbmZpZy5uYW1lLCBmYWxzZSk7XG5cbiAgICB0aGlzLmZpbHRlclNvcnRHcm91cEJ5KCk7XG4gIH1cblxuICBjaGVja0dyb3VwQnlDb2x1bW4oZmllbGQsIGFkZCkge1xuICAgIGxldCBmb3VuZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5ncm91cEJ5Q29sdW1ucyQpIHtcbiAgICAgIGlmIChjb2x1bW4gPT09IGZpZWxkKSB7XG4gICAgICAgIGZvdW5kID0gdGhpcy5ncm91cEJ5Q29sdW1ucyQuaW5kZXhPZihjb2x1bW4sIDApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm91bmQgIT0gbnVsbCAmJiBmb3VuZCA+PSAwKSB7XG4gICAgICBpZiAoIWFkZCkge1xuICAgICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWRkKSB7XG4gICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5wdXNoKGZpZWxkKTtcbiAgICB9XG4gIH1cblxuICBfZ2V0R3JvdXBOYW1lKGZpZWxkTmFtZSkge1xuICAgIGZvciAobGV0IGZpZWxkSW5kZXggPSAwOyBmaWVsZEluZGV4IDwgdGhpcy5maWVsZHMkLmxlbmd0aDsgZmllbGRJbmRleCsrKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzJFtmaWVsZEluZGV4XTtcbiAgICAgIGlmIChmaWVsZC5jb25maWcubmFtZSA9PSBmaWVsZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmNvbmZpZy5sYWJlbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgYWRkR3JvdXBzKGRhdGE6IGFueVtdLCBncm91cEJ5Q29sdW1uczogc3RyaW5nW10pOiBhbnlbXSB7XG4gICAgY29uc3Qgcm9vdEdyb3VwID0gbmV3IEdyb3VwKCk7XG4gICAgcm9vdEdyb3VwLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJsZXZlbChkYXRhLCAwLCBncm91cEJ5Q29sdW1ucywgcm9vdEdyb3VwKTtcbiAgfVxuXG4gIGdldFN1YmxldmVsKGRhdGE6IGFueVtdLCBsZXZlbDogbnVtYmVyLCBncm91cEJ5Q29sdW1uczogc3RyaW5nW10sIHBhcmVudDogR3JvdXApOiBhbnlbXSB7XG4gICAgaWYgKGxldmVsID49IGdyb3VwQnlDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMudW5pcXVlQnkoXG4gICAgICBkYXRhLm1hcChyb3cgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgR3JvdXAoKTtcbiAgICAgICAgcmVzdWx0LmxldmVsID0gbGV2ZWwgKyAxO1xuICAgICAgICByZXN1bHQucGFyZW50ID0gcGFyZW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBsZXZlbDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0W2dyb3VwQnlDb2x1bW5zW2ldXSA9IHJvd1tncm91cEJ5Q29sdW1uc1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pLFxuICAgICAgSlNPTi5zdHJpbmdpZnlcbiAgICApO1xuXG4gICAgY29uc3QgY3VycmVudENvbHVtbiA9IGdyb3VwQnlDb2x1bW5zW2xldmVsXTtcbiAgICBsZXQgc3ViR3JvdXBzOiBhbnkgPSBbXTtcbiAgICBncm91cHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICBjb25zdCByb3dzSW5Hcm91cCA9IGRhdGEuZmlsdGVyKHJvdyA9PiBncm91cFtjdXJyZW50Q29sdW1uXSA9PT0gcm93W2N1cnJlbnRDb2x1bW5dKTtcbiAgICAgIGdyb3VwLnRvdGFsQ291bnRzID0gcm93c0luR3JvdXAubGVuZ3RoO1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSB0aGlzLmdldFN1YmxldmVsKHJvd3NJbkdyb3VwLCBsZXZlbCArIDEsIGdyb3VwQnlDb2x1bW5zLCBncm91cCk7XG4gICAgICBzdWJHcm91cC51bnNoaWZ0KGdyb3VwKTtcbiAgICAgIHN1Ykdyb3VwcyA9IHN1Ykdyb3Vwcy5jb25jYXQoc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiBzdWJHcm91cHM7XG4gIH1cblxuICB1bmlxdWVCeShhLCBrZXkpIHtcbiAgICBjb25zdCBzZWVuID0ge307XG4gICAgcmV0dXJuIGEuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgayA9IGtleShpdGVtKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXR1cm4tYXNzaWduLCBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIHJldHVybiBzZWVuLmhhc093blByb3BlcnR5KGspID8gZmFsc2UgOiAoc2VlbltrXSA9IHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgaXNHcm91cChpbmRleCwgaXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtLmxldmVsO1xuICB9XG5cbiAgX2dyb3VwSGVhZGVyQ2xpY2socm93KSB7XG4gICAgcm93LmV4cGFuZGVkID0gIXJvdy5leHBhbmRlZDtcbiAgICAvLyB0aGlzLnJlcGVhdExpc3QkLmZpbHRlciA9IFwiXCI7XG4gICAgdGhpcy5wZXJmRmlsdGVyID0gcGVyZm9ybWFuY2Uubm93KCkudG9TdHJpbmcoKTtcbiAgICB0aGlzLnJvd0RhdGEuZmlsdGVyID0gdGhpcy5wZXJmRmlsdGVyO1xuICB9XG5cbiAgLy8gYmVsb3cgaXMgZm9yIGdyaWQgcm93IGdyb3VwaW5nXG4gIGN1c3RvbUZpbHRlclByZWRpY2F0ZShkYXRhOiBhbnkgfCBHcm91cCwgZmlsdGVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGF0YSBpbnN0YW5jZW9mIEdyb3VwID8gZGF0YS52aXNpYmxlIDogdGhpcy5nZXREYXRhUm93VmlzaWJsZVdpdGhGaWx0ZXIoZGF0YSwgZmlsdGVyKTtcbiAgfVxuXG4gIGdldERhdGFSb3dWaXNpYmxlKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGdyb3VwUm93cyA9IHRoaXMucm93RGF0YS5kYXRhLmZpbHRlcihyb3cgPT4ge1xuICAgICAgaWYgKCEocm93IGluc3RhbmNlb2YgR3JvdXApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGxldCBtYXRjaCA9IHRydWU7XG4gICAgICB0aGlzLmdyb3VwQnlDb2x1bW5zJC5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgIGlmICghcm93W2NvbHVtbl0gfHwgIWRhdGFbY29sdW1uXSB8fCByb3dbY29sdW1uXSAhPT0gZGF0YVtjb2x1bW5dKSB7XG4gICAgICAgICAgbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICBpZiAoZ3JvdXBSb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGdyb3VwUm93c1swXSBhcyBHcm91cDtcbiAgICByZXR1cm4gcGFyZW50LnZpc2libGUgJiYgcGFyZW50LmV4cGFuZGVkO1xuICB9XG5cbiAgZ2V0RGF0YVJvd1Zpc2libGVXaXRoRmlsdGVyKGRhdGEsIGZpbHRlcikge1xuICAgIC8vIGZpc3QgY2hlY2sgaWYgcm93IGlzIHZpc2libGUgd2l0aCBncm91cGluZ1xuICAgIGxldCBiVmlzaWJsZSA9IHRoaXMuZ2V0RGF0YVJvd1Zpc2libGUoZGF0YSk7XG5cbiAgICBpZiAoYlZpc2libGUgJiYgZmlsdGVyICYmIGZpbHRlciAhPSAnJyAmJiBmaWx0ZXIgIT0gdGhpcy5wZXJmRmlsdGVyKSB7XG4gICAgICAvLyBub3cgY2hlY2sgaWYgcm93IGlzIGZpbHRlcmVkLlxuXG4gICAgICAvLyBhc3N1bWUgbm90IHRoZXJlIHVubGVzcyB3ZSBmaW5kIGl0XG4gICAgICBiVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zKSB7XG4gICAgICAgIC8vIGZpbHRlciBpcyBsb3dlciBjYXNlXG4gICAgICAgIGlmIChkYXRhW2NvbF0gJiYgZGF0YVtjb2xdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGZpbHRlcikgPj0gMCkge1xuICAgICAgICAgIGJWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiVmlzaWJsZTtcbiAgfVxuXG4gIGdldERpc3BsYXlDb2x1bW5zKGZpZWxkcyA9IFtdKSB7XG4gICAgcmV0dXJuIGZpZWxkcy5tYXAoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgIGxldCB0aGVGaWVsZCA9IGZpZWxkLmNvbmZpZy52YWx1ZS5zdWJzdHJpbmcoZmllbGQuY29uZmlnLnZhbHVlLmluZGV4T2YoJyAnKSArIDEpO1xuICAgICAgaWYgKHRoZUZpZWxkLmluZGV4T2YoJy4nKSA9PSAwKSB7XG4gICAgICAgIHRoZUZpZWxkID0gdGhlRmllbGQuc3Vic3RyaW5nKDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhlRmllbGQ7XG4gICAgfSk7XG4gIH1cblxuICBfZ2V0SWNvblN0eWxlKGxldmVsKTogc3RyaW5nIHtcbiAgICBsZXQgc1JldHVybiA9ICcnO1xuICAgIGxldCBuTGV2ZWwgPSBwYXJzZUludChsZXZlbCwgMTApO1xuICAgIG5MZXZlbC0tO1xuICAgIG5MZXZlbCAqPSAxNTtcbiAgICBzUmV0dXJuID0gYHBhZGRpbmctbGVmdDogJHtuTGV2ZWx9cHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGVgO1xuXG4gICAgcmV0dXJuIHNSZXR1cm47XG4gIH1cblxuICAvLyBDYWxsYmFjayBwYXNzZWQgd2hlbiBzdWJzY3JpYmluZyB0byBzdG9yZSBjaGFuZ2VcbiAgb25TdGF0ZUNoYW5nZSgpIHtcbiAgICB0aGlzLmNoZWNrQW5kVXBkYXRlKCk7XG4gIH1cblxuICAvLyByZXR1cm4gdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHNob3duIGFzIHRoZSBjb250ZW50cyBmb3IgdGhlIGdpdmVuIHJvdyBkYXRhXG4gIC8vICBvZiB0aGUgZ2l2ZW4gcm93IGZpZWxkXG4gIGdldFJvd1ZhbHVlKGluUm93RGF0YTogT2JqZWN0LCBpbkNvbEtleTogc3RyaW5nKTogYW55IHtcbiAgICAvLyBTZWUgd2hhdCBkYXRhIChpZiBhbnkpIHdlIGhhdmUgdG8gZGlzcGxheVxuICAgIGNvbnN0IHJlZktleXM6IHN0cmluZ1tdID0gaW5Db2xLZXkuc3BsaXQoJy4nKTtcbiAgICBsZXQgdmFsQnVpbGRlciA9IGluUm93RGF0YTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWZLZXlzKSB7XG4gICAgICB2YWxCdWlsZGVyID0gdmFsQnVpbGRlcltrZXldO1xuICAgIH1cbiAgICByZXR1cm4gdmFsQnVpbGRlcjtcbiAgfVxuXG4gIGdlbmVyYXRlUm93c0RhdGEoKSB7XG4gICAgY29uc3QgeyBkYXRhUGFnZU5hbWUsIHJlZmVyZW5jZUxpc3QgfSA9IHRoaXMuY29uZmlnUHJvcHMkO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpO1xuICAgIC8vIGlmIGRhdGFQYWdlTmFtZSBwcm9wZXJ0eSB2YWx1ZSBleGlzdHMgdGhlbiBtYWtlIGEgZGF0YXBhZ2UgZmV0Y2ggY2FsbCBhbmQgZ2V0IHRoZSBsaXN0IG9mIGRhdGEuXG4gICAgaWYgKGRhdGFQYWdlTmFtZSkge1xuICAgICAgdGhpcy5kYXRhUGFnZVNlcnZpY2UuZ2V0RGF0YVBhZ2VEYXRhKGRhdGFQYWdlTmFtZSwgdGhpcy5wYXJhbWV0ZXJzLCBjb250ZXh0KS50aGVuKGxpc3REYXRhID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybWF0Um93c0RhdGEobGlzdERhdGEpO1xuICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMucm93RGF0YSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoZGF0YSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJlZmVyZW5jZUxpc3QgcHJvcCBoYXMgdGhlIEpTT04gZGF0YSBmb3IgZWFjaCByb3cgdG8gYmUgZGlzcGxheWVkXG4gICAgICAvLyAgaW4gdGhlIHRhYmxlLiBTbywgaXRlcmF0ZSBvdmVyIHJlZmVyZW5jZUxpc3QgdG8gY3JlYXRlIHRoZSBkYXRhUm93cyB0aGF0XG4gICAgICAvLyAgd2UncmUgdXNpbmcgYXMgdGhlIHRhYmxlJ3MgZGF0YVNvdXJjZVxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybWF0Um93c0RhdGEocmVmZXJlbmNlTGlzdCk7XG4gICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IGRhdGE7XG4gICAgICB0aGlzLnJvd0RhdGEgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFJvd3NEYXRhKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YT8ubWFwKGl0ZW0gPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5yZWR1Y2UoKGRhdGFGb3JSb3csIGNvbEtleSkgPT4ge1xuICAgICAgICBkYXRhRm9yUm93W2NvbEtleV0gPSB0aGlzLmdldFJvd1ZhbHVlKGl0ZW0sIGNvbEtleSk7XG4gICAgICAgIHJldHVybiBkYXRhRm9yUm93O1xuICAgICAgfSwge30pO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkUmVjb3JkKCkge1xuICAgIGlmICh0aGlzLmFsbG93RWRpdGluZ0luTW9kYWwgJiYgdGhpcy5kZWZhdWx0Vmlldykge1xuICAgICAgdGhpcy5wQ29ubiRcbiAgICAgICAgLmdldEFjdGlvbnNBcGkoKVxuICAgICAgICAub3BlbkVtYmVkZGVkRGF0YU1vZGFsKFxuICAgICAgICAgIHRoaXMuZGVmYXVsdFZpZXcsXG4gICAgICAgICAgdGhpcy5wQ29ubiQsXG4gICAgICAgICAgdGhpcy5yZWZlcmVuY2VMaXN0U3RyLFxuICAgICAgICAgIHRoaXMucmVmZXJlbmNlTGlzdC5sZW5ndGgsXG4gICAgICAgICAgUENvcmUuZ2V0Q29uc3RhbnRzKCkuUkVTT1VSQ0VfU1RBVFVTLkNSRUFURVxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBAdHMtaWdub3JlIC0gc2Vjb25kIHBhcmFtZXRlciBcInBhZ2VSZWZcIiBpcyBvcHRpb25hbCBmb3IgaW5zZXJ0IG1ldGhvZFxuICAgICAgdGhpcy5wQ29ubiQuZ2V0TGlzdEFjdGlvbnMoKS5pbnNlcnQoeyBjbGFzc0lEOiB0aGlzLmNvbnRleHRDbGFzcyB9LCB0aGlzLnJlZmVyZW5jZUxpc3QubGVuZ3RoKTtcbiAgICB9XG5cbiAgICB0aGlzLnBDb25uJC5jbGVhckVycm9yTWVzc2FnZXMoe1xuICAgICAgcHJvcGVydHk6ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KT8ucmVmZXJlbmNlTGlzdD8uc3Vic3RyaW5nKDEpXG4gICAgfSBhcyBhbnkpO1xuICB9XG5cbiAgZWRpdFJlY29yZChkYXRhLCBpbmRleCkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLnBDb25uJFxuICAgICAgICAuZ2V0QWN0aW9uc0FwaSgpXG4gICAgICAgIC5vcGVuRW1iZWRkZWREYXRhTW9kYWwoXG4gICAgICAgICAgdGhpcy5iVXNlU2VwYXJhdGVWaWV3Rm9yRWRpdCA/IHRoaXMuZWRpdFZpZXcgOiB0aGlzLmRlZmF1bHRWaWV3LFxuICAgICAgICAgIHRoaXMucENvbm4kLFxuICAgICAgICAgIHRoaXMucmVmZXJlbmNlTGlzdFN0cixcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5SRVNPVVJDRV9TVEFUVVMuVVBEQVRFXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlUmVjb3JkKGluZGV4KSB7XG4gICAgaWYgKFBDb3JlLmdldFBDb3JlVmVyc2lvbigpPy5pbmNsdWRlcygnOC43JykpIHtcbiAgICAgIHRoaXMucENvbm4kLmdldExpc3RBY3Rpb25zKCkuZGVsZXRlRW50cnkoaW5kZXgsIHRoaXMucGFnZVJlZmVyZW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgLSBzZWNvbmQgcGFyYW1ldGVyIFwicGFnZVJlZlwiIGlzIG9wdGlvbmFsIGZvciBkZWxldGVFbnRyeSBtZXRob2RcbiAgICAgIHRoaXMucENvbm4kLmdldExpc3RBY3Rpb25zKCkuZGVsZXRlRW50cnkoaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGJ1aWxkRWxlbWVudHNGb3JUYWJsZSgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcbiAgICBjb25zdCBlbGVEYXRhOiBhbnkgPSBbXTtcbiAgICB0aGlzLnJlZmVyZW5jZUxpc3QuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGE6IGFueSA9IFtdO1xuICAgICAgdGhpcy5yYXdGaWVsZHM/LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUxpc3REYXRhID0gZ2V0UmVmZXJlbmNlTGlzdCh0aGlzLnBDb25uJCk7XG4gICAgICAgIGNvbnN0IGlzRGF0YXBhZ2UgPSByZWZlcmVuY2VMaXN0RGF0YS5zdGFydHNXaXRoKCdEXycpO1xuICAgICAgICBjb25zdCBwYWdlUmVmZXJlbmNlVmFsdWUgPSBpc0RhdGFwYWdlXG4gICAgICAgICAgPyBgJHtyZWZlcmVuY2VMaXN0RGF0YX1bJHtpbmRleH1dYFxuICAgICAgICAgIDogYCR7dGhpcy5wQ29ubiQuZ2V0UGFnZVJlZmVyZW5jZSgpfSR7cmVmZXJlbmNlTGlzdERhdGEuc3Vic3RyaW5nKHJlZmVyZW5jZUxpc3REYXRhLmxhc3RJbmRleE9mKCcuJykpfVske2luZGV4fV1gO1xuICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgbWV0YTogaXRlbSxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgcGFnZVJlZmVyZW5jZTogcGFnZVJlZmVyZW5jZVZhbHVlLFxuICAgICAgICAgICAgcmVmZXJlbmNlTGlzdDogcmVmZXJlbmNlTGlzdERhdGEsXG4gICAgICAgICAgICBoYXNGb3JtOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB2aWV3ID0gUENvcmUuY3JlYXRlUENvbm5lY3QoY29uZmlnKTtcbiAgICAgICAgZGF0YS5wdXNoKHZpZXcpO1xuICAgICAgfSk7XG4gICAgICBlbGVEYXRhLnB1c2goZGF0YSk7XG4gICAgfSk7XG4gICAgdGhpcy5lbGVtZW50c0RhdGEgPSBlbGVEYXRhO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiYlZpc2libGUkXCI+XG4gIDxkaXYgY2xhc3M9XCJzaW1wbGUtdGFibGUtd3JhcHBlclwiPlxuICAgIDxoMyAqbmdJZj1cImxhYmVsXCIgY2xhc3NOYW1lPVwibGFiZWxcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkXCI+XG4gICAgICB7eyBsYWJlbCB9fSA8c3BhbiBjbGFzcz1cInJlc3VsdHMtY291bnRcIj57eyBnZXRSZXN1bHRzVGV4dCgpIH19PC9zcGFuPlxuICAgIDwvaDM+XG4gICAgPHRhYmxlICpuZ0lmPVwicmVhZE9ubHlNb2RlIHx8IGFsbG93RWRpdGluZ0luTW9kYWxcIiBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwicm93RGF0YVwiIGNsYXNzPVwibWF0LWVsZXZhdGlvbi16OFwiIGlkPVwicmVhZG9ubHktdGFibGVcIiBtYXRTb3J0PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZENvbCBvZiBwcm9jZXNzZWRGaWVsZHNcIiBbbWF0Q29sdW1uRGVmXT1cImRDb2wuY29uZmlnLm5hbWVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXIgKGNsaWNrKT1cIl9oZWFkZXJTb3J0Q2xpY2soJGV2ZW50LCBkQ29sKVwiIGFycm93UG9zaXRpb249XCJiZWZvcmVcIj5cbiAgICAgICAgICA8ZGl2Pnt7IGRDb2wuY29uZmlnLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstbWF0LWhlYWRlci1maWx0ZXJcIj5cbiAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLWZpbHRlci1zdmctaWNvblwiIG5hbWU9XCJmaWx0ZXJPbkljb25cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImdyb3VwTWVudVwiPlxuICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBtZW51U3ZnSWNvbiQgfX1cIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI2dyb3VwTWVudT5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfZ3JvdXBCeSgkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZ3JvdXBCeVN2Z0ljb24kIH19XCIgLz48c3Bhbj5Hcm91cCBCeTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJfc2hvd1VuR3JvdXBCeShkQ29sKSAmJiBiR3JvdXBpbmckXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiX3VuR3JvdXBCeSgkZXZlbnQsIGRDb2wpXCI+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstbGlzdC12aWV3LXN2Zy1pY29uXCIgc3JjPVwie3sgZ3JvdXBCeVN2Z0ljb24kIH19XCIgLz48c3Bhbj5Vbmdyb3VwPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJfZmlsdGVyKCRldmVudCwgZENvbClcIj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwicHNkay1saXN0LXZpZXctc3ZnLWljb25cIiBzcmM9XCJ7eyBmaWx0ZXJTdmdJY29uJCB9fVwiIC8+PHNwYW4+RmlsdGVyPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudFtkQ29sLmNvbmZpZy5uYW1lXSB8fCAnLS0tJyB9fTwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiRGVsZXRlSWNvblwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYWxsb3dFZGl0aW5nSW5Nb2RhbFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+PC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgaW5kZXggYXMgalwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pY29uXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJ1dGlsaXR5TWVudVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJwc2RrLXV0aWxpdHktY2FyZC1hY3Rpb25zLXN2Zy1pY29uXCIgc3JjPVwie3sgc2V0dGluZ3NTdmdJY29uJCB9fVwiIC8+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8bWF0LW1lbnUgI3V0aWxpdHlNZW51PVwibWF0TWVudVwiIG92ZXJsYXBUcmlnZ2VyPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImVkaXRSZWNvcmQoZWxlbWVudCwgailcIj5FZGl0PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJkZWxldGVSZWNvcmQoailcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgIDwvdGFibGU+XG4gICAgPHRhYmxlICpuZ0lmPVwiZWRpdGFibGVNb2RlICYmICFhbGxvd0VkaXRpbmdJbk1vZGFsXCIgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImVsZW1lbnRzRGF0YVwiIGNsYXNzPVwibWF0LWVsZXZhdGlvbi16OFwiIGlkPVwiZWRpdGFibGUtdGFibGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgZmllbGREZWZzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkQ29sLm5hbWUgIT0gJ0RlbGV0ZUljb24nXCIgW21hdENvbHVtbkRlZl09XCJkQ29sLm5hbWVcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicHNkay1tYXQtaGVhZGVyXCI+e3sgZENvbC5sYWJlbCB9fTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxjb21wb25lbnQtbWFwcGVyXG4gICAgICAgICAgICAgIFtuYW1lXT1cImVsZW1lbnRbaV0uZ2V0UENvbm5lY3QoKS5nZXRDb21wb25lbnROYW1lKClcIlxuICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgIHBDb25uJDogZWxlbWVudFtpXS5nZXRQQ29ubmVjdCgpLFxuICAgICAgICAgICAgICAgIGZvcm1Hcm91cCQ6IGZvcm1Hcm91cCRcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIGVycm9yTXNnPVwiVGFibGUgd2FudHMgY29tcG9uZW50IG5vdCB5ZXQgYXZhaWxhYmxlOiB7eyBlbGVtZW50W2ldLmdldFBDb25uZWN0KCkuZ2V0Q29tcG9uZW50TmFtZSgpIH19XCJcbiAgICAgICAgICAgID48L2NvbXBvbmVudC1tYXBwZXI+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiRGVsZXRlSWNvblwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBpbmRleCBhcyBqXCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImRlbGV0ZS1idXR0b25cIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImRlbGV0ZVJlY29yZChqKVwiPlxuICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstdXRpbGl0eS1jYXJkLWFjdGlvbi1zdmctaWNvblwiIHNyYz1cInt7IG1lbnVJY29uT3ZlcnJpZGUkIH19XCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICA8L3RhYmxlPlxuICAgIDxkaXYgY2xhc3M9XCJwc2RrLW5vLXJlY29yZHNcIiBpZD1cIm5vLXJlY29yZHNcIiAqbmdJZj1cImVkaXRhYmxlTW9kZSAmJiByZWZlcmVuY2VMaXN0Py5sZW5ndGggPT09IDBcIj5ObyBSZWNvcmRzIEZvdW5kLjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwc2RrLW5vLXJlY29yZHNcIiBpZD1cIm5vLXJlY29yZHNcIiAqbmdJZj1cInJlYWRPbmx5TW9kZSAmJiByb3dEYXRhPy5kYXRhPy5sZW5ndGggPT09IDBcIj5ObyBSZWNvcmRzIEZvdW5kLjwvZGl2PlxuICA8L2Rpdj5cbiAgPGJ1dHRvbiAqbmdJZj1cInNob3dBZGRSb3dCdXR0b25cIiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHN0eWxlPVwiZm9udC1zaXplOiAxNnB4XCIgKGNsaWNrKT1cImFkZFJlY29yZCgpXCI+KyBBZGQ8L2J1dHRvbj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIHBvcCBvdmVycyBmb3IgZmlsdGVycy0tPlxuPGRpdiAqbmdJZj1cImJTaG93RmlsdGVyUG9wb3ZlciRcIiBjbGFzcz1cInBzZGstZGlhbG9nLWJhY2tncm91bmRcIj5cbiAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtZmlsZS10b3BcIj5cbiAgICA8aDQ+XG4gICAgICBGaWx0ZXI6PGI+IHt7IGZpbHRlckNvbnRhaW5zTGFiZWwkIH19PC9iPlxuICAgIDwvaDQ+XG4gICAgPGRpdiAqbmdJZj1cImJDb250YWlucyRcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICA8bWF0LXNlbGVjdCBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNUeXBlJFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiX2ZpbHRlckNvbnRhaW5zVHlwZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjb250YWluc1wiPkNvbnRhaW5zPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiZXF1YWxzXCI+RXF1YWxzPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwic3RhcnRzd2l0aFwiPlN0YXJ0cyB3aXRoPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNWYWx1ZSgkZXZlbnQpXCIgLz5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiYkRhdGVUaW1lJFwiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgIDxtYXQtc2VsZWN0IFt2YWx1ZV09XCJmaWx0ZXJDb250YWluc1R5cGUkXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNUeXBlKCRldmVudClcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm5vdGVxdWFsXCI+aXMgbm90IGVxdWFsIHRvPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiYWZ0ZXJcIj5hZnRlcjwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cImJlZm9yZVwiPmJlZm9yZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm51bGxcIj5pcyBudWxsPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibm90bnVsbFwiPmlzIG5vdCBudWxsPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJiSXNEYXRlJCAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9PSAnbnVsbCcgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPSAnbm90bnVsbCdcIiBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICA8bWF0LWxhYmVsPkRhdGU8L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAjZGF0ZUlucHV0XG4gICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGVnYWRhdGVcIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIlxuICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIl9maWx0ZXJDb250YWluc0RhdGVWYWx1ZSgkZXZlbnQsIGRhdGVJbnB1dC52YWx1ZSlcIlxuICAgICAgICAvPlxuICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBlZ2FkYXRlXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGVnYWRhdGUgW3N0YXJ0QXRdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIj48L21hdC1kYXRlcGlja2VyPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiYklzRGF0ZVRpbWUkICYmIGZpbHRlckNvbnRhaW5zVHlwZSQgIT09ICdudWxsJyAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9ICdub3RudWxsJ1wiIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+RGF0ZSB0aW1lPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBbdmFsdWVdPVwiZmlsdGVyQ29udGFpbnNWYWx1ZSRcIiAoY2hhbmdlKT1cIl9maWx0ZXJDb250YWluc0RhdGVUaW1lVmFsdWUoJGV2ZW50KVwiIC8+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJiSXNUaW1lJCAmJiBmaWx0ZXJDb250YWluc1R5cGUkICE9PSAnbnVsbCcgJiYgZmlsdGVyQ29udGFpbnNUeXBlJCAhPSAnbm90bnVsbCdcIiBjbGFzcz1cInBzZGstZnVsbC13aWR0aFwiPlxuICAgICAgICA8bWF0LWxhYmVsPlRpbWU8L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0aW1lXCIgW3ZhbHVlXT1cImZpbHRlckNvbnRhaW5zVmFsdWUkXCIgKGNoYW5nZSk9XCJfZmlsdGVyQ29udGFpbnNUaW1lVmFsdWUoJGV2ZW50KVwiIC8+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGNvbXBvbmVudC1tYXBwZXJcbiAgICAgIG5hbWU9XCJBY3Rpb25CdXR0b25zXCJcbiAgICAgIFtwcm9wc109XCJ7IGFyTWFpbkJ1dHRvbnMkOiBhckZpbHRlck1haW5CdXR0b25zJCwgYXJTZWNvbmRhcnlCdXR0b25zJDogYXJGaWx0ZXJTZWNvbmRhcnlCdXR0b25zJCB9XCJcbiAgICAgIFtwYXJlbnRdPVwidGhpc1wiXG4gICAgICBbb3V0cHV0RXZlbnRzXT1cInsgYWN0aW9uQnV0dG9uQ2xpY2s6IF9vbkZpbHRlckFjdGlvbkJ1dHRvbkNsaWNrIH1cIlxuICAgID48L2NvbXBvbmVudC1tYXBwZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=