@seniorsistemas/data-seniorx-core 3.3.0 → 3.4.0

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.
@@ -16,7 +16,7 @@ import { TableActionsMenuComponent } from './components/table-actions-menu.compo
16
16
  import { TableCellContentComponent } from './components/table-cell-content.component';
17
17
  import { TableSortIndicatorComponent } from './components/table-sort-indicator.component';
18
18
  import { buildTableCellConfigMap, mergeTableOptions } from './utils/table-config.util';
19
- import { buildRowCheckboxId, filterTableRows, getNestedValue, resolveRowIdentityLabel, resolveRowSelectionKey } from './utils/table-data.util';
19
+ import { buildRowCheckboxId, cycleSortState, filterTableRows, getNestedValue, resolveRowIdentityLabel, resolveRowSelectionKey, sortTableRows } from './utils/table-data.util';
20
20
  import { getTableColumnMinWidthPx, getTableMinWidthPx, resolveTableColumnAlignment } from './utils/table-layout.util';
21
21
  import * as i0 from "@angular/core";
22
22
  import * as i1 from "@angular/common";
@@ -159,29 +159,7 @@ export class TableComponent {
159
159
  if (this.isApiMode()) {
160
160
  return this.filteredData();
161
161
  }
162
- const field = this.sortField();
163
- const order = this.sortOrder();
164
- const rows = [...this.filteredData()];
165
- if (!field || order === 0) {
166
- return rows;
167
- }
168
- return rows.sort((leftRow, rightRow) => {
169
- const leftValue = this.resolveValue(leftRow, field);
170
- const rightValue = this.resolveValue(rightRow, field);
171
- if (leftValue == null && rightValue == null) {
172
- return 0;
173
- }
174
- if (leftValue == null) {
175
- return -order;
176
- }
177
- if (rightValue == null) {
178
- return order;
179
- }
180
- if (typeof leftValue === 'number' && typeof rightValue === 'number') {
181
- return (leftValue - rightValue) * order;
182
- }
183
- return this.toComparableText(leftValue).localeCompare(this.toComparableText(rightValue)) * order;
184
- });
162
+ return sortTableRows(this.filteredData(), this.sortField(), this.sortOrder(), this.resolveValue);
185
163
  });
186
164
  totalRecords = computed(() => {
187
165
  if (!this.isApiMode()) {
@@ -264,24 +242,9 @@ export class TableComponent {
264
242
  if (!enabled || !field) {
265
243
  return;
266
244
  }
267
- if (this.sortField() !== field) {
268
- this.sortField.set(field);
269
- this.sortOrder.set(1);
270
- }
271
- else {
272
- const currentOrder = this.sortOrder();
273
- if (currentOrder === 1) {
274
- this.sortOrder.set(-1);
275
- }
276
- else if (currentOrder === -1) {
277
- this.sortOrder.set(0);
278
- this.sortField.set(null);
279
- }
280
- else {
281
- this.sortOrder.set(1);
282
- this.sortField.set(field);
283
- }
284
- }
245
+ const next = cycleSortState(this.sortField(), this.sortOrder(), field);
246
+ this.sortField.set(next.field);
247
+ this.sortOrder.set(next.order);
285
248
  this.first.set(INDEX_ZERO);
286
249
  if (this.isApiMode()) {
287
250
  this.emitLazyLoad('sort');
@@ -631,26 +594,6 @@ export class TableComponent {
631
594
  return currentSelection.length === nextSelection.length
632
595
  && currentSelection.every((row, index) => row === nextSelection[index]);
633
596
  }
634
- toComparableText(value) {
635
- if (value == null) {
636
- return '';
637
- }
638
- if (typeof value === 'string') {
639
- return value;
640
- }
641
- if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
642
- return String(value);
643
- }
644
- if (typeof value === 'object') {
645
- try {
646
- return JSON.stringify(value);
647
- }
648
- catch {
649
- return '';
650
- }
651
- }
652
- return '';
653
- }
654
597
  nextActionsMenuId() {
655
598
  this.actionsMenuIdSequence += 1;
656
599
  return `sdc-table-actions-menu-${this.actionsMenuIdSequence}`;
@@ -728,4 +671,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
728
671
  type: HostListener,
729
672
  args: ['window:scroll']
730
673
  }] } });
731
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixvQ0FBb0MsSUFBSSw4QkFBOEIsRUFDdEUseUNBQXlDLElBQUksbUNBQW1DLEVBQ2hGLG1DQUFtQyxJQUFJLDZCQUE2QixFQUNwRSwyQkFBMkIsSUFBSSxxQkFBcUIsRUFDcEQsMkJBQTJCLElBQUkscUJBQXFCLEVBQ3BELGdCQUFnQixJQUFJLFVBQVUsRUFDOUIsaUJBQWlCLElBQUksV0FBVyxFQUNoQyxxQ0FBcUMsRUFDdEMsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUkzRixPQUFPLEVBWUwsb0JBQW9CLEVBQ3JCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRC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S0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0JBY25CLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFJRixNQUFNO3NCQURULEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO2dCQTBCdEIsU0FBUztzQkFEWixLQUFLO2dCQVNJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBUUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFrSkcsZUFBZTtzQkFEeEIsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBTXBCLFdBQVc7c0JBRHBCLFlBQVk7dUJBQUMseUJBQXlCO2dCQXFCN0IsY0FBYztzQkFEdkIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBzaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHsgZ2V0Vmlld3BvcnRXaWR0aCwgaXNNb2JpbGVWaWV3cG9ydCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvbGF5b3V0LnV0aWwnO1xuaW1wb3J0IHsgZ2V0Rm9jdXNhYmxlRWxlbWVudHMgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2ZvY3VzLnV0aWwnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UQUJMRV9PUFRJT05TLFxuICBUQUJMRV9DT0xVTU5fVFlQRV9DSEVDS0JPWF9TRUxFQ1RJT04gYXMgQ09MVU1OX1RZUEVfQ0hFQ0tCT1hfU0VMRUNUSU9OLFxuICBUQUJMRV9ERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWCBhcyBERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWCxcbiAgVEFCTEVfREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFggYXMgREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFgsXG4gIFRBQkxFX0RFRkFVTFRfUk9XX0hFSUdIVF9QWCBhcyBERUZBVUxUX1JPV19IRUlHSFRfUFgsXG4gIFRBQkxFX0RFRkFVTFRfUk9XU19QRVJfUEFHRSBhcyBERUZBVUxUX1JPV1NfUEVSX1BBR0UsXG4gIFRBQkxFX0lOREVYX1pFUk8gYXMgSU5ERVhfWkVSTyxcbiAgVEFCTEVfTUVOVV9HQVBfUFggYXMgTUVOVV9HQVBfUFgsXG4gIFRBQkxFX01PQklMRV9DQVJEX0VTVElNQVRFRF9IRUlHSFRfUFhcbn0gZnJvbSAnLi4vLi4vY29yZS9jb25zdGFudHMvdGFibGUuY29uc3QnO1xuaW1wb3J0IHsgREVGQVVMVF9MT0FESU5HX1NUQVRFX0lORElDQVRPUiB9IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL2xvYWRpbmctc3RhdGUuY29uc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWdpbmF0b3JTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvcGFnaW5hdG9yLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBMb2FkaW5nU3RhdGVJbmRpY2F0b3IgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2xvYWRpbmctc3RhdGUudHlwZSc7XG5pbXBvcnQgeyB0eXBlIFNlYXJjaFRyaWdnZXJNb2RlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zZWFyY2hib3gudHlwZSc7XG5pbXBvcnQge1xuICB0eXBlIEFjdGlvbk1lbnVJdGVtLFxuICB0eXBlIFJvd0Jhc2UsXG4gIHR5cGUgU29ydE9yZGVyLFxuICB0eXBlIFRhYmxlQWN0aW9uTWVudUl0ZW0gYXMgTmF0aXZlQWN0aW9uTWVudUl0ZW0sXG4gIHR5cGUgVGFibGVBY3Rpb25NZW51Q2xvc2VFdmVudCxcbiAgdHlwZSBUYWJsZUNlbGxDb25maWcsXG4gIHR5cGUgVGFibGVDZWxsQ29uZmlnS2V5LFxuICB0eXBlIFRhYmxlQ29sdW1uLFxuICB0eXBlIFRhYmxlT3Blbk1lbnVTdGF0ZSBhcyBPcGVuTWVudVN0YXRlLFxuICB0eXBlIFRhYmxlT3B0aW9ucyxcbiAgdHlwZSBUYWJsZVNlYXJjaEV2ZW50LFxuICBUYWJsZU1lbnVGb2N1c1RhcmdldFxufSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3RhYmxlLnR5cGUnO1xuXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaGJveENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJveC9zZWFyY2hib3guY29tcG9uZW50JztcbmltcG9ydCB7IExvYWRpbmdTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2xvYWRpbmctc3RhdGUvbG9hZGluZy1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCB9IGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBY3Rpb25zTWVudUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hY3Rpb25zLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQ2VsbENvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtY2VsbC1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZVNvcnRJbmRpY2F0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtc29ydC1pbmRpY2F0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IGJ1aWxkVGFibGVDZWxsQ29uZmlnTWFwLCBtZXJnZVRhYmxlT3B0aW9ucyB9IGZyb20gJy4vdXRpbHMvdGFibGUtY29uZmlnLnV0aWwnO1xuaW1wb3J0IHtcbiAgYnVpbGRSb3dDaGVja2JveElkLFxuICBmaWx0ZXJUYWJsZVJvd3MsXG4gIGdldE5lc3RlZFZhbHVlLFxuICByZXNvbHZlUm93SWRlbnRpdHlMYWJlbCxcbiAgcmVzb2x2ZVJvd1NlbGVjdGlvbktleVxufSBmcm9tICcuL3V0aWxzL3RhYmxlLWRhdGEudXRpbCc7XG5pbXBvcnQge1xuICBnZXRUYWJsZUNvbHVtbk1pbldpZHRoUHgsXG4gIGdldFRhYmxlTWluV2lkdGhQeCxcbiAgcmVzb2x2ZVRhYmxlQ29sdW1uQWxpZ25tZW50XG59IGZyb20gJy4vdXRpbHMvdGFibGUtbGF5b3V0LnV0aWwnO1xuXG5sZXQgdGFibGVJbnN0YW5jZVNlcXVlbmNlID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2RjLXRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBTZWFyY2hib3hDb21wb25lbnQsXG4gICAgUGFnaW5hdG9yQ29tcG9uZW50LFxuICAgIEJ1dHRvbkNvbXBvbmVudCxcbiAgICBMb2FkaW5nU3RhdGVDb21wb25lbnQsXG4gICAgRW1wdHlTdGF0ZUNvbXBvbmVudCxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgVGFibGVTb3J0SW5kaWNhdG9yQ29tcG9uZW50LFxuICAgIFRhYmxlQ2VsbENvbnRlbnRDb21wb25lbnQsXG4gICAgVGFibGVBY3Rpb25zTWVudUNvbXBvbmVudCxcbiAgICBUb29sdGlwQ29tcG9uZW50XG4gIF0sXG4gIHN0eWxlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuc2NzcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudDxUIGV4dGVuZHMgUm93QmFzZSA9IFJvd0Jhc2U+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdGF0aWMgYWxsb2NhdGVUYWJsZUluc3RhbmNlSWQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBuZXh0SWQgPSB0YWJsZUluc3RhbmNlU2VxdWVuY2U7XG4gICAgdGFibGVJbnN0YW5jZVNlcXVlbmNlICs9IDE7XG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBfdGFibGVJbnN0YW5jZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhY3Rpb25zTWVudUlkU2VxdWVuY2UgPSAwO1xuXG4gIHByaXZhdGUgZ2V0IHRhYmxlSW5zdGFuY2VJZCgpOiBudW1iZXIge1xuICAgIHRoaXMuX3RhYmxlSW5zdGFuY2VJZCA/Pz0gVGFibGVDb21wb25lbnQuYWxsb2NhdGVUYWJsZUluc3RhbmNlSWQoKTtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbnN0YW5jZUlkO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sc1NpZ25hbCA9IHNpZ25hbDxUYWJsZUNvbHVtbjxUPltdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNpZ25hbCA9IHNpZ25hbDxUW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nU2lnbmFsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cG9ydFdpZHRoU2lnbmFsID0gc2lnbmFsPG51bWJlcj4oZ2V0Vmlld3BvcnRXaWR0aCgpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NpZ25hbCA9IHNpZ25hbDxUYWJsZU9wdGlvbnM8VD4+KG1lcmdlVGFibGVPcHRpb25zKERFRkFVTFRfVEFCTEVfT1BUSU9OUyBhcyBUYWJsZU9wdGlvbnM8VD4pKTtcbiAgcHJpdmF0ZSBfY29uZmlnOiBUYWJsZU9wdGlvbnM8VD4gPSBERUZBVUxUX1RBQkxFX09QVElPTlM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoUGFydHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSByb3dDaGVja2JveElkQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3Blbk1lbnVTdGF0ZSA9IHNpZ25hbDxPcGVuTWVudVN0YXRlPFQ+IHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBhcmlhTGFiZWxTaWduYWwgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBnbG9iYWxGaWx0ZXIgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0RmllbGQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0T3JkZXIgPSBzaWduYWw8U29ydE9yZGVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3Rpb25TaWduYWwgPSBzaWduYWw8VFtdPihbXSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBmaXJzdCA9IHNpZ25hbDxudW1iZXI+KElOREVYX1pFUk8pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm93cyA9IHNpZ25hbDxudW1iZXI+KERFRkFVTFRfUk9XU19QRVJfUEFHRSk7XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgc2V0IGNvbHModmFsdWU6IFRhYmxlQ29sdW1uPFQ+W10gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5jb2xzU2lnbmFsLnNldCh2YWx1ZSA/PyBbXSk7XG4gIH1cblxuICBnZXQgY29scygpOiBUYWJsZUNvbHVtbjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xzU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBzZXQgZGF0YSh2YWx1ZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuZGF0YVNpZ25hbC5zZXQodmFsdWUgPz8gW10pO1xuICAgIHRoaXMucmVjb25jaWxlU2VsZWN0aW9uV2l0aERhdGEoKTtcbiAgICB0aGlzLmNsYW1wUGFnZSgpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgZ2V0IGRhdGEoKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgc2VsZWN0aW9uKHZhbHVlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zZWxlY3Rpb25TaWduYWwuc2V0KHRoaXMubm9ybWFsaXplU2VsZWN0aW9uKHZhbHVlID8/IFtdKSk7XG4gIH1cblxuICBnZXQgc2VsZWN0aW9uKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoeyByZXF1aXJlZDogZmFsc2UgfSlcbiAgc2V0IGxvYWRpbmcodmFsdWU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5sb2FkaW5nU2lnbmFsLnNldCh2YWx1ZSA9PT0gdHJ1ZSk7XG5cbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTaWduYWwoKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsb2FkaW5nSW5kaWNhdG9yOiBMb2FkaW5nU3RhdGVJbmRpY2F0b3IgPSBERUZBVUxUX0xPQURJTkdfU1RBVEVfSU5ESUNBVE9SO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiBmYWxzZSB9KVxuICBzZXQgY29uZmlnKHZhbHVlOiBUYWJsZU9wdGlvbnM8VD4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlID8/IERFRkFVTFRfVEFCTEVfT1BUSU9OUztcblxuICAgIGlmICh0aGlzLl9jb25maWcgPT09IG5leHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb25maWcgPSBuZXh0O1xuICAgIHRoaXMuY29uZmlnU2lnbmFsLnNldChtZXJnZVRhYmxlT3B0aW9ucyhuZXh0KSk7XG5cbiAgICBjb25zdCBuZXh0Um93cyA9IHRoaXMuY29uZmlnU2lnbmFsKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2UgPz8gREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuICAgIHRoaXMucm93cy5zZXQobmV4dFJvd3MpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuXG4gICAgdGhpcy5wYXRoUGFydHNDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucm93Q2hlY2tib3hJZENhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBzdHJpbmc+KCk7XG4gICAgdGhpcy5yZWNvbmNpbGVTZWxlY3Rpb25XaXRoRGF0YSgpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpOiBUYWJsZU9wdGlvbnM8VD4ge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYXJpYUxhYmVsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmFyaWFMYWJlbFNpZ25hbC5zZXQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGFyaWFMYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpO1xuICB9XG5cbiAgQE91dHB1dCgpIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb2x1bW46IFRhYmxlQ29sdW1uPFQ+OyByb3c6IFQ7IHZhbHVlOiB1bmtub3duIH0+KCk7XG4gIEBPdXRwdXQoKSByb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIGxhenlMb2FkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgZmlyc3Q6IG51bWJlcjtcbiAgICByb3dzOiBudW1iZXI7XG4gICAgc29ydEZpZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICBzb3J0T3JkZXI/OiBTb3J0T3JkZXI7XG4gICAgdHJpZ2dlcj86ICdwYWdlJyB8ICdzb3J0JyB8ICdzZWFyY2gnO1xuICAgIHNlYXJjaFRlcm0/OiBzdHJpbmc7XG4gIH0+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4oKTtcblxuICBnZXQgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTaWduYWwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zID0gY29tcHV0ZWQ8VGFibGVPcHRpb25zPFQ+PigoKSA9PiB0aGlzLmNvbmZpZ1NpZ25hbCgpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTW9iaWxlID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNpdmUgPSB0aGlzLm9wdGlvbnMoKS50YWJsZT8ucmVzcG9uc2l2ZTtcbiAgICBpZiAocmVzcG9uc2l2ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzTW9iaWxlVmlld3BvcnQodGhpcy52aWV3cG9ydFdpZHRoU2lnbmFsKCkpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1NlYXJjaCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8uc2hvdyA/PyBmYWxzZSk7XG4gIC8vIE9wdC1pbiBwb3IgdGFiZWxhIChkZWZhdWx0IGZhbHNlIC0gcHJlc2VydmEgYSBsYXJndXJhIGF0dWFsLCBtaW4oMTAwJSwgMjJyZW0pLCBwcmFcbiAgLy8gbsOjbyBhZmV0YXIgY29uc3VtaWRvcmVzIGV4aXN0ZW50ZXMpIC0gdmVyIHRhYmxlLmNvbXBvbmVudC5zY3NzLlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VhcmNoRnVsbFdpZHRoID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5vcHRpb25zKCkuc2VhcmNoPy5mdWxsV2lkdGggPz8gZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1BhZ2luYXRvciA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnNob3cgPz8gZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd0luaXRpYWxMb2FkaW5nID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5sb2FkaW5nU2lnbmFsKCkgJiYgdGhpcy5kYXRhU2lnbmFsKCkubGVuZ3RoID09PSAwKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm93c1BlclBhZ2VPcHRpb25zID0gY29tcHV0ZWQ8bnVtYmVyW10+KCgpID0+IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlT3B0aW9ucyA/PyBbXSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93Um93c1BlclBhZ2VTZWxlY3RvciA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnNob3dSb3dzUGVyUGFnZVNlbGVjdG9yID8/IGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlYXJjaFBsYWNlaG9sZGVyID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5zZWFyY2g/LnBsYWNlaG9sZGVyID8/ICcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyaWdnZXJNb2RlID0gY29tcHV0ZWQ8U2VhcmNoVHJpZ2dlck1vZGU+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8udHlwZSA/PyAnYXV0bycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG90YWxSZWNvcmRzTGFiZWwgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLnRhYmxlPy50b3RhbFJlY29yZHNMYWJlbCA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0VGV4dE92ZXJmbG93ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCkudGFibGU/LnRleHRPdmVyZmxvdyk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0YWJsZU1vZGUgPSBjb21wdXRlZDwnbG9jYWwnIHwgJ2FwaSc+KCgpID0+IHRoaXMub3B0aW9ucygpLnRhYmxlPy5tb2RlID8/ICdsb2NhbCcpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNBcGlNb2RlID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy50YWJsZU1vZGUoKSA9PT0gJ2FwaScpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNGaXRMYXlvdXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8ubGF5b3V0ID09PSAnZml0Jyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2JpbGVNb2RlID0gY29tcHV0ZWQ8J2V4cGFuZGFibGUnIHwgJ3N0YWNrZWQnPigoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8ubW9iaWxlTW9kZSA/PyAnZXhwYW5kYWJsZScpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXhwYW5kZWRSb3dJbmRleCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN1bW1hcnlDb2xzID0gY29tcHV0ZWQ8VGFibGVDb2x1bW48VD5bXT4oKCkgPT4ge1xuICAgIGNvbnN0IFNVTU1BUllfQ09MX0NPVU5UID0gMjtcbiAgICByZXR1cm4gdGhpcy5jb2xzU2lnbmFsKClcbiAgICAgIC5maWx0ZXIoY29sID0+IGNvbC50eXBlICE9PSBDT0xVTU5fVFlQRV9DSEVDS0JPWF9TRUxFQ1RJT04gJiYgY29sLnR5cGUgIT09ICdhY3Rpb25zJyAmJiBjb2wudHlwZSAhPT0gJ2J1dHRvbicpXG4gICAgICAuc2xpY2UoMCwgU1VNTUFSWV9DT0xfQ09VTlQpO1xuICB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoZWNrYm94Q29sID0gY29tcHV0ZWQ8VGFibGVDb2x1bW48VD4gfCBudWxsPigoKSA9PlxuICAgIHRoaXMuY29sc1NpZ25hbCgpLmZpbmQoY29sID0+IGNvbC50eXBlID09PSBDT0xVTU5fVFlQRV9DSEVDS0JPWF9TRUxFQ1RJT04pID8/IG51bGxcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtcHR5VGl0bGUgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLmVtcHR5Py50aXRsZSA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eVRleHQgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLmVtcHR5Py50ZXh0ID8/ICcnKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2VsbHNDZmcgPSBjb21wdXRlZCgoKSA9PiBidWlsZFRhYmxlQ2VsbENvbmZpZ01hcCh0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmaWx0ZXJlZERhdGEgPSBjb21wdXRlZDxUW10+KCgpID0+IHtcbiAgICBpZiAodGhpcy5pc0FwaU1vZGUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVNpZ25hbCgpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJUYWJsZVJvd3ModGhpcy5kYXRhU2lnbmFsKCksIHRoaXMuY29sc1NpZ25hbCgpLCB0aGlzLmdsb2JhbEZpbHRlcigpLCB0aGlzLnJlc29sdmVWYWx1ZSk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0ZWREYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgaWYgKHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkRGF0YSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5zb3J0RmllbGQoKTtcbiAgICBjb25zdCBvcmRlciA9IHRoaXMuc29ydE9yZGVyKCk7XG4gICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLmZpbHRlcmVkRGF0YSgpXTtcblxuICAgIGlmICghZmllbGQgfHwgb3JkZXIgPT09IDApIHtcbiAgICAgIHJldHVybiByb3dzO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzLnNvcnQoKGxlZnRSb3csIHJpZ2h0Um93KSA9PiB7XG4gICAgICBjb25zdCBsZWZ0VmFsdWUgPSB0aGlzLnJlc29sdmVWYWx1ZShsZWZ0Um93LCBmaWVsZCk7XG4gICAgICBjb25zdCByaWdodFZhbHVlID0gdGhpcy5yZXNvbHZlVmFsdWUocmlnaHRSb3csIGZpZWxkKTtcblxuICAgICAgaWYgKGxlZnRWYWx1ZSA9PSBudWxsICYmIHJpZ2h0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGxlZnRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAtb3JkZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChyaWdodFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG9yZGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGxlZnRWYWx1ZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHJpZ2h0VmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiAobGVmdFZhbHVlIC0gcmlnaHRWYWx1ZSkgKiBvcmRlcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMudG9Db21wYXJhYmxlVGV4dChsZWZ0VmFsdWUpLmxvY2FsZUNvbXBhcmUodGhpcy50b0NvbXBhcmFibGVUZXh0KHJpZ2h0VmFsdWUpKSAqIG9yZGVyO1xuICAgIH0pO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG90YWxSZWNvcmRzID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaVRvdGFsID0gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8udG90YWxSZWNvcmRzO1xuXG4gICAgaWYgKHR5cGVvZiBhcGlUb3RhbCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGFwaVRvdGFsKSAmJiBhcGlUb3RhbCA+PSAwKSB7XG4gICAgICByZXR1cm4gTWF0aC50cnVuYyhhcGlUb3RhbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc29ydGVkRGF0YSgpLmxlbmd0aDtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZ2VEYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnNob3dQYWdpbmF0b3IoKSB8fCB0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpcnN0KCk7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyB0aGlzLnJvd3MoKTtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBpbml0aWFsTG9hZGluZ1Jvd3MgPSBjb21wdXRlZDxudW1iZXJbXT4oKCkgPT4ge1xuICAgIGNvbnN0IHJvd3NGcm9tU3RhdGUgPSB0aGlzLnJvd3MoKTtcbiAgICBjb25zdCByb3dzRnJvbUNvbmZpZyA9IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcbiAgICBjb25zdCBub3JtYWxpemVkUm93cyA9IE51bWJlcihyb3dzRnJvbVN0YXRlIHx8IHJvd3NGcm9tQ29uZmlnIHx8IERFRkFVTFRfUk9XU19QRVJfUEFHRSk7XG4gICAgY29uc3Qgc2FmZVJvd3MgPSBOdW1iZXIuaXNGaW5pdGUobm9ybWFsaXplZFJvd3MpICYmIG5vcm1hbGl6ZWRSb3dzID4gMCA/IG5vcm1hbGl6ZWRSb3dzIDogREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHNhZmVSb3dzIH0sIChfLCBpbmRleCkgPT4gaW5kZXgpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0aW9uU2V0ID0gY29tcHV0ZWQ8U2V0PFQ+PigoKSA9PiBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2lnbmFsKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYm9keVZpZXdwb3J0SGVpZ2h0UHggPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICBjb25zdCByb3dzRnJvbVN0YXRlID0gdGhpcy5yb3dzKCk7XG4gICAgY29uc3Qgcm93c0Zyb21Db25maWcgPSB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJvd3MgPSBOdW1iZXIocm93c0Zyb21TdGF0ZSB8fCByb3dzRnJvbUNvbmZpZyB8fCBERUZBVUxUX1JPV1NfUEVSX1BBR0UpO1xuICAgIGNvbnN0IHNhZmVSb3dzID0gTnVtYmVyLmlzRmluaXRlKG5vcm1hbGl6ZWRSb3dzKSAmJiBub3JtYWxpemVkUm93cyA+IDAgPyBub3JtYWxpemVkUm93cyA6IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcblxuICAgIGNvbnN0IHJvd0hlaWdodCA9IHRoaXMuaXNNb2JpbGUoKSA/IFRBQkxFX01PQklMRV9DQVJEX0VTVElNQVRFRF9IRUlHSFRfUFggOiBERUZBVUxUX1JPV19IRUlHSFRfUFg7XG4gICAgY29uc3QgZXN0aW1hdGVkSGVpZ2h0ID0gc2FmZVJvd3MgKiByb3dIZWlnaHQgKyBERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWDtcblxuICAgIHJldHVybiBNYXRoLm1heChERUZBVUxUX01JTl9MT0FESU5HX0hFSUdIVF9QWCwgZXN0aW1hdGVkSGVpZ2h0KTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtcHR5Qm9keUhlaWdodFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB0aGlzLmJvZHlWaWV3cG9ydEhlaWdodFB4KCkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGFibGVNaW5XaWR0aFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiBnZXRUYWJsZU1pbldpZHRoUHgodGhpcy5jb2xzU2lnbmFsKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZVZhbHVlID0gKG9iajogVCwgcGF0aD86IHN0cmluZyk6IHVua25vd24gPT5cbiAgICBnZXROZXN0ZWRWYWx1ZShvYmosIHBhdGgsIHRoaXMucGF0aFBhcnRzQ2FjaGUpO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgcHJvdGVjdGVkIG9uRG9jdW1lbnRDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgcHJvdGVjdGVkIG9uRXNjYXBlS2V5KCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudShUYWJsZU1lbnVGb2N1c1RhcmdldC5UcmlnZ2VyKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLmZsb29yKGVudHJpZXNbMF0/LmNvbnRlbnRSZWN0LndpZHRoID8/IDApO1xuICAgICAgaWYgKHdpZHRoID4gMCkge1xuICAgICAgICB0aGlzLnZpZXdwb3J0V2lkdGhTaWduYWwuc2V0KHdpZHRoKTtcbiAgICAgICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBwcm90ZWN0ZWQgb25XaW5kb3dTY3JvbGwoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZWFyY2hUZXJtKGV2ZW50T3JWYWx1ZTogVGFibGVTZWFyY2hFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRlcm0gPSB0eXBlb2YgZXZlbnRPclZhbHVlID09PSAnc3RyaW5nJyA/IGV2ZW50T3JWYWx1ZSA6IGV2ZW50T3JWYWx1ZT8uZGV0YWlsID8/ICcnO1xuICAgIHRoaXMuZ2xvYmFsRmlsdGVyLnNldChTdHJpbmcodGVybSkpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuXG4gICAgaWYgKHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHRoaXMuZW1pdExhenlMb2FkKCdzZWFyY2gnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DbGVhclNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlci5zZXQoJycpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuXG4gICAgaWYgKHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHRoaXMuZW1pdExhenlMb2FkKCdzZWFyY2gnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlU29ydChmaWVsZDogc3RyaW5nLCBlbmFibGVkID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICghZW5hYmxlZCB8fCAhZmllbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RmllbGQoKSAhPT0gZmllbGQpIHtcbiAgICAgIHRoaXMuc29ydEZpZWxkLnNldChmaWVsZCk7XG4gICAgICB0aGlzLnNvcnRPcmRlci5zZXQoMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRPcmRlciA9IHRoaXMuc29ydE9yZGVyKCk7XG5cbiAgICAgIGlmIChjdXJyZW50T3JkZXIgPT09IDEpIHtcbiAgICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KC0xKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudE9yZGVyID09PSAtMSkge1xuICAgICAgICB0aGlzLnNvcnRPcmRlci5zZXQoMCk7XG4gICAgICAgIHRoaXMuc29ydEZpZWxkLnNldChudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ydE9yZGVyLnNldCgxKTtcbiAgICAgICAgdGhpcy5zb3J0RmllbGQuc2V0KGZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcbiAgICBpZiAodGhpcy5pc0FwaU1vZGUoKSkge1xuICAgICAgdGhpcy5lbWl0TGF6eUxvYWQoJ3NvcnQnKTtcbiAgICB9XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U29ydEFyaWFBdHRyaWJ1dGUoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbC5zb3J0YWJsZSA9PT0gZmFsc2UgfHwgIWNvbC5maWVsZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RmllbGQoKSAhPT0gY29sLmZpZWxkKSB7XG4gICAgICByZXR1cm4gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zb3J0T3JkZXIoKTtcblxuICAgIGlmIChvcmRlciA9PT0gMSkge1xuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xuICAgIH1cblxuICAgIGlmIChvcmRlciA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAnZGVzY2VuZGluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdub25lJztcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5BbGlnbkNsYXNzKGNvbDogVGFibGVDb2x1bW48VD4sIHRhcmdldDogJ2NlbGwnIHwgJ2hlYWRlcicgPSAnY2VsbCcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFsaWduID0gcmVzb2x2ZVRhYmxlQ29sdW1uQWxpZ25tZW50KGNvbCwgdGFyZ2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0ID09PSAnaGVhZGVyJ1xuICAgICAgPyBgc2RjLXRhYmxlLXRoLWFsaWduLSR7YWxpZ259YFxuICAgICAgOiBgc2RjLXRhYmxlLXRkLWFsaWduLSR7YWxpZ259YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1NvcnRhYmxlQ29sdW1uKGNvbDogVGFibGVDb2x1bW48VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sLnR5cGUgIT09IENPTFVNTl9UWVBFX0NIRUNLQk9YX1NFTEVDVElPTiAmJiBjb2wuc29ydGFibGUgIT09IGZhbHNlICYmICEhY29sLmZpZWxkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhc0RhdGFSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTaWduYWwoKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhblNvcnRDb2x1bW4oY29sOiBUYWJsZUNvbHVtbjxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RhdGFSb3dzKCkgJiYgdGhpcy5pc1NvcnRhYmxlQ29sdW1uKGNvbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29sdW1uTWluV2lkdGhQeChjb2w6IFRhYmxlQ29sdW1uPFQ+KTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0VGFibGVDb2x1bW5NaW5XaWR0aFB4KGNvbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29sV2lkdGhTdHlsZShjb2w6IFRhYmxlQ29sdW1uPFQ+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5pc0ZpdExheW91dCgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBjb2wud2lkdGggIT0gbnVsbCA/IGAke2NvbC53aWR0aH0lYCA6IGAke2dldFRhYmxlQ29sdW1uTWluV2lkdGhQeChjb2wpfXB4YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBtb2JpbGVGaWVsZExhYmVsKGNvbDogVGFibGVDb2x1bW48VD4pOiBzdHJpbmcge1xuICAgIGlmIChjb2wuaGVhZGVyKSB7XG4gICAgICByZXR1cm4gY29sLmhlYWRlcjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbC50eXBlKSB7XG4gICAgICBjYXNlICdhY3Rpb25zJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHNDZmcoKS5hY3Rpb25zLmJ1dHRvbkxhYmVsIHx8ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X2FjdGlvbnNfbWVudSc7XG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc0NmZygpLmJ1dHRvbi5sYWJlbFxuICAgICAgICAgIHx8IHRoaXMuY2VsbHNDZmcoKS5idXR0b24udG9vbHRpcFxuICAgICAgICAgIHx8ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X2FjdGlvbl9idXR0b24nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVFeHBhbmRSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRSb3dJbmRleC5zZXQodGhpcy5leHBhbmRlZFJvd0luZGV4KCkgPT09IGluZGV4ID8gbnVsbCA6IGluZGV4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1Jvd0V4cGFuZGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZFJvd0luZGV4KCkgPT09IGluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUGFnZUNoYW5nZShldmVudDogUGFnaW5hdG9yU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0Rmlyc3QgPSBldmVudC5maXJzdCA/PyBJTkRFWF9aRVJPO1xuICAgIGNvbnN0IG5leHRSb3dzID0gZXZlbnQucm93cyA/PyB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICB0aGlzLmZpcnN0LnNldChuZXh0Rmlyc3QpO1xuICAgIHRoaXMucm93cy5zZXQobmV4dFJvd3MpO1xuICAgIHRoaXMuZXhwYW5kZWRSb3dJbmRleC5zZXQobnVsbCk7XG4gICAgdGhpcy5lbWl0TGF6eUxvYWQoJ3BhZ2UnKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIC8vIFNlbXByZSBlbWl0ZSBgcm93Q2xpY2tgIChjb21wb3J0YW1lbnRvIHByw6ktZXhpc3RlbnRlKTsgYWzDqW0gZGlzc28sIGFsdGVybmEgYSBzZWxlw6fDo29cbiAgLy8gZGEgbGluaGEgcXVhbmRvIGBjZWxscy5jaGVja2JveC5zZWxlY3RPblJvd0NsaWNrYCBlc3TDoSBoYWJpbGl0YWRvIGUgYSBsaW5oYSB0ZW0gdW1hXG4gIC8vIGNvbHVuYSBkZSBzZWxlw6fDo28gKGNoZWNrYm94Q29sKS4gTyBwcsOzcHJpbyBpbnB1dCBkbyBjaGVja2JveCBmYXogc3RvcFByb3BhZ2F0aW9uIG5vXG4gIC8vIGNsaWNrICh2ZXIgdGFibGUtY2VsbC1jb250ZW50LmNvbXBvbmVudC5odG1sKSwgZW50w6NvIGVzc2UgaGFuZGxlciBzw7MgZGlzcGFyYSBwYXJhXG4gIC8vIGNsaXF1ZXMgZm9yYSBkbyBjaGVja2JveCAtIHNlbSB0b2dnbGUgZHVwbGljYWRvLlxuICBwcm90ZWN0ZWQgb25Sb3dDbGlja2VkKHJvdzogVCk6IHZvaWQge1xuICAgIHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xuXG4gICAgaWYgKCF0aGlzLmNoZWNrYm94Q29sKCkgfHwgIXRoaXMuY2VsbHNDZmcoKS5jaGVja2JveC5zZWxlY3RPblJvd0NsaWNrIHx8IHRoaXMuaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vblRvZ2dsZVJvdyhyb3csICF0aGlzLmlzUm93U2VsZWN0ZWQocm93KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Ub2dnbGVSb3cocm93OiBULCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFNlbGVjdGlvbiA9IG5ldyBTZXQodGhpcy5zZWxlY3Rpb25TZXQoKSk7XG5cbiAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgbmV4dFNlbGVjdGlvbi5hZGQocm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFNlbGVjdGlvbi5kZWxldGUocm93KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihuZXh0U2VsZWN0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1Jvd1NlbGVjdGVkKHJvdzogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNldCgpLmhhcyhyb3cpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93OiBUKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGlzYWJsZWQgPSB0aGlzLmNlbGxzQ2ZnKCkuY2hlY2tib3guZGlzYWJsZWQ7XG5cbiAgICBpZiAodHlwZW9mIGRpc2FibGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZGlzYWJsZWQocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzYWJsZWQgPT09IHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlU2VsZWN0UGFnZShjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dFNlbGVjdGlvbiA9IG5ldyBTZXQodGhpcy5zZWxlY3Rpb25TZXQoKSk7XG5cbiAgICB0aGlzLnNlbGVjdGFibGVQYWdlUm93cygpLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgbmV4dFNlbGVjdGlvbi5hZGQocm93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRTZWxlY3Rpb24uZGVsZXRlKHJvdyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihuZXh0U2VsZWN0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1BhZ2VGdWxseVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZpc2libGVSb3dzID0gdGhpcy5zZWxlY3RhYmxlUGFnZVJvd3MoKTtcblxuICAgIGlmICh2aXNpYmxlUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGlvblNldCgpO1xuICAgIHJldHVybiB2aXNpYmxlUm93cy5ldmVyeSgocm93KSA9PiBzZWxlY3RlZFJvd3MuaGFzKHJvdykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUGFnZVBhcnRpYWxseVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZpc2libGVSb3dzID0gdGhpcy5zZWxlY3RhYmxlUGFnZVJvd3MoKTtcblxuICAgIGlmICh2aXNpYmxlUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGlvblNldCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSB2aXNpYmxlUm93cy5maWx0ZXIoKHJvdykgPT4gc2VsZWN0ZWRSb3dzLmhhcyhyb3cpKS5sZW5ndGg7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRDb3VudCA+IDAgJiYgc2VsZWN0ZWRDb3VudCA8IHZpc2libGVSb3dzLmxlbmd0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYXNTZWxlY3RhYmxlUGFnZVJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0YWJsZVBhZ2VSb3dzKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQYWdlU2VsZWN0aW9uQXJpYUNoZWNrZWQoKTogJ2ZhbHNlJyB8ICdtaXhlZCcgfCAndHJ1ZScge1xuICAgIGlmICh0aGlzLmlzUGFnZVBhcnRpYWxseVNlbGVjdGVkKCkpIHtcbiAgICAgIHJldHVybiAnbWl4ZWQnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzUGFnZUZ1bGx5U2VsZWN0ZWQoKSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2hlY2tlZFZhbHVlKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Um93Q2hlY2tib3hJZChyb3c6IFQpOiBzdHJpbmcge1xuICAgIGlmICghcm93IHx8IHR5cGVvZiByb3cgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gYnVpbGRSb3dDaGVja2JveElkKHJvdyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5yb3dDaGVja2JveElkQ2FjaGUuZ2V0KHJvdyk7XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRJZCA9IGJ1aWxkUm93Q2hlY2tib3hJZChyb3cpO1xuICAgIHRoaXMucm93Q2hlY2tib3hJZENhY2hlLnNldChyb3csIG5leHRJZCk7XG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dDaGVja2JveExhYmVsKHJvdzogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVSb3dJZGVudGl0eUxhYmVsKHJvdyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2VsZWN0QWxsQ2hlY2tib3hJZChjb2x1bW5JbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHNkYy10YWJsZS0ke3RoaXMudGFibGVJbnN0YW5jZUlkfS1zZWxlY3QtYWxsLWNoZWNrYm94LSR7Y29sdW1uSW5kZXh9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0YWJsZUFyaWFMYWJlbEtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpID8/ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3RhYmxlX2Rlc2NyaXB0aW9uJztcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVBY3Rpb25zTWVudShldmVudDogRXZlbnQsIHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPiwgdHJpZ2dlckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAodGhpcy5pc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkpIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbnNPcHRpb25zID0gdGhpcy5jZWxsQ2ZnKCdhY3Rpb25zJyk7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmFjdGlvbkl0ZW1zRm9yKHJvdywgYWN0aW9uc09wdGlvbnMpO1xuICAgIGNvbnN0IHJlY3QgPSB0cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBtZW51SWQgPSB0aGlzLm5leHRBY3Rpb25zTWVudUlkKCk7XG5cbiAgICB0aGlzLm9wZW5NZW51U3RhdGUuc2V0KHtcbiAgICAgIHJvdyxcbiAgICAgIGNvbCxcbiAgICAgIGl0ZW1zLFxuICAgICAgbWVudUlkLFxuICAgICAgY2xvc2VPbkNsaWNrOiBhY3Rpb25zT3B0aW9ucz8uY2xvc2VPbkNsaWNrICE9PSBmYWxzZSxcbiAgICAgIHRyaWdnZXI6IHRyaWdnZXJFbGVtZW50LFxuICAgICAgdG9wOiByZWN0LmJvdHRvbSArIE1FTlVfR0FQX1BYLFxuICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgd2lkdGg6IHJlY3Qud2lkdGhcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZUFjdGlvbnNNZW51KGZvY3VzVGFyZ2V0OiBUYWJsZU1lbnVGb2N1c1RhcmdldCA9IFRhYmxlTWVudUZvY3VzVGFyZ2V0Lk5vbmUpOiB2b2lkIHtcbiAgICBjb25zdCBtZW51ID0gdGhpcy5vcGVuTWVudVN0YXRlKCk7XG4gICAgdGhpcy5vcGVuTWVudVN0YXRlLnNldChudWxsKTtcblxuICAgIGlmICghbWVudSB8fCBmb2N1c1RhcmdldCA9PT0gVGFibGVNZW51Rm9jdXNUYXJnZXQuTm9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuZm9jdXNDbG9zZWRNZW51VGFyZ2V0KG1lbnUudHJpZ2dlciwgbWVudS5tZW51SWQsIGZvY3VzVGFyZ2V0KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNBY3Rpb25zTWVudU9wZW4ocm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVudSA9IHRoaXMub3Blbk1lbnVTdGF0ZSgpO1xuXG4gICAgaWYgKCFtZW51KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbnUucm93ID09PSByb3cgJiYgbWVudS5jb2wgPT09IGNvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY3Rpb25JdGVtc0Zvcihyb3c6IFQsIG9wdGlvbnM6IFRhYmxlQ2VsbENvbmZpZzxULCAnYWN0aW9ucyc+KTogTmF0aXZlQWN0aW9uTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgaXRlbXMgPSBvcHRpb25zLml0ZW1zID8/IFtdO1xuXG4gICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbTogQWN0aW9uTWVudUl0ZW08VD4pID0+ICh7XG4gICAgICBrZXk6IGl0ZW0ua2V5LFxuICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICBpY29uOiBpdGVtLmljb24sXG4gICAgICBkaXNhYmxlZDogdGhpcy5yZXNvbHZlQWN0aW9uRGlzYWJsZWQoaXRlbSwgcm93KVxuICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblBvcnRhbEFjdGlvbkNsaWNrKGl0ZW06IE5hdGl2ZUFjdGlvbk1lbnVJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZW51ID0gdGhpcy5vcGVuTWVudVN0YXRlKCk7XG5cbiAgICBpZiAoIW1lbnUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uQWN0aW9uU2VsZWN0KG1lbnUucm93LCBtZW51LmNvbCwgaXRlbSk7XG5cbiAgICBpZiAobWVudS5jbG9zZU9uQ2xpY2spIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1lbnVDbG9zZShldmVudDogVGFibGVBY3Rpb25NZW51Q2xvc2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudShldmVudC5mb2N1c1RhcmdldCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25BY3Rpb25TZWxlY3Qocm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+LCBpdGVtOiB7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBkaXNhYmxlZD86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2wuYWN0aW9uRmllbGQgPz8gY29sLmZpZWxkO1xuICAgIGNvbnN0IHJvd1ZhbHVlID0gZmllbGRLZXkgPyB0aGlzLnJlc29sdmVWYWx1ZShyb3csIGZpZWxkS2V5KSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHsgcm93LCBjb2x1bW46IGNvbCwgdmFsdWU6IHsgcm93VmFsdWUsIGFjdGlvbjogaXRlbSB9IH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQnV0dG9uQ2xpY2socm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gY29sLmFjdGlvbkZpZWxkID8/IGNvbC5maWVsZDtcbiAgICBjb25zdCB2YWx1ZSA9IGtleSA/IHRoaXMucmVzb2x2ZVZhbHVlKHJvdywga2V5KSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHsgcm93LCB2YWx1ZSwgY29sdW1uOiBjb2wgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUNlbGxJZChjb2w6IFRhYmxlQ29sdW1uPFQ+LCByb3c6IFQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWNvbC5jZWxsSWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlb2YgY29sLmNlbGxJZCA9PT0gJ2Z1bmN0aW9uJyA/IChjb2wuY2VsbElkKHJvdykgfHwgbnVsbCkgOiAoY29sLmNlbGxJZCB8fCBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgY2VsbENmZzxLIGV4dGVuZHMgVGFibGVDZWxsQ29uZmlnS2V5PihraW5kOiBLKSB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHNDZmcoKVtraW5kXTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdExhenlMb2FkKHRyaWdnZXI6ICdwYWdlJyB8ICdzb3J0JyB8ICdzZWFyY2gnKTogdm9pZCB7XG4gICAgY29uc3QgcGF5bG9hZDoge1xuICAgICAgZmlyc3Q6IG51bWJlcjtcbiAgICAgIHJvd3M6IG51bWJlcjtcbiAgICAgIHNvcnRGaWVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgICBzb3J0T3JkZXI/OiBTb3J0T3JkZXI7XG4gICAgICB0cmlnZ2VyPzogJ3BhZ2UnIHwgJ3NvcnQnIHwgJ3NlYXJjaCc7XG4gICAgICBzZWFyY2hUZXJtPzogc3RyaW5nO1xuICAgIH0gPSB7XG4gICAgICBmaXJzdDogdGhpcy5maXJzdCgpLFxuICAgICAgcm93czogdGhpcy5yb3dzKCksXG4gICAgICBzb3J0RmllbGQ6IHRoaXMuc29ydEZpZWxkKCksXG4gICAgICBzb3J0T3JkZXI6IHRoaXMuc29ydE9yZGVyKCksXG4gICAgICB0cmlnZ2VyXG4gICAgfTtcblxuICAgIGlmICh0cmlnZ2VyID09PSAnc2VhcmNoJykge1xuICAgICAgcGF5bG9hZC5zZWFyY2hUZXJtID0gdGhpcy5nbG9iYWxGaWx0ZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmxhenlMb2FkLmVtaXQocGF5bG9hZCk7XG4gIH1cblxuICBwcml2YXRlIGNsYW1wUGFnZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1BhZ2luYXRvcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWF4Rmlyc3QgPSBNYXRoLm1heChJTkRFWF9aRVJPLCB0aGlzLnRvdGFsUmVjb3JkcygpIC0gdGhpcy5yb3dzKCkpO1xuXG4gICAgaWYgKHRoaXMuZmlyc3QoKSA+IG1heEZpcnN0KSB7XG4gICAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcbiAgICB9XG4gIH1cblxuICAvLyBOT1RFOiBpbiBgYXBpYCBtb2RlIChgY29uZmlnLnRhYmxlLm1vZGUgPT09ICdhcGknYCwgdXNlZCBieSBjb25zdW1lcnMgbGlrZSBzZGMtbG9va3VwIHRoYXRcbiAgLy8gZmV0Y2ggZWFjaCBwYWdlIGV4dGVybmFsbHkpLCBgZGF0YWAgaXMgc3dhcHBlZCBlbnRpcmVseSBvbiBldmVyeSBwYWdlL3NlYXJjaCBjaGFuZ2UgYW5kXG4gIC8vIG9ubHkgZXZlciByZXByZXNlbnRzIE9ORSBwYWdlJ3Mgd29ydGggb2Ygcm93cy4gUHJldmlvdXNseSwgYW55IHNlbGVjdGVkIHJvdyBub3QgZm91bmQgaW5cbiAgLy8gdGhlIGN1cnJlbnQgYGRhdGFgIGFycmF5IHdhcyB0cmVhdGVkIGFzIFwibm8gbG9uZ2VyIGV4aXN0c1wiIGFuZCBzaWxlbnRseSBkcm9wcGVkIOKAlCB3aGljaFxuICAvLyB3aXBlZCBvdXQgY3Jvc3MtcGFnZSBzZWxlY3Rpb25zIHRoZSBtb21lbnQgdGhlIHVzZXIgbmF2aWdhdGVkIHRvIGFub3RoZXIgcGFnZS4gSW4gYGFwaWBcbiAgLy8gbW9kZSB3ZSBub3cgcHJlc2VydmUgc2VsZWN0aW9ucyBmb3Igcm93cyBub3QgcHJlc2VudCBvbiB0aGUgY3VycmVudCBwYWdlLiBJbiBgbG9jYWxgIG1vZGUsXG4gIC8vIGBkYXRhYCBpcyBleHBlY3RlZCB0byByZXByZXNlbnQgdGhlIGZ1bGwvY3VycmVudCBkYXRhc2V0LCBzbyB0aGUgb3JpZ2luYWwgXCJkcm9wIHdoYXQncyBub3RcbiAgLy8gdGhlcmVcIiBiZWhhdmlvciBpcyBrZXB0IChhIGNvbnN1bWVyIHN3YXBwaW5nIHRvIGEgZ2VudWluZWx5IGRpZmZlcmVudCBkYXRhc2V0IHNob3VsZCBzdGlsbFxuICAvLyBjbGVhciBzdGFsZSBzZWxlY3Rpb25zKS5cbiAgcHJpdmF0ZSByZWNvbmNpbGVTZWxlY3Rpb25XaXRoRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBpc0FwaU1vZGUgPSB0aGlzLmlzQXBpTW9kZSgpO1xuICAgIGNvbnN0IHJvd3NCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5kYXRhU2lnbmFsKCkpIHtcbiAgICAgIGNvbnN0IHJvd0tleSA9IHRoaXMuZ2V0U2VsZWN0aW9uS2V5KHJvdyk7XG5cbiAgICAgIGlmICghcm93c0J5S2V5Lmhhcyhyb3dLZXkpKSB7XG4gICAgICAgIHJvd3NCeUtleS5zZXQocm93S2V5LCByb3cpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNlZW5LZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgbmV4dFNlbGVjdGlvbjogVFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnNlbGVjdGlvblNpZ25hbCgpKSB7XG4gICAgICBjb25zdCByb3dLZXkgPSB0aGlzLmdldFNlbGVjdGlvbktleShyb3cpO1xuXG4gICAgICBpZiAoIXNlZW5LZXlzLmhhcyhyb3dLZXkpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlUm93ID0gcm93c0J5S2V5LmdldChyb3dLZXkpO1xuICAgICAgICBjb25zdCBrZWVwUm93ID0gY3VycmVudFBhZ2VSb3cgPyAhdGhpcy5pc1Jvd1NlbGVjdGlvbkRpc2FibGVkKGN1cnJlbnRQYWdlUm93KSA6IGlzQXBpTW9kZTtcblxuICAgICAgICBpZiAoa2VlcFJvdykge1xuICAgICAgICAgIHNlZW5LZXlzLmFkZChyb3dLZXkpO1xuICAgICAgICAgIG5leHRTZWxlY3Rpb24ucHVzaChjdXJyZW50UGFnZVJvdyA/PyByb3cpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVBY3Rpb25EaXNhYmxlZChpdGVtOiBBY3Rpb25NZW51SXRlbTxUPiwgcm93OiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtLmRpc2FibGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlbS5kaXNhYmxlZChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtLmRpc2FibGVkID09PSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RhYmxlUGFnZVJvd3MoKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlRGF0YSgpLmZpbHRlcigocm93KSA9PiAhdGhpcy5pc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdykpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbjogSXRlcmFibGU8VD4pOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkU2VsZWN0aW9uID0gdGhpcy5ub3JtYWxpemVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbik7XG5cbiAgICBpZiAodGhpcy5oYXNTYW1lU2VsZWN0aW9uKHRoaXMuc2VsZWN0aW9uU2lnbmFsKCksIG5vcm1hbGl6ZWRTZWxlY3Rpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb25TaWduYWwuc2V0KG5vcm1hbGl6ZWRTZWxlY3Rpb24pO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoWy4uLm5vcm1hbGl6ZWRTZWxlY3Rpb25dKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplU2VsZWN0aW9uKG5leHRTZWxlY3Rpb246IEl0ZXJhYmxlPFQ+KTogVFtdIHtcbiAgICBjb25zdCBub3JtYWxpemVkU2VsZWN0aW9uOiBUW10gPSBbXTtcbiAgICBjb25zdCBzZWVuUm93cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgbmV4dFNlbGVjdGlvbikge1xuICAgICAgY29uc3Qgcm93S2V5ID0gdGhpcy5nZXRTZWxlY3Rpb25LZXkocm93KTtcblxuICAgICAgY29uc3Qgc2hvdWxkQXBwZW5kID0gIXNlZW5Sb3dzLmhhcyhyb3dLZXkpICYmICF0aGlzLmlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KTtcblxuICAgICAgaWYgKHNob3VsZEFwcGVuZCkge1xuICAgICAgICBzZWVuUm93cy5hZGQocm93S2V5KTtcbiAgICAgICAgbm9ybWFsaXplZFNlbGVjdGlvbi5wdXNoKHJvdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRTZWxlY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGlvbktleShyb3c6IFQpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlUm93U2VsZWN0aW9uS2V5KHJvdyk7XG4gIH1cblxuICBwcml2YXRlIGhhc1NhbWVTZWxlY3Rpb24oY3VycmVudFNlbGVjdGlvbjogVFtdLCBuZXh0U2VsZWN0aW9uOiBUW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvbi5sZW5ndGggPT09IG5leHRTZWxlY3Rpb24ubGVuZ3RoXG4gICAgICAmJiBjdXJyZW50U2VsZWN0aW9uLmV2ZXJ5KChyb3csIGluZGV4KSA9PiByb3cgPT09IG5leHRTZWxlY3Rpb25baW5kZXhdKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9Db21wYXJhYmxlVGV4dCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcml2YXRlIG5leHRBY3Rpb25zTWVudUlkKCk6IHN0cmluZyB7XG4gICAgdGhpcy5hY3Rpb25zTWVudUlkU2VxdWVuY2UgKz0gMTtcbiAgICByZXR1cm4gYHNkYy10YWJsZS1hY3Rpb25zLW1lbnUtJHt0aGlzLmFjdGlvbnNNZW51SWRTZXF1ZW5jZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0Nsb3NlZE1lbnVUYXJnZXQoXG4gICAgdHJpZ2dlcjogSFRNTEVsZW1lbnQsXG4gICAgbWVudUlkOiBzdHJpbmcsXG4gICAgZm9jdXNUYXJnZXQ6IFRhYmxlTWVudUZvY3VzVGFyZ2V0XG4gICk6IHZvaWQge1xuICAgIGlmICghdHJpZ2dlci5pc0Nvbm5lY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb2N1c1RhcmdldCA9PT0gVGFibGVNZW51Rm9jdXNUYXJnZXQuVHJpZ2dlcikge1xuICAgICAgdHJpZ2dlci5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG93bmVyRG9jdW1lbnQgPSB0cmlnZ2VyLm93bmVyRG9jdW1lbnQ7XG4gICAgY29uc3QgbWVudUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1lbnVJZCk7XG4gICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBnZXRGb2N1c2FibGVFbGVtZW50cyhvd25lckRvY3VtZW50KS5maWx0ZXIoKGVsZW1lbnQpID0+ICFtZW51RWxlbWVudD8uY29udGFpbnMoZWxlbWVudCkpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZvY3VzYWJsZUVsZW1lbnRzLmluZGV4T2YodHJpZ2dlcik7XG5cbiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gZm9jdXNUYXJnZXQgPT09IFRhYmxlTWVudUZvY3VzVGFyZ2V0Lk5leHQgPyBjdXJyZW50SW5kZXggKyAxIDogY3VycmVudEluZGV4IC0gMTtcbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzW3RhcmdldEluZGV4XTtcblxuICAgIG5leHRFbGVtZW50Py5mb2N1cygpO1xuICB9XG59XG4iLCI8c2VjdGlvblxuICBjbGFzcz1cInNkYy10YWJsZVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtc3RhY2tdPVwiaXNNb2JpbGUoKVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtZmlsdGVyZWRdPVwiISFnbG9iYWxGaWx0ZXIoKS50cmltKClcIlxuICBbY2xhc3Muc2RjLXRhYmxlLS1sb2FkaW5nXT1cImlzTG9hZGluZ1wiXG4gIFtjbGFzcy5zZGMtdGFibGUtLWluaXRpYWwtbG9hZGluZ109XCJzaG93SW5pdGlhbExvYWRpbmcoKVwiXG4+XG4gIDxzZGMtbG9hZGluZy1zdGF0ZVxuICAgIGNsYXNzPVwic2RjLXRhYmxlLWxvYWRpbmctd3JhcFwiXG4gICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgICBbYmxvY2tXaW5kb3ddPVwiZmFsc2VcIlxuICAgIFtibG9ja0RlbGF5TXNdPVwiMFwiXG4gICAgW2luZGljYXRvcl09XCJsb2FkaW5nSW5kaWNhdG9yXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtc2hlbGxcIiBbc3R5bGUuLS1zZGMtdGFibGUtYm9keS1oZWlnaHQucHhdPVwiYm9keVZpZXdwb3J0SGVpZ2h0UHgoKVwiPlxuICAgICAgQGlmIChzaG93U2VhcmNoKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1jYXB0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1jYXB0aW9uX19zZWFyY2hcIiBbY2xhc3Muc2RjLXRhYmxlLWNhcHRpb25fX3NlYXJjaC0tZnVsbC13aWR0aF09XCJzZWFyY2hGdWxsV2lkdGgoKVwiPlxuICAgICAgICAgICAgPHNkYy1zZWFyY2hib3hcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlcigpXCJcbiAgICAgICAgICAgICAgW3RyaWdnZXJNb2RlXT1cInRyaWdnZXJNb2RlKClcIlxuICAgICAgICAgICAgICAob25TZWFyY2gpPVwib25TZWFyY2hUZXJtKCRldmVudClcIlxuICAgICAgICAgICAgICAob25DbGVhcik9XCJvbkNsZWFyU2VhcmNoKClcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NlYXJjaF9maWVsZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoIWlzTW9iaWxlKCkpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXNjcm9sbFwiXG4gICAgICAgICAgW3N0eWxlLi0tc2RjLXRhYmxlLW1pbi13aWR0aF09XCJpc0ZpdExheW91dCgpID8gJzEwMCUnIDogdGFibGVNaW5XaWR0aFB4KCkgKyAncHgnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0YWJsZVxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZ3JpZFwiXG4gICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWdyaWQtLWZpdF09XCJpc0ZpdExheW91dCgpXCJcbiAgICAgICAgICAgIHJvbGU9XCJ0YWJsZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yb3djb3VudF09XCJ0b3RhbFJlY29yZHMoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Y29sZ3JvdXA+XG4gICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8Y29sIFtzdHlsZS53aWR0aF09XCJjb2xXaWR0aFN0eWxlKGNvbClcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2NvbGdyb3VwPlxuXG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciByb2xlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10aC1jdXJyZW5jeV09XCJjb2wudHlwZSA9PT0gJ2N1cnJlbmN5J1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtYnV0dG9uXT1cImNvbC50eXBlID09PSAnYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1zb3J0YWJsZV09XCJjYW5Tb3J0Q29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXNvcnRhYmxlLWRpc2FibGVkXT1cImlzU29ydGFibGVDb2x1bW4oY29sKSAmJiAhY2FuU29ydENvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1oZWFkZXItZGlzYWJsZWRdPVwiIWhhc0RhdGFSb3dzKClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWlzLXNlbGVjdGVkXT1cInNvcnRGaWVsZCgpID09PSBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbCwgJ2hlYWRlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cImdldFNvcnRBcmlhQXR0cmlidXRlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJoYXNEYXRhUm93cygpICYmIGNhblNvcnRDb2x1bW4oY29sKSA/IDAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCIhaGFzRGF0YVJvd3MoKSB8fCAoaXNTb3J0YWJsZUNvbHVtbihjb2wpICYmICFjYW5Tb3J0Q29sdW1uKGNvbCkpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXNTb3J0YWJsZUNvbHVtbihjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sLmhlYWRlciB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgLSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfc29ydGFibGVfY29sdW1uJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoY29sLmhlYWRlciB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhc0RhdGFSb3dzKCkgJiYgY29sLmZpZWxkID8gdG9nZ2xlU29ydChjb2wuZmllbGQsIGNhblNvcnRDb2x1bW4oY29sKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaGFzRGF0YVJvd3MoKSAmJiBjb2wuZmllbGQgPyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgY2FuU29ydENvbHVtbihjb2wpKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICBoYXNEYXRhUm93cygpICYmIGNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBjYW5Tb3J0Q29sdW1uKGNvbCkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nICYmIChjZWxsc0NmZygpLmNoZWNrYm94LnNlbGVjdEFsbCA/PyB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGgtaW5uZXIgc2RjLXRhYmxlLXRoLWlubmVyLS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGgtbGFiZWwgc3Itb25seVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IGNvbC5oZWFkZXIgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS10aC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0U2VsZWN0QWxsQ2hlY2tib3hJZCgkaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1BhZ2VGdWxseVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImlzUGFnZVBhcnRpYWxseVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzU2VsZWN0YWJsZVBhZ2VSb3dzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0UGFnZShnZXRDaGVja2VkVmFsdWUoJGV2ZW50KSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVTZWxlY3RQYWdlKCFpc1BhZ2VGdWxseVNlbGVjdGVkKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NlbGVjdF9hbGxfcm93cycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJnZXRQYWdlU2VsZWN0aW9uQXJpYUNoZWNrZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cImdldFNlbGVjdEFsbENoZWNrYm94SWQoJGluZGV4KVwiIGNsYXNzPVwic3Itb25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NlbGVjdF9hbGxfcm93cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS10aC1pbm5lclwiIFtjbGFzcy5zZGMtdGFibGUtdGgtaW5uZXItLXNvcnRhYmxlXT1cImlzU29ydGFibGVDb2x1bW4oY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGgtbGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBjb2wuaGVhZGVyIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5oZWFkZXJUb29sdGlwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXRoLXRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJjb2wuaGVhZGVyVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJjb2wuaGVhZGVyVG9vbHRpcFBvc2l0aW9uID8/ICd0b3AnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcEV2ZW50XT1cImNvbC5oZWFkZXJUb29sdGlwRXZlbnQgPz8gJ2hvdmVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1pbmZvIHNkYy10YWJsZS10aC10b29sdGlwX19pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NkYy10b29sdGlwPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS1zb3J0LW92ZXJsYXlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1zb3J0LWluZGljYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5GaWVsZF09XCJjb2wuZmllbGQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtblR5cGVdPVwiY29sLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0RmllbGRdPVwic29ydEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0T3JkZXJdPVwic29ydE9yZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtc29ydC1pbmRpY2F0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICBAaWYgKHNob3dJbml0aWFsTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgQGZvciAocm93SW5kZXggb2YgaW5pdGlhbExvYWRpbmdSb3dzKCk7IHRyYWNrIHJvd0luZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwic2RjLXRhYmxlLWluaXRpYWwtbG9hZGluZy1yb3dcIiByb2xlPVwicm93XCIgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyICsgMVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10ZCBzZGMtdGFibGUtdGRjIHNkYy10YWJsZS10ZC0taW5pdGlhbC1sb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbkFsaWduQ2xhc3MoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRpdGxlXT1cImNvbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsIHNkYy10YWJsZS10ZC12YWwtLWluaXRpYWwtbG9hZGluZ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgcGFnZURhdGEoKTsgdHJhY2sgJGluZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInIgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2tlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25Sb3dDbGlja2VkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10ZCBzZGMtdGFibGUtdGRjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtaXMtc2VsZWN0ZWRdPVwic29ydEZpZWxkKCkgPT09IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZV09XCJjb2wuaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNvbC5jb2xJZCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5jZWxsVGFnID09PSAnc3BhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29sLmNlbGxUYWcgPT09ICdpJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChjb2wuY2VsbFRhZyA9PT0gJ3AnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbFwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51SWRdPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpID8gb3Blbk1lbnVTdGF0ZSgpPy5tZW51SWQgPz8gbnVsbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbFwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51SWRdPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpID8gb3Blbk1lbnVTdGF0ZSgpPy5tZW51SWQgPz8gbnVsbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgICAgPHNkYy1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgICBpZD1cIm15LWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiZW1wdHlUaXRsZSgpXCJcbiAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5VGV4dCgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgICBbc3R5bGUubWluLWhlaWdodC5weF09XCJlbXB0eUJvZHlIZWlnaHRQeCgpXCJcbiAgICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAobW9iaWxlTW9kZSgpID09PSAnc3RhY2tlZCcpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1saXN0XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJpc0xvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChzaG93SW5pdGlhbExvYWRpbmcoKSkge1xuICAgICAgICAgICAgQGZvciAocm93SW5kZXggb2YgaW5pdGlhbExvYWRpbmdSb3dzKCk7IHRyYWNrIHJvd0luZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1jYXJkIHNkYy10YWJsZS1tb2JpbGUtY2FyZC0tbG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWZpZWxkIHNkYy10YWJsZS1tb2JpbGUtZmllbGQtLWxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGFiZWwgc2RjLXRhYmxlLW1vYmlsZS1sYWJlbC0tbG9hZGluZ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1za2VsZXRvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBwYWdlRGF0YSgpOyB0cmFjayAkaW5kZXg7IGxldCByID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1mdWxsLXdpZHRoXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09PSAnYnV0dG9uJyB8fCBjb2wudHlwZSA9PT0gJ2FjdGlvbnMnIHx8IGNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tc2VsZWN0ZWRdPVwic29ydEZpZWxkKCkgPT09IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1zb3J0YWJsZV09XCJjb2wuZmllbGQgJiYgaXNTb3J0YWJsZUNvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5maWVsZCAmJiB0b2dnbGVTb3J0KGNvbC5maWVsZCwgaXNTb3J0YWJsZUNvbHVtbihjb2wpKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobW9iaWxlRmllbGRMYWJlbChjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGFiZWwtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuZmllbGQgJiYgaXNTb3J0YWJsZUNvbHVtbihjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGFiZWwgc2RjLXRhYmxlLW1vYmlsZS1sYWJlbC0tc29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgLSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NvcnRhYmxlX2NvbHVtbicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgaXNTb3J0YWJsZUNvbHVtbihjb2wpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwidG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgaXNTb3J0YWJsZUNvbHVtbihjb2wpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1zb3J0LWluZGljYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbkZpZWxkXT1cImNvbC5maWVsZCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5UeXBlXT1cImNvbC50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRGaWVsZF09XCJzb3J0RmllbGQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydE9yZGVyXT1cInNvcnRPcmRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtc29ydC1pbmRpY2F0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgbW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLXZhbHVlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlTGVmdEFsaWduXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIGlkPVwibXktZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZW1wdHlUZXh0KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgPjwvc2RjLWVtcHR5LXN0YXRlPlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHVsXG4gICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1saXN0XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJpc0xvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChzaG93SW5pdGlhbExvYWRpbmcoKSkge1xuICAgICAgICAgICAgQGZvciAocm93SW5kZXggb2YgaW5pdGlhbExvYWRpbmdSb3dzKCk7IHRyYWNrIHJvd0luZGV4KSB7XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWl0ZW0gc2RjLXRhYmxlLWV4cGFuZGFibGUtaXRlbS0tbG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5IHNkYy10YWJsZS1leHBhbmRhYmxlLXN1bW1hcnktLWxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LWZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1za2VsZXRvbiBzZGMtdGFibGUtZXhwYW5kYWJsZS1za2VsZXRvbi1wcmltYXJ5XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLXNrZWxldG9uIHNkYy10YWJsZS1leHBhbmRhYmxlLXNrZWxldG9uLXNlY29uZGFyeVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWNoZXZyb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGZvciAocm93IG9mIHBhZ2VEYXRhKCk7IHRyYWNrICRpbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1pdGVtXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWV4cGFuZGFibGUtaXRlbS0tZXhwYW5kZWRdPVwiaXNSb3dFeHBhbmRlZChyKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXN1bW1hcnlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJ0b2dnbGVFeHBhbmRSb3cocilcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChjaGVja2JveENvbCgpOyBhcyBjYkNvbCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9yY2VMZWZ0QWxpZ25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNiQ29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNiQ29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjYkNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LWZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2Ygc3VtbWFyeUNvbHMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXN1bW1hcnktZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtc3VtbWFyeS1sYWJlbFwiPnt7IG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlTGVmdEFsaWduXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc1Jvd0V4cGFuZGVkKHIpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBpc1Jvd0V4cGFuZGVkKHIpXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICgncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9jb2xsYXBzZV9yb3cnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfZXhwYW5kX3JvdycgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdG9nZ2xlRXhwYW5kUm93KHIpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdG9nZ2xlRXhwYW5kUm93KHIpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWNoZXZyb25cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtZXhwYW5kYWJsZS1jaGV2cm9uLS1vcGVuXT1cImlzUm93RXhwYW5kZWQocilcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd25cIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgQGlmIChpc1Jvd0V4cGFuZGVkKHIpKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wudHlwZSAhPT0gJ2NoZWNrYm94LXNlbGVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtZXhwYW5kYWJsZS1maWVsZC0tZnVsbC13aWR0aF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gJ2J1dHRvbicgfHwgY29sLnR5cGUgPT09ICdhY3Rpb25zJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC50eXBlICE9PSAnYnV0dG9uJyAmJiBjb2wudHlwZSAhPT0gJ2FjdGlvbnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWxhYmVsLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtbGFiZWxcIj57eyBtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXZhbHVlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlTGVmdEFsaWduXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC91bD5cblxuICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIGlkPVwibXktZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZW1wdHlUZXh0KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgPjwvc2RjLWVtcHR5LXN0YXRlPlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc2hvd1BhZ2luYXRvcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtcGFnaW5hdG9yXCI+XG4gICAgICAgICAgPHNkYy1wYWdpbmF0b3JcbiAgICAgICAgICAgIFtmaXJzdF09XCJmaXJzdCgpXCJcbiAgICAgICAgICAgIFtyb3dzXT1cInJvd3MoKVwiXG4gICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiaXNNb2JpbGUoKSA/IFtdIDogcm93c1BlclBhZ2VPcHRpb25zKClcIlxuICAgICAgICAgICAgW3Nob3dSb3dzUGVyUGFnZVNlbGVjdG9yXT1cInNob3dSb3dzUGVyUGFnZVNlbGVjdG9yKClcIlxuICAgICAgICAgICAgW2lzTW9iaWxlXT1cImlzTW9iaWxlKClcIlxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc0xhYmVsXT1cInRvdGFsUmVjb3Jkc0xhYmVsKClcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID48L3NkYy1wYWdpbmF0b3I+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L3NkYy1sb2FkaW5nLXN0YXRlPlxuPC9zZWN0aW9uPlxuXG5AaWYgKG9wZW5NZW51U3RhdGUoKTsgYXMgbWVudSkge1xuICA8c2RjLXRhYmxlLWFjdGlvbnMtbWVudVxuICAgIFtpdGVtc109XCJtZW51Lml0ZW1zXCJcbiAgICBbbWVudUlkXT1cIm1lbnUubWVudUlkXCJcbiAgICBbdG9wXT1cIm1lbnUudG9wXCJcbiAgICBbbGVmdF09XCJtZW51LmxlZnRcIlxuICAgIFt3aWR0aF09XCJtZW51LndpZHRoXCJcbiAgICAoY2xvc2UpPVwib25NZW51Q2xvc2UoJGV2ZW50KVwiXG4gICAgKHNlbGVjdCk9XCJvblBvcnRhbEFjdGlvbkNsaWNrKCRldmVudClcIlxuICA+PC9zZGMtdGFibGUtYWN0aW9ucy1tZW51PlxufVxuIl19
674
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixvQ0FBb0MsSUFBSSw4QkFBOEIsRUFDdEUseUNBQXlDLElBQUksbUNBQW1DLEVBQ2hGLG1DQUFtQyxJQUFJLDZCQUE2QixFQUNwRSwyQkFBMkIsSUFBSSxxQkFBcUIsRUFDcEQsMkJBQTJCLElBQUkscUJBQXFCLEVBQ3BELGdCQUFnQixJQUFJLFVBQVUsRUFDOUIsaUJBQWlCLElBQUksV0FBVyxFQUNoQyxxQ0FBcUMsRUFDdEMsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUkzRixPQUFPLEVBWUwsb0JBQW9CLEVBQ3JCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZGLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGVBQWUsRUFDZixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixhQUFhLEVBQ2QsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQiwyQkFBMkIsRUFDNUIsTUFBTSwyQkFBMkIsQ0FBQzs7OztBQUVuQyxJQUFJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQXVCOUIsTUFBTSxPQUFPLGNBQWM7SUFDakIsTUFBTSxDQUFDLHVCQUF1QjtRQUNwQyxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQztRQUNyQyxxQkFBcUIsSUFBSSxDQUFDLENBQUM7UUFDM0IsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVnQixVQUFVLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBdUIsQ0FBQSxDQUFDLENBQUM7SUFDdEQsY0FBYyxDQUFrQjtJQUNoQyxnQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO0lBQ3ZDLHFCQUFxQixHQUFHLENBQUMsQ0FBQztJQUVsQyxJQUFZLGVBQWU7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixLQUFLLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ25FLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFDZ0IsVUFBVSxHQUFHLE1BQU0sQ0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDMUMsVUFBVSxHQUFHLE1BQU0sQ0FBTSxFQUFFLENBQUMsQ0FBQztJQUM3QixhQUFhLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLG1CQUFtQixHQUFHLE1BQU0sQ0FBUyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFFekQsWUFBWSxHQUFHLE1BQU0sQ0FBa0IsaUJBQWlCLENBQUMscUJBQXdDLENBQUMsQ0FBQyxDQUFDO0lBQzdHLE9BQU8sR0FBb0IscUJBQXFCLENBQUM7SUFFeEMsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQ3RELGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUFrQixDQUFDO0lBRXhDLGFBQWEsR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQ3RELGVBQWUsR0FBRyxNQUFNLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRXhELFlBQVksR0FBRyxNQUFNLENBQVMsRUFBRSxDQUFDLENBQUM7SUFDbEMsU0FBUyxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFDeEMsU0FBUyxHQUFHLE1BQU0sQ0FBWSxDQUFDLENBQUMsQ0FBQztJQUNuQyxlQUFlLEdBQUcsTUFBTSxDQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLEtBQUssR0FBRyxNQUFNLENBQVMsVUFBVSxDQUFDLENBQUM7SUFDbkMsSUFBSSxHQUFHLE1BQU0sQ0FBUyxxQkFBcUIsQ0FBQyxDQUFDO0lBRWhFLElBQ0ksSUFBSSxDQUFDLEtBQTBDO1FBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQ0ksSUFBSSxDQUFDLEtBQTZCO1FBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUNJLFNBQVMsQ0FBQyxLQUE2QjtRQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUNJLE9BQU8sQ0FBQyxLQUFpQztRQUMzQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7UUFFdkMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBR00sZ0JBQWdCLEdBQTBCLCtCQUErQixDQUFDO0lBRWpGLElBQ0ksTUFBTSxDQUFDLEtBQXlDO1FBQ2xELE1BQU0sSUFBSSxHQUFHLEtBQUssSUFBSSxxQkFBcUIsQ0FBQztRQUU1QyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDMUIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLEVBQUUsV0FBVyxJQUFJLHFCQUFxQixDQUFDO1FBQ3RGLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTNCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUFrQixDQUFDO1FBQ3hELElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQ0ksU0FBUyxDQUFDLEtBQXlCO1FBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRVMsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFzRCxDQUFDO0lBQ2hGLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO0lBQ2pDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFPakMsQ0FBQztJQUNLLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBRXBELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFa0IsT0FBTyxHQUFHLFFBQVEsQ0FBa0IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDL0QsUUFBUSxHQUFHLFFBQVEsQ0FBVSxHQUFHLEVBQUU7UUFDbkQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUM7UUFDcEQsSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDekIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUMsQ0FBQyxDQUFDO0lBRWdCLFVBQVUsR0FBRyxRQUFRLENBQVUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7SUFDOUYscUZBQXFGO0lBQ3JGLGtFQUFrRTtJQUMvQyxlQUFlLEdBQUcsUUFBUSxDQUFVLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQ3JGLGFBQWEsR0FBRyxRQUFRLENBQVUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7SUFDbEYsa0JBQWtCLEdBQUcsUUFBUSxDQUFVLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRXJHLGtCQUFrQixHQUFHLFFBQVEsQ0FBVyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25HLHVCQUF1QixHQUFHLFFBQVEsQ0FBVSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLHVCQUF1QixJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQy9HLGlCQUFpQixHQUFHLFFBQVEsQ0FBUyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyRixXQUFXLEdBQUcsUUFBUSxDQUFvQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQztJQUN2RixpQkFBaUIsR0FBRyxRQUFRLENBQVMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRixtQkFBbUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6RSxTQUFTLEdBQUcsUUFBUSxDQUFrQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQztJQUNuRixTQUFTLEdBQUcsUUFBUSxDQUFVLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQztJQUNoRSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQ3JFLFVBQVUsR0FBRyxRQUFRLENBQTJCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ3hHLGdCQUFnQixHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFDL0MsV0FBVyxHQUFHLFFBQVEsQ0FBbUIsR0FBRyxFQUFFO1FBQy9ELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRTthQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLDhCQUE4QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO2FBQzdHLEtBQUssQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNnQixXQUFXLEdBQUcsUUFBUSxDQUF3QixHQUFHLEVBQUUsQ0FDcEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssOEJBQThCLENBQUMsSUFBSSxJQUFJLENBQ25GLENBQUM7SUFDaUIsVUFBVSxHQUFHLFFBQVEsQ0FBUyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RSxTQUFTLEdBQUcsUUFBUSxDQUFTLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXJFLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVuRSxZQUFZLEdBQUcsUUFBUSxDQUFNLEdBQUcsRUFBRTtRQUNuRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdkcsQ0FBQyxDQUFDLENBQUM7SUFFZ0IsVUFBVSxHQUFHLFFBQVEsQ0FBTSxHQUFHLEVBQUU7UUFDakQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNyQixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ25HLENBQUMsQ0FBQyxDQUFDO0lBRWdCLFlBQVksR0FBRyxRQUFRLENBQVMsR0FBRyxFQUFFO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDbEMsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDO1FBRXpELElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9FLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBRWdCLFFBQVEsR0FBRyxRQUFRLENBQU0sR0FBRyxFQUFFO1FBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDOUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFFZ0Isa0JBQWtCLEdBQUcsUUFBUSxDQUFXLEdBQUcsRUFBRTtRQUM5RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLElBQUkscUJBQXFCLENBQUM7UUFDdkYsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGFBQWEsSUFBSSxjQUFjLElBQUkscUJBQXFCLENBQUMsQ0FBQztRQUN4RixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUM7UUFFaEgsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFFZ0IsWUFBWSxHQUFHLFFBQVEsQ0FBUyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXZFLG9CQUFvQixHQUFHLFFBQVEsQ0FBUyxHQUFHLEVBQUU7UUFDOUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsV0FBVyxJQUFJLHFCQUFxQixDQUFDO1FBQ3ZGLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxhQUFhLElBQUksY0FBYyxJQUFJLHFCQUFxQixDQUFDLENBQUM7UUFDeEYsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO1FBRWhILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMscUNBQXFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO1FBQ2xHLE1BQU0sZUFBZSxHQUFHLFFBQVEsR0FBRyxTQUFTLEdBQUcsbUNBQW1DLENBQUM7UUFFbkYsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBRWdCLGlCQUFpQixHQUFHLFFBQVEsQ0FBUyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLGVBQWUsR0FBRyxRQUFRLENBQVMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVoRixZQUFZLEdBQUcsQ0FBQyxHQUFNLEVBQUUsSUFBYSxFQUFXLEVBQUUsQ0FDbkUsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBR3ZDLGVBQWU7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUdTLFdBQVc7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNqRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzdELElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsY0FBYyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFHUyxjQUFjO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFUyxZQUFZLENBQUMsWUFBOEI7UUFDbkQsTUFBTSxJQUFJLEdBQUcsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO1FBQzFGLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXhCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVTLGFBQWE7UUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRVMsVUFBVSxDQUFDLEtBQWEsRUFBRSxPQUFPLEdBQUcsSUFBSTtRQUNoRCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9CLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVTLG9CQUFvQixDQUFDLEdBQW1CO1FBQ2hELElBQUksR0FBRyxDQUFDLFFBQVEsS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRS9CLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pCLE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRVMsZ0JBQWdCLENBQUMsR0FBbUIsRUFBRSxTQUE0QixNQUFNO1FBQ2hGLE1BQU0sS0FBSyxHQUFHLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2RCxPQUFPLE1BQU0sS0FBSyxRQUFRO1lBQ3hCLENBQUMsQ0FBQyxzQkFBc0IsS0FBSyxFQUFFO1lBQy9CLENBQUMsQ0FBQyxzQkFBc0IsS0FBSyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVTLGdCQUFnQixDQUFDLEdBQW1CO1FBQzVDLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyw4QkFBOEIsSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztJQUM5RixDQUFDO0lBRVMsV0FBVztRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFUyxhQUFhLENBQUMsR0FBbUI7UUFDekMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxHQUFtQjtRQUM1QyxPQUFPLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFUyxhQUFhLENBQUMsR0FBbUI7UUFDekMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN2QixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztJQUNwRixDQUFDO0lBRVMsZ0JBQWdCLENBQUMsR0FBbUI7UUFDNUMsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDcEIsQ0FBQztRQUVELFFBQVEsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLEtBQUssU0FBUztnQkFDWixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLDhDQUE4QyxDQUFDO1lBQy9GLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSzt1QkFDOUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPO3VCQUM5QiwrQ0FBK0MsQ0FBQztZQUN2RDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRVMsZUFBZSxDQUFDLEtBQWE7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVTLGFBQWEsQ0FBQyxLQUFhO1FBQ25DLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLEtBQUssS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFUyxZQUFZLENBQUMsS0FBcUI7UUFDMUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUM7UUFDNUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLFdBQVcsSUFBSSxxQkFBcUIsQ0FBQztRQUUvRixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELHVGQUF1RjtJQUN2RixzRkFBc0Y7SUFDdEYsc0ZBQXNGO0lBQ3RGLG9GQUFvRjtJQUNwRixtREFBbUQ7SUFDekMsWUFBWSxDQUFDLEdBQU07UUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUcsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRVMsV0FBVyxDQUFDLEdBQU0sRUFBRSxPQUFnQjtRQUM1QyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFbkQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQzthQUFNLENBQUM7WUFDTixhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFUyxhQUFhLENBQUMsR0FBTTtRQUM1QixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVTLHNCQUFzQixDQUFDLEdBQU07UUFDckMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFFbkQsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBRUQsT0FBTyxRQUFRLEtBQUssSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxPQUFnQjtRQUN6QyxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN4QyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRVMsbUJBQW1CO1FBQzNCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRTlDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekMsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVTLHVCQUF1QjtRQUMvQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUU5QyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3pDLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFaEYsT0FBTyxhQUFhLEdBQUcsQ0FBQyxJQUFJLGFBQWEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO0lBQ2pFLENBQUM7SUFFUyxxQkFBcUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFUywyQkFBMkI7UUFDbkMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUN2RCxDQUFDO0lBRVMsZUFBZSxDQUFDLEtBQVk7UUFDcEMsT0FBUSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxPQUFPLENBQUM7SUFDcEQsQ0FBQztJQUVTLGdCQUFnQixDQUFDLEdBQU07UUFDL0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWhELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVTLG1CQUFtQixDQUFDLEdBQU07UUFDbEMsT0FBTyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRVMsc0JBQXNCLENBQUMsV0FBbUI7UUFDbEQsT0FBTyxhQUFhLElBQUksQ0FBQyxlQUFlLHdCQUF3QixXQUFXLEVBQUUsQ0FBQztJQUNoRixDQUFDO0lBRVMsaUJBQWlCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLG1EQUFtRCxDQUFDO0lBQ3ZGLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxLQUFZLEVBQUUsR0FBTSxFQUFFLEdBQW1CLEVBQUUsY0FBMkI7UUFDaEcsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN2RCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV4QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQztZQUNyQixHQUFHO1lBQ0gsR0FBRztZQUNILEtBQUs7WUFDTCxNQUFNO1lBQ04sWUFBWSxFQUFFLGNBQWMsRUFBRSxZQUFZLEtBQUssS0FBSztZQUNwRCxPQUFPLEVBQUUsY0FBYztZQUN2QixHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXO1lBQzlCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNsQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsZ0JBQWdCLENBQUMsY0FBb0Msb0JBQW9CLENBQUMsSUFBSTtRQUN0RixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0IsSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLEtBQUssb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkQsT0FBTztRQUNULENBQUM7UUFFRCxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxHQUFNLEVBQUUsR0FBbUI7UUFDckQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7SUFDOUMsQ0FBQztJQUVTLGNBQWMsQ0FBQyxHQUFNLEVBQUUsT0FBc0M7UUFDckUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFFbEMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBdUIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3QyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1NBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVTLG1CQUFtQixDQUFDLElBQTBCO1FBQ3RELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRWxDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFOUMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFUyxXQUFXLENBQUMsS0FBZ0M7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRVMsY0FBYyxDQUFDLEdBQU0sRUFBRSxHQUFtQixFQUFFLElBQXVFO1FBQzNILElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN6RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFUyxhQUFhLENBQUMsR0FBTSxFQUFFLEdBQW1CO1FBQ2pELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQztRQUN6QyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFUyxhQUFhLENBQUMsR0FBbUIsRUFBRSxHQUFNO1FBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRU8sT0FBTyxDQUErQixJQUFPO1FBQ25ELE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxZQUFZLENBQUMsT0FBbUM7UUFDdEQsTUFBTSxPQUFPLEdBT1Q7WUFDRixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNuQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNqQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUMzQixPQUFPO1NBQ1IsQ0FBQztRQUVGLElBQUksT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNDLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUMxQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV6RSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVELDZGQUE2RjtJQUM3RiwwRkFBMEY7SUFDMUYsMkZBQTJGO0lBQzNGLDBGQUEwRjtJQUMxRiwwRkFBMEY7SUFDMUYsNkZBQTZGO0lBQzdGLDZGQUE2RjtJQUM3Riw2RkFBNkY7SUFDN0YsMkJBQTJCO0lBQ25CLDBCQUEwQjtRQUNoQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztRQUV2QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ25DLE1BQU0sYUFBYSxHQUFRLEVBQUUsQ0FBQztRQUU5QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUUxRixJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNaLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3JCLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxJQUF1QixFQUFFLEdBQU07UUFDM0QsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTyxlQUFlLENBQUMsYUFBMEI7UUFDaEQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFbkUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztZQUN2RSxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsYUFBMEI7UUFDbkQsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUVuQyxLQUFLLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWhGLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3JCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sbUJBQW1CLENBQUM7SUFDN0IsQ0FBQztJQUVPLGVBQWUsQ0FBQyxHQUFNO1FBQzVCLE9BQU8sc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVPLGdCQUFnQixDQUFDLGdCQUFxQixFQUFFLGFBQWtCO1FBQ2hFLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxLQUFLLGFBQWEsQ0FBQyxNQUFNO2VBQ2xELGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLENBQUM7UUFDaEMsT0FBTywwQkFBMEIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUVPLHFCQUFxQixDQUMzQixPQUFvQixFQUNwQixNQUFjLEVBQ2QsV0FBaUM7UUFFakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksV0FBVyxLQUFLLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDNUMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RCxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbkgsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXhELElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxXQUFXLEtBQUssb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3BHLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5ELFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO3dHQXh4QlUsY0FBYzs0RkFBZCxjQUFjLHllQ2xHM0IsNms3QkE4aUJBLHdvVEQ3ZEksWUFBWSxrTkFDWixrQkFBa0Isb1dBQ2xCLGtCQUFrQixnTkFFbEIscUJBQXFCLHVKQUNyQixtQkFBbUIsa1hBQ25CLGVBQWUsNEZBQ2YsMkJBQTJCLGtKQUMzQix5QkFBeUIsK1VBQ3pCLHlCQUF5QixtS0FDekIsZ0JBQWdCOzs0RkFPUCxjQUFjO2tCQXJCMUIsU0FBUzsrQkFDRSxXQUFXLGNBQ1QsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osa0JBQWtCO3dCQUNsQixrQkFBa0I7d0JBQ2xCLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQixtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YsMkJBQTJCO3dCQUMzQix5QkFBeUI7d0JBQ3pCLHlCQUF5Qjt3QkFDekIsZ0JBQWdCO3FCQUNqQixpQkFHYyxpQkFBaUIsQ0FBQyxRQUFRLG1CQUN4Qix1QkFBdUIsQ0FBQyxNQUFNOzhCQXdDM0MsSUFBSTtzQkFEUCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFVckIsSUFBSTtzQkFEUCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFhckIsU0FBUztzQkFEWixLQUFLO2dCQVVGLE9BQU87c0JBRFYsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0JBY25CLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFJRixNQUFNO3NCQURULEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO2dCQTBCdEIsU0FBUztzQkFEWixLQUFLO2dCQVNJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBUUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFxSEcsZUFBZTtzQkFEeEIsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBTXBCLFdBQVc7c0JBRHBCLFlBQVk7dUJBQUMseUJBQXlCO2dCQXFCN0IsY0FBYztzQkFEdkIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBzaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHsgZ2V0Vmlld3BvcnRXaWR0aCwgaXNNb2JpbGVWaWV3cG9ydCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvbGF5b3V0LnV0aWwnO1xuaW1wb3J0IHsgZ2V0Rm9jdXNhYmxlRWxlbWVudHMgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2ZvY3VzLnV0aWwnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UQUJMRV9PUFRJT05TLFxuICBUQUJMRV9DT0xVTU5fVFlQRV9DSEVDS0JPWF9TRUxFQ1RJT04gYXMgQ09MVU1OX1RZUEVfQ0hFQ0tCT1hfU0VMRUNUSU9OLFxuICBUQUJMRV9ERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWCBhcyBERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWCxcbiAgVEFCTEVfREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFggYXMgREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFgsXG4gIFRBQkxFX0RFRkFVTFRfUk9XX0hFSUdIVF9QWCBhcyBERUZBVUxUX1JPV19IRUlHSFRfUFgsXG4gIFRBQkxFX0RFRkFVTFRfUk9XU19QRVJfUEFHRSBhcyBERUZBVUxUX1JPV1NfUEVSX1BBR0UsXG4gIFRBQkxFX0lOREVYX1pFUk8gYXMgSU5ERVhfWkVSTyxcbiAgVEFCTEVfTUVOVV9HQVBfUFggYXMgTUVOVV9HQVBfUFgsXG4gIFRBQkxFX01PQklMRV9DQVJEX0VTVElNQVRFRF9IRUlHSFRfUFhcbn0gZnJvbSAnLi4vLi4vY29yZS9jb25zdGFudHMvdGFibGUuY29uc3QnO1xuaW1wb3J0IHsgREVGQVVMVF9MT0FESU5HX1NUQVRFX0lORElDQVRPUiB9IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL2xvYWRpbmctc3RhdGUuY29uc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWdpbmF0b3JTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvcGFnaW5hdG9yLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBMb2FkaW5nU3RhdGVJbmRpY2F0b3IgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2xvYWRpbmctc3RhdGUudHlwZSc7XG5pbXBvcnQgeyB0eXBlIFNlYXJjaFRyaWdnZXJNb2RlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zZWFyY2hib3gudHlwZSc7XG5pbXBvcnQge1xuICB0eXBlIEFjdGlvbk1lbnVJdGVtLFxuICB0eXBlIFJvd0Jhc2UsXG4gIHR5cGUgU29ydE9yZGVyLFxuICB0eXBlIFRhYmxlQWN0aW9uTWVudUl0ZW0gYXMgTmF0aXZlQWN0aW9uTWVudUl0ZW0sXG4gIHR5cGUgVGFibGVBY3Rpb25NZW51Q2xvc2VFdmVudCxcbiAgdHlwZSBUYWJsZUNlbGxDb25maWcsXG4gIHR5cGUgVGFibGVDZWxsQ29uZmlnS2V5LFxuICB0eXBlIFRhYmxlQ29sdW1uLFxuICB0eXBlIFRhYmxlT3Blbk1lbnVTdGF0ZSBhcyBPcGVuTWVudVN0YXRlLFxuICB0eXBlIFRhYmxlT3B0aW9ucyxcbiAgdHlwZSBUYWJsZVNlYXJjaEV2ZW50LFxuICBUYWJsZU1lbnVGb2N1c1RhcmdldFxufSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3RhYmxlLnR5cGUnO1xuXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaGJveENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJveC9zZWFyY2hib3guY29tcG9uZW50JztcbmltcG9ydCB7IExvYWRpbmdTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2xvYWRpbmctc3RhdGUvbG9hZGluZy1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCB9IGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBY3Rpb25zTWVudUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hY3Rpb25zLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQ2VsbENvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtY2VsbC1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZVNvcnRJbmRpY2F0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtc29ydC1pbmRpY2F0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IGJ1aWxkVGFibGVDZWxsQ29uZmlnTWFwLCBtZXJnZVRhYmxlT3B0aW9ucyB9IGZyb20gJy4vdXRpbHMvdGFibGUtY29uZmlnLnV0aWwnO1xuaW1wb3J0IHtcbiAgYnVpbGRSb3dDaGVja2JveElkLFxuICBjeWNsZVNvcnRTdGF0ZSxcbiAgZmlsdGVyVGFibGVSb3dzLFxuICBnZXROZXN0ZWRWYWx1ZSxcbiAgcmVzb2x2ZVJvd0lkZW50aXR5TGFiZWwsXG4gIHJlc29sdmVSb3dTZWxlY3Rpb25LZXksXG4gIHNvcnRUYWJsZVJvd3Ncbn0gZnJvbSAnLi91dGlscy90YWJsZS1kYXRhLnV0aWwnO1xuaW1wb3J0IHtcbiAgZ2V0VGFibGVDb2x1bW5NaW5XaWR0aFB4LFxuICBnZXRUYWJsZU1pbldpZHRoUHgsXG4gIHJlc29sdmVUYWJsZUNvbHVtbkFsaWdubWVudFxufSBmcm9tICcuL3V0aWxzL3RhYmxlLWxheW91dC51dGlsJztcblxubGV0IHRhYmxlSW5zdGFuY2VTZXF1ZW5jZSA9IDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NkYy10YWJsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgU2VhcmNoYm94Q29tcG9uZW50LFxuICAgIFBhZ2luYXRvckNvbXBvbmVudCxcbiAgICBCdXR0b25Db21wb25lbnQsXG4gICAgTG9hZGluZ1N0YXRlQ29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIFRhYmxlU29ydEluZGljYXRvckNvbXBvbmVudCxcbiAgICBUYWJsZUNlbGxDb250ZW50Q29tcG9uZW50LFxuICAgIFRhYmxlQWN0aW9uc01lbnVDb21wb25lbnQsXG4gICAgVG9vbHRpcENvbXBvbmVudFxuICBdLFxuICBzdHlsZVVybDogJy4vdGFibGUuY29tcG9uZW50LnNjc3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8VCBleHRlbmRzIFJvd0Jhc2UgPSBSb3dCYXNlPiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc3RhdGljIGFsbG9jYXRlVGFibGVJbnN0YW5jZUlkKCk6IG51bWJlciB7XG4gICAgY29uc3QgbmV4dElkID0gdGFibGVJbnN0YW5jZVNlcXVlbmNlO1xuICAgIHRhYmxlSW5zdGFuY2VTZXF1ZW5jZSArPSAxO1xuICAgIHJldHVybiBuZXh0SWQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG4gIHByaXZhdGUgX3RhYmxlSW5zdGFuY2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYWN0aW9uc01lbnVJZFNlcXVlbmNlID0gMDtcblxuICBwcml2YXRlIGdldCB0YWJsZUluc3RhbmNlSWQoKTogbnVtYmVyIHtcbiAgICB0aGlzLl90YWJsZUluc3RhbmNlSWQgPz89IFRhYmxlQ29tcG9uZW50LmFsbG9jYXRlVGFibGVJbnN0YW5jZUlkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5zdGFuY2VJZDtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IGNvbHNTaWduYWwgPSBzaWduYWw8VGFibGVDb2x1bW48VD5bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTaWduYWwgPSBzaWduYWw8VFtdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1NpZ25hbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRXaWR0aFNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KGdldFZpZXdwb3J0V2lkdGgoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTaWduYWwgPSBzaWduYWw8VGFibGVPcHRpb25zPFQ+PihtZXJnZVRhYmxlT3B0aW9ucyhERUZBVUxUX1RBQkxFX09QVElPTlMgYXMgVGFibGVPcHRpb25zPFQ+KSk7XG4gIHByaXZhdGUgX2NvbmZpZzogVGFibGVPcHRpb25zPFQ+ID0gREVGQVVMVF9UQUJMRV9PUFRJT05TO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aFBhcnRzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIHByaXZhdGUgcm93Q2hlY2tib3hJZENhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBzdHJpbmc+KCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wZW5NZW51U3RhdGUgPSBzaWduYWw8T3Blbk1lbnVTdGF0ZTxUPiB8IG51bGw+KG51bGwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXJpYUxhYmVsU2lnbmFsID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2xvYmFsRmlsdGVyID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ydEZpZWxkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ydE9yZGVyID0gc2lnbmFsPFNvcnRPcmRlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uU2lnbmFsID0gc2lnbmFsPFRbXT4oW10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlyc3QgPSBzaWduYWw8bnVtYmVyPihJTkRFWF9aRVJPKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3MgPSBzaWduYWw8bnVtYmVyPihERUZBVUxUX1JPV1NfUEVSX1BBR0UpO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHNldCBjb2xzKHZhbHVlOiBUYWJsZUNvbHVtbjxUPltdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY29sc1NpZ25hbC5zZXQodmFsdWUgPz8gW10pO1xuICB9XG5cbiAgZ2V0IGNvbHMoKTogVGFibGVDb2x1bW48VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sc1NpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgc2V0IGRhdGEodmFsdWU6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmRhdGFTaWduYWwuc2V0KHZhbHVlID8/IFtdKTtcbiAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGlvbldpdGhEYXRhKCk7XG4gICAgdGhpcy5jbGFtcFBhZ2UoKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIGdldCBkYXRhKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHNlbGVjdGlvbih2YWx1ZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuc2VsZWN0aW9uU2lnbmFsLnNldCh0aGlzLm5vcm1hbGl6ZVNlbGVjdGlvbih2YWx1ZSA/PyBbXSkpO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGlvbigpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IGZhbHNlIH0pXG4gIHNldCBsb2FkaW5nKHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMubG9hZGluZ1NpZ25hbC5zZXQodmFsdWUgPT09IHRydWUpO1xuXG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgbG9hZGluZ0luZGljYXRvcjogTG9hZGluZ1N0YXRlSW5kaWNhdG9yID0gREVGQVVMVF9MT0FESU5HX1NUQVRFX0lORElDQVRPUjtcblxuICBASW5wdXQoeyByZXF1aXJlZDogZmFsc2UgfSlcbiAgc2V0IGNvbmZpZyh2YWx1ZTogVGFibGVPcHRpb25zPFQ+IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5leHQgPSB2YWx1ZSA/PyBERUZBVUxUX1RBQkxFX09QVElPTlM7XG5cbiAgICBpZiAodGhpcy5fY29uZmlnID09PSBuZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlnID0gbmV4dDtcbiAgICB0aGlzLmNvbmZpZ1NpZ25hbC5zZXQobWVyZ2VUYWJsZU9wdGlvbnMobmV4dCkpO1xuXG4gICAgY29uc3QgbmV4dFJvd3MgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcbiAgICB0aGlzLnJvd3Muc2V0KG5leHRSb3dzKTtcbiAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcblxuICAgIHRoaXMucGF0aFBhcnRzQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJvd0NoZWNrYm94SWRDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgc3RyaW5nPigpO1xuICAgIHRoaXMucmVjb25jaWxlU2VsZWN0aW9uV2l0aERhdGEoKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIGdldCBjb25maWcoKTogVGFibGVPcHRpb25zPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGFyaWFMYWJlbCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hcmlhTGFiZWxTaWduYWwuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBhcmlhTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcmlhTGFiZWxTaWduYWwoKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29sdW1uOiBUYWJsZUNvbHVtbjxUPjsgcm93OiBUOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSBsYXp5TG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGZpcnN0OiBudW1iZXI7XG4gICAgcm93czogbnVtYmVyO1xuICAgIHNvcnRGaWVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgc29ydE9yZGVyPzogU29ydE9yZGVyO1xuICAgIHRyaWdnZXI/OiAncGFnZScgfCAnc29ydCcgfCAnc2VhcmNoJztcbiAgICBzZWFyY2hUZXJtPzogc3RyaW5nO1xuICB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XG5cbiAgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU2lnbmFsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkPFRhYmxlT3B0aW9uczxUPj4oKCkgPT4gdGhpcy5jb25maWdTaWduYWwoKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc01vYmlsZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICBjb25zdCByZXNwb25zaXZlID0gdGhpcy5vcHRpb25zKCkudGFibGU/LnJlc3BvbnNpdmU7XG4gICAgaWYgKHJlc3BvbnNpdmUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBpc01vYmlsZVZpZXdwb3J0KHRoaXMudmlld3BvcnRXaWR0aFNpZ25hbCgpKTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dTZWFyY2ggPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5zZWFyY2g/LnNob3cgPz8gZmFsc2UpO1xuICAvLyBPcHQtaW4gcG9yIHRhYmVsYSAoZGVmYXVsdCBmYWxzZSAtIHByZXNlcnZhIGEgbGFyZ3VyYSBhdHVhbCwgbWluKDEwMCUsIDIycmVtKSwgcHJhXG4gIC8vIG7Do28gYWZldGFyIGNvbnN1bWlkb3JlcyBleGlzdGVudGVzKSAtIHZlciB0YWJsZS5jb21wb25lbnQuc2Nzcy5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlYXJjaEZ1bGxXaWR0aCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8uZnVsbFdpZHRoID8/IGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dQYWdpbmF0b3IgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5zaG93ID8/IGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dJbml0aWFsTG9hZGluZyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMubG9hZGluZ1NpZ25hbCgpICYmIHRoaXMuZGF0YVNpZ25hbCgpLmxlbmd0aCA9PT0gMCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3NQZXJQYWdlT3B0aW9ucyA9IGNvbXB1dGVkPG51bWJlcltdPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZU9wdGlvbnMgPz8gW10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1Jvd3NQZXJQYWdlU2VsZWN0b3IgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5zaG93Um93c1BlclBhZ2VTZWxlY3RvciA/PyBmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWFyY2hQbGFjZWhvbGRlciA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4gdGhpcy5vcHRpb25zKCkuc2VhcmNoPy5wbGFjZWhvbGRlciA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0cmlnZ2VyTW9kZSA9IGNvbXB1dGVkPFNlYXJjaFRyaWdnZXJNb2RlPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5zZWFyY2g/LnR5cGUgPz8gJ2F1dG8nKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRvdGFsUmVjb3Jkc0xhYmVsID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8udG90YWxSZWNvcmRzTGFiZWwgPz8gJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdFRleHRPdmVyZmxvdyA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3B0aW9ucygpLnRhYmxlPy50ZXh0T3ZlcmZsb3cpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGFibGVNb2RlID0gY29tcHV0ZWQ8J2xvY2FsJyB8ICdhcGknPigoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8ubW9kZSA/PyAnbG9jYWwnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzQXBpTW9kZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMudGFibGVNb2RlKCkgPT09ICdhcGknKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzRml0TGF5b3V0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCkudGFibGU/LmxheW91dCA9PT0gJ2ZpdCcpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9iaWxlTW9kZSA9IGNvbXB1dGVkPCdleHBhbmRhYmxlJyB8ICdzdGFja2VkJz4oKCkgPT4gdGhpcy5vcHRpb25zKCkudGFibGU/Lm1vYmlsZU1vZGUgPz8gJ2V4cGFuZGFibGUnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4cGFuZGVkUm93SW5kZXggPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdW1tYXJ5Q29scyA9IGNvbXB1dGVkPFRhYmxlQ29sdW1uPFQ+W10+KCgpID0+IHtcbiAgICBjb25zdCBTVU1NQVJZX0NPTF9DT1VOVCA9IDI7XG4gICAgcmV0dXJuIHRoaXMuY29sc1NpZ25hbCgpXG4gICAgICAuZmlsdGVyKGNvbCA9PiBjb2wudHlwZSAhPT0gQ09MVU1OX1RZUEVfQ0hFQ0tCT1hfU0VMRUNUSU9OICYmIGNvbC50eXBlICE9PSAnYWN0aW9ucycgJiYgY29sLnR5cGUgIT09ICdidXR0b24nKVxuICAgICAgLnNsaWNlKDAsIFNVTU1BUllfQ09MX0NPVU5UKTtcbiAgfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjaGVja2JveENvbCA9IGNvbXB1dGVkPFRhYmxlQ29sdW1uPFQ+IHwgbnVsbD4oKCkgPT5cbiAgICB0aGlzLmNvbHNTaWduYWwoKS5maW5kKGNvbCA9PiBjb2wudHlwZSA9PT0gQ09MVU1OX1RZUEVfQ0hFQ0tCT1hfU0VMRUNUSU9OKSA/PyBudWxsXG4gICk7XG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eVRpdGxlID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5lbXB0eT8udGl0bGUgPz8gJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZW1wdHlUZXh0ID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5lbXB0eT8udGV4dCA/PyAnJyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNlbGxzQ2ZnID0gY29tcHV0ZWQoKCkgPT4gYnVpbGRUYWJsZUNlbGxDb25maWdNYXAodGhpcy5vcHRpb25zKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyZWREYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgaWYgKHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTaWduYWwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyVGFibGVSb3dzKHRoaXMuZGF0YVNpZ25hbCgpLCB0aGlzLmNvbHNTaWduYWwoKSwgdGhpcy5nbG9iYWxGaWx0ZXIoKSwgdGhpcy5yZXNvbHZlVmFsdWUpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ydGVkRGF0YSA9IGNvbXB1dGVkPFRbXT4oKCkgPT4ge1xuICAgIGlmICh0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERhdGEoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydFRhYmxlUm93cyh0aGlzLmZpbHRlcmVkRGF0YSgpLCB0aGlzLnNvcnRGaWVsZCgpLCB0aGlzLnNvcnRPcmRlcigpLCB0aGlzLnJlc29sdmVWYWx1ZSk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0b3RhbFJlY29yZHMgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvcnRlZERhdGEoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpVG90YWwgPSB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy50b3RhbFJlY29yZHM7XG5cbiAgICBpZiAodHlwZW9mIGFwaVRvdGFsID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoYXBpVG90YWwpICYmIGFwaVRvdGFsID49IDApIHtcbiAgICAgIHJldHVybiBNYXRoLnRydW5jKGFwaVRvdGFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCkubGVuZ3RoO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFnZURhdGEgPSBjb21wdXRlZDxUW10+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuc2hvd1BhZ2luYXRvcigpIHx8IHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvcnRlZERhdGEoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuZmlyc3QoKTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMucm93cygpO1xuICAgIHJldHVybiB0aGlzLnNvcnRlZERhdGEoKS5zbGljZShzdGFydCwgZW5kKTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGluaXRpYWxMb2FkaW5nUm93cyA9IGNvbXB1dGVkPG51bWJlcltdPigoKSA9PiB7XG4gICAgY29uc3Qgcm93c0Zyb21TdGF0ZSA9IHRoaXMucm93cygpO1xuICAgIGNvbnN0IHJvd3NGcm9tQ29uZmlnID0gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2UgPz8gREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSb3dzID0gTnVtYmVyKHJvd3NGcm9tU3RhdGUgfHwgcm93c0Zyb21Db25maWcgfHwgREVGQVVMVF9ST1dTX1BFUl9QQUdFKTtcbiAgICBjb25zdCBzYWZlUm93cyA9IE51bWJlci5pc0Zpbml0ZShub3JtYWxpemVkUm93cykgJiYgbm9ybWFsaXplZFJvd3MgPiAwID8gbm9ybWFsaXplZFJvd3MgOiBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogc2FmZVJvd3MgfSwgKF8sIGluZGV4KSA9PiBpbmRleCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3Rpb25TZXQgPSBjb21wdXRlZDxTZXQ8VD4+KCgpID0+IG5ldyBTZXQodGhpcy5zZWxlY3Rpb25TaWduYWwoKSkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBib2R5Vmlld3BvcnRIZWlnaHRQeCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIGNvbnN0IHJvd3NGcm9tU3RhdGUgPSB0aGlzLnJvd3MoKTtcbiAgICBjb25zdCByb3dzRnJvbUNvbmZpZyA9IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcbiAgICBjb25zdCBub3JtYWxpemVkUm93cyA9IE51bWJlcihyb3dzRnJvbVN0YXRlIHx8IHJvd3NGcm9tQ29uZmlnIHx8IERFRkFVTFRfUk9XU19QRVJfUEFHRSk7XG4gICAgY29uc3Qgc2FmZVJvd3MgPSBOdW1iZXIuaXNGaW5pdGUobm9ybWFsaXplZFJvd3MpICYmIG5vcm1hbGl6ZWRSb3dzID4gMCA/IG5vcm1hbGl6ZWRSb3dzIDogREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuXG4gICAgY29uc3Qgcm93SGVpZ2h0ID0gdGhpcy5pc01vYmlsZSgpID8gVEFCTEVfTU9CSUxFX0NBUkRfRVNUSU1BVEVEX0hFSUdIVF9QWCA6IERFRkFVTFRfUk9XX0hFSUdIVF9QWDtcbiAgICBjb25zdCBlc3RpbWF0ZWRIZWlnaHQgPSBzYWZlUm93cyAqIHJvd0hlaWdodCArIERFRkFVTFRfTE9BRElOR19WRVJUSUNBTF9QQURESU5HX1BYO1xuXG4gICAgcmV0dXJuIE1hdGgubWF4KERFRkFVTFRfTUlOX0xPQURJTkdfSEVJR0hUX1BYLCBlc3RpbWF0ZWRIZWlnaHQpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZW1wdHlCb2R5SGVpZ2h0UHggPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHRoaXMuYm9keVZpZXdwb3J0SGVpZ2h0UHgoKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0YWJsZU1pbldpZHRoUHggPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IGdldFRhYmxlTWluV2lkdGhQeCh0aGlzLmNvbHNTaWduYWwoKSkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlVmFsdWUgPSAob2JqOiBULCBwYXRoPzogc3RyaW5nKTogdW5rbm93biA9PlxuICAgIGdldE5lc3RlZFZhbHVlKG9iaiwgcGF0aCwgdGhpcy5wYXRoUGFydHNDYWNoZSk7XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxuICBwcm90ZWN0ZWQgb25Eb2N1bWVudENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnKVxuICBwcm90ZWN0ZWQgb25Fc2NhcGVLZXkoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KFRhYmxlTWVudUZvY3VzVGFyZ2V0LlRyaWdnZXIpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGguZmxvb3IoZW50cmllc1swXT8uY29udGVudFJlY3Qud2lkdGggPz8gMCk7XG4gICAgICBpZiAod2lkdGggPiAwKSB7XG4gICAgICAgIHRoaXMudmlld3BvcnRXaWR0aFNpZ25hbC5zZXQod2lkdGgpO1xuICAgICAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcpXG4gIHByb3RlY3RlZCBvbldpbmRvd1Njcm9sbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlYXJjaFRlcm0oZXZlbnRPclZhbHVlOiBUYWJsZVNlYXJjaEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGVybSA9IHR5cGVvZiBldmVudE9yVmFsdWUgPT09ICdzdHJpbmcnID8gZXZlbnRPclZhbHVlIDogZXZlbnRPclZhbHVlPy5kZXRhaWwgPz8gJyc7XG4gICAgdGhpcy5nbG9iYWxGaWx0ZXIuc2V0KFN0cmluZyh0ZXJtKSk7XG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG5cbiAgICBpZiAodGhpcy5pc0FwaU1vZGUoKSkge1xuICAgICAgdGhpcy5lbWl0TGF6eUxvYWQoJ3NlYXJjaCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNsZWFyU2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMuZ2xvYmFsRmlsdGVyLnNldCgnJyk7XG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG5cbiAgICBpZiAodGhpcy5pc0FwaU1vZGUoKSkge1xuICAgICAgdGhpcy5lbWl0TGF6eUxvYWQoJ3NlYXJjaCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVTb3J0KGZpZWxkOiBzdHJpbmcsIGVuYWJsZWQgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKCFlbmFibGVkIHx8ICFmaWVsZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBjeWNsZVNvcnRTdGF0ZSh0aGlzLnNvcnRGaWVsZCgpLCB0aGlzLnNvcnRPcmRlcigpLCBmaWVsZCk7XG4gICAgdGhpcy5zb3J0RmllbGQuc2V0KG5leHQuZmllbGQpO1xuICAgIHRoaXMuc29ydE9yZGVyLnNldChuZXh0Lm9yZGVyKTtcblxuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIGlmICh0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICB0aGlzLmVtaXRMYXp5TG9hZCgnc29ydCcpO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTb3J0QXJpYUF0dHJpYnV0ZShjb2w6IFRhYmxlQ29sdW1uPFQ+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoY29sLnNvcnRhYmxlID09PSBmYWxzZSB8fCAhY29sLmZpZWxkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnRGaWVsZCgpICE9PSBjb2wuZmllbGQpIHtcbiAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JkZXIgPSB0aGlzLnNvcnRPcmRlcigpO1xuXG4gICAgaWYgKG9yZGVyID09PSAxKSB7XG4gICAgICByZXR1cm4gJ2FzY2VuZGluZyc7XG4gICAgfVxuXG4gICAgaWYgKG9yZGVyID09PSAtMSkge1xuICAgICAgcmV0dXJuICdkZXNjZW5kaW5nJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ25vbmUnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbHVtbkFsaWduQ2xhc3MoY29sOiBUYWJsZUNvbHVtbjxUPiwgdGFyZ2V0OiAnY2VsbCcgfCAnaGVhZGVyJyA9ICdjZWxsJyk6IHN0cmluZyB7XG4gICAgY29uc3QgYWxpZ24gPSByZXNvbHZlVGFibGVDb2x1bW5BbGlnbm1lbnQoY29sLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQgPT09ICdoZWFkZXInXG4gICAgICA/IGBzZGMtdGFibGUtdGgtYWxpZ24tJHthbGlnbn1gXG4gICAgICA6IGBzZGMtdGFibGUtdGQtYWxpZ24tJHthbGlnbn1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU29ydGFibGVDb2x1bW4oY29sOiBUYWJsZUNvbHVtbjxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2wudHlwZSAhPT0gQ09MVU1OX1RZUEVfQ0hFQ0tCT1hfU0VMRUNUSU9OICYmIGNvbC5zb3J0YWJsZSAhPT0gZmFsc2UgJiYgISFjb2wuZmllbGQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFzRGF0YVJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNpZ25hbCgpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FuU29ydENvbHVtbihjb2w6IFRhYmxlQ29sdW1uPFQ+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGF0YVJvd3MoKSAmJiB0aGlzLmlzU29ydGFibGVDb2x1bW4oY29sKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5NaW5XaWR0aFB4KGNvbDogVGFibGVDb2x1bW48VD4pOiBudW1iZXIge1xuICAgIHJldHVybiBnZXRUYWJsZUNvbHVtbk1pbldpZHRoUHgoY29sKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2xXaWR0aFN0eWxlKGNvbDogVGFibGVDb2x1bW48VD4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmlzRml0TGF5b3V0KCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbC53aWR0aCAhPSBudWxsID8gYCR7Y29sLndpZHRofSVgIDogYCR7Z2V0VGFibGVDb2x1bW5NaW5XaWR0aFB4KGNvbCl9cHhgO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1vYmlsZUZpZWxkTGFiZWwoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB7XG4gICAgaWYgKGNvbC5oZWFkZXIpIHtcbiAgICAgIHJldHVybiBjb2wuaGVhZGVyO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29sLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2FjdGlvbnMnOlxuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc0NmZygpLmFjdGlvbnMuYnV0dG9uTGFiZWwgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfYWN0aW9uc19tZW51JztcbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKCkuYnV0dG9uLmxhYmVsXG4gICAgICAgICAgfHwgdGhpcy5jZWxsc0NmZygpLmJ1dHRvbi50b29sdGlwXG4gICAgICAgICAgfHwgJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfYWN0aW9uX2J1dHRvbic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZUV4cGFuZFJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZFJvd0luZGV4LnNldCh0aGlzLmV4cGFuZGVkUm93SW5kZXgoKSA9PT0gaW5kZXggPyBudWxsIDogaW5kZXgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUm93RXhwYW5kZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkUm93SW5kZXgoKSA9PT0gaW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25QYWdlQ2hhbmdlKGV2ZW50OiBQYWdpbmF0b3JTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHRGaXJzdCA9IGV2ZW50LmZpcnN0ID8/IElOREVYX1pFUk87XG4gICAgY29uc3QgbmV4dFJvd3MgPSBldmVudC5yb3dzID8/IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcblxuICAgIHRoaXMuZmlyc3Quc2V0KG5leHRGaXJzdCk7XG4gICAgdGhpcy5yb3dzLnNldChuZXh0Um93cyk7XG4gICAgdGhpcy5leHBhbmRlZFJvd0luZGV4LnNldChudWxsKTtcbiAgICB0aGlzLmVtaXRMYXp5TG9hZCgncGFnZScpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgLy8gU2VtcHJlIGVtaXRlIGByb3dDbGlja2AgKGNvbXBvcnRhbWVudG8gcHLDqS1leGlzdGVudGUpOyBhbMOpbSBkaXNzbywgYWx0ZXJuYSBhIHNlbGXDp8Ojb1xuICAvLyBkYSBsaW5oYSBxdWFuZG8gYGNlbGxzLmNoZWNrYm94LnNlbGVjdE9uUm93Q2xpY2tgIGVzdMOhIGhhYmlsaXRhZG8gZSBhIGxpbmhhIHRlbSB1bWFcbiAgLy8gY29sdW5hIGRlIHNlbGXDp8OjbyAoY2hlY2tib3hDb2wpLiBPIHByw7NwcmlvIGlucHV0IGRvIGNoZWNrYm94IGZheiBzdG9wUHJvcGFnYXRpb24gbm9cbiAgLy8gY2xpY2sgKHZlciB0YWJsZS1jZWxsLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwpLCBlbnTDo28gZXNzZSBoYW5kbGVyIHPDsyBkaXNwYXJhIHBhcmFcbiAgLy8gY2xpcXVlcyBmb3JhIGRvIGNoZWNrYm94IC0gc2VtIHRvZ2dsZSBkdXBsaWNhZG8uXG4gIHByb3RlY3RlZCBvblJvd0NsaWNrZWQocm93OiBUKTogdm9pZCB7XG4gICAgdGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XG5cbiAgICBpZiAoIXRoaXMuY2hlY2tib3hDb2woKSB8fCAhdGhpcy5jZWxsc0NmZygpLmNoZWNrYm94LnNlbGVjdE9uUm93Q2xpY2sgfHwgdGhpcy5pc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uVG9nZ2xlUm93KHJvdywgIXRoaXMuaXNSb3dTZWxlY3RlZChyb3cpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblRvZ2dsZVJvdyhyb3c6IFQsIGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0U2VsZWN0aW9uID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNldCgpKTtcblxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICBuZXh0U2VsZWN0aW9uLmFkZChyb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0U2VsZWN0aW9uLmRlbGV0ZShyb3cpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKG5leHRTZWxlY3Rpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUm93U2VsZWN0ZWQocm93OiBUKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2V0KCkuaGFzKHJvdyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3c6IFQpOiBib29sZWFuIHtcbiAgICBjb25zdCBkaXNhYmxlZCA9IHRoaXMuY2VsbHNDZmcoKS5jaGVja2JveC5kaXNhYmxlZDtcblxuICAgIGlmICh0eXBlb2YgZGlzYWJsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBkaXNhYmxlZChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiBkaXNhYmxlZCA9PT0gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVTZWxlY3RQYWdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0U2VsZWN0aW9uID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvblNldCgpKTtcblxuICAgIHRoaXMuc2VsZWN0YWJsZVBhZ2VSb3dzKCkuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICBuZXh0U2VsZWN0aW9uLmFkZChyb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFNlbGVjdGlvbi5kZWxldGUocm93KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKG5leHRTZWxlY3Rpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUGFnZUZ1bGx5U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmlzaWJsZVJvd3MgPSB0aGlzLnNlbGVjdGFibGVQYWdlUm93cygpO1xuXG4gICAgaWYgKHZpc2libGVSb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuc2VsZWN0aW9uU2V0KCk7XG4gICAgcmV0dXJuIHZpc2libGVSb3dzLmV2ZXJ5KChyb3cpID0+IHNlbGVjdGVkUm93cy5oYXMocm93KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNQYWdlUGFydGlhbGx5U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmlzaWJsZVJvd3MgPSB0aGlzLnNlbGVjdGFibGVQYWdlUm93cygpO1xuXG4gICAgaWYgKHZpc2libGVSb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuc2VsZWN0aW9uU2V0KCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHZpc2libGVSb3dzLmZpbHRlcigocm93KSA9PiBzZWxlY3RlZFJvd3MuaGFzKHJvdykpLmxlbmd0aDtcblxuICAgIHJldHVybiBzZWxlY3RlZENvdW50ID4gMCAmJiBzZWxlY3RlZENvdW50IDwgdmlzaWJsZVJvd3MubGVuZ3RoO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhc1NlbGVjdGFibGVQYWdlUm93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RhYmxlUGFnZVJvd3MoKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBhZ2VTZWxlY3Rpb25BcmlhQ2hlY2tlZCgpOiAnZmFsc2UnIHwgJ21peGVkJyB8ICd0cnVlJyB7XG4gICAgaWYgKHRoaXMuaXNQYWdlUGFydGlhbGx5U2VsZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuICdtaXhlZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXNQYWdlRnVsbHlTZWxlY3RlZCgpID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDaGVja2VkVmFsdWUoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dDaGVja2JveElkKHJvdzogVCk6IHN0cmluZyB7XG4gICAgaWYgKCFyb3cgfHwgdHlwZW9mIHJvdyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBidWlsZFJvd0NoZWNrYm94SWQocm93KTtcbiAgICB9XG5cbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnJvd0NoZWNrYm94SWRDYWNoZS5nZXQocm93KTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dElkID0gYnVpbGRSb3dDaGVja2JveElkKHJvdyk7XG4gICAgdGhpcy5yb3dDaGVja2JveElkQ2FjaGUuc2V0KHJvdywgbmV4dElkKTtcbiAgICByZXR1cm4gbmV4dElkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJvd0NoZWNrYm94TGFiZWwocm93OiBUKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVJvd0lkZW50aXR5TGFiZWwocm93KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTZWxlY3RBbGxDaGVja2JveElkKGNvbHVtbkluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgc2RjLXRhYmxlLSR7dGhpcy50YWJsZUluc3RhbmNlSWR9LXNlbGVjdC1hbGwtY2hlY2tib3gtJHtjb2x1bW5JbmRleH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRhYmxlQXJpYUxhYmVsS2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXJpYUxhYmVsU2lnbmFsKCkgPz8gJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfdGFibGVfZGVzY3JpcHRpb24nO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZUFjdGlvbnNNZW51KGV2ZW50OiBFdmVudCwgcm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+LCB0cmlnZ2VyRWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmICh0aGlzLmlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSkge1xuICAgICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uc09wdGlvbnMgPSB0aGlzLmNlbGxDZmcoJ2FjdGlvbnMnKTtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuYWN0aW9uSXRlbXNGb3Iocm93LCBhY3Rpb25zT3B0aW9ucyk7XG4gICAgY29uc3QgcmVjdCA9IHRyaWdnZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1lbnVJZCA9IHRoaXMubmV4dEFjdGlvbnNNZW51SWQoKTtcblxuICAgIHRoaXMub3Blbk1lbnVTdGF0ZS5zZXQoe1xuICAgICAgcm93LFxuICAgICAgY29sLFxuICAgICAgaXRlbXMsXG4gICAgICBtZW51SWQsXG4gICAgICBjbG9zZU9uQ2xpY2s6IGFjdGlvbnNPcHRpb25zPy5jbG9zZU9uQ2xpY2sgIT09IGZhbHNlLFxuICAgICAgdHJpZ2dlcjogdHJpZ2dlckVsZW1lbnQsXG4gICAgICB0b3A6IHJlY3QuYm90dG9tICsgTUVOVV9HQVBfUFgsXG4gICAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgICB3aWR0aDogcmVjdC53aWR0aFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsb3NlQWN0aW9uc01lbnUoZm9jdXNUYXJnZXQ6IFRhYmxlTWVudUZvY3VzVGFyZ2V0ID0gVGFibGVNZW51Rm9jdXNUYXJnZXQuTm9uZSk6IHZvaWQge1xuICAgIGNvbnN0IG1lbnUgPSB0aGlzLm9wZW5NZW51U3RhdGUoKTtcbiAgICB0aGlzLm9wZW5NZW51U3RhdGUuc2V0KG51bGwpO1xuXG4gICAgaWYgKCFtZW51IHx8IGZvY3VzVGFyZ2V0ID09PSBUYWJsZU1lbnVGb2N1c1RhcmdldC5Ob25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5mb2N1c0Nsb3NlZE1lbnVUYXJnZXQobWVudS50cmlnZ2VyLCBtZW51Lm1lbnVJZCwgZm9jdXNUYXJnZXQpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0FjdGlvbnNNZW51T3Blbihyb3c6IFQsIGNvbDogVGFibGVDb2x1bW48VD4pOiBib29sZWFuIHtcbiAgICBjb25zdCBtZW51ID0gdGhpcy5vcGVuTWVudVN0YXRlKCk7XG5cbiAgICBpZiAoIW1lbnUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVudS5yb3cgPT09IHJvdyAmJiBtZW51LmNvbCA9PT0gY29sO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFjdGlvbkl0ZW1zRm9yKHJvdzogVCwgb3B0aW9uczogVGFibGVDZWxsQ29uZmlnPFQsICdhY3Rpb25zJz4pOiBOYXRpdmVBY3Rpb25NZW51SXRlbVtdIHtcbiAgICBjb25zdCBpdGVtcyA9IG9wdGlvbnMuaXRlbXMgPz8gW107XG5cbiAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtOiBBY3Rpb25NZW51SXRlbTxUPikgPT4gKHtcbiAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgIGljb246IGl0ZW0uaWNvbixcbiAgICAgIGRpc2FibGVkOiB0aGlzLnJlc29sdmVBY3Rpb25EaXNhYmxlZChpdGVtLCByb3cpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUG9ydGFsQWN0aW9uQ2xpY2soaXRlbTogTmF0aXZlQWN0aW9uTWVudUl0ZW0pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbnUgPSB0aGlzLm9wZW5NZW51U3RhdGUoKTtcblxuICAgIGlmICghbWVudSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub25BY3Rpb25TZWxlY3QobWVudS5yb3csIG1lbnUuY29sLCBpdGVtKTtcblxuICAgIGlmIChtZW51LmNsb3NlT25DbGljaykge1xuICAgICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWVudUNsb3NlKGV2ZW50OiBUYWJsZUFjdGlvbk1lbnVDbG9zZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KGV2ZW50LmZvY3VzVGFyZ2V0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkFjdGlvblNlbGVjdChyb3c6IFQsIGNvbDogVGFibGVDb2x1bW48VD4sIGl0ZW06IHsga2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IGljb24/OiBzdHJpbmc7IGRpc2FibGVkPzogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbC5hY3Rpb25GaWVsZCA/PyBjb2wuZmllbGQ7XG4gICAgY29uc3Qgcm93VmFsdWUgPSBmaWVsZEtleSA/IHRoaXMucmVzb2x2ZVZhbHVlKHJvdywgZmllbGRLZXkpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYWN0aW9uLmVtaXQoeyByb3csIGNvbHVtbjogY29sLCB2YWx1ZTogeyByb3dWYWx1ZSwgYWN0aW9uOiBpdGVtIH0gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CdXR0b25DbGljayhyb3c6IFQsIGNvbDogVGFibGVDb2x1bW48VD4pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBjb2wuYWN0aW9uRmllbGQgPz8gY29sLmZpZWxkO1xuICAgIGNvbnN0IHZhbHVlID0ga2V5ID8gdGhpcy5yZXNvbHZlVmFsdWUocm93LCBrZXkpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYWN0aW9uLmVtaXQoeyByb3csIHZhbHVlLCBjb2x1bW46IGNvbCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlQ2VsbElkKGNvbDogVGFibGVDb2x1bW48VD4sIHJvdzogVCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghY29sLmNlbGxJZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiBjb2wuY2VsbElkID09PSAnZnVuY3Rpb24nID8gKGNvbC5jZWxsSWQocm93KSB8fCBudWxsKSA6IChjb2wuY2VsbElkIHx8IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBjZWxsQ2ZnPEsgZXh0ZW5kcyBUYWJsZUNlbGxDb25maWdLZXk+KGtpbmQ6IEspIHtcbiAgICByZXR1cm4gdGhpcy5jZWxsc0NmZygpW2tpbmRdO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TGF6eUxvYWQodHJpZ2dlcjogJ3BhZ2UnIHwgJ3NvcnQnIHwgJ3NlYXJjaCcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICBmaXJzdDogbnVtYmVyO1xuICAgICAgcm93czogbnVtYmVyO1xuICAgICAgc29ydEZpZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHNvcnRPcmRlcj86IFNvcnRPcmRlcjtcbiAgICAgIHRyaWdnZXI/OiAncGFnZScgfCAnc29ydCcgfCAnc2VhcmNoJztcbiAgICAgIHNlYXJjaFRlcm0/OiBzdHJpbmc7XG4gICAgfSA9IHtcbiAgICAgIGZpcnN0OiB0aGlzLmZpcnN0KCksXG4gICAgICByb3dzOiB0aGlzLnJvd3MoKSxcbiAgICAgIHNvcnRGaWVsZDogdGhpcy5zb3J0RmllbGQoKSxcbiAgICAgIHNvcnRPcmRlcjogdGhpcy5zb3J0T3JkZXIoKSxcbiAgICAgIHRyaWdnZXJcbiAgICB9O1xuXG4gICAgaWYgKHRyaWdnZXIgPT09ICdzZWFyY2gnKSB7XG4gICAgICBwYXlsb2FkLnNlYXJjaFRlcm0gPSB0aGlzLmdsb2JhbEZpbHRlcigpO1xuICAgIH1cblxuICAgIHRoaXMubGF6eUxvYWQuZW1pdChwYXlsb2FkKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xhbXBQYWdlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93UGFnaW5hdG9yKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhGaXJzdCA9IE1hdGgubWF4KElOREVYX1pFUk8sIHRoaXMudG90YWxSZWNvcmRzKCkgLSB0aGlzLnJvd3MoKSk7XG5cbiAgICBpZiAodGhpcy5maXJzdCgpID4gbWF4Rmlyc3QpIHtcbiAgICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5PVEU6IGluIGBhcGlgIG1vZGUgKGBjb25maWcudGFibGUubW9kZSA9PT0gJ2FwaSdgLCB1c2VkIGJ5IGNvbnN1bWVycyBsaWtlIHNkYy1sb29rdXAgdGhhdFxuICAvLyBmZXRjaCBlYWNoIHBhZ2UgZXh0ZXJuYWxseSksIGBkYXRhYCBpcyBzd2FwcGVkIGVudGlyZWx5IG9uIGV2ZXJ5IHBhZ2Uvc2VhcmNoIGNoYW5nZSBhbmRcbiAgLy8gb25seSBldmVyIHJlcHJlc2VudHMgT05FIHBhZ2UncyB3b3J0aCBvZiByb3dzLiBQcmV2aW91c2x5LCBhbnkgc2VsZWN0ZWQgcm93IG5vdCBmb3VuZCBpblxuICAvLyB0aGUgY3VycmVudCBgZGF0YWAgYXJyYXkgd2FzIHRyZWF0ZWQgYXMgXCJubyBsb25nZXIgZXhpc3RzXCIgYW5kIHNpbGVudGx5IGRyb3BwZWQg4oCUIHdoaWNoXG4gIC8vIHdpcGVkIG91dCBjcm9zcy1wYWdlIHNlbGVjdGlvbnMgdGhlIG1vbWVudCB0aGUgdXNlciBuYXZpZ2F0ZWQgdG8gYW5vdGhlciBwYWdlLiBJbiBgYXBpYFxuICAvLyBtb2RlIHdlIG5vdyBwcmVzZXJ2ZSBzZWxlY3Rpb25zIGZvciByb3dzIG5vdCBwcmVzZW50IG9uIHRoZSBjdXJyZW50IHBhZ2UuIEluIGBsb2NhbGAgbW9kZSxcbiAgLy8gYGRhdGFgIGlzIGV4cGVjdGVkIHRvIHJlcHJlc2VudCB0aGUgZnVsbC9jdXJyZW50IGRhdGFzZXQsIHNvIHRoZSBvcmlnaW5hbCBcImRyb3Agd2hhdCdzIG5vdFxuICAvLyB0aGVyZVwiIGJlaGF2aW9yIGlzIGtlcHQgKGEgY29uc3VtZXIgc3dhcHBpbmcgdG8gYSBnZW51aW5lbHkgZGlmZmVyZW50IGRhdGFzZXQgc2hvdWxkIHN0aWxsXG4gIC8vIGNsZWFyIHN0YWxlIHNlbGVjdGlvbnMpLlxuICBwcml2YXRlIHJlY29uY2lsZVNlbGVjdGlvbldpdGhEYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGlzQXBpTW9kZSA9IHRoaXMuaXNBcGlNb2RlKCk7XG4gICAgY29uc3Qgcm93c0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFQ+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLmRhdGFTaWduYWwoKSkge1xuICAgICAgY29uc3Qgcm93S2V5ID0gdGhpcy5nZXRTZWxlY3Rpb25LZXkocm93KTtcblxuICAgICAgaWYgKCFyb3dzQnlLZXkuaGFzKHJvd0tleSkpIHtcbiAgICAgICAgcm93c0J5S2V5LnNldChyb3dLZXksIHJvdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VlbktleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBuZXh0U2VsZWN0aW9uOiBUW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMuc2VsZWN0aW9uU2lnbmFsKCkpIHtcbiAgICAgIGNvbnN0IHJvd0tleSA9IHRoaXMuZ2V0U2VsZWN0aW9uS2V5KHJvdyk7XG5cbiAgICAgIGlmICghc2VlbktleXMuaGFzKHJvd0tleSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBhZ2VSb3cgPSByb3dzQnlLZXkuZ2V0KHJvd0tleSk7XG4gICAgICAgIGNvbnN0IGtlZXBSb3cgPSBjdXJyZW50UGFnZVJvdyA/ICF0aGlzLmlzUm93U2VsZWN0aW9uRGlzYWJsZWQoY3VycmVudFBhZ2VSb3cpIDogaXNBcGlNb2RlO1xuXG4gICAgICAgIGlmIChrZWVwUm93KSB7XG4gICAgICAgICAgc2VlbktleXMuYWRkKHJvd0tleSk7XG4gICAgICAgICAgbmV4dFNlbGVjdGlvbi5wdXNoKGN1cnJlbnRQYWdlUm93ID8/IHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihuZXh0U2VsZWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUFjdGlvbkRpc2FibGVkKGl0ZW06IEFjdGlvbk1lbnVJdGVtPFQ+LCByb3c6IFQpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGl0ZW0uZGlzYWJsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVtLmRpc2FibGVkKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW0uZGlzYWJsZWQgPT09IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdGFibGVQYWdlUm93cygpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLnBhZ2VEYXRhKCkuZmlsdGVyKChyb3cpID0+ICF0aGlzLmlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGlvbihuZXh0U2VsZWN0aW9uOiBJdGVyYWJsZTxUPik6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWxlY3Rpb24gPSB0aGlzLm5vcm1hbGl6ZVNlbGVjdGlvbihuZXh0U2VsZWN0aW9uKTtcblxuICAgIGlmICh0aGlzLmhhc1NhbWVTZWxlY3Rpb24odGhpcy5zZWxlY3Rpb25TaWduYWwoKSwgbm9ybWFsaXplZFNlbGVjdGlvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGlvblNpZ25hbC5zZXQobm9ybWFsaXplZFNlbGVjdGlvbik7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChbLi4ubm9ybWFsaXplZFNlbGVjdGlvbl0pO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbjogSXRlcmFibGU8VD4pOiBUW10ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWxlY3Rpb246IFRbXSA9IFtdO1xuICAgIGNvbnN0IHNlZW5Sb3dzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBuZXh0U2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCByb3dLZXkgPSB0aGlzLmdldFNlbGVjdGlvbktleShyb3cpO1xuXG4gICAgICBjb25zdCBzaG91bGRBcHBlbmQgPSAhc2VlblJvd3MuaGFzKHJvd0tleSkgJiYgIXRoaXMuaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpO1xuXG4gICAgICBpZiAoc2hvdWxkQXBwZW5kKSB7XG4gICAgICAgIHNlZW5Sb3dzLmFkZChyb3dLZXkpO1xuICAgICAgICBub3JtYWxpemVkU2VsZWN0aW9uLnB1c2gocm93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZFNlbGVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0aW9uS2V5KHJvdzogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVSb3dTZWxlY3Rpb25LZXkocm93KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzU2FtZVNlbGVjdGlvbihjdXJyZW50U2VsZWN0aW9uOiBUW10sIG5leHRTZWxlY3Rpb246IFRbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uLmxlbmd0aCA9PT0gbmV4dFNlbGVjdGlvbi5sZW5ndGhcbiAgICAgICYmIGN1cnJlbnRTZWxlY3Rpb24uZXZlcnkoKHJvdywgaW5kZXgpID0+IHJvdyA9PT0gbmV4dFNlbGVjdGlvbltpbmRleF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXh0QWN0aW9uc01lbnVJZCgpOiBzdHJpbmcge1xuICAgIHRoaXMuYWN0aW9uc01lbnVJZFNlcXVlbmNlICs9IDE7XG4gICAgcmV0dXJuIGBzZGMtdGFibGUtYWN0aW9ucy1tZW51LSR7dGhpcy5hY3Rpb25zTWVudUlkU2VxdWVuY2V9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNDbG9zZWRNZW51VGFyZ2V0KFxuICAgIHRyaWdnZXI6IEhUTUxFbGVtZW50LFxuICAgIG1lbnVJZDogc3RyaW5nLFxuICAgIGZvY3VzVGFyZ2V0OiBUYWJsZU1lbnVGb2N1c1RhcmdldFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRyaWdnZXIuaXNDb25uZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZm9jdXNUYXJnZXQgPT09IFRhYmxlTWVudUZvY3VzVGFyZ2V0LlRyaWdnZXIpIHtcbiAgICAgIHRyaWdnZXIuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvd25lckRvY3VtZW50ID0gdHJpZ2dlci5vd25lckRvY3VtZW50O1xuICAgIGNvbnN0IG1lbnVFbGVtZW50ID0gb3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChtZW51SWQpO1xuICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMob3duZXJEb2N1bWVudCkuZmlsdGVyKChlbGVtZW50KSA9PiAhbWVudUVsZW1lbnQ/LmNvbnRhaW5zKGVsZW1lbnQpKTtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBmb2N1c2FibGVFbGVtZW50cy5pbmRleE9mKHRyaWdnZXIpO1xuXG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IGZvY3VzVGFyZ2V0ID09PSBUYWJsZU1lbnVGb2N1c1RhcmdldC5OZXh0ID8gY3VycmVudEluZGV4ICsgMSA6IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBmb2N1c2FibGVFbGVtZW50c1t0YXJnZXRJbmRleF07XG5cbiAgICBuZXh0RWxlbWVudD8uZm9jdXMoKTtcbiAgfVxufVxuIiwiPHNlY3Rpb25cbiAgY2xhc3M9XCJzZGMtdGFibGVcIlxuICBbY2xhc3Muc2RjLXRhYmxlLXN0YWNrXT1cImlzTW9iaWxlKClcIlxuICBbY2xhc3Muc2RjLXRhYmxlLWZpbHRlcmVkXT1cIiEhZ2xvYmFsRmlsdGVyKCkudHJpbSgpXCJcbiAgW2NsYXNzLnNkYy10YWJsZS0tbG9hZGluZ109XCJpc0xvYWRpbmdcIlxuICBbY2xhc3Muc2RjLXRhYmxlLS1pbml0aWFsLWxvYWRpbmddPVwic2hvd0luaXRpYWxMb2FkaW5nKClcIlxuPlxuICA8c2RjLWxvYWRpbmctc3RhdGVcbiAgICBjbGFzcz1cInNkYy10YWJsZS1sb2FkaW5nLXdyYXBcIlxuICAgIFtsb2FkaW5nXT1cImlzTG9hZGluZ1wiXG4gICAgW2Jsb2NrV2luZG93XT1cImZhbHNlXCJcbiAgICBbYmxvY2tEZWxheU1zXT1cIjBcIlxuICAgIFtpbmRpY2F0b3JdPVwibG9hZGluZ0luZGljYXRvclwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXNoZWxsXCIgW3N0eWxlLi0tc2RjLXRhYmxlLWJvZHktaGVpZ2h0LnB4XT1cImJvZHlWaWV3cG9ydEhlaWdodFB4KClcIj5cbiAgICAgIEBpZiAoc2hvd1NlYXJjaCgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtY2FwdGlvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtY2FwdGlvbl9fc2VhcmNoXCIgW2NsYXNzLnNkYy10YWJsZS1jYXB0aW9uX19zZWFyY2gtLWZ1bGwtd2lkdGhdPVwic2VhcmNoRnVsbFdpZHRoKClcIj5cbiAgICAgICAgICAgIDxzZGMtc2VhcmNoYm94XG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXIoKVwiXG4gICAgICAgICAgICAgIFt0cmlnZ2VyTW9kZV09XCJ0cmlnZ2VyTW9kZSgpXCJcbiAgICAgICAgICAgICAgKG9uU2VhcmNoKT1cIm9uU2VhcmNoVGVybSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwib25DbGVhclNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9zZWFyY2hfZmllbGQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKCFpc01vYmlsZSgpKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1zY3JvbGxcIlxuICAgICAgICAgIFtzdHlsZS4tLXNkYy10YWJsZS1taW4td2lkdGhdPVwiaXNGaXRMYXlvdXQoKSA/ICcxMDAlJyA6IHRhYmxlTWluV2lkdGhQeCgpICsgJ3B4J1wiXG4gICAgICAgID5cbiAgICAgICAgICA8dGFibGVcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWdyaWRcIlxuICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1ncmlkLS1maXRdPVwiaXNGaXRMYXlvdXQoKVwiXG4gICAgICAgICAgICByb2xlPVwidGFibGVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0YWJsZUFyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcm93Y291bnRdPVwidG90YWxSZWNvcmRzKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1idXN5XT1cImlzTG9hZGluZ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGNvbGdyb3VwPlxuICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGNvbCBbc3R5bGUud2lkdGhdPVwiY29sV2lkdGhTdHlsZShjb2wpXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9jb2xncm91cD5cblxuICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICA8dHIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRoLWNoZWNrYm94XT1cImNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRoLWJ1dHRvbl09XCJjb2wudHlwZSA9PT0gJ2J1dHRvbidcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRoLWFjdGlvbnNdPVwiY29sLnR5cGUgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtc29ydGFibGVdPVwiY2FuU29ydENvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1zb3J0YWJsZS1kaXNhYmxlZF09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbCkgJiYgIWNhblNvcnRDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtaGVhZGVyLWRpc2FibGVkXT1cIiFoYXNEYXRhUm93cygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1pcy1zZWxlY3RlZF09XCJzb3J0RmllbGQoKSA9PT0gY29sLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uQWxpZ25DbGFzcyhjb2wsICdoZWFkZXInKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc29ydF09XCJnZXRTb3J0QXJpYUF0dHJpYnV0ZShjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaGFzRGF0YVJvd3MoKSAmJiBjYW5Tb3J0Q29sdW1uKGNvbCkgPyAwIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIWhhc0RhdGFSb3dzKCkgfHwgKGlzU29ydGFibGVDb2x1bW4oY29sKSAmJiAhY2FuU29ydENvbHVtbihjb2wpKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGlzU29ydGFibGVDb2x1bW4oY29sKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbC5oZWFkZXIgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIC0gJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NvcnRhYmxlX2NvbHVtbicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKGNvbC5oZWFkZXIgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYXNEYXRhUm93cygpICYmIGNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBjYW5Tb3J0Q29sdW1uKGNvbCkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImhhc0RhdGFSb3dzKCkgJiYgY29sLmZpZWxkID8gdG9nZ2xlU29ydChjb2wuZmllbGQsIGNhblNvcnRDb2x1bW4oY29sKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgaGFzRGF0YVJvd3MoKSAmJiBjb2wuZmllbGQgPyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgY2FuU29ydENvbHVtbihjb2wpKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJyAmJiAoY2VsbHNDZmcoKS5jaGVja2JveC5zZWxlY3RBbGwgPz8gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRoLWlubmVyIHNkYy10YWJsZS10aC1pbm5lci0tY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXRoLWxhYmVsIHNyLW9ubHlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBjb2wuaGVhZGVyIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGgtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImdldFNlbGVjdEFsbENoZWNrYm94SWQoJGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNQYWdlRnVsbHlTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJpc1BhZ2VQYXJ0aWFsbHlTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1NlbGVjdGFibGVQYWdlUm93cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdFBhZ2UoZ2V0Q2hlY2tlZFZhbHVlKCRldmVudCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgdG9nZ2xlU2VsZWN0UGFnZSghaXNQYWdlRnVsbHlTZWxlY3RlZCgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9zZWxlY3RfYWxsX3Jvd3MnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiZ2V0UGFnZVNlbGVjdGlvbkFyaWFDaGVja2VkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCJnZXRTZWxlY3RBbGxDaGVja2JveElkKCRpbmRleClcIiBjbGFzcz1cInNyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9zZWxlY3RfYWxsX3Jvd3MnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGgtaW5uZXJcIiBbY2xhc3Muc2RjLXRhYmxlLXRoLWlubmVyLS1zb3J0YWJsZV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXRoLWxhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgY29sLmhlYWRlciB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuaGVhZGVyVG9vbHRpcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10aC10b29sdGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiY29sLmhlYWRlclRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiY29sLmhlYWRlclRvb2x0aXBQb3NpdGlvbiA/PyAndG9wJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBFdmVudF09XCJjb2wuaGVhZGVyVG9vbHRpcEV2ZW50ID8/ICdob3ZlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaXJjbGUtaW5mbyBzZGMtdGFibGUtdGgtdG9vbHRpcF9faWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZGMtdG9vbHRpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtc29ydC1vdmVybGF5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtc29ydC1pbmRpY2F0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uRmllbGRdPVwiY29sLmZpZWxkIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5UeXBlXT1cImNvbC50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydEZpZWxkXT1cInNvcnRGaWVsZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydE9yZGVyXT1cInNvcnRPcmRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG5cbiAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgQGlmIChzaG93SW5pdGlhbExvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgIEBmb3IgKHJvd0luZGV4IG9mIGluaXRpYWxMb2FkaW5nUm93cygpOyB0cmFjayByb3dJbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInNkYy10YWJsZS1pbml0aWFsLWxvYWRpbmctcm93XCIgcm9sZT1cInJvd1wiIFthdHRyLmFyaWEtcm93aW5kZXhdPVwiciArIDFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtdGQgc2RjLXRhYmxlLXRkYyBzZGMtdGFibGUtdGQtLWluaXRpYWwtbG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWNoZWNrYm94XT1cImNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWN1cnJlbmN5XT1cImNvbC50eXBlID09PSAnY3VycmVuY3knXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYnV0dG9uXT1cImNvbC50eXBlID09PSAnYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWFjdGlvbnNdPVwiY29sLnR5cGUgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZV09XCJjb2wuaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbCBzZGMtdGFibGUtdGQtdmFsLS1pbml0aWFsLWxvYWRpbmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgQGZvciAocm93IG9mIHBhZ2VEYXRhKCk7IHRyYWNrICRpbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyICsgMVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblJvd0NsaWNrZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uUm93Q2xpY2tlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtdGQgc2RjLXRhYmxlLXRkY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWNoZWNrYm94XT1cImNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWN1cnJlbmN5XT1cImNvbC50eXBlID09PSAnY3VycmVuY3knXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYnV0dG9uXT1cImNvbC50eXBlID09PSAnYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXRkLWFjdGlvbnNdPVwiY29sLnR5cGUgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWlzLXNlbGVjdGVkXT1cInNvcnRGaWVsZCgpID09PSBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uQWxpZ25DbGFzcyhjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGl0bGVdPVwiY29sLmhlYWRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJjb2wuY29sSWQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuY2VsbFRhZyA9PT0gJ3NwYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbFwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51SWRdPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpID8gb3Blbk1lbnVTdGF0ZSgpPy5tZW51SWQgPz8gbnVsbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbC5jZWxsVGFnID09PSAnaScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29sLmNlbGxUYWcgPT09ICdwJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuXG4gICAgICAgICAgQGlmICghaXNMb2FkaW5nICYmIG9wdGlvbnMoKS5lbXB0eT8uc2hvdyAhPT0gZmFsc2UgJiYgdG90YWxSZWNvcmRzKCkgPT09IDApIHtcbiAgICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgICAgaWQ9XCJteS1lbXB0eS1zdGF0ZVwiXG4gICAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWluYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJlbXB0eVRleHQoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgICA+PC9zZGMtZW1wdHktc3RhdGU+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2UgaWYgKG1vYmlsZU1vZGUoKSA9PT0gJ3N0YWNrZWQnKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGlzdFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0YWJsZUFyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAoc2hvd0luaXRpYWxMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIEBmb3IgKHJvd0luZGV4IG9mIGluaXRpYWxMb2FkaW5nUm93cygpOyB0cmFjayByb3dJbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtY2FyZCBzZGMtdGFibGUtbW9iaWxlLWNhcmQtLWxvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1maWVsZCBzZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1sb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsIHNkYy10YWJsZS1tb2JpbGUtbGFiZWwtLWxvYWRpbmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtc2tlbGV0b25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAZm9yIChyb3cgb2YgcGFnZURhdGEoKTsgdHJhY2sgJGluZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1jYXJkXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tZnVsbC13aWR0aF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gJ2J1dHRvbicgfHwgY29sLnR5cGUgPT09ICdhY3Rpb25zJyB8fCBjb2wudHlwZSA9PT0gJ2NoZWNrYm94LXNlbGVjdGlvbidcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1tb2JpbGUtZmllbGQtLXNlbGVjdGVkXT1cInNvcnRGaWVsZCgpID09PSBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tc29ydGFibGVdPVwiY29sLmZpZWxkICYmIGlzU29ydGFibGVDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2wuZmllbGQgJiYgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1vYmlsZUZpZWxkTGFiZWwoY29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmZpZWxkICYmIGlzU29ydGFibGVDb2x1bW4oY29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsIHNkYy10YWJsZS1tb2JpbGUtbGFiZWwtLXNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIC0gJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9zb3J0YWJsZV9jb2x1bW4nIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInRvZ2dsZVNvcnQoY29sLmZpZWxkLCBpc1NvcnRhYmxlQ29sdW1uKGNvbCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgdG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgbW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtc29ydC1pbmRpY2F0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5GaWVsZF09XCJjb2wuZmllbGQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uVHlwZV09XCJjb2wudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydGFibGVdPVwiaXNTb3J0YWJsZUNvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0RmllbGRdPVwic29ydEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRPcmRlcl09XCJzb3J0T3JkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLXNvcnQtaW5kaWNhdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS12YWx1ZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JjZUxlZnRBbGlnbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmICghaXNMb2FkaW5nICYmIG9wdGlvbnMoKS5lbXB0eT8uc2hvdyAhPT0gZmFsc2UgJiYgdG90YWxSZWNvcmRzKCkgPT09IDApIHtcbiAgICAgICAgICA8c2RjLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICBpZD1cIm15LWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWluYm94XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJlbXB0eVRpdGxlKClcIlxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5VGV4dCgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cImVtcHR5Qm9keUhlaWdodFB4KClcIlxuICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgfVxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx1bFxuICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtbGlzdFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0YWJsZUFyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAoc2hvd0luaXRpYWxMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIEBmb3IgKHJvd0luZGV4IG9mIGluaXRpYWxMb2FkaW5nUm93cygpOyB0cmFjayByb3dJbmRleCkge1xuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1pdGVtIHNkYy10YWJsZS1leHBhbmRhYmxlLWl0ZW0tLWxvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtc3VtbWFyeSBzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LS1sb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtc3VtbWFyeS1maWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtc2tlbGV0b24gc2RjLXRhYmxlLWV4cGFuZGFibGUtc2tlbGV0b24tcHJpbWFyeVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1za2VsZXRvbiBzZGMtdGFibGUtZXhwYW5kYWJsZS1za2VsZXRvbi1zZWNvbmRhcnlcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1jaGV2cm9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93blwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBwYWdlRGF0YSgpOyB0cmFjayAkaW5kZXg7IGxldCByID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtaXRlbVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1leHBhbmRhYmxlLWl0ZW0tLWV4cGFuZGVkXT1cImlzUm93RXhwYW5kZWQocilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFeHBhbmRSb3cocilcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwidG9nZ2xlRXhwYW5kUm93KHIpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVFeHBhbmRSb3cocilcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY2hlY2tib3hDb2woKTsgYXMgY2JDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlTGVmdEFsaWduXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjYkNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjYkNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY2JDb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtc3VtbWFyeS1maWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIHN1bW1hcnlDb2xzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXN1bW1hcnktbGFiZWxcIj57eyBtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtc3VtbWFyeS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JjZUxlZnRBbGlnbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNSb3dFeHBhbmRlZChyKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXNSb3dFeHBhbmRlZChyKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfY29sbGFwc2Vfcm93JyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKCdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X2V4cGFuZF9yb3cnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVFeHBhbmRSb3cocilcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1jaGV2cm9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWV4cGFuZGFibGUtY2hldnJvbi0tb3Blbl09XCJpc1Jvd0V4cGFuZGVkKHIpXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+PGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBpZiAoaXNSb3dFeHBhbmRlZChyKSkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnR5cGUgIT09ICdjaGVja2JveC1zZWxlY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWV4cGFuZGFibGUtZmllbGQtLWZ1bGwtd2lkdGhdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT09ICdidXR0b24nIHx8IGNvbC50eXBlID09PSAnYWN0aW9ucydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wudHlwZSAhPT0gJ2J1dHRvbicgJiYgY29sLnR5cGUgIT09ICdhY3Rpb25zJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1sYWJlbC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWxhYmVsXCI+e3sgbW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS12YWx1ZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JjZUxlZnRBbGlnbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvdWw+XG5cbiAgICAgICAgQGlmICghaXNMb2FkaW5nICYmIG9wdGlvbnMoKS5lbXB0eT8uc2hvdyAhPT0gZmFsc2UgJiYgdG90YWxSZWNvcmRzKCkgPT09IDApIHtcbiAgICAgICAgICA8c2RjLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICBpZD1cIm15LWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLWluYm94XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJlbXB0eVRpdGxlKClcIlxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5VGV4dCgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cImVtcHR5Qm9keUhlaWdodFB4KClcIlxuICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBAaWYgKHNob3dQYWdpbmF0b3IoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXBhZ2luYXRvclwiPlxuICAgICAgICAgIDxzZGMtcGFnaW5hdG9yXG4gICAgICAgICAgICBbZmlyc3RdPVwiZmlyc3QoKVwiXG4gICAgICAgICAgICBbcm93c109XCJyb3dzKClcIlxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHMoKVwiXG4gICAgICAgICAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cImlzTW9iaWxlKCkgPyBbXSA6IHJvd3NQZXJQYWdlT3B0aW9ucygpXCJcbiAgICAgICAgICAgIFtzaG93Um93c1BlclBhZ2VTZWxlY3Rvcl09XCJzaG93Um93c1BlclBhZ2VTZWxlY3RvcigpXCJcbiAgICAgICAgICAgIFtpc01vYmlsZV09XCJpc01vYmlsZSgpXCJcbiAgICAgICAgICAgIFt0b3RhbFJlY29yZHNMYWJlbF09XCJ0b3RhbFJlY29yZHNMYWJlbCgpXCJcbiAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9zZGMtcGFnaW5hdG9yPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9zZGMtbG9hZGluZy1zdGF0ZT5cbjwvc2VjdGlvbj5cblxuQGlmIChvcGVuTWVudVN0YXRlKCk7IGFzIG1lbnUpIHtcbiAgPHNkYy10YWJsZS1hY3Rpb25zLW1lbnVcbiAgICBbaXRlbXNdPVwibWVudS5pdGVtc1wiXG4gICAgW21lbnVJZF09XCJtZW51Lm1lbnVJZFwiXG4gICAgW3RvcF09XCJtZW51LnRvcFwiXG4gICAgW2xlZnRdPVwibWVudS5sZWZ0XCJcbiAgICBbd2lkdGhdPVwibWVudS53aWR0aFwiXG4gICAgKGNsb3NlKT1cIm9uTWVudUNsb3NlKCRldmVudClcIlxuICAgIChzZWxlY3QpPVwib25Qb3J0YWxBY3Rpb25DbGljaygkZXZlbnQpXCJcbiAgPjwvc2RjLXRhYmxlLWFjdGlvbnMtbWVudT5cbn1cbiJdfQ==