ontimize-web-ngx 15.8.0 → 15.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/esm2020/lib/components/input/date-range-legacy/o-daterange-picker.component.mjs +2 -2
  2. package/esm2020/lib/components/input/radio/o-radio.component.mjs +4 -3
  3. package/esm2020/lib/components/o-form-data-component.class.mjs +2 -2
  4. package/esm2020/lib/components/table/extensions/default-o-table.datasource.mjs +4 -2
  5. package/esm2020/lib/components/table/extensions/dialog/visible-columns/o-table-visible-columns-dialog.component.mjs +33 -5
  6. package/esm2020/lib/components/table/extensions/header/table-header/o-table-header.component.mjs +6 -4
  7. package/esm2020/lib/components/table/extensions/header/table-header-column-filter-icon/o-table-header-column-filter-icon.component.mjs +30 -24
  8. package/esm2020/lib/components/table/extensions/header/table-header-select-all/o-table-header-select-all.component.mjs +2 -2
  9. package/esm2020/lib/components/table/extensions/o-table-strategy.service.mjs +9 -2
  10. package/esm2020/lib/components/table/o-table.component.mjs +59 -41
  11. package/fesm2015/ontimize-web-ngx.mjs +146 -80
  12. package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
  13. package/fesm2020/ontimize-web-ngx.mjs +141 -77
  14. package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
  15. package/lib/components/input/radio/o-radio.component.d.ts +1 -0
  16. package/lib/components/table/extensions/header/table-header/o-table-header.component.d.ts +3 -1
  17. package/lib/components/table/extensions/header/table-header-column-filter-icon/o-table-header-column-filter-icon.component.d.ts +9 -4
  18. package/lib/components/table/extensions/header/table-header-select-all/o-table-header-select-all.component.d.ts +1 -1
  19. package/lib/components/table/extensions/o-table-strategy.service.d.ts +2 -0
  20. package/lib/components/table/o-table.component.d.ts +14 -7
  21. package/package.json +1 -1
@@ -353,6 +353,9 @@ export class OTableComponent extends AbstractOServiceComponent {
353
353
  this.storePaginationState = false;
354
354
  this.pageScrollVirtual = 1;
355
355
  this.savedScrollPosition = 0;
356
+ this.columnFiltersSubject = new BehaviorSubject([]);
357
+ this.columnFilters$ = this.columnFiltersSubject.asObservable();
358
+ this.originalRegisteredColumns = [];
356
359
  this.groupedColumnsArray = [];
357
360
  this._isColumnFiltersActive = false;
358
361
  this.groupingHeadersRows = [];
@@ -371,6 +374,17 @@ export class OTableComponent extends AbstractOServiceComponent {
371
374
  }
372
375
  this.snackBarService = this.injector.get(SnackBarService);
373
376
  this.getInjectionTokenConfig();
377
+ this.subscribeToFilterChanges();
378
+ }
379
+ subscribeToFilterChanges() {
380
+ this.subscriptionOnFilterChanges = this.onFilterByColumnChange.subscribe(event => {
381
+ this.updateColumnFiltersSubject(event);
382
+ });
383
+ }
384
+ updateColumnFiltersSubject(event) {
385
+ const newFilters = [...this.dataSource.getColumnValueFilters()];
386
+ this.columnFiltersSubject.next(newFilters);
387
+ this.cd.detectChanges();
374
388
  }
375
389
  getInjectionTokenConfig() {
376
390
  try {
@@ -502,6 +516,7 @@ export class OTableComponent extends AbstractOServiceComponent {
502
516
  this.portalHost.forEach(x => x.detach());
503
517
  }
504
518
  this.destroy();
519
+ this.columnFiltersSubject.complete();
505
520
  }
506
521
  getSuffixColumnInsertable() {
507
522
  return Codes.SUFFIX_COLUMN_INSERTABLE;
@@ -541,6 +556,7 @@ export class OTableComponent extends AbstractOServiceComponent {
541
556
  }
542
557
  initialize() {
543
558
  super.initialize();
559
+ this.originalNonHidableColumns = this.nonHidableColumns;
544
560
  this._oTableOptions = new DefaultOTableOptions();
545
561
  if (this.tabGroupContainer && this.tabContainer) {
546
562
  this.registerTabListener();
@@ -752,6 +768,7 @@ export class OTableComponent extends AbstractOServiceComponent {
752
768
  if (this.loadingService) {
753
769
  this.loadingService.ngOnDestroy?.();
754
770
  }
771
+ this.subscriptionOnFilterChanges?.unsubscribe();
755
772
  }
756
773
  getDataToStore() {
757
774
  return this.componentStateService.getDataToStore();
@@ -816,7 +833,7 @@ export class OTableComponent extends AbstractOServiceComponent {
816
833
  this.pushOColumnDefinition(colDef);
817
834
  }
818
835
  pushOColumnDefinition(colDef) {
819
- colDef.visible = (this._visibleColArray.indexOf(colDef.attr) !== -1);
836
+ colDef.visible = this.visibleColArray.includes(colDef.attr);
820
837
  const alreadyExisting = this.getOColumn(colDef.attr);
821
838
  if (alreadyExisting !== undefined) {
822
839
  const replacingIndex = this._oTableOptions.columns.indexOf(alreadyExisting);
@@ -824,6 +841,7 @@ export class OTableComponent extends AbstractOServiceComponent {
824
841
  }
825
842
  else {
826
843
  this._oTableOptions.columns.push(colDef);
844
+ this.originalRegisteredColumns.push(colDef);
827
845
  }
828
846
  this.ensureColumnsOrder();
829
847
  this.refreshEditionModeWarn();
@@ -855,6 +873,13 @@ export class OTableComponent extends AbstractOServiceComponent {
855
873
  }
856
874
  }
857
875
  parseVisibleColumns(defaultConfiguration = false) {
876
+ if (defaultConfiguration) {
877
+ this.state.columnsDisplay = undefined;
878
+ const originalColumns = this.originalRegisteredColumns.map(col => col.attr);
879
+ this.visibleColArray = this.originalRegisteredColumns.filter(item => item.visible).map(item => item.attr);
880
+ this._oTableOptions.columns.sort((a, b) => originalColumns.indexOf(a.attr) - originalColumns.indexOf(b.attr));
881
+ return;
882
+ }
858
883
  if (this.state.columnsDisplay) {
859
884
  let stateCols = [];
860
885
  this.state.columnsDisplay.forEach((oCol, index) => {
@@ -866,12 +891,7 @@ export class OTableComponent extends AbstractOServiceComponent {
866
891
  console.warn('Unable to load the column ' + oCol.attr + ' from the localstorage');
867
892
  }
868
893
  });
869
- if (defaultConfiguration) {
870
- stateCols = this.state.initialConfiguration.columnsDisplay;
871
- }
872
- else {
873
- stateCols = this.checkChangesVisibleColummnsInInitialConfiguration(stateCols);
874
- }
894
+ stateCols = this.checkChangesVisibleColummnsInInitialConfiguration(stateCols);
875
895
  this._oTableOptions.columns.sort((a, b) => {
876
896
  const indexA = stateCols.findIndex(col => col.attr === a.attr);
877
897
  const indexB = stateCols.findIndex(col => col.attr === b.attr);
@@ -881,7 +901,6 @@ export class OTableComponent extends AbstractOServiceComponent {
881
901
  }
882
902
  else {
883
903
  this.visibleColArray = Util.parseArray(this.defaultVisibleColumns ? this.defaultVisibleColumns : this.visibleColumns, true);
884
- this._oTableOptions.columns.sort((a, b) => this.visibleColArray.indexOf(a.attr) - this.visibleColArray.indexOf(b.attr));
885
904
  }
886
905
  }
887
906
  checkChangesVisibleColummnsInInitialConfiguration(stateCols) {
@@ -954,13 +973,10 @@ export class OTableComponent extends AbstractOServiceComponent {
954
973
  }
955
974
  ensureColumnsOrder() {
956
975
  let columnsOrder = [];
957
- if (this.state.columnsDisplay) {
958
- columnsOrder = this.state.columnsDisplay.map(item => item.attr);
959
- }
960
- else {
961
- columnsOrder = this.colArray.filter(attr => this.visibleColArray.indexOf(attr) === -1);
962
- columnsOrder.push(...this.visibleColArray);
976
+ if (!this.state.columnsDisplay) {
977
+ return;
963
978
  }
979
+ columnsOrder = this.state.columnsDisplay.map(item => item.attr);
964
980
  this._oTableOptions.columns.sort((a, b) => {
965
981
  if (columnsOrder.indexOf(a.attr) === -1) {
966
982
  return 0;
@@ -974,6 +990,7 @@ export class OTableComponent extends AbstractOServiceComponent {
974
990
  if (!this.visibleColumns) {
975
991
  this.visibleColumns = this.columns;
976
992
  }
993
+ this.visibleColArray = Util.parseArray(this.visibleColumns, true);
977
994
  if (this.colArray.length) {
978
995
  this.colArray.forEach((x) => this.registerColumn(x));
979
996
  this.ensureColumnsOrder();
@@ -1055,6 +1072,9 @@ export class OTableComponent extends AbstractOServiceComponent {
1055
1072
  this.sort.setMultipleSort(this.multipleSort);
1056
1073
  }
1057
1074
  }
1075
+ get currentColumnFilters() {
1076
+ return this.dataSource?.getColumnValueFilters() || [];
1077
+ }
1058
1078
  handleSortChange(sortArray) {
1059
1079
  this.sortColArray = [];
1060
1080
  sortArray.forEach((sort) => {
@@ -1283,6 +1303,11 @@ export class OTableComponent extends AbstractOServiceComponent {
1283
1303
  ObservableWrapper.callEmit(this.onPaginatedDataLoaded, data);
1284
1304
  }
1285
1305
  ObservableWrapper.callEmit(this.onDataLoaded, this.daoTable.data);
1306
+ if (this.virtualScrollViewport && data.length > 0) {
1307
+ setTimeout(() => {
1308
+ this.initViewPort(data);
1309
+ }, 0);
1310
+ }
1286
1311
  }
1287
1312
  canSetStaticData(staticData) {
1288
1313
  return super.canSetStaticData(staticData) && Util.isDefined(this.daoTable);
@@ -1296,8 +1321,8 @@ export class OTableComponent extends AbstractOServiceComponent {
1296
1321
  }
1297
1322
  }
1298
1323
  projectContentChanged() {
1299
- this.initViewPort(this.dataSource.renderedData);
1300
- if (this.previousRendererData !== this.dataSource.renderedData) {
1324
+ const dataChanged = this.previousRendererData !== this.dataSource.renderedData;
1325
+ if (dataChanged) {
1301
1326
  this.previousRendererData = this.dataSource.renderedData;
1302
1327
  ObservableWrapper.callEmit(this.onContentChange, this.dataSource.renderedData);
1303
1328
  }
@@ -1627,7 +1652,6 @@ export class OTableComponent extends AbstractOServiceComponent {
1627
1652
  }
1628
1653
  this.stopEdition();
1629
1654
  if (saveChanges && column.editor.updateRecordOnEdit) {
1630
- this.saveScrollPosition();
1631
1655
  const toUpdate = {};
1632
1656
  toUpdate[column.attr] = data[column.attr];
1633
1657
  const kv = this.extractKeysFromRecord(data);
@@ -1635,11 +1659,10 @@ export class OTableComponent extends AbstractOServiceComponent {
1635
1659
  if (updateObservable) {
1636
1660
  updateObservable.subscribe({
1637
1661
  next: (response) => {
1638
- this.restoreScrollPosition();
1662
+ this.saveScrollPosition();
1639
1663
  },
1640
1664
  error: (error) => {
1641
1665
  console.error('Error updating cell:', error);
1642
- this.restoreScrollPosition();
1643
1666
  }
1644
1667
  });
1645
1668
  }
@@ -1980,9 +2003,6 @@ export class OTableComponent extends AbstractOServiceComponent {
1980
2003
  isSearcheableColumn(column) {
1981
2004
  return this.searcheableColumns.includes(column.attr);
1982
2005
  }
1983
- isColumnFilterActive(column) {
1984
- return this.isColumnFiltersActive && Util.isDefined(this.dataSource.getColumnValueFilterByAttr(column.attr));
1985
- }
1986
2006
  openColumnFilterDialog(column, event) {
1987
2007
  event.stopPropagation();
1988
2008
  event.preventDefault();
@@ -2317,8 +2337,10 @@ export class OTableComponent extends AbstractOServiceComponent {
2317
2337
  }
2318
2338
  }
2319
2339
  applyDefaultConfiguration() {
2320
- this.initializeParams();
2340
+ this.state.reset(this.pageable);
2321
2341
  this.parseVisibleColumns(true);
2342
+ this.initializeParams();
2343
+ this.addDefaultRowButtons();
2322
2344
  this.refreshColumnsWidthFromOriginalDefinition();
2323
2345
  this.reinitializateQuickFilterColumns();
2324
2346
  this.resetQueryRows();
@@ -2426,8 +2448,17 @@ export class OTableComponent extends AbstractOServiceComponent {
2426
2448
  colDef.groupable = false;
2427
2449
  colDef.title = undefined;
2428
2450
  colDef.width = '48px';
2451
+ this.visibleColArray.push(name);
2429
2452
  this.pushOColumnDefinition(colDef);
2430
- this._oTableOptions.visibleColumns.push(name);
2453
+ this.addNonHidableColumn(name);
2454
+ }
2455
+ addNonHidableColumn(columnAttr) {
2456
+ if (!this.nonHidableColumns) {
2457
+ this.nonHidableColumns = columnAttr;
2458
+ }
2459
+ else if (!this.nonHidableColumns.split(',').map(c => c.trim()).includes(columnAttr)) {
2460
+ this.nonHidableColumns += Codes.ARRAY_INPUT_SEPARATOR + columnAttr;
2461
+ }
2431
2462
  }
2432
2463
  get headerHeight() {
2433
2464
  let height = 0;
@@ -2910,21 +2941,8 @@ export class OTableComponent extends AbstractOServiceComponent {
2910
2941
  saveScrollPosition() {
2911
2942
  if (this.virtualScrollViewport) {
2912
2943
  this.savedScrollPosition = this.virtualScrollViewport.measureScrollOffset();
2944
+ this.scrollStrategy.setSavedScrollPosition(this.savedScrollPosition);
2913
2945
  }
2914
- else if (this.tableBodyEl?.nativeElement) {
2915
- this.savedScrollPosition = this.tableBodyEl.nativeElement.scrollTop;
2916
- }
2917
- }
2918
- restoreScrollPosition() {
2919
- setTimeout(() => {
2920
- if (this.virtualScrollViewport && this.savedScrollPosition > 0) {
2921
- this.virtualScrollViewport.scrollToOffset(this.savedScrollPosition);
2922
- }
2923
- else if (this.tableBodyEl?.nativeElement && this.savedScrollPosition > 0) {
2924
- this.tableBodyEl.nativeElement.scrollTop = this.savedScrollPosition;
2925
- }
2926
- this.savedScrollPosition = 0;
2927
- }, 0);
2928
2946
  }
2929
2947
  }
2930
2948
  OTableComponent.DEFAULT_BASE_SIZE_SPINNER = 100;
@@ -2942,7 +2960,7 @@ OTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", versio
2942
2960
  { provide: VIRTUAL_SCROLL_STRATEGY, useClass: OTableVirtualScrollStrategy },
2943
2961
  { provide: OTableBase, useExisting: forwardRef(() => OTableComponent) },
2944
2962
  OTableLoadingService
2945
- ], queries: [{ propertyName: "tableRowExpandable", first: true, predicate: OTableRowExpandableComponent, descendants: true }, { propertyName: "quickfilterContentChild", first: true, predicate: ["o-table-quickfilter"], descendants: true, static: true }, { propertyName: "tableColumnSelectAllContentChild", first: true, predicate: OTableColumnSelectAllDirective, descendants: true }, { propertyName: "contextMenuContentChild", first: true, predicate: OTableContextMenuComponent, descendants: true, static: true }, { propertyName: "tableOptions", predicate: OTableOptionComponent }, { propertyName: "tableButtons", predicate: OTableButtonComponent }, { propertyName: "exportOptsTemplate", predicate: OTableExportButtonComponent }], viewQueries: [{ propertyName: "oMatSort", first: true, predicate: OMatSort, descendants: true }, { propertyName: "cdkVirtualScrollViewport", first: true, predicate: ["virtualScrollViewPort"], descendants: true }, { propertyName: "spinnerContainer", first: true, predicate: ["spinnerContainer"], descendants: true, read: ElementRef }, { propertyName: "tableBodyEl", first: true, predicate: ["tableBody"], descendants: true }, { propertyName: "tableHeaderEl", first: true, predicate: ["tableHeader"], descendants: true, read: ElementRef }, { propertyName: "tableToolbarEl", first: true, predicate: ["tableToolbar"], descendants: true, read: ElementRef }, { propertyName: "matTable", first: true, predicate: MatTable, descendants: true }, { propertyName: "oTableMenu", first: true, predicate: ["tableMenu"], descendants: true }, { propertyName: "rows", predicate: MatRow, descendants: true }, { propertyName: "tooltip", predicate: MatTooltip, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"o-table-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" [style.display]=\"isVisible()? '' : 'none'\"\n [class.block-events]=\"loadingService.isProcessing$ | async\">\n <o-data-toolbar #tableToolbar *ngIf=\"hasControls()\" [title]=\"title\" [show-title]=\"showTitle\" class=\"o-table-toolbar\">\n <ng-container o-data-toolbar-projection-start>\n <o-table-buttons #tableButtons [insert-button]=\"insertButton\" [refresh-button]=\"refreshButton\" [delete-button]=\"showDeleteButton\">\n <ng-content select=\"o-table-button\"></ng-content>\n </o-table-buttons>\n </ng-container>\n <ng-content select=\"[o-table-toolbar][position=start]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar][position=end]\" ngProjectAs=\"[o-data-toolbar-custom-projection-end]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-container o-data-toolbar-projection-end>\n <ng-container *ngIf=\"quickfilterContentChild; else defaultQuickFilter\">\n <ng-content select=\"o-table-quickfilter\"></ng-content>\n </ng-container>\n <ng-template #defaultQuickFilter>\n <ng-container *ngIf=\"quickFilter\">\n <o-table-quickfilter (onChange)=\"tableQuickFilterChanged($event)\">\n </o-table-quickfilter>\n </ng-container>\n </ng-template>\n <button type=\"button\" *ngIf=\"showTableMenuButton\" mat-icon-button class=\"o-table-menu-button\" [matMenuTriggerFor]=\"tableMenu.matMenu\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"ontimize:more_vert\"></mat-icon>\n </button>\n <o-table-menu #tableMenu [select-all-checkbox]=\"selectAllCheckbox\" [export-button]=\"exportButton\"\n [columns-visibility-button]=\"columnsVisibilityButton\" [show-configuration-option]=\"showConfigurationOption\"\n [show-filter-option]=\"showFilterOption\" [show-report-on-demand-option]=\"showReportOnDemandOption\"\n [show-charts-on-demand-option]=\"showChartsOnDemandOption\" [show-reset-width-option]=\"showResetWidthOption\" [show-group-by-option]=\"groupable\">\n <ng-content select=\"o-table-option\"></ng-content>\n </o-table-menu>\n </ng-container>\n </o-data-toolbar>\n\n <div #tableBody class=\"o-table-body o-scroll\" [class.horizontal-scroll]=\"horizontalScroll\" [class.scrolled]=\"horizontalScrolled\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n <ng-container *ngIf=\"!enabledVirtualScroll; else tableWithVirtualScroll\">\n <div class=\"o-table-overflow o-scroll\">\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </div>\n </ng-container>\n <ng-template #tableWithVirtualScroll>\n <cdk-virtual-scroll-viewport #virtualScrollViewPort fxFlex>\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n </div>\n <!--TABLE PAGINATOR-->\n <mat-paginator *ngIf=\"paginator\" #matpaginator [length]=\"dataSource?.resultsLength\" [pageIndex]=\"paginator.pageIndex\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"paginator.pageSizeOptions\" (page)=\"onChangePage($event)\" [showFirstLastButtons]=\"paginator.showFirstLastButtons\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n </mat-paginator>\n\n <!--LOADING-->\n <div #spinnerContainer *ngIf=\"showLoading | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\" [ngStyle]=\"{'top.px': toolBarHeight}\"\n class=\"spinner-container\" [class.spinner-container-scrollable]=\"loadingScroll | async\">\n <o-table-skeleton></o-table-skeleton>\n </div>\n\n <!-- Disable blocker -->\n <div *ngIf=\"!enabled\" class=\"o-table-disabled-blocker\"></div>\n</div>\n\n<ng-template #table>\n <table mat-table #table [class.autoadjusted]=\"autoAdjust\" [trackBy]=\"getTrackByFunction()\" [dataSource]=\"dataSource\" oMatSort\n [oMatSortColumns]=\"sortColArray\" [ngClass]=\"rowHeightObservable | async\" (cdkObserveContent)=\"projectContentChanged()\"\n oTableExpandedFooter [oTableExpandedFooterColspan]=\"visibleColArray.length\"\n [multiTemplateDataRows]=\"showExpandableRow()\" aria-describedby=\"ontimize-web table\">\n\n <!--Checkbox Column -->\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <ng-container *ngIf=\"!tableColumnSelectAllContentChild; else customHeaderSelectAllTemplate\">\n <th mat-header-cell *matHeaderCellDef>\n <div class=\"content\" *ngIf=\"isSelectionModeMultiple()\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n <ng-template #customHeaderSelectAllTemplate>\n <th mat-header-cell *matHeaderCellDef [class.resizable]=\"resizable\" class=\"mat-header-select-all-with-title o-center\"\n [style.width]=\"oTableOptions.selectColumn.width\" [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\"\n [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <div class=\"content\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"o-center\" [style.width]=\"oTableOptions.selectColumn.width\"\n [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\" [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-template>\n\n\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!--Expandable Column -->\n <ng-container [matColumnDef]=\"oTableOptions.expandableColumn.name\" *ngIf=\"isColumnExpandable()\">\n <th mat-header-cell *matHeaderCellDef>\n {{ oTableOptions.expandableColumn.title }}\n </th>\n <td mat-cell *matCellDef=\"let row;let rowIndex = dataIndex\">\n <mat-icon *ngIf=\"showExpandableIcon(row, rowIndex) | async\" (click)=\"toggleRowExpandable(row, $event)\"\n (keydown)=\"toggleRowExpandable(row, $event)\">\n <ng-container *ngIf=\"isExpanded(row)\">{{ tableRowExpandable.iconCollapse }}</ng-container>\n <ng-container *ngIf=\"!isExpanded(row)\">{{ tableRowExpandable.iconExpand }}</ng-container>\n </mat-icon>\n </td>\n </ng-container>\n\n <!-- Generic column definition -->\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name\">\n <!--Define header-cell-->\n\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"getTitleAlignClass(column)\" [class.resizable]=\"resizable\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\">\n\n <div class=\"content\">\n <o-table-header [column]=\"column\"></o-table-header>\n </div>\n </th>\n\n\n <!--Define mat-cell-->\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else cellTemplateMultiTemplateDataRows\">\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = index \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n </td>\n </ng-container>\n <ng-template #cellTemplateMultiTemplateDataRows>\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = dataIndex \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n\n </td>\n </ng-template>\n <!--Define mat-footer-cell-->\n <ng-container *ngIf=\"showTotals | async\">\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"column.className\">\n <div class=\"title\" *ngIf=\"column.aggregate && column.aggregate.title\">\n {{ column.aggregate.title | oTranslate }}\n </div>\n <ng-container *ngIf=\"!column.renderer || column.aggregate?.operator === 'count'; else rendererTemplate\">\n {{ dataSource.getAggregateData(column) }}\n </ng-container>\n <ng-template #rendererTemplate>\n <ng-template *ngIf=\"column.renderer && column.aggregate\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{cellvalue: dataSource.getAggregateData(column)}\">\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"hasExpandedRow\">\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row;let rowIndex= dataIndex\" [attr.colspan]=\"oTableOptions.visibleColumns.length\">\n <div [ngClass]=\"getExpandedRowContainerClass(rowIndex)\" [@detailExpand]=\"getStateExpand(row)\">\n </div>\n </td>\n </ng-container>\n </ng-container>\n\n <!--FOOTER-INSERTABLE-->\n <ng-container *ngIf=\"showLastInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name + getSuffixColumnInsertable()\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-footer-cell *matFooterCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name+ getSuffixColumnInsertable()\">\n\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field o-table-cell-editor-text o-table-cell-editor\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <ng-container *ngIf=\"showFirstInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"getColumnInsertable(oTableOptions.selectColumn.name)\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-header-cell *matHeaderCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"getColumnInsertable(column.name)\">\n\n <td mat-header-cell *matHeaderCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Definition column group header -->\n <ng-container *ngFor=\"let column of groupingHeadersRows; let i = index\" [matColumnDef]=\"column\">\n <td mat-cell *matCellDef=\"let group\" class=\"grouping-row\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column, rowValue:group, rowIndex:i}\" [ngClass]=\"getGroupHeaderCellAlignClass(column)\">\n <div *ngIf=\"i===0\" class=\"grouping-title-wrapper\" [ngStyle]=\"{'padding-left': 20*(group.level-1)+'px'}\">\n <mat-icon>{{ group.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n {{ group.title }}\n </div>\n <div class=\"grouping-aggregate\" *ngIf=\"group.hasActiveAggregate(visibleColArray[i])\">\n {{ group.getColumnActiveAggregateTitle(visibleColArray[i]) | oTranslate }} :\n <ng-container *ngIf=\"!getOColumnFromGroupHeaderColumn(column).renderer\">\n {{ group.getColumnAggregateValue(visibleColArray[i])}}\n </ng-container>\n <ng-container *ngIf=\"getOColumnFromGroupHeaderColumn(column).renderer\">\n <ng-template\n *ngTemplateOutlet=\"getOColumnFromGroupHeaderColumn(column).renderer?.templateref; context:{ cellvalue: group.getColumnAggregateValue(visibleColArray[i]) }\">\n </ng-template>\n </ng-container>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"position\">\n <td mat-cell *matCellDef=\"let row\"> {{row}} </td>\n </ng-container>\n\n <tr #tableHeader mat-header-row *matHeaderRowDef=\"oTableOptions.visibleColumns; sticky: fixedHeader\"></tr>\n\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else rowTemplateMultiTemplateDataRows\">\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = index\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-container>\n <ng-template #rowTemplateMultiTemplateDataRows>\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = dataIndex\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-template>\n\n <!-- Row Group header -->\n <tr mat-row *matRowDef=\"let row; columns: groupingHeadersRows; when:isGroup\" (click)=\"groupHeaderClick(row)\"\n [ngClass]=\"getClassNameGroupHeader(row)\">\n </tr>\n\n <!-- Expanded detail row-->\n <ng-container *ngIf=\"hasExpandedRow\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"o-table-row-expanded\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"showLastInsertableRow\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"></tr>\n </ng-container>\n <ng-container *ngIf=\"showFirstInsertableRow\">\n <tr mat-header-row *matHeaderRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"> </tr>\n </ng-container>\n <ng-container *ngIf=\"showTotals | async\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.visibleColumns; sticky: true\" class=\"o-table-aggregate\">\n </tr>\n </ng-container>\n </table>\n\n</ng-template>\n\n<ng-container *ngIf=\"!contextMenuContentChild && contextMenu\">\n <o-table-context-menu [insert]=\"insertButton\" [edit]=\"editionMode !== EDIT_MODE_NONE\" [view-detail]=\"detailMode !== DETAIL_MODE_NONE\"\n [refresh]=\"refreshButton\" [delete]=\"deleteButton\" [filter]=\"showFilterOption\" [group-by-row]=\"groupable\">\n </o-table-context-menu>\n</ng-container>\n\n<ng-template #cellRenderer let-row=\"row\" let-column=\"column\">\n <div class=\"content\">\n\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"column.renderer != null && (!column.editing || column.editing && !isRowSelected(row))\">\n <ng-template *ngTemplateOutlet=\"column.renderer?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"isRowSelected(row) && column.editing\">\n <ng-template *ngTemplateOutlet=\"column.editor?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"column.type === 'editButtonInRow' || column.type === 'detailButtonInRow'\">\n <div fxLayoutAlign=\"center center\" class=\"o-action-cell-renderer\" (click)=\"onDetailButtonClick(column, row, $event)\">\n <mat-icon>{{ getDetailButtonIcon(column) }}</mat-icon>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>{{ row[column.name] }}</ng-container>\n </ng-container>\n\n </div>\n</ng-template>\n", styles: [".o-table{height:100%;max-height:100%;width:100%}.o-table.o-table-disabled{opacity:.4}.o-table .o-table-container{height:100%;display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-items:flex-start;align-content:stretch;min-width:100%;min-height:400px;position:relative;padding:0 .5%}.o-table .o-table-container .o-table-body{display:flex;flex:1 1 auto}.o-table .o-table-container .o-table-body .o-table-overflow{overflow-y:auto;overflow-x:hidden;min-width:100%}.o-table .o-table-container .o-table-body .cdk-virtual-scrollable{overflow:hidden}.o-table .o-table-container .o-table-body.horizontal-scroll .cdk-virtual-scrollable{overflow:visible;contain:none}.o-table .o-table-container .o-table-body.horizontal-scroll .o-table-overflow{overflow-x:auto}.o-table .o-table-container .o-table-body thead .mat-mdc-header-row th:last-child .o-table-column-resizer{display:none}.o-table .o-table-container.block-events{pointer-events:none}.o-table .o-table-container .o-table-toolbar{height:40px}.o-table .o-table-container .o-table-toolbar>div{max-height:100%}.o-table .o-table-container .o-table-toolbar .buttons{margin:0 10px 0 4px}.o-table .o-table-container .o-table-body{max-width:100%;height:100%;overflow:hidden;position:relative}.o-table .o-table-container .o-table-body .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .o-table-container .o-table-body.horizontal-scroll{overflow-x:auto;padding-bottom:16px}.o-table .o-table-container .o-table-body.horizontal-scroll .mat-mdc-header-cell{width:150px}.o-table .o-table-container .o-table-body .o-table-no-results{cursor:default;text-align:center}.o-table .o-table-container .o-table-body .o-table-no-results td{text-align:center}.o-table .o-table-container .mat-mdc-table{table-layout:fixed;width:100%}.o-table .o-table-container .mat-mdc-table.autoadjusted{table-layout:auto}.o-table .o-table-container .mat-mdc-table td .content,.o-table .o-table-container .mat-mdc-table th .content{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-header-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:24px;height:24px}.o-table .o-table-container .mat-mdc-table.large .column-filter-icon{margin-top:4px}.o-table .o-table-container .mat-mdc-table.large .mat-sort-header-arrow{margin-top:7px}.o-table .o-table-container .mat-mdc-table tr.mat-mdc-row.o-table-row-expanded{height:0}.o-table .o-table-container .mat-mdc-table tr.o-table-insertable td{height:1px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell{padding:0 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row{box-sizing:border-box;transition:background-color .2s;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell{padding:0 12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row{padding-top:30px;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-title-wrapper,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-title-wrapper{position:absolute;width:100%;left:0;top:0;text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-aggregate,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-aggregate{font-weight:700;font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-bottom:8px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.empty-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.empty-cell{min-height:16px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .action-cell-renderer,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .action-cell-renderer{cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-start,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-center,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-end,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell *,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell *{vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell),.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell){padding:6px 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline .content,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline .content{overflow:initial;white-space:normal;text-overflow:unset}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:32px;height:32px;margin:1px auto;overflow:hidden;border-radius:50%;position:relative;z-index:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar img,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;max-width:inherit;max-height:inherit}.o-table .o-table-container .mat-mdc-table .o-action-cell-renderer{display:inline-block;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell{overflow:hidden;position:relative;box-sizing:border-box;padding:0 12px;vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select.mat-header-select-all-with-title{padding-right:12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:first-of-type{padding-left:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:not(.o-column-image){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:has(.o-table-column-resizer){padding-right:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .o-table-header-indicator-numbered{font-size:8px;position:absolute;text-align:center;display:inline-block;width:18px;height:18px;line-height:18px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;bottom:-10px;right:-9px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .column-filter-icon{cursor:pointer;font-size:18px;width:18px;height:18px;line-height:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{flex:1;display:block;place-content:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container{cursor:default;min-height:20px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start .mat-sort-header-button{text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center .mat-sort-header-button{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end .mat-sort-header-button{text-align:right}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select{box-sizing:content-box;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select:not(.mat-header-select-all-with-title),.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select:not(.mat-header-select-all-with-title){width:30px}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select .mat-checkbox-layout,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select .mat-checkbox-layout{text-overflow:ellipsis;overflow:hidden;display:inline}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-expandable,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-expandable{width:40px;box-sizing:content-box;padding:0 0 0 24px;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell .row-container-expanded{overflow:hidden;display:flex}.o-table .o-table-container .o-table-disabled-blocker{bottom:0;left:0;position:absolute;right:0;top:0;z-index:100}.o-table .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .spinner-container-scrollable{position:relative}.o-table.o-table-fixed{display:flex}.o-table.o-table-fixed .o-table-container{display:flex;flex-direction:column}.o-table.o-table-fixed .o-table-body{display:flex;flex:1}.o-table.o-table-fixed .o-table-body .o-table-overflow{flex:1;overflow-y:auto}.mat-mdc-tooltip.o-table-cell-tooltip{word-wrap:break-word;overflow:hidden;min-width:140px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i4.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.OMatErrorDirective, selector: "[oMatError]", inputs: ["oMatError"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i14.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i14.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i14.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i14.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i14.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i14.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i14.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i14.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i14.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i14.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i14.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i14.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i14.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i14.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "component", type: i15.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i16.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i17.OContextMenuDirective, selector: "[oContextMenu]", inputs: ["oContextMenu", "oContextMenuData"] }, { kind: "directive", type: i18.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }, { kind: "directive", type: i19.OMatSort, selector: "[oMatSort]", inputs: ["oMatSortDisabled", "oMatSortColumns"], outputs: ["matSortChange"], exportAs: ["oMatSort"] }, { kind: "component", type: i20.ODataToolbarComponent, selector: "o-data-toolbar", inputs: ["show-title", "title"] }, { kind: "component", type: i21.OTableContextMenuComponent, selector: "o-table-context-menu", inputs: ["context-menu", "insert", "edit", "view-detail", "copy", "select-all", "refresh", "delete", "filter", "group-by-row"] }, { kind: "directive", type: i22.OTableRowDirective, selector: "[oTableRow]" }, { kind: "directive", type: i23.OTableExpandedFooterDirective, selector: "[oTableExpandedFooter]", inputs: ["oTableExpandedFooterColspan"] }, { kind: "component", type: i24.OTableButtonsComponent, selector: "o-table-buttons", inputs: ["insert-button", "refresh-button", "delete-button"] }, { kind: "component", type: i25.OTableMenuComponent, selector: "o-table-menu", inputs: ["select-all-checkbox", "export-button", "columns-visibility-button", "show-configuration-option", "show-filter-option", "show-group-by-option", "show-reset-width-option", "show-report-on-demand-option", "show-charts-on-demand-option"] }, { kind: "component", type: i26.OTableQuickfilterComponent, selector: "o-table-quickfilter", inputs: ["placeholder"], outputs: ["onChange"] }, { kind: "component", type: i27.OTableHeaderComponent, selector: "o-table-header", inputs: ["column"] }, { kind: "component", type: i28.OTableHeaderSelectAllComponent, selector: "o-table-header-select-all", inputs: ["column"] }, { kind: "component", type: i29.OTableSkeletonComponent, selector: "o-table-skeleton" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i30.OTranslatePipe, name: "oTranslate" }, { kind: "pipe", type: i31.OTableRowClassPipe, name: "oTableRowClass" }], animations: [
2963
+ ], queries: [{ propertyName: "tableRowExpandable", first: true, predicate: OTableRowExpandableComponent, descendants: true }, { propertyName: "quickfilterContentChild", first: true, predicate: ["o-table-quickfilter"], descendants: true, static: true }, { propertyName: "tableColumnSelectAllContentChild", first: true, predicate: OTableColumnSelectAllDirective, descendants: true }, { propertyName: "contextMenuContentChild", first: true, predicate: OTableContextMenuComponent, descendants: true, static: true }, { propertyName: "tableOptions", predicate: OTableOptionComponent }, { propertyName: "tableButtons", predicate: OTableButtonComponent }, { propertyName: "exportOptsTemplate", predicate: OTableExportButtonComponent }], viewQueries: [{ propertyName: "oMatSort", first: true, predicate: OMatSort, descendants: true }, { propertyName: "cdkVirtualScrollViewport", first: true, predicate: ["virtualScrollViewPort"], descendants: true }, { propertyName: "spinnerContainer", first: true, predicate: ["spinnerContainer"], descendants: true, read: ElementRef }, { propertyName: "tableBodyEl", first: true, predicate: ["tableBody"], descendants: true }, { propertyName: "tableHeaderEl", first: true, predicate: ["tableHeader"], descendants: true, read: ElementRef }, { propertyName: "tableToolbarEl", first: true, predicate: ["tableToolbar"], descendants: true, read: ElementRef }, { propertyName: "matTable", first: true, predicate: MatTable, descendants: true }, { propertyName: "oTableMenu", first: true, predicate: ["tableMenu"], descendants: true }, { propertyName: "rows", predicate: MatRow, descendants: true }, { propertyName: "tooltip", predicate: MatTooltip, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"o-table-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" [style.display]=\"isVisible()? '' : 'none'\"\n [class.block-events]=\"loadingService.isProcessing$ | async\">\n <o-data-toolbar #tableToolbar *ngIf=\"hasControls()\" [title]=\"title\" [show-title]=\"showTitle\" class=\"o-table-toolbar\">\n <ng-container o-data-toolbar-projection-start>\n <o-table-buttons #tableButtons [insert-button]=\"insertButton\" [refresh-button]=\"refreshButton\" [delete-button]=\"showDeleteButton\">\n <ng-content select=\"o-table-button\"></ng-content>\n </o-table-buttons>\n </ng-container>\n <ng-content select=\"[o-table-toolbar][position=start]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar][position=end]\" ngProjectAs=\"[o-data-toolbar-custom-projection-end]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-container o-data-toolbar-projection-end>\n <ng-container *ngIf=\"quickfilterContentChild; else defaultQuickFilter\">\n <ng-content select=\"o-table-quickfilter\"></ng-content>\n </ng-container>\n <ng-template #defaultQuickFilter>\n <ng-container *ngIf=\"quickFilter\">\n <o-table-quickfilter [placeholder]=\"quickFilterPlaceholder\" (onChange)=\"tableQuickFilterChanged($event)\">\n </o-table-quickfilter>\n </ng-container>\n </ng-template>\n <button type=\"button\" *ngIf=\"showTableMenuButton\" mat-icon-button class=\"o-table-menu-button\" [matMenuTriggerFor]=\"tableMenu.matMenu\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"ontimize:more_vert\"></mat-icon>\n </button>\n <o-table-menu #tableMenu [select-all-checkbox]=\"selectAllCheckbox\" [export-button]=\"exportButton\"\n [columns-visibility-button]=\"columnsVisibilityButton\" [show-configuration-option]=\"showConfigurationOption\"\n [show-filter-option]=\"showFilterOption\" [show-report-on-demand-option]=\"showReportOnDemandOption\"\n [show-charts-on-demand-option]=\"showChartsOnDemandOption\" [show-reset-width-option]=\"showResetWidthOption\" [show-group-by-option]=\"groupable\">\n <ng-content select=\"o-table-option\"></ng-content>\n </o-table-menu>\n </ng-container>\n </o-data-toolbar>\n\n <div #tableBody class=\"o-table-body o-scroll\" [class.horizontal-scroll]=\"horizontalScroll\" [class.scrolled]=\"horizontalScrolled\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n <ng-container *ngIf=\"!enabledVirtualScroll; else tableWithVirtualScroll\">\n <div class=\"o-table-overflow o-scroll\">\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </div>\n </ng-container>\n <ng-template #tableWithVirtualScroll>\n <cdk-virtual-scroll-viewport #virtualScrollViewPort fxFlex>\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n </div>\n <!--TABLE PAGINATOR-->\n <mat-paginator *ngIf=\"paginator\" #matpaginator [length]=\"dataSource?.resultsLength\" [pageIndex]=\"paginator.pageIndex\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"paginator.pageSizeOptions\" (page)=\"onChangePage($event)\" [showFirstLastButtons]=\"paginator.showFirstLastButtons\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n </mat-paginator>\n\n <!--LOADING-->\n <div #spinnerContainer *ngIf=\"showLoading | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\" [ngStyle]=\"{'top.px': toolBarHeight}\"\n class=\"spinner-container\" [class.spinner-container-scrollable]=\"loadingScroll | async\">\n <o-table-skeleton></o-table-skeleton>\n </div>\n\n <!-- Disable blocker -->\n <div *ngIf=\"!enabled\" class=\"o-table-disabled-blocker\"></div>\n</div>\n\n<ng-template #table>\n <table mat-table #table [class.autoadjusted]=\"autoAdjust\" [trackBy]=\"getTrackByFunction()\" [dataSource]=\"dataSource\" oMatSort\n [oMatSortColumns]=\"sortColArray\" [ngClass]=\"rowHeightObservable | async\" (cdkObserveContent)=\"projectContentChanged()\"\n oTableExpandedFooter [oTableExpandedFooterColspan]=\"visibleColArray.length\"\n [multiTemplateDataRows]=\"showExpandableRow()\" aria-describedby=\"ontimize-web table\">\n\n <!--Checkbox Column -->\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <ng-container *ngIf=\"!tableColumnSelectAllContentChild; else customHeaderSelectAllTemplate\">\n <th mat-header-cell *matHeaderCellDef>\n <div class=\"content\" *ngIf=\"isSelectionModeMultiple()\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n <ng-template #customHeaderSelectAllTemplate>\n <th mat-header-cell *matHeaderCellDef [class.resizable]=\"resizable\" class=\"mat-header-select-all-with-title o-center\"\n [style.width]=\"oTableOptions.selectColumn.width\" [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\"\n [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <div class=\"content\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"o-center\" [style.width]=\"oTableOptions.selectColumn.width\"\n [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\" [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-template>\n\n\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!--Expandable Column -->\n <ng-container [matColumnDef]=\"oTableOptions.expandableColumn.name\" *ngIf=\"isColumnExpandable()\">\n <th mat-header-cell *matHeaderCellDef>\n {{ oTableOptions.expandableColumn.title }}\n </th>\n <td mat-cell *matCellDef=\"let row;let rowIndex = dataIndex\">\n <mat-icon *ngIf=\"showExpandableIcon(row, rowIndex) | async\" (click)=\"toggleRowExpandable(row, $event)\"\n (keydown)=\"toggleRowExpandable(row, $event)\">\n <ng-container *ngIf=\"isExpanded(row)\">{{ tableRowExpandable.iconCollapse }}</ng-container>\n <ng-container *ngIf=\"!isExpanded(row)\">{{ tableRowExpandable.iconExpand }}</ng-container>\n </mat-icon>\n </td>\n </ng-container>\n\n <!-- Generic column definition -->\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name\">\n <!--Define header-cell-->\n\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"getTitleAlignClass(column)\" [class.resizable]=\"resizable\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\">\n\n <div class=\"content\">\n <o-table-header [column]=\"column\" [column-filters]=\"columnFilters$ | async\" ></o-table-header>\n </div>\n </th>\n\n\n <!--Define mat-cell-->\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else cellTemplateMultiTemplateDataRows\">\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = index \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n </td>\n </ng-container>\n <ng-template #cellTemplateMultiTemplateDataRows>\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = dataIndex \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n\n </td>\n </ng-template>\n <!--Define mat-footer-cell-->\n <ng-container *ngIf=\"showTotals | async\">\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"column.className\">\n <div class=\"title\" *ngIf=\"column.aggregate && column.aggregate.title\">\n {{ column.aggregate.title | oTranslate }}\n </div>\n <ng-container *ngIf=\"!column.renderer || column.aggregate?.operator === 'count'; else rendererTemplate\">\n {{ dataSource.getAggregateData(column) }}\n </ng-container>\n <ng-template #rendererTemplate>\n <ng-template *ngIf=\"column.renderer && column.aggregate\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{cellvalue: dataSource.getAggregateData(column)}\">\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"hasExpandedRow\">\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row;let rowIndex= dataIndex\" [attr.colspan]=\"oTableOptions.visibleColumns.length\">\n <div [ngClass]=\"getExpandedRowContainerClass(rowIndex)\" [@detailExpand]=\"getStateExpand(row)\">\n </div>\n </td>\n </ng-container>\n </ng-container>\n\n <!--FOOTER-INSERTABLE-->\n <ng-container *ngIf=\"showLastInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name + getSuffixColumnInsertable()\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-footer-cell *matFooterCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name+ getSuffixColumnInsertable()\">\n\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field o-table-cell-editor-text o-table-cell-editor\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <ng-container *ngIf=\"showFirstInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"getColumnInsertable(oTableOptions.selectColumn.name)\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-header-cell *matHeaderCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"getColumnInsertable(column.name)\">\n\n <td mat-header-cell *matHeaderCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Definition column group header -->\n <ng-container *ngFor=\"let column of groupingHeadersRows; let i = index\" [matColumnDef]=\"column\">\n <td mat-cell *matCellDef=\"let group\" class=\"grouping-row\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column, rowValue:group, rowIndex:i}\" [ngClass]=\"getGroupHeaderCellAlignClass(column)\">\n <div *ngIf=\"i===0\" class=\"grouping-title-wrapper\" [ngStyle]=\"{'padding-left': 20*(group.level-1)+'px'}\">\n <mat-icon>{{ group.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n {{ group.title }}\n </div>\n <div class=\"grouping-aggregate\" *ngIf=\"group.hasActiveAggregate(visibleColArray[i])\">\n {{ group.getColumnActiveAggregateTitle(visibleColArray[i]) | oTranslate }} :\n <ng-container *ngIf=\"!getOColumnFromGroupHeaderColumn(column).renderer\">\n {{ group.getColumnAggregateValue(visibleColArray[i])}}\n </ng-container>\n <ng-container *ngIf=\"getOColumnFromGroupHeaderColumn(column).renderer\">\n <ng-template\n *ngTemplateOutlet=\"getOColumnFromGroupHeaderColumn(column).renderer?.templateref; context:{ cellvalue: group.getColumnAggregateValue(visibleColArray[i]) }\">\n </ng-template>\n </ng-container>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"position\">\n <td mat-cell *matCellDef=\"let row\"> {{row}} </td>\n </ng-container>\n\n <tr #tableHeader mat-header-row *matHeaderRowDef=\"oTableOptions.visibleColumns; sticky: fixedHeader\"></tr>\n\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else rowTemplateMultiTemplateDataRows\">\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = index\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-container>\n <ng-template #rowTemplateMultiTemplateDataRows>\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = dataIndex\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-template>\n\n <!-- Row Group header -->\n <tr mat-row *matRowDef=\"let row; columns: groupingHeadersRows; when:isGroup\" (click)=\"groupHeaderClick(row)\"\n [ngClass]=\"getClassNameGroupHeader(row)\">\n </tr>\n\n <!-- Expanded detail row-->\n <ng-container *ngIf=\"hasExpandedRow\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"o-table-row-expanded\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"showLastInsertableRow\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"></tr>\n </ng-container>\n <ng-container *ngIf=\"showFirstInsertableRow\">\n <tr mat-header-row *matHeaderRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"> </tr>\n </ng-container>\n <ng-container *ngIf=\"showTotals | async\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.visibleColumns; sticky: true\" class=\"o-table-aggregate\">\n </tr>\n </ng-container>\n </table>\n\n</ng-template>\n\n<ng-container *ngIf=\"!contextMenuContentChild && contextMenu\">\n <o-table-context-menu [insert]=\"insertButton\" [edit]=\"editionMode !== EDIT_MODE_NONE\" [view-detail]=\"detailMode !== DETAIL_MODE_NONE\"\n [refresh]=\"refreshButton\" [delete]=\"deleteButton\" [filter]=\"showFilterOption\" [group-by-row]=\"groupable\">\n </o-table-context-menu>\n</ng-container>\n\n<ng-template #cellRenderer let-row=\"row\" let-column=\"column\">\n <div class=\"content\">\n\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"column.renderer != null && (!column.editing || column.editing && !isRowSelected(row))\">\n <ng-template *ngTemplateOutlet=\"column.renderer?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"isRowSelected(row) && column.editing\">\n <ng-template *ngTemplateOutlet=\"column.editor?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"column.type === 'editButtonInRow' || column.type === 'detailButtonInRow'\">\n <div fxLayoutAlign=\"center center\" class=\"o-action-cell-renderer\" (click)=\"onDetailButtonClick(column, row, $event)\">\n <mat-icon>{{ getDetailButtonIcon(column) }}</mat-icon>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>{{ row[column.name] }}</ng-container>\n </ng-container>\n\n </div>\n</ng-template>\n", styles: [".o-table{height:100%;max-height:100%;width:100%}.o-table.o-table-disabled{opacity:.4}.o-table .o-table-container{height:100%;display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-items:flex-start;align-content:stretch;min-width:100%;min-height:400px;position:relative;padding:0 .5%}.o-table .o-table-container .o-table-body{display:flex;flex:1 1 auto}.o-table .o-table-container .o-table-body .o-table-overflow{overflow-y:auto;overflow-x:hidden;min-width:100%}.o-table .o-table-container .o-table-body .cdk-virtual-scrollable{overflow-x:hidden}.o-table .o-table-container .o-table-body.horizontal-scroll .cdk-virtual-scrollable{overflow-x:visible;contain:none}.o-table .o-table-container .o-table-body.horizontal-scroll .o-table-overflow{overflow-x:auto}.o-table .o-table-container .o-table-body thead .mat-mdc-header-row th:last-child .o-table-column-resizer{display:none}.o-table .o-table-container.block-events{pointer-events:none}.o-table .o-table-container .o-table-toolbar{height:40px}.o-table .o-table-container .o-table-toolbar>div{max-height:100%}.o-table .o-table-container .o-table-toolbar .buttons{margin:0 10px 0 4px}.o-table .o-table-container .o-table-body{max-width:100%;height:100%;overflow:hidden;position:relative}.o-table .o-table-container .o-table-body .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .o-table-container .o-table-body.horizontal-scroll{overflow-x:auto;padding-bottom:16px}.o-table .o-table-container .o-table-body.horizontal-scroll .mat-mdc-header-cell{width:150px}.o-table .o-table-container .o-table-body .o-table-no-results{cursor:default;text-align:center}.o-table .o-table-container .o-table-body .o-table-no-results td{text-align:center}.o-table .o-table-container .mat-mdc-table{table-layout:fixed;width:100%}.o-table .o-table-container .mat-mdc-table.autoadjusted{table-layout:auto}.o-table .o-table-container .mat-mdc-table td .content,.o-table .o-table-container .mat-mdc-table th .content{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-header-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:24px;height:24px}.o-table .o-table-container .mat-mdc-table.large .column-filter-icon{margin-top:4px}.o-table .o-table-container .mat-mdc-table.large .mat-sort-header-arrow{margin-top:7px}.o-table .o-table-container .mat-mdc-table tr.mat-mdc-row.o-table-row-expanded{height:0}.o-table .o-table-container .mat-mdc-table tr.o-table-insertable td{height:1px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell{padding:0 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row{box-sizing:border-box;transition:background-color .2s;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell{padding:0 12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row{padding-top:30px;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-title-wrapper,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-title-wrapper{position:absolute;width:100%;left:0;top:0;text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-aggregate,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-aggregate{font-weight:700;font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-bottom:8px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.empty-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.empty-cell{min-height:16px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .action-cell-renderer,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .action-cell-renderer{cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-start,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-center,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-end,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell *,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell *{vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell),.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell){padding:6px 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline .content,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline .content{overflow:initial;white-space:normal;text-overflow:unset}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:32px;height:32px;margin:1px auto;overflow:hidden;border-radius:50%;position:relative;z-index:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar img,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;max-width:inherit;max-height:inherit}.o-table .o-table-container .mat-mdc-table .o-action-cell-renderer{display:inline-block;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell{overflow:hidden;position:relative;box-sizing:border-box;padding:0 12px;vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select.mat-header-select-all-with-title{padding-right:12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:first-of-type{padding-left:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:not(.o-column-image){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:has(.o-table-column-resizer){padding-right:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .o-table-header-indicator-numbered{font-size:8px;position:absolute;text-align:center;display:inline-block;width:18px;height:18px;line-height:18px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;bottom:-10px;right:-9px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .column-filter-icon{cursor:pointer;font-size:18px;width:18px;height:18px;line-height:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{flex:1;display:block;place-content:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container{cursor:default;min-height:20px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start .mat-sort-header-button{text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center .mat-sort-header-button{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end .mat-sort-header-button{text-align:right}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select{box-sizing:content-box;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select:not(.mat-header-select-all-with-title),.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select:not(.mat-header-select-all-with-title){width:30px}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select .mat-checkbox-layout,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select .mat-checkbox-layout{text-overflow:ellipsis;overflow:hidden;display:inline}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-expandable,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-expandable{width:40px;box-sizing:content-box;padding:0 0 0 24px;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell .row-container-expanded{overflow:hidden;display:flex}.o-table .o-table-container .o-table-disabled-blocker{bottom:0;left:0;position:absolute;right:0;top:0;z-index:100}.o-table .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .spinner-container-scrollable{position:relative}.o-table.o-table-fixed{display:flex}.o-table.o-table-fixed .o-table-container{display:flex;flex-direction:column}.o-table.o-table-fixed .o-table-body{display:flex;flex:1}.o-table.o-table-fixed .o-table-body .o-table-overflow{flex:1;overflow-y:auto}.mat-mdc-tooltip.o-table-cell-tooltip{word-wrap:break-word;overflow:hidden;min-width:140px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i4.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.OMatErrorDirective, selector: "[oMatError]", inputs: ["oMatError"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i14.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i14.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i14.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i14.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i14.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i14.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i14.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i14.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i14.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i14.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i14.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i14.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i14.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i14.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "component", type: i15.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i16.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i17.OContextMenuDirective, selector: "[oContextMenu]", inputs: ["oContextMenu", "oContextMenuData"] }, { kind: "directive", type: i18.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }, { kind: "directive", type: i19.OMatSort, selector: "[oMatSort]", inputs: ["oMatSortDisabled", "oMatSortColumns"], outputs: ["matSortChange"], exportAs: ["oMatSort"] }, { kind: "component", type: i20.ODataToolbarComponent, selector: "o-data-toolbar", inputs: ["show-title", "title"] }, { kind: "component", type: i21.OTableContextMenuComponent, selector: "o-table-context-menu", inputs: ["context-menu", "insert", "edit", "view-detail", "copy", "select-all", "refresh", "delete", "filter", "group-by-row"] }, { kind: "directive", type: i22.OTableRowDirective, selector: "[oTableRow]" }, { kind: "directive", type: i23.OTableExpandedFooterDirective, selector: "[oTableExpandedFooter]", inputs: ["oTableExpandedFooterColspan"] }, { kind: "component", type: i24.OTableButtonsComponent, selector: "o-table-buttons", inputs: ["insert-button", "refresh-button", "delete-button"] }, { kind: "component", type: i25.OTableMenuComponent, selector: "o-table-menu", inputs: ["select-all-checkbox", "export-button", "columns-visibility-button", "show-configuration-option", "show-filter-option", "show-group-by-option", "show-reset-width-option", "show-report-on-demand-option", "show-charts-on-demand-option"] }, { kind: "component", type: i26.OTableQuickfilterComponent, selector: "o-table-quickfilter", inputs: ["placeholder"], outputs: ["onChange"] }, { kind: "component", type: i27.OTableHeaderComponent, selector: "o-table-header", inputs: ["column", "column-filters"] }, { kind: "component", type: i28.OTableHeaderSelectAllComponent, selector: "o-table-header-select-all", inputs: ["column", "column-filters"] }, { kind: "component", type: i29.OTableSkeletonComponent, selector: "o-table-skeleton" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i30.OTranslatePipe, name: "oTranslate" }, { kind: "pipe", type: i31.OTableRowClassPipe, name: "oTableRowClass" }], animations: [
2946
2964
  trigger('detailExpand', [
2947
2965
  state('collapsed', style({ height: '0px', minHeight: '0' })),
2948
2966
  state('expanded', style({ height: '*' })),
@@ -3097,7 +3115,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3097
3115
  '[class.o-table-fixed]': 'fixedHeader',
3098
3116
  '[class.o-table-disabled]': '!enabled',
3099
3117
  '(document:click)': 'handleDOMClick($event)'
3100
- }, template: "<div class=\"o-table-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" [style.display]=\"isVisible()? '' : 'none'\"\n [class.block-events]=\"loadingService.isProcessing$ | async\">\n <o-data-toolbar #tableToolbar *ngIf=\"hasControls()\" [title]=\"title\" [show-title]=\"showTitle\" class=\"o-table-toolbar\">\n <ng-container o-data-toolbar-projection-start>\n <o-table-buttons #tableButtons [insert-button]=\"insertButton\" [refresh-button]=\"refreshButton\" [delete-button]=\"showDeleteButton\">\n <ng-content select=\"o-table-button\"></ng-content>\n </o-table-buttons>\n </ng-container>\n <ng-content select=\"[o-table-toolbar][position=start]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar][position=end]\" ngProjectAs=\"[o-data-toolbar-custom-projection-end]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-container o-data-toolbar-projection-end>\n <ng-container *ngIf=\"quickfilterContentChild; else defaultQuickFilter\">\n <ng-content select=\"o-table-quickfilter\"></ng-content>\n </ng-container>\n <ng-template #defaultQuickFilter>\n <ng-container *ngIf=\"quickFilter\">\n <o-table-quickfilter (onChange)=\"tableQuickFilterChanged($event)\">\n </o-table-quickfilter>\n </ng-container>\n </ng-template>\n <button type=\"button\" *ngIf=\"showTableMenuButton\" mat-icon-button class=\"o-table-menu-button\" [matMenuTriggerFor]=\"tableMenu.matMenu\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"ontimize:more_vert\"></mat-icon>\n </button>\n <o-table-menu #tableMenu [select-all-checkbox]=\"selectAllCheckbox\" [export-button]=\"exportButton\"\n [columns-visibility-button]=\"columnsVisibilityButton\" [show-configuration-option]=\"showConfigurationOption\"\n [show-filter-option]=\"showFilterOption\" [show-report-on-demand-option]=\"showReportOnDemandOption\"\n [show-charts-on-demand-option]=\"showChartsOnDemandOption\" [show-reset-width-option]=\"showResetWidthOption\" [show-group-by-option]=\"groupable\">\n <ng-content select=\"o-table-option\"></ng-content>\n </o-table-menu>\n </ng-container>\n </o-data-toolbar>\n\n <div #tableBody class=\"o-table-body o-scroll\" [class.horizontal-scroll]=\"horizontalScroll\" [class.scrolled]=\"horizontalScrolled\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n <ng-container *ngIf=\"!enabledVirtualScroll; else tableWithVirtualScroll\">\n <div class=\"o-table-overflow o-scroll\">\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </div>\n </ng-container>\n <ng-template #tableWithVirtualScroll>\n <cdk-virtual-scroll-viewport #virtualScrollViewPort fxFlex>\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n </div>\n <!--TABLE PAGINATOR-->\n <mat-paginator *ngIf=\"paginator\" #matpaginator [length]=\"dataSource?.resultsLength\" [pageIndex]=\"paginator.pageIndex\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"paginator.pageSizeOptions\" (page)=\"onChangePage($event)\" [showFirstLastButtons]=\"paginator.showFirstLastButtons\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n </mat-paginator>\n\n <!--LOADING-->\n <div #spinnerContainer *ngIf=\"showLoading | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\" [ngStyle]=\"{'top.px': toolBarHeight}\"\n class=\"spinner-container\" [class.spinner-container-scrollable]=\"loadingScroll | async\">\n <o-table-skeleton></o-table-skeleton>\n </div>\n\n <!-- Disable blocker -->\n <div *ngIf=\"!enabled\" class=\"o-table-disabled-blocker\"></div>\n</div>\n\n<ng-template #table>\n <table mat-table #table [class.autoadjusted]=\"autoAdjust\" [trackBy]=\"getTrackByFunction()\" [dataSource]=\"dataSource\" oMatSort\n [oMatSortColumns]=\"sortColArray\" [ngClass]=\"rowHeightObservable | async\" (cdkObserveContent)=\"projectContentChanged()\"\n oTableExpandedFooter [oTableExpandedFooterColspan]=\"visibleColArray.length\"\n [multiTemplateDataRows]=\"showExpandableRow()\" aria-describedby=\"ontimize-web table\">\n\n <!--Checkbox Column -->\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <ng-container *ngIf=\"!tableColumnSelectAllContentChild; else customHeaderSelectAllTemplate\">\n <th mat-header-cell *matHeaderCellDef>\n <div class=\"content\" *ngIf=\"isSelectionModeMultiple()\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n <ng-template #customHeaderSelectAllTemplate>\n <th mat-header-cell *matHeaderCellDef [class.resizable]=\"resizable\" class=\"mat-header-select-all-with-title o-center\"\n [style.width]=\"oTableOptions.selectColumn.width\" [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\"\n [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <div class=\"content\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"o-center\" [style.width]=\"oTableOptions.selectColumn.width\"\n [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\" [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-template>\n\n\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!--Expandable Column -->\n <ng-container [matColumnDef]=\"oTableOptions.expandableColumn.name\" *ngIf=\"isColumnExpandable()\">\n <th mat-header-cell *matHeaderCellDef>\n {{ oTableOptions.expandableColumn.title }}\n </th>\n <td mat-cell *matCellDef=\"let row;let rowIndex = dataIndex\">\n <mat-icon *ngIf=\"showExpandableIcon(row, rowIndex) | async\" (click)=\"toggleRowExpandable(row, $event)\"\n (keydown)=\"toggleRowExpandable(row, $event)\">\n <ng-container *ngIf=\"isExpanded(row)\">{{ tableRowExpandable.iconCollapse }}</ng-container>\n <ng-container *ngIf=\"!isExpanded(row)\">{{ tableRowExpandable.iconExpand }}</ng-container>\n </mat-icon>\n </td>\n </ng-container>\n\n <!-- Generic column definition -->\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name\">\n <!--Define header-cell-->\n\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"getTitleAlignClass(column)\" [class.resizable]=\"resizable\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\">\n\n <div class=\"content\">\n <o-table-header [column]=\"column\"></o-table-header>\n </div>\n </th>\n\n\n <!--Define mat-cell-->\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else cellTemplateMultiTemplateDataRows\">\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = index \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n </td>\n </ng-container>\n <ng-template #cellTemplateMultiTemplateDataRows>\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = dataIndex \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n\n </td>\n </ng-template>\n <!--Define mat-footer-cell-->\n <ng-container *ngIf=\"showTotals | async\">\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"column.className\">\n <div class=\"title\" *ngIf=\"column.aggregate && column.aggregate.title\">\n {{ column.aggregate.title | oTranslate }}\n </div>\n <ng-container *ngIf=\"!column.renderer || column.aggregate?.operator === 'count'; else rendererTemplate\">\n {{ dataSource.getAggregateData(column) }}\n </ng-container>\n <ng-template #rendererTemplate>\n <ng-template *ngIf=\"column.renderer && column.aggregate\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{cellvalue: dataSource.getAggregateData(column)}\">\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"hasExpandedRow\">\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row;let rowIndex= dataIndex\" [attr.colspan]=\"oTableOptions.visibleColumns.length\">\n <div [ngClass]=\"getExpandedRowContainerClass(rowIndex)\" [@detailExpand]=\"getStateExpand(row)\">\n </div>\n </td>\n </ng-container>\n </ng-container>\n\n <!--FOOTER-INSERTABLE-->\n <ng-container *ngIf=\"showLastInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name + getSuffixColumnInsertable()\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-footer-cell *matFooterCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name+ getSuffixColumnInsertable()\">\n\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field o-table-cell-editor-text o-table-cell-editor\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <ng-container *ngIf=\"showFirstInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"getColumnInsertable(oTableOptions.selectColumn.name)\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-header-cell *matHeaderCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"getColumnInsertable(column.name)\">\n\n <td mat-header-cell *matHeaderCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Definition column group header -->\n <ng-container *ngFor=\"let column of groupingHeadersRows; let i = index\" [matColumnDef]=\"column\">\n <td mat-cell *matCellDef=\"let group\" class=\"grouping-row\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column, rowValue:group, rowIndex:i}\" [ngClass]=\"getGroupHeaderCellAlignClass(column)\">\n <div *ngIf=\"i===0\" class=\"grouping-title-wrapper\" [ngStyle]=\"{'padding-left': 20*(group.level-1)+'px'}\">\n <mat-icon>{{ group.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n {{ group.title }}\n </div>\n <div class=\"grouping-aggregate\" *ngIf=\"group.hasActiveAggregate(visibleColArray[i])\">\n {{ group.getColumnActiveAggregateTitle(visibleColArray[i]) | oTranslate }} :\n <ng-container *ngIf=\"!getOColumnFromGroupHeaderColumn(column).renderer\">\n {{ group.getColumnAggregateValue(visibleColArray[i])}}\n </ng-container>\n <ng-container *ngIf=\"getOColumnFromGroupHeaderColumn(column).renderer\">\n <ng-template\n *ngTemplateOutlet=\"getOColumnFromGroupHeaderColumn(column).renderer?.templateref; context:{ cellvalue: group.getColumnAggregateValue(visibleColArray[i]) }\">\n </ng-template>\n </ng-container>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"position\">\n <td mat-cell *matCellDef=\"let row\"> {{row}} </td>\n </ng-container>\n\n <tr #tableHeader mat-header-row *matHeaderRowDef=\"oTableOptions.visibleColumns; sticky: fixedHeader\"></tr>\n\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else rowTemplateMultiTemplateDataRows\">\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = index\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-container>\n <ng-template #rowTemplateMultiTemplateDataRows>\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = dataIndex\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-template>\n\n <!-- Row Group header -->\n <tr mat-row *matRowDef=\"let row; columns: groupingHeadersRows; when:isGroup\" (click)=\"groupHeaderClick(row)\"\n [ngClass]=\"getClassNameGroupHeader(row)\">\n </tr>\n\n <!-- Expanded detail row-->\n <ng-container *ngIf=\"hasExpandedRow\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"o-table-row-expanded\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"showLastInsertableRow\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"></tr>\n </ng-container>\n <ng-container *ngIf=\"showFirstInsertableRow\">\n <tr mat-header-row *matHeaderRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"> </tr>\n </ng-container>\n <ng-container *ngIf=\"showTotals | async\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.visibleColumns; sticky: true\" class=\"o-table-aggregate\">\n </tr>\n </ng-container>\n </table>\n\n</ng-template>\n\n<ng-container *ngIf=\"!contextMenuContentChild && contextMenu\">\n <o-table-context-menu [insert]=\"insertButton\" [edit]=\"editionMode !== EDIT_MODE_NONE\" [view-detail]=\"detailMode !== DETAIL_MODE_NONE\"\n [refresh]=\"refreshButton\" [delete]=\"deleteButton\" [filter]=\"showFilterOption\" [group-by-row]=\"groupable\">\n </o-table-context-menu>\n</ng-container>\n\n<ng-template #cellRenderer let-row=\"row\" let-column=\"column\">\n <div class=\"content\">\n\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"column.renderer != null && (!column.editing || column.editing && !isRowSelected(row))\">\n <ng-template *ngTemplateOutlet=\"column.renderer?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"isRowSelected(row) && column.editing\">\n <ng-template *ngTemplateOutlet=\"column.editor?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"column.type === 'editButtonInRow' || column.type === 'detailButtonInRow'\">\n <div fxLayoutAlign=\"center center\" class=\"o-action-cell-renderer\" (click)=\"onDetailButtonClick(column, row, $event)\">\n <mat-icon>{{ getDetailButtonIcon(column) }}</mat-icon>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>{{ row[column.name] }}</ng-container>\n </ng-container>\n\n </div>\n</ng-template>\n", styles: [".o-table{height:100%;max-height:100%;width:100%}.o-table.o-table-disabled{opacity:.4}.o-table .o-table-container{height:100%;display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-items:flex-start;align-content:stretch;min-width:100%;min-height:400px;position:relative;padding:0 .5%}.o-table .o-table-container .o-table-body{display:flex;flex:1 1 auto}.o-table .o-table-container .o-table-body .o-table-overflow{overflow-y:auto;overflow-x:hidden;min-width:100%}.o-table .o-table-container .o-table-body .cdk-virtual-scrollable{overflow:hidden}.o-table .o-table-container .o-table-body.horizontal-scroll .cdk-virtual-scrollable{overflow:visible;contain:none}.o-table .o-table-container .o-table-body.horizontal-scroll .o-table-overflow{overflow-x:auto}.o-table .o-table-container .o-table-body thead .mat-mdc-header-row th:last-child .o-table-column-resizer{display:none}.o-table .o-table-container.block-events{pointer-events:none}.o-table .o-table-container .o-table-toolbar{height:40px}.o-table .o-table-container .o-table-toolbar>div{max-height:100%}.o-table .o-table-container .o-table-toolbar .buttons{margin:0 10px 0 4px}.o-table .o-table-container .o-table-body{max-width:100%;height:100%;overflow:hidden;position:relative}.o-table .o-table-container .o-table-body .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .o-table-container .o-table-body.horizontal-scroll{overflow-x:auto;padding-bottom:16px}.o-table .o-table-container .o-table-body.horizontal-scroll .mat-mdc-header-cell{width:150px}.o-table .o-table-container .o-table-body .o-table-no-results{cursor:default;text-align:center}.o-table .o-table-container .o-table-body .o-table-no-results td{text-align:center}.o-table .o-table-container .mat-mdc-table{table-layout:fixed;width:100%}.o-table .o-table-container .mat-mdc-table.autoadjusted{table-layout:auto}.o-table .o-table-container .mat-mdc-table td .content,.o-table .o-table-container .mat-mdc-table th .content{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-header-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:24px;height:24px}.o-table .o-table-container .mat-mdc-table.large .column-filter-icon{margin-top:4px}.o-table .o-table-container .mat-mdc-table.large .mat-sort-header-arrow{margin-top:7px}.o-table .o-table-container .mat-mdc-table tr.mat-mdc-row.o-table-row-expanded{height:0}.o-table .o-table-container .mat-mdc-table tr.o-table-insertable td{height:1px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell{padding:0 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row{box-sizing:border-box;transition:background-color .2s;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell{padding:0 12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row{padding-top:30px;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-title-wrapper,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-title-wrapper{position:absolute;width:100%;left:0;top:0;text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-aggregate,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-aggregate{font-weight:700;font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-bottom:8px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.empty-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.empty-cell{min-height:16px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .action-cell-renderer,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .action-cell-renderer{cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-start,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-center,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-end,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell *,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell *{vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell),.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell){padding:6px 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline .content,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline .content{overflow:initial;white-space:normal;text-overflow:unset}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:32px;height:32px;margin:1px auto;overflow:hidden;border-radius:50%;position:relative;z-index:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar img,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;max-width:inherit;max-height:inherit}.o-table .o-table-container .mat-mdc-table .o-action-cell-renderer{display:inline-block;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell{overflow:hidden;position:relative;box-sizing:border-box;padding:0 12px;vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select.mat-header-select-all-with-title{padding-right:12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:first-of-type{padding-left:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:not(.o-column-image){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:has(.o-table-column-resizer){padding-right:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .o-table-header-indicator-numbered{font-size:8px;position:absolute;text-align:center;display:inline-block;width:18px;height:18px;line-height:18px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;bottom:-10px;right:-9px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .column-filter-icon{cursor:pointer;font-size:18px;width:18px;height:18px;line-height:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{flex:1;display:block;place-content:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container{cursor:default;min-height:20px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start .mat-sort-header-button{text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center .mat-sort-header-button{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end .mat-sort-header-button{text-align:right}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select{box-sizing:content-box;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select:not(.mat-header-select-all-with-title),.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select:not(.mat-header-select-all-with-title){width:30px}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select .mat-checkbox-layout,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select .mat-checkbox-layout{text-overflow:ellipsis;overflow:hidden;display:inline}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-expandable,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-expandable{width:40px;box-sizing:content-box;padding:0 0 0 24px;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell .row-container-expanded{overflow:hidden;display:flex}.o-table .o-table-container .o-table-disabled-blocker{bottom:0;left:0;position:absolute;right:0;top:0;z-index:100}.o-table .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .spinner-container-scrollable{position:relative}.o-table.o-table-fixed{display:flex}.o-table.o-table-fixed .o-table-container{display:flex;flex-direction:column}.o-table.o-table-fixed .o-table-body{display:flex;flex:1}.o-table.o-table-fixed .o-table-body .o-table-overflow{flex:1;overflow-y:auto}.mat-mdc-tooltip.o-table-cell-tooltip{word-wrap:break-word;overflow:hidden;min-width:140px}\n"] }]
3118
+ }, template: "<div class=\"o-table-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" [style.display]=\"isVisible()? '' : 'none'\"\n [class.block-events]=\"loadingService.isProcessing$ | async\">\n <o-data-toolbar #tableToolbar *ngIf=\"hasControls()\" [title]=\"title\" [show-title]=\"showTitle\" class=\"o-table-toolbar\">\n <ng-container o-data-toolbar-projection-start>\n <o-table-buttons #tableButtons [insert-button]=\"insertButton\" [refresh-button]=\"refreshButton\" [delete-button]=\"showDeleteButton\">\n <ng-content select=\"o-table-button\"></ng-content>\n </o-table-buttons>\n </ng-container>\n <ng-content select=\"[o-table-toolbar][position=start]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar][position=end]\" ngProjectAs=\"[o-data-toolbar-custom-projection-end]\">\n </ng-content>\n <ng-content select=\"[o-table-toolbar]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-container o-data-toolbar-projection-end>\n <ng-container *ngIf=\"quickfilterContentChild; else defaultQuickFilter\">\n <ng-content select=\"o-table-quickfilter\"></ng-content>\n </ng-container>\n <ng-template #defaultQuickFilter>\n <ng-container *ngIf=\"quickFilter\">\n <o-table-quickfilter [placeholder]=\"quickFilterPlaceholder\" (onChange)=\"tableQuickFilterChanged($event)\">\n </o-table-quickfilter>\n </ng-container>\n </ng-template>\n <button type=\"button\" *ngIf=\"showTableMenuButton\" mat-icon-button class=\"o-table-menu-button\" [matMenuTriggerFor]=\"tableMenu.matMenu\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"ontimize:more_vert\"></mat-icon>\n </button>\n <o-table-menu #tableMenu [select-all-checkbox]=\"selectAllCheckbox\" [export-button]=\"exportButton\"\n [columns-visibility-button]=\"columnsVisibilityButton\" [show-configuration-option]=\"showConfigurationOption\"\n [show-filter-option]=\"showFilterOption\" [show-report-on-demand-option]=\"showReportOnDemandOption\"\n [show-charts-on-demand-option]=\"showChartsOnDemandOption\" [show-reset-width-option]=\"showResetWidthOption\" [show-group-by-option]=\"groupable\">\n <ng-content select=\"o-table-option\"></ng-content>\n </o-table-menu>\n </ng-container>\n </o-data-toolbar>\n\n <div #tableBody class=\"o-table-body o-scroll\" [class.horizontal-scroll]=\"horizontalScroll\" [class.scrolled]=\"horizontalScrolled\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n <ng-container *ngIf=\"!enabledVirtualScroll; else tableWithVirtualScroll\">\n <div class=\"o-table-overflow o-scroll\">\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </div>\n </ng-container>\n <ng-template #tableWithVirtualScroll>\n <cdk-virtual-scroll-viewport #virtualScrollViewPort fxFlex>\n <ng-template *ngTemplateOutlet=\"table\"></ng-template>\n </cdk-virtual-scroll-viewport>\n </ng-template>\n </div>\n <!--TABLE PAGINATOR-->\n <mat-paginator *ngIf=\"paginator\" #matpaginator [length]=\"dataSource?.resultsLength\" [pageIndex]=\"paginator.pageIndex\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"paginator.pageSizeOptions\" (page)=\"onChangePage($event)\" [showFirstLastButtons]=\"paginator.showFirstLastButtons\"\n [ngStyle]=\"{'visibility': spinnerContainer ? 'hidden' : 'visible'}\">\n </mat-paginator>\n\n <!--LOADING-->\n <div #spinnerContainer *ngIf=\"showLoading | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\" [ngStyle]=\"{'top.px': toolBarHeight}\"\n class=\"spinner-container\" [class.spinner-container-scrollable]=\"loadingScroll | async\">\n <o-table-skeleton></o-table-skeleton>\n </div>\n\n <!-- Disable blocker -->\n <div *ngIf=\"!enabled\" class=\"o-table-disabled-blocker\"></div>\n</div>\n\n<ng-template #table>\n <table mat-table #table [class.autoadjusted]=\"autoAdjust\" [trackBy]=\"getTrackByFunction()\" [dataSource]=\"dataSource\" oMatSort\n [oMatSortColumns]=\"sortColArray\" [ngClass]=\"rowHeightObservable | async\" (cdkObserveContent)=\"projectContentChanged()\"\n oTableExpandedFooter [oTableExpandedFooterColspan]=\"visibleColArray.length\"\n [multiTemplateDataRows]=\"showExpandableRow()\" aria-describedby=\"ontimize-web table\">\n\n <!--Checkbox Column -->\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <ng-container *ngIf=\"!tableColumnSelectAllContentChild; else customHeaderSelectAllTemplate\">\n <th mat-header-cell *matHeaderCellDef>\n <div class=\"content\" *ngIf=\"isSelectionModeMultiple()\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n <ng-template #customHeaderSelectAllTemplate>\n <th mat-header-cell *matHeaderCellDef [class.resizable]=\"resizable\" class=\"mat-header-select-all-with-title o-center\"\n [style.width]=\"oTableOptions.selectColumn.width\" [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\"\n [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <div class=\"content\">\n <o-table-header-select-all [column]=\"oTableOptions.selectColumn\"></o-table-header-select-all>\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"o-center\" [style.width]=\"oTableOptions.selectColumn.width\"\n [style.min-width]=\"getMinWidthColumn(oTableOptions.selectColumn)\" [style.max-width]=\"oTableOptions.selectColumn.maxWidth\">\n <mat-checkbox name=\"id[]\" (click)=\"$event.stopPropagation()\" [disabled]=\"isDisableCheckbox(row)\"\n (change)=\"selectionCheckboxToggle($event, row)\" [checked]=\"isRowSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-template>\n\n\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <!--Expandable Column -->\n <ng-container [matColumnDef]=\"oTableOptions.expandableColumn.name\" *ngIf=\"isColumnExpandable()\">\n <th mat-header-cell *matHeaderCellDef>\n {{ oTableOptions.expandableColumn.title }}\n </th>\n <td mat-cell *matCellDef=\"let row;let rowIndex = dataIndex\">\n <mat-icon *ngIf=\"showExpandableIcon(row, rowIndex) | async\" (click)=\"toggleRowExpandable(row, $event)\"\n (keydown)=\"toggleRowExpandable(row, $event)\">\n <ng-container *ngIf=\"isExpanded(row)\">{{ tableRowExpandable.iconCollapse }}</ng-container>\n <ng-container *ngIf=\"!isExpanded(row)\">{{ tableRowExpandable.iconExpand }}</ng-container>\n </mat-icon>\n </td>\n </ng-container>\n\n <!-- Generic column definition -->\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name\">\n <!--Define header-cell-->\n\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"getTitleAlignClass(column)\" [class.resizable]=\"resizable\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\">\n\n <div class=\"content\">\n <o-table-header [column]=\"column\" [column-filters]=\"columnFilters$ | async\" ></o-table-header>\n </div>\n </th>\n\n\n <!--Define mat-cell-->\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else cellTemplateMultiTemplateDataRows\">\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = index \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n </td>\n </ng-container>\n <ng-template #cellTemplateMultiTemplateDataRows>\n <td #cell mat-cell *matCellDef=\"let row;let rowIndex = dataIndex \" [ngClass]=\"[column.className, getCellAlignClass(column)]\"\n (click)=\"handleClick(row, column, rowIndex, cell, $event)\" (dblclick)=\"handleDoubleClick(row, column, rowIndex, cell, $event)\"\n [class.empty-cell]=\"isEmpty(row[column.name])\" [matTooltipDisabled]=\"!column.hasTooltip()\" [matTooltip]=\"column.getTooltip(row)\"\n matTooltipPosition=\"below\" matTooltipShowDelay=\"750\" matTooltipClass=\"o-table-cell-tooltip\"\n [class.o-mat-cell-multiline]=\"(column.isMultiline | async)\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column.name, rowValue:row, rowIndex:rowIndex}\" [style.width]=\"column.width\"\n [style.min-width]=\"getMinWidthColumn(column)\" [style.max-width]=\"column.maxWidth\"\n [class.o-table-editing-cell]=\"isRowSelected(row) && column.editing\">\n <ng-container *ngTemplateOutlet=\"cellRenderer;context:{column:column,row:row}\"></ng-container>\n\n </td>\n </ng-template>\n <!--Define mat-footer-cell-->\n <ng-container *ngIf=\"showTotals | async\">\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"column.className\">\n <div class=\"title\" *ngIf=\"column.aggregate && column.aggregate.title\">\n {{ column.aggregate.title | oTranslate }}\n </div>\n <ng-container *ngIf=\"!column.renderer || column.aggregate?.operator === 'count'; else rendererTemplate\">\n {{ dataSource.getAggregateData(column) }}\n </ng-container>\n <ng-template #rendererTemplate>\n <ng-template *ngIf=\"column.renderer && column.aggregate\" [ngTemplateOutlet]=\"column.renderer.templateref\"\n [ngTemplateOutletContext]=\"{cellvalue: dataSource.getAggregateData(column)}\">\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"hasExpandedRow\">\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let row;let rowIndex= dataIndex\" [attr.colspan]=\"oTableOptions.visibleColumns.length\">\n <div [ngClass]=\"getExpandedRowContainerClass(rowIndex)\" [@detailExpand]=\"getStateExpand(row)\">\n </div>\n </td>\n </ng-container>\n </ng-container>\n\n <!--FOOTER-INSERTABLE-->\n <ng-container *ngIf=\"showLastInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"oTableOptions.selectColumn.name + getSuffixColumnInsertable()\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-footer-cell *matFooterCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"column.name+ getSuffixColumnInsertable()\">\n\n <td mat-footer-cell *matFooterCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field o-table-cell-editor-text o-table-cell-editor\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <ng-container *ngIf=\"showFirstInsertableRow && oTableInsertableRowComponent\">\n <ng-container [matColumnDef]=\"getColumnInsertable(oTableOptions.selectColumn.name)\" *ngIf=\"oTableOptions.selectColumn.visible\">\n <td mat-header-cell *matHeaderCellDef>\n </td>\n </ng-container>\n <ng-container *ngFor=\"let column of oTableOptions.columns\" [matColumnDef]=\"getColumnInsertable(column.name)\">\n\n <td mat-header-cell *matHeaderCellDef [ngClass]=\"[column.className, getCellAlignClass(column)]\">\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && !oTableInsertableRowComponent.useCellEditor(column)\">\n <mat-form-field class=\"insertable-form-field\" [hideRequiredMarker]=\"false\">\n <input matInput type=\"text\" [placeholder]=\"oTableInsertableRowComponent.getPlaceholder(column)\" [id]=\"column.attr\"\n [formControl]=\"oTableInsertableRowComponent.getControl(column)\" [required]=\"oTableInsertableRowComponent.isColumnRequired(column)\">\n <mat-error *oMatError=\"oTableInsertableRowComponent.columnHasError(column, 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n\n <ng-container *ngIf=\"oTableInsertableRowComponent.isColumnInsertable(column) && oTableInsertableRowComponent.useCellEditor(column)\">\n <ng-template [ngTemplateOutlet]=\"oTableInsertableRowComponent.columnEditors[column.attr].templateref\"\n [ngTemplateOutletContext]=\"{ rowvalue: oTableInsertableRowComponent.rowData }\">\n </ng-template>\n </ng-container>\n </td>\n </ng-container>\n\n </ng-container>\n\n <!-- Definition column group header -->\n <ng-container *ngFor=\"let column of groupingHeadersRows; let i = index\" [matColumnDef]=\"column\">\n <td mat-cell *matCellDef=\"let group\" class=\"grouping-row\" [oContextMenu]=\"tableContextMenu\"\n [oContextMenuData]=\"{ cellName:column, rowValue:group, rowIndex:i}\" [ngClass]=\"getGroupHeaderCellAlignClass(column)\">\n <div *ngIf=\"i===0\" class=\"grouping-title-wrapper\" [ngStyle]=\"{'padding-left': 20*(group.level-1)+'px'}\">\n <mat-icon>{{ group.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n {{ group.title }}\n </div>\n <div class=\"grouping-aggregate\" *ngIf=\"group.hasActiveAggregate(visibleColArray[i])\">\n {{ group.getColumnActiveAggregateTitle(visibleColArray[i]) | oTranslate }} :\n <ng-container *ngIf=\"!getOColumnFromGroupHeaderColumn(column).renderer\">\n {{ group.getColumnAggregateValue(visibleColArray[i])}}\n </ng-container>\n <ng-container *ngIf=\"getOColumnFromGroupHeaderColumn(column).renderer\">\n <ng-template\n *ngTemplateOutlet=\"getOColumnFromGroupHeaderColumn(column).renderer?.templateref; context:{ cellvalue: group.getColumnAggregateValue(visibleColArray[i]) }\">\n </ng-template>\n </ng-container>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"position\">\n <td mat-cell *matCellDef=\"let row\"> {{row}} </td>\n </ng-container>\n\n <tr #tableHeader mat-header-row *matHeaderRowDef=\"oTableOptions.visibleColumns; sticky: fixedHeader\"></tr>\n\n <ng-container *ngIf=\"!table.multiTemplateDataRows; else rowTemplateMultiTemplateDataRows\">\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = index\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-container>\n <ng-template #rowTemplateMultiTemplateDataRows>\n <tr mat-row oTableRow *matRowDef=\"let row; columns: oTableOptions.visibleColumns; when:isNotGroup; let rowIndex = dataIndex\"\n [class.selected]=\"isRowSelected(row)\" [ngClass]=\"row | oTableRowClass: rowIndex: rowClass\">\n </tr>\n </ng-template>\n\n <!-- Row Group header -->\n <tr mat-row *matRowDef=\"let row; columns: groupingHeadersRows; when:isGroup\" (click)=\"groupHeaderClick(row)\"\n [ngClass]=\"getClassNameGroupHeader(row)\">\n </tr>\n\n <!-- Expanded detail row-->\n <ng-container *ngIf=\"hasExpandedRow\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"o-table-row-expanded\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"showLastInsertableRow\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"></tr>\n </ng-container>\n <ng-container *ngIf=\"showFirstInsertableRow\">\n <tr mat-header-row *matHeaderRowDef=\"oTableOptions.columnsInsertables; sticky: true\"\n (keyup)=\"oTableInsertableRowComponent.handleKeyboardEvent($event)\" class=\"o-table-insertable\"> </tr>\n </ng-container>\n <ng-container *ngIf=\"showTotals | async\">\n <tr mat-footer-row *matFooterRowDef=\"oTableOptions.visibleColumns; sticky: true\" class=\"o-table-aggregate\">\n </tr>\n </ng-container>\n </table>\n\n</ng-template>\n\n<ng-container *ngIf=\"!contextMenuContentChild && contextMenu\">\n <o-table-context-menu [insert]=\"insertButton\" [edit]=\"editionMode !== EDIT_MODE_NONE\" [view-detail]=\"detailMode !== DETAIL_MODE_NONE\"\n [refresh]=\"refreshButton\" [delete]=\"deleteButton\" [filter]=\"showFilterOption\" [group-by-row]=\"groupable\">\n </o-table-context-menu>\n</ng-container>\n\n<ng-template #cellRenderer let-row=\"row\" let-column=\"column\">\n <div class=\"content\">\n\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"column.renderer != null && (!column.editing || column.editing && !isRowSelected(row))\">\n <ng-template *ngTemplateOutlet=\"column.renderer?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"isRowSelected(row) && column.editing\">\n <ng-template *ngTemplateOutlet=\"column.editor?.templateref; context:{ cellvalue: row[column.name], rowvalue:row }\">\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"column.type === 'editButtonInRow' || column.type === 'detailButtonInRow'\">\n <div fxLayoutAlign=\"center center\" class=\"o-action-cell-renderer\" (click)=\"onDetailButtonClick(column, row, $event)\">\n <mat-icon>{{ getDetailButtonIcon(column) }}</mat-icon>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>{{ row[column.name] }}</ng-container>\n </ng-container>\n\n </div>\n</ng-template>\n", styles: [".o-table{height:100%;max-height:100%;width:100%}.o-table.o-table-disabled{opacity:.4}.o-table .o-table-container{height:100%;display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-items:flex-start;align-content:stretch;min-width:100%;min-height:400px;position:relative;padding:0 .5%}.o-table .o-table-container .o-table-body{display:flex;flex:1 1 auto}.o-table .o-table-container .o-table-body .o-table-overflow{overflow-y:auto;overflow-x:hidden;min-width:100%}.o-table .o-table-container .o-table-body .cdk-virtual-scrollable{overflow-x:hidden}.o-table .o-table-container .o-table-body.horizontal-scroll .cdk-virtual-scrollable{overflow-x:visible;contain:none}.o-table .o-table-container .o-table-body.horizontal-scroll .o-table-overflow{overflow-x:auto}.o-table .o-table-container .o-table-body thead .mat-mdc-header-row th:last-child .o-table-column-resizer{display:none}.o-table .o-table-container.block-events{pointer-events:none}.o-table .o-table-container .o-table-toolbar{height:40px}.o-table .o-table-container .o-table-toolbar>div{max-height:100%}.o-table .o-table-container .o-table-toolbar .buttons{margin:0 10px 0 4px}.o-table .o-table-container .o-table-body{max-width:100%;height:100%;overflow:hidden;position:relative}.o-table .o-table-container .o-table-body .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .o-table-container .o-table-body.horizontal-scroll{overflow-x:auto;padding-bottom:16px}.o-table .o-table-container .o-table-body.horizontal-scroll .mat-mdc-header-cell{width:150px}.o-table .o-table-container .o-table-body .o-table-no-results{cursor:default;text-align:center}.o-table .o-table-container .o-table-body .o-table-no-results td{text-align:center}.o-table .o-table-container .mat-mdc-table{table-layout:fixed;width:100%}.o-table .o-table-container .mat-mdc-table.autoadjusted{table-layout:auto}.o-table .o-table-container .mat-mdc-table td .content,.o-table .o-table-container .mat-mdc-table th .content{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-header-row .mat-mdc-header-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table.small .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:24px;height:24px}.o-table .o-table-container .mat-mdc-table.large .column-filter-icon{margin-top:4px}.o-table .o-table-container .mat-mdc-table.large .mat-sort-header-arrow{margin-top:7px}.o-table .o-table-container .mat-mdc-table tr.mat-mdc-row.o-table-row-expanded{height:0}.o-table .o-table-container .mat-mdc-table tr.o-table-insertable td{height:1px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell{padding:0 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-footer-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row{box-sizing:border-box;transition:background-color .2s;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell{padding:0 12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row{padding-top:30px;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-title-wrapper,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-title-wrapper{position:absolute;width:100%;left:0;top:0;text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.grouping-row .grouping-aggregate,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.grouping-row .grouping-aggregate{font-weight:700;font-size:14px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-bottom:8px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.empty-cell,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.empty-cell{min-height:16px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .action-cell-renderer,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .action-cell-renderer{cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-start,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-start{text-align:start}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-center,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-center{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-end,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-end{text-align:end}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell *,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell *{vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell),.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline:not(.mat-mdc-header-cell){padding:6px 12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell.o-mat-cell-multiline .content,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell.o-mat-cell-multiline .content{overflow:initial;white-space:normal;text-overflow:unset}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar{width:32px;height:32px;margin:1px auto;overflow:hidden;border-radius:50%;position:relative;z-index:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-cell .image-avatar img,.o-table .o-table-container .mat-mdc-table .mat-mdc-row .mat-mdc-header-cell .image-avatar img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;max-width:inherit;max-height:inherit}.o-table .o-table-container .mat-mdc-table .o-action-cell-renderer{display:inline-block;cursor:pointer}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell{overflow:hidden;position:relative;box-sizing:border-box;padding:0 12px;vertical-align:middle}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select.mat-header-select-all-with-title{padding-right:12px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:first-of-type{padding-left:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:not(.o-column-image){overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell:has(.o-table-column-resizer){padding-right:0}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .o-table-header-indicator-numbered{font-size:8px;position:absolute;text-align:center;display:inline-block;width:18px;height:18px;line-height:18px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;bottom:-10px;right:-9px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .column-filter-icon{cursor:pointer;font-size:18px;width:18px;height:18px;line-height:1}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{flex:1;display:block;place-content:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container{cursor:default;min-height:20px}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .header-title-container,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell .mat-sort-header-button{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.start .mat-sort-header-button{text-align:left}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.center .mat-sort-header-button{text-align:center}.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.end .mat-sort-header-button{text-align:right}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select{box-sizing:content-box;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select:not(.mat-header-select-all-with-title),.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select:not(.mat-header-select-all-with-title){width:30px}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-select .mat-checkbox-layout,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-select .mat-checkbox-layout{text-overflow:ellipsis;overflow:hidden;display:inline}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell.mat-column-expandable,.o-table .o-table-container .mat-mdc-table .mat-mdc-header-cell.mat-column-expandable{width:40px;box-sizing:content-box;padding:0 0 0 24px;overflow:initial}.o-table .o-table-container .mat-mdc-table .mat-mdc-cell .row-container-expanded{overflow:hidden;display:flex}.o-table .o-table-container .o-table-disabled-blocker{bottom:0;left:0;position:absolute;right:0;top:0;z-index:100}.o-table .spinner-container{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-table .spinner-container-scrollable{position:relative}.o-table.o-table-fixed{display:flex}.o-table.o-table-fixed .o-table-container{display:flex;flex-direction:column}.o-table.o-table-fixed .o-table-body{display:flex;flex:1}.o-table.o-table-fixed .o-table-body .o-table-overflow{flex:1;overflow-y:auto}.mat-mdc-tooltip.o-table-cell-tooltip{word-wrap:break-word;overflow:hidden;min-width:140px}\n"] }]
3101
3119
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i1.MatDialog }, { type: i0.ViewContainerRef }, { type: i0.ApplicationRef }, { type: i32.OFormComponent, decorators: [{
3102
3120
  type: Optional
3103
3121
  }, {
@@ -3163,4 +3181,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3163
3181
  type: ViewChildren,
3164
3182
  args: [MatTooltip]
3165
3183
  }] } });
3166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9vLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL28tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBSUwsY0FBYyxFQUNkLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBR04sUUFBUSxFQUNSLFNBQVMsRUFFVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFN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QkFBMkI7Z0JBSTVDLGdDQUFnQztzQkFEL0IsWUFBWTt1QkFBQyw4QkFBOEI7Z0JBTzVDLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsRUFBRTtnQkErQmpDLHVCQUF1QjtzQkFEdEIsWUFBWTt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTTFELE9BQU87c0JBRE4sWUFBWTt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBTZWxlY3Rpb25DaGFuZ2UsIFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgRG9tUG9ydGFsT3V0bGV0LCBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCBWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQXBwbGljYXRpb25SZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRDaGVja2JveENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRNZW51IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0VGFiLCBNYXRUYWJHcm91cCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEJvb2xlYW5Db252ZXJ0ZXIsIEJvb2xlYW5JbnB1dENvbnZlcnRlciB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvaW5wdXQtY29udmVydGVyJztcbmltcG9ydCB7IENvbXBvbmVudFN0YXRlU2VydmljZVByb3ZpZGVyLCBPbnRpbWl6ZVNlcnZpY2VQcm92aWRlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBTbmFja0JhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zbmFja2Jhci5zZXJ2aWNlJztcbmltcG9ydCB7IE9UYWJsZUNvbXBvbmVudFN0YXRlQ2xhc3MgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdGF0ZS9vLXRhYmxlLWNvbXBvbmVudC1zdGF0ZS5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVDb21wb25lbnRTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdGF0ZS9vLXRhYmxlLWNvbXBvbmVudC1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9Db2x1bW5EaXNwbGF5LCBPRmlsdGVyRGVmaW5pdGlvbiwgT0dyb3VwZWRDb2x1bW5UeXBlcywgT1RhYmxlR2xvYmFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3R5cGVzL2V4cHJlc3Npb24udHlwZSc7XG5pbXBvcnQgeyBPUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi90eXBlcy9vLXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgT1F1ZXJ5RGF0YUFyZ3MgfSBmcm9tICcuLi8uLi90eXBlcy9xdWVyeS1kYXRhLWFyZ3MudHlwZSc7XG5pbXBvcnQgeyBRdWlja0ZpbHRlckZ1bmN0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMvcXVpY2stZmlsdGVyLWZ1bmN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgU1FMT3JkZXIgfSBmcm9tICcuLi8uLi90eXBlcy9zcWwtb3JkZXIudHlwZSc7XG5pbXBvcnQgeyBPQ29sdW1uQWdncmVnYXRlIH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby1jb2x1bW4tYWdncmVnYXRlLnR5cGUnO1xuaW1wb3J0IHsgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvciwgT0NvbHVtblZhbHVlRmlsdGVyIH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby1jb2x1bW4tdmFsdWUtZmlsdGVyLnR5cGUnO1xuaW1wb3J0IHsgVGFibGVGaWx0ZXJCeUNvbHVtbkRpYWxvZ1Jlc3VsdCB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtZmlsdGVyLWJ5LWNvbHVtbi1kYXRhLnR5cGUnO1xuaW1wb3J0IHsgT1RhYmxlSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby10YWJsZS1pbml0aWFsaXphdGlvbi1vcHRpb25zLnR5cGUnO1xuaW1wb3J0IHsgT1RhYmxlTWVudVBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby10YWJsZS1tZW51LXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgT1RhYmxlUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLXRhYmxlLXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZVdyYXBwZXIgfSBmcm9tICcuLi8uLi91dGlsL2FzeW5jJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBGaWx0ZXJFeHByZXNzaW9uVXRpbHMgfSBmcm9tICcuLi8uLi91dGlsL2ZpbHRlci1leHByZXNzaW9uLnV0aWxzJztcbmltcG9ydCB7IFBlcm1pc3Npb25zVXRpbHMgfSBmcm9tICcuLi8uLi91dGlsL3Blcm1pc3Npb25zJztcbmltcG9ydCB7IFNlcnZpY2VVdGlscyB9IGZyb20gJy4uLy4uL3V0aWwvc2VydmljZS51dGlscyc7XG5pbXBvcnQgeyBTUUxUeXBlcyB9IGZyb20gJy4uLy4uL3V0aWwvc3FsdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tICcuLi9jb250ZXh0bWVudS9vLWNvbnRleHQtbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT0Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi9mb3JtL28tZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWJzdHJhY3RPU2VydmljZUNvbXBvbmVudCB9IGZyb20gJy4uL28tc2VydmljZS1jb21wb25lbnQuY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlQ29sdW1uQ2FsY3VsYXRlZENvbXBvbmVudCB9IGZyb20gJy4vY29sdW1uL2NhbGN1bGF0ZWQvby10YWJsZS1jb2x1bW4tY2FsY3VsYXRlZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgT0Jhc2VUYWJsZUNlbGxSZW5kZXJlciB9IGZyb20gJy4vY29sdW1uL2NlbGwtcmVuZGVyZXIvby1iYXNlLXRhYmxlLWNlbGwtcmVuZGVyZXIuY2xhc3MnO1xuaW1wb3J0IHsgT0NvbHVtbiB9IGZyb20gJy4vY29sdW1uL28tY29sdW1uLmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29sdW1uL28tdGFibGUtY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVFeHBvcnRCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMnO1xuaW1wb3J0IHsgT1RhYmxlQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvY29udGV4dG1lbnUvby10YWJsZS1jb250ZXh0LW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IERlZmF1bHRPVGFibGVPcHRpb25zIH0gZnJvbSAnLi9leHRlbnNpb25zL2RlZmF1bHQtby10YWJsZS1vcHRpb25zLmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZUZpbHRlckJ5Q29sdW1uRGF0YURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9kaWFsb2cvZmlsdGVyLWJ5LWNvbHVtbi9vLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4tZGF0YS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IE9CYXNlVGFibGVQYWdpbmF0b3IgfSBmcm9tICcuL2V4dGVuc2lvbnMvZm9vdGVyL3BhZ2luYXRvci9vLWJhc2UtdGFibGUtcGFnaW5hdG9yLmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9oZWFkZXIvdGFibGUtYnV0dG9uL28tdGFibGUtYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmUgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWNvbHVtbi1zZWxlY3QtYWxsL28tdGFibGUtY29sdW1uLXNlbGVjdC1hbGwuZGlyZWN0aXZlJztcbmltcG9ydCB7IE9GaWx0ZXJDb2x1bW4gfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWNvbHVtbnMtZmlsdGVyL2NvbHVtbnMvby10YWJsZS1jb2x1bW5zLWZpbHRlci1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWNvbHVtbnMtZmlsdGVyL28tdGFibGUtY29sdW1ucy1maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9oZWFkZXIvdGFibGUtY29sdW1ucy1ncm91cGluZy9jb2x1bW5zL28tdGFibGUtY29sdW1ucy1ncm91cGluZy1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZUhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9oZWFkZXIvdGFibGUtaGVhZGVyL28tdGFibGUtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1pbnNlcnRhYmxlLXJvdy9vLXRhYmxlLWluc2VydGFibGUtcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLW9wdGlvbi9vLXRhYmxlLW9wdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuL2V4dGVuc2lvbnMvby10YWJsZS1kYXRhc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT1RhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi9leHRlbnNpb25zL28tdGFibGUtc3RyYXRlZ3kuc2VydmljZSc7XG5pbXBvcnQgeyBPVGFibGVEYW8gfSBmcm9tICcuL2V4dGVuc2lvbnMvby10YWJsZS5kYW8nO1xuaW1wb3J0IHsgT1RhYmxlR3JvdXBlZFJvdyB9IGZyb20gJy4vZXh0ZW5zaW9ucy9yb3cvby10YWJsZS1yb3ctZ3JvdXAuY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlUm93RXhwYW5kYWJsZUNvbXBvbmVudCwgT1RhYmxlUm93RXhwYW5kZWRDaGFuZ2UgfSBmcm9tICcuL2V4dGVuc2lvbnMvcm93L3RhYmxlLXJvdy1leHBhbmRhYmxlL28tdGFibGUtcm93LWV4cGFuZGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IE9NYXRTb3J0IH0gZnJvbSAnLi9leHRlbnNpb25zL3NvcnQvby1tYXQtc29ydCc7XG5pbXBvcnQgeyBPVGFibGVCYXNlIH0gZnJvbSAnLi9vLXRhYmxlLWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgT19UQUJMRV9HTE9CQUxfQ09ORklHIH0gZnJvbSAnLi91dGlscy9vLXRhYmxlLnRva2Vucyc7XG5cbmltcG9ydCB0eXBlIHsgSU9Db250ZXh0TWVudUNvbnRleHQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tY29udGV4dC1tZW51LmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZUJ1dHRvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1idXR0b24uaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgT1RhYmxlQnV0dG9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1idXR0b25zLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZUNvbHVtbnNHcm91cGluZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1jb2x1bW5zLWdyb3VwaW5nLWludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtZGF0YXNvdXJjZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVNZW51IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLW1lbnUuaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgT1RhYmxlT3B0aW9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZVBhZ2luYXRvciB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1wYWdpbmF0b3IuaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgT1RhYmxlUXVpY2tmaWx0ZXIgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtcXVpY2tmaWx0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zZXJ2aWNlLXJlc3BvbnNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPUXVlcnlQYXJhbXMgfSBmcm9tICcuLi8uLi90eXBlcy9xdWVyeS1wYXJhbXMudHlwZSc7XG5pbXBvcnQgeyBPX0NPTVBPTkVOVF9TVEFURV9TRVJWSUNFIH0gZnJvbSAnLi4vLi4vaW5qZWN0aW9uLXRva2Vucyc7XG5pbXBvcnQgeyBNYXRSb3csIE1hdFRhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgT1RhYmxlRmlsdGVyQnlDb2x1bW5TZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zL2RpYWxvZy9maWx0ZXItYnktY29sdW1uL28tdGFibGUtZmlsdGVyLWJ5LWNvbHVtbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBhZ2luYXRpb25EYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wYWdpbmF0aW9uLWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9UYWJsZUxvYWRpbmdTZXJ2aWNlIH0gZnJvbSAnLi9vLXRhYmxlLWxvYWRpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBDb2x1bW5GaWx0ZXJDaGFuZ2VFdmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29sdW1uLWZpbHRlci1jaGFuZ2UtZXZlbnQuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5QVVRTX09fVEFCTEUgPSBbXG4gIC8vIHZpc2libGUtY29sdW1ucyBbc3RyaW5nXTogdmlzaWJsZSBjb2x1bW5zLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3Zpc2libGVDb2x1bW5zOiB2aXNpYmxlLWNvbHVtbnMnLFxuXG4gIC8vIHZpc2libGUtY29sdW1ucy1ieS1kZWZhdWx0IFtzdHJpbmddOiBjb2x1bW5zIHRoYXQgYXJlIHZpc2libGUgYnkgZGVmYXVsdCwgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdkZWZhdWx0VmlzaWJsZUNvbHVtbnM6IGRlZmF1bHQtdmlzaWJsZS1jb2x1bW5zJyxcblxuICAvLyBlZGl0YWJsZS1jb2x1bW5zIFtzdHJpbmddOiBjb2x1bW5zIHRoYXQgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBvdmVyIHRoZSB0YWJsZSwgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gIC8vICdlZGl0YWJsZUNvbHVtbnM6IGVkaXRhYmxlLWNvbHVtbnMnLFxuXG4gIC8vIHNvcnQtY29sdW1ucyBbc3RyaW5nXTogaW5pdGlhbCBzb3J0aW5nLCB3aXRoIHRoZSBmb3JtYXQgY29sdW1uOltBU0N8REVTQ10sIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAnc29ydENvbHVtbnM6IHNvcnQtY29sdW1ucycsXG5cbiAgJ3F1aWNrRmlsdGVyQ2FsbGJhY2s6IHF1aWNrLWZpbHRlci1mdW5jdGlvbicsXG5cbiAgLy8gZGVsZXRlLWJ1dHRvbiBbbm98eWVzXTogc2hvdyBkZWxldGUgYnV0dG9uLiBEZWZhdWx0OiB5ZXMuXG4gICdkZWxldGVCdXR0b246IGRlbGV0ZS1idXR0b24nLFxuXG4gIC8vIHJlZnJlc2gtYnV0dG9uIFtub3x5ZXNdOiBzaG93IHJlZnJlc2ggYnV0dG9uLiBEZWZhdWx0OiB5ZXMuXG4gICdyZWZyZXNoQnV0dG9uOiByZWZyZXNoLWJ1dHRvbicsXG5cbiAgLy8gY29sdW1ucy12aXNpYmlsaXR5LWJ1dHRvbiBbbm98eWVzXTogc2hvdyBjb2x1bW5zIHZpc2liaWxpdHkgYnV0dG9uLiBEZWZhdWx0OiB5ZXMuXG4gICdjb2x1bW5zVmlzaWJpbGl0eUJ1dHRvbjogY29sdW1ucy12aXNpYmlsaXR5LWJ1dHRvbicsXG5cbiAgLy8gLy8gY29sdW1ucy1yZXNpemUtYnV0dG9uIFtub3x5ZXNdOiBzaG93IGNvbHVtbnMgcmVzaXplIGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAvLyAnY29sdW1uc1Jlc2l6ZUJ1dHRvbjogY29sdW1ucy1yZXNpemUtYnV0dG9uJyxcblxuICAvLyAvLyBjb2x1bW5zLWdyb3VwLWJ1dHRvbiBbbm98eWVzXTogc2hvdyBjb2x1bW5zIGdyb3VwIGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAvLyAnY29sdW1uc0dyb3VwQnV0dG9uOiBjb2x1bW5zLWdyb3VwLWJ1dHRvbicsXG5cbiAgLy8gZXhwb3J0LWJ1dHRvbiBbbm98eWVzXTogc2hvdyBleHBvcnQgYnV0dG9uLiBEZWZhdWx0OiB5ZXMuXG4gICdleHBvcnRCdXR0b246IGV4cG9ydC1idXR0b24nLFxuXG4gIC8vIHNob3ctY29uZmlndXJhdGlvbi1vcHRpb24gW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBjb25maWd1cmF0aW9uIGJ1dHRvbiBpbiBoZWFkZXIuIERlZmF1bHQ6IHllcy5cbiAgJ3Nob3dDb25maWd1cmF0aW9uT3B0aW9uOiBzaG93LWNvbmZpZ3VyYXRpb24tb3B0aW9uJyxcblxuICAvLyBzaG93LWJ1dHRvbnMtdGV4dCBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IHRleHQgb2YgaGVhZGVyIGJ1dHRvbnMuIERlZmF1bHQ6IHllcy5cbiAgJ3Nob3dCdXR0b25zVGV4dDogc2hvdy1idXR0b25zLXRleHQnLFxuXG4gIC8vIHNlbGVjdC1hbGwtY2hlY2tib3ggW3llc3xub3x0cnVlfGZhbHNlXTogIHNob3cgaW4gdGhlIG1lbnUgdGhlIG9wdGlvbiBvZiBzZWxlY3Rpb24gY2hlY2sgYm94ZXMgLiBEZWZhdWx0OiBuby5cbiAgJ3NlbGVjdEFsbENoZWNrYm94OiBzZWxlY3QtYWxsLWNoZWNrYm94JyxcblxuICAvLyBwYWdpbmF0aW9uLWNvbnRyb2xzIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgcGFnaW5hdGlvbiBjb250cm9scy4gRGVmYXVsdDogeWVzLlxuICAncGFnaW5hdGlvbkNvbnRyb2xzOiBwYWdpbmF0aW9uLWNvbnRyb2xzJyxcblxuICAvLyBmaXgtaGVhZGVyIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IGZpeGVkIGhlYWRlciBhbmQgZm9vdGVyIHdoZW4gdGhlIGNvbnRlbnQgaXMgZ3JlYXRoZXIgdGhhbiBpdHMgb3duIGhlaWdodC4gRGVmYXVsdDogeWVzLlxuICAnZml4ZWRIZWFkZXI6IGZpeGVkLWhlYWRlcicsXG5cbiAgLy8gc2hvdy10aXRsZSBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IHRoZSB0YWJsZSB0aXRsZS4gRGVmYXVsdDogbm8uXG4gICdzaG93VGl0bGU6IHNob3ctdGl0bGUnLFxuXG4gIC8vIGVkaXRpb24tbW9kZSBbbm9uZSB8IGlubGluZSB8IGNsaWNrIHwgZGJsY2xpY2tdOiBlZGl0aW9uIG1vZGUuIERlZmF1bHQgbm9uZVxuICAnZWRpdGlvbk1vZGU6IGVkaXRpb24tbW9kZScsXG5cbiAgLy8gc2VsZWN0aW9uLW1vZGUgW25vbmUgfCBzaW1wbGUgfCBtdWx0aXBsZSBdOiBzZWxlY3Rpb24gbW9kZS4gRGVmYXVsdCBtdWx0aXBsZVxuICAnc2VsZWN0aW9uTW9kZTogc2VsZWN0aW9uLW1vZGUnLFxuXG4gICdob3Jpem9udGFsU2Nyb2xsOiBob3Jpem9udGFsLXNjcm9sbCcsXG5cbiAgJ3Nob3dQYWdpbmF0b3JGaXJzdExhc3RCdXR0b25zOiBzaG93LXBhZ2luYXRvci1maXJzdC1sYXN0LWJ1dHRvbnMnLFxuXG4gICdhdXRvQWxpZ25UaXRsZXM6IGF1dG8tYWxpZ24tdGl0bGVzJyxcblxuICAnbXVsdGlwbGVTb3J0OiBtdWx0aXBsZS1zb3J0JyxcbiAgLy8gc2VsZWN0LWFsbC1jaGVja2JveC12aXNpYmxlIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgc2VsZWN0aW9uIGNoZWNrIGJveGVzLkRlZmF1bHQ6IG5vLlxuICAnc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlOiBzZWxlY3QtYWxsLWNoZWNrYm94LXZpc2libGUnLFxuXG4gICdvcmRlcmFibGUnLFxuXG4gICdyZXNpemFibGUnLFxuXG4gICdrZWVwU2VsZWN0ZWRJdGVtczoga2VlcC1zZWxlY3RlZC1pdGVtcycsXG5cbiAgLy8gZXhwb3J0LW1vZGUgWyd2aXNpYmxlJ3wnbG9jYWwnfCdhbGwnXTogc2V0cyB0aGUgbW9kZSB0byBleHBvcnQgZGF0YS4gRGVmYXVsdDogJ3Zpc2libGUnXG4gICdleHBvcnRNb2RlOiBleHBvcnQtbW9kZScsXG5cbiAgLy8gZXhwb3J0U2VydmljZVR5cGUgWyBzdHJpbmcgXTogVGhlIHNlcnZpY2UgdXNlZCBieSB0aGUgdGFibGUgZm9yIGV4cG9ydGluZyBpdCdzIGRhdGEsIGl0IG11c3QgaW1wbGVtZW50ICdJRXhwb3J0U2VydmljZScgaW50ZXJmYWNlLiBEZWZhdWx0OiAnT250aW1pemVFeHBvcnRTZXJ2aWNlJ1xuICAnZXhwb3J0U2VydmljZVR5cGU6IGV4cG9ydC1zZXJ2aWNlLXR5cGUnLFxuXG4gIC8vIGF1dG8tYWRqdXN0IFt0cnVlfGZhbHNlXTogQXV0byBhZGp1c3QgY29sdW1uIHdpZHRoIHRvIGZpdCBpdHMgY29udGVudC4gRGVmYXVsdDogdHJ1ZVxuICAnYXV0b0FkanVzdDogYXV0by1hZGp1c3QnLFxuXG4gIC8vIHNob3ctZmlsdGVyLW9wdGlvbiBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IGZpbHRlciBtZW51IG9wdGlvbiBpbiB0aGUgaGVhZGVyIG1lbnUuIERlZmF1bHQ6IHllcy5cbiAgJ3Nob3dGaWx0ZXJPcHRpb246IHNob3ctZmlsdGVyLW9wdGlvbicsXG5cbiAgLy8gdmlzaWJsZS1leHBvcnQtZGlhbG9nLWJ1dHRvbnMgW3N0cmluZ106IHZpc2libGUgYnV0dG9ucyBpbiBleHBvcnQgZGlhbG9nLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0L25vIGNvbmZpZ3VyZWQ6IHNob3cgYWxsLiBFbXB0eSB2YWx1ZTogaGlkZSBhbGwuXG4gICd2aXNpYmxlRXhwb3J0RGlhbG9nQnV0dG9uczogdmlzaWJsZS1leHBvcnQtZGlhbG9nLWJ1dHRvbnMnLFxuXG4gIC8vIHJvdy1jbGFzcyBbZnVuY3Rpb24sIChyb3dEYXRhOiBhbnksIHJvd0luZGV4OiBudW1iZXIpID0+IHN0cmluZyB8IHN0cmluZ1tdXTogYWRkcyB0aGUgY2xhc3Mgb3IgY2xhc3NlcyByZXR1cm5lZCBieSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdG8gdGhlIHRhYmxlIHJvd3MuXG4gICdyb3dDbGFzczogcm93LWNsYXNzJyxcblxuICAvLyBmaWx0ZXItY29sdW1uLWFjdGl2ZS1ieS1kZWZhdWx0IFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgaWNvbiBmaWx0ZXIgYnkgZGVmYXVsdCBpbiB0aGUgdGFibGUuIERlZmF1bHQ6eWVzXG4gICdmaWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQ6ZmlsdGVyLWNvbHVtbi1hY3RpdmUtYnktZGVmYXVsdCcsXG5cbiAgLy8gZ3JvdXBlZC1jb2x1bW5zIFtzdHJpbmddOiBncm91cGVkIGNvbHVtbnMgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdncm91cGVkQ29sdW1uczogZ3JvdXBlZC1jb2x1bW5zJyxcblxuICAvLyBncm91cGFibGVbYm9vbGVhbl06IEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgY29sdW1uIGNhbiBiZSBncm91cGFibGUuIEJ5IGRlZmF1bHQ6IHRydWVcbiAgJ2dyb3VwYWJsZScsXG5cbiAgLy8gZXhwYW5kLWdyb3Vwcy1zYW1lLWxldmVsW2Jvb2xlYW5dOiBJbmRpY2F0ZXMgaWYgY2xpY2sgaW4gcm93IGV4cGFuZHMvY29sbGFwc2VzIGFsbCByb3dzIG9uIHNhbWUgbGV2ZWwuIEJ5IGRlZmF1bHQ6IHRydWVcbiAgJ2V4cGFuZEdyb3Vwc1NhbWVMZXZlbDogZXhwYW5kLWdyb3Vwcy1zYW1lLWxldmVsJyxcblxuICAvLyBjb2xsYXBzZS1ncm91cGVkLWNvbHVtbnMgW3llc3xub3x0cnVlfGZhbHNlXTogV2hldGhlciBjb2xsYXBzZSB0aGUgZ3JvdXBlZCBjb2x1bW5zIGJ5IGRlZmF1bHRcbiAgJ2NvbGxhcHNlR3JvdXBlZENvbHVtbnM6IGNvbGxhcHNlLWdyb3VwZWQtY29sdW1ucycsXG5cbiAgLy8gdmlydHVhbC1zY3JvbGwgW3llc3xub3x0cnVlfGZhbHNlXTogV2hldGhlciBlbmFibGVkIG9yIG5vdCB0aGUgdmlydHVhbCBzY3JvbGxcbiAgJ3ZpcnR1YWxTY3JvbGw6IHZpcnR1YWwtc2Nyb2xsJyxcblxuICAvL2NvbnRleHQtbWVudSBbeWVzfG5vfHRydWV8ZmFsc2VdOiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgdGFibGUgY29udGV4dCBtZW51XG4gICdjb250ZXh0TWVudTogY29udGV4dC1tZW51JyxcblxuICAvLyBzaG93LWV4cGFuZGFibGUtaWNvbi1mdW5jdGlvbiBbZnVuY3Rpb25dOiBFeHBhbmRhYmxlIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGV4cGFuZGFibGUgaGFzIGRhdGEgdG8gc2hvdyBvciBub3QgaWNvblxuICAnc2hvd0V4cGFuZGFibGVJY29uRnVuY3Rpb246IHNob3ctZXhwYW5kYWJsZS1pY29uLWZ1bmN0aW9uJyxcblxuICAvLyBzaG93LXJlcG9ydC1vbi1kZW1hbmQtb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgcmVwb3J0IG9uIGRlbWFuZCBvcHRpb24gaW4gdGhlIHRhYmxlIG1lbnUuIERlZmF1bHQ6IHllcy5cbiAgJ3Nob3dSZXBvcnRPbkRlbWFuZE9wdGlvbjogc2hvdy1yZXBvcnQtb24tZGVtYW5kLW9wdGlvbicsXG5cbiAgLy8gc2hvdy1jaGFydHMtb24tZGVtYW5kLW9wdGlvbiBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IGNoYXJ0cyBvbiBkZW1hbmQgb3B0aW9uIGluIHRoZSBoZWFkZXIgbWVudVxuICAnc2hvd0NoYXJ0c09uRGVtYW5kT3B0aW9uOiBzaG93LWNoYXJ0cy1vbi1kZW1hbmQtb3B0aW9uJyxcblxuICAvLyBzaG93LXJlc2V0LXdpZHRoLW9wdGlvbiBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IHJlc2V0IHdpZHRoIG1lbnUgb3B0aW9uIGluIHRoZSBoZWFkZXIgbWVudVxuICAnc2hvd1Jlc2V0V2lkdGhPcHRpb246IHNob3ctcmVzZXQtd2lkdGgtb3B0aW9uJyxcblxuICAnZGlzYWJsZVNlbGVjdGlvbkZ1bmN0aW9uOiBkaXNhYmxlLXNlbGVjdGlvbi1mdW5jdGlvbicsXG5cbiAgJ25vbkhpZGFibGVDb2x1bW5zOiBub24taGlkYWJsZS1jb2x1bW5zJyxcbiAgJ3JlYWRPbmx5OiByZWFkLW9ubHknLFxuICAncmVhZE9ubHlDb25maWd1cmF0aW9uOiByZWFkLW9ubHktY29uZmlndXJhdGlvbicsXG4gICdzaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seTogc2hvdy1ub3RpZmljYXRpb24tb2YtcmVhZC1vbmx5JyxcbiAgLy8gc2VsZWN0aW9uLW9uLXJvdy1jbGljayBbeWVzfG5vfHRydWV8ZmFsc2VdOiAuIERlZmF1bHQ6IHllcy5cbiAgJ3NlbGVjdGlvbk9uUm93Q2xpY2s6IHNlbGVjdGlvbi1vbi1yb3ctY2xpY2snXG5dO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PVVRQVVRTX09fVEFCTEUgPSBbXG4gICdvblJvd1NlbGVjdGVkJyxcbiAgJ29uUm93RGVzZWxlY3RlZCcsXG4gICdvblJvd0RlbGV0ZWQnLFxuICAnb25GaWx0ZXJCeUNvbHVtbkNoYW5nZScsXG4gICdvblNvcnRDaGFuZ2UnLFxuICAnb25TZWFyY2gnXG5dO1xuXG5jb25zdCBzdGlja3lIZWFkZXJTZWxlY3RvciA9ICcubWF0LW1kYy1oZWFkZXItcm93IC5tYXQtbWRjLXRhYmxlLXN0aWNreSc7XG5jb25zdCBzdGlja3lGb290ZXJTZWxlY3RvciA9ICcubWF0LW1kYy1mb290ZXItcm93IC5tYXQtbWRjLXRhYmxlLXN0aWNreSc7XG5jb25zdCByb3dTZWxlY3RvciA9ICcubWF0LW1kYy1yb3cnO1xuY29uc3QgaGVhZGVyU2VsZWN0b3IgPSAnLm1hdC1tZGMtaGVhZGVyLXJvdyc7XG5jb25zdCBmb290ZXJTZWxlY3RvciA9ICcubWF0LW1kYy1oZWFkZXItcm93JztcblxudHlwZSBEaXNhYmxlU2VsZWN0aW9uRnVuY3Rpb24gPSAoaXRlbTogYW55KSA9PiBib29sZWFuO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL28tdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIE9udGltaXplU2VydmljZVByb3ZpZGVyLFxuICAgIENvbXBvbmVudFN0YXRlU2VydmljZVByb3ZpZGVyLFxuICAgIE9UYWJsZURhdGFTb3VyY2VTZXJ2aWNlLFxuICAgIE9UYWJsZUZpbHRlckJ5Q29sdW1uU2VydmljZSxcbiAgICB7IHByb3ZpZGU6IE9fQ09NUE9ORU5UX1NUQVRFX1NFUlZJQ0UsIHVzZUNsYXNzOiBPVGFibGVDb21wb25lbnRTdGF0ZVNlcnZpY2UgfSxcbiAgICB7IHByb3ZpZGU6IFZJUlRVQUxfU0NST0xMX1NUUkFURUdZLCB1c2VDbGFzczogT1RhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5IH0sXG4gICAgeyBwcm92aWRlOiBPVGFibGVCYXNlLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPVGFibGVDb21wb25lbnQpIH0sXG4gICAgT1RhYmxlTG9hZGluZ1NlcnZpY2VcbiAgXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQnLCBzdHlsZSh7IGhlaWdodDogJzBweCcsIG1pbkhlaWdodDogJzAnIH0pKSxcbiAgICAgIHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpLFxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcbiAgICBdKVxuICBdLFxuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fVEFCTEUsXG4gIG91dHB1dHM6IERFRkFVTFRfT1VUUFVUU19PX1RBQkxFLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Muby10YWJsZV0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5vbnRpbWl6ZS10YWJsZV0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5vLXRhYmxlLWZpeGVkXSc6ICdmaXhlZEhlYWRlcicsXG4gICAgJ1tjbGFzcy5vLXRhYmxlLWRpc2FibGVkXSc6ICchZW5hYmxlZCcsXG4gICAgJyhkb2N1bWVudDpjbGljayknOiAnaGFuZGxlRE9NQ2xpY2soJGV2ZW50KSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBPVGFibGVDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdE9TZXJ2aWNlQ29tcG9uZW50PE9UYWJsZUNvbXBvbmVudFN0YXRlU2VydmljZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9CQVNFX1NJWkVfU1BJTk5FUiA9IDEwMDtcbiAgcHVibGljIHN0YXRpYyBGSVJTVF9MQVNUX0NFTExfUEFERElORyA9IDI0O1xuICBwdWJsaWMgc3RhdGljIEVYUEFOREVEX1JPV19DT05UQUlORVJfQ0xBU1MgPSAnZXhwYW5kZWQtcm93LWNvbnRhaW5lci0nO1xuICBwdWJsaWMgc3RhdGljIEFWQUlMQUJMRV9HUk9VUElOR19DT0xVTU5TX1JFTkRFUkVSUyA9IFsnY3VycmVuY3knLCAnaW50ZWdlcicsICdyZWFsJ107XG5cbiAgcHVibGljIERFVEFJTF9NT0RFX05PTkUgPSBDb2Rlcy5ERVRBSUxfTU9ERV9OT05FO1xuICBwdWJsaWMgRURJVF9NT0RFX05PTkUgPSBDb2Rlcy5FRElUSU9OX01PREVfTk9ORTtcblxuICBwcm90ZWN0ZWQgc25hY2tCYXJTZXJ2aWNlOiBTbmFja0JhclNlcnZpY2U7XG5cbiAgcHVibGljIHBhZ2luYXRvcjogT1RhYmxlUGFnaW5hdG9yO1xuXG4gIHNvcnQ6IE9NYXRTb3J0O1xuICBjbGlja1N1YmplY3QgPSBuZXcgU3ViamVjdDx7IHJvdzogYW55LCBjb2x1bW46IGFueSwgY2VsbFJlZjogYW55LCByb3dJbmRleDogbnVtYmVyLCBldmVudDogTW91c2VFdmVudCB9PigpO1xuICBkYmxjbGlja1N1YmplY3QgPSBuZXcgU3ViamVjdDx7IHJvdzogYW55LCBjb2x1bW46IGFueSwgY2VsbFJlZjogYW55LCByb3dJbmRleDogbnVtYmVyLCBldmVudDogTW91c2VFdmVudCB9PigpO1xuICBwcm90ZWN0ZWQgY2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBkYkNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgcm93Q2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHJlZnJlc2hFeHBhbmRhYmxlUm93U3RhdGUgPSBmYWxzZTtcblxuICBsb2FkaW5nU2VydmljZTogT1RhYmxlTG9hZGluZ1NlcnZpY2U7XG5cbiAgQFZpZXdDaGlsZChPTWF0U29ydClcbiAgc2V0IG9NYXRTb3J0KF9zb3J0OiBPTWF0U29ydCkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChfc29ydCkgJiZcbiAgICAgICghVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSB8fCAoVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSAmJiBVdGlsLnN0cmluZ2lmeSh0aGlzLnNvcnQpICE9PSBVdGlsLnN0cmluZ2lmeShfc29ydCkpKSkge1xuICAgICAgdGhpcy5zb3J0ID0gX3NvcnQ7XG4gICAgICB0aGlzLnNldERhdGFzb3VyY2UoKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHZpcnR1YWxTY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuXG4gIHB1YmxpYyBvVGFibGVHbG9iYWxDb25maWc6IE9UYWJsZUdsb2JhbENvbmZpZztcbiAgQFZpZXdDaGlsZCgndmlydHVhbFNjcm9sbFZpZXdQb3J0Jykgc2V0IGNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCh2YWx1ZTogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgaWYgKHZhbHVlICE9IHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJBbmRGb290ZXJTdGlja3lQb3NpdGlvbnMoKTtcbiAgICAgIGlmICh0aGlzLmNoZWNrVmlld3BvcnRTaXplU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24gPSB0aGlzLmNoZWNrVmlld1BvcnRTdWJqZWN0LnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gb25seSBmb3IgaW5zaWRlVGFiQnVnV29ya2Fyb3VuZFxuICBwcm90ZWN0ZWQgdGFibGVIZWFkZXJzOiBBcnJheTxPVGFibGVIZWFkZXJDb21wb25lbnQ+ID0gW107XG5cbiAgQFZpZXdDaGlsZCgnc3Bpbm5lckNvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBzcGlubmVyQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoT1RhYmxlUm93RXhwYW5kYWJsZUNvbXBvbmVudClcbiAgdGFibGVSb3dFeHBhbmRhYmxlOiBPVGFibGVSb3dFeHBhbmRhYmxlQ29tcG9uZW50O1xuXG4gIF9maWx0ZXJDb2x1bW5zOiBBcnJheTxPRmlsdGVyQ29sdW1uPjtcbiAgcG9ydGFsSG9zdDogQXJyYXk8RG9tUG9ydGFsT3V0bGV0PiA9IFtdO1xuICBvbkRhdGFMb2FkZWRDZWxsUmVuZGVyZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgdGFibGVDb250ZXh0TWVudTogT0NvbnRleHRNZW51Q29tcG9uZW50O1xuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzZWxlY3RBbGxDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZXhwb3J0QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dDb25maWd1cmF0aW9uT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGNvbHVtbnNWaXNpYmlsaXR5QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dGaWx0ZXJPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dDaGFydHNPbkRlbWFuZE9wdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93QnV0dG9uc1RleHQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dSZXNldFdpZHRoT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2VsZWN0aW9uT25Sb3dDbGljazogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy8gRXhwYW5kYWJsZSBpbnB1dCBjYWxsYmFjayBmdW5jdGlvblxuICBzaG93RXhwYW5kYWJsZUljb25GdW5jdGlvbjogKHJvdzogYW55LCByb3dJbmRleDogbnVtYmVyKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgcmVhZE9ubHlGdW5jdGlvbjogKGNvbmZpZ3VyYXRpb246IGFueSkgPT4gYm9vbGVhbjtcbiAgcmVhZE9ubHlDb25maWd1cmF0aW9uOiBhbnk7XG5cbiAgaXNDb21wb25lbnRSZWFkT25seShzZWxlY3Rvcjogc3RyaW5nLCBhdHRyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkT25seUNvbmZpZ3VyYXRpb24/LltzZWxlY3Rvcl0/LlthdHRyXTtcbiAgfVxuICBwcm90ZWN0ZWQgX29UYWJsZU9wdGlvbnM6IE9UYWJsZU9wdGlvbnM7XG5cbiAgZ2V0IG9UYWJsZU9wdGlvbnMoKTogT1RhYmxlT3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuX29UYWJsZU9wdGlvbnM7XG4gIH1cblxuICBzZXQgb1RhYmxlT3B0aW9ucyh2YWx1ZTogT1RhYmxlT3B0aW9ucykge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuXG4gIHNldCBxdWlja0ZpbHRlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHZhbHVlID0gVXRpbC5wYXJzZUJvb2xlYW4oU3RyaW5nKHZhbHVlKSk7XG4gICAgdGhpcy5fcXVpY2tGaWx0ZXIgPSB2YWx1ZTtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmZpbHRlciA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHF1aWNrRmlsdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9xdWlja0ZpbHRlcjtcbiAgfVxuXG4gIHNldCBmaWx0ZXJDYXNlU2Vuc2l0aXZlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZmlsdGVyQ2FzZVNlbnNpdGl2ZSA9IEJvb2xlYW5Db252ZXJ0ZXIodmFsdWUpO1xuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmZpbHRlckNhc2VTZW5zaXRpdmUgPSB0aGlzLl9maWx0ZXJDYXNlU2Vuc2l0aXZlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmaWx0ZXJDYXNlU2Vuc2l0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJDYXNlU2Vuc2l0aXZlO1xuICB9XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGluc2VydEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICByZWZyZXNoQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGRlbGV0ZUJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBmaXhlZEhlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93VGl0bGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZWRpdGlvbk1vZGU6IHN0cmluZyA9IENvZGVzLkVESVRJT05fTU9ERV9OT05FO1xuICBzZWxlY3Rpb25Nb2RlOiBzdHJpbmcgPSBDb2Rlcy5TRUxFQ1RJT05fTU9ERV9NVUxUSVBMRTtcblxuICBwcm90ZWN0ZWQgX2hvcml6b250YWxTY3JvbGwgPSBmYWxzZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNldCBob3Jpem9udGFsU2Nyb2xsKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faG9yaXpvbnRhbFNjcm9sbCA9IEJvb2xlYW5Db252ZXJ0ZXIodmFsdWUpO1xuICAgIHRoaXMucmVmcmVzaENvbHVtbnNXaWR0aEZyb21PcmlnaW5hbERlZmluaXRpb24oKTtcbiAgfVxuXG4gIGdldCBob3Jpem9udGFsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9ob3Jpem9udGFsU2Nyb2xsO1xuICB9XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dQYWdpbmF0b3JGaXJzdExhc3RCdXR0b25zOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGF1dG9BbGlnblRpdGxlczogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBtdWx0aXBsZVNvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgb3JkZXJhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHJlc2l6YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBhdXRvQWRqdXN0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGdyb3VwYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBleHBhbmRHcm91cHNTYW1lTGV2ZWw6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgY29sbGFwc2VHcm91cGVkQ29sdW1uczogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgdmlydHVhbFNjcm9sbDogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBjb250ZXh0TWVudTogYm9vbGVhbiA9IHRydWU7XG4gIC8vIE1haW50YWluaW5nIHRoaXMgZ2V0dGVyIHRvIGFsbG93IGNvbXBvbmVudCBleHRlbnNpb25zIChhdm9pZGluZyBhIGJyZWFraW5nIGNoYW5nZSlcbiAgZ2V0IGVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub2VuYWJsZWQ7XG4gIH1cbiAgcHJvdGVjdGVkIF9zZWxlY3RBbGxDaGVja2JveFZpc2libGU6IGJvb2xlYW47XG4gIHNldCBzZWxlY3RBbGxDaGVja2JveFZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zZWxlY3RBbGxDaGVja2JveFZpc2libGUgPSBCb29sZWFuQ29udmVydGVyKHZhbHVlKTtcbiAgICBpZiAodGhpcy5zdGF0ZSkge1xuICAgICAgdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlID0gQm9vbGVhbkNvbnZlcnRlcih0aGlzLnN0YXRlLnNlbGVjdENvbHVtblZpc2libGUpO1xuICAgIH1cbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlID0gdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94Q29sdW1uKCk7XG4gIH1cblxuICBnZXQgc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RBbGxDaGVja2JveFZpc2libGU7XG4gIH1cblxuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAga2VlcFNlbGVjdGVkSXRlbXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHB1YmxpYyBleHBvcnRNb2RlOiBzdHJpbmcgPSBDb2Rlcy5FWFBPUlRfTU9ERV9WSVNJQkxFO1xuICBwdWJsaWMgZXhwb3J0U2VydmljZVR5cGU6IHN0cmluZztcbiAgcHVibGljIHZpc2libGVFeHBvcnREaWFsb2dCdXR0b25zOiBzdHJpbmc7XG4gIHB1YmxpYyBkYW9UYWJsZTogT1RhYmxlRGFvIHwgbnVsbDtcbiAgcHVibGljIGRhdGFTb3VyY2U6IE9UYWJsZURhdGFTb3VyY2UgfCBudWxsO1xuICBwdWJsaWMgdmlzaWJsZUNvbHVtbnM6IHN0cmluZztcbiAgcHVibGljIHNlYXJjaGVhYmxlQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIGRlZmF1bHRWaXNpYmxlQ29sdW1uczogc3RyaW5nO1xuICBwdWJsaWMgZ3JvdXBlZENvbHVtbnM6IHN0cmluZztcbiAgcHVibGljIG5vbkhpZGFibGVDb2x1bW5zOiBzdHJpbmc7XG5cbiAgcHVibGljIHNvcnRDb2x1bW5zOiBzdHJpbmc7XG4gIHB1YmxpYyBncm91cGVkQ29sdW1uVHlwZXM6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSA9IFtdO1xuICBwdWJsaWMgcm93Q2xhc3M6IChyb3dEYXRhOiBhbnksIHJvd0luZGV4OiBudW1iZXIpID0+IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qcGFyc2VkIGlucHV0cyB2YXJpYWJsZXMgKi9cbiAgcHJvdGVjdGVkIF92aXNpYmxlQ29sQXJyYXk6IHN0cmluZ1tdID0gW107XG5cbiAgZ2V0IHZpc2libGVDb2xBcnJheSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVDb2xBcnJheTtcbiAgfVxuXG4gIHNldCB2aXNpYmxlQ29sQXJyYXkoYXJnOiBhbnlbXSkge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zQmxvY2tlZCA9IHRoaXMucGVybWlzc2lvbnM/LmNvbHVtbnM/LmZpbHRlcihjb2wgPT4gY29sLnZpc2libGUgPT09IGZhbHNlKS5tYXAoY29sID0+IGNvbC5hdHRyKSA/PyBbXTtcbiAgICBjb25zdCBwZXJtaXNzaW9uc0NoZWNrZWQgPSBhcmcuZmlsdGVyKHZhbHVlID0+IHBlcm1pc3Npb25zQmxvY2tlZC5pbmRleE9mKHZhbHVlKSA9PT0gLTEpO1xuXG4gICAgdGhpcy5fdmlzaWJsZUNvbEFycmF5ID0gcGVybWlzc2lvbnNDaGVja2VkO1xuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zKSB7XG4gICAgICBjb25zdCBjb250YWluc1NlbGVjdGlvbkNvbCA9IHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuaW5kZXhPZihDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QpICE9PSAtMTtcbiAgICAgIGNvbnN0IGNvbnRhaW5zRXhwYW5kYWJsZUNvbCA9IHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuaW5kZXhPZihDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFKSAhPT0gLTE7XG4gICAgICBpZiAoY29udGFpbnNTZWxlY3Rpb25Db2wpIHtcbiAgICAgICAgdGhpcy5fdmlzaWJsZUNvbEFycmF5LnVuc2hpZnQoQ29kZXMuTkFNRV9DT0xVTU5fU0VMRUNUKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250YWluc1NlbGVjdGlvbkNvbCAmJiBjb250YWluc0V4cGFuZGFibGVDb2wpIHtcbiAgICAgICAgdGhpcy5fdmlzaWJsZUNvbEFycmF5ID0gW3RoaXMuX3Zpc2libGVDb2xBcnJheVswXV0uY29uY2F0KENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUsIHRoaXMuX3Zpc2libGVDb2xBcnJheS5zcGxpY2UoMSkpO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGFpbnNFeHBhbmRhYmxlQ29sKSB7XG4gICAgICAgICAgdGhpcy5fdmlzaWJsZUNvbEFycmF5LnVuc2hpZnQoQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLl92aXNpYmxlQ29sQXJyYXk7XG4gICAgICB0aGlzLmdyb3VwaW5nSGVhZGVyc1Jvd3MgPSB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLm1hcCh2aXNpYmxlQ29sID0+ICdncm91cEhlYWRlci0nICsgdmlzaWJsZUNvbCk7XG4gICAgfVxuICB9XG5cbiAgc29ydENvbEFycmF5OiBTUUxPcmRlcltdID0gW107XG4gIC8qZW5kIG9mIHBhcnNlZCBpbnB1dHMgdmFyaWFibGVzICovXG5cbiAgcHJvdGVjdGVkIHRhYkdyb3VwQ29udGFpbmVyOiBNYXRUYWJHcm91cDtcbiAgcHJvdGVjdGVkIHRhYkNvbnRhaW5lcjogTWF0VGFiO1xuICB0YWJHcm91cENoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByb3RlY3RlZCBwZW5kaW5nUXVlcnk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHBlbmRpbmdRdWVyeUZpbHRlciA9IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgc2V0U3RhdGljRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgYXZvaWRRdWVyeUNvbHVtbnM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJvdGVjdGVkIGFzeW5jTG9hZENvbHVtbnM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJvdGVjdGVkIGFzeW5jTG9hZFN1YnNjcmlwdGlvbnM6IG9iamVjdCA9IHt9O1xuXG4gIHByb3RlY3RlZCBxdWVyeVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgY29udGV4dE1lbnVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIHZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIGNoZWNrVmlld3BvcnRTaXplU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBmaW5pc2hRdWVyeVN1YnNjcmlwdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBvblJvd1NlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uUm93RGVzZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvblJvd0RlbGV0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25SZWluaXRpYWxpemU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25Db250ZW50Q2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uRmlsdGVyQnlDb2x1bW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxDb2x1bW5GaWx0ZXJDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvblNvcnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxTUUxPcmRlcltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcm90ZWN0ZWQgc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHVibGljIG9UYWJsZUZpbHRlckJ5Q29sdW1uRGF0YURpYWxvZ0NvbXBvbmVudDogT1RhYmxlRmlsdGVyQnlDb2x1bW5EYXRhRGlhbG9nQ29tcG9uZW50O1xuICBwdWJsaWMgb1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudDogT1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dUb3RhbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBzaG93VG90YWxzOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zaG93VG90YWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nU29ydGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmdTb3J0aW5nOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5sb2FkaW5nU29ydGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1Njcm9sbFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGxvYWRpbmdTY3JvbGw6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmxvYWRpbmdTY3JvbGxTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHB1YmxpYyBzaG93TG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBwdWJsaWMgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudDogT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudDtcbiAgcHVibGljIHNob3dGaXJzdEluc2VydGFibGVSb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNob3dMYXN0SW5zZXJ0YWJsZVJvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZXhwYW5kYWJsZUl0ZW06IFNlbGVjdGlvbk1vZGVsPGFueT47XG5cbiAgcHJvdGVjdGVkIGNsaWNrVGltZXI7XG4gIHByb3RlY3RlZCBjbGlja0RlbGF5ID0gMjAwO1xuICBwcm90ZWN0ZWQgY2xpY2tQcmV2ZW50ID0gZmFsc2U7XG4gIHB1YmxpYyBlZGl0aW5nQ2VsbDogYW55O1xuICBwcm90ZWN0ZWQgZWRpdGluZ1JvdzogYW55O1xuXG4gIHNldCBjdXJyZW50UGFnZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gdmFsO1xuICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gdmFsO1xuICAgICAgaWYgKHRoaXMubWF0cGFnaW5hdG9yKSB7XG4gICAgICAgIHRoaXMubWF0cGFnaW5hdG9yLnBhZ2VJbmRleCA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gIH1cblxuICBwdWJsaWMgb1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQ6IE9UYWJsZVF1aWNrZmlsdGVyO1xuICBwcm90ZWN0ZWQgc29ydFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgb25SZW5kZXJlZERhdGFDaGFuZ2U6IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIHByZXZpb3VzUmVuZGVyZXJEYXRhO1xuXG4gIHF1aWNrRmlsdGVyQ2FsbGJhY2s6IFF1aWNrRmlsdGVyRnVuY3Rpb247XG4gIGRpc2FibGVTZWxlY3Rpb25GdW5jdGlvbjogRGlzYWJsZVNlbGVjdGlvbkZ1bmN0aW9uO1xuXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQm9keScpXG4gIHByb3RlY3RlZCB0YWJsZUJvZHlFbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGFibGVIZWFkZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgdGFibGVIZWFkZXJFbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGFibGVUb29sYmFyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHRhYmxlVG9vbGJhckVsOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGRyZW4oTWF0Um93KSByb3dzITogUXVlcnlMaXN0PE1hdFJvdz47XG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUpIHByb3RlY3RlZCBtYXRUYWJsZTogTWF0VGFibGU8YW55PjtcblxuICBob3Jpem9udGFsU2Nyb2xsZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBvblVwZGF0ZVNjcm9sbGVkU3RhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgcm93V2lkdGg7XG5cbiAgc3RvcmVQYWdpbmF0aW9uU3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiBJbiB0aGUgY2FzZSB0aGUgdGFibGUgaGF2ZW50IHBhZ2luYXRpb25Db250cm9sIGFuZCBwYWdlYWJsZSwgdGhlIHRhYmxlIGhhcyBwYWdpbmF0aW9uIHZpcnR1YWwqL1xuICBwYWdlU2Nyb2xsVmlydHVhbCA9IDE7XG5cbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1JPV19IRUlHSFQgPSAzNjtcbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zOiBPVGFibGVQZXJtaXNzaW9ucztcbiAgbWF0TWVudTogTWF0TWVudTtcblxuICBAVmlld0NoaWxkKCd0YWJsZU1lbnUnKVxuICBvVGFibGVNZW51OiBPVGFibGVNZW51O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oT1RhYmxlT3B0aW9uQ29tcG9uZW50KVxuICB0YWJsZU9wdGlvbnM6IFF1ZXJ5TGlzdDxPVGFibGVPcHRpb25Db21wb25lbnQ+O1xuXG4gIG9UYWJsZUJ1dHRvbnM6IE9UYWJsZUJ1dHRvbnM7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihPVGFibGVCdXR0b25Db21wb25lbnQpXG4gIHRhYmxlQnV0dG9uczogUXVlcnlMaXN0PE9UYWJsZUJ1dHRvbj47XG5cbiAgQENvbnRlbnRDaGlsZCgnby10YWJsZS1xdWlja2ZpbHRlcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHF1aWNrZmlsdGVyQ29udGVudENoaWxkOiBPVGFibGVRdWlja2ZpbHRlcjtcblxuXG4gIEBDb250ZW50Q2hpbGRyZW4oT1RhYmxlRXhwb3J0QnV0dG9uQ29tcG9uZW50KVxuICBleHBvcnRPcHRzVGVtcGxhdGU6IFF1ZXJ5TGlzdDxPVGFibGVFeHBvcnRCdXR0b25Db21wb25lbnQ+XG5cbiAgQENvbnRlbnRDaGlsZChPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmUpXG4gIHRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkOiBPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmU7XG4vLyBUbyBzYXZlIHNjcm9sbCBwb3NpdGlvbiB3aGVuIHJlbG9hZGluZyBkYXRhXG4gIHByaXZhdGUgc2F2ZWRTY3JvbGxQb3NpdGlvbjogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgZ3JvdXBlZENvbHVtbnNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFtdKVxuICB1cGRhdGVTY3JvbGxlZFN0YXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvcml6b250YWxTY3JvbGwpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBib2R5V2lkdGggPSB0aGlzLnRhYmxlQm9keUVsLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gdGhpcy50YWJsZUJvZHlFbC5uYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgICBjb25zdCBwcmV2aW91c1N0YXRlID0gdGhpcy5ob3Jpem9udGFsU2Nyb2xsZWQ7XG4gICAgICAgIHRoaXMuaG9yaXpvbnRhbFNjcm9sbGVkID0gc2Nyb2xsV2lkdGggPiBib2R5V2lkdGg7XG4gICAgICAgIGlmIChwcmV2aW91c1N0YXRlICE9PSB0aGlzLmhvcml6b250YWxTY3JvbGxlZCkge1xuICAgICAgICAgIHRoaXMub25VcGRhdGVTY3JvbGxlZFN0YXRlLmVtaXQodGhpcy5ob3Jpem9udGFsU2Nyb2xsZWQpO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9pc0NvbHVtbkZpbHRlcnNBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBnZXQgaXNDb2x1bW5GaWx0ZXJzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0NvbHVtbkZpbHRlcnNBY3RpdmU7XG4gIH1cblxuICBzZXQgaXNDb2x1bW5GaWx0ZXJzQWN0aXZlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzQ29sdW1uRmlsdGVyc0FjdGl2ZSA9IHZhbDtcbiAgfVxuXG4gIGdyb3VwaW5nSGVhZGVyc1Jvd3M6IHN0cmluZ1tdID0gW107XG5cbiAgcHVibGljIG9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudDogT1RhYmxlQ29sdW1uc0dyb3VwaW5nO1xuXG4gIEBDb250ZW50Q2hpbGQoT1RhYmxlQ29udGV4dE1lbnVDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNvbnRleHRNZW51Q29udGVudENoaWxkOiBPVGFibGVDb250ZXh0TWVudUNvbXBvbmVudDtcblxuICBwcm90ZWN0ZWQgdHJpZ2dlclNlbGVjdGlvbkV2ZW50czogYm9vbGVhbiA9IHRydWU7XG5cbiAgQFZpZXdDaGlsZHJlbihNYXRUb29sdGlwKVxuICB0b29sdGlwOiBRdWVyeUxpc3Q8TWF0VG9vbHRpcD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBlbFJlZjogRWxlbWVudFJlZixcbiAgICBwcm90ZWN0ZWQgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IE9Gb3JtQ29tcG9uZW50KSkgZm9ybTogT0Zvcm1Db21wb25lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSkgcHVibGljIHJlYWRvbmx5IHNjcm9sbFN0cmF0ZWd5OiBPVGFibGVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3lcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IsIGVsUmVmLCBmb3JtKTtcbiAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoT1RhYmxlTG9hZGluZ1NlcnZpY2UpO1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3Quc3Vic2NyaWJlKChsb2FkaW5nOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNldExvYWRpbmcobG9hZGluZyk7XG4gICAgfSk7XG4gICAgdGhpcy5zaG93TG9hZGluZyA9IHRoaXMubG9hZGluZ1NlcnZpY2Uuc2hvd0xvYWRpbmckO1xuXG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucyA9IG5ldyBEZWZhdWx0T1RhYmxlT3B0aW9ucygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudGFiR3JvdXBDb250YWluZXIgPSB0aGlzLmluamVjdG9yLmdldChNYXRUYWJHcm91cCk7XG4gICAgICB0aGlzLnRhYkNvbnRhaW5lciA9IHRoaXMuaW5qZWN0b3IuZ2V0KE1hdFRhYik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvIG5vdGhpbmcgZHVlIHRvIG5vdCBhbHdheXMgaXMgY29udGFpbmVkIG9uIHRhYi5cbiAgICB9XG5cbiAgICB0aGlzLnNuYWNrQmFyU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KFNuYWNrQmFyU2VydmljZSk7XG4gICAgdGhpcy5nZXRJbmplY3Rpb25Ub2tlbkNvbmZpZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbmplY3Rpb25Ub2tlbkNvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb1RhYmxlR2xvYmFsQ29uZmlnID0gdGhpcy5pbmplY3Rvci5nZXQoT19UQUJMRV9HTE9CQUxfQ09ORklHKTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuYXV0b0FkanVzdCkpIHtcbiAgICAgICAgdGhpcy5hdXRvQWRqdXN0ID0gb1RhYmxlR2xvYmFsQ29uZmlnLmF1dG9BZGp1c3Q7XG4gICAgICB9O1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5hdXRvQWxpZ25UaXRsZXMpKSB7XG4gICAgICAgIHRoaXMuYXV0b0FsaWduVGl0bGVzID0gb1RhYmxlR2xvYmFsQ29uZmlnLmF1dG9BbGlnblRpdGxlcztcbiAgICAgIH1cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0KSkge1xuICAgICAgICB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdCA9IG9UYWJsZUdsb2JhbENvbmZpZy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLmVkaXRpb25Nb2RlKSAmJiBDb2Rlcy5pc1ZhbGlkRWRpdGlvbk1vZGUob1RhYmxlR2xvYmFsQ29uZmlnLmVkaXRpb25Nb2RlKSkge1xuICAgICAgICB0aGlzLmVkaXRpb25Nb2RlID0gb1RhYmxlR2xvYmFsQ29uZmlnLmVkaXRpb25Nb2RlO1xuICAgICAgfVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5kZXRhaWxNb2RlICYmIENvZGVzLmlzVmFsaWREZXRhaWxNb2RlKG9UYWJsZUdsb2JhbENvbmZpZy5kZXRhaWxNb2RlKSkpIHtcbiAgICAgICAgdGhpcy5kZXRhaWxNb2RlID0gb1RhYmxlR2xvYmFsQ29uZmlnLmRldGFpbE1vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcucm93SGVpZ2h0KSAmJiBDb2Rlcy5pc1ZhbGlkUm93SGVpZ2h0KG9UYWJsZUdsb2JhbENvbmZpZy5yb3dIZWlnaHQpKSB7XG4gICAgICAgIHRoaXMucm93SGVpZ2h0ID0gb1RhYmxlR2xvYmFsQ29uZmlnLnJvd0hlaWdodDtcbiAgICAgIH07XG5cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuc2hvd0NoYXJ0c09uRGVtYW5kT3B0aW9uKSkge1xuICAgICAgICB0aGlzLnNob3dDaGFydHNPbkRlbWFuZE9wdGlvbiA9IG9UYWJsZUdsb2JhbENvbmZpZy5zaG93Q2hhcnRzT25EZW1hbmRPcHRpb247XG4gICAgICB9O1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5zaG93UmVwb3J0T25EZW1hbmRPcHRpb24pKSB7XG4gICAgICAgIHRoaXMuc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uID0gb1RhYmxlR2xvYmFsQ29uZmlnLnNob3dSZXBvcnRPbkRlbWFuZE9wdGlvbjtcbiAgICAgIH07XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLnNlbGVjdGlvbk9uUm93Q2xpY2spKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uT25Sb3dDbGljayA9IG9UYWJsZUdsb2JhbENvbmZpZy5zZWxlY3Rpb25PblJvd0NsaWNrO1xuICAgICAgfVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5ob3Jpem9udGFsU2Nyb2xsKSkge1xuICAgICAgICB0aGlzLmhvcml6b250YWxTY3JvbGwgPSBvVGFibGVHbG9iYWxDb25maWcuaG9yaXpvbnRhbFNjcm9sbDtcbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEbyBub3RoaW5nIGJlY2F1c2UgaXMgb3B0aW9uYWxcbiAgICB9XG5cbiAgfVxuXG4gIGdldCBzdGF0ZSgpOiBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2Uuc3RhdGU7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICBpZiAodGhpcy5vVGFibGVCdXR0b25zICYmIHRoaXMudGFibGVCdXR0b25zICYmIHRoaXMudGFibGVCdXR0b25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMub1RhYmxlQnV0dG9ucy5yZWdpc3RlckJ1dHRvbnModGhpcy50YWJsZUJ1dHRvbnMudG9BcnJheSgpKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc3VwZXIuYWZ0ZXJWaWV3SW5pdCgpO1xuICAgIHRoaXMuaW5pdFRhYmxlQWZ0ZXJWaWV3SW5pdCgpO1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMubWF0TWVudSA9IHRoaXMub1RhYmxlTWVudS5tYXRNZW51O1xuICAgICAgdGhpcy5vVGFibGVNZW51LnJlZ2lzdGVyT3B0aW9ucyh0aGlzLnRhYmxlT3B0aW9ucy50b0FycmF5KCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSkge1xuICAgICAgdGhpcy5leHBhbmRhYmxlSXRlbSA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRoaXMudGFibGVSb3dFeHBhbmRhYmxlLm11bHRpcGxlLCBbXSwgdHJ1ZSwgdGhpcy5jb21wYXJlUm93KCkpO1xuICAgICAgdGhpcy5jcmVhdGVFeHBhbmRhYmxlQ29sdW1uKCk7XG4gICAgICB0aGlzLmV4cGFuZGFibGVJdGVtLmNoYW5nZWQuc3Vic2NyaWJlKChjaGFuZ2UpID0+IHtcbiAgICAgICAgdGhpcy5zYXZlUm93RXhwYW5kU3RhdGUoY2hhbmdlLmFkZGVkLCBjaGFuZ2UucmVtb3ZlZCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5yb3dDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnJvd3MuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVUYWJsZURhdGFDaGFuZ2UoKTtcbiAgICB9KTtcblxuXG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgaWYgKHRoaXMudGFibGVDb2x1bW5TZWxlY3RBbGxDb250ZW50Q2hpbGQpIHtcbiAgICAgIHRoaXMuc2V0Q3VzdG9tRGVmaW5pdGlvbkluU2VsZWN0Q29sdW1uKHRoaXMudGFibGVDb2x1bW5TZWxlY3RBbGxDb250ZW50Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVGFibGVEYXRhQ2hhbmdlKCkge1xuICAgIHRoaXMucmVzdG9yZUV4cGFuZGFibGVSb3dTdGF0ZSgpO1xuICB9XG5cbiAgc2V0Q3VzdG9tRGVmaW5pdGlvbkluU2VsZWN0Q29sdW1uKGRlZmluaXRpb246IE9UYWJsZUNvbHVtblNlbGVjdEFsbERpcmVjdGl2ZSkge1xuICAgIGlmIChkZWZpbml0aW9uLnRpdGxlKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi50aXRsZSA9IGRlZmluaXRpb24udGl0bGU7XG4gICAgfVxuICAgIGlmIChkZWZpbml0aW9uLndpZHRoKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi53aWR0aCA9IGRlZmluaXRpb24ud2lkdGg7XG4gICAgfVxuICAgIGlmIChkZWZpbml0aW9uLm1pbldpZHRoKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5taW5XaWR0aCA9IGRlZmluaXRpb24ubWluV2lkdGg7XG4gICAgfVxuICAgIGlmIChkZWZpbml0aW9uLm1heFdpZHRoKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5tYXhXaWR0aCA9IGRlZmluaXRpb24ubWF4V2lkdGg7XG4gICAgfVxuICAgIGlmIChkZWZpbml0aW9uLnJlc2l6YWJsZSkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ucmVzaXphYmxlID0gZGVmaW5pdGlvbi5yZXNpemFibGU7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogeyBbcHJvcE5hbWU6IHN0cmluZ106IFNpbXBsZUNoYW5nZSB9KTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNoYW5nZXMuYXV0b0FkanVzdCkgJiYgY2hhbmdlcy5hdXRvQWRqdXN0LmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5hdXRvQWRqdXN0LnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMuYXV0b0FkanVzdCA9IGNoYW5nZXMuYXV0b0FkanVzdC5jdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlSGVhZGVyQW5kRm9vdGVyU3RpY2t5UG9zaXRpb25zKCkge1xuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCkge1xuICAgICAgY29uc3Qgem9uZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nWm9uZSk7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24gPSB0aGlzLnNjcm9sbFN0cmF0ZWd5LnN0aWNreUNoYW5nZS5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5maXhlZEhlYWRlciB8fCB0aGlzLmhhc0luc2VydGFibGVSb3coKSlcbiAgICAgICkuc3Vic2NyaWJlKHggPT4ge1xuICAgICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3RpY2t5SGVhZGVyU2VsZWN0b3IpLmZvckVhY2goKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWwuc3R5bGUudG9wID0gLSB4ICsgJ3B4JztcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzdGlja3lGb290ZXJTZWxlY3RvcikuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBlbC5zdHlsZS5ib3R0b20gPSB4ICsgJ3B4JztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlRXhwYW5kYWJsZUNvbHVtbigpIHtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4gPSBuZXcgT0NvbHVtbigpO1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZXhwYW5kYWJsZUNvbHVtbi52aXNpYmxlID0gdGhpcy50YWJsZVJvd0V4cGFuZGFibGUgJiYgdGhpcy50YWJsZVJvd0V4cGFuZGFibGUuZXhwYW5kYWJsZUNvbHVtblZpc2libGU7XG4gICAgdGhpcy51cGRhdGVTdGF0ZUV4cGFuZGVkQ29sdW1uKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcblxuICAgIC8vZGV0YWNoIGFsbCBwb3J0YSBob3N0IGNyZWF0ZWRcbiAgICBpZiAodGhpcy5wb3J0YWxIb3N0KSB7XG4gICAgICB0aGlzLnBvcnRhbEhvc3QuZm9yRWFjaCh4ID0+IHguZGV0YWNoKCkpO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGdldFN1ZmZpeENvbHVtbkluc2VydGFibGUoKSB7XG4gICAgcmV0dXJuIENvZGVzLlNVRkZJWF9DT0xVTU5fSU5TRVJUQUJMRTtcbiAgfVxuXG4gIGdldEFjdGlvbnNQZXJtaXNzaW9ucygpOiBPUGVybWlzc2lvbnNbXSB7XG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnMgPyAodGhpcy5wZXJtaXNzaW9ucy5hY3Rpb25zIHx8IFtdKSA6IFtdO1xuICB9XG5cbiAgZ2V0TWVudVBlcm1pc3Npb25zKCk6IE9UYWJsZU1lbnVQZXJtaXNzaW9ucyB7XG4gICAgY29uc3QgcmVzdWx0OiBPVGFibGVNZW51UGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zID8gdGhpcy5wZXJtaXNzaW9ucy5tZW51IDogdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQgOiB7XG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGl0ZW1zOiBbXVxuICAgIH07XG4gIH1cblxuICBnZXRPQ29sdW1uUGVybWlzc2lvbnMoYXR0cjogc3RyaW5nKTogT1Blcm1pc3Npb25zIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5wZXJtaXNzaW9ucyA/ICh0aGlzLnBlcm1pc3Npb25zLmNvbHVtbnMgfHwgW10pIDogW107XG4gICAgcmV0dXJuIGNvbHVtbnMuZmluZChjb21wID0+IGNvbXAuYXR0ciA9PT0gYXR0cikgfHwgeyBhdHRyOiBhdHRyLCBlbmFibGVkOiB0cnVlLCB2aXNpYmxlOiB0cnVlIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QWN0aW9uUGVybWlzc2lvbnMoYXR0cjogc3RyaW5nKTogT1Blcm1pc3Npb25zIHtcbiAgICBjb25zdCBhY3Rpb25zUGVybSA9IHRoaXMucGVybWlzc2lvbnMgPyAodGhpcy5wZXJtaXNzaW9ucy5hY3Rpb25zIHx8IFtdKSA6IFtdO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zOiBPUGVybWlzc2lvbnMgPSBhY3Rpb25zUGVybS5maW5kKHAgPT4gcC5hdHRyID09PSBhdHRyKTtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMgfHwge1xuICAgICAgYXR0cjogYXR0cixcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBlbmFibGVkOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKGF0dHI6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGlvbnNQZXJtID0gdGhpcy5wZXJtaXNzaW9ucyA/ICh0aGlzLnBlcm1pc3Npb25zLmFjdGlvbnMgfHwgW10pIDogW107XG4gICAgY29uc3QgcGVybWlzc2lvbnM6IE9QZXJtaXNzaW9ucyA9IGFjdGlvbnNQZXJtLmZpbmQocCA9PiBwLmF0dHIgPT09IGF0dHIpO1xuICAgIGNvbnN0IGVuYWJsZWRQZXJtaXNpb24gPSBQZXJtaXNzaW9uc1V0aWxzLmNoZWNrRW5hYmxlZFBlcm1pc3Npb24ocGVybWlzc2lvbnMpO1xuICAgIGlmICghZW5hYmxlZFBlcm1pc2lvbikge1xuICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1BFUk1JU1NJT04nKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuYWJsZWRQZXJtaXNpb247XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHdoYXQgaW5pdGlhbGl6ZSB2YXJzIGFuZCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBpbml0aWFsaXplKCk6IGFueSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuXG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucyA9IG5ldyBEZWZhdWx0T1RhYmxlT3B0aW9ucygpO1xuICAgIGlmICh0aGlzLnRhYkdyb3VwQ29udGFpbmVyICYmIHRoaXMudGFiQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyVGFiTGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdGVyQ2xpY2tMaXN0ZW5lcigpO1xuICAgIHRoaXMucmVnaXN0ZXJEYmxDbGlja0xpc3RlbmVyKCk7XG4gICAgLy8gSW5pdGlhbGl6ZSBwYXJhbXMgb2YgdGhlIHRhYmxlXG4gICAgdGhpcy5pbml0aWFsaXplUGFyYW1zKCk7XG5cbiAgICB0aGlzLmluaXRpYWxpemVEYW8oKTtcblxuICAgIHRoaXMucGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zU2VydmljZS5nZXRUYWJsZVBlcm1pc3Npb25zKHRoaXMub2F0dHIsIHRoaXMuYWN0Um91dGUpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUxvYWRpbmdTdWJqZWN0KCkge1xuICAgIHRoaXMubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyh0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlckNsaWNrTGlzdGVuZXIoKSB7XG4gICAgaWYgKHRoaXMuY2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbiA9IHRoaXMuY2xpY2tTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5jbGlja0RlbGF5KSkgLy8gRXNwZXJhIGVsIHRpZW1wbyBjb25maWd1cmFkbyBhbnRlcyBkZSBlamVjdXRhclxuICAgICAgLnN1YnNjcmliZSgoeyByb3csIGNvbHVtbiwgY2VsbFJlZiwgcm93SW5kZXgsIGV2ZW50IH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMub2VuYWJsZWQgJiYgIXRoaXMucmVhZE9ubHkgJiYgY29sdW1uLmVkaXRvclxuICAgICAgICAgICYmICh0aGlzLmRldGFpbE1vZGUgIT09IENvZGVzLkRFVEFJTF9NT0RFX0NMSUNLKVxuICAgICAgICAgICYmICh0aGlzLmVkaXRpb25Nb2RlID09PSBDb2Rlcy5FRElUSU9OX01PREVfQ0xJQ0spKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmF0ZUNvbHVtbkVkaXRpb24oY29sdW1uLCByb3csIGNlbGxSZWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZG9IYW5kbGVDbGljayhyb3csIGNvbHVtbi5hdHRyLCByb3dJbmRleCwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlckRibENsaWNrTGlzdGVuZXIoKSB7XG4gICAgaWYgKHRoaXMuZGJDbGlja1N1YmplY3RTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGJDbGlja1N1YmplY3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uID0gdGhpcy5kYmxjbGlja1N1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmNsaWNrRGVsYXkpKSAvLyBFc3BlcmEgZWwgdGllbXBvIGNvbmZpZ3VyYWRvIGFudGVzIGRlIGVqZWN1dGFyXG4gICAgICAuc3Vic2NyaWJlKCh7IHJvdywgY29sdW1uLCBjZWxsUmVmLCByb3dJbmRleCwgZXZlbnQgfSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgIGlmICh0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9lbmFibGVkICYmIGNvbHVtbi5lZGl0b3JcbiAgICAgICAgICAmJiAoIUNvZGVzLmlzRG91YmxlQ2xpY2tNb2RlKHRoaXMuZGV0YWlsTW9kZSkpXG4gICAgICAgICAgJiYgKENvZGVzLmlzRG91YmxlQ2xpY2tNb2RlKHRoaXMuZWRpdGlvbk1vZGUpKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZhdGVDb2x1bW5FZGl0aW9uKGNvbHVtbiwgcm93LCBjZWxsUmVmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uRG91YmxlQ2xpY2suZW1pdCh7IHJvdzogcm93LCByb3dJbmRleDogcm93SW5kZXgsIG1vdXNlRXZlbnQ6IGV2ZW50LCBjb2x1bW5OYW1lOiBjb2x1bW4uYXR0ciwgY2VsbDogcm93W2NvbHVtbi5hdHRyXSB9KTtcbiAgICAgICAgICBpZiAodGhpcy5vZW5hYmxlZCAmJiBDb2Rlcy5pc0RvdWJsZUNsaWNrTW9kZSh0aGlzLmRldGFpbE1vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEZXRhaWwocm93KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZURhbygpIHtcbiAgICAvLyBDb25maWd1cmUgZGFvIG1ldGhvZHNcbiAgICBjb25zdCBxdWVyeU1ldGhvZE5hbWUgPSB0aGlzLnBhZ2VhYmxlID8gdGhpcy5wYWdpbmF0ZWRRdWVyeU1ldGhvZCA6IHRoaXMucXVlcnlNZXRob2Q7XG4gICAgY29uc3QgbWV0aG9kcyA9IHtcbiAgICAgIHF1ZXJ5OiBxdWVyeU1ldGhvZE5hbWUsXG4gICAgICB1cGRhdGU6IHRoaXMudXBkYXRlTWV0aG9kLFxuICAgICAgZGVsZXRlOiB0aGlzLmRlbGV0ZU1ldGhvZCxcbiAgICAgIGluc2VydDogdGhpcy5pbnNlcnRNZXRob2RcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuc3RhdGljRGF0YSkge1xuICAgICAgdGhpcy5xdWVyeU9uQmluZCA9IGZhbHNlO1xuICAgICAgdGhpcy5xdWVyeU9uSW5pdCA9IGZhbHNlO1xuICAgICAgdGhpcy5kYW9UYWJsZSA9IG5ldyBPVGFibGVEYW8odW5kZWZpbmVkLCB0aGlzLmVudGl0eSwgbWV0aG9kcyk7XG4gICAgICB0aGlzLnNldERhdGFBcnJheSh0aGlzLnN0YXRpY0RhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVNlcnZpY2UoKTtcbiAgICAgIHRoaXMuZGFvVGFibGUgPSBuZXcgT1RhYmxlRGFvKHRoaXMuZGF0YVNlcnZpY2UsIHRoaXMuZW50aXR5LCBtZXRob2RzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgcmVpbml0aWFsaXplIHRhYmxlIGFkZGluZyBvcHRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICByZWluaXRpYWxpemUob3B0aW9uczogT1RhYmxlSW5pdGlhbGl6YXRpb25PcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGNsb25lZE9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdlbnRpdHknKSkge1xuICAgICAgICB0aGlzLmVudGl0eSA9IGNsb25lZE9wdHMuZW50aXR5O1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ3NlcnZpY2UnKSkge1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSBjbG9uZWRPcHRzLnNlcnZpY2U7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnY29sdW1ucycpKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IGNsb25lZE9wdHMuY29sdW1ucztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCd2aXNpYmxlQ29sdW1ucycpKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSBjbG9uZWRPcHRzLnZpc2libGVDb2x1bW5zO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWaXNpYmxlQ29sdW1ucycpKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdFZpc2libGVDb2x1bW5zID0gY2xvbmVkT3B0cy5kZWZhdWx0VmlzaWJsZUNvbHVtbnM7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgna2V5cycpKSB7XG4gICAgICAgIHRoaXMua2V5cyA9IGNsb25lZE9wdHMua2V5cztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdzb3J0Q29sdW1ucycpKSB7XG4gICAgICAgIHRoaXMuc29ydENvbHVtbnMgPSBjbG9uZWRPcHRzLnNvcnRDb2x1bW5zO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ3BhcmVudEtleXMnKSkge1xuICAgICAgICB0aGlzLnBhcmVudEtleXMgPSBjbG9uZWRPcHRzLnBhcmVudEtleXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdmaWx0ZXJDb2x1bW5zJykpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgICAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQgPSBuZXcgT1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCh0aGlzLmluamVjdG9yLCB0aGlzKTtcbiAgICAgICAgICB0aGlzLm9UYWJsZU1lbnUub25WaXNpYmxlRmlsdGVyT3B0aW9uQ2hhbmdlLm5leHQodGhpcy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQpO1xuICAgICAgICAgIHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudC5jb2x1bW5zID0gY2xvbmVkT3B0cy5maWx0ZXJDb2x1bW5zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudC5jb2x1bW5zID0gdGhpcy5zZWFyY2hlYWJsZUNvbHVtbnMuam9pbihcIjtcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnN0YXRlLnJlc2V0KHRoaXMucGFnZWFibGUpO1xuICAgIGlmIChvcHRpb25zPy5kYXRhKSB7XG4gICAgICB0aGlzLnNldERhdGEob3B0aW9ucy5kYXRhLmRhdGEsIG9wdGlvbnMuZGF0YT8uc3FsVHlwZXMpO1xuICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uSW5mbyhvcHRpb25zLmRhdGEuZGF0YSk7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnM/LnBhZ2luYXRpb25EYXRhKSB7XG4gICAgICB0aGlzLnJlaW5pdGlhbGl6ZVBhZ2luYXRpb25JbmZvKG9wdGlvbnMucGFnaW5hdGlvbkRhdGEpO1xuICAgIH1cbiAgICB0aGlzLmluaXRUYWJsZUFmdGVyVmlld0luaXQoKTtcbiAgICB0aGlzLm9uUmVpbml0aWFsaXplLmVtaXQobnVsbCk7XG4gIH1cblxuICByZWluaXRpYWxpemVQYWdpbmF0aW9uSW5mbyhwYWdpbmF0aW9uRGF0YTogUGFnaW5hdGlvbkRhdGEpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnaW5hdGlvbkRhdGEucGFnZU51bWJlcjtcbiAgICB0aGlzLnF1ZXJ5Um93cyA9IHBhZ2luYXRpb25EYXRhLnBhZ2VTaXplO1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICBpZiAocGFnaW5hdGlvbkRhdGEuc3RhcnRSZWNvcmRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEVuZEluZGV4ID0gcGFnaW5hdGlvbkRhdGEuc3RhcnRSZWNvcmRJbmRleCArICh0aGlzLmdldERhdGFBcnJheSgpID8gdGhpcy5nZXREYXRhQXJyYXkoKS5sZW5ndGggOiAwKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5xdWVyeVJlY29yZE9mZnNldCA9IHJlc3VsdEVuZEluZGV4O1xuICAgICAgfVxuICAgICAgaWYgKHBhZ2luYXRpb25EYXRhLnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciA9IHBhZ2luYXRpb25EYXRhLnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFnZU51bWJlciA9IHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQgPT0gMCA/IDAgOiB0aGlzLmRhdGFTZXJ2aWNlPy5nZXRQYWdpbmF0aW9uQ29udGV4dCgpLnBhZ2VOdW1iZXI7XG4gICAgICBzdXBlci51cGRhdGVQYWdpbmF0aW9uQ29udGV4dCh7IHBhZ2VOdW1iZXI6IHBhZ2VOdW1iZXIsIG9mZnNldDogdGhpcy5zdGF0ZS5xdWVyeVJlY29yZE9mZnNldCwgdG90YWxTaXplOiB0aGlzLnN0YXRlLnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyLCBwYWdlU2l6ZTogdGhpcy5zdGF0ZS5xdWVyeVJvd3MgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbkNvbnRleHQoeyB0b3RhbFNpemU6IHRoaXMuZ2V0RGF0YUFycmF5KCkubGVuZ3RoIH0pO1xuICAgIH1cblxuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRUYWJsZUFmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5wYXJzZVZpc2libGVDb2x1bW5zKCk7XG4gICAgdGhpcy5wYXJzZVNlYXJjaGVhYmxlQ29sdW1ucygpO1xuICAgIHRoaXMuc2V0RGF0YXNvdXJjZSgpO1xuICAgIHRoaXMucGFyc2VHcm91cGVkQ29sdW1ucygpO1xuICAgIHRoaXMucGFyc2VHcm91cGVkQ29sdW1uVHlwZXMoKTtcbiAgICB0aGlzLnBhcnNlU29ydENvbHVtbnMoKTtcbiAgICB0aGlzLnNldEZpbHRlcnNDb25maWd1cmF0aW9uKCk7XG4gICAgdGhpcy5hZGREZWZhdWx0Um93QnV0dG9ucygpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudCkpIHtcbiAgICAgIHRoaXMuc2V0R3JvdXBDb2x1bW5zKHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50LmNvbHVtbnNBcnJheSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXJ5T25Jbml0KSB7XG4gICAgICB0aGlzLnF1ZXJ5RGF0YSgpO1xuICAgIH1cbiAgfVxuICBwYXJzZVNlYXJjaGVhYmxlQ29sdW1ucygpIHtcbiAgICB0aGlzLnNlYXJjaGVhYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbEFycmF5LmZpbHRlcihjb2wgPT4ge1xuICAgICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihjb2wpO1xuICAgICAgcmV0dXJuIG9Db2wgJiYgb0NvbC5zZWFyY2hhYmxlO1xuICAgIH0pXG5cbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICBpZiAodGhpcy50YWJHcm91cENoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy50YWJHcm91cENoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNvcnRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc29ydFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vblJlbmRlcmVkRGF0YUNoYW5nZSkge1xuICAgICAgdGhpcy5vblJlbmRlcmVkRGF0YUNoYW5nZS51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZXh0TWVudVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jb250ZXh0TWVudVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNoZWNrVmlld3BvcnRTaXplU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNoZWNrVmlld3BvcnRTaXplU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Nyb2xsU3RyYXRlZ3kpIHtcbiAgICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYkNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kYkNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yb3dDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucm93Q2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXModGhpcy5hc3luY0xvYWRTdWJzY3JpcHRpb25zKS5mb3JFYWNoKGlkeCA9PiB7XG4gICAgICBpZiAodGhpcy5hc3luY0xvYWRTdWJzY3JpcHRpb25zW2lkeF0pIHtcbiAgICAgICAgdGhpcy5hc3luY0xvYWRTdWJzY3JpcHRpb25zW2lkeF0udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmxvYWRpbmdTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLm5nT25EZXN0cm95Py4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVwZGF0ZSBzdG9yZSBsb2NhbHN0b3JhZ2UsIGNhbGwgb2YgdGhlIElMb2NhbFN0b3JhZ2VcbiAgICovXG4gIGdldERhdGFUb1N0b3JlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFN0YXRlU2VydmljZS5nZXREYXRhVG9TdG9yZSgpO1xuICB9XG5cbiAgcmVnaXN0ZXJRdWlja0ZpbHRlcihhcmc6IGFueSkge1xuICAgIGNvbnN0IHF1aWNrRmlsdGVyID0gKGFyZyBhcyBPVGFibGVRdWlja2ZpbHRlcik7XG4gICAgLy8gZm9yY2luZyBxdWlja0ZpbHRlckNvbXBvbmVudCB0byBiZSB1bmRlZmluZWQsIHRhYmxlIHVzZXMgb1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnRcbiAgICB0aGlzLnF1aWNrRmlsdGVyQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQgPSBxdWlja0ZpbHRlcjtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudCkpIHtcbiAgICAgIHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQuc2V0VmFsdWUodGhpcy5zdGF0ZS5xdWlja0ZpbHRlclZhbHVlLCBmYWxzZSk7XG4gICAgICB0aGlzLnF1aWNrRmlsdGVyU3Vic2NyaXB0aW9uID0gdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5vbkNoYW5nZS5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaC5lbWl0KHZhbCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlclBhZ2luYXRpb24odmFsdWU6IE9UYWJsZVBhZ2luYXRvcikge1xuICAgIHRoaXMucGFnaW5hdGlvbkNvbnRyb2xzID0gdHJ1ZTtcbiAgICB0aGlzLnBhZ2luYXRvciA9IHZhbHVlO1xuICB9XG5cbiAgcmVnaXN0ZXJDb250ZXh0TWVudSh2YWx1ZTogT0NvbnRleHRNZW51Q29tcG9uZW50KTogdm9pZCB7XG4gICAgdGhpcy50YWJsZUNvbnRleHRNZW51ID0gdmFsdWU7XG4gICAgdGhpcy5jb250ZXh0TWVudVN1YnNjcmlwdGlvbiA9IHRoaXMudGFibGVDb250ZXh0TWVudS5vblNob3cuc3Vic2NyaWJlKChwYXJhbXM6IElPQ29udGV4dE1lbnVDb250ZXh0KSA9PiB7XG4gICAgICBwYXJhbXMuY2xhc3MgPSAnby10YWJsZS1jb250ZXh0LW1lbnUgJyArIHRoaXMucm93SGVpZ2h0O1xuICAgICAgaWYgKHBhcmFtcy5kYXRhICYmICF0aGlzLmlzUm93U2VsZWN0ZWQocGFyYW1zLmRhdGEucm93VmFsdWUpKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvdyhwYXJhbXMuZGF0YS5yb3dWYWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZWdpc3RlckRlZmF1bHRDb2x1bW4oY29sdW1uOiBzdHJpbmcpIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5nZXRPQ29sdW1uKGNvbHVtbikpKSB7XG4gICAgICAvLyBhIGRlZmF1bHQgY29sdW1uIGRlZmluaXRpb24gdHJ5aW5nIHRvIHJlcGxhY2UgYW4gYWxyZWFkeSBleGlzdGluZyBkZWZpbml0aW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbERlZjogT0NvbHVtbiA9IHRoaXMuY3JlYXRlT0NvbHVtbihjb2x1bW4sIHRoaXMpO1xuICAgIHRoaXMucHVzaE9Db2x1bW5EZWZpbml0aW9uKGNvbERlZik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgYWxsIGNvbHVtbnMgYW5kIHByb3BlcnRpZXMgaW4gdmFyIGNvbHVtbnNBcnJheVxuICAgKiBAcGFyYW0gY29sdW1uXG4gICAqL1xuICByZWdpc3RlckNvbHVtbihjb2x1bW46IE9UYWJsZUNvbHVtbkNvbXBvbmVudCB8IE9UYWJsZUNvbHVtbkNhbGN1bGF0ZWRDb21wb25lbnQgfCBhbnkpIHtcbiAgICBjb25zdCBjb2x1bW5BdHRyID0gKHR5cGVvZiBjb2x1bW4gPT09ICdzdHJpbmcnKSA/IGNvbHVtbiA6IGNvbHVtbi5hdHRyO1xuICAgIGNvbnN0IGNvbHVtblBlcm1pc3Npb25zOiBPUGVybWlzc2lvbnMgPSB0aGlzLmdldE9Db2x1bW5QZXJtaXNzaW9ucyhjb2x1bW5BdHRyKTtcbiAgICBpZiAoIWNvbHVtblBlcm1pc3Npb25zLnZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJEZWZhdWx0Q29sdW1uKGNvbHVtbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uRGVmID0gdGhpcy5nZXRPQ29sdW1uKGNvbHVtbi5hdHRyKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29sdW1uRGVmKSAmJiBVdGlsLmlzRGVmaW5lZChjb2x1bW5EZWYuZGVmaW5pdGlvbikpIHtcbiAgICAgIC8vIGEgby10YWJsZS1jb2x1bW4gZGVmaW5pdGlvbiB0cnlpbmcgdG8gcmVwbGFjZSBhbiBhbHJlYWR5IGV4aXN0aW5nIG8tdGFibGUtY29sdW1uIGRlZmluaXRpb25cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb2xEZWY6IE9Db2x1bW4gPSB0aGlzLmNyZWF0ZU9Db2x1bW4oY29sdW1uLmF0dHIsIHRoaXMsIGNvbHVtbik7XG4gICAgbGV0IGNvbHVtbldpZHRoID0gdGhpcy5nZXRDb2x1bW5XaWR0aEZyb21TdGF0ZShjb2xEZWYpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW5XaWR0aCkpIHtcbiAgICAgIGNvbERlZi53aWR0aCA9IGNvbHVtbldpZHRoO1xuICAgIH1cbiAgICBpZiAoY29sdW1uICYmIChjb2x1bW4uYXN5bmNMb2FkIHx8IGNvbHVtbi50eXBlID09PSAnYWN0aW9uJykpIHtcbiAgICAgIHRoaXMuYXZvaWRRdWVyeUNvbHVtbnMucHVzaChjb2x1bW4uYXR0cik7XG4gICAgICBpZiAoY29sdW1uLmFzeW5jTG9hZCkge1xuICAgICAgICB0aGlzLmFzeW5jTG9hZENvbHVtbnMucHVzaChjb2x1bW4uYXR0cik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucHVzaE9Db2x1bW5EZWZpbml0aW9uKGNvbERlZik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHVzaE9Db2x1bW5EZWZpbml0aW9uKGNvbERlZjogT0NvbHVtbikge1xuICAgIGNvbERlZi52aXNpYmxlID0gKHRoaXMuX3Zpc2libGVDb2xBcnJheS5pbmRleE9mKGNvbERlZi5hdHRyKSAhPT0gLTEpO1xuICAgIC8vIEZpbmQgY29sdW1uIGRlZmluaXRpb24gYnkgbmFtZVxuICAgIGNvbnN0IGFscmVhZHlFeGlzdGluZyA9IHRoaXMuZ2V0T0NvbHVtbihjb2xEZWYuYXR0cik7XG4gICAgaWYgKGFscmVhZHlFeGlzdGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByZXBsYWNpbmdJbmRleCA9IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5pbmRleE9mKGFscmVhZHlFeGlzdGluZyk7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnNbcmVwbGFjaW5nSW5kZXhdID0gY29sRGVmO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMucHVzaChjb2xEZWYpO1xuICAgIH1cbiAgICB0aGlzLmVuc3VyZUNvbHVtbnNPcmRlcigpO1xuICAgIHRoaXMucmVmcmVzaEVkaXRpb25Nb2RlV2FybigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hFZGl0aW9uTW9kZVdhcm4oKSB7XG4gICAgaWYgKHRoaXMuZWRpdGlvbk1vZGUgIT09IENvZGVzLkVESVRJT05fTU9ERV9OT05FKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVkaXRhYmxlQ29sdW1ucyA9IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5maWx0ZXIoY29sID0+IHtcbiAgICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZChjb2wuZWRpdG9yKTtcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChlZGl0YWJsZUNvbHVtbnMubGVuZ3RoID4gMCAmJiAhdGhpcy5oYXNJbnNlcnRhYmxlUm93KCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdVc2luZyBhIGNvbHVtbiB3aXRoIGEgZWRpdG9yIGJ1dCB0aGVyZSBpcyBubyBlZGl0aW9uLW1vZGUgZGVmaW5lZCcpO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICByZWdpc3RlckNvbHVtbkFnZ3JlZ2F0ZShjb2x1bW46IE9Db2x1bW5BZ2dyZWdhdGUpIHtcbiAgICB0aGlzLnNob3dUb3RhbHNTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgY29uc3QgYWxyZWFkeUV4aXN0aW5nID0gdGhpcy5nZXRPQ29sdW1uKGNvbHVtbi5hdHRyKTtcbiAgICBpZiAoYWxyZWFkeUV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJlcGxhY2luZ0luZGV4ID0gdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmluZGV4T2YoYWxyZWFkeUV4aXN0aW5nKTtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1uc1tyZXBsYWNpbmdJbmRleF0uYWdncmVnYXRlID0gY29sdW1uO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyVGFibGVIZWFkZXJzKHRhYmxlSGVhZGVyOiBPVGFibGVIZWFkZXJDb21wb25lbnQpIHtcbiAgICBpZiAodGhpcy50YWJsZUhlYWRlcnMuZmluZEluZGV4KGhlYWRlciA9PiBoZWFkZXIuY29sdW1uLmF0dHIgPT09IHRhYmxlSGVhZGVyLmNvbHVtbi5hdHRyKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMudGFibGVIZWFkZXJzLnB1c2godGFibGVIZWFkZXIpO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlVmlzaWJsZUNvbHVtbnMoZGVmYXVsdENvbmZpZ3VyYXRpb246IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLnN0YXRlLmNvbHVtbnNEaXNwbGF5KSB7XG5cbiAgICAgIC8vIGZpbHRlcmluZyBjb2x1bW5zIHRoYXQgbWlnaHQgYmUgaW4gc3RhdGUgc3RvcmFnZSBidXQgbm90IGluIHRoZSBhY3R1YWwgdGFibGUgZGVmaW5pdGlvblxuICAgICAgbGV0IHN0YXRlQ29sczogT0NvbHVtbkRpc3BsYXlbXSA9IFtdO1xuICAgICAgdGhpcy5zdGF0ZS5jb2x1bW5zRGlzcGxheS5mb3JFYWNoKChvQ29sLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBpc1Zpc2libGVDb2xJbkNvbHVtbnMgPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmluZChjb2wgPT4gY29sLmF0dHIgPT09IG9Db2wuYXR0cikgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoaXNWaXNpYmxlQ29sSW5Db2x1bW5zKSB7XG4gICAgICAgICAgc3RhdGVDb2xzLnB1c2gob0NvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gbG9hZCB0aGUgY29sdW1uICcgKyBvQ29sLmF0dHIgKyAnIGZyb20gdGhlIGxvY2Fsc3RvcmFnZScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChkZWZhdWx0Q29uZmlndXJhdGlvbikge1xuICAgICAgICBzdGF0ZUNvbHMgPSB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLmNvbHVtbnNEaXNwbGF5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGVDb2xzID0gdGhpcy5jaGVja0NoYW5nZXNWaXNpYmxlQ29sdW1tbnNJbkluaXRpYWxDb25maWd1cmF0aW9uKHN0YXRlQ29scyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5zb3J0KChhOiBPQ29sdW1uLCBiOiBPQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4QSA9IHN0YXRlQ29scy5maW5kSW5kZXgoY29sID0+IGNvbC5hdHRyID09PSBhLmF0dHIpO1xuICAgICAgICBjb25zdCBpbmRleEIgPSBzdGF0ZUNvbHMuZmluZEluZGV4KGNvbCA9PiBjb2wuYXR0ciA9PT0gYi5hdHRyKTtcbiAgICAgICAgcmV0dXJuIGluZGV4QSAtIGluZGV4QjtcbiAgICAgIH0pO1xuICAgICAgdGhpcy52aXNpYmxlQ29sQXJyYXkgPSBzdGF0ZUNvbHMuZmlsdGVyKGl0ZW0gPT4gaXRlbS52aXNpYmxlKS5tYXAoaXRlbSA9PiBpdGVtLmF0dHIpO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIHRoaXMudmlzaWJsZUNvbEFycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMuZGVmYXVsdFZpc2libGVDb2x1bW5zID8gdGhpcy5kZWZhdWx0VmlzaWJsZUNvbHVtbnMgOiB0aGlzLnZpc2libGVDb2x1bW5zLCB0cnVlKTtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5zb3J0KChhOiBPQ29sdW1uLCBiOiBPQ29sdW1uKSA9PiB0aGlzLnZpc2libGVDb2xBcnJheS5pbmRleE9mKGEuYXR0cikgLSB0aGlzLnZpc2libGVDb2xBcnJheS5pbmRleE9mKGIuYXR0cikpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrQ2hhbmdlc1Zpc2libGVDb2x1bW1uc0luSW5pdGlhbENvbmZpZ3VyYXRpb24oc3RhdGVDb2xzOiBPQ29sdW1uRGlzcGxheVtdKTogT0NvbHVtbkRpc3BsYXlbXSB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLmNvbHVtbnNEaXNwbGF5KSB7XG4gICAgICByZXR1cm4gc3RhdGVDb2xzO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIG9yaWdpbmFsIHZpc2libGUgY29sdW1ucyBmcm9tIGxvY2FsU3RvcmFnZVxuICAgIGNvbnN0IG9yaWdpbmFsVmlzaWJsZUNvbEFycmF5ID1cbiAgICAgIHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uY29sdW1uc0Rpc3BsYXkuZmlsdGVyKHggPT4geC52aXNpYmxlKS5tYXAoeCA9PiB4LmF0dHIpO1xuXG4gICAgY29uc3QgY3VycmVudFZpc2libGVDb2xBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLnZpc2libGVDb2x1bW5zLCB0cnVlKTtcblxuICAgIC8vIEZpbmQgdmFsdWVzIGluIHZpc2libGUtY29sdW1ucyB0aGF0IHRoZXkgYXJlbnQgaW4gb3JpZ2luYWwtdmlzaWJsZS1jb2x1bW5zIGluIGxvY2Fsc3RvcmFnZVxuICAgIC8vIGluIHRoaXMgY2FzZSB5b3UgaGF2ZSB0byBhZGQgdGhpcyBjb2x1bW4gdG8gdGhpcy52aXNpYmxlQ29sQXJyYXlcbiAgICBjb25zdCBjb2xUb0FkZEluVmlzaWJsZUNvbCA9IFV0aWwuZGlmZmVyZW5jZUFycmF5cyhjdXJyZW50VmlzaWJsZUNvbEFycmF5LCBvcmlnaW5hbFZpc2libGVDb2xBcnJheSk7XG4gICAgZm9yIChjb25zdCBuZXdDb2xBdHRyIG9mIGNvbFRvQWRkSW5WaXNpYmxlQ29sKSB7XG4gICAgICBjb25zdCBjb2x1bW5FeGlzdHMgPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuc29tZShjb2wgPT4gY29sLmF0dHIgPT09IG5ld0NvbEF0dHIpO1xuXG4gICAgICBpZiAoY29sdW1uRXhpc3RzKSB7XG4gICAgICAgIGxldCBpbmRleENvbCA9IHN0YXRlQ29scy5maW5kSW5kZXgoY29sID0+IGNvbC5hdHRyID09PSBuZXdDb2xBdHRyKTtcbiAgICAgICAgaWYgKGluZGV4Q29sID4gLTEpIHtcbiAgICAgICAgICBzdGF0ZUNvbHNbaW5kZXhDb2xdLnZpc2libGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSBjb2x1bW4gZG9lcyBub3QgZXhpc3QgaW4gdGhlIHN0YXRlLCBhZGQgaXQgYXMgdmlzaWJsZVxuICAgICAgICAgIHN0YXRlQ29scy5wdXNoKHtcbiAgICAgICAgICAgIGF0dHI6IG5ld0NvbEF0dHIsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgd2lkdGg6IHVuZGVmaW5lZFxuICAgICAgICAgIH0gYXMgT0NvbHVtbkRpc3BsYXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGF0ZUNvbHMuc29ydCgoYTogT0NvbHVtbiwgYjogT0NvbHVtbikgPT4gY3VycmVudFZpc2libGVDb2xBcnJheS5pbmRleE9mKGEuYXR0cikgLSBjdXJyZW50VmlzaWJsZUNvbEFycmF5LmluZGV4T2YoYi5hdHRyKSk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB2YWx1ZXMgaW4gb3JpZ2luYWwtdmlzaWJsZS1jb2x1bW5zIGluIGxvY2Fsc3RvcmFnZSB0aGF0IHRoZXkgYXJlbnQgaW4gdGhpcy52aXNpYmxlQ29sQXJyYXlcbiAgICAvLyBpbiB0aGlzIGNhc2UgeW91IGhhdmUgdG8gZGVsZXRlIHRoaXMgY29sdW1uIHRvIHRoaXMudmlzaWJsZUNvbEFycmF5XG4gICAgY29uc3QgY29sVG9EZWxldGVJblZpc2libGVDb2wgPSBVdGlsLmRpZmZlcmVuY2VBcnJheXMob3JpZ2luYWxWaXNpYmxlQ29sQXJyYXksIGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkpO1xuICAgIGlmIChjb2xUb0RlbGV0ZUluVmlzaWJsZUNvbC5sZW5ndGggPiAwKSB7XG4gICAgICBzdGF0ZUNvbHMgPSBzdGF0ZUNvbHMuZmlsdGVyKGNvbCA9PiBjb2xUb0RlbGV0ZUluVmlzaWJsZUNvbC5pbmRleE9mKGNvbC5hdHRyKSA9PT0gLTEpO1xuICAgIH1cblxuICAgIC8vSWYgdGhlIGNvbHVtbnMgaW4gb3JpZ2luYWxWaXNpYmxlQ29sQXJyYXkgaGFzIGNoYW5nZWQgdGhlIHNvcnRpbmdcbiAgICBjb25zdCBjaGFuZ2VTb3J0VmlzaWJsZUNvbHVtbnMgPSBKU09OLnN0cmluZ2lmeShjdXJyZW50VmlzaWJsZUNvbEFycmF5KSAhPT0gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWxWaXNpYmxlQ29sQXJyYXkpO1xuICAgIGlmIChjaGFuZ2VTb3J0VmlzaWJsZUNvbHVtbnMgJiYgY3VycmVudFZpc2libGVDb2xBcnJheS5sZW5ndGggPT09IG9yaWdpbmFsVmlzaWJsZUNvbEFycmF5Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBbdG9JbmRleCwgY29sXSBvZiBjdXJyZW50VmlzaWJsZUNvbEFycmF5LmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCBmcm9tSW5kZXhUb0NoYW5nZSA9IHN0YXRlQ29scy5maW5kSW5kZXgoc3RhdGVDb2wgPT4gc3RhdGVDb2wuYXR0ciA9PT0gY29sKTtcbiAgICAgICAgbW92ZUl0ZW1JbkFycmF5KHN0YXRlQ29scywgZnJvbUluZGV4VG9DaGFuZ2UsIHRvSW5kZXgpO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlQ29scztcbiAgfVxuXG4gIHBhcnNlU29ydENvbHVtbnMoKSB7XG4gICAgY29uc3Qgc29ydENvbHVtbnNQYXJhbSA9IHRoaXMuc3RhdGUuc29ydENvbHVtbnMgfHwgdGhpcy5zb3J0Q29sdW1ucztcbiAgICB0aGlzLnNvcnRDb2xBcnJheSA9IFNlcnZpY2VVdGlscy5wYXJzZVNvcnRDb2x1bW5zKHNvcnRDb2x1bW5zUGFyYW0pO1xuXG4gICAgLy8gY2hlY2tpbmcgdGhlIG9yaWdpbmFsIHNvcnQgY29sdW1ucyB3aXRoIHRoZSBzb3J0IGNvbHVtbnMgaW4gaW5pdGlhbCBjb25maWd1cmF0aW9uIGluIGxvY2FsIHN0b3JhZ2VcbiAgICBpZiAodGhpcy5zdGF0ZS5zb3J0Q29sdW1ucyAmJiB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnNvcnRDb2x1bW5zKSB7XG5cbiAgICAgIGNvbnN0IGluaXRpYWxDb25maWdTb3J0Q29sdW1uc0FycmF5ID0gU2VydmljZVV0aWxzLnBhcnNlU29ydENvbHVtbnModGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5zb3J0Q29sdW1ucyk7XG4gICAgICBjb25zdCBvcmlnaW5hbFNvcnRDb2x1bW5zQXJyYXkgPSBTZXJ2aWNlVXRpbHMucGFyc2VTb3J0Q29sdW1ucyh0aGlzLnNvcnRDb2x1bW5zKTtcbiAgICAgIC8vIEZpbmQgdmFsdWVzIGluIHZpc2libGUtY29sdW1ucyB0aGF0IHRoZXkgYXJlbnQgaW4gb3JpZ2luYWwtdmlzaWJsZS1jb2x1bW5zIGluIGxvY2Fsc3RvcmFnZVxuICAgICAgLy8gaW4gdGhpcyBjYXNlIHlvdSBoYXZlIHRvIGFkZCB0aGlzIGNvbHVtbiB0byB0aGlzLnZpc2libGVDb2xBcnJheVxuICAgICAgY29uc3QgY29sVG9BZGRJblZpc2libGVDb2wgPSBVdGlsLmRpZmZlcmVuY2VBcnJheXMob3JpZ2luYWxTb3J0Q29sdW1uc0FycmF5LCBpbml0aWFsQ29uZmlnU29ydENvbHVtbnNBcnJheSk7XG4gICAgICBpZiAoY29sVG9BZGRJblZpc2libGVDb2wubGVuZ3RoID4gMCkge1xuICAgICAgICBjb2xUb0FkZEluVmlzaWJsZUNvbC5mb3JFYWNoKGNvbEFkZCA9PiB7XG4gICAgICAgICAgdGhpcy5zb3J0Q29sQXJyYXkucHVzaChjb2xBZGQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sVG9EZWxJblZpc2libGVDb2wgPSBVdGlsLmRpZmZlcmVuY2VBcnJheXMoaW5pdGlhbENvbmZpZ1NvcnRDb2x1bW5zQXJyYXksIG9yaWdpbmFsU29ydENvbHVtbnNBcnJheSk7XG4gICAgICBpZiAoY29sVG9EZWxJblZpc2libGVDb2wubGVuZ3RoID4gMCkge1xuICAgICAgICBjb2xUb0RlbEluVmlzaWJsZUNvbC5mb3JFYWNoKChjb2xEZWwpID0+IHtcbiAgICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5mb3JFYWNoKChjb2wsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChjb2wuY29sdW1uTmFtZSA9PT0gY29sRGVsLmNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5zb3J0Q29sQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnN1cmluZyBjb2x1bW4gZXhpc3RlbmNlIGFuZCBjaGVja2luZyBpdHMgb3JkZXJhYmxlIHN0YXRlXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuc29ydENvbEFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjb2xOYW1lID0gdGhpcy5zb3J0Q29sQXJyYXlbaV0uY29sdW1uTmFtZTtcbiAgICAgIGNvbnN0IG9Db2wgPSB0aGlzLmdldE9Db2x1bW4oY29sTmFtZSk7XG4gICAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKG9Db2wpIHx8ICFvQ29sLm9yZGVyYWJsZSkge1xuICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICBwcm90ZWN0ZWQgZW5zdXJlQ29sdW1uc09yZGVyKCkge1xuXG4gICAgbGV0IGNvbHVtbnNPcmRlciA9IFtdO1xuICAgIGlmICh0aGlzLnN0YXRlLmNvbHVtbnNEaXNwbGF5KSB7XG4gICAgICBjb2x1bW5zT3JkZXIgPSB0aGlzLnN0YXRlLmNvbHVtbnNEaXNwbGF5Lm1hcChpdGVtID0+IGl0ZW0uYXR0cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHVtbnNPcmRlciA9IHRoaXMuY29sQXJyYXkuZmlsdGVyKGF0dHIgPT4gdGhpcy52aXNpYmxlQ29sQXJyYXkuaW5kZXhPZihhdHRyKSA9PT0gLTEpO1xuICAgICAgY29sdW1uc09yZGVyLnB1c2goLi4udGhpcy52aXNpYmxlQ29sQXJyYXkpO1xuICAgIH1cblxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5zb3J0KChhOiBPQ29sdW1uLCBiOiBPQ29sdW1uKSA9PiB7XG4gICAgICBpZiAoY29sdW1uc09yZGVyLmluZGV4T2YoYS5hdHRyKSA9PT0gLTEpIHtcbiAgICAgICAgLy8gaWYgaXQgaXMgbm90IGluIGxvY2FsIHN0b3JhZ2UgYmVjYXVzZSBpdCBpcyBuZXcsIGtlZXAgb3JkZXJcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29sdW1uc09yZGVyLmluZGV4T2YoYS5hdHRyKSAtIGNvbHVtbnNPcmRlci5pbmRleE9mKGIuYXR0cik7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICB9XG5cbiAgaW5pdGlhbGl6ZVBhcmFtcygpOiB2b2lkIHtcbiAgICAvLyBJZiB2aXNpYmxlLWNvbHVtbnMgaXMgbm90IHByZXNlbnQgdGhlbiB2aXNpYmxlLWNvbHVtbnMgaXMgYWxsIGNvbHVtbnNcbiAgICBpZiAoIXRoaXMudmlzaWJsZUNvbHVtbnMpIHtcbiAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbEFycmF5Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb2xBcnJheS5mb3JFYWNoKCh4OiBzdHJpbmcpID0+IHRoaXMucmVnaXN0ZXJDb2x1bW4oeCkpO1xuICAgICAgdGhpcy5lbnN1cmVDb2x1bW5zT3JkZXIoKTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSBxdWlja0ZpbHRlclxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZmlsdGVyID0gdGhpcy5xdWlja0ZpbHRlcjtcblxuICAgIGlmICh0aGlzLnN0YXRlLmN1cnJlbnRQYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5zdGF0ZS5jdXJyZW50UGFnZTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHBhZ2luYXRvclxuICAgIGlmICghdGhpcy5wYWdpbmF0b3IgJiYgdGhpcy5wYWdpbmF0aW9uQ29udHJvbHMpIHtcbiAgICAgIHRoaXMucGFnaW5hdG9yID0gbmV3IE9CYXNlVGFibGVQYWdpbmF0b3IoKTtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gdGhpcy5xdWVyeVJvd3M7XG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgICAgdGhpcy5wYWdpbmF0b3Iuc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgPSB0aGlzLnNob3dQYWdpbmF0b3JGaXJzdExhc3RCdXR0b25zO1xuICAgIH1cblxuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5zZWxlY3RBbGxDaGVja2JveFZpc2libGUpKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlID0gISF0aGlzLnN0YXRlLnNlbGVjdENvbHVtblZpc2libGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNoZWNraW5nIHRoZSBvcmlnaW5hbCBzZWxlY3RBbGxDaGVja2JveFZpc2libGUgd2l0aCBzZWxlY3QtY29sdW1uLXZpc2libGUgaW4gaW5pdGlhbCBjb25maWd1cmF0aW9uIGluIGxvY2FsIHN0b3JhZ2VcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnNlbGVjdENvbHVtblZpc2libGUpXG4gICAgICAgICYmIHRoaXMuc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlID09PSB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnNlbGVjdENvbHVtblZpc2libGUpIHtcbiAgICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9ICEhdGhpcy5zdGF0ZS5zZWxlY3RDb2x1bW5WaXNpYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9IHRoaXMuc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vSW5pdGlhbGl6ZSBzaG93IGZpbHRlciBieSBjb2x1bW4gaWNvblxuICAgIHRoaXMuaXNDb2x1bW5GaWx0ZXJzQWN0aXZlID0gdGhpcy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQ7XG5cbiAgICB0aGlzLmluaXRpYWxpemVDaGVja2JveENvbHVtbigpO1xuXG4gICAgaWYgKHRoaXMuc3RvcmVTdGF0ZSkge1xuICAgICAgLy8gaWYgcXVlcnktcm93cyBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaXMgZXF1YWxzIHRvIG9yaWdpbmFsIHF1ZXJ5LXJvd3MgaW5wdXRcbiAgICAgIC8vIHF1ZXJ5X3Jvd3Mgd2lsbCBiZSB0aGUgdmFsdWUgaW4gbG9jYWwgc3RvcmFnZVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUucXVlcnlSb3dzKSAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnF1ZXJ5Um93cylcbiAgICAgICAgJiYgdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5xdWVyeVJvd3MgPT09IHRoaXMub3JpZ2luYWxRdWVyeVJvd3MpIHtcbiAgICAgICAgdGhpcy5xdWVyeVJvd3MgPSB0aGlzLnN0YXRlLnF1ZXJ5Um93cztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0aW9uKCkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5fc2VsZWN0aW9uKSkge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odGhpcy5pc1NlbGVjdGlvbk1vZGVNdWx0aXBsZSgpLCBbXSwgdHJ1ZSwgdGhpcy5jb21wYXJlUm93KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uO1xuICB9XG5cbiAgdXBkYXRlU3RhdGVFeHBhbmRlZENvbHVtbigpIHtcbiAgICBpZiAoIXRoaXMudGFibGVSb3dFeHBhbmRhYmxlPy5leHBhbmRhYmxlQ29sdW1uVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zWzBdID09PSBDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QgJiZcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnNbMV0gIT09IENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuc3BsaWNlKDEsIDAsIENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uc1swXSAhPT0gQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpO1xuICAgIH1cblxuICB9XG5cbiAgcmVnaXN0ZXJUYWJMaXN0ZW5lcigpIHtcbiAgICAvLyBXaGVuIHRhYmxlIGlzIGNvbnRhaW5lZCBpbnRvIHRhYiBjb21wb25lbnQsIGl0IGlzIG5lY2Vzc2FyeSB0byBpbml0IHRhYmxlIGNvbXBvbmVudCB3aGVuIGF0dGFjaGVkIHRvIERPTS5cbiAgICB0aGlzLnRhYkdyb3VwQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy50YWJHcm91cENvbnRhaW5lci5zZWxlY3RlZFRhYkNoYW5nZS5zdWJzY3JpYmUoKGV2dCkgPT4ge1xuICAgICAgbGV0IGludGVydmFsO1xuICAgICAgY29uc3QgdGltZXJDYWxsYmFjayA9ICh0YWI6IE1hdFRhYikgPT4ge1xuICAgICAgICBpZiAodGFiICYmIHRhYi5jb250ZW50LmlzQXR0YWNoZWQpIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICBpZiAodGFiID09PSB0aGlzLnRhYkNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5pbnNpZGVUYWJCdWdXb3JrYXJvdW5kKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nUXVlcnkpIHtcbiAgICAgICAgICAgICAgdGhpcy5xdWVyeURhdGEodGhpcy5wZW5kaW5nUXVlcnlGaWx0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB0aW1lckNhbGxiYWNrKGV2dC50YWIpOyB9LCAxMDApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluc2lkZVRhYkJ1Z1dvcmthcm91bmQoKSB7XG4gICAgdGhpcy5yZWZyZXNoU29ydEhlYWRlcnMoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyU29ydExpc3RlbmVyKCkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnNvcnQpKSB7XG4gICAgICB0aGlzLnNvcnRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnNvcnRTdWJzY3JpcHRpb24gPSB0aGlzLnNvcnQub1NvcnRDaGFuZ2Uuc3Vic2NyaWJlKHRoaXMuaGFuZGxlU29ydENoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICAgIHRoaXMuc29ydC5zZXRNdWx0aXBsZVNvcnQodGhpcy5tdWx0aXBsZVNvcnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVTb3J0Q2hhbmdlKHNvcnRBcnJheTogYW55W10pIHtcbiAgICB0aGlzLnNvcnRDb2xBcnJheSA9IFtdO1xuICAgIHNvcnRBcnJheS5mb3JFYWNoKChzb3J0KSA9PiB7XG4gICAgICBpZiAoc29ydC5kaXJlY3Rpb24gIT09ICcnKSB7XG4gICAgICAgIHRoaXMuc29ydENvbEFycmF5LnB1c2goe1xuICAgICAgICAgIGNvbHVtbk5hbWU6IHNvcnQuaWQsXG4gICAgICAgICAgYXNjZW5kZW50OiBzb3J0LmRpcmVjdGlvbiA9PT0gQ29kZXMuQVNDX1NPUlRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5vblNvcnRDaGFuZ2UuZW1pdCh0aGlzLnNvcnRDb2xBcnJheSk7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIHRoaXMucmVsb2FkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldERhdGFzb3VyY2UoKSB7XG4gICAgLy9EZWxldGVkIHByZXZpb3VzIGluc3RhbmNlIGFuZCBzdWJzY3JpYmVyc1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFTb3VyY2U7XG4gICAgaWYgKHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UpIHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UudW5zdWJzY3JpYmUoKTtcblxuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoT1RhYmxlRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2VTZXJ2aWNlLmdldEluc3RhbmNlKHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJEYXRhU291cmNlTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZWdpc3RlclNvcnRMaXN0ZW5lcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyRGF0YVNvdXJjZUxpc3RlbmVycygpIHtcbiAgICB0aGlzLm9uUmVuZGVyZWREYXRhQ2hhbmdlID0gdGhpcy5kYXRhU291cmNlLm9uUmVuZGVyZWREYXRhQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnN0b3BFZGl0aW9uKCk7XG4gICAgICB0aGlzLmNoZWNrU2VsZWN0ZWRJdGVtRGF0YSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEV4cGFuZGVkUm93Q29udGFpbmVyQ2xhc3Mocm93SW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9UYWJsZUNvbXBvbmVudC5FWFBBTkRFRF9ST1dfQ09OVEFJTkVSX0NMQVNTICsgcm93SW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwYW5kYWJsZUl0ZW1zKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlSXRlbS5zZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIGV4cGFuZGFibGUgcm93LlxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVSb3dFeHBhbmRhYmxlKGl0ZW06IGFueSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0udG9nZ2xlKGl0ZW0pO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5nZXRWYWx1ZSgpLmZpbmRJbmRleCgocm93KSA9PiB0aGlzLmtleXNBcnJheS5ldmVyeShrZXkgPT4gcm93W2tleV0gPT09IGl0ZW1ba2V5XSkpO1xuXG4gICAgaWYgKHRoaXMucG9ydGFsSG9zdFtyb3dJbmRleF0pIHtcbiAgICAgIHRoaXMucG9ydGFsSG9zdFtyb3dJbmRleF0uZGV0YWNoKCk7XG4gICAgfVxuICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gdGhpcy5nZXRTdGF0ZUV4cGFuZChpdGVtKSA9PT0gJ2NvbGxhcHNlZCc7XG4gICAgY29uc3QgZXZlbnRUYWJsZVJvd0V4cGFuZGFibGVDaGFuZ2UgPSB0aGlzLmVtaXRUYWJsZVJvd0V4cGFuZGFibGVDaGFuZ2VFdmVudChpdGVtLCByb3dJbmRleCk7XG4gICAgaWYgKGlzQ29sbGFwc2VkKSB7XG4gICAgICB0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS5vbkNvbGxhcHNlZC5lbWl0KGV2ZW50VGFibGVSb3dFeHBhbmRhYmxlQ2hhbmdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuJyArIHRoaXMuZ2V0RXhwYW5kZWRSb3dDb250YWluZXJDbGFzcyhyb3dJbmRleCkpO1xuICAgICAgdGhpcy5wb3J0YWxIb3N0W3Jvd0luZGV4XSA9IG5ldyBEb21Qb3J0YWxPdXRsZXQoXG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuYXBwUmVmLFxuICAgICAgICB0aGlzLmluamVjdG9yXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZVBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS50ZW1wbGF0ZVJlZiwgdGhpcy5fdmlld0NvbnRhaW5lclJlZiwgeyAkaW1wbGljaXQ6IGl0ZW0gfSk7XG4gICAgICB0aGlzLnBvcnRhbEhvc3Rbcm93SW5kZXhdLmF0dGFjaFRlbXBsYXRlUG9ydGFsKHRlbXBsYXRlUG9ydGFsKTtcbiAgICAgIHRoaXMudGFibGVSb3dFeHBhbmRhYmxlLm9uRXhwYW5kZWQuZW1pdChldmVudFRhYmxlUm93RXhwYW5kYWJsZUNoYW5nZSk7XG4gICAgfVxuXG4gIH1cblxuICBzYXZlUm93RXhwYW5kU3RhdGUoYWRkZWQ6IGFueVtdLCByZW1vdmVkOiBhbnlbXSkge1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUuZXhwYW5kYWJsZVJvd3MgPz8gW107XG5cbiAgICBjb25zdCBleHRyYWN0S2V5cyA9IChpdGVtOiBhbnkpID0+XG4gICAgICBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoaXRlbSkuZmlsdGVyKChba2V5XSkgPT4gdGhpcy5rZXlzQXJyYXkuaW5jbHVkZXMoa2V5KSkpO1xuXG4gICAgY29uc3QgaXNTYW1lUm93ID0gdGhpcy5jb21wYXJlUm93KCk7XG5cbiAgICAvLyBBZGQgZXhwYW5kYWJsZSBpdGVtc1xuICAgIGlmIChhZGRlZD8ubGVuZ3RoKSB7XG4gICAgICBhZGRlZC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuZ2V0VmFsdWUoKS5maW5kSW5kZXgocm93ID0+IGlzU2FtZVJvdyhyb3csIGl0ZW0pKTtcbiAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IHN0YXRlLnNvbWUoc3RhdGVJdGVtID0+IGlzU2FtZVJvdyhzdGF0ZUl0ZW0ua2V5cywgaXRlbSkpO1xuXG4gICAgICAgIGlmIChyb3dJbmRleCAhPT0gLTEgJiYgIWFscmVhZHlFeGlzdHMpIHtcbiAgICAgICAgICBzdGF0ZS5wdXNoKHsga2V5czogZXh0cmFjdEtleXMoaXRlbSkgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBleHBhbmRhYmxlIGl0ZW1zXG4gICAgaWYgKHJlbW92ZWQ/Lmxlbmd0aCkge1xuICAgICAgcmVtb3ZlZC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBpbmRleFRvUmVtb3ZlID0gc3RhdGUuZmluZEluZGV4KHN0YXRlSXRlbSA9PiBpc1NhbWVSb3coc3RhdGVJdGVtLmtleXMsIGl0ZW0pKTtcbiAgICAgICAgaWYgKGluZGV4VG9SZW1vdmUgIT09IC0xKSB7XG4gICAgICAgICAgc3RhdGUuc3BsaWNlKGluZGV4VG9SZW1vdmUsIDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmV4cGFuZGFibGVSb3dzID0gc3RhdGU7XG4gIH1cblxuICBkZXN0cm95QWxsUG9ydGFsSG9zdHMoKTogdm9pZCB7XG4gICAgdGhpcy5wb3J0YWxIb3N0LmZvckVhY2goaG9zdCA9PiB7XG4gICAgICBpZiAoaG9zdC5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICAgIGhvc3QuZGV0YWNoKCk7ICAgLy8gRGV0YWNoIHRoZSBwb3J0YWwgY29udGVudFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgcm93IGV4cGFuZGFibGUgYnkgcm93IGluZGV4XG4gICAqIEBwYXJhbSByb3dJbmRleFxuICAgKiBAcGFyYW0gW2V2ZW50XVxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVJvd0V4cGFuZGFibGVCeVJvd0luZGV4KHJvd0luZGV4OiBudW1iZXIsIGV2ZW50PzogRXZlbnQpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRWYWx1ZSgpW3Jvd0luZGV4XTtcbiAgICB0aGlzLnRvZ2dsZVJvd0V4cGFuZGFibGUoaXRlbSwgZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VGFibGVSb3dFeHBhbmRhYmxlQ2hhbmdlRXZlbnQoZGF0YSwgcm93SW5kZXgpIHtcbiAgICBjb25zdCBldmVudCA9IG5ldyBPVGFibGVSb3dFeHBhbmRlZENoYW5nZSgpO1xuICAgIGV2ZW50LnJvd0luZGV4ID0gcm93SW5kZXg7XG4gICAgZXZlbnQuZGF0YSA9IGRhdGE7XG5cbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgaXNFeHBhbmRlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlSXRlbS5pc1NlbGVjdGVkKGRhdGEpO1xuICB9XG5cbiAgcHVibGljIGdldFN0YXRlRXhwYW5kKHJvdykge1xuICAgIHJldHVybiB0aGlzLmlzRXhwYW5kZWQocm93KSA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJztcbiAgfVxuXG4gIHB1YmxpYyBpc0NvbHVtbkV4cGFuZGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChVdGlsLmlzRGVmaW5lZCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSkgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5fb1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uKSkgPyB0aGlzLl9vVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4udmlzaWJsZSA6IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGhhc0V4cGFuZGVkUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSk7XG4gIH1cblxuICBwdWJsaWMgaGFzSW5zZXJ0YWJsZVJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROdW1WaXNpYmxlQ29sdW1ucygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIG1hbmFnZXMgdGhlIGNhbGwgdG8gdGhlIHNlcnZpY2VcbiAgICogQHBhcmFtIGZpbHRlclxuICAgKiBAcGFyYW0gb3ZyckFyZ3NcbiAgICovXG4gIHF1ZXJ5RGF0YShmaWx0ZXI/OiBhbnksIG92cnJBcmdzPzogT1F1ZXJ5RGF0YUFyZ3MpIHtcbiAgICAvLyBJZiB0YWIgZXhpc3RzIGFuZCBpcyBub3QgYWN0aXZlIHRoZW4gd2FpdCBmb3IgcXVlcnlEYXRhXG4gICAgaWYgKHRoaXMuaXNJbnNpZGVJbmFjdGl2ZVRhYigpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdRdWVyeSA9IHRydWU7XG4gICAgICB0aGlzLnBlbmRpbmdRdWVyeUZpbHRlciA9IGZpbHRlcjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nUXVlcnkgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdRdWVyeUZpbHRlciA9IHVuZGVmaW5lZDtcblxuICAgIHRoaXMucXVlcnlDZWxsUmVuZGVyZXJzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIHBvcnRhbCBob3N0cyBiZWZvcmUgcmUtcmVuZGVyaW5nIHRvIHByZXZlbnQgZHVwbGljYXRlIG9yIG9ycGhhbmVkIGNvbXBvbmVudHNcbiAgICAgIHRoaXMuZGVzdHJveUFsbFBvcnRhbEhvc3RzKCk7XG4gICAgICBzdXBlci5xdWVyeURhdGEoZmlsdGVyLCBvdnJyQXJncyk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNJbnNpZGVJbmFjdGl2ZVRhYigpOiBib29sZWFuIHtcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudGFiQ29udGFpbmVyICYmIHRoaXMudGFiR3JvdXBDb250YWluZXIpIHtcbiAgICAgIHJlc3VsdCA9ICEodGhpcy50YWJDb250YWluZXIuaXNBY3RpdmUgfHwgKHRoaXMudGFiR3JvdXBDb250YWluZXIuc2VsZWN0ZWRJbmRleCA9PT0gdGhpcy50YWJDb250YWluZXIucG9zaXRpb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldENvbXBvbmVudEZpbHRlcihleGlzdGluZ0ZpbHRlcjogYW55ID0ge30pOiBhbnkge1xuICAgIGxldCBmaWx0ZXIgPSBleGlzdGluZ0ZpbHRlcjtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBwYXJlbnRJdGVtRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Gcm9tT2JqZWN0KGZpbHRlcik7XG4gICAgICAgIGZpbHRlciA9IHt9O1xuICAgICAgICBmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0gPSBwYXJlbnRJdGVtRXhwcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJlQ29sRmlsdGVyID0gdGhpcy5nZXRDb2x1bW5GaWx0ZXJzRXhwcmVzc2lvbigpO1xuICAgICAgLy8gQWRkIGNvbHVtbiBmaWx0ZXJzIGJhc2ljIGV4cHJlc3Npb24gdG8gY3VycmVudCBmaWx0ZXJcbiAgICAgIGlmIChiZUNvbEZpbHRlciAmJiAhVXRpbC5pc0RlZmluZWQoZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5GSUxURVJfRVhQUkVTU0lPTl9LRVldKSkge1xuICAgICAgICBmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0gPSBiZUNvbEZpbHRlcjtcbiAgICAgIH0gZWxzZSBpZiAoYmVDb2xGaWx0ZXIpIHtcbiAgICAgICAgZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5GSUxURVJfRVhQUkVTU0lPTl9LRVldID1cbiAgICAgICAgICBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRDb21wbGV4RXhwcmVzc2lvbihmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0sIGJlQ29sRmlsdGVyLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZ2V0Q29tcG9uZW50RmlsdGVyKGZpbHRlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UXVpY2tGaWx0ZXJFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24ge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50KSAmJiB0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5maWx0ZXJFeHByZXNzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0Q29sdW1uRmlsdGVyc0V4cHJlc3Npb24oKTogRXhwcmVzc2lvbiB7XG4gICAgLy8gQXBwbHkgY29sdW1uIGZpbHRlcnNcbiAgICBjb25zdCBjb2x1bW5GaWx0ZXJzOiBPQ29sdW1uVmFsdWVGaWx0ZXJbXSA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb2x1bW5WYWx1ZUZpbHRlcnMoKTtcbiAgICBjb25zdCBiZUNvbHVtbkZpbHRlcnM6IEFycmF5PEV4cHJlc3Npb24+ID0gW107XG4gICAgY29sdW1uRmlsdGVycy5mb3JFYWNoKGNvbEZpbHRlciA9PiB7XG4gICAgICAvLyBQcmVwYXJlIGJhc2ljIGV4cHJlc3Npb25zXG4gICAgICBzd2l0Y2ggKGNvbEZpbHRlci5vcGVyYXRvcikge1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuSU46XG4gICAgICAgICAgaWYgKFV0aWwuaXNBcnJheShjb2xGaWx0ZXIudmFsdWVzKSkge1xuICAgICAgICAgICAgY29uc3QgYmVzSW46IEFycmF5PEV4cHJlc3Npb24+ID0gY29sRmlsdGVyLnZhbHVlcy5tYXAodmFsdWUgPT4gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkVxdWFscyhjb2xGaWx0ZXIuYXR0ciwgdmFsdWUpKTtcbiAgICAgICAgICAgIGxldCBiZUluOiBFeHByZXNzaW9uID0gYmVzSW4ucG9wKCk7XG4gICAgICAgICAgICBiZXNJbi5mb3JFYWNoKGJlID0+IHtcbiAgICAgICAgICAgICAgYmVJbiA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZENvbXBsZXhFeHByZXNzaW9uKGJlSW4sIGJlLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfT1IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBiZUNvbHVtbkZpbHRlcnMucHVzaChiZUluKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5CRVRXRUVOOlxuICAgICAgICAgIGlmIChVdGlsLmlzQXJyYXkoY29sRmlsdGVyLnZhbHVlcykgJiYgY29sRmlsdGVyLnZhbHVlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlRnJvbSA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Nb3JlRXF1YWwoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXNbMF0pO1xuICAgICAgICAgICAgY29uc3QgYmVUbyA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25MZXNzRXF1YWwoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXNbMV0pO1xuICAgICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24oYmVGcm9tLCBiZVRvLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuRVFVQUw6XG4gICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkxpa2UoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXMpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkxFU1NfRVFVQUw6XG4gICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkxlc3NFcXVhbChjb2xGaWx0ZXIuYXR0ciwgY29sRmlsdGVyLnZhbHVlcykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuTU9SRV9FUVVBTDpcbiAgICAgICAgICBiZUNvbHVtbkZpbHRlcnMucHVzaChGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRFeHByZXNzaW9uTW9yZUVxdWFsKGNvbEZpbHRlci5hdHRyLCBjb2xGaWx0ZXIudmFsdWVzKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICAvLyBCdWlsZCBjb21wbGV0ZSBjb2x1bW4gZmlsdGVycyBiYXNpYyBleHByZXNzaW9uXG4gICAgbGV0IGJlQ29sRmlsdGVyOiBFeHByZXNzaW9uID0gYmVDb2x1bW5GaWx0ZXJzLnBvcCgpO1xuICAgIGJlQ29sdW1uRmlsdGVycy5mb3JFYWNoKGJlID0+IHtcbiAgICAgIGJlQ29sRmlsdGVyID0gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24oYmVDb2xGaWx0ZXIsIGJlLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYmVDb2xGaWx0ZXI7XG4gIH1cblxuICB1cGRhdGVQYWdpbmF0aW9uSW5mbyhxdWVyeVJlczogU2VydmljZVJlc3BvbnNlKSB7XG4gICAgc3VwZXIudXBkYXRlUGFnaW5hdGlvbkluZm8ocXVlcnlSZXMpO1xuICB9XG5cbiAgaW5pdFZpZXdQb3J0KGRhdGE6IGFueVtdKSB7XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQgJiYgZGF0YSkge1xuICAgICAgY29uc3QgaGVhZGVyRWxSZWYgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihoZWFkZXJTZWxlY3Rvcik7XG4gICAgICBjb25zdCBmb290ZXJFbFJlZiA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGZvb3RlclNlbGVjdG9yKTtcbiAgICAgIGNvbnN0IHJvd0VsUmVmID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3Iocm93U2VsZWN0b3IpO1xuXG4gICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBoZWFkZXJFbFJlZiA/IGhlYWRlckVsUmVmLm9mZnNldEhlaWdodCA6IDA7XG4gICAgICBjb25zdCBmb290ZXJIZWlnaHQgPSBmb290ZXJFbFJlZiA/IGZvb3RlckVsUmVmLm9mZnNldEhlaWdodCA6IDA7XG4gICAgICBjb25zdCByb3dIZWlnaHQgPSByb3dFbFJlZiA/IHJvd0VsUmVmLm9mZnNldEhlaWdodCA6IE9UYWJsZUNvbXBvbmVudC5ERUZBVUxUX1JPV19IRUlHSFQ7XG5cbiAgICAgIC8vIHNldCBjb25maWcgdmlld3BvcnRcbiAgICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kuc2V0Q29uZmlnKHJvd0hlaWdodCwgaGVhZGVySGVpZ2h0LCBmb290ZXJIZWlnaHQpO1xuICAgICAgaWYgKHRoaXMucHJldmlvdXNSZW5kZXJlckRhdGEgIT09IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxTdHJhdGVneS5kYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldERhdGEoZGF0YTogYW55LCBzcWxUeXBlczogYW55KSB7XG4gICAgLyogVGhpcyBjb2RlIGlzIG5vdCBwdXQgaW4gdGhlIHN1cGVyIG1ldGhvZCBiZWNhdXNlIGl0IGlzIG5vdCBjYWxsZWQgZnJvbSB0aGUgY2xhc3MgaXRzZWxmICovXG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheSAmJiBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5kYXRhU2VydmljZT8ucmVpbml0aWFsaXplUGFnaW5hdGlvbkNvbnRleHQodGhpcy5xdWVyeVJvd3MpO1xuICAgIH1cblxuICAgIHRoaXMuZGFvVGFibGUuc3FsVHlwZXNDaGFuZ2UubmV4dChzcWxUeXBlcyk7XG4gICAgdGhpcy5kYW9UYWJsZS5zZXREYXRhQXJyYXkoZGF0YSk7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25QYWdpbmF0ZWREYXRhTG9hZGVkLCBkYXRhKTtcbiAgICB9XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkRhdGFMb2FkZWQsIHRoaXMuZGFvVGFibGUuZGF0YSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FuU2V0U3RhdGljRGF0YShzdGF0aWNEYXRhKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLmNhblNldFN0YXRpY0RhdGEoc3RhdGljRGF0YSkgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5kYW9UYWJsZSk7XG4gIH1cblxuICBzaG93RGlhbG9nRXJyb3IoZXJyb3I6IHN0cmluZywgZXJyb3JPcHRpb25hbD86IHN0cmluZykge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChlcnJvcikgJiYgIVV0aWwuaXNPYmplY3QoZXJyb3IpKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgZXJyb3JPcHRpb25hbCk7XG4gICAgfVxuICB9XG5cbiAgcHJvamVjdENvbnRlbnRDaGFuZ2VkKCkge1xuICAgIHRoaXMuaW5pdFZpZXdQb3J0KHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEpO1xuXG4gICAgaWYgKHRoaXMucHJldmlvdXNSZW5kZXJlckRhdGEgIT09IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEpIHtcbiAgICAgIHRoaXMucHJldmlvdXNSZW5kZXJlckRhdGEgPSB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhO1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkNvbnRlbnRDaGFuZ2UsIHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLnNlbGVjdGlvbiAmJiB0aGlzLmRhdGFTb3VyY2U/LnJlbmRlcmVkRGF0YT8ubGVuZ3RoID4gMCAmJiB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RlZEl0ZW1EYXRhKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVmcmVzaEV4cGFuZGFibGVSb3dTdGF0ZSkge1xuICAgICAgdGhpcy5yZWZyZXNoRXhwYW5kYWJsZVJvd1N0YXRlID0gZmFsc2U7XG4gICAgICBjb25zdCBzZWxlY3Rpb25JdGVtcyA9IHRoaXMuc3RhdGUuZXhwYW5kYWJsZVJvd3M/LnNsaWNlKCkgfHwgW11cbiAgICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0/LmNsZWFyKCk7XG4gICAgICB0aGlzLnN0YXRlLmV4cGFuZGFibGVSb3dzID0gc2VsZWN0aW9uSXRlbXM7XG4gICAgICB0aGlzLnJlc3RvcmVFeHBhbmRhYmxlUm93U3RhdGUoKTtcbiAgICB9XG5cbiAgfVxuXG4gIHJlc3RvcmVFeHBhbmRhYmxlUm93U3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGFibGVSb3dFeHBhbmRhYmxlICYmIHRoaXMuc3RhdGU/LmV4cGFuZGFibGVSb3dzKSB7XG4gICAgICB0aGlzLnN0YXRlLmV4cGFuZGFibGVSb3dzLmZvckVhY2goZXhwYW5kYWJsZVJvdyA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFJlbmRlcmVkVmFsdWUoKTs7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gZGF0YS5maW5kSW5kZXgoKHJvdykgPT4gdGhpcy5rZXlzQXJyYXkuZXZlcnkoa2V5ID0+IHJvd1trZXldID09PSBleHBhbmRhYmxlUm93LmtleXNba2V5XSkpO1xuICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IHJvd0luZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVJvd0V4cGFuZGFibGUoZGF0YVtyb3dJbmRleF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXR0cmlidXRlc1ZhbHVlc1RvUXVlcnkoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgY29sdW1ucyA9IHN1cGVyLmdldEF0dHJpYnV0ZXNWYWx1ZXNUb1F1ZXJ5KCk7XG4gICAgaWYgKHRoaXMuYXZvaWRRdWVyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IGNvbHVtbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgY29sID0gY29sdW1uc1tpXTtcbiAgICAgICAgaWYgKHRoaXMuYXZvaWRRdWVyeUNvbHVtbnMuaW5kZXhPZihjb2wpICE9PSAtMSkge1xuICAgICAgICAgIGNvbHVtbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgZ2V0UXVlcnlBcmd1bWVudHMoZmlsdGVyOiBvYmplY3QsIG92cnJBcmdzPzogT1F1ZXJ5RGF0YUFyZ3MpOiBPUXVlcnlQYXJhbXMge1xuICAgIGNvbnN0IHF1ZXJ5QXJndW1lbnRzID0gc3VwZXIuZ2V0UXVlcnlBcmd1bWVudHMoZmlsdGVyLCBvdnJyQXJncyk7XG4gICAgcXVlcnlBcmd1bWVudHMuc3FsVHlwZXMgPSB7XG4gICAgICAuLi50aGlzLmdldFNxbFR5cGVzRm9yRmlsdGVyKHF1ZXJ5QXJndW1lbnRzLmNvbHVtbnMpLFxuICAgICAgLi4ub3ZyckFyZ3MgPyBvdnJyQXJncy5zcWx0eXBlcyB8fCB7fSA6IHt9XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICBxdWVyeUFyZ3VtZW50cy5zb3J0ID0gdGhpcy5zb3J0Q29sQXJyYXk7XG4gICAgICBpZiAodGhpcy5wYWdpbmF0b3IuaXNTaG93aW5nQWxsUm93cyhvdnJyQXJncz8ub2Zmc2V0KSAmJiB0aGlzLnN0YXRlPy50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlcikge1xuICAgICAgICBxdWVyeUFyZ3VtZW50cy5vdnJyQXJncy5sZW5ndGggPSB0aGlzLnN0YXRlLnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcXVlcnlBcmd1bWVudHM7XG4gIH1cblxuICBnZXRTcWxUeXBlc0ZvckZpbHRlcihmaWx0ZXIpOiBvYmplY3Qge1xuICAgIGNvbnN0IGFsbFNxbFR5cGVzID0gdGhpcy5nZXRTcWxUeXBlcygpO1xuICAgIGNvbnN0IHNxbFR5cGVzID0ge307XG4gICAgaWYgKCFVdGlsLmlzT2JqZWN0RW1wdHkoZmlsdGVyKSkge1xuICAgICAgT2JqZWN0LmtleXMoYWxsU3FsVHlwZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGZpbHRlci5pbmRleE9mKGtleSkgIT09IC0xICYmIGFsbFNxbFR5cGVzW2tleV0gIT09IFNRTFR5cGVzLk9USEVSKSB7XG4gICAgICAgICAgc3FsVHlwZXNba2V5XSA9IGFsbFNxbFR5cGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc3FsVHlwZXM7XG4gIH1cblxuICBvbkV4cG9ydEJ1dHRvbkNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uRXhwb3J0QnV0dG9uQ2xpY2tlZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbmdlQ29sdW1uc1Zpc2liaWxpdHlDbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vbkNoYW5nZUNvbHVtbnNWaXNpYmlsaXR5Q2xpY2tlZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uTWF0VGFibGVDb250ZW50Q2hhbmdlZCgpIHtcbiAgICAvL1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIG5hdmlnYXRpb24gdG8gbmV3IGl0ZW0gaW5zZXJ0aW9uXG4gICAqL1xuICBhZGQoKSB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIGlmICh0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9JTlNFUlQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmluc2VydERldGFpbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgc2VsZWN0ZWQgcm93c1xuICAgKiBAcGFyYW0gW2NsZWFyU2VsZWN0ZWRJdGVtc11cbiAgICovXG4gIHJlbW92ZShjbGVhclNlbGVjdGVkSXRlbXM6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICBpZiAodGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNoZWNrRW5hYmxlZEFjdGlvblBlcm1pc3Npb24oUGVybWlzc2lvbnNVdGlscy5BQ1RJT05fREVMRVRFKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XG4gICAgaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNvbmZpcm0oJ0NPTkZJUk0nLCAnTUVTU0FHRVMuQ09ORklSTV9ERUxFVEUnKS50aGVuKHJlcyA9PiB7XG4gICAgICBpZiAocmVzID09PSB0cnVlKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFTZXJ2aWNlICYmICh0aGlzLmRlbGV0ZU1ldGhvZCBpbiB0aGlzLmRhdGFTZXJ2aWNlKSAmJiB0aGlzLmVudGl0eSAmJiAodGhpcy5rZXlzQXJyYXkubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gU2VydmljZVV0aWxzLmdldEFycmF5UHJvcGVydGllcyhzZWxlY3RlZEl0ZW1zLCB0aGlzLmtleXNBcnJheSk7XG4gICAgICAgICAgY29uc3Qgc3FsVHlwZXNBcmcgPSB0aGlzLmdldFNxbFR5cGVzT2ZLZXlzKCk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nU2VydmljZS5zZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICAgIHRoaXMuZGFvVGFibGUucmVtb3ZlUXVlcnkoZmlsdGVycywgc3FsVHlwZXNBcmcpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmV4dDogKHYpID0+IHtcbiAgICAgICAgICAgICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLm9uUm93RGVsZXRlZCwgc2VsZWN0ZWRJdGVtcyk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RpYWxvZ0Vycm9yKGUsICdNRVNTQUdFUy5FUlJPUl9ERUxFVEUnKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBFbnN1cmluZyB0aGF0IHRoZSBkZWxldGVkIGl0ZW1zIHdpbGwgbm90IGxvbmdlciBiZSBwYXJ0IG9mIHRoZSBzZWxlY3Rpb25Nb2RlbFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc2VsZWN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmZvcm1MYXlvdXRNYW5hZ2VyLmNsb3NlRGV0YWlscyhmaWx0ZXJzLCB7IGV4aXRXaXRob3V0Q29uZmlybWF0aW9uOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZERhdGEoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRlbGV0ZUxvY2FsSXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjbGVhclNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaHMgdGFibGUgY29tcG9uZW50XG4gICAqL1xuICByZWZyZXNoKCkge1xuICAgIHRoaXMucmVsb2FkRGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGFuZCBzZWxlY3QgYWxsIGNoZWNrYm94XG4gICAqL1xuICBzaG93QW5kU2VsZWN0QWxsQ2hlY2tib3goKSB7XG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0QWxsQ2hlY2tib3gpIHtcbiAgICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLmluaXRpYWxpemVDaGVja2JveENvbHVtbigpO1xuICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICB9XG4gIH1cblxuICByZWxvYWRQYWdpbmF0ZWREYXRhRnJvbVN0YXJ0KGNsZWFyU2VsZWN0ZWRJdGVtczogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBwYWdlIGluZGV4XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMDtcbiAgICAgIHRoaXMucmVsb2FkRGF0YShjbGVhclNlbGVjdGVkSXRlbXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWRzIGRhdGFcbiAgICovXG4gIHJlbG9hZERhdGEoY2xlYXJTZWxlY3RlZEl0ZW1zOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRoaXMubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLnJlbG9hZERhdGFXaXRoQ2xlYXJFeHBhbmRhYmxlUm93cyhjbGVhclNlbGVjdGVkSXRlbXMsIGNsZWFyU2VsZWN0ZWRJdGVtcylcbiAgfVxuXG4gIHJlbG9hZERhdGFXaXRoQ2xlYXJFeHBhbmRhYmxlUm93cyhjbGVhclNlbGVjdGVkSXRlbXM6IGJvb2xlYW4gPSB0cnVlLCBjbGVhckV4cGFuZGFibGVJdGVtczogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9SRUZSRVNIKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSkge1xuICAgICAgaWYgKGNsZWFyRXhwYW5kYWJsZUl0ZW1zKSB7XG4gICAgICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0/LmNsZWFyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZnJlc2hFeHBhbmRhYmxlUm93U3RhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29tcG9uZW50U3RhdGVTZXJ2aWNlLnJlZnJlc2hTZWxlY3Rpb24oKTtcblxuICAgIGlmIChjbGVhclNlbGVjdGVkSXRlbXMpIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgdGhpcy5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1F1ZXJ5ID0gdHJ1ZTtcbiAgICBsZXQgcXVlcnlBcmdzOiBPUXVlcnlEYXRhQXJncztcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgcXVlcnlBcmdzID0ge1xuICAgICAgICBvZmZzZXQ6IHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnF1ZXJ5Um93cyxcbiAgICAgICAgbGVuZ3RoOiB0aGlzLnF1ZXJ5Um93c1xuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5zdG9wRWRpdGlvbihmYWxzZSk7XG4gICAgdGhpcy5xdWVyeURhdGEodm9pZCAwLCBxdWVyeUFyZ3MpO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2socm93OiBhbnksIGNvbHVtbjogT0NvbHVtbiwgcm93SW5kZXg6IG51bWJlciwgY2VsbFJlZjogRWxlbWVudFJlZiwgZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmNsaWNrU3ViamVjdC5uZXh0KHsgcm93LCBjb2x1bW4sIGNlbGxSZWYsIHJvd0luZGV4LCBldmVudCB9KTtcbiAgfVxuXG4gIGRvSGFuZGxlQ2xpY2socm93OiBhbnksIGNvbHVtbjogc3RyaW5nLCByb3dJbmRleDogbnVtYmVyLCAkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgaWYgKHRoaXMuc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHkpIHtcbiAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCh0aGlzLmRldGFpbE1vZGUgPT09IENvZGVzLkRFVEFJTF9NT0RFX0NMSUNLKSkge1xuICAgICAgdGhpcy5oYW5kbGVEZXRhaWxNb2RlQ2xpY2socm93LCBjb2x1bW4sIHJvd0luZGV4LCAkZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBzZWxlY3Rpb24gKEN0cmwvQ21kIG9yIFNoaWZ0KVxuICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uTW9kZU11bHRpcGxlKCkpIHtcbiAgICAgIGlmICgkZXZlbnQuY3RybEtleSB8fCAkZXZlbnQubWV0YUtleSkge1xuICAgICAgICB0aGlzLmhhbmRsZU11bHRpcGxlU2VsZWN0aW9uQ3RybChyb3csIGNvbHVtbiwgcm93SW5kZXgsICRldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCRldmVudC5zaGlmdEtleSkge1xuICAgICAgICB0aGlzLmhhbmRsZU11bHRpcGxlU2VsZWN0aW9uU2hpZnQocm93LCBjb2x1bW4sIHJvd0luZGV4LCAkZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdGlvbiBtb2RlcyBPVEhFUiB0aGFuICdub25lJ1xuICAgIGlmICghdGhpcy5pc1NlbGVjdGlvbk1vZGVOb25lKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlT3RoZXJTZWxlY3Rpb25Nb2Rlcyhyb3cpO1xuXG4gICAgfVxuICAgIC8vIEVtaXQgb25DbGljayBldmVudCBldmVuIHdoZW4gc2VsZWN0aW9uIGlzIGRpc2FibGVkXG4gICAgdGhpcy5vbkNsaWNrLmVtaXQoeyByb3c6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4LCBtb3VzZUV2ZW50OiAkZXZlbnQsIGNvbHVtbk5hbWU6IGNvbHVtbiwgY2VsbDogcm93W2NvbHVtbl0gfSk7XG5cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT3RoZXJTZWxlY3Rpb25Nb2Rlcyhyb3c6IGFueSkge1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcbiAgICBpZiAodGhpcy5pc1Jvd1NlbGVjdGVkKHJvdykgJiYgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDEgJiYgdGhpcy5lZGl0aW9uRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25PblJvd0NsaWNrKSB7XG4gICAgICB0aGlzLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3cpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGV0YWlsTW9kZUNsaWNrKHJvdzogYW55LCBjb2x1bW46IHN0cmluZywgcm93SW5kZXg6IG51bWJlciwgJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaXNOYXZpZ2F0aW5nKSByZXR1cm47XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pc05hdmlnYXRpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5vbkNsaWNrLmVtaXQoeyByb3c6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4LCBtb3VzZUV2ZW50OiAkZXZlbnQsIGNvbHVtbk5hbWU6IGNvbHVtbiwgY2VsbDogcm93W2NvbHVtbl0gfSk7XG4gICAgdGhpcy5zYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnNlbGVjdGVkUm93KHJvdyk7XG4gICAgdGhpcy52aWV3RGV0YWlsKHJvdyk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU11bHRpcGxlU2VsZWN0aW9uQ3RybChyb3c6IGFueSwgY29sdW1uOiBzdHJpbmcsIHJvd0luZGV4OiBudW1iZXIsICRldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbk9uUm93Q2xpY2spIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICB9XG4gICAgdGhpcy5vbkNsaWNrLmVtaXQoeyByb3c6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4LCBtb3VzZUV2ZW50OiAkZXZlbnQsIGNvbHVtbk5hbWU6IGNvbHVtbiwgY2VsbDogcm93W2NvbHVtbl0gfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU11bHRpcGxlU2VsZWN0aW9uU2hpZnQocm93OiBhbnksIGNvbHVtbjogc3RyaW5nLCByb3dJbmRleDogbnVtYmVyLCAkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25PblJvd0NsaWNrKSB7XG4gICAgICB0aGlzLmhhbmRsZU11bHRpcGxlU2VsZWN0aW9uKHJvdyk7XG4gICAgfVxuICAgIHRoaXMub25DbGljay5lbWl0KHsgcm93OiByb3csIHJvd0luZGV4OiByb3dJbmRleCwgbW91c2VFdmVudDogJGV2ZW50LCBjb2x1bW5OYW1lOiBjb2x1bW4sIGNlbGw6IHJvd1tjb2x1bW5dIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBIYW5kbGVzIG11bHRpcGxlIHNlbGVjdGlvbiB3aXRoIFNoaWZ0IGtleSAocmFuZ2Ugc2VsZWN0aW9uKVxuICogKi9cbiAgaGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24oaXRlbTogYW55KSB7XG4gICAgLy8gRXhpdCBpZiBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSBpcyBub3QgZW5hYmxlZFxuICAgIGlmICghdGhpcy5pc1NlbGVjdGlvbk1vZGVNdWx0aXBsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgc2VsZWN0aW9uLCBzZWxlY3QgdGhlIGN1cnJlbnQgcm93XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZE11bHRpcGxlc1Jvd3MoW2l0ZW1dKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc2VsZWN0ZWQgcm93IGFuZCB0aGUgY3VycmVudCByb3dcbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuaW5kZXhPZih0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZFswXSk7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuaW5kZXhPZihpdGVtKTtcblxuICAgIC8vIERldGVybWluZSB0aGUgcmFuZ2Ugb2YgaW5kaWNlcyB0byBzZWxlY3RcbiAgICBjb25zdCBpbmRleEZyb20gPSBNYXRoLm1pbihmaXJzdCwgbGFzdCk7XG4gICAgY29uc3QgaW5kZXhUbyA9IE1hdGgubWF4KGZpcnN0LCBsYXN0KTtcblxuXG4gICAgLy8gR2V0IGFsbCByb3dzIHdpdGhpbiB0aGUgc2VsZWN0ZWQgcmFuZ2VcbiAgICBjb25zdCByb3dzSW5SYW5nZSA9IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuc2xpY2UoaW5kZXhGcm9tLCBpbmRleFRvICsgMSk7XG5cbiAgICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlIHNlbGVjdGlvbiBldmVudHMgd2hpbGUgY2xlYXJpbmdcbiAgICB0aGlzLnRyaWdnZXJTZWxlY3Rpb25FdmVudHMgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyA9IHRydWU7XG5cbiAgICAvLyBTZWxlY3QgYWxsIHZhbGlkIHJvd3Mgd2l0aGluIHRoZSByYW5nZVxuICAgIHRoaXMuc2VsZWN0ZWRNdWx0aXBsZXNSb3dzKHJvd3NJblJhbmdlKTtcblxuICB9XG5cbiAgcHJvdGVjdGVkIHNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCkge1xuICAgIHN1cGVyLnNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCk7XG4gICAgdGhpcy5zdG9yZVBhZ2luYXRpb25TdGF0ZSA9IHRydWU7XG4gIH1cblxuICBoYW5kbGVEb3VibGVDbGljayhyb3c6IGFueSwgY29sdW1uOiBPQ29sdW1uLCByb3dJbmRleDogbnVtYmVyLCBjZWxsUmVmOiBFbGVtZW50UmVmLCBldmVudDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuZGJsY2xpY2tTdWJqZWN0Lm5leHQoeyByb3csIGNvbHVtbiwgY2VsbFJlZiwgcm93SW5kZXgsIGV2ZW50IH0pO1xuICB9XG5cbiAgZ2V0IGVkaXRpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuc29tZShpdGVtID0+IGl0ZW0uZWRpdGluZyk7XG4gIH1cblxuICBoYW5kbGVET01DbGljayhldmVudCkge1xuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWRpdGlvbkVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5Q29udGFpbmVyID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjZGstb3ZlcmxheS1jb250YWluZXInKVswXTtcbiAgICBpZiAob3ZlcmxheUNvbnRhaW5lciAmJiBvdmVybGF5Q29udGFpbmVyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuby10YWJsZS1jb250YWluZXInKTtcbiAgICBjb25zdCB0YWJsZUNvbnRlbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm8tdGFibGUtY29udGFpbmVyIHRhYmxlLm1hdC10YWJsZScpO1xuICAgIGlmICh0YWJsZUNvbnRhaW5lciAmJiB0YWJsZUNvbnRlbnQgJiYgdGFibGVDb250YWluZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAhdGFibGVDb250ZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWN0aXZhdGVDb2x1bW5FZGl0aW9uKGNvbHVtbjogT0NvbHVtbiwgcm93OiBhbnksIGNlbGxSZWY6IGFueSkge1xuICAgIGlmIChjZWxsUmVmICYmIGNvbHVtbi5lZGl0aW5nICYmIHRoaXMuZWRpdGluZ0NlbGwgPT09IGNlbGxSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uUGVybWlzc2lvbnM6IE9QZXJtaXNzaW9ucyA9IHRoaXMuZ2V0T0NvbHVtblBlcm1pc3Npb25zKGNvbHVtbi5hdHRyKTtcbiAgICBpZiAoY29sdW1uUGVybWlzc2lvbnMuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHtjb2x1bW4uYXR0cn0gZWRpdGlvbiBub3QgYWxsb3dlZCBkdWUgdG8gcGVybWlzc2lvbnNgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uQW5kRWRpdGluZygpO1xuICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICB0aGlzLmVkaXRpbmdDZWxsID0gY2VsbFJlZjtcbiAgICBjb25zdCByb3dEYXRhID0ge307XG4gICAgdGhpcy5rZXlzQXJyYXkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICByb3dEYXRhW2tleV0gPSByb3dba2V5XTtcbiAgICB9KTtcbiAgICByb3dEYXRhW2NvbHVtbi5hdHRyXSA9IHJvd1tjb2x1bW4uYXR0cl07XG4gICAgdGhpcy5lZGl0aW5nUm93ID0gcm93O1xuICAgIGNvbHVtbi5lZGl0aW5nID0gdHJ1ZTtcbiAgICBjb2x1bW4uZWRpdG9yLnN0YXJ0RWRpdGlvbihyb3dEYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZUNlbGxEYXRhKGNvbHVtbjogT0NvbHVtbiwgZGF0YTogYW55LCBzYXZlQ2hhbmdlczogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX1VQREFURSkpIHtcbiAgICAgIGNvbnN0IHJlcyA9IG5ldyBPYnNlcnZhYmxlKGlubmVyT2JzZXJ2ZXIgPT4ge1xuICAgICAgICBpbm5lck9ic2VydmVyLmVycm9yKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGNvbHVtbi5lZGl0aW5nID0gZmFsc2U7XG4gICAgaWYgKHNhdmVDaGFuZ2VzICYmIHRoaXMuZWRpdGluZ1JvdyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuZWRpdGluZ1JvdywgZGF0YSk7XG4gICAgfVxuICAgIHRoaXMuc3RvcEVkaXRpb24oKTtcbiAgICBpZiAoc2F2ZUNoYW5nZXMgJiYgY29sdW1uLmVkaXRvci51cGRhdGVSZWNvcmRPbkVkaXQpIHtcbiAgICAgIHRoaXMuc2F2ZVNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICBjb25zdCB0b1VwZGF0ZSA9IHt9O1xuICAgICAgdG9VcGRhdGVbY29sdW1uLmF0dHJdID0gZGF0YVtjb2x1bW4uYXR0cl07XG4gICAgICBjb25zdCBrdiA9IHRoaXMuZXh0cmFjdEtleXNGcm9tUmVjb3JkKGRhdGEpO1xuICAgICAgY29uc3QgdXBkYXRlT2JzZXJ2YWJsZSA9IHRoaXMudXBkYXRlUmVjb3JkKGt2LCB0b1VwZGF0ZSk7XG5cbiAgICAgIGlmICh1cGRhdGVPYnNlcnZhYmxlKSB7XG4gICAgICAgIHVwZGF0ZU9ic2VydmFibGUuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIC8vIOKchSBSZXN0YXVyYXIgcG9zaWNpw7NuIGRlbCBzY3JvbGwgREVTUFXDiVMgZGUgYWN0dWFsaXphclxuICAgICAgICAgICAgdGhpcy5yZXN0b3JlU2Nyb2xsUG9zaXRpb24oKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHVwZGF0aW5nIGNlbGw6JywgZXJyb3IpO1xuICAgICAgICAgICAgLy8gVGFtYmnDqW4gcmVzdGF1cmFyIGVuIGNhc28gZGUgZXJyb3JcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZVNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1cGRhdGVPYnNlcnZhYmxlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEtleXNWYWx1ZXMoKTogYW55W10ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldEFsbFZhbHVlcygpO1xuICAgIHJldHVybiBkYXRhLm1hcCgocm93KSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgIHRoaXMua2V5c0FycmF5LmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAocm93W2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9ialtrZXldID0gcm93W2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0pO1xuICB9XG5cbiAgb25TaG93c1NlbGVjdHMoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uU2hvd3NTZWxlY3RzKCk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZUNoZWNrYm94Q29sdW1uKCkge1xuICAgIC8vIEluaXRpYWxpemluZyByb3cgc2VsZWN0aW9uIGxpc3RlbmVyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGlvbkNoYW5nZVN1YnNjcmlwdGlvbiAmJiAhdGhpcy5pc1NlbGVjdGlvbk1vZGVOb25lKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5zZWxlY3Rpb24uY2hhbmdlZC5zdWJzY3JpYmUoKHNlbGVjdGlvbkRhdGE6IFNlbGVjdGlvbkNoYW5nZTxhbnk+KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXJTZWxlY3Rpb25FdmVudHMgJiYgc2VsZWN0aW9uRGF0YSkge1xuICAgICAgICAgIGlmIChzZWxlY3Rpb25EYXRhLmFkZGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25Sb3dTZWxlY3RlZCwgc2VsZWN0aW9uRGF0YS5hZGRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWxlY3Rpb25EYXRhLnJlbW92ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vblJvd0Rlc2VsZWN0ZWQsIHNlbGVjdGlvbkRhdGEucmVtb3ZlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTZWxlY3Rpb25Db2x1bW5TdGF0ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGlvbkNvbHVtblN0YXRlKCkge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSkge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucyAmJiB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXG4gICAgICAmJiB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zWzBdICE9PSBDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMudW5zaGlmdChDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucyAmJiAhdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZVxuICAgICAgJiYgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uc1swXSA9PT0gQ29kZXMuTkFNRV9DT0xVTU5fU0VMRUNUKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLnNoaWZ0KCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlU3RhdGVFeHBhbmRlZENvbHVtbigpO1xuICB9XG5cbiAgcHVibGljIGdldE51bVJvd1NlbGVjdGVkSW5DdXJyZW50RGF0YSgpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5kYXRhU291cmNlPy5yZW5kZXJlZERhdGEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5maWx0ZXIoeCA9PiAhdGhpcy5pc0Rpc2FibGVDaGVja2JveCh4KSAmJiB0aGlzLmlzUm93U2VsZWN0ZWQoeCkpXG4gICAgICAubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLmdldE51bVJvd1NlbGVjdGVkSW5DdXJyZW50RGF0YSgpO1xuICAgIGNvbnN0IG51bVNlbGVjdGFibGVSb3dzID0gdGhpcy5kYXRhU291cmNlPy5yZW5kZXJlZERhdGE/LmZpbHRlcihcbiAgICAgIHJvdyA9PiAhdGhpcy5pc0Rpc2FibGVDaGVja2JveChyb3cpXG4gICAgKS5sZW5ndGggPz8gMDtcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPiAwICYmIG51bVNlbGVjdGVkID09PSBudW1TZWxlY3RhYmxlUm93cztcbiAgfVxuXG4gIHB1YmxpYyBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLmdldE51bVJvd1NlbGVjdGVkSW5DdXJyZW50RGF0YSgpO1xuICAgIGNvbnN0IG51bVNlbGVjdGFibGVSb3dzID0gdGhpcy5kYXRhU291cmNlPy5yZW5kZXJlZERhdGE/LmZpbHRlcihcbiAgICAgIHJvdyA9PiAhdGhpcy5pc0Rpc2FibGVDaGVja2JveChyb3cpXG4gICAgKS5sZW5ndGggPz8gMDtcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPiAwICYmIG51bVNlbGVjdGVkIDwgbnVtU2VsZWN0YWJsZVJvd3M7XG4gIH1cblxuICBwdWJsaWMgbWFzdGVyVG9nZ2xlKGV2ZW50OiBNYXRDaGVja2JveENoYW5nZSk6IHZvaWQge1xuICAgIGV2ZW50LmNoZWNrZWQgPyB0aGlzLnNlbGVjdEFsbCgpIDogdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTXVsdGlwbGVzUm93cyh0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3Rpb25DaGVja2JveFRvZ2dsZShldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UsIHJvdzogYW55KTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVSb3dTZWxlY3Rpb24ocm93KTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RlZFJvdyhyb3c6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5TZWxlY3RSb3cocm93KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkTXVsdGlwbGVzUm93cyhbcm93XSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHNldCBtdWx0aXBsZSBpdGVtcyBhcyBzZWxlY3RlZFxuICAgKiBUcmlnZ2VycyBvbmx5IE9ORSBldmVudCB3aXRoIGFsbCBpdGVtc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXRTZWxlY3RlZE11bHRpcGxlKGl0ZW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSB8fCAhaXRlbXMgfHwgaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW4gc2luZ2xlIG1vZGUsIGNsZWFyIHRoZSBwcmV2aW91cyBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbk1vZGVTaW5nbGUoKSAmJiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRyaWdnZXJTZWxlY3Rpb25FdmVudHMgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICB0aGlzLnRyaWdnZXJTZWxlY3Rpb25FdmVudHMgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGUgZXZlbnRzXG4gICAgdGhpcy50cmlnZ2VyU2VsZWN0aW9uRXZlbnRzID0gZmFsc2U7XG5cbiAgICAvLyBTZWxlY3QgYWxsIGl0ZW1zIGF0IG9uY2VcbiAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoLi4uaXRlbXMpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBzdGF0ZVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgICB9XG5cbiAgICAvLyBSZS1lbmFibGUgZXZlbnRzXG4gICAgdGhpcy50cmlnZ2VyU2VsZWN0aW9uRXZlbnRzID0gdHJ1ZTtcblxuXG4gICAgLy8gRW1pdCBhIFNJTkdMRSBldmVudCB3aXRoIGFsbCBzZWxlY3RlZCBpdGVtc1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25Sb3dTZWxlY3RlZCwgaXRlbXMpO1xuICB9XG5cbiAgLyoqXG4gICogU2VsZWN0cyBtdWx0aXBsZSByb3dzIGF0IG9uY2Ugd2l0aCBwcm9wZXIgdmFsaWRhdGlvblxuICAqIEVtaXRzIGEgc2luZ2xlIG9uUm93U2VsZWN0ZWQgZXZlbnQgd2l0aCBhbGwgc2VsZWN0ZWQgcm93c1xuICAqL1xuICBwdWJsaWMgc2VsZWN0ZWRNdWx0aXBsZXNSb3dzKHJvd3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCFyb3dzIHx8IHJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRSb3dzID0gdGhpcy5maWx0ZXJWYWxpZFJvd3NGb3JTZWxlY3Rpb24ocm93cyk7XG4gICAgaWYgKHZhbGlkUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlbGVjdGVkTXVsdGlwbGUodmFsaWRSb3dzKTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zZWxlY3Rpb24pKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIH1cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMuc3RhdGUuc2VsZWN0aW9uID0gW107XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFNlbGVjdGVkKGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoaXRlbSkpIHtcbiAgICAgIGlmICh0aGlzLmlzUm93U2VsZWN0ZWQoaXRlbSkpIHtcbiAgICAgICAgLyoqVGhlIHNlbGVjdGVkIGl0ZW0gaXMgY2xlYXJlZCBpZiB0aGUgaXRlbSBjaGFuZ2VzIHZhbHVlKi9cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0U2VsZWN0ZWRCeUtleXMoa2V5VmFsdWVzOiBBcnJheTxhbnk+KSB7XG4gICAgY29uc3Qgcm93c1RvU2VsZWN0ID0gdGhpcy5nZXREYXRhQXJyYXkoKS5maWx0ZXIocm93ID0+IHtcbiAgICAgIHJldHVybiBrZXlWYWx1ZXMuZmluZEluZGV4KGtleVZhbHVlID0+IHJvd1t0aGlzLmtleXNdID09PSBrZXlWYWx1ZSkgPiAtMTtcbiAgICB9KTtcbiAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoLi4ucm93c1RvU2VsZWN0KTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkQnlNdWx0aXBsZUtleXMoa2V5VmFsdWVzOiBBcnJheTxPYmplY3Q+KSB7XG4gICAgY29uc3Qgcm93c1RvU2VsZWN0ID0gdGhpcy5nZXREYXRhQXJyYXkoKS5maWx0ZXIocm93ID0+IHtcbiAgICAgIHJldHVybiBrZXlWYWx1ZXMuZmluZEluZGV4KGtleVZhbHVlID0+XG4gICAgICAgIE9iamVjdC5rZXlzKGtleVZhbHVlKS5ldmVyeShrZXkgPT4ga2V5VmFsdWVba2V5XSA9PT0gcm93W2tleV0pXG4gICAgICApID4gLTE7XG4gICAgfSk7XG4gICAgcm93c1RvU2VsZWN0LmV2ZXJ5KHJvd1RvU2VsZWN0ID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3dUb1NlbGVjdCkpO1xuICB9XG5cbiAgc2V0U2VsZWN0ZWRCeVJvd0lkcyhyb3dJZHM6IEFycmF5PG51bWJlcj4pIHtcbiAgICByb3dJZHMuZm9yRWFjaChyb3dJZCA9PiB0aGlzLnNlbGVjdGVkUm93KHRoaXMuZ2V0RGF0YUFycmF5KClbcm93SWRdKSk7XG4gIH1cblxuICBnZXQgc2hvd0RlbGV0ZUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZWxldGVCdXR0b247XG4gIH1cblxuICBwcml2YXRlIGNhblNlbGVjdFJvdyhyb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQocm93KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRGlzYWJsZUNoZWNrYm94KHJvdykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyVmFsaWRSb3dzRm9yU2VsZWN0aW9uKHJvd3M6IGFueVtdKTogYW55W10ge1xuICAgIHJldHVybiByb3dzLmZpbHRlcihyb3cgPT4gdGhpcy5jYW5TZWxlY3RSb3cocm93KSk7XG4gIH1cblxuXG4gIGdldFRyYWNrQnlGdW5jdGlvbigpOiAoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSA9PiBzdHJpbmcge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgcmV0dXJuIChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpID0+IHtcblxuICAgICAgbGV0IGl0ZW1JZDogc3RyaW5nID0gJyc7XG5cbiAgICAgIGlmICh0aGlzLmlzR3JvdXAoaW5kZXgsIGl0ZW0pKSB7XG4gICAgICAgIGl0ZW1JZCArPSBpdGVtLmNvbHVtbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGtleXNMZW5naHQgPSBzZWxmLmtleXNBcnJheS5sZW5ndGg7XG4gICAgICAgIHNlbGYua2V5c0FycmF5LmZvckVhY2goKGtleTogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGlkeCA8IChrZXlzTGVuZ2h0IC0gMSkgPyAnOycgOiAnJztcbiAgICAgICAgICBpdGVtSWQgKz0gaXRlbVtrZXldICsgc3VmZml4O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzQXN5bmNBbmRWaXNpYmxlQ29scyA9IHRoaXMuYXN5bmNMb2FkQ29sdW1ucy5zb21lKGMgPT4gdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5pbmNsdWRlcyhjKSk7XG4gICAgICBpZiAoc2VsZi5hc3luY0xvYWRDb2x1bW5zLmxlbmd0aCAmJiBoYXNBc3luY0FuZFZpc2libGVDb2xzICYmICFzZWxmLmZpbmlzaFF1ZXJ5U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHNlbGYucXVlcnlSb3dBc3luY0RhdGEoaW5kZXgsIGl0ZW0pO1xuICAgICAgICBpZiAoc2VsZi5wYWdpbmF0b3IgJiYgaW5kZXggPT09IChzZWxmLnBhZ2luYXRvci5wYWdlU2l6ZSAtIDEpKSB7XG4gICAgICAgICAgc2VsZi5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1JZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpdGVtSWQ7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHF1ZXJ5Um93QXN5bmNEYXRhKHJvd0luZGV4OiBudW1iZXIsIHJvd0RhdGE6IGFueSkge1xuICAgIGNvbnN0IGt2ID0gU2VydmljZVV0aWxzLmdldE9iamVjdFByb3BlcnRpZXMocm93RGF0YSwgdGhpcy5rZXlzQXJyYXkpO1xuICAgIC8vIFJlcGVhdGluZyBjaGVja2luZyBvZiB2aXNpYmxlIGNvbHVtblxuICAgIGNvbnN0IGF2ID0gdGhpcy5hc3luY0xvYWRDb2x1bW5zLmZpbHRlcihjID0+IHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuaW5kZXhPZihjKSAhPT0gLTEpO1xuICAgIGlmIChhdi5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFNraXBwaW5nIHF1ZXJ5IGlmIHRoZXJlIGFyZSBub3QgdmlzaWJsZSBhc3luY3JvbiBjb2x1bW5zXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtblF1ZXJ5QXJncyA9IFtrdiwgYXYsIHRoaXMuZW50aXR5LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xuICAgIGNvbnN0IHF1ZXJ5TWV0aG9kTmFtZSA9IHRoaXMucGFnZWFibGUgPyB0aGlzLnBhZ2luYXRlZFF1ZXJ5TWV0aG9kIDogdGhpcy5xdWVyeU1ldGhvZDtcbiAgICBpZiAodGhpcy5kYXRhU2VydmljZSAmJiAocXVlcnlNZXRob2ROYW1lIGluIHRoaXMuZGF0YVNlcnZpY2UpICYmIHRoaXMuZW50aXR5KSB7XG4gICAgICBpZiAodGhpcy5hc3luY0xvYWRTdWJzY3JpcHRpb25zW3Jvd0luZGV4XSkge1xuICAgICAgICB0aGlzLmFzeW5jTG9hZFN1YnNjcmlwdGlvbnNbcm93SW5kZXhdLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFzeW5jTG9hZFN1YnNjcmlwdGlvbnNbcm93SW5kZXhdID0gdGhpcy5kYXRhU2VydmljZVtxdWVyeU1ldGhvZE5hbWVdKC4uLmNvbHVtblF1ZXJ5QXJncylcbiAgICAgICAgLnN1YnNjcmliZSgocmVzOiBTZXJ2aWNlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgICAgIGlmIChVdGlsLmlzQXJyYXkocmVzLmRhdGEpICYmIHJlcy5kYXRhLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICBkYXRhID0gcmVzLmRhdGFbMF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFV0aWwuaXNPYmplY3QocmVzLmRhdGEpKSB7XG4gICAgICAgICAgICAgIGRhdGEgPSByZXMuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGFvVGFibGUuc2V0QXN5bmNocm9ub3VzQ29sdW1uKGRhdGEsIHJvd0RhdGEpO1xuICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgZGF0YS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Q3VycmVudERhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHZhbHVlc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0QWxsVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Q3VycmVudEFsbERhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHJlbmRlcmVkIHZhbHVlc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0QWxsUmVuZGVyZWRWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5nZXRBbGxSZW5kZXJlckRhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFnZSB0YWJsZSByZW5kZXJlciBkYXRhLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0UmVuZGVyZWRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmdldEN1cnJlbnRSZW5kZXJlckRhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgc3FsIHR5cGVzIGZyb20gZGF0YSBzb3VyY2UgYW5kIHRhYmxlIGNvbHVtbnNcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFNxbFR5cGVzKCkge1xuICAgIGNvbnN0IGFsbFNxbFR5cGVzID0gVXRpbC5pc0RlZmluZWQodGhpcy5kYXRhU291cmNlLnNxbFR5cGVzKSA/IHRoaXMuZGF0YVNvdXJjZS5zcWxUeXBlcyA6IHt9O1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKChjb2w6IE9Db2x1bW4pID0+IHtcbiAgICAgIGlmIChjb2wuc3FsVHlwZSkge1xuICAgICAgICBhbGxTcWxUeXBlc1tjb2wuYXR0cl0gPSBjb2wuc3FsVHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWxsU3FsVHlwZXM7XG4gIH1cblxuICBzZXRPVGFibGVDb2x1bW5zRmlsdGVyKHRhYmxlQ29sdW1uc0ZpbHRlcjogT1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCkge1xuICAgIHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCA9IHRhYmxlQ29sdW1uc0ZpbHRlcjtcbiAgfVxuXG4gIGdldCBmaWx0ZXJDb2x1bW5zKCk6IE9GaWx0ZXJDb2x1bW5bXSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uZmlsdGVyQ29sdW1ucyA9PT0gdGhpcy5vcmlnaW5hbEZpbHRlckNvbHVtbnNcbiAgICAgICYmIHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucykge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxGaWx0ZXJDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IG9yaWdpbmFsRmlsdGVyQ29sdW1ucygpOiBBcnJheTxPRmlsdGVyQ29sdW1uPiB7XG4gICAgbGV0IHNvcnRDb2x1bW5zRmlsdGVyID0gW107XG4gICAgaWYgKHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgc29ydENvbHVtbnNGaWx0ZXIgPSB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1uc0FycmF5O1xuICAgIH1cbiAgICByZXR1cm4gc29ydENvbHVtbnNGaWx0ZXI7XG4gIH1cblxuICBnZXQgb3JpZ2luYWxHcm91cGVkQ29sdW1uc0FycmF5KCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiBVdGlsLnBhcnNlQXJyYXkodGhpcy5ncm91cGVkQ29sdW1ucywgdHJ1ZSk7XG4gIH1cblxuICBnZXRTdG9yZWRDb2x1bW5zRmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdG9yZWRGaWx0ZXJzO1xuICB9XG5cbiAgZ2V0U3RvcmVkR3JvdXBlZENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuc3RvcmVkQ29uZmlndXJhdGlvbnM7XG4gIH1cblxuICBvbkZpbHRlckJ5Q29sdW1uQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25GaWx0ZXJCeUNvbHVtbkNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBvblN0b3JlRmlsdGVyQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25TdG9yZUZpbHRlckNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBvbkxvYWRGaWx0ZXJDbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vbkxvYWRGaWx0ZXJDbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGVhckZpbHRlckNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uQ2xlYXJGaWx0ZXJDbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBmaWx0ZXJzKGNvbHVtbiBmaWx0ZXIsIHF1aWNrZmlsdGVyIGFuZCBmaWx0ZXIgYnVpbGRlcikgYW5kIHJlbG9hZCBkYXRhXG4gICAqIEBwYXJhbSBbdHJpZ2dlckRhdGFzb3VyY2VVcGRhdGVdXG4gICAqL1xuICBjbGVhckZpbHRlcnModHJpZ2dlckRhdGFzb3VyY2VVcGRhdGU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UuY2xlYXJDb2x1bW5GaWx0ZXJzKHRyaWdnZXJEYXRhc291cmNlVXBkYXRlKTtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51ICYmIHRoaXMub1RhYmxlTWVudS5jb2x1bW5GaWx0ZXJPcHRpb24pIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5jb2x1bW5GaWx0ZXJPcHRpb24uc2V0QWN0aXZlKHRoaXMuaXNDb2x1bW5GaWx0ZXJzQWN0aXZlKTtcbiAgICB9XG4gICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoeyBhY3Rpb246ICdyZW1vdmUnIH0pO1xuICAgIGlmICh0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50LnNldFZhbHVlKHZvaWQgMCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyQnVpbGRlcikge1xuICAgICAgdGhpcy5maWx0ZXJCdWlsZGVyLmNsZWFyRmlsdGVyKCk7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIudHJpZ2dlclJlbG9hZCgpO1xuICAgIH1cblxuICB9XG5cbiAgY2xlYXJDb2x1bW5GaWx0ZXIoYXR0cjogc3RyaW5nLCB0cmlnZ2VyRGF0YXNvdXJjZVVwZGF0ZTogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5kYXRhU291cmNlLmNsZWFyQ29sdW1uRmlsdGVyKGF0dHIsIHRyaWdnZXJEYXRhc291cmNlVXBkYXRlKTtcbiAgICB0aGlzLm9uRmlsdGVyQnlDb2x1bW5DaGFuZ2UuZW1pdCh7XG4gICAgICBhY3Rpb246ICdyZW1vdmUnLFxuICAgICAgY29sdW1uczogW2F0dHJdXG4gICAgfSk7XG4gICAgdGhpcy5yZWxvYWRQYWdpbmF0ZWREYXRhRnJvbVN0YXJ0KGZhbHNlKTtcbiAgfVxuXG4gIGZpbHRlckJ5Q29sdW1uKGNvbHVtblZhbHVlRmlsdGVyOiBPQ29sdW1uVmFsdWVGaWx0ZXIpIHtcbiAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgY29uc3QgZXhpc3RpbmdGaWx0ZXIgPSB0aGlzLmdldENvbHVtblZhbHVlRmlsdGVyQnlBdHRyKGNvbHVtblZhbHVlRmlsdGVyLmF0dHIpO1xuICAgIGNvbnN0IGFjdGlvbiA9IGV4aXN0aW5nRmlsdGVyID8gJ3VwZGF0ZScgOiAnYWRkJztcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5hZGRDb2x1bW5GaWx0ZXIoY29sdW1uVmFsdWVGaWx0ZXIpO1xuICAgIHRoaXMub25GaWx0ZXJCeUNvbHVtbkNoYW5nZS5lbWl0KHtcbiAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgY29sdW1uczogW2NvbHVtblZhbHVlRmlsdGVyLmF0dHJdLFxuICAgICAgZmlsdGVyczogW2NvbHVtblZhbHVlRmlsdGVyXVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICB0aGlzLnJlbG9hZFBhZ2luYXRlZERhdGFGcm9tU3RhcnQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyQ29sdW1uRmlsdGVycyh0cmlnZ2VyRGF0YXNvdXJjZVVwZGF0ZTogYm9vbGVhbiA9IHRydWUsIGNvbHVtbnNBdHRyPzogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuY2xlYXJDb2x1bW5GaWx0ZXJzKHRyaWdnZXJEYXRhc291cmNlVXBkYXRlLCBjb2x1bW5zQXR0cik7XG4gICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoe1xuICAgICAgYWN0aW9uOiAncmVtb3ZlJyxcbiAgICAgIGNvbHVtbnM6IGNvbHVtbnNBdHRyXG4gICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWxvYWRQYWdpbmF0ZWREYXRhRnJvbVN0YXJ0KGZhbHNlKTtcbiAgfVxuXG4gIGlzQ29sdW1uRmlsdGVyYWJsZShjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSA/IHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudC5pc0NvbHVtbkZpbHRlcmFibGUoY29sdW1uLmF0dHIpIDogdGhpcy5pc1NlYXJjaGVhYmxlQ29sdW1uKGNvbHVtbik7XG4gIH1cblxuICBpc1NlYXJjaGVhYmxlQ29sdW1uKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaGVhYmxlQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW4uYXR0cik7XG4gIH1cbiAgaXNDb2x1bW5GaWx0ZXJBY3RpdmUoY29sdW1uOiBPQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb2x1bW5GaWx0ZXJzQWN0aXZlICYmIFV0aWwuaXNEZWZpbmVkKHRoaXMuZGF0YVNvdXJjZS5nZXRDb2x1bW5WYWx1ZUZpbHRlckJ5QXR0cihjb2x1bW4uYXR0cikpO1xuICB9XG5cbiAgb3BlbkNvbHVtbkZpbHRlckRpYWxvZyhjb2x1bW46IE9Db2x1bW4sIGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihPVGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgIHRhYmxlOiB0aGlzXG4gICAgICB9LFxuICAgICAgbWluV2lkdGg6ICczODBweCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBwYW5lbENsYXNzOiBbJ28tZGlhbG9nLWNsYXNzJywgJ28tdGFibGUtZGlhbG9nJ11cbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgc3dpdGNoIChyZXN1bHQpIHtcbiAgICAgICAgY2FzZSBUYWJsZUZpbHRlckJ5Q29sdW1uRGlhbG9nUmVzdWx0LkFDQ0VQVDpcbiAgICAgICAgICBjb25zdCBjb2x1bW5WYWx1ZUZpbHRlciA9IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5nZXRDb2x1bW5WYWx1ZXNGaWx0ZXIoKTtcbiAgICAgICAgICB0aGlzLmZpbHRlckJ5Q29sdW1uKGNvbHVtblZhbHVlRmlsdGVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUYWJsZUZpbHRlckJ5Q29sdW1uRGlhbG9nUmVzdWx0LkNMRUFSOlxuICAgICAgICAgIGNvbnN0IGNvbCA9IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5jb2x1bW47XG4gICAgICAgICAgdGhpcy5jbGVhckNvbHVtbkZpbHRlcihjb2wuYXR0cik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLm9uU29ydEZpbHRlclZhbHVlc0NoYW5nZS5zdWJzY3JpYmUoc29ydGVkRmlsdGVyYWJsZUNvbHVtbiA9PiB7XG4gICAgICAvLyBndWFyZGFyIGVuIGxvY2Fsc3RvcmFnZSBlbCBjYW1iaW9cbiAgICAgIHRoaXMuc3RvcmVGaWx0ZXJDb2x1bW5zKHNvcnRlZEZpbHRlcmFibGVDb2x1bW4pO1xuICAgIH0pO1xuICB9XG5cbiAgc3RvcmVGaWx0ZXJDb2x1bW5zKHNvcnRDb2x1bW5GaWx0ZXI6IE9GaWx0ZXJDb2x1bW4pIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zKSB7XG4gICAgICAvLyBpZiBleGlzdHMgaW4gc3RhdGUgdGhlbiB1cGRhdGVkIHNvcnQgdmFsdWVcbiAgICAgIGNvbnN0IGZpbHRlckNvbHVtbiA9IHRoaXMuZmlsdGVyQ29sdW1ucy5maW5kKHggPT4geC5hdHRyID09PSBzb3J0Q29sdW1uRmlsdGVyLmF0dHIpO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGZpbHRlckNvbHVtbikpIHtcbiAgICAgICAgZmlsdGVyQ29sdW1uLnNvcnQgPSBzb3J0Q29sdW1uRmlsdGVyLnNvcnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlbHNlIGV4aXN0cyBpbiBzdGF0ZSB0aGVuIGFkZGVkIGZpbHRlciBjb2x1bW5cbiAgICAgICAgdGhpcy5maWx0ZXJDb2x1bW5zLnB1c2goc29ydENvbHVtbkZpbHRlcik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucyA9IHRoaXMuZmlsdGVyQ29sdW1ucztcbiAgfVxuXG4gIGdldFN0YXJ0Vmlld0ZpbHRlckNvbHVtbihjb2x1bW46IE9Db2x1bW4pOiAnbW9udGgnIHwgJ3llYXInIHwgJ211bHRpLXllYXInIHwgJycge1xuICAgIGxldCBzdGFydFZpZXc7XG4gICAgLy8gYXQgZmlyc3QsIGdldCBzdGF0ZSBpbiBsb2NhbHN0b3JhZ2VcbiAgICBpZiAodGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zKSB7XG4gICAgICB0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMuZm9yRWFjaCgoZWxlbWVudDogT0ZpbHRlckNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5hdHRyID09PSBjb2x1bW4uYXR0cikge1xuICAgICAgICAgIHN0YXJ0VmlldyA9IGVsZW1lbnQuc3RhcnRWaWV3O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHN0YXJ0VmlldykgJiYgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICBzdGFydFZpZXcgPSB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuZ2V0U3RhcnRWaWV3VmFsdWVPZkZpbHRlckNvbHVtbihjb2x1bW4uYXR0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXJ0VmlldztcbiAgfVxuXG4gIGdldFNvcnRGaWx0ZXJDb2x1bW4oY29sdW1uOiBPQ29sdW1uKTogJ2FzYycgfCAnZGVzYycgfCAnJyB7XG4gICAgbGV0IHNvcnRDb2x1bW47XG4gICAgLy8gYXQgZmlyc3QsIGdldCBzdGF0ZSBpbiBsb2NhbHN0b3JhZ2VcbiAgICBpZiAodGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zKSB7XG4gICAgICBjb25zdCBmaWx0ZXJDb2wgPSB0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMuZmluZCgoZWxlbWVudDogT0ZpbHRlckNvbHVtbikgPT4gZWxlbWVudC5hdHRyID09PSBjb2x1bW4uYXR0cik7XG4gICAgICBpZiAoZmlsdGVyQ29sKSB7XG4gICAgICAgIHNvcnRDb2x1bW4gPSBmaWx0ZXJDb2wuc29ydDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiBub3QgdmFsdWUgaW4gbG9jYWxzdG9yYWdlLCBnZXQgc29ydCB2YWx1ZSBpbiBvLXRhYmxlLWNvbHVtbi1maWx0ZXItY29sdW1uIGNvbXBvbmVudFxuICAgIGlmICghVXRpbC5pc0RlZmluZWQoc29ydENvbHVtbikgJiYgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICBzb3J0Q29sdW1uID0gdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50LmdldFNvcnRWYWx1ZU9mRmlsdGVyQ29sdW1uKGNvbHVtbi5hdHRyKTtcbiAgICB9XG5cbiAgICAvLyBpZiBlaXRoZXIgdmFsdWUgaW4gby10YWJsZS1jb2x1bW4tZmlsdGVyLWNvbHVtbiBvciBsb2NhbHN0b3JhZ2UsIGdldCBzb3J0IHZhbHVlIGluIHNvcnRDb2xBcnJheVxuICAgIGlmICghVXRpbC5pc0RlZmluZWQoc29ydENvbHVtbikgJiYgdGhpcy5zb3J0Q29sQXJyYXkuZmluZCh4ID0+IHguY29sdW1uTmFtZSA9PT0gY29sdW1uLmF0dHIpKSB7XG4gICAgICBzb3J0Q29sdW1uID0gdGhpcy5pc0NvbHVtblNvcnRBY3RpdmUoY29sdW1uKSA/ICdhc2MnIDogJ2Rlc2MnO1xuICAgIH1cblxuICAgIHJldHVybiBzb3J0Q29sdW1uO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVUYWJsZU1lbnVCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGVybWlzc2lvbnMgJiYgdGhpcy5wZXJtaXNzaW9ucy5tZW51ICYmIHRoaXMucGVybWlzc2lvbnMubWVudS5lbmFibGVkID09PSBmYWxzZSk7XG4gIH1cblxuICBnZXQgc2hvd1RhYmxlTWVudUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBwZXJtaXNzaW9uSGlkZGVuID0gISEodGhpcy5wZXJtaXNzaW9ucyAmJiB0aGlzLnBlcm1pc3Npb25zLm1lbnUgJiYgdGhpcy5wZXJtaXNzaW9ucy5tZW51LnZpc2libGUgPT09IGZhbHNlKTtcbiAgICBpZiAocGVybWlzc2lvbkhpZGRlbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzdGF0aWNPcHQgPSB0aGlzLnNlbGVjdEFsbENoZWNrYm94IHx8IHRoaXMuZXhwb3J0QnV0dG9uIHx8IHRoaXMuc2hvd0NvbmZpZ3VyYXRpb25PcHRpb24gfHwgdGhpcy5jb2x1bW5zVmlzaWJpbGl0eUJ1dHRvbiB8fCAodGhpcy5zaG93RmlsdGVyT3B0aW9uICYmIHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCAhPT0gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gc3RhdGljT3B0IHx8IHRoaXMudGFibGVPcHRpb25zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBzZXRPVGFibGVJbnNlcnRhYmxlUm93KHRhYmxlSW5zZXJ0YWJsZVJvdzogT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudCkge1xuICAgIGNvbnN0IGluc2VydFBlcm06IE9QZXJtaXNzaW9ucyA9IHRoaXMuZ2V0QWN0aW9uUGVybWlzc2lvbnMoUGVybWlzc2lvbnNVdGlscy5BQ1RJT05fSU5TRVJUKTtcbiAgICBpZiAoaW5zZXJ0UGVybS52aXNpYmxlKSB7XG4gICAgICB0YWJsZUluc2VydGFibGVSb3cuZW5hYmxlZCA9IGluc2VydFBlcm0uZW5hYmxlZDtcbiAgICAgIHRoaXMub1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudCA9IHRhYmxlSW5zZXJ0YWJsZVJvdztcbiAgICAgIHRoaXMuc2hvd0ZpcnN0SW5zZXJ0YWJsZVJvdyA9IHRoaXMub1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0ZpcnN0Um93KCk7XG4gICAgICB0aGlzLnNob3dMYXN0SW5zZXJ0YWJsZVJvdyA9ICF0aGlzLnNob3dGaXJzdEluc2VydGFibGVSb3c7XG4gICAgICB0aGlzLm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaW5pdGlhbGl6ZUVkaXRvcnMoKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclNlbGVjdGlvbkFuZEVkaXRpbmcoY2xlYXJTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgaWYgKGNsZWFyU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1uc1xuICAgICAgLmZpbHRlcihvQ29sdW1uID0+IG9Db2x1bW4uZWRpdGluZylcbiAgICAgIC5mb3JFYWNoKG9Db2x1bW4gPT4ge1xuICAgICAgICBvQ29sdW1uLmVkaXRpbmcgPSBmYWxzZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrU2VsZWN0ZWRJdGVtRGF0YSgpIHtcbiAgICB0aGlzLnRyaWdnZXJTZWxlY3Rpb25FdmVudHMgPSBmYWxzZTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pICYmIHRoaXMuc3RhdGUuc2VsZWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc3RhdGUuc2VsZWN0aW9uLmZvckVhY2goc2VsZWN0ZWRJdGVtID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtS2V5cyA9IE9iamVjdC5rZXlzKHNlbGVjdGVkSXRlbSk7XG4gICAgICAgIC8vIGZpbmRpbmcgc2VsZWN0ZWQgaXRlbSBkYXRhIGluIHRoZSB0YWJsZSByZW5kZXJlZCBkYXRhXG4gICAgICAgIGNvbnN0IGZvdW5kSXRlbSA9IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuZmluZChkYXRhID0+XG4gICAgICAgICAgc2VsZWN0ZWRJdGVtS2V5cy5ldmVyeShrZXkgPT4gZGF0YVtrZXldID09PSBzZWxlY3RlZEl0ZW1ba2V5XSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZvdW5kSXRlbSkge1xuICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQoZm91bmRJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyA9IHRydWU7XG4gIH1cblxuICB1c2VEZXRhaWxCdXR0b24oY29sdW1uOiBPQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbHVtbi50eXBlID09PSAnZWRpdEJ1dHRvbkluUm93JyB8fCBjb2x1bW4udHlwZSA9PT0gJ2RldGFpbEJ1dHRvbkluUm93JztcbiAgfVxuXG4gIG9uRGV0YWlsQnV0dG9uQ2xpY2soY29sdW1uOiBPQ29sdW1uLCByb3c6IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc3dpdGNoIChjb2x1bW4udHlwZSkge1xuICAgICAgY2FzZSAnZWRpdEJ1dHRvbkluUm93JzpcbiAgICAgICAgdGhpcy5lZGl0RGV0YWlsKHJvdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGV0YWlsQnV0dG9uSW5Sb3cnOlxuICAgICAgICB0aGlzLnZpZXdEZXRhaWwocm93KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGV0YWlsQnV0dG9uSWNvbihjb2x1bW46IE9Db2x1bW4pIHtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgc3dpdGNoIChjb2x1bW4udHlwZSkge1xuICAgICAgY2FzZSAnZWRpdEJ1dHRvbkluUm93JzpcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5lZGl0QnV0dG9uSW5Sb3dJY29uO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RldGFpbEJ1dHRvbkluUm93JzpcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5kZXRhaWxCdXR0b25JblJvd0ljb247XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdXNlUGxhaW5SZW5kZXIoY29sdW1uOiBPQ29sdW1uLCByb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy51c2VEZXRhaWxCdXR0b24oY29sdW1uKSAmJiAhY29sdW1uLnJlbmRlcmVyICYmICghY29sdW1uLmVkaXRvciB8fCAoIWNvbHVtbi5lZGl0aW5nIHx8ICF0aGlzLmlzUm93U2VsZWN0ZWQocm93KSkpO1xuICB9XG5cbiAgdXNlQ2VsbFJlbmRlcmVyKGNvbHVtbjogT0NvbHVtbiwgcm93OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sdW1uLnJlbmRlcmVyICYmICghY29sdW1uLmVkaXRpbmcgfHwgY29sdW1uLmVkaXRpbmcgJiYgIXRoaXMuaXNSb3dTZWxlY3RlZChyb3cpKTtcbiAgfVxuXG4gIHVzZUNlbGxFZGl0b3IoY29sdW1uOiBPQ29sdW1uLCByb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8gQWRkIGNvbHVtbi5lZGl0b3IgaW5zdGFuY2VvZiBPVGFibGVDZWxsRWRpdG9yQm9vbGVhbkNvbXBvbmVudCB0byBjb25kaXRpb25cbiAgICBpZiAoY29sdW1uLmVkaXRvciAmJiBjb2x1bW4uZWRpdG9yLmF1dG9Db21taXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbi5lZGl0b3IgJiYgY29sdW1uLmVkaXRpbmcgJiYgdGhpcy5pc1Jvd1NlbGVjdGVkKHJvdyk7XG4gIH1cblxuICBpc1NlbGVjdGlvbk1vZGVNdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlID09PSBDb2Rlcy5TRUxFQ1RJT05fTU9ERV9NVUxUSVBMRTtcbiAgfVxuXG4gIGlzU2VsZWN0aW9uTW9kZVNpbmdsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlID09PSBDb2Rlcy5TRUxFQ1RJT05fTU9ERV9TSU5HTEU7XG4gIH1cblxuICBpc1NlbGVjdGlvbk1vZGVOb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09IENvZGVzLlNFTEVDVElPTl9NT0RFX05PTkU7XG4gIH1cblxuICBvbkNoYW5nZVBhZ2UoZXZ0OiBQYWdlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMubG9hZGluZ1NlcnZpY2UuaGFuZGxlUHJvdGVjdGVkKGV2dCBhcyBhbnkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmluaXNoUXVlcnlTdWJzY3JpcHRpb24gPSBmYWxzZTtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlPy5zZXRQYWdpbmF0aW9uQ29udGV4dCh7IHBhZ2VOdW1iZXI6IGV2dC5wYWdlSW5kZXgsIHBhZ2VTaXplOiBldnQucGFnZVNpemUgfSk7XG4gICAgaWYgKCF0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gZXZ0LnBhZ2VJbmRleDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBnb2luZ0JhY2sgPSBldnQucGFnZUluZGV4IDwgdGhpcy5jdXJyZW50UGFnZTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gZXZ0LnBhZ2VJbmRleDtcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMucGFnaW5hdG9yLmlzU2hvd2luZ0FsbFJvd3MoZXZ0LnBhZ2VTaXplKSA/IHRoaXMuc3RhdGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXIgOiBldnQucGFnZVNpemU7XG5cbiAgICBjb25zdCBvbGRRdWVyeVJvd3MgPSB0aGlzLnF1ZXJ5Um93cztcbiAgICBjb25zdCBjaGFuZ2luZ1BhZ2VTaXplID0gKG9sZFF1ZXJ5Um93cyAhPT0gcGFnZVNpemUpO1xuICAgIHRoaXMucXVlcnlSb3dzID0gcGFnZVNpemU7XG4gICAgdGhpcy5wYWdpbmF0b3IucGFnZVNpemUgPSBwYWdlU2l6ZTtcblxuICAgIGxldCBuZXdTdGFydFJlY29yZDogbnVtYmVyO1xuICAgIGxldCBxdWVyeUxlbmd0aDogbnVtYmVyO1xuXG4gICAgaWYgKGdvaW5nQmFjayB8fCBjaGFuZ2luZ1BhZ2VTaXplKSB7XG4gICAgICBuZXdTdGFydFJlY29yZCA9ICh0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5xdWVyeVJvd3MpO1xuICAgICAgcXVlcnlMZW5ndGggPSB0aGlzLnF1ZXJ5Um93cztcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3U3RhcnRSZWNvcmQgPSBNYXRoLm1heCh0aGlzLnN0YXRlLnF1ZXJ5UmVjb3JkT2Zmc2V0LCAodGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucXVlcnlSb3dzKSk7XG4gICAgICBjb25zdCBuZXdFbmRSZWNvcmQgPSBNYXRoLm1pbihuZXdTdGFydFJlY29yZCArIHRoaXMucXVlcnlSb3dzLCB0aGlzLnN0YXRlLnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyKTtcbiAgICAgIHF1ZXJ5TGVuZ3RoID0gdGhpcy5kaXNhYmxlUGFnZVNpemVDYWxjdWxhdGlvbiA/IHRoaXMucXVlcnlSb3dzIDogTWF0aC5taW4odGhpcy5xdWVyeVJvd3MsIG5ld0VuZFJlY29yZCAtIG5ld1N0YXJ0UmVjb3JkKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeUFyZ3M6IE9RdWVyeURhdGFBcmdzID0ge1xuICAgICAgb2Zmc2V0OiBuZXdTdGFydFJlY29yZCxcbiAgICAgIGxlbmd0aDogcXVlcnlMZW5ndGhcbiAgICB9O1xuXG4gICAgdGhpcy5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMucXVlcnlEYXRhKHZvaWQgMCwgcXVlcnlBcmdzKTtcbiAgfVxuXG4gIGdldE9Db2x1bW4oYXR0cjogc3RyaW5nKTogT0NvbHVtbiB7XG4gICAgcmV0dXJuIHRoaXMuX29UYWJsZU9wdGlvbnMgPyB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmluZChpdGVtID0+IGl0ZW0ubmFtZSA9PT0gYXR0cikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBpbnNlcnRSZWNvcmQocmVjb3JkRGF0YTogYW55LCBzcWxUeXBlcz86IG9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIGlmICh0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnNlcnQgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgdGhlIHRhYmxlIGlzIHJlYWQtb25seS5gKVxuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9JTlNFUlQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHNxbFR5cGVzKSkge1xuICAgICAgY29uc3QgYWxsU3FsVHlwZXMgPSB0aGlzLmdldFNxbFR5cGVzKCk7XG4gICAgICBzcWxUeXBlcyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMocmVjb3JkRGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBzcWxUeXBlc1trZXldID0gYWxsU3FsVHlwZXNba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYW9UYWJsZS5pbnNlcnRRdWVyeShyZWNvcmREYXRhLCBzcWxUeXBlcyk7XG4gIH1cblxuICB1cGRhdGVSZWNvcmQoZmlsdGVyOiBhbnksIHVwZGF0ZURhdGE6IGFueSwgc3FsVHlwZXM/OiBvYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICBpZiAodGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgVXBkYXRlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZCBiZWNhdXNlIHRoZSB0YWJsZSBpcyByZWFkLW9ubHkuYClcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9VUERBVEUpKSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5kYXRhU291cmNlLmRhdGEpO1xuICAgIH1cbiAgICBjb25zdCBzcWxUeXBlc0FyZyA9IHNxbFR5cGVzIHx8IHt9O1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQoc3FsVHlwZXMpKSB7XG4gICAgICBjb25zdCBhbGxTcWxUeXBlcyA9IHRoaXMuZ2V0U3FsVHlwZXMoKTtcbiAgICAgIE9iamVjdC5rZXlzKGZpbHRlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBzcWxUeXBlc0FyZ1trZXldID0gYWxsU3FsVHlwZXNba2V5XTtcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmtleXModXBkYXRlRGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBzcWxUeXBlc0FyZ1trZXldID0gYWxsU3FsVHlwZXNba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYW9UYWJsZS51cGRhdGVRdWVyeShmaWx0ZXIsIHVwZGF0ZURhdGEsIHNxbFR5cGVzQXJnKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgZGF0YSB0YWJsZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0RGF0YUFycmF5KCkge1xuICAgIHJldHVybiB0aGlzLmRhb1RhYmxlLmRhdGE7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBTZXRzIGRhdGEgdGFibGUgd2hlbiBpcyBzdGF0aWMgKE9OTFkgSU4gVEhJUyBDQVNFKVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgc2V0RGF0YUFycmF5KGRhdGE6IEFycmF5PGFueT4pIHtcbiAgICBpZiAodGhpcy5kYW9UYWJsZSkge1xuICAgICAgLy8gcmVtb3RlIHBhZ2luYXRpb24gaGFzIG5vIHNlbnNlIHdoZW4gdXNpbmcgc3RhdGljLWRhdGFcbiAgICAgIHRoaXMucGFnZWFibGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc3RhdGljRGF0YSA9IGRhdGE7XG4gICAgICB0aGlzLmRhb1RhYmxlLnVzaW5nU3RhdGljRGF0YSA9IHRydWU7XG4gICAgICB0aGlzLmRhb1RhYmxlLnNldERhdGFBcnJheSh0aGlzLnN0YXRpY0RhdGEpO1xuICAgICAgdGhpcy5vbkRhdGFMb2FkZWQuZW1pdCh0aGlzLmRhb1RhYmxlLmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkZWxldGVMb2NhbEl0ZW1zKCkge1xuICAgIGNvbnN0IGRhdGFBcnJheSA9IHRoaXMuZ2V0RGF0YUFycmF5KCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xuICAgIHNlbGVjdGVkSXRlbXMuZm9yRWFjaCgoc2VsZWN0ZWRJdGVtOiBhbnkpID0+IHtcbiAgICAgIGZvciAobGV0IGogPSBkYXRhQXJyYXkubGVuZ3RoIC0gMTsgaiA+PSAwOyAtLWopIHtcbiAgICAgICAgaWYgKFV0aWwuZXF1YWxzKHNlbGVjdGVkSXRlbSwgZGF0YUFycmF5W2pdKSkge1xuICAgICAgICAgIGRhdGFBcnJheS5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5zZXREYXRhQXJyYXkoZGF0YUFycmF5KTtcbiAgfVxuXG4gIGlzQ29sdW1uU29ydEFjdGl2ZShjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuc29ydENvbEFycmF5LmZpbmQoc29ydEMgPT4gc29ydEMuY29sdW1uTmFtZSA9PT0gY29sdW1uLmF0dHIpO1xuICAgIHJldHVybiBmb3VuZCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNDb2x1bW5EZXNjU29ydEFjdGl2ZShjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuc29ydENvbEFycmF5LmZpbmQoc29ydEMgPT4gc29ydEMuY29sdW1uTmFtZSA9PT0gY29sdW1uLmF0dHIgJiYgIXNvcnRDLmFzY2VuZGVudCk7XG4gICAgcmV0dXJuIGZvdW5kICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBoYXNUYWJHcm91cENoYW5nZVN1YnNjcmlwdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJHcm91cENoYW5nZVN1YnNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFVdGlsLmlzRGVmaW5lZCh2YWx1ZSkgfHwgKCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSAmJiAhdmFsdWUpO1xuICB9XG5cbiAgc2V0RmlsdGVyc0NvbmZpZ3VyYXRpb24oc3RvcmFnZTogT1RhYmxlQ29tcG9uZW50U3RhdGVDbGFzcyA9IHRoaXMuc3RhdGUpIHtcbiAgICAvKlxuICAgICAgQ2hlY2tpbmcgdGhlIG9yaWdpbmFsIGZpbHRlckNhc2VTZW5zaXRpdmUgd2l0aCB0aGUgZmlsdGVyQ2FzZVNlbnNpdGl2ZSBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaW4gbG9jYWwgc3RvcmFnZVxuICAgICAgaWYgZmlsdGVyQ2FzZVNlbnNpdGl2ZSBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaXMgZXF1YWxzIHRvIG9yaWdpbmFsIGZpbHRlckNhc2VTZW5zaXRpdmUgaW5wdXRcbiAgICAgIGZpbHRlckNhc2VTZW5zaXRpdmUgd2lsbCBiZSB0aGUgdmFsdWUgaW4gbG9jYWwgc3RvcmFnZVxuICAgICovXG4gICAgaWYgKHN0b3JhZ2UuaW5pdGlhbENvbmZpZ3VyYXRpb24uZmlsdGVyQ2FzZVNlbnNpdGl2ZSAhPT0gdGhpcy5maWx0ZXJDYXNlU2Vuc2l0aXZlKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmZpbHRlckNhc2VTZW5zaXRpdmUgPSB0aGlzLmZpbHRlckNhc2VTZW5zaXRpdmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZmlsdGVyQ2FzZVNlbnNpdGl2ZSA9IHN0b3JhZ2UuaGFzT3duUHJvcGVydHkoJ2ZpbHRlci1jYXNlLXNlbnNpdGl2ZScpID8gc3RvcmFnZVsnZmlsdGVyLWNhc2Utc2Vuc2l0aXZlJ10gOiB0aGlzLmZpbHRlckNhc2VTZW5zaXRpdmU7XG4gICAgfVxuXG4gICAgaWYgKHN0b3JhZ2UuaW5pdGlhbENvbmZpZ3VyYXRpb24uZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0ICE9PSB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdCkge1xuICAgICAgdGhpcy5pc0NvbHVtbkZpbHRlcnNBY3RpdmUgPSB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29uZkZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdCA9IHN0b3JhZ2UuaGFzT3duUHJvcGVydHkoJ2ZpbHRlci1jb2x1bW4tYWN0aXZlJykgPyBzdG9yYWdlWydmaWx0ZXItY29sdW1uLWFjdGl2ZSddIDogdGhpcy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQ7XG4gICAgICB0aGlzLmlzQ29sdW1uRmlsdGVyc0FjdGl2ZSA9IGNvbmZGaWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQgfHwgdGhpcy5zdGF0ZS5jb2x1bW5WYWx1ZUZpbHRlcnMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoc3RvcmFnZS5jb2x1bW5WYWx1ZUZpbHRlcnMpKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuaW5pdGlhbGl6ZUNvbHVtbnNGaWx0ZXJzKHRoaXMuc3RhdGUuY29sdW1uVmFsdWVGaWx0ZXJzKTtcbiAgICAgIHRoaXMub25GaWx0ZXJCeUNvbHVtbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgYWN0aW9uOiAnYWRkJyxcbiAgICAgICAgY29sdW1uczogdGhpcy5zdGF0ZS5jb2x1bW5WYWx1ZUZpbHRlcnMubWFwKGZpbHRlciA9PiBmaWx0ZXIuYXR0ciksXG4gICAgICAgIGZpbHRlcnM6IHRoaXMuc3RhdGUuY29sdW1uVmFsdWVGaWx0ZXJzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5zZXRWYWx1ZShzdG9yYWdlWydmaWx0ZXInXSk7XG4gICAgICAoc3RvcmFnZVsnb0NvbHVtbnMnXSB8fCBbXSkuZm9yRWFjaCgob0NvbERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBvQ29sID0gdGhpcy5nZXRPQ29sdW1uKG9Db2xEYXRhLmF0dHIpO1xuICAgICAgICBpZiAob0NvbCAmJiBvQ29sRGF0YS5oYXNPd25Qcm9wZXJ0eSgnc2VhcmNoaW5nJykpIHtcbiAgICAgICAgICBvQ29sLnNlYXJjaGluZyA9IG9Db2xEYXRhLnNlYXJjaGluZztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyQnVpbGRlciAmJiBVdGlsLmlzRGVmaW5lZChzdG9yYWdlLmZpbHRlckJ1aWxkZXJWYWx1ZXMpKSB7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIuc2V0RmlsdGVyVmFsdWVzKHN0b3JhZ2UuZmlsdGVyQnVpbGRlclZhbHVlcyk7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIudHJpZ2dlclJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgYXBwbGllZCBjb2x1bW4gdmFsdWUgZmlsdGVyc1xuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBjb2x1bW4gdmFsdWUgZmlsdGVycyBhcHBsaWVkIHRvIHRoZSB0YWJsZS5cbiAgICovXG4gIHB1YmxpYyBnZXRDb2x1bW5WYWx1ZUZpbHRlcnMoKTogT0NvbHVtblZhbHVlRmlsdGVyW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29sdW1uVmFsdWVGaWx0ZXJzKCk7XG4gIH1cblxuICAvKipcbiAqIFJldHVybnMgdGhlIGNvbHVtbiB2YWx1ZSBmaWx0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb2x1bW4gYXR0cmlidXRlLlxuICpcbiAqIEBwYXJhbSBhdHRyIENvbHVtbiBhdHRyaWJ1dGUgaWRlbnRpZmllci5cbiAqIEByZXR1cm5zIFRoZSBjb2x1bW4gdmFsdWUgZmlsdGVyIGZvciB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uVmFsdWVGaWx0ZXJCeUF0dHIoYXR0cjogc3RyaW5nKTogT0NvbHVtblZhbHVlRmlsdGVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmdldENvbHVtblZhbHVlRmlsdGVyQnlBdHRyKGF0dHIpO1xuICB9XG5cbiAgb25TdG9yZUNvbmZpZ3VyYXRpb25DbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vblN0b3JlQ29uZmlndXJhdGlvbkNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBvbkFwcGx5Q29uZmlndXJhdGlvbkNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uQXBwbHlDb25maWd1cmF0aW9uQ2xpY2tlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5RGVmYXVsdENvbmZpZ3VyYXRpb24oKSB7XG4gICAgdGhpcy5pbml0aWFsaXplUGFyYW1zKCk7XG4gICAgdGhpcy5wYXJzZVZpc2libGVDb2x1bW5zKHRydWUpO1xuICAgIHRoaXMucmVmcmVzaENvbHVtbnNXaWR0aEZyb21PcmlnaW5hbERlZmluaXRpb24oKTtcbiAgICB0aGlzLnJlaW5pdGlhbGl6YXRlUXVpY2tGaWx0ZXJDb2x1bW5zKCk7XG4gICAgdGhpcy5yZXNldFF1ZXJ5Um93cygpO1xuICAgIGNvbnN0IGluaXRpYWxDb25maWdTb3J0Q29sdW1uc0FycmF5ID0gU2VydmljZVV0aWxzLnBhcnNlU29ydENvbHVtbnModGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5zb3J0Q29sdW1ucyk7XG4gICAgdGhpcy5yZWluaXRpYWxpemVTb3J0Q29sdW1ucyhpbml0aWFsQ29uZmlnU29ydENvbHVtbnNBcnJheSk7XG4gICAgdGhpcy5vblJlaW5pdGlhbGl6ZS5lbWl0KG51bGwpO1xuICAgIHRoaXMuY2xlYXJGaWx0ZXJzKGZhbHNlKTtcbiAgICB0aGlzLnJlbG9hZERhdGEoKTtcbiAgfVxuICByZXNldFF1ZXJ5Um93cygpIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5xdWVyeVJvd3MpKSB7XG4gICAgICB0aGlzLnF1ZXJ5Um93cyA9IHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24ucXVlcnlSb3dzO1xuICAgIH1cbiAgfVxuICBhcHBseUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbk5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHN0b3JlZENvbmZpZ3VyYXRpb24gPSB0aGlzLnN0YXRlLmdldFN0b3JlZENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbk5hbWUpO1xuICAgIGlmIChzdG9yZWRDb25maWd1cmF0aW9uKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gc3RvcmVkQ29uZmlndXJhdGlvblsnc3RvcmVkLXByb3BlcnRpZXMnXSB8fCBbXTtcblxuICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgICAgICAgIGNhc2UgJ3NvcnQtY29sdW1ucyc6XG4gICAgICAgICAgICB0aGlzLnJlaW5pdGlhbGl6ZVNvcnRDb2x1bW5zKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdvQ29sdW1ucy1kaXNwbGF5JzpcbiAgICAgICAgICAgIHRoaXMucGFyc2VWaXNpYmxlQ29sdW1ucygpO1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplQ2hlY2tib3hDb2x1bW4oKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENvbHVtbnNXaWR0aEZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3F1aWNrLWZpbHRlcic6XG4gICAgICAgICAgY2FzZSAnY29sdW1ucy1maWx0ZXInOlxuICAgICAgICAgIGNhc2UgJ2ZpbHRlci1idWlsZGVyJzpcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyc0NvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2dyb3VwZWQtY29sdW1ucyc6XG4gICAgICAgICAgICB0aGlzLnBhcnNlR3JvdXBlZENvbHVtbnMoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3BhZ2UnOlxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuc3RhdGUuY3VycmVudFBhZ2U7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5Um93cyA9IHRoaXMuc3RhdGUucXVlcnlSb3dzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWxvYWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VGl0bGVBbGlnbkNsYXNzKG9Db2w6IE9Db2x1bW4pIHtcblxuICAgIGNvbnN0IGhhc1RpdGxlQWxpZ24gPSBVdGlsLmlzRGVmaW5lZChvQ29sLmRlZmluaXRpb24pICYmIFV0aWwuaXNEZWZpbmVkKG9Db2wuZGVmaW5pdGlvbi50aXRsZUFsaWduKTtcbiAgICBjb25zdCBhdXRvQWxpZ24gPSAodGhpcy5hdXRvQWxpZ25UaXRsZXMgJiYgIWhhc1RpdGxlQWxpZ24pIHx8IChoYXNUaXRsZUFsaWduICYmIG9Db2wuZGVmaW5pdGlvbi50aXRsZUFsaWduID09PSBDb2Rlcy5DT0xVTU5fVElUTEVfQUxJR05fQVVUTyk7XG4gICAgaWYgKCFhdXRvQWxpZ24pIHtcbiAgICAgIHJldHVybiBvQ29sLmdldFRpdGxlQWxpZ25DbGFzcygpO1xuICAgIH1cblxuICAgIGxldCBhbGlnbiA9IHRoaXMuZ2V0Q2VsbEFsaWduQ2xhc3Mob0NvbCk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGFsaWduKSAmJiBhbGlnbi5sZW5ndGggPiAwKSB7XG4gICAgICBhbGlnbiA9IGFsaWduLnN1YnN0cmluZygyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChvQ29sLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgY2FzZSAnYWN0aW9uJzpcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgYWxpZ24gPSBDb2Rlcy5DT0xVTU5fVElUTEVfQUxJR05fQ0VOVEVSO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjdXJyZW5jeSc6XG4gICAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICBjYXNlICdyZWFsJzpcbiAgICAgICAgY2FzZSAncGVyY2VudGFnZSc6XG4gICAgICAgICAgYWxpZ24gPSBDb2Rlcy5DT0xVTU5fVElUTEVfQUxJR05fRU5EO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzZXJ2aWNlJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBhbGlnbiA9IENvZGVzLkNPTFVNTl9USVRMRV9BTElHTl9TVEFSVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFsaWduO1xuXG4gIH1cblxuICBwdWJsaWMgZ2V0Q2VsbEFsaWduQ2xhc3MoY29sdW1uOiBPQ29sdW1uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQoY29sdW1uLmRlZmluaXRpb24pICYmIFV0aWwuaXNEZWZpbmVkKGNvbHVtbi5kZWZpbml0aW9uLmNvbnRlbnRBbGlnbikgPyAnby0nICsgY29sdW1uLmRlZmluaXRpb24uY29udGVudEFsaWduIDogJyc7XG4gIH1cblxuXG4gIHB1YmxpYyBnZXRHcm91cEhlYWRlckNlbGxBbGlnbkNsYXNzKGNvbHVtbjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNsYXNzTmFtZUFycmF5ID0gW107XG4gICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihjb2x1bW4uc3Vic3RyKCdncm91cEhlYWRlci0nLmxlbmd0aCkpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChvQ29sKSkge1xuICAgICAgY2xhc3NOYW1lQXJyYXkucHVzaCh0aGlzLmdldENlbGxBbGlnbkNsYXNzKG9Db2wpKTtcbiAgICAgIGNsYXNzTmFtZUFycmF5LnB1c2gob0NvbC5jbGFzc05hbWUgPyBvQ29sLmNsYXNzTmFtZSA6ICcnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZUFycmF5O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZERlZmF1bHRSb3dCdXR0b25zKCkge1xuICAgIC8vIGNoZWNrIHBlcm1pc3Npb25zXG4gICAgaWYgKHRoaXMuZWRpdEJ1dHRvbkluUm93KSB7XG4gICAgICB0aGlzLmFkZEJ1dHRvbkluUm93KCdlZGl0QnV0dG9uSW5Sb3cnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGV0YWlsQnV0dG9uSW5Sb3cpIHtcbiAgICAgIHRoaXMuYWRkQnV0dG9uSW5Sb3coJ2RldGFpbEJ1dHRvbkluUm93Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFkZEJ1dHRvbkluUm93KG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbERlZjogT0NvbHVtbiA9IHRoaXMuY3JlYXRlT0NvbHVtbihuYW1lLCB0aGlzKTtcbiAgICBjb2xEZWYudHlwZSA9IG5hbWU7XG4gICAgY29sRGVmLnZpc2libGUgPSB0cnVlO1xuICAgIGNvbERlZi5zZWFyY2hhYmxlID0gZmFsc2U7XG4gICAgY29sRGVmLm9yZGVyYWJsZSA9IGZhbHNlO1xuICAgIGNvbERlZi5yZXNpemFibGUgPSBmYWxzZTtcbiAgICBjb2xEZWYuZ3JvdXBhYmxlID0gZmFsc2U7XG4gICAgY29sRGVmLnRpdGxlID0gdW5kZWZpbmVkO1xuICAgIGNvbERlZi53aWR0aCA9ICc0OHB4JztcbiAgICB0aGlzLnB1c2hPQ29sdW1uRGVmaW5pdGlvbihjb2xEZWYpO1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMucHVzaChuYW1lKTtcbiAgfVxuXG4gIGdldCBoZWFkZXJIZWlnaHQoKSB7XG4gICAgbGV0IGhlaWdodCA9IDA7XG4gICAgaWYgKHRoaXMudGFibGVIZWFkZXJFbD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgaGVpZ2h0ICs9IHRoaXMudGFibGVIZWFkZXJFbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVUb29sYmFyRWw/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGhlaWdodCArPSB0aGlzLnRhYmxlVG9vbGJhckVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG5cbiAgZ2V0IHRvb2xCYXJIZWlnaHQoKSB7XG4gICAgbGV0IGhlaWdodCA9IDA7XG5cbiAgICBpZiAodGhpcy50YWJsZVRvb2xiYXJFbD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgaGVpZ2h0ICs9IHRoaXMudGFibGVUb29sYmFyRWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cblxuICBpc0RldGFpbE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGV0YWlsTW9kZSAhPT0gQ29kZXMuREVUQUlMX01PREVfTk9ORTtcbiAgfVxuXG4gIGNvcHlBbGwoKSB7XG4gICAgVXRpbC5jb3B5VG9DbGlwYm9hcmQoSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRSZW5kZXJlZFZhbHVlKCkpKTtcbiAgfVxuXG4gIGNvcHlTZWxlY3Rpb24oKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZW5kZXJlZERhdGEodGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCkpO1xuICAgIFV0aWwuY29weVRvQ2xpcGJvYXJkKEpTT04uc3RyaW5naWZ5KHNlbGVjdGVkSXRlbXMpKTtcbiAgfVxuXG4gIGRlc3Ryb3lBY3RpdmVkVG9vbHRpcHMoKSB7XG4gICAgdGhpcy50b29sdGlwLmZvckVhY2godHAgPT4ge1xuICAgICAgaWYgKHRwLl9vdmVybGF5UmVmKSB7XG4gICAgICAgIHRwLl9vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIG5hdmlnYXRpb24gdG8gaXRlbSBkZXRhaWwsIHJlY2VpdmluZyBpdGVtIGRhdGFcbiAgICogQHBhcmFtIGl0ZW1cbiAgICogQHJldHVybnMgZGV0YWlsXG4gICAqL1xuICB2aWV3RGV0YWlsKGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5ICYmIHRoaXMuc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHkpIHtcbiAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKCdkZXRhaWwnKSB8fCB0aGlzLnJlYWRPbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGVzdHJveUFjdGl2ZWRUb29sdGlwcygpO1xuICAgIHN1cGVyLnZpZXdEZXRhaWwoaXRlbSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBuYXZpZ2F0aW9uIHRvIGl0ZW0gZWRpdGlvbiwgcmVjZWl2aW5nIGl0ZW0gZGF0YVxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcmV0dXJucyBkZXRhaWxcbiAgICovXG4gIGVkaXREZXRhaWwoaXRlbTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkgJiYgdGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNoZWNrRW5hYmxlZEFjdGlvblBlcm1pc3Npb24oJ2VkaXQnKSB8fCB0aGlzLnJlYWRPbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmVkaXREZXRhaWwoaXRlbSk7XG4gIH1cblxuICBnZXRPQ29sdW1uRnJvbVRoKHRoOiBhbnkpOiBPQ29sdW1uIHtcbiAgICBsZXQgcmVzdWx0OiBPQ29sdW1uO1xuICAgIGNvbnN0IGNsYXNzTGlzdDogYW55W10gPSBBcnJheS5mcm9tKCh0aCBhcyBFbGVtZW50KS5jbGFzc0xpc3QgfHwgW10pO1xuICAgIGNvbnN0IGNvbHVtbkNsYXNzID0gY2xhc3NMaXN0LmZpbmQoKGNsYXNzTmFtZTogc3RyaW5nKSA9PiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ21hdC1jb2x1bW4tJykpKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29sdW1uQ2xhc3MpKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmdldE9Db2x1bW4oY29sdW1uQ2xhc3Muc3Vic3RyKCdtYXQtY29sdW1uLScubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRPQ29sdW1uRnJvbUdyb3VwSGVhZGVyQ29sdW1uKGF0dHI6IHN0cmluZyk6IE9Db2x1bW4ge1xuICAgIHJldHVybiB0aGlzLmdldE9Db2x1bW4oYXR0ci5zdWJzdHIoJ2dyb3VwSGVhZGVyLScubGVuZ3RoKSk7XG4gIH1cblxuICBnZXRUaFdpZHRoRnJvbU9Db2x1bW4ob0NvbHVtbjogT0NvbHVtbik6IGFueSB7XG4gICAgbGV0IHdpZHRoQ29sdW1uOiBudW1iZXI7XG4gICAgY29uc3QgdGhBcnJheSA9IHRoaXMudGFibGVIZWFkZXJFbC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhBcnJheS5sZW5ndGggJiYgIVV0aWwuaXNEZWZpbmVkKHdpZHRoQ29sdW1uKTsgaSsrKSB7XG4gICAgICBjb25zdCB0aCA9IHRoQXJyYXlbaV07XG4gICAgICBjb25zdCBjbGFzc0xpc3QgPSB0aC5jbGFzc0xpc3Q7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNsYXNzTGlzdC5sZW5ndGggJiYgIVV0aWwuaXNEZWZpbmVkKHdpZHRoQ29sdW1uKTsgaisrKSB7XG4gICAgICAgIGlmIChjbGFzc0xpc3Rbal0gPT09ICdtYXQtY29sdW1uLScgKyBvQ29sdW1uLmF0dHIpIHtcbiAgICAgICAgICB3aWR0aENvbHVtbiA9IHRoLmNsaWVudFdpZHRoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3aWR0aENvbHVtbjtcbiAgfVxuXG4gIGdldENvbHVtbkluc2VydGFibGUobmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUgKyB0aGlzLmdldFN1ZmZpeENvbHVtbkluc2VydGFibGUoKTtcbiAgfVxuXG4gIGlzUm93U2VsZWN0ZWQocm93OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNTZWxlY3Rpb25Nb2RlTm9uZSgpICYmIHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVSb3dTZWxlY3Rpb24ocm93OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuU2VsZWN0Um93KHJvdykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1Jvd1NlbGVjdGVkKHJvdykpIHtcbiAgICAgIHRoaXMucmVtb3ZlRnJvbVNlbGVjdGlvbihbcm93XSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzU2VsZWN0aW9uTW9kZVNpbmdsZSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93KHJvdyk7IC8vIFJlcGxhY2VzIHNlbGVjdGlvblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFRvU2VsZWN0aW9uKFtyb3ddKTsgLy8gQWRkZWQgdG8gc2VsZWN0aW9uXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAqIFJlbW92ZXMgcm93cyBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICovXG4gIHB1YmxpYyByZW1vdmVGcm9tU2VsZWN0aW9uKHJvd3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTm9uZSgpIHx8ICFyb3dzIHx8IHJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm93c1RvUmVtb3ZlID0gcm93cy5maWx0ZXIocm93ID0+XG4gICAgICBVdGlsLmlzRGVmaW5lZChyb3cpICYmIHRoaXMuaXNSb3dTZWxlY3RlZChyb3cpXG4gICAgKTtcblxuICAgIGlmIChyb3dzVG9SZW1vdmUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3QoLi4ucm93c1RvUmVtb3ZlKTtcblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgICB9XG5cbiAgfVxuICBwdWJsaWMgYWRkVG9TZWxlY3Rpb24ocm93czogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbk1vZGVOb25lKCkgfHwgdGhpcy5pc1NlbGVjdGlvbk1vZGVTaW5nbGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkUm93cyA9IHRoaXMuZmlsdGVyVmFsaWRSb3dzRm9yU2VsZWN0aW9uKHJvd3MpO1xuICAgIGNvbnN0IHJvd3NUb0FkZCA9IHZhbGlkUm93cy5maWx0ZXIocm93ID0+ICF0aGlzLmlzUm93U2VsZWN0ZWQocm93KSk7XG5cbiAgICBpZiAocm93c1RvQWRkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi5yb3dzVG9BZGQpO1xuXG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlLnNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkO1xuICAgIH1cblxuICB9XG5cbiAgcHVibGljIGdldENvbHVtbldpZHRoRnJvbVN0YXRlKGNvbERlZjogT0NvbHVtbik6IHN0cmluZyB7XG4gICAgLy8xLiBCeSBkZWZhdWx0LCBzZXQgd2lkdGggZGVmaW5pdGlvblxuICAgIGxldCBjb2x1bW5XaWR0aCA9IGNvbERlZi5kZWZpbml0aW9uICYmIGNvbERlZi5kZWZpbml0aW9uLndpZHRoID8gY29sRGVmLmRlZmluaXRpb24ud2lkdGggOiB2b2lkIDA7XG4gICAgY29uc3Qgc3RvcmVkRGF0YSA9IHRoaXMuc3RhdGUuZ2V0Q29sdW1uRGlzcGxheShjb2xEZWYpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChzdG9yZWREYXRhKSAmJiBVdGlsLmlzRGVmaW5lZChzdG9yZWREYXRhLndpZHRoKSkge1xuICAgICAgLy8yLiBTZXQgd2lkdGggaWYgdGhlIHdpZHRoIGlzIHN0b3JlZFxuICAgICAgY29sdW1uV2lkdGggPSBzdG9yZWREYXRhLndpZHRoO1xuICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMgc2F2ZWQgaW4gdGhlIGluaXRpYWwgY29uZmlndXJhdGlvblxuICAgICAgLy8gaW4gdGhlIGxvY2FsIHN0b3JhZ2UgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgICBpZiAodGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5jb2x1bW5zRGlzcGxheSkge1xuICAgICAgICBjb25zdCBpbml0aWFsU3RvcmVkRGF0YSA9IHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uZ2V0Q29sdW1uRGlzcGxheShjb2xEZWYpO1xuICAgICAgICAvLyBJZiBvcmlnaW5hbCB3aWR0aCBjaGFuZ2VkIHRoZW4gdGhlIHdpZHRoIGlzIHJlc2V0ZWQgd2l0aCB0aGlzIHZhbHVlXG4gICAgICAgIGlmIChpbml0aWFsU3RvcmVkRGF0YSAmJiBpbml0aWFsU3RvcmVkRGF0YS53aWR0aCAmJiBjb2xEZWYuZGVmaW5pdGlvbi5vcmlnaW5hbFdpZHRoKSB7XG4gICAgICAgICAgaWYgKGluaXRpYWxTdG9yZWREYXRhLndpZHRoICE9PSBjb2xEZWYuZGVmaW5pdGlvbi5vcmlnaW5hbFdpZHRoKSB7XG4gICAgICAgICAgICBjb2x1bW5XaWR0aCA9IGNvbERlZi5kZWZpbml0aW9uLm9yaWdpbmFsV2lkdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgfVxuXG4gIHJlZnJlc2hDb2x1bW5zV2lkdGhGcm9tTG9jYWxTdG9yYWdlKCkge1xuICAgIHRoaXMub1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goeCA9PiB7XG4gICAgICB4LndpZHRoID0gdGhpcy5nZXRDb2x1bW5XaWR0aEZyb21TdGF0ZSh4KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZnJlc2hDb2x1bW5zV2lkdGhGcm9tT3JpZ2luYWxEZWZpbml0aW9uKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSkuZm9yRWFjaChjID0+IHtcbiAgICAgICAgYy53aWR0aCA9IGMuRE9NV2lkdGggPSB2b2lkIDA7XG4gICAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChjLmRlZmluaXRpb24pICYmIFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbi53aWR0aCkpIHtcbiAgICAgICAgICBjLndpZHRoID0gYy5kZWZpbml0aW9uLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGMuc2V0UmVuZGVyV2lkdGgodGhpcy5ob3Jpem9udGFsU2Nyb2xsLCB0aGlzLmdldENsaWVudFdpZHRoQ29sdW1uKGMpKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9Db2x1bW4oYXR0cj86IHN0cmluZywgdGFibGU/OiBPVGFibGVDb21wb25lbnQsIGNvbHVtbj86IE9UYWJsZUNvbHVtbkNvbXBvbmVudCAmIE9UYWJsZUNvbHVtbkNhbGN1bGF0ZWRDb21wb25lbnQpOiBPQ29sdW1uIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBPQ29sdW1uKCk7XG4gICAgaWYgKGF0dHIpIHtcbiAgICAgIGluc3RhbmNlLmF0dHIgPSBhdHRyO1xuICAgIH1cbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGluc3RhbmNlLnNldERlZmF1bHRQcm9wZXJ0aWVzKHtcbiAgICAgICAgb3JkZXJhYmxlOiB0aGlzLm9yZGVyYWJsZSxcbiAgICAgICAgcmVzaXphYmxlOiB0aGlzLnJlc2l6YWJsZSxcbiAgICAgICAgZ3JvdXBhYmxlOiB0aGlzLmdyb3VwYWJsZSxcbiAgICAgICAgcGFnZWFibGU6IHRoaXMucGFnZWFibGVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoY29sdW1uKSB7XG4gICAgICBpbnN0YW5jZS5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtbik7XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9UYWJsZUJ1dHRvbnMoYXJnOiBPVGFibGVCdXR0b25zKSB7XG4gICAgdGhpcy5vVGFibGVCdXR0b25zID0gYXJnO1xuICAgIGlmICh0aGlzLm9UYWJsZUJ1dHRvbnMgJiYgdGhpcy50YWJsZUJ1dHRvbnMgJiYgdGhpcy50YWJsZUJ1dHRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5vVGFibGVCdXR0b25zLnJlZ2lzdGVyQnV0dG9ucyh0aGlzLnRhYmxlQnV0dG9ucy50b0FycmF5KCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDbGllbnRXaWR0aENvbHVtbihjb2w6IE9Db2x1bW4pOiBudW1iZXIge1xuICAgIHJldHVybiBjb2wuRE9NV2lkdGggfHwgdGhpcy5nZXRUaFdpZHRoRnJvbU9Db2x1bW4oY29sKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNaW5XaWR0aENvbHVtbihjb2w6IE9Db2x1bW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBVdGlsLmV4dHJhY3RQaXhlbHNWYWx1ZShjb2wubWluV2lkdGgsIENvZGVzLkRFRkFVTFRfQ09MVU1OX01JTl9XSURUSCkgKyAncHgnO1xuICB9XG5cbiAgc2hvd0V4cGFuZGFibGVSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKHRoaXMudGFibGVSb3dFeHBhbmRhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGVuYWJsZSB2aXJ0dWFsIHNjcm9sbFxuICAgKi9cbiAgZ2V0IGVuYWJsZWRWaXJ0dWFsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpcnR1YWxTY3JvbGwgJiYgIXRoaXMuc2hvd0V4cGFuZGFibGVSb3coKSAmJiB0aGlzLmdyb3VwZWRDb2x1bW5zQXJyYXkubGVuZ3RoID09PSAwO1xuICB9XG4gIC8qKlxuICAgKiBQYXJzZXMgZ3JvdXBlZCBjb2x1bW5zXG4gICAqL1xuICBwYXJzZUdyb3VwZWRDb2x1bW5zKCkge1xuICAgIGxldCByZXN1bHQgPSB0aGlzLnN0YXRlLmdyb3VwZWRDb2x1bW5zIHx8IHRoaXMub3JpZ2luYWxHcm91cGVkQ29sdW1uc0FycmF5O1xuICAgIGlmICh0aGlzLnN0YXRlLmdyb3VwZWRDb2x1bW5zICYmIHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uZ3JvdXBlZENvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLmdyb3VwZWRDb2x1bW5zXG4gICAgICAgIC5maWx0ZXIoeCA9PiAhdGhpcy5vcmlnaW5hbEdyb3VwZWRDb2x1bW5zQXJyYXkuaW5jbHVkZXMoeCkpO1xuXG4gICAgICBpZiAoZGlmZmVyZW5jZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMub3JpZ2luYWxHcm91cGVkQ29sdW1uc0FycmF5O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNldEdyb3VwQ29sdW1ucyhyZXN1bHQpO1xuICB9XG4gIHBhcnNlR3JvdXBlZENvbHVtblR5cGVzKCkge1xuICAgIHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzID0gdGhpcy5zdGF0ZS5ncm91cGVkQ29sdW1uVHlwZXM7XG4gIH1cblxuICAvKipcbiAgICogR3JvdXBzIGJ5IGNvbHVtblxuICAgKiBAcGFyYW0gY29sdW1uXG4gICAqL1xuICBncm91cEJ5Q29sdW1uKGNvbHVtbjogT0NvbHVtbiwgdHlwZT86IHN0cmluZykge1xuICAgIHRoaXMuY2hlY2tHcm91cEJ5Q29sdW1uKGNvbHVtbi5hdHRyLCB0cnVlKTtcbiAgICBpZiAodHlwZSkge1xuICAgICAgdGhpcy51cGRhdGVHcm91cGVkQ29sdW1uVHlwZXMoY29sdW1uLmF0dHIsIHRydWUsIHR5cGUpO1xuICAgIH1cbiAgICB0aGlzLmRhdGFTb3VyY2UudXBkYXRlR3JvdXBlZENvbHVtbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmdyb3VwIGJ5IGNvbHVtblxuICAgKiBAcGFyYW0gY29sdW1uXG4gICAqL1xuICB1bkdyb3VwQnlDb2x1bW4oY29sdW1uOiBPQ29sdW1uKSB7XG4gICAgdGhpcy5jaGVja0dyb3VwQnlDb2x1bW4oY29sdW1uLmF0dHIsIGZhbHNlKTtcbiAgICB0aGlzLnVwZGF0ZUdyb3VwZWRDb2x1bW5UeXBlcyhjb2x1bW4uYXR0ciwgZmFsc2UpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS51cGRhdGVHcm91cGVkQ29sdW1ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZ3JvdXAgYnkgYWxsIGNvbHVtbnNcbiAgICovXG4gIHVuR3JvdXBCeUFsbENvbHVtbnMoKSB7XG4gICAgdGhpcy5zZXRHcm91cENvbHVtbnMoW10pO1xuICAgIHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzID0gW107XG4gIH1cblxuICBzZXRHcm91cENvbHVtbnModmFsdWU6IGFueVtdKSB7XG4gICAgdGhpcy5ncm91cGVkQ29sdW1uc0FycmF5ID0gdmFsdWU7XG4gICAgdGhpcy5kYXRhU291cmNlLnVwZGF0ZUdyb3VwZWRDb2x1bW5zKCk7XG4gIH1cbiAgc2V0R3JvdXBlZENvbHVtblR5cGVzKHZhbHVlOiBPR3JvdXBlZENvbHVtblR5cGVzW10pIHtcbiAgICB0aGlzLmdyb3VwZWRDb2x1bW5UeXBlcyA9IHZhbHVlO1xuICB9XG4gIGNoZWNrR3JvdXBCeUNvbHVtbihmaWVsZDogc3RyaW5nLCBhZGQ6IGJvb2xlYW4pIHtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheSkge1xuICAgICAgaWYgKGNvbHVtbiA9PT0gZmllbGQpIHtcbiAgICAgICAgZm91bmQgPSB0aGlzLmdyb3VwZWRDb2x1bW5zQXJyYXkuaW5kZXhPZihjb2x1bW4sIDApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm91bmQgIT0gbnVsbCAmJiBmb3VuZCA+PSAwKSB7XG4gICAgICBpZiAoIWFkZCkge1xuICAgICAgICB0aGlzLmdyb3VwZWRDb2x1bW5zQXJyYXkuc3BsaWNlKGZvdW5kLCAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFkZCkge1xuICAgICAgICB0aGlzLmdyb3VwZWRDb2x1bW5zQXJyYXkucHVzaChmaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBpdGVtIGlzIGdyb3VwXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGdyb3VwXG4gICAqL1xuICBpc0dyb3VwKGluZGV4LCBpdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGl0ZW0gaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBpdGVtIGlzIG5vdCBncm91cFxuICAgKiBAcGFyYW0gaW5kZXhcbiAgICogQHBhcmFtIGl0ZW1cbiAgICogQHJldHVybnMgdHJ1ZSBpZiBub3QgZ3JvdXBcbiAgICovXG4gIGlzTm90R3JvdXAoaW5kZXgsIGl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShpdGVtIGluc3RhbmNlb2YgT1RhYmxlR3JvdXBlZFJvdyk7XG4gIH1cblxuICBnZXRMYXN0R3JvdXBzKCkge1xuICAgIC8vIEdldCBsYXN0IGdyb3Vwc1xuICAgIGNvbnN0IHNjb3JlcyA9IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGE7XG4gICAgY29uc3QgbWF4TGV2ZWwgPSBzY29yZXMucmVkdWNlKChhY2MsIGN1cnIpID0+IGN1cnIubGV2ZWwgPiBhY2MgPyBjdXJyLmxldmVsIDogYWNjLCAwKTtcbiAgICBjb25zdCBtYXhMZXZlbFJlbmRlcmVkRGF0YSA9IHNjb3Jlcy5yZWR1Y2UoKHIsIG8pID0+IG8ubGV2ZWwgPT09IG1heExldmVsID8gWy4uLnIsIG9dIDogciwgW10pO1xuICAgIHJldHVybiBtYXhMZXZlbFJlbmRlcmVkRGF0YS5sZW5ndGg7XG4gIH1cblxuICBncm91cEhlYWRlckNsaWNrKHJvdzogT1RhYmxlR3JvdXBlZFJvdykge1xuICAgIHRoaXMuZGF0YVNvdXJjZS50b2dnbGVHcm91cEJ5Q29sdW1uKHJvdyk7XG4gIH1cblxuICBwcml2YXRlIGlzSW5zdGFuY2VPZk9UYWJsZUNlbGxSZW5kZXJlclNlcnZpY2VDb21wb25lbnQocmVuZGVyZXI6IE9CYXNlVGFibGVDZWxsUmVuZGVyZXIpIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQocmVuZGVyZXIpICYmIChyZW5kZXJlciBhcyBhbnkpLm9uRGF0YUxvYWRlZCAmJiAocmVuZGVyZXIgYXMgYW55KS5xdWVyeUFsbERhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjb2x1bW4gZGF0YSBieSBhdHRyXG4gICAqIEBwYXJhbSBhdHRyXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHJldHVybnMgY29sdW1uIGRhdGEgYnkgYXR0clxuICAgKi9cbiAgZ2V0Q29sdW1uRGF0YUJ5QXR0cihhdHRyLCByb3c6IGFueSk6IGFueSB7XG4gICAgbGV0IG9wZXJhdGlvbiA9IG51bGw7XG4gICAgaWYgKHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzLmxlbmd0aCAhPSAwICYmIHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmF0dHIgPT0gYXR0cikgIT0gLTEpIHtcbiAgICAgIG9wZXJhdGlvbiA9IHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzW3RoaXMuZ3JvdXBlZENvbHVtblR5cGVzLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmF0dHIgPT0gYXR0cildLnR5cGU7XG4gICAgfVxuICAgIGNvbnN0IG9Db2wgPSB0aGlzLmdldE9Db2x1bW4oYXR0cik7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChvQ29sKSkge1xuICAgICAgcmV0dXJuIHJvd1thdHRyXTtcbiAgICB9XG4gICAgY29uc3QgdXNlUmVuZGVyZXIgPSBvQ29sLnJlbmRlcmVyICYmIG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGE7XG4gICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdXNlUmVuZGVyZXIgPyBvQ29sLnJlbmRlcmVyLmdldENlbGxEYXRhKHJvd1tvQ29sLmF0dHJdLCByb3cpIDogcm93W29Db2wuYXR0cl07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgZGF0ZSA9IG1vbWVudChyb3dbb0NvbC5hdHRyXSk7XG4gICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXRDdXJyZW50TGFuZygpO1xuICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICAgICAgY2FzZSBcIllFQVJcIjogcmV0dXJuIGRhdGUueWVhcigpO1xuICAgICAgICBjYXNlIFwiTU9OVEhcIjogcmV0dXJuIG1vbWVudCgpLmxvY2FsZShsYW5ndWFnZSkubW9udGgoZGF0ZS5tb250aCgpKS5mb3JtYXQoXCJNTU1NXCIpO1xuICAgICAgICBjYXNlIFwiWUVBUl9NT05USFwiOiByZXR1cm4gbW9tZW50KCkubG9jYWxlKGxhbmd1YWdlKS5tb250aChkYXRlLm1vbnRoKCkpLnllYXIoZGF0ZS55ZWFyKCkpLmZvcm1hdChcIk1NTU0sIFlZWVlcIik7XG4gICAgICAgIGNhc2UgXCJZRUFSX01PTlRIX0RBWVwiOiByZXR1cm4gdXNlUmVuZGVyZXIgPyBvQ29sLnJlbmRlcmVyLmdldENlbGxEYXRhKHJvd1tvQ29sLmF0dHJdLCByb3cpIDogcm93W29Db2wuYXR0cl07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHVwZGF0ZUdyb3VwZWRDb2x1bW5UeXBlcyhhdHRyOiBzdHJpbmcsIGFkZDogYm9vbGVhbiwgb3BlcmF0aW9uPzogc3RyaW5nKSB7XG4gICAgbGV0IGdyb3VwZWRDb2x1bW5zOiBPR3JvdXBlZENvbHVtblR5cGVzW10gPSBbXTtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmdyb3VwZWRDb2x1bW5UeXBlcy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5hdHRyID09IGF0dHIpO1xuICAgIGlmIChpbmRleCAhPSAtMSkge1xuICAgICAgaWYgKCFhZGQpIHtcbiAgICAgICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzLnB1c2goeyBcImF0dHJcIjogYXR0ciwgXCJ0eXBlXCI6IG9wZXJhdGlvbiB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5ncm91cGVkQ29sdW1uVHlwZXMgPSBncm91cGVkQ29sdW1ucztcbiAgfVxuXG4gIGdldENsYXNzTmFtZUdyb3VwSGVhZGVyKHJvdzogT1RhYmxlR3JvdXBlZFJvdyk6IHN0cmluZyB7XG4gICAgbGV0IGNsYXNzTmFtZSA9ICcnO1xuICAgIGlmIChyb3cubGV2ZWwgPD0gMTApIHtcbiAgICAgIGNsYXNzTmFtZSA9ICdvLXRhYmxlLWdyb3VwLXJvdyBvLXRhYmxlLWdyb3VwLXJvdy1sZXZlbC0nICsgcm93LmxldmVsO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wRWRpdGlvbihjbGVhclNlbGVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjbGVhclNlbGVjdGlvbiA9IGNsZWFyU2VsZWN0aW9uID8gY2xlYXJTZWxlY3Rpb24gOiBmYWxzZTtcbiAgICB0aGlzLmVkaXRpbmdDZWxsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZWRpdGluZ1JvdyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uQW5kRWRpdGluZyhjbGVhclNlbGVjdGlvbik7XG4gIH1cblxuICBzdG9yZUZpbHRlckluU3RhdGUoYXJnOiBPRmlsdGVyRGVmaW5pdGlvbikge1xuICAgIHRoaXMuY29tcG9uZW50U3RhdGVTZXJ2aWNlLnN0b3JlRmlsdGVyKGFyZyk7XG4gIH1cblxuICByZWluaXRpYWxpemF0ZVF1aWNrRmlsdGVyQ29sdW1ucygpIHtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnNcbiAgICAgIC5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5zZWFyY2hhYmxlICYmIGNvbHVtbi52aXNpYmxlKVxuICAgICAgLmZvckVhY2goY29sdW1uID0+IGNvbHVtbi5zZWFyY2hpbmcgPSB0cnVlKVxuICB9XG5cbiAgcmVpbml0aWFsaXplU29ydENvbHVtbnMoc29ydENvbHVtbnM/OiBTUUxPcmRlcltdKSB7XG4gICAgdGhpcy50YWJsZUhlYWRlcnMgPSBbXTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoc29ydENvbHVtbnMpKSB7XG4gICAgICB0aGlzLnNvcnRDb2xBcnJheSA9IHNvcnRDb2x1bW5zO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcnNlU29ydENvbHVtbnMoKTtcbiAgICB9XG4gICAgdGhpcy5zb3J0LnNldFNvcnRDb2x1bW5zKHRoaXMuc29ydENvbEFycmF5KTtcbiAgICB0aGlzLm9uU29ydENoYW5nZS5lbWl0KHNvcnRDb2x1bW5zKTtcbiAgICB0aGlzLnJlZnJlc2hTb3J0SGVhZGVycygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hTb3J0SGVhZGVycygpIHtcbiAgICB0aGlzLnRhYmxlSGVhZGVycy5maWx0ZXIoaGVhZGVyID0+IFV0aWwuaXNEZWZpbmVkKGhlYWRlci5tYXRTb3J0SGVhZGVyKSkuZm9yRWFjaChoZWFkZXIgPT4gaGVhZGVyLm1hdFNvcnRIZWFkZXIucmVmcmVzaCgpKTtcbiAgfVxuXG4gIGdldFF1aWNrRmlsdGVyVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudCkgP1xuICAgICAgdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC52YWx1ZSA6XG4gICAgICAnJztcbiAgfVxuXG4gIHB1YmxpYyBxdWVyeUNlbGxSZW5kZXJlcnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBxdWlja0ZpbHRlclZhbHVlID0gdGhpcy5nZXRRdWlja0ZpbHRlclZhbHVlKCk7XG5cbiAgICBpZiAoKFV0aWwuaXNEZWZpbmVkKHF1aWNrRmlsdGVyVmFsdWUpICYmIHF1aWNrRmlsdGVyVmFsdWUubGVuZ3RoID4gMCkgfHwgdGhpcy5zb3J0Q29sQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcXVlcmllcyA9IHRoaXMub1RhYmxlT3B0aW9ucy5jb2x1bW5zXG4gICAgICAgIC5maWx0ZXIob0NvbCA9PiBvQ29sLnNlYXJjaGluZyAmJiB0aGlzLmlzSW5zdGFuY2VPZk9UYWJsZUNlbGxSZW5kZXJlclNlcnZpY2VDb21wb25lbnQob0NvbC5yZW5kZXJlcikpXG4gICAgICAgIC5tYXAob0NvbCA9PiAob0NvbC5yZW5kZXJlciBhcyBhbnkpLnF1ZXJ5QWxsRGF0YSgpKTtcblxuICAgICAgcmV0dXJuIHF1ZXJpZXMubGVuZ3RoID4gMCA/IGNvbWJpbmVMYXRlc3QocXVlcmllcykgOiBvZihudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mKG51bGwpO1xuICB9XG5cbiAgdGFibGVRdWlja0ZpbHRlckNoYW5nZWQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICB0aGlzLnF1ZXJ5Q2VsbFJlbmRlcmVycygpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkUGFnaW5hdGVkRGF0YUZyb21TdGFydChmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UucXVpY2tGaWx0ZXIgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBvbk1hdFNvcnRDaGFuZ2VcbiAgcHVibGljIGZpbHRlckRhdGEodmFsdWU/OiBzdHJpbmcsIGxvYWRNb3JlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vXG4gIH1cblxuICBzZXRPVGFibGVDb2x1bW5zR3JvdXBpbmcodmFsdWU6IE9UYWJsZUNvbHVtbnNHcm91cGluZykge1xuICAgIHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50ID0gdmFsdWU7XG4gIH1cblxuICBnZXRDb2x1bW5Hcm91cGluZ0NvbXBvbmVudChjb2x1bW5BdHRyOiBzdHJpbmcpOiBPVGFibGVDb2x1bW5zR3JvdXBpbmdDb2x1bW5Db21wb25lbnQge1xuICAgIGxldCByZXN1bHQ6IE9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbHVtbkNvbXBvbmVudDtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQpKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLm9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudC5nZXRDb2x1bW5Hcm91cGluZyhjb2x1bW5BdHRyKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHVzZUNvbHVtbkdyb3VwaW5nQWdncmVnYXRlKGNvbHVtbkF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG9Db2wgPSB0aGlzLmdldE9Db2x1bW4oY29sdW1uQXR0cik7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChvQ29sKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzcWxUeXBlID0gdGhpcy5nZXRTcWxUeXBlcygpW2NvbHVtbkF0dHJdO1xuICAgIGNvbnN0IGhhc0RlZmF1bHRBZ2dyZWdhdGUgPSBTUUxUeXBlcy5pc051bWVyaWNTUUxUeXBlKHNxbFR5cGUpXG4gICAgICAmJiAoIVV0aWwuaXNEZWZpbmVkKG9Db2wucmVuZGVyZXIpIHx8IE9UYWJsZUNvbXBvbmVudC5BVkFJTEFCTEVfR1JPVVBJTkdfQ09MVU1OU19SRU5ERVJFUlMuaW5jbHVkZXMob0NvbC50eXBlKSk7XG5cbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuIGhhc0RlZmF1bHRBZ2dyZWdhdGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudC51c2VDb2x1bW5BZ2dyZWdhdGUoY29sdW1uQXR0ciwgaGFzRGVmYXVsdEFnZ3JlZ2F0ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tWaWV3cG9ydFNpemUoKSB7XG4gICAgLy8gSXRzIGEgdGVtcG9yYXJpbHkgZml4ZWQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzEwMTE3XG4gICAgLy8gU29sdmUgdGhlIGlzc3VlIHdoZW4gc3dpdGNoaW5nIHRhYnMgd2hlbiB0aGUgdmlydHVhbCBzY3JvbGxpbmcgY29tcG9uZW50IGlzIHVzZWRcbiAgICAvLyBpbiBhIG1hdCAtIHRhYiBjb21wb25lbnQgYW5kIHZpcnR1YWwgc2Nyb2xsIHdvcmsgYWJub3JtYWxseVxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCkge1xuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBTaG93IGV4cGFuZGFibGUgaWNvbiBvciBub3QgaWYgaGFzIGRhdGEgb3Igbm90XG4gIHNob3dFeHBhbmRhYmxlSWNvbihyb3c6IGFueSwgcm93SW5kZXg6IG51bWJlcik6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoVXRpbC5pc0RlZmluZWQodGhpcy5zaG93RXhwYW5kYWJsZUljb25GdW5jdGlvbikgJiYgdGhpcy5zaG93RXhwYW5kYWJsZUljb25GdW5jdGlvbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSA/IFV0aWwud3JhcEludG9PYnNlcnZhYmxlKHRoaXMuc2hvd0V4cGFuZGFibGVJY29uRnVuY3Rpb24ocm93LCByb3dJbmRleCkpIDogb2YodHJ1ZSk7XG4gIH1cblxuICBnZXRDb2x1bW5zTm90SW5jbHVkZWQoKTogc3RyaW5nW10ge1xuICAgIGxldCBjb2xzTm90SW5jbHVkZWQgPSBbXTtcbiAgICBjb2xzTm90SW5jbHVkZWQgPSB0aGlzLm9UYWJsZU9wdGlvbnMuY29sdW1ucy5maWx0ZXIoYyA9PiB2b2lkIDAgIT09IGMucmVuZGVyZXIgJiYgKGMudHlwZSA9PT0gJ2ltYWdlJyB8fCBjLnR5cGUgPT09ICdhY3Rpb24nKSkubWFwKGMgPT4gYy5hdHRyKTtcbiAgICBjb2xzTm90SW5jbHVkZWQucHVzaChDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QpO1xuICAgIGNvbHNOb3RJbmNsdWRlZC5wdXNoKENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpO1xuICAgIHJldHVybiBjb2xzTm90SW5jbHVkZWQ7XG4gIH1cblxuICBnZXRDb2x1bW5OYW1lcyhjb2x1bW5zOiBzdHJpbmdbXSk6IHsgW2NvbHVtbklkOiBzdHJpbmddOiBzdHJpbmc7IH0ge1xuICAgIGNvbnN0IHRhYmxlQ29sdW1uTmFtZXMgPSB7fTtcbiAgICBjb2x1bW5zLmZvckVhY2goYyA9PiB7XG4gICAgICBjb25zdCBvQ29sdW1uID0gdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbmQob2MgPT4gb2MuYXR0ciA9PT0gYyk7XG4gICAgICB0YWJsZUNvbHVtbk5hbWVzW2NdID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChvQ29sdW1uLnRpdGxlID8gb0NvbHVtbi50aXRsZSA6IG9Db2x1bW4uYXR0cik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRhYmxlQ29sdW1uTmFtZXM7XG4gIH1cblxuICByZXNldENvbHVtbnNXaWR0aCgpIHtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChjLmRlZmluaXRpb24pKSB7XG4gICAgICAgIGMud2lkdGggPSBVdGlsLmlzRGVmaW5lZChjLmRlZmluaXRpb24ud2lkdGgpID8gYy5kZWZpbml0aW9uLndpZHRoIDogYy5kZWZpbml0aW9uLm9yaWdpbmFsV2lkdGhcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGMud2lkdGggPSBcImF1dG9cIjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnNET01XaWR0aCgpO1xuICB9XG5cbiAgdXBkYXRlQ29sdW1uc0RPTVdpZHRoKCkge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xuICAgICAgYy5ET01XaWR0aCA9IHRoaXMuZ2V0VGhXaWR0aEZyb21PQ29sdW1uKGMpO1xuICAgIH0pO1xuXG4gIH1cblxuICBwdWJsaWMgaXNEaXNhYmxlQ2hlY2tib3goaXRlbTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTm9uZSgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuZGlzYWJsZVNlbGVjdGlvbkZ1bmN0aW9uKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZVNlbGVjdGlvbkZ1bmN0aW9uKHsgLi4uaXRlbSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIH1cblxuICBnZXRTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlO1xuICB9XG5cbiAgZ2V0U25hY2tTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLnNuYWNrQmFyU2VydmljZTtcbiAgfVxuXG5cbiAgZ2V0RmlsdGVyQ29sdW1uQnlBdHRyKGF0dHI6IHN0cmluZyk6IE9GaWx0ZXJDb2x1bW4ge1xuICAgIC8vIElmIHRoZSBjb2x1bW5zIGZpbHRlciBjb21wb25lbnQgZXhpc3RzLCB1c2UgaXRzIGNvbHVtbiBkZWZpbml0aW9uc1xuICAgIGlmICh0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQ/LmNvbHVtbnNBcnJheT8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50Py5jb2x1bW5zQXJyYXkuZmluZChmaWx0ZXJDb2x1bW4gPT4gZmlsdGVyQ29sdW1uLmF0dHIgPT09IGF0dHIpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIGNvbHVtbnMgZmlsdGVyIGNvbXBvbmVudCwgZmFsbCBiYWNrIHRvIHRoZSB0YWJsZeKAmXMgdmlzaWJsZSBjb2x1bW5zXG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbiA9IHRoaXMub1RhYmxlT3B0aW9ucy5jb2x1bW5zPy5maW5kKGNvbCA9PiBjb2wuYXR0ciA9PT0gYXR0ciAmJiBjb2wudmlzaWJsZSk7XG4gICAgaWYgKHZpc2libGVDb2x1bW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGF0dHI6IHZpc2libGVDb2x1bW4uYXR0cixcbiAgICAgICAgdGl0bGU6IHZpc2libGVDb2x1bW4udGl0bGUsXG4gICAgICAgIGZpbHRlclZhbHVlc0luRGF0YTogJ2N1cnJlbnQtcGFnZScsXG4gICAgICAgIHNvcnQ6ICcnLFxuICAgICAgICBzdGFydFZpZXc6ICcnXG5cbiAgICAgIH0gYXMgT0ZpbHRlckNvbHVtbjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZUNvbHVtblRpdGxlcyhjb2x1bW5zOiB7IGF0dHI6IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWF0VGFibGUgfHwgIXRoaXMub1RhYmxlT3B0aW9ucz8uY29sdW1ucykgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlcyB0aGUgdGl0bGVzIG9mIGV4aXN0aW5nIGNvbHVtbnNcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLm9UYWJsZU9wdGlvbnMuY29sdW1ucykge1xuICAgICAgY29uc3QgdXBkYXRlZCA9IGNvbHVtbnMuZmluZChjID0+IGMuYXR0ciA9PT0gY29sLmF0dHIpO1xuICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgY29sLnRpdGxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh1cGRhdGVkLnRpdGxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5tYXRUYWJsZT8ucmVtb3ZlSGVhZGVyUm93RGVmKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICogU2F2ZXMgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uXG4gICovXG4gIHByaXZhdGUgc2F2ZVNjcm9sbFBvc2l0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCkge1xuICAgICAgLy8gUGFyYSB2aXJ0dWFsIHNjcm9sbFxuICAgICAgdGhpcy5zYXZlZFNjcm9sbFBvc2l0aW9uID0gdGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQubWVhc3VyZVNjcm9sbE9mZnNldCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50YWJsZUJvZHlFbD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgLy8gUGFyYSBzY3JvbGwgbm9ybWFsXG4gICAgICB0aGlzLnNhdmVkU2Nyb2xsUG9zaXRpb24gPSB0aGlzLnRhYmxlQm9keUVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyB0aGUgc2F2ZWQgc2Nyb2xsIHBvc2l0aW9uXG4gICAqL1xuICBwcml2YXRlIHJlc3RvcmVTY3JvbGxQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCAmJiB0aGlzLnNhdmVkU2Nyb2xsUG9zaXRpb24gPiAwKSB7XG4gICAgICAgIC8vIFBhcmEgdmlydHVhbCBzY3JvbGxcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQuc2Nyb2xsVG9PZmZzZXQodGhpcy5zYXZlZFNjcm9sbFBvc2l0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50YWJsZUJvZHlFbD8ubmF0aXZlRWxlbWVudCAmJiB0aGlzLnNhdmVkU2Nyb2xsUG9zaXRpb24gPiAwKSB7XG4gICAgICAgIC8vIFBhcmEgc2Nyb2xsIG5vcm1hbFxuICAgICAgICB0aGlzLnRhYmxlQm9keUVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5zYXZlZFNjcm9sbFBvc2l0aW9uO1xuICAgICAgfVxuICAgICAgdGhpcy5zYXZlZFNjcm9sbFBvc2l0aW9uID0gMDtcbiAgICB9LCAwKTtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiby10YWJsZS1jb250YWluZXJcIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBzdHJldGNoXCIgW3N0eWxlLmRpc3BsYXldPVwiaXNWaXNpYmxlKCk/ICcnIDogJ25vbmUnXCJcbiAgW2NsYXNzLmJsb2NrLWV2ZW50c109XCJsb2FkaW5nU2VydmljZS5pc1Byb2Nlc3NpbmckIHwgYXN5bmNcIj5cbiAgPG8tZGF0YS10b29sYmFyICN0YWJsZVRvb2xiYXIgKm5nSWY9XCJoYXNDb250cm9scygpXCIgW3RpdGxlXT1cInRpdGxlXCIgW3Nob3ctdGl0bGVdPVwic2hvd1RpdGxlXCIgY2xhc3M9XCJvLXRhYmxlLXRvb2xiYXJcIj5cbiAgICA8bmctY29udGFpbmVyIG8tZGF0YS10b29sYmFyLXByb2plY3Rpb24tc3RhcnQ+XG4gICAgICA8by10YWJsZS1idXR0b25zICN0YWJsZUJ1dHRvbnMgW2luc2VydC1idXR0b25dPVwiaW5zZXJ0QnV0dG9uXCIgW3JlZnJlc2gtYnV0dG9uXT1cInJlZnJlc2hCdXR0b25cIiBbZGVsZXRlLWJ1dHRvbl09XCJzaG93RGVsZXRlQnV0dG9uXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm8tdGFibGUtYnV0dG9uXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9vLXRhYmxlLWJ1dHRvbnM+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW28tdGFibGUtdG9vbGJhcl1bcG9zaXRpb249c3RhcnRdXCIgbmdQcm9qZWN0QXM9XCJbby1kYXRhLXRvb2xiYXItY3VzdG9tLXByb2plY3Rpb24tc3RhcnRdXCI+XG4gICAgPC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltvLXRhYmxlLXRvb2xiYXJdW3Bvc2l0aW9uPWVuZF1cIiBuZ1Byb2plY3RBcz1cIltvLWRhdGEtdG9vbGJhci1jdXN0b20tcHJvamVjdGlvbi1lbmRdXCI+XG4gICAgPC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltvLXRhYmxlLXRvb2xiYXJdXCIgbmdQcm9qZWN0QXM9XCJbby1kYXRhLXRvb2xiYXItY3VzdG9tLXByb2plY3Rpb24tc3RhcnRdXCI+XG4gICAgPC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250YWluZXIgby1kYXRhLXRvb2xiYXItcHJvamVjdGlvbi1lbmQ+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVpY2tmaWx0ZXJDb250ZW50Q2hpbGQ7IGVsc2UgZGVmYXVsdFF1aWNrRmlsdGVyXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm8tdGFibGUtcXVpY2tmaWx0ZXJcIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFF1aWNrRmlsdGVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVpY2tGaWx0ZXJcIj5cbiAgICAgICAgICA8by10YWJsZS1xdWlja2ZpbHRlciAob25DaGFuZ2UpPVwidGFibGVRdWlja0ZpbHRlckNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvby10YWJsZS1xdWlja2ZpbHRlcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJzaG93VGFibGVNZW51QnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGNsYXNzPVwiby10YWJsZS1tZW51LWJ1dHRvblwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJ0YWJsZU1lbnUubWF0TWVudVwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJvbnRpbWl6ZTptb3JlX3ZlcnRcIj48L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8by10YWJsZS1tZW51ICN0YWJsZU1lbnUgW3NlbGVjdC1hbGwtY2hlY2tib3hdPVwic2VsZWN0QWxsQ2hlY2tib3hcIiBbZXhwb3J0LWJ1dHRvbl09XCJleHBvcnRCdXR0b25cIlxuICAgICAgICBbY29sdW1ucy12aXNpYmlsaXR5LWJ1dHRvbl09XCJjb2x1bW5zVmlzaWJpbGl0eUJ1dHRvblwiIFtzaG93LWNvbmZpZ3VyYXRpb24tb3B0aW9uXT1cInNob3dDb25maWd1cmF0aW9uT3B0aW9uXCJcbiAgICAgICAgW3Nob3ctZmlsdGVyLW9wdGlvbl09XCJzaG93RmlsdGVyT3B0aW9uXCIgW3Nob3ctcmVwb3J0LW9uLWRlbWFuZC1vcHRpb25dPVwic2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uXCJcbiAgICAgICAgW3Nob3ctY2hhcnRzLW9uLWRlbWFuZC1vcHRpb25dPVwic2hvd0NoYXJ0c09uRGVtYW5kT3B0aW9uXCIgW3Nob3ctcmVzZXQtd2lkdGgtb3B0aW9uXT1cInNob3dSZXNldFdpZHRoT3B0aW9uXCIgW3Nob3ctZ3JvdXAtYnktb3B0aW9uXT1cImdyb3VwYWJsZVwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJvLXRhYmxlLW9wdGlvblwiPjwvbmctY29udGVudD5cbiAgICAgIDwvby10YWJsZS1tZW51PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L28tZGF0YS10b29sYmFyPlxuXG4gIDxkaXYgI3RhYmxlQm9keSBjbGFzcz1cIm8tdGFibGUtYm9keSBvLXNjcm9sbFwiIFtjbGFzcy5ob3Jpem9udGFsLXNjcm9sbF09XCJob3Jpem9udGFsU2Nyb2xsXCIgW2NsYXNzLnNjcm9sbGVkXT1cImhvcml6b250YWxTY3JvbGxlZFwiXG4gICAgW25nU3R5bGVdPVwieyd2aXNpYmlsaXR5Jzogc3Bpbm5lckNvbnRhaW5lciA/ICdoaWRkZW4nIDogJ3Zpc2libGUnfVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZW5hYmxlZFZpcnR1YWxTY3JvbGw7IGVsc2UgdGFibGVXaXRoVmlydHVhbFNjcm9sbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm8tdGFibGUtb3ZlcmZsb3cgby1zY3JvbGxcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICN0YWJsZVdpdGhWaXJ0dWFsU2Nyb2xsPlxuICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCAjdmlydHVhbFNjcm9sbFZpZXdQb3J0IGZ4RmxleD5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG4gIDwhLS1UQUJMRSBQQUdJTkFUT1ItLT5cbiAgPG1hdC1wYWdpbmF0b3IgKm5nSWY9XCJwYWdpbmF0b3JcIiAjbWF0cGFnaW5hdG9yIFtsZW5ndGhdPVwiZGF0YVNvdXJjZT8ucmVzdWx0c0xlbmd0aFwiIFtwYWdlSW5kZXhdPVwicGFnaW5hdG9yLnBhZ2VJbmRleFwiIFtwYWdlU2l6ZV09XCJxdWVyeVJvd3NcIlxuICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnaW5hdG9yLnBhZ2VTaXplT3B0aW9uc1wiIChwYWdlKT1cIm9uQ2hhbmdlUGFnZSgkZXZlbnQpXCIgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInBhZ2luYXRvci5zaG93Rmlyc3RMYXN0QnV0dG9uc1wiXG4gICAgW25nU3R5bGVdPVwieyd2aXNpYmlsaXR5Jzogc3Bpbm5lckNvbnRhaW5lciA/ICdoaWRkZW4nIDogJ3Zpc2libGUnfVwiPlxuICA8L21hdC1wYWdpbmF0b3I+XG5cbiAgPCEtLUxPQURJTkctLT5cbiAgPGRpdiAjc3Bpbm5lckNvbnRhaW5lciAqbmdJZj1cInNob3dMb2FkaW5nIHwgYXN5bmNcIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCIgW25nU3R5bGVdPVwieyd0b3AucHgnOiB0b29sQmFySGVpZ2h0fVwiXG4gICAgY2xhc3M9XCJzcGlubmVyLWNvbnRhaW5lclwiIFtjbGFzcy5zcGlubmVyLWNvbnRhaW5lci1zY3JvbGxhYmxlXT1cImxvYWRpbmdTY3JvbGwgfCBhc3luY1wiPlxuICAgIDxvLXRhYmxlLXNrZWxldG9uPjwvby10YWJsZS1za2VsZXRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBEaXNhYmxlIGJsb2NrZXIgLS0+XG4gIDxkaXYgKm5nSWY9XCIhZW5hYmxlZFwiIGNsYXNzPVwiby10YWJsZS1kaXNhYmxlZC1ibG9ja2VyXCI+PC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0YWJsZT5cbiAgPHRhYmxlIG1hdC10YWJsZSAjdGFibGUgW2NsYXNzLmF1dG9hZGp1c3RlZF09XCJhdXRvQWRqdXN0XCIgW3RyYWNrQnldPVwiZ2V0VHJhY2tCeUZ1bmN0aW9uKClcIiBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgb01hdFNvcnRcbiAgICBbb01hdFNvcnRDb2x1bW5zXT1cInNvcnRDb2xBcnJheVwiIFtuZ0NsYXNzXT1cInJvd0hlaWdodE9ic2VydmFibGUgfCBhc3luY1wiIChjZGtPYnNlcnZlQ29udGVudCk9XCJwcm9qZWN0Q29udGVudENoYW5nZWQoKVwiXG4gICAgb1RhYmxlRXhwYW5kZWRGb290ZXIgW29UYWJsZUV4cGFuZGVkRm9vdGVyQ29sc3Bhbl09XCJ2aXNpYmxlQ29sQXJyYXkubGVuZ3RoXCJcbiAgICBbbXVsdGlUZW1wbGF0ZURhdGFSb3dzXT1cInNob3dFeHBhbmRhYmxlUm93KClcIiBhcmlhLWRlc2NyaWJlZGJ5PVwib250aW1pemUtd2ViIHRhYmxlXCI+XG5cbiAgICA8IS0tQ2hlY2tib3ggQ29sdW1uIC0tPlxuICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5uYW1lXCIgKm5nSWY9XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkOyBlbHNlIGN1c3RvbUhlYWRlclNlbGVjdEFsbFRlbXBsYXRlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIiAqbmdJZj1cImlzU2VsZWN0aW9uTW9kZU11bHRpcGxlKClcIj5cbiAgICAgICAgICAgIDxvLXRhYmxlLWhlYWRlci1zZWxlY3QtYWxsIFtjb2x1bW5dPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW5cIj48L28tdGFibGUtaGVhZGVyLXNlbGVjdC1hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IG5hbWU9XCJpZFtdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVDaGVja2JveChyb3cpXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0aW9uQ2hlY2tib3hUb2dnbGUoJGV2ZW50LCByb3cpXCIgW2NoZWNrZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCI+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tSGVhZGVyU2VsZWN0QWxsVGVtcGxhdGU+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLnJlc2l6YWJsZV09XCJyZXNpemFibGVcIiBjbGFzcz1cIm1hdC1oZWFkZXItc2VsZWN0LWFsbC13aXRoLXRpdGxlIG8tY2VudGVyXCJcbiAgICAgICAgICBbc3R5bGUud2lkdGhdPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ud2lkdGhcIiBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKG9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uKVwiXG4gICAgICAgICAgW3N0eWxlLm1heC13aWR0aF09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5tYXhXaWR0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgICAgICAgICA8by10YWJsZS1oZWFkZXItc2VsZWN0LWFsbCBbY29sdW1uXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uXCI+PC9vLXRhYmxlLWhlYWRlci1zZWxlY3QtYWxsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgY2xhc3M9XCJvLWNlbnRlclwiIFtzdHlsZS53aWR0aF09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi53aWR0aFwiXG4gICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJnZXRNaW5XaWR0aENvbHVtbihvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbilcIiBbc3R5bGUubWF4LXdpZHRoXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm1heFdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCBuYW1lPVwiaWRbXVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlQ2hlY2tib3gocm93KVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInNlbGVjdGlvbkNoZWNrYm94VG9nZ2xlKCRldmVudCwgcm93KVwiIFtjaGVja2VkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuXG4gICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPjwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tRXhwYW5kYWJsZSBDb2x1bW4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIm9UYWJsZU9wdGlvbnMuZXhwYW5kYWJsZUNvbHVtbi5uYW1lXCIgKm5nSWY9XCJpc0NvbHVtbkV4cGFuZGFibGUoKVwiPlxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAge3sgb1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uLnRpdGxlIH19XG4gICAgICA8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdztsZXQgcm93SW5kZXggPSBkYXRhSW5kZXhcIj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwic2hvd0V4cGFuZGFibGVJY29uKHJvdywgcm93SW5kZXgpIHwgYXN5bmNcIiAoY2xpY2spPVwidG9nZ2xlUm93RXhwYW5kYWJsZShyb3csICRldmVudClcIlxuICAgICAgICAgIChrZXlkb3duKT1cInRvZ2dsZVJvd0V4cGFuZGFibGUocm93LCAkZXZlbnQpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRXhwYW5kZWQocm93KVwiPnt7IHRhYmxlUm93RXhwYW5kYWJsZS5pY29uQ29sbGFwc2UgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRXhwYW5kZWQocm93KVwiPnt7IHRhYmxlUm93RXhwYW5kYWJsZS5pY29uRXhwYW5kIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBHZW5lcmljIGNvbHVtbiBkZWZpbml0aW9uIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBvVGFibGVPcHRpb25zLmNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCI+XG4gICAgICA8IS0tRGVmaW5lIGhlYWRlci1jZWxsLS0+XG5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW25nQ2xhc3NdPVwiZ2V0VGl0bGVBbGlnbkNsYXNzKGNvbHVtbilcIiBbY2xhc3MucmVzaXphYmxlXT1cInJlc2l6YWJsZVwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKGNvbHVtbilcIiBbc3R5bGUubWF4LXdpZHRoXT1cImNvbHVtbi5tYXhXaWR0aFwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgICAgICAgPG8tdGFibGUtaGVhZGVyIFtjb2x1bW5dPVwiY29sdW1uXCI+PC9vLXRhYmxlLWhlYWRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RoPlxuXG5cbiAgICAgIDwhLS1EZWZpbmUgbWF0LWNlbGwtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGUubXVsdGlUZW1wbGF0ZURhdGFSb3dzOyBlbHNlIGNlbGxUZW1wbGF0ZU11bHRpVGVtcGxhdGVEYXRhUm93c1wiPlxuICAgICAgICA8dGQgI2NlbGwgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O2xldCByb3dJbmRleCA9IGluZGV4IFwiIFtuZ0NsYXNzXT1cIltjb2x1bW4uY2xhc3NOYW1lLCBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXVwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKHJvdywgY29sdW1uLCByb3dJbmRleCwgY2VsbCwgJGV2ZW50KVwiIChkYmxjbGljayk9XCJoYW5kbGVEb3VibGVDbGljayhyb3csIGNvbHVtbiwgcm93SW5kZXgsIGNlbGwsICRldmVudClcIlxuICAgICAgICAgIFtjbGFzcy5lbXB0eS1jZWxsXT1cImlzRW1wdHkocm93W2NvbHVtbi5uYW1lXSlcIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFjb2x1bW4uaGFzVG9vbHRpcCgpXCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLmdldFRvb2x0aXAocm93KVwiXG4gICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNzUwXCIgbWF0VG9vbHRpcENsYXNzPVwiby10YWJsZS1jZWxsLXRvb2x0aXBcIlxuICAgICAgICAgIFtjbGFzcy5vLW1hdC1jZWxsLW11bHRpbGluZV09XCIoY29sdW1uLmlzTXVsdGlsaW5lIHwgYXN5bmMpXCIgW29Db250ZXh0TWVudV09XCJ0YWJsZUNvbnRleHRNZW51XCJcbiAgICAgICAgICBbb0NvbnRleHRNZW51RGF0YV09XCJ7IGNlbGxOYW1lOmNvbHVtbi5uYW1lLCByb3dWYWx1ZTpyb3csIHJvd0luZGV4OnJvd0luZGV4fVwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4oY29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwiY29sdW1uLm1heFdpZHRoXCJcbiAgICAgICAgICBbY2xhc3Muby10YWJsZS1lZGl0aW5nLWNlbGxdPVwiaXNSb3dTZWxlY3RlZChyb3cpICYmIGNvbHVtbi5lZGl0aW5nXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxSZW5kZXJlcjtjb250ZXh0Ontjb2x1bW46Y29sdW1uLHJvdzpyb3d9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbFRlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzPlxuICAgICAgICA8dGQgI2NlbGwgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O2xldCByb3dJbmRleCA9IGRhdGFJbmRleCBcIiBbbmdDbGFzc109XCJbY29sdW1uLmNsYXNzTmFtZSwgZ2V0Q2VsbEFsaWduQ2xhc3MoY29sdW1uKV1cIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDbGljayhyb3csIGNvbHVtbiwgcm93SW5kZXgsIGNlbGwsICRldmVudClcIiAoZGJsY2xpY2spPVwiaGFuZGxlRG91YmxlQ2xpY2socm93LCBjb2x1bW4sIHJvd0luZGV4LCBjZWxsLCAkZXZlbnQpXCJcbiAgICAgICAgICBbY2xhc3MuZW1wdHktY2VsbF09XCJpc0VtcHR5KHJvd1tjb2x1bW4ubmFtZV0pXCIgW21hdFRvb2x0aXBEaXNhYmxlZF09XCIhY29sdW1uLmhhc1Rvb2x0aXAoKVwiIFttYXRUb29sdGlwXT1cImNvbHVtbi5nZXRUb29sdGlwKHJvdylcIlxuICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCIgbWF0VG9vbHRpcFNob3dEZWxheT1cIjc1MFwiIG1hdFRvb2x0aXBDbGFzcz1cIm8tdGFibGUtY2VsbC10b29sdGlwXCJcbiAgICAgICAgICBbY2xhc3Muby1tYXQtY2VsbC1tdWx0aWxpbmVdPVwiKGNvbHVtbi5pc011bHRpbGluZSB8IGFzeW5jKVwiIFtvQ29udGV4dE1lbnVdPVwidGFibGVDb250ZXh0TWVudVwiXG4gICAgICAgICAgW29Db250ZXh0TWVudURhdGFdPVwieyBjZWxsTmFtZTpjb2x1bW4ubmFtZSwgcm93VmFsdWU6cm93LCByb3dJbmRleDpyb3dJbmRleH1cIiBbc3R5bGUud2lkdGhdPVwiY29sdW1uLndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKGNvbHVtbilcIiBbc3R5bGUubWF4LXdpZHRoXT1cImNvbHVtbi5tYXhXaWR0aFwiXG4gICAgICAgICAgW2NsYXNzLm8tdGFibGUtZWRpdGluZy1jZWxsXT1cImlzUm93U2VsZWN0ZWQocm93KSAmJiBjb2x1bW4uZWRpdGluZ1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsUmVuZGVyZXI7Y29udGV4dDp7Y29sdW1uOmNvbHVtbixyb3c6cm93fVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPCEtLURlZmluZSBtYXQtZm9vdGVyLWNlbGwtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93VG90YWxzIHwgYXN5bmNcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbbmdDbGFzc109XCJjb2x1bW4uY2xhc3NOYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCIgKm5nSWY9XCJjb2x1bW4uYWdncmVnYXRlICYmIGNvbHVtbi5hZ2dyZWdhdGUudGl0bGVcIj5cbiAgICAgICAgICAgIHt7IGNvbHVtbi5hZ2dyZWdhdGUudGl0bGUgfCBvVHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2x1bW4ucmVuZGVyZXIgfHwgY29sdW1uLmFnZ3JlZ2F0ZT8ub3BlcmF0b3IgPT09ICdjb3VudCc7IGVsc2UgcmVuZGVyZXJUZW1wbGF0ZVwiPlxuICAgICAgICAgICAge3sgZGF0YVNvdXJjZS5nZXRBZ2dyZWdhdGVEYXRhKGNvbHVtbikgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3JlbmRlcmVyVGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJjb2x1bW4ucmVuZGVyZXIgJiYgY29sdW1uLmFnZ3JlZ2F0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5yZW5kZXJlci50ZW1wbGF0ZXJlZlwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y2VsbHZhbHVlOiBkYXRhU291cmNlLmdldEFnZ3JlZ2F0ZURhdGEoY29sdW1uKX1cIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgQ29sdW1uIC0gVGhlIGRldGFpbCByb3cgaXMgbWFkZSB1cCBvZiB0aGlzIG9uZSBjb2x1bW4gdGhhdCBzcGFucyBhY3Jvc3MgYWxsIGNvbHVtbnMgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0V4cGFuZGVkUm93XCI+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImV4cGFuZGVkRGV0YWlsXCI+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7bGV0IHJvd0luZGV4PSBkYXRhSW5kZXhcIiBbYXR0ci5jb2xzcGFuXT1cIm9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMubGVuZ3RoXCI+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRFeHBhbmRlZFJvd0NvbnRhaW5lckNsYXNzKHJvd0luZGV4KVwiIFtAZGV0YWlsRXhwYW5kXT1cImdldFN0YXRlRXhwYW5kKHJvdylcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLUZPT1RFUi1JTlNFUlRBQkxFLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dMYXN0SW5zZXJ0YWJsZVJvdyAmJiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubmFtZSArIGdldFN1ZmZpeENvbHVtbkluc2VydGFibGUoKVwiICpuZ0lmPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZVwiPlxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2Ygb1RhYmxlT3B0aW9ucy5jb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ubmFtZSsgZ2V0U3VmZml4Q29sdW1uSW5zZXJ0YWJsZSgpXCI+XG5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbbmdDbGFzc109XCJbY29sdW1uLmNsYXNzTmFtZSwgZ2V0Q2VsbEFsaWduQ2xhc3MoY29sdW1uKV1cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0NvbHVtbkluc2VydGFibGUoY29sdW1uKSAmJiAhb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC51c2VDZWxsRWRpdG9yKGNvbHVtbilcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImluc2VydGFibGUtZm9ybS1maWVsZCBvLXRhYmxlLWNlbGwtZWRpdG9yLXRleHQgby10YWJsZS1jZWxsLWVkaXRvclwiIFtoaWRlUmVxdWlyZWRNYXJrZXJdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuZ2V0UGxhY2Vob2xkZXIoY29sdW1uKVwiIFtpZF09XCJjb2x1bW4uYXR0clwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuZ2V0Q29udHJvbChjb2x1bW4pXCIgW3JlcXVpcmVkXT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNDb2x1bW5SZXF1aXJlZChjb2x1bW4pXCI+XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm9NYXRFcnJvcj1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuY29sdW1uSGFzRXJyb3IoY29sdW1uLCAncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICAgIHt7ICdGT1JNX1ZBTElEQVRJT04uUkVRVUlSRUQnIHwgb1RyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0NvbHVtbkluc2VydGFibGUoY29sdW1uKSAmJiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnVzZUNlbGxFZGl0b3IoY29sdW1uKVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuY29sdW1uRWRpdG9yc1tjb2x1bW4uYXR0cl0udGVtcGxhdGVyZWZcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyByb3d2YWx1ZTogb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5yb3dEYXRhIH1cIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaXJzdEluc2VydGFibGVSb3cgJiYgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cImdldENvbHVtbkluc2VydGFibGUob1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubmFtZSlcIiAqbmdJZj1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGVcIj5cbiAgICAgICAgPHRkIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIG9UYWJsZU9wdGlvbnMuY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiZ2V0Q29sdW1uSW5zZXJ0YWJsZShjb2x1bW4ubmFtZSlcIj5cblxuICAgICAgICA8dGQgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtuZ0NsYXNzXT1cIltjb2x1bW4uY2xhc3NOYW1lLCBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uSW5zZXJ0YWJsZShjb2x1bW4pICYmICFvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnVzZUNlbGxFZGl0b3IoY29sdW1uKVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5zZXJ0YWJsZS1mb3JtLWZpZWxkXCIgW2hpZGVSZXF1aXJlZE1hcmtlcl09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5nZXRQbGFjZWhvbGRlcihjb2x1bW4pXCIgW2lkXT1cImNvbHVtbi5hdHRyXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5nZXRDb250cm9sKGNvbHVtbilcIiBbcmVxdWlyZWRdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0NvbHVtblJlcXVpcmVkKGNvbHVtbilcIj5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqb01hdEVycm9yPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5jb2x1bW5IYXNFcnJvcihjb2x1bW4sICdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAge3sgJ0ZPUk1fVkFMSURBVElPTi5SRVFVSVJFRCcgfCBvVHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uSW5zZXJ0YWJsZShjb2x1bW4pICYmIG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQudXNlQ2VsbEVkaXRvcihjb2x1bW4pXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5jb2x1bW5FZGl0b3JzW2NvbHVtbi5hdHRyXS50ZW1wbGF0ZXJlZlwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHJvd3ZhbHVlOiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnJvd0RhdGEgfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIERlZmluaXRpb24gY29sdW1uIGdyb3VwIGhlYWRlciAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgZ3JvdXBpbmdIZWFkZXJzUm93czsgbGV0IGkgPSBpbmRleFwiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uXCI+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZ3JvdXBcIiBjbGFzcz1cImdyb3VwaW5nLXJvd1wiIFtvQ29udGV4dE1lbnVdPVwidGFibGVDb250ZXh0TWVudVwiXG4gICAgICAgIFtvQ29udGV4dE1lbnVEYXRhXT1cInsgY2VsbE5hbWU6Y29sdW1uLCByb3dWYWx1ZTpncm91cCwgcm93SW5kZXg6aX1cIiBbbmdDbGFzc109XCJnZXRHcm91cEhlYWRlckNlbGxBbGlnbkNsYXNzKGNvbHVtbilcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImk9PT0wXCIgY2xhc3M9XCJncm91cGluZy10aXRsZS13cmFwcGVyXCIgW25nU3R5bGVdPVwieydwYWRkaW5nLWxlZnQnOiAyMCooZ3JvdXAubGV2ZWwtMSkrJ3B4J31cIj5cbiAgICAgICAgICA8bWF0LWljb24+e3sgZ3JvdXAuZXhwYW5kZWQgPyAnZXhwYW5kX21vcmUnIDogJ2NoZXZyb25fcmlnaHQnIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICB7eyBncm91cC50aXRsZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwaW5nLWFnZ3JlZ2F0ZVwiICpuZ0lmPVwiZ3JvdXAuaGFzQWN0aXZlQWdncmVnYXRlKHZpc2libGVDb2xBcnJheVtpXSlcIj5cbiAgICAgICAgICB7eyBncm91cC5nZXRDb2x1bW5BY3RpdmVBZ2dyZWdhdGVUaXRsZSh2aXNpYmxlQ29sQXJyYXlbaV0pIHwgb1RyYW5zbGF0ZSB9fSA6XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFnZXRPQ29sdW1uRnJvbUdyb3VwSGVhZGVyQ29sdW1uKGNvbHVtbikucmVuZGVyZXJcIj5cbiAgICAgICAgICAgIHt7IGdyb3VwLmdldENvbHVtbkFnZ3JlZ2F0ZVZhbHVlKHZpc2libGVDb2xBcnJheVtpXSl9fVxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRPQ29sdW1uRnJvbUdyb3VwSGVhZGVyQ29sdW1uKGNvbHVtbikucmVuZGVyZXJcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdldE9Db2x1bW5Gcm9tR3JvdXBIZWFkZXJDb2x1bW4oY29sdW1uKS5yZW5kZXJlcj8udGVtcGxhdGVyZWY7IGNvbnRleHQ6eyBjZWxsdmFsdWU6ICBncm91cC5nZXRDb2x1bW5BZ2dyZWdhdGVWYWx1ZSh2aXNpYmxlQ29sQXJyYXlbaV0pIH1cIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicG9zaXRpb25cIj5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj4ge3tyb3d9fSA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPHRyICN0YWJsZUhlYWRlciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwib1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uczsgc3RpY2t5OiBmaXhlZEhlYWRlclwiPjwvdHI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhYmxlLm11bHRpVGVtcGxhdGVEYXRhUm93czsgZWxzZSByb3dUZW1wbGF0ZU11bHRpVGVtcGxhdGVEYXRhUm93c1wiPlxuICAgICAgPHRyIG1hdC1yb3cgb1RhYmxlUm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBvVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zOyB3aGVuOmlzTm90R3JvdXA7IGxldCByb3dJbmRleCA9IGluZGV4XCJcbiAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiIFtuZ0NsYXNzXT1cInJvdyB8IG9UYWJsZVJvd0NsYXNzOiByb3dJbmRleDogcm93Q2xhc3NcIj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNyb3dUZW1wbGF0ZU11bHRpVGVtcGxhdGVEYXRhUm93cz5cbiAgICAgIDx0ciBtYXQtcm93IG9UYWJsZVJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uczsgd2hlbjppc05vdEdyb3VwOyBsZXQgcm93SW5kZXggPSBkYXRhSW5kZXhcIlxuICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCIgW25nQ2xhc3NdPVwicm93IHwgb1RhYmxlUm93Q2xhc3M6IHJvd0luZGV4OiByb3dDbGFzc1wiPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBSb3cgR3JvdXAgaGVhZGVyIC0tPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBncm91cGluZ0hlYWRlcnNSb3dzOyB3aGVuOmlzR3JvdXBcIiAoY2xpY2spPVwiZ3JvdXBIZWFkZXJDbGljayhyb3cpXCJcbiAgICAgIFtuZ0NsYXNzXT1cImdldENsYXNzTmFtZUdyb3VwSGVhZGVyKHJvdylcIj5cbiAgICA8L3RyPlxuXG4gICAgPCEtLSBFeHBhbmRlZCBkZXRhaWwgcm93LS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0V4cGFuZGVkUm93XCI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydleHBhbmRlZERldGFpbCddXCIgY2xhc3M9XCJvLXRhYmxlLXJvdy1leHBhbmRlZFwiPjwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0xhc3RJbnNlcnRhYmxlUm93XCI+XG4gICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cIm9UYWJsZU9wdGlvbnMuY29sdW1uc0luc2VydGFibGVzOyBzdGlja3k6IHRydWVcIlxuICAgICAgICAoa2V5dXApPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5oYW5kbGVLZXlib2FyZEV2ZW50KCRldmVudClcIiBjbGFzcz1cIm8tdGFibGUtaW5zZXJ0YWJsZVwiPjwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaXJzdEluc2VydGFibGVSb3dcIj5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwib1RhYmxlT3B0aW9ucy5jb2x1bW5zSW5zZXJ0YWJsZXM7IHN0aWNreTogdHJ1ZVwiXG4gICAgICAgIChrZXl1cCk9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmhhbmRsZUtleWJvYXJkRXZlbnQoJGV2ZW50KVwiIGNsYXNzPVwiby10YWJsZS1pbnNlcnRhYmxlXCI+IDwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dUb3RhbHMgfCBhc3luY1wiPlxuICAgICAgPHRyIG1hdC1mb290ZXItcm93ICptYXRGb290ZXJSb3dEZWY9XCJvVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zOyBzdGlja3k6IHRydWVcIiBjbGFzcz1cIm8tdGFibGUtYWdncmVnYXRlXCI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3RhYmxlPlxuXG48L25nLXRlbXBsYXRlPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRleHRNZW51Q29udGVudENoaWxkICYmIGNvbnRleHRNZW51XCI+XG4gIDxvLXRhYmxlLWNvbnRleHQtbWVudSBbaW5zZXJ0XT1cImluc2VydEJ1dHRvblwiIFtlZGl0XT1cImVkaXRpb25Nb2RlICE9PSBFRElUX01PREVfTk9ORVwiIFt2aWV3LWRldGFpbF09XCJkZXRhaWxNb2RlICE9PSBERVRBSUxfTU9ERV9OT05FXCJcbiAgICBbcmVmcmVzaF09XCJyZWZyZXNoQnV0dG9uXCIgW2RlbGV0ZV09XCJkZWxldGVCdXR0b25cIiBbZmlsdGVyXT1cInNob3dGaWx0ZXJPcHRpb25cIiBbZ3JvdXAtYnktcm93XT1cImdyb3VwYWJsZVwiPlxuICA8L28tdGFibGUtY29udGV4dC1tZW51PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjY2VsbFJlbmRlcmVyIGxldC1yb3c9XCJyb3dcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJ0cnVlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJjb2x1bW4ucmVuZGVyZXIgIT0gbnVsbCAmJiAoIWNvbHVtbi5lZGl0aW5nIHx8IGNvbHVtbi5lZGl0aW5nICYmICFpc1Jvd1NlbGVjdGVkKHJvdykpXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5yZW5kZXJlcj8udGVtcGxhdGVyZWY7IGNvbnRleHQ6eyBjZWxsdmFsdWU6IHJvd1tjb2x1bW4ubmFtZV0sIHJvd3ZhbHVlOnJvdyB9XCI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImlzUm93U2VsZWN0ZWQocm93KSAmJiBjb2x1bW4uZWRpdGluZ1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW4uZWRpdG9yPy50ZW1wbGF0ZXJlZjsgY29udGV4dDp7IGNlbGx2YWx1ZTogcm93W2NvbHVtbi5uYW1lXSwgcm93dmFsdWU6cm93IH1cIj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJjb2x1bW4udHlwZSA9PT0gJ2VkaXRCdXR0b25JblJvdycgfHwgY29sdW1uLnR5cGUgPT09ICdkZXRhaWxCdXR0b25JblJvdydcIj5cbiAgICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIGNsYXNzPVwiby1hY3Rpb24tY2VsbC1yZW5kZXJlclwiIChjbGljayk9XCJvbkRldGFpbEJ1dHRvbkNsaWNrKGNvbHVtbiwgcm93LCAkZXZlbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnt7IGdldERldGFpbEJ1dHRvbkljb24oY29sdW1uKSB9fTwvbWF0LWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+e3sgcm93W2NvbHVtbi5uYW1lXSB9fTwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
3184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9vLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL28tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBSUwsY0FBYyxFQUNkLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBR04sUUFBUSxFQUNSLFNBQVMsRUFFVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFN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ZSxFQUFFLEVBQUU7Z0JBK0JqQyx1QkFBdUI7c0JBRHRCLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU0xRCxPQUFPO3NCQUROLFlBQVk7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uQ2hhbmdlLCBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IERvbVBvcnRhbE91dGxldCwgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgVklSVFVBTF9TQ1JPTExfU1RSQVRFR1kgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIEFwcGxpY2F0aW9uUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0TWVudSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFRhYiwgTWF0VGFiR3JvdXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBCb29sZWFuQ29udmVydGVyLCBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBDb21wb25lbnRTdGF0ZVNlcnZpY2VQcm92aWRlciwgT250aW1pemVTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgU25hY2tCYXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc25hY2tiYXIuc2VydmljZSc7XG5pbXBvcnQgeyBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdGUvby10YWJsZS1jb21wb25lbnQtc3RhdGUuY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlQ29tcG9uZW50U3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdGUvby10YWJsZS1jb21wb25lbnQtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBPQ29sdW1uRGlzcGxheSwgT0ZpbHRlckRlZmluaXRpb24sIE9Hcm91cGVkQ29sdW1uVHlwZXMsIE9UYWJsZUdsb2JhbENvbmZpZyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi90eXBlcy9leHByZXNzaW9uLnR5cGUnO1xuaW1wb3J0IHsgT1Blcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9RdWVyeURhdGFBcmdzIH0gZnJvbSAnLi4vLi4vdHlwZXMvcXVlcnktZGF0YS1hcmdzLnR5cGUnO1xuaW1wb3J0IHsgUXVpY2tGaWx0ZXJGdW5jdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL3F1aWNrLWZpbHRlci1mdW5jdGlvbi50eXBlJztcbmltcG9ydCB7IFNRTE9yZGVyIH0gZnJvbSAnLi4vLi4vdHlwZXMvc3FsLW9yZGVyLnR5cGUnO1xuaW1wb3J0IHsgT0NvbHVtbkFnZ3JlZ2F0ZSB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tY29sdW1uLWFnZ3JlZ2F0ZS50eXBlJztcbmltcG9ydCB7IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IsIE9Db2x1bW5WYWx1ZUZpbHRlciB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tY29sdW1uLXZhbHVlLWZpbHRlci50eXBlJztcbmltcG9ydCB7IFRhYmxlRmlsdGVyQnlDb2x1bW5EaWFsb2dSZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4tZGF0YS50eXBlJztcbmltcG9ydCB7IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtaW5pdGlhbGl6YXRpb24tb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IE9UYWJsZU1lbnVQZXJtaXNzaW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtbWVudS1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9UYWJsZVBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby10YWJsZS1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9ic2VydmFibGVXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbC9hc3luYyc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgRmlsdGVyRXhwcmVzc2lvblV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbC9maWx0ZXItZXhwcmVzc2lvbi51dGlscyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uc1V0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbC9wZXJtaXNzaW9ucyc7XG5pbXBvcnQgeyBTZXJ2aWNlVXRpbHMgfSBmcm9tICcuLi8uLi91dGlsL3NlcnZpY2UudXRpbHMnO1xuaW1wb3J0IHsgU1FMVHlwZXMgfSBmcm9tICcuLi8uLi91dGlsL3NxbHR5cGVzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgT0NvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi4vY29udGV4dG1lbnUvby1jb250ZXh0LW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IE9Gb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9vLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEFic3RyYWN0T1NlcnZpY2VDb21wb25lbnQgfSBmcm9tICcuLi9vLXNlcnZpY2UtY29tcG9uZW50LmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZUNvbHVtbkNhbGN1bGF0ZWRDb21wb25lbnQgfSBmcm9tICcuL2NvbHVtbi9jYWxjdWxhdGVkL28tdGFibGUtY29sdW1uLWNhbGN1bGF0ZWQuY29tcG9uZW50JztcbmltcG9ydCB7IE9CYXNlVGFibGVDZWxsUmVuZGVyZXIgfSBmcm9tICcuL2NvbHVtbi9jZWxsLXJlbmRlcmVyL28tYmFzZS10YWJsZS1jZWxsLXJlbmRlcmVyLmNsYXNzJztcbmltcG9ydCB7IE9Db2x1bW4gfSBmcm9tICcuL2NvbHVtbi9vLWNvbHVtbi5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2NvbHVtbi9vLXRhYmxlLWNvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlRXhwb3J0QnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zJztcbmltcG9ydCB7IE9UYWJsZUNvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2NvbnRleHRtZW51L28tdGFibGUtY29udGV4dC1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZWZhdWx0T1RhYmxlT3B0aW9ucyB9IGZyb20gJy4vZXh0ZW5zaW9ucy9kZWZhdWx0LW8tdGFibGUtb3B0aW9ucy5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvZGlhbG9nL2ZpbHRlci1ieS1jb2x1bW4vby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPQmFzZVRhYmxlUGFnaW5hdG9yIH0gZnJvbSAnLi9leHRlbnNpb25zL2Zvb3Rlci9wYWdpbmF0b3Ivby1iYXNlLXRhYmxlLXBhZ2luYXRvci5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWJ1dHRvbi9vLXRhYmxlLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlQ29sdW1uU2VsZWN0QWxsRGlyZWN0aXZlIH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW4tc2VsZWN0LWFsbC9vLXRhYmxlLWNvbHVtbi1zZWxlY3QtYWxsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPRmlsdGVyQ29sdW1uIH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW5zLWZpbHRlci9jb2x1bW5zL28tdGFibGUtY29sdW1ucy1maWx0ZXItY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW5zLWZpbHRlci9vLXRhYmxlLWNvbHVtbnMtZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5zR3JvdXBpbmdDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWNvbHVtbnMtZ3JvdXBpbmcvY29sdW1ucy9vLXRhYmxlLWNvbHVtbnMtZ3JvdXBpbmctY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWhlYWRlci9vLXRhYmxlLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9oZWFkZXIvdGFibGUtaW5zZXJ0YWJsZS1yb3cvby10YWJsZS1pbnNlcnRhYmxlLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlT3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1vcHRpb24vby10YWJsZS1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZURhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zL28tdGFibGUtZGF0YXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9UYWJsZVZpcnR1YWxTY3JvbGxTdHJhdGVneSB9IGZyb20gJy4vZXh0ZW5zaW9ucy9vLXRhYmxlLXN0cmF0ZWd5LnNlcnZpY2UnO1xuaW1wb3J0IHsgT1RhYmxlRGFvIH0gZnJvbSAnLi9leHRlbnNpb25zL28tdGFibGUuZGFvJztcbmltcG9ydCB7IE9UYWJsZUdyb3VwZWRSb3cgfSBmcm9tICcuL2V4dGVuc2lvbnMvcm93L28tdGFibGUtcm93LWdyb3VwLmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZVJvd0V4cGFuZGFibGVDb21wb25lbnQsIE9UYWJsZVJvd0V4cGFuZGVkQ2hhbmdlIH0gZnJvbSAnLi9leHRlbnNpb25zL3Jvdy90YWJsZS1yb3ctZXhwYW5kYWJsZS9vLXRhYmxlLXJvdy1leHBhbmRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPTWF0U29ydCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9zb3J0L28tbWF0LXNvcnQnO1xuaW1wb3J0IHsgT1RhYmxlQmFzZSB9IGZyb20gJy4vby10YWJsZS1iYXNlLmNsYXNzJztcbmltcG9ydCB7IE9fVEFCTEVfR0xPQkFMX0NPTkZJRyB9IGZyb20gJy4vdXRpbHMvby10YWJsZS50b2tlbnMnO1xuXG5pbXBvcnQgdHlwZSB7IElPQ29udGV4dE1lbnVDb250ZXh0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLWNvbnRleHQtbWVudS5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVCdXR0b24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtYnV0dG9uLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZUJ1dHRvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtYnV0dG9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVDb2x1bW5zR3JvdXBpbmcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtY29sdW1ucy1ncm91cGluZy1pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLWRhdGFzb3VyY2UuaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgT1RhYmxlTWVudSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1tZW51LmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVQYWdpbmF0b3IgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtcGFnaW5hdG9yLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZVF1aWNrZmlsdGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLXF1aWNrZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VSZXNwb25zZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2VydmljZS1yZXNwb25zZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT1F1ZXJ5UGFyYW1zIH0gZnJvbSAnLi4vLi4vdHlwZXMvcXVlcnktcGFyYW1zLnR5cGUnO1xuaW1wb3J0IHsgT19DT01QT05FTlRfU1RBVEVfU0VSVklDRSB9IGZyb20gJy4uLy4uL2luamVjdGlvbi10b2tlbnMnO1xuaW1wb3J0IHsgTWF0Um93LCBNYXRUYWJsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE9UYWJsZUZpbHRlckJ5Q29sdW1uU2VydmljZSB9IGZyb20gJy4vZXh0ZW5zaW9ucy9kaWFsb2cvZmlsdGVyLWJ5LWNvbHVtbi9vLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4uc2VydmljZSc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uRGF0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGFnaW5hdGlvbi1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPVGFibGVMb2FkaW5nU2VydmljZSB9IGZyb20gJy4vby10YWJsZS1sb2FkaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sdW1uRmlsdGVyQ2hhbmdlRXZlbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2NvbHVtbi1maWx0ZXItY2hhbmdlLWV2ZW50LmludGVyZmFjZSc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lOUFVUU19PX1RBQkxFID0gW1xuICAvLyB2aXNpYmxlLWNvbHVtbnMgW3N0cmluZ106IHZpc2libGUgY29sdW1ucywgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICd2aXNpYmxlQ29sdW1uczogdmlzaWJsZS1jb2x1bW5zJyxcblxuICAvLyB2aXNpYmxlLWNvbHVtbnMtYnktZGVmYXVsdCBbc3RyaW5nXTogY29sdW1ucyB0aGF0IGFyZSB2aXNpYmxlIGJ5IGRlZmF1bHQsIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAnZGVmYXVsdFZpc2libGVDb2x1bW5zOiBkZWZhdWx0LXZpc2libGUtY29sdW1ucycsXG5cbiAgLy8gZWRpdGFibGUtY29sdW1ucyBbc3RyaW5nXTogY29sdW1ucyB0aGF0IGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgb3ZlciB0aGUgdGFibGUsIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAvLyAnZWRpdGFibGVDb2x1bW5zOiBlZGl0YWJsZS1jb2x1bW5zJyxcblxuICAvLyBzb3J0LWNvbHVtbnMgW3N0cmluZ106IGluaXRpYWwgc29ydGluZywgd2l0aCB0aGUgZm9ybWF0IGNvbHVtbjpbQVNDfERFU0NdLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3NvcnRDb2x1bW5zOiBzb3J0LWNvbHVtbnMnLFxuXG4gICdxdWlja0ZpbHRlckNhbGxiYWNrOiBxdWljay1maWx0ZXItZnVuY3Rpb24nLFxuXG4gIC8vIGRlbGV0ZS1idXR0b24gW25vfHllc106IHNob3cgZGVsZXRlIGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAnZGVsZXRlQnV0dG9uOiBkZWxldGUtYnV0dG9uJyxcblxuICAvLyByZWZyZXNoLWJ1dHRvbiBbbm98eWVzXTogc2hvdyByZWZyZXNoIGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAncmVmcmVzaEJ1dHRvbjogcmVmcmVzaC1idXR0b24nLFxuXG4gIC8vIGNvbHVtbnMtdmlzaWJpbGl0eS1idXR0b24gW25vfHllc106IHNob3cgY29sdW1ucyB2aXNpYmlsaXR5IGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAnY29sdW1uc1Zpc2liaWxpdHlCdXR0b246IGNvbHVtbnMtdmlzaWJpbGl0eS1idXR0b24nLFxuXG4gIC8vIC8vIGNvbHVtbnMtcmVzaXplLWJ1dHRvbiBbbm98eWVzXTogc2hvdyBjb2x1bW5zIHJlc2l6ZSBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgLy8gJ2NvbHVtbnNSZXNpemVCdXR0b246IGNvbHVtbnMtcmVzaXplLWJ1dHRvbicsXG5cbiAgLy8gLy8gY29sdW1ucy1ncm91cC1idXR0b24gW25vfHllc106IHNob3cgY29sdW1ucyBncm91cCBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgLy8gJ2NvbHVtbnNHcm91cEJ1dHRvbjogY29sdW1ucy1ncm91cC1idXR0b24nLFxuXG4gIC8vIGV4cG9ydC1idXR0b24gW25vfHllc106IHNob3cgZXhwb3J0IGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAnZXhwb3J0QnV0dG9uOiBleHBvcnQtYnV0dG9uJyxcblxuICAvLyBzaG93LWNvbmZpZ3VyYXRpb24tb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgY29uZmlndXJhdGlvbiBidXR0b24gaW4gaGVhZGVyLiBEZWZhdWx0OiB5ZXMuXG4gICdzaG93Q29uZmlndXJhdGlvbk9wdGlvbjogc2hvdy1jb25maWd1cmF0aW9uLW9wdGlvbicsXG5cbiAgLy8gc2hvdy1idXR0b25zLXRleHQgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyB0ZXh0IG9mIGhlYWRlciBidXR0b25zLiBEZWZhdWx0OiB5ZXMuXG4gICdzaG93QnV0dG9uc1RleHQ6IHNob3ctYnV0dG9ucy10ZXh0JyxcblxuICAvLyBzZWxlY3QtYWxsLWNoZWNrYm94IFt5ZXN8bm98dHJ1ZXxmYWxzZV06ICBzaG93IGluIHRoZSBtZW51IHRoZSBvcHRpb24gb2Ygc2VsZWN0aW9uIGNoZWNrIGJveGVzIC4gRGVmYXVsdDogbm8uXG4gICdzZWxlY3RBbGxDaGVja2JveDogc2VsZWN0LWFsbC1jaGVja2JveCcsXG5cbiAgLy8gcGFnaW5hdGlvbi1jb250cm9scyBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IHBhZ2luYXRpb24gY29udHJvbHMuIERlZmF1bHQ6IHllcy5cbiAgJ3BhZ2luYXRpb25Db250cm9sczogcGFnaW5hdGlvbi1jb250cm9scycsXG5cbiAgLy8gZml4LWhlYWRlciBbeWVzfG5vfHRydWV8ZmFsc2VdOiBmaXhlZCBoZWFkZXIgYW5kIGZvb3RlciB3aGVuIHRoZSBjb250ZW50IGlzIGdyZWF0aGVyIHRoYW4gaXRzIG93biBoZWlnaHQuIERlZmF1bHQ6IHllcy5cbiAgJ2ZpeGVkSGVhZGVyOiBmaXhlZC1oZWFkZXInLFxuXG4gIC8vIHNob3ctdGl0bGUgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyB0aGUgdGFibGUgdGl0bGUuIERlZmF1bHQ6IG5vLlxuICAnc2hvd1RpdGxlOiBzaG93LXRpdGxlJyxcblxuICAvLyBlZGl0aW9uLW1vZGUgW25vbmUgfCBpbmxpbmUgfCBjbGljayB8IGRibGNsaWNrXTogZWRpdGlvbiBtb2RlLiBEZWZhdWx0IG5vbmVcbiAgJ2VkaXRpb25Nb2RlOiBlZGl0aW9uLW1vZGUnLFxuXG4gIC8vIHNlbGVjdGlvbi1tb2RlIFtub25lIHwgc2ltcGxlIHwgbXVsdGlwbGUgXTogc2VsZWN0aW9uIG1vZGUuIERlZmF1bHQgbXVsdGlwbGVcbiAgJ3NlbGVjdGlvbk1vZGU6IHNlbGVjdGlvbi1tb2RlJyxcblxuICAnaG9yaXpvbnRhbFNjcm9sbDogaG9yaXpvbnRhbC1zY3JvbGwnLFxuXG4gICdzaG93UGFnaW5hdG9yRmlyc3RMYXN0QnV0dG9uczogc2hvdy1wYWdpbmF0b3ItZmlyc3QtbGFzdC1idXR0b25zJyxcblxuICAnYXV0b0FsaWduVGl0bGVzOiBhdXRvLWFsaWduLXRpdGxlcycsXG5cbiAgJ211bHRpcGxlU29ydDogbXVsdGlwbGUtc29ydCcsXG4gIC8vIHNlbGVjdC1hbGwtY2hlY2tib3gtdmlzaWJsZSBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IHNlbGVjdGlvbiBjaGVjayBib3hlcy5EZWZhdWx0OiBuby5cbiAgJ3NlbGVjdEFsbENoZWNrYm94VmlzaWJsZTogc2VsZWN0LWFsbC1jaGVja2JveC12aXNpYmxlJyxcblxuICAnb3JkZXJhYmxlJyxcblxuICAncmVzaXphYmxlJyxcblxuICAna2VlcFNlbGVjdGVkSXRlbXM6IGtlZXAtc2VsZWN0ZWQtaXRlbXMnLFxuXG4gIC8vIGV4cG9ydC1tb2RlIFsndmlzaWJsZSd8J2xvY2FsJ3wnYWxsJ106IHNldHMgdGhlIG1vZGUgdG8gZXhwb3J0IGRhdGEuIERlZmF1bHQ6ICd2aXNpYmxlJ1xuICAnZXhwb3J0TW9kZTogZXhwb3J0LW1vZGUnLFxuXG4gIC8vIGV4cG9ydFNlcnZpY2VUeXBlIFsgc3RyaW5nIF06IFRoZSBzZXJ2aWNlIHVzZWQgYnkgdGhlIHRhYmxlIGZvciBleHBvcnRpbmcgaXQncyBkYXRhLCBpdCBtdXN0IGltcGxlbWVudCAnSUV4cG9ydFNlcnZpY2UnIGludGVyZmFjZS4gRGVmYXVsdDogJ09udGltaXplRXhwb3J0U2VydmljZSdcbiAgJ2V4cG9ydFNlcnZpY2VUeXBlOiBleHBvcnQtc2VydmljZS10eXBlJyxcblxuICAvLyBhdXRvLWFkanVzdCBbdHJ1ZXxmYWxzZV06IEF1dG8gYWRqdXN0IGNvbHVtbiB3aWR0aCB0byBmaXQgaXRzIGNvbnRlbnQuIERlZmF1bHQ6IHRydWVcbiAgJ2F1dG9BZGp1c3Q6IGF1dG8tYWRqdXN0JyxcblxuICAvLyBzaG93LWZpbHRlci1vcHRpb24gW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBmaWx0ZXIgbWVudSBvcHRpb24gaW4gdGhlIGhlYWRlciBtZW51LiBEZWZhdWx0OiB5ZXMuXG4gICdzaG93RmlsdGVyT3B0aW9uOiBzaG93LWZpbHRlci1vcHRpb24nLFxuXG4gIC8vIHZpc2libGUtZXhwb3J0LWRpYWxvZy1idXR0b25zIFtzdHJpbmddOiB2aXNpYmxlIGJ1dHRvbnMgaW4gZXhwb3J0IGRpYWxvZywgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdC9ubyBjb25maWd1cmVkOiBzaG93IGFsbC4gRW1wdHkgdmFsdWU6IGhpZGUgYWxsLlxuICAndmlzaWJsZUV4cG9ydERpYWxvZ0J1dHRvbnM6IHZpc2libGUtZXhwb3J0LWRpYWxvZy1idXR0b25zJyxcblxuICAvLyByb3ctY2xhc3MgW2Z1bmN0aW9uLCAocm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyKSA9PiBzdHJpbmcgfCBzdHJpbmdbXV06IGFkZHMgdGhlIGNsYXNzIG9yIGNsYXNzZXMgcmV0dXJuZWQgYnkgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHRvIHRoZSB0YWJsZSByb3dzLlxuICAncm93Q2xhc3M6IHJvdy1jbGFzcycsXG5cbiAgLy8gZmlsdGVyLWNvbHVtbi1hY3RpdmUtYnktZGVmYXVsdCBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IGljb24gZmlsdGVyIGJ5IGRlZmF1bHQgaW4gdGhlIHRhYmxlLiBEZWZhdWx0Onllc1xuICAnZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0OmZpbHRlci1jb2x1bW4tYWN0aXZlLWJ5LWRlZmF1bHQnLFxuXG4gIC8vIGdyb3VwZWQtY29sdW1ucyBbc3RyaW5nXTogZ3JvdXBlZCBjb2x1bW5zIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAnZ3JvdXBlZENvbHVtbnM6IGdyb3VwZWQtY29sdW1ucycsXG5cbiAgLy8gZ3JvdXBhYmxlW2Jvb2xlYW5dOiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGNvbHVtbiBjYW4gYmUgZ3JvdXBhYmxlLiBCeSBkZWZhdWx0OiB0cnVlXG4gICdncm91cGFibGUnLFxuXG4gIC8vIGV4cGFuZC1ncm91cHMtc2FtZS1sZXZlbFtib29sZWFuXTogSW5kaWNhdGVzIGlmIGNsaWNrIGluIHJvdyBleHBhbmRzL2NvbGxhcHNlcyBhbGwgcm93cyBvbiBzYW1lIGxldmVsLiBCeSBkZWZhdWx0OiB0cnVlXG4gICdleHBhbmRHcm91cHNTYW1lTGV2ZWw6IGV4cGFuZC1ncm91cHMtc2FtZS1sZXZlbCcsXG5cbiAgLy8gY29sbGFwc2UtZ3JvdXBlZC1jb2x1bW5zIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IFdoZXRoZXIgY29sbGFwc2UgdGhlIGdyb3VwZWQgY29sdW1ucyBieSBkZWZhdWx0XG4gICdjb2xsYXBzZUdyb3VwZWRDb2x1bW5zOiBjb2xsYXBzZS1ncm91cGVkLWNvbHVtbnMnLFxuXG4gIC8vIHZpcnR1YWwtc2Nyb2xsIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IFdoZXRoZXIgZW5hYmxlZCBvciBub3QgdGhlIHZpcnR1YWwgc2Nyb2xsXG4gICd2aXJ0dWFsU2Nyb2xsOiB2aXJ0dWFsLXNjcm9sbCcsXG5cbiAgLy9jb250ZXh0LW1lbnUgW3llc3xub3x0cnVlfGZhbHNlXTogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIHRhYmxlIGNvbnRleHQgbWVudVxuICAnY29udGV4dE1lbnU6IGNvbnRleHQtbWVudScsXG5cbiAgLy8gc2hvdy1leHBhbmRhYmxlLWljb24tZnVuY3Rpb24gW2Z1bmN0aW9uXTogRXhwYW5kYWJsZSBmdW5jdGlvbiB0byBjaGVjayBpZiBleHBhbmRhYmxlIGhhcyBkYXRhIHRvIHNob3cgb3Igbm90IGljb25cbiAgJ3Nob3dFeHBhbmRhYmxlSWNvbkZ1bmN0aW9uOiBzaG93LWV4cGFuZGFibGUtaWNvbi1mdW5jdGlvbicsXG5cbiAgLy8gc2hvdy1yZXBvcnQtb24tZGVtYW5kLW9wdGlvbiBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IHJlcG9ydCBvbiBkZW1hbmQgb3B0aW9uIGluIHRoZSB0YWJsZSBtZW51LiBEZWZhdWx0OiB5ZXMuXG4gICdzaG93UmVwb3J0T25EZW1hbmRPcHRpb246IHNob3ctcmVwb3J0LW9uLWRlbWFuZC1vcHRpb24nLFxuXG4gIC8vIHNob3ctY2hhcnRzLW9uLWRlbWFuZC1vcHRpb24gW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBjaGFydHMgb24gZGVtYW5kIG9wdGlvbiBpbiB0aGUgaGVhZGVyIG1lbnVcbiAgJ3Nob3dDaGFydHNPbkRlbWFuZE9wdGlvbjogc2hvdy1jaGFydHMtb24tZGVtYW5kLW9wdGlvbicsXG5cbiAgLy8gc2hvdy1yZXNldC13aWR0aC1vcHRpb24gW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyByZXNldCB3aWR0aCBtZW51IG9wdGlvbiBpbiB0aGUgaGVhZGVyIG1lbnVcbiAgJ3Nob3dSZXNldFdpZHRoT3B0aW9uOiBzaG93LXJlc2V0LXdpZHRoLW9wdGlvbicsXG5cbiAgJ2Rpc2FibGVTZWxlY3Rpb25GdW5jdGlvbjogZGlzYWJsZS1zZWxlY3Rpb24tZnVuY3Rpb24nLFxuXG4gICdub25IaWRhYmxlQ29sdW1uczogbm9uLWhpZGFibGUtY29sdW1ucycsXG4gICdyZWFkT25seTogcmVhZC1vbmx5JyxcbiAgJ3JlYWRPbmx5Q29uZmlndXJhdGlvbjogcmVhZC1vbmx5LWNvbmZpZ3VyYXRpb24nLFxuICAnc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHk6IHNob3ctbm90aWZpY2F0aW9uLW9mLXJlYWQtb25seScsXG4gIC8vIHNlbGVjdGlvbi1vbi1yb3ctY2xpY2sgW3llc3xub3x0cnVlfGZhbHNlXTogLiBEZWZhdWx0OiB5ZXMuXG4gICdzZWxlY3Rpb25PblJvd0NsaWNrOiBzZWxlY3Rpb24tb24tcm93LWNsaWNrJ1xuXTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUUFVUU19PX1RBQkxFID0gW1xuICAnb25Sb3dTZWxlY3RlZCcsXG4gICdvblJvd0Rlc2VsZWN0ZWQnLFxuICAnb25Sb3dEZWxldGVkJyxcbiAgJ29uRmlsdGVyQnlDb2x1bW5DaGFuZ2UnLFxuICAnb25Tb3J0Q2hhbmdlJyxcbiAgJ29uU2VhcmNoJ1xuXTtcblxuY29uc3Qgc3RpY2t5SGVhZGVyU2VsZWN0b3IgPSAnLm1hdC1tZGMtaGVhZGVyLXJvdyAubWF0LW1kYy10YWJsZS1zdGlja3knO1xuY29uc3Qgc3RpY2t5Rm9vdGVyU2VsZWN0b3IgPSAnLm1hdC1tZGMtZm9vdGVyLXJvdyAubWF0LW1kYy10YWJsZS1zdGlja3knO1xuY29uc3Qgcm93U2VsZWN0b3IgPSAnLm1hdC1tZGMtcm93JztcbmNvbnN0IGhlYWRlclNlbGVjdG9yID0gJy5tYXQtbWRjLWhlYWRlci1yb3cnO1xuY29uc3QgZm9vdGVyU2VsZWN0b3IgPSAnLm1hdC1tZGMtaGVhZGVyLXJvdyc7XG5cbnR5cGUgRGlzYWJsZVNlbGVjdGlvbkZ1bmN0aW9uID0gKGl0ZW06IGFueSkgPT4gYm9vbGVhbjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9vLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vby10YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICBPbnRpbWl6ZVNlcnZpY2VQcm92aWRlcixcbiAgICBDb21wb25lbnRTdGF0ZVNlcnZpY2VQcm92aWRlcixcbiAgICBPVGFibGVEYXRhU291cmNlU2VydmljZSxcbiAgICBPVGFibGVGaWx0ZXJCeUNvbHVtblNlcnZpY2UsXG4gICAgeyBwcm92aWRlOiBPX0NPTVBPTkVOVF9TVEFURV9TRVJWSUNFLCB1c2VDbGFzczogT1RhYmxlQ29tcG9uZW50U3RhdGVTZXJ2aWNlIH0sXG4gICAgeyBwcm92aWRlOiBWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSwgdXNlQ2xhc3M6IE9UYWJsZVZpcnR1YWxTY3JvbGxTdHJhdGVneSB9LFxuICAgIHsgcHJvdmlkZTogT1RhYmxlQmFzZSwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gT1RhYmxlQ29tcG9uZW50KSB9LFxuICAgIE9UYWJsZUxvYWRpbmdTZXJ2aWNlXG4gIF0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdkZXRhaWxFeHBhbmQnLCBbXG4gICAgICBzdGF0ZSgnY29sbGFwc2VkJywgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnLCBtaW5IZWlnaHQ6ICcwJyB9KSksXG4gICAgICBzdGF0ZSgnZXhwYW5kZWQnLCBzdHlsZSh7IGhlaWdodDogJyonIH0pKSxcbiAgICAgIHRyYW5zaXRpb24oJ2V4cGFuZGVkIDw9PiBjb2xsYXBzZWQnLCBhbmltYXRlKCcyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSknKSksXG4gICAgXSlcbiAgXSxcbiAgaW5wdXRzOiBERUZBVUxUX0lOUFVUU19PX1RBQkxFLFxuICBvdXRwdXRzOiBERUZBVUxUX09VVFBVVFNfT19UQUJMRSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLm8tdGFibGVdJzogJ3RydWUnLFxuICAgICdbY2xhc3Mub250aW1pemUtdGFibGVdJzogJ3RydWUnLFxuICAgICdbY2xhc3Muby10YWJsZS1maXhlZF0nOiAnZml4ZWRIZWFkZXInLFxuICAgICdbY2xhc3Muby10YWJsZS1kaXNhYmxlZF0nOiAnIWVuYWJsZWQnLFxuICAgICcoZG9jdW1lbnQ6Y2xpY2spJzogJ2hhbmRsZURPTUNsaWNrKCRldmVudCknXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgT1RhYmxlQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RPU2VydmljZUNvbXBvbmVudDxPVGFibGVDb21wb25lbnRTdGF0ZVNlcnZpY2U+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQsIEFmdGVyQ29udGVudEluaXQge1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfQkFTRV9TSVpFX1NQSU5ORVIgPSAxMDA7XG4gIHB1YmxpYyBzdGF0aWMgRklSU1RfTEFTVF9DRUxMX1BBRERJTkcgPSAyNDtcbiAgcHVibGljIHN0YXRpYyBFWFBBTkRFRF9ST1dfQ09OVEFJTkVSX0NMQVNTID0gJ2V4cGFuZGVkLXJvdy1jb250YWluZXItJztcbiAgcHVibGljIHN0YXRpYyBBVkFJTEFCTEVfR1JPVVBJTkdfQ09MVU1OU19SRU5ERVJFUlMgPSBbJ2N1cnJlbmN5JywgJ2ludGVnZXInLCAncmVhbCddO1xuXG4gIHB1YmxpYyBERVRBSUxfTU9ERV9OT05FID0gQ29kZXMuREVUQUlMX01PREVfTk9ORTtcbiAgcHVibGljIEVESVRfTU9ERV9OT05FID0gQ29kZXMuRURJVElPTl9NT0RFX05PTkU7XG5cbiAgcHJvdGVjdGVkIHNuYWNrQmFyU2VydmljZTogU25hY2tCYXJTZXJ2aWNlO1xuXG4gIHB1YmxpYyBwYWdpbmF0b3I6IE9UYWJsZVBhZ2luYXRvcjtcblxuICBzb3J0OiBPTWF0U29ydDtcbiAgY2xpY2tTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyByb3c6IGFueSwgY29sdW1uOiBhbnksIGNlbGxSZWY6IGFueSwgcm93SW5kZXg6IG51bWJlciwgZXZlbnQ6IE1vdXNlRXZlbnQgfT4oKTtcbiAgZGJsY2xpY2tTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyByb3c6IGFueSwgY29sdW1uOiBhbnksIGNlbGxSZWY6IGFueSwgcm93SW5kZXg6IG51bWJlciwgZXZlbnQ6IE1vdXNlRXZlbnQgfT4oKTtcbiAgcHJvdGVjdGVkIGNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgZGJDbGlja1N1YmplY3RTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIHJvd0NoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICByZWZyZXNoRXhwYW5kYWJsZVJvd1N0YXRlID0gZmFsc2U7XG5cbiAgbG9hZGluZ1NlcnZpY2U6IE9UYWJsZUxvYWRpbmdTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uT25GaWx0ZXJDaGFuZ2VzOiBhbnk7XG5cbiAgQFZpZXdDaGlsZChPTWF0U29ydClcbiAgc2V0IG9NYXRTb3J0KF9zb3J0OiBPTWF0U29ydCkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChfc29ydCkgJiZcbiAgICAgICghVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSB8fCAoVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSAmJiBVdGlsLnN0cmluZ2lmeSh0aGlzLnNvcnQpICE9PSBVdGlsLnN0cmluZ2lmeShfc29ydCkpKSkge1xuICAgICAgdGhpcy5zb3J0ID0gX3NvcnQ7XG4gICAgICB0aGlzLnNldERhdGFzb3VyY2UoKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHZpcnR1YWxTY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuXG4gIHB1YmxpYyBvVGFibGVHbG9iYWxDb25maWc6IE9UYWJsZUdsb2JhbENvbmZpZztcbiAgQFZpZXdDaGlsZCgndmlydHVhbFNjcm9sbFZpZXdQb3J0Jykgc2V0IGNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCh2YWx1ZTogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgaWYgKHZhbHVlICE9IHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJBbmRGb290ZXJTdGlja3lQb3NpdGlvbnMoKTtcbiAgICAgIGlmICh0aGlzLmNoZWNrVmlld3BvcnRTaXplU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24gPSB0aGlzLmNoZWNrVmlld1BvcnRTdWJqZWN0LnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gb25seSBmb3IgaW5zaWRlVGFiQnVnV29ya2Fyb3VuZFxuICBwcm90ZWN0ZWQgdGFibGVIZWFkZXJzOiBBcnJheTxPVGFibGVIZWFkZXJDb21wb25lbnQ+ID0gW107XG5cbiAgQFZpZXdDaGlsZCgnc3Bpbm5lckNvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBzcGlubmVyQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoT1RhYmxlUm93RXhwYW5kYWJsZUNvbXBvbmVudClcbiAgdGFibGVSb3dFeHBhbmRhYmxlOiBPVGFibGVSb3dFeHBhbmRhYmxlQ29tcG9uZW50O1xuXG4gIF9maWx0ZXJDb2x1bW5zOiBBcnJheTxPRmlsdGVyQ29sdW1uPjtcbiAgcG9ydGFsSG9zdDogQXJyYXk8RG9tUG9ydGFsT3V0bGV0PiA9IFtdO1xuICBvbkRhdGFMb2FkZWRDZWxsUmVuZGVyZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgdGFibGVDb250ZXh0TWVudTogT0NvbnRleHRNZW51Q29tcG9uZW50O1xuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzZWxlY3RBbGxDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZXhwb3J0QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dDb25maWd1cmF0aW9uT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGNvbHVtbnNWaXNpYmlsaXR5QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dGaWx0ZXJPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dDaGFydHNPbkRlbWFuZE9wdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93QnV0dG9uc1RleHQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dSZXNldFdpZHRoT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2VsZWN0aW9uT25Sb3dDbGljazogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy8gRXhwYW5kYWJsZSBpbnB1dCBjYWxsYmFjayBmdW5jdGlvblxuICBzaG93RXhwYW5kYWJsZUljb25GdW5jdGlvbjogKHJvdzogYW55LCByb3dJbmRleDogbnVtYmVyKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgcmVhZE9ubHlGdW5jdGlvbjogKGNvbmZpZ3VyYXRpb246IGFueSkgPT4gYm9vbGVhbjtcbiAgcmVhZE9ubHlDb25maWd1cmF0aW9uOiBhbnk7XG5cbiAgaXNDb21wb25lbnRSZWFkT25seShzZWxlY3Rvcjogc3RyaW5nLCBhdHRyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkT25seUNvbmZpZ3VyYXRpb24/LltzZWxlY3Rvcl0/LlthdHRyXTtcbiAgfVxuICBwcm90ZWN0ZWQgX29UYWJsZU9wdGlvbnM6IE9UYWJsZU9wdGlvbnM7XG5cbiAgZ2V0IG9UYWJsZU9wdGlvbnMoKTogT1RhYmxlT3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuX29UYWJsZU9wdGlvbnM7XG4gIH1cblxuICBzZXQgb1RhYmxlT3B0aW9ucyh2YWx1ZTogT1RhYmxlT3B0aW9ucykge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuXG4gIHNldCBxdWlja0ZpbHRlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHZhbHVlID0gVXRpbC5wYXJzZUJvb2xlYW4oU3RyaW5nKHZhbHVlKSk7XG4gICAgdGhpcy5fcXVpY2tGaWx0ZXIgPSB2YWx1ZTtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmZpbHRlciA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHF1aWNrRmlsdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9xdWlja0ZpbHRlcjtcbiAgfVxuXG4gIHNldCBmaWx0ZXJDYXNlU2Vuc2l0aXZlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZmlsdGVyQ2FzZVNlbnNpdGl2ZSA9IEJvb2xlYW5Db252ZXJ0ZXIodmFsdWUpO1xuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmZpbHRlckNhc2VTZW5zaXRpdmUgPSB0aGlzLl9maWx0ZXJDYXNlU2Vuc2l0aXZlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmaWx0ZXJDYXNlU2Vuc2l0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJDYXNlU2Vuc2l0aXZlO1xuICB9XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGluc2VydEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICByZWZyZXNoQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGRlbGV0ZUJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBmaXhlZEhlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93VGl0bGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZWRpdGlvbk1vZGU6IHN0cmluZyA9IENvZGVzLkVESVRJT05fTU9ERV9OT05FO1xuICBzZWxlY3Rpb25Nb2RlOiBzdHJpbmcgPSBDb2Rlcy5TRUxFQ1RJT05fTU9ERV9NVUxUSVBMRTtcblxuICBwcm90ZWN0ZWQgX2hvcml6b250YWxTY3JvbGwgPSBmYWxzZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNldCBob3Jpem9udGFsU2Nyb2xsKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faG9yaXpvbnRhbFNjcm9sbCA9IEJvb2xlYW5Db252ZXJ0ZXIodmFsdWUpO1xuICAgIHRoaXMucmVmcmVzaENvbHVtbnNXaWR0aEZyb21PcmlnaW5hbERlZmluaXRpb24oKTtcbiAgfVxuXG4gIGdldCBob3Jpem9udGFsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9ob3Jpem9udGFsU2Nyb2xsO1xuICB9XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dQYWdpbmF0b3JGaXJzdExhc3RCdXR0b25zOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGF1dG9BbGlnblRpdGxlczogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBtdWx0aXBsZVNvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgb3JkZXJhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHJlc2l6YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBhdXRvQWRqdXN0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGdyb3VwYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBleHBhbmRHcm91cHNTYW1lTGV2ZWw6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgY29sbGFwc2VHcm91cGVkQ29sdW1uczogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgdmlydHVhbFNjcm9sbDogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBjb250ZXh0TWVudTogYm9vbGVhbiA9IHRydWU7XG4gIC8vIE1haW50YWluaW5nIHRoaXMgZ2V0dGVyIHRvIGFsbG93IGNvbXBvbmVudCBleHRlbnNpb25zIChhdm9pZGluZyBhIGJyZWFraW5nIGNoYW5nZSlcbiAgZ2V0IGVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub2VuYWJsZWQ7XG4gIH1cbiAgcHJvdGVjdGVkIF9zZWxlY3RBbGxDaGVja2JveFZpc2libGU6IGJvb2xlYW47XG4gIHNldCBzZWxlY3RBbGxDaGVja2JveFZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zZWxlY3RBbGxDaGVja2JveFZpc2libGUgPSBCb29sZWFuQ29udmVydGVyKHZhbHVlKTtcbiAgICBpZiAodGhpcy5zdGF0ZSkge1xuICAgICAgdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlID0gQm9vbGVhbkNvbnZlcnRlcih0aGlzLnN0YXRlLnNlbGVjdENvbHVtblZpc2libGUpO1xuICAgIH1cbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlID0gdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94Q29sdW1uKCk7XG4gIH1cblxuICBnZXQgc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RBbGxDaGVja2JveFZpc2libGU7XG4gIH1cblxuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAga2VlcFNlbGVjdGVkSXRlbXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHB1YmxpYyBleHBvcnRNb2RlOiBzdHJpbmcgPSBDb2Rlcy5FWFBPUlRfTU9ERV9WSVNJQkxFO1xuICBwdWJsaWMgZXhwb3J0U2VydmljZVR5cGU6IHN0cmluZztcbiAgcHVibGljIHZpc2libGVFeHBvcnREaWFsb2dCdXR0b25zOiBzdHJpbmc7XG4gIHB1YmxpYyBkYW9UYWJsZTogT1RhYmxlRGFvIHwgbnVsbDtcbiAgcHVibGljIGRhdGFTb3VyY2U6IE9UYWJsZURhdGFTb3VyY2UgfCBudWxsO1xuICBwdWJsaWMgdmlzaWJsZUNvbHVtbnM6IHN0cmluZztcbiAgcHVibGljIHNlYXJjaGVhYmxlQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIGRlZmF1bHRWaXNpYmxlQ29sdW1uczogc3RyaW5nO1xuICBwdWJsaWMgZ3JvdXBlZENvbHVtbnM6IHN0cmluZztcbiAgcHVibGljIG5vbkhpZGFibGVDb2x1bW5zOiBzdHJpbmc7XG5cbiAgcHVibGljIHNvcnRDb2x1bW5zOiBzdHJpbmc7XG4gIHB1YmxpYyBncm91cGVkQ29sdW1uVHlwZXM6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSA9IFtdO1xuICBwdWJsaWMgcm93Q2xhc3M6IChyb3dEYXRhOiBhbnksIHJvd0luZGV4OiBudW1iZXIpID0+IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qcGFyc2VkIGlucHV0cyB2YXJpYWJsZXMgKi9cbiAgcHJvdGVjdGVkIF92aXNpYmxlQ29sQXJyYXk6IHN0cmluZ1tdID0gW107XG5cbiAgZ2V0IHZpc2libGVDb2xBcnJheSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVDb2xBcnJheTtcbiAgfVxuXG4gIHNldCB2aXNpYmxlQ29sQXJyYXkoYXJnOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zQmxvY2tlZCA9IHRoaXMucGVybWlzc2lvbnM/LmNvbHVtbnM/LmZpbHRlcihjb2wgPT4gY29sLnZpc2libGUgPT09IGZhbHNlKS5tYXAoY29sID0+IGNvbC5hdHRyKSA/PyBbXTtcbiAgICBjb25zdCBwZXJtaXNzaW9uc0NoZWNrZWQgPSBhcmcuZmlsdGVyKHZhbHVlID0+IHBlcm1pc3Npb25zQmxvY2tlZC5pbmRleE9mKHZhbHVlKSA9PT0gLTEpO1xuXG4gICAgdGhpcy5fdmlzaWJsZUNvbEFycmF5ID0gcGVybWlzc2lvbnNDaGVja2VkO1xuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zKSB7XG4gICAgICBjb25zdCBjb250YWluc1NlbGVjdGlvbkNvbCA9IHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuaW5kZXhPZihDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QpICE9PSAtMTtcbiAgICAgIGNvbnN0IGNvbnRhaW5zRXhwYW5kYWJsZUNvbCA9IHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuaW5kZXhPZihDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFKSAhPT0gLTE7XG4gICAgICBpZiAoY29udGFpbnNTZWxlY3Rpb25Db2wpIHtcbiAgICAgICAgdGhpcy5fdmlzaWJsZUNvbEFycmF5LnVuc2hpZnQoQ29kZXMuTkFNRV9DT0xVTU5fU0VMRUNUKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250YWluc1NlbGVjdGlvbkNvbCAmJiBjb250YWluc0V4cGFuZGFibGVDb2wpIHtcbiAgICAgICAgdGhpcy5fdmlzaWJsZUNvbEFycmF5ID0gW3RoaXMuX3Zpc2libGVDb2xBcnJheVswXV0uY29uY2F0KENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUsIHRoaXMuX3Zpc2libGVDb2xBcnJheS5zcGxpY2UoMSkpO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGFpbnNFeHBhbmRhYmxlQ29sKSB7XG4gICAgICAgICAgdGhpcy5fdmlzaWJsZUNvbEFycmF5LnVuc2hpZnQoQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLl92aXNpYmxlQ29sQXJyYXk7XG4gICAgICB0aGlzLmdyb3VwaW5nSGVhZGVyc1Jvd3MgPSB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLm1hcCh2aXNpYmxlQ29sID0+ICdncm91cEhlYWRlci0nICsgdmlzaWJsZUNvbCk7XG4gICAgfVxuICB9XG5cbiAgc29ydENvbEFycmF5OiBTUUxPcmRlcltdID0gW107XG4gIC8qZW5kIG9mIHBhcnNlZCBpbnB1dHMgdmFyaWFibGVzICovXG5cbiAgcHJvdGVjdGVkIHRhYkdyb3VwQ29udGFpbmVyOiBNYXRUYWJHcm91cDtcbiAgcHJvdGVjdGVkIHRhYkNvbnRhaW5lcjogTWF0VGFiO1xuICB0YWJHcm91cENoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByb3RlY3RlZCBwZW5kaW5nUXVlcnk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHBlbmRpbmdRdWVyeUZpbHRlciA9IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgc2V0U3RhdGljRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgYXZvaWRRdWVyeUNvbHVtbnM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJvdGVjdGVkIGFzeW5jTG9hZENvbHVtbnM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJvdGVjdGVkIGFzeW5jTG9hZFN1YnNjcmlwdGlvbnM6IG9iamVjdCA9IHt9O1xuXG4gIHByb3RlY3RlZCBxdWVyeVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgY29udGV4dE1lbnVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIHZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIGNoZWNrVmlld3BvcnRTaXplU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBmaW5pc2hRdWVyeVN1YnNjcmlwdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBvblJvd1NlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uUm93RGVzZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvblJvd0RlbGV0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25SZWluaXRpYWxpemU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25Db250ZW50Q2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uRmlsdGVyQnlDb2x1bW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxDb2x1bW5GaWx0ZXJDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvblNvcnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxTUUxPcmRlcltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcm90ZWN0ZWQgc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHVibGljIG9UYWJsZUZpbHRlckJ5Q29sdW1uRGF0YURpYWxvZ0NvbXBvbmVudDogT1RhYmxlRmlsdGVyQnlDb2x1bW5EYXRhRGlhbG9nQ29tcG9uZW50O1xuICBwdWJsaWMgb1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudDogT1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dUb3RhbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBzaG93VG90YWxzOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zaG93VG90YWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nU29ydGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmdTb3J0aW5nOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5sb2FkaW5nU29ydGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1Njcm9sbFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGxvYWRpbmdTY3JvbGw6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmxvYWRpbmdTY3JvbGxTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHB1YmxpYyBzaG93TG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBwdWJsaWMgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudDogT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudDtcbiAgcHVibGljIHNob3dGaXJzdEluc2VydGFibGVSb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNob3dMYXN0SW5zZXJ0YWJsZVJvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZXhwYW5kYWJsZUl0ZW06IFNlbGVjdGlvbk1vZGVsPGFueT47XG5cbiAgcHJvdGVjdGVkIGNsaWNrVGltZXI7XG4gIHByb3RlY3RlZCBjbGlja0RlbGF5ID0gMjAwO1xuICBwcm90ZWN0ZWQgY2xpY2tQcmV2ZW50ID0gZmFsc2U7XG4gIHB1YmxpYyBlZGl0aW5nQ2VsbDogYW55O1xuICBwcm90ZWN0ZWQgZWRpdGluZ1JvdzogYW55O1xuXG4gIHNldCBjdXJyZW50UGFnZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gdmFsO1xuICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gdmFsO1xuICAgICAgaWYgKHRoaXMubWF0cGFnaW5hdG9yKSB7XG4gICAgICAgIHRoaXMubWF0cGFnaW5hdG9yLnBhZ2VJbmRleCA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gIH1cblxuICBwdWJsaWMgb1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQ6IE9UYWJsZVF1aWNrZmlsdGVyO1xuICBwcm90ZWN0ZWQgc29ydFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgb25SZW5kZXJlZERhdGFDaGFuZ2U6IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIHByZXZpb3VzUmVuZGVyZXJEYXRhO1xuXG4gIHF1aWNrRmlsdGVyQ2FsbGJhY2s6IFF1aWNrRmlsdGVyRnVuY3Rpb247XG4gIGRpc2FibGVTZWxlY3Rpb25GdW5jdGlvbjogRGlzYWJsZVNlbGVjdGlvbkZ1bmN0aW9uO1xuXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQm9keScpXG4gIHByb3RlY3RlZCB0YWJsZUJvZHlFbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGFibGVIZWFkZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgdGFibGVIZWFkZXJFbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGFibGVUb29sYmFyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHRhYmxlVG9vbGJhckVsOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGRyZW4oTWF0Um93KSByb3dzITogUXVlcnlMaXN0PE1hdFJvdz47XG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUpIHByb3RlY3RlZCBtYXRUYWJsZTogTWF0VGFibGU8YW55PjtcblxuICBob3Jpem9udGFsU2Nyb2xsZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBvblVwZGF0ZVNjcm9sbGVkU3RhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgcm93V2lkdGg7XG5cbiAgc3RvcmVQYWdpbmF0aW9uU3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiBJbiB0aGUgY2FzZSB0aGUgdGFibGUgaGF2ZW50IHBhZ2luYXRpb25Db250cm9sIGFuZCBwYWdlYWJsZSwgdGhlIHRhYmxlIGhhcyBwYWdpbmF0aW9uIHZpcnR1YWwqL1xuICBwYWdlU2Nyb2xsVmlydHVhbCA9IDE7XG5cbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1JPV19IRUlHSFQgPSAzNjtcbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zOiBPVGFibGVQZXJtaXNzaW9ucztcbiAgbWF0TWVudTogTWF0TWVudTtcblxuICBAVmlld0NoaWxkKCd0YWJsZU1lbnUnKVxuICBvVGFibGVNZW51OiBPVGFibGVNZW51O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oT1RhYmxlT3B0aW9uQ29tcG9uZW50KVxuICB0YWJsZU9wdGlvbnM6IFF1ZXJ5TGlzdDxPVGFibGVPcHRpb25Db21wb25lbnQ+O1xuXG4gIG9UYWJsZUJ1dHRvbnM6IE9UYWJsZUJ1dHRvbnM7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihPVGFibGVCdXR0b25Db21wb25lbnQpXG4gIHRhYmxlQnV0dG9uczogUXVlcnlMaXN0PE9UYWJsZUJ1dHRvbj47XG5cbiAgQENvbnRlbnRDaGlsZCgnby10YWJsZS1xdWlja2ZpbHRlcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHF1aWNrZmlsdGVyQ29udGVudENoaWxkOiBPVGFibGVRdWlja2ZpbHRlcjtcblxuXG4gIEBDb250ZW50Q2hpbGRyZW4oT1RhYmxlRXhwb3J0QnV0dG9uQ29tcG9uZW50KVxuICBleHBvcnRPcHRzVGVtcGxhdGU6IFF1ZXJ5TGlzdDxPVGFibGVFeHBvcnRCdXR0b25Db21wb25lbnQ+XG5cbiAgQENvbnRlbnRDaGlsZChPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmUpXG4gIHRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkOiBPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmU7XG4gIC8vIFRvIHNhdmUgc2Nyb2xsIHBvc2l0aW9uIHdoZW4gcmVsb2FkaW5nIGRhdGFcbiAgcHVibGljIHNhdmVkU2Nyb2xsUG9zaXRpb246IG51bWJlciA9IDA7XG5cbiAgLyoqIEFjdGl2ZSBjb2x1bW4gZmlsdGVycyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbHVtbkZpbHRlcnNTdWJqZWN0ID1cbiAgICBuZXcgQmVoYXZpb3JTdWJqZWN0PE9Db2x1bW5WYWx1ZUZpbHRlcltdPihbXSk7XG5cbiAgcHJvdGVjdGVkIGNvbHVtbkZpbHRlcnMkID0gdGhpcy5jb2x1bW5GaWx0ZXJzU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9yaWdpbmFsUmVnaXN0ZXJlZENvbHVtbnM6IE9Db2x1bW5bXSA9IFtdO1xuICBwcml2YXRlIG9yaWdpbmFsTm9uSGlkYWJsZUNvbHVtbnM6IHN0cmluZztcblxuICBwdWJsaWMgZ3JvdXBlZENvbHVtbnNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFtdKVxuICB1cGRhdGVTY3JvbGxlZFN0YXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvcml6b250YWxTY3JvbGwpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBib2R5V2lkdGggPSB0aGlzLnRhYmxlQm9keUVsLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gdGhpcy50YWJsZUJvZHlFbC5uYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgICBjb25zdCBwcmV2aW91c1N0YXRlID0gdGhpcy5ob3Jpem9udGFsU2Nyb2xsZWQ7XG4gICAgICAgIHRoaXMuaG9yaXpvbnRhbFNjcm9sbGVkID0gc2Nyb2xsV2lkdGggPiBib2R5V2lkdGg7XG4gICAgICAgIGlmIChwcmV2aW91c1N0YXRlICE9PSB0aGlzLmhvcml6b250YWxTY3JvbGxlZCkge1xuICAgICAgICAgIHRoaXMub25VcGRhdGVTY3JvbGxlZFN0YXRlLmVtaXQodGhpcy5ob3Jpem9udGFsU2Nyb2xsZWQpO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9pc0NvbHVtbkZpbHRlcnNBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBnZXQgaXNDb2x1bW5GaWx0ZXJzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0NvbHVtbkZpbHRlcnNBY3RpdmU7XG4gIH1cblxuICBzZXQgaXNDb2x1bW5GaWx0ZXJzQWN0aXZlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzQ29sdW1uRmlsdGVyc0FjdGl2ZSA9IHZhbDtcbiAgfVxuXG4gIGdyb3VwaW5nSGVhZGVyc1Jvd3M6IHN0cmluZ1tdID0gW107XG5cbiAgcHVibGljIG9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudDogT1RhYmxlQ29sdW1uc0dyb3VwaW5nO1xuXG4gIEBDb250ZW50Q2hpbGQoT1RhYmxlQ29udGV4dE1lbnVDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNvbnRleHRNZW51Q29udGVudENoaWxkOiBPVGFibGVDb250ZXh0TWVudUNvbXBvbmVudDtcblxuICBwcm90ZWN0ZWQgdHJpZ2dlclNlbGVjdGlvbkV2ZW50czogYm9vbGVhbiA9IHRydWU7XG5cbiAgQFZpZXdDaGlsZHJlbihNYXRUb29sdGlwKVxuICB0b29sdGlwOiBRdWVyeUxpc3Q8TWF0VG9vbHRpcD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBlbFJlZjogRWxlbWVudFJlZixcbiAgICBwcm90ZWN0ZWQgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IE9Gb3JtQ29tcG9uZW50KSkgZm9ybTogT0Zvcm1Db21wb25lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSkgcHVibGljIHJlYWRvbmx5IHNjcm9sbFN0cmF0ZWd5OiBPVGFibGVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3lcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IsIGVsUmVmLCBmb3JtKTtcbiAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoT1RhYmxlTG9hZGluZ1NlcnZpY2UpO1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3Quc3Vic2NyaWJlKChsb2FkaW5nOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNldExvYWRpbmcobG9hZGluZyk7XG4gICAgfSk7XG4gICAgdGhpcy5zaG93TG9hZGluZyA9IHRoaXMubG9hZGluZ1NlcnZpY2Uuc2hvd0xvYWRpbmckO1xuXG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucyA9IG5ldyBEZWZhdWx0T1RhYmxlT3B0aW9ucygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudGFiR3JvdXBDb250YWluZXIgPSB0aGlzLmluamVjdG9yLmdldChNYXRUYWJHcm91cCk7XG4gICAgICB0aGlzLnRhYkNvbnRhaW5lciA9IHRoaXMuaW5qZWN0b3IuZ2V0KE1hdFRhYik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvIG5vdGhpbmcgZHVlIHRvIG5vdCBhbHdheXMgaXMgY29udGFpbmVkIG9uIHRhYi5cbiAgICB9XG5cbiAgICB0aGlzLnNuYWNrQmFyU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KFNuYWNrQmFyU2VydmljZSk7XG4gICAgdGhpcy5nZXRJbmplY3Rpb25Ub2tlbkNvbmZpZygpO1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGNvbHVtbiBmaWx0ZXIgY2hhbmdlIGV2ZW50c1xuICAgIHRoaXMuc3Vic2NyaWJlVG9GaWx0ZXJDaGFuZ2VzKCk7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlcyB0byBmaWx0ZXIgY2hhbmdlIGV2ZW50cyAqL1xuICBwcml2YXRlIHN1YnNjcmliZVRvRmlsdGVyQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbk9uRmlsdGVyQ2hhbmdlcyA9IHRoaXMub25GaWx0ZXJCeUNvbHVtbkNoYW5nZS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgdGhpcy51cGRhdGVDb2x1bW5GaWx0ZXJzU3ViamVjdChldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgQmVoYXZpb3JTdWJqZWN0IGFuZCBhcnJheSB3aXRoIGEgTkVXIGZpbHRlcnMgcmVmZXJlbmNlXG4gICAqIFJlcXVpcmVkIGZvciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uRmlsdGVyc1N1YmplY3QoZXZlbnQ6IENvbHVtbkZpbHRlckNoYW5nZUV2ZW50KTogdm9pZCB7XG5cbiAgICAvLyBDcmVhdGUgYSBORVcgYXJyYXkgcmVmZXJlbmNlXG4gICAgY29uc3QgbmV3RmlsdGVycyA9IFsuLi50aGlzLmRhdGFTb3VyY2UuZ2V0Q29sdW1uVmFsdWVGaWx0ZXJzKCldO1xuXG4gICAgdGhpcy5jb2x1bW5GaWx0ZXJzU3ViamVjdC5uZXh0KG5ld0ZpbHRlcnMpO1xuICAgIC8vIEZvcmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBnZXRJbmplY3Rpb25Ub2tlbkNvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb1RhYmxlR2xvYmFsQ29uZmlnID0gdGhpcy5pbmplY3Rvci5nZXQoT19UQUJMRV9HTE9CQUxfQ09ORklHKTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuYXV0b0FkanVzdCkpIHtcbiAgICAgICAgdGhpcy5hdXRvQWRqdXN0ID0gb1RhYmxlR2xvYmFsQ29uZmlnLmF1dG9BZGp1c3Q7XG4gICAgICB9O1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5hdXRvQWxpZ25UaXRsZXMpKSB7XG4gICAgICAgIHRoaXMuYXV0b0FsaWduVGl0bGVzID0gb1RhYmxlR2xvYmFsQ29uZmlnLmF1dG9BbGlnblRpdGxlcztcbiAgICAgIH1cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0KSkge1xuICAgICAgICB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdCA9IG9UYWJsZUdsb2JhbENvbmZpZy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLmVkaXRpb25Nb2RlKSAmJiBDb2Rlcy5pc1ZhbGlkRWRpdGlvbk1vZGUob1RhYmxlR2xvYmFsQ29uZmlnLmVkaXRpb25Nb2RlKSkge1xuICAgICAgICB0aGlzLmVkaXRpb25Nb2RlID0gb1RhYmxlR2xvYmFsQ29uZmlnLmVkaXRpb25Nb2RlO1xuICAgICAgfVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5kZXRhaWxNb2RlICYmIENvZGVzLmlzVmFsaWREZXRhaWxNb2RlKG9UYWJsZUdsb2JhbENvbmZpZy5kZXRhaWxNb2RlKSkpIHtcbiAgICAgICAgdGhpcy5kZXRhaWxNb2RlID0gb1RhYmxlR2xvYmFsQ29uZmlnLmRldGFpbE1vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcucm93SGVpZ2h0KSAmJiBDb2Rlcy5pc1ZhbGlkUm93SGVpZ2h0KG9UYWJsZUdsb2JhbENvbmZpZy5yb3dIZWlnaHQpKSB7XG4gICAgICAgIHRoaXMucm93SGVpZ2h0ID0gb1RhYmxlR2xvYmFsQ29uZmlnLnJvd0hlaWdodDtcbiAgICAgIH07XG5cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuc2hvd0NoYXJ0c09uRGVtYW5kT3B0aW9uKSkge1xuICAgICAgICB0aGlzLnNob3dDaGFydHNPbkRlbWFuZE9wdGlvbiA9IG9UYWJsZUdsb2JhbENvbmZpZy5zaG93Q2hhcnRzT25EZW1hbmRPcHRpb247XG4gICAgICB9O1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5zaG93UmVwb3J0T25EZW1hbmRPcHRpb24pKSB7XG4gICAgICAgIHRoaXMuc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uID0gb1RhYmxlR2xvYmFsQ29uZmlnLnNob3dSZXBvcnRPbkRlbWFuZE9wdGlvbjtcbiAgICAgIH07XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLnNlbGVjdGlvbk9uUm93Q2xpY2spKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uT25Sb3dDbGljayA9IG9UYWJsZUdsb2JhbENvbmZpZy5zZWxlY3Rpb25PblJvd0NsaWNrO1xuICAgICAgfVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5ob3Jpem9udGFsU2Nyb2xsKSkge1xuICAgICAgICB0aGlzLmhvcml6b250YWxTY3JvbGwgPSBvVGFibGVHbG9iYWxDb25maWcuaG9yaXpvbnRhbFNjcm9sbDtcbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEbyBub3RoaW5nIGJlY2F1c2UgaXMgb3B0aW9uYWxcbiAgICB9XG5cbiAgfVxuXG4gIGdldCBzdGF0ZSgpOiBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2Uuc3RhdGU7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICBpZiAodGhpcy5vVGFibGVCdXR0b25zICYmIHRoaXMudGFibGVCdXR0b25zICYmIHRoaXMudGFibGVCdXR0b25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMub1RhYmxlQnV0dG9ucy5yZWdpc3RlckJ1dHRvbnModGhpcy50YWJsZUJ1dHRvbnMudG9BcnJheSgpKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc3VwZXIuYWZ0ZXJWaWV3SW5pdCgpO1xuICAgIHRoaXMuaW5pdFRhYmxlQWZ0ZXJWaWV3SW5pdCgpO1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMubWF0TWVudSA9IHRoaXMub1RhYmxlTWVudS5tYXRNZW51O1xuICAgICAgdGhpcy5vVGFibGVNZW51LnJlZ2lzdGVyT3B0aW9ucyh0aGlzLnRhYmxlT3B0aW9ucy50b0FycmF5KCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSkge1xuICAgICAgdGhpcy5leHBhbmRhYmxlSXRlbSA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRoaXMudGFibGVSb3dFeHBhbmRhYmxlLm11bHRpcGxlLCBbXSwgdHJ1ZSwgdGhpcy5jb21wYXJlUm93KCkpO1xuICAgICAgdGhpcy5jcmVhdGVFeHBhbmRhYmxlQ29sdW1uKCk7XG4gICAgICB0aGlzLmV4cGFuZGFibGVJdGVtLmNoYW5nZWQuc3Vic2NyaWJlKChjaGFuZ2UpID0+IHtcbiAgICAgICAgdGhpcy5zYXZlUm93RXhwYW5kU3RhdGUoY2hhbmdlLmFkZGVkLCBjaGFuZ2UucmVtb3ZlZCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5yb3dDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnJvd3MuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVUYWJsZURhdGFDaGFuZ2UoKTtcbiAgICB9KTtcblxuXG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgaWYgKHRoaXMudGFibGVDb2x1bW5TZWxlY3RBbGxDb250ZW50Q2hpbGQpIHtcbiAgICAgIHRoaXMuc2V0Q3VzdG9tRGVmaW5pdGlvbkluU2VsZWN0Q29sdW1uKHRoaXMudGFibGVDb2x1bW5TZWxlY3RBbGxDb250ZW50Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVGFibGVEYXRhQ2hhbmdlKCkge1xuICAgIHRoaXMucmVzdG9yZUV4cGFuZGFibGVSb3dTdGF0ZSgpO1xuICB9XG5cbiAgc2V0Q3VzdG9tRGVmaW5pdGlvbkluU2VsZWN0Q29sdW1uKGRlZmluaXRpb246IE9UYWJsZUNvbHVtblNlbGVjdEFsbERpcmVjdGl2ZSkge1xuICAgIGlmIChkZWZpbml0aW9uLnRpdGxlKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi50aXRsZSA9IGRlZmluaXRpb24udGl0bGU7XG4gICAgfVxuICAgIGlmIChkZWZpbml0aW9uLndpZHRoKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi53aWR0aCA9IGRlZmluaXRpb24ud2lkdGg7XG4gICAgfVxuICAgIGlmIChkZWZpbml0aW9uLm1pbldpZHRoKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5taW5XaWR0aCA9IGRlZmluaXRpb24ubWluV2lkdGg7XG4gICAgfVxuICAgIGlmIChkZWZpbml0aW9uLm1heFdpZHRoKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5tYXhXaWR0aCA9IGRlZmluaXRpb24ubWF4V2lkdGg7XG4gICAgfVxuICAgIGlmIChkZWZpbml0aW9uLnJlc2l6YWJsZSkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ucmVzaXphYmxlID0gZGVmaW5pdGlvbi5yZXNpemFibGU7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogeyBbcHJvcE5hbWU6IHN0cmluZ106IFNpbXBsZUNoYW5nZSB9KTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNoYW5nZXMuYXV0b0FkanVzdCkgJiYgY2hhbmdlcy5hdXRvQWRqdXN0LmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5hdXRvQWRqdXN0LnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMuYXV0b0FkanVzdCA9IGNoYW5nZXMuYXV0b0FkanVzdC5jdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlSGVhZGVyQW5kRm9vdGVyU3RpY2t5UG9zaXRpb25zKCkge1xuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCkge1xuICAgICAgY29uc3Qgem9uZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nWm9uZSk7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24gPSB0aGlzLnNjcm9sbFN0cmF0ZWd5LnN0aWNreUNoYW5nZS5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5maXhlZEhlYWRlciB8fCB0aGlzLmhhc0luc2VydGFibGVSb3coKSlcbiAgICAgICkuc3Vic2NyaWJlKHggPT4ge1xuICAgICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3RpY2t5SGVhZGVyU2VsZWN0b3IpLmZvckVhY2goKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWwuc3R5bGUudG9wID0gLSB4ICsgJ3B4JztcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzdGlja3lGb290ZXJTZWxlY3RvcikuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBlbC5zdHlsZS5ib3R0b20gPSB4ICsgJ3B4JztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlRXhwYW5kYWJsZUNvbHVtbigpIHtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4gPSBuZXcgT0NvbHVtbigpO1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZXhwYW5kYWJsZUNvbHVtbi52aXNpYmxlID0gdGhpcy50YWJsZVJvd0V4cGFuZGFibGUgJiYgdGhpcy50YWJsZVJvd0V4cGFuZGFibGUuZXhwYW5kYWJsZUNvbHVtblZpc2libGU7XG4gICAgdGhpcy51cGRhdGVTdGF0ZUV4cGFuZGVkQ29sdW1uKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcblxuICAgIC8vZGV0YWNoIGFsbCBwb3J0YSBob3N0IGNyZWF0ZWRcbiAgICBpZiAodGhpcy5wb3J0YWxIb3N0KSB7XG4gICAgICB0aGlzLnBvcnRhbEhvc3QuZm9yRWFjaCh4ID0+IHguZGV0YWNoKCkpO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3koKTtcblxuICAgIC8vIENvbXBsZXRhciBlbCBzdWJqZWN0IGFsIGRlc3RydWlyIGVsIGNvbXBvbmVudGVcbiAgICB0aGlzLmNvbHVtbkZpbHRlcnNTdWJqZWN0LmNvbXBsZXRlKCk7XG4gIH1cblxuICBnZXRTdWZmaXhDb2x1bW5JbnNlcnRhYmxlKCkge1xuICAgIHJldHVybiBDb2Rlcy5TVUZGSVhfQ09MVU1OX0lOU0VSVEFCTEU7XG4gIH1cblxuICBnZXRBY3Rpb25zUGVybWlzc2lvbnMoKTogT1Blcm1pc3Npb25zW10ge1xuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zID8gKHRoaXMucGVybWlzc2lvbnMuYWN0aW9ucyB8fCBbXSkgOiBbXTtcbiAgfVxuXG4gIGdldE1lbnVQZXJtaXNzaW9ucygpOiBPVGFibGVNZW51UGVybWlzc2lvbnMge1xuICAgIGNvbnN0IHJlc3VsdDogT1RhYmxlTWVudVBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9ucyA/IHRoaXMucGVybWlzc2lvbnMubWVudSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDoge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBpdGVtczogW11cbiAgICB9O1xuICB9XG5cbiAgZ2V0T0NvbHVtblBlcm1pc3Npb25zKGF0dHI6IHN0cmluZyk6IE9QZXJtaXNzaW9ucyB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMucGVybWlzc2lvbnMgPyAodGhpcy5wZXJtaXNzaW9ucy5jb2x1bW5zIHx8IFtdKSA6IFtdO1xuICAgIHJldHVybiBjb2x1bW5zLmZpbmQoY29tcCA9PiBjb21wLmF0dHIgPT09IGF0dHIpIHx8IHsgYXR0cjogYXR0ciwgZW5hYmxlZDogdHJ1ZSwgdmlzaWJsZTogdHJ1ZSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFjdGlvblBlcm1pc3Npb25zKGF0dHI6IHN0cmluZyk6IE9QZXJtaXNzaW9ucyB7XG4gICAgY29uc3QgYWN0aW9uc1Blcm0gPSB0aGlzLnBlcm1pc3Npb25zID8gKHRoaXMucGVybWlzc2lvbnMuYWN0aW9ucyB8fCBbXSkgOiBbXTtcbiAgICBjb25zdCBwZXJtaXNzaW9uczogT1Blcm1pc3Npb25zID0gYWN0aW9uc1Blcm0uZmluZChwID0+IHAuYXR0ciA9PT0gYXR0cik7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zIHx8IHtcbiAgICAgIGF0dHI6IGF0dHIsXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihhdHRyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3Rpb25zUGVybSA9IHRoaXMucGVybWlzc2lvbnMgPyAodGhpcy5wZXJtaXNzaW9ucy5hY3Rpb25zIHx8IFtdKSA6IFtdO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zOiBPUGVybWlzc2lvbnMgPSBhY3Rpb25zUGVybS5maW5kKHAgPT4gcC5hdHRyID09PSBhdHRyKTtcbiAgICBjb25zdCBlbmFibGVkUGVybWlzaW9uID0gUGVybWlzc2lvbnNVdGlscy5jaGVja0VuYWJsZWRQZXJtaXNzaW9uKHBlcm1pc3Npb25zKTtcbiAgICBpZiAoIWVuYWJsZWRQZXJtaXNpb24pIHtcbiAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9QRVJNSVNTSU9OJyk7XG4gICAgfVxuICAgIHJldHVybiBlbmFibGVkUGVybWlzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB3aGF0IGluaXRpYWxpemUgdmFycyBhbmQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpOiBhbnkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcblxuICAgIC8vIFN0b3JlIG9yaWdpbmFsIG5vbi1oaWRhYmxlIGNvbHVtbnMgZm9yIHJlc3RvcmF0aW9uIG9uIHJlc2V0XG4gICAgdGhpcy5vcmlnaW5hbE5vbkhpZGFibGVDb2x1bW5zID0gdGhpcy5ub25IaWRhYmxlQ29sdW1ucztcblxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMgPSBuZXcgRGVmYXVsdE9UYWJsZU9wdGlvbnMoKTtcbiAgICBpZiAodGhpcy50YWJHcm91cENvbnRhaW5lciAmJiB0aGlzLnRhYkNvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZWdpc3RlclRhYkxpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlckNsaWNrTGlzdGVuZXIoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRGJsQ2xpY2tMaXN0ZW5lcigpO1xuICAgIC8vIEluaXRpYWxpemUgcGFyYW1zIG9mIHRoZSB0YWJsZVxuICAgIHRoaXMuaW5pdGlhbGl6ZVBhcmFtcygpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplRGFvKCk7XG5cbiAgICB0aGlzLnBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuZ2V0VGFibGVQZXJtaXNzaW9ucyh0aGlzLm9hdHRyLCB0aGlzLmFjdFJvdXRlKTtcbiAgfVxuXG4gIGluaXRpYWxpemVMb2FkaW5nU3ViamVjdCgpIHtcbiAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNldExvYWRpbmcodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJDbGlja0xpc3RlbmVyKCkge1xuICAgIGlmICh0aGlzLmNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24gPSB0aGlzLmNsaWNrU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuY2xpY2tEZWxheSkpIC8vIEVzcGVyYSBlbCB0aWVtcG8gY29uZmlndXJhZG8gYW50ZXMgZGUgZWplY3V0YXJcbiAgICAgIC5zdWJzY3JpYmUoKHsgcm93LCBjb2x1bW4sIGNlbGxSZWYsIHJvd0luZGV4LCBldmVudCB9KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm9lbmFibGVkICYmICF0aGlzLnJlYWRPbmx5ICYmIGNvbHVtbi5lZGl0b3JcbiAgICAgICAgICAmJiAodGhpcy5kZXRhaWxNb2RlICE9PSBDb2Rlcy5ERVRBSUxfTU9ERV9DTElDSylcbiAgICAgICAgICAmJiAodGhpcy5lZGl0aW9uTW9kZSA9PT0gQ29kZXMuRURJVElPTl9NT0RFX0NMSUNLKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZhdGVDb2x1bW5FZGl0aW9uKGNvbHVtbiwgcm93LCBjZWxsUmVmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRvSGFuZGxlQ2xpY2socm93LCBjb2x1bW4uYXR0ciwgcm93SW5kZXgsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJEYmxDbGlja0xpc3RlbmVyKCkge1xuICAgIGlmICh0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5kYkNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbiA9IHRoaXMuZGJsY2xpY2tTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5jbGlja0RlbGF5KSkgLy8gRXNwZXJhIGVsIHRpZW1wbyBjb25maWd1cmFkbyBhbnRlcyBkZSBlamVjdXRhclxuICAgICAgLnN1YnNjcmliZSgoeyByb3csIGNvbHVtbiwgY2VsbFJlZiwgcm93SW5kZXgsIGV2ZW50IH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgICBpZiAodGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vZW5hYmxlZCAmJiBjb2x1bW4uZWRpdG9yXG4gICAgICAgICAgJiYgKCFDb2Rlcy5pc0RvdWJsZUNsaWNrTW9kZSh0aGlzLmRldGFpbE1vZGUpKVxuICAgICAgICAgICYmIChDb2Rlcy5pc0RvdWJsZUNsaWNrTW9kZSh0aGlzLmVkaXRpb25Nb2RlKSkpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlQ29sdW1uRWRpdGlvbihjb2x1bW4sIHJvdywgY2VsbFJlZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRvdWJsZUNsaWNrLmVtaXQoeyByb3c6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4LCBtb3VzZUV2ZW50OiBldmVudCwgY29sdW1uTmFtZTogY29sdW1uLmF0dHIsIGNlbGw6IHJvd1tjb2x1bW4uYXR0cl0gfSk7XG4gICAgICAgICAgaWYgKHRoaXMub2VuYWJsZWQgJiYgQ29kZXMuaXNEb3VibGVDbGlja01vZGUodGhpcy5kZXRhaWxNb2RlKSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGV0YWlsKHJvdyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVEYW8oKSB7XG4gICAgLy8gQ29uZmlndXJlIGRhbyBtZXRob2RzXG4gICAgY29uc3QgcXVlcnlNZXRob2ROYW1lID0gdGhpcy5wYWdlYWJsZSA/IHRoaXMucGFnaW5hdGVkUXVlcnlNZXRob2QgOiB0aGlzLnF1ZXJ5TWV0aG9kO1xuICAgIGNvbnN0IG1ldGhvZHMgPSB7XG4gICAgICBxdWVyeTogcXVlcnlNZXRob2ROYW1lLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZU1ldGhvZCxcbiAgICAgIGRlbGV0ZTogdGhpcy5kZWxldGVNZXRob2QsXG4gICAgICBpbnNlcnQ6IHRoaXMuaW5zZXJ0TWV0aG9kXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnN0YXRpY0RhdGEpIHtcbiAgICAgIHRoaXMucXVlcnlPbkJpbmQgPSBmYWxzZTtcbiAgICAgIHRoaXMucXVlcnlPbkluaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGFvVGFibGUgPSBuZXcgT1RhYmxlRGFvKHVuZGVmaW5lZCwgdGhpcy5lbnRpdHksIG1ldGhvZHMpO1xuICAgICAgdGhpcy5zZXREYXRhQXJyYXkodGhpcy5zdGF0aWNEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWd1cmVTZXJ2aWNlKCk7XG4gICAgICB0aGlzLmRhb1RhYmxlID0gbmV3IE9UYWJsZURhbyh0aGlzLmRhdGFTZXJ2aWNlLCB0aGlzLmVudGl0eSwgbWV0aG9kcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHJlaW5pdGlhbGl6ZSB0YWJsZSBhZGRpbmcgb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgcmVpbml0aWFsaXplKG9wdGlvbnM6IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBjb25zdCBjbG9uZWRPcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnZW50aXR5JykpIHtcbiAgICAgICAgdGhpcy5lbnRpdHkgPSBjbG9uZWRPcHRzLmVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdzZXJ2aWNlJykpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gY2xvbmVkT3B0cy5zZXJ2aWNlO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2NvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBjbG9uZWRPcHRzLmNvbHVtbnM7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgndmlzaWJsZUNvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gY2xvbmVkT3B0cy52aXNpYmxlQ29sdW1ucztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmlzaWJsZUNvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLmRlZmF1bHRWaXNpYmxlQ29sdW1ucyA9IGNsb25lZE9wdHMuZGVmYXVsdFZpc2libGVDb2x1bW5zO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2tleXMnKSkge1xuICAgICAgICB0aGlzLmtleXMgPSBjbG9uZWRPcHRzLmtleXM7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnc29ydENvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLnNvcnRDb2x1bW5zID0gY2xvbmVkT3B0cy5zb3J0Q29sdW1ucztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdwYXJlbnRLZXlzJykpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRLZXlzID0gY2xvbmVkT3B0cy5wYXJlbnRLZXlzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyQ29sdW1ucycpKSB7XG4gICAgICAgIGlmICghdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50ID0gbmV3IE9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQodGhpcy5pbmplY3RvciwgdGhpcyk7XG4gICAgICAgICAgdGhpcy5vVGFibGVNZW51Lm9uVmlzaWJsZUZpbHRlck9wdGlvbkNoYW5nZS5uZXh0KHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0KTtcbiAgICAgICAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1ucyA9IGNsb25lZE9wdHMuZmlsdGVyQ29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1ucyA9IHRoaXMuc2VhcmNoZWFibGVDb2x1bW5zLmpvaW4oXCI7XCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zdGF0ZS5yZXNldCh0aGlzLnBhZ2VhYmxlKTtcbiAgICBpZiAob3B0aW9ucz8uZGF0YSkge1xuICAgICAgdGhpcy5zZXREYXRhKG9wdGlvbnMuZGF0YS5kYXRhLCBvcHRpb25zLmRhdGE/LnNxbFR5cGVzKTtcbiAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbkluZm8ob3B0aW9ucy5kYXRhLmRhdGEpO1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDA7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy5wYWdpbmF0aW9uRGF0YSkge1xuICAgICAgdGhpcy5yZWluaXRpYWxpemVQYWdpbmF0aW9uSW5mbyhvcHRpb25zLnBhZ2luYXRpb25EYXRhKTtcbiAgICB9XG4gICAgdGhpcy5pbml0VGFibGVBZnRlclZpZXdJbml0KCk7XG4gICAgdGhpcy5vblJlaW5pdGlhbGl6ZS5lbWl0KG51bGwpO1xuICB9XG5cbiAgcmVpbml0aWFsaXplUGFnaW5hdGlvbkluZm8ocGFnaW5hdGlvbkRhdGE6IFBhZ2luYXRpb25EYXRhKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2luYXRpb25EYXRhLnBhZ2VOdW1iZXI7XG4gICAgdGhpcy5xdWVyeVJvd3MgPSBwYWdpbmF0aW9uRGF0YS5wYWdlU2l6ZTtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgaWYgKHBhZ2luYXRpb25EYXRhLnN0YXJ0UmVjb3JkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHRFbmRJbmRleCA9IHBhZ2luYXRpb25EYXRhLnN0YXJ0UmVjb3JkSW5kZXggKyAodGhpcy5nZXREYXRhQXJyYXkoKSA/IHRoaXMuZ2V0RGF0YUFycmF5KCkubGVuZ3RoIDogMCk7XG4gICAgICAgIHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQgPSByZXN1bHRFbmRJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmIChwYWdpbmF0aW9uRGF0YS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc3RhdGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXIgPSBwYWdpbmF0aW9uRGF0YS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSB0aGlzLnN0YXRlLnF1ZXJ5UmVjb3JkT2Zmc2V0ID09IDAgPyAwIDogdGhpcy5kYXRhU2VydmljZT8uZ2V0UGFnaW5hdGlvbkNvbnRleHQoKS5wYWdlTnVtYmVyO1xuICAgICAgc3VwZXIudXBkYXRlUGFnaW5hdGlvbkNvbnRleHQoeyBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyLCBvZmZzZXQ6IHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQsIHRvdGFsU2l6ZTogdGhpcy5zdGF0ZS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciwgcGFnZVNpemU6IHRoaXMuc3RhdGUucXVlcnlSb3dzIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25Db250ZXh0KHsgdG90YWxTaXplOiB0aGlzLmdldERhdGFBcnJheSgpLmxlbmd0aCB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0VGFibGVBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMucGFyc2VWaXNpYmxlQ29sdW1ucygpO1xuICAgIHRoaXMucGFyc2VTZWFyY2hlYWJsZUNvbHVtbnMoKTtcbiAgICB0aGlzLnNldERhdGFzb3VyY2UoKTtcbiAgICB0aGlzLnBhcnNlR3JvdXBlZENvbHVtbnMoKTtcbiAgICB0aGlzLnBhcnNlR3JvdXBlZENvbHVtblR5cGVzKCk7XG4gICAgdGhpcy5wYXJzZVNvcnRDb2x1bW5zKCk7XG4gICAgdGhpcy5zZXRGaWx0ZXJzQ29uZmlndXJhdGlvbigpO1xuICAgIHRoaXMuYWRkRGVmYXVsdFJvd0J1dHRvbnMoKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQpKSB7XG4gICAgICB0aGlzLnNldEdyb3VwQ29sdW1ucyh0aGlzLm9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudC5jb2x1bW5zQXJyYXkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVyeU9uSW5pdCkge1xuICAgICAgdGhpcy5xdWVyeURhdGEoKTtcbiAgICB9XG4gIH1cbiAgcGFyc2VTZWFyY2hlYWJsZUNvbHVtbnMoKSB7XG4gICAgdGhpcy5zZWFyY2hlYWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2xBcnJheS5maWx0ZXIoY29sID0+IHtcbiAgICAgIGNvbnN0IG9Db2wgPSB0aGlzLmdldE9Db2x1bW4oY29sKTtcbiAgICAgIHJldHVybiBvQ29sICYmIG9Db2wuc2VhcmNoYWJsZTtcbiAgICB9KVxuXG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgaWYgKHRoaXMudGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNvcnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UpIHtcbiAgICAgIHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjcm9sbFN0cmF0ZWd5KSB7XG4gICAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGJDbGlja1N1YmplY3RTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGJDbGlja1N1YmplY3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm93Q2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvd0NoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9ucykuZm9yRWFjaChpZHggPT4ge1xuICAgICAgaWYgKHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9uc1tpZHhdKSB7XG4gICAgICAgIHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9uc1tpZHhdLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5sb2FkaW5nU2VydmljZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU2VydmljZS5uZ09uRGVzdHJveT8uKCk7XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uT25GaWx0ZXJDaGFuZ2VzPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGRhdGUgc3RvcmUgbG9jYWxzdG9yYWdlLCBjYWxsIG9mIHRoZSBJTG9jYWxTdG9yYWdlXG4gICAqL1xuICBnZXREYXRhVG9TdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2UuZ2V0RGF0YVRvU3RvcmUoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyUXVpY2tGaWx0ZXIoYXJnOiBhbnkpIHtcbiAgICBjb25zdCBxdWlja0ZpbHRlciA9IChhcmcgYXMgT1RhYmxlUXVpY2tmaWx0ZXIpO1xuICAgIC8vIGZvcmNpbmcgcXVpY2tGaWx0ZXJDb21wb25lbnQgdG8gYmUgdW5kZWZpbmVkLCB0YWJsZSB1c2VzIG9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50XG4gICAgdGhpcy5xdWlja0ZpbHRlckNvbXBvbmVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50ID0gcXVpY2tGaWx0ZXI7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50LnNldFZhbHVlKHRoaXMuc3RhdGUucXVpY2tGaWx0ZXJWYWx1ZSwgZmFsc2UpO1xuICAgICAgdGhpcy5xdWlja0ZpbHRlclN1YnNjcmlwdGlvbiA9IHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQub25DaGFuZ2Uuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICAgIHRoaXMub25TZWFyY2guZW1pdCh2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJQYWdpbmF0aW9uKHZhbHVlOiBPVGFibGVQYWdpbmF0b3IpIHtcbiAgICB0aGlzLnBhZ2luYXRpb25Db250cm9scyA9IHRydWU7XG4gICAgdGhpcy5wYWdpbmF0b3IgPSB2YWx1ZTtcbiAgfVxuXG4gIHJlZ2lzdGVyQ29udGV4dE1lbnUodmFsdWU6IE9Db250ZXh0TWVudUNvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMudGFibGVDb250ZXh0TWVudSA9IHZhbHVlO1xuICAgIHRoaXMuY29udGV4dE1lbnVTdWJzY3JpcHRpb24gPSB0aGlzLnRhYmxlQ29udGV4dE1lbnUub25TaG93LnN1YnNjcmliZSgocGFyYW1zOiBJT0NvbnRleHRNZW51Q29udGV4dCkgPT4ge1xuICAgICAgcGFyYW1zLmNsYXNzID0gJ28tdGFibGUtY29udGV4dC1tZW51ICcgKyB0aGlzLnJvd0hlaWdodDtcbiAgICAgIGlmIChwYXJhbXMuZGF0YSAmJiAhdGhpcy5pc1Jvd1NlbGVjdGVkKHBhcmFtcy5kYXRhLnJvd1ZhbHVlKSkge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3cocGFyYW1zLmRhdGEucm93VmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJEZWZhdWx0Q29sdW1uKGNvbHVtbjogc3RyaW5nKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuZ2V0T0NvbHVtbihjb2x1bW4pKSkge1xuICAgICAgLy8gYSBkZWZhdWx0IGNvbHVtbiBkZWZpbml0aW9uIHRyeWluZyB0byByZXBsYWNlIGFuIGFscmVhZHkgZXhpc3RpbmcgZGVmaW5pdGlvblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb2xEZWY6IE9Db2x1bW4gPSB0aGlzLmNyZWF0ZU9Db2x1bW4oY29sdW1uLCB0aGlzKTtcbiAgICB0aGlzLnB1c2hPQ29sdW1uRGVmaW5pdGlvbihjb2xEZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIGFsbCBjb2x1bW5zIGFuZCBwcm9wZXJ0aWVzIGluIHZhciBjb2x1bW5zQXJyYXlcbiAgICogQHBhcmFtIGNvbHVtblxuICAgKi9cbiAgcmVnaXN0ZXJDb2x1bW4oY29sdW1uOiBPVGFibGVDb2x1bW5Db21wb25lbnQgfCBPVGFibGVDb2x1bW5DYWxjdWxhdGVkQ29tcG9uZW50IHwgYW55KSB7XG4gICAgY29uc3QgY29sdW1uQXR0ciA9ICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJykgPyBjb2x1bW4gOiBjb2x1bW4uYXR0cjtcbiAgICBjb25zdCBjb2x1bW5QZXJtaXNzaW9uczogT1Blcm1pc3Npb25zID0gdGhpcy5nZXRPQ29sdW1uUGVybWlzc2lvbnMoY29sdW1uQXR0cik7XG4gICAgaWYgKCFjb2x1bW5QZXJtaXNzaW9ucy52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRGVmYXVsdENvbHVtbihjb2x1bW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbkRlZiA9IHRoaXMuZ2V0T0NvbHVtbihjb2x1bW4uYXR0cik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbkRlZikgJiYgVXRpbC5pc0RlZmluZWQoY29sdW1uRGVmLmRlZmluaXRpb24pKSB7XG4gICAgICAvLyBhIG8tdGFibGUtY29sdW1uIGRlZmluaXRpb24gdHJ5aW5nIHRvIHJlcGxhY2UgYW4gYWxyZWFkeSBleGlzdGluZyBvLXRhYmxlLWNvbHVtbiBkZWZpbml0aW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sRGVmOiBPQ29sdW1uID0gdGhpcy5jcmVhdGVPQ29sdW1uKGNvbHVtbi5hdHRyLCB0aGlzLCBjb2x1bW4pO1xuICAgIGxldCBjb2x1bW5XaWR0aCA9IHRoaXMuZ2V0Q29sdW1uV2lkdGhGcm9tU3RhdGUoY29sRGVmKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29sdW1uV2lkdGgpKSB7XG4gICAgICBjb2xEZWYud2lkdGggPSBjb2x1bW5XaWR0aDtcbiAgICB9XG4gICAgaWYgKGNvbHVtbiAmJiAoY29sdW1uLmFzeW5jTG9hZCB8fCBjb2x1bW4udHlwZSA9PT0gJ2FjdGlvbicpKSB7XG4gICAgICB0aGlzLmF2b2lkUXVlcnlDb2x1bW5zLnB1c2goY29sdW1uLmF0dHIpO1xuICAgICAgaWYgKGNvbHVtbi5hc3luY0xvYWQpIHtcbiAgICAgICAgdGhpcy5hc3luY0xvYWRDb2x1bW5zLnB1c2goY29sdW1uLmF0dHIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnB1c2hPQ29sdW1uRGVmaW5pdGlvbihjb2xEZWYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHB1c2hPQ29sdW1uRGVmaW5pdGlvbihjb2xEZWY6IE9Db2x1bW4pIHtcbiAgICBjb2xEZWYudmlzaWJsZSA9IHRoaXMudmlzaWJsZUNvbEFycmF5LmluY2x1ZGVzKGNvbERlZi5hdHRyKTtcbiAgICAvLyBGaW5kIGNvbHVtbiBkZWZpbml0aW9uIGJ5IG5hbWVcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RpbmcgPSB0aGlzLmdldE9Db2x1bW4oY29sRGVmLmF0dHIpO1xuICAgIGlmIChhbHJlYWR5RXhpc3RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVwbGFjaW5nSW5kZXggPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuaW5kZXhPZihhbHJlYWR5RXhpc3RpbmcpO1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zW3JlcGxhY2luZ0luZGV4XSA9IGNvbERlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnB1c2goY29sRGVmKTtcbiAgICAgIHRoaXMub3JpZ2luYWxSZWdpc3RlcmVkQ29sdW1ucy5wdXNoKGNvbERlZik7XG4gICAgfVxuICAgIHRoaXMuZW5zdXJlQ29sdW1uc09yZGVyKCk7XG4gICAgdGhpcy5yZWZyZXNoRWRpdGlvbk1vZGVXYXJuKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaEVkaXRpb25Nb2RlV2FybigpIHtcbiAgICBpZiAodGhpcy5lZGl0aW9uTW9kZSAhPT0gQ29kZXMuRURJVElPTl9NT0RFX05PTkUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWRpdGFibGVDb2x1bW5zID0gdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjb2wgPT4ge1xuICAgICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKGNvbC5lZGl0b3IpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGVkaXRhYmxlQ29sdW1ucy5sZW5ndGggPiAwICYmICF0aGlzLmhhc0luc2VydGFibGVSb3coKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1VzaW5nIGEgY29sdW1uIHdpdGggYSBlZGl0b3IgYnV0IHRoZXJlIGlzIG5vIGVkaXRpb24tbW9kZSBkZWZpbmVkJyk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHJlZ2lzdGVyQ29sdW1uQWdncmVnYXRlKGNvbHVtbjogT0NvbHVtbkFnZ3JlZ2F0ZSkge1xuICAgIHRoaXMuc2hvd1RvdGFsc1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RpbmcgPSB0aGlzLmdldE9Db2x1bW4oY29sdW1uLmF0dHIpO1xuICAgIGlmIChhbHJlYWR5RXhpc3RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVwbGFjaW5nSW5kZXggPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuaW5kZXhPZihhbHJlYWR5RXhpc3RpbmcpO1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zW3JlcGxhY2luZ0luZGV4XS5hZ2dyZWdhdGUgPSBjb2x1bW47XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJUYWJsZUhlYWRlcnModGFibGVIZWFkZXI6IE9UYWJsZUhlYWRlckNvbXBvbmVudCkge1xuICAgIGlmICh0aGlzLnRhYmxlSGVhZGVycy5maW5kSW5kZXgoaGVhZGVyID0+IGhlYWRlci5jb2x1bW4uYXR0ciA9PT0gdGFibGVIZWFkZXIuY29sdW1uLmF0dHIpID09PSAtMSkge1xuICAgICAgdGhpcy50YWJsZUhlYWRlcnMucHVzaCh0YWJsZUhlYWRlcik7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VWaXNpYmxlQ29sdW1ucyhkZWZhdWx0Q29uZmlndXJhdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKGRlZmF1bHRDb25maWd1cmF0aW9uKSB7XG4gICAgICB0aGlzLnN0YXRlLmNvbHVtbnNEaXNwbGF5ID0gdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgb3JpZ2luYWxDb2x1bW5zID0gdGhpcy5vcmlnaW5hbFJlZ2lzdGVyZWRDb2x1bW5zLm1hcChjb2wgPT4gY29sLmF0dHIpO1xuICAgICAgLy8gc2V0dGluZyB2aXNpYmxlIGNvbHVtbnMgYWNjb3JkaW5nIHRvIHRoZSBpbml0aWFsIGNvbmZpZ3VyYXRpb25cbiAgICAgIHRoaXMudmlzaWJsZUNvbEFycmF5ID0gdGhpcy5vcmlnaW5hbFJlZ2lzdGVyZWRDb2x1bW5zLmZpbHRlcihpdGVtID0+IGl0ZW0udmlzaWJsZSkubWFwKGl0ZW0gPT4gaXRlbS5hdHRyKTtcbiAgICAgIC8vIHNldHRpbmcgY29sdW1ucyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlIGluaXRpYWwgY29uZmlndXJhdGlvblxuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnNvcnQoKGE6IE9Db2x1bW4sIGI6IE9Db2x1bW4pID0+IG9yaWdpbmFsQ29sdW1ucy5pbmRleE9mKGEuYXR0cikgLSBvcmlnaW5hbENvbHVtbnMuaW5kZXhPZihiLmF0dHIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5jb2x1bW5zRGlzcGxheSkge1xuICAgICAgLy8gZmlsdGVyaW5nIGNvbHVtbnMgdGhhdCBtaWdodCBiZSBpbiBzdGF0ZSBzdG9yYWdlIGJ1dCBub3QgaW4gdGhlIGFjdHVhbCB0YWJsZSBkZWZpbml0aW9uXG4gICAgICBsZXQgc3RhdGVDb2xzOiBPQ29sdW1uRGlzcGxheVtdID0gW107XG4gICAgICB0aGlzLnN0YXRlLmNvbHVtbnNEaXNwbGF5LmZvckVhY2goKG9Db2wsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzVmlzaWJsZUNvbEluQ29sdW1ucyA9IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5maW5kKGNvbCA9PiBjb2wuYXR0ciA9PT0gb0NvbC5hdHRyKSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChpc1Zpc2libGVDb2xJbkNvbHVtbnMpIHtcbiAgICAgICAgICBzdGF0ZUNvbHMucHVzaChvQ29sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBsb2FkIHRoZSBjb2x1bW4gJyArIG9Db2wuYXR0ciArICcgZnJvbSB0aGUgbG9jYWxzdG9yYWdlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzdGF0ZUNvbHMgPSB0aGlzLmNoZWNrQ2hhbmdlc1Zpc2libGVDb2x1bW1uc0luSW5pdGlhbENvbmZpZ3VyYXRpb24oc3RhdGVDb2xzKTtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5zb3J0KChhOiBPQ29sdW1uLCBiOiBPQ29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4QSA9IHN0YXRlQ29scy5maW5kSW5kZXgoY29sID0+IGNvbC5hdHRyID09PSBhLmF0dHIpO1xuICAgICAgICBjb25zdCBpbmRleEIgPSBzdGF0ZUNvbHMuZmluZEluZGV4KGNvbCA9PiBjb2wuYXR0ciA9PT0gYi5hdHRyKTtcbiAgICAgICAgcmV0dXJuIGluZGV4QSAtIGluZGV4QjtcbiAgICAgIH0pO1xuICAgICAgdGhpcy52aXNpYmxlQ29sQXJyYXkgPSBzdGF0ZUNvbHMuZmlsdGVyKGl0ZW0gPT4gaXRlbS52aXNpYmxlKS5tYXAoaXRlbSA9PiBpdGVtLmF0dHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZpc2libGVDb2xBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLmRlZmF1bHRWaXNpYmxlQ29sdW1ucyA/IHRoaXMuZGVmYXVsdFZpc2libGVDb2x1bW5zIDogdGhpcy52aXNpYmxlQ29sdW1ucywgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tDaGFuZ2VzVmlzaWJsZUNvbHVtbW5zSW5Jbml0aWFsQ29uZmlndXJhdGlvbihzdGF0ZUNvbHM6IE9Db2x1bW5EaXNwbGF5W10pOiBPQ29sdW1uRGlzcGxheVtdIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uY29sdW1uc0Rpc3BsYXkpIHtcbiAgICAgIHJldHVybiBzdGF0ZUNvbHM7XG4gICAgfVxuICAgIC8vIEdldCB0aGUgb3JpZ2luYWwgdmlzaWJsZSBjb2x1bW5zIGZyb20gbG9jYWxTdG9yYWdlXG4gICAgY29uc3Qgb3JpZ2luYWxWaXNpYmxlQ29sQXJyYXkgPVxuICAgICAgdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5jb2x1bW5zRGlzcGxheS5maWx0ZXIoeCA9PiB4LnZpc2libGUpLm1hcCh4ID0+IHguYXR0cik7XG5cbiAgICBjb25zdCBjdXJyZW50VmlzaWJsZUNvbEFycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMudmlzaWJsZUNvbHVtbnMsIHRydWUpO1xuXG4gICAgLy8gRmluZCB2YWx1ZXMgaW4gdmlzaWJsZS1jb2x1bW5zIHRoYXQgdGhleSBhcmVudCBpbiBvcmlnaW5hbC12aXNpYmxlLWNvbHVtbnMgaW4gbG9jYWxzdG9yYWdlXG4gICAgLy8gaW4gdGhpcyBjYXNlIHlvdSBoYXZlIHRvIGFkZCB0aGlzIGNvbHVtbiB0byB0aGlzLnZpc2libGVDb2xBcnJheVxuICAgIGNvbnN0IGNvbFRvQWRkSW5WaXNpYmxlQ29sID0gVXRpbC5kaWZmZXJlbmNlQXJyYXlzKGN1cnJlbnRWaXNpYmxlQ29sQXJyYXksIG9yaWdpbmFsVmlzaWJsZUNvbEFycmF5KTtcbiAgICBmb3IgKGNvbnN0IG5ld0NvbEF0dHIgb2YgY29sVG9BZGRJblZpc2libGVDb2wpIHtcbiAgICAgIGNvbnN0IGNvbHVtbkV4aXN0cyA9IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5zb21lKGNvbCA9PiBjb2wuYXR0ciA9PT0gbmV3Q29sQXR0cik7XG5cbiAgICAgIGlmIChjb2x1bW5FeGlzdHMpIHtcbiAgICAgICAgbGV0IGluZGV4Q29sID0gc3RhdGVDb2xzLmZpbmRJbmRleChjb2wgPT4gY29sLmF0dHIgPT09IG5ld0NvbEF0dHIpO1xuICAgICAgICBpZiAoaW5kZXhDb2wgPiAtMSkge1xuICAgICAgICAgIHN0YXRlQ29sc1tpbmRleENvbF0udmlzaWJsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIGNvbHVtbiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc3RhdGUsIGFkZCBpdCBhcyB2aXNpYmxlXG4gICAgICAgICAgc3RhdGVDb2xzLnB1c2goe1xuICAgICAgICAgICAgYXR0cjogbmV3Q29sQXR0cixcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICB3aWR0aDogdW5kZWZpbmVkXG4gICAgICAgICAgfSBhcyBPQ29sdW1uRGlzcGxheSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YXRlQ29scy5zb3J0KChhOiBPQ29sdW1uLCBiOiBPQ29sdW1uKSA9PiBjdXJyZW50VmlzaWJsZUNvbEFycmF5LmluZGV4T2YoYS5hdHRyKSAtIGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkuaW5kZXhPZihiLmF0dHIpKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHZhbHVlcyBpbiBvcmlnaW5hbC12aXNpYmxlLWNvbHVtbnMgaW4gbG9jYWxzdG9yYWdlIHRoYXQgdGhleSBhcmVudCBpbiB0aGlzLnZpc2libGVDb2xBcnJheVxuICAgIC8vIGluIHRoaXMgY2FzZSB5b3UgaGF2ZSB0byBkZWxldGUgdGhpcyBjb2x1bW4gdG8gdGhpcy52aXNpYmxlQ29sQXJyYXlcbiAgICBjb25zdCBjb2xUb0RlbGV0ZUluVmlzaWJsZUNvbCA9IFV0aWwuZGlmZmVyZW5jZUFycmF5cyhvcmlnaW5hbFZpc2libGVDb2xBcnJheSwgY3VycmVudFZpc2libGVDb2xBcnJheSk7XG4gICAgaWYgKGNvbFRvRGVsZXRlSW5WaXNpYmxlQ29sLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0YXRlQ29scyA9IHN0YXRlQ29scy5maWx0ZXIoY29sID0+IGNvbFRvRGVsZXRlSW5WaXNpYmxlQ29sLmluZGV4T2YoY29sLmF0dHIpID09PSAtMSk7XG4gICAgfVxuXG4gICAgLy9JZiB0aGUgY29sdW1ucyBpbiBvcmlnaW5hbFZpc2libGVDb2xBcnJheSBoYXMgY2hhbmdlZCB0aGUgc29ydGluZ1xuICAgIGNvbnN0IGNoYW5nZVNvcnRWaXNpYmxlQ29sdW1ucyA9IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkpICE9PSBKU09OLnN0cmluZ2lmeShvcmlnaW5hbFZpc2libGVDb2xBcnJheSk7XG4gICAgaWYgKGNoYW5nZVNvcnRWaXNpYmxlQ29sdW1ucyAmJiBjdXJyZW50VmlzaWJsZUNvbEFycmF5Lmxlbmd0aCA9PT0gb3JpZ2luYWxWaXNpYmxlQ29sQXJyYXkubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0b0luZGV4LCBjb2xdIG9mIGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnN0IGZyb21JbmRleFRvQ2hhbmdlID0gc3RhdGVDb2xzLmZpbmRJbmRleChzdGF0ZUNvbCA9PiBzdGF0ZUNvbC5hdHRyID09PSBjb2wpO1xuICAgICAgICBtb3ZlSXRlbUluQXJyYXkoc3RhdGVDb2xzLCBmcm9tSW5kZXhUb0NoYW5nZSwgdG9JbmRleCk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVDb2xzO1xuICB9XG5cbiAgcGFyc2VTb3J0Q29sdW1ucygpIHtcbiAgICBjb25zdCBzb3J0Q29sdW1uc1BhcmFtID0gdGhpcy5zdGF0ZS5zb3J0Q29sdW1ucyB8fCB0aGlzLnNvcnRDb2x1bW5zO1xuICAgIHRoaXMuc29ydENvbEFycmF5ID0gU2VydmljZVV0aWxzLnBhcnNlU29ydENvbHVtbnMoc29ydENvbHVtbnNQYXJhbSk7XG5cbiAgICAvLyBjaGVja2luZyB0aGUgb3JpZ2luYWwgc29ydCBjb2x1bW5zIHdpdGggdGhlIHNvcnQgY29sdW1ucyBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaW4gbG9jYWwgc3RvcmFnZVxuICAgIGlmICh0aGlzLnN0YXRlLnNvcnRDb2x1bW5zICYmIHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uc29ydENvbHVtbnMpIHtcblxuICAgICAgY29uc3QgaW5pdGlhbENvbmZpZ1NvcnRDb2x1bW5zQXJyYXkgPSBTZXJ2aWNlVXRpbHMucGFyc2VTb3J0Q29sdW1ucyh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnNvcnRDb2x1bW5zKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsU29ydENvbHVtbnNBcnJheSA9IFNlcnZpY2VVdGlscy5wYXJzZVNvcnRDb2x1bW5zKHRoaXMuc29ydENvbHVtbnMpO1xuICAgICAgLy8gRmluZCB2YWx1ZXMgaW4gdmlzaWJsZS1jb2x1bW5zIHRoYXQgdGhleSBhcmVudCBpbiBvcmlnaW5hbC12aXNpYmxlLWNvbHVtbnMgaW4gbG9jYWxzdG9yYWdlXG4gICAgICAvLyBpbiB0aGlzIGNhc2UgeW91IGhhdmUgdG8gYWRkIHRoaXMgY29sdW1uIHRvIHRoaXMudmlzaWJsZUNvbEFycmF5XG4gICAgICBjb25zdCBjb2xUb0FkZEluVmlzaWJsZUNvbCA9IFV0aWwuZGlmZmVyZW5jZUFycmF5cyhvcmlnaW5hbFNvcnRDb2x1bW5zQXJyYXksIGluaXRpYWxDb25maWdTb3J0Q29sdW1uc0FycmF5KTtcbiAgICAgIGlmIChjb2xUb0FkZEluVmlzaWJsZUNvbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbFRvQWRkSW5WaXNpYmxlQ29sLmZvckVhY2goY29sQWRkID0+IHtcbiAgICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5wdXNoKGNvbEFkZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb2xUb0RlbEluVmlzaWJsZUNvbCA9IFV0aWwuZGlmZmVyZW5jZUFycmF5cyhpbml0aWFsQ29uZmlnU29ydENvbHVtbnNBcnJheSwgb3JpZ2luYWxTb3J0Q29sdW1uc0FycmF5KTtcbiAgICAgIGlmIChjb2xUb0RlbEluVmlzaWJsZUNvbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbFRvRGVsSW5WaXNpYmxlQ29sLmZvckVhY2goKGNvbERlbCkgPT4ge1xuICAgICAgICAgIHRoaXMuc29ydENvbEFycmF5LmZvckVhY2goKGNvbCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5OYW1lID09PSBjb2xEZWwuY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVuc3VyaW5nIGNvbHVtbiBleGlzdGVuY2UgYW5kIGNoZWNraW5nIGl0cyBvcmRlcmFibGUgc3RhdGVcbiAgICBmb3IgKGxldCBpID0gdGhpcy5zb3J0Q29sQXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGNvbE5hbWUgPSB0aGlzLnNvcnRDb2xBcnJheVtpXS5jb2x1bW5OYW1lO1xuICAgICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihjb2xOYW1lKTtcbiAgICAgIGlmICghVXRpbC5pc0RlZmluZWQob0NvbCkgfHwgIW9Db2wub3JkZXJhYmxlKSB7XG4gICAgICAgIHRoaXMuc29ydENvbEFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBlbnN1cmVDb2x1bW5zT3JkZXIoKSB7XG5cbiAgICBsZXQgY29sdW1uc09yZGVyID0gW107XG5cbiAgICBpZiAoIXRoaXMuc3RhdGUuY29sdW1uc0Rpc3BsYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb2x1bW5zT3JkZXIgPSB0aGlzLnN0YXRlLmNvbHVtbnNEaXNwbGF5Lm1hcChpdGVtID0+IGl0ZW0uYXR0cik7XG5cbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuc29ydCgoYTogT0NvbHVtbiwgYjogT0NvbHVtbikgPT4ge1xuICAgICAgaWYgKGNvbHVtbnNPcmRlci5pbmRleE9mKGEuYXR0cikgPT09IC0xKSB7XG4gICAgICAgIC8vIGlmIGl0IGlzIG5vdCBpbiBsb2NhbCBzdG9yYWdlIGJlY2F1c2UgaXQgaXMgbmV3LCBrZWVwIG9yZGVyXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnNPcmRlci5pbmRleE9mKGEuYXR0cikgLSBjb2x1bW5zT3JkZXIuaW5kZXhPZihiLmF0dHIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuICBpbml0aWFsaXplUGFyYW1zKCk6IHZvaWQge1xuICAgIC8vIElmIHZpc2libGUtY29sdW1ucyBpcyBub3QgcHJlc2VudCB0aGVuIHZpc2libGUtY29sdW1ucyBpcyBhbGwgY29sdW1uc1xuICAgIGlmICghdGhpcy52aXNpYmxlQ29sdW1ucykge1xuICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICB9XG4gICAgdGhpcy52aXNpYmxlQ29sQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy52aXNpYmxlQ29sdW1ucywgdHJ1ZSk7XG5cbiAgICBpZiAodGhpcy5jb2xBcnJheS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29sQXJyYXkuZm9yRWFjaCgoeDogc3RyaW5nKSA9PiB0aGlzLnJlZ2lzdGVyQ29sdW1uKHgpKTtcbiAgICAgIHRoaXMuZW5zdXJlQ29sdW1uc09yZGVyKCk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBxdWlja0ZpbHRlclxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZmlsdGVyID0gdGhpcy5xdWlja0ZpbHRlcjtcblxuICAgIGlmICh0aGlzLnN0YXRlLmN1cnJlbnRQYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5zdGF0ZS5jdXJyZW50UGFnZTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHBhZ2luYXRvclxuICAgIGlmICghdGhpcy5wYWdpbmF0b3IgJiYgdGhpcy5wYWdpbmF0aW9uQ29udHJvbHMpIHtcbiAgICAgIHRoaXMucGFnaW5hdG9yID0gbmV3IE9CYXNlVGFibGVQYWdpbmF0b3IoKTtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gdGhpcy5xdWVyeVJvd3M7XG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgICAgdGhpcy5wYWdpbmF0b3Iuc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgPSB0aGlzLnNob3dQYWdpbmF0b3JGaXJzdExhc3RCdXR0b25zO1xuICAgIH1cblxuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5zZWxlY3RBbGxDaGVja2JveFZpc2libGUpKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlID0gISF0aGlzLnN0YXRlLnNlbGVjdENvbHVtblZpc2libGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNoZWNraW5nIHRoZSBvcmlnaW5hbCBzZWxlY3RBbGxDaGVja2JveFZpc2libGUgd2l0aCBzZWxlY3QtY29sdW1uLXZpc2libGUgaW4gaW5pdGlhbCBjb25maWd1cmF0aW9uIGluIGxvY2FsIHN0b3JhZ2VcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnNlbGVjdENvbHVtblZpc2libGUpXG4gICAgICAgICYmIHRoaXMuc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlID09PSB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnNlbGVjdENvbHVtblZpc2libGUpIHtcbiAgICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9ICEhdGhpcy5zdGF0ZS5zZWxlY3RDb2x1bW5WaXNpYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9IHRoaXMuc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vSW5pdGlhbGl6ZSBzaG93IGZpbHRlciBieSBjb2x1bW4gaWNvblxuICAgIHRoaXMuaXNDb2x1bW5GaWx0ZXJzQWN0aXZlID0gdGhpcy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQ7XG5cbiAgICB0aGlzLmluaXRpYWxpemVDaGVja2JveENvbHVtbigpO1xuXG4gICAgaWYgKHRoaXMuc3RvcmVTdGF0ZSkge1xuICAgICAgLy8gaWYgcXVlcnktcm93cyBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaXMgZXF1YWxzIHRvIG9yaWdpbmFsIHF1ZXJ5LXJvd3MgaW5wdXRcbiAgICAgIC8vIHF1ZXJ5X3Jvd3Mgd2lsbCBiZSB0aGUgdmFsdWUgaW4gbG9jYWwgc3RvcmFnZVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUucXVlcnlSb3dzKSAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnF1ZXJ5Um93cylcbiAgICAgICAgJiYgdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5xdWVyeVJvd3MgPT09IHRoaXMub3JpZ2luYWxRdWVyeVJvd3MpIHtcbiAgICAgICAgdGhpcy5xdWVyeVJvd3MgPSB0aGlzLnN0YXRlLnF1ZXJ5Um93cztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0aW9uKCkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5fc2VsZWN0aW9uKSkge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odGhpcy5pc1NlbGVjdGlvbk1vZGVNdWx0aXBsZSgpLCBbXSwgdHJ1ZSwgdGhpcy5jb21wYXJlUm93KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uO1xuICB9XG5cblxuXG4gIHVwZGF0ZVN0YXRlRXhwYW5kZWRDb2x1bW4oKSB7XG4gICAgaWYgKCF0aGlzLnRhYmxlUm93RXhwYW5kYWJsZT8uZXhwYW5kYWJsZUNvbHVtblZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uc1swXSA9PT0gQ29kZXMuTkFNRV9DT0xVTU5fU0VMRUNUICYmXG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zWzFdICE9PSBDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLnNwbGljZSgxLCAwLCBDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnNbMF0gIT09IENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMudW5zaGlmdChDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFKTtcbiAgICB9XG5cbiAgfVxuXG4gIHJlZ2lzdGVyVGFiTGlzdGVuZXIoKSB7XG4gICAgLy8gV2hlbiB0YWJsZSBpcyBjb250YWluZWQgaW50byB0YWIgY29tcG9uZW50LCBpdCBpcyBuZWNlc3NhcnkgdG8gaW5pdCB0YWJsZSBjb21wb25lbnQgd2hlbiBhdHRhY2hlZCB0byBET00uXG4gICAgdGhpcy50YWJHcm91cENoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMudGFiR3JvdXBDb250YWluZXIuc2VsZWN0ZWRUYWJDaGFuZ2Uuc3Vic2NyaWJlKChldnQpID0+IHtcbiAgICAgIGxldCBpbnRlcnZhbDtcbiAgICAgIGNvbnN0IHRpbWVyQ2FsbGJhY2sgPSAodGFiOiBNYXRUYWIpID0+IHtcbiAgICAgICAgaWYgKHRhYiAmJiB0YWIuY29udGVudC5pc0F0dGFjaGVkKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgaWYgKHRhYiA9PT0gdGhpcy50YWJDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zaWRlVGFiQnVnV29ya2Fyb3VuZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ1F1ZXJ5KSB7XG4gICAgICAgICAgICAgIHRoaXMucXVlcnlEYXRhKHRoaXMucGVuZGluZ1F1ZXJ5RmlsdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHsgdGltZXJDYWxsYmFjayhldnQudGFiKTsgfSwgMTAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbnNpZGVUYWJCdWdXb3JrYXJvdW5kKCkge1xuICAgIHRoaXMucmVmcmVzaFNvcnRIZWFkZXJzKCk7XG4gIH1cblxuICByZWdpc3RlclNvcnRMaXN0ZW5lcigpIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSkge1xuICAgICAgdGhpcy5zb3J0U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5zb3J0U3Vic2NyaXB0aW9uID0gdGhpcy5zb3J0Lm9Tb3J0Q2hhbmdlLnN1YnNjcmliZSh0aGlzLmhhbmRsZVNvcnRDaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLnNvcnQuc2V0TXVsdGlwbGVTb3J0KHRoaXMubXVsdGlwbGVTb3J0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgKiBHZXRzIGN1cnJlbnQgYWN0aXZlIGNvbHVtbiBmaWx0ZXJzXG4gICovXG4gIGdldCBjdXJyZW50Q29sdW1uRmlsdGVycygpOiBPQ29sdW1uVmFsdWVGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8uZ2V0Q29sdW1uVmFsdWVGaWx0ZXJzKCkgfHwgW107XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlU29ydENoYW5nZShzb3J0QXJyYXk6IGFueVtdKSB7XG4gICAgdGhpcy5zb3J0Q29sQXJyYXkgPSBbXTtcbiAgICBzb3J0QXJyYXkuZm9yRWFjaCgoc29ydCkgPT4ge1xuICAgICAgaWYgKHNvcnQuZGlyZWN0aW9uICE9PSAnJykge1xuICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5wdXNoKHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiBzb3J0LmlkLFxuICAgICAgICAgIGFzY2VuZGVudDogc29ydC5kaXJlY3Rpb24gPT09IENvZGVzLkFTQ19TT1JUXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMub25Tb3J0Q2hhbmdlLmVtaXQodGhpcy5zb3J0Q29sQXJyYXkpO1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICB0aGlzLnJlbG9hZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBzZXREYXRhc291cmNlKCkge1xuICAgIC8vRGVsZXRlZCBwcmV2aW91cyBpbnN0YW5jZSBhbmQgc3Vic2NyaWJlcnNcbiAgICBkZWxldGUgdGhpcy5kYXRhU291cmNlO1xuICAgIGlmICh0aGlzLm9uUmVuZGVyZWREYXRhQ2hhbmdlKSB0aGlzLm9uUmVuZGVyZWREYXRhQ2hhbmdlLnVuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9UYWJsZURhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlU2VydmljZS5nZXRJbnN0YW5jZSh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyRGF0YVNvdXJjZUxpc3RlbmVycygpO1xuICAgIHRoaXMucmVnaXN0ZXJTb3J0TGlzdGVuZXIoKTtcblxuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyRGF0YVNvdXJjZUxpc3RlbmVycygpIHtcbiAgICB0aGlzLm9uUmVuZGVyZWREYXRhQ2hhbmdlID0gdGhpcy5kYXRhU291cmNlLm9uUmVuZGVyZWREYXRhQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnN0b3BFZGl0aW9uKCk7XG4gICAgICB0aGlzLmNoZWNrU2VsZWN0ZWRJdGVtRGF0YSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEV4cGFuZGVkUm93Q29udGFpbmVyQ2xhc3Mocm93SW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9UYWJsZUNvbXBvbmVudC5FWFBBTkRFRF9ST1dfQ09OVEFJTkVSX0NMQVNTICsgcm93SW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwYW5kYWJsZUl0ZW1zKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlSXRlbS5zZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIGV4cGFuZGFibGUgcm93LlxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVSb3dFeHBhbmRhYmxlKGl0ZW06IGFueSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0udG9nZ2xlKGl0ZW0pO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5nZXRWYWx1ZSgpLmZpbmRJbmRleCgocm93KSA9PiB0aGlzLmtleXNBcnJheS5ldmVyeShrZXkgPT4gcm93W2tleV0gPT09IGl0ZW1ba2V5XSkpO1xuXG4gICAgaWYgKHRoaXMucG9ydGFsSG9zdFtyb3dJbmRleF0pIHtcbiAgICAgIHRoaXMucG9ydGFsSG9zdFtyb3dJbmRleF0uZGV0YWNoKCk7XG4gICAgfVxuICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gdGhpcy5nZXRTdGF0ZUV4cGFuZChpdGVtKSA9PT0gJ2NvbGxhcHNlZCc7XG4gICAgY29uc3QgZXZlbnRUYWJsZVJvd0V4cGFuZGFibGVDaGFuZ2UgPSB0aGlzLmVtaXRUYWJsZVJvd0V4cGFuZGFibGVDaGFuZ2VFdmVudChpdGVtLCByb3dJbmRleCk7XG4gICAgaWYgKGlzQ29sbGFwc2VkKSB7XG4gICAgICB0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS5vbkNvbGxhcHNlZC5lbWl0KGV2ZW50VGFibGVSb3dFeHBhbmRhYmxlQ2hhbmdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuJyArIHRoaXMuZ2V0RXhwYW5kZWRSb3dDb250YWluZXJDbGFzcyhyb3dJbmRleCkpO1xuICAgICAgdGhpcy5wb3J0YWxIb3N0W3Jvd0luZGV4XSA9IG5ldyBEb21Qb3J0YWxPdXRsZXQoXG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuYXBwUmVmLFxuICAgICAgICB0aGlzLmluamVjdG9yXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZVBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS50ZW1wbGF0ZVJlZiwgdGhpcy5fdmlld0NvbnRhaW5lclJlZiwgeyAkaW1wbGljaXQ6IGl0ZW0gfSk7XG4gICAgICB0aGlzLnBvcnRhbEhvc3Rbcm93SW5kZXhdLmF0dGFjaFRlbXBsYXRlUG9ydGFsKHRlbXBsYXRlUG9ydGFsKTtcbiAgICAgIHRoaXMudGFibGVSb3dFeHBhbmRhYmxlLm9uRXhwYW5kZWQuZW1pdChldmVudFRhYmxlUm93RXhwYW5kYWJsZUNoYW5nZSk7XG4gICAgfVxuXG4gIH1cblxuICBzYXZlUm93RXhwYW5kU3RhdGUoYWRkZWQ6IGFueVtdLCByZW1vdmVkOiBhbnlbXSkge1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUuZXhwYW5kYWJsZVJvd3MgPz8gW107XG5cbiAgICBjb25zdCBleHRyYWN0S2V5cyA9IChpdGVtOiBhbnkpID0+XG4gICAgICBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoaXRlbSkuZmlsdGVyKChba2V5XSkgPT4gdGhpcy5rZXlzQXJyYXkuaW5jbHVkZXMoa2V5KSkpO1xuXG4gICAgY29uc3QgaXNTYW1lUm93ID0gdGhpcy5jb21wYXJlUm93KCk7XG5cbiAgICAvLyBBZGQgZXhwYW5kYWJsZSBpdGVtc1xuICAgIGlmIChhZGRlZD8ubGVuZ3RoKSB7XG4gICAgICBhZGRlZC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuZ2V0VmFsdWUoKS5maW5kSW5kZXgocm93ID0+IGlzU2FtZVJvdyhyb3csIGl0ZW0pKTtcbiAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IHN0YXRlLnNvbWUoc3RhdGVJdGVtID0+IGlzU2FtZVJvdyhzdGF0ZUl0ZW0ua2V5cywgaXRlbSkpO1xuXG4gICAgICAgIGlmIChyb3dJbmRleCAhPT0gLTEgJiYgIWFscmVhZHlFeGlzdHMpIHtcbiAgICAgICAgICBzdGF0ZS5wdXNoKHsga2V5czogZXh0cmFjdEtleXMoaXRlbSkgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBleHBhbmRhYmxlIGl0ZW1zXG4gICAgaWYgKHJlbW92ZWQ/Lmxlbmd0aCkge1xuICAgICAgcmVtb3ZlZC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBpbmRleFRvUmVtb3ZlID0gc3RhdGUuZmluZEluZGV4KHN0YXRlSXRlbSA9PiBpc1NhbWVSb3coc3RhdGVJdGVtLmtleXMsIGl0ZW0pKTtcbiAgICAgICAgaWYgKGluZGV4VG9SZW1vdmUgIT09IC0xKSB7XG4gICAgICAgICAgc3RhdGUuc3BsaWNlKGluZGV4VG9SZW1vdmUsIDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlLmV4cGFuZGFibGVSb3dzID0gc3RhdGU7XG4gIH1cblxuICBkZXN0cm95QWxsUG9ydGFsSG9zdHMoKTogdm9pZCB7XG4gICAgdGhpcy5wb3J0YWxIb3N0LmZvckVhY2goaG9zdCA9PiB7XG4gICAgICBpZiAoaG9zdC5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICAgIGhvc3QuZGV0YWNoKCk7ICAgLy8gRGV0YWNoIHRoZSBwb3J0YWwgY29udGVudFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgcm93IGV4cGFuZGFibGUgYnkgcm93IGluZGV4XG4gICAqIEBwYXJhbSByb3dJbmRleFxuICAgKiBAcGFyYW0gW2V2ZW50XVxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVJvd0V4cGFuZGFibGVCeVJvd0luZGV4KHJvd0luZGV4OiBudW1iZXIsIGV2ZW50PzogRXZlbnQpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRWYWx1ZSgpW3Jvd0luZGV4XTtcbiAgICB0aGlzLnRvZ2dsZVJvd0V4cGFuZGFibGUoaXRlbSwgZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VGFibGVSb3dFeHBhbmRhYmxlQ2hhbmdlRXZlbnQoZGF0YSwgcm93SW5kZXgpIHtcbiAgICBjb25zdCBldmVudCA9IG5ldyBPVGFibGVSb3dFeHBhbmRlZENoYW5nZSgpO1xuICAgIGV2ZW50LnJvd0luZGV4ID0gcm93SW5kZXg7XG4gICAgZXZlbnQuZGF0YSA9IGRhdGE7XG5cbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgaXNFeHBhbmRlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlSXRlbS5pc1NlbGVjdGVkKGRhdGEpO1xuICB9XG5cbiAgcHVibGljIGdldFN0YXRlRXhwYW5kKHJvdykge1xuICAgIHJldHVybiB0aGlzLmlzRXhwYW5kZWQocm93KSA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJztcbiAgfVxuXG4gIHB1YmxpYyBpc0NvbHVtbkV4cGFuZGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChVdGlsLmlzRGVmaW5lZCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSkgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5fb1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uKSkgPyB0aGlzLl9vVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4udmlzaWJsZSA6IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGhhc0V4cGFuZGVkUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSk7XG4gIH1cblxuICBwdWJsaWMgaGFzSW5zZXJ0YWJsZVJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROdW1WaXNpYmxlQ29sdW1ucygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIG1hbmFnZXMgdGhlIGNhbGwgdG8gdGhlIHNlcnZpY2VcbiAgICogQHBhcmFtIGZpbHRlclxuICAgKiBAcGFyYW0gb3ZyckFyZ3NcbiAgICovXG4gIHF1ZXJ5RGF0YShmaWx0ZXI/OiBhbnksIG92cnJBcmdzPzogT1F1ZXJ5RGF0YUFyZ3MpIHtcbiAgICAvLyBJZiB0YWIgZXhpc3RzIGFuZCBpcyBub3QgYWN0aXZlIHRoZW4gd2FpdCBmb3IgcXVlcnlEYXRhXG4gICAgaWYgKHRoaXMuaXNJbnNpZGVJbmFjdGl2ZVRhYigpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdRdWVyeSA9IHRydWU7XG4gICAgICB0aGlzLnBlbmRpbmdRdWVyeUZpbHRlciA9IGZpbHRlcjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nUXVlcnkgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdRdWVyeUZpbHRlciA9IHVuZGVmaW5lZDtcblxuICAgIHRoaXMucXVlcnlDZWxsUmVuZGVyZXJzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIHBvcnRhbCBob3N0cyBiZWZvcmUgcmUtcmVuZGVyaW5nIHRvIHByZXZlbnQgZHVwbGljYXRlIG9yIG9ycGhhbmVkIGNvbXBvbmVudHNcbiAgICAgIHRoaXMuZGVzdHJveUFsbFBvcnRhbEhvc3RzKCk7XG4gICAgICBzdXBlci5xdWVyeURhdGEoZmlsdGVyLCBvdnJyQXJncyk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNJbnNpZGVJbmFjdGl2ZVRhYigpOiBib29sZWFuIHtcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudGFiQ29udGFpbmVyICYmIHRoaXMudGFiR3JvdXBDb250YWluZXIpIHtcbiAgICAgIHJlc3VsdCA9ICEodGhpcy50YWJDb250YWluZXIuaXNBY3RpdmUgfHwgKHRoaXMudGFiR3JvdXBDb250YWluZXIuc2VsZWN0ZWRJbmRleCA9PT0gdGhpcy50YWJDb250YWluZXIucG9zaXRpb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldENvbXBvbmVudEZpbHRlcihleGlzdGluZ0ZpbHRlcjogYW55ID0ge30pOiBhbnkge1xuICAgIGxldCBmaWx0ZXIgPSBleGlzdGluZ0ZpbHRlcjtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBwYXJlbnRJdGVtRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Gcm9tT2JqZWN0KGZpbHRlcik7XG4gICAgICAgIGZpbHRlciA9IHt9O1xuICAgICAgICBmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0gPSBwYXJlbnRJdGVtRXhwcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJlQ29sRmlsdGVyID0gdGhpcy5nZXRDb2x1bW5GaWx0ZXJzRXhwcmVzc2lvbigpO1xuICAgICAgLy8gQWRkIGNvbHVtbiBmaWx0ZXJzIGJhc2ljIGV4cHJlc3Npb24gdG8gY3VycmVudCBmaWx0ZXJcbiAgICAgIGlmIChiZUNvbEZpbHRlciAmJiAhVXRpbC5pc0RlZmluZWQoZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5GSUxURVJfRVhQUkVTU0lPTl9LRVldKSkge1xuICAgICAgICBmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0gPSBiZUNvbEZpbHRlcjtcbiAgICAgIH0gZWxzZSBpZiAoYmVDb2xGaWx0ZXIpIHtcbiAgICAgICAgZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5GSUxURVJfRVhQUkVTU0lPTl9LRVldID1cbiAgICAgICAgICBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRDb21wbGV4RXhwcmVzc2lvbihmaWx0ZXJbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0sIGJlQ29sRmlsdGVyLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZ2V0Q29tcG9uZW50RmlsdGVyKGZpbHRlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UXVpY2tGaWx0ZXJFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24ge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50KSAmJiB0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5maWx0ZXJFeHByZXNzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0Q29sdW1uRmlsdGVyc0V4cHJlc3Npb24oKTogRXhwcmVzc2lvbiB7XG4gICAgLy8gQXBwbHkgY29sdW1uIGZpbHRlcnNcbiAgICBjb25zdCBjb2x1bW5GaWx0ZXJzOiBPQ29sdW1uVmFsdWVGaWx0ZXJbXSA9IHRoaXMuZGF0YVNvdXJjZS5nZXRDb2x1bW5WYWx1ZUZpbHRlcnMoKTtcbiAgICBjb25zdCBiZUNvbHVtbkZpbHRlcnM6IEFycmF5PEV4cHJlc3Npb24+ID0gW107XG4gICAgY29sdW1uRmlsdGVycy5mb3JFYWNoKGNvbEZpbHRlciA9PiB7XG4gICAgICAvLyBQcmVwYXJlIGJhc2ljIGV4cHJlc3Npb25zXG4gICAgICBzd2l0Y2ggKGNvbEZpbHRlci5vcGVyYXRvcikge1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuSU46XG4gICAgICAgICAgaWYgKFV0aWwuaXNBcnJheShjb2xGaWx0ZXIudmFsdWVzKSkge1xuICAgICAgICAgICAgY29uc3QgYmVzSW46IEFycmF5PEV4cHJlc3Npb24+ID0gY29sRmlsdGVyLnZhbHVlcy5tYXAodmFsdWUgPT4gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkVxdWFscyhjb2xGaWx0ZXIuYXR0ciwgdmFsdWUpKTtcbiAgICAgICAgICAgIGxldCBiZUluOiBFeHByZXNzaW9uID0gYmVzSW4ucG9wKCk7XG4gICAgICAgICAgICBiZXNJbi5mb3JFYWNoKGJlID0+IHtcbiAgICAgICAgICAgICAgYmVJbiA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZENvbXBsZXhFeHByZXNzaW9uKGJlSW4sIGJlLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfT1IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBiZUNvbHVtbkZpbHRlcnMucHVzaChiZUluKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5CRVRXRUVOOlxuICAgICAgICAgIGlmIChVdGlsLmlzQXJyYXkoY29sRmlsdGVyLnZhbHVlcykgJiYgY29sRmlsdGVyLnZhbHVlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlRnJvbSA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Nb3JlRXF1YWwoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXNbMF0pO1xuICAgICAgICAgICAgY29uc3QgYmVUbyA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25MZXNzRXF1YWwoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXNbMV0pO1xuICAgICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24oYmVGcm9tLCBiZVRvLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuRVFVQUw6XG4gICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkxpa2UoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXMpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkxFU1NfRVFVQUw6XG4gICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbkxlc3NFcXVhbChjb2xGaWx0ZXIuYXR0ciwgY29sRmlsdGVyLnZhbHVlcykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuTU9SRV9FUVVBTDpcbiAgICAgICAgICBiZUNvbHVtbkZpbHRlcnMucHVzaChGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRFeHByZXNzaW9uTW9yZUVxdWFsKGNvbEZpbHRlci5hdHRyLCBjb2xGaWx0ZXIudmFsdWVzKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICAvLyBCdWlsZCBjb21wbGV0ZSBjb2x1bW4gZmlsdGVycyBiYXNpYyBleHByZXNzaW9uXG4gICAgbGV0IGJlQ29sRmlsdGVyOiBFeHByZXNzaW9uID0gYmVDb2x1bW5GaWx0ZXJzLnBvcCgpO1xuICAgIGJlQ29sdW1uRmlsdGVycy5mb3JFYWNoKGJlID0+IHtcbiAgICAgIGJlQ29sRmlsdGVyID0gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24oYmVDb2xGaWx0ZXIsIGJlLCBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfQU5EKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYmVDb2xGaWx0ZXI7XG4gIH1cblxuICB1cGRhdGVQYWdpbmF0aW9uSW5mbyhxdWVyeVJlczogU2VydmljZVJlc3BvbnNlKSB7XG4gICAgc3VwZXIudXBkYXRlUGFnaW5hdGlvbkluZm8ocXVlcnlSZXMpO1xuICB9XG5cbiAgaW5pdFZpZXdQb3J0KGRhdGE6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0ICYmIGRhdGEpIHtcbiAgICAgIGNvbnN0IGhlYWRlckVsUmVmID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoaGVhZGVyU2VsZWN0b3IpO1xuICAgICAgY29uc3QgZm9vdGVyRWxSZWYgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcihmb290ZXJTZWxlY3Rvcik7XG4gICAgICBjb25zdCByb3dFbFJlZiA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHJvd1NlbGVjdG9yKTtcblxuICAgICAgY29uc3QgaGVhZGVySGVpZ2h0ID0gaGVhZGVyRWxSZWYgPyBoZWFkZXJFbFJlZi5vZmZzZXRIZWlnaHQgOiAwO1xuICAgICAgY29uc3QgZm9vdGVySGVpZ2h0ID0gZm9vdGVyRWxSZWYgPyBmb290ZXJFbFJlZi5vZmZzZXRIZWlnaHQgOiAwO1xuICAgICAgY29uc3Qgcm93SGVpZ2h0ID0gcm93RWxSZWYgPyByb3dFbFJlZi5vZmZzZXRIZWlnaHQgOiBPVGFibGVDb21wb25lbnQuREVGQVVMVF9ST1dfSEVJR0hUO1xuXG4gICAgICAvLyBzZXQgY29uZmlnIHZpZXdwb3J0XG4gICAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LnNldENvbmZpZyhyb3dIZWlnaHQsIGhlYWRlckhlaWdodCwgZm9vdGVySGVpZ2h0KTtcbiAgICAgIGlmICh0aGlzLnByZXZpb3VzUmVuZGVyZXJEYXRhICE9PSB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kuZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXREYXRhKGRhdGE6IGFueSwgc3FsVHlwZXM6IGFueSkge1xuICAgIC8qIFRoaXMgY29kZSBpcyBub3QgcHV0IGluIHRoZSBzdXBlciBtZXRob2QgYmVjYXVzZSBpdCBpcyBub3QgY2FsbGVkIGZyb20gdGhlIGNsYXNzIGl0c2VsZiAqL1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXkgJiYgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2U/LnJlaW5pdGlhbGl6ZVBhZ2luYXRpb25Db250ZXh0KHRoaXMucXVlcnlSb3dzKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhb1RhYmxlLnNxbFR5cGVzQ2hhbmdlLm5leHQoc3FsVHlwZXMpO1xuICAgIHRoaXMuZGFvVGFibGUuc2V0RGF0YUFycmF5KGRhdGEpO1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLm9uUGFnaW5hdGVkRGF0YUxvYWRlZCwgZGF0YSk7XG4gICAgfVxuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25EYXRhTG9hZGVkLCB0aGlzLmRhb1RhYmxlLmRhdGEpO1xuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRWaWV3UG9ydChkYXRhKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjYW5TZXRTdGF0aWNEYXRhKHN0YXRpY0RhdGEpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIuY2FuU2V0U3RhdGljRGF0YShzdGF0aWNEYXRhKSAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLmRhb1RhYmxlKTtcbiAgfVxuXG4gIHNob3dEaWFsb2dFcnJvcihlcnJvcjogc3RyaW5nLCBlcnJvck9wdGlvbmFsPzogc3RyaW5nKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGVycm9yKSAmJiAhVXRpbC5pc09iamVjdChlcnJvcikpIHtcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCBlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCBlcnJvck9wdGlvbmFsKTtcbiAgICB9XG4gIH1cblxuICBwcm9qZWN0Q29udGVudENoYW5nZWQoKSB7XG4gICAgY29uc3QgZGF0YUNoYW5nZWQgPSB0aGlzLnByZXZpb3VzUmVuZGVyZXJEYXRhICE9PSB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhO1xuXG4gICAgaWYgKGRhdGFDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnByZXZpb3VzUmVuZGVyZXJEYXRhID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YTtcblxuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkNvbnRlbnRDaGFuZ2UsIHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLnNlbGVjdGlvbiAmJiB0aGlzLmRhdGFTb3VyY2U/LnJlbmRlcmVkRGF0YT8ubGVuZ3RoID4gMCAmJiB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RlZEl0ZW1EYXRhKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVmcmVzaEV4cGFuZGFibGVSb3dTdGF0ZSkge1xuICAgICAgdGhpcy5yZWZyZXNoRXhwYW5kYWJsZVJvd1N0YXRlID0gZmFsc2U7XG4gICAgICBjb25zdCBzZWxlY3Rpb25JdGVtcyA9IHRoaXMuc3RhdGUuZXhwYW5kYWJsZVJvd3M/LnNsaWNlKCkgfHwgW11cbiAgICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0/LmNsZWFyKCk7XG4gICAgICB0aGlzLnN0YXRlLmV4cGFuZGFibGVSb3dzID0gc2VsZWN0aW9uSXRlbXM7XG4gICAgICB0aGlzLnJlc3RvcmVFeHBhbmRhYmxlUm93U3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICByZXN0b3JlRXhwYW5kYWJsZVJvd1N0YXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRhYmxlUm93RXhwYW5kYWJsZSAmJiB0aGlzLnN0YXRlPy5leHBhbmRhYmxlUm93cykge1xuICAgICAgdGhpcy5zdGF0ZS5leHBhbmRhYmxlUm93cy5mb3JFYWNoKGV4cGFuZGFibGVSb3cgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRSZW5kZXJlZFZhbHVlKCk7O1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICBjb25zdCByb3dJbmRleCA9IGRhdGEuZmluZEluZGV4KChyb3cpID0+IHRoaXMua2V5c0FycmF5LmV2ZXJ5KGtleSA9PiByb3dba2V5XSA9PT0gZXhwYW5kYWJsZVJvdy5rZXlzW2tleV0pKTtcbiAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiByb3dJbmRleCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVSb3dFeHBhbmRhYmxlKGRhdGFbcm93SW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEF0dHJpYnV0ZXNWYWx1ZXNUb1F1ZXJ5KCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBzdXBlci5nZXRBdHRyaWJ1dGVzVmFsdWVzVG9RdWVyeSgpO1xuICAgIGlmICh0aGlzLmF2b2lkUXVlcnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAobGV0IGkgPSBjb2x1bW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbnNbaV07XG4gICAgICAgIGlmICh0aGlzLmF2b2lkUXVlcnlDb2x1bW5zLmluZGV4T2YoY29sKSAhPT0gLTEpIHtcbiAgICAgICAgICBjb2x1bW5zLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIGdldFF1ZXJ5QXJndW1lbnRzKGZpbHRlcjogb2JqZWN0LCBvdnJyQXJncz86IE9RdWVyeURhdGFBcmdzKTogT1F1ZXJ5UGFyYW1zIHtcbiAgICBjb25zdCBxdWVyeUFyZ3VtZW50cyA9IHN1cGVyLmdldFF1ZXJ5QXJndW1lbnRzKGZpbHRlciwgb3ZyckFyZ3MpO1xuICAgIHF1ZXJ5QXJndW1lbnRzLnNxbFR5cGVzID0ge1xuICAgICAgLi4udGhpcy5nZXRTcWxUeXBlc0ZvckZpbHRlcihxdWVyeUFyZ3VtZW50cy5jb2x1bW5zKSxcbiAgICAgIC4uLm92cnJBcmdzID8gb3ZyckFyZ3Muc3FsdHlwZXMgfHwge30gOiB7fVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgcXVlcnlBcmd1bWVudHMuc29ydCA9IHRoaXMuc29ydENvbEFycmF5O1xuICAgICAgaWYgKHRoaXMucGFnaW5hdG9yLmlzU2hvd2luZ0FsbFJvd3Mob3ZyckFyZ3M/Lm9mZnNldCkgJiYgdGhpcy5zdGF0ZT8udG90YWxRdWVyeVJlY29yZHNOdW1iZXIpIHtcbiAgICAgICAgcXVlcnlBcmd1bWVudHMub3ZyckFyZ3MubGVuZ3RoID0gdGhpcy5zdGF0ZS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5QXJndW1lbnRzO1xuICB9XG5cbiAgZ2V0U3FsVHlwZXNGb3JGaWx0ZXIoZmlsdGVyKTogb2JqZWN0IHtcbiAgICBjb25zdCBhbGxTcWxUeXBlcyA9IHRoaXMuZ2V0U3FsVHlwZXMoKTtcbiAgICBjb25zdCBzcWxUeXBlcyA9IHt9O1xuICAgIGlmICghVXRpbC5pc09iamVjdEVtcHR5KGZpbHRlcikpIHtcbiAgICAgIE9iamVjdC5rZXlzKGFsbFNxbFR5cGVzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIuaW5kZXhPZihrZXkpICE9PSAtMSAmJiBhbGxTcWxUeXBlc1trZXldICE9PSBTUUxUeXBlcy5PVEhFUikge1xuICAgICAgICAgIHNxbFR5cGVzW2tleV0gPSBhbGxTcWxUeXBlc1trZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNxbFR5cGVzO1xuICB9XG5cbiAgb25FeHBvcnRCdXR0b25DbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vbkV4cG9ydEJ1dHRvbkNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZUNvbHVtbnNWaXNpYmlsaXR5Q2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25DaGFuZ2VDb2x1bW5zVmlzaWJpbGl0eUNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBvbk1hdFRhYmxlQ29udGVudENoYW5nZWQoKSB7XG4gICAgLy9cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBuYXZpZ2F0aW9uIHRvIG5ldyBpdGVtIGluc2VydGlvblxuICAgKi9cbiAgYWRkKCkge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICBpZiAodGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNoZWNrRW5hYmxlZEFjdGlvblBlcm1pc3Npb24oUGVybWlzc2lvbnNVdGlscy5BQ1RJT05fSU5TRVJUKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5pbnNlcnREZXRhaWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHNlbGVjdGVkIHJvd3NcbiAgICogQHBhcmFtIFtjbGVhclNlbGVjdGVkSXRlbXNdXG4gICAqL1xuICByZW1vdmUoY2xlYXJTZWxlY3RlZEl0ZW1zOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgaWYgKHRoaXMuc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHkpIHtcbiAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX0RFTEVURSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xuICAgIGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGlhbG9nU2VydmljZS5jb25maXJtKCdDT05GSVJNJywgJ01FU1NBR0VTLkNPTkZJUk1fREVMRVRFJykudGhlbihyZXMgPT4ge1xuICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSkge1xuICAgICAgICBpZiAodGhpcy5kYXRhU2VydmljZSAmJiAodGhpcy5kZWxldGVNZXRob2QgaW4gdGhpcy5kYXRhU2VydmljZSkgJiYgdGhpcy5lbnRpdHkgJiYgKHRoaXMua2V5c0FycmF5Lmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVycyA9IFNlcnZpY2VVdGlscy5nZXRBcnJheVByb3BlcnRpZXMoc2VsZWN0ZWRJdGVtcywgdGhpcy5rZXlzQXJyYXkpO1xuICAgICAgICAgIGNvbnN0IHNxbFR5cGVzQXJnID0gdGhpcy5nZXRTcWxUeXBlc09mS2V5cygpO1xuICAgICAgICAgIHRoaXMubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgICB0aGlzLmRhb1RhYmxlLnJlbW92ZVF1ZXJ5KGZpbHRlcnMsIHNxbFR5cGVzQXJnKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5leHQ6ICh2KSA9PiB7XG4gICAgICAgICAgICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vblJvd0RlbGV0ZWQsIHNlbGVjdGVkSXRlbXMpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBlcnJvcjogKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dEaWFsb2dFcnJvcihlLCAnTUVTU0FHRVMuRVJST1JfREVMRVRFJyk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRW5zdXJpbmcgdGhhdCB0aGUgZGVsZXRlZCBpdGVtcyB3aWxsIG5vdCBsb25nZXIgYmUgcGFydCBvZiB0aGUgc2VsZWN0aW9uTW9kZWxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdChpdGVtKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtTGF5b3V0TWFuYWdlcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtTGF5b3V0TWFuYWdlci5jbG9zZURldGFpbHMoZmlsdGVycywgeyBleGl0V2l0aG91dENvbmZpcm1hdGlvbjogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWREYXRhKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kZWxldGVMb2NhbEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2xlYXJTZWxlY3RlZEl0ZW1zKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hzIHRhYmxlIGNvbXBvbmVudFxuICAgKi9cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLnJlbG9hZERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhbmQgc2VsZWN0IGFsbCBjaGVja2JveFxuICAgKi9cbiAgc2hvd0FuZFNlbGVjdEFsbENoZWNrYm94KCkge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uTW9kZU11bHRpcGxlKCkpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdEFsbENoZWNrYm94KSB7XG4gICAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplQ2hlY2tib3hDb2x1bW4oKTtcbiAgICAgIHRoaXMuc2VsZWN0QWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkUGFnaW5hdGVkRGF0YUZyb21TdGFydChjbGVhclNlbGVjdGVkSXRlbXM6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIC8vIEluaXRpYWxpemUgcGFnZSBpbmRleFxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDA7XG4gICAgICB0aGlzLnJlbG9hZERhdGEoY2xlYXJTZWxlY3RlZEl0ZW1zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkcyBkYXRhXG4gICAqL1xuICByZWxvYWREYXRhKGNsZWFyU2VsZWN0ZWRJdGVtczogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5yZWxvYWREYXRhV2l0aENsZWFyRXhwYW5kYWJsZVJvd3MoY2xlYXJTZWxlY3RlZEl0ZW1zLCBjbGVhclNlbGVjdGVkSXRlbXMpXG4gIH1cblxuICByZWxvYWREYXRhV2l0aENsZWFyRXhwYW5kYWJsZVJvd3MoY2xlYXJTZWxlY3RlZEl0ZW1zOiBib29sZWFuID0gdHJ1ZSwgY2xlYXJFeHBhbmRhYmxlSXRlbXM6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrRW5hYmxlZEFjdGlvblBlcm1pc3Npb24oUGVybWlzc2lvbnNVdGlscy5BQ1RJT05fUkVGUkVTSCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJsZVJvd0V4cGFuZGFibGUpIHtcbiAgICAgIGlmIChjbGVhckV4cGFuZGFibGVJdGVtcykge1xuICAgICAgICB0aGlzLmV4cGFuZGFibGVJdGVtPy5jbGVhcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoRXhwYW5kYWJsZVJvd1N0YXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbXBvbmVudFN0YXRlU2VydmljZS5yZWZyZXNoU2VsZWN0aW9uKCk7XG5cbiAgICBpZiAoY2xlYXJTZWxlY3RlZEl0ZW1zKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuZmluaXNoUXVlcnlTdWJzY3JpcHRpb24gPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdRdWVyeSA9IHRydWU7XG4gICAgbGV0IHF1ZXJ5QXJnczogT1F1ZXJ5RGF0YUFyZ3M7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIHF1ZXJ5QXJncyA9IHtcbiAgICAgICAgb2Zmc2V0OiB0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5xdWVyeVJvd3MsXG4gICAgICAgIGxlbmd0aDogdGhpcy5xdWVyeVJvd3NcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuc3RvcEVkaXRpb24oZmFsc2UpO1xuICAgIHRoaXMucXVlcnlEYXRhKHZvaWQgMCwgcXVlcnlBcmdzKTtcbiAgfVxuXG4gIGhhbmRsZUNsaWNrKHJvdzogYW55LCBjb2x1bW46IE9Db2x1bW4sIHJvd0luZGV4OiBudW1iZXIsIGNlbGxSZWY6IEVsZW1lbnRSZWYsIGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5jbGlja1N1YmplY3QubmV4dCh7IHJvdywgY29sdW1uLCBjZWxsUmVmLCByb3dJbmRleCwgZXZlbnQgfSk7XG4gIH1cblxuICBkb0hhbmRsZUNsaWNrKHJvdzogYW55LCBjb2x1bW46IHN0cmluZywgcm93SW5kZXg6IG51bWJlciwgJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIGlmICh0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5vZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5kZXRhaWxNb2RlID09PSBDb2Rlcy5ERVRBSUxfTU9ERV9DTElDSykpIHtcbiAgICAgIHRoaXMuaGFuZGxlRGV0YWlsTW9kZUNsaWNrKHJvdywgY29sdW1uLCByb3dJbmRleCwgJGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbXVsdGlwbGUgc2VsZWN0aW9uIChDdHJsL0NtZCBvciBTaGlmdClcbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbk1vZGVNdWx0aXBsZSgpKSB7XG4gICAgICBpZiAoJGV2ZW50LmN0cmxLZXkgfHwgJGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNdWx0aXBsZVNlbGVjdGlvbkN0cmwocm93LCBjb2x1bW4sIHJvd0luZGV4LCAkZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICgkZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNdWx0aXBsZVNlbGVjdGlvblNoaWZ0KHJvdywgY29sdW1uLCByb3dJbmRleCwgJGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3Rpb24gbW9kZXMgT1RIRVIgdGhhbiAnbm9uZSdcbiAgICBpZiAoIXRoaXMuaXNTZWxlY3Rpb25Nb2RlTm9uZSgpKSB7XG4gICAgICB0aGlzLmhhbmRsZU90aGVyU2VsZWN0aW9uTW9kZXMocm93KTtcblxuICAgIH1cbiAgICAvLyBFbWl0IG9uQ2xpY2sgZXZlbnQgZXZlbiB3aGVuIHNlbGVjdGlvbiBpcyBkaXNhYmxlZFxuICAgIHRoaXMub25DbGljay5lbWl0KHsgcm93OiByb3csIHJvd0luZGV4OiByb3dJbmRleCwgbW91c2VFdmVudDogJGV2ZW50LCBjb2x1bW5OYW1lOiBjb2x1bW4sIGNlbGw6IHJvd1tjb2x1bW5dIH0pO1xuXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU90aGVyU2VsZWN0aW9uTW9kZXMocm93OiBhbnkpIHtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XG4gICAgaWYgKHRoaXMuaXNSb3dTZWxlY3RlZChyb3cpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAxICYmIHRoaXMuZWRpdGlvbkVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uT25Sb3dDbGljaykge1xuICAgICAgdGhpcy50b2dnbGVSb3dTZWxlY3Rpb24ocm93KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURldGFpbE1vZGVDbGljayhyb3c6IGFueSwgY29sdW1uOiBzdHJpbmcsIHJvd0luZGV4OiBudW1iZXIsICRldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmlzTmF2aWdhdGluZykgcmV0dXJuO1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaXNOYXZpZ2F0aW5nID0gdHJ1ZTtcblxuICAgIHRoaXMub25DbGljay5lbWl0KHsgcm93OiByb3csIHJvd0luZGV4OiByb3dJbmRleCwgbW91c2VFdmVudDogJGV2ZW50LCBjb2x1bW5OYW1lOiBjb2x1bW4sIGNlbGw6IHJvd1tjb2x1bW5dIH0pO1xuICAgIHRoaXMuc2F2ZURhdGFOYXZpZ2F0aW9uSW5Mb2NhbFN0b3JhZ2UoKTtcbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5zZWxlY3RlZFJvdyhyb3cpO1xuICAgIHRoaXMudmlld0RldGFpbChyb3cpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNdWx0aXBsZVNlbGVjdGlvbkN0cmwocm93OiBhbnksIGNvbHVtbjogc3RyaW5nLCByb3dJbmRleDogbnVtYmVyLCAkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25PblJvd0NsaWNrKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93KHJvdyk7XG4gICAgfVxuICAgIHRoaXMub25DbGljay5lbWl0KHsgcm93OiByb3csIHJvd0luZGV4OiByb3dJbmRleCwgbW91c2VFdmVudDogJGV2ZW50LCBjb2x1bW5OYW1lOiBjb2x1bW4sIGNlbGw6IHJvd1tjb2x1bW5dIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNdWx0aXBsZVNlbGVjdGlvblNoaWZ0KHJvdzogYW55LCBjb2x1bW46IHN0cmluZywgcm93SW5kZXg6IG51bWJlciwgJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uT25Sb3dDbGljaykge1xuICAgICAgdGhpcy5oYW5kbGVNdWx0aXBsZVNlbGVjdGlvbihyb3cpO1xuICAgIH1cbiAgICB0aGlzLm9uQ2xpY2suZW1pdCh7IHJvdzogcm93LCByb3dJbmRleDogcm93SW5kZXgsIG1vdXNlRXZlbnQ6ICRldmVudCwgY29sdW1uTmFtZTogY29sdW1uLCBjZWxsOiByb3dbY29sdW1uXSB9KTtcbiAgfVxuXG4gIC8qKlxuICogSGFuZGxlcyBtdWx0aXBsZSBzZWxlY3Rpb24gd2l0aCBTaGlmdCBrZXkgKHJhbmdlIHNlbGVjdGlvbilcbiAqICovXG4gIGhhbmRsZU11bHRpcGxlU2VsZWN0aW9uKGl0ZW06IGFueSkge1xuICAgIC8vIEV4aXQgaWYgbXVsdGlwbGUgc2VsZWN0aW9uIG1vZGUgaXMgbm90IGVuYWJsZWRcbiAgICBpZiAoIXRoaXMuaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIHNlbGVjdGlvbiwgc2VsZWN0IHRoZSBjdXJyZW50IHJvd1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNdWx0aXBsZXNSb3dzKFtpdGVtXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHNlbGVjdGVkIHJvdyBhbmQgdGhlIGN1cnJlbnQgcm93XG4gICAgY29uc3QgZmlyc3QgPSB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhLmluZGV4T2YodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRbMF0pO1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhLmluZGV4T2YoaXRlbSk7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHJhbmdlIG9mIGluZGljZXMgdG8gc2VsZWN0XG4gICAgY29uc3QgaW5kZXhGcm9tID0gTWF0aC5taW4oZmlyc3QsIGxhc3QpO1xuICAgIGNvbnN0IGluZGV4VG8gPSBNYXRoLm1heChmaXJzdCwgbGFzdCk7XG5cblxuICAgIC8vIEdldCBhbGwgcm93cyB3aXRoaW4gdGhlIHNlbGVjdGVkIHJhbmdlXG4gICAgY29uc3Qgcm93c0luUmFuZ2UgPSB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhLnNsaWNlKGluZGV4RnJvbSwgaW5kZXhUbyArIDEpO1xuXG4gICAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZSBzZWxlY3Rpb24gZXZlbnRzIHdoaWxlIGNsZWFyaW5nXG4gICAgdGhpcy50cmlnZ2VyU2VsZWN0aW9uRXZlbnRzID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICB0aGlzLnRyaWdnZXJTZWxlY3Rpb25FdmVudHMgPSB0cnVlO1xuXG4gICAgLy8gU2VsZWN0IGFsbCB2YWxpZCByb3dzIHdpdGhpbiB0aGUgcmFuZ2VcbiAgICB0aGlzLnNlbGVjdGVkTXVsdGlwbGVzUm93cyhyb3dzSW5SYW5nZSk7XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBzYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpIHtcbiAgICBzdXBlci5zYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpO1xuICAgIHRoaXMuc3RvcmVQYWdpbmF0aW9uU3RhdGUgPSB0cnVlO1xuICB9XG5cbiAgaGFuZGxlRG91YmxlQ2xpY2socm93OiBhbnksIGNvbHVtbjogT0NvbHVtbiwgcm93SW5kZXg6IG51bWJlciwgY2VsbFJlZjogRWxlbWVudFJlZiwgZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmRibGNsaWNrU3ViamVjdC5uZXh0KHsgcm93LCBjb2x1bW4sIGNlbGxSZWYsIHJvd0luZGV4LCBldmVudCB9KTtcbiAgfVxuXG4gIGdldCBlZGl0aW9uRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnNvbWUoaXRlbSA9PiBpdGVtLmVkaXRpbmcpO1xuICB9XG5cbiAgaGFuZGxlRE9NQ2xpY2soZXZlbnQpIHtcbiAgICBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVkaXRpb25FbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3ZlcmxheUNvbnRhaW5lciA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY2RrLW92ZXJsYXktY29udGFpbmVyJylbMF07XG4gICAgaWYgKG92ZXJsYXlDb250YWluZXIgJiYgb3ZlcmxheUNvbnRhaW5lci5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVDb250YWluZXIgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm8tdGFibGUtY29udGFpbmVyJyk7XG4gICAgY29uc3QgdGFibGVDb250ZW50ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vLXRhYmxlLWNvbnRhaW5lciB0YWJsZS5tYXQtdGFibGUnKTtcbiAgICBpZiAodGFibGVDb250YWluZXIgJiYgdGFibGVDb250ZW50ICYmIHRhYmxlQ29udGFpbmVyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgIXRhYmxlQ29udGVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFjdGl2YXRlQ29sdW1uRWRpdGlvbihjb2x1bW46IE9Db2x1bW4sIHJvdzogYW55LCBjZWxsUmVmOiBhbnkpIHtcbiAgICBpZiAoY2VsbFJlZiAmJiBjb2x1bW4uZWRpdGluZyAmJiB0aGlzLmVkaXRpbmdDZWxsID09PSBjZWxsUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtblBlcm1pc3Npb25zOiBPUGVybWlzc2lvbnMgPSB0aGlzLmdldE9Db2x1bW5QZXJtaXNzaW9ucyhjb2x1bW4uYXR0cik7XG4gICAgaWYgKGNvbHVtblBlcm1pc3Npb25zLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYCR7Y29sdW1uLmF0dHJ9IGVkaXRpb24gbm90IGFsbG93ZWQgZHVlIHRvIHBlcm1pc3Npb25zYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jbGVhclNlbGVjdGlvbkFuZEVkaXRpbmcoKTtcbiAgICB0aGlzLnNlbGVjdGVkUm93KHJvdyk7XG4gICAgdGhpcy5lZGl0aW5nQ2VsbCA9IGNlbGxSZWY7XG4gICAgY29uc3Qgcm93RGF0YSA9IHt9O1xuICAgIHRoaXMua2V5c0FycmF5LmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgcm93RGF0YVtrZXldID0gcm93W2tleV07XG4gICAgfSk7XG4gICAgcm93RGF0YVtjb2x1bW4uYXR0cl0gPSByb3dbY29sdW1uLmF0dHJdO1xuICAgIHRoaXMuZWRpdGluZ1JvdyA9IHJvdztcbiAgICBjb2x1bW4uZWRpdGluZyA9IHRydWU7XG4gICAgY29sdW1uLmVkaXRvci5zdGFydEVkaXRpb24ocm93RGF0YSk7XG4gIH1cblxuICB1cGRhdGVDZWxsRGF0YShjb2x1bW46IE9Db2x1bW4sIGRhdGE6IGFueSwgc2F2ZUNoYW5nZXM6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9VUERBVEUpKSB7XG4gICAgICBjb25zdCByZXMgPSBuZXcgT2JzZXJ2YWJsZShpbm5lck9ic2VydmVyID0+IHtcbiAgICAgICAgaW5uZXJPYnNlcnZlci5lcnJvcigpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBjb2x1bW4uZWRpdGluZyA9IGZhbHNlO1xuICAgIGlmIChzYXZlQ2hhbmdlcyAmJiB0aGlzLmVkaXRpbmdSb3cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmVkaXRpbmdSb3csIGRhdGEpO1xuICAgIH1cbiAgICB0aGlzLnN0b3BFZGl0aW9uKCk7XG4gICAgaWYgKHNhdmVDaGFuZ2VzICYmIGNvbHVtbi5lZGl0b3IudXBkYXRlUmVjb3JkT25FZGl0KSB7XG4gICAgICBjb25zdCB0b1VwZGF0ZSA9IHt9O1xuICAgICAgdG9VcGRhdGVbY29sdW1uLmF0dHJdID0gZGF0YVtjb2x1bW4uYXR0cl07XG4gICAgICBjb25zdCBrdiA9IHRoaXMuZXh0cmFjdEtleXNGcm9tUmVjb3JkKGRhdGEpO1xuICAgICAgY29uc3QgdXBkYXRlT2JzZXJ2YWJsZSA9IHRoaXMudXBkYXRlUmVjb3JkKGt2LCB0b1VwZGF0ZSk7XG5cbiAgICAgIGlmICh1cGRhdGVPYnNlcnZhYmxlKSB7XG4gICAgICAgIHVwZGF0ZU9ic2VydmFibGUuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgc2Nyb2xsIHBvc2l0aW9uIEFGVEVSIHRoZSB1cGRhdGVcbiAgICAgICAgICAgIHRoaXMuc2F2ZVNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB1cGRhdGluZyBjZWxsOicsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZU9ic2VydmFibGU7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0S2V5c1ZhbHVlcygpOiBhbnlbXSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0QWxsVmFsdWVzKCk7XG4gICAgcmV0dXJuIGRhdGEubWFwKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgdGhpcy5rZXlzQXJyYXkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChyb3dba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSByb3dba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSk7XG4gIH1cblxuICBvblNob3dzU2VsZWN0cygpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25TaG93c1NlbGVjdHMoKTtcbiAgICB9XG4gIH1cblxuICBpbml0aWFsaXplQ2hlY2tib3hDb2x1bW4oKSB7XG4gICAgLy8gSW5pdGlhbGl6aW5nIHJvdyBzZWxlY3Rpb24gbGlzdGVuZXJcbiAgICBpZiAoIXRoaXMuc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uICYmICF0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkLnN1YnNjcmliZSgoc2VsZWN0aW9uRGF0YTogU2VsZWN0aW9uQ2hhbmdlPGFueT4pID0+IHtcbiAgICAgICAgaWYgKHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyAmJiBzZWxlY3Rpb25EYXRhKSB7XG4gICAgICAgICAgaWYgKHNlbGVjdGlvbkRhdGEuYWRkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vblJvd1NlbGVjdGVkLCBzZWxlY3Rpb25EYXRhLmFkZGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlbGVjdGlvbkRhdGEucmVtb3ZlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLm9uUm93RGVzZWxlY3RlZCwgc2VsZWN0aW9uRGF0YS5yZW1vdmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkNvbHVtblN0YXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU2VsZWN0aW9uQ29sdW1uU3RhdGUoKSB7XG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTm9uZSgpKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zICYmIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGVcbiAgICAgICYmIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnNbMF0gIT09IENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zICYmICF0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXG4gICAgICAmJiB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zWzBdID09PSBDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTdGF0ZUV4cGFuZGVkQ29sdW1uKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TnVtUm93U2VsZWN0ZWRJbkN1cnJlbnREYXRhKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2U/LnJlbmRlcmVkRGF0YSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhLmZpbHRlcih4ID0+ICF0aGlzLmlzRGlzYWJsZUNoZWNrYm94KHgpICYmIHRoaXMuaXNSb3dTZWxlY3RlZCh4KSlcbiAgICAgIC5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuZ2V0TnVtUm93U2VsZWN0ZWRJbkN1cnJlbnREYXRhKCk7XG4gICAgY29uc3QgbnVtU2VsZWN0YWJsZVJvd3MgPSB0aGlzLmRhdGFTb3VyY2U/LnJlbmRlcmVkRGF0YT8uZmlsdGVyKFxuICAgICAgcm93ID0+ICF0aGlzLmlzRGlzYWJsZUNoZWNrYm94KHJvdylcbiAgICApLmxlbmd0aCA/PyAwO1xuICAgIHJldHVybiBudW1TZWxlY3RlZCA+IDAgJiYgbnVtU2VsZWN0ZWQgPT09IG51bVNlbGVjdGFibGVSb3dzO1xuICB9XG5cbiAgcHVibGljIGlzSW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuZ2V0TnVtUm93U2VsZWN0ZWRJbkN1cnJlbnREYXRhKCk7XG4gICAgY29uc3QgbnVtU2VsZWN0YWJsZVJvd3MgPSB0aGlzLmRhdGFTb3VyY2U/LnJlbmRlcmVkRGF0YT8uZmlsdGVyKFxuICAgICAgcm93ID0+ICF0aGlzLmlzRGlzYWJsZUNoZWNrYm94KHJvdylcbiAgICApLmxlbmd0aCA/PyAwO1xuICAgIHJldHVybiBudW1TZWxlY3RlZCA+IDAgJiYgbnVtU2VsZWN0ZWQgPCBudW1TZWxlY3RhYmxlUm93cztcbiAgfVxuXG4gIHB1YmxpYyBtYXN0ZXJUb2dnbGUoZXZlbnQ6IE1hdENoZWNrYm94Q2hhbmdlKTogdm9pZCB7XG4gICAgZXZlbnQuY2hlY2tlZCA/IHRoaXMuc2VsZWN0QWxsKCkgOiB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRNdWx0aXBsZXNSb3dzKHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdGlvbkNoZWNrYm94VG9nZ2xlKGV2ZW50OiBNYXRDaGVja2JveENoYW5nZSwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3cpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdGVkUm93KHJvdzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblNlbGVjdFJvdyhyb3cpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRNdWx0aXBsZXNSb3dzKFtyb3ddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gc2V0IG11bHRpcGxlIGl0ZW1zIGFzIHNlbGVjdGVkXG4gICAqIFRyaWdnZXJzIG9ubHkgT05FIGV2ZW50IHdpdGggYWxsIGl0ZW1zXG4gICAqL1xuICBwcml2YXRlIHNldFNlbGVjdGVkTXVsdGlwbGUoaXRlbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTm9uZSgpIHx8ICFpdGVtcyB8fCBpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbiBzaW5nbGUgbW9kZSwgY2xlYXIgdGhlIHByZXZpb3VzIHNlbGVjdGlvblxuICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uTW9kZVNpbmdsZSgpICYmIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgIHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVGVtcG9yYXJpbHkgZGlzYWJsZSBldmVudHNcbiAgICB0aGlzLnRyaWdnZXJTZWxlY3Rpb25FdmVudHMgPSBmYWxzZTtcblxuICAgIC8vIFNlbGVjdCBhbGwgaXRlbXMgYXQgb25jZVxuICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi5pdGVtcyk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXRlXG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlLnNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkO1xuICAgIH1cblxuICAgIC8vIFJlLWVuYWJsZSBldmVudHNcbiAgICB0aGlzLnRyaWdnZXJTZWxlY3Rpb25FdmVudHMgPSB0cnVlO1xuXG5cbiAgICAvLyBFbWl0IGEgU0lOR0xFIGV2ZW50IHdpdGggYWxsIHNlbGVjdGVkIGl0ZW1zXG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vblJvd1NlbGVjdGVkLCBpdGVtcyk7XG4gIH1cblxuICAvKipcbiAgKiBTZWxlY3RzIG11bHRpcGxlIHJvd3MgYXQgb25jZSB3aXRoIHByb3BlciB2YWxpZGF0aW9uXG4gICogRW1pdHMgYSBzaW5nbGUgb25Sb3dTZWxlY3RlZCBldmVudCB3aXRoIGFsbCBzZWxlY3RlZCByb3dzXG4gICovXG4gIHB1YmxpYyBzZWxlY3RlZE11bHRpcGxlc1Jvd3Mocm93czogYW55W10pOiB2b2lkIHtcbiAgICBpZiAoIXJvd3MgfHwgcm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZFJvd3MgPSB0aGlzLmZpbHRlclZhbGlkUm93c0ZvclNlbGVjdGlvbihyb3dzKTtcbiAgICBpZiAodmFsaWRSb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2VsZWN0ZWRNdWx0aXBsZSh2YWxpZFJvd3MpO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnNlbGVjdGlvbikpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb24gPSBbXTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWQoaXRlbTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTm9uZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChpdGVtKSkge1xuICAgICAgaWYgKHRoaXMuaXNSb3dTZWxlY3RlZChpdGVtKSkge1xuICAgICAgICAvKipUaGUgc2VsZWN0ZWQgaXRlbSBpcyBjbGVhcmVkIGlmIHRoZSBpdGVtIGNoYW5nZXMgdmFsdWUqL1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcihpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRTZWxlY3RlZEJ5S2V5cyhrZXlWYWx1ZXM6IEFycmF5PGFueT4pIHtcbiAgICBjb25zdCByb3dzVG9TZWxlY3QgPSB0aGlzLmdldERhdGFBcnJheSgpLmZpbHRlcihyb3cgPT4ge1xuICAgICAgcmV0dXJuIGtleVZhbHVlcy5maW5kSW5kZXgoa2V5VmFsdWUgPT4gcm93W3RoaXMua2V5c10gPT09IGtleVZhbHVlKSA+IC0xO1xuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi5yb3dzVG9TZWxlY3QpO1xuICB9XG5cbiAgc2V0U2VsZWN0ZWRCeU11bHRpcGxlS2V5cyhrZXlWYWx1ZXM6IEFycmF5PE9iamVjdD4pIHtcbiAgICBjb25zdCByb3dzVG9TZWxlY3QgPSB0aGlzLmdldERhdGFBcnJheSgpLmZpbHRlcihyb3cgPT4ge1xuICAgICAgcmV0dXJuIGtleVZhbHVlcy5maW5kSW5kZXgoa2V5VmFsdWUgPT5cbiAgICAgICAgT2JqZWN0LmtleXMoa2V5VmFsdWUpLmV2ZXJ5KGtleSA9PiBrZXlWYWx1ZVtrZXldID09PSByb3dba2V5XSlcbiAgICAgICkgPiAtMTtcbiAgICB9KTtcbiAgICByb3dzVG9TZWxlY3QuZXZlcnkocm93VG9TZWxlY3QgPT4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvd1RvU2VsZWN0KSk7XG4gIH1cblxuICBzZXRTZWxlY3RlZEJ5Um93SWRzKHJvd0lkczogQXJyYXk8bnVtYmVyPikge1xuICAgIHJvd0lkcy5mb3JFYWNoKHJvd0lkID0+IHRoaXMuc2VsZWN0ZWRSb3codGhpcy5nZXREYXRhQXJyYXkoKVtyb3dJZF0pKTtcbiAgfVxuXG4gIGdldCBzaG93RGVsZXRlQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUJ1dHRvbjtcbiAgfVxuXG4gIHByaXZhdGUgY2FuU2VsZWN0Um93KHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChyb3cpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTm9uZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlQ2hlY2tib3gocm93KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJWYWxpZFJvd3NGb3JTZWxlY3Rpb24ocm93czogYW55W10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKHJvdyA9PiB0aGlzLmNhblNlbGVjdFJvdyhyb3cpKTtcbiAgfVxuXG5cbiAgZ2V0VHJhY2tCeUZ1bmN0aW9uKCk6IChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpID0+IHN0cmluZyB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICByZXR1cm4gKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkgPT4ge1xuXG4gICAgICBsZXQgaXRlbUlkOiBzdHJpbmcgPSAnJztcblxuICAgICAgaWYgKHRoaXMuaXNHcm91cChpbmRleCwgaXRlbSkpIHtcbiAgICAgICAgaXRlbUlkICs9IGl0ZW0uY29sdW1uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qga2V5c0xlbmdodCA9IHNlbGYua2V5c0FycmF5Lmxlbmd0aDtcbiAgICAgICAgc2VsZi5rZXlzQXJyYXkuZm9yRWFjaCgoa2V5OiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3VmZml4ID0gaWR4IDwgKGtleXNMZW5naHQgLSAxKSA/ICc7JyA6ICcnO1xuICAgICAgICAgIGl0ZW1JZCArPSBpdGVtW2tleV0gKyBzdWZmaXg7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoYXNBc3luY0FuZFZpc2libGVDb2xzID0gdGhpcy5hc3luY0xvYWRDb2x1bW5zLnNvbWUoYyA9PiB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLmluY2x1ZGVzKGMpKTtcbiAgICAgIGlmIChzZWxmLmFzeW5jTG9hZENvbHVtbnMubGVuZ3RoICYmIGhhc0FzeW5jQW5kVmlzaWJsZUNvbHMgJiYgIXNlbGYuZmluaXNoUXVlcnlTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgc2VsZi5xdWVyeVJvd0FzeW5jRGF0YShpbmRleCwgaXRlbSk7XG4gICAgICAgIGlmIChzZWxmLnBhZ2luYXRvciAmJiBpbmRleCA9PT0gKHNlbGYucGFnaW5hdG9yLnBhZ2VTaXplIC0gMSkpIHtcbiAgICAgICAgICBzZWxmLmZpbmlzaFF1ZXJ5U3Vic2NyaXB0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbUlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1JZDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcXVlcnlSb3dBc3luY0RhdGEocm93SW5kZXg6IG51bWJlciwgcm93RGF0YTogYW55KSB7XG4gICAgY29uc3Qga3YgPSBTZXJ2aWNlVXRpbHMuZ2V0T2JqZWN0UHJvcGVydGllcyhyb3dEYXRhLCB0aGlzLmtleXNBcnJheSk7XG4gICAgLy8gUmVwZWF0aW5nIGNoZWNraW5nIG9mIHZpc2libGUgY29sdW1uXG4gICAgY29uc3QgYXYgPSB0aGlzLmFzeW5jTG9hZENvbHVtbnMuZmlsdGVyKGMgPT4gdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5pbmRleE9mKGMpICE9PSAtMSk7XG4gICAgaWYgKGF2Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gU2tpcHBpbmcgcXVlcnkgaWYgdGhlcmUgYXJlIG5vdCB2aXNpYmxlIGFzeW5jcm9uIGNvbHVtbnNcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uUXVlcnlBcmdzID0gW2t2LCBhdiwgdGhpcy5lbnRpdHksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gICAgY29uc3QgcXVlcnlNZXRob2ROYW1lID0gdGhpcy5wYWdlYWJsZSA/IHRoaXMucGFnaW5hdGVkUXVlcnlNZXRob2QgOiB0aGlzLnF1ZXJ5TWV0aG9kO1xuICAgIGlmICh0aGlzLmRhdGFTZXJ2aWNlICYmIChxdWVyeU1ldGhvZE5hbWUgaW4gdGhpcy5kYXRhU2VydmljZSkgJiYgdGhpcy5lbnRpdHkpIHtcbiAgICAgIGlmICh0aGlzLmFzeW5jTG9hZFN1YnNjcmlwdGlvbnNbcm93SW5kZXhdKSB7XG4gICAgICAgIHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9uc1tyb3dJbmRleF0udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9uc1tyb3dJbmRleF0gPSB0aGlzLmRhdGFTZXJ2aWNlW3F1ZXJ5TWV0aG9kTmFtZV0oLi4uY29sdW1uUXVlcnlBcmdzKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXM6IFNlcnZpY2VSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXMuaXNTdWNjZXNzZnVsKCkpIHtcbiAgICAgICAgICAgIGxldCBkYXRhO1xuICAgICAgICAgICAgaWYgKFV0aWwuaXNBcnJheShyZXMuZGF0YSkgJiYgcmVzLmRhdGEubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgIGRhdGEgPSByZXMuZGF0YVswXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoVXRpbC5pc09iamVjdChyZXMuZGF0YSkpIHtcbiAgICAgICAgICAgICAgZGF0YSA9IHJlcy5kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kYW9UYWJsZS5zZXRBc3luY2hyb25vdXNDb2x1bW4oZGF0YSwgcm93RGF0YSk7XG4gICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFnZSB0YWJsZSBkYXRhLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5nZXRDdXJyZW50RGF0YSgpO1xuICB9XG5cblxuICAvKipcbiAgICogR2V0cyBhbGwgdmFsdWVzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRBbGxWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5nZXRDdXJyZW50QWxsRGF0YSgpO1xuICB9XG5cblxuICAvKipcbiAgICogR2V0cyBhbGwgcmVuZGVyZWQgdmFsdWVzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRBbGxSZW5kZXJlZFZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmdldEFsbFJlbmRlcmVyRGF0YSgpO1xuICB9XG5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBwYWdlIHRhYmxlIHJlbmRlcmVyIGRhdGEuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRSZW5kZXJlZFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Q3VycmVudFJlbmRlcmVyRGF0YSgpO1xuICB9XG5cblxuICAvKipcbiAgICogR2V0cyBzcWwgdHlwZXMgZnJvbSBkYXRhIHNvdXJjZSBhbmQgdGFibGUgY29sdW1uc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0U3FsVHlwZXMoKSB7XG4gICAgY29uc3QgYWxsU3FsVHlwZXMgPSBVdGlsLmlzRGVmaW5lZCh0aGlzLmRhdGFTb3VyY2Uuc3FsVHlwZXMpID8gdGhpcy5kYXRhU291cmNlLnNxbFR5cGVzIDoge307XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goKGNvbDogT0NvbHVtbikgPT4ge1xuICAgICAgaWYgKGNvbC5zcWxUeXBlKSB7XG4gICAgICAgIGFsbFNxbFR5cGVzW2NvbC5hdHRyXSA9IGNvbC5zcWxUeXBlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbGxTcWxUeXBlcztcbiAgfVxuXG4gIHNldE9UYWJsZUNvbHVtbnNGaWx0ZXIodGFibGVDb2x1bW5zRmlsdGVyOiBPVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50ID0gdGFibGVDb2x1bW5zRmlsdGVyO1xuICB9XG5cbiAgZ2V0IGZpbHRlckNvbHVtbnMoKTogT0ZpbHRlckNvbHVtbltdIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5maWx0ZXJDb2x1bW5zID09PSB0aGlzLm9yaWdpbmFsRmlsdGVyQ29sdW1uc1xuICAgICAgJiYgdGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbEZpbHRlckNvbHVtbnM7XG4gIH1cblxuICBnZXQgb3JpZ2luYWxGaWx0ZXJDb2x1bW5zKCk6IEFycmF5PE9GaWx0ZXJDb2x1bW4+IHtcbiAgICBsZXQgc29ydENvbHVtbnNGaWx0ZXIgPSBbXTtcbiAgICBpZiAodGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICBzb3J0Q29sdW1uc0ZpbHRlciA9IHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudC5jb2x1bW5zQXJyYXk7XG4gICAgfVxuICAgIHJldHVybiBzb3J0Q29sdW1uc0ZpbHRlcjtcbiAgfVxuXG4gIGdldCBvcmlnaW5hbEdyb3VwZWRDb2x1bW5zQXJyYXkoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFV0aWwucGFyc2VBcnJheSh0aGlzLmdyb3VwZWRDb2x1bW5zLCB0cnVlKTtcbiAgfVxuXG4gIGdldFN0b3JlZENvbHVtbnNGaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLnN0b3JlZEZpbHRlcnM7XG4gIH1cblxuICBnZXRTdG9yZWRHcm91cGVkQ29sdW1ucygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdG9yZWRDb25maWd1cmF0aW9ucztcbiAgfVxuXG4gIG9uRmlsdGVyQnlDb2x1bW5DbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vbkZpbHRlckJ5Q29sdW1uQ2xpY2tlZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uU3RvcmVGaWx0ZXJDbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vblN0b3JlRmlsdGVyQ2xpY2tlZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uTG9hZEZpbHRlckNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uTG9hZEZpbHRlckNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBvbkNsZWFyRmlsdGVyQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25DbGVhckZpbHRlckNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGZpbHRlcnMoY29sdW1uIGZpbHRlciwgcXVpY2tmaWx0ZXIgYW5kIGZpbHRlciBidWlsZGVyKSBhbmQgcmVsb2FkIGRhdGFcbiAgICogQHBhcmFtIFt0cmlnZ2VyRGF0YXNvdXJjZVVwZGF0ZV1cbiAgICovXG4gIGNsZWFyRmlsdGVycyh0cmlnZ2VyRGF0YXNvdXJjZVVwZGF0ZTogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5jbGVhckNvbHVtbkZpbHRlcnModHJpZ2dlckRhdGFzb3VyY2VVcGRhdGUpO1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUgJiYgdGhpcy5vVGFibGVNZW51LmNvbHVtbkZpbHRlck9wdGlvbikge1xuICAgICAgdGhpcy5vVGFibGVNZW51LmNvbHVtbkZpbHRlck9wdGlvbi5zZXRBY3RpdmUodGhpcy5pc0NvbHVtbkZpbHRlcnNBY3RpdmUpO1xuICAgIH1cbiAgICB0aGlzLm9uRmlsdGVyQnlDb2x1bW5DaGFuZ2UuZW1pdCh7IGFjdGlvbjogJ3JlbW92ZScgfSk7XG4gICAgaWYgKHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgIHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQuc2V0VmFsdWUodm9pZCAwKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJCdWlsZGVyKSB7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIuY2xlYXJGaWx0ZXIoKTtcbiAgICAgIHRoaXMuZmlsdGVyQnVpbGRlci50cmlnZ2VyUmVsb2FkKCk7XG4gICAgfVxuXG4gIH1cblxuICBjbGVhckNvbHVtbkZpbHRlcihhdHRyOiBzdHJpbmcsIHRyaWdnZXJEYXRhc291cmNlVXBkYXRlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuY2xlYXJDb2x1bW5GaWx0ZXIoYXR0ciwgdHJpZ2dlckRhdGFzb3VyY2VVcGRhdGUpO1xuICAgIHRoaXMub25GaWx0ZXJCeUNvbHVtbkNoYW5nZS5lbWl0KHtcbiAgICAgIGFjdGlvbjogJ3JlbW92ZScsXG4gICAgICBjb2x1bW5zOiBbYXR0cl1cbiAgICB9KTtcbiAgICB0aGlzLnJlbG9hZFBhZ2luYXRlZERhdGFGcm9tU3RhcnQoZmFsc2UpO1xuICB9XG5cbiAgZmlsdGVyQnlDb2x1bW4oY29sdW1uVmFsdWVGaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlcikge1xuICAgIHRoaXMubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyh0cnVlKTtcbiAgICBjb25zdCBleGlzdGluZ0ZpbHRlciA9IHRoaXMuZ2V0Q29sdW1uVmFsdWVGaWx0ZXJCeUF0dHIoY29sdW1uVmFsdWVGaWx0ZXIuYXR0cik7XG4gICAgY29uc3QgYWN0aW9uID0gZXhpc3RpbmdGaWx0ZXIgPyAndXBkYXRlJyA6ICdhZGQnO1xuXG4gICAgdGhpcy5kYXRhU291cmNlLmFkZENvbHVtbkZpbHRlcihjb2x1bW5WYWx1ZUZpbHRlcik7XG5cbiAgICB0aGlzLm9uRmlsdGVyQnlDb2x1bW5DaGFuZ2UuZW1pdCh7XG4gICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgIGNvbHVtbnM6IFtjb2x1bW5WYWx1ZUZpbHRlci5hdHRyXSxcbiAgICAgIGZpbHRlcnM6IFtjb2x1bW5WYWx1ZUZpbHRlcl1cbiAgICB9KTtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgdGhpcy5yZWxvYWRQYWdpbmF0ZWREYXRhRnJvbVN0YXJ0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckNvbHVtbkZpbHRlcnModHJpZ2dlckRhdGFzb3VyY2VVcGRhdGU6IGJvb2xlYW4gPSB0cnVlLCBjb2x1bW5zQXR0cj86IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhU291cmNlLmNsZWFyQ29sdW1uRmlsdGVycyh0cmlnZ2VyRGF0YXNvdXJjZVVwZGF0ZSwgY29sdW1uc0F0dHIpO1xuICAgIHRoaXMub25GaWx0ZXJCeUNvbHVtbkNoYW5nZS5lbWl0KHtcbiAgICAgIGFjdGlvbjogJ3JlbW92ZScsXG4gICAgICBjb2x1bW5zOiBjb2x1bW5zQXR0clxuICAgIH1cbiAgICApO1xuICAgIHRoaXMucmVsb2FkUGFnaW5hdGVkRGF0YUZyb21TdGFydChmYWxzZSk7XG4gIH1cblxuICBpc0NvbHVtbkZpbHRlcmFibGUoY29sdW1uOiBPQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCkgPyB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuaXNDb2x1bW5GaWx0ZXJhYmxlKGNvbHVtbi5hdHRyKSA6IHRoaXMuaXNTZWFyY2hlYWJsZUNvbHVtbihjb2x1bW4pO1xuICB9XG5cbiAgaXNTZWFyY2hlYWJsZUNvbHVtbihjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2hlYWJsZUNvbHVtbnMuaW5jbHVkZXMoY29sdW1uLmF0dHIpO1xuICB9XG5cbiAgb3BlbkNvbHVtbkZpbHRlckRpYWxvZyhjb2x1bW46IE9Db2x1bW4sIGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihPVGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgIHRhYmxlOiB0aGlzXG4gICAgICB9LFxuICAgICAgbWluV2lkdGg6ICczODBweCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBwYW5lbENsYXNzOiBbJ28tZGlhbG9nLWNsYXNzJywgJ28tdGFibGUtZGlhbG9nJ11cbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgc3dpdGNoIChyZXN1bHQpIHtcbiAgICAgICAgY2FzZSBUYWJsZUZpbHRlckJ5Q29sdW1uRGlhbG9nUmVzdWx0LkFDQ0VQVDpcbiAgICAgICAgICBjb25zdCBjb2x1bW5WYWx1ZUZpbHRlciA9IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5nZXRDb2x1bW5WYWx1ZXNGaWx0ZXIoKTtcbiAgICAgICAgICB0aGlzLmZpbHRlckJ5Q29sdW1uKGNvbHVtblZhbHVlRmlsdGVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUYWJsZUZpbHRlckJ5Q29sdW1uRGlhbG9nUmVzdWx0LkNMRUFSOlxuICAgICAgICAgIGNvbnN0IGNvbCA9IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5jb2x1bW47XG4gICAgICAgICAgdGhpcy5jbGVhckNvbHVtbkZpbHRlcihjb2wuYXR0cik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLm9uU29ydEZpbHRlclZhbHVlc0NoYW5nZS5zdWJzY3JpYmUoc29ydGVkRmlsdGVyYWJsZUNvbHVtbiA9PiB7XG4gICAgICAvLyBndWFyZGFyIGVuIGxvY2Fsc3RvcmFnZSBlbCBjYW1iaW9cbiAgICAgIHRoaXMuc3RvcmVGaWx0ZXJDb2x1bW5zKHNvcnRlZEZpbHRlcmFibGVDb2x1bW4pO1xuICAgIH0pO1xuICB9XG5cbiAgc3RvcmVGaWx0ZXJDb2x1bW5zKHNvcnRDb2x1bW5GaWx0ZXI6IE9GaWx0ZXJDb2x1bW4pIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zKSB7XG4gICAgICAvLyBpZiBleGlzdHMgaW4gc3RhdGUgdGhlbiB1cGRhdGVkIHNvcnQgdmFsdWVcbiAgICAgIGNvbnN0IGZpbHRlckNvbHVtbiA9IHRoaXMuZmlsdGVyQ29sdW1ucy5maW5kKHggPT4geC5hdHRyID09PSBzb3J0Q29sdW1uRmlsdGVyLmF0dHIpO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGZpbHRlckNvbHVtbikpIHtcbiAgICAgICAgZmlsdGVyQ29sdW1uLnNvcnQgPSBzb3J0Q29sdW1uRmlsdGVyLnNvcnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlbHNlIGV4aXN0cyBpbiBzdGF0ZSB0aGVuIGFkZGVkIGZpbHRlciBjb2x1bW5cbiAgICAgICAgdGhpcy5maWx0ZXJDb2x1bW5zLnB1c2goc29ydENvbHVtbkZpbHRlcik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucyA9IHRoaXMuZmlsdGVyQ29sdW1ucztcbiAgfVxuXG4gIGdldFN0YXJ0Vmlld0ZpbHRlckNvbHVtbihjb2x1bW46IE9Db2x1bW4pOiAnbW9udGgnIHwgJ3llYXInIHwgJ211bHRpLXllYXInIHwgJycge1xuICAgIGxldCBzdGFydFZpZXc7XG4gICAgLy8gYXQgZmlyc3QsIGdldCBzdGF0ZSBpbiBsb2NhbHN0b3JhZ2VcbiAgICBpZiAodGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zKSB7XG4gICAgICB0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMuZm9yRWFjaCgoZWxlbWVudDogT0ZpbHRlckNvbHVtbikgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5hdHRyID09PSBjb2x1bW4uYXR0cikge1xuICAgICAgICAgIHN0YXJ0VmlldyA9IGVsZW1lbnQuc3RhcnRWaWV3O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHN0YXJ0VmlldykgJiYgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICBzdGFydFZpZXcgPSB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuZ2V0U3RhcnRWaWV3VmFsdWVPZkZpbHRlckNvbHVtbihjb2x1bW4uYXR0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXJ0VmlldztcbiAgfVxuXG4gIGdldFNvcnRGaWx0ZXJDb2x1bW4oY29sdW1uOiBPQ29sdW1uKTogJ2FzYycgfCAnZGVzYycgfCAnJyB7XG4gICAgbGV0IHNvcnRDb2x1bW47XG4gICAgLy8gYXQgZmlyc3QsIGdldCBzdGF0ZSBpbiBsb2NhbHN0b3JhZ2VcbiAgICBpZiAodGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zKSB7XG4gICAgICBjb25zdCBmaWx0ZXJDb2wgPSB0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMuZmluZCgoZWxlbWVudDogT0ZpbHRlckNvbHVtbikgPT4gZWxlbWVudC5hdHRyID09PSBjb2x1bW4uYXR0cik7XG4gICAgICBpZiAoZmlsdGVyQ29sKSB7XG4gICAgICAgIHNvcnRDb2x1bW4gPSBmaWx0ZXJDb2wuc29ydDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiBub3QgdmFsdWUgaW4gbG9jYWxzdG9yYWdlLCBnZXQgc29ydCB2YWx1ZSBpbiBvLXRhYmxlLWNvbHVtbi1maWx0ZXItY29sdW1uIGNvbXBvbmVudFxuICAgIGlmICghVXRpbC5pc0RlZmluZWQoc29ydENvbHVtbikgJiYgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICBzb3J0Q29sdW1uID0gdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50LmdldFNvcnRWYWx1ZU9mRmlsdGVyQ29sdW1uKGNvbHVtbi5hdHRyKTtcbiAgICB9XG5cbiAgICAvLyBpZiBlaXRoZXIgdmFsdWUgaW4gby10YWJsZS1jb2x1bW4tZmlsdGVyLWNvbHVtbiBvciBsb2NhbHN0b3JhZ2UsIGdldCBzb3J0IHZhbHVlIGluIHNvcnRDb2xBcnJheVxuICAgIGlmICghVXRpbC5pc0RlZmluZWQoc29ydENvbHVtbikgJiYgdGhpcy5zb3J0Q29sQXJyYXkuZmluZCh4ID0+IHguY29sdW1uTmFtZSA9PT0gY29sdW1uLmF0dHIpKSB7XG4gICAgICBzb3J0Q29sdW1uID0gdGhpcy5pc0NvbHVtblNvcnRBY3RpdmUoY29sdW1uKSA/ICdhc2MnIDogJ2Rlc2MnO1xuICAgIH1cblxuICAgIHJldHVybiBzb3J0Q29sdW1uO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVUYWJsZU1lbnVCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGVybWlzc2lvbnMgJiYgdGhpcy5wZXJtaXNzaW9ucy5tZW51ICYmIHRoaXMucGVybWlzc2lvbnMubWVudS5lbmFibGVkID09PSBmYWxzZSk7XG4gIH1cblxuICBnZXQgc2hvd1RhYmxlTWVudUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBwZXJtaXNzaW9uSGlkZGVuID0gISEodGhpcy5wZXJtaXNzaW9ucyAmJiB0aGlzLnBlcm1pc3Npb25zLm1lbnUgJiYgdGhpcy5wZXJtaXNzaW9ucy5tZW51LnZpc2libGUgPT09IGZhbHNlKTtcbiAgICBpZiAocGVybWlzc2lvbkhpZGRlbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzdGF0aWNPcHQgPSB0aGlzLnNlbGVjdEFsbENoZWNrYm94IHx8IHRoaXMuZXhwb3J0QnV0dG9uIHx8IHRoaXMuc2hvd0NvbmZpZ3VyYXRpb25PcHRpb24gfHwgdGhpcy5jb2x1bW5zVmlzaWJpbGl0eUJ1dHRvbiB8fCAodGhpcy5zaG93RmlsdGVyT3B0aW9uICYmIHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCAhPT0gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gc3RhdGljT3B0IHx8IHRoaXMudGFibGVPcHRpb25zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBzZXRPVGFibGVJbnNlcnRhYmxlUm93KHRhYmxlSW5zZXJ0YWJsZVJvdzogT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudCkge1xuICAgIGNvbnN0IGluc2VydFBlcm06IE9QZXJtaXNzaW9ucyA9IHRoaXMuZ2V0QWN0aW9uUGVybWlzc2lvbnMoUGVybWlzc2lvbnNVdGlscy5BQ1RJT05fSU5TRVJUKTtcbiAgICBpZiAoaW5zZXJ0UGVybS52aXNpYmxlKSB7XG4gICAgICB0YWJsZUluc2VydGFibGVSb3cuZW5hYmxlZCA9IGluc2VydFBlcm0uZW5hYmxlZDtcbiAgICAgIHRoaXMub1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudCA9IHRhYmxlSW5zZXJ0YWJsZVJvdztcbiAgICAgIHRoaXMuc2hvd0ZpcnN0SW5zZXJ0YWJsZVJvdyA9IHRoaXMub1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0ZpcnN0Um93KCk7XG4gICAgICB0aGlzLnNob3dMYXN0SW5zZXJ0YWJsZVJvdyA9ICF0aGlzLnNob3dGaXJzdEluc2VydGFibGVSb3c7XG4gICAgICB0aGlzLm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaW5pdGlhbGl6ZUVkaXRvcnMoKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclNlbGVjdGlvbkFuZEVkaXRpbmcoY2xlYXJTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgaWYgKGNsZWFyU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1uc1xuICAgICAgLmZpbHRlcihvQ29sdW1uID0+IG9Db2x1bW4uZWRpdGluZylcbiAgICAgIC5mb3JFYWNoKG9Db2x1bW4gPT4ge1xuICAgICAgICBvQ29sdW1uLmVkaXRpbmcgPSBmYWxzZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrU2VsZWN0ZWRJdGVtRGF0YSgpIHtcbiAgICB0aGlzLnRyaWdnZXJTZWxlY3Rpb25FdmVudHMgPSBmYWxzZTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pICYmIHRoaXMuc3RhdGUuc2VsZWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc3RhdGUuc2VsZWN0aW9uLmZvckVhY2goc2VsZWN0ZWRJdGVtID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtS2V5cyA9IE9iamVjdC5rZXlzKHNlbGVjdGVkSXRlbSk7XG4gICAgICAgIC8vIGZpbmRpbmcgc2VsZWN0ZWQgaXRlbSBkYXRhIGluIHRoZSB0YWJsZSByZW5kZXJlZCBkYXRhXG4gICAgICAgIGNvbnN0IGZvdW5kSXRlbSA9IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuZmluZChkYXRhID0+XG4gICAgICAgICAgc2VsZWN0ZWRJdGVtS2V5cy5ldmVyeShrZXkgPT4gZGF0YVtrZXldID09PSBzZWxlY3RlZEl0ZW1ba2V5XSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZvdW5kSXRlbSkge1xuICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQoZm91bmRJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyA9IHRydWU7XG4gIH1cblxuICB1c2VEZXRhaWxCdXR0b24oY29sdW1uOiBPQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbHVtbi50eXBlID09PSAnZWRpdEJ1dHRvbkluUm93JyB8fCBjb2x1bW4udHlwZSA9PT0gJ2RldGFpbEJ1dHRvbkluUm93JztcbiAgfVxuXG4gIG9uRGV0YWlsQnV0dG9uQ2xpY2soY29sdW1uOiBPQ29sdW1uLCByb3c6IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc3dpdGNoIChjb2x1bW4udHlwZSkge1xuICAgICAgY2FzZSAnZWRpdEJ1dHRvbkluUm93JzpcbiAgICAgICAgdGhpcy5lZGl0RGV0YWlsKHJvdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGV0YWlsQnV0dG9uSW5Sb3cnOlxuICAgICAgICB0aGlzLnZpZXdEZXRhaWwocm93KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGV0YWlsQnV0dG9uSWNvbihjb2x1bW46IE9Db2x1bW4pIHtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgc3dpdGNoIChjb2x1bW4udHlwZSkge1xuICAgICAgY2FzZSAnZWRpdEJ1dHRvbkluUm93JzpcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5lZGl0QnV0dG9uSW5Sb3dJY29uO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RldGFpbEJ1dHRvbkluUm93JzpcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5kZXRhaWxCdXR0b25JblJvd0ljb247XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdXNlUGxhaW5SZW5kZXIoY29sdW1uOiBPQ29sdW1uLCByb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy51c2VEZXRhaWxCdXR0b24oY29sdW1uKSAmJiAhY29sdW1uLnJlbmRlcmVyICYmICghY29sdW1uLmVkaXRvciB8fCAoIWNvbHVtbi5lZGl0aW5nIHx8ICF0aGlzLmlzUm93U2VsZWN0ZWQocm93KSkpO1xuICB9XG5cbiAgdXNlQ2VsbFJlbmRlcmVyKGNvbHVtbjogT0NvbHVtbiwgcm93OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sdW1uLnJlbmRlcmVyICYmICghY29sdW1uLmVkaXRpbmcgfHwgY29sdW1uLmVkaXRpbmcgJiYgIXRoaXMuaXNSb3dTZWxlY3RlZChyb3cpKTtcbiAgfVxuXG4gIHVzZUNlbGxFZGl0b3IoY29sdW1uOiBPQ29sdW1uLCByb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8gQWRkIGNvbHVtbi5lZGl0b3IgaW5zdGFuY2VvZiBPVGFibGVDZWxsRWRpdG9yQm9vbGVhbkNvbXBvbmVudCB0byBjb25kaXRpb25cbiAgICBpZiAoY29sdW1uLmVkaXRvciAmJiBjb2x1bW4uZWRpdG9yLmF1dG9Db21taXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbi5lZGl0b3IgJiYgY29sdW1uLmVkaXRpbmcgJiYgdGhpcy5pc1Jvd1NlbGVjdGVkKHJvdyk7XG4gIH1cblxuICBpc1NlbGVjdGlvbk1vZGVNdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlID09PSBDb2Rlcy5TRUxFQ1RJT05fTU9ERV9NVUxUSVBMRTtcbiAgfVxuXG4gIGlzU2VsZWN0aW9uTW9kZVNpbmdsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlID09PSBDb2Rlcy5TRUxFQ1RJT05fTU9ERV9TSU5HTEU7XG4gIH1cblxuICBpc1NlbGVjdGlvbk1vZGVOb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09IENvZGVzLlNFTEVDVElPTl9NT0RFX05PTkU7XG4gIH1cblxuICBvbkNoYW5nZVBhZ2UoZXZ0OiBQYWdlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMubG9hZGluZ1NlcnZpY2UuaGFuZGxlUHJvdGVjdGVkKGV2dCBhcyBhbnkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmluaXNoUXVlcnlTdWJzY3JpcHRpb24gPSBmYWxzZTtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlPy5zZXRQYWdpbmF0aW9uQ29udGV4dCh7IHBhZ2VOdW1iZXI6IGV2dC5wYWdlSW5kZXgsIHBhZ2VTaXplOiBldnQucGFnZVNpemUgfSk7XG4gICAgaWYgKCF0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gZXZ0LnBhZ2VJbmRleDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBnb2luZ0JhY2sgPSBldnQucGFnZUluZGV4IDwgdGhpcy5jdXJyZW50UGFnZTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gZXZ0LnBhZ2VJbmRleDtcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMucGFnaW5hdG9yLmlzU2hvd2luZ0FsbFJvd3MoZXZ0LnBhZ2VTaXplKSA/IHRoaXMuc3RhdGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXIgOiBldnQucGFnZVNpemU7XG5cbiAgICBjb25zdCBvbGRRdWVyeVJvd3MgPSB0aGlzLnF1ZXJ5Um93cztcbiAgICBjb25zdCBjaGFuZ2luZ1BhZ2VTaXplID0gKG9sZFF1ZXJ5Um93cyAhPT0gcGFnZVNpemUpO1xuICAgIHRoaXMucXVlcnlSb3dzID0gcGFnZVNpemU7XG4gICAgdGhpcy5wYWdpbmF0b3IucGFnZVNpemUgPSBwYWdlU2l6ZTtcblxuICAgIGxldCBuZXdTdGFydFJlY29yZDogbnVtYmVyO1xuICAgIGxldCBxdWVyeUxlbmd0aDogbnVtYmVyO1xuXG4gICAgaWYgKGdvaW5nQmFjayB8fCBjaGFuZ2luZ1BhZ2VTaXplKSB7XG4gICAgICBuZXdTdGFydFJlY29yZCA9ICh0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5xdWVyeVJvd3MpO1xuICAgICAgcXVlcnlMZW5ndGggPSB0aGlzLnF1ZXJ5Um93cztcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3U3RhcnRSZWNvcmQgPSBNYXRoLm1heCh0aGlzLnN0YXRlLnF1ZXJ5UmVjb3JkT2Zmc2V0LCAodGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucXVlcnlSb3dzKSk7XG4gICAgICBjb25zdCBuZXdFbmRSZWNvcmQgPSBNYXRoLm1pbihuZXdTdGFydFJlY29yZCArIHRoaXMucXVlcnlSb3dzLCB0aGlzLnN0YXRlLnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyKTtcbiAgICAgIHF1ZXJ5TGVuZ3RoID0gdGhpcy5kaXNhYmxlUGFnZVNpemVDYWxjdWxhdGlvbiA/IHRoaXMucXVlcnlSb3dzIDogTWF0aC5taW4odGhpcy5xdWVyeVJvd3MsIG5ld0VuZFJlY29yZCAtIG5ld1N0YXJ0UmVjb3JkKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeUFyZ3M6IE9RdWVyeURhdGFBcmdzID0ge1xuICAgICAgb2Zmc2V0OiBuZXdTdGFydFJlY29yZCxcbiAgICAgIGxlbmd0aDogcXVlcnlMZW5ndGhcbiAgICB9O1xuXG4gICAgdGhpcy5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMucXVlcnlEYXRhKHZvaWQgMCwgcXVlcnlBcmdzKTtcbiAgfVxuXG4gIGdldE9Db2x1bW4oYXR0cjogc3RyaW5nKTogT0NvbHVtbiB7XG4gICAgcmV0dXJuIHRoaXMuX29UYWJsZU9wdGlvbnMgPyB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmluZChpdGVtID0+IGl0ZW0ubmFtZSA9PT0gYXR0cikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBpbnNlcnRSZWNvcmQocmVjb3JkRGF0YTogYW55LCBzcWxUeXBlcz86IG9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIGlmICh0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnNlcnQgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgdGhlIHRhYmxlIGlzIHJlYWQtb25seS5gKVxuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9JTlNFUlQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHNxbFR5cGVzKSkge1xuICAgICAgY29uc3QgYWxsU3FsVHlwZXMgPSB0aGlzLmdldFNxbFR5cGVzKCk7XG4gICAgICBzcWxUeXBlcyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMocmVjb3JkRGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBzcWxUeXBlc1trZXldID0gYWxsU3FsVHlwZXNba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYW9UYWJsZS5pbnNlcnRRdWVyeShyZWNvcmREYXRhLCBzcWxUeXBlcyk7XG4gIH1cblxuICB1cGRhdGVSZWNvcmQoZmlsdGVyOiBhbnksIHVwZGF0ZURhdGE6IGFueSwgc3FsVHlwZXM/OiBvYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICBpZiAodGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgVXBkYXRlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZCBiZWNhdXNlIHRoZSB0YWJsZSBpcyByZWFkLW9ubHkuYClcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9VUERBVEUpKSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5kYXRhU291cmNlLmRhdGEpO1xuICAgIH1cbiAgICBjb25zdCBzcWxUeXBlc0FyZyA9IHNxbFR5cGVzIHx8IHt9O1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQoc3FsVHlwZXMpKSB7XG4gICAgICBjb25zdCBhbGxTcWxUeXBlcyA9IHRoaXMuZ2V0U3FsVHlwZXMoKTtcbiAgICAgIE9iamVjdC5rZXlzKGZpbHRlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBzcWxUeXBlc0FyZ1trZXldID0gYWxsU3FsVHlwZXNba2V5XTtcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmtleXModXBkYXRlRGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBzcWxUeXBlc0FyZ1trZXldID0gYWxsU3FsVHlwZXNba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYW9UYWJsZS51cGRhdGVRdWVyeShmaWx0ZXIsIHVwZGF0ZURhdGEsIHNxbFR5cGVzQXJnKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgZGF0YSB0YWJsZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0RGF0YUFycmF5KCkge1xuICAgIHJldHVybiB0aGlzLmRhb1RhYmxlLmRhdGE7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBTZXRzIGRhdGEgdGFibGUgd2hlbiBpcyBzdGF0aWMgKE9OTFkgSU4gVEhJUyBDQVNFKVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgc2V0RGF0YUFycmF5KGRhdGE6IEFycmF5PGFueT4pIHtcbiAgICBpZiAodGhpcy5kYW9UYWJsZSkge1xuICAgICAgLy8gcmVtb3RlIHBhZ2luYXRpb24gaGFzIG5vIHNlbnNlIHdoZW4gdXNpbmcgc3RhdGljLWRhdGFcbiAgICAgIHRoaXMucGFnZWFibGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc3RhdGljRGF0YSA9IGRhdGE7XG4gICAgICB0aGlzLmRhb1RhYmxlLnVzaW5nU3RhdGljRGF0YSA9IHRydWU7XG4gICAgICB0aGlzLmRhb1RhYmxlLnNldERhdGFBcnJheSh0aGlzLnN0YXRpY0RhdGEpO1xuICAgICAgdGhpcy5vbkRhdGFMb2FkZWQuZW1pdCh0aGlzLmRhb1RhYmxlLmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkZWxldGVMb2NhbEl0ZW1zKCkge1xuICAgIGNvbnN0IGRhdGFBcnJheSA9IHRoaXMuZ2V0RGF0YUFycmF5KCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xuICAgIHNlbGVjdGVkSXRlbXMuZm9yRWFjaCgoc2VsZWN0ZWRJdGVtOiBhbnkpID0+IHtcbiAgICAgIGZvciAobGV0IGogPSBkYXRhQXJyYXkubGVuZ3RoIC0gMTsgaiA+PSAwOyAtLWopIHtcbiAgICAgICAgaWYgKFV0aWwuZXF1YWxzKHNlbGVjdGVkSXRlbSwgZGF0YUFycmF5W2pdKSkge1xuICAgICAgICAgIGRhdGFBcnJheS5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5zZXREYXRhQXJyYXkoZGF0YUFycmF5KTtcbiAgfVxuXG4gIGlzQ29sdW1uU29ydEFjdGl2ZShjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuc29ydENvbEFycmF5LmZpbmQoc29ydEMgPT4gc29ydEMuY29sdW1uTmFtZSA9PT0gY29sdW1uLmF0dHIpO1xuICAgIHJldHVybiBmb3VuZCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNDb2x1bW5EZXNjU29ydEFjdGl2ZShjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuc29ydENvbEFycmF5LmZpbmQoc29ydEMgPT4gc29ydEMuY29sdW1uTmFtZSA9PT0gY29sdW1uLmF0dHIgJiYgIXNvcnRDLmFzY2VuZGVudCk7XG4gICAgcmV0dXJuIGZvdW5kICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBoYXNUYWJHcm91cENoYW5nZVN1YnNjcmlwdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJHcm91cENoYW5nZVN1YnNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFVdGlsLmlzRGVmaW5lZCh2YWx1ZSkgfHwgKCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSAmJiAhdmFsdWUpO1xuICB9XG5cbiAgc2V0RmlsdGVyc0NvbmZpZ3VyYXRpb24oc3RvcmFnZTogT1RhYmxlQ29tcG9uZW50U3RhdGVDbGFzcyA9IHRoaXMuc3RhdGUpIHtcbiAgICAvKlxuICAgICAgQ2hlY2tpbmcgdGhlIG9yaWdpbmFsIGZpbHRlckNhc2VTZW5zaXRpdmUgd2l0aCB0aGUgZmlsdGVyQ2FzZVNlbnNpdGl2ZSBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaW4gbG9jYWwgc3RvcmFnZVxuICAgICAgaWYgZmlsdGVyQ2FzZVNlbnNpdGl2ZSBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaXMgZXF1YWxzIHRvIG9yaWdpbmFsIGZpbHRlckNhc2VTZW5zaXRpdmUgaW5wdXRcbiAgICAgIGZpbHRlckNhc2VTZW5zaXRpdmUgd2lsbCBiZSB0aGUgdmFsdWUgaW4gbG9jYWwgc3RvcmFnZVxuICAgICovXG4gICAgaWYgKHN0b3JhZ2UuaW5pdGlhbENvbmZpZ3VyYXRpb24uZmlsdGVyQ2FzZVNlbnNpdGl2ZSAhPT0gdGhpcy5maWx0ZXJDYXNlU2Vuc2l0aXZlKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmZpbHRlckNhc2VTZW5zaXRpdmUgPSB0aGlzLmZpbHRlckNhc2VTZW5zaXRpdmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZmlsdGVyQ2FzZVNlbnNpdGl2ZSA9IHN0b3JhZ2UuaGFzT3duUHJvcGVydHkoJ2ZpbHRlci1jYXNlLXNlbnNpdGl2ZScpID8gc3RvcmFnZVsnZmlsdGVyLWNhc2Utc2Vuc2l0aXZlJ10gOiB0aGlzLmZpbHRlckNhc2VTZW5zaXRpdmU7XG4gICAgfVxuXG4gICAgaWYgKHN0b3JhZ2UuaW5pdGlhbENvbmZpZ3VyYXRpb24uZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0ICE9PSB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdCkge1xuICAgICAgdGhpcy5pc0NvbHVtbkZpbHRlcnNBY3RpdmUgPSB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29uZkZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdCA9IHN0b3JhZ2UuaGFzT3duUHJvcGVydHkoJ2ZpbHRlci1jb2x1bW4tYWN0aXZlJykgPyBzdG9yYWdlWydmaWx0ZXItY29sdW1uLWFjdGl2ZSddIDogdGhpcy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQ7XG4gICAgICB0aGlzLmlzQ29sdW1uRmlsdGVyc0FjdGl2ZSA9IGNvbmZGaWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQgfHwgdGhpcy5zdGF0ZS5jb2x1bW5WYWx1ZUZpbHRlcnMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoc3RvcmFnZS5jb2x1bW5WYWx1ZUZpbHRlcnMpKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuaW5pdGlhbGl6ZUNvbHVtbnNGaWx0ZXJzKHRoaXMuc3RhdGUuY29sdW1uVmFsdWVGaWx0ZXJzKTtcbiAgICAgIHRoaXMub25GaWx0ZXJCeUNvbHVtbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgYWN0aW9uOiAnYWRkJyxcbiAgICAgICAgY29sdW1uczogdGhpcy5zdGF0ZS5jb2x1bW5WYWx1ZUZpbHRlcnMubWFwKGZpbHRlciA9PiBmaWx0ZXIuYXR0ciksXG4gICAgICAgIGZpbHRlcnM6IHRoaXMuc3RhdGUuY29sdW1uVmFsdWVGaWx0ZXJzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5zZXRWYWx1ZShzdG9yYWdlWydmaWx0ZXInXSk7XG4gICAgICAoc3RvcmFnZVsnb0NvbHVtbnMnXSB8fCBbXSkuZm9yRWFjaCgob0NvbERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBvQ29sID0gdGhpcy5nZXRPQ29sdW1uKG9Db2xEYXRhLmF0dHIpO1xuICAgICAgICBpZiAob0NvbCAmJiBvQ29sRGF0YS5oYXNPd25Qcm9wZXJ0eSgnc2VhcmNoaW5nJykpIHtcbiAgICAgICAgICBvQ29sLnNlYXJjaGluZyA9IG9Db2xEYXRhLnNlYXJjaGluZztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyQnVpbGRlciAmJiBVdGlsLmlzRGVmaW5lZChzdG9yYWdlLmZpbHRlckJ1aWxkZXJWYWx1ZXMpKSB7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIuc2V0RmlsdGVyVmFsdWVzKHN0b3JhZ2UuZmlsdGVyQnVpbGRlclZhbHVlcyk7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIudHJpZ2dlclJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgYXBwbGllZCBjb2x1bW4gdmFsdWUgZmlsdGVyc1xuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBjb2x1bW4gdmFsdWUgZmlsdGVycyBhcHBsaWVkIHRvIHRoZSB0YWJsZS5cbiAgICovXG4gIHB1YmxpYyBnZXRDb2x1bW5WYWx1ZUZpbHRlcnMoKTogT0NvbHVtblZhbHVlRmlsdGVyW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29sdW1uVmFsdWVGaWx0ZXJzKCk7XG4gIH1cblxuICAvKipcbiAqIFJldHVybnMgdGhlIGNvbHVtbiB2YWx1ZSBmaWx0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjb2x1bW4gYXR0cmlidXRlLlxuICpcbiAqIEBwYXJhbSBhdHRyIENvbHVtbiBhdHRyaWJ1dGUgaWRlbnRpZmllci5cbiAqIEByZXR1cm5zIFRoZSBjb2x1bW4gdmFsdWUgZmlsdGVyIGZvciB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uVmFsdWVGaWx0ZXJCeUF0dHIoYXR0cjogc3RyaW5nKTogT0NvbHVtblZhbHVlRmlsdGVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmdldENvbHVtblZhbHVlRmlsdGVyQnlBdHRyKGF0dHIpO1xuICB9XG5cbiAgb25TdG9yZUNvbmZpZ3VyYXRpb25DbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vblN0b3JlQ29uZmlndXJhdGlvbkNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBvbkFwcGx5Q29uZmlndXJhdGlvbkNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uQXBwbHlDb25maWd1cmF0aW9uQ2xpY2tlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBkZWZhdWx0IHRhYmxlIGNvbmZpZ3VyYXRpb24sIHJlc2V0dGluZyBhbGwgY3VzdG9taXphdGlvbnNcbiAgICovXG4gIGFwcGx5RGVmYXVsdENvbmZpZ3VyYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5yZXNldCh0aGlzLnBhZ2VhYmxlKTtcbiAgICB0aGlzLnBhcnNlVmlzaWJsZUNvbHVtbnModHJ1ZSk7XG4gICAgdGhpcy5pbml0aWFsaXplUGFyYW1zKCk7XG4gICAgdGhpcy5hZGREZWZhdWx0Um93QnV0dG9ucygpO1xuICAgIHRoaXMucmVmcmVzaENvbHVtbnNXaWR0aEZyb21PcmlnaW5hbERlZmluaXRpb24oKTtcbiAgICB0aGlzLnJlaW5pdGlhbGl6YXRlUXVpY2tGaWx0ZXJDb2x1bW5zKCk7XG4gICAgdGhpcy5yZXNldFF1ZXJ5Um93cygpO1xuICAgIGNvbnN0IGluaXRpYWxDb25maWdTb3J0Q29sdW1uc0FycmF5ID0gU2VydmljZVV0aWxzLnBhcnNlU29ydENvbHVtbnModGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5zb3J0Q29sdW1ucyk7XG4gICAgdGhpcy5yZWluaXRpYWxpemVTb3J0Q29sdW1ucyhpbml0aWFsQ29uZmlnU29ydENvbHVtbnNBcnJheSk7XG4gICAgdGhpcy5vblJlaW5pdGlhbGl6ZS5lbWl0KG51bGwpO1xuICAgIHRoaXMuY2xlYXJGaWx0ZXJzKGZhbHNlKTtcbiAgICB0aGlzLnJlbG9hZERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgcXVlcnkgcm93cyB0byB0aGVpciBpbml0aWFsIGNvbmZpZ3VyZWQgdmFsdWVcbiAgICovXG4gIHJlc2V0UXVlcnlSb3dzKCk6IHZvaWQge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnF1ZXJ5Um93cykpIHtcbiAgICAgIHRoaXMucXVlcnlSb3dzID0gdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5xdWVyeVJvd3M7XG4gICAgfVxuICB9XG4gIGFwcGx5Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3RvcmVkQ29uZmlndXJhdGlvbiA9IHRoaXMuc3RhdGUuZ2V0U3RvcmVkQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uTmFtZSk7XG4gICAgaWYgKHN0b3JlZENvbmZpZ3VyYXRpb24pIHtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBzdG9yZWRDb25maWd1cmF0aW9uWydzdG9yZWQtcHJvcGVydGllcyddIHx8IFtdO1xuXG4gICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocHJvcGVydHkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgICAgICAgY2FzZSAnc29ydC1jb2x1bW5zJzpcbiAgICAgICAgICAgIHRoaXMucmVpbml0aWFsaXplU29ydENvbHVtbnMoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ29Db2x1bW5zLWRpc3BsYXknOlxuICAgICAgICAgICAgdGhpcy5wYXJzZVZpc2libGVDb2x1bW5zKCk7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVDaGVja2JveENvbHVtbigpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29sdW1uc1dpZHRoRnJvbUxvY2FsU3RvcmFnZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncXVpY2stZmlsdGVyJzpcbiAgICAgICAgICBjYXNlICdjb2x1bW5zLWZpbHRlcic6XG4gICAgICAgICAgY2FzZSAnZmlsdGVyLWJ1aWxkZXInOlxuICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXJzQ29uZmlndXJhdGlvbigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZ3JvdXBlZC1jb2x1bW5zJzpcbiAgICAgICAgICAgIHRoaXMucGFyc2VHcm91cGVkQ29sdW1ucygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncGFnZSc6XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5zdGF0ZS5jdXJyZW50UGFnZTtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSb3dzID0gdGhpcy5zdGF0ZS5xdWVyeVJvd3M7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlbG9hZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBnZXRUaXRsZUFsaWduQ2xhc3Mob0NvbDogT0NvbHVtbikge1xuXG4gICAgY29uc3QgaGFzVGl0bGVBbGlnbiA9IFV0aWwuaXNEZWZpbmVkKG9Db2wuZGVmaW5pdGlvbikgJiYgVXRpbC5pc0RlZmluZWQob0NvbC5kZWZpbml0aW9uLnRpdGxlQWxpZ24pO1xuICAgIGNvbnN0IGF1dG9BbGlnbiA9ICh0aGlzLmF1dG9BbGlnblRpdGxlcyAmJiAhaGFzVGl0bGVBbGlnbikgfHwgKGhhc1RpdGxlQWxpZ24gJiYgb0NvbC5kZWZpbml0aW9uLnRpdGxlQWxpZ24gPT09IENvZGVzLkNPTFVNTl9USVRMRV9BTElHTl9BVVRPKTtcbiAgICBpZiAoIWF1dG9BbGlnbikge1xuICAgICAgcmV0dXJuIG9Db2wuZ2V0VGl0bGVBbGlnbkNsYXNzKCk7XG4gICAgfVxuXG4gICAgbGV0IGFsaWduID0gdGhpcy5nZXRDZWxsQWxpZ25DbGFzcyhvQ29sKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoYWxpZ24pICYmIGFsaWduLmxlbmd0aCA+IDApIHtcbiAgICAgIGFsaWduID0gYWxpZ24uc3Vic3RyaW5nKDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKG9Db2wudHlwZSkge1xuICAgICAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICBjYXNlICdhY3Rpb24nOlxuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICBhbGlnbiA9IENvZGVzLkNPTFVNTl9USVRMRV9BTElHTl9DRU5URVI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2N1cnJlbmN5JzpcbiAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgIGNhc2UgJ3JlYWwnOlxuICAgICAgICBjYXNlICdwZXJjZW50YWdlJzpcbiAgICAgICAgICBhbGlnbiA9IENvZGVzLkNPTFVNTl9USVRMRV9BTElHTl9FTkQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NlcnZpY2UnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFsaWduID0gQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX1NUQVJUO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWxpZ247XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW46IE9Db2x1bW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZChjb2x1bW4uZGVmaW5pdGlvbikgJiYgVXRpbC5pc0RlZmluZWQoY29sdW1uLmRlZmluaXRpb24uY29udGVudEFsaWduKSA/ICdvLScgKyBjb2x1bW4uZGVmaW5pdGlvbi5jb250ZW50QWxpZ24gOiAnJztcbiAgfVxuXG5cbiAgcHVibGljIGdldEdyb3VwSGVhZGVyQ2VsbEFsaWduQ2xhc3MoY29sdW1uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY2xhc3NOYW1lQXJyYXkgPSBbXTtcbiAgICBjb25zdCBvQ29sID0gdGhpcy5nZXRPQ29sdW1uKGNvbHVtbi5zdWJzdHIoJ2dyb3VwSGVhZGVyLScubGVuZ3RoKSk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9Db2wpKSB7XG4gICAgICBjbGFzc05hbWVBcnJheS5wdXNoKHRoaXMuZ2V0Q2VsbEFsaWduQ2xhc3Mob0NvbCkpO1xuICAgICAgY2xhc3NOYW1lQXJyYXkucHVzaChvQ29sLmNsYXNzTmFtZSA/IG9Db2wuY2xhc3NOYW1lIDogJycpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lQXJyYXk7XG4gIH1cblxuICBwdWJsaWMgYWRkRGVmYXVsdFJvd0J1dHRvbnMoKSB7XG4gICAgLy8gY2hlY2sgcGVybWlzc2lvbnNcbiAgICBpZiAodGhpcy5lZGl0QnV0dG9uSW5Sb3cpIHtcbiAgICAgIHRoaXMuYWRkQnV0dG9uSW5Sb3coJ2VkaXRCdXR0b25JblJvdycpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXRhaWxCdXR0b25JblJvdykge1xuICAgICAgdGhpcy5hZGRCdXR0b25JblJvdygnZGV0YWlsQnV0dG9uSW5Sb3cnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkQnV0dG9uSW5Sb3cobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgY29sRGVmOiBPQ29sdW1uID0gdGhpcy5jcmVhdGVPQ29sdW1uKG5hbWUsIHRoaXMpO1xuICAgIGNvbERlZi50eXBlID0gbmFtZTtcbiAgICBjb2xEZWYudmlzaWJsZSA9IHRydWU7XG4gICAgY29sRGVmLnNlYXJjaGFibGUgPSBmYWxzZTtcbiAgICBjb2xEZWYub3JkZXJhYmxlID0gZmFsc2U7XG4gICAgY29sRGVmLnJlc2l6YWJsZSA9IGZhbHNlO1xuICAgIGNvbERlZi5ncm91cGFibGUgPSBmYWxzZTtcbiAgICBjb2xEZWYudGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgY29sRGVmLndpZHRoID0gJzQ4cHgnO1xuXG4gICAgdGhpcy52aXNpYmxlQ29sQXJyYXkucHVzaChuYW1lKTtcbiAgICB0aGlzLnB1c2hPQ29sdW1uRGVmaW5pdGlvbihjb2xEZWYpO1xuICAgIHRoaXMuYWRkTm9uSGlkYWJsZUNvbHVtbihuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29sdW1uIHRvIHRoZSBub24taGlkYWJsZSBjb2x1bW5zIGxpc3QsIGF2b2lkaW5nIGR1cGxpY2F0ZXNcbiAgICogQHBhcmFtIGNvbHVtbkF0dHIgQ29sdW1uIGF0dHJpYnV0ZSB0byBtYXJrIGFzIG5vbi1oaWRhYmxlXG4gICAqL1xuICBwcml2YXRlIGFkZE5vbkhpZGFibGVDb2x1bW4oY29sdW1uQXR0cjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm5vbkhpZGFibGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLm5vbkhpZGFibGVDb2x1bW5zID0gY29sdW1uQXR0cjtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLm5vbkhpZGFibGVDb2x1bW5zLnNwbGl0KCcsJykubWFwKGMgPT4gYy50cmltKCkpLmluY2x1ZGVzKGNvbHVtbkF0dHIpKSB7XG4gICAgICB0aGlzLm5vbkhpZGFibGVDb2x1bW5zICs9IENvZGVzLkFSUkFZX0lOUFVUX1NFUEFSQVRPUiArIGNvbHVtbkF0dHI7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGhlYWRlckhlaWdodCgpIHtcbiAgICBsZXQgaGVpZ2h0ID0gMDtcbiAgICBpZiAodGhpcy50YWJsZUhlYWRlckVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBoZWlnaHQgKz0gdGhpcy50YWJsZUhlYWRlckVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cbiAgICBpZiAodGhpcy50YWJsZVRvb2xiYXJFbD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgaGVpZ2h0ICs9IHRoaXMudGFibGVUb29sYmFyRWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cblxuICBnZXQgdG9vbEJhckhlaWdodCgpIHtcbiAgICBsZXQgaGVpZ2h0ID0gMDtcblxuICAgIGlmICh0aGlzLnRhYmxlVG9vbGJhckVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBoZWlnaHQgKz0gdGhpcy50YWJsZVRvb2xiYXJFbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIGhlaWdodDtcbiAgfVxuXG4gIGlzRGV0YWlsTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZXRhaWxNb2RlICE9PSBDb2Rlcy5ERVRBSUxfTU9ERV9OT05FO1xuICB9XG5cbiAgY29weUFsbCgpIHtcbiAgICBVdGlsLmNvcHlUb0NsaXBib2FyZChKU09OLnN0cmluZ2lmeSh0aGlzLmdldFJlbmRlcmVkVmFsdWUoKSkpO1xuICB9XG5cbiAgY29weVNlbGVjdGlvbigpIHtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5kYXRhU291cmNlLmdldFJlbmRlcmVkRGF0YSh0aGlzLmdldFNlbGVjdGVkSXRlbXMoKSk7XG4gICAgVXRpbC5jb3B5VG9DbGlwYm9hcmQoSlNPTi5zdHJpbmdpZnkoc2VsZWN0ZWRJdGVtcykpO1xuICB9XG5cbiAgZGVzdHJveUFjdGl2ZWRUb29sdGlwcygpIHtcbiAgICB0aGlzLnRvb2x0aXAuZm9yRWFjaCh0cCA9PiB7XG4gICAgICBpZiAodHAuX292ZXJsYXlSZWYpIHtcbiAgICAgICAgdHAuX292ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgbmF2aWdhdGlvbiB0byBpdGVtIGRldGFpbCwgcmVjZWl2aW5nIGl0ZW0gZGF0YVxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcmV0dXJucyBkZXRhaWxcbiAgICovXG4gIHZpZXdEZXRhaWwoaXRlbTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkgJiYgdGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNoZWNrRW5hYmxlZEFjdGlvblBlcm1pc3Npb24oJ2RldGFpbCcpIHx8IHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95QWN0aXZlZFRvb2x0aXBzKCk7XG4gICAgc3VwZXIudmlld0RldGFpbChpdGVtKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIG5hdmlnYXRpb24gdG8gaXRlbSBlZGl0aW9uLCByZWNlaXZpbmcgaXRlbSBkYXRhXG4gICAqIEBwYXJhbSBpdGVtXG4gICAqIEByZXR1cm5zIGRldGFpbFxuICAgKi9cbiAgZWRpdERldGFpbChpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSAmJiB0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbignZWRpdCcpIHx8IHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuZWRpdERldGFpbChpdGVtKTtcbiAgfVxuXG4gIGdldE9Db2x1bW5Gcm9tVGgodGg6IGFueSk6IE9Db2x1bW4ge1xuICAgIGxldCByZXN1bHQ6IE9Db2x1bW47XG4gICAgY29uc3QgY2xhc3NMaXN0OiBhbnlbXSA9IEFycmF5LmZyb20oKHRoIGFzIEVsZW1lbnQpLmNsYXNzTGlzdCB8fCBbXSk7XG4gICAgY29uc3QgY29sdW1uQ2xhc3MgPSBjbGFzc0xpc3QuZmluZCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IChjbGFzc05hbWUuc3RhcnRzV2l0aCgnbWF0LWNvbHVtbi0nKSkpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW5DbGFzcykpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0T0NvbHVtbihjb2x1bW5DbGFzcy5zdWJzdHIoJ21hdC1jb2x1bW4tJy5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldE9Db2x1bW5Gcm9tR3JvdXBIZWFkZXJDb2x1bW4oYXR0cjogc3RyaW5nKTogT0NvbHVtbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T0NvbHVtbihhdHRyLnN1YnN0cignZ3JvdXBIZWFkZXItJy5sZW5ndGgpKTtcbiAgfVxuXG4gIGdldFRoV2lkdGhGcm9tT0NvbHVtbihvQ29sdW1uOiBPQ29sdW1uKTogYW55IHtcbiAgICBsZXQgd2lkdGhDb2x1bW46IG51bWJlcjtcbiAgICBjb25zdCB0aEFycmF5ID0gdGhpcy50YWJsZUhlYWRlckVsLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW47XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aEFycmF5Lmxlbmd0aCAmJiAhVXRpbC5pc0RlZmluZWQod2lkdGhDb2x1bW4pOyBpKyspIHtcbiAgICAgIGNvbnN0IHRoID0gdGhBcnJheVtpXTtcbiAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoLmNsYXNzTGlzdDtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2xhc3NMaXN0Lmxlbmd0aCAmJiAhVXRpbC5pc0RlZmluZWQod2lkdGhDb2x1bW4pOyBqKyspIHtcbiAgICAgICAgaWYgKGNsYXNzTGlzdFtqXSA9PT0gJ21hdC1jb2x1bW4tJyArIG9Db2x1bW4uYXR0cikge1xuICAgICAgICAgIHdpZHRoQ29sdW1uID0gdGguY2xpZW50V2lkdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdpZHRoQ29sdW1uO1xuICB9XG5cbiAgZ2V0Q29sdW1uSW5zZXJ0YWJsZShuYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZSArIHRoaXMuZ2V0U3VmZml4Q29sdW1uSW5zZXJ0YWJsZSgpO1xuICB9XG5cbiAgaXNSb3dTZWxlY3RlZChyb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc1NlbGVjdGlvbk1vZGVOb25lKCkgJiYgdGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVJvd1NlbGVjdGlvbihyb3c6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5TZWxlY3RSb3cocm93KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUm93U2VsZWN0ZWQocm93KSkge1xuICAgICAgdGhpcy5yZW1vdmVGcm9tU2VsZWN0aW9uKFtyb3ddKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlU2luZ2xlKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTsgLy8gUmVwbGFjZXMgc2VsZWN0aW9uXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkVG9TZWxlY3Rpb24oW3Jvd10pOyAvLyBBZGRlZCB0byBzZWxlY3Rpb25cbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICogUmVtb3ZlcyByb3dzIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gKi9cbiAgcHVibGljIHJlbW92ZUZyb21TZWxlY3Rpb24ocm93czogYW55W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbk1vZGVOb25lKCkgfHwgIXJvd3MgfHwgcm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzVG9SZW1vdmUgPSByb3dzLmZpbHRlcihyb3cgPT5cbiAgICAgIFV0aWwuaXNEZWZpbmVkKHJvdykgJiYgdGhpcy5pc1Jvd1NlbGVjdGVkKHJvdylcbiAgICApO1xuXG4gICAgaWYgKHJvd3NUb1JlbW92ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdCguLi5yb3dzVG9SZW1vdmUpO1xuXG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlLnNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkO1xuICAgIH1cblxuICB9XG4gIHB1YmxpYyBhZGRUb1NlbGVjdGlvbihyb3dzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSB8fCB0aGlzLmlzU2VsZWN0aW9uTW9kZVNpbmdsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRSb3dzID0gdGhpcy5maWx0ZXJWYWxpZFJvd3NGb3JTZWxlY3Rpb24ocm93cyk7XG4gICAgY29uc3Qgcm93c1RvQWRkID0gdmFsaWRSb3dzLmZpbHRlcihyb3cgPT4gIXRoaXMuaXNSb3dTZWxlY3RlZChyb3cpKTtcblxuICAgIGlmIChyb3dzVG9BZGQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KC4uLnJvd3NUb0FkZCk7XG5cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMuc3RhdGUuc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQ7XG4gICAgfVxuXG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sdW1uV2lkdGhGcm9tU3RhdGUoY29sRGVmOiBPQ29sdW1uKTogc3RyaW5nIHtcbiAgICAvLzEuIEJ5IGRlZmF1bHQsIHNldCB3aWR0aCBkZWZpbml0aW9uXG4gICAgbGV0IGNvbHVtbldpZHRoID0gY29sRGVmLmRlZmluaXRpb24gJiYgY29sRGVmLmRlZmluaXRpb24ud2lkdGggPyBjb2xEZWYuZGVmaW5pdGlvbi53aWR0aCA6IHZvaWQgMDtcbiAgICBjb25zdCBzdG9yZWREYXRhID0gdGhpcy5zdGF0ZS5nZXRDb2x1bW5EaXNwbGF5KGNvbERlZik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHN0b3JlZERhdGEpICYmIFV0aWwuaXNEZWZpbmVkKHN0b3JlZERhdGEud2lkdGgpKSB7XG4gICAgICAvLzIuIFNldCB3aWR0aCBpZiB0aGUgd2lkdGggaXMgc3RvcmVkXG4gICAgICBjb2x1bW5XaWR0aCA9IHN0b3JlZERhdGEud2lkdGg7XG4gICAgICAvLyBjaGVjayB0aGF0IHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucyBzYXZlZCBpbiB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uXG4gICAgICAvLyBpbiB0aGUgbG9jYWwgc3RvcmFnZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICAgIGlmICh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLmNvbHVtbnNEaXNwbGF5KSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxTdG9yZWREYXRhID0gdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5nZXRDb2x1bW5EaXNwbGF5KGNvbERlZik7XG4gICAgICAgIC8vIElmIG9yaWdpbmFsIHdpZHRoIGNoYW5nZWQgdGhlbiB0aGUgd2lkdGggaXMgcmVzZXRlZCB3aXRoIHRoaXMgdmFsdWVcbiAgICAgICAgaWYgKGluaXRpYWxTdG9yZWREYXRhICYmIGluaXRpYWxTdG9yZWREYXRhLndpZHRoICYmIGNvbERlZi5kZWZpbml0aW9uLm9yaWdpbmFsV2lkdGgpIHtcbiAgICAgICAgICBpZiAoaW5pdGlhbFN0b3JlZERhdGEud2lkdGggIT09IGNvbERlZi5kZWZpbml0aW9uLm9yaWdpbmFsV2lkdGgpIHtcbiAgICAgICAgICAgIGNvbHVtbldpZHRoID0gY29sRGVmLmRlZmluaXRpb24ub3JpZ2luYWxXaWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbldpZHRoO1xuICB9XG5cbiAgcmVmcmVzaENvbHVtbnNXaWR0aEZyb21Mb2NhbFN0b3JhZ2UoKSB7XG4gICAgdGhpcy5vVGFibGVPcHRpb25zLmNvbHVtbnMuZm9yRWFjaCh4ID0+IHtcbiAgICAgIHgud2lkdGggPSB0aGlzLmdldENvbHVtbldpZHRoRnJvbVN0YXRlKHgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVmcmVzaENvbHVtbnNXaWR0aEZyb21PcmlnaW5hbERlZmluaXRpb24oKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlKS5mb3JFYWNoKGMgPT4ge1xuICAgICAgICBjLndpZHRoID0gYy5ET01XaWR0aCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbikgJiYgVXRpbC5pc0RlZmluZWQoYy5kZWZpbml0aW9uLndpZHRoKSkge1xuICAgICAgICAgIGMud2lkdGggPSBjLmRlZmluaXRpb24ud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgYy5zZXRSZW5kZXJXaWR0aCh0aGlzLmhvcml6b250YWxTY3JvbGwsIHRoaXMuZ2V0Q2xpZW50V2lkdGhDb2x1bW4oYykpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT0NvbHVtbihhdHRyPzogc3RyaW5nLCB0YWJsZT86IE9UYWJsZUNvbXBvbmVudCwgY29sdW1uPzogT1RhYmxlQ29sdW1uQ29tcG9uZW50ICYgT1RhYmxlQ29sdW1uQ2FsY3VsYXRlZENvbXBvbmVudCk6IE9Db2x1bW4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE9Db2x1bW4oKTtcbiAgICBpZiAoYXR0cikge1xuICAgICAgaW5zdGFuY2UuYXR0ciA9IGF0dHI7XG4gICAgfVxuICAgIGlmICh0YWJsZSkge1xuICAgICAgaW5zdGFuY2Uuc2V0RGVmYXVsdFByb3BlcnRpZXMoe1xuICAgICAgICBvcmRlcmFibGU6IHRoaXMub3JkZXJhYmxlLFxuICAgICAgICByZXNpemFibGU6IHRoaXMucmVzaXphYmxlLFxuICAgICAgICBncm91cGFibGU6IHRoaXMuZ3JvdXBhYmxlLFxuICAgICAgICBwYWdlYWJsZTogdGhpcy5wYWdlYWJsZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjb2x1bW4pIHtcbiAgICAgIGluc3RhbmNlLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT1RhYmxlQnV0dG9ucyhhcmc6IE9UYWJsZUJ1dHRvbnMpIHtcbiAgICB0aGlzLm9UYWJsZUJ1dHRvbnMgPSBhcmc7XG4gICAgaWYgKHRoaXMub1RhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm9UYWJsZUJ1dHRvbnMucmVnaXN0ZXJCdXR0b25zKHRoaXMudGFibGVCdXR0b25zLnRvQXJyYXkoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENsaWVudFdpZHRoQ29sdW1uKGNvbDogT0NvbHVtbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGNvbC5ET01XaWR0aCB8fCB0aGlzLmdldFRoV2lkdGhGcm9tT0NvbHVtbihjb2wpO1xuICB9XG5cbiAgcHVibGljIGdldE1pbldpZHRoQ29sdW1uKGNvbDogT0NvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFV0aWwuZXh0cmFjdFBpeGVsc1ZhbHVlKGNvbC5taW5XaWR0aCwgQ29kZXMuREVGQVVMVF9DT0xVTU5fTUlOX1dJRFRIKSArICdweCc7XG4gIH1cblxuICBzaG93RXhwYW5kYWJsZVJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy50YWJsZVJvd0V4cGFuZGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZW5hYmxlIHZpcnR1YWwgc2Nyb2xsXG4gICAqL1xuICBnZXQgZW5hYmxlZFZpcnR1YWxTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlydHVhbFNjcm9sbCAmJiAhdGhpcy5zaG93RXhwYW5kYWJsZVJvdygpICYmIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5sZW5ndGggPT09IDA7XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlcyBncm91cGVkIGNvbHVtbnNcbiAgICovXG4gIHBhcnNlR3JvdXBlZENvbHVtbnMoKSB7XG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuc3RhdGUuZ3JvdXBlZENvbHVtbnMgfHwgdGhpcy5vcmlnaW5hbEdyb3VwZWRDb2x1bW5zQXJyYXk7XG4gICAgaWYgKHRoaXMuc3RhdGUuZ3JvdXBlZENvbHVtbnMgJiYgdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5ncm91cGVkQ29sdW1ucykge1xuICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uZ3JvdXBlZENvbHVtbnNcbiAgICAgICAgLmZpbHRlcih4ID0+ICF0aGlzLm9yaWdpbmFsR3JvdXBlZENvbHVtbnNBcnJheS5pbmNsdWRlcyh4KSk7XG5cbiAgICAgIGlmIChkaWZmZXJlbmNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5vcmlnaW5hbEdyb3VwZWRDb2x1bW5zQXJyYXk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0R3JvdXBDb2x1bW5zKHJlc3VsdCk7XG4gIH1cbiAgcGFyc2VHcm91cGVkQ29sdW1uVHlwZXMoKSB7XG4gICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMgPSB0aGlzLnN0YXRlLmdyb3VwZWRDb2x1bW5UeXBlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHcm91cHMgYnkgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5cbiAgICovXG4gIGdyb3VwQnlDb2x1bW4oY29sdW1uOiBPQ29sdW1uLCB0eXBlPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jaGVja0dyb3VwQnlDb2x1bW4oY29sdW1uLmF0dHIsIHRydWUpO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUdyb3VwZWRDb2x1bW5UeXBlcyhjb2x1bW4uYXR0ciwgdHJ1ZSwgdHlwZSk7XG4gICAgfVxuICAgIHRoaXMuZGF0YVNvdXJjZS51cGRhdGVHcm91cGVkQ29sdW1ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZ3JvdXAgYnkgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5cbiAgICovXG4gIHVuR3JvdXBCeUNvbHVtbihjb2x1bW46IE9Db2x1bW4pIHtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW4uYXR0ciwgZmFsc2UpO1xuICAgIHRoaXMudXBkYXRlR3JvdXBlZENvbHVtblR5cGVzKGNvbHVtbi5hdHRyLCBmYWxzZSk7XG4gICAgdGhpcy5kYXRhU291cmNlLnVwZGF0ZUdyb3VwZWRDb2x1bW5zKCk7XG4gIH1cblxuICAvKipcbiAgICogVW5ncm91cCBieSBhbGwgY29sdW1uc1xuICAgKi9cbiAgdW5Hcm91cEJ5QWxsQ29sdW1ucygpIHtcbiAgICB0aGlzLnNldEdyb3VwQ29sdW1ucyhbXSk7XG4gICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMgPSBbXTtcbiAgfVxuXG4gIHNldEdyb3VwQ29sdW1ucyh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLmdyb3VwZWRDb2x1bW5zQXJyYXkgPSB2YWx1ZTtcbiAgICB0aGlzLmRhdGFTb3VyY2UudXBkYXRlR3JvdXBlZENvbHVtbnMoKTtcbiAgfVxuICBzZXRHcm91cGVkQ29sdW1uVHlwZXModmFsdWU6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSkge1xuICAgIHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzID0gdmFsdWU7XG4gIH1cbiAgY2hlY2tHcm91cEJ5Q29sdW1uKGZpZWxkOiBzdHJpbmcsIGFkZDogYm9vbGVhbikge1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5ncm91cGVkQ29sdW1uc0FycmF5KSB7XG4gICAgICBpZiAoY29sdW1uID09PSBmaWVsZCkge1xuICAgICAgICBmb3VuZCA9IHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5pbmRleE9mKGNvbHVtbiwgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb3VuZCAhPSBudWxsICYmIGZvdW5kID49IDApIHtcbiAgICAgIGlmICghYWRkKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5wdXNoKGZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0ZW0gaXMgZ3JvdXBcbiAgICogQHBhcmFtIGluZGV4XG4gICAqIEBwYXJhbSBpdGVtXG4gICAqIEByZXR1cm5zIHRydWUgaWYgZ3JvdXBcbiAgICovXG4gIGlzR3JvdXAoaW5kZXgsIGl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbSBpbnN0YW5jZW9mIE9UYWJsZUdyb3VwZWRSb3c7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0ZW0gaXMgbm90IGdyb3VwXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIG5vdCBncm91cFxuICAgKi9cbiAgaXNOb3RHcm91cChpbmRleCwgaXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKGl0ZW0gaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93KTtcbiAgfVxuXG4gIGdldExhc3RHcm91cHMoKSB7XG4gICAgLy8gR2V0IGxhc3QgZ3JvdXBzXG4gICAgY29uc3Qgc2NvcmVzID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YTtcbiAgICBjb25zdCBtYXhMZXZlbCA9IHNjb3Jlcy5yZWR1Y2UoKGFjYywgY3VycikgPT4gY3Vyci5sZXZlbCA+IGFjYyA/IGN1cnIubGV2ZWwgOiBhY2MsIDApO1xuICAgIGNvbnN0IG1heExldmVsUmVuZGVyZWREYXRhID0gc2NvcmVzLnJlZHVjZSgociwgbykgPT4gby5sZXZlbCA9PT0gbWF4TGV2ZWwgPyBbLi4uciwgb10gOiByLCBbXSk7XG4gICAgcmV0dXJuIG1heExldmVsUmVuZGVyZWREYXRhLmxlbmd0aDtcbiAgfVxuXG4gIGdyb3VwSGVhZGVyQ2xpY2socm93OiBPVGFibGVHcm91cGVkUm93KSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnRvZ2dsZUdyb3VwQnlDb2x1bW4ocm93KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnN0YW5jZU9mT1RhYmxlQ2VsbFJlbmRlcmVyU2VydmljZUNvbXBvbmVudChyZW5kZXJlcjogT0Jhc2VUYWJsZUNlbGxSZW5kZXJlcikge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZChyZW5kZXJlcikgJiYgKHJlbmRlcmVyIGFzIGFueSkub25EYXRhTG9hZGVkICYmIChyZW5kZXJlciBhcyBhbnkpLnF1ZXJ5QWxsRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbHVtbiBkYXRhIGJ5IGF0dHJcbiAgICogQHBhcmFtIGF0dHJcbiAgICogQHBhcmFtIHJvd1xuICAgKiBAcmV0dXJucyBjb2x1bW4gZGF0YSBieSBhdHRyXG4gICAqL1xuICBnZXRDb2x1bW5EYXRhQnlBdHRyKGF0dHIsIHJvdzogYW55KTogYW55IHtcbiAgICBsZXQgb3BlcmF0aW9uID0gbnVsbDtcbiAgICBpZiAodGhpcy5ncm91cGVkQ29sdW1uVHlwZXMubGVuZ3RoICE9IDAgJiYgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4uYXR0ciA9PSBhdHRyKSAhPSAtMSkge1xuICAgICAgb3BlcmF0aW9uID0gdGhpcy5ncm91cGVkQ29sdW1uVHlwZXNbdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4uYXR0ciA9PSBhdHRyKV0udHlwZTtcbiAgICB9XG4gICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihhdHRyKTtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKG9Db2wpKSB7XG4gICAgICByZXR1cm4gcm93W2F0dHJdO1xuICAgIH1cbiAgICBjb25zdCB1c2VSZW5kZXJlciA9IG9Db2wucmVuZGVyZXIgJiYgb0NvbC5yZW5kZXJlci5nZXRDZWxsRGF0YTtcbiAgICBpZiAob3BlcmF0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1c2VSZW5kZXJlciA/IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdykgOiByb3dbb0NvbC5hdHRyXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KHJvd1tvQ29sLmF0dHJdKTtcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldEN1cnJlbnRMYW5nKCk7XG4gICAgICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgICAgICBjYXNlIFwiWUVBUlwiOiByZXR1cm4gZGF0ZS55ZWFyKCk7XG4gICAgICAgIGNhc2UgXCJNT05USFwiOiByZXR1cm4gbW9tZW50KCkubG9jYWxlKGxhbmd1YWdlKS5tb250aChkYXRlLm1vbnRoKCkpLmZvcm1hdChcIk1NTU1cIik7XG4gICAgICAgIGNhc2UgXCJZRUFSX01PTlRIXCI6IHJldHVybiBtb21lbnQoKS5sb2NhbGUobGFuZ3VhZ2UpLm1vbnRoKGRhdGUubW9udGgoKSkueWVhcihkYXRlLnllYXIoKSkuZm9ybWF0KFwiTU1NTSwgWVlZWVwiKTtcbiAgICAgICAgY2FzZSBcIllFQVJfTU9OVEhfREFZXCI6IHJldHVybiB1c2VSZW5kZXJlciA/IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdykgOiByb3dbb0NvbC5hdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdXBkYXRlR3JvdXBlZENvbHVtblR5cGVzKGF0dHI6IHN0cmluZywgYWRkOiBib29sZWFuLCBvcGVyYXRpb24/OiBzdHJpbmcpIHtcbiAgICBsZXQgZ3JvdXBlZENvbHVtbnM6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSA9IFtdO1xuICAgIGxldCBpbmRleCA9IHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmF0dHIgPT0gYXR0cik7XG4gICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICBpZiAoIWFkZCkge1xuICAgICAgICB0aGlzLmdyb3VwZWRDb2x1bW5UeXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMucHVzaCh7IFwiYXR0clwiOiBhdHRyLCBcInR5cGVcIjogb3BlcmF0aW9uIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXRlLmdyb3VwZWRDb2x1bW5UeXBlcyA9IGdyb3VwZWRDb2x1bW5zO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lR3JvdXBIZWFkZXIocm93OiBPVGFibGVHcm91cGVkUm93KTogc3RyaW5nIHtcbiAgICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gICAgaWYgKHJvdy5sZXZlbCA8PSAxMCkge1xuICAgICAgY2xhc3NOYW1lID0gJ28tdGFibGUtZ3JvdXAtcm93IG8tdGFibGUtZ3JvdXAtcm93LWxldmVsLScgKyByb3cubGV2ZWw7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBwcml2YXRlIHN0b3BFZGl0aW9uKGNsZWFyU2VsZWN0aW9uPzogYm9vbGVhbikge1xuICAgIGNsZWFyU2VsZWN0aW9uID0gY2xlYXJTZWxlY3Rpb24gPyBjbGVhclNlbGVjdGlvbiA6IGZhbHNlO1xuICAgIHRoaXMuZWRpdGluZ0NlbGwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0aW5nUm93ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25BbmRFZGl0aW5nKGNsZWFyU2VsZWN0aW9uKTtcbiAgfVxuXG4gIHN0b3JlRmlsdGVySW5TdGF0ZShhcmc6IE9GaWx0ZXJEZWZpbml0aW9uKSB7XG4gICAgdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2Uuc3RvcmVGaWx0ZXIoYXJnKTtcbiAgfVxuXG4gIHJlaW5pdGlhbGl6YXRlUXVpY2tGaWx0ZXJDb2x1bW5zKCkge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1uc1xuICAgICAgLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnNlYXJjaGFibGUgJiYgY29sdW1uLnZpc2libGUpXG4gICAgICAuZm9yRWFjaChjb2x1bW4gPT4gY29sdW1uLnNlYXJjaGluZyA9IHRydWUpXG4gIH1cblxuICByZWluaXRpYWxpemVTb3J0Q29sdW1ucyhzb3J0Q29sdW1ucz86IFNRTE9yZGVyW10pIHtcbiAgICB0aGlzLnRhYmxlSGVhZGVycyA9IFtdO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChzb3J0Q29sdW1ucykpIHtcbiAgICAgIHRoaXMuc29ydENvbEFycmF5ID0gc29ydENvbHVtbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyc2VTb3J0Q29sdW1ucygpO1xuICAgIH1cbiAgICB0aGlzLnNvcnQuc2V0U29ydENvbHVtbnModGhpcy5zb3J0Q29sQXJyYXkpO1xuICAgIHRoaXMub25Tb3J0Q2hhbmdlLmVtaXQoc29ydENvbHVtbnMpO1xuICAgIHRoaXMucmVmcmVzaFNvcnRIZWFkZXJzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaFNvcnRIZWFkZXJzKCkge1xuICAgIHRoaXMudGFibGVIZWFkZXJzLmZpbHRlcihoZWFkZXIgPT4gVXRpbC5pc0RlZmluZWQoaGVhZGVyLm1hdFNvcnRIZWFkZXIpKS5mb3JFYWNoKGhlYWRlciA9PiBoZWFkZXIubWF0U29ydEhlYWRlci5yZWZyZXNoKCkpO1xuICB9XG5cbiAgZ2V0UXVpY2tGaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50KSA/XG4gICAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50LnZhbHVlIDpcbiAgICAgICcnO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5Q2VsbFJlbmRlcmVycygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHF1aWNrRmlsdGVyVmFsdWUgPSB0aGlzLmdldFF1aWNrRmlsdGVyVmFsdWUoKTtcblxuICAgIGlmICgoVXRpbC5pc0RlZmluZWQocXVpY2tGaWx0ZXJWYWx1ZSkgJiYgcXVpY2tGaWx0ZXJWYWx1ZS5sZW5ndGggPiAwKSB8fCB0aGlzLnNvcnRDb2xBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gdGhpcy5vVGFibGVPcHRpb25zLmNvbHVtbnNcbiAgICAgICAgLmZpbHRlcihvQ29sID0+IG9Db2wuc2VhcmNoaW5nICYmIHRoaXMuaXNJbnN0YW5jZU9mT1RhYmxlQ2VsbFJlbmRlcmVyU2VydmljZUNvbXBvbmVudChvQ29sLnJlbmRlcmVyKSlcbiAgICAgICAgLm1hcChvQ29sID0+IChvQ29sLnJlbmRlcmVyIGFzIGFueSkucXVlcnlBbGxEYXRhKCkpO1xuXG4gICAgICByZXR1cm4gcXVlcmllcy5sZW5ndGggPiAwID8gY29tYmluZUxhdGVzdChxdWVyaWVzKSA6IG9mKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gb2YobnVsbCk7XG4gIH1cblxuICB0YWJsZVF1aWNrRmlsdGVyQ2hhbmdlZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIHRoaXMucXVlcnlDZWxsUmVuZGVyZXJzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWxvYWRQYWdpbmF0ZWREYXRhRnJvbVN0YXJ0KGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5xdWlja0ZpbHRlciA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG9uTWF0U29ydENoYW5nZVxuICBwdWJsaWMgZmlsdGVyRGF0YSh2YWx1ZT86IHN0cmluZywgbG9hZE1vcmU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgLy9cbiAgfVxuXG4gIHNldE9UYWJsZUNvbHVtbnNHcm91cGluZyh2YWx1ZTogT1RhYmxlQ29sdW1uc0dyb3VwaW5nKSB7XG4gICAgdGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldENvbHVtbkdyb3VwaW5nQ29tcG9uZW50KGNvbHVtbkF0dHI6IHN0cmluZyk6IE9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbHVtbkNvbXBvbmVudCB7XG4gICAgbGV0IHJlc3VsdDogT1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29sdW1uQ29tcG9uZW50O1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudCkpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50LmdldENvbHVtbkdyb3VwaW5nKGNvbHVtbkF0dHIpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdXNlQ29sdW1uR3JvdXBpbmdBZ2dyZWdhdGUoY29sdW1uQXR0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihjb2x1bW5BdHRyKTtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKG9Db2wpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHNxbFR5cGUgPSB0aGlzLmdldFNxbFR5cGVzKClbY29sdW1uQXR0cl07XG4gICAgY29uc3QgaGFzRGVmYXVsdEFnZ3JlZ2F0ZSA9IFNRTFR5cGVzLmlzTnVtZXJpY1NRTFR5cGUoc3FsVHlwZSlcbiAgICAgICYmICghVXRpbC5pc0RlZmluZWQob0NvbC5yZW5kZXJlcikgfHwgT1RhYmxlQ29tcG9uZW50LkFWQUlMQUJMRV9HUk9VUElOR19DT0xVTU5TX1JFTkRFUkVSUy5pbmNsdWRlcyhvQ29sLnR5cGUpKTtcblxuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gaGFzRGVmYXVsdEFnZ3JlZ2F0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50LnVzZUNvbHVtbkFnZ3JlZ2F0ZShjb2x1bW5BdHRyLCBoYXNEZWZhdWx0QWdncmVnYXRlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja1ZpZXdwb3J0U2l6ZSgpIHtcbiAgICAvLyBJdHMgYSB0ZW1wb3JhcmlseSBmaXhlZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTAxMTdcbiAgICAvLyBTb2x2ZSB0aGUgaXNzdWUgd2hlbiBzd2l0Y2hpbmcgdGFicyB3aGVuIHRoZSB2aXJ0dWFsIHNjcm9sbGluZyBjb21wb25lbnQgaXMgdXNlZFxuICAgIC8vIGluIGEgbWF0IC0gdGFiIGNvbXBvbmVudCBhbmQgdmlydHVhbCBzY3JvbGwgd29yayBhYm5vcm1hbGx5XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNob3cgZXhwYW5kYWJsZSBpY29uIG9yIG5vdCBpZiBoYXMgZGF0YSBvciBub3RcbiAgc2hvd0V4cGFuZGFibGVJY29uKHJvdzogYW55LCByb3dJbmRleDogbnVtYmVyKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChVdGlsLmlzRGVmaW5lZCh0aGlzLnNob3dFeHBhbmRhYmxlSWNvbkZ1bmN0aW9uKSAmJiB0aGlzLnNob3dFeHBhbmRhYmxlSWNvbkZ1bmN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pID8gVXRpbC53cmFwSW50b09ic2VydmFibGUodGhpcy5zaG93RXhwYW5kYWJsZUljb25GdW5jdGlvbihyb3csIHJvd0luZGV4KSkgOiBvZih0cnVlKTtcbiAgfVxuXG4gIGdldENvbHVtbnNOb3RJbmNsdWRlZCgpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGNvbHNOb3RJbmNsdWRlZCA9IFtdO1xuICAgIGNvbHNOb3RJbmNsdWRlZCA9IHRoaXMub1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IHZvaWQgMCAhPT0gYy5yZW5kZXJlciAmJiAoYy50eXBlID09PSAnaW1hZ2UnIHx8IGMudHlwZSA9PT0gJ2FjdGlvbicpKS5tYXAoYyA9PiBjLmF0dHIpO1xuICAgIGNvbHNOb3RJbmNsdWRlZC5wdXNoKENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCk7XG4gICAgY29sc05vdEluY2x1ZGVkLnB1c2goQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSk7XG4gICAgcmV0dXJuIGNvbHNOb3RJbmNsdWRlZDtcbiAgfVxuXG4gIGdldENvbHVtbk5hbWVzKGNvbHVtbnM6IHN0cmluZ1tdKTogeyBbY29sdW1uSWQ6IHN0cmluZ106IHN0cmluZzsgfSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW5OYW1lcyA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaChjID0+IHtcbiAgICAgIGNvbnN0IG9Db2x1bW4gPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmluZChvYyA9PiBvYy5hdHRyID09PSBjKTtcbiAgICAgIHRhYmxlQ29sdW1uTmFtZXNbY10gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KG9Db2x1bW4udGl0bGUgPyBvQ29sdW1uLnRpdGxlIDogb0NvbHVtbi5hdHRyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFibGVDb2x1bW5OYW1lcztcbiAgfVxuXG4gIHJlc2V0Q29sdW1uc1dpZHRoKCkge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbikpIHtcbiAgICAgICAgYy53aWR0aCA9IFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbi53aWR0aCkgPyBjLmRlZmluaXRpb24ud2lkdGggOiBjLmRlZmluaXRpb24ub3JpZ2luYWxXaWR0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYy53aWR0aCA9IFwiYXV0b1wiO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uc0RPTVdpZHRoKCk7XG4gIH1cblxuICB1cGRhdGVDb2x1bW5zRE9NV2lkdGgoKSB7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XG4gICAgICBjLkRPTVdpZHRoID0gdGhpcy5nZXRUaFdpZHRoRnJvbU9Db2x1bW4oYyk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVDaGVja2JveChpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbk1vZGVOb25lKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5kaXNhYmxlU2VsZWN0aW9uRnVuY3Rpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlU2VsZWN0aW9uRnVuY3Rpb24oeyAuLi5pdGVtIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgfVxuXG4gIGdldFNlcnZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2U7XG4gIH1cblxuICBnZXRTbmFja1NlcnZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc25hY2tCYXJTZXJ2aWNlO1xuICB9XG5cblxuICBnZXRGaWx0ZXJDb2x1bW5CeUF0dHIoYXR0cjogc3RyaW5nKTogT0ZpbHRlckNvbHVtbiB7XG4gICAgLy8gSWYgdGhlIGNvbHVtbnMgZmlsdGVyIGNvbXBvbmVudCBleGlzdHMsIHVzZSBpdHMgY29sdW1uIGRlZmluaXRpb25zXG4gICAgaWYgKHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudD8uY29sdW1uc0FycmF5Py5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQ/LmNvbHVtbnNBcnJheS5maW5kKGZpbHRlckNvbHVtbiA9PiBmaWx0ZXJDb2x1bW4uYXR0ciA9PT0gYXR0cik7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gY29sdW1ucyBmaWx0ZXIgY29tcG9uZW50LCBmYWxsIGJhY2sgdG8gdGhlIHRhYmxl4oCZcyB2aXNpYmxlIGNvbHVtbnNcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1uID0gdGhpcy5vVGFibGVPcHRpb25zLmNvbHVtbnM/LmZpbmQoY29sID0+IGNvbC5hdHRyID09PSBhdHRyICYmIGNvbC52aXNpYmxlKTtcbiAgICBpZiAodmlzaWJsZUNvbHVtbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXR0cjogdmlzaWJsZUNvbHVtbi5hdHRyLFxuICAgICAgICB0aXRsZTogdmlzaWJsZUNvbHVtbi50aXRsZSxcbiAgICAgICAgZmlsdGVyVmFsdWVzSW5EYXRhOiAnY3VycmVudC1wYWdlJyxcbiAgICAgICAgc29ydDogJycsXG4gICAgICAgIHN0YXJ0VmlldzogJydcblxuICAgICAgfSBhcyBPRmlsdGVyQ29sdW1uO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdXBkYXRlQ29sdW1uVGl0bGVzKGNvbHVtbnM6IHsgYXR0cjogc3RyaW5nOyB0aXRsZTogc3RyaW5nIH1bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tYXRUYWJsZSB8fCAhdGhpcy5vVGFibGVPcHRpb25zPy5jb2x1bW5zKSByZXR1cm47XG5cbiAgICAvLyBVcGRhdGVzIHRoZSB0aXRsZXMgb2YgZXhpc3RpbmcgY29sdW1uc1xuICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMub1RhYmxlT3B0aW9ucy5jb2x1bW5zKSB7XG4gICAgICBjb25zdCB1cGRhdGVkID0gY29sdW1ucy5maW5kKGMgPT4gYy5hdHRyID09PSBjb2wuYXR0cik7XG4gICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICBjb2wudGl0bGUgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KHVwZGF0ZWQudGl0bGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm1hdFRhYmxlPy5yZW1vdmVIZWFkZXJSb3dEZWYobnVsbCk7XG4gIH1cblxuICAvKipcbiAgKiBTYXZlcyB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb25cbiAgKi9cbiAgcHJpdmF0ZSBzYXZlU2Nyb2xsUG9zaXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnNhdmVkU2Nyb2xsUG9zaXRpb24gPSB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydC5tZWFzdXJlU2Nyb2xsT2Zmc2V0KCk7XG4gICAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LnNldFNhdmVkU2Nyb2xsUG9zaXRpb24odGhpcy5zYXZlZFNjcm9sbFBvc2l0aW9uKTtcbiAgICB9XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cIm8tdGFibGUtY29udGFpbmVyXCIgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEFsaWduPVwic3RhcnQgc3RyZXRjaFwiIFtzdHlsZS5kaXNwbGF5XT1cImlzVmlzaWJsZSgpPyAnJyA6ICdub25lJ1wiXG4gIFtjbGFzcy5ibG9jay1ldmVudHNdPVwibG9hZGluZ1NlcnZpY2UuaXNQcm9jZXNzaW5nJCB8IGFzeW5jXCI+XG4gIDxvLWRhdGEtdG9vbGJhciAjdGFibGVUb29sYmFyICpuZ0lmPVwiaGFzQ29udHJvbHMoKVwiIFt0aXRsZV09XCJ0aXRsZVwiIFtzaG93LXRpdGxlXT1cInNob3dUaXRsZVwiIGNsYXNzPVwiby10YWJsZS10b29sYmFyXCI+XG4gICAgPG5nLWNvbnRhaW5lciBvLWRhdGEtdG9vbGJhci1wcm9qZWN0aW9uLXN0YXJ0PlxuICAgICAgPG8tdGFibGUtYnV0dG9ucyAjdGFibGVCdXR0b25zIFtpbnNlcnQtYnV0dG9uXT1cImluc2VydEJ1dHRvblwiIFtyZWZyZXNoLWJ1dHRvbl09XCJyZWZyZXNoQnV0dG9uXCIgW2RlbGV0ZS1idXR0b25dPVwic2hvd0RlbGV0ZUJ1dHRvblwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJvLXRhYmxlLWJ1dHRvblwiPjwvbmctY29udGVudD5cbiAgICAgIDwvby10YWJsZS1idXR0b25zPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltvLXRhYmxlLXRvb2xiYXJdW3Bvc2l0aW9uPXN0YXJ0XVwiIG5nUHJvamVjdEFzPVwiW28tZGF0YS10b29sYmFyLWN1c3RvbS1wcm9qZWN0aW9uLXN0YXJ0XVwiPlxuICAgIDwvbmctY29udGVudD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbby10YWJsZS10b29sYmFyXVtwb3NpdGlvbj1lbmRdXCIgbmdQcm9qZWN0QXM9XCJbby1kYXRhLXRvb2xiYXItY3VzdG9tLXByb2plY3Rpb24tZW5kXVwiPlxuICAgIDwvbmctY29udGVudD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbby10YWJsZS10b29sYmFyXVwiIG5nUHJvamVjdEFzPVwiW28tZGF0YS10b29sYmFyLWN1c3RvbS1wcm9qZWN0aW9uLXN0YXJ0XVwiPlxuICAgIDwvbmctY29udGVudD5cbiAgICA8bmctY29udGFpbmVyIG8tZGF0YS10b29sYmFyLXByb2plY3Rpb24tZW5kPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1aWNrZmlsdGVyQ29udGVudENoaWxkOyBlbHNlIGRlZmF1bHRRdWlja0ZpbHRlclwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJvLXRhYmxlLXF1aWNrZmlsdGVyXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRRdWlja0ZpbHRlcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1aWNrRmlsdGVyXCI+XG4gICAgICAgICAgPG8tdGFibGUtcXVpY2tmaWx0ZXIgW3BsYWNlaG9sZGVyXT1cInF1aWNrRmlsdGVyUGxhY2Vob2xkZXJcIiAob25DaGFuZ2UpPVwidGFibGVRdWlja0ZpbHRlckNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvby10YWJsZS1xdWlja2ZpbHRlcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJzaG93VGFibGVNZW51QnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGNsYXNzPVwiby10YWJsZS1tZW51LWJ1dHRvblwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJ0YWJsZU1lbnUubWF0TWVudVwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJvbnRpbWl6ZTptb3JlX3ZlcnRcIj48L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8by10YWJsZS1tZW51ICN0YWJsZU1lbnUgW3NlbGVjdC1hbGwtY2hlY2tib3hdPVwic2VsZWN0QWxsQ2hlY2tib3hcIiBbZXhwb3J0LWJ1dHRvbl09XCJleHBvcnRCdXR0b25cIlxuICAgICAgICBbY29sdW1ucy12aXNpYmlsaXR5LWJ1dHRvbl09XCJjb2x1bW5zVmlzaWJpbGl0eUJ1dHRvblwiIFtzaG93LWNvbmZpZ3VyYXRpb24tb3B0aW9uXT1cInNob3dDb25maWd1cmF0aW9uT3B0aW9uXCJcbiAgICAgICAgW3Nob3ctZmlsdGVyLW9wdGlvbl09XCJzaG93RmlsdGVyT3B0aW9uXCIgW3Nob3ctcmVwb3J0LW9uLWRlbWFuZC1vcHRpb25dPVwic2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uXCJcbiAgICAgICAgW3Nob3ctY2hhcnRzLW9uLWRlbWFuZC1vcHRpb25dPVwic2hvd0NoYXJ0c09uRGVtYW5kT3B0aW9uXCIgW3Nob3ctcmVzZXQtd2lkdGgtb3B0aW9uXT1cInNob3dSZXNldFdpZHRoT3B0aW9uXCIgW3Nob3ctZ3JvdXAtYnktb3B0aW9uXT1cImdyb3VwYWJsZVwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJvLXRhYmxlLW9wdGlvblwiPjwvbmctY29udGVudD5cbiAgICAgIDwvby10YWJsZS1tZW51PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L28tZGF0YS10b29sYmFyPlxuXG4gIDxkaXYgI3RhYmxlQm9keSBjbGFzcz1cIm8tdGFibGUtYm9keSBvLXNjcm9sbFwiIFtjbGFzcy5ob3Jpem9udGFsLXNjcm9sbF09XCJob3Jpem9udGFsU2Nyb2xsXCIgW2NsYXNzLnNjcm9sbGVkXT1cImhvcml6b250YWxTY3JvbGxlZFwiXG4gICAgW25nU3R5bGVdPVwieyd2aXNpYmlsaXR5Jzogc3Bpbm5lckNvbnRhaW5lciA/ICdoaWRkZW4nIDogJ3Zpc2libGUnfVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZW5hYmxlZFZpcnR1YWxTY3JvbGw7IGVsc2UgdGFibGVXaXRoVmlydHVhbFNjcm9sbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm8tdGFibGUtb3ZlcmZsb3cgby1zY3JvbGxcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICN0YWJsZVdpdGhWaXJ0dWFsU2Nyb2xsPlxuICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCAjdmlydHVhbFNjcm9sbFZpZXdQb3J0IGZ4RmxleD5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG4gIDwhLS1UQUJMRSBQQUdJTkFUT1ItLT5cbiAgPG1hdC1wYWdpbmF0b3IgKm5nSWY9XCJwYWdpbmF0b3JcIiAjbWF0cGFnaW5hdG9yIFtsZW5ndGhdPVwiZGF0YVNvdXJjZT8ucmVzdWx0c0xlbmd0aFwiIFtwYWdlSW5kZXhdPVwicGFnaW5hdG9yLnBhZ2VJbmRleFwiIFtwYWdlU2l6ZV09XCJxdWVyeVJvd3NcIlxuICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnaW5hdG9yLnBhZ2VTaXplT3B0aW9uc1wiIChwYWdlKT1cIm9uQ2hhbmdlUGFnZSgkZXZlbnQpXCIgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInBhZ2luYXRvci5zaG93Rmlyc3RMYXN0QnV0dG9uc1wiXG4gICAgW25nU3R5bGVdPVwieyd2aXNpYmlsaXR5Jzogc3Bpbm5lckNvbnRhaW5lciA/ICdoaWRkZW4nIDogJ3Zpc2libGUnfVwiPlxuICA8L21hdC1wYWdpbmF0b3I+XG5cbiAgPCEtLUxPQURJTkctLT5cbiAgPGRpdiAjc3Bpbm5lckNvbnRhaW5lciAqbmdJZj1cInNob3dMb2FkaW5nIHwgYXN5bmNcIiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCIgW25nU3R5bGVdPVwieyd0b3AucHgnOiB0b29sQmFySGVpZ2h0fVwiXG4gICAgY2xhc3M9XCJzcGlubmVyLWNvbnRhaW5lclwiIFtjbGFzcy5zcGlubmVyLWNvbnRhaW5lci1zY3JvbGxhYmxlXT1cImxvYWRpbmdTY3JvbGwgfCBhc3luY1wiPlxuICAgIDxvLXRhYmxlLXNrZWxldG9uPjwvby10YWJsZS1za2VsZXRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBEaXNhYmxlIGJsb2NrZXIgLS0+XG4gIDxkaXYgKm5nSWY9XCIhZW5hYmxlZFwiIGNsYXNzPVwiby10YWJsZS1kaXNhYmxlZC1ibG9ja2VyXCI+PC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0YWJsZT5cbiAgPHRhYmxlIG1hdC10YWJsZSAjdGFibGUgW2NsYXNzLmF1dG9hZGp1c3RlZF09XCJhdXRvQWRqdXN0XCIgW3RyYWNrQnldPVwiZ2V0VHJhY2tCeUZ1bmN0aW9uKClcIiBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgb01hdFNvcnRcbiAgICBbb01hdFNvcnRDb2x1bW5zXT1cInNvcnRDb2xBcnJheVwiIFtuZ0NsYXNzXT1cInJvd0hlaWdodE9ic2VydmFibGUgfCBhc3luY1wiIChjZGtPYnNlcnZlQ29udGVudCk9XCJwcm9qZWN0Q29udGVudENoYW5nZWQoKVwiXG4gICAgb1RhYmxlRXhwYW5kZWRGb290ZXIgW29UYWJsZUV4cGFuZGVkRm9vdGVyQ29sc3Bhbl09XCJ2aXNpYmxlQ29sQXJyYXkubGVuZ3RoXCJcbiAgICBbbXVsdGlUZW1wbGF0ZURhdGFSb3dzXT1cInNob3dFeHBhbmRhYmxlUm93KClcIiBhcmlhLWRlc2NyaWJlZGJ5PVwib250aW1pemUtd2ViIHRhYmxlXCI+XG5cbiAgICA8IS0tQ2hlY2tib3ggQ29sdW1uIC0tPlxuICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5uYW1lXCIgKm5nSWY9XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkOyBlbHNlIGN1c3RvbUhlYWRlclNlbGVjdEFsbFRlbXBsYXRlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIiAqbmdJZj1cImlzU2VsZWN0aW9uTW9kZU11bHRpcGxlKClcIj5cbiAgICAgICAgICAgIDxvLXRhYmxlLWhlYWRlci1zZWxlY3QtYWxsIFtjb2x1bW5dPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW5cIj48L28tdGFibGUtaGVhZGVyLXNlbGVjdC1hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IG5hbWU9XCJpZFtdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVDaGVja2JveChyb3cpXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0aW9uQ2hlY2tib3hUb2dnbGUoJGV2ZW50LCByb3cpXCIgW2NoZWNrZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCI+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tSGVhZGVyU2VsZWN0QWxsVGVtcGxhdGU+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLnJlc2l6YWJsZV09XCJyZXNpemFibGVcIiBjbGFzcz1cIm1hdC1oZWFkZXItc2VsZWN0LWFsbC13aXRoLXRpdGxlIG8tY2VudGVyXCJcbiAgICAgICAgICBbc3R5bGUud2lkdGhdPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ud2lkdGhcIiBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKG9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uKVwiXG4gICAgICAgICAgW3N0eWxlLm1heC13aWR0aF09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5tYXhXaWR0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgICAgICAgICA8by10YWJsZS1oZWFkZXItc2VsZWN0LWFsbCBbY29sdW1uXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uXCI+PC9vLXRhYmxlLWhlYWRlci1zZWxlY3QtYWxsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgY2xhc3M9XCJvLWNlbnRlclwiIFtzdHlsZS53aWR0aF09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi53aWR0aFwiXG4gICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJnZXRNaW5XaWR0aENvbHVtbihvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbilcIiBbc3R5bGUubWF4LXdpZHRoXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm1heFdpZHRoXCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCBuYW1lPVwiaWRbXVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlQ2hlY2tib3gocm93KVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInNlbGVjdGlvbkNoZWNrYm94VG9nZ2xlKCRldmVudCwgcm93KVwiIFtjaGVja2VkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuXG4gICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPjwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tRXhwYW5kYWJsZSBDb2x1bW4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIm9UYWJsZU9wdGlvbnMuZXhwYW5kYWJsZUNvbHVtbi5uYW1lXCIgKm5nSWY9XCJpc0NvbHVtbkV4cGFuZGFibGUoKVwiPlxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAge3sgb1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uLnRpdGxlIH19XG4gICAgICA8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdztsZXQgcm93SW5kZXggPSBkYXRhSW5kZXhcIj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwic2hvd0V4cGFuZGFibGVJY29uKHJvdywgcm93SW5kZXgpIHwgYXN5bmNcIiAoY2xpY2spPVwidG9nZ2xlUm93RXhwYW5kYWJsZShyb3csICRldmVudClcIlxuICAgICAgICAgIChrZXlkb3duKT1cInRvZ2dsZVJvd0V4cGFuZGFibGUocm93LCAkZXZlbnQpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRXhwYW5kZWQocm93KVwiPnt7IHRhYmxlUm93RXhwYW5kYWJsZS5pY29uQ29sbGFwc2UgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRXhwYW5kZWQocm93KVwiPnt7IHRhYmxlUm93RXhwYW5kYWJsZS5pY29uRXhwYW5kIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBHZW5lcmljIGNvbHVtbiBkZWZpbml0aW9uIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBvVGFibGVPcHRpb25zLmNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCI+XG4gICAgICA8IS0tRGVmaW5lIGhlYWRlci1jZWxsLS0+XG5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW25nQ2xhc3NdPVwiZ2V0VGl0bGVBbGlnbkNsYXNzKGNvbHVtbilcIiBbY2xhc3MucmVzaXphYmxlXT1cInJlc2l6YWJsZVwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKGNvbHVtbilcIiBbc3R5bGUubWF4LXdpZHRoXT1cImNvbHVtbi5tYXhXaWR0aFwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgICAgICAgPG8tdGFibGUtaGVhZGVyIFtjb2x1bW5dPVwiY29sdW1uXCIgW2NvbHVtbi1maWx0ZXJzXT1cImNvbHVtbkZpbHRlcnMkIHwgYXN5bmNcIiA+PC9vLXRhYmxlLWhlYWRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RoPlxuXG5cbiAgICAgIDwhLS1EZWZpbmUgbWF0LWNlbGwtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGUubXVsdGlUZW1wbGF0ZURhdGFSb3dzOyBlbHNlIGNlbGxUZW1wbGF0ZU11bHRpVGVtcGxhdGVEYXRhUm93c1wiPlxuICAgICAgICA8dGQgI2NlbGwgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O2xldCByb3dJbmRleCA9IGluZGV4IFwiIFtuZ0NsYXNzXT1cIltjb2x1bW4uY2xhc3NOYW1lLCBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXVwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKHJvdywgY29sdW1uLCByb3dJbmRleCwgY2VsbCwgJGV2ZW50KVwiIChkYmxjbGljayk9XCJoYW5kbGVEb3VibGVDbGljayhyb3csIGNvbHVtbiwgcm93SW5kZXgsIGNlbGwsICRldmVudClcIlxuICAgICAgICAgIFtjbGFzcy5lbXB0eS1jZWxsXT1cImlzRW1wdHkocm93W2NvbHVtbi5uYW1lXSlcIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFjb2x1bW4uaGFzVG9vbHRpcCgpXCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLmdldFRvb2x0aXAocm93KVwiXG4gICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNzUwXCIgbWF0VG9vbHRpcENsYXNzPVwiby10YWJsZS1jZWxsLXRvb2x0aXBcIlxuICAgICAgICAgIFtjbGFzcy5vLW1hdC1jZWxsLW11bHRpbGluZV09XCIoY29sdW1uLmlzTXVsdGlsaW5lIHwgYXN5bmMpXCIgW29Db250ZXh0TWVudV09XCJ0YWJsZUNvbnRleHRNZW51XCJcbiAgICAgICAgICBbb0NvbnRleHRNZW51RGF0YV09XCJ7IGNlbGxOYW1lOmNvbHVtbi5uYW1lLCByb3dWYWx1ZTpyb3csIHJvd0luZGV4OnJvd0luZGV4fVwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4oY29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwiY29sdW1uLm1heFdpZHRoXCJcbiAgICAgICAgICBbY2xhc3Muby10YWJsZS1lZGl0aW5nLWNlbGxdPVwiaXNSb3dTZWxlY3RlZChyb3cpICYmIGNvbHVtbi5lZGl0aW5nXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxSZW5kZXJlcjtjb250ZXh0Ontjb2x1bW46Y29sdW1uLHJvdzpyb3d9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbFRlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzPlxuICAgICAgICA8dGQgI2NlbGwgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O2xldCByb3dJbmRleCA9IGRhdGFJbmRleCBcIiBbbmdDbGFzc109XCJbY29sdW1uLmNsYXNzTmFtZSwgZ2V0Q2VsbEFsaWduQ2xhc3MoY29sdW1uKV1cIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDbGljayhyb3csIGNvbHVtbiwgcm93SW5kZXgsIGNlbGwsICRldmVudClcIiAoZGJsY2xpY2spPVwiaGFuZGxlRG91YmxlQ2xpY2socm93LCBjb2x1bW4sIHJvd0luZGV4LCBjZWxsLCAkZXZlbnQpXCJcbiAgICAgICAgICBbY2xhc3MuZW1wdHktY2VsbF09XCJpc0VtcHR5KHJvd1tjb2x1bW4ubmFtZV0pXCIgW21hdFRvb2x0aXBEaXNhYmxlZF09XCIhY29sdW1uLmhhc1Rvb2x0aXAoKVwiIFttYXRUb29sdGlwXT1cImNvbHVtbi5nZXRUb29sdGlwKHJvdylcIlxuICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCIgbWF0VG9vbHRpcFNob3dEZWxheT1cIjc1MFwiIG1hdFRvb2x0aXBDbGFzcz1cIm8tdGFibGUtY2VsbC10b29sdGlwXCJcbiAgICAgICAgICBbY2xhc3Muby1tYXQtY2VsbC1tdWx0aWxpbmVdPVwiKGNvbHVtbi5pc011bHRpbGluZSB8IGFzeW5jKVwiIFtvQ29udGV4dE1lbnVdPVwidGFibGVDb250ZXh0TWVudVwiXG4gICAgICAgICAgW29Db250ZXh0TWVudURhdGFdPVwieyBjZWxsTmFtZTpjb2x1bW4ubmFtZSwgcm93VmFsdWU6cm93LCByb3dJbmRleDpyb3dJbmRleH1cIiBbc3R5bGUud2lkdGhdPVwiY29sdW1uLndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKGNvbHVtbilcIiBbc3R5bGUubWF4LXdpZHRoXT1cImNvbHVtbi5tYXhXaWR0aFwiXG4gICAgICAgICAgW2NsYXNzLm8tdGFibGUtZWRpdGluZy1jZWxsXT1cImlzUm93U2VsZWN0ZWQocm93KSAmJiBjb2x1bW4uZWRpdGluZ1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsUmVuZGVyZXI7Y29udGV4dDp7Y29sdW1uOmNvbHVtbixyb3c6cm93fVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPCEtLURlZmluZSBtYXQtZm9vdGVyLWNlbGwtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93VG90YWxzIHwgYXN5bmNcIj5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbbmdDbGFzc109XCJjb2x1bW4uY2xhc3NOYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCIgKm5nSWY9XCJjb2x1bW4uYWdncmVnYXRlICYmIGNvbHVtbi5hZ2dyZWdhdGUudGl0bGVcIj5cbiAgICAgICAgICAgIHt7IGNvbHVtbi5hZ2dyZWdhdGUudGl0bGUgfCBvVHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2x1bW4ucmVuZGVyZXIgfHwgY29sdW1uLmFnZ3JlZ2F0ZT8ub3BlcmF0b3IgPT09ICdjb3VudCc7IGVsc2UgcmVuZGVyZXJUZW1wbGF0ZVwiPlxuICAgICAgICAgICAge3sgZGF0YVNvdXJjZS5nZXRBZ2dyZWdhdGVEYXRhKGNvbHVtbikgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3JlbmRlcmVyVGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJjb2x1bW4ucmVuZGVyZXIgJiYgY29sdW1uLmFnZ3JlZ2F0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5yZW5kZXJlci50ZW1wbGF0ZXJlZlwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y2VsbHZhbHVlOiBkYXRhU291cmNlLmdldEFnZ3JlZ2F0ZURhdGEoY29sdW1uKX1cIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgQ29sdW1uIC0gVGhlIGRldGFpbCByb3cgaXMgbWFkZSB1cCBvZiB0aGlzIG9uZSBjb2x1bW4gdGhhdCBzcGFucyBhY3Jvc3MgYWxsIGNvbHVtbnMgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0V4cGFuZGVkUm93XCI+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImV4cGFuZGVkRGV0YWlsXCI+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7bGV0IHJvd0luZGV4PSBkYXRhSW5kZXhcIiBbYXR0ci5jb2xzcGFuXT1cIm9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMubGVuZ3RoXCI+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRFeHBhbmRlZFJvd0NvbnRhaW5lckNsYXNzKHJvd0luZGV4KVwiIFtAZGV0YWlsRXhwYW5kXT1cImdldFN0YXRlRXhwYW5kKHJvdylcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLUZPT1RFUi1JTlNFUlRBQkxFLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dMYXN0SW5zZXJ0YWJsZVJvdyAmJiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubmFtZSArIGdldFN1ZmZpeENvbHVtbkluc2VydGFibGUoKVwiICpuZ0lmPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZVwiPlxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2Ygb1RhYmxlT3B0aW9ucy5jb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ubmFtZSsgZ2V0U3VmZml4Q29sdW1uSW5zZXJ0YWJsZSgpXCI+XG5cbiAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbbmdDbGFzc109XCJbY29sdW1uLmNsYXNzTmFtZSwgZ2V0Q2VsbEFsaWduQ2xhc3MoY29sdW1uKV1cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0NvbHVtbkluc2VydGFibGUoY29sdW1uKSAmJiAhb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC51c2VDZWxsRWRpdG9yKGNvbHVtbilcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImluc2VydGFibGUtZm9ybS1maWVsZCBvLXRhYmxlLWNlbGwtZWRpdG9yLXRleHQgby10YWJsZS1jZWxsLWVkaXRvclwiIFtoaWRlUmVxdWlyZWRNYXJrZXJdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuZ2V0UGxhY2Vob2xkZXIoY29sdW1uKVwiIFtpZF09XCJjb2x1bW4uYXR0clwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuZ2V0Q29udHJvbChjb2x1bW4pXCIgW3JlcXVpcmVkXT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNDb2x1bW5SZXF1aXJlZChjb2x1bW4pXCI+XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm9NYXRFcnJvcj1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuY29sdW1uSGFzRXJyb3IoY29sdW1uLCAncmVxdWlyZWQnKVwiPlxuICAgICAgICAgICAgICAgIHt7ICdGT1JNX1ZBTElEQVRJT04uUkVRVUlSRUQnIHwgb1RyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0NvbHVtbkluc2VydGFibGUoY29sdW1uKSAmJiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnVzZUNlbGxFZGl0b3IoY29sdW1uKVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuY29sdW1uRWRpdG9yc1tjb2x1bW4uYXR0cl0udGVtcGxhdGVyZWZcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyByb3d2YWx1ZTogb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5yb3dEYXRhIH1cIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaXJzdEluc2VydGFibGVSb3cgJiYgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cImdldENvbHVtbkluc2VydGFibGUob1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubmFtZSlcIiAqbmdJZj1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGVcIj5cbiAgICAgICAgPHRkIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIG9UYWJsZU9wdGlvbnMuY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiZ2V0Q29sdW1uSW5zZXJ0YWJsZShjb2x1bW4ubmFtZSlcIj5cblxuICAgICAgICA8dGQgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtuZ0NsYXNzXT1cIltjb2x1bW4uY2xhc3NOYW1lLCBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uSW5zZXJ0YWJsZShjb2x1bW4pICYmICFvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnVzZUNlbGxFZGl0b3IoY29sdW1uKVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5zZXJ0YWJsZS1mb3JtLWZpZWxkXCIgW2hpZGVSZXF1aXJlZE1hcmtlcl09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5nZXRQbGFjZWhvbGRlcihjb2x1bW4pXCIgW2lkXT1cImNvbHVtbi5hdHRyXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5nZXRDb250cm9sKGNvbHVtbilcIiBbcmVxdWlyZWRdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0NvbHVtblJlcXVpcmVkKGNvbHVtbilcIj5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqb01hdEVycm9yPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5jb2x1bW5IYXNFcnJvcihjb2x1bW4sICdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAge3sgJ0ZPUk1fVkFMSURBVElPTi5SRVFVSVJFRCcgfCBvVHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uSW5zZXJ0YWJsZShjb2x1bW4pICYmIG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQudXNlQ2VsbEVkaXRvcihjb2x1bW4pXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5jb2x1bW5FZGl0b3JzW2NvbHVtbi5hdHRyXS50ZW1wbGF0ZXJlZlwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHJvd3ZhbHVlOiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnJvd0RhdGEgfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIERlZmluaXRpb24gY29sdW1uIGdyb3VwIGhlYWRlciAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgZ3JvdXBpbmdIZWFkZXJzUm93czsgbGV0IGkgPSBpbmRleFwiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uXCI+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZ3JvdXBcIiBjbGFzcz1cImdyb3VwaW5nLXJvd1wiIFtvQ29udGV4dE1lbnVdPVwidGFibGVDb250ZXh0TWVudVwiXG4gICAgICAgIFtvQ29udGV4dE1lbnVEYXRhXT1cInsgY2VsbE5hbWU6Y29sdW1uLCByb3dWYWx1ZTpncm91cCwgcm93SW5kZXg6aX1cIiBbbmdDbGFzc109XCJnZXRHcm91cEhlYWRlckNlbGxBbGlnbkNsYXNzKGNvbHVtbilcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImk9PT0wXCIgY2xhc3M9XCJncm91cGluZy10aXRsZS13cmFwcGVyXCIgW25nU3R5bGVdPVwieydwYWRkaW5nLWxlZnQnOiAyMCooZ3JvdXAubGV2ZWwtMSkrJ3B4J31cIj5cbiAgICAgICAgICA8bWF0LWljb24+e3sgZ3JvdXAuZXhwYW5kZWQgPyAnZXhwYW5kX21vcmUnIDogJ2NoZXZyb25fcmlnaHQnIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICB7eyBncm91cC50aXRsZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwaW5nLWFnZ3JlZ2F0ZVwiICpuZ0lmPVwiZ3JvdXAuaGFzQWN0aXZlQWdncmVnYXRlKHZpc2libGVDb2xBcnJheVtpXSlcIj5cbiAgICAgICAgICB7eyBncm91cC5nZXRDb2x1bW5BY3RpdmVBZ2dyZWdhdGVUaXRsZSh2aXNpYmxlQ29sQXJyYXlbaV0pIHwgb1RyYW5zbGF0ZSB9fSA6XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFnZXRPQ29sdW1uRnJvbUdyb3VwSGVhZGVyQ29sdW1uKGNvbHVtbikucmVuZGVyZXJcIj5cbiAgICAgICAgICAgIHt7IGdyb3VwLmdldENvbHVtbkFnZ3JlZ2F0ZVZhbHVlKHZpc2libGVDb2xBcnJheVtpXSl9fVxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRPQ29sdW1uRnJvbUdyb3VwSGVhZGVyQ29sdW1uKGNvbHVtbikucmVuZGVyZXJcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdldE9Db2x1bW5Gcm9tR3JvdXBIZWFkZXJDb2x1bW4oY29sdW1uKS5yZW5kZXJlcj8udGVtcGxhdGVyZWY7IGNvbnRleHQ6eyBjZWxsdmFsdWU6ICBncm91cC5nZXRDb2x1bW5BZ2dyZWdhdGVWYWx1ZSh2aXNpYmxlQ29sQXJyYXlbaV0pIH1cIj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicG9zaXRpb25cIj5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj4ge3tyb3d9fSA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPHRyICN0YWJsZUhlYWRlciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwib1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uczsgc3RpY2t5OiBmaXhlZEhlYWRlclwiPjwvdHI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhYmxlLm11bHRpVGVtcGxhdGVEYXRhUm93czsgZWxzZSByb3dUZW1wbGF0ZU11bHRpVGVtcGxhdGVEYXRhUm93c1wiPlxuICAgICAgPHRyIG1hdC1yb3cgb1RhYmxlUm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBvVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zOyB3aGVuOmlzTm90R3JvdXA7IGxldCByb3dJbmRleCA9IGluZGV4XCJcbiAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiIFtuZ0NsYXNzXT1cInJvdyB8IG9UYWJsZVJvd0NsYXNzOiByb3dJbmRleDogcm93Q2xhc3NcIj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNyb3dUZW1wbGF0ZU11bHRpVGVtcGxhdGVEYXRhUm93cz5cbiAgICAgIDx0ciBtYXQtcm93IG9UYWJsZVJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uczsgd2hlbjppc05vdEdyb3VwOyBsZXQgcm93SW5kZXggPSBkYXRhSW5kZXhcIlxuICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCIgW25nQ2xhc3NdPVwicm93IHwgb1RhYmxlUm93Q2xhc3M6IHJvd0luZGV4OiByb3dDbGFzc1wiPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBSb3cgR3JvdXAgaGVhZGVyIC0tPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBncm91cGluZ0hlYWRlcnNSb3dzOyB3aGVuOmlzR3JvdXBcIiAoY2xpY2spPVwiZ3JvdXBIZWFkZXJDbGljayhyb3cpXCJcbiAgICAgIFtuZ0NsYXNzXT1cImdldENsYXNzTmFtZUdyb3VwSGVhZGVyKHJvdylcIj5cbiAgICA8L3RyPlxuXG4gICAgPCEtLSBFeHBhbmRlZCBkZXRhaWwgcm93LS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0V4cGFuZGVkUm93XCI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydleHBhbmRlZERldGFpbCddXCIgY2xhc3M9XCJvLXRhYmxlLXJvdy1leHBhbmRlZFwiPjwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0xhc3RJbnNlcnRhYmxlUm93XCI+XG4gICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cIm9UYWJsZU9wdGlvbnMuY29sdW1uc0luc2VydGFibGVzOyBzdGlja3k6IHRydWVcIlxuICAgICAgICAoa2V5dXApPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5oYW5kbGVLZXlib2FyZEV2ZW50KCRldmVudClcIiBjbGFzcz1cIm8tdGFibGUtaW5zZXJ0YWJsZVwiPjwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaXJzdEluc2VydGFibGVSb3dcIj5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwib1RhYmxlT3B0aW9ucy5jb2x1bW5zSW5zZXJ0YWJsZXM7IHN0aWNreTogdHJ1ZVwiXG4gICAgICAgIChrZXl1cCk9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmhhbmRsZUtleWJvYXJkRXZlbnQoJGV2ZW50KVwiIGNsYXNzPVwiby10YWJsZS1pbnNlcnRhYmxlXCI+IDwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dUb3RhbHMgfCBhc3luY1wiPlxuICAgICAgPHRyIG1hdC1mb290ZXItcm93ICptYXRGb290ZXJSb3dEZWY9XCJvVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zOyBzdGlja3k6IHRydWVcIiBjbGFzcz1cIm8tdGFibGUtYWdncmVnYXRlXCI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3RhYmxlPlxuXG48L25nLXRlbXBsYXRlPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRleHRNZW51Q29udGVudENoaWxkICYmIGNvbnRleHRNZW51XCI+XG4gIDxvLXRhYmxlLWNvbnRleHQtbWVudSBbaW5zZXJ0XT1cImluc2VydEJ1dHRvblwiIFtlZGl0XT1cImVkaXRpb25Nb2RlICE9PSBFRElUX01PREVfTk9ORVwiIFt2aWV3LWRldGFpbF09XCJkZXRhaWxNb2RlICE9PSBERVRBSUxfTU9ERV9OT05FXCJcbiAgICBbcmVmcmVzaF09XCJyZWZyZXNoQnV0dG9uXCIgW2RlbGV0ZV09XCJkZWxldGVCdXR0b25cIiBbZmlsdGVyXT1cInNob3dGaWx0ZXJPcHRpb25cIiBbZ3JvdXAtYnktcm93XT1cImdyb3VwYWJsZVwiPlxuICA8L28tdGFibGUtY29udGV4dC1tZW51PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjY2VsbFJlbmRlcmVyIGxldC1yb3c9XCJyb3dcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJ0cnVlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJjb2x1bW4ucmVuZGVyZXIgIT0gbnVsbCAmJiAoIWNvbHVtbi5lZGl0aW5nIHx8IGNvbHVtbi5lZGl0aW5nICYmICFpc1Jvd1NlbGVjdGVkKHJvdykpXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5yZW5kZXJlcj8udGVtcGxhdGVyZWY7IGNvbnRleHQ6eyBjZWxsdmFsdWU6IHJvd1tjb2x1bW4ubmFtZV0sIHJvd3ZhbHVlOnJvdyB9XCI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImlzUm93U2VsZWN0ZWQocm93KSAmJiBjb2x1bW4uZWRpdGluZ1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW4uZWRpdG9yPy50ZW1wbGF0ZXJlZjsgY29udGV4dDp7IGNlbGx2YWx1ZTogcm93W2NvbHVtbi5uYW1lXSwgcm93dmFsdWU6cm93IH1cIj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJjb2x1bW4udHlwZSA9PT0gJ2VkaXRCdXR0b25JblJvdycgfHwgY29sdW1uLnR5cGUgPT09ICdkZXRhaWxCdXR0b25JblJvdydcIj5cbiAgICAgICAgPGRpdiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIGNsYXNzPVwiby1hY3Rpb24tY2VsbC1yZW5kZXJlclwiIChjbGljayk9XCJvbkRldGFpbEJ1dHRvbkNsaWNrKGNvbHVtbiwgcm93LCAkZXZlbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnt7IGdldERldGFpbEJ1dHRvbkljb24oY29sdW1uKSB9fTwvbWF0LWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+e3sgcm93W2NvbHVtbi5uYW1lXSB9fTwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==