ontimize-web-ngx 15.7.1 → 15.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/esm2020/lib/components/app-sidenav/o-app-sidenav.component.mjs +1 -1
  2. package/esm2020/lib/components/filter-builder/o-filter-builder.component.mjs +1 -1
  3. package/esm2020/lib/components/input/date-range-legacy/o-daterange-picker.component.mjs +2 -2
  4. package/esm2020/lib/components/input/radio/o-radio.component.mjs +4 -3
  5. package/esm2020/lib/components/o-form-data-component.class.mjs +2 -2
  6. package/esm2020/lib/components/o-service-base-component.class.mjs +1 -1
  7. package/esm2020/lib/components/o-service-component.class.mjs +1 -1
  8. package/esm2020/lib/components/table/column/cell-renderer/cell-renderer.mjs +11 -4
  9. package/esm2020/lib/components/table/column/cell-renderer/chip/o-table-cell-renderer-chip.component.mjs +65 -0
  10. package/esm2020/lib/components/table/column/cell-renderer/index.mjs +3 -1
  11. package/esm2020/lib/components/table/column/cell-renderer/list/o-table-cell-renderer-list.component.mjs +41 -0
  12. package/esm2020/lib/components/table/column/o-table-column.component.mjs +8 -2
  13. package/esm2020/lib/components/table/extensions/default-o-table.datasource.mjs +4 -2
  14. package/esm2020/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column-data-dialog.component.mjs +3 -3
  15. package/esm2020/lib/components/table/extensions/header/table-header-select-all/o-table-header-select-all.component.mjs +3 -1
  16. package/esm2020/lib/components/table/extensions/o-table-strategy.service.mjs +9 -2
  17. package/esm2020/lib/components/table/o-table.component.mjs +254 -73
  18. package/esm2020/lib/components/table/o-table.module.mjs +35 -33
  19. package/esm2020/lib/interfaces/column-filter-change-event.interface.mjs +2 -0
  20. package/esm2020/lib/interfaces/index.mjs +2 -1
  21. package/esm2020/lib/layouts/form-layout/o-form-layout-manager.component.mjs +1 -1
  22. package/esm2020/lib/types/table/o-table-global-config.type.mjs +1 -1
  23. package/fesm2015/ontimize-web-ngx.mjs +383 -87
  24. package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
  25. package/fesm2020/ontimize-web-ngx.mjs +383 -87
  26. package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
  27. package/lib/components/app-sidenav/o-app-sidenav.component.d.ts +1 -1
  28. package/lib/components/filter-builder/o-filter-builder.component.d.ts +1 -1
  29. package/lib/components/input/radio/o-radio.component.d.ts +1 -0
  30. package/lib/components/o-service-base-component.class.d.ts +1 -1
  31. package/lib/components/o-service-component.class.d.ts +1 -1
  32. package/lib/components/table/column/cell-renderer/cell-renderer.d.ts +5 -1
  33. package/lib/components/table/column/cell-renderer/chip/o-table-cell-renderer-chip.component.d.ts +23 -0
  34. package/lib/components/table/column/cell-renderer/index.d.ts +2 -0
  35. package/lib/components/table/column/cell-renderer/list/o-table-cell-renderer-list.component.d.ts +14 -0
  36. package/lib/components/table/column/o-table-column.component.d.ts +2 -1
  37. package/lib/components/table/extensions/header/table-header-select-all/o-table-header-select-all.component.d.ts +2 -1
  38. package/lib/components/table/extensions/o-table-strategy.service.d.ts +2 -0
  39. package/lib/components/table/o-table.component.d.ts +21 -3
  40. package/lib/components/table/o-table.module.d.ts +48 -46
  41. package/lib/interfaces/column-filter-change-event.interface.d.ts +6 -0
  42. package/lib/interfaces/index.d.ts +1 -0
  43. package/lib/types/table/o-table-global-config.type.d.ts +2 -0
  44. package/package.json +1 -1
  45. package/theme.scss +26 -28
@@ -128,12 +128,16 @@ export const DEFAULT_INPUTS_O_TABLE = [
128
128
  'nonHidableColumns: non-hidable-columns',
129
129
  'readOnly: read-only',
130
130
  'readOnlyConfiguration: read-only-configuration',
131
- 'showNotificationOfReadOnly: show-notification-of-read-only'
131
+ 'showNotificationOfReadOnly: show-notification-of-read-only',
132
+ 'selectionOnRowClick: selection-on-row-click'
132
133
  ];
133
134
  export const DEFAULT_OUTPUTS_O_TABLE = [
134
135
  'onRowSelected',
135
136
  'onRowDeselected',
136
- 'onRowDeleted'
137
+ 'onRowDeleted',
138
+ 'onFilterByColumnChange',
139
+ 'onSortChange',
140
+ 'onSearch'
137
141
  ];
138
142
  const stickyHeaderSelector = '.mat-mdc-header-row .mat-mdc-table-sticky';
139
143
  const stickyFooterSelector = '.mat-mdc-footer-row .mat-mdc-table-sticky';
@@ -295,6 +299,7 @@ export class OTableComponent extends AbstractOServiceComponent {
295
299
  this.showResetWidthOption = true;
296
300
  this.readOnly = false;
297
301
  this.showNotificationOfReadOnly = false;
302
+ this.selectionOnRowClick = true;
298
303
  this.insertButton = true;
299
304
  this.refreshButton = true;
300
305
  this.deleteButton = true;
@@ -333,6 +338,7 @@ export class OTableComponent extends AbstractOServiceComponent {
333
338
  this.onReinitialize = new EventEmitter();
334
339
  this.onContentChange = new EventEmitter();
335
340
  this.onFilterByColumnChange = new EventEmitter();
341
+ this.onSortChange = new EventEmitter();
336
342
  this.showTotalsSubject = new BehaviorSubject(false);
337
343
  this.showTotals = this.showTotalsSubject.asObservable();
338
344
  this.loadingSortingSubject = new BehaviorSubject(false);
@@ -346,6 +352,7 @@ export class OTableComponent extends AbstractOServiceComponent {
346
352
  this.onUpdateScrolledState = new EventEmitter();
347
353
  this.storePaginationState = false;
348
354
  this.pageScrollVirtual = 1;
355
+ this.savedScrollPosition = 0;
349
356
  this.groupedColumnsArray = [];
350
357
  this._isColumnFiltersActive = false;
351
358
  this.groupingHeadersRows = [];
@@ -396,6 +403,12 @@ export class OTableComponent extends AbstractOServiceComponent {
396
403
  this.showReportOnDemandOption = oTableGlobalConfig.showReportOnDemandOption;
397
404
  }
398
405
  ;
406
+ if (Util.isDefined(oTableGlobalConfig.selectionOnRowClick)) {
407
+ this.selectionOnRowClick = oTableGlobalConfig.selectionOnRowClick;
408
+ }
409
+ if (Util.isDefined(oTableGlobalConfig.horizontalScroll)) {
410
+ this.horizontalScroll = oTableGlobalConfig.horizontalScroll;
411
+ }
399
412
  }
400
413
  catch (error) {
401
414
  }
@@ -750,9 +763,7 @@ export class OTableComponent extends AbstractOServiceComponent {
750
763
  if (Util.isDefined(this.oTableQuickFilterComponent)) {
751
764
  this.oTableQuickFilterComponent.setValue(this.state.quickFilterValue, false);
752
765
  this.quickFilterSubscription = this.oTableQuickFilterComponent.onChange.subscribe(val => {
753
- if (this.loadingService.handleProtected()) {
754
- this.onSearch.emit(val);
755
- }
766
+ this.onSearch.emit(val);
756
767
  });
757
768
  }
758
769
  }
@@ -1040,11 +1051,11 @@ export class OTableComponent extends AbstractOServiceComponent {
1040
1051
  registerSortListener() {
1041
1052
  if (Util.isDefined(this.sort)) {
1042
1053
  this.sortSubscription?.unsubscribe();
1043
- this.sortSubscription = this.sort.oSortChange.subscribe(this.onSortChange.bind(this));
1054
+ this.sortSubscription = this.sort.oSortChange.subscribe(this.handleSortChange.bind(this));
1044
1055
  this.sort.setMultipleSort(this.multipleSort);
1045
1056
  }
1046
1057
  }
1047
- onSortChange(sortArray) {
1058
+ handleSortChange(sortArray) {
1048
1059
  this.sortColArray = [];
1049
1060
  sortArray.forEach((sort) => {
1050
1061
  if (sort.direction !== '') {
@@ -1054,6 +1065,7 @@ export class OTableComponent extends AbstractOServiceComponent {
1054
1065
  });
1055
1066
  }
1056
1067
  });
1068
+ this.onSortChange.emit(this.sortColArray);
1057
1069
  if (this.pageable) {
1058
1070
  this.reloadData();
1059
1071
  }
@@ -1271,6 +1283,11 @@ export class OTableComponent extends AbstractOServiceComponent {
1271
1283
  ObservableWrapper.callEmit(this.onPaginatedDataLoaded, data);
1272
1284
  }
1273
1285
  ObservableWrapper.callEmit(this.onDataLoaded, this.daoTable.data);
1286
+ if (this.virtualScrollViewport && data.length > 0) {
1287
+ setTimeout(() => {
1288
+ this.initViewPort(data);
1289
+ }, 0);
1290
+ }
1274
1291
  }
1275
1292
  canSetStaticData(staticData) {
1276
1293
  return super.canSetStaticData(staticData) && Util.isDefined(this.daoTable);
@@ -1284,8 +1301,8 @@ export class OTableComponent extends AbstractOServiceComponent {
1284
1301
  }
1285
1302
  }
1286
1303
  projectContentChanged() {
1287
- this.initViewPort(this.dataSource.renderedData);
1288
- if (this.previousRendererData !== this.dataSource.renderedData) {
1304
+ const dataChanged = this.previousRendererData !== this.dataSource.renderedData;
1305
+ if (dataChanged) {
1289
1306
  this.previousRendererData = this.dataSource.renderedData;
1290
1307
  ObservableWrapper.callEmit(this.onContentChange, this.dataSource.renderedData);
1291
1308
  }
@@ -1477,52 +1494,82 @@ export class OTableComponent extends AbstractOServiceComponent {
1477
1494
  this.clickSubject.next({ row, column, cellRef, rowIndex, event });
1478
1495
  }
1479
1496
  doHandleClick(row, column, rowIndex, $event) {
1480
- if (this.readOnly && this.showNotificationOfReadOnly) {
1481
- this.snackBarService.open('MESSAGES.OPERATION_NOT_ALLOWED_READONLY');
1497
+ if (this.readOnly) {
1498
+ if (this.showNotificationOfReadOnly) {
1499
+ this.snackBarService.open('MESSAGES.OPERATION_NOT_ALLOWED_READONLY');
1500
+ }
1501
+ return;
1482
1502
  }
1483
- if (!this.oenabled || this.readOnly) {
1503
+ if (!this.oenabled) {
1484
1504
  return;
1485
1505
  }
1486
1506
  if ((this.detailMode === Codes.DETAIL_MODE_CLICK)) {
1487
- if (this.navigationService.isNavigating)
1488
- return;
1489
- this.navigationService.isNavigating = true;
1490
- this.onClick.emit({ row: row, rowIndex: rowIndex, mouseEvent: $event, columnName: column, cell: row[column] });
1491
- this.saveDataNavigationInLocalStorage();
1492
- this.clearSelection();
1493
- this.selectedRow(row);
1494
- this.viewDetail(row);
1507
+ this.handleDetailModeClick(row, column, rowIndex, $event);
1495
1508
  return;
1496
1509
  }
1497
- if (this.isSelectionModeMultiple() && ($event.ctrlKey || $event.metaKey)) {
1498
- this.selectedRow(row);
1499
- this.onClick.emit({ row: row, rowIndex: rowIndex, mouseEvent: $event, columnName: column, cell: row[column] });
1500
- }
1501
- else if (this.isSelectionModeMultiple() && $event.shiftKey) {
1502
- this.handleMultipleSelection(row);
1503
- }
1504
- else if (!this.isSelectionModeNone()) {
1505
- const selectedItems = this.getSelectedItems();
1506
- if (this.isRowSelected(row) && selectedItems.length === 1 && this.editionEnabled) {
1510
+ if (this.isSelectionModeMultiple()) {
1511
+ if ($event.ctrlKey || $event.metaKey) {
1512
+ this.handleMultipleSelectionCtrl(row, column, rowIndex, $event);
1507
1513
  return;
1508
1514
  }
1509
- else {
1510
- this.clearSelectionAndEditing();
1515
+ if ($event.shiftKey) {
1516
+ this.handleMultipleSelectionShift(row, column, rowIndex, $event);
1517
+ return;
1511
1518
  }
1519
+ }
1520
+ if (!this.isSelectionModeNone()) {
1521
+ this.handleOtherSelectionModes(row);
1522
+ }
1523
+ this.onClick.emit({ row: row, rowIndex: rowIndex, mouseEvent: $event, columnName: column, cell: row[column] });
1524
+ }
1525
+ handleOtherSelectionModes(row) {
1526
+ const selectedItems = this.getSelectedItems();
1527
+ if (this.isRowSelected(row) && selectedItems.length === 1 && this.editionEnabled) {
1528
+ return;
1529
+ }
1530
+ if (this.selectionOnRowClick) {
1531
+ this.toggleRowSelection(row);
1532
+ }
1533
+ }
1534
+ handleDetailModeClick(row, column, rowIndex, $event) {
1535
+ if (this.navigationService.isNavigating)
1536
+ return;
1537
+ this.navigationService.isNavigating = true;
1538
+ this.onClick.emit({ row: row, rowIndex: rowIndex, mouseEvent: $event, columnName: column, cell: row[column] });
1539
+ this.saveDataNavigationInLocalStorage();
1540
+ this.clearSelection();
1541
+ this.selectedRow(row);
1542
+ this.viewDetail(row);
1543
+ }
1544
+ handleMultipleSelectionCtrl(row, column, rowIndex, $event) {
1545
+ if (this.selectionOnRowClick) {
1512
1546
  this.selectedRow(row);
1513
- this.onClick.emit({ row: row, rowIndex: rowIndex, mouseEvent: $event, columnName: column, cell: row[column] });
1514
1547
  }
1548
+ this.onClick.emit({ row: row, rowIndex: rowIndex, mouseEvent: $event, columnName: column, cell: row[column] });
1549
+ }
1550
+ handleMultipleSelectionShift(row, column, rowIndex, $event) {
1551
+ if (this.selectionOnRowClick) {
1552
+ this.handleMultipleSelection(row);
1553
+ }
1554
+ this.onClick.emit({ row: row, rowIndex: rowIndex, mouseEvent: $event, columnName: column, cell: row[column] });
1515
1555
  }
1516
1556
  handleMultipleSelection(item) {
1517
- if (this.selection.selected.length > 0) {
1518
- const first = this.dataSource.renderedData.indexOf(this.selection.selected[0]);
1519
- const last = this.dataSource.renderedData.indexOf(item);
1520
- const indexFrom = Math.min(first, last);
1521
- const indexTo = Math.max(first, last);
1522
- this.clearSelection();
1523
- this.dataSource.renderedData.slice(indexFrom, indexTo + 1).forEach(e => this.selectedRow(e));
1524
- ObservableWrapper.callEmit(this.onClick, this.selection.selected);
1557
+ if (!this.isSelectionModeMultiple()) {
1558
+ return;
1525
1559
  }
1560
+ if (this.selection.selected.length === 0) {
1561
+ this.selectedMultiplesRows([item]);
1562
+ return;
1563
+ }
1564
+ const first = this.dataSource.renderedData.indexOf(this.selection.selected[0]);
1565
+ const last = this.dataSource.renderedData.indexOf(item);
1566
+ const indexFrom = Math.min(first, last);
1567
+ const indexTo = Math.max(first, last);
1568
+ const rowsInRange = this.dataSource.renderedData.slice(indexFrom, indexTo + 1);
1569
+ this.triggerSelectionEvents = false;
1570
+ this.selection.clear();
1571
+ this.triggerSelectionEvents = true;
1572
+ this.selectedMultiplesRows(rowsInRange);
1526
1573
  }
1527
1574
  saveDataNavigationInLocalStorage() {
1528
1575
  super.saveDataNavigationInLocalStorage();
@@ -1588,7 +1635,18 @@ export class OTableComponent extends AbstractOServiceComponent {
1588
1635
  const toUpdate = {};
1589
1636
  toUpdate[column.attr] = data[column.attr];
1590
1637
  const kv = this.extractKeysFromRecord(data);
1591
- return this.updateRecord(kv, toUpdate);
1638
+ const updateObservable = this.updateRecord(kv, toUpdate);
1639
+ if (updateObservable) {
1640
+ updateObservable.subscribe({
1641
+ next: (response) => {
1642
+ this.saveScrollPosition();
1643
+ },
1644
+ error: (error) => {
1645
+ console.error('Error updating cell:', error);
1646
+ }
1647
+ });
1648
+ }
1649
+ return updateObservable;
1592
1650
  }
1593
1651
  return undefined;
1594
1652
  }
@@ -1610,7 +1668,7 @@ export class OTableComponent extends AbstractOServiceComponent {
1610
1668
  }
1611
1669
  }
1612
1670
  initializeCheckboxColumn() {
1613
- if (!this.selectionChangeSubscription && this._oTableOptions.selectColumn.visible) {
1671
+ if (!this.selectionChangeSubscription && !this.isSelectionModeNone()) {
1614
1672
  this.selectionChangeSubscription = this.selection.changed.subscribe((selectionData) => {
1615
1673
  if (this.triggerSelectionEvents && selectionData) {
1616
1674
  if (selectionData.added.length > 0) {
@@ -1625,7 +1683,7 @@ export class OTableComponent extends AbstractOServiceComponent {
1625
1683
  this.updateSelectionColumnState();
1626
1684
  }
1627
1685
  updateSelectionColumnState() {
1628
- if (!this._oTableOptions.selectColumn.visible) {
1686
+ if (this.isSelectionModeNone()) {
1629
1687
  this.clearSelection();
1630
1688
  }
1631
1689
  if (this._oTableOptions.visibleColumns && this._oTableOptions.selectColumn.visible
@@ -1639,33 +1697,63 @@ export class OTableComponent extends AbstractOServiceComponent {
1639
1697
  this.updateStateExpandedColumn();
1640
1698
  }
1641
1699
  getNumRowSelectedInCurrentData() {
1642
- return this.dataSource?.renderedData ? this.dataSource.renderedData.filter(x => !this.isDisableCheckbox(x) && this.isRowSelected(x)).length : 0;
1700
+ if (!this.dataSource?.renderedData) {
1701
+ return 0;
1702
+ }
1703
+ return this.dataSource.renderedData.filter(x => !this.isDisableCheckbox(x) && this.isRowSelected(x))
1704
+ .length;
1643
1705
  }
1644
1706
  isAllSelected() {
1645
1707
  const numSelected = this.getNumRowSelectedInCurrentData();
1646
- const numRows = this.dataSource?.renderedData?.length ?? 0;
1647
- return numSelected > 0 && numSelected === numRows;
1708
+ const numSelectableRows = this.dataSource?.renderedData?.filter(row => !this.isDisableCheckbox(row)).length ?? 0;
1709
+ return numSelected > 0 && numSelected === numSelectableRows;
1648
1710
  }
1649
1711
  isIndeterminate() {
1650
1712
  const numSelected = this.getNumRowSelectedInCurrentData();
1651
- const numRows = this.dataSource?.renderedData?.length ?? 0;
1652
- return numSelected > 0 && numRows > 0 && numSelected !== numRows;
1713
+ const numSelectableRows = this.dataSource?.renderedData?.filter(row => !this.isDisableCheckbox(row)).length ?? 0;
1714
+ return numSelected > 0 && numSelected < numSelectableRows;
1653
1715
  }
1654
1716
  masterToggle(event) {
1655
1717
  event.checked ? this.selectAll() : this.clearSelection();
1656
1718
  }
1657
1719
  selectAll() {
1658
- this.dataSource.renderedData.forEach(row => this.setSelected(row));
1720
+ this.selectedMultiplesRows(this.dataSource.renderedData);
1659
1721
  }
1660
1722
  selectionCheckboxToggle(event, row) {
1661
- if (this.isSelectionModeSingle()) {
1662
- this.clearSelection();
1663
- }
1664
- event.checked ? this.selectedRow(row) : this.selection.deselect(row);
1665
- this.state.selection = this.selection.selected;
1723
+ this.toggleRowSelection(row);
1666
1724
  }
1667
1725
  selectedRow(row) {
1668
- this.setSelected(row);
1726
+ if (!this.canSelectRow(row)) {
1727
+ return;
1728
+ }
1729
+ this.selectedMultiplesRows([row]);
1730
+ }
1731
+ setSelectedMultiple(items) {
1732
+ if (this.isSelectionModeNone() || !items || items.length === 0) {
1733
+ return;
1734
+ }
1735
+ if (this.isSelectionModeSingle() && this.selection.selected.length > 0) {
1736
+ this.triggerSelectionEvents = false;
1737
+ this.selection.clear();
1738
+ this.triggerSelectionEvents = true;
1739
+ }
1740
+ this.triggerSelectionEvents = false;
1741
+ this.selection.select(...items);
1742
+ if (Util.isDefined(this.state)) {
1743
+ this.state.selection = this.selection.selected;
1744
+ }
1745
+ this.triggerSelectionEvents = true;
1746
+ ObservableWrapper.callEmit(this.onRowSelected, items);
1747
+ }
1748
+ selectedMultiplesRows(rows) {
1749
+ if (!rows || rows.length === 0) {
1750
+ return;
1751
+ }
1752
+ const validRows = this.filterValidRowsForSelection(rows);
1753
+ if (validRows.length === 0) {
1754
+ return;
1755
+ }
1756
+ this.setSelectedMultiple(validRows);
1669
1757
  this.cd.detectChanges();
1670
1758
  }
1671
1759
  clearSelection() {
@@ -1677,14 +1765,16 @@ export class OTableComponent extends AbstractOServiceComponent {
1677
1765
  }
1678
1766
  }
1679
1767
  setSelected(item) {
1680
- if (this.isDisableCheckbox(item)) {
1768
+ if (this.isSelectionModeNone()) {
1681
1769
  return;
1682
1770
  }
1683
- if (this.isRowSelected(item)) {
1684
- this.selection.clear(item);
1685
- }
1686
1771
  if (Util.isDefined(item)) {
1687
- this.selection.select(item);
1772
+ if (this.isRowSelected(item)) {
1773
+ this.selection.clear(item);
1774
+ }
1775
+ else {
1776
+ this.selection.select(item);
1777
+ }
1688
1778
  }
1689
1779
  }
1690
1780
  setSelectedByKeys(keyValues) {
@@ -1705,6 +1795,21 @@ export class OTableComponent extends AbstractOServiceComponent {
1705
1795
  get showDeleteButton() {
1706
1796
  return this.deleteButton;
1707
1797
  }
1798
+ canSelectRow(row) {
1799
+ if (!Util.isDefined(row)) {
1800
+ return false;
1801
+ }
1802
+ if (this.isSelectionModeNone()) {
1803
+ return false;
1804
+ }
1805
+ if (this.isDisableCheckbox(row)) {
1806
+ return false;
1807
+ }
1808
+ return true;
1809
+ }
1810
+ filterValidRowsForSelection(rows) {
1811
+ return rows.filter(row => this.canSelectRow(row));
1812
+ }
1708
1813
  getTrackByFunction() {
1709
1814
  const self = this;
1710
1815
  return (index, item) => {
@@ -1832,7 +1937,7 @@ export class OTableComponent extends AbstractOServiceComponent {
1832
1937
  if (this.oTableMenu && this.oTableMenu.columnFilterOption) {
1833
1938
  this.oTableMenu.columnFilterOption.setActive(this.isColumnFiltersActive);
1834
1939
  }
1835
- this.onFilterByColumnChange.emit();
1940
+ this.onFilterByColumnChange.emit({ action: 'remove' });
1836
1941
  if (this.oTableQuickFilterComponent) {
1837
1942
  this.oTableQuickFilterComponent.setValue(void 0);
1838
1943
  }
@@ -1844,20 +1949,32 @@ export class OTableComponent extends AbstractOServiceComponent {
1844
1949
  clearColumnFilter(attr, triggerDatasourceUpdate = true) {
1845
1950
  this.loadingService.setLoading(true);
1846
1951
  this.dataSource.clearColumnFilter(attr, triggerDatasourceUpdate);
1847
- this.onFilterByColumnChange.emit();
1952
+ this.onFilterByColumnChange.emit({
1953
+ action: 'remove',
1954
+ columns: [attr]
1955
+ });
1848
1956
  this.reloadPaginatedDataFromStart(false);
1849
1957
  }
1850
1958
  filterByColumn(columnValueFilter) {
1851
1959
  this.loadingService.setLoading(true);
1960
+ const existingFilter = this.getColumnValueFilterByAttr(columnValueFilter.attr);
1961
+ const action = existingFilter ? 'update' : 'add';
1852
1962
  this.dataSource.addColumnFilter(columnValueFilter);
1853
- this.onFilterByColumnChange.emit();
1963
+ this.onFilterByColumnChange.emit({
1964
+ action: action,
1965
+ columns: [columnValueFilter.attr],
1966
+ filters: [columnValueFilter]
1967
+ });
1854
1968
  if (this.pageable) {
1855
1969
  this.reloadPaginatedDataFromStart(false);
1856
1970
  }
1857
1971
  }
1858
1972
  clearColumnFilters(triggerDatasourceUpdate = true, columnsAttr) {
1859
1973
  this.dataSource.clearColumnFilters(triggerDatasourceUpdate, columnsAttr);
1860
- this.onFilterByColumnChange.emit();
1974
+ this.onFilterByColumnChange.emit({
1975
+ action: 'remove',
1976
+ columns: columnsAttr
1977
+ });
1861
1978
  this.reloadPaginatedDataFromStart(false);
1862
1979
  }
1863
1980
  isColumnFilterable(column) {
@@ -2166,7 +2283,11 @@ export class OTableComponent extends AbstractOServiceComponent {
2166
2283
  }
2167
2284
  if (Util.isDefined(storage.columnValueFilters)) {
2168
2285
  this.dataSource.initializeColumnsFilters(this.state.columnValueFilters);
2169
- this.onFilterByColumnChange.emit();
2286
+ this.onFilterByColumnChange.emit({
2287
+ action: 'add',
2288
+ columns: this.state.columnValueFilters.map(filter => filter.attr),
2289
+ filters: this.state.columnValueFilters
2290
+ });
2170
2291
  }
2171
2292
  if (this.oTableQuickFilterComponent) {
2172
2293
  this.oTableQuickFilterComponent.setValue(storage['filter']);
@@ -2182,6 +2303,12 @@ export class OTableComponent extends AbstractOServiceComponent {
2182
2303
  this.filterBuilder.triggerReload();
2183
2304
  }
2184
2305
  }
2306
+ getColumnValueFilters() {
2307
+ return this.dataSource.getColumnValueFilters();
2308
+ }
2309
+ getColumnValueFilterByAttr(attr) {
2310
+ return this.dataSource.getColumnValueFilterByAttr(attr);
2311
+ }
2185
2312
  onStoreConfigurationClicked() {
2186
2313
  if (this.oTableMenu) {
2187
2314
  this.oTableMenu.onStoreConfigurationClicked();
@@ -2390,6 +2517,47 @@ export class OTableComponent extends AbstractOServiceComponent {
2390
2517
  isRowSelected(row) {
2391
2518
  return !this.isSelectionModeNone() && this.selection.isSelected(row);
2392
2519
  }
2520
+ toggleRowSelection(row) {
2521
+ if (!this.canSelectRow(row)) {
2522
+ return;
2523
+ }
2524
+ if (this.isRowSelected(row)) {
2525
+ this.removeFromSelection([row]);
2526
+ }
2527
+ else if (this.isSelectionModeSingle()) {
2528
+ this.selectedRow(row);
2529
+ }
2530
+ else {
2531
+ this.addToSelection([row]);
2532
+ }
2533
+ }
2534
+ removeFromSelection(rows) {
2535
+ if (this.isSelectionModeNone() || !rows || rows.length === 0) {
2536
+ return;
2537
+ }
2538
+ const rowsToRemove = rows.filter(row => Util.isDefined(row) && this.isRowSelected(row));
2539
+ if (rowsToRemove.length === 0) {
2540
+ return;
2541
+ }
2542
+ this.selection.deselect(...rowsToRemove);
2543
+ if (Util.isDefined(this.state)) {
2544
+ this.state.selection = this.selection.selected;
2545
+ }
2546
+ }
2547
+ addToSelection(rows) {
2548
+ if (this.isSelectionModeNone() || this.isSelectionModeSingle()) {
2549
+ return;
2550
+ }
2551
+ const validRows = this.filterValidRowsForSelection(rows);
2552
+ const rowsToAdd = validRows.filter(row => !this.isRowSelected(row));
2553
+ if (rowsToAdd.length === 0) {
2554
+ return;
2555
+ }
2556
+ this.selection.select(...rowsToAdd);
2557
+ if (Util.isDefined(this.state)) {
2558
+ this.state.selection = this.selection.selected;
2559
+ }
2560
+ }
2393
2561
  getColumnWidthFromState(colDef) {
2394
2562
  let columnWidth = colDef.definition && colDef.definition.width ? colDef.definition.width : void 0;
2395
2563
  const storedData = this.state.getColumnDisplay(colDef);
@@ -2601,6 +2769,7 @@ export class OTableComponent extends AbstractOServiceComponent {
2601
2769
  this.parseSortColumns();
2602
2770
  }
2603
2771
  this.sort.setSortColumns(this.sortColArray);
2772
+ this.onSortChange.emit(sortColumns);
2604
2773
  this.refreshSortHeaders();
2605
2774
  }
2606
2775
  refreshSortHeaders() {
@@ -2699,11 +2868,13 @@ export class OTableComponent extends AbstractOServiceComponent {
2699
2868
  });
2700
2869
  }
2701
2870
  isDisableCheckbox(item) {
2702
- let disable = false;
2871
+ if (this.isSelectionModeNone()) {
2872
+ return true;
2873
+ }
2703
2874
  if (Util.isDefined(this.disableSelectionFunction)) {
2704
2875
  return this.disableSelectionFunction({ ...item });
2705
2876
  }
2706
- return disable;
2877
+ return false;
2707
2878
  }
2708
2879
  getService() {
2709
2880
  return this.dataService;
@@ -2739,6 +2910,12 @@ export class OTableComponent extends AbstractOServiceComponent {
2739
2910
  ;
2740
2911
  this.matTable?.removeHeaderRowDef(null);
2741
2912
  }
2913
+ saveScrollPosition() {
2914
+ if (this.virtualScrollViewport) {
2915
+ this.savedScrollPosition = this.virtualScrollViewport.measureScrollOffset();
2916
+ this.scrollStrategy.setSavedScrollPosition(this.savedScrollPosition);
2917
+ }
2918
+ }
2742
2919
  }
2743
2920
  OTableComponent.DEFAULT_BASE_SIZE_SPINNER = 100;
2744
2921
  OTableComponent.FIRST_LAST_CELL_PADDING = 24;
@@ -2746,7 +2923,7 @@ OTableComponent.EXPANDED_ROW_CONTAINER_CLASS = 'expanded-row-container-';
2746
2923
  OTableComponent.AVAILABLE_GROUPING_COLUMNS_RENDERERS = ['currency', 'integer', 'real'];
2747
2924
  OTableComponent.DEFAULT_ROW_HEIGHT = 36;
2748
2925
  OTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableComponent, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: i1.MatDialog }, { token: i0.ViewContainerRef }, { token: i0.ApplicationRef }, { token: forwardRef(() => OFormComponent), optional: true }, { token: VIRTUAL_SCROLL_STRATEGY, optional: true }], target: i0.ɵɵFactoryTarget.Component });
2749
- OTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableComponent, selector: "o-table", inputs: { visibleColumns: ["visible-columns", "visibleColumns"], defaultVisibleColumns: ["default-visible-columns", "defaultVisibleColumns"], sortColumns: ["sort-columns", "sortColumns"], quickFilterCallback: ["quick-filter-function", "quickFilterCallback"], deleteButton: ["delete-button", "deleteButton"], refreshButton: ["refresh-button", "refreshButton"], columnsVisibilityButton: ["columns-visibility-button", "columnsVisibilityButton"], exportButton: ["export-button", "exportButton"], showConfigurationOption: ["show-configuration-option", "showConfigurationOption"], showButtonsText: ["show-buttons-text", "showButtonsText"], selectAllCheckbox: ["select-all-checkbox", "selectAllCheckbox"], paginationControls: ["pagination-controls", "paginationControls"], fixedHeader: ["fixed-header", "fixedHeader"], showTitle: ["show-title", "showTitle"], editionMode: ["edition-mode", "editionMode"], selectionMode: ["selection-mode", "selectionMode"], horizontalScroll: ["horizontal-scroll", "horizontalScroll"], showPaginatorFirstLastButtons: ["show-paginator-first-last-buttons", "showPaginatorFirstLastButtons"], autoAlignTitles: ["auto-align-titles", "autoAlignTitles"], multipleSort: ["multiple-sort", "multipleSort"], selectAllCheckboxVisible: ["select-all-checkbox-visible", "selectAllCheckboxVisible"], orderable: "orderable", resizable: "resizable", keepSelectedItems: ["keep-selected-items", "keepSelectedItems"], exportMode: ["export-mode", "exportMode"], exportServiceType: ["export-service-type", "exportServiceType"], autoAdjust: ["auto-adjust", "autoAdjust"], showFilterOption: ["show-filter-option", "showFilterOption"], visibleExportDialogButtons: ["visible-export-dialog-buttons", "visibleExportDialogButtons"], rowClass: ["row-class", "rowClass"], filterColumnActiveByDefault: ["filter-column-active-by-default", "filterColumnActiveByDefault"], groupedColumns: ["grouped-columns", "groupedColumns"], groupable: "groupable", expandGroupsSameLevel: ["expand-groups-same-level", "expandGroupsSameLevel"], collapseGroupedColumns: ["collapse-grouped-columns", "collapseGroupedColumns"], virtualScroll: ["virtual-scroll", "virtualScroll"], contextMenu: ["context-menu", "contextMenu"], showExpandableIconFunction: ["show-expandable-icon-function", "showExpandableIconFunction"], showReportOnDemandOption: ["show-report-on-demand-option", "showReportOnDemandOption"], showChartsOnDemandOption: ["show-charts-on-demand-option", "showChartsOnDemandOption"], showResetWidthOption: ["show-reset-width-option", "showResetWidthOption"], disableSelectionFunction: ["disable-selection-function", "disableSelectionFunction"], nonHidableColumns: ["non-hidable-columns", "nonHidableColumns"], readOnly: ["read-only", "readOnly"], readOnlyConfiguration: ["read-only-configuration", "readOnlyConfiguration"], showNotificationOfReadOnly: ["show-notification-of-read-only", "showNotificationOfReadOnly"] }, outputs: { onRowSelected: "onRowSelected", onRowDeselected: "onRowDeselected", onRowDeleted: "onRowDeleted" }, host: { listeners: { "document:click": "handleDOMClick($event)", "window:resize": "updateScrolledState()" }, properties: { "class.o-table": "true", "class.ontimize-table": "true", "class.o-table-fixed": "fixedHeader", "class.o-table-disabled": "!enabled" } }, providers: [
2926
+ OTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableComponent, selector: "o-table", inputs: { visibleColumns: ["visible-columns", "visibleColumns"], defaultVisibleColumns: ["default-visible-columns", "defaultVisibleColumns"], sortColumns: ["sort-columns", "sortColumns"], quickFilterCallback: ["quick-filter-function", "quickFilterCallback"], deleteButton: ["delete-button", "deleteButton"], refreshButton: ["refresh-button", "refreshButton"], columnsVisibilityButton: ["columns-visibility-button", "columnsVisibilityButton"], exportButton: ["export-button", "exportButton"], showConfigurationOption: ["show-configuration-option", "showConfigurationOption"], showButtonsText: ["show-buttons-text", "showButtonsText"], selectAllCheckbox: ["select-all-checkbox", "selectAllCheckbox"], paginationControls: ["pagination-controls", "paginationControls"], fixedHeader: ["fixed-header", "fixedHeader"], showTitle: ["show-title", "showTitle"], editionMode: ["edition-mode", "editionMode"], selectionMode: ["selection-mode", "selectionMode"], horizontalScroll: ["horizontal-scroll", "horizontalScroll"], showPaginatorFirstLastButtons: ["show-paginator-first-last-buttons", "showPaginatorFirstLastButtons"], autoAlignTitles: ["auto-align-titles", "autoAlignTitles"], multipleSort: ["multiple-sort", "multipleSort"], selectAllCheckboxVisible: ["select-all-checkbox-visible", "selectAllCheckboxVisible"], orderable: "orderable", resizable: "resizable", keepSelectedItems: ["keep-selected-items", "keepSelectedItems"], exportMode: ["export-mode", "exportMode"], exportServiceType: ["export-service-type", "exportServiceType"], autoAdjust: ["auto-adjust", "autoAdjust"], showFilterOption: ["show-filter-option", "showFilterOption"], visibleExportDialogButtons: ["visible-export-dialog-buttons", "visibleExportDialogButtons"], rowClass: ["row-class", "rowClass"], filterColumnActiveByDefault: ["filter-column-active-by-default", "filterColumnActiveByDefault"], groupedColumns: ["grouped-columns", "groupedColumns"], groupable: "groupable", expandGroupsSameLevel: ["expand-groups-same-level", "expandGroupsSameLevel"], collapseGroupedColumns: ["collapse-grouped-columns", "collapseGroupedColumns"], virtualScroll: ["virtual-scroll", "virtualScroll"], contextMenu: ["context-menu", "contextMenu"], showExpandableIconFunction: ["show-expandable-icon-function", "showExpandableIconFunction"], showReportOnDemandOption: ["show-report-on-demand-option", "showReportOnDemandOption"], showChartsOnDemandOption: ["show-charts-on-demand-option", "showChartsOnDemandOption"], showResetWidthOption: ["show-reset-width-option", "showResetWidthOption"], disableSelectionFunction: ["disable-selection-function", "disableSelectionFunction"], nonHidableColumns: ["non-hidable-columns", "nonHidableColumns"], readOnly: ["read-only", "readOnly"], readOnlyConfiguration: ["read-only-configuration", "readOnlyConfiguration"], showNotificationOfReadOnly: ["show-notification-of-read-only", "showNotificationOfReadOnly"], selectionOnRowClick: ["selection-on-row-click", "selectionOnRowClick"] }, outputs: { onRowSelected: "onRowSelected", onRowDeselected: "onRowDeselected", onRowDeleted: "onRowDeleted", onFilterByColumnChange: "onFilterByColumnChange", onSortChange: "onSortChange", onSearch: "onSearch" }, host: { listeners: { "document:click": "handleDOMClick($event)", "window:resize": "updateScrolledState()" }, properties: { "class.o-table": "true", "class.ontimize-table": "true", "class.o-table-fixed": "fixedHeader", "class.o-table-disabled": "!enabled" } }, providers: [
2750
2927
  OntimizeServiceProvider,
2751
2928
  ComponentStateServiceProvider,
2752
2929
  OTableDataSourceService,
@@ -2755,7 +2932,7 @@ OTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", versio
2755
2932
  { provide: VIRTUAL_SCROLL_STRATEGY, useClass: OTableVirtualScrollStrategy },
2756
2933
  { provide: OTableBase, useExisting: forwardRef(() => OTableComponent) },
2757
2934
  OTableLoadingService
2758
- ], 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.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: [
2935
+ ], 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-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"] }, { 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: [
2759
2936
  trigger('detailExpand', [
2760
2937
  state('collapsed', style({ height: '0px', minHeight: '0' })),
2761
2938
  state('expanded', style({ height: '*' })),
@@ -2810,6 +2987,10 @@ __decorate([
2810
2987
  BooleanInputConverter(),
2811
2988
  __metadata("design:type", Boolean)
2812
2989
  ], OTableComponent.prototype, "showNotificationOfReadOnly", void 0);
2990
+ __decorate([
2991
+ BooleanInputConverter(),
2992
+ __metadata("design:type", Boolean)
2993
+ ], OTableComponent.prototype, "selectionOnRowClick", void 0);
2813
2994
  __decorate([
2814
2995
  BooleanInputConverter(),
2815
2996
  __metadata("design:type", Boolean)
@@ -2906,7 +3087,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2906
3087
  '[class.o-table-fixed]': 'fixedHeader',
2907
3088
  '[class.o-table-disabled]': '!enabled',
2908
3089
  '(document:click)': 'handleDOMClick($event)'
2909
- }, 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.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"] }]
3090
+ }, 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-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"] }]
2910
3091
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i1.MatDialog }, { type: i0.ViewContainerRef }, { type: i0.ApplicationRef }, { type: i32.OFormComponent, decorators: [{
2911
3092
  type: Optional
2912
3093
  }, {
@@ -2929,7 +3110,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2929
3110
  }], tableRowExpandable: [{
2930
3111
  type: ContentChild,
2931
3112
  args: [OTableRowExpandableComponent]
2932
- }], selectAllCheckbox: [], exportButton: [], showConfigurationOption: [], columnsVisibilityButton: [], showFilterOption: [], showReportOnDemandOption: [], showChartsOnDemandOption: [], showButtonsText: [], filterColumnActiveByDefault: [], showResetWidthOption: [], readOnly: [], showNotificationOfReadOnly: [], insertButton: [], refreshButton: [], deleteButton: [], fixedHeader: [], showTitle: [], horizontalScroll: [], showPaginatorFirstLastButtons: [], autoAlignTitles: [], multipleSort: [], orderable: [], resizable: [], autoAdjust: [], groupable: [], expandGroupsSameLevel: [], collapseGroupedColumns: [], virtualScroll: [], contextMenu: [], keepSelectedItems: [], tableBodyEl: [{
3113
+ }], selectAllCheckbox: [], exportButton: [], showConfigurationOption: [], columnsVisibilityButton: [], showFilterOption: [], showReportOnDemandOption: [], showChartsOnDemandOption: [], showButtonsText: [], filterColumnActiveByDefault: [], showResetWidthOption: [], readOnly: [], showNotificationOfReadOnly: [], selectionOnRowClick: [], insertButton: [], refreshButton: [], deleteButton: [], fixedHeader: [], showTitle: [], horizontalScroll: [], showPaginatorFirstLastButtons: [], autoAlignTitles: [], multipleSort: [], orderable: [], resizable: [], autoAdjust: [], groupable: [], expandGroupsSameLevel: [], collapseGroupedColumns: [], virtualScroll: [], contextMenu: [], keepSelectedItems: [], tableBodyEl: [{
2933
3114
  type: ViewChild,
2934
3115
  args: ['tableBody']
2935
3116
  }], tableHeaderEl: [{
@@ -2972,4 +3153,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2972
3153
  type: ViewChildren,
2973
3154
  args: [MatTooltip]
2974
3155
  }] } });
2975
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9vLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL28tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBSUwsY0FBYyxFQUNkLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBR04sUUFBUSxFQUNSLFNBQVMsRUFFVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFN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QUFTLE1BTUwsZ0JBQWdCLE1BVXBCLDZCQUE2QixNQUU3QixlQUFlLE1BRWYsWUFBWSxNQUVaLFNBQVMsTUFFVCxTQUFTLE1BRVQsVUFBVSxNQUVWLFNBQVMsTUFFVCxxQkFBcUIsTUFFckIsc0JBQXNCLE1BRXRCLGFBQWEsTUFFYixXQUFXLE1Bb0JYLGlCQUFpQixNQTRIUCxXQUFXO3NCQURwQixTQUFTO3VCQUFDLFdBQVc7Z0JBR3RCLGFBQWE7c0JBRFosU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUc5QyxjQUFjO3NCQURiLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHekIsSUFBSTtzQkFBekIsWUFBWTt1QkFBQyxNQUFNO2dCQUNXLFFBQVE7c0JBQXRDLFNBQVM7dUJBQUMsUUFBUTtnQkFnQm5CLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxXQUFXO2dCQUl0QixZQUFZO3NCQURYLGVBQWU7dUJBQUMscUJBQXFCO2dCQU10QyxZQUFZO3NCQURYLGVBQWU7dUJBQUMscUJBQXFCO2dCQUl0Qyx1QkFBdUI7c0JBRHRCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUtyRCxrQkFBa0I7c0JBRGpCLGVBQWU7dUJBQUMsMkJBQTJCO2dCQUk1QyxnQ0FBZ0M7c0JBRC9CLFlBQVk7dUJBQUMsOEJBQThCO2dCQU81QyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsZUFBZSxFQUFFLEVBQUU7Z0JBK0JqQyx1QkFBdUI7c0JBRHRCLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU0xRCxPQUFPO3NCQUROLFlBQVk7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uQ2hhbmdlLCBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IERvbVBvcnRhbE91dGxldCwgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgVklSVFVBTF9TQ1JPTExfU1RSQVRFR1kgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIEFwcGxpY2F0aW9uUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0TWVudSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFRhYiwgTWF0VGFiR3JvdXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBCb29sZWFuQ29udmVydGVyLCBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBDb21wb25lbnRTdGF0ZVNlcnZpY2VQcm92aWRlciwgT250aW1pemVTZXJ2aWNlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgU25hY2tCYXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc25hY2tiYXIuc2VydmljZSc7XG5pbXBvcnQgeyBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdGUvby10YWJsZS1jb21wb25lbnQtc3RhdGUuY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlQ29tcG9uZW50U3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdGUvby10YWJsZS1jb21wb25lbnQtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBPQ29sdW1uRGlzcGxheSwgT0ZpbHRlckRlZmluaXRpb24sIE9Hcm91cGVkQ29sdW1uVHlwZXMsIE9UYWJsZUdsb2JhbENvbmZpZyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi90eXBlcy9leHByZXNzaW9uLnR5cGUnO1xuaW1wb3J0IHsgT1Blcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9RdWVyeURhdGFBcmdzIH0gZnJvbSAnLi4vLi4vdHlwZXMvcXVlcnktZGF0YS1hcmdzLnR5cGUnO1xuaW1wb3J0IHsgUXVpY2tGaWx0ZXJGdW5jdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL3F1aWNrLWZpbHRlci1mdW5jdGlvbi50eXBlJztcbmltcG9ydCB7IFNRTE9yZGVyIH0gZnJvbSAnLi4vLi4vdHlwZXMvc3FsLW9yZGVyLnR5cGUnO1xuaW1wb3J0IHsgT0NvbHVtbkFnZ3JlZ2F0ZSB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tY29sdW1uLWFnZ3JlZ2F0ZS50eXBlJztcbmltcG9ydCB7IENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IsIE9Db2x1bW5WYWx1ZUZpbHRlciB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tY29sdW1uLXZhbHVlLWZpbHRlci50eXBlJztcbmltcG9ydCB7IFRhYmxlRmlsdGVyQnlDb2x1bW5EaWFsb2dSZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4tZGF0YS50eXBlJztcbmltcG9ydCB7IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtaW5pdGlhbGl6YXRpb24tb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IE9UYWJsZU1lbnVQZXJtaXNzaW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtbWVudS1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9UYWJsZVBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby10YWJsZS1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9ic2VydmFibGVXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbC9hc3luYyc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgRmlsdGVyRXhwcmVzc2lvblV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbC9maWx0ZXItZXhwcmVzc2lvbi51dGlscyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uc1V0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbC9wZXJtaXNzaW9ucyc7XG5pbXBvcnQgeyBTZXJ2aWNlVXRpbHMgfSBmcm9tICcuLi8uLi91dGlsL3NlcnZpY2UudXRpbHMnO1xuaW1wb3J0IHsgU1FMVHlwZXMgfSBmcm9tICcuLi8uLi91dGlsL3NxbHR5cGVzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgT0NvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi4vY29udGV4dG1lbnUvby1jb250ZXh0LW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IE9Gb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9vLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEFic3RyYWN0T1NlcnZpY2VDb21wb25lbnQgfSBmcm9tICcuLi9vLXNlcnZpY2UtY29tcG9uZW50LmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZUNvbHVtbkNhbGN1bGF0ZWRDb21wb25lbnQgfSBmcm9tICcuL2NvbHVtbi9jYWxjdWxhdGVkL28tdGFibGUtY29sdW1uLWNhbGN1bGF0ZWQuY29tcG9uZW50JztcbmltcG9ydCB7IE9CYXNlVGFibGVDZWxsUmVuZGVyZXIgfSBmcm9tICcuL2NvbHVtbi9jZWxsLXJlbmRlcmVyL28tYmFzZS10YWJsZS1jZWxsLXJlbmRlcmVyLmNsYXNzJztcbmltcG9ydCB7IE9Db2x1bW4gfSBmcm9tICcuL2NvbHVtbi9vLWNvbHVtbi5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2NvbHVtbi9vLXRhYmxlLWNvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlRXhwb3J0QnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zJztcbmltcG9ydCB7IE9UYWJsZUNvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2NvbnRleHRtZW51L28tdGFibGUtY29udGV4dC1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZWZhdWx0T1RhYmxlT3B0aW9ucyB9IGZyb20gJy4vZXh0ZW5zaW9ucy9kZWZhdWx0LW8tdGFibGUtb3B0aW9ucy5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvZGlhbG9nL2ZpbHRlci1ieS1jb2x1bW4vby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPQmFzZVRhYmxlUGFnaW5hdG9yIH0gZnJvbSAnLi9leHRlbnNpb25zL2Zvb3Rlci9wYWdpbmF0b3Ivby1iYXNlLXRhYmxlLXBhZ2luYXRvci5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWJ1dHRvbi9vLXRhYmxlLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlQ29sdW1uU2VsZWN0QWxsRGlyZWN0aXZlIH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW4tc2VsZWN0LWFsbC9vLXRhYmxlLWNvbHVtbi1zZWxlY3QtYWxsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPRmlsdGVyQ29sdW1uIH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW5zLWZpbHRlci9jb2x1bW5zL28tdGFibGUtY29sdW1ucy1maWx0ZXItY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW5zLWZpbHRlci9vLXRhYmxlLWNvbHVtbnMtZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5zR3JvdXBpbmdDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWNvbHVtbnMtZ3JvdXBpbmcvY29sdW1ucy9vLXRhYmxlLWNvbHVtbnMtZ3JvdXBpbmctY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWhlYWRlci9vLXRhYmxlLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9oZWFkZXIvdGFibGUtaW5zZXJ0YWJsZS1yb3cvby10YWJsZS1pbnNlcnRhYmxlLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlT3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1vcHRpb24vby10YWJsZS1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZURhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zL28tdGFibGUtZGF0YXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9UYWJsZVZpcnR1YWxTY3JvbGxTdHJhdGVneSB9IGZyb20gJy4vZXh0ZW5zaW9ucy9vLXRhYmxlLXN0cmF0ZWd5LnNlcnZpY2UnO1xuaW1wb3J0IHsgT1RhYmxlRGFvIH0gZnJvbSAnLi9leHRlbnNpb25zL28tdGFibGUuZGFvJztcbmltcG9ydCB7IE9UYWJsZUdyb3VwZWRSb3cgfSBmcm9tICcuL2V4dGVuc2lvbnMvcm93L28tdGFibGUtcm93LWdyb3VwLmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZVJvd0V4cGFuZGFibGVDb21wb25lbnQsIE9UYWJsZVJvd0V4cGFuZGVkQ2hhbmdlIH0gZnJvbSAnLi9leHRlbnNpb25zL3Jvdy90YWJsZS1yb3ctZXhwYW5kYWJsZS9vLXRhYmxlLXJvdy1leHBhbmRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPTWF0U29ydCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9zb3J0L28tbWF0LXNvcnQnO1xuaW1wb3J0IHsgT1RhYmxlQmFzZSB9IGZyb20gJy4vby10YWJsZS1iYXNlLmNsYXNzJztcbmltcG9ydCB7IE9fVEFCTEVfR0xPQkFMX0NPTkZJRyB9IGZyb20gJy4vdXRpbHMvby10YWJsZS50b2tlbnMnO1xuXG5pbXBvcnQgdHlwZSB7IElPQ29udGV4dE1lbnVDb250ZXh0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLWNvbnRleHQtbWVudS5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVCdXR0b24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtYnV0dG9uLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZUJ1dHRvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtYnV0dG9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVDb2x1bW5zR3JvdXBpbmcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtY29sdW1ucy1ncm91cGluZy1pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLWRhdGFzb3VyY2UuaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgT1RhYmxlTWVudSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1tZW51LmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVQYWdpbmF0b3IgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtcGFnaW5hdG9yLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZVF1aWNrZmlsdGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLXF1aWNrZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VSZXNwb25zZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2VydmljZS1yZXNwb25zZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT1F1ZXJ5UGFyYW1zIH0gZnJvbSAnLi4vLi4vdHlwZXMvcXVlcnktcGFyYW1zLnR5cGUnO1xuaW1wb3J0IHsgT19DT01QT05FTlRfU1RBVEVfU0VSVklDRSB9IGZyb20gJy4uLy4uL2luamVjdGlvbi10b2tlbnMnO1xuaW1wb3J0IHsgTWF0Um93LCBNYXRUYWJsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE9UYWJsZUZpbHRlckJ5Q29sdW1uU2VydmljZSB9IGZyb20gJy4vZXh0ZW5zaW9ucy9kaWFsb2cvZmlsdGVyLWJ5LWNvbHVtbi9vLXRhYmxlLWZpbHRlci1ieS1jb2x1bW4uc2VydmljZSc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uRGF0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGFnaW5hdGlvbi1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPVGFibGVMb2FkaW5nU2VydmljZSB9IGZyb20gJy4vby10YWJsZS1sb2FkaW5nLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9JTlBVVFNfT19UQUJMRSA9IFtcbiAgLy8gdmlzaWJsZS1jb2x1bW5zIFtzdHJpbmddOiB2aXNpYmxlIGNvbHVtbnMsIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAndmlzaWJsZUNvbHVtbnM6IHZpc2libGUtY29sdW1ucycsXG5cbiAgLy8gdmlzaWJsZS1jb2x1bW5zLWJ5LWRlZmF1bHQgW3N0cmluZ106IGNvbHVtbnMgdGhhdCBhcmUgdmlzaWJsZSBieSBkZWZhdWx0LCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2RlZmF1bHRWaXNpYmxlQ29sdW1uczogZGVmYXVsdC12aXNpYmxlLWNvbHVtbnMnLFxuXG4gIC8vIGVkaXRhYmxlLWNvbHVtbnMgW3N0cmluZ106IGNvbHVtbnMgdGhhdCBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IG92ZXIgdGhlIHRhYmxlLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgLy8gJ2VkaXRhYmxlQ29sdW1uczogZWRpdGFibGUtY29sdW1ucycsXG5cbiAgLy8gc29ydC1jb2x1bW5zIFtzdHJpbmddOiBpbml0aWFsIHNvcnRpbmcsIHdpdGggdGhlIGZvcm1hdCBjb2x1bW46W0FTQ3xERVNDXSwgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdzb3J0Q29sdW1uczogc29ydC1jb2x1bW5zJyxcblxuICAncXVpY2tGaWx0ZXJDYWxsYmFjazogcXVpY2stZmlsdGVyLWZ1bmN0aW9uJyxcblxuICAvLyBkZWxldGUtYnV0dG9uIFtub3x5ZXNdOiBzaG93IGRlbGV0ZSBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ2RlbGV0ZUJ1dHRvbjogZGVsZXRlLWJ1dHRvbicsXG5cbiAgLy8gcmVmcmVzaC1idXR0b24gW25vfHllc106IHNob3cgcmVmcmVzaCBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ3JlZnJlc2hCdXR0b246IHJlZnJlc2gtYnV0dG9uJyxcblxuICAvLyBjb2x1bW5zLXZpc2liaWxpdHktYnV0dG9uIFtub3x5ZXNdOiBzaG93IGNvbHVtbnMgdmlzaWJpbGl0eSBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ2NvbHVtbnNWaXNpYmlsaXR5QnV0dG9uOiBjb2x1bW5zLXZpc2liaWxpdHktYnV0dG9uJyxcblxuICAvLyAvLyBjb2x1bW5zLXJlc2l6ZS1idXR0b24gW25vfHllc106IHNob3cgY29sdW1ucyByZXNpemUgYnV0dG9uLiBEZWZhdWx0OiB5ZXMuXG4gIC8vICdjb2x1bW5zUmVzaXplQnV0dG9uOiBjb2x1bW5zLXJlc2l6ZS1idXR0b24nLFxuXG4gIC8vIC8vIGNvbHVtbnMtZ3JvdXAtYnV0dG9uIFtub3x5ZXNdOiBzaG93IGNvbHVtbnMgZ3JvdXAgYnV0dG9uLiBEZWZhdWx0OiB5ZXMuXG4gIC8vICdjb2x1bW5zR3JvdXBCdXR0b246IGNvbHVtbnMtZ3JvdXAtYnV0dG9uJyxcblxuICAvLyBleHBvcnQtYnV0dG9uIFtub3x5ZXNdOiBzaG93IGV4cG9ydCBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ2V4cG9ydEJ1dHRvbjogZXhwb3J0LWJ1dHRvbicsXG5cbiAgLy8gc2hvdy1jb25maWd1cmF0aW9uLW9wdGlvbiBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IGNvbmZpZ3VyYXRpb24gYnV0dG9uIGluIGhlYWRlci4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0NvbmZpZ3VyYXRpb25PcHRpb246IHNob3ctY29uZmlndXJhdGlvbi1vcHRpb24nLFxuXG4gIC8vIHNob3ctYnV0dG9ucy10ZXh0IFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgdGV4dCBvZiBoZWFkZXIgYnV0dG9ucy4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0J1dHRvbnNUZXh0OiBzaG93LWJ1dHRvbnMtdGV4dCcsXG5cbiAgLy8gc2VsZWN0LWFsbC1jaGVja2JveCBbeWVzfG5vfHRydWV8ZmFsc2VdOiAgc2hvdyBpbiB0aGUgbWVudSB0aGUgb3B0aW9uIG9mIHNlbGVjdGlvbiBjaGVjayBib3hlcyAuIERlZmF1bHQ6IG5vLlxuICAnc2VsZWN0QWxsQ2hlY2tib3g6IHNlbGVjdC1hbGwtY2hlY2tib3gnLFxuXG4gIC8vIHBhZ2luYXRpb24tY29udHJvbHMgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBwYWdpbmF0aW9uIGNvbnRyb2xzLiBEZWZhdWx0OiB5ZXMuXG4gICdwYWdpbmF0aW9uQ29udHJvbHM6IHBhZ2luYXRpb24tY29udHJvbHMnLFxuXG4gIC8vIGZpeC1oZWFkZXIgW3llc3xub3x0cnVlfGZhbHNlXTogZml4ZWQgaGVhZGVyIGFuZCBmb290ZXIgd2hlbiB0aGUgY29udGVudCBpcyBncmVhdGhlciB0aGFuIGl0cyBvd24gaGVpZ2h0LiBEZWZhdWx0OiB5ZXMuXG4gICdmaXhlZEhlYWRlcjogZml4ZWQtaGVhZGVyJyxcblxuICAvLyBzaG93LXRpdGxlIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgdGhlIHRhYmxlIHRpdGxlLiBEZWZhdWx0OiBuby5cbiAgJ3Nob3dUaXRsZTogc2hvdy10aXRsZScsXG5cbiAgLy8gZWRpdGlvbi1tb2RlIFtub25lIHwgaW5saW5lIHwgY2xpY2sgfCBkYmxjbGlja106IGVkaXRpb24gbW9kZS4gRGVmYXVsdCBub25lXG4gICdlZGl0aW9uTW9kZTogZWRpdGlvbi1tb2RlJyxcblxuICAvLyBzZWxlY3Rpb24tbW9kZSBbbm9uZSB8IHNpbXBsZSB8IG11bHRpcGxlIF06IHNlbGVjdGlvbiBtb2RlLiBEZWZhdWx0IG11bHRpcGxlXG4gICdzZWxlY3Rpb25Nb2RlOiBzZWxlY3Rpb24tbW9kZScsXG5cbiAgJ2hvcml6b250YWxTY3JvbGw6IGhvcml6b250YWwtc2Nyb2xsJyxcblxuICAnc2hvd1BhZ2luYXRvckZpcnN0TGFzdEJ1dHRvbnM6IHNob3ctcGFnaW5hdG9yLWZpcnN0LWxhc3QtYnV0dG9ucycsXG5cbiAgJ2F1dG9BbGlnblRpdGxlczogYXV0by1hbGlnbi10aXRsZXMnLFxuXG4gICdtdWx0aXBsZVNvcnQ6IG11bHRpcGxlLXNvcnQnLFxuICAvLyBzZWxlY3QtYWxsLWNoZWNrYm94LXZpc2libGUgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBzZWxlY3Rpb24gY2hlY2sgYm94ZXMuRGVmYXVsdDogbm8uXG4gICdzZWxlY3RBbGxDaGVja2JveFZpc2libGU6IHNlbGVjdC1hbGwtY2hlY2tib3gtdmlzaWJsZScsXG5cbiAgJ29yZGVyYWJsZScsXG5cbiAgJ3Jlc2l6YWJsZScsXG5cbiAgJ2tlZXBTZWxlY3RlZEl0ZW1zOiBrZWVwLXNlbGVjdGVkLWl0ZW1zJyxcblxuICAvLyBleHBvcnQtbW9kZSBbJ3Zpc2libGUnfCdsb2NhbCd8J2FsbCddOiBzZXRzIHRoZSBtb2RlIHRvIGV4cG9ydCBkYXRhLiBEZWZhdWx0OiAndmlzaWJsZSdcbiAgJ2V4cG9ydE1vZGU6IGV4cG9ydC1tb2RlJyxcblxuICAvLyBleHBvcnRTZXJ2aWNlVHlwZSBbIHN0cmluZyBdOiBUaGUgc2VydmljZSB1c2VkIGJ5IHRoZSB0YWJsZSBmb3IgZXhwb3J0aW5nIGl0J3MgZGF0YSwgaXQgbXVzdCBpbXBsZW1lbnQgJ0lFeHBvcnRTZXJ2aWNlJyBpbnRlcmZhY2UuIERlZmF1bHQ6ICdPbnRpbWl6ZUV4cG9ydFNlcnZpY2UnXG4gICdleHBvcnRTZXJ2aWNlVHlwZTogZXhwb3J0LXNlcnZpY2UtdHlwZScsXG5cbiAgLy8gYXV0by1hZGp1c3QgW3RydWV8ZmFsc2VdOiBBdXRvIGFkanVzdCBjb2x1bW4gd2lkdGggdG8gZml0IGl0cyBjb250ZW50LiBEZWZhdWx0OiB0cnVlXG4gICdhdXRvQWRqdXN0OiBhdXRvLWFkanVzdCcsXG5cbiAgLy8gc2hvdy1maWx0ZXItb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgZmlsdGVyIG1lbnUgb3B0aW9uIGluIHRoZSBoZWFkZXIgbWVudS4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0ZpbHRlck9wdGlvbjogc2hvdy1maWx0ZXItb3B0aW9uJyxcblxuICAvLyB2aXNpYmxlLWV4cG9ydC1kaWFsb2ctYnV0dG9ucyBbc3RyaW5nXTogdmlzaWJsZSBidXR0b25zIGluIGV4cG9ydCBkaWFsb2csIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQvbm8gY29uZmlndXJlZDogc2hvdyBhbGwuIEVtcHR5IHZhbHVlOiBoaWRlIGFsbC5cbiAgJ3Zpc2libGVFeHBvcnREaWFsb2dCdXR0b25zOiB2aXNpYmxlLWV4cG9ydC1kaWFsb2ctYnV0dG9ucycsXG5cbiAgLy8gcm93LWNsYXNzIFtmdW5jdGlvbiwgKHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlcikgPT4gc3RyaW5nIHwgc3RyaW5nW11dOiBhZGRzIHRoZSBjbGFzcyBvciBjbGFzc2VzIHJldHVybmVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvbiB0byB0aGUgdGFibGUgcm93cy5cbiAgJ3Jvd0NsYXNzOiByb3ctY2xhc3MnLFxuXG4gIC8vIGZpbHRlci1jb2x1bW4tYWN0aXZlLWJ5LWRlZmF1bHQgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBpY29uIGZpbHRlciBieSBkZWZhdWx0IGluIHRoZSB0YWJsZS4gRGVmYXVsdDp5ZXNcbiAgJ2ZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDpmaWx0ZXItY29sdW1uLWFjdGl2ZS1ieS1kZWZhdWx0JyxcblxuICAvLyBncm91cGVkLWNvbHVtbnMgW3N0cmluZ106IGdyb3VwZWQgY29sdW1ucyBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2dyb3VwZWRDb2x1bW5zOiBncm91cGVkLWNvbHVtbnMnLFxuXG4gIC8vIGdyb3VwYWJsZVtib29sZWFuXTogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBjb2x1bW4gY2FuIGJlIGdyb3VwYWJsZS4gQnkgZGVmYXVsdDogdHJ1ZVxuICAnZ3JvdXBhYmxlJyxcblxuICAvLyBleHBhbmQtZ3JvdXBzLXNhbWUtbGV2ZWxbYm9vbGVhbl06IEluZGljYXRlcyBpZiBjbGljayBpbiByb3cgZXhwYW5kcy9jb2xsYXBzZXMgYWxsIHJvd3Mgb24gc2FtZSBsZXZlbC4gQnkgZGVmYXVsdDogdHJ1ZVxuICAnZXhwYW5kR3JvdXBzU2FtZUxldmVsOiBleHBhbmQtZ3JvdXBzLXNhbWUtbGV2ZWwnLFxuXG4gIC8vIGNvbGxhcHNlLWdyb3VwZWQtY29sdW1ucyBbeWVzfG5vfHRydWV8ZmFsc2VdOiBXaGV0aGVyIGNvbGxhcHNlIHRoZSBncm91cGVkIGNvbHVtbnMgYnkgZGVmYXVsdFxuICAnY29sbGFwc2VHcm91cGVkQ29sdW1uczogY29sbGFwc2UtZ3JvdXBlZC1jb2x1bW5zJyxcblxuICAvLyB2aXJ0dWFsLXNjcm9sbCBbeWVzfG5vfHRydWV8ZmFsc2VdOiBXaGV0aGVyIGVuYWJsZWQgb3Igbm90IHRoZSB2aXJ0dWFsIHNjcm9sbFxuICAndmlydHVhbFNjcm9sbDogdmlydHVhbC1zY3JvbGwnLFxuXG4gIC8vY29udGV4dC1tZW51IFt5ZXN8bm98dHJ1ZXxmYWxzZV06IEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSB0YWJsZSBjb250ZXh0IG1lbnVcbiAgJ2NvbnRleHRNZW51OiBjb250ZXh0LW1lbnUnLFxuXG4gIC8vIHNob3ctZXhwYW5kYWJsZS1pY29uLWZ1bmN0aW9uIFtmdW5jdGlvbl06IEV4cGFuZGFibGUgZnVuY3Rpb24gdG8gY2hlY2sgaWYgZXhwYW5kYWJsZSBoYXMgZGF0YSB0byBzaG93IG9yIG5vdCBpY29uXG4gICdzaG93RXhwYW5kYWJsZUljb25GdW5jdGlvbjogc2hvdy1leHBhbmRhYmxlLWljb24tZnVuY3Rpb24nLFxuXG4gIC8vIHNob3ctcmVwb3J0LW9uLWRlbWFuZC1vcHRpb24gW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyByZXBvcnQgb24gZGVtYW5kIG9wdGlvbiBpbiB0aGUgdGFibGUgbWVudS4gRGVmYXVsdDogeWVzLlxuICAnc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uOiBzaG93LXJlcG9ydC1vbi1kZW1hbmQtb3B0aW9uJyxcblxuICAvLyBzaG93LWNoYXJ0cy1vbi1kZW1hbmQtb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgY2hhcnRzIG9uIGRlbWFuZCBvcHRpb24gaW4gdGhlIGhlYWRlciBtZW51XG4gICdzaG93Q2hhcnRzT25EZW1hbmRPcHRpb246IHNob3ctY2hhcnRzLW9uLWRlbWFuZC1vcHRpb24nLFxuXG4gIC8vIHNob3ctcmVzZXQtd2lkdGgtb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgcmVzZXQgd2lkdGggbWVudSBvcHRpb24gaW4gdGhlIGhlYWRlciBtZW51XG4gICdzaG93UmVzZXRXaWR0aE9wdGlvbjogc2hvdy1yZXNldC13aWR0aC1vcHRpb24nLFxuXG4gICdkaXNhYmxlU2VsZWN0aW9uRnVuY3Rpb246IGRpc2FibGUtc2VsZWN0aW9uLWZ1bmN0aW9uJyxcblxuICAnbm9uSGlkYWJsZUNvbHVtbnM6IG5vbi1oaWRhYmxlLWNvbHVtbnMnLFxuICAncmVhZE9ubHk6IHJlYWQtb25seScsXG4gICdyZWFkT25seUNvbmZpZ3VyYXRpb246IHJlYWQtb25seS1jb25maWd1cmF0aW9uJyxcbiAgJ3Nob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5OiBzaG93LW5vdGlmaWNhdGlvbi1vZi1yZWFkLW9ubHknXG5dO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PVVRQVVRTX09fVEFCTEUgPSBbXG4gICdvblJvd1NlbGVjdGVkJyxcbiAgJ29uUm93RGVzZWxlY3RlZCcsXG4gICdvblJvd0RlbGV0ZWQnXG5dO1xuXG5jb25zdCBzdGlja3lIZWFkZXJTZWxlY3RvciA9ICcubWF0LW1kYy1oZWFkZXItcm93IC5tYXQtbWRjLXRhYmxlLXN0aWNreSc7XG5jb25zdCBzdGlja3lGb290ZXJTZWxlY3RvciA9ICcubWF0LW1kYy1mb290ZXItcm93IC5tYXQtbWRjLXRhYmxlLXN0aWNreSc7XG5jb25zdCByb3dTZWxlY3RvciA9ICcubWF0LW1kYy1yb3cnO1xuY29uc3QgaGVhZGVyU2VsZWN0b3IgPSAnLm1hdC1tZGMtaGVhZGVyLXJvdyc7XG5jb25zdCBmb290ZXJTZWxlY3RvciA9ICcubWF0LW1kYy1oZWFkZXItcm93JztcblxudHlwZSBEaXNhYmxlU2VsZWN0aW9uRnVuY3Rpb24gPSAoaXRlbTogYW55KSA9PiBib29sZWFuO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL28tdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIE9udGltaXplU2VydmljZVByb3ZpZGVyLFxuICAgIENvbXBvbmVudFN0YXRlU2VydmljZVByb3ZpZGVyLFxuICAgIE9UYWJsZURhdGFTb3VyY2VTZXJ2aWNlLFxuICAgIE9UYWJsZUZpbHRlckJ5Q29sdW1uU2VydmljZSxcbiAgICB7IHByb3ZpZGU6IE9fQ09NUE9ORU5UX1NUQVRFX1NFUlZJQ0UsIHVzZUNsYXNzOiBPVGFibGVDb21wb25lbnRTdGF0ZVNlcnZpY2UgfSxcbiAgICB7IHByb3ZpZGU6IFZJUlRVQUxfU0NST0xMX1NUUkFURUdZLCB1c2VDbGFzczogT1RhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5IH0sXG4gICAgeyBwcm92aWRlOiBPVGFibGVCYXNlLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPVGFibGVDb21wb25lbnQpIH0sXG4gICAgT1RhYmxlTG9hZGluZ1NlcnZpY2VcbiAgXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQnLCBzdHlsZSh7IGhlaWdodDogJzBweCcsIG1pbkhlaWdodDogJzAnIH0pKSxcbiAgICAgIHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpLFxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcbiAgICBdKVxuICBdLFxuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fVEFCTEUsXG4gIG91dHB1dHM6IERFRkFVTFRfT1VUUFVUU19PX1RBQkxFLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Muby10YWJsZV0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5vbnRpbWl6ZS10YWJsZV0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5vLXRhYmxlLWZpeGVkXSc6ICdmaXhlZEhlYWRlcicsXG4gICAgJ1tjbGFzcy5vLXRhYmxlLWRpc2FibGVkXSc6ICchZW5hYmxlZCcsXG4gICAgJyhkb2N1bWVudDpjbGljayknOiAnaGFuZGxlRE9NQ2xpY2soJGV2ZW50KSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBPVGFibGVDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdE9TZXJ2aWNlQ29tcG9uZW50PE9UYWJsZUNvbXBvbmVudFN0YXRlU2VydmljZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9CQVNFX1NJWkVfU1BJTk5FUiA9IDEwMDtcbiAgcHVibGljIHN0YXRpYyBGSVJTVF9MQVNUX0NFTExfUEFERElORyA9IDI0O1xuICBwdWJsaWMgc3RhdGljIEVYUEFOREVEX1JPV19DT05UQUlORVJfQ0xBU1MgPSAnZXhwYW5kZWQtcm93LWNvbnRhaW5lci0nO1xuICBwdWJsaWMgc3RhdGljIEFWQUlMQUJMRV9HUk9VUElOR19DT0xVTU5TX1JFTkRFUkVSUyA9IFsnY3VycmVuY3knLCAnaW50ZWdlcicsICdyZWFsJ107XG5cbiAgcHVibGljIERFVEFJTF9NT0RFX05PTkUgPSBDb2Rlcy5ERVRBSUxfTU9ERV9OT05FO1xuICBwdWJsaWMgRURJVF9NT0RFX05PTkUgPSBDb2Rlcy5FRElUSU9OX01PREVfTk9ORTtcblxuICBwcm90ZWN0ZWQgc25hY2tCYXJTZXJ2aWNlOiBTbmFja0JhclNlcnZpY2U7XG5cbiAgcHVibGljIHBhZ2luYXRvcjogT1RhYmxlUGFnaW5hdG9yO1xuXG4gIHNvcnQ6IE9NYXRTb3J0O1xuICBjbGlja1N1YmplY3QgPSBuZXcgU3ViamVjdDx7IHJvdzogYW55LCBjb2x1bW46IGFueSwgY2VsbFJlZjogYW55LCByb3dJbmRleDogbnVtYmVyLCBldmVudDogTW91c2VFdmVudCB9PigpO1xuICBkYmxjbGlja1N1YmplY3QgPSBuZXcgU3ViamVjdDx7IHJvdzogYW55LCBjb2x1bW46IGFueSwgY2VsbFJlZjogYW55LCByb3dJbmRleDogbnVtYmVyLCBldmVudDogTW91c2VFdmVudCB9PigpO1xuICBwcm90ZWN0ZWQgY2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBkYkNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgcm93Q2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHJlZnJlc2hFeHBhbmRhYmxlUm93U3RhdGUgPSBmYWxzZTtcblxuICBsb2FkaW5nU2VydmljZTogT1RhYmxlTG9hZGluZ1NlcnZpY2U7XG5cbiAgQFZpZXdDaGlsZChPTWF0U29ydClcbiAgc2V0IG9NYXRTb3J0KF9zb3J0OiBPTWF0U29ydCkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChfc29ydCkgJiZcbiAgICAgICghVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSB8fCAoVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSAmJiBVdGlsLnN0cmluZ2lmeSh0aGlzLnNvcnQpICE9PSBVdGlsLnN0cmluZ2lmeShfc29ydCkpKSkge1xuICAgICAgdGhpcy5zb3J0ID0gX3NvcnQ7XG4gICAgICB0aGlzLnNldERhdGFzb3VyY2UoKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHZpcnR1YWxTY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuXG4gIHB1YmxpYyBvVGFibGVHbG9iYWxDb25maWc6IE9UYWJsZUdsb2JhbENvbmZpZztcbiAgQFZpZXdDaGlsZCgndmlydHVhbFNjcm9sbFZpZXdQb3J0Jykgc2V0IGNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCh2YWx1ZTogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgaWYgKHZhbHVlICE9IHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVIZWFkZXJBbmRGb290ZXJTdGlja3lQb3NpdGlvbnMoKTtcbiAgICAgIGlmICh0aGlzLmNoZWNrVmlld3BvcnRTaXplU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24gPSB0aGlzLmNoZWNrVmlld1BvcnRTdWJqZWN0LnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICBpZiAoeCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gb25seSBmb3IgaW5zaWRlVGFiQnVnV29ya2Fyb3VuZFxuICBwcm90ZWN0ZWQgdGFibGVIZWFkZXJzOiBBcnJheTxPVGFibGVIZWFkZXJDb21wb25lbnQ+ID0gW107XG5cbiAgQFZpZXdDaGlsZCgnc3Bpbm5lckNvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBzcGlubmVyQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoT1RhYmxlUm93RXhwYW5kYWJsZUNvbXBvbmVudClcbiAgdGFibGVSb3dFeHBhbmRhYmxlOiBPVGFibGVSb3dFeHBhbmRhYmxlQ29tcG9uZW50O1xuXG4gIF9maWx0ZXJDb2x1bW5zOiBBcnJheTxPRmlsdGVyQ29sdW1uPjtcbiAgcG9ydGFsSG9zdDogQXJyYXk8RG9tUG9ydGFsT3V0bGV0PiA9IFtdO1xuICBvbkRhdGFMb2FkZWRDZWxsUmVuZGVyZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgdGFibGVDb250ZXh0TWVudTogT0NvbnRleHRNZW51Q29tcG9uZW50O1xuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzZWxlY3RBbGxDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZXhwb3J0QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dDb25maWd1cmF0aW9uT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGNvbHVtbnNWaXNpYmlsaXR5QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dGaWx0ZXJPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dDaGFydHNPbkRlbWFuZE9wdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93QnV0dG9uc1RleHQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dSZXNldFdpZHRoT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEV4cGFuZGFibGUgaW5wdXQgY2FsbGJhY2sgZnVuY3Rpb25cbiAgc2hvd0V4cGFuZGFibGVJY29uRnVuY3Rpb246IChyb3c6IGFueSwgcm93SW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIHJlYWRPbmx5RnVuY3Rpb246IChjb25maWd1cmF0aW9uOiBhbnkpID0+IGJvb2xlYW47XG4gIHJlYWRPbmx5Q29uZmlndXJhdGlvbjogYW55O1xuXG4gIGlzQ29tcG9uZW50UmVhZE9ubHkoc2VsZWN0b3I6IHN0cmluZywgYXR0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZE9ubHlDb25maWd1cmF0aW9uPy5bc2VsZWN0b3JdPy5bYXR0cl07XG4gIH1cbiAgcHJvdGVjdGVkIF9vVGFibGVPcHRpb25zOiBPVGFibGVPcHRpb25zO1xuXG4gIGdldCBvVGFibGVPcHRpb25zKCk6IE9UYWJsZU9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLl9vVGFibGVPcHRpb25zO1xuICB9XG5cbiAgc2V0IG9UYWJsZU9wdGlvbnModmFsdWU6IE9UYWJsZU9wdGlvbnMpIHtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zID0gdmFsdWU7XG4gIH1cblxuICBzZXQgcXVpY2tGaWx0ZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB2YWx1ZSA9IFV0aWwucGFyc2VCb29sZWFuKFN0cmluZyh2YWx1ZSkpO1xuICAgIHRoaXMuX3F1aWNrRmlsdGVyID0gdmFsdWU7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5maWx0ZXIgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBxdWlja0ZpbHRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcXVpY2tGaWx0ZXI7XG4gIH1cblxuICBzZXQgZmlsdGVyQ2FzZVNlbnNpdGl2ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2ZpbHRlckNhc2VTZW5zaXRpdmUgPSBCb29sZWFuQ29udmVydGVyKHZhbHVlKTtcbiAgICBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucykge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5maWx0ZXJDYXNlU2Vuc2l0aXZlID0gdGhpcy5fZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgZmlsdGVyQ2FzZVNlbnNpdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgfVxuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBpbnNlcnRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcmVmcmVzaEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBkZWxldGVCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZml4ZWRIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1RpdGxlOiBib29sZWFuID0gZmFsc2U7XG4gIGVkaXRpb25Nb2RlOiBzdHJpbmcgPSBDb2Rlcy5FRElUSU9OX01PREVfTk9ORTtcbiAgc2VsZWN0aW9uTW9kZTogc3RyaW5nID0gQ29kZXMuU0VMRUNUSU9OX01PREVfTVVMVElQTEU7XG5cbiAgcHJvdGVjdGVkIF9ob3Jpem9udGFsU2Nyb2xsID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzZXQgaG9yaXpvbnRhbFNjcm9sbCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2hvcml6b250YWxTY3JvbGwgPSBCb29sZWFuQ29udmVydGVyKHZhbHVlKTtcbiAgICB0aGlzLnJlZnJlc2hDb2x1bW5zV2lkdGhGcm9tT3JpZ2luYWxEZWZpbml0aW9uKCk7XG4gIH1cblxuICBnZXQgaG9yaXpvbnRhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faG9yaXpvbnRhbFNjcm9sbDtcbiAgfVxuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93UGFnaW5hdG9yRmlyc3RMYXN0QnV0dG9uczogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBhdXRvQWxpZ25UaXRsZXM6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgbXVsdGlwbGVTb3J0OiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIG9yZGVyYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICByZXNpemFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgYXV0b0FkanVzdDogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBncm91cGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZXhwYW5kR3JvdXBzU2FtZUxldmVsOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGNvbGxhcHNlR3JvdXBlZENvbHVtbnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHZpcnR1YWxTY3JvbGw6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgY29udGV4dE1lbnU6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBNYWludGFpbmluZyB0aGlzIGdldHRlciB0byBhbGxvdyBjb21wb25lbnQgZXh0ZW5zaW9ucyAoYXZvaWRpbmcgYSBicmVha2luZyBjaGFuZ2UpXG4gIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9lbmFibGVkO1xuICB9XG4gIHByb3RlY3RlZCBfc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlOiBib29sZWFuO1xuICBzZXQgc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlID0gQm9vbGVhbkNvbnZlcnRlcih2YWx1ZSk7XG4gICAgaWYgKHRoaXMuc3RhdGUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdEFsbENoZWNrYm94VmlzaWJsZSA9IEJvb2xlYW5Db252ZXJ0ZXIodGhpcy5zdGF0ZS5zZWxlY3RDb2x1bW5WaXNpYmxlKTtcbiAgICB9XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9IHRoaXMuX3NlbGVjdEFsbENoZWNrYm94VmlzaWJsZTtcbiAgICB0aGlzLmluaXRpYWxpemVDaGVja2JveENvbHVtbigpO1xuICB9XG5cbiAgZ2V0IHNlbGVjdEFsbENoZWNrYm94VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlO1xuICB9XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGtlZXBTZWxlY3RlZEl0ZW1zOiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgZXhwb3J0TW9kZTogc3RyaW5nID0gQ29kZXMuRVhQT1JUX01PREVfVklTSUJMRTtcbiAgcHVibGljIGV4cG9ydFNlcnZpY2VUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyB2aXNpYmxlRXhwb3J0RGlhbG9nQnV0dG9uczogc3RyaW5nO1xuICBwdWJsaWMgZGFvVGFibGU6IE9UYWJsZURhbyB8IG51bGw7XG4gIHB1YmxpYyBkYXRhU291cmNlOiBPVGFibGVEYXRhU291cmNlIHwgbnVsbDtcbiAgcHVibGljIHZpc2libGVDb2x1bW5zOiBzdHJpbmc7XG4gIHB1YmxpYyBzZWFyY2hlYWJsZUNvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBkZWZhdWx0VmlzaWJsZUNvbHVtbnM6IHN0cmluZztcbiAgcHVibGljIGdyb3VwZWRDb2x1bW5zOiBzdHJpbmc7XG4gIHB1YmxpYyBub25IaWRhYmxlQ29sdW1uczogc3RyaW5nO1xuXG4gIHB1YmxpYyBzb3J0Q29sdW1uczogc3RyaW5nO1xuICBwdWJsaWMgZ3JvdXBlZENvbHVtblR5cGVzOiBPR3JvdXBlZENvbHVtblR5cGVzW10gPSBbXTtcbiAgcHVibGljIHJvd0NsYXNzOiAocm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyKSA9PiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKnBhcnNlZCBpbnB1dHMgdmFyaWFibGVzICovXG4gIHByb3RlY3RlZCBfdmlzaWJsZUNvbEFycmF5OiBzdHJpbmdbXSA9IFtdO1xuXG4gIGdldCB2aXNpYmxlQ29sQXJyYXkoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlQ29sQXJyYXk7XG4gIH1cblxuICBzZXQgdmlzaWJsZUNvbEFycmF5KGFyZzogYW55W10pIHtcbiAgICBjb25zdCBwZXJtaXNzaW9uc0Jsb2NrZWQgPSB0aGlzLnBlcm1pc3Npb25zPy5jb2x1bW5zPy5maWx0ZXIoY29sID0+IGNvbC52aXNpYmxlID09PSBmYWxzZSkubWFwKGNvbCA9PiBjb2wuYXR0cikgPz8gW107XG4gICAgY29uc3QgcGVybWlzc2lvbnNDaGVja2VkID0gYXJnLmZpbHRlcih2YWx1ZSA9PiBwZXJtaXNzaW9uc0Jsb2NrZWQuaW5kZXhPZih2YWx1ZSkgPT09IC0xKTtcblxuICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheSA9IHBlcm1pc3Npb25zQ2hlY2tlZDtcbiAgICBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucykge1xuICAgICAgY29uc3QgY29udGFpbnNTZWxlY3Rpb25Db2wgPSB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLmluZGV4T2YoQ29kZXMuTkFNRV9DT0xVTU5fU0VMRUNUKSAhPT0gLTE7XG4gICAgICBjb25zdCBjb250YWluc0V4cGFuZGFibGVDb2wgPSB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLmluZGV4T2YoQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSkgIT09IC0xO1xuICAgICAgaWYgKGNvbnRhaW5zU2VsZWN0aW9uQ29sKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheS51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCk7XG4gICAgICB9XG4gICAgICBpZiAoY29udGFpbnNTZWxlY3Rpb25Db2wgJiYgY29udGFpbnNFeHBhbmRhYmxlQ29sKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheSA9IFt0aGlzLl92aXNpYmxlQ29sQXJyYXlbMF1dLmNvbmNhdChDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFLCB0aGlzLl92aXNpYmxlQ29sQXJyYXkuc3BsaWNlKDEpKTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRhaW5zRXhwYW5kYWJsZUNvbCkge1xuICAgICAgICAgIHRoaXMuX3Zpc2libGVDb2xBcnJheS51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zID0gdGhpcy5fdmlzaWJsZUNvbEFycmF5O1xuICAgICAgdGhpcy5ncm91cGluZ0hlYWRlcnNSb3dzID0gdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5tYXAodmlzaWJsZUNvbCA9PiAnZ3JvdXBIZWFkZXItJyArIHZpc2libGVDb2wpO1xuICAgIH1cbiAgfVxuXG4gIHNvcnRDb2xBcnJheTogU1FMT3JkZXJbXSA9IFtdO1xuICAvKmVuZCBvZiBwYXJzZWQgaW5wdXRzIHZhcmlhYmxlcyAqL1xuXG4gIHByb3RlY3RlZCB0YWJHcm91cENvbnRhaW5lcjogTWF0VGFiR3JvdXA7XG4gIHByb3RlY3RlZCB0YWJDb250YWluZXI6IE1hdFRhYjtcbiAgdGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcm90ZWN0ZWQgcGVuZGluZ1F1ZXJ5OiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBwZW5kaW5nUXVlcnlGaWx0ZXIgPSB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIHNldFN0YXRpY0RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGF2b2lkUXVlcnlDb2x1bW5zOiBBcnJheTxhbnk+ID0gW107XG4gIHByb3RlY3RlZCBhc3luY0xvYWRDb2x1bW5zOiBBcnJheTxhbnk+ID0gW107XG4gIHByb3RlY3RlZCBhc3luY0xvYWRTdWJzY3JpcHRpb25zOiBvYmplY3QgPSB7fTtcblxuICBwcm90ZWN0ZWQgcXVlcnlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIGNvbnRleHRNZW51U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCB2aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBjaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgZmluaXNoUXVlcnlTdWJzY3JpcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgb25Sb3dTZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvblJvd0Rlc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25Sb3dEZWxldGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uUmVpbml0aWFsaXplOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uQ29udGVudENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvbkZpbHRlckJ5Q29sdW1uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcm90ZWN0ZWQgc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHVibGljIG9UYWJsZUZpbHRlckJ5Q29sdW1uRGF0YURpYWxvZ0NvbXBvbmVudDogT1RhYmxlRmlsdGVyQnlDb2x1bW5EYXRhRGlhbG9nQ29tcG9uZW50O1xuICBwdWJsaWMgb1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudDogT1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dUb3RhbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBzaG93VG90YWxzOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zaG93VG90YWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nU29ydGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmdTb3J0aW5nOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5sb2FkaW5nU29ydGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1Njcm9sbFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGxvYWRpbmdTY3JvbGw6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmxvYWRpbmdTY3JvbGxTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHB1YmxpYyBzaG93TG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBwdWJsaWMgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudDogT1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudDtcbiAgcHVibGljIHNob3dGaXJzdEluc2VydGFibGVSb3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNob3dMYXN0SW5zZXJ0YWJsZVJvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZXhwYW5kYWJsZUl0ZW06IFNlbGVjdGlvbk1vZGVsPGFueT47XG5cbiAgcHJvdGVjdGVkIGNsaWNrVGltZXI7XG4gIHByb3RlY3RlZCBjbGlja0RlbGF5ID0gMjAwO1xuICBwcm90ZWN0ZWQgY2xpY2tQcmV2ZW50ID0gZmFsc2U7XG4gIHB1YmxpYyBlZGl0aW5nQ2VsbDogYW55O1xuICBwcm90ZWN0ZWQgZWRpdGluZ1JvdzogYW55O1xuXG4gIHNldCBjdXJyZW50UGFnZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gdmFsO1xuICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gdmFsO1xuICAgICAgaWYgKHRoaXMubWF0cGFnaW5hdG9yKSB7XG4gICAgICAgIHRoaXMubWF0cGFnaW5hdG9yLnBhZ2VJbmRleCA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gIH1cblxuICBwdWJsaWMgb1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQ6IE9UYWJsZVF1aWNrZmlsdGVyO1xuICBwcm90ZWN0ZWQgc29ydFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgb25SZW5kZXJlZERhdGFDaGFuZ2U6IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIHByZXZpb3VzUmVuZGVyZXJEYXRhO1xuXG4gIHF1aWNrRmlsdGVyQ2FsbGJhY2s6IFF1aWNrRmlsdGVyRnVuY3Rpb247XG4gIGRpc2FibGVTZWxlY3Rpb25GdW5jdGlvbjogRGlzYWJsZVNlbGVjdGlvbkZ1bmN0aW9uO1xuXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQm9keScpXG4gIHByb3RlY3RlZCB0YWJsZUJvZHlFbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGFibGVIZWFkZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgdGFibGVIZWFkZXJFbDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGFibGVUb29sYmFyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHRhYmxlVG9vbGJhckVsOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGRyZW4oTWF0Um93KSByb3dzITogUXVlcnlMaXN0PE1hdFJvdz47XG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUpIHByb3RlY3RlZCBtYXRUYWJsZTogTWF0VGFibGU8YW55PjtcblxuICBob3Jpem9udGFsU2Nyb2xsZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBvblVwZGF0ZVNjcm9sbGVkU3RhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgcm93V2lkdGg7XG5cbiAgc3RvcmVQYWdpbmF0aW9uU3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiBJbiB0aGUgY2FzZSB0aGUgdGFibGUgaGF2ZW50IHBhZ2luYXRpb25Db250cm9sIGFuZCBwYWdlYWJsZSwgdGhlIHRhYmxlIGhhcyBwYWdpbmF0aW9uIHZpcnR1YWwqL1xuICBwYWdlU2Nyb2xsVmlydHVhbCA9IDE7XG5cbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1JPV19IRUlHSFQgPSAzNjtcbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zOiBPVGFibGVQZXJtaXNzaW9ucztcbiAgbWF0TWVudTogTWF0TWVudTtcblxuICBAVmlld0NoaWxkKCd0YWJsZU1lbnUnKVxuICBvVGFibGVNZW51OiBPVGFibGVNZW51O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oT1RhYmxlT3B0aW9uQ29tcG9uZW50KVxuICB0YWJsZU9wdGlvbnM6IFF1ZXJ5TGlzdDxPVGFibGVPcHRpb25Db21wb25lbnQ+O1xuXG4gIG9UYWJsZUJ1dHRvbnM6IE9UYWJsZUJ1dHRvbnM7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihPVGFibGVCdXR0b25Db21wb25lbnQpXG4gIHRhYmxlQnV0dG9uczogUXVlcnlMaXN0PE9UYWJsZUJ1dHRvbj47XG5cbiAgQENvbnRlbnRDaGlsZCgnby10YWJsZS1xdWlja2ZpbHRlcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHF1aWNrZmlsdGVyQ29udGVudENoaWxkOiBPVGFibGVRdWlja2ZpbHRlcjtcblxuXG4gIEBDb250ZW50Q2hpbGRyZW4oT1RhYmxlRXhwb3J0QnV0dG9uQ29tcG9uZW50KVxuICBleHBvcnRPcHRzVGVtcGxhdGU6IFF1ZXJ5TGlzdDxPVGFibGVFeHBvcnRCdXR0b25Db21wb25lbnQ+XG5cbiAgQENvbnRlbnRDaGlsZChPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmUpXG4gIHRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkOiBPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmU7XG5cblxuXG4gIHB1YmxpYyBncm91cGVkQ29sdW1uc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgW10pXG4gIHVwZGF0ZVNjcm9sbGVkU3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaG9yaXpvbnRhbFNjcm9sbCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZHlXaWR0aCA9IHRoaXMudGFibGVCb2R5RWwubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPSB0aGlzLnRhYmxlQm9keUVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSB0aGlzLmhvcml6b250YWxTY3JvbGxlZDtcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsU2Nyb2xsZWQgPSBzY3JvbGxXaWR0aCA+IGJvZHlXaWR0aDtcbiAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgIT09IHRoaXMuaG9yaXpvbnRhbFNjcm9sbGVkKSB7XG4gICAgICAgICAgdGhpcy5vblVwZGF0ZVNjcm9sbGVkU3RhdGUuZW1pdCh0aGlzLmhvcml6b250YWxTY3JvbGxlZCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrVmlld3BvcnRTaXplKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2lzQ29sdW1uRmlsdGVyc0FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBpc0NvbHVtbkZpbHRlcnNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQ29sdW1uRmlsdGVyc0FjdGl2ZTtcbiAgfVxuXG4gIHNldCBpc0NvbHVtbkZpbHRlcnNBY3RpdmUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNDb2x1bW5GaWx0ZXJzQWN0aXZlID0gdmFsO1xuICB9XG5cbiAgZ3JvdXBpbmdIZWFkZXJzUm93czogc3RyaW5nW10gPSBbXTtcblxuICBwdWJsaWMgb1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50OiBPVGFibGVDb2x1bW5zR3JvdXBpbmc7XG5cbiAgQENvbnRlbnRDaGlsZChPVGFibGVDb250ZXh0TWVudUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgY29udGV4dE1lbnVDb250ZW50Q2hpbGQ6IE9UYWJsZUNvbnRleHRNZW51Q29tcG9uZW50O1xuXG4gIHByb3RlY3RlZCB0cmlnZ2VyU2VsZWN0aW9uRXZlbnRzOiBib29sZWFuID0gdHJ1ZTtcblxuICBAVmlld0NoaWxkcmVuKE1hdFRvb2x0aXApXG4gIHRvb2x0aXA6IFF1ZXJ5TGlzdDxNYXRUb29sdGlwPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gT0Zvcm1Db21wb25lbnQpKSBmb3JtOiBPRm9ybUNvbXBvbmVudCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFZJUlRVQUxfU0NST0xMX1NUUkFURUdZKSBwdWJsaWMgcmVhZG9ubHkgc2Nyb2xsU3RyYXRlZ3k6IE9UYWJsZVZpcnR1YWxTY3JvbGxTdHJhdGVneVxuICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgZWxSZWYsIGZvcm0pO1xuICAgIHRoaXMubG9hZGluZ1NlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChPVGFibGVMb2FkaW5nU2VydmljZSk7XG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5zdWJzY3JpYmUoKGxvYWRpbmc6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyhsb2FkaW5nKTtcbiAgICB9KTtcbiAgICB0aGlzLnNob3dMb2FkaW5nID0gdGhpcy5sb2FkaW5nU2VydmljZS5zaG93TG9hZGluZyQ7XG5cbiAgICB0aGlzLl9vVGFibGVPcHRpb25zID0gbmV3IERlZmF1bHRPVGFibGVPcHRpb25zKCk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy50YWJHcm91cENvbnRhaW5lciA9IHRoaXMuaW5qZWN0b3IuZ2V0KE1hdFRhYkdyb3VwKTtcbiAgICAgIHRoaXMudGFiQ29udGFpbmVyID0gdGhpcy5pbmplY3Rvci5nZXQoTWF0VGFiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRG8gbm90aGluZyBkdWUgdG8gbm90IGFsd2F5cyBpcyBjb250YWluZWQgb24gdGFiLlxuICAgIH1cblxuICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoU25hY2tCYXJTZXJ2aWNlKTtcbiAgICB0aGlzLmdldEluamVjdGlvblRva2VuQ29uZmlnKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEluamVjdGlvblRva2VuQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvVGFibGVHbG9iYWxDb25maWcgPSB0aGlzLmluamVjdG9yLmdldChPX1RBQkxFX0dMT0JBTF9DT05GSUcpO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5hdXRvQWRqdXN0KSkge1xuICAgICAgICB0aGlzLmF1dG9BZGp1c3QgPSBvVGFibGVHbG9iYWxDb25maWcuYXV0b0FkanVzdDtcbiAgICAgIH07XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLmF1dG9BbGlnblRpdGxlcykpIHtcbiAgICAgICAgdGhpcy5hdXRvQWxpZ25UaXRsZXMgPSBvVGFibGVHbG9iYWxDb25maWcuYXV0b0FsaWduVGl0bGVzO1xuICAgICAgfVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQpKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0ID0gb1RhYmxlR2xvYmFsQ29uZmlnLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDtcbiAgICAgIH1cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuZWRpdGlvbk1vZGUpICYmIENvZGVzLmlzVmFsaWRFZGl0aW9uTW9kZShvVGFibGVHbG9iYWxDb25maWcuZWRpdGlvbk1vZGUpKSB7XG4gICAgICAgIHRoaXMuZWRpdGlvbk1vZGUgPSBvVGFibGVHbG9iYWxDb25maWcuZWRpdGlvbk1vZGU7XG4gICAgICB9XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLmRldGFpbE1vZGUgJiYgQ29kZXMuaXNWYWxpZERldGFpbE1vZGUob1RhYmxlR2xvYmFsQ29uZmlnLmRldGFpbE1vZGUpKSkge1xuICAgICAgICB0aGlzLmRldGFpbE1vZGUgPSBvVGFibGVHbG9iYWxDb25maWcuZGV0YWlsTW9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5yb3dIZWlnaHQpICYmIENvZGVzLmlzVmFsaWRSb3dIZWlnaHQob1RhYmxlR2xvYmFsQ29uZmlnLnJvd0hlaWdodCkpIHtcbiAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSBvVGFibGVHbG9iYWxDb25maWcucm93SGVpZ2h0O1xuICAgICAgfTtcblxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5zaG93Q2hhcnRzT25EZW1hbmRPcHRpb24pKSB7XG4gICAgICAgIHRoaXMuc2hvd0NoYXJ0c09uRGVtYW5kT3B0aW9uID0gb1RhYmxlR2xvYmFsQ29uZmlnLnNob3dDaGFydHNPbkRlbWFuZE9wdGlvbjtcbiAgICAgIH07XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLnNob3dSZXBvcnRPbkRlbWFuZE9wdGlvbikpIHtcbiAgICAgICAgdGhpcy5zaG93UmVwb3J0T25EZW1hbmRPcHRpb24gPSBvVGFibGVHbG9iYWxDb25maWcuc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uO1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRG8gbm90aGluZyBiZWNhdXNlIGlzIG9wdGlvbmFsXG4gICAgfVxuXG4gIH1cblxuICBnZXQgc3RhdGUoKTogT1RhYmxlQ29tcG9uZW50U3RhdGVDbGFzcyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U3RhdGVTZXJ2aWNlLnN0YXRlO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgaWYgKHRoaXMub1RhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm9UYWJsZUJ1dHRvbnMucmVnaXN0ZXJCdXR0b25zKHRoaXMudGFibGVCdXR0b25zLnRvQXJyYXkoKSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHN1cGVyLmFmdGVyVmlld0luaXQoKTtcbiAgICB0aGlzLmluaXRUYWJsZUFmdGVyVmlld0luaXQoKTtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm1hdE1lbnUgPSB0aGlzLm9UYWJsZU1lbnUubWF0TWVudTtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5yZWdpc3Rlck9wdGlvbnModGhpcy50YWJsZU9wdGlvbnMudG9BcnJheSgpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJsZVJvd0V4cGFuZGFibGUpIHtcbiAgICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0gPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS5tdWx0aXBsZSwgW10sIHRydWUsIHRoaXMuY29tcGFyZVJvdygpKTtcbiAgICAgIHRoaXMuY3JlYXRlRXhwYW5kYWJsZUNvbHVtbigpO1xuICAgICAgdGhpcy5leHBhbmRhYmxlSXRlbS5jaGFuZ2VkLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZVJvd0V4cGFuZFN0YXRlKGNoYW5nZS5hZGRlZCwgY2hhbmdlLnJlbW92ZWQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucm93Q2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3dzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlVGFibGVEYXRhQ2hhbmdlKCk7XG4gICAgfSk7XG5cblxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLnRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkKSB7XG4gICAgICB0aGlzLnNldEN1c3RvbURlZmluaXRpb25JblNlbGVjdENvbHVtbih0aGlzLnRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVRhYmxlRGF0YUNoYW5nZSgpIHtcbiAgICB0aGlzLnJlc3RvcmVFeHBhbmRhYmxlUm93U3RhdGUoKTtcbiAgfVxuXG4gIHNldEN1c3RvbURlZmluaXRpb25JblNlbGVjdENvbHVtbihkZWZpbml0aW9uOiBPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmUpIHtcbiAgICBpZiAoZGVmaW5pdGlvbi50aXRsZSkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udGl0bGUgPSBkZWZpbml0aW9uLnRpdGxlO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi53aWR0aCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ud2lkdGggPSBkZWZpbml0aW9uLndpZHRoO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi5taW5XaWR0aCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubWluV2lkdGggPSBkZWZpbml0aW9uLm1pbldpZHRoO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi5tYXhXaWR0aCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubWF4V2lkdGggPSBkZWZpbml0aW9uLm1heFdpZHRoO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi5yZXNpemFibGUpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnJlc2l6YWJsZSA9IGRlZmluaXRpb24ucmVzaXphYmxlO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3BOYW1lOiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfSk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjaGFuZ2VzLmF1dG9BZGp1c3QpICYmIGNoYW5nZXMuYXV0b0FkanVzdC5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuYXV0b0FkanVzdC5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLmF1dG9BZGp1c3QgPSBjaGFuZ2VzLmF1dG9BZGp1c3QuY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUhlYWRlckFuZEZvb3RlclN0aWNreVBvc2l0aW9ucygpIHtcbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IHpvbmUgPSB0aGlzLmluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uID0gdGhpcy5zY3JvbGxTdHJhdGVneS5zdGlja3lDaGFuZ2UucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZml4ZWRIZWFkZXIgfHwgdGhpcy5oYXNJbnNlcnRhYmxlUm93KCkpXG4gICAgICApLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN0aWNreUhlYWRlclNlbGVjdG9yKS5mb3JFYWNoKChlbDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnRvcCA9IC0geCArICdweCc7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3RpY2t5Rm9vdGVyU2VsZWN0b3IpLmZvckVhY2goKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm90dG9tID0geCArICdweCc7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUV4cGFuZGFibGVDb2x1bW4oKSB7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uID0gbmV3IE9Db2x1bW4oKTtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4udmlzaWJsZSA9IHRoaXMudGFibGVSb3dFeHBhbmRhYmxlICYmIHRoaXMudGFibGVSb3dFeHBhbmRhYmxlLmV4cGFuZGFibGVDb2x1bW5WaXNpYmxlO1xuICAgIHRoaXMudXBkYXRlU3RhdGVFeHBhbmRlZENvbHVtbigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG5cbiAgICAvL2RldGFjaCBhbGwgcG9ydGEgaG9zdCBjcmVhdGVkXG4gICAgaWYgKHRoaXMucG9ydGFsSG9zdCkge1xuICAgICAgdGhpcy5wb3J0YWxIb3N0LmZvckVhY2goeCA9PiB4LmRldGFjaCgpKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICBnZXRTdWZmaXhDb2x1bW5JbnNlcnRhYmxlKCkge1xuICAgIHJldHVybiBDb2Rlcy5TVUZGSVhfQ09MVU1OX0lOU0VSVEFCTEU7XG4gIH1cblxuICBnZXRBY3Rpb25zUGVybWlzc2lvbnMoKTogT1Blcm1pc3Npb25zW10ge1xuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zID8gKHRoaXMucGVybWlzc2lvbnMuYWN0aW9ucyB8fCBbXSkgOiBbXTtcbiAgfVxuXG4gIGdldE1lbnVQZXJtaXNzaW9ucygpOiBPVGFibGVNZW51UGVybWlzc2lvbnMge1xuICAgIGNvbnN0IHJlc3VsdDogT1RhYmxlTWVudVBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9ucyA/IHRoaXMucGVybWlzc2lvbnMubWVudSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDoge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBpdGVtczogW11cbiAgICB9O1xuICB9XG5cbiAgZ2V0T0NvbHVtblBlcm1pc3Npb25zKGF0dHI6IHN0cmluZyk6IE9QZXJtaXNzaW9ucyB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMucGVybWlzc2lvbnMgPyAodGhpcy5wZXJtaXNzaW9ucy5jb2x1bW5zIHx8IFtdKSA6IFtdO1xuICAgIHJldHVybiBjb2x1bW5zLmZpbmQoY29tcCA9PiBjb21wLmF0dHIgPT09IGF0dHIpIHx8IHsgYXR0cjogYXR0ciwgZW5hYmxlZDogdHJ1ZSwgdmlzaWJsZTogdHJ1ZSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFjdGlvblBlcm1pc3Npb25zKGF0dHI6IHN0cmluZyk6IE9QZXJtaXNzaW9ucyB7XG4gICAgY29uc3QgYWN0aW9uc1Blcm0gPSB0aGlzLnBlcm1pc3Npb25zID8gKHRoaXMucGVybWlzc2lvbnMuYWN0aW9ucyB8fCBbXSkgOiBbXTtcbiAgICBjb25zdCBwZXJtaXNzaW9uczogT1Blcm1pc3Npb25zID0gYWN0aW9uc1Blcm0uZmluZChwID0+IHAuYXR0ciA9PT0gYXR0cik7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zIHx8IHtcbiAgICAgIGF0dHI6IGF0dHIsXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihhdHRyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3Rpb25zUGVybSA9IHRoaXMucGVybWlzc2lvbnMgPyAodGhpcy5wZXJtaXNzaW9ucy5hY3Rpb25zIHx8IFtdKSA6IFtdO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zOiBPUGVybWlzc2lvbnMgPSBhY3Rpb25zUGVybS5maW5kKHAgPT4gcC5hdHRyID09PSBhdHRyKTtcbiAgICBjb25zdCBlbmFibGVkUGVybWlzaW9uID0gUGVybWlzc2lvbnNVdGlscy5jaGVja0VuYWJsZWRQZXJtaXNzaW9uKHBlcm1pc3Npb25zKTtcbiAgICBpZiAoIWVuYWJsZWRQZXJtaXNpb24pIHtcbiAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9QRVJNSVNTSU9OJyk7XG4gICAgfVxuICAgIHJldHVybiBlbmFibGVkUGVybWlzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB3aGF0IGluaXRpYWxpemUgdmFycyBhbmQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpOiBhbnkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcblxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMgPSBuZXcgRGVmYXVsdE9UYWJsZU9wdGlvbnMoKTtcbiAgICBpZiAodGhpcy50YWJHcm91cENvbnRhaW5lciAmJiB0aGlzLnRhYkNvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZWdpc3RlclRhYkxpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlckNsaWNrTGlzdGVuZXIoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRGJsQ2xpY2tMaXN0ZW5lcigpO1xuICAgIC8vIEluaXRpYWxpemUgcGFyYW1zIG9mIHRoZSB0YWJsZVxuICAgIHRoaXMuaW5pdGlhbGl6ZVBhcmFtcygpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplRGFvKCk7XG5cbiAgICB0aGlzLnBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuZ2V0VGFibGVQZXJtaXNzaW9ucyh0aGlzLm9hdHRyLCB0aGlzLmFjdFJvdXRlKTtcbiAgfVxuXG4gIGluaXRpYWxpemVMb2FkaW5nU3ViamVjdCgpIHtcbiAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNldExvYWRpbmcodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJDbGlja0xpc3RlbmVyKCkge1xuICAgIGlmICh0aGlzLmNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24gPSB0aGlzLmNsaWNrU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuY2xpY2tEZWxheSkpIC8vIEVzcGVyYSBlbCB0aWVtcG8gY29uZmlndXJhZG8gYW50ZXMgZGUgZWplY3V0YXJcbiAgICAgIC5zdWJzY3JpYmUoKHsgcm93LCBjb2x1bW4sIGNlbGxSZWYsIHJvd0luZGV4LCBldmVudCB9KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm9lbmFibGVkICYmICF0aGlzLnJlYWRPbmx5ICYmIGNvbHVtbi5lZGl0b3JcbiAgICAgICAgICAmJiAodGhpcy5kZXRhaWxNb2RlICE9PSBDb2Rlcy5ERVRBSUxfTU9ERV9DTElDSylcbiAgICAgICAgICAmJiAodGhpcy5lZGl0aW9uTW9kZSA9PT0gQ29kZXMuRURJVElPTl9NT0RFX0NMSUNLKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZhdGVDb2x1bW5FZGl0aW9uKGNvbHVtbiwgcm93LCBjZWxsUmVmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRvSGFuZGxlQ2xpY2socm93LCBjb2x1bW4uYXR0ciwgcm93SW5kZXgsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJEYmxDbGlja0xpc3RlbmVyKCkge1xuICAgIGlmICh0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5kYkNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbiA9IHRoaXMuZGJsY2xpY2tTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5jbGlja0RlbGF5KSkgLy8gRXNwZXJhIGVsIHRpZW1wbyBjb25maWd1cmFkbyBhbnRlcyBkZSBlamVjdXRhclxuICAgICAgLnN1YnNjcmliZSgoeyByb3csIGNvbHVtbiwgY2VsbFJlZiwgcm93SW5kZXgsIGV2ZW50IH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgICBpZiAodGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vZW5hYmxlZCAmJiBjb2x1bW4uZWRpdG9yXG4gICAgICAgICAgJiYgKCFDb2Rlcy5pc0RvdWJsZUNsaWNrTW9kZSh0aGlzLmRldGFpbE1vZGUpKVxuICAgICAgICAgICYmIChDb2Rlcy5pc0RvdWJsZUNsaWNrTW9kZSh0aGlzLmVkaXRpb25Nb2RlKSkpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlQ29sdW1uRWRpdGlvbihjb2x1bW4sIHJvdywgY2VsbFJlZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRvdWJsZUNsaWNrLmVtaXQoeyByb3c6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4LCBtb3VzZUV2ZW50OiBldmVudCwgY29sdW1uTmFtZTogY29sdW1uLmF0dHIsIGNlbGw6IHJvd1tjb2x1bW4uYXR0cl0gfSk7XG4gICAgICAgICAgaWYgKHRoaXMub2VuYWJsZWQgJiYgQ29kZXMuaXNEb3VibGVDbGlja01vZGUodGhpcy5kZXRhaWxNb2RlKSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGV0YWlsKHJvdyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVEYW8oKSB7XG4gICAgLy8gQ29uZmlndXJlIGRhbyBtZXRob2RzXG4gICAgY29uc3QgcXVlcnlNZXRob2ROYW1lID0gdGhpcy5wYWdlYWJsZSA/IHRoaXMucGFnaW5hdGVkUXVlcnlNZXRob2QgOiB0aGlzLnF1ZXJ5TWV0aG9kO1xuICAgIGNvbnN0IG1ldGhvZHMgPSB7XG4gICAgICBxdWVyeTogcXVlcnlNZXRob2ROYW1lLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZU1ldGhvZCxcbiAgICAgIGRlbGV0ZTogdGhpcy5kZWxldGVNZXRob2QsXG4gICAgICBpbnNlcnQ6IHRoaXMuaW5zZXJ0TWV0aG9kXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnN0YXRpY0RhdGEpIHtcbiAgICAgIHRoaXMucXVlcnlPbkJpbmQgPSBmYWxzZTtcbiAgICAgIHRoaXMucXVlcnlPbkluaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGFvVGFibGUgPSBuZXcgT1RhYmxlRGFvKHVuZGVmaW5lZCwgdGhpcy5lbnRpdHksIG1ldGhvZHMpO1xuICAgICAgdGhpcy5zZXREYXRhQXJyYXkodGhpcy5zdGF0aWNEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWd1cmVTZXJ2aWNlKCk7XG4gICAgICB0aGlzLmRhb1RhYmxlID0gbmV3IE9UYWJsZURhbyh0aGlzLmRhdGFTZXJ2aWNlLCB0aGlzLmVudGl0eSwgbWV0aG9kcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHJlaW5pdGlhbGl6ZSB0YWJsZSBhZGRpbmcgb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgcmVpbml0aWFsaXplKG9wdGlvbnM6IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBjb25zdCBjbG9uZWRPcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnZW50aXR5JykpIHtcbiAgICAgICAgdGhpcy5lbnRpdHkgPSBjbG9uZWRPcHRzLmVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdzZXJ2aWNlJykpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gY2xvbmVkT3B0cy5zZXJ2aWNlO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2NvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBjbG9uZWRPcHRzLmNvbHVtbnM7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgndmlzaWJsZUNvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gY2xvbmVkT3B0cy52aXNpYmxlQ29sdW1ucztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmlzaWJsZUNvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLmRlZmF1bHRWaXNpYmxlQ29sdW1ucyA9IGNsb25lZE9wdHMuZGVmYXVsdFZpc2libGVDb2x1bW5zO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2tleXMnKSkge1xuICAgICAgICB0aGlzLmtleXMgPSBjbG9uZWRPcHRzLmtleXM7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnc29ydENvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLnNvcnRDb2x1bW5zID0gY2xvbmVkT3B0cy5zb3J0Q29sdW1ucztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdwYXJlbnRLZXlzJykpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRLZXlzID0gY2xvbmVkT3B0cy5wYXJlbnRLZXlzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyQ29sdW1ucycpKSB7XG4gICAgICAgIGlmICghdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50ID0gbmV3IE9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQodGhpcy5pbmplY3RvciwgdGhpcyk7XG4gICAgICAgICAgdGhpcy5vVGFibGVNZW51Lm9uVmlzaWJsZUZpbHRlck9wdGlvbkNoYW5nZS5uZXh0KHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0KTtcbiAgICAgICAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1ucyA9IGNsb25lZE9wdHMuZmlsdGVyQ29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1ucyA9IHRoaXMuc2VhcmNoZWFibGVDb2x1bW5zLmpvaW4oXCI7XCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zdGF0ZS5yZXNldCh0aGlzLnBhZ2VhYmxlKTtcbiAgICBpZiAob3B0aW9ucz8uZGF0YSkge1xuICAgICAgdGhpcy5zZXREYXRhKG9wdGlvbnMuZGF0YS5kYXRhLCBvcHRpb25zLmRhdGE/LnNxbFR5cGVzKTtcbiAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbkluZm8ob3B0aW9ucy5kYXRhLmRhdGEpO1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDA7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy5wYWdpbmF0aW9uRGF0YSkge1xuICAgICAgdGhpcy5yZWluaXRpYWxpemVQYWdpbmF0aW9uSW5mbyhvcHRpb25zLnBhZ2luYXRpb25EYXRhKTtcbiAgICB9XG4gICAgdGhpcy5pbml0VGFibGVBZnRlclZpZXdJbml0KCk7XG4gICAgdGhpcy5vblJlaW5pdGlhbGl6ZS5lbWl0KG51bGwpO1xuICB9XG5cbiAgcmVpbml0aWFsaXplUGFnaW5hdGlvbkluZm8ocGFnaW5hdGlvbkRhdGE6IFBhZ2luYXRpb25EYXRhKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2luYXRpb25EYXRhLnBhZ2VOdW1iZXI7XG4gICAgdGhpcy5xdWVyeVJvd3MgPSBwYWdpbmF0aW9uRGF0YS5wYWdlU2l6ZTtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgaWYgKHBhZ2luYXRpb25EYXRhLnN0YXJ0UmVjb3JkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHRFbmRJbmRleCA9IHBhZ2luYXRpb25EYXRhLnN0YXJ0UmVjb3JkSW5kZXggKyAodGhpcy5nZXREYXRhQXJyYXkoKSA/IHRoaXMuZ2V0RGF0YUFycmF5KCkubGVuZ3RoIDogMCk7XG4gICAgICAgIHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQgPSByZXN1bHRFbmRJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmIChwYWdpbmF0aW9uRGF0YS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc3RhdGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXIgPSBwYWdpbmF0aW9uRGF0YS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSB0aGlzLnN0YXRlLnF1ZXJ5UmVjb3JkT2Zmc2V0ID09IDAgPyAwIDogdGhpcy5kYXRhU2VydmljZT8uZ2V0UGFnaW5hdGlvbkNvbnRleHQoKS5wYWdlTnVtYmVyO1xuICAgICAgc3VwZXIudXBkYXRlUGFnaW5hdGlvbkNvbnRleHQoeyBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyLCBvZmZzZXQ6IHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQsIHRvdGFsU2l6ZTogdGhpcy5zdGF0ZS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciwgcGFnZVNpemU6IHRoaXMuc3RhdGUucXVlcnlSb3dzIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25Db250ZXh0KHsgdG90YWxTaXplOiB0aGlzLmdldERhdGFBcnJheSgpLmxlbmd0aCB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0VGFibGVBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMucGFyc2VWaXNpYmxlQ29sdW1ucygpO1xuICAgIHRoaXMucGFyc2VTZWFyY2hlYWJsZUNvbHVtbnMoKTtcbiAgICB0aGlzLnNldERhdGFzb3VyY2UoKTtcbiAgICB0aGlzLnBhcnNlR3JvdXBlZENvbHVtbnMoKTtcbiAgICB0aGlzLnBhcnNlR3JvdXBlZENvbHVtblR5cGVzKCk7XG4gICAgdGhpcy5wYXJzZVNvcnRDb2x1bW5zKCk7XG4gICAgdGhpcy5zZXRGaWx0ZXJzQ29uZmlndXJhdGlvbigpO1xuICAgIHRoaXMuYWRkRGVmYXVsdFJvd0J1dHRvbnMoKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQpKSB7XG4gICAgICB0aGlzLnNldEdyb3VwQ29sdW1ucyh0aGlzLm9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudC5jb2x1bW5zQXJyYXkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVyeU9uSW5pdCkge1xuICAgICAgdGhpcy5xdWVyeURhdGEoKTtcbiAgICB9XG4gIH1cbiAgcGFyc2VTZWFyY2hlYWJsZUNvbHVtbnMoKSB7XG4gICAgdGhpcy5zZWFyY2hlYWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2xBcnJheS5maWx0ZXIoY29sID0+IHtcbiAgICAgIGNvbnN0IG9Db2wgPSB0aGlzLmdldE9Db2x1bW4oY29sKTtcbiAgICAgIHJldHVybiBvQ29sICYmIG9Db2wuc2VhcmNoYWJsZTtcbiAgICB9KVxuXG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgaWYgKHRoaXMudGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNvcnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UpIHtcbiAgICAgIHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjcm9sbFN0cmF0ZWd5KSB7XG4gICAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGJDbGlja1N1YmplY3RTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGJDbGlja1N1YmplY3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm93Q2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvd0NoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9ucykuZm9yRWFjaChpZHggPT4ge1xuICAgICAgaWYgKHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9uc1tpZHhdKSB7XG4gICAgICAgIHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9uc1tpZHhdLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5sb2FkaW5nU2VydmljZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU2VydmljZS5uZ09uRGVzdHJveT8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGRhdGUgc3RvcmUgbG9jYWxzdG9yYWdlLCBjYWxsIG9mIHRoZSBJTG9jYWxTdG9yYWdlXG4gICAqL1xuICBnZXREYXRhVG9TdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2UuZ2V0RGF0YVRvU3RvcmUoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyUXVpY2tGaWx0ZXIoYXJnOiBhbnkpIHtcbiAgICBjb25zdCBxdWlja0ZpbHRlciA9IChhcmcgYXMgT1RhYmxlUXVpY2tmaWx0ZXIpO1xuICAgIC8vIGZvcmNpbmcgcXVpY2tGaWx0ZXJDb21wb25lbnQgdG8gYmUgdW5kZWZpbmVkLCB0YWJsZSB1c2VzIG9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50XG4gICAgdGhpcy5xdWlja0ZpbHRlckNvbXBvbmVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50ID0gcXVpY2tGaWx0ZXI7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50LnNldFZhbHVlKHRoaXMuc3RhdGUucXVpY2tGaWx0ZXJWYWx1ZSwgZmFsc2UpO1xuICAgICAgdGhpcy5xdWlja0ZpbHRlclN1YnNjcmlwdGlvbiA9IHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQub25DaGFuZ2Uuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTZXJ2aWNlLmhhbmRsZVByb3RlY3RlZCgpKSB7XG4gICAgICAgICAgdGhpcy5vblNlYXJjaC5lbWl0KHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyUGFnaW5hdGlvbih2YWx1ZTogT1RhYmxlUGFnaW5hdG9yKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uQ29udHJvbHMgPSB0cnVlO1xuICAgIHRoaXMucGFnaW5hdG9yID0gdmFsdWU7XG4gIH1cblxuICByZWdpc3RlckNvbnRleHRNZW51KHZhbHVlOiBPQ29udGV4dE1lbnVDb21wb25lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnRhYmxlQ29udGV4dE1lbnUgPSB2YWx1ZTtcbiAgICB0aGlzLmNvbnRleHRNZW51U3Vic2NyaXB0aW9uID0gdGhpcy50YWJsZUNvbnRleHRNZW51Lm9uU2hvdy5zdWJzY3JpYmUoKHBhcmFtczogSU9Db250ZXh0TWVudUNvbnRleHQpID0+IHtcbiAgICAgIHBhcmFtcy5jbGFzcyA9ICdvLXRhYmxlLWNvbnRleHQtbWVudSAnICsgdGhpcy5yb3dIZWlnaHQ7XG4gICAgICBpZiAocGFyYW1zLmRhdGEgJiYgIXRoaXMuaXNSb3dTZWxlY3RlZChwYXJhbXMuZGF0YS5yb3dWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93KHBhcmFtcy5kYXRhLnJvd1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyRGVmYXVsdENvbHVtbihjb2x1bW46IHN0cmluZykge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmdldE9Db2x1bW4oY29sdW1uKSkpIHtcbiAgICAgIC8vIGEgZGVmYXVsdCBjb2x1bW4gZGVmaW5pdGlvbiB0cnlpbmcgdG8gcmVwbGFjZSBhbiBhbHJlYWR5IGV4aXN0aW5nIGRlZmluaXRpb25cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29sRGVmOiBPQ29sdW1uID0gdGhpcy5jcmVhdGVPQ29sdW1uKGNvbHVtbiwgdGhpcyk7XG4gICAgdGhpcy5wdXNoT0NvbHVtbkRlZmluaXRpb24oY29sRGVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBhbGwgY29sdW1ucyBhbmQgcHJvcGVydGllcyBpbiB2YXIgY29sdW1uc0FycmF5XG4gICAqIEBwYXJhbSBjb2x1bW5cbiAgICovXG4gIHJlZ2lzdGVyQ29sdW1uKGNvbHVtbjogT1RhYmxlQ29sdW1uQ29tcG9uZW50IHwgT1RhYmxlQ29sdW1uQ2FsY3VsYXRlZENvbXBvbmVudCB8IGFueSkge1xuICAgIGNvbnN0IGNvbHVtbkF0dHIgPSAodHlwZW9mIGNvbHVtbiA9PT0gJ3N0cmluZycpID8gY29sdW1uIDogY29sdW1uLmF0dHI7XG4gICAgY29uc3QgY29sdW1uUGVybWlzc2lvbnM6IE9QZXJtaXNzaW9ucyA9IHRoaXMuZ2V0T0NvbHVtblBlcm1pc3Npb25zKGNvbHVtbkF0dHIpO1xuICAgIGlmICghY29sdW1uUGVybWlzc2lvbnMudmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5yZWdpc3RlckRlZmF1bHRDb2x1bW4oY29sdW1uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5EZWYgPSB0aGlzLmdldE9Db2x1bW4oY29sdW1uLmF0dHIpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjb2x1bW5EZWYpICYmIFV0aWwuaXNEZWZpbmVkKGNvbHVtbkRlZi5kZWZpbml0aW9uKSkge1xuICAgICAgLy8gYSBvLXRhYmxlLWNvbHVtbiBkZWZpbml0aW9uIHRyeWluZyB0byByZXBsYWNlIGFuIGFscmVhZHkgZXhpc3Rpbmcgby10YWJsZS1jb2x1bW4gZGVmaW5pdGlvblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbERlZjogT0NvbHVtbiA9IHRoaXMuY3JlYXRlT0NvbHVtbihjb2x1bW4uYXR0ciwgdGhpcywgY29sdW1uKTtcbiAgICBsZXQgY29sdW1uV2lkdGggPSB0aGlzLmdldENvbHVtbldpZHRoRnJvbVN0YXRlKGNvbERlZik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbldpZHRoKSkge1xuICAgICAgY29sRGVmLndpZHRoID0gY29sdW1uV2lkdGg7XG4gICAgfVxuICAgIGlmIChjb2x1bW4gJiYgKGNvbHVtbi5hc3luY0xvYWQgfHwgY29sdW1uLnR5cGUgPT09ICdhY3Rpb24nKSkge1xuICAgICAgdGhpcy5hdm9pZFF1ZXJ5Q29sdW1ucy5wdXNoKGNvbHVtbi5hdHRyKTtcbiAgICAgIGlmIChjb2x1bW4uYXN5bmNMb2FkKSB7XG4gICAgICAgIHRoaXMuYXN5bmNMb2FkQ29sdW1ucy5wdXNoKGNvbHVtbi5hdHRyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wdXNoT0NvbHVtbkRlZmluaXRpb24oY29sRGVmKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwdXNoT0NvbHVtbkRlZmluaXRpb24oY29sRGVmOiBPQ29sdW1uKSB7XG4gICAgY29sRGVmLnZpc2libGUgPSAodGhpcy5fdmlzaWJsZUNvbEFycmF5LmluZGV4T2YoY29sRGVmLmF0dHIpICE9PSAtMSk7XG4gICAgLy8gRmluZCBjb2x1bW4gZGVmaW5pdGlvbiBieSBuYW1lXG4gICAgY29uc3QgYWxyZWFkeUV4aXN0aW5nID0gdGhpcy5nZXRPQ29sdW1uKGNvbERlZi5hdHRyKTtcbiAgICBpZiAoYWxyZWFkeUV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJlcGxhY2luZ0luZGV4ID0gdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmluZGV4T2YoYWxyZWFkeUV4aXN0aW5nKTtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1uc1tyZXBsYWNpbmdJbmRleF0gPSBjb2xEZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5wdXNoKGNvbERlZik7XG4gICAgfVxuICAgIHRoaXMuZW5zdXJlQ29sdW1uc09yZGVyKCk7XG4gICAgdGhpcy5yZWZyZXNoRWRpdGlvbk1vZGVXYXJuKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaEVkaXRpb25Nb2RlV2FybigpIHtcbiAgICBpZiAodGhpcy5lZGl0aW9uTW9kZSAhPT0gQ29kZXMuRURJVElPTl9NT0RFX05PTkUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWRpdGFibGVDb2x1bW5zID0gdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjb2wgPT4ge1xuICAgICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKGNvbC5lZGl0b3IpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGVkaXRhYmxlQ29sdW1ucy5sZW5ndGggPiAwICYmICF0aGlzLmhhc0luc2VydGFibGVSb3coKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1VzaW5nIGEgY29sdW1uIHdpdGggYSBlZGl0b3IgYnV0IHRoZXJlIGlzIG5vIGVkaXRpb24tbW9kZSBkZWZpbmVkJyk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHJlZ2lzdGVyQ29sdW1uQWdncmVnYXRlKGNvbHVtbjogT0NvbHVtbkFnZ3JlZ2F0ZSkge1xuICAgIHRoaXMuc2hvd1RvdGFsc1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RpbmcgPSB0aGlzLmdldE9Db2x1bW4oY29sdW1uLmF0dHIpO1xuICAgIGlmIChhbHJlYWR5RXhpc3RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVwbGFjaW5nSW5kZXggPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuaW5kZXhPZihhbHJlYWR5RXhpc3RpbmcpO1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zW3JlcGxhY2luZ0luZGV4XS5hZ2dyZWdhdGUgPSBjb2x1bW47XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJUYWJsZUhlYWRlcnModGFibGVIZWFkZXI6IE9UYWJsZUhlYWRlckNvbXBvbmVudCkge1xuICAgIGlmICh0aGlzLnRhYmxlSGVhZGVycy5maW5kSW5kZXgoaGVhZGVyID0+IGhlYWRlci5jb2x1bW4uYXR0ciA9PT0gdGFibGVIZWFkZXIuY29sdW1uLmF0dHIpID09PSAtMSkge1xuICAgICAgdGhpcy50YWJsZUhlYWRlcnMucHVzaCh0YWJsZUhlYWRlcik7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VWaXNpYmxlQ29sdW1ucyhkZWZhdWx0Q29uZmlndXJhdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuY29sdW1uc0Rpc3BsYXkpIHtcblxuICAgICAgLy8gZmlsdGVyaW5nIGNvbHVtbnMgdGhhdCBtaWdodCBiZSBpbiBzdGF0ZSBzdG9yYWdlIGJ1dCBub3QgaW4gdGhlIGFjdHVhbCB0YWJsZSBkZWZpbml0aW9uXG4gICAgICBsZXQgc3RhdGVDb2xzOiBPQ29sdW1uRGlzcGxheVtdID0gW107XG4gICAgICB0aGlzLnN0YXRlLmNvbHVtbnNEaXNwbGF5LmZvckVhY2goKG9Db2wsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzVmlzaWJsZUNvbEluQ29sdW1ucyA9IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5maW5kKGNvbCA9PiBjb2wuYXR0ciA9PT0gb0NvbC5hdHRyKSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChpc1Zpc2libGVDb2xJbkNvbHVtbnMpIHtcbiAgICAgICAgICBzdGF0ZUNvbHMucHVzaChvQ29sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBsb2FkIHRoZSBjb2x1bW4gJyArIG9Db2wuYXR0ciArICcgZnJvbSB0aGUgbG9jYWxzdG9yYWdlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGRlZmF1bHRDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHN0YXRlQ29scyA9IHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uY29sdW1uc0Rpc3BsYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZUNvbHMgPSB0aGlzLmNoZWNrQ2hhbmdlc1Zpc2libGVDb2x1bW1uc0luSW5pdGlhbENvbmZpZ3VyYXRpb24oc3RhdGVDb2xzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnNvcnQoKGE6IE9Db2x1bW4sIGI6IE9Db2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXhBID0gc3RhdGVDb2xzLmZpbmRJbmRleChjb2wgPT4gY29sLmF0dHIgPT09IGEuYXR0cik7XG4gICAgICAgIGNvbnN0IGluZGV4QiA9IHN0YXRlQ29scy5maW5kSW5kZXgoY29sID0+IGNvbC5hdHRyID09PSBiLmF0dHIpO1xuICAgICAgICByZXR1cm4gaW5kZXhBIC0gaW5kZXhCO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnZpc2libGVDb2xBcnJheSA9IHN0YXRlQ29scy5maWx0ZXIoaXRlbSA9PiBpdGVtLnZpc2libGUpLm1hcChpdGVtID0+IGl0ZW0uYXR0cik7XG4gICAgfSBlbHNlIHtcblxuICAgICAgdGhpcy52aXNpYmxlQ29sQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5kZWZhdWx0VmlzaWJsZUNvbHVtbnMgPyB0aGlzLmRlZmF1bHRWaXNpYmxlQ29sdW1ucyA6IHRoaXMudmlzaWJsZUNvbHVtbnMsIHRydWUpO1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnNvcnQoKGE6IE9Db2x1bW4sIGI6IE9Db2x1bW4pID0+IHRoaXMudmlzaWJsZUNvbEFycmF5LmluZGV4T2YoYS5hdHRyKSAtIHRoaXMudmlzaWJsZUNvbEFycmF5LmluZGV4T2YoYi5hdHRyKSk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tDaGFuZ2VzVmlzaWJsZUNvbHVtbW5zSW5Jbml0aWFsQ29uZmlndXJhdGlvbihzdGF0ZUNvbHM6IE9Db2x1bW5EaXNwbGF5W10pOiBPQ29sdW1uRGlzcGxheVtdIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uY29sdW1uc0Rpc3BsYXkpIHtcbiAgICAgIHJldHVybiBzdGF0ZUNvbHM7XG4gICAgfVxuICAgIC8vIEdldCB0aGUgb3JpZ2luYWwgdmlzaWJsZSBjb2x1bW5zIGZyb20gbG9jYWxTdG9yYWdlXG4gICAgY29uc3Qgb3JpZ2luYWxWaXNpYmxlQ29sQXJyYXkgPVxuICAgICAgdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5jb2x1bW5zRGlzcGxheS5maWx0ZXIoeCA9PiB4LnZpc2libGUpLm1hcCh4ID0+IHguYXR0cik7XG5cbiAgICBjb25zdCBjdXJyZW50VmlzaWJsZUNvbEFycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMudmlzaWJsZUNvbHVtbnMsIHRydWUpO1xuXG4gICAgLy8gRmluZCB2YWx1ZXMgaW4gdmlzaWJsZS1jb2x1bW5zIHRoYXQgdGhleSBhcmVudCBpbiBvcmlnaW5hbC12aXNpYmxlLWNvbHVtbnMgaW4gbG9jYWxzdG9yYWdlXG4gICAgLy8gaW4gdGhpcyBjYXNlIHlvdSBoYXZlIHRvIGFkZCB0aGlzIGNvbHVtbiB0byB0aGlzLnZpc2libGVDb2xBcnJheVxuICAgIGNvbnN0IGNvbFRvQWRkSW5WaXNpYmxlQ29sID0gVXRpbC5kaWZmZXJlbmNlQXJyYXlzKGN1cnJlbnRWaXNpYmxlQ29sQXJyYXksIG9yaWdpbmFsVmlzaWJsZUNvbEFycmF5KTtcbiAgICBmb3IgKGNvbnN0IG5ld0NvbEF0dHIgb2YgY29sVG9BZGRJblZpc2libGVDb2wpIHtcbiAgICAgIGNvbnN0IGNvbHVtbkV4aXN0cyA9IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5zb21lKGNvbCA9PiBjb2wuYXR0ciA9PT0gbmV3Q29sQXR0cik7XG5cbiAgICAgIGlmIChjb2x1bW5FeGlzdHMpIHtcbiAgICAgICAgbGV0IGluZGV4Q29sID0gc3RhdGVDb2xzLmZpbmRJbmRleChjb2wgPT4gY29sLmF0dHIgPT09IG5ld0NvbEF0dHIpO1xuICAgICAgICBpZiAoaW5kZXhDb2wgPiAtMSkge1xuICAgICAgICAgIHN0YXRlQ29sc1tpbmRleENvbF0udmlzaWJsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIGNvbHVtbiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc3RhdGUsIGFkZCBpdCBhcyB2aXNpYmxlXG4gICAgICAgICAgc3RhdGVDb2xzLnB1c2goe1xuICAgICAgICAgICAgYXR0cjogbmV3Q29sQXR0cixcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICB3aWR0aDogdW5kZWZpbmVkXG4gICAgICAgICAgfSBhcyBPQ29sdW1uRGlzcGxheSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YXRlQ29scy5zb3J0KChhOiBPQ29sdW1uLCBiOiBPQ29sdW1uKSA9PiBjdXJyZW50VmlzaWJsZUNvbEFycmF5LmluZGV4T2YoYS5hdHRyKSAtIGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkuaW5kZXhPZihiLmF0dHIpKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHZhbHVlcyBpbiBvcmlnaW5hbC12aXNpYmxlLWNvbHVtbnMgaW4gbG9jYWxzdG9yYWdlIHRoYXQgdGhleSBhcmVudCBpbiB0aGlzLnZpc2libGVDb2xBcnJheVxuICAgIC8vIGluIHRoaXMgY2FzZSB5b3UgaGF2ZSB0byBkZWxldGUgdGhpcyBjb2x1bW4gdG8gdGhpcy52aXNpYmxlQ29sQXJyYXlcbiAgICBjb25zdCBjb2xUb0RlbGV0ZUluVmlzaWJsZUNvbCA9IFV0aWwuZGlmZmVyZW5jZUFycmF5cyhvcmlnaW5hbFZpc2libGVDb2xBcnJheSwgY3VycmVudFZpc2libGVDb2xBcnJheSk7XG4gICAgaWYgKGNvbFRvRGVsZXRlSW5WaXNpYmxlQ29sLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0YXRlQ29scyA9IHN0YXRlQ29scy5maWx0ZXIoY29sID0+IGNvbFRvRGVsZXRlSW5WaXNpYmxlQ29sLmluZGV4T2YoY29sLmF0dHIpID09PSAtMSk7XG4gICAgfVxuXG4gICAgLy9JZiB0aGUgY29sdW1ucyBpbiBvcmlnaW5hbFZpc2libGVDb2xBcnJheSBoYXMgY2hhbmdlZCB0aGUgc29ydGluZ1xuICAgIGNvbnN0IGNoYW5nZVNvcnRWaXNpYmxlQ29sdW1ucyA9IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkpICE9PSBKU09OLnN0cmluZ2lmeShvcmlnaW5hbFZpc2libGVDb2xBcnJheSk7XG4gICAgaWYgKGNoYW5nZVNvcnRWaXNpYmxlQ29sdW1ucyAmJiBjdXJyZW50VmlzaWJsZUNvbEFycmF5Lmxlbmd0aCA9PT0gb3JpZ2luYWxWaXNpYmxlQ29sQXJyYXkubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0b0luZGV4LCBjb2xdIG9mIGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnN0IGZyb21JbmRleFRvQ2hhbmdlID0gc3RhdGVDb2xzLmZpbmRJbmRleChzdGF0ZUNvbCA9PiBzdGF0ZUNvbC5hdHRyID09PSBjb2wpO1xuICAgICAgICBtb3ZlSXRlbUluQXJyYXkoc3RhdGVDb2xzLCBmcm9tSW5kZXhUb0NoYW5nZSwgdG9JbmRleCk7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVDb2xzO1xuICB9XG5cbiAgcGFyc2VTb3J0Q29sdW1ucygpIHtcbiAgICBjb25zdCBzb3J0Q29sdW1uc1BhcmFtID0gdGhpcy5zdGF0ZS5zb3J0Q29sdW1ucyB8fCB0aGlzLnNvcnRDb2x1bW5zO1xuICAgIHRoaXMuc29ydENvbEFycmF5ID0gU2VydmljZVV0aWxzLnBhcnNlU29ydENvbHVtbnMoc29ydENvbHVtbnNQYXJhbSk7XG5cbiAgICAvLyBjaGVja2luZyB0aGUgb3JpZ2luYWwgc29ydCBjb2x1bW5zIHdpdGggdGhlIHNvcnQgY29sdW1ucyBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaW4gbG9jYWwgc3RvcmFnZVxuICAgIGlmICh0aGlzLnN0YXRlLnNvcnRDb2x1bW5zICYmIHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uc29ydENvbHVtbnMpIHtcblxuICAgICAgY29uc3QgaW5pdGlhbENvbmZpZ1NvcnRDb2x1bW5zQXJyYXkgPSBTZXJ2aWNlVXRpbHMucGFyc2VTb3J0Q29sdW1ucyh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnNvcnRDb2x1bW5zKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsU29ydENvbHVtbnNBcnJheSA9IFNlcnZpY2VVdGlscy5wYXJzZVNvcnRDb2x1bW5zKHRoaXMuc29ydENvbHVtbnMpO1xuICAgICAgLy8gRmluZCB2YWx1ZXMgaW4gdmlzaWJsZS1jb2x1bW5zIHRoYXQgdGhleSBhcmVudCBpbiBvcmlnaW5hbC12aXNpYmxlLWNvbHVtbnMgaW4gbG9jYWxzdG9yYWdlXG4gICAgICAvLyBpbiB0aGlzIGNhc2UgeW91IGhhdmUgdG8gYWRkIHRoaXMgY29sdW1uIHRvIHRoaXMudmlzaWJsZUNvbEFycmF5XG4gICAgICBjb25zdCBjb2xUb0FkZEluVmlzaWJsZUNvbCA9IFV0aWwuZGlmZmVyZW5jZUFycmF5cyhvcmlnaW5hbFNvcnRDb2x1bW5zQXJyYXksIGluaXRpYWxDb25maWdTb3J0Q29sdW1uc0FycmF5KTtcbiAgICAgIGlmIChjb2xUb0FkZEluVmlzaWJsZUNvbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbFRvQWRkSW5WaXNpYmxlQ29sLmZvckVhY2goY29sQWRkID0+IHtcbiAgICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5wdXNoKGNvbEFkZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb2xUb0RlbEluVmlzaWJsZUNvbCA9IFV0aWwuZGlmZmVyZW5jZUFycmF5cyhpbml0aWFsQ29uZmlnU29ydENvbHVtbnNBcnJheSwgb3JpZ2luYWxTb3J0Q29sdW1uc0FycmF5KTtcbiAgICAgIGlmIChjb2xUb0RlbEluVmlzaWJsZUNvbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbFRvRGVsSW5WaXNpYmxlQ29sLmZvckVhY2goKGNvbERlbCkgPT4ge1xuICAgICAgICAgIHRoaXMuc29ydENvbEFycmF5LmZvckVhY2goKGNvbCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5OYW1lID09PSBjb2xEZWwuY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVuc3VyaW5nIGNvbHVtbiBleGlzdGVuY2UgYW5kIGNoZWNraW5nIGl0cyBvcmRlcmFibGUgc3RhdGVcbiAgICBmb3IgKGxldCBpID0gdGhpcy5zb3J0Q29sQXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGNvbE5hbWUgPSB0aGlzLnNvcnRDb2xBcnJheVtpXS5jb2x1bW5OYW1lO1xuICAgICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihjb2xOYW1lKTtcbiAgICAgIGlmICghVXRpbC5pc0RlZmluZWQob0NvbCkgfHwgIW9Db2wub3JkZXJhYmxlKSB7XG4gICAgICAgIHRoaXMuc29ydENvbEFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBlbnN1cmVDb2x1bW5zT3JkZXIoKSB7XG5cbiAgICBsZXQgY29sdW1uc09yZGVyID0gW107XG4gICAgaWYgKHRoaXMuc3RhdGUuY29sdW1uc0Rpc3BsYXkpIHtcbiAgICAgIGNvbHVtbnNPcmRlciA9IHRoaXMuc3RhdGUuY29sdW1uc0Rpc3BsYXkubWFwKGl0ZW0gPT4gaXRlbS5hdHRyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29sdW1uc09yZGVyID0gdGhpcy5jb2xBcnJheS5maWx0ZXIoYXR0ciA9PiB0aGlzLnZpc2libGVDb2xBcnJheS5pbmRleE9mKGF0dHIpID09PSAtMSk7XG4gICAgICBjb2x1bW5zT3JkZXIucHVzaCguLi50aGlzLnZpc2libGVDb2xBcnJheSk7XG4gICAgfVxuXG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnNvcnQoKGE6IE9Db2x1bW4sIGI6IE9Db2x1bW4pID0+IHtcbiAgICAgIGlmIChjb2x1bW5zT3JkZXIuaW5kZXhPZihhLmF0dHIpID09PSAtMSkge1xuICAgICAgICAvLyBpZiBpdCBpcyBub3QgaW4gbG9jYWwgc3RvcmFnZSBiZWNhdXNlIGl0IGlzIG5ldywga2VlcCBvcmRlclxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5zT3JkZXIuaW5kZXhPZihhLmF0dHIpIC0gY29sdW1uc09yZGVyLmluZGV4T2YoYi5hdHRyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuXG4gIH1cblxuICBpbml0aWFsaXplUGFyYW1zKCk6IHZvaWQge1xuICAgIC8vIElmIHZpc2libGUtY29sdW1ucyBpcyBub3QgcHJlc2VudCB0aGVuIHZpc2libGUtY29sdW1ucyBpcyBhbGwgY29sdW1uc1xuICAgIGlmICghdGhpcy52aXNpYmxlQ29sdW1ucykge1xuICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuY29sQXJyYXkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbEFycmF5LmZvckVhY2goKHg6IHN0cmluZykgPT4gdGhpcy5yZWdpc3RlckNvbHVtbih4KSk7XG4gICAgICB0aGlzLmVuc3VyZUNvbHVtbnNPcmRlcigpO1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIHF1aWNrRmlsdGVyXG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5maWx0ZXIgPSB0aGlzLnF1aWNrRmlsdGVyO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUuY3VycmVudFBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnN0YXRlLmN1cnJlbnRQYWdlO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgcGFnaW5hdG9yXG4gICAgaWYgKCF0aGlzLnBhZ2luYXRvciAmJiB0aGlzLnBhZ2luYXRpb25Db250cm9scykge1xuICAgICAgdGhpcy5wYWdpbmF0b3IgPSBuZXcgT0Jhc2VUYWJsZVBhZ2luYXRvcigpO1xuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZVNpemUgPSB0aGlzLnF1ZXJ5Um93cztcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgICB0aGlzLnBhZ2luYXRvci5zaG93Rmlyc3RMYXN0QnV0dG9ucyA9IHRoaXMuc2hvd1BhZ2luYXRvckZpcnN0TGFzdEJ1dHRvbnM7XG4gICAgfVxuXG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLnNlbGVjdEFsbENoZWNrYm94VmlzaWJsZSkpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGUgPSAhIXRoaXMuc3RhdGUuc2VsZWN0Q29sdW1uVmlzaWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2hlY2tpbmcgdGhlIG9yaWdpbmFsIHNlbGVjdEFsbENoZWNrYm94VmlzaWJsZSB3aXRoIHNlbGVjdC1jb2x1bW4tdmlzaWJsZSBpbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaW4gbG9jYWwgc3RvcmFnZVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uc2VsZWN0Q29sdW1uVmlzaWJsZSlcbiAgICAgICAgJiYgdGhpcy5zZWxlY3RBbGxDaGVja2JveFZpc2libGUgPT09IHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uc2VsZWN0Q29sdW1uVmlzaWJsZSkge1xuICAgICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlID0gISF0aGlzLnN0YXRlLnNlbGVjdENvbHVtblZpc2libGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlID0gdGhpcy5zZWxlY3RBbGxDaGVja2JveFZpc2libGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9Jbml0aWFsaXplIHNob3cgZmlsdGVyIGJ5IGNvbHVtbiBpY29uXG4gICAgdGhpcy5pc0NvbHVtbkZpbHRlcnNBY3RpdmUgPSB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94Q29sdW1uKCk7XG5cbiAgICBpZiAodGhpcy5zdG9yZVN0YXRlKSB7XG4gICAgICAvLyBpZiBxdWVyeS1yb3dzIGluIGluaXRpYWwgY29uZmlndXJhdGlvbiBpcyBlcXVhbHMgdG8gb3JpZ2luYWwgcXVlcnktcm93cyBpbnB1dFxuICAgICAgLy8gcXVlcnlfcm93cyB3aWxsIGJlIHRoZSB2YWx1ZSBpbiBsb2NhbCBzdG9yYWdlXG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZS5xdWVyeVJvd3MpICYmIFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24ucXVlcnlSb3dzKVxuICAgICAgICAmJiB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnF1ZXJ5Um93cyA9PT0gdGhpcy5vcmlnaW5hbFF1ZXJ5Um93cykge1xuICAgICAgICB0aGlzLnF1ZXJ5Um93cyA9IHRoaXMuc3RhdGUucXVlcnlSb3dzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBzZWxlY3Rpb24oKSB7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLl9zZWxlY3Rpb24pKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0aGlzLmlzU2VsZWN0aW9uTW9kZU11bHRpcGxlKCksIFtdLCB0cnVlLCB0aGlzLmNvbXBhcmVSb3coKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb247XG4gIH1cblxuICB1cGRhdGVTdGF0ZUV4cGFuZGVkQ29sdW1uKCkge1xuICAgIGlmICghdGhpcy50YWJsZVJvd0V4cGFuZGFibGU/LmV4cGFuZGFibGVDb2x1bW5WaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnNbMF0gPT09IENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCAmJlxuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uc1sxXSAhPT0gQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5zcGxpY2UoMSwgMCwgQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zWzBdICE9PSBDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLnVuc2hpZnQoQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSk7XG4gICAgfVxuXG4gIH1cblxuICByZWdpc3RlclRhYkxpc3RlbmVyKCkge1xuICAgIC8vIFdoZW4gdGFibGUgaXMgY29udGFpbmVkIGludG8gdGFiIGNvbXBvbmVudCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGluaXQgdGFibGUgY29tcG9uZW50IHdoZW4gYXR0YWNoZWQgdG8gRE9NLlxuICAgIHRoaXMudGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnRhYkdyb3VwQ29udGFpbmVyLnNlbGVjdGVkVGFiQ2hhbmdlLnN1YnNjcmliZSgoZXZ0KSA9PiB7XG4gICAgICBsZXQgaW50ZXJ2YWw7XG4gICAgICBjb25zdCB0aW1lckNhbGxiYWNrID0gKHRhYjogTWF0VGFiKSA9PiB7XG4gICAgICAgIGlmICh0YWIgJiYgdGFiLmNvbnRlbnQuaXNBdHRhY2hlZCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgIGlmICh0YWIgPT09IHRoaXMudGFiQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmluc2lkZVRhYkJ1Z1dvcmthcm91bmQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdRdWVyeSkge1xuICAgICAgICAgICAgICB0aGlzLnF1ZXJ5RGF0YSh0aGlzLnBlbmRpbmdRdWVyeUZpbHRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7IHRpbWVyQ2FsbGJhY2soZXZ0LnRhYik7IH0sIDEwMCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5zaWRlVGFiQnVnV29ya2Fyb3VuZCgpIHtcbiAgICB0aGlzLnJlZnJlc2hTb3J0SGVhZGVycygpO1xuICB9XG5cbiAgcmVnaXN0ZXJTb3J0TGlzdGVuZXIoKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc29ydCkpIHtcbiAgICAgIHRoaXMuc29ydFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc29ydFN1YnNjcmlwdGlvbiA9IHRoaXMuc29ydC5vU29ydENoYW5nZS5zdWJzY3JpYmUodGhpcy5vblNvcnRDaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLnNvcnQuc2V0TXVsdGlwbGVTb3J0KHRoaXMubXVsdGlwbGVTb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Tb3J0Q2hhbmdlKHNvcnRBcnJheTogYW55W10pIHtcbiAgICB0aGlzLnNvcnRDb2xBcnJheSA9IFtdO1xuICAgIHNvcnRBcnJheS5mb3JFYWNoKChzb3J0KSA9PiB7XG4gICAgICBpZiAoc29ydC5kaXJlY3Rpb24gIT09ICcnKSB7XG4gICAgICAgIHRoaXMuc29ydENvbEFycmF5LnB1c2goe1xuICAgICAgICAgIGNvbHVtbk5hbWU6IHNvcnQuaWQsXG4gICAgICAgICAgYXNjZW5kZW50OiBzb3J0LmRpcmVjdGlvbiA9PT0gQ29kZXMuQVNDX1NPUlRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIHRoaXMucmVsb2FkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldERhdGFzb3VyY2UoKSB7XG4gICAgLy9EZWxldGVkIHByZXZpb3VzIGluc3RhbmNlIGFuZCBzdWJzY3JpYmVyc1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFTb3VyY2U7XG4gICAgaWYgKHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UpIHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UudW5zdWJzY3JpYmUoKTtcblxuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoT1RhYmxlRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2VTZXJ2aWNlLmdldEluc3RhbmNlKHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJEYXRhU291cmNlTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZWdpc3RlclNvcnRMaXN0ZW5lcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyRGF0YVNvdXJjZUxpc3RlbmVycygpIHtcbiAgICB0aGlzLm9uUmVuZGVyZWREYXRhQ2hhbmdlID0gdGhpcy5kYXRhU291cmNlLm9uUmVuZGVyZWREYXRhQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnN0b3BFZGl0aW9uKCk7XG4gICAgICB0aGlzLmNoZWNrU2VsZWN0ZWRJdGVtRGF0YSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEV4cGFuZGVkUm93Q29udGFpbmVyQ2xhc3Mocm93SW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9UYWJsZUNvbXBvbmVudC5FWFBBTkRFRF9ST1dfQ09OVEFJTkVSX0NMQVNTICsgcm93SW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXhwYW5kYWJsZUl0ZW1zKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRhYmxlSXRlbS5zZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIGV4cGFuZGFibGUgcm93LlxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVSb3dFeHBhbmRhYmxlKGl0ZW06IGFueSwgZXZlbnQ/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/LmNsZWFyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZnJlc2hFeHBhbmRhYmxlUm93U3RhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29tcG9uZW50U3RhdGVTZXJ2aWNlLnJlZnJlc2hTZWxlY3Rpb24oKTtcblxuICAgIGlmIChjbGVhclNlbGVjdGVkSXRlbXMpIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgdGhpcy5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1F1ZXJ5ID0gdHJ1ZTtcbiAgICBsZXQgcXVlcnlBcmdzOiBPUXVlcnlEYXRhQXJncztcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgcXVlcnlBcmdzID0ge1xuICAgICAgICBvZmZzZXQ6IHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnF1ZXJ5Um93cyxcbiAgICAgICAgbGVuZ3RoOiB0aGlzLnF1ZXJ5Um93c1xuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5zdG9wRWRpdGlvbihmYWxzZSk7XG4gICAgdGhpcy5xdWVyeURhdGEodm9pZCAwLCBxdWVyeUFyZ3MpO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2socm93OiBhbnksIGNvbHVtbjogT0NvbHVtbiwgcm93SW5kZXg6IG51bWJlciwgY2VsbFJlZjogRWxlbWVudFJlZiwgZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmNsaWNrU3ViamVjdC5uZXh0KHsgcm93LCBjb2x1bW4sIGNlbGxSZWYsIHJvd0luZGV4LCBldmVudCB9KTtcbiAgfVxuXG4gIGRvSGFuZGxlQ2xpY2socm93OiBhbnksIGNvbHVtbjogc3RyaW5nLCByb3dJbmRleDogbnVtYmVyLCAkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSAmJiB0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub2VuYWJsZWQgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoKHRoaXMuZGV0YWlsTW9kZSA9PT0gQ29kZXMuREVUQUlMX01PREVfQ0xJQ0spKSB7XG5cbiAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmlzTmF2aWdhdGluZykgcmV0dXJuO1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pc05hdmlnYXRpbmcgPSB0cnVlO1xuXG4gICAgICB0aGlzLm9uQ2xpY2suZW1pdCh7IHJvdzogcm93LCByb3dJbmRleDogcm93SW5kZXgsIG1vdXNlRXZlbnQ6ICRldmVudCwgY29sdW1uTmFtZTogY29sdW1uLCBjZWxsOiByb3dbY29sdW1uXSB9KTtcbiAgICAgIHRoaXMuc2F2ZURhdGFOYXZpZ2F0aW9uSW5Mb2NhbFN0b3JhZ2UoKTtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICAgIHRoaXMudmlld0RldGFpbChyb3cpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbk1vZGVNdWx0aXBsZSgpICYmICgkZXZlbnQuY3RybEtleSB8fCAkZXZlbnQubWV0YUtleSkpIHtcbiAgICAgIC8vIFRPRE86IHRlc3QgJGV2ZW50Lm1ldGFLZXkgb24gTUFDXG4gICAgICB0aGlzLnNlbGVjdGVkUm93KHJvdyk7XG4gICAgICB0aGlzLm9uQ2xpY2suZW1pdCh7IHJvdzogcm93LCByb3dJbmRleDogcm93SW5kZXgsIG1vdXNlRXZlbnQ6ICRldmVudCwgY29sdW1uTmFtZTogY29sdW1uLCBjZWxsOiByb3dbY29sdW1uXSB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKSAmJiAkZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHRoaXMuaGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24ocm93KTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xuICAgICAgaWYgKHRoaXMuaXNSb3dTZWxlY3RlZChyb3cpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAxICYmIHRoaXMuZWRpdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbkFuZEVkaXRpbmcoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICAgIHRoaXMub25DbGljay5lbWl0KHsgcm93OiByb3csIHJvd0luZGV4OiByb3dJbmRleCwgbW91c2VFdmVudDogJGV2ZW50LCBjb2x1bW5OYW1lOiBjb2x1bW4sIGNlbGw6IHJvd1tjb2x1bW5dIH0pO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU11bHRpcGxlU2VsZWN0aW9uKGl0ZW06IGFueSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuaW5kZXhPZih0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZFswXSk7XG4gICAgICBjb25zdCBsYXN0ID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5pbmRleE9mKGl0ZW0pO1xuICAgICAgY29uc3QgaW5kZXhGcm9tID0gTWF0aC5taW4oZmlyc3QsIGxhc3QpO1xuICAgICAgY29uc3QgaW5kZXhUbyA9IE1hdGgubWF4KGZpcnN0LCBsYXN0KTtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGEuc2xpY2UoaW5kZXhGcm9tLCBpbmRleFRvICsgMSkuZm9yRWFjaChlID0+IHRoaXMuc2VsZWN0ZWRSb3coZSkpO1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vbkNsaWNrLCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCkge1xuICAgIHN1cGVyLnNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCk7XG4gICAgdGhpcy5zdG9yZVBhZ2luYXRpb25TdGF0ZSA9IHRydWU7XG4gIH1cblxuICBoYW5kbGVEb3VibGVDbGljayhyb3c6IGFueSwgY29sdW1uOiBPQ29sdW1uLCByb3dJbmRleDogbnVtYmVyLCBjZWxsUmVmOiBFbGVtZW50UmVmLCBldmVudDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuZGJsY2xpY2tTdWJqZWN0Lm5leHQoeyByb3csIGNvbHVtbiwgY2VsbFJlZiwgcm93SW5kZXgsIGV2ZW50IH0pO1xuICB9XG5cbiAgZ2V0IGVkaXRpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuc29tZShpdGVtID0+IGl0ZW0uZWRpdGluZyk7XG4gIH1cblxuICBoYW5kbGVET01DbGljayhldmVudCkge1xuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWRpdGlvbkVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5Q29udGFpbmVyID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjZGstb3ZlcmxheS1jb250YWluZXInKVswXTtcbiAgICBpZiAob3ZlcmxheUNvbnRhaW5lciAmJiBvdmVybGF5Q29udGFpbmVyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuby10YWJsZS1jb250YWluZXInKTtcbiAgICBjb25zdCB0YWJsZUNvbnRlbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm8tdGFibGUtY29udGFpbmVyIHRhYmxlLm1hdC10YWJsZScpO1xuICAgIGlmICh0YWJsZUNvbnRhaW5lciAmJiB0YWJsZUNvbnRlbnQgJiYgdGFibGVDb250YWluZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAhdGFibGVDb250ZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWN0aXZhdGVDb2x1bW5FZGl0aW9uKGNvbHVtbjogT0NvbHVtbiwgcm93OiBhbnksIGNlbGxSZWY6IGFueSkge1xuICAgIGlmIChjZWxsUmVmICYmIGNvbHVtbi5lZGl0aW5nICYmIHRoaXMuZWRpdGluZ0NlbGwgPT09IGNlbGxSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uUGVybWlzc2lvbnM6IE9QZXJtaXNzaW9ucyA9IHRoaXMuZ2V0T0NvbHVtblBlcm1pc3Npb25zKGNvbHVtbi5hdHRyKTtcbiAgICBpZiAoY29sdW1uUGVybWlzc2lvbnMuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHtjb2x1bW4uYXR0cn0gZWRpdGlvbiBub3QgYWxsb3dlZCBkdWUgdG8gcGVybWlzc2lvbnNgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uQW5kRWRpdGluZygpO1xuICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICB0aGlzLmVkaXRpbmdDZWxsID0gY2VsbFJlZjtcbiAgICBjb25zdCByb3dEYXRhID0ge307XG4gICAgdGhpcy5rZXlzQXJyYXkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICByb3dEYXRhW2tleV0gPSByb3dba2V5XTtcbiAgICB9KTtcbiAgICByb3dEYXRhW2NvbHVtbi5hdHRyXSA9IHJvd1tjb2x1bW4uYXR0cl07XG4gICAgdGhpcy5lZGl0aW5nUm93ID0gcm93O1xuICAgIGNvbHVtbi5lZGl0aW5nID0gdHJ1ZTtcbiAgICBjb2x1bW4uZWRpdG9yLnN0YXJ0RWRpdGlvbihyb3dEYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZUNlbGxEYXRhKGNvbHVtbjogT0NvbHVtbiwgZGF0YTogYW55LCBzYXZlQ2hhbmdlczogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX1VQREFURSkpIHtcbiAgICAgIGNvbnN0IHJlcyA9IG5ldyBPYnNlcnZhYmxlKGlubmVyT2JzZXJ2ZXIgPT4ge1xuICAgICAgICBpbm5lck9ic2VydmVyLmVycm9yKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGNvbHVtbi5lZGl0aW5nID0gZmFsc2U7XG4gICAgaWYgKHNhdmVDaGFuZ2VzICYmIHRoaXMuZWRpdGluZ1JvdyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuZWRpdGluZ1JvdywgZGF0YSk7XG4gICAgfVxuICAgIHRoaXMuc3RvcEVkaXRpb24oKTtcbiAgICBpZiAoc2F2ZUNoYW5nZXMgJiYgY29sdW1uLmVkaXRvci51cGRhdGVSZWNvcmRPbkVkaXQpIHtcbiAgICAgIGNvbnN0IHRvVXBkYXRlID0ge307XG4gICAgICB0b1VwZGF0ZVtjb2x1bW4uYXR0cl0gPSBkYXRhW2NvbHVtbi5hdHRyXTtcbiAgICAgIGNvbnN0IGt2ID0gdGhpcy5leHRyYWN0S2V5c0Zyb21SZWNvcmQoZGF0YSk7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVSZWNvcmQoa3YsIHRvVXBkYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRLZXlzVmFsdWVzKCk6IGFueVtdIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICByZXR1cm4gZGF0YS5tYXAoKHJvdykgPT4ge1xuICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICB0aGlzLmtleXNBcnJheS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKHJvd1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IHJvd1trZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2hvd3NTZWxlY3RzKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vblNob3dzU2VsZWN0cygpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYWxpemVDaGVja2JveENvbHVtbigpIHtcbiAgICAvLyBJbml0aWFsaXppbmcgcm93IHNlbGVjdGlvbiBsaXN0ZW5lclxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24gJiYgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkLnN1YnNjcmliZSgoc2VsZWN0aW9uRGF0YTogU2VsZWN0aW9uQ2hhbmdlPGFueT4pID0+IHtcbiAgICAgICAgaWYgKHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyAmJiBzZWxlY3Rpb25EYXRhKSB7XG4gICAgICAgICAgaWYgKHNlbGVjdGlvbkRhdGEuYWRkZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vblJvd1NlbGVjdGVkLCBzZWxlY3Rpb25EYXRhLmFkZGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlbGVjdGlvbkRhdGEucmVtb3ZlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLm9uUm93RGVzZWxlY3RlZCwgc2VsZWN0aW9uRGF0YS5yZW1vdmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkNvbHVtblN0YXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU2VsZWN0aW9uQ29sdW1uU3RhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zICYmIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGVcbiAgICAgICYmIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnNbMF0gIT09IENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy51bnNoaWZ0KENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zICYmICF0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXG4gICAgICAmJiB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zWzBdID09PSBDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTdGF0ZUV4cGFuZGVkQ29sdW1uKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TnVtUm93U2VsZWN0ZWRJbkN1cnJlbnREYXRhKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8ucmVuZGVyZWREYXRhID8gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5maWx0ZXIoeCA9PiAhdGhpcy5pc0Rpc2FibGVDaGVja2JveCh4KSAmJiB0aGlzLmlzUm93U2VsZWN0ZWQoeCkpLmxlbmd0aCA6IDA7XG4gIH1cblxuICBwdWJsaWMgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuZ2V0TnVtUm93U2VsZWN0ZWRJbkN1cnJlbnREYXRhKCk7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZT8ucmVuZGVyZWREYXRhPy5sZW5ndGggPz8gMDtcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPiAwICYmIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xuICB9XG5cbiAgcHVibGljIGlzSW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuZ2V0TnVtUm93U2VsZWN0ZWRJbkN1cnJlbnREYXRhKCk7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZT8ucmVuZGVyZWREYXRhPy5sZW5ndGggPz8gMDtcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPiAwICYmIG51bVJvd3MgPiAwICYmIG51bVNlbGVjdGVkICE9PSBudW1Sb3dzO1xuICB9XG5cbiAgcHVibGljIG1hc3RlclRvZ2dsZShldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UpOiB2b2lkIHtcbiAgICBldmVudC5jaGVja2VkID8gdGhpcy5zZWxlY3RBbGwoKSA6IHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5mb3JFYWNoKHJvdyA9PiB0aGlzLnNldFNlbGVjdGVkKHJvdykpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdGlvbkNoZWNrYm94VG9nZ2xlKGV2ZW50OiBNYXRDaGVja2JveENoYW5nZSwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbk1vZGVTaW5nbGUoKSkge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBldmVudC5jaGVja2VkID8gdGhpcy5zZWxlY3RlZFJvdyhyb3cpIDogdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3Qocm93KTtcbiAgICB0aGlzLnN0YXRlLnNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdGVkUm93KHJvdzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZXRTZWxlY3RlZChyb3cpO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnNlbGVjdGlvbikpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb24gPSBbXTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWQoaXRlbTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlQ2hlY2tib3goaXRlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNSb3dTZWxlY3RlZChpdGVtKSkge1xuICAgICAgLyoqVGhlIHNlbGVjdGVkIGl0ZW0gaXMgY2xlYXJlZCBpZiB0aGUgaXRlbSBjaGFuZ2VzIHZhbHVlKi9cbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKGl0ZW0pO1xuICAgIH1cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoaXRlbSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChpdGVtKTtcbiAgICB9XG4gIH1cblxuICBzZXRTZWxlY3RlZEJ5S2V5cyhrZXlWYWx1ZXM6IEFycmF5PGFueT4pIHtcbiAgICBjb25zdCByb3dzVG9TZWxlY3QgPSB0aGlzLmdldERhdGFBcnJheSgpLmZpbHRlcihyb3cgPT4ge1xuICAgICAgcmV0dXJuIGtleVZhbHVlcy5maW5kSW5kZXgoa2V5VmFsdWUgPT4gcm93W3RoaXMua2V5c10gPT09IGtleVZhbHVlKSA+IC0xO1xuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi5yb3dzVG9TZWxlY3QpO1xuICB9XG5cbiAgc2V0U2VsZWN0ZWRCeU11bHRpcGxlS2V5cyhrZXlWYWx1ZXM6IEFycmF5PE9iamVjdD4pIHtcbiAgICBjb25zdCByb3dzVG9TZWxlY3QgPSB0aGlzLmdldERhdGFBcnJheSgpLmZpbHRlcihyb3cgPT4ge1xuICAgICAgcmV0dXJuIGtleVZhbHVlcy5maW5kSW5kZXgoa2V5VmFsdWUgPT5cbiAgICAgICAgT2JqZWN0LmtleXMoa2V5VmFsdWUpLmV2ZXJ5KGtleSA9PiBrZXlWYWx1ZVtrZXldID09PSByb3dba2V5XSlcbiAgICAgICkgPiAtMTtcbiAgICB9KTtcbiAgICByb3dzVG9TZWxlY3QuZXZlcnkocm93VG9TZWxlY3QgPT4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvd1RvU2VsZWN0KSk7XG4gIH1cblxuICBzZXRTZWxlY3RlZEJ5Um93SWRzKHJvd0lkczogQXJyYXk8bnVtYmVyPikge1xuICAgIHJvd0lkcy5mb3JFYWNoKHJvd0lkID0+IHRoaXMuc2VsZWN0ZWRSb3codGhpcy5nZXREYXRhQXJyYXkoKVtyb3dJZF0pKTtcbiAgfVxuXG4gIGdldCBzaG93RGVsZXRlQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUJ1dHRvbjtcbiAgfVxuXG4gIGdldFRyYWNrQnlGdW5jdGlvbigpOiAoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSA9PiBzdHJpbmcge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgcmV0dXJuIChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpID0+IHtcblxuICAgICAgbGV0IGl0ZW1JZDogc3RyaW5nID0gJyc7XG5cbiAgICAgIGlmICh0aGlzLmlzR3JvdXAoaW5kZXgsIGl0ZW0pKSB7XG4gICAgICAgIGl0ZW1JZCArPSBpdGVtLmNvbHVtbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGtleXNMZW5naHQgPSBzZWxmLmtleXNBcnJheS5sZW5ndGg7XG4gICAgICAgIHNlbGYua2V5c0FycmF5LmZvckVhY2goKGtleTogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGlkeCA8IChrZXlzTGVuZ2h0IC0gMSkgPyAnOycgOiAnJztcbiAgICAgICAgICBpdGVtSWQgKz0gaXRlbVtrZXldICsgc3VmZml4O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzQXN5bmNBbmRWaXNpYmxlQ29scyA9IHRoaXMuYXN5bmNMb2FkQ29sdW1ucy5zb21lKGMgPT4gdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5pbmNsdWRlcyhjKSk7XG4gICAgICBpZiAoc2VsZi5hc3luY0xvYWRDb2x1bW5zLmxlbmd0aCAmJiBoYXNBc3luY0FuZFZpc2libGVDb2xzICYmICFzZWxmLmZpbmlzaFF1ZXJ5U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHNlbGYucXVlcnlSb3dBc3luY0RhdGEoaW5kZXgsIGl0ZW0pO1xuICAgICAgICBpZiAoc2VsZi5wYWdpbmF0b3IgJiYgaW5kZXggPT09IChzZWxmLnBhZ2luYXRvci5wYWdlU2l6ZSAtIDEpKSB7XG4gICAgICAgICAgc2VsZi5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1JZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpdGVtSWQ7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHF1ZXJ5Um93QXN5bmNEYXRhKHJvd0luZGV4OiBudW1iZXIsIHJvd0RhdGE6IGFueSkge1xuICAgIGNvbnN0IGt2ID0gU2VydmljZVV0aWxzLmdldE9iamVjdFByb3BlcnRpZXMocm93RGF0YSwgdGhpcy5rZXlzQXJyYXkpO1xuICAgIC8vIFJlcGVhdGluZyBjaGVja2luZyBvZiB2aXNpYmxlIGNvbHVtblxuICAgIGNvbnN0IGF2ID0gdGhpcy5hc3luY0xvYWRDb2x1bW5zLmZpbHRlcihjID0+IHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMuaW5kZXhPZihjKSAhPT0gLTEpO1xuICAgIGlmIChhdi5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFNraXBwaW5nIHF1ZXJ5IGlmIHRoZXJlIGFyZSBub3QgdmlzaWJsZSBhc3luY3JvbiBjb2x1bW5zXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtblF1ZXJ5QXJncyA9IFtrdiwgYXYsIHRoaXMuZW50aXR5LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xuICAgIGNvbnN0IHF1ZXJ5TWV0aG9kTmFtZSA9IHRoaXMucGFnZWFibGUgPyB0aGlzLnBhZ2luYXRlZFF1ZXJ5TWV0aG9kIDogdGhpcy5xdWVyeU1ldGhvZDtcbiAgICBpZiAodGhpcy5kYXRhU2VydmljZSAmJiAocXVlcnlNZXRob2ROYW1lIGluIHRoaXMuZGF0YVNlcnZpY2UpICYmIHRoaXMuZW50aXR5KSB7XG4gICAgICBpZiAodGhpcy5hc3luY0xvYWRTdWJzY3JpcHRpb25zW3Jvd0luZGV4XSkge1xuICAgICAgICB0aGlzLmFzeW5jTG9hZFN1YnNjcmlwdGlvbnNbcm93SW5kZXhdLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFzeW5jTG9hZFN1YnNjcmlwdGlvbnNbcm93SW5kZXhdID0gdGhpcy5kYXRhU2VydmljZVtxdWVyeU1ldGhvZE5hbWVdKC4uLmNvbHVtblF1ZXJ5QXJncylcbiAgICAgICAgLnN1YnNjcmliZSgocmVzOiBTZXJ2aWNlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgICAgIGlmIChVdGlsLmlzQXJyYXkocmVzLmRhdGEpICYmIHJlcy5kYXRhLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICBkYXRhID0gcmVzLmRhdGFbMF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFV0aWwuaXNPYmplY3QocmVzLmRhdGEpKSB7XG4gICAgICAgICAgICAgIGRhdGEgPSByZXMuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGFvVGFibGUuc2V0QXN5bmNocm9ub3VzQ29sdW1uKGRhdGEsIHJvd0RhdGEpO1xuICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgZGF0YS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Q3VycmVudERhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHZhbHVlc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0QWxsVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZ2V0Q3VycmVudEFsbERhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHJlbmRlcmVkIHZhbHVlc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0QWxsUmVuZGVyZWRWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5nZXRBbGxSZW5kZXJlckRhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFnZSB0YWJsZSByZW5kZXJlciBkYXRhLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0UmVuZGVyZWRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmdldEN1cnJlbnRSZW5kZXJlckRhdGEoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgc3FsIHR5cGVzIGZyb20gZGF0YSBzb3VyY2UgYW5kIHRhYmxlIGNvbHVtbnNcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFNxbFR5cGVzKCkge1xuICAgIGNvbnN0IGFsbFNxbFR5cGVzID0gVXRpbC5pc0RlZmluZWQodGhpcy5kYXRhU291cmNlLnNxbFR5cGVzKSA/IHRoaXMuZGF0YVNvdXJjZS5zcWxUeXBlcyA6IHt9O1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKChjb2w6IE9Db2x1bW4pID0+IHtcbiAgICAgIGlmIChjb2wuc3FsVHlwZSkge1xuICAgICAgICBhbGxTcWxUeXBlc1tjb2wuYXR0cl0gPSBjb2wuc3FsVHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWxsU3FsVHlwZXM7XG4gIH1cblxuICBzZXRPVGFibGVDb2x1bW5zRmlsdGVyKHRhYmxlQ29sdW1uc0ZpbHRlcjogT1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCkge1xuICAgIHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCA9IHRhYmxlQ29sdW1uc0ZpbHRlcjtcbiAgfVxuXG4gIGdldCBmaWx0ZXJDb2x1bW5zKCk6IE9GaWx0ZXJDb2x1bW5bXSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uZmlsdGVyQ29sdW1ucyA9PT0gdGhpcy5vcmlnaW5hbEZpbHRlckNvbHVtbnNcbiAgICAgICYmIHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucykge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxGaWx0ZXJDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IG9yaWdpbmFsRmlsdGVyQ29sdW1ucygpOiBBcnJheTxPRmlsdGVyQ29sdW1uPiB7XG4gICAgbGV0IHNvcnRDb2x1bW5zRmlsdGVyID0gW107XG4gICAgaWYgKHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgc29ydENvbHVtbnNGaWx0ZXIgPSB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1uc0FycmF5O1xuICAgIH1cbiAgICByZXR1cm4gc29ydENvbHVtbnNGaWx0ZXI7XG4gIH1cblxuICBnZXQgb3JpZ2luYWxHcm91cGVkQ29sdW1uc0FycmF5KCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiBVdGlsLnBhcnNlQXJyYXkodGhpcy5ncm91cGVkQ29sdW1ucywgdHJ1ZSk7XG4gIH1cblxuICBnZXRTdG9yZWRDb2x1bW5zRmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdG9yZWRGaWx0ZXJzO1xuICB9XG5cbiAgZ2V0U3RvcmVkR3JvdXBlZENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuc3RvcmVkQ29uZmlndXJhdGlvbnM7XG4gIH1cblxuICBvbkZpbHRlckJ5Q29sdW1uQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25GaWx0ZXJCeUNvbHVtbkNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBvblN0b3JlRmlsdGVyQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25TdG9yZUZpbHRlckNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBvbkxvYWRGaWx0ZXJDbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vbkxvYWRGaWx0ZXJDbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGVhckZpbHRlckNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uQ2xlYXJGaWx0ZXJDbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBmaWx0ZXJzKGNvbHVtbiBmaWx0ZXIsIHF1aWNrZmlsdGVyIGFuZCBmaWx0ZXIgYnVpbGRlcikgYW5kIHJlbG9hZCBkYXRhXG4gICAqIEBwYXJhbSBbdHJpZ2dlckRhdGFzb3VyY2VVcGRhdGVdXG4gICAqL1xuICBjbGVhckZpbHRlcnModHJpZ2dlckRhdGFzb3VyY2VVcGRhdGU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UuY2xlYXJDb2x1bW5GaWx0ZXJzKHRyaWdnZXJEYXRhc291cmNlVXBkYXRlKTtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51ICYmIHRoaXMub1RhYmxlTWVudS5jb2x1bW5GaWx0ZXJPcHRpb24pIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5jb2x1bW5GaWx0ZXJPcHRpb24uc2V0QWN0aXZlKHRoaXMuaXNDb2x1bW5GaWx0ZXJzQWN0aXZlKTtcbiAgICB9XG4gICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoKTtcbiAgICBpZiAodGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5zZXRWYWx1ZSh2b2lkIDApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZpbHRlckJ1aWxkZXIpIHtcbiAgICAgIHRoaXMuZmlsdGVyQnVpbGRlci5jbGVhckZpbHRlcigpO1xuICAgICAgdGhpcy5maWx0ZXJCdWlsZGVyLnRyaWdnZXJSZWxvYWQoKTtcbiAgICB9XG5cbiAgfVxuXG4gIGNsZWFyQ29sdW1uRmlsdGVyKGF0dHI6IHN0cmluZywgdHJpZ2dlckRhdGFzb3VyY2VVcGRhdGU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nU2VydmljZS5zZXRMb2FkaW5nKHRydWUpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5jbGVhckNvbHVtbkZpbHRlcihhdHRyLCB0cmlnZ2VyRGF0YXNvdXJjZVVwZGF0ZSk7XG4gICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoKTtcbiAgICB0aGlzLnJlbG9hZFBhZ2luYXRlZERhdGFGcm9tU3RhcnQoZmFsc2UpO1xuICB9XG5cbiAgZmlsdGVyQnlDb2x1bW4oY29sdW1uVmFsdWVGaWx0ZXI6IE9Db2x1bW5WYWx1ZUZpbHRlcikge1xuICAgIHRoaXMubG9hZGluZ1NlcnZpY2Uuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuYWRkQ29sdW1uRmlsdGVyKGNvbHVtblZhbHVlRmlsdGVyKTtcbiAgICB0aGlzLm9uRmlsdGVyQnlDb2x1bW5DaGFuZ2UuZW1pdCgpO1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICB0aGlzLnJlbG9hZFBhZ2luYXRlZERhdGFGcm9tU3RhcnQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyQ29sdW1uRmlsdGVycyh0cmlnZ2VyRGF0YXNvdXJjZVVwZGF0ZTogYm9vbGVhbiA9IHRydWUsIGNvbHVtbnNBdHRyPzogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuY2xlYXJDb2x1bW5GaWx0ZXJzKHRyaWdnZXJEYXRhc291cmNlVXBkYXRlLCBjb2x1bW5zQXR0cik7XG4gICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoKTtcbiAgICB0aGlzLnJlbG9hZFBhZ2luYXRlZERhdGFGcm9tU3RhcnQoZmFsc2UpO1xuICB9XG5cbiAgaXNDb2x1bW5GaWx0ZXJhYmxlKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQpID8gdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50LmlzQ29sdW1uRmlsdGVyYWJsZShjb2x1bW4uYXR0cikgOiB0aGlzLmlzU2VhcmNoZWFibGVDb2x1bW4oY29sdW1uKTtcbiAgfVxuXG4gIGlzU2VhcmNoZWFibGVDb2x1bW4oY29sdW1uOiBPQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoZWFibGVDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5hdHRyKTtcbiAgfVxuICBpc0NvbHVtbkZpbHRlckFjdGl2ZShjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0NvbHVtbkZpbHRlcnNBY3RpdmUgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5kYXRhU291cmNlLmdldENvbHVtblZhbHVlRmlsdGVyQnlBdHRyKGNvbHVtbi5hdHRyKSk7XG4gIH1cblxuICBvcGVuQ29sdW1uRmlsdGVyRGlhbG9nKGNvbHVtbjogT0NvbHVtbiwgZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKE9UYWJsZUZpbHRlckJ5Q29sdW1uRGF0YURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGF0YToge1xuICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgdGFibGU6IHRoaXNcbiAgICAgIH0sXG4gICAgICBtaW5XaWR0aDogJzM4MHB4JyxcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgIHBhbmVsQ2xhc3M6IFsnby1kaWFsb2ctY2xhc3MnLCAnby10YWJsZS1kaWFsb2cnXVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBzd2l0Y2ggKHJlc3VsdCkge1xuICAgICAgICBjYXNlIFRhYmxlRmlsdGVyQnlDb2x1bW5EaWFsb2dSZXN1bHQuQUNDRVBUOlxuICAgICAgICAgIGNvbnN0IGNvbHVtblZhbHVlRmlsdGVyID0gZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmdldENvbHVtblZhbHVlc0ZpbHRlcigpO1xuICAgICAgICAgIHRoaXMuZmlsdGVyQnlDb2x1bW4oY29sdW1uVmFsdWVGaWx0ZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRhYmxlRmlsdGVyQnlDb2x1bW5EaWFsb2dSZXN1bHQuQ0xFQVI6XG4gICAgICAgICAgY29uc3QgY29sID0gZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmNvbHVtbjtcbiAgICAgICAgICB0aGlzLmNsZWFyQ29sdW1uRmlsdGVyKGNvbC5hdHRyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2Uub25Tb3J0RmlsdGVyVmFsdWVzQ2hhbmdlLnN1YnNjcmliZShzb3J0ZWRGaWx0ZXJhYmxlQ29sdW1uID0+IHtcbiAgICAgIC8vIGd1YXJkYXIgZW4gbG9jYWxzdG9yYWdlIGVsIGNhbWJpb1xuICAgICAgdGhpcy5zdG9yZUZpbHRlckNvbHVtbnMoc29ydGVkRmlsdGVyYWJsZUNvbHVtbik7XG4gICAgfSk7XG4gIH1cblxuICBzdG9yZUZpbHRlckNvbHVtbnMoc29ydENvbHVtbkZpbHRlcjogT0ZpbHRlckNvbHVtbikge1xuICAgIGlmICh0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMpIHtcbiAgICAgIC8vIGlmIGV4aXN0cyBpbiBzdGF0ZSB0aGVuIHVwZGF0ZWQgc29ydCB2YWx1ZVxuICAgICAgY29uc3QgZmlsdGVyQ29sdW1uID0gdGhpcy5maWx0ZXJDb2x1bW5zLmZpbmQoeCA9PiB4LmF0dHIgPT09IHNvcnRDb2x1bW5GaWx0ZXIuYXR0cik7XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQoZmlsdGVyQ29sdW1uKSkge1xuICAgICAgICBmaWx0ZXJDb2x1bW4uc29ydCA9IHNvcnRDb2x1bW5GaWx0ZXIuc29ydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVsc2UgZXhpc3RzIGluIHN0YXRlIHRoZW4gYWRkZWQgZmlsdGVyIGNvbHVtblxuICAgICAgICB0aGlzLmZpbHRlckNvbHVtbnMucHVzaChzb3J0Q29sdW1uRmlsdGVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5maWx0ZXJDb2x1bW5zID0gdGhpcy5maWx0ZXJDb2x1bW5zO1xuICB9XG5cbiAgZ2V0U3RhcnRWaWV3RmlsdGVyQ29sdW1uKGNvbHVtbjogT0NvbHVtbik6ICdtb250aCcgfCAneWVhcicgfCAnbXVsdGkteWVhcicgfCAnJyB7XG4gICAgbGV0IHN0YXJ0VmlldztcbiAgICAvLyBhdCBmaXJzdCwgZ2V0IHN0YXRlIGluIGxvY2Fsc3RvcmFnZVxuICAgIGlmICh0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMpIHtcbiAgICAgIHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucy5mb3JFYWNoKChlbGVtZW50OiBPRmlsdGVyQ29sdW1uKSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LmF0dHIgPT09IGNvbHVtbi5hdHRyKSB7XG4gICAgICAgICAgc3RhcnRWaWV3ID0gZWxlbWVudC5zdGFydFZpZXc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghVXRpbC5pc0RlZmluZWQoc3RhcnRWaWV3KSAmJiB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgIHN0YXJ0VmlldyA9IHRoaXMub1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudC5nZXRTdGFydFZpZXdWYWx1ZU9mRmlsdGVyQ29sdW1uKGNvbHVtbi5hdHRyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhcnRWaWV3O1xuICB9XG5cbiAgZ2V0U29ydEZpbHRlckNvbHVtbihjb2x1bW46IE9Db2x1bW4pOiAnYXNjJyB8ICdkZXNjJyB8ICcnIHtcbiAgICBsZXQgc29ydENvbHVtbjtcbiAgICAvLyBhdCBmaXJzdCwgZ2V0IHN0YXRlIGluIGxvY2Fsc3RvcmFnZVxuICAgIGlmICh0aGlzLnN0YXRlLmZpbHRlckNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGZpbHRlckNvbCA9IHRoaXMuc3RhdGUuZmlsdGVyQ29sdW1ucy5maW5kKChlbGVtZW50OiBPRmlsdGVyQ29sdW1uKSA9PiBlbGVtZW50LmF0dHIgPT09IGNvbHVtbi5hdHRyKTtcbiAgICAgIGlmIChmaWx0ZXJDb2wpIHtcbiAgICAgICAgc29ydENvbHVtbiA9IGZpbHRlckNvbC5zb3J0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIG5vdCB2YWx1ZSBpbiBsb2NhbHN0b3JhZ2UsIGdldCBzb3J0IHZhbHVlIGluIG8tdGFibGUtY29sdW1uLWZpbHRlci1jb2x1bW4gY29tcG9uZW50XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChzb3J0Q29sdW1uKSAmJiB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQpIHtcbiAgICAgIHNvcnRDb2x1bW4gPSB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuZ2V0U29ydFZhbHVlT2ZGaWx0ZXJDb2x1bW4oY29sdW1uLmF0dHIpO1xuICAgIH1cblxuICAgIC8vIGlmIGVpdGhlciB2YWx1ZSBpbiBvLXRhYmxlLWNvbHVtbi1maWx0ZXItY29sdW1uIG9yIGxvY2Fsc3RvcmFnZSwgZ2V0IHNvcnQgdmFsdWUgaW4gc29ydENvbEFycmF5XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChzb3J0Q29sdW1uKSAmJiB0aGlzLnNvcnRDb2xBcnJheS5maW5kKHggPT4geC5jb2x1bW5OYW1lID09PSBjb2x1bW4uYXR0cikpIHtcbiAgICAgIHNvcnRDb2x1bW4gPSB0aGlzLmlzQ29sdW1uU29ydEFjdGl2ZShjb2x1bW4pID8gJ2FzYycgOiAnZGVzYyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRDb2x1bW47XG4gIH1cblxuICBnZXQgZGlzYWJsZVRhYmxlTWVudUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wZXJtaXNzaW9ucyAmJiB0aGlzLnBlcm1pc3Npb25zLm1lbnUgJiYgdGhpcy5wZXJtaXNzaW9ucy5tZW51LmVuYWJsZWQgPT09IGZhbHNlKTtcbiAgfVxuXG4gIGdldCBzaG93VGFibGVNZW51QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBlcm1pc3Npb25IaWRkZW4gPSAhISh0aGlzLnBlcm1pc3Npb25zICYmIHRoaXMucGVybWlzc2lvbnMubWVudSAmJiB0aGlzLnBlcm1pc3Npb25zLm1lbnUudmlzaWJsZSA9PT0gZmFsc2UpO1xuICAgIGlmIChwZXJtaXNzaW9uSGlkZGVuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRpY09wdCA9IHRoaXMuc2VsZWN0QWxsQ2hlY2tib3ggfHwgdGhpcy5leHBvcnRCdXR0b24gfHwgdGhpcy5zaG93Q29uZmlndXJhdGlvbk9wdGlvbiB8fCB0aGlzLmNvbHVtbnNWaXNpYmlsaXR5QnV0dG9uIHx8ICh0aGlzLnNob3dGaWx0ZXJPcHRpb24gJiYgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50ICE9PSB1bmRlZmluZWQpO1xuICAgIHJldHVybiBzdGF0aWNPcHQgfHwgdGhpcy50YWJsZU9wdGlvbnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHNldE9UYWJsZUluc2VydGFibGVSb3codGFibGVJbnNlcnRhYmxlUm93OiBPVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50KSB7XG4gICAgY29uc3QgaW5zZXJ0UGVybTogT1Blcm1pc3Npb25zID0gdGhpcy5nZXRBY3Rpb25QZXJtaXNzaW9ucyhQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9JTlNFUlQpO1xuICAgIGlmIChpbnNlcnRQZXJtLnZpc2libGUpIHtcbiAgICAgIHRhYmxlSW5zZXJ0YWJsZVJvdy5lbmFibGVkID0gaW5zZXJ0UGVybS5lbmFibGVkO1xuICAgICAgdGhpcy5vVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50ID0gdGFibGVJbnNlcnRhYmxlUm93O1xuICAgICAgdGhpcy5zaG93Rmlyc3RJbnNlcnRhYmxlUm93ID0gdGhpcy5vVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzRmlyc3RSb3coKTtcbiAgICAgIHRoaXMuc2hvd0xhc3RJbnNlcnRhYmxlUm93ID0gIXRoaXMuc2hvd0ZpcnN0SW5zZXJ0YWJsZVJvdztcbiAgICAgIHRoaXMub1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pbml0aWFsaXplRWRpdG9ycygpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uQW5kRWRpdGluZyhjbGVhclNlbGVjdGlvbjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoY2xlYXJTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKG9Db2x1bW4gPT4gb0NvbHVtbi5lZGl0aW5nKVxuICAgICAgLmZvckVhY2gob0NvbHVtbiA9PiB7XG4gICAgICAgIG9Db2x1bW4uZWRpdGluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tTZWxlY3RlZEl0ZW1EYXRhKCkge1xuICAgIHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyA9IGZhbHNlO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlLnNlbGVjdGlvbikgJiYgdGhpcy5zdGF0ZS5zZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb24uZm9yRWFjaChzZWxlY3RlZEl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1LZXlzID0gT2JqZWN0LmtleXMoc2VsZWN0ZWRJdGVtKTtcbiAgICAgICAgLy8gZmluZGluZyBzZWxlY3RlZCBpdGVtIGRhdGEgaW4gdGhlIHRhYmxlIHJlbmRlcmVkIGRhdGFcbiAgICAgICAgY29uc3QgZm91bmRJdGVtID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5maW5kKGRhdGEgPT5cbiAgICAgICAgICBzZWxlY3RlZEl0ZW1LZXlzLmV2ZXJ5KGtleSA9PiBkYXRhW2tleV0gPT09IHNlbGVjdGVkSXRlbVtrZXldKVxuICAgICAgICApO1xuICAgICAgICBpZiAoZm91bmRJdGVtKSB7XG4gICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZChmb3VuZEl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyU2VsZWN0aW9uRXZlbnRzID0gdHJ1ZTtcbiAgfVxuXG4gIHVzZURldGFpbEJ1dHRvbihjb2x1bW46IE9Db2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sdW1uLnR5cGUgPT09ICdlZGl0QnV0dG9uSW5Sb3cnIHx8IGNvbHVtbi50eXBlID09PSAnZGV0YWlsQnV0dG9uSW5Sb3cnO1xuICB9XG5cbiAgb25EZXRhaWxCdXR0b25DbGljayhjb2x1bW46IE9Db2x1bW4sIHJvdzogYW55LCBldmVudDogYW55KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG4gICAgICBjYXNlICdlZGl0QnV0dG9uSW5Sb3cnOlxuICAgICAgICB0aGlzLmVkaXREZXRhaWwocm93KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZXRhaWxCdXR0b25JblJvdyc6XG4gICAgICAgIHRoaXMudmlld0RldGFpbChyb3cpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBnZXREZXRhaWxCdXR0b25JY29uKGNvbHVtbjogT0NvbHVtbikge1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG4gICAgICBjYXNlICdlZGl0QnV0dG9uSW5Sb3cnOlxuICAgICAgICByZXN1bHQgPSB0aGlzLmVkaXRCdXR0b25JblJvd0ljb247XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGV0YWlsQnV0dG9uSW5Sb3cnOlxuICAgICAgICByZXN1bHQgPSB0aGlzLmRldGFpbEJ1dHRvbkluUm93SWNvbjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB1c2VQbGFpblJlbmRlcihjb2x1bW46IE9Db2x1bW4sIHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnVzZURldGFpbEJ1dHRvbihjb2x1bW4pICYmICFjb2x1bW4ucmVuZGVyZXIgJiYgKCFjb2x1bW4uZWRpdG9yIHx8ICghY29sdW1uLmVkaXRpbmcgfHwgIXRoaXMuaXNSb3dTZWxlY3RlZChyb3cpKSk7XG4gIH1cblxuICB1c2VDZWxsUmVuZGVyZXIoY29sdW1uOiBPQ29sdW1uLCByb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2x1bW4ucmVuZGVyZXIgJiYgKCFjb2x1bW4uZWRpdGluZyB8fCBjb2x1bW4uZWRpdGluZyAmJiAhdGhpcy5pc1Jvd1NlbGVjdGVkKHJvdykpO1xuICB9XG5cbiAgdXNlQ2VsbEVkaXRvcihjb2x1bW46IE9Db2x1bW4sIHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETyBBZGQgY29sdW1uLmVkaXRvciBpbnN0YW5jZW9mIE9UYWJsZUNlbGxFZGl0b3JCb29sZWFuQ29tcG9uZW50IHRvIGNvbmRpdGlvblxuICAgIGlmIChjb2x1bW4uZWRpdG9yICYmIGNvbHVtbi5lZGl0b3IuYXV0b0NvbW1pdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uLmVkaXRvciAmJiBjb2x1bW4uZWRpdGluZyAmJiB0aGlzLmlzUm93U2VsZWN0ZWQocm93KTtcbiAgfVxuXG4gIGlzU2VsZWN0aW9uTW9kZU11bHRpcGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09IENvZGVzLlNFTEVDVElPTl9NT0RFX01VTFRJUExFO1xuICB9XG5cbiAgaXNTZWxlY3Rpb25Nb2RlU2luZ2xlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09IENvZGVzLlNFTEVDVElPTl9NT0RFX1NJTkdMRTtcbiAgfVxuXG4gIGlzU2VsZWN0aW9uTW9kZU5vbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gQ29kZXMuU0VMRUNUSU9OX01PREVfTk9ORTtcbiAgfVxuXG4gIG9uQ2hhbmdlUGFnZShldnQ6IFBhZ2VFdmVudCkge1xuICAgIGlmICghdGhpcy5sb2FkaW5nU2VydmljZS5oYW5kbGVQcm90ZWN0ZWQoZXZ0IGFzIGFueSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5maW5pc2hRdWVyeVN1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuZGF0YVNlcnZpY2U/LnNldFBhZ2luYXRpb25Db250ZXh0KHsgcGFnZU51bWJlcjogZXZ0LnBhZ2VJbmRleCwgcGFnZVNpemU6IGV2dC5wYWdlU2l6ZSB9KTtcbiAgICBpZiAoIXRoaXMucGFnZWFibGUpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldnQucGFnZUluZGV4O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGdvaW5nQmFjayA9IGV2dC5wYWdlSW5kZXggPCB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldnQucGFnZUluZGV4O1xuICAgIGNvbnN0IHBhZ2VTaXplID0gdGhpcy5wYWdpbmF0b3IuaXNTaG93aW5nQWxsUm93cyhldnQucGFnZVNpemUpID8gdGhpcy5zdGF0ZS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciA6IGV2dC5wYWdlU2l6ZTtcblxuICAgIGNvbnN0IG9sZFF1ZXJ5Um93cyA9IHRoaXMucXVlcnlSb3dzO1xuICAgIGNvbnN0IGNoYW5naW5nUGFnZVNpemUgPSAob2xkUXVlcnlSb3dzICE9PSBwYWdlU2l6ZSk7XG4gICAgdGhpcy5xdWVyeVJvd3MgPSBwYWdlU2l6ZTtcbiAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xuXG4gICAgbGV0IG5ld1N0YXJ0UmVjb3JkOiBudW1iZXI7XG4gICAgbGV0IHF1ZXJ5TGVuZ3RoOiBudW1iZXI7XG5cbiAgICBpZiAoZ29pbmdCYWNrIHx8IGNoYW5naW5nUGFnZVNpemUpIHtcbiAgICAgIG5ld1N0YXJ0UmVjb3JkID0gKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnF1ZXJ5Um93cyk7XG4gICAgICBxdWVyeUxlbmd0aCA9IHRoaXMucXVlcnlSb3dzO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTdGFydFJlY29yZCA9IE1hdGgubWF4KHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQsICh0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5xdWVyeVJvd3MpKTtcbiAgICAgIGNvbnN0IG5ld0VuZFJlY29yZCA9IE1hdGgubWluKG5ld1N0YXJ0UmVjb3JkICsgdGhpcy5xdWVyeVJvd3MsIHRoaXMuc3RhdGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXIpO1xuICAgICAgcXVlcnlMZW5ndGggPSB0aGlzLmRpc2FibGVQYWdlU2l6ZUNhbGN1bGF0aW9uID8gdGhpcy5xdWVyeVJvd3MgOiBNYXRoLm1pbih0aGlzLnF1ZXJ5Um93cywgbmV3RW5kUmVjb3JkIC0gbmV3U3RhcnRSZWNvcmQpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5QXJnczogT1F1ZXJ5RGF0YUFyZ3MgPSB7XG4gICAgICBvZmZzZXQ6IG5ld1N0YXJ0UmVjb3JkLFxuICAgICAgbGVuZ3RoOiBxdWVyeUxlbmd0aFxuICAgIH07XG5cbiAgICB0aGlzLmZpbmlzaFF1ZXJ5U3Vic2NyaXB0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5xdWVyeURhdGEodm9pZCAwLCBxdWVyeUFyZ3MpO1xuICB9XG5cbiAgZ2V0T0NvbHVtbihhdHRyOiBzdHJpbmcpOiBPQ29sdW1uIHtcbiAgICByZXR1cm4gdGhpcy5fb1RhYmxlT3B0aW9ucyA/IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5maW5kKGl0ZW0gPT4gaXRlbS5uYW1lID09PSBhdHRyKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGluc2VydFJlY29yZChyZWNvcmREYXRhOiBhbnksIHNxbFR5cGVzPzogb2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgaWYgKHRoaXMuc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHkpIHtcbiAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc2VydCBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgYmVjYXVzZSB0aGUgdGFibGUgaXMgcmVhZC1vbmx5LmApXG4gICAgfVxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX0lOU0VSVCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghVXRpbC5pc0RlZmluZWQoc3FsVHlwZXMpKSB7XG4gICAgICBjb25zdCBhbGxTcWxUeXBlcyA9IHRoaXMuZ2V0U3FsVHlwZXMoKTtcbiAgICAgIHNxbFR5cGVzID0ge307XG4gICAgICBPYmplY3Qua2V5cyhyZWNvcmREYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHNxbFR5cGVzW2tleV0gPSBhbGxTcWxUeXBlc1trZXldO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhb1RhYmxlLmluc2VydFF1ZXJ5KHJlY29yZERhdGEsIHNxbFR5cGVzKTtcbiAgfVxuXG4gIHVwZGF0ZVJlY29yZChmaWx0ZXI6IGFueSwgdXBkYXRlRGF0YTogYW55LCBzcWxUeXBlcz86IG9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIGlmICh0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVcGRhdGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgdGhlIHRhYmxlIGlzIHJlYWQtb25seS5gKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX1VQREFURSkpIHtcbiAgICAgIHJldHVybiBvZih0aGlzLmRhdGFTb3VyY2UuZGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IHNxbFR5cGVzQXJnID0gc3FsVHlwZXMgfHwge307XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChzcWxUeXBlcykpIHtcbiAgICAgIGNvbnN0IGFsbFNxbFR5cGVzID0gdGhpcy5nZXRTcWxUeXBlcygpO1xuICAgICAgT2JqZWN0LmtleXMoZmlsdGVyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHNxbFR5cGVzQXJnW2tleV0gPSBhbGxTcWxUeXBlc1trZXldO1xuICAgICAgfSk7XG4gICAgICBPYmplY3Qua2V5cyh1cGRhdGVEYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHNxbFR5cGVzQXJnW2tleV0gPSBhbGxTcWxUeXBlc1trZXldO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhb1RhYmxlLnVwZGF0ZVF1ZXJ5KGZpbHRlciwgdXBkYXRlRGF0YSwgc3FsVHlwZXNBcmcpO1xuICB9XG5cblxuICAvKipcbiAgICogR2V0cyBkYXRhIHRhYmxlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXREYXRhQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGFvVGFibGUuZGF0YTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNldHMgZGF0YSB0YWJsZSB3aGVuIGlzIHN0YXRpYyAoT05MWSBJTiBUSElTIENBU0UpXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBzZXREYXRhQXJyYXkoZGF0YTogQXJyYXk8YW55Pikge1xuICAgIGlmICh0aGlzLmRhb1RhYmxlKSB7XG4gICAgICAvLyByZW1vdGUgcGFnaW5hdGlvbiBoYXMgbm8gc2Vuc2Ugd2hlbiB1c2luZyBzdGF0aWMtZGF0YVxuICAgICAgdGhpcy5wYWdlYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zdGF0aWNEYXRhID0gZGF0YTtcbiAgICAgIHRoaXMuZGFvVGFibGUudXNpbmdTdGF0aWNEYXRhID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGFvVGFibGUuc2V0RGF0YUFycmF5KHRoaXMuc3RhdGljRGF0YSk7XG4gICAgICB0aGlzLm9uRGF0YUxvYWRlZC5lbWl0KHRoaXMuZGFvVGFibGUuZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlbGV0ZUxvY2FsSXRlbXMoKSB7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gdGhpcy5nZXREYXRhQXJyYXkoKTtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XG4gICAgc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKChzZWxlY3RlZEl0ZW06IGFueSkgPT4ge1xuICAgICAgZm9yIChsZXQgaiA9IGRhdGFBcnJheS5sZW5ndGggLSAxOyBqID49IDA7IC0taikge1xuICAgICAgICBpZiAoVXRpbC5lcXVhbHMoc2VsZWN0ZWRJdGVtLCBkYXRhQXJyYXlbal0pKSB7XG4gICAgICAgICAgZGF0YUFycmF5LnNwbGljZShqLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnNldERhdGFBcnJheShkYXRhQXJyYXkpO1xuICB9XG5cbiAgaXNDb2x1bW5Tb3J0QWN0aXZlKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5zb3J0Q29sQXJyYXkuZmluZChzb3J0QyA9PiBzb3J0Qy5jb2x1bW5OYW1lID09PSBjb2x1bW4uYXR0cik7XG4gICAgcmV0dXJuIGZvdW5kICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc0NvbHVtbkRlc2NTb3J0QWN0aXZlKGNvbHVtbjogT0NvbHVtbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5zb3J0Q29sQXJyYXkuZmluZChzb3J0QyA9PiBzb3J0Qy5jb2x1bW5OYW1lID09PSBjb2x1bW4uYXR0ciAmJiAhc29ydEMuYXNjZW5kZW50KTtcbiAgICByZXR1cm4gZm91bmQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGhhc1RhYkdyb3VwQ2hhbmdlU3Vic2NyaXB0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYkdyb3VwQ2hhbmdlU3Vic2NyaXB0aW9uICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc0VtcHR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIVV0aWwuaXNEZWZpbmVkKHZhbHVlKSB8fCAoKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpICYmICF2YWx1ZSk7XG4gIH1cblxuICBzZXRGaWx0ZXJzQ29uZmlndXJhdGlvbihzdG9yYWdlOiBPVGFibGVDb21wb25lbnRTdGF0ZUNsYXNzID0gdGhpcy5zdGF0ZSkge1xuICAgIC8qXG4gICAgICBDaGVja2luZyB0aGUgb3JpZ2luYWwgZmlsdGVyQ2FzZVNlbnNpdGl2ZSB3aXRoIHRoZSBmaWx0ZXJDYXNlU2Vuc2l0aXZlIGluIGluaXRpYWwgY29uZmlndXJhdGlvbiBpbiBsb2NhbCBzdG9yYWdlXG4gICAgICBpZiBmaWx0ZXJDYXNlU2Vuc2l0aXZlIGluIGluaXRpYWwgY29uZmlndXJhdGlvbiBpcyBlcXVhbHMgdG8gb3JpZ2luYWwgZmlsdGVyQ2FzZVNlbnNpdGl2ZSBpbnB1dFxuICAgICAgZmlsdGVyQ2FzZVNlbnNpdGl2ZSB3aWxsIGJlIHRoZSB2YWx1ZSBpbiBsb2NhbCBzdG9yYWdlXG4gICAgKi9cbiAgICBpZiAoc3RvcmFnZS5pbml0aWFsQ29uZmlndXJhdGlvbi5maWx0ZXJDYXNlU2Vuc2l0aXZlICE9PSB0aGlzLmZpbHRlckNhc2VTZW5zaXRpdmUpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZmlsdGVyQ2FzZVNlbnNpdGl2ZSA9IHRoaXMuZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5maWx0ZXJDYXNlU2Vuc2l0aXZlID0gc3RvcmFnZS5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyLWNhc2Utc2Vuc2l0aXZlJykgPyBzdG9yYWdlWydmaWx0ZXItY2FzZS1zZW5zaXRpdmUnXSA6IHRoaXMuZmlsdGVyQ2FzZVNlbnNpdGl2ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmFnZS5pbml0aWFsQ29uZmlndXJhdGlvbi5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQgIT09IHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0KSB7XG4gICAgICB0aGlzLmlzQ29sdW1uRmlsdGVyc0FjdGl2ZSA9IHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb25mRmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0ID0gc3RvcmFnZS5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyLWNvbHVtbi1hY3RpdmUnKSA/IHN0b3JhZ2VbJ2ZpbHRlci1jb2x1bW4tYWN0aXZlJ10gOiB0aGlzLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDtcbiAgICAgIHRoaXMuaXNDb2x1bW5GaWx0ZXJzQWN0aXZlID0gY29uZkZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdCB8fCB0aGlzLnN0YXRlLmNvbHVtblZhbHVlRmlsdGVycy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChzdG9yYWdlLmNvbHVtblZhbHVlRmlsdGVycykpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5pbml0aWFsaXplQ29sdW1uc0ZpbHRlcnModGhpcy5zdGF0ZS5jb2x1bW5WYWx1ZUZpbHRlcnMpO1xuICAgICAgdGhpcy5vbkZpbHRlckJ5Q29sdW1uQ2hhbmdlLmVtaXQoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudCkge1xuICAgICAgdGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudC5zZXRWYWx1ZShzdG9yYWdlWydmaWx0ZXInXSk7XG4gICAgICAoc3RvcmFnZVsnb0NvbHVtbnMnXSB8fCBbXSkuZm9yRWFjaCgob0NvbERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBvQ29sID0gdGhpcy5nZXRPQ29sdW1uKG9Db2xEYXRhLmF0dHIpO1xuICAgICAgICBpZiAob0NvbCAmJiBvQ29sRGF0YS5oYXNPd25Qcm9wZXJ0eSgnc2VhcmNoaW5nJykpIHtcbiAgICAgICAgICBvQ29sLnNlYXJjaGluZyA9IG9Db2xEYXRhLnNlYXJjaGluZztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyQnVpbGRlciAmJiBVdGlsLmlzRGVmaW5lZChzdG9yYWdlLmZpbHRlckJ1aWxkZXJWYWx1ZXMpKSB7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIuc2V0RmlsdGVyVmFsdWVzKHN0b3JhZ2UuZmlsdGVyQnVpbGRlclZhbHVlcyk7XG4gICAgICB0aGlzLmZpbHRlckJ1aWxkZXIudHJpZ2dlclJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uU3RvcmVDb25maWd1cmF0aW9uQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25TdG9yZUNvbmZpZ3VyYXRpb25DbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25BcHBseUNvbmZpZ3VyYXRpb25DbGlja2VkKCkge1xuICAgIGlmICh0aGlzLm9UYWJsZU1lbnUpIHtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5vbkFwcGx5Q29uZmlndXJhdGlvbkNsaWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBhcHBseURlZmF1bHRDb25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVBhcmFtcygpO1xuICAgIHRoaXMucGFyc2VWaXNpYmxlQ29sdW1ucyh0cnVlKTtcbiAgICB0aGlzLnJlZnJlc2hDb2x1bW5zV2lkdGhGcm9tT3JpZ2luYWxEZWZpbml0aW9uKCk7XG4gICAgdGhpcy5yZWluaXRpYWxpemF0ZVF1aWNrRmlsdGVyQ29sdW1ucygpO1xuICAgIHRoaXMucmVzZXRRdWVyeVJvd3MoKTtcbiAgICBjb25zdCBpbml0aWFsQ29uZmlnU29ydENvbHVtbnNBcnJheSA9IFNlcnZpY2VVdGlscy5wYXJzZVNvcnRDb2x1bW5zKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uc29ydENvbHVtbnMpO1xuICAgIHRoaXMucmVpbml0aWFsaXplU29ydENvbHVtbnMoaW5pdGlhbENvbmZpZ1NvcnRDb2x1bW5zQXJyYXkpO1xuICAgIHRoaXMub25SZWluaXRpYWxpemUuZW1pdChudWxsKTtcbiAgICB0aGlzLmNsZWFyRmlsdGVycyhmYWxzZSk7XG4gICAgdGhpcy5yZWxvYWREYXRhKCk7XG4gIH1cbiAgcmVzZXRRdWVyeVJvd3MoKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24ucXVlcnlSb3dzKSkge1xuICAgICAgdGhpcy5xdWVyeVJvd3MgPSB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLnF1ZXJ5Um93cztcbiAgICB9XG4gIH1cbiAgYXBwbHlDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb25OYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzdG9yZWRDb25maWd1cmF0aW9uID0gdGhpcy5zdGF0ZS5nZXRTdG9yZWRDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb25OYW1lKTtcbiAgICBpZiAoc3RvcmVkQ29uZmlndXJhdGlvbikge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHN0b3JlZENvbmZpZ3VyYXRpb25bJ3N0b3JlZC1wcm9wZXJ0aWVzJ10gfHwgW107XG5cbiAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICAgICAgICBjYXNlICdzb3J0LWNvbHVtbnMnOlxuICAgICAgICAgICAgdGhpcy5yZWluaXRpYWxpemVTb3J0Q29sdW1ucygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnb0NvbHVtbnMtZGlzcGxheSc6XG4gICAgICAgICAgICB0aGlzLnBhcnNlVmlzaWJsZUNvbHVtbnMoKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94Q29sdW1uKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hDb2x1bW5zV2lkdGhGcm9tTG9jYWxTdG9yYWdlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdxdWljay1maWx0ZXInOlxuICAgICAgICAgIGNhc2UgJ2NvbHVtbnMtZmlsdGVyJzpcbiAgICAgICAgICBjYXNlICdmaWx0ZXItYnVpbGRlcic6XG4gICAgICAgICAgICB0aGlzLnNldEZpbHRlcnNDb25maWd1cmF0aW9uKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdncm91cGVkLWNvbHVtbnMnOlxuICAgICAgICAgICAgdGhpcy5wYXJzZUdyb3VwZWRDb2x1bW5zKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdwYWdlJzpcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnN0YXRlLmN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgdGhpcy5xdWVyeVJvd3MgPSB0aGlzLnN0YXRlLnF1ZXJ5Um93cztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVsb2FkRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFRpdGxlQWxpZ25DbGFzcyhvQ29sOiBPQ29sdW1uKSB7XG5cbiAgICBjb25zdCBoYXNUaXRsZUFsaWduID0gVXRpbC5pc0RlZmluZWQob0NvbC5kZWZpbml0aW9uKSAmJiBVdGlsLmlzRGVmaW5lZChvQ29sLmRlZmluaXRpb24udGl0bGVBbGlnbik7XG4gICAgY29uc3QgYXV0b0FsaWduID0gKHRoaXMuYXV0b0FsaWduVGl0bGVzICYmICFoYXNUaXRsZUFsaWduKSB8fCAoaGFzVGl0bGVBbGlnbiAmJiBvQ29sLmRlZmluaXRpb24udGl0bGVBbGlnbiA9PT0gQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX0FVVE8pO1xuICAgIGlmICghYXV0b0FsaWduKSB7XG4gICAgICByZXR1cm4gb0NvbC5nZXRUaXRsZUFsaWduQ2xhc3MoKTtcbiAgICB9XG5cbiAgICBsZXQgYWxpZ24gPSB0aGlzLmdldENlbGxBbGlnbkNsYXNzKG9Db2wpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChhbGlnbikgJiYgYWxpZ24ubGVuZ3RoID4gMCkge1xuICAgICAgYWxpZ24gPSBhbGlnbi5zdWJzdHJpbmcoMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAob0NvbC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIGNhc2UgJ2FjdGlvbic6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgIGFsaWduID0gQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX0NFTlRFUjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY3VycmVuY3knOlxuICAgICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgICAgY2FzZSAncmVhbCc6XG4gICAgICAgIGNhc2UgJ3BlcmNlbnRhZ2UnOlxuICAgICAgICAgIGFsaWduID0gQ29kZXMuQ09MVU1OX1RJVExFX0FMSUdOX0VORDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2VydmljZSc6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYWxpZ24gPSBDb2Rlcy5DT0xVTU5fVElUTEVfQUxJR05fU1RBUlQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbGlnbjtcblxuICB9XG5cbiAgcHVibGljIGdldENlbGxBbGlnbkNsYXNzKGNvbHVtbjogT0NvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKGNvbHVtbi5kZWZpbml0aW9uKSAmJiBVdGlsLmlzRGVmaW5lZChjb2x1bW4uZGVmaW5pdGlvbi5jb250ZW50QWxpZ24pID8gJ28tJyArIGNvbHVtbi5kZWZpbml0aW9uLmNvbnRlbnRBbGlnbiA6ICcnO1xuICB9XG5cblxuICBwdWJsaWMgZ2V0R3JvdXBIZWFkZXJDZWxsQWxpZ25DbGFzcyhjb2x1bW46IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjbGFzc05hbWVBcnJheSA9IFtdO1xuICAgIGNvbnN0IG9Db2wgPSB0aGlzLmdldE9Db2x1bW4oY29sdW1uLnN1YnN0cignZ3JvdXBIZWFkZXItJy5sZW5ndGgpKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQob0NvbCkpIHtcbiAgICAgIGNsYXNzTmFtZUFycmF5LnB1c2godGhpcy5nZXRDZWxsQWxpZ25DbGFzcyhvQ29sKSk7XG4gICAgICBjbGFzc05hbWVBcnJheS5wdXNoKG9Db2wuY2xhc3NOYW1lID8gb0NvbC5jbGFzc05hbWUgOiAnJyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVBcnJheTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGREZWZhdWx0Um93QnV0dG9ucygpIHtcbiAgICAvLyBjaGVjayBwZXJtaXNzaW9uc1xuICAgIGlmICh0aGlzLmVkaXRCdXR0b25JblJvdykge1xuICAgICAgdGhpcy5hZGRCdXR0b25JblJvdygnZWRpdEJ1dHRvbkluUm93Jyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRldGFpbEJ1dHRvbkluUm93KSB7XG4gICAgICB0aGlzLmFkZEJ1dHRvbkluUm93KCdkZXRhaWxCdXR0b25JblJvdycpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRCdXR0b25JblJvdyhuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb2xEZWY6IE9Db2x1bW4gPSB0aGlzLmNyZWF0ZU9Db2x1bW4obmFtZSwgdGhpcyk7XG4gICAgY29sRGVmLnR5cGUgPSBuYW1lO1xuICAgIGNvbERlZi52aXNpYmxlID0gdHJ1ZTtcbiAgICBjb2xEZWYuc2VhcmNoYWJsZSA9IGZhbHNlO1xuICAgIGNvbERlZi5vcmRlcmFibGUgPSBmYWxzZTtcbiAgICBjb2xEZWYucmVzaXphYmxlID0gZmFsc2U7XG4gICAgY29sRGVmLmdyb3VwYWJsZSA9IGZhbHNlO1xuICAgIGNvbERlZi50aXRsZSA9IHVuZGVmaW5lZDtcbiAgICBjb2xEZWYud2lkdGggPSAnNDhweCc7XG4gICAgdGhpcy5wdXNoT0NvbHVtbkRlZmluaXRpb24oY29sRGVmKTtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLnB1c2gobmFtZSk7XG4gIH1cblxuICBnZXQgaGVhZGVySGVpZ2h0KCkge1xuICAgIGxldCBoZWlnaHQgPSAwO1xuICAgIGlmICh0aGlzLnRhYmxlSGVhZGVyRWw/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGhlaWdodCArPSB0aGlzLnRhYmxlSGVhZGVyRWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhYmxlVG9vbGJhckVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBoZWlnaHQgKz0gdGhpcy50YWJsZVRvb2xiYXJFbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIGhlaWdodDtcbiAgfVxuXG4gIGdldCB0b29sQmFySGVpZ2h0KCkge1xuICAgIGxldCBoZWlnaHQgPSAwO1xuXG4gICAgaWYgKHRoaXMudGFibGVUb29sYmFyRWw/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGhlaWdodCArPSB0aGlzLnRhYmxlVG9vbGJhckVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG5cbiAgaXNEZXRhaWxNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRldGFpbE1vZGUgIT09IENvZGVzLkRFVEFJTF9NT0RFX05PTkU7XG4gIH1cblxuICBjb3B5QWxsKCkge1xuICAgIFV0aWwuY29weVRvQ2xpcGJvYXJkKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0UmVuZGVyZWRWYWx1ZSgpKSk7XG4gIH1cblxuICBjb3B5U2VsZWN0aW9uKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVuZGVyZWREYXRhKHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpKTtcbiAgICBVdGlsLmNvcHlUb0NsaXBib2FyZChKU09OLnN0cmluZ2lmeShzZWxlY3RlZEl0ZW1zKSk7XG4gIH1cblxuICBkZXN0cm95QWN0aXZlZFRvb2x0aXBzKCkge1xuICAgIHRoaXMudG9vbHRpcC5mb3JFYWNoKHRwID0+IHtcbiAgICAgIGlmICh0cC5fb3ZlcmxheVJlZikge1xuICAgICAgICB0cC5fb3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBuYXZpZ2F0aW9uIHRvIGl0ZW0gZGV0YWlsLCByZWNlaXZpbmcgaXRlbSBkYXRhXG4gICAqIEBwYXJhbSBpdGVtXG4gICAqIEByZXR1cm5zIGRldGFpbFxuICAgKi9cbiAgdmlld0RldGFpbChpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSAmJiB0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbignZGV0YWlsJykgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3lBY3RpdmVkVG9vbHRpcHMoKTtcbiAgICBzdXBlci52aWV3RGV0YWlsKGl0ZW0pO1xuICB9XG5cblxuICAvKipcbiAgICogVHJpZ2dlcnMgbmF2aWdhdGlvbiB0byBpdGVtIGVkaXRpb24sIHJlY2VpdmluZyBpdGVtIGRhdGFcbiAgICogQHBhcmFtIGl0ZW1cbiAgICogQHJldHVybnMgZGV0YWlsXG4gICAqL1xuICBlZGl0RGV0YWlsKGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5ICYmIHRoaXMuc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHkpIHtcbiAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKCdlZGl0JykgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5lZGl0RGV0YWlsKGl0ZW0pO1xuICB9XG5cbiAgZ2V0T0NvbHVtbkZyb21UaCh0aDogYW55KTogT0NvbHVtbiB7XG4gICAgbGV0IHJlc3VsdDogT0NvbHVtbjtcbiAgICBjb25zdCBjbGFzc0xpc3Q6IGFueVtdID0gQXJyYXkuZnJvbSgodGggYXMgRWxlbWVudCkuY2xhc3NMaXN0IHx8IFtdKTtcbiAgICBjb25zdCBjb2x1bW5DbGFzcyA9IGNsYXNzTGlzdC5maW5kKChjbGFzc05hbWU6IHN0cmluZykgPT4gKGNsYXNzTmFtZS5zdGFydHNXaXRoKCdtYXQtY29sdW1uLScpKSk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbkNsYXNzKSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5nZXRPQ29sdW1uKGNvbHVtbkNsYXNzLnN1YnN0cignbWF0LWNvbHVtbi0nLmxlbmd0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0T0NvbHVtbkZyb21Hcm91cEhlYWRlckNvbHVtbihhdHRyOiBzdHJpbmcpOiBPQ29sdW1uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPQ29sdW1uKGF0dHIuc3Vic3RyKCdncm91cEhlYWRlci0nLmxlbmd0aCkpO1xuICB9XG5cbiAgZ2V0VGhXaWR0aEZyb21PQ29sdW1uKG9Db2x1bW46IE9Db2x1bW4pOiBhbnkge1xuICAgIGxldCB3aWR0aENvbHVtbjogbnVtYmVyO1xuICAgIGNvbnN0IHRoQXJyYXkgPSB0aGlzLnRhYmxlSGVhZGVyRWwubmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoQXJyYXkubGVuZ3RoICYmICFVdGlsLmlzRGVmaW5lZCh3aWR0aENvbHVtbik7IGkrKykge1xuICAgICAgY29uc3QgdGggPSB0aEFycmF5W2ldO1xuICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdGguY2xhc3NMaXN0O1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjbGFzc0xpc3QubGVuZ3RoICYmICFVdGlsLmlzRGVmaW5lZCh3aWR0aENvbHVtbik7IGorKykge1xuICAgICAgICBpZiAoY2xhc3NMaXN0W2pdID09PSAnbWF0LWNvbHVtbi0nICsgb0NvbHVtbi5hdHRyKSB7XG4gICAgICAgICAgd2lkdGhDb2x1bW4gPSB0aC5jbGllbnRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd2lkdGhDb2x1bW47XG4gIH1cblxuICBnZXRDb2x1bW5JbnNlcnRhYmxlKG5hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lICsgdGhpcy5nZXRTdWZmaXhDb2x1bW5JbnNlcnRhYmxlKCk7XG4gIH1cblxuICBpc1Jvd1NlbGVjdGVkKHJvdzogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSAmJiB0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sdW1uV2lkdGhGcm9tU3RhdGUoY29sRGVmOiBPQ29sdW1uKTogc3RyaW5nIHtcbiAgICAvLzEuIEJ5IGRlZmF1bHQsIHNldCB3aWR0aCBkZWZpbml0aW9uXG4gICAgbGV0IGNvbHVtbldpZHRoID0gY29sRGVmLmRlZmluaXRpb24gJiYgY29sRGVmLmRlZmluaXRpb24ud2lkdGggPyBjb2xEZWYuZGVmaW5pdGlvbi53aWR0aCA6IHZvaWQgMDtcbiAgICBjb25zdCBzdG9yZWREYXRhID0gdGhpcy5zdGF0ZS5nZXRDb2x1bW5EaXNwbGF5KGNvbERlZik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHN0b3JlZERhdGEpICYmIFV0aWwuaXNEZWZpbmVkKHN0b3JlZERhdGEud2lkdGgpKSB7XG4gICAgICAvLzIuIFNldCB3aWR0aCBpZiB0aGUgd2lkdGggaXMgc3RvcmVkXG4gICAgICBjb2x1bW5XaWR0aCA9IHN0b3JlZERhdGEud2lkdGg7XG4gICAgICAvLyBjaGVjayB0aGF0IHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucyBzYXZlZCBpbiB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uXG4gICAgICAvLyBpbiB0aGUgbG9jYWwgc3RvcmFnZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICAgIGlmICh0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLmNvbHVtbnNEaXNwbGF5KSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxTdG9yZWREYXRhID0gdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5nZXRDb2x1bW5EaXNwbGF5KGNvbERlZik7XG4gICAgICAgIC8vIElmIG9yaWdpbmFsIHdpZHRoIGNoYW5nZWQgdGhlbiB0aGUgd2lkdGggaXMgcmVzZXRlZCB3aXRoIHRoaXMgdmFsdWVcbiAgICAgICAgaWYgKGluaXRpYWxTdG9yZWREYXRhICYmIGluaXRpYWxTdG9yZWREYXRhLndpZHRoICYmIGNvbERlZi5kZWZpbml0aW9uLm9yaWdpbmFsV2lkdGgpIHtcbiAgICAgICAgICBpZiAoaW5pdGlhbFN0b3JlZERhdGEud2lkdGggIT09IGNvbERlZi5kZWZpbml0aW9uLm9yaWdpbmFsV2lkdGgpIHtcbiAgICAgICAgICAgIGNvbHVtbldpZHRoID0gY29sRGVmLmRlZmluaXRpb24ub3JpZ2luYWxXaWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbldpZHRoO1xuICB9XG5cbiAgcmVmcmVzaENvbHVtbnNXaWR0aEZyb21Mb2NhbFN0b3JhZ2UoKSB7XG4gICAgdGhpcy5vVGFibGVPcHRpb25zLmNvbHVtbnMuZm9yRWFjaCh4ID0+IHtcbiAgICAgIHgud2lkdGggPSB0aGlzLmdldENvbHVtbldpZHRoRnJvbVN0YXRlKHgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVmcmVzaENvbHVtbnNXaWR0aEZyb21PcmlnaW5hbERlZmluaXRpb24oKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlKS5mb3JFYWNoKGMgPT4ge1xuICAgICAgICBjLndpZHRoID0gYy5ET01XaWR0aCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbikgJiYgVXRpbC5pc0RlZmluZWQoYy5kZWZpbml0aW9uLndpZHRoKSkge1xuICAgICAgICAgIGMud2lkdGggPSBjLmRlZmluaXRpb24ud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgYy5zZXRSZW5kZXJXaWR0aCh0aGlzLmhvcml6b250YWxTY3JvbGwsIHRoaXMuZ2V0Q2xpZW50V2lkdGhDb2x1bW4oYykpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT0NvbHVtbihhdHRyPzogc3RyaW5nLCB0YWJsZT86IE9UYWJsZUNvbXBvbmVudCwgY29sdW1uPzogT1RhYmxlQ29sdW1uQ29tcG9uZW50ICYgT1RhYmxlQ29sdW1uQ2FsY3VsYXRlZENvbXBvbmVudCk6IE9Db2x1bW4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE9Db2x1bW4oKTtcbiAgICBpZiAoYXR0cikge1xuICAgICAgaW5zdGFuY2UuYXR0ciA9IGF0dHI7XG4gICAgfVxuICAgIGlmICh0YWJsZSkge1xuICAgICAgaW5zdGFuY2Uuc2V0RGVmYXVsdFByb3BlcnRpZXMoe1xuICAgICAgICBvcmRlcmFibGU6IHRoaXMub3JkZXJhYmxlLFxuICAgICAgICByZXNpemFibGU6IHRoaXMucmVzaXphYmxlLFxuICAgICAgICBncm91cGFibGU6IHRoaXMuZ3JvdXBhYmxlLFxuICAgICAgICBwYWdlYWJsZTogdGhpcy5wYWdlYWJsZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjb2x1bW4pIHtcbiAgICAgIGluc3RhbmNlLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT1RhYmxlQnV0dG9ucyhhcmc6IE9UYWJsZUJ1dHRvbnMpIHtcbiAgICB0aGlzLm9UYWJsZUJ1dHRvbnMgPSBhcmc7XG4gICAgaWYgKHRoaXMub1RhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm9UYWJsZUJ1dHRvbnMucmVnaXN0ZXJCdXR0b25zKHRoaXMudGFibGVCdXR0b25zLnRvQXJyYXkoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENsaWVudFdpZHRoQ29sdW1uKGNvbDogT0NvbHVtbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGNvbC5ET01XaWR0aCB8fCB0aGlzLmdldFRoV2lkdGhGcm9tT0NvbHVtbihjb2wpO1xuICB9XG5cbiAgcHVibGljIGdldE1pbldpZHRoQ29sdW1uKGNvbDogT0NvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFV0aWwuZXh0cmFjdFBpeGVsc1ZhbHVlKGNvbC5taW5XaWR0aCwgQ29kZXMuREVGQVVMVF9DT0xVTU5fTUlOX1dJRFRIKSArICdweCc7XG4gIH1cblxuICBzaG93RXhwYW5kYWJsZVJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy50YWJsZVJvd0V4cGFuZGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZW5hYmxlIHZpcnR1YWwgc2Nyb2xsXG4gICAqL1xuICBnZXQgZW5hYmxlZFZpcnR1YWxTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlydHVhbFNjcm9sbCAmJiAhdGhpcy5zaG93RXhwYW5kYWJsZVJvdygpICYmIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5sZW5ndGggPT09IDA7XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlcyBncm91cGVkIGNvbHVtbnNcbiAgICovXG4gIHBhcnNlR3JvdXBlZENvbHVtbnMoKSB7XG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuc3RhdGUuZ3JvdXBlZENvbHVtbnMgfHwgdGhpcy5vcmlnaW5hbEdyb3VwZWRDb2x1bW5zQXJyYXk7XG4gICAgaWYgKHRoaXMuc3RhdGUuZ3JvdXBlZENvbHVtbnMgJiYgdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5ncm91cGVkQ29sdW1ucykge1xuICAgICAgY29uc3QgZGlmZmVyZW5jZSA9IHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uZ3JvdXBlZENvbHVtbnNcbiAgICAgICAgLmZpbHRlcih4ID0+ICF0aGlzLm9yaWdpbmFsR3JvdXBlZENvbHVtbnNBcnJheS5pbmNsdWRlcyh4KSk7XG5cbiAgICAgIGlmIChkaWZmZXJlbmNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5vcmlnaW5hbEdyb3VwZWRDb2x1bW5zQXJyYXk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0R3JvdXBDb2x1bW5zKHJlc3VsdCk7XG4gIH1cbiAgcGFyc2VHcm91cGVkQ29sdW1uVHlwZXMoKSB7XG4gICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMgPSB0aGlzLnN0YXRlLmdyb3VwZWRDb2x1bW5UeXBlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHcm91cHMgYnkgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5cbiAgICovXG4gIGdyb3VwQnlDb2x1bW4oY29sdW1uOiBPQ29sdW1uLCB0eXBlPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jaGVja0dyb3VwQnlDb2x1bW4oY29sdW1uLmF0dHIsIHRydWUpO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUdyb3VwZWRDb2x1bW5UeXBlcyhjb2x1bW4uYXR0ciwgdHJ1ZSwgdHlwZSk7XG4gICAgfVxuICAgIHRoaXMuZGF0YVNvdXJjZS51cGRhdGVHcm91cGVkQ29sdW1ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZ3JvdXAgYnkgY29sdW1uXG4gICAqIEBwYXJhbSBjb2x1bW5cbiAgICovXG4gIHVuR3JvdXBCeUNvbHVtbihjb2x1bW46IE9Db2x1bW4pIHtcbiAgICB0aGlzLmNoZWNrR3JvdXBCeUNvbHVtbihjb2x1bW4uYXR0ciwgZmFsc2UpO1xuICAgIHRoaXMudXBkYXRlR3JvdXBlZENvbHVtblR5cGVzKGNvbHVtbi5hdHRyLCBmYWxzZSk7XG4gICAgdGhpcy5kYXRhU291cmNlLnVwZGF0ZUdyb3VwZWRDb2x1bW5zKCk7XG4gIH1cblxuICAvKipcbiAgICogVW5ncm91cCBieSBhbGwgY29sdW1uc1xuICAgKi9cbiAgdW5Hcm91cEJ5QWxsQ29sdW1ucygpIHtcbiAgICB0aGlzLnNldEdyb3VwQ29sdW1ucyhbXSk7XG4gICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMgPSBbXTtcbiAgfVxuXG4gIHNldEdyb3VwQ29sdW1ucyh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLmdyb3VwZWRDb2x1bW5zQXJyYXkgPSB2YWx1ZTtcbiAgICB0aGlzLmRhdGFTb3VyY2UudXBkYXRlR3JvdXBlZENvbHVtbnMoKTtcbiAgfVxuICBzZXRHcm91cGVkQ29sdW1uVHlwZXModmFsdWU6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSkge1xuICAgIHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzID0gdmFsdWU7XG4gIH1cbiAgY2hlY2tHcm91cEJ5Q29sdW1uKGZpZWxkOiBzdHJpbmcsIGFkZDogYm9vbGVhbikge1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5ncm91cGVkQ29sdW1uc0FycmF5KSB7XG4gICAgICBpZiAoY29sdW1uID09PSBmaWVsZCkge1xuICAgICAgICBmb3VuZCA9IHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5pbmRleE9mKGNvbHVtbiwgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb3VuZCAhPSBudWxsICYmIGZvdW5kID49IDApIHtcbiAgICAgIGlmICghYWRkKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBlZENvbHVtbnNBcnJheS5wdXNoKGZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0ZW0gaXMgZ3JvdXBcbiAgICogQHBhcmFtIGluZGV4XG4gICAqIEBwYXJhbSBpdGVtXG4gICAqIEByZXR1cm5zIHRydWUgaWYgZ3JvdXBcbiAgICovXG4gIGlzR3JvdXAoaW5kZXgsIGl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbSBpbnN0YW5jZW9mIE9UYWJsZUdyb3VwZWRSb3c7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0ZW0gaXMgbm90IGdyb3VwXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKiBAcGFyYW0gaXRlbVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIG5vdCBncm91cFxuICAgKi9cbiAgaXNOb3RHcm91cChpbmRleCwgaXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKGl0ZW0gaW5zdGFuY2VvZiBPVGFibGVHcm91cGVkUm93KTtcbiAgfVxuXG4gIGdldExhc3RHcm91cHMoKSB7XG4gICAgLy8gR2V0IGxhc3QgZ3JvdXBzXG4gICAgY29uc3Qgc2NvcmVzID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YTtcbiAgICBjb25zdCBtYXhMZXZlbCA9IHNjb3Jlcy5yZWR1Y2UoKGFjYywgY3VycikgPT4gY3Vyci5sZXZlbCA+IGFjYyA/IGN1cnIubGV2ZWwgOiBhY2MsIDApO1xuICAgIGNvbnN0IG1heExldmVsUmVuZGVyZWREYXRhID0gc2NvcmVzLnJlZHVjZSgociwgbykgPT4gby5sZXZlbCA9PT0gbWF4TGV2ZWwgPyBbLi4uciwgb10gOiByLCBbXSk7XG4gICAgcmV0dXJuIG1heExldmVsUmVuZGVyZWREYXRhLmxlbmd0aDtcbiAgfVxuXG4gIGdyb3VwSGVhZGVyQ2xpY2socm93OiBPVGFibGVHcm91cGVkUm93KSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnRvZ2dsZUdyb3VwQnlDb2x1bW4ocm93KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbnN0YW5jZU9mT1RhYmxlQ2VsbFJlbmRlcmVyU2VydmljZUNvbXBvbmVudChyZW5kZXJlcjogT0Jhc2VUYWJsZUNlbGxSZW5kZXJlcikge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZChyZW5kZXJlcikgJiYgKHJlbmRlcmVyIGFzIGFueSkub25EYXRhTG9hZGVkICYmIChyZW5kZXJlciBhcyBhbnkpLnF1ZXJ5QWxsRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbHVtbiBkYXRhIGJ5IGF0dHJcbiAgICogQHBhcmFtIGF0dHJcbiAgICogQHBhcmFtIHJvd1xuICAgKiBAcmV0dXJucyBjb2x1bW4gZGF0YSBieSBhdHRyXG4gICAqL1xuICBnZXRDb2x1bW5EYXRhQnlBdHRyKGF0dHIsIHJvdzogYW55KTogYW55IHtcbiAgICBsZXQgb3BlcmF0aW9uID0gbnVsbDtcbiAgICBpZiAodGhpcy5ncm91cGVkQ29sdW1uVHlwZXMubGVuZ3RoICE9IDAgJiYgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4uYXR0ciA9PSBhdHRyKSAhPSAtMSkge1xuICAgICAgb3BlcmF0aW9uID0gdGhpcy5ncm91cGVkQ29sdW1uVHlwZXNbdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMuZmluZEluZGV4KGNvbHVtbiA9PiBjb2x1bW4uYXR0ciA9PSBhdHRyKV0udHlwZTtcbiAgICB9XG4gICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihhdHRyKTtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKG9Db2wpKSB7XG4gICAgICByZXR1cm4gcm93W2F0dHJdO1xuICAgIH1cbiAgICBjb25zdCB1c2VSZW5kZXJlciA9IG9Db2wucmVuZGVyZXIgJiYgb0NvbC5yZW5kZXJlci5nZXRDZWxsRGF0YTtcbiAgICBpZiAob3BlcmF0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1c2VSZW5kZXJlciA/IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdykgOiByb3dbb0NvbC5hdHRyXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KHJvd1tvQ29sLmF0dHJdKTtcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldEN1cnJlbnRMYW5nKCk7XG4gICAgICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgICAgICBjYXNlIFwiWUVBUlwiOiByZXR1cm4gZGF0ZS55ZWFyKCk7XG4gICAgICAgIGNhc2UgXCJNT05USFwiOiByZXR1cm4gbW9tZW50KCkubG9jYWxlKGxhbmd1YWdlKS5tb250aChkYXRlLm1vbnRoKCkpLmZvcm1hdChcIk1NTU1cIik7XG4gICAgICAgIGNhc2UgXCJZRUFSX01PTlRIXCI6IHJldHVybiBtb21lbnQoKS5sb2NhbGUobGFuZ3VhZ2UpLm1vbnRoKGRhdGUubW9udGgoKSkueWVhcihkYXRlLnllYXIoKSkuZm9ybWF0KFwiTU1NTSwgWVlZWVwiKTtcbiAgICAgICAgY2FzZSBcIllFQVJfTU9OVEhfREFZXCI6IHJldHVybiB1c2VSZW5kZXJlciA/IG9Db2wucmVuZGVyZXIuZ2V0Q2VsbERhdGEocm93W29Db2wuYXR0cl0sIHJvdykgOiByb3dbb0NvbC5hdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdXBkYXRlR3JvdXBlZENvbHVtblR5cGVzKGF0dHI6IHN0cmluZywgYWRkOiBib29sZWFuLCBvcGVyYXRpb24/OiBzdHJpbmcpIHtcbiAgICBsZXQgZ3JvdXBlZENvbHVtbnM6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSA9IFtdO1xuICAgIGxldCBpbmRleCA9IHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmF0dHIgPT0gYXR0cik7XG4gICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICBpZiAoIWFkZCkge1xuICAgICAgICB0aGlzLmdyb3VwZWRDb2x1bW5UeXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMucHVzaCh7IFwiYXR0clwiOiBhdHRyLCBcInR5cGVcIjogb3BlcmF0aW9uIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXRlLmdyb3VwZWRDb2x1bW5UeXBlcyA9IGdyb3VwZWRDb2x1bW5zO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lR3JvdXBIZWFkZXIocm93OiBPVGFibGVHcm91cGVkUm93KTogc3RyaW5nIHtcbiAgICBsZXQgY2xhc3NOYW1lID0gJyc7XG4gICAgaWYgKHJvdy5sZXZlbCA8PSAxMCkge1xuICAgICAgY2xhc3NOYW1lID0gJ28tdGFibGUtZ3JvdXAtcm93IG8tdGFibGUtZ3JvdXAtcm93LWxldmVsLScgKyByb3cubGV2ZWw7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBwcml2YXRlIHN0b3BFZGl0aW9uKGNsZWFyU2VsZWN0aW9uPzogYm9vbGVhbikge1xuICAgIGNsZWFyU2VsZWN0aW9uID0gY2xlYXJTZWxlY3Rpb24gPyBjbGVhclNlbGVjdGlvbiA6IGZhbHNlO1xuICAgIHRoaXMuZWRpdGluZ0NlbGwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lZGl0aW5nUm93ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25BbmRFZGl0aW5nKGNsZWFyU2VsZWN0aW9uKTtcbiAgfVxuXG4gIHN0b3JlRmlsdGVySW5TdGF0ZShhcmc6IE9GaWx0ZXJEZWZpbml0aW9uKSB7XG4gICAgdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2Uuc3RvcmVGaWx0ZXIoYXJnKTtcbiAgfVxuXG4gIHJlaW5pdGlhbGl6YXRlUXVpY2tGaWx0ZXJDb2x1bW5zKCkge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1uc1xuICAgICAgLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnNlYXJjaGFibGUgJiYgY29sdW1uLnZpc2libGUpXG4gICAgICAuZm9yRWFjaChjb2x1bW4gPT4gY29sdW1uLnNlYXJjaGluZyA9IHRydWUpXG4gIH1cblxuICByZWluaXRpYWxpemVTb3J0Q29sdW1ucyhzb3J0Q29sdW1ucz86IFNRTE9yZGVyW10pIHtcbiAgICB0aGlzLnRhYmxlSGVhZGVycyA9IFtdO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChzb3J0Q29sdW1ucykpIHtcbiAgICAgIHRoaXMuc29ydENvbEFycmF5ID0gc29ydENvbHVtbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyc2VTb3J0Q29sdW1ucygpO1xuICAgIH1cbiAgICB0aGlzLnNvcnQuc2V0U29ydENvbHVtbnModGhpcy5zb3J0Q29sQXJyYXkpO1xuICAgIHRoaXMucmVmcmVzaFNvcnRIZWFkZXJzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaFNvcnRIZWFkZXJzKCkge1xuICAgIHRoaXMudGFibGVIZWFkZXJzLmZpbHRlcihoZWFkZXIgPT4gVXRpbC5pc0RlZmluZWQoaGVhZGVyLm1hdFNvcnRIZWFkZXIpKS5mb3JFYWNoKGhlYWRlciA9PiBoZWFkZXIubWF0U29ydEhlYWRlci5yZWZyZXNoKCkpO1xuICB9XG5cbiAgZ2V0UXVpY2tGaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50KSA/XG4gICAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50LnZhbHVlIDpcbiAgICAgICcnO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5Q2VsbFJlbmRlcmVycygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHF1aWNrRmlsdGVyVmFsdWUgPSB0aGlzLmdldFF1aWNrRmlsdGVyVmFsdWUoKTtcblxuICAgIGlmICgoVXRpbC5pc0RlZmluZWQocXVpY2tGaWx0ZXJWYWx1ZSkgJiYgcXVpY2tGaWx0ZXJWYWx1ZS5sZW5ndGggPiAwKSB8fCB0aGlzLnNvcnRDb2xBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gdGhpcy5vVGFibGVPcHRpb25zLmNvbHVtbnNcbiAgICAgICAgLmZpbHRlcihvQ29sID0+IG9Db2wuc2VhcmNoaW5nICYmIHRoaXMuaXNJbnN0YW5jZU9mT1RhYmxlQ2VsbFJlbmRlcmVyU2VydmljZUNvbXBvbmVudChvQ29sLnJlbmRlcmVyKSlcbiAgICAgICAgLm1hcChvQ29sID0+IChvQ29sLnJlbmRlcmVyIGFzIGFueSkucXVlcnlBbGxEYXRhKCkpO1xuXG4gICAgICByZXR1cm4gcXVlcmllcy5sZW5ndGggPiAwID8gY29tYmluZUxhdGVzdChxdWVyaWVzKSA6IG9mKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gb2YobnVsbCk7XG4gIH1cblxuICB0YWJsZVF1aWNrRmlsdGVyQ2hhbmdlZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIHRoaXMucXVlcnlDZWxsUmVuZGVyZXJzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWxvYWRQYWdpbmF0ZWREYXRhRnJvbVN0YXJ0KGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5xdWlja0ZpbHRlciA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG9uTWF0U29ydENoYW5nZVxuICBwdWJsaWMgZmlsdGVyRGF0YSh2YWx1ZT86IHN0cmluZywgbG9hZE1vcmU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgLy9cbiAgfVxuXG4gIHNldE9UYWJsZUNvbHVtbnNHcm91cGluZyh2YWx1ZTogT1RhYmxlQ29sdW1uc0dyb3VwaW5nKSB7XG4gICAgdGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldENvbHVtbkdyb3VwaW5nQ29tcG9uZW50KGNvbHVtbkF0dHI6IHN0cmluZyk6IE9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbHVtbkNvbXBvbmVudCB7XG4gICAgbGV0IHJlc3VsdDogT1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29sdW1uQ29tcG9uZW50O1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLm9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudCkpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50LmdldENvbHVtbkdyb3VwaW5nKGNvbHVtbkF0dHIpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdXNlQ29sdW1uR3JvdXBpbmdBZ2dyZWdhdGUoY29sdW1uQXR0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb0NvbCA9IHRoaXMuZ2V0T0NvbHVtbihjb2x1bW5BdHRyKTtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKG9Db2wpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHNxbFR5cGUgPSB0aGlzLmdldFNxbFR5cGVzKClbY29sdW1uQXR0cl07XG4gICAgY29uc3QgaGFzRGVmYXVsdEFnZ3JlZ2F0ZSA9IFNRTFR5cGVzLmlzTnVtZXJpY1NRTFR5cGUoc3FsVHlwZSlcbiAgICAgICYmICghVXRpbC5pc0RlZmluZWQob0NvbC5yZW5kZXJlcikgfHwgT1RhYmxlQ29tcG9uZW50LkFWQUlMQUJMRV9HUk9VUElOR19DT0xVTU5TX1JFTkRFUkVSUy5pbmNsdWRlcyhvQ29sLnR5cGUpKTtcblxuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gaGFzRGVmYXVsdEFnZ3JlZ2F0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29tcG9uZW50LnVzZUNvbHVtbkFnZ3JlZ2F0ZShjb2x1bW5BdHRyLCBoYXNEZWZhdWx0QWdncmVnYXRlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja1ZpZXdwb3J0U2l6ZSgpIHtcbiAgICAvLyBJdHMgYSB0ZW1wb3JhcmlseSBmaXhlZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTAxMTdcbiAgICAvLyBTb2x2ZSB0aGUgaXNzdWUgd2hlbiBzd2l0Y2hpbmcgdGFicyB3aGVuIHRoZSB2aXJ0dWFsIHNjcm9sbGluZyBjb21wb25lbnQgaXMgdXNlZFxuICAgIC8vIGluIGEgbWF0IC0gdGFiIGNvbXBvbmVudCBhbmQgdmlydHVhbCBzY3JvbGwgd29yayBhYm5vcm1hbGx5XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNob3cgZXhwYW5kYWJsZSBpY29uIG9yIG5vdCBpZiBoYXMgZGF0YSBvciBub3RcbiAgc2hvd0V4cGFuZGFibGVJY29uKHJvdzogYW55LCByb3dJbmRleDogbnVtYmVyKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChVdGlsLmlzRGVmaW5lZCh0aGlzLnNob3dFeHBhbmRhYmxlSWNvbkZ1bmN0aW9uKSAmJiB0aGlzLnNob3dFeHBhbmRhYmxlSWNvbkZ1bmN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pID8gVXRpbC53cmFwSW50b09ic2VydmFibGUodGhpcy5zaG93RXhwYW5kYWJsZUljb25GdW5jdGlvbihyb3csIHJvd0luZGV4KSkgOiBvZih0cnVlKTtcbiAgfVxuXG4gIGdldENvbHVtbnNOb3RJbmNsdWRlZCgpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGNvbHNOb3RJbmNsdWRlZCA9IFtdO1xuICAgIGNvbHNOb3RJbmNsdWRlZCA9IHRoaXMub1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IHZvaWQgMCAhPT0gYy5yZW5kZXJlciAmJiAoYy50eXBlID09PSAnaW1hZ2UnIHx8IGMudHlwZSA9PT0gJ2FjdGlvbicpKS5tYXAoYyA9PiBjLmF0dHIpO1xuICAgIGNvbHNOb3RJbmNsdWRlZC5wdXNoKENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCk7XG4gICAgY29sc05vdEluY2x1ZGVkLnB1c2goQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSk7XG4gICAgcmV0dXJuIGNvbHNOb3RJbmNsdWRlZDtcbiAgfVxuXG4gIGdldENvbHVtbk5hbWVzKGNvbHVtbnM6IHN0cmluZ1tdKTogeyBbY29sdW1uSWQ6IHN0cmluZ106IHN0cmluZzsgfSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW5OYW1lcyA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaChjID0+IHtcbiAgICAgIGNvbnN0IG9Db2x1bW4gPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmluZChvYyA9PiBvYy5hdHRyID09PSBjKTtcbiAgICAgIHRhYmxlQ29sdW1uTmFtZXNbY10gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KG9Db2x1bW4udGl0bGUgPyBvQ29sdW1uLnRpdGxlIDogb0NvbHVtbi5hdHRyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFibGVDb2x1bW5OYW1lcztcbiAgfVxuXG4gIHJlc2V0Q29sdW1uc1dpZHRoKCkge1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbikpIHtcbiAgICAgICAgYy53aWR0aCA9IFV0aWwuaXNEZWZpbmVkKGMuZGVmaW5pdGlvbi53aWR0aCkgPyBjLmRlZmluaXRpb24ud2lkdGggOiBjLmRlZmluaXRpb24ub3JpZ2luYWxXaWR0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYy53aWR0aCA9IFwiYXV0b1wiO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uc0RPTVdpZHRoKCk7XG4gIH1cblxuICB1cGRhdGVDb2x1bW5zRE9NV2lkdGgoKSB7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XG4gICAgICBjLkRPTVdpZHRoID0gdGhpcy5nZXRUaFdpZHRoRnJvbU9Db2x1bW4oYyk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVDaGVja2JveChpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICBsZXQgZGlzYWJsZSA9IGZhbHNlO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmRpc2FibGVTZWxlY3Rpb25GdW5jdGlvbikpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVTZWxlY3Rpb25GdW5jdGlvbih7IC4uLml0ZW0gfSk7XG4gICAgfVxuICAgIHJldHVybiBkaXNhYmxlO1xuXG4gIH1cblxuICBnZXRTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlO1xuICB9XG5cbiAgZ2V0U25hY2tTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLnNuYWNrQmFyU2VydmljZTtcbiAgfVxuXG5cbiAgZ2V0RmlsdGVyQ29sdW1uQnlBdHRyKGF0dHI6IHN0cmluZyk6IE9GaWx0ZXJDb2x1bW4ge1xuICAgIC8vIElmIHRoZSBjb2x1bW5zIGZpbHRlciBjb21wb25lbnQgZXhpc3RzLCB1c2UgaXRzIGNvbHVtbiBkZWZpbml0aW9uc1xuICAgIGlmICh0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQ/LmNvbHVtbnNBcnJheT8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50Py5jb2x1bW5zQXJyYXkuZmluZChmaWx0ZXJDb2x1bW4gPT4gZmlsdGVyQ29sdW1uLmF0dHIgPT09IGF0dHIpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIGNvbHVtbnMgZmlsdGVyIGNvbXBvbmVudCwgZmFsbCBiYWNrIHRvIHRoZSB0YWJsZeKAmXMgdmlzaWJsZSBjb2x1bW5zXG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbiA9IHRoaXMub1RhYmxlT3B0aW9ucy5jb2x1bW5zPy5maW5kKGNvbCA9PiBjb2wuYXR0ciA9PT0gYXR0ciAmJiBjb2wudmlzaWJsZSk7XG4gICAgaWYgKHZpc2libGVDb2x1bW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGF0dHI6IHZpc2libGVDb2x1bW4uYXR0cixcbiAgICAgICAgdGl0bGU6IHZpc2libGVDb2x1bW4udGl0bGUsXG4gICAgICAgIGZpbHRlclZhbHVlc0luRGF0YTogJ2N1cnJlbnQtcGFnZScsXG4gICAgICAgIHNvcnQ6ICcnLFxuICAgICAgICBzdGFydFZpZXc6ICcnXG5cbiAgICAgIH0gYXMgT0ZpbHRlckNvbHVtbjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZUNvbHVtblRpdGxlcyhjb2x1bW5zOiB7IGF0dHI6IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9W10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWF0VGFibGUgfHwgIXRoaXMub1RhYmxlT3B0aW9ucz8uY29sdW1ucykgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlcyB0aGUgdGl0bGVzIG9mIGV4aXN0aW5nIGNvbHVtbnNcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLm9UYWJsZU9wdGlvbnMuY29sdW1ucykge1xuICAgICAgY29uc3QgdXBkYXRlZCA9IGNvbHVtbnMuZmluZChjID0+IGMuYXR0ciA9PT0gY29sLmF0dHIpO1xuICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgY29sLnRpdGxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh1cGRhdGVkLnRpdGxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5tYXRUYWJsZT8ucmVtb3ZlSGVhZGVyUm93RGVmKG51bGwpO1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJvLXRhYmxlLWNvbnRhaW5lclwiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IHN0cmV0Y2hcIiBbc3R5bGUuZGlzcGxheV09XCJpc1Zpc2libGUoKT8gJycgOiAnbm9uZSdcIlxuICBbY2xhc3MuYmxvY2stZXZlbnRzXT1cImxvYWRpbmdTZXJ2aWNlLmlzUHJvY2Vzc2luZyQgfCBhc3luY1wiPlxuICA8by1kYXRhLXRvb2xiYXIgI3RhYmxlVG9vbGJhciAqbmdJZj1cImhhc0NvbnRyb2xzKClcIiBbdGl0bGVdPVwidGl0bGVcIiBbc2hvdy10aXRsZV09XCJzaG93VGl0bGVcIiBjbGFzcz1cIm8tdGFibGUtdG9vbGJhclwiPlxuICAgIDxuZy1jb250YWluZXIgby1kYXRhLXRvb2xiYXItcHJvamVjdGlvbi1zdGFydD5cbiAgICAgIDxvLXRhYmxlLWJ1dHRvbnMgI3RhYmxlQnV0dG9ucyBbaW5zZXJ0LWJ1dHRvbl09XCJpbnNlcnRCdXR0b25cIiBbcmVmcmVzaC1idXR0b25dPVwicmVmcmVzaEJ1dHRvblwiIFtkZWxldGUtYnV0dG9uXT1cInNob3dEZWxldGVCdXR0b25cIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiby10YWJsZS1idXR0b25cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L28tdGFibGUtYnV0dG9ucz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbby10YWJsZS10b29sYmFyXVtwb3NpdGlvbj1zdGFydF1cIiBuZ1Byb2plY3RBcz1cIltvLWRhdGEtdG9vbGJhci1jdXN0b20tcHJvamVjdGlvbi1zdGFydF1cIj5cbiAgICA8L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW28tdGFibGUtdG9vbGJhcl1bcG9zaXRpb249ZW5kXVwiIG5nUHJvamVjdEFzPVwiW28tZGF0YS10b29sYmFyLWN1c3RvbS1wcm9qZWN0aW9uLWVuZF1cIj5cbiAgICA8L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW28tdGFibGUtdG9vbGJhcl1cIiBuZ1Byb2plY3RBcz1cIltvLWRhdGEtdG9vbGJhci1jdXN0b20tcHJvamVjdGlvbi1zdGFydF1cIj5cbiAgICA8L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRhaW5lciBvLWRhdGEtdG9vbGJhci1wcm9qZWN0aW9uLWVuZD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWlja2ZpbHRlckNvbnRlbnRDaGlsZDsgZWxzZSBkZWZhdWx0UXVpY2tGaWx0ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiby10YWJsZS1xdWlja2ZpbHRlclwiPjwvbmctY29udGVudD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0UXVpY2tGaWx0ZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWlja0ZpbHRlclwiPlxuICAgICAgICAgIDxvLXRhYmxlLXF1aWNrZmlsdGVyIChvbkNoYW5nZSk9XCJ0YWJsZVF1aWNrRmlsdGVyQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9vLXRhYmxlLXF1aWNrZmlsdGVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cInNob3dUYWJsZU1lbnVCdXR0b25cIiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJvLXRhYmxlLW1lbnUtYnV0dG9uXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInRhYmxlTWVudS5tYXRNZW51XCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOm1vcmVfdmVydFwiPjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxvLXRhYmxlLW1lbnUgI3RhYmxlTWVudSBbc2VsZWN0LWFsbC1jaGVja2JveF09XCJzZWxlY3RBbGxDaGVja2JveFwiIFtleHBvcnQtYnV0dG9uXT1cImV4cG9ydEJ1dHRvblwiXG4gICAgICAgIFtjb2x1bW5zLXZpc2liaWxpdHktYnV0dG9uXT1cImNvbHVtbnNWaXNpYmlsaXR5QnV0dG9uXCIgW3Nob3ctY29uZmlndXJhdGlvbi1vcHRpb25dPVwic2hvd0NvbmZpZ3VyYXRpb25PcHRpb25cIlxuICAgICAgICBbc2hvdy1maWx0ZXItb3B0aW9uXT1cInNob3dGaWx0ZXJPcHRpb25cIiBbc2hvdy1yZXBvcnQtb24tZGVtYW5kLW9wdGlvbl09XCJzaG93UmVwb3J0T25EZW1hbmRPcHRpb25cIlxuICAgICAgICBbc2hvdy1jaGFydHMtb24tZGVtYW5kLW9wdGlvbl09XCJzaG93Q2hhcnRzT25EZW1hbmRPcHRpb25cIiBbc2hvdy1yZXNldC13aWR0aC1vcHRpb25dPVwic2hvd1Jlc2V0V2lkdGhPcHRpb25cIiBbc2hvdy1ncm91cC1ieS1vcHRpb25dPVwiZ3JvdXBhYmxlXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm8tdGFibGUtb3B0aW9uXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9vLXRhYmxlLW1lbnU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvby1kYXRhLXRvb2xiYXI+XG5cbiAgPGRpdiAjdGFibGVCb2R5IGNsYXNzPVwiby10YWJsZS1ib2R5IG8tc2Nyb2xsXCIgW2NsYXNzLmhvcml6b250YWwtc2Nyb2xsXT1cImhvcml6b250YWxTY3JvbGxcIiBbY2xhc3Muc2Nyb2xsZWRdPVwiaG9yaXpvbnRhbFNjcm9sbGVkXCJcbiAgICBbbmdTdHlsZV09XCJ7J3Zpc2liaWxpdHknOiBzcGlubmVyQ29udGFpbmVyID8gJ2hpZGRlbicgOiAndmlzaWJsZSd9XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlbmFibGVkVmlydHVhbFNjcm9sbDsgZWxzZSB0YWJsZVdpdGhWaXJ0dWFsU2Nyb2xsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiby10YWJsZS1vdmVyZmxvdyBvLXNjcm9sbFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3RhYmxlV2l0aFZpcnR1YWxTY3JvbGw+XG4gICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICN2aXJ0dWFsU2Nyb2xsVmlld1BvcnQgZnhGbGV4PlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbiAgPCEtLVRBQkxFIFBBR0lOQVRPUi0tPlxuICA8bWF0LXBhZ2luYXRvciAqbmdJZj1cInBhZ2luYXRvclwiICNtYXRwYWdpbmF0b3IgW2xlbmd0aF09XCJkYXRhU291cmNlPy5yZXN1bHRzTGVuZ3RoXCIgW3BhZ2VJbmRleF09XCJwYWdpbmF0b3IucGFnZUluZGV4XCIgW3BhZ2VTaXplXT1cInF1ZXJ5Um93c1wiXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdpbmF0b3IucGFnZVNpemVPcHRpb25zXCIgKHBhZ2UpPVwib25DaGFuZ2VQYWdlKCRldmVudClcIiBbc2hvd0ZpcnN0TGFzdEJ1dHRvbnNdPVwicGFnaW5hdG9yLnNob3dGaXJzdExhc3RCdXR0b25zXCJcbiAgICBbbmdTdHlsZV09XCJ7J3Zpc2liaWxpdHknOiBzcGlubmVyQ29udGFpbmVyID8gJ2hpZGRlbicgOiAndmlzaWJsZSd9XCI+XG4gIDwvbWF0LXBhZ2luYXRvcj5cblxuICA8IS0tTE9BRElORy0tPlxuICA8ZGl2ICNzcGlubmVyQ29udGFpbmVyICpuZ0lmPVwic2hvd0xvYWRpbmcgfCBhc3luY1wiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiBbbmdTdHlsZV09XCJ7J3RvcC5weCc6IHRvb2xCYXJIZWlnaHR9XCJcbiAgICBjbGFzcz1cInNwaW5uZXItY29udGFpbmVyXCIgW2NsYXNzLnNwaW5uZXItY29udGFpbmVyLXNjcm9sbGFibGVdPVwibG9hZGluZ1Njcm9sbCB8IGFzeW5jXCI+XG4gICAgPG8tdGFibGUtc2tlbGV0b24+PC9vLXRhYmxlLXNrZWxldG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIERpc2FibGUgYmxvY2tlciAtLT5cbiAgPGRpdiAqbmdJZj1cIiFlbmFibGVkXCIgY2xhc3M9XCJvLXRhYmxlLWRpc2FibGVkLWJsb2NrZXJcIj48L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RhYmxlPlxuICA8dGFibGUgbWF0LXRhYmxlICN0YWJsZSBbY2xhc3MuYXV0b2FkanVzdGVkXT1cImF1dG9BZGp1c3RcIiBbdHJhY2tCeV09XCJnZXRUcmFja0J5RnVuY3Rpb24oKVwiIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBvTWF0U29ydFxuICAgIFtvTWF0U29ydENvbHVtbnNdPVwic29ydENvbEFycmF5XCIgW25nQ2xhc3NdPVwicm93SGVpZ2h0T2JzZXJ2YWJsZSB8IGFzeW5jXCIgKGNka09ic2VydmVDb250ZW50KT1cInByb2plY3RDb250ZW50Q2hhbmdlZCgpXCJcbiAgICBvVGFibGVFeHBhbmRlZEZvb3RlciBbb1RhYmxlRXhwYW5kZWRGb290ZXJDb2xzcGFuXT1cInZpc2libGVDb2xBcnJheS5sZW5ndGhcIlxuICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwic2hvd0V4cGFuZGFibGVSb3coKVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJvbnRpbWl6ZS13ZWIgdGFibGVcIj5cblxuICAgIDwhLS1DaGVja2JveCBDb2x1bW4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm5hbWVcIiAqbmdJZj1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGVDb2x1bW5TZWxlY3RBbGxDb250ZW50Q2hpbGQ7IGVsc2UgY3VzdG9tSGVhZGVyU2VsZWN0QWxsVGVtcGxhdGVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiICpuZ0lmPVwiaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKVwiPlxuICAgICAgICAgICAgPG8tdGFibGUtaGVhZGVyLXNlbGVjdC1hbGwgW2NvbHVtbl09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtblwiPjwvby10YWJsZS1oZWFkZXItc2VsZWN0LWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggbmFtZT1cImlkW11cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZUNoZWNrYm94KHJvdylcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3Rpb25DaGVja2JveFRvZ2dsZSgkZXZlbnQsIHJvdylcIiBbY2hlY2tlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNjdXN0b21IZWFkZXJTZWxlY3RBbGxUZW1wbGF0ZT5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MucmVzaXphYmxlXT1cInJlc2l6YWJsZVwiIGNsYXNzPVwibWF0LWhlYWRlci1zZWxlY3QtYWxsLXdpdGgtdGl0bGUgby1jZW50ZXJcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi53aWR0aFwiIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4ob1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4pXCJcbiAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm1heFdpZHRoXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxvLXRhYmxlLWhlYWRlci1zZWxlY3QtYWxsIFtjb2x1bW5dPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW5cIj48L28tdGFibGUtaGVhZGVyLXNlbGVjdC1hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cIm8tY2VudGVyXCIgW3N0eWxlLndpZHRoXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKG9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubWF4V2lkdGhcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IG5hbWU9XCJpZFtdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVDaGVja2JveChyb3cpXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0aW9uQ2hlY2tib3hUb2dnbGUoJGV2ZW50LCByb3cpXCIgW2NoZWNrZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCI+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG5cbiAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+PC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS1FeHBhbmRhYmxlIENvbHVtbiAtLT5cbiAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwib1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uLm5hbWVcIiAqbmdJZj1cImlzQ29sdW1uRXhwYW5kYWJsZSgpXCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICB7eyBvVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4udGl0bGUgfX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O2xldCByb3dJbmRleCA9IGRhdGFJbmRleFwiPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzaG93RXhwYW5kYWJsZUljb24ocm93LCByb3dJbmRleCkgfCBhc3luY1wiIChjbGljayk9XCJ0b2dnbGVSb3dFeHBhbmRhYmxlKHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgKGtleWRvd24pPVwidG9nZ2xlUm93RXhwYW5kYWJsZShyb3csICRldmVudClcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFeHBhbmRlZChyb3cpXCI+e3sgdGFibGVSb3dFeHBhbmRhYmxlLmljb25Db2xsYXBzZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFeHBhbmRlZChyb3cpXCI+e3sgdGFibGVSb3dFeHBhbmRhYmxlLmljb25FeHBhbmQgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEdlbmVyaWMgY29sdW1uIGRlZmluaXRpb24gLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIG9UYWJsZU9wdGlvbnMuY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWVcIj5cbiAgICAgIDwhLS1EZWZpbmUgaGVhZGVyLWNlbGwtLT5cblxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbbmdDbGFzc109XCJnZXRUaXRsZUFsaWduQ2xhc3MoY29sdW1uKVwiIFtjbGFzcy5yZXNpemFibGVdPVwicmVzaXphYmxlXCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4oY29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwiY29sdW1uLm1heFdpZHRoXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICA8by10YWJsZS1oZWFkZXIgW2NvbHVtbl09XCJjb2x1bW5cIj48L28tdGFibGUtaGVhZGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGg+XG5cblxuICAgICAgPCEtLURlZmluZSBtYXQtY2VsbC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWJsZS5tdWx0aVRlbXBsYXRlRGF0YVJvd3M7IGVsc2UgY2VsbFRlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzXCI+XG4gICAgICAgIDx0ZCAjY2VsbCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7bGV0IHJvd0luZGV4ID0gaW5kZXggXCIgW25nQ2xhc3NdPVwiW2NvbHVtbi5jbGFzc05hbWUsIGdldENlbGxBbGlnbkNsYXNzKGNvbHVtbildXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2socm93LCBjb2x1bW4sIHJvd0luZGV4LCBjZWxsLCAkZXZlbnQpXCIgKGRibGNsaWNrKT1cImhhbmRsZURvdWJsZUNsaWNrKHJvdywgY29sdW1uLCByb3dJbmRleCwgY2VsbCwgJGV2ZW50KVwiXG4gICAgICAgICAgW2NsYXNzLmVtcHR5LWNlbGxdPVwiaXNFbXB0eShyb3dbY29sdW1uLm5hbWVdKVwiIFttYXRUb29sdGlwRGlzYWJsZWRdPVwiIWNvbHVtbi5oYXNUb29sdGlwKClcIiBbbWF0VG9vbHRpcF09XCJjb2x1bW4uZ2V0VG9vbHRpcChyb3cpXCJcbiAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI3NTBcIiBtYXRUb29sdGlwQ2xhc3M9XCJvLXRhYmxlLWNlbGwtdG9vbHRpcFwiXG4gICAgICAgICAgW2NsYXNzLm8tbWF0LWNlbGwtbXVsdGlsaW5lXT1cIihjb2x1bW4uaXNNdWx0aWxpbmUgfCBhc3luYylcIiBbb0NvbnRleHRNZW51XT1cInRhYmxlQ29udGV4dE1lbnVcIlxuICAgICAgICAgIFtvQ29udGV4dE1lbnVEYXRhXT1cInsgY2VsbE5hbWU6Y29sdW1uLm5hbWUsIHJvd1ZhbHVlOnJvdywgcm93SW5kZXg6cm93SW5kZXh9XCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJnZXRNaW5XaWR0aENvbHVtbihjb2x1bW4pXCIgW3N0eWxlLm1heC13aWR0aF09XCJjb2x1bW4ubWF4V2lkdGhcIlxuICAgICAgICAgIFtjbGFzcy5vLXRhYmxlLWVkaXRpbmctY2VsbF09XCJpc1Jvd1NlbGVjdGVkKHJvdykgJiYgY29sdW1uLmVkaXRpbmdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2VsbFJlbmRlcmVyO2NvbnRleHQ6e2NvbHVtbjpjb2x1bW4scm93OnJvd31cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNjZWxsVGVtcGxhdGVNdWx0aVRlbXBsYXRlRGF0YVJvd3M+XG4gICAgICAgIDx0ZCAjY2VsbCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7bGV0IHJvd0luZGV4ID0gZGF0YUluZGV4IFwiIFtuZ0NsYXNzXT1cIltjb2x1bW4uY2xhc3NOYW1lLCBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXVwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKHJvdywgY29sdW1uLCByb3dJbmRleCwgY2VsbCwgJGV2ZW50KVwiIChkYmxjbGljayk9XCJoYW5kbGVEb3VibGVDbGljayhyb3csIGNvbHVtbiwgcm93SW5kZXgsIGNlbGwsICRldmVudClcIlxuICAgICAgICAgIFtjbGFzcy5lbXB0eS1jZWxsXT1cImlzRW1wdHkocm93W2NvbHVtbi5uYW1lXSlcIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFjb2x1bW4uaGFzVG9vbHRpcCgpXCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLmdldFRvb2x0aXAocm93KVwiXG4gICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNzUwXCIgbWF0VG9vbHRpcENsYXNzPVwiby10YWJsZS1jZWxsLXRvb2x0aXBcIlxuICAgICAgICAgIFtjbGFzcy5vLW1hdC1jZWxsLW11bHRpbGluZV09XCIoY29sdW1uLmlzTXVsdGlsaW5lIHwgYXN5bmMpXCIgW29Db250ZXh0TWVudV09XCJ0YWJsZUNvbnRleHRNZW51XCJcbiAgICAgICAgICBbb0NvbnRleHRNZW51RGF0YV09XCJ7IGNlbGxOYW1lOmNvbHVtbi5uYW1lLCByb3dWYWx1ZTpyb3csIHJvd0luZGV4OnJvd0luZGV4fVwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4oY29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwiY29sdW1uLm1heFdpZHRoXCJcbiAgICAgICAgICBbY2xhc3Muby10YWJsZS1lZGl0aW5nLWNlbGxdPVwiaXNSb3dTZWxlY3RlZChyb3cpICYmIGNvbHVtbi5lZGl0aW5nXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxSZW5kZXJlcjtjb250ZXh0Ontjb2x1bW46Y29sdW1uLHJvdzpyb3d9XCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8IS0tRGVmaW5lIG1hdC1mb290ZXItY2VsbC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dUb3RhbHMgfCBhc3luY1wiPlxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIFtuZ0NsYXNzXT1cImNvbHVtbi5jbGFzc05hbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIiAqbmdJZj1cImNvbHVtbi5hZ2dyZWdhdGUgJiYgY29sdW1uLmFnZ3JlZ2F0ZS50aXRsZVwiPlxuICAgICAgICAgICAge3sgY29sdW1uLmFnZ3JlZ2F0ZS50aXRsZSB8IG9UcmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbi5yZW5kZXJlciB8fCBjb2x1bW4uYWdncmVnYXRlPy5vcGVyYXRvciA9PT0gJ2NvdW50JzsgZWxzZSByZW5kZXJlclRlbXBsYXRlXCI+XG4gICAgICAgICAgICB7eyBkYXRhU291cmNlLmdldEFnZ3JlZ2F0ZURhdGEoY29sdW1uKSB9fVxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVuZGVyZXJUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNvbHVtbi5yZW5kZXJlciAmJiBjb2x1bW4uYWdncmVnYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLnJlbmRlcmVyLnRlbXBsYXRlcmVmXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjZWxsdmFsdWU6IGRhdGFTb3VyY2UuZ2V0QWdncmVnYXRlRGF0YShjb2x1bW4pfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRXhwYW5kZWQgQ29udGVudCBDb2x1bW4gLSBUaGUgZGV0YWlsIHJvdyBpcyBtYWRlIHVwIG9mIHRoaXMgb25lIGNvbHVtbiB0aGF0IHNwYW5zIGFjcm9zcyBhbGwgY29sdW1ucyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRXhwYW5kZWRSb3dcIj5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZXhwYW5kZWREZXRhaWxcIj5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdztsZXQgcm93SW5kZXg9IGRhdGFJbmRleFwiIFthdHRyLmNvbHNwYW5dPVwib1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldEV4cGFuZGVkUm93Q29udGFpbmVyQ2xhc3Mocm93SW5kZXgpXCIgW0BkZXRhaWxFeHBhbmRdPVwiZ2V0U3RhdGVFeHBhbmQocm93KVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tRk9PVEVSLUlOU0VSVEFCTEUtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0xhc3RJbnNlcnRhYmxlUm93ICYmIG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5uYW1lICsgZ2V0U3VmZml4Q29sdW1uSW5zZXJ0YWJsZSgpXCIgKm5nSWY9XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXCI+XG4gICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBvVGFibGVPcHRpb25zLmNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5uYW1lKyBnZXRTdWZmaXhDb2x1bW5JbnNlcnRhYmxlKClcIj5cblxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIFtuZ0NsYXNzXT1cIltjb2x1bW4uY2xhc3NOYW1lLCBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uSW5zZXJ0YWJsZShjb2x1bW4pICYmICFvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnVzZUNlbGxFZGl0b3IoY29sdW1uKVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5zZXJ0YWJsZS1mb3JtLWZpZWxkIG8tdGFibGUtY2VsbC1lZGl0b3ItdGV4dCBvLXRhYmxlLWNlbGwtZWRpdG9yXCIgW2hpZGVSZXF1aXJlZE1hcmtlcl09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5nZXRQbGFjZWhvbGRlcihjb2x1bW4pXCIgW2lkXT1cImNvbHVtbi5hdHRyXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5nZXRDb250cm9sKGNvbHVtbilcIiBbcmVxdWlyZWRdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0NvbHVtblJlcXVpcmVkKGNvbHVtbilcIj5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqb01hdEVycm9yPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5jb2x1bW5IYXNFcnJvcihjb2x1bW4sICdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAge3sgJ0ZPUk1fVkFMSURBVElPTi5SRVFVSVJFRCcgfCBvVHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uSW5zZXJ0YWJsZShjb2x1bW4pICYmIG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQudXNlQ2VsbEVkaXRvcihjb2x1bW4pXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5jb2x1bW5FZGl0b3JzW2NvbHVtbi5hdHRyXS50ZW1wbGF0ZXJlZlwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHJvd3ZhbHVlOiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnJvd0RhdGEgfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpcnN0SW5zZXJ0YWJsZVJvdyAmJiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwiZ2V0Q29sdW1uSW5zZXJ0YWJsZShvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5uYW1lKVwiICpuZ0lmPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZVwiPlxuICAgICAgICA8dGQgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2Ygb1RhYmxlT3B0aW9ucy5jb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJnZXRDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbi5uYW1lKVwiPlxuXG4gICAgICAgIDx0ZCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW25nQ2xhc3NdPVwiW2NvbHVtbi5jbGFzc05hbWUsIGdldENlbGxBbGlnbkNsYXNzKGNvbHVtbildXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbikgJiYgIW9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQudXNlQ2VsbEVkaXRvcihjb2x1bW4pXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnNlcnRhYmxlLWZvcm0tZmllbGRcIiBbaGlkZVJlcXVpcmVkTWFya2VyXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmdldFBsYWNlaG9sZGVyKGNvbHVtbilcIiBbaWRdPVwiY29sdW1uLmF0dHJcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmdldENvbnRyb2woY29sdW1uKVwiIFtyZXF1aXJlZF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uUmVxdWlyZWQoY29sdW1uKVwiPlxuICAgICAgICAgICAgICA8bWF0LWVycm9yICpvTWF0RXJyb3I9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmNvbHVtbkhhc0Vycm9yKGNvbHVtbiwgJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICB7eyAnRk9STV9WQUxJREFUSU9OLlJFUVVJUkVEJyB8IG9UcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbikgJiYgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC51c2VDZWxsRWRpdG9yKGNvbHVtbilcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmNvbHVtbkVkaXRvcnNbY29sdW1uLmF0dHJdLnRlbXBsYXRlcmVmXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcm93dmFsdWU6IG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQucm93RGF0YSB9XCI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRGVmaW5pdGlvbiBjb2x1bW4gZ3JvdXAgaGVhZGVyIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBncm91cGluZ0hlYWRlcnNSb3dzOyBsZXQgaSA9IGluZGV4XCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW5cIj5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBncm91cFwiIGNsYXNzPVwiZ3JvdXBpbmctcm93XCIgW29Db250ZXh0TWVudV09XCJ0YWJsZUNvbnRleHRNZW51XCJcbiAgICAgICAgW29Db250ZXh0TWVudURhdGFdPVwieyBjZWxsTmFtZTpjb2x1bW4sIHJvd1ZhbHVlOmdyb3VwLCByb3dJbmRleDppfVwiIFtuZ0NsYXNzXT1cImdldEdyb3VwSGVhZGVyQ2VsbEFsaWduQ2xhc3MoY29sdW1uKVwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaT09PTBcIiBjbGFzcz1cImdyb3VwaW5nLXRpdGxlLXdyYXBwZXJcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctbGVmdCc6IDIwKihncm91cC5sZXZlbC0xKSsncHgnfVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj57eyBncm91cC5leHBhbmRlZCA/ICdleHBhbmRfbW9yZScgOiAnY2hldnJvbl9yaWdodCcgfX08L21hdC1pY29uPlxuICAgICAgICAgIHt7IGdyb3VwLnRpdGxlIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXBpbmctYWdncmVnYXRlXCIgKm5nSWY9XCJncm91cC5oYXNBY3RpdmVBZ2dyZWdhdGUodmlzaWJsZUNvbEFycmF5W2ldKVwiPlxuICAgICAgICAgIHt7IGdyb3VwLmdldENvbHVtbkFjdGl2ZUFnZ3JlZ2F0ZVRpdGxlKHZpc2libGVDb2xBcnJheVtpXSkgfCBvVHJhbnNsYXRlIH19IDpcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWdldE9Db2x1bW5Gcm9tR3JvdXBIZWFkZXJDb2x1bW4oY29sdW1uKS5yZW5kZXJlclwiPlxuICAgICAgICAgICAge3sgZ3JvdXAuZ2V0Q29sdW1uQWdncmVnYXRlVmFsdWUodmlzaWJsZUNvbEFycmF5W2ldKX19XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldE9Db2x1bW5Gcm9tR3JvdXBIZWFkZXJDb2x1bW4oY29sdW1uKS5yZW5kZXJlclwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0T0NvbHVtbkZyb21Hcm91cEhlYWRlckNvbHVtbihjb2x1bW4pLnJlbmRlcmVyPy50ZW1wbGF0ZXJlZjsgY29udGV4dDp7IGNlbGx2YWx1ZTogIGdyb3VwLmdldENvbHVtbkFnZ3JlZ2F0ZVZhbHVlKHZpc2libGVDb2xBcnJheVtpXSkgfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwb3NpdGlvblwiPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPiB7e3Jvd319IDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHIgI3RhYmxlSGVhZGVyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJvVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zOyBzdGlja3k6IGZpeGVkSGVhZGVyXCI+PC90cj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGUubXVsdGlUZW1wbGF0ZURhdGFSb3dzOyBlbHNlIHJvd1RlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzXCI+XG4gICAgICA8dHIgbWF0LXJvdyBvVGFibGVSb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IG9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnM7IHdoZW46aXNOb3RHcm91cDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxuICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCIgW25nQ2xhc3NdPVwicm93IHwgb1RhYmxlUm93Q2xhc3M6IHJvd0luZGV4OiByb3dDbGFzc1wiPlxuICAgICAgPC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3Jvd1RlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzPlxuICAgICAgPHRyIG1hdC1yb3cgb1RhYmxlUm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBvVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zOyB3aGVuOmlzTm90R3JvdXA7IGxldCByb3dJbmRleCA9IGRhdGFJbmRleFwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIiBbbmdDbGFzc109XCJyb3cgfCBvVGFibGVSb3dDbGFzczogcm93SW5kZXg6IHJvd0NsYXNzXCI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIFJvdyBHcm91cCBoZWFkZXIgLS0+XG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGdyb3VwaW5nSGVhZGVyc1Jvd3M7IHdoZW46aXNHcm91cFwiIChjbGljayk9XCJncm91cEhlYWRlckNsaWNrKHJvdylcIlxuICAgICAgW25nQ2xhc3NdPVwiZ2V0Q2xhc3NOYW1lR3JvdXBIZWFkZXIocm93KVwiPlxuICAgIDwvdHI+XG5cbiAgICA8IS0tIEV4cGFuZGVkIGRldGFpbCByb3ctLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRXhwYW5kZWRSb3dcIj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2V4cGFuZGVkRGV0YWlsJ11cIiBjbGFzcz1cIm8tdGFibGUtcm93LWV4cGFuZGVkXCI+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93TGFzdEluc2VydGFibGVSb3dcIj5cbiAgICAgIDx0ciBtYXQtZm9vdGVyLXJvdyAqbWF0Rm9vdGVyUm93RGVmPVwib1RhYmxlT3B0aW9ucy5jb2x1bW5zSW5zZXJ0YWJsZXM7IHN0aWNreTogdHJ1ZVwiXG4gICAgICAgIChrZXl1cCk9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmhhbmRsZUtleWJvYXJkRXZlbnQoJGV2ZW50KVwiIGNsYXNzPVwiby10YWJsZS1pbnNlcnRhYmxlXCI+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpcnN0SW5zZXJ0YWJsZVJvd1wiPlxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJvVGFibGVPcHRpb25zLmNvbHVtbnNJbnNlcnRhYmxlczsgc3RpY2t5OiB0cnVlXCJcbiAgICAgICAgKGtleXVwKT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaGFuZGxlS2V5Ym9hcmRFdmVudCgkZXZlbnQpXCIgY2xhc3M9XCJvLXRhYmxlLWluc2VydGFibGVcIj4gPC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1RvdGFscyB8IGFzeW5jXCI+XG4gICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cIm9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnM7IHN0aWNreTogdHJ1ZVwiIGNsYXNzPVwiby10YWJsZS1hZ2dyZWdhdGVcIj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdGFibGU+XG5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGV4dE1lbnVDb250ZW50Q2hpbGQgJiYgY29udGV4dE1lbnVcIj5cbiAgPG8tdGFibGUtY29udGV4dC1tZW51IFtpbnNlcnRdPVwiaW5zZXJ0QnV0dG9uXCIgW2VkaXRdPVwiZWRpdGlvbk1vZGUgIT09IEVESVRfTU9ERV9OT05FXCIgW3ZpZXctZGV0YWlsXT1cImRldGFpbE1vZGUgIT09IERFVEFJTF9NT0RFX05PTkVcIlxuICAgIFtyZWZyZXNoXT1cInJlZnJlc2hCdXR0b25cIiBbZGVsZXRlXT1cImRlbGV0ZUJ1dHRvblwiIFtmaWx0ZXJdPVwic2hvd0ZpbHRlck9wdGlvblwiIFtncm91cC1ieS1yb3ddPVwiZ3JvdXBhYmxlXCI+XG4gIDwvby10YWJsZS1jb250ZXh0LW1lbnU+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNjZWxsUmVuZGVyZXIgbGV0LXJvdz1cInJvd1wiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cblxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInRydWVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImNvbHVtbi5yZW5kZXJlciAhPSBudWxsICYmICghY29sdW1uLmVkaXRpbmcgfHwgY29sdW1uLmVkaXRpbmcgJiYgIWlzUm93U2VsZWN0ZWQocm93KSlcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uLnJlbmRlcmVyPy50ZW1wbGF0ZXJlZjsgY29udGV4dDp7IGNlbGx2YWx1ZTogcm93W2NvbHVtbi5uYW1lXSwgcm93dmFsdWU6cm93IH1cIj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNSb3dTZWxlY3RlZChyb3cpICYmIGNvbHVtbi5lZGl0aW5nXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5lZGl0b3I/LnRlbXBsYXRlcmVmOyBjb250ZXh0OnsgY2VsbHZhbHVlOiByb3dbY29sdW1uLm5hbWVdLCByb3d2YWx1ZTpyb3cgfVwiPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImNvbHVtbi50eXBlID09PSAnZWRpdEJ1dHRvbkluUm93JyB8fCBjb2x1bW4udHlwZSA9PT0gJ2RldGFpbEJ1dHRvbkluUm93J1wiPlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCIgY2xhc3M9XCJvLWFjdGlvbi1jZWxsLXJlbmRlcmVyXCIgKGNsaWNrKT1cIm9uRGV0YWlsQnV0dG9uQ2xpY2soY29sdW1uLCByb3csICRldmVudClcIj5cbiAgICAgICAgICA8bWF0LWljb24+e3sgZ2V0RGV0YWlsQnV0dG9uSWNvbihjb2x1bW4pIH19PC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD57eyByb3dbY29sdW1uLm5hbWVdIH19PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
3156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9vLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL28tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBSUwsY0FBYyxFQUNkLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBR04sUUFBUSxFQUNSLFNBQVMsRUFFVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFN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QUVULFVBQVUsTUFFVixTQUFTLE1BRVQscUJBQXFCLE1BRXJCLHNCQUFzQixNQUV0QixhQUFhLE1BRWIsV0FBVyxNQW9CWCxpQkFBaUIsTUE2SFAsV0FBVztzQkFEcEIsU0FBUzt1QkFBQyxXQUFXO2dCQUd0QixhQUFhO3NCQURaLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHOUMsY0FBYztzQkFEYixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBR3pCLElBQUk7c0JBQXpCLFlBQVk7dUJBQUMsTUFBTTtnQkFDVyxRQUFRO3NCQUF0QyxTQUFTO3VCQUFDLFFBQVE7Z0JBZ0JuQixVQUFVO3NCQURULFNBQVM7dUJBQUMsV0FBVztnQkFJdEIsWUFBWTtzQkFEWCxlQUFlO3VCQUFDLHFCQUFxQjtnQkFNdEMsWUFBWTtzQkFEWCxlQUFlO3VCQUFDLHFCQUFxQjtnQkFJdEMsdUJBQXVCO3NCQUR0QixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFLckQsa0JBQWtCO3NCQURqQixlQUFlO3VCQUFDLDJCQUEyQjtnQkFJNUMsZ0NBQWdDO3NCQUQvQixZQUFZO3VCQUFDLDhCQUE4QjtnQkFPNUMsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFO2dCQStCakMsdUJBQXVCO3NCQUR0QixZQUFZO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFNMUQsT0FBTztzQkFETixZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IFNlbGVjdGlvbkNoYW5nZSwgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBEb21Qb3J0YWxPdXRsZXQsIFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsIFZJUlRVQUxfU0NST0xMX1NUUkFURUdZIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdDaGVja2VkLFxuICBBZnRlclZpZXdJbml0LFxuICBBcHBsaWNhdGlvblJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdENoZWNrYm94Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdE1lbnUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRUYWIsIE1hdFRhYkdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQm9vbGVhbkNvbnZlcnRlciwgQm9vbGVhbklucHV0Q29udmVydGVyIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9pbnB1dC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGVTZXJ2aWNlUHJvdmlkZXIsIE9udGltaXplU2VydmljZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmFjdG9yaWVzJztcbmltcG9ydCB7IFNuYWNrQmFyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NuYWNrYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgT1RhYmxlQ29tcG9uZW50U3RhdGVDbGFzcyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0YXRlL28tdGFibGUtY29tcG9uZW50LXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IE9UYWJsZUNvbXBvbmVudFN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0YXRlL28tdGFibGUtY29tcG9uZW50LXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT0NvbHVtbkRpc3BsYXksIE9GaWx0ZXJEZWZpbml0aW9uLCBPR3JvdXBlZENvbHVtblR5cGVzLCBPVGFibGVHbG9iYWxDb25maWcgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMvZXhwcmVzc2lvbi50eXBlJztcbmltcG9ydCB7IE9QZXJtaXNzaW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL28tcGVybWlzc2lvbnMudHlwZSc7XG5pbXBvcnQgeyBPUXVlcnlEYXRhQXJncyB9IGZyb20gJy4uLy4uL3R5cGVzL3F1ZXJ5LWRhdGEtYXJncy50eXBlJztcbmltcG9ydCB7IFF1aWNrRmlsdGVyRnVuY3Rpb24gfSBmcm9tICcuLi8uLi90eXBlcy9xdWljay1maWx0ZXItZnVuY3Rpb24udHlwZSc7XG5pbXBvcnQgeyBTUUxPcmRlciB9IGZyb20gJy4uLy4uL3R5cGVzL3NxbC1vcmRlci50eXBlJztcbmltcG9ydCB7IE9Db2x1bW5BZ2dyZWdhdGUgfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLWNvbHVtbi1hZ2dyZWdhdGUudHlwZSc7XG5pbXBvcnQgeyBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLCBPQ29sdW1uVmFsdWVGaWx0ZXIgfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLWNvbHVtbi12YWx1ZS1maWx0ZXIudHlwZSc7XG5pbXBvcnQgeyBUYWJsZUZpbHRlckJ5Q29sdW1uRGlhbG9nUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvdGFibGUvby10YWJsZS1maWx0ZXItYnktY29sdW1uLWRhdGEudHlwZSc7XG5pbXBvcnQgeyBPVGFibGVJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLXRhYmxlLWluaXRpYWxpemF0aW9uLW9wdGlvbnMudHlwZSc7XG5pbXBvcnQgeyBPVGFibGVNZW51UGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi90eXBlcy90YWJsZS9vLXRhYmxlLW1lbnUtcGVybWlzc2lvbnMudHlwZSc7XG5pbXBvcnQgeyBPVGFibGVQZXJtaXNzaW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL3RhYmxlL28tdGFibGUtcGVybWlzc2lvbnMudHlwZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlV3JhcHBlciB9IGZyb20gJy4uLy4uL3V0aWwvYXN5bmMnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi8uLi91dGlsL2NvZGVzJztcbmltcG9ydCB7IEZpbHRlckV4cHJlc3Npb25VdGlscyB9IGZyb20gJy4uLy4uL3V0aWwvZmlsdGVyLWV4cHJlc3Npb24udXRpbHMnO1xuaW1wb3J0IHsgUGVybWlzc2lvbnNVdGlscyB9IGZyb20gJy4uLy4uL3V0aWwvcGVybWlzc2lvbnMnO1xuaW1wb3J0IHsgU2VydmljZVV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbC9zZXJ2aWNlLnV0aWxzJztcbmltcG9ydCB7IFNRTFR5cGVzIH0gZnJvbSAnLi4vLi4vdXRpbC9zcWx0eXBlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9Db250ZXh0TWVudUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbnRleHRtZW51L28tY29udGV4dC1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vby1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBYnN0cmFjdE9TZXJ2aWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vby1zZXJ2aWNlLWNvbXBvbmVudC5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVDb2x1bW5DYWxjdWxhdGVkQ29tcG9uZW50IH0gZnJvbSAnLi9jb2x1bW4vY2FsY3VsYXRlZC9vLXRhYmxlLWNvbHVtbi1jYWxjdWxhdGVkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPQmFzZVRhYmxlQ2VsbFJlbmRlcmVyIH0gZnJvbSAnLi9jb2x1bW4vY2VsbC1yZW5kZXJlci9vLWJhc2UtdGFibGUtY2VsbC1yZW5kZXJlci5jbGFzcyc7XG5pbXBvcnQgeyBPQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vby1jb2x1bW4uY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9jb2x1bW4vby10YWJsZS1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZUV4cG9ydEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucyc7XG5pbXBvcnQgeyBPVGFibGVDb250ZXh0TWVudUNvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9jb250ZXh0bWVudS9vLXRhYmxlLWNvbnRleHQtbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVmYXVsdE9UYWJsZU9wdGlvbnMgfSBmcm9tICcuL2V4dGVuc2lvbnMvZGVmYXVsdC1vLXRhYmxlLW9wdGlvbnMuY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlRmlsdGVyQnlDb2x1bW5EYXRhRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2RpYWxvZy9maWx0ZXItYnktY29sdW1uL28tdGFibGUtZmlsdGVyLWJ5LWNvbHVtbi1kYXRhLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgT0Jhc2VUYWJsZVBhZ2luYXRvciB9IGZyb20gJy4vZXh0ZW5zaW9ucy9mb290ZXIvcGFnaW5hdG9yL28tYmFzZS10YWJsZS1wYWdpbmF0b3IuY2xhc3MnO1xuaW1wb3J0IHsgT1RhYmxlQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1idXR0b24vby10YWJsZS1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZUNvbHVtblNlbGVjdEFsbERpcmVjdGl2ZSB9IGZyb20gJy4vZXh0ZW5zaW9ucy9oZWFkZXIvdGFibGUtY29sdW1uLXNlbGVjdC1hbGwvby10YWJsZS1jb2x1bW4tc2VsZWN0LWFsbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgT0ZpbHRlckNvbHVtbiB9IGZyb20gJy4vZXh0ZW5zaW9ucy9oZWFkZXIvdGFibGUtY29sdW1ucy1maWx0ZXIvY29sdW1ucy9vLXRhYmxlLWNvbHVtbnMtZmlsdGVyLWNvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlQ29sdW1uc0ZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9oZWFkZXIvdGFibGUtY29sdW1ucy1maWx0ZXIvby10YWJsZS1jb2x1bW5zLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlQ29sdW1uc0dyb3VwaW5nQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1jb2x1bW5zLWdyb3VwaW5nL2NvbHVtbnMvby10YWJsZS1jb2x1bW5zLWdyb3VwaW5nLWNvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT1RhYmxlSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9leHRlbnNpb25zL2hlYWRlci90YWJsZS1oZWFkZXIvby10YWJsZS1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvaGVhZGVyL3RhYmxlLWluc2VydGFibGUtcm93L28tdGFibGUtaW5zZXJ0YWJsZS1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IE9UYWJsZU9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vZXh0ZW5zaW9ucy9oZWFkZXIvdGFibGUtb3B0aW9uL28tdGFibGUtb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPVGFibGVEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4vZXh0ZW5zaW9ucy9vLXRhYmxlLWRhdGFzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPVGFibGVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuL2V4dGVuc2lvbnMvby10YWJsZS1zdHJhdGVneS5zZXJ2aWNlJztcbmltcG9ydCB7IE9UYWJsZURhbyB9IGZyb20gJy4vZXh0ZW5zaW9ucy9vLXRhYmxlLmRhbyc7XG5pbXBvcnQgeyBPVGFibGVHcm91cGVkUm93IH0gZnJvbSAnLi9leHRlbnNpb25zL3Jvdy9vLXRhYmxlLXJvdy1ncm91cC5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVSb3dFeHBhbmRhYmxlQ29tcG9uZW50LCBPVGFibGVSb3dFeHBhbmRlZENoYW5nZSB9IGZyb20gJy4vZXh0ZW5zaW9ucy9yb3cvdGFibGUtcm93LWV4cGFuZGFibGUvby10YWJsZS1yb3ctZXhwYW5kYWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT01hdFNvcnQgfSBmcm9tICcuL2V4dGVuc2lvbnMvc29ydC9vLW1hdC1zb3J0JztcbmltcG9ydCB7IE9UYWJsZUJhc2UgfSBmcm9tICcuL28tdGFibGUtYmFzZS5jbGFzcyc7XG5pbXBvcnQgeyBPX1RBQkxFX0dMT0JBTF9DT05GSUcgfSBmcm9tICcuL3V0aWxzL28tdGFibGUudG9rZW5zJztcblxuaW1wb3J0IHR5cGUgeyBJT0NvbnRleHRNZW51Q29udGV4dCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby1jb250ZXh0LW1lbnUuaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgT1RhYmxlQnV0dG9uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLWJ1dHRvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVCdXR0b25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLWJ1dHRvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgT1RhYmxlQ29sdW1uc0dyb3VwaW5nIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLWNvbHVtbnMtZ3JvdXBpbmctaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgT1RhYmxlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1kYXRhc291cmNlLmludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IE9UYWJsZU1lbnUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL28tdGFibGUtbWVudS5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLW9wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgT1RhYmxlUGFnaW5hdG9yIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9vLXRhYmxlLXBhZ2luYXRvci5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBPVGFibGVRdWlja2ZpbHRlciB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvby10YWJsZS1xdWlja2ZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3NlcnZpY2UtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9RdWVyeVBhcmFtcyB9IGZyb20gJy4uLy4uL3R5cGVzL3F1ZXJ5LXBhcmFtcy50eXBlJztcbmltcG9ydCB7IE9fQ09NUE9ORU5UX1NUQVRFX1NFUlZJQ0UgfSBmcm9tICcuLi8uLi9pbmplY3Rpb24tdG9rZW5zJztcbmltcG9ydCB7IE1hdFJvdywgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBPVGFibGVGaWx0ZXJCeUNvbHVtblNlcnZpY2UgfSBmcm9tICcuL2V4dGVuc2lvbnMvZGlhbG9nL2ZpbHRlci1ieS1jb2x1bW4vby10YWJsZS1maWx0ZXItYnktY29sdW1uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFnaW5hdGlvbkRhdGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3BhZ2luYXRpb24tZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT1RhYmxlTG9hZGluZ1NlcnZpY2UgfSBmcm9tICcuL28tdGFibGUtbG9hZGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbHVtbkZpbHRlckNoYW5nZUV2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb2x1bW4tZmlsdGVyLWNoYW5nZS1ldmVudC5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9JTlBVVFNfT19UQUJMRSA9IFtcbiAgLy8gdmlzaWJsZS1jb2x1bW5zIFtzdHJpbmddOiB2aXNpYmxlIGNvbHVtbnMsIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAndmlzaWJsZUNvbHVtbnM6IHZpc2libGUtY29sdW1ucycsXG5cbiAgLy8gdmlzaWJsZS1jb2x1bW5zLWJ5LWRlZmF1bHQgW3N0cmluZ106IGNvbHVtbnMgdGhhdCBhcmUgdmlzaWJsZSBieSBkZWZhdWx0LCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2RlZmF1bHRWaXNpYmxlQ29sdW1uczogZGVmYXVsdC12aXNpYmxlLWNvbHVtbnMnLFxuXG4gIC8vIGVkaXRhYmxlLWNvbHVtbnMgW3N0cmluZ106IGNvbHVtbnMgdGhhdCBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IG92ZXIgdGhlIHRhYmxlLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgLy8gJ2VkaXRhYmxlQ29sdW1uczogZWRpdGFibGUtY29sdW1ucycsXG5cbiAgLy8gc29ydC1jb2x1bW5zIFtzdHJpbmddOiBpbml0aWFsIHNvcnRpbmcsIHdpdGggdGhlIGZvcm1hdCBjb2x1bW46W0FTQ3xERVNDXSwgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdzb3J0Q29sdW1uczogc29ydC1jb2x1bW5zJyxcblxuICAncXVpY2tGaWx0ZXJDYWxsYmFjazogcXVpY2stZmlsdGVyLWZ1bmN0aW9uJyxcblxuICAvLyBkZWxldGUtYnV0dG9uIFtub3x5ZXNdOiBzaG93IGRlbGV0ZSBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ2RlbGV0ZUJ1dHRvbjogZGVsZXRlLWJ1dHRvbicsXG5cbiAgLy8gcmVmcmVzaC1idXR0b24gW25vfHllc106IHNob3cgcmVmcmVzaCBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ3JlZnJlc2hCdXR0b246IHJlZnJlc2gtYnV0dG9uJyxcblxuICAvLyBjb2x1bW5zLXZpc2liaWxpdHktYnV0dG9uIFtub3x5ZXNdOiBzaG93IGNvbHVtbnMgdmlzaWJpbGl0eSBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ2NvbHVtbnNWaXNpYmlsaXR5QnV0dG9uOiBjb2x1bW5zLXZpc2liaWxpdHktYnV0dG9uJyxcblxuICAvLyAvLyBjb2x1bW5zLXJlc2l6ZS1idXR0b24gW25vfHllc106IHNob3cgY29sdW1ucyByZXNpemUgYnV0dG9uLiBEZWZhdWx0OiB5ZXMuXG4gIC8vICdjb2x1bW5zUmVzaXplQnV0dG9uOiBjb2x1bW5zLXJlc2l6ZS1idXR0b24nLFxuXG4gIC8vIC8vIGNvbHVtbnMtZ3JvdXAtYnV0dG9uIFtub3x5ZXNdOiBzaG93IGNvbHVtbnMgZ3JvdXAgYnV0dG9uLiBEZWZhdWx0OiB5ZXMuXG4gIC8vICdjb2x1bW5zR3JvdXBCdXR0b246IGNvbHVtbnMtZ3JvdXAtYnV0dG9uJyxcblxuICAvLyBleHBvcnQtYnV0dG9uIFtub3x5ZXNdOiBzaG93IGV4cG9ydCBidXR0b24uIERlZmF1bHQ6IHllcy5cbiAgJ2V4cG9ydEJ1dHRvbjogZXhwb3J0LWJ1dHRvbicsXG5cbiAgLy8gc2hvdy1jb25maWd1cmF0aW9uLW9wdGlvbiBbeWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IGNvbmZpZ3VyYXRpb24gYnV0dG9uIGluIGhlYWRlci4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0NvbmZpZ3VyYXRpb25PcHRpb246IHNob3ctY29uZmlndXJhdGlvbi1vcHRpb24nLFxuXG4gIC8vIHNob3ctYnV0dG9ucy10ZXh0IFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgdGV4dCBvZiBoZWFkZXIgYnV0dG9ucy4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0J1dHRvbnNUZXh0OiBzaG93LWJ1dHRvbnMtdGV4dCcsXG5cbiAgLy8gc2VsZWN0LWFsbC1jaGVja2JveCBbeWVzfG5vfHRydWV8ZmFsc2VdOiAgc2hvdyBpbiB0aGUgbWVudSB0aGUgb3B0aW9uIG9mIHNlbGVjdGlvbiBjaGVjayBib3hlcyAuIERlZmF1bHQ6IG5vLlxuICAnc2VsZWN0QWxsQ2hlY2tib3g6IHNlbGVjdC1hbGwtY2hlY2tib3gnLFxuXG4gIC8vIHBhZ2luYXRpb24tY29udHJvbHMgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBwYWdpbmF0aW9uIGNvbnRyb2xzLiBEZWZhdWx0OiB5ZXMuXG4gICdwYWdpbmF0aW9uQ29udHJvbHM6IHBhZ2luYXRpb24tY29udHJvbHMnLFxuXG4gIC8vIGZpeC1oZWFkZXIgW3llc3xub3x0cnVlfGZhbHNlXTogZml4ZWQgaGVhZGVyIGFuZCBmb290ZXIgd2hlbiB0aGUgY29udGVudCBpcyBncmVhdGhlciB0aGFuIGl0cyBvd24gaGVpZ2h0LiBEZWZhdWx0OiB5ZXMuXG4gICdmaXhlZEhlYWRlcjogZml4ZWQtaGVhZGVyJyxcblxuICAvLyBzaG93LXRpdGxlIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgdGhlIHRhYmxlIHRpdGxlLiBEZWZhdWx0OiBuby5cbiAgJ3Nob3dUaXRsZTogc2hvdy10aXRsZScsXG5cbiAgLy8gZWRpdGlvbi1tb2RlIFtub25lIHwgaW5saW5lIHwgY2xpY2sgfCBkYmxjbGlja106IGVkaXRpb24gbW9kZS4gRGVmYXVsdCBub25lXG4gICdlZGl0aW9uTW9kZTogZWRpdGlvbi1tb2RlJyxcblxuICAvLyBzZWxlY3Rpb24tbW9kZSBbbm9uZSB8IHNpbXBsZSB8IG11bHRpcGxlIF06IHNlbGVjdGlvbiBtb2RlLiBEZWZhdWx0IG11bHRpcGxlXG4gICdzZWxlY3Rpb25Nb2RlOiBzZWxlY3Rpb24tbW9kZScsXG5cbiAgJ2hvcml6b250YWxTY3JvbGw6IGhvcml6b250YWwtc2Nyb2xsJyxcblxuICAnc2hvd1BhZ2luYXRvckZpcnN0TGFzdEJ1dHRvbnM6IHNob3ctcGFnaW5hdG9yLWZpcnN0LWxhc3QtYnV0dG9ucycsXG5cbiAgJ2F1dG9BbGlnblRpdGxlczogYXV0by1hbGlnbi10aXRsZXMnLFxuXG4gICdtdWx0aXBsZVNvcnQ6IG11bHRpcGxlLXNvcnQnLFxuICAvLyBzZWxlY3QtYWxsLWNoZWNrYm94LXZpc2libGUgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBzZWxlY3Rpb24gY2hlY2sgYm94ZXMuRGVmYXVsdDogbm8uXG4gICdzZWxlY3RBbGxDaGVja2JveFZpc2libGU6IHNlbGVjdC1hbGwtY2hlY2tib3gtdmlzaWJsZScsXG5cbiAgJ29yZGVyYWJsZScsXG5cbiAgJ3Jlc2l6YWJsZScsXG5cbiAgJ2tlZXBTZWxlY3RlZEl0ZW1zOiBrZWVwLXNlbGVjdGVkLWl0ZW1zJyxcblxuICAvLyBleHBvcnQtbW9kZSBbJ3Zpc2libGUnfCdsb2NhbCd8J2FsbCddOiBzZXRzIHRoZSBtb2RlIHRvIGV4cG9ydCBkYXRhLiBEZWZhdWx0OiAndmlzaWJsZSdcbiAgJ2V4cG9ydE1vZGU6IGV4cG9ydC1tb2RlJyxcblxuICAvLyBleHBvcnRTZXJ2aWNlVHlwZSBbIHN0cmluZyBdOiBUaGUgc2VydmljZSB1c2VkIGJ5IHRoZSB0YWJsZSBmb3IgZXhwb3J0aW5nIGl0J3MgZGF0YSwgaXQgbXVzdCBpbXBsZW1lbnQgJ0lFeHBvcnRTZXJ2aWNlJyBpbnRlcmZhY2UuIERlZmF1bHQ6ICdPbnRpbWl6ZUV4cG9ydFNlcnZpY2UnXG4gICdleHBvcnRTZXJ2aWNlVHlwZTogZXhwb3J0LXNlcnZpY2UtdHlwZScsXG5cbiAgLy8gYXV0by1hZGp1c3QgW3RydWV8ZmFsc2VdOiBBdXRvIGFkanVzdCBjb2x1bW4gd2lkdGggdG8gZml0IGl0cyBjb250ZW50LiBEZWZhdWx0OiB0cnVlXG4gICdhdXRvQWRqdXN0OiBhdXRvLWFkanVzdCcsXG5cbiAgLy8gc2hvdy1maWx0ZXItb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgZmlsdGVyIG1lbnUgb3B0aW9uIGluIHRoZSBoZWFkZXIgbWVudS4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0ZpbHRlck9wdGlvbjogc2hvdy1maWx0ZXItb3B0aW9uJyxcblxuICAvLyB2aXNpYmxlLWV4cG9ydC1kaWFsb2ctYnV0dG9ucyBbc3RyaW5nXTogdmlzaWJsZSBidXR0b25zIGluIGV4cG9ydCBkaWFsb2csIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQvbm8gY29uZmlndXJlZDogc2hvdyBhbGwuIEVtcHR5IHZhbHVlOiBoaWRlIGFsbC5cbiAgJ3Zpc2libGVFeHBvcnREaWFsb2dCdXR0b25zOiB2aXNpYmxlLWV4cG9ydC1kaWFsb2ctYnV0dG9ucycsXG5cbiAgLy8gcm93LWNsYXNzIFtmdW5jdGlvbiwgKHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlcikgPT4gc3RyaW5nIHwgc3RyaW5nW11dOiBhZGRzIHRoZSBjbGFzcyBvciBjbGFzc2VzIHJldHVybmVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvbiB0byB0aGUgdGFibGUgcm93cy5cbiAgJ3Jvd0NsYXNzOiByb3ctY2xhc3MnLFxuXG4gIC8vIGZpbHRlci1jb2x1bW4tYWN0aXZlLWJ5LWRlZmF1bHQgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBpY29uIGZpbHRlciBieSBkZWZhdWx0IGluIHRoZSB0YWJsZS4gRGVmYXVsdDp5ZXNcbiAgJ2ZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdDpmaWx0ZXItY29sdW1uLWFjdGl2ZS1ieS1kZWZhdWx0JyxcblxuICAvLyBncm91cGVkLWNvbHVtbnMgW3N0cmluZ106IGdyb3VwZWQgY29sdW1ucyBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2dyb3VwZWRDb2x1bW5zOiBncm91cGVkLWNvbHVtbnMnLFxuXG4gIC8vIGdyb3VwYWJsZVtib29sZWFuXTogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBjb2x1bW4gY2FuIGJlIGdyb3VwYWJsZS4gQnkgZGVmYXVsdDogdHJ1ZVxuICAnZ3JvdXBhYmxlJyxcblxuICAvLyBleHBhbmQtZ3JvdXBzLXNhbWUtbGV2ZWxbYm9vbGVhbl06IEluZGljYXRlcyBpZiBjbGljayBpbiByb3cgZXhwYW5kcy9jb2xsYXBzZXMgYWxsIHJvd3Mgb24gc2FtZSBsZXZlbC4gQnkgZGVmYXVsdDogdHJ1ZVxuICAnZXhwYW5kR3JvdXBzU2FtZUxldmVsOiBleHBhbmQtZ3JvdXBzLXNhbWUtbGV2ZWwnLFxuXG4gIC8vIGNvbGxhcHNlLWdyb3VwZWQtY29sdW1ucyBbeWVzfG5vfHRydWV8ZmFsc2VdOiBXaGV0aGVyIGNvbGxhcHNlIHRoZSBncm91cGVkIGNvbHVtbnMgYnkgZGVmYXVsdFxuICAnY29sbGFwc2VHcm91cGVkQ29sdW1uczogY29sbGFwc2UtZ3JvdXBlZC1jb2x1bW5zJyxcblxuICAvLyB2aXJ0dWFsLXNjcm9sbCBbeWVzfG5vfHRydWV8ZmFsc2VdOiBXaGV0aGVyIGVuYWJsZWQgb3Igbm90IHRoZSB2aXJ0dWFsIHNjcm9sbFxuICAndmlydHVhbFNjcm9sbDogdmlydHVhbC1zY3JvbGwnLFxuXG4gIC8vY29udGV4dC1tZW51IFt5ZXN8bm98dHJ1ZXxmYWxzZV06IEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSB0YWJsZSBjb250ZXh0IG1lbnVcbiAgJ2NvbnRleHRNZW51OiBjb250ZXh0LW1lbnUnLFxuXG4gIC8vIHNob3ctZXhwYW5kYWJsZS1pY29uLWZ1bmN0aW9uIFtmdW5jdGlvbl06IEV4cGFuZGFibGUgZnVuY3Rpb24gdG8gY2hlY2sgaWYgZXhwYW5kYWJsZSBoYXMgZGF0YSB0byBzaG93IG9yIG5vdCBpY29uXG4gICdzaG93RXhwYW5kYWJsZUljb25GdW5jdGlvbjogc2hvdy1leHBhbmRhYmxlLWljb24tZnVuY3Rpb24nLFxuXG4gIC8vIHNob3ctcmVwb3J0LW9uLWRlbWFuZC1vcHRpb24gW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyByZXBvcnQgb24gZGVtYW5kIG9wdGlvbiBpbiB0aGUgdGFibGUgbWVudS4gRGVmYXVsdDogeWVzLlxuICAnc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uOiBzaG93LXJlcG9ydC1vbi1kZW1hbmQtb3B0aW9uJyxcblxuICAvLyBzaG93LWNoYXJ0cy1vbi1kZW1hbmQtb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgY2hhcnRzIG9uIGRlbWFuZCBvcHRpb24gaW4gdGhlIGhlYWRlciBtZW51XG4gICdzaG93Q2hhcnRzT25EZW1hbmRPcHRpb246IHNob3ctY2hhcnRzLW9uLWRlbWFuZC1vcHRpb24nLFxuXG4gIC8vIHNob3ctcmVzZXQtd2lkdGgtb3B0aW9uIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgcmVzZXQgd2lkdGggbWVudSBvcHRpb24gaW4gdGhlIGhlYWRlciBtZW51XG4gICdzaG93UmVzZXRXaWR0aE9wdGlvbjogc2hvdy1yZXNldC13aWR0aC1vcHRpb24nLFxuXG4gICdkaXNhYmxlU2VsZWN0aW9uRnVuY3Rpb246IGRpc2FibGUtc2VsZWN0aW9uLWZ1bmN0aW9uJyxcblxuICAnbm9uSGlkYWJsZUNvbHVtbnM6IG5vbi1oaWRhYmxlLWNvbHVtbnMnLFxuICAncmVhZE9ubHk6IHJlYWQtb25seScsXG4gICdyZWFkT25seUNvbmZpZ3VyYXRpb246IHJlYWQtb25seS1jb25maWd1cmF0aW9uJyxcbiAgJ3Nob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5OiBzaG93LW5vdGlmaWNhdGlvbi1vZi1yZWFkLW9ubHknLFxuICAvLyBzZWxlY3Rpb24tb24tcm93LWNsaWNrIFt5ZXN8bm98dHJ1ZXxmYWxzZV06IC4gRGVmYXVsdDogeWVzLlxuICAnc2VsZWN0aW9uT25Sb3dDbGljazogc2VsZWN0aW9uLW9uLXJvdy1jbGljaydcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19UQUJMRSA9IFtcbiAgJ29uUm93U2VsZWN0ZWQnLFxuICAnb25Sb3dEZXNlbGVjdGVkJyxcbiAgJ29uUm93RGVsZXRlZCcsXG4gICdvbkZpbHRlckJ5Q29sdW1uQ2hhbmdlJyxcbiAgJ29uU29ydENoYW5nZScsXG4gICdvblNlYXJjaCdcbl07XG5cbmNvbnN0IHN0aWNreUhlYWRlclNlbGVjdG9yID0gJy5tYXQtbWRjLWhlYWRlci1yb3cgLm1hdC1tZGMtdGFibGUtc3RpY2t5JztcbmNvbnN0IHN0aWNreUZvb3RlclNlbGVjdG9yID0gJy5tYXQtbWRjLWZvb3Rlci1yb3cgLm1hdC1tZGMtdGFibGUtc3RpY2t5JztcbmNvbnN0IHJvd1NlbGVjdG9yID0gJy5tYXQtbWRjLXJvdyc7XG5jb25zdCBoZWFkZXJTZWxlY3RvciA9ICcubWF0LW1kYy1oZWFkZXItcm93JztcbmNvbnN0IGZvb3RlclNlbGVjdG9yID0gJy5tYXQtbWRjLWhlYWRlci1yb3cnO1xuXG50eXBlIERpc2FibGVTZWxlY3Rpb25GdW5jdGlvbiA9IChpdGVtOiBhbnkpID0+IGJvb2xlYW47XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ28tdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vby10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL28tdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgT250aW1pemVTZXJ2aWNlUHJvdmlkZXIsXG4gICAgQ29tcG9uZW50U3RhdGVTZXJ2aWNlUHJvdmlkZXIsXG4gICAgT1RhYmxlRGF0YVNvdXJjZVNlcnZpY2UsXG4gICAgT1RhYmxlRmlsdGVyQnlDb2x1bW5TZXJ2aWNlLFxuICAgIHsgcHJvdmlkZTogT19DT01QT05FTlRfU1RBVEVfU0VSVklDRSwgdXNlQ2xhc3M6IE9UYWJsZUNvbXBvbmVudFN0YXRlU2VydmljZSB9LFxuICAgIHsgcHJvdmlkZTogVklSVFVBTF9TQ1JPTExfU1RSQVRFR1ksIHVzZUNsYXNzOiBPVGFibGVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kgfSxcbiAgICB7IHByb3ZpZGU6IE9UYWJsZUJhc2UsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9UYWJsZUNvbXBvbmVudCkgfSxcbiAgICBPVGFibGVMb2FkaW5nU2VydmljZVxuICBdLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xuICAgICAgc3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgIF0pXG4gIF0sXG4gIGlucHV0czogREVGQVVMVF9JTlBVVFNfT19UQUJMRSxcbiAgb3V0cHV0czogREVGQVVMVF9PVVRQVVRTX09fVEFCTEUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5vLXRhYmxlXSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLm9udGltaXplLXRhYmxlXSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLm8tdGFibGUtZml4ZWRdJzogJ2ZpeGVkSGVhZGVyJyxcbiAgICAnW2NsYXNzLm8tdGFibGUtZGlzYWJsZWRdJzogJyFlbmFibGVkJyxcbiAgICAnKGRvY3VtZW50OmNsaWNrKSc6ICdoYW5kbGVET01DbGljaygkZXZlbnQpJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE9UYWJsZUNvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0T1NlcnZpY2VDb21wb25lbnQ8T1RhYmxlQ29tcG9uZW50U3RhdGVTZXJ2aWNlPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkLCBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX0JBU0VfU0laRV9TUElOTkVSID0gMTAwO1xuICBwdWJsaWMgc3RhdGljIEZJUlNUX0xBU1RfQ0VMTF9QQURESU5HID0gMjQ7XG4gIHB1YmxpYyBzdGF0aWMgRVhQQU5ERURfUk9XX0NPTlRBSU5FUl9DTEFTUyA9ICdleHBhbmRlZC1yb3ctY29udGFpbmVyLSc7XG4gIHB1YmxpYyBzdGF0aWMgQVZBSUxBQkxFX0dST1VQSU5HX0NPTFVNTlNfUkVOREVSRVJTID0gWydjdXJyZW5jeScsICdpbnRlZ2VyJywgJ3JlYWwnXTtcblxuICBwdWJsaWMgREVUQUlMX01PREVfTk9ORSA9IENvZGVzLkRFVEFJTF9NT0RFX05PTkU7XG4gIHB1YmxpYyBFRElUX01PREVfTk9ORSA9IENvZGVzLkVESVRJT05fTU9ERV9OT05FO1xuXG4gIHByb3RlY3RlZCBzbmFja0JhclNlcnZpY2U6IFNuYWNrQmFyU2VydmljZTtcblxuICBwdWJsaWMgcGFnaW5hdG9yOiBPVGFibGVQYWdpbmF0b3I7XG5cbiAgc29ydDogT01hdFNvcnQ7XG4gIGNsaWNrU3ViamVjdCA9IG5ldyBTdWJqZWN0PHsgcm93OiBhbnksIGNvbHVtbjogYW55LCBjZWxsUmVmOiBhbnksIHJvd0luZGV4OiBudW1iZXIsIGV2ZW50OiBNb3VzZUV2ZW50IH0+KCk7XG4gIGRibGNsaWNrU3ViamVjdCA9IG5ldyBTdWJqZWN0PHsgcm93OiBhbnksIGNvbHVtbjogYW55LCBjZWxsUmVmOiBhbnksIHJvd0luZGV4OiBudW1iZXIsIGV2ZW50OiBNb3VzZUV2ZW50IH0+KCk7XG4gIHByb3RlY3RlZCBjbGlja1N1YmplY3RTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIGRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCByb3dDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcmVmcmVzaEV4cGFuZGFibGVSb3dTdGF0ZSA9IGZhbHNlO1xuXG4gIGxvYWRpbmdTZXJ2aWNlOiBPVGFibGVMb2FkaW5nU2VydmljZTtcblxuICBAVmlld0NoaWxkKE9NYXRTb3J0KVxuICBzZXQgb01hdFNvcnQoX3NvcnQ6IE9NYXRTb3J0KSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKF9zb3J0KSAmJlxuICAgICAgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLnNvcnQpIHx8IChVdGlsLmlzRGVmaW5lZCh0aGlzLnNvcnQpICYmIFV0aWwuc3RyaW5naWZ5KHRoaXMuc29ydCkgIT09IFV0aWwuc3RyaW5naWZ5KF9zb3J0KSkpKSB7XG4gICAgICB0aGlzLnNvcnQgPSBfc29ydDtcbiAgICAgIHRoaXMuc2V0RGF0YXNvdXJjZSgpO1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgdmlydHVhbFNjcm9sbFZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgcHVibGljIG9UYWJsZUdsb2JhbENvbmZpZzogT1RhYmxlR2xvYmFsQ29uZmlnO1xuICBAVmlld0NoaWxkKCd2aXJ0dWFsU2Nyb2xsVmlld1BvcnQnKSBzZXQgY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KHZhbHVlOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHtcbiAgICBpZiAodmFsdWUgIT0gdGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0ID0gdmFsdWU7XG4gICAgICB0aGlzLnVwZGF0ZUhlYWRlckFuZEZvb3RlclN0aWNreVBvc2l0aW9ucygpO1xuICAgICAgaWYgKHRoaXMuY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbiA9IHRoaXMuY2hlY2tWaWV3UG9ydFN1YmplY3Quc3Vic2NyaWJlKHggPT4ge1xuICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBvbmx5IGZvciBpbnNpZGVUYWJCdWdXb3JrYXJvdW5kXG4gIHByb3RlY3RlZCB0YWJsZUhlYWRlcnM6IEFycmF5PE9UYWJsZUhlYWRlckNvbXBvbmVudD4gPSBbXTtcblxuICBAVmlld0NoaWxkKCdzcGlubmVyQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHNwaW5uZXJDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgQENvbnRlbnRDaGlsZChPVGFibGVSb3dFeHBhbmRhYmxlQ29tcG9uZW50KVxuICB0YWJsZVJvd0V4cGFuZGFibGU6IE9UYWJsZVJvd0V4cGFuZGFibGVDb21wb25lbnQ7XG5cbiAgX2ZpbHRlckNvbHVtbnM6IEFycmF5PE9GaWx0ZXJDb2x1bW4+O1xuICBwb3J0YWxIb3N0OiBBcnJheTxEb21Qb3J0YWxPdXRsZXQ+ID0gW107XG4gIG9uRGF0YUxvYWRlZENlbGxSZW5kZXJlclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHB1YmxpYyB0YWJsZUNvbnRleHRNZW51OiBPQ29udGV4dE1lbnVDb21wb25lbnQ7XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNlbGVjdEFsbENoZWNrYm94OiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBleHBvcnRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd0NvbmZpZ3VyYXRpb25PcHRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgY29sdW1uc1Zpc2liaWxpdHlCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd0ZpbHRlck9wdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93UmVwb3J0T25EZW1hbmRPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd0NoYXJ0c09uRGVtYW5kT3B0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dCdXR0b25zVGV4dDogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBmaWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQ6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1Jlc2V0V2lkdGhPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzZWxlY3Rpb25PblJvd0NsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBFeHBhbmRhYmxlIGlucHV0IGNhbGxiYWNrIGZ1bmN0aW9uXG4gIHNob3dFeHBhbmRhYmxlSWNvbkZ1bmN0aW9uOiAocm93OiBhbnksIHJvd0luZGV4OiBudW1iZXIpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHwgT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICByZWFkT25seUZ1bmN0aW9uOiAoY29uZmlndXJhdGlvbjogYW55KSA9PiBib29sZWFuO1xuICByZWFkT25seUNvbmZpZ3VyYXRpb246IGFueTtcblxuICBpc0NvbXBvbmVudFJlYWRPbmx5KHNlbGVjdG9yOiBzdHJpbmcsIGF0dHI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlYWRPbmx5Q29uZmlndXJhdGlvbj8uW3NlbGVjdG9yXT8uW2F0dHJdO1xuICB9XG4gIHByb3RlY3RlZCBfb1RhYmxlT3B0aW9uczogT1RhYmxlT3B0aW9ucztcblxuICBnZXQgb1RhYmxlT3B0aW9ucygpOiBPVGFibGVPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5fb1RhYmxlT3B0aW9ucztcbiAgfVxuXG4gIHNldCBvVGFibGVPcHRpb25zKHZhbHVlOiBPVGFibGVPcHRpb25zKSB7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucyA9IHZhbHVlO1xuICB9XG5cbiAgc2V0IHF1aWNrRmlsdGVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdmFsdWUgPSBVdGlsLnBhcnNlQm9vbGVhbihTdHJpbmcodmFsdWUpKTtcbiAgICB0aGlzLl9xdWlja0ZpbHRlciA9IHZhbHVlO1xuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZmlsdGVyID0gdmFsdWU7XG4gIH1cblxuICBnZXQgcXVpY2tGaWx0ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3F1aWNrRmlsdGVyO1xuICB9XG5cbiAgc2V0IGZpbHRlckNhc2VTZW5zaXRpdmUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9maWx0ZXJDYXNlU2Vuc2l0aXZlID0gQm9vbGVhbkNvbnZlcnRlcih2YWx1ZSk7XG4gICAgaWYgKHRoaXMuX29UYWJsZU9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuZmlsdGVyQ2FzZVNlbnNpdGl2ZSA9IHRoaXMuX2ZpbHRlckNhc2VTZW5zaXRpdmU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZpbHRlckNhc2VTZW5zaXRpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNhc2VTZW5zaXRpdmU7XG4gIH1cblxuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgaW5zZXJ0QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHJlZnJlc2hCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZGVsZXRlQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGZpeGVkSGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNob3dUaXRsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBlZGl0aW9uTW9kZTogc3RyaW5nID0gQ29kZXMuRURJVElPTl9NT0RFX05PTkU7XG4gIHNlbGVjdGlvbk1vZGU6IHN0cmluZyA9IENvZGVzLlNFTEVDVElPTl9NT0RFX01VTFRJUExFO1xuXG4gIHByb3RlY3RlZCBfaG9yaXpvbnRhbFNjcm9sbCA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2V0IGhvcml6b250YWxTY3JvbGwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9ob3Jpem9udGFsU2Nyb2xsID0gQm9vbGVhbkNvbnZlcnRlcih2YWx1ZSk7XG4gICAgdGhpcy5yZWZyZXNoQ29sdW1uc1dpZHRoRnJvbU9yaWdpbmFsRGVmaW5pdGlvbigpO1xuICB9XG5cbiAgZ2V0IGhvcml6b250YWxTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hvcml6b250YWxTY3JvbGw7XG4gIH1cblxuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd1BhZ2luYXRvckZpcnN0TGFzdEJ1dHRvbnM6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgYXV0b0FsaWduVGl0bGVzOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIG11bHRpcGxlU29ydDogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBvcmRlcmFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcmVzaXphYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGF1dG9BZGp1c3Q6IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZ3JvdXBhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGV4cGFuZEdyb3Vwc1NhbWVMZXZlbDogYm9vbGVhbiA9IHRydWU7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBjb2xsYXBzZUdyb3VwZWRDb2x1bW5zOiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICB2aXJ0dWFsU2Nyb2xsOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGNvbnRleHRNZW51OiBib29sZWFuID0gdHJ1ZTtcbiAgLy8gTWFpbnRhaW5pbmcgdGhpcyBnZXR0ZXIgdG8gYWxsb3cgY29tcG9uZW50IGV4dGVuc2lvbnMgKGF2b2lkaW5nIGEgYnJlYWtpbmcgY2hhbmdlKVxuICBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vZW5hYmxlZDtcbiAgfVxuICBwcm90ZWN0ZWQgX3NlbGVjdEFsbENoZWNrYm94VmlzaWJsZTogYm9vbGVhbjtcbiAgc2V0IHNlbGVjdEFsbENoZWNrYm94VmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlbGVjdEFsbENoZWNrYm94VmlzaWJsZSA9IEJvb2xlYW5Db252ZXJ0ZXIodmFsdWUpO1xuICAgIGlmICh0aGlzLnN0YXRlKSB7XG4gICAgICB0aGlzLl9zZWxlY3RBbGxDaGVja2JveFZpc2libGUgPSBCb29sZWFuQ29udmVydGVyKHRoaXMuc3RhdGUuc2VsZWN0Q29sdW1uVmlzaWJsZSk7XG4gICAgfVxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGUgPSB0aGlzLl9zZWxlY3RBbGxDaGVja2JveFZpc2libGU7XG4gICAgdGhpcy5pbml0aWFsaXplQ2hlY2tib3hDb2x1bW4oKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RBbGxDaGVja2JveFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdEFsbENoZWNrYm94VmlzaWJsZTtcbiAgfVxuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBrZWVwU2VsZWN0ZWRJdGVtczogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHVibGljIGV4cG9ydE1vZGU6IHN0cmluZyA9IENvZGVzLkVYUE9SVF9NT0RFX1ZJU0lCTEU7XG4gIHB1YmxpYyBleHBvcnRTZXJ2aWNlVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgdmlzaWJsZUV4cG9ydERpYWxvZ0J1dHRvbnM6IHN0cmluZztcbiAgcHVibGljIGRhb1RhYmxlOiBPVGFibGVEYW8gfCBudWxsO1xuICBwdWJsaWMgZGF0YVNvdXJjZTogT1RhYmxlRGF0YVNvdXJjZSB8IG51bGw7XG4gIHB1YmxpYyB2aXNpYmxlQ29sdW1uczogc3RyaW5nO1xuICBwdWJsaWMgc2VhcmNoZWFibGVDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgZGVmYXVsdFZpc2libGVDb2x1bW5zOiBzdHJpbmc7XG4gIHB1YmxpYyBncm91cGVkQ29sdW1uczogc3RyaW5nO1xuICBwdWJsaWMgbm9uSGlkYWJsZUNvbHVtbnM6IHN0cmluZztcblxuICBwdWJsaWMgc29ydENvbHVtbnM6IHN0cmluZztcbiAgcHVibGljIGdyb3VwZWRDb2x1bW5UeXBlczogT0dyb3VwZWRDb2x1bW5UeXBlc1tdID0gW107XG4gIHB1YmxpYyByb3dDbGFzczogKHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlcikgPT4gc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLypwYXJzZWQgaW5wdXRzIHZhcmlhYmxlcyAqL1xuICBwcm90ZWN0ZWQgX3Zpc2libGVDb2xBcnJheTogc3RyaW5nW10gPSBbXTtcblxuICBnZXQgdmlzaWJsZUNvbEFycmF5KCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZUNvbEFycmF5O1xuICB9XG5cbiAgc2V0IHZpc2libGVDb2xBcnJheShhcmc6IGFueVtdKSB7XG4gICAgY29uc3QgcGVybWlzc2lvbnNCbG9ja2VkID0gdGhpcy5wZXJtaXNzaW9ucz8uY29sdW1ucz8uZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSA9PT0gZmFsc2UpLm1hcChjb2wgPT4gY29sLmF0dHIpID8/IFtdO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zQ2hlY2tlZCA9IGFyZy5maWx0ZXIodmFsdWUgPT4gcGVybWlzc2lvbnNCbG9ja2VkLmluZGV4T2YodmFsdWUpID09PSAtMSk7XG5cbiAgICB0aGlzLl92aXNpYmxlQ29sQXJyYXkgPSBwZXJtaXNzaW9uc0NoZWNrZWQ7XG4gICAgaWYgKHRoaXMuX29UYWJsZU9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5zU2VsZWN0aW9uQ29sID0gdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5pbmRleE9mKENvZGVzLk5BTUVfQ09MVU1OX1NFTEVDVCkgIT09IC0xO1xuICAgICAgY29uc3QgY29udGFpbnNFeHBhbmRhYmxlQ29sID0gdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5pbmRleE9mKENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpICE9PSAtMTtcbiAgICAgIGlmIChjb250YWluc1NlbGVjdGlvbkNvbCkge1xuICAgICAgICB0aGlzLl92aXNpYmxlQ29sQXJyYXkudW5zaGlmdChDb2Rlcy5OQU1FX0NPTFVNTl9TRUxFQ1QpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbnRhaW5zU2VsZWN0aW9uQ29sICYmIGNvbnRhaW5zRXhwYW5kYWJsZUNvbCkge1xuICAgICAgICB0aGlzLl92aXNpYmxlQ29sQXJyYXkgPSBbdGhpcy5fdmlzaWJsZUNvbEFycmF5WzBdXS5jb25jYXQoQ29kZXMuTkFNRV9DT0xVTU5fRVhQQU5EQUJMRSwgdGhpcy5fdmlzaWJsZUNvbEFycmF5LnNwbGljZSgxKSk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250YWluc0V4cGFuZGFibGVDb2wpIHtcbiAgICAgICAgICB0aGlzLl92aXNpYmxlQ29sQXJyYXkudW5zaGlmdChDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuX3Zpc2libGVDb2xBcnJheTtcbiAgICAgIHRoaXMuZ3JvdXBpbmdIZWFkZXJzUm93cyA9IHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMubWFwKHZpc2libGVDb2wgPT4gJ2dyb3VwSGVhZGVyLScgKyB2aXNpYmxlQ29sKTtcbiAgICB9XG4gIH1cblxuICBzb3J0Q29sQXJyYXk6IFNRTE9yZGVyW10gPSBbXTtcbiAgLyplbmQgb2YgcGFyc2VkIGlucHV0cyB2YXJpYWJsZXMgKi9cblxuICBwcm90ZWN0ZWQgdGFiR3JvdXBDb250YWluZXI6IE1hdFRhYkdyb3VwO1xuICBwcm90ZWN0ZWQgdGFiQ29udGFpbmVyOiBNYXRUYWI7XG4gIHRhYkdyb3VwQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHJvdGVjdGVkIHBlbmRpbmdRdWVyeTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgcGVuZGluZ1F1ZXJ5RmlsdGVyID0gdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBzZXRTdGF0aWNEYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBhdm9pZFF1ZXJ5Q29sdW1uczogQXJyYXk8YW55PiA9IFtdO1xuICBwcm90ZWN0ZWQgYXN5bmNMb2FkQ29sdW1uczogQXJyYXk8YW55PiA9IFtdO1xuICBwcm90ZWN0ZWQgYXN5bmNMb2FkU3Vic2NyaXB0aW9uczogb2JqZWN0ID0ge307XG5cbiAgcHJvdGVjdGVkIHF1ZXJ5U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBjb250ZXh0TWVudVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgdmlydHVhbFNjcm9sbFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgY2hlY2tWaWV3cG9ydFNpemVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIGZpbmlzaFF1ZXJ5U3Vic2NyaXB0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIG9uUm93U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25Sb3dEZXNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uUm93RGVsZXRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvblJlaW5pdGlhbGl6ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvbkNvbnRlbnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25GaWx0ZXJCeUNvbHVtbkNoYW5nZTogRXZlbnRFbWl0dGVyPENvbHVtbkZpbHRlckNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIG9uU29ydENoYW5nZTogRXZlbnRFbWl0dGVyPFNRTE9yZGVyW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByb3RlY3RlZCBzZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgb1RhYmxlRmlsdGVyQnlDb2x1bW5EYXRhRGlhbG9nQ29tcG9uZW50OiBPVGFibGVGaWx0ZXJCeUNvbHVtbkRhdGFEaWFsb2dDb21wb25lbnQ7XG4gIHB1YmxpYyBvVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50OiBPVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd1RvdGFsc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHNob3dUb3RhbHM6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnNob3dUb3RhbHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRpbmdTb3J0aW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgbG9hZGluZ1NvcnRpbmc6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmxvYWRpbmdTb3J0aW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nU2Nyb2xsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgbG9hZGluZ1Njcm9sbDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMubG9hZGluZ1Njcm9sbFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHVibGljIHNob3dMb2FkaW5nOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIHB1YmxpYyBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50OiBPVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50O1xuICBwdWJsaWMgc2hvd0ZpcnN0SW5zZXJ0YWJsZVJvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgc2hvd0xhc3RJbnNlcnRhYmxlUm93OiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBleHBhbmRhYmxlSXRlbTogU2VsZWN0aW9uTW9kZWw8YW55PjtcblxuICBwcm90ZWN0ZWQgY2xpY2tUaW1lcjtcbiAgcHJvdGVjdGVkIGNsaWNrRGVsYXkgPSAyMDA7XG4gIHByb3RlY3RlZCBjbGlja1ByZXZlbnQgPSBmYWxzZTtcbiAgcHVibGljIGVkaXRpbmdDZWxsOiBhbnk7XG4gIHByb3RlY3RlZCBlZGl0aW5nUm93OiBhbnk7XG5cbiAgc2V0IGN1cnJlbnRQYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSB2YWw7XG4gICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSB2YWw7XG4gICAgICBpZiAodGhpcy5tYXRwYWdpbmF0b3IpIHtcbiAgICAgICAgdGhpcy5tYXRwYWdpbmF0b3IucGFnZUluZGV4ID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBjdXJyZW50UGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50UGFnZTtcbiAgfVxuXG4gIHB1YmxpYyBvVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudDogT1RhYmxlUXVpY2tmaWx0ZXI7XG4gIHByb3RlY3RlZCBzb3J0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBvblJlbmRlcmVkRGF0YUNoYW5nZTogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgcHJldmlvdXNSZW5kZXJlckRhdGE7XG5cbiAgcXVpY2tGaWx0ZXJDYWxsYmFjazogUXVpY2tGaWx0ZXJGdW5jdGlvbjtcbiAgZGlzYWJsZVNlbGVjdGlvbkZ1bmN0aW9uOiBEaXNhYmxlU2VsZWN0aW9uRnVuY3Rpb247XG5cbiAgQFZpZXdDaGlsZCgndGFibGVCb2R5JylcbiAgcHJvdGVjdGVkIHRhYmxlQm9keUVsOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd0YWJsZUhlYWRlcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICB0YWJsZUhlYWRlckVsOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd0YWJsZVRvb2xiYXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgdGFibGVUb29sYmFyRWw6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZHJlbihNYXRSb3cpIHJvd3MhOiBRdWVyeUxpc3Q8TWF0Um93PjtcbiAgQFZpZXdDaGlsZChNYXRUYWJsZSkgcHJvdGVjdGVkIG1hdFRhYmxlOiBNYXRUYWJsZTxhbnk+O1xuXG4gIGhvcml6b250YWxTY3JvbGxlZDogYm9vbGVhbjtcbiAgcHVibGljIG9uVXBkYXRlU2Nyb2xsZWRTdGF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyByb3dXaWR0aDtcblxuICBzdG9yZVBhZ2luYXRpb25TdGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qIEluIHRoZSBjYXNlIHRoZSB0YWJsZSBoYXZlbnQgcGFnaW5hdGlvbkNvbnRyb2wgYW5kIHBhZ2VhYmxlLCB0aGUgdGFibGUgaGFzIHBhZ2luYXRpb24gdmlydHVhbCovXG4gIHBhZ2VTY3JvbGxWaXJ0dWFsID0gMTtcblxuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfUk9XX0hFSUdIVCA9IDM2O1xuICBwcm90ZWN0ZWQgcGVybWlzc2lvbnM6IE9UYWJsZVBlcm1pc3Npb25zO1xuICBtYXRNZW51OiBNYXRNZW51O1xuXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlTWVudScpXG4gIG9UYWJsZU1lbnU6IE9UYWJsZU1lbnU7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihPVGFibGVPcHRpb25Db21wb25lbnQpXG4gIHRhYmxlT3B0aW9uczogUXVlcnlMaXN0PE9UYWJsZU9wdGlvbkNvbXBvbmVudD47XG5cbiAgb1RhYmxlQnV0dG9uczogT1RhYmxlQnV0dG9ucztcblxuICBAQ29udGVudENoaWxkcmVuKE9UYWJsZUJ1dHRvbkNvbXBvbmVudClcbiAgdGFibGVCdXR0b25zOiBRdWVyeUxpc3Q8T1RhYmxlQnV0dG9uPjtcblxuICBAQ29udGVudENoaWxkKCdvLXRhYmxlLXF1aWNrZmlsdGVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcXVpY2tmaWx0ZXJDb250ZW50Q2hpbGQ6IE9UYWJsZVF1aWNrZmlsdGVyO1xuXG5cbiAgQENvbnRlbnRDaGlsZHJlbihPVGFibGVFeHBvcnRCdXR0b25Db21wb25lbnQpXG4gIGV4cG9ydE9wdHNUZW1wbGF0ZTogUXVlcnlMaXN0PE9UYWJsZUV4cG9ydEJ1dHRvbkNvbXBvbmVudD5cblxuICBAQ29udGVudENoaWxkKE9UYWJsZUNvbHVtblNlbGVjdEFsbERpcmVjdGl2ZSlcbiAgdGFibGVDb2x1bW5TZWxlY3RBbGxDb250ZW50Q2hpbGQ6IE9UYWJsZUNvbHVtblNlbGVjdEFsbERpcmVjdGl2ZTtcbi8vIFRvIHNhdmUgc2Nyb2xsIHBvc2l0aW9uIHdoZW4gcmVsb2FkaW5nIGRhdGFcbiAgcHVibGljIHNhdmVkU2Nyb2xsUG9zaXRpb246IG51bWJlciA9IDA7XG5cbiAgcHVibGljIGdyb3VwZWRDb2x1bW5zQXJyYXk6IHN0cmluZ1tdID0gW107XG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbXSlcbiAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ob3Jpem9udGFsU2Nyb2xsKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgYm9keVdpZHRoID0gdGhpcy50YWJsZUJvZHlFbC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICBjb25zdCBzY3JvbGxXaWR0aCA9IHRoaXMudGFibGVCb2R5RWwubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgICAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IHRoaXMuaG9yaXpvbnRhbFNjcm9sbGVkO1xuICAgICAgICB0aGlzLmhvcml6b250YWxTY3JvbGxlZCA9IHNjcm9sbFdpZHRoID4gYm9keVdpZHRoO1xuICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSAhPT0gdGhpcy5ob3Jpem9udGFsU2Nyb2xsZWQpIHtcbiAgICAgICAgICB0aGlzLm9uVXBkYXRlU2Nyb2xsZWRTdGF0ZS5lbWl0KHRoaXMuaG9yaXpvbnRhbFNjcm9sbGVkKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfaXNDb2x1bW5GaWx0ZXJzQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGlzQ29sdW1uRmlsdGVyc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNDb2x1bW5GaWx0ZXJzQWN0aXZlO1xuICB9XG5cbiAgc2V0IGlzQ29sdW1uRmlsdGVyc0FjdGl2ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0NvbHVtbkZpbHRlcnNBY3RpdmUgPSB2YWw7XG4gIH1cblxuICBncm91cGluZ0hlYWRlcnNSb3dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBvVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQ6IE9UYWJsZUNvbHVtbnNHcm91cGluZztcblxuICBAQ29udGVudENoaWxkKE9UYWJsZUNvbnRleHRNZW51Q29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBjb250ZXh0TWVudUNvbnRlbnRDaGlsZDogT1RhYmxlQ29udGV4dE1lbnVDb21wb25lbnQ7XG5cbiAgcHJvdGVjdGVkIHRyaWdnZXJTZWxlY3Rpb25FdmVudHM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBWaWV3Q2hpbGRyZW4oTWF0VG9vbHRpcClcbiAgdG9vbHRpcDogUXVlcnlMaXN0PE1hdFRvb2x0aXA+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoZm9yd2FyZFJlZigoKSA9PiBPRm9ybUNvbXBvbmVudCkpIGZvcm06IE9Gb3JtQ29tcG9uZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVklSVFVBTF9TQ1JPTExfU1RSQVRFR1kpIHB1YmxpYyByZWFkb25seSBzY3JvbGxTdHJhdGVneTogT1RhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5XG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yLCBlbFJlZiwgZm9ybSk7XG4gICAgdGhpcy5sb2FkaW5nU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9UYWJsZUxvYWRpbmdTZXJ2aWNlKTtcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0LnN1YnNjcmliZSgobG9hZGluZzogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nU2VydmljZS5zZXRMb2FkaW5nKGxvYWRpbmcpO1xuICAgIH0pO1xuICAgIHRoaXMuc2hvd0xvYWRpbmcgPSB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNob3dMb2FkaW5nJDtcblxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMgPSBuZXcgRGVmYXVsdE9UYWJsZU9wdGlvbnMoKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnRhYkdyb3VwQ29udGFpbmVyID0gdGhpcy5pbmplY3Rvci5nZXQoTWF0VGFiR3JvdXApO1xuICAgICAgdGhpcy50YWJDb250YWluZXIgPSB0aGlzLmluamVjdG9yLmdldChNYXRUYWIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEbyBub3RoaW5nIGR1ZSB0byBub3QgYWx3YXlzIGlzIGNvbnRhaW5lZCBvbiB0YWIuXG4gICAgfVxuXG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChTbmFja0JhclNlcnZpY2UpO1xuICAgIHRoaXMuZ2V0SW5qZWN0aW9uVG9rZW5Db25maWcoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5qZWN0aW9uVG9rZW5Db25maWcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9UYWJsZUdsb2JhbENvbmZpZyA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9fVEFCTEVfR0xPQkFMX0NPTkZJRyk7XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLmF1dG9BZGp1c3QpKSB7XG4gICAgICAgIHRoaXMuYXV0b0FkanVzdCA9IG9UYWJsZUdsb2JhbENvbmZpZy5hdXRvQWRqdXN0O1xuICAgICAgfTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuYXV0b0FsaWduVGl0bGVzKSkge1xuICAgICAgICB0aGlzLmF1dG9BbGlnblRpdGxlcyA9IG9UYWJsZUdsb2JhbENvbmZpZy5hdXRvQWxpZ25UaXRsZXM7XG4gICAgICB9XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLmZpbHRlckNvbHVtbkFjdGl2ZUJ5RGVmYXVsdCkpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJDb2x1bW5BY3RpdmVCeURlZmF1bHQgPSBvVGFibGVHbG9iYWxDb25maWcuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0O1xuICAgICAgfVxuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5lZGl0aW9uTW9kZSkgJiYgQ29kZXMuaXNWYWxpZEVkaXRpb25Nb2RlKG9UYWJsZUdsb2JhbENvbmZpZy5lZGl0aW9uTW9kZSkpIHtcbiAgICAgICAgdGhpcy5lZGl0aW9uTW9kZSA9IG9UYWJsZUdsb2JhbENvbmZpZy5lZGl0aW9uTW9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuZGV0YWlsTW9kZSAmJiBDb2Rlcy5pc1ZhbGlkRGV0YWlsTW9kZShvVGFibGVHbG9iYWxDb25maWcuZGV0YWlsTW9kZSkpKSB7XG4gICAgICAgIHRoaXMuZGV0YWlsTW9kZSA9IG9UYWJsZUdsb2JhbENvbmZpZy5kZXRhaWxNb2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLnJvd0hlaWdodCkgJiYgQ29kZXMuaXNWYWxpZFJvd0hlaWdodChvVGFibGVHbG9iYWxDb25maWcucm93SGVpZ2h0KSkge1xuICAgICAgICB0aGlzLnJvd0hlaWdodCA9IG9UYWJsZUdsb2JhbENvbmZpZy5yb3dIZWlnaHQ7XG4gICAgICB9O1xuXG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob1RhYmxlR2xvYmFsQ29uZmlnLnNob3dDaGFydHNPbkRlbWFuZE9wdGlvbikpIHtcbiAgICAgICAgdGhpcy5zaG93Q2hhcnRzT25EZW1hbmRPcHRpb24gPSBvVGFibGVHbG9iYWxDb25maWcuc2hvd0NoYXJ0c09uRGVtYW5kT3B0aW9uO1xuICAgICAgfTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuc2hvd1JlcG9ydE9uRGVtYW5kT3B0aW9uKSkge1xuICAgICAgICB0aGlzLnNob3dSZXBvcnRPbkRlbWFuZE9wdGlvbiA9IG9UYWJsZUdsb2JhbENvbmZpZy5zaG93UmVwb3J0T25EZW1hbmRPcHRpb247XG4gICAgICB9O1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9UYWJsZUdsb2JhbENvbmZpZy5zZWxlY3Rpb25PblJvd0NsaWNrKSkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbk9uUm93Q2xpY2sgPSBvVGFibGVHbG9iYWxDb25maWcuc2VsZWN0aW9uT25Sb3dDbGljaztcbiAgICAgIH1cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChvVGFibGVHbG9iYWxDb25maWcuaG9yaXpvbnRhbFNjcm9sbCkpIHtcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsU2Nyb2xsID0gb1RhYmxlR2xvYmFsQ29uZmlnLmhvcml6b250YWxTY3JvbGw7XG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRG8gbm90aGluZyBiZWNhdXNlIGlzIG9wdGlvbmFsXG4gICAgfVxuXG4gIH1cblxuICBnZXQgc3RhdGUoKTogT1RhYmxlQ29tcG9uZW50U3RhdGVDbGFzcyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U3RhdGVTZXJ2aWNlLnN0YXRlO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgaWYgKHRoaXMub1RhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucyAmJiB0aGlzLnRhYmxlQnV0dG9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm9UYWJsZUJ1dHRvbnMucmVnaXN0ZXJCdXR0b25zKHRoaXMudGFibGVCdXR0b25zLnRvQXJyYXkoKSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHN1cGVyLmFmdGVyVmlld0luaXQoKTtcbiAgICB0aGlzLmluaXRUYWJsZUFmdGVyVmlld0luaXQoKTtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm1hdE1lbnUgPSB0aGlzLm9UYWJsZU1lbnUubWF0TWVudTtcbiAgICAgIHRoaXMub1RhYmxlTWVudS5yZWdpc3Rlck9wdGlvbnModGhpcy50YWJsZU9wdGlvbnMudG9BcnJheSgpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJsZVJvd0V4cGFuZGFibGUpIHtcbiAgICAgIHRoaXMuZXhwYW5kYWJsZUl0ZW0gPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS5tdWx0aXBsZSwgW10sIHRydWUsIHRoaXMuY29tcGFyZVJvdygpKTtcbiAgICAgIHRoaXMuY3JlYXRlRXhwYW5kYWJsZUNvbHVtbigpO1xuICAgICAgdGhpcy5leHBhbmRhYmxlSXRlbS5jaGFuZ2VkLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZVJvd0V4cGFuZFN0YXRlKGNoYW5nZS5hZGRlZCwgY2hhbmdlLnJlbW92ZWQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucm93Q2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3dzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlVGFibGVEYXRhQ2hhbmdlKCk7XG4gICAgfSk7XG5cblxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLnRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkKSB7XG4gICAgICB0aGlzLnNldEN1c3RvbURlZmluaXRpb25JblNlbGVjdENvbHVtbih0aGlzLnRhYmxlQ29sdW1uU2VsZWN0QWxsQ29udGVudENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVRhYmxlRGF0YUNoYW5nZSgpIHtcbiAgICB0aGlzLnJlc3RvcmVFeHBhbmRhYmxlUm93U3RhdGUoKTtcbiAgfVxuXG4gIHNldEN1c3RvbURlZmluaXRpb25JblNlbGVjdENvbHVtbihkZWZpbml0aW9uOiBPVGFibGVDb2x1bW5TZWxlY3RBbGxEaXJlY3RpdmUpIHtcbiAgICBpZiAoZGVmaW5pdGlvbi50aXRsZSkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udGl0bGUgPSBkZWZpbml0aW9uLnRpdGxlO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi53aWR0aCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ud2lkdGggPSBkZWZpbml0aW9uLndpZHRoO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi5taW5XaWR0aCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubWluV2lkdGggPSBkZWZpbml0aW9uLm1pbldpZHRoO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi5tYXhXaWR0aCkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubWF4V2lkdGggPSBkZWZpbml0aW9uLm1heFdpZHRoO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbi5yZXNpemFibGUpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnJlc2l6YWJsZSA9IGRlZmluaXRpb24ucmVzaXphYmxlO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3BOYW1lOiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfSk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjaGFuZ2VzLmF1dG9BZGp1c3QpICYmIGNoYW5nZXMuYXV0b0FkanVzdC5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuYXV0b0FkanVzdC5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLmF1dG9BZGp1c3QgPSBjaGFuZ2VzLmF1dG9BZGp1c3QuY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUhlYWRlckFuZEZvb3RlclN0aWNreVBvc2l0aW9ucygpIHtcbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IHpvbmUgPSB0aGlzLmluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uID0gdGhpcy5zY3JvbGxTdHJhdGVneS5zdGlja3lDaGFuZ2UucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZml4ZWRIZWFkZXIgfHwgdGhpcy5oYXNJbnNlcnRhYmxlUm93KCkpXG4gICAgICApLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN0aWNreUhlYWRlclNlbGVjdG9yKS5mb3JFYWNoKChlbDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGVsLnN0eWxlLnRvcCA9IC0geCArICdweCc7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3RpY2t5Rm9vdGVyU2VsZWN0b3IpLmZvckVhY2goKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgZWwuc3R5bGUuYm90dG9tID0geCArICdweCc7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUV4cGFuZGFibGVDb2x1bW4oKSB7XG4gICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uID0gbmV3IE9Db2x1bW4oKTtcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4udmlzaWJsZSA9IHRoaXMudGFibGVSb3dFeHBhbmRhYmxlICYmIHRoaXMudGFibGVSb3dFeHBhbmRhYmxlLmV4cGFuZGFibGVDb2x1bW5WaXNpYmxlO1xuICAgIHRoaXMudXBkYXRlU3RhdGVFeHBhbmRlZENvbHVtbigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG5cbiAgICAvL2RldGFjaCBhbGwgcG9ydGEgaG9zdCBjcmVhdGVkXG4gICAgaWYgKHRoaXMucG9ydGFsSG9zdCkge1xuICAgICAgdGhpcy5wb3J0YWxIb3N0LmZvckVhY2goeCA9PiB4LmRldGFjaCgpKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICBnZXRTdWZmaXhDb2x1bW5JbnNlcnRhYmxlKCkge1xuICAgIHJldHVybiBDb2Rlcy5TVUZGSVhfQ09MVU1OX0lOU0VSVEFCTEU7XG4gIH1cblxuICBnZXRBY3Rpb25zUGVybWlzc2lvbnMoKTogT1Blcm1pc3Npb25zW10ge1xuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zID8gKHRoaXMucGVybWlzc2lvbnMuYWN0aW9ucyB8fCBbXSkgOiBbXTtcbiAgfVxuXG4gIGdldE1lbnVQZXJtaXNzaW9ucygpOiBPVGFibGVNZW51UGVybWlzc2lvbnMge1xuICAgIGNvbnN0IHJlc3VsdDogT1RhYmxlTWVudVBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9ucyA/IHRoaXMucGVybWlzc2lvbnMubWVudSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDoge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBpdGVtczogW11cbiAgICB9O1xuICB9XG5cbiAgZ2V0T0NvbHVtblBlcm1pc3Npb25zKGF0dHI6IHN0cmluZyk6IE9QZXJtaXNzaW9ucyB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMucGVybWlzc2lvbnMgPyAodGhpcy5wZXJtaXNzaW9ucy5jb2x1bW5zIHx8IFtdKSA6IFtdO1xuICAgIHJldHVybiBjb2x1bW5zLmZpbmQoY29tcCA9PiBjb21wLmF0dHIgPT09IGF0dHIpIHx8IHsgYXR0cjogYXR0ciwgZW5hYmxlZDogdHJ1ZSwgdmlzaWJsZTogdHJ1ZSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFjdGlvblBlcm1pc3Npb25zKGF0dHI6IHN0cmluZyk6IE9QZXJtaXNzaW9ucyB7XG4gICAgY29uc3QgYWN0aW9uc1Blcm0gPSB0aGlzLnBlcm1pc3Npb25zID8gKHRoaXMucGVybWlzc2lvbnMuYWN0aW9ucyB8fCBbXSkgOiBbXTtcbiAgICBjb25zdCBwZXJtaXNzaW9uczogT1Blcm1pc3Npb25zID0gYWN0aW9uc1Blcm0uZmluZChwID0+IHAuYXR0ciA9PT0gYXR0cik7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zIHx8IHtcbiAgICAgIGF0dHI6IGF0dHIsXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihhdHRyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3Rpb25zUGVybSA9IHRoaXMucGVybWlzc2lvbnMgPyAodGhpcy5wZXJtaXNzaW9ucy5hY3Rpb25zIHx8IFtdKSA6IFtdO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zOiBPUGVybWlzc2lvbnMgPSBhY3Rpb25zUGVybS5maW5kKHAgPT4gcC5hdHRyID09PSBhdHRyKTtcbiAgICBjb25zdCBlbmFibGVkUGVybWlzaW9uID0gUGVybWlzc2lvbnNVdGlscy5jaGVja0VuYWJsZWRQZXJtaXNzaW9uKHBlcm1pc3Npb25zKTtcbiAgICBpZiAoIWVuYWJsZWRQZXJtaXNpb24pIHtcbiAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9QRVJNSVNTSU9OJyk7XG4gICAgfVxuICAgIHJldHVybiBlbmFibGVkUGVybWlzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB3aGF0IGluaXRpYWxpemUgdmFycyBhbmQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpOiBhbnkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcblxuICAgIHRoaXMuX29UYWJsZU9wdGlvbnMgPSBuZXcgRGVmYXVsdE9UYWJsZU9wdGlvbnMoKTtcbiAgICBpZiAodGhpcy50YWJHcm91cENvbnRhaW5lciAmJiB0aGlzLnRhYkNvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZWdpc3RlclRhYkxpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWdpc3RlckNsaWNrTGlzdGVuZXIoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRGJsQ2xpY2tMaXN0ZW5lcigpO1xuICAgIC8vIEluaXRpYWxpemUgcGFyYW1zIG9mIHRoZSB0YWJsZVxuICAgIHRoaXMuaW5pdGlhbGl6ZVBhcmFtcygpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplRGFvKCk7XG5cbiAgICB0aGlzLnBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuZ2V0VGFibGVQZXJtaXNzaW9ucyh0aGlzLm9hdHRyLCB0aGlzLmFjdFJvdXRlKTtcbiAgfVxuXG4gIGluaXRpYWxpemVMb2FkaW5nU3ViamVjdCgpIHtcbiAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNldExvYWRpbmcodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJDbGlja0xpc3RlbmVyKCkge1xuICAgIGlmICh0aGlzLmNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24gPSB0aGlzLmNsaWNrU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuY2xpY2tEZWxheSkpIC8vIEVzcGVyYSBlbCB0aWVtcG8gY29uZmlndXJhZG8gYW50ZXMgZGUgZWplY3V0YXJcbiAgICAgIC5zdWJzY3JpYmUoKHsgcm93LCBjb2x1bW4sIGNlbGxSZWYsIHJvd0luZGV4LCBldmVudCB9KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm9lbmFibGVkICYmICF0aGlzLnJlYWRPbmx5ICYmIGNvbHVtbi5lZGl0b3JcbiAgICAgICAgICAmJiAodGhpcy5kZXRhaWxNb2RlICE9PSBDb2Rlcy5ERVRBSUxfTU9ERV9DTElDSylcbiAgICAgICAgICAmJiAodGhpcy5lZGl0aW9uTW9kZSA9PT0gQ29kZXMuRURJVElPTl9NT0RFX0NMSUNLKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZhdGVDb2x1bW5FZGl0aW9uKGNvbHVtbiwgcm93LCBjZWxsUmVmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRvSGFuZGxlQ2xpY2socm93LCBjb2x1bW4uYXR0ciwgcm93SW5kZXgsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJEYmxDbGlja0xpc3RlbmVyKCkge1xuICAgIGlmICh0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRiQ2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5kYkNsaWNrU3ViamVjdFN1YnNjcmlwdGlvbiA9IHRoaXMuZGJsY2xpY2tTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5jbGlja0RlbGF5KSkgLy8gRXNwZXJhIGVsIHRpZW1wbyBjb25maWd1cmFkbyBhbnRlcyBkZSBlamVjdXRhclxuICAgICAgLnN1YnNjcmliZSgoeyByb3csIGNvbHVtbiwgY2VsbFJlZiwgcm93SW5kZXgsIGV2ZW50IH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgICBpZiAodGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vZW5hYmxlZCAmJiBjb2x1bW4uZWRpdG9yXG4gICAgICAgICAgJiYgKCFDb2Rlcy5pc0RvdWJsZUNsaWNrTW9kZSh0aGlzLmRldGFpbE1vZGUpKVxuICAgICAgICAgICYmIChDb2Rlcy5pc0RvdWJsZUNsaWNrTW9kZSh0aGlzLmVkaXRpb25Nb2RlKSkpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlQ29sdW1uRWRpdGlvbihjb2x1bW4sIHJvdywgY2VsbFJlZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRvdWJsZUNsaWNrLmVtaXQoeyByb3c6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4LCBtb3VzZUV2ZW50OiBldmVudCwgY29sdW1uTmFtZTogY29sdW1uLmF0dHIsIGNlbGw6IHJvd1tjb2x1bW4uYXR0cl0gfSk7XG4gICAgICAgICAgaWYgKHRoaXMub2VuYWJsZWQgJiYgQ29kZXMuaXNEb3VibGVDbGlja01vZGUodGhpcy5kZXRhaWxNb2RlKSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlRGF0YU5hdmlnYXRpb25JbkxvY2FsU3RvcmFnZSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGV0YWlsKHJvdyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVEYW8oKSB7XG4gICAgLy8gQ29uZmlndXJlIGRhbyBtZXRob2RzXG4gICAgY29uc3QgcXVlcnlNZXRob2ROYW1lID0gdGhpcy5wYWdlYWJsZSA/IHRoaXMucGFnaW5hdGVkUXVlcnlNZXRob2QgOiB0aGlzLnF1ZXJ5TWV0aG9kO1xuICAgIGNvbnN0IG1ldGhvZHMgPSB7XG4gICAgICBxdWVyeTogcXVlcnlNZXRob2ROYW1lLFxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZU1ldGhvZCxcbiAgICAgIGRlbGV0ZTogdGhpcy5kZWxldGVNZXRob2QsXG4gICAgICBpbnNlcnQ6IHRoaXMuaW5zZXJ0TWV0aG9kXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnN0YXRpY0RhdGEpIHtcbiAgICAgIHRoaXMucXVlcnlPbkJpbmQgPSBmYWxzZTtcbiAgICAgIHRoaXMucXVlcnlPbkluaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGFvVGFibGUgPSBuZXcgT1RhYmxlRGFvKHVuZGVmaW5lZCwgdGhpcy5lbnRpdHksIG1ldGhvZHMpO1xuICAgICAgdGhpcy5zZXREYXRhQXJyYXkodGhpcy5zdGF0aWNEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWd1cmVTZXJ2aWNlKCk7XG4gICAgICB0aGlzLmRhb1RhYmxlID0gbmV3IE9UYWJsZURhbyh0aGlzLmRhdGFTZXJ2aWNlLCB0aGlzLmVudGl0eSwgbWV0aG9kcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHJlaW5pdGlhbGl6ZSB0YWJsZSBhZGRpbmcgb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgcmVpbml0aWFsaXplKG9wdGlvbnM6IE9UYWJsZUluaXRpYWxpemF0aW9uT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBjb25zdCBjbG9uZWRPcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnZW50aXR5JykpIHtcbiAgICAgICAgdGhpcy5lbnRpdHkgPSBjbG9uZWRPcHRzLmVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdzZXJ2aWNlJykpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gY2xvbmVkT3B0cy5zZXJ2aWNlO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2NvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBjbG9uZWRPcHRzLmNvbHVtbnM7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgndmlzaWJsZUNvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gY2xvbmVkT3B0cy52aXNpYmxlQ29sdW1ucztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmlzaWJsZUNvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLmRlZmF1bHRWaXNpYmxlQ29sdW1ucyA9IGNsb25lZE9wdHMuZGVmYXVsdFZpc2libGVDb2x1bW5zO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkoJ2tleXMnKSkge1xuICAgICAgICB0aGlzLmtleXMgPSBjbG9uZWRPcHRzLmtleXM7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnc29ydENvbHVtbnMnKSkge1xuICAgICAgICB0aGlzLnNvcnRDb2x1bW5zID0gY2xvbmVkT3B0cy5zb3J0Q29sdW1ucztcbiAgICAgIH1cbiAgICAgIGlmIChjbG9uZWRPcHRzLmhhc093blByb3BlcnR5KCdwYXJlbnRLZXlzJykpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRLZXlzID0gY2xvbmVkT3B0cy5wYXJlbnRLZXlzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyQ29sdW1ucycpKSB7XG4gICAgICAgIGlmICghdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5vVGFibGVDb2x1bW5zRmlsdGVyQ29tcG9uZW50ID0gbmV3IE9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQodGhpcy5pbmplY3RvciwgdGhpcyk7XG4gICAgICAgICAgdGhpcy5vVGFibGVNZW51Lm9uVmlzaWJsZUZpbHRlck9wdGlvbkNoYW5nZS5uZXh0KHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0KTtcbiAgICAgICAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1ucyA9IGNsb25lZE9wdHMuZmlsdGVyQ29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9UYWJsZUNvbHVtbnNGaWx0ZXJDb21wb25lbnQuY29sdW1ucyA9IHRoaXMuc2VhcmNoZWFibGVDb2x1bW5zLmpvaW4oXCI7XCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zdGF0ZS5yZXNldCh0aGlzLnBhZ2VhYmxlKTtcbiAgICBpZiAob3B0aW9ucz8uZGF0YSkge1xuICAgICAgdGhpcy5zZXREYXRhKG9wdGlvbnMuZGF0YS5kYXRhLCBvcHRpb25zLmRhdGE/LnNxbFR5cGVzKTtcbiAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbkluZm8ob3B0aW9ucy5kYXRhLmRhdGEpO1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDA7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy5wYWdpbmF0aW9uRGF0YSkge1xuICAgICAgdGhpcy5yZWluaXRpYWxpemVQYWdpbmF0aW9uSW5mbyhvcHRpb25zLnBhZ2luYXRpb25EYXRhKTtcbiAgICB9XG4gICAgdGhpcy5pbml0VGFibGVBZnRlclZpZXdJbml0KCk7XG4gICAgdGhpcy5vblJlaW5pdGlhbGl6ZS5lbWl0KG51bGwpO1xuICB9XG5cbiAgcmVpbml0aWFsaXplUGFnaW5hdGlvbkluZm8ocGFnaW5hdGlvbkRhdGE6IFBhZ2luYXRpb25EYXRhKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2luYXRpb25EYXRhLnBhZ2VOdW1iZXI7XG4gICAgdGhpcy5xdWVyeVJvd3MgPSBwYWdpbmF0aW9uRGF0YS5wYWdlU2l6ZTtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgaWYgKHBhZ2luYXRpb25EYXRhLnN0YXJ0UmVjb3JkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHRFbmRJbmRleCA9IHBhZ2luYXRpb25EYXRhLnN0YXJ0UmVjb3JkSW5kZXggKyAodGhpcy5nZXREYXRhQXJyYXkoKSA/IHRoaXMuZ2V0RGF0YUFycmF5KCkubGVuZ3RoIDogMCk7XG4gICAgICAgIHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQgPSByZXN1bHRFbmRJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmIChwYWdpbmF0aW9uRGF0YS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc3RhdGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXIgPSBwYWdpbmF0aW9uRGF0YS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSB0aGlzLnN0YXRlLnF1ZXJ5UmVjb3JkT2Zmc2V0ID09IDAgPyAwIDogdGhpcy5kYXRhU2VydmljZT8uZ2V0UGFnaW5hdGlvbkNvbnRleHQoKS5wYWdlTnVtYmVyO1xuICAgICAgc3VwZXIudXBkYXRlUGFnaW5hdGlvbkNvbnRleHQoeyBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyLCBvZmZzZXQ6IHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQsIHRvdGFsU2l6ZTogdGhpcy5zdGF0ZS50b3RhbFF1ZXJ5UmVjb3Jkc051bWJlciwgcGFnZVNpemU6IHRoaXMuc3RhdGUucXVlcnlSb3dzIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25Db250ZXh0KHsgdG90YWxTaXplOiB0aGlzLmdldERhdGFBcnJheSgpLmxlbmd0aCB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0VGFibGVBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMucGFyc2VWaXNpYmxlQ29sdW1ucygpO1xuICAgIHRoaXMucGFyc2VTZWFyY2hlYWJsZUNvbHVtbnMoKTtcbiAgICB0aGlzLnNldERhdGFzb3VyY2UoKTtcbiAgICB0aGlzLnBhcnNlR3JvdXBlZENvbHVtbnMoKTtcbiAgICB0aGlzLnBhcnNlR3JvdXBlZENvbHVtblR5cGVzKCk7XG4gICAgdGhpcy5wYXJzZVNvcnRDb2x1bW5zKCk7XG4gICAgdGhpcy5zZXRGaWx0ZXJzQ29uZmlndXJhdGlvbigpO1xuICAgIHRoaXMuYWRkRGVmYXVsdFJvd0J1dHRvbnMoKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVDb2x1bW5zR3JvdXBpbmdDb21wb25lbnQpKSB7XG4gICAgICB0aGlzLnNldEdyb3VwQ29sdW1ucyh0aGlzLm9UYWJsZUNvbHVtbnNHcm91cGluZ0NvbXBvbmVudC5jb2x1bW5zQXJyYXkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVyeU9uSW5pdCkge1xuICAgICAgdGhpcy5xdWVyeURhdGEoKTtcbiAgICB9XG4gIH1cbiAgcGFyc2VTZWFyY2hlYWJsZUNvbHVtbnMoKSB7XG4gICAgdGhpcy5zZWFyY2hlYWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2xBcnJheS5maWx0ZXIoY29sID0+IHtcbiAgICAgIGNvbnN0IG9Db2wgPSB0aGlzLmdldE9Db2x1bW4oY29sKTtcbiAgICAgIHJldHVybiBvQ29sICYmIG9Db2wuc2VhcmNoYWJsZTtcbiAgICB9KVxuXG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgaWYgKHRoaXMudGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudGFiR3JvdXBDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNvcnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UpIHtcbiAgICAgIHRoaXMub25SZW5kZXJlZERhdGFDaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjcm9sbFN0cmF0ZWd5KSB7XG4gICAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbGlja1N1YmplY3RTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2xpY2tTdWJqZWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGJDbGlja1N1YmplY3RTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGJDbGlja1N1YmplY3RTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm93Q2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvd0NoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9ucykuZm9yRWFjaChpZHggPT4ge1xuICAgICAgaWYgKHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9uc1tpZHhdKSB7XG4gICAgICAgIHRoaXMuYXN5bmNMb2FkU3Vic2NyaXB0aW9uc1tpZHhdLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5sb2FkaW5nU2VydmljZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU2VydmljZS5uZ09uRGVzdHJveT8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGRhdGUgc3RvcmUgbG9jYWxzdG9yYWdlLCBjYWxsIG9mIHRoZSBJTG9jYWxTdG9yYWdlXG4gICAqL1xuICBnZXREYXRhVG9TdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2UuZ2V0RGF0YVRvU3RvcmUoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyUXVpY2tGaWx0ZXIoYXJnOiBhbnkpIHtcbiAgICBjb25zdCBxdWlja0ZpbHRlciA9IChhcmcgYXMgT1RhYmxlUXVpY2tmaWx0ZXIpO1xuICAgIC8vIGZvcmNpbmcgcXVpY2tGaWx0ZXJDb21wb25lbnQgdG8gYmUgdW5kZWZpbmVkLCB0YWJsZSB1c2VzIG9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50XG4gICAgdGhpcy5xdWlja0ZpbHRlckNvbXBvbmVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50ID0gcXVpY2tGaWx0ZXI7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQpKSB7XG4gICAgICB0aGlzLm9UYWJsZVF1aWNrRmlsdGVyQ29tcG9uZW50LnNldFZhbHVlKHRoaXMuc3RhdGUucXVpY2tGaWx0ZXJWYWx1ZSwgZmFsc2UpO1xuICAgICAgdGhpcy5xdWlja0ZpbHRlclN1YnNjcmlwdGlvbiA9IHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQub25DaGFuZ2Uuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICAgIHRoaXMub25TZWFyY2guZW1pdCh2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJQYWdpbmF0aW9uKHZhbHVlOiBPVGFibGVQYWdpbmF0b3IpIHtcbiAgICB0aGlzLnBhZ2luYXRpb25Db250cm9scyA9IHRydWU7XG4gICAgdGhpcy5wYWdpbmF0b3IgPSB2YWx1ZTtcbiAgfVxuXG4gIHJlZ2lzdGVyQ29udGV4dE1lbnUodmFsdWU6IE9Db250ZXh0TWVudUNvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMudGFibGVDb250ZXh0TWVudSA9IHZhbHVlO1xuICAgIHRoaXMuY29udGV4dE1lbnVTdWJzY3JpcHRpb24gPSB0aGlzLnRhYmxlQ29udGV4dE1lbnUub25TaG93LnN1YnNjcmliZSgocGFyYW1zOiBJT0NvbnRleHRNZW51Q29udGV4dCkgPT4ge1xuICAgICAgcGFyYW1zLmNsYXNzID0gJ28tdGFibGUtY29udGV4dC1tZW51ICcgKyB0aGlzLnJvd0hlaWdodDtcbiAgICAgIGlmIChwYXJhbXMuZGF0YSAmJiAhdGhpcy5pc1Jvd1NlbGVjdGVkKHBhcmFtcy5kYXRhLnJvd1ZhbHVlKSkge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3cocGFyYW1zLmRhdGEucm93VmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJEZWZhdWx0Q29sdW1uKGNvbHVtbjogc3RyaW5nKSB7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMuZ2V0T0NvbHVtbihjb2x1bW4pKSkge1xuICAgICAgLy8gYSBkZWZhdWx0IGNvbHVtbiBkZWZpbml0aW9uIHRyeWluZyB0byByZXBsYWNlIGFuIGFscmVhZHkgZXhpc3RpbmcgZGVmaW5pdGlvblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb2xEZWY6IE9Db2x1bW4gPSB0aGlzLmNyZWF0ZU9Db2x1bW4oY29sdW1uLCB0aGlzKTtcbiAgICB0aGlzLnB1c2hPQ29sdW1uRGVmaW5pdGlvbihjb2xEZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIGFsbCBjb2x1bW5zIGFuZCBwcm9wZXJ0aWVzIGluIHZhciBjb2x1bW5zQXJyYXlcbiAgICogQHBhcmFtIGNvbHVtblxuICAgKi9cbiAgcmVnaXN0ZXJDb2x1bW4oY29sdW1uOiBPVGFibGVDb2x1bW5Db21wb25lbnQgfCBPVGFibGVDb2x1bW5DYWxjdWxhdGVkQ29tcG9uZW50IHwgYW55KSB7XG4gICAgY29uc3QgY29sdW1uQXR0ciA9ICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJykgPyBjb2x1bW4gOiBjb2x1bW4uYXR0cjtcbiAgICBjb25zdCBjb2x1bW5QZXJtaXNzaW9uczogT1Blcm1pc3Npb25zID0gdGhpcy5nZXRPQ29sdW1uUGVybWlzc2lvbnMoY29sdW1uQXR0cik7XG4gICAgaWYgKCFjb2x1bW5QZXJtaXNzaW9ucy52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRGVmYXVsdENvbHVtbihjb2x1bW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbkRlZiA9IHRoaXMuZ2V0T0NvbHVtbihjb2x1bW4uYXR0cik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNvbHVtbkRlZikgJiYgVXRpbC5pc0RlZmluZWQoY29sdW1uRGVmLmRlZmluaXRpb24pKSB7XG4gICAgICAvLyBhIG8tdGFibGUtY29sdW1uIGRlZmluaXRpb24gdHJ5aW5nIHRvIHJlcGxhY2UgYW4gYWxyZWFkeSBleGlzdGluZyBvLXRhYmxlLWNvbHVtbiBkZWZpbml0aW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sRGVmOiBPQ29sdW1uID0gdGhpcy5jcmVhdGVPQ29sdW1uKGNvbHVtbi5hdHRyLCB0aGlzLCBjb2x1bW4pO1xuICAgIGxldCBjb2x1bW5XaWR0aCA9IHRoaXMuZ2V0Q29sdW1uV2lkdGhGcm9tU3RhdGUoY29sRGVmKTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQoY29sdW1uV2lkdGgpKSB7XG4gICAgICBjb2xEZWYud2lkdGggPSBjb2x1bW5XaWR0aDtcbiAgICB9XG4gICAgaWYgKGNvbHVtbiAmJiAoY29sdW1uLmFzeW5jTG9hZCB8fCBjb2x1bW4udHlwZSA9PT0gJ2FjdGlvbicpKSB7XG4gICAgICB0aGlzLmF2b2lkUXVlcnlDb2x1bW5zLnB1c2goY29sdW1uLmF0dHIpO1xuICAgICAgaWYgKGNvbHVtbi5hc3luY0xvYWQpIHtcbiAgICAgICAgdGhpcy5hc3luY0xvYWRDb2x1bW5zLnB1c2goY29sdW1uLmF0dHIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnB1c2hPQ29sdW1uRGVmaW5pdGlvbihjb2xEZWYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHB1c2hPQ29sdW1uRGVmaW5pdGlvbihjb2xEZWY6IE9Db2x1bW4pIHtcbiAgICBjb2xEZWYudmlzaWJsZSA9ICh0aGlzLl92aXNpYmxlQ29sQXJyYXkuaW5kZXhPZihjb2xEZWYuYXR0cikgIT09IC0xKTtcbiAgICAvLyBGaW5kIGNvbHVtbiBkZWZpbml0aW9uIGJ5IG5hbWVcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RpbmcgPSB0aGlzLmdldE9Db2x1bW4oY29sRGVmLmF0dHIpO1xuICAgIGlmIChhbHJlYWR5RXhpc3RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVwbGFjaW5nSW5kZXggPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuaW5kZXhPZihhbHJlYWR5RXhpc3RpbmcpO1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zW3JlcGxhY2luZ0luZGV4XSA9IGNvbERlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnB1c2goY29sRGVmKTtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVDb2x1bW5zT3JkZXIoKTtcbiAgICB0aGlzLnJlZnJlc2hFZGl0aW9uTW9kZVdhcm4oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWZyZXNoRWRpdGlvbk1vZGVXYXJuKCkge1xuICAgIGlmICh0aGlzLmVkaXRpb25Nb2RlICE9PSBDb2Rlcy5FRElUSU9OX01PREVfTk9ORSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlZGl0YWJsZUNvbHVtbnMgPSB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiB7XG4gICAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQoY29sLmVkaXRvcik7XG4gICAgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoZWRpdGFibGVDb2x1bW5zLmxlbmd0aCA+IDAgJiYgIXRoaXMuaGFzSW5zZXJ0YWJsZVJvdygpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVXNpbmcgYSBjb2x1bW4gd2l0aCBhIGVkaXRvciBidXQgdGhlcmUgaXMgbm8gZWRpdGlvbi1tb2RlIGRlZmluZWQnKTtcbiAgICAgIH1cbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcmVnaXN0ZXJDb2x1bW5BZ2dyZWdhdGUoY29sdW1uOiBPQ29sdW1uQWdncmVnYXRlKSB7XG4gICAgdGhpcy5zaG93VG90YWxzU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIGNvbnN0IGFscmVhZHlFeGlzdGluZyA9IHRoaXMuZ2V0T0NvbHVtbihjb2x1bW4uYXR0cik7XG4gICAgaWYgKGFscmVhZHlFeGlzdGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByZXBsYWNpbmdJbmRleCA9IHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5pbmRleE9mKGFscmVhZHlFeGlzdGluZyk7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnNbcmVwbGFjaW5nSW5kZXhdLmFnZ3JlZ2F0ZSA9IGNvbHVtbjtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlclRhYmxlSGVhZGVycyh0YWJsZUhlYWRlcjogT1RhYmxlSGVhZGVyQ29tcG9uZW50KSB7XG4gICAgaWYgKHRoaXMudGFibGVIZWFkZXJzLmZpbmRJbmRleChoZWFkZXIgPT4gaGVhZGVyLmNvbHVtbi5hdHRyID09PSB0YWJsZUhlYWRlci5jb2x1bW4uYXR0cikgPT09IC0xKSB7XG4gICAgICB0aGlzLnRhYmxlSGVhZGVycy5wdXNoKHRhYmxlSGVhZGVyKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZVZpc2libGVDb2x1bW5zKGRlZmF1bHRDb25maWd1cmF0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5jb2x1bW5zRGlzcGxheSkge1xuXG4gICAgICAvLyBmaWx0ZXJpbmcgY29sdW1ucyB0aGF0IG1pZ2h0IGJlIGluIHN0YXRlIHN0b3JhZ2UgYnV0IG5vdCBpbiB0aGUgYWN0dWFsIHRhYmxlIGRlZmluaXRpb25cbiAgICAgIGxldCBzdGF0ZUNvbHM6IE9Db2x1bW5EaXNwbGF5W10gPSBbXTtcbiAgICAgIHRoaXMuc3RhdGUuY29sdW1uc0Rpc3BsYXkuZm9yRWFjaCgob0NvbCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlQ29sSW5Db2x1bW5zID0gdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5hdHRyID09PSBvQ29sLmF0dHIpICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGlzVmlzaWJsZUNvbEluQ29sdW1ucykge1xuICAgICAgICAgIHN0YXRlQ29scy5wdXNoKG9Db2wpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignVW5hYmxlIHRvIGxvYWQgdGhlIGNvbHVtbiAnICsgb0NvbC5hdHRyICsgJyBmcm9tIHRoZSBsb2NhbHN0b3JhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoZGVmYXVsdENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgc3RhdGVDb2xzID0gdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5jb2x1bW5zRGlzcGxheTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlQ29scyA9IHRoaXMuY2hlY2tDaGFuZ2VzVmlzaWJsZUNvbHVtbW5zSW5Jbml0aWFsQ29uZmlndXJhdGlvbihzdGF0ZUNvbHMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuc29ydCgoYTogT0NvbHVtbiwgYjogT0NvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBpbmRleEEgPSBzdGF0ZUNvbHMuZmluZEluZGV4KGNvbCA9PiBjb2wuYXR0ciA9PT0gYS5hdHRyKTtcbiAgICAgICAgY29uc3QgaW5kZXhCID0gc3RhdGVDb2xzLmZpbmRJbmRleChjb2wgPT4gY29sLmF0dHIgPT09IGIuYXR0cik7XG4gICAgICAgIHJldHVybiBpbmRleEEgLSBpbmRleEI7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudmlzaWJsZUNvbEFycmF5ID0gc3RhdGVDb2xzLmZpbHRlcihpdGVtID0+IGl0ZW0udmlzaWJsZSkubWFwKGl0ZW0gPT4gaXRlbS5hdHRyKTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICB0aGlzLnZpc2libGVDb2xBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLmRlZmF1bHRWaXNpYmxlQ29sdW1ucyA/IHRoaXMuZGVmYXVsdFZpc2libGVDb2x1bW5zIDogdGhpcy52aXNpYmxlQ29sdW1ucywgdHJ1ZSk7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuc29ydCgoYTogT0NvbHVtbiwgYjogT0NvbHVtbikgPT4gdGhpcy52aXNpYmxlQ29sQXJyYXkuaW5kZXhPZihhLmF0dHIpIC0gdGhpcy52aXNpYmxlQ29sQXJyYXkuaW5kZXhPZihiLmF0dHIpKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0NoYW5nZXNWaXNpYmxlQ29sdW1tbnNJbkluaXRpYWxDb25maWd1cmF0aW9uKHN0YXRlQ29sczogT0NvbHVtbkRpc3BsYXlbXSk6IE9Db2x1bW5EaXNwbGF5W10ge1xuICAgIGlmICghdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5jb2x1bW5zRGlzcGxheSkge1xuICAgICAgcmV0dXJuIHN0YXRlQ29scztcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBvcmlnaW5hbCB2aXNpYmxlIGNvbHVtbnMgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICBjb25zdCBvcmlnaW5hbFZpc2libGVDb2xBcnJheSA9XG4gICAgICB0aGlzLnN0YXRlLmluaXRpYWxDb25maWd1cmF0aW9uLmNvbHVtbnNEaXNwbGF5LmZpbHRlcih4ID0+IHgudmlzaWJsZSkubWFwKHggPT4geC5hdHRyKTtcblxuICAgIGNvbnN0IGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy52aXNpYmxlQ29sdW1ucywgdHJ1ZSk7XG5cbiAgICAvLyBGaW5kIHZhbHVlcyBpbiB2aXNpYmxlLWNvbHVtbnMgdGhhdCB0aGV5IGFyZW50IGluIG9yaWdpbmFsLXZpc2libGUtY29sdW1ucyBpbiBsb2NhbHN0b3JhZ2VcbiAgICAvLyBpbiB0aGlzIGNhc2UgeW91IGhhdmUgdG8gYWRkIHRoaXMgY29sdW1uIHRvIHRoaXMudmlzaWJsZUNvbEFycmF5XG4gICAgY29uc3QgY29sVG9BZGRJblZpc2libGVDb2wgPSBVdGlsLmRpZmZlcmVuY2VBcnJheXMoY3VycmVudFZpc2libGVDb2xBcnJheSwgb3JpZ2luYWxWaXNpYmxlQ29sQXJyYXkpO1xuICAgIGZvciAoY29uc3QgbmV3Q29sQXR0ciBvZiBjb2xUb0FkZEluVmlzaWJsZUNvbCkge1xuICAgICAgY29uc3QgY29sdW1uRXhpc3RzID0gdGhpcy5fb1RhYmxlT3B0aW9ucy5jb2x1bW5zLnNvbWUoY29sID0+IGNvbC5hdHRyID09PSBuZXdDb2xBdHRyKTtcblxuICAgICAgaWYgKGNvbHVtbkV4aXN0cykge1xuICAgICAgICBsZXQgaW5kZXhDb2wgPSBzdGF0ZUNvbHMuZmluZEluZGV4KGNvbCA9PiBjb2wuYXR0ciA9PT0gbmV3Q29sQXR0cik7XG4gICAgICAgIGlmIChpbmRleENvbCA+IC0xKSB7XG4gICAgICAgICAgc3RhdGVDb2xzW2luZGV4Q29sXS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgY29sdW1uIGRvZXMgbm90IGV4aXN0IGluIHRoZSBzdGF0ZSwgYWRkIGl0IGFzIHZpc2libGVcbiAgICAgICAgICBzdGF0ZUNvbHMucHVzaCh7XG4gICAgICAgICAgICBhdHRyOiBuZXdDb2xBdHRyLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdpZHRoOiB1bmRlZmluZWRcbiAgICAgICAgICB9IGFzIE9Db2x1bW5EaXNwbGF5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhdGVDb2xzLnNvcnQoKGE6IE9Db2x1bW4sIGI6IE9Db2x1bW4pID0+IGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkuaW5kZXhPZihhLmF0dHIpIC0gY3VycmVudFZpc2libGVDb2xBcnJheS5pbmRleE9mKGIuYXR0cikpO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdmFsdWVzIGluIG9yaWdpbmFsLXZpc2libGUtY29sdW1ucyBpbiBsb2NhbHN0b3JhZ2UgdGhhdCB0aGV5IGFyZW50IGluIHRoaXMudmlzaWJsZUNvbEFycmF5XG4gICAgLy8gaW4gdGhpcyBjYXNlIHlvdSBoYXZlIHRvIGRlbGV0ZSB0aGlzIGNvbHVtbiB0byB0aGlzLnZpc2libGVDb2xBcnJheVxuICAgIGNvbnN0IGNvbFRvRGVsZXRlSW5WaXNpYmxlQ29sID0gVXRpbC5kaWZmZXJlbmNlQXJyYXlzKG9yaWdpbmFsVmlzaWJsZUNvbEFycmF5LCBjdXJyZW50VmlzaWJsZUNvbEFycmF5KTtcbiAgICBpZiAoY29sVG9EZWxldGVJblZpc2libGVDb2wubGVuZ3RoID4gMCkge1xuICAgICAgc3RhdGVDb2xzID0gc3RhdGVDb2xzLmZpbHRlcihjb2wgPT4gY29sVG9EZWxldGVJblZpc2libGVDb2wuaW5kZXhPZihjb2wuYXR0cikgPT09IC0xKTtcbiAgICB9XG5cbiAgICAvL0lmIHRoZSBjb2x1bW5zIGluIG9yaWdpbmFsVmlzaWJsZUNvbEFycmF5IGhhcyBjaGFuZ2VkIHRoZSBzb3J0aW5nXG4gICAgY29uc3QgY2hhbmdlU29ydFZpc2libGVDb2x1bW5zID0gSlNPTi5zdHJpbmdpZnkoY3VycmVudFZpc2libGVDb2xBcnJheSkgIT09IEpTT04uc3RyaW5naWZ5KG9yaWdpbmFsVmlzaWJsZUNvbEFycmF5KTtcbiAgICBpZiAoY2hhbmdlU29ydFZpc2libGVDb2x1bW5zICYmIGN1cnJlbnRWaXNpYmxlQ29sQXJyYXkubGVuZ3RoID09PSBvcmlnaW5hbFZpc2libGVDb2xBcnJheS5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgW3RvSW5kZXgsIGNvbF0gb2YgY3VycmVudFZpc2libGVDb2xBcnJheS5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgZnJvbUluZGV4VG9DaGFuZ2UgPSBzdGF0ZUNvbHMuZmluZEluZGV4KHN0YXRlQ29sID0+IHN0YXRlQ29sLmF0dHIgPT09IGNvbCk7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheShzdGF0ZUNvbHMsIGZyb21JbmRleFRvQ2hhbmdlLCB0b0luZGV4KTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZUNvbHM7XG4gIH1cblxuICBwYXJzZVNvcnRDb2x1bW5zKCkge1xuICAgIGNvbnN0IHNvcnRDb2x1bW5zUGFyYW0gPSB0aGlzLnN0YXRlLnNvcnRDb2x1bW5zIHx8IHRoaXMuc29ydENvbHVtbnM7XG4gICAgdGhpcy5zb3J0Q29sQXJyYXkgPSBTZXJ2aWNlVXRpbHMucGFyc2VTb3J0Q29sdW1ucyhzb3J0Q29sdW1uc1BhcmFtKTtcblxuICAgIC8vIGNoZWNraW5nIHRoZSBvcmlnaW5hbCBzb3J0IGNvbHVtbnMgd2l0aCB0aGUgc29ydCBjb2x1bW5zIGluIGluaXRpYWwgY29uZmlndXJhdGlvbiBpbiBsb2NhbCBzdG9yYWdlXG4gICAgaWYgKHRoaXMuc3RhdGUuc29ydENvbHVtbnMgJiYgdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5zb3J0Q29sdW1ucykge1xuXG4gICAgICBjb25zdCBpbml0aWFsQ29uZmlnU29ydENvbHVtbnNBcnJheSA9IFNlcnZpY2VVdGlscy5wYXJzZVNvcnRDb2x1bW5zKHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24uc29ydENvbHVtbnMpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxTb3J0Q29sdW1uc0FycmF5ID0gU2VydmljZVV0aWxzLnBhcnNlU29ydENvbHVtbnModGhpcy5zb3J0Q29sdW1ucyk7XG4gICAgICAvLyBGaW5kIHZhbHVlcyBpbiB2aXNpYmxlLWNvbHVtbnMgdGhhdCB0aGV5IGFyZW50IGluIG9yaWdpbmFsLXZpc2libGUtY29sdW1ucyBpbiBsb2NhbHN0b3JhZ2VcbiAgICAgIC8vIGluIHRoaXMgY2FzZSB5b3UgaGF2ZSB0byBhZGQgdGhpcyBjb2x1bW4gdG8gdGhpcy52aXNpYmxlQ29sQXJyYXlcbiAgICAgIGNvbnN0IGNvbFRvQWRkSW5WaXNpYmxlQ29sID0gVXRpbC5kaWZmZXJlbmNlQXJyYXlzKG9yaWdpbmFsU29ydENvbHVtbnNBcnJheSwgaW5pdGlhbENvbmZpZ1NvcnRDb2x1bW5zQXJyYXkpO1xuICAgICAgaWYgKGNvbFRvQWRkSW5WaXNpYmxlQ29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29sVG9BZGRJblZpc2libGVDb2wuZm9yRWFjaChjb2xBZGQgPT4ge1xuICAgICAgICAgIHRoaXMuc29ydENvbEFycmF5LnB1c2goY29sQWRkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbFRvRGVsSW5WaXNpYmxlQ29sID0gVXRpbC5kaWZmZXJlbmNlQXJyYXlzKGluaXRpYWxDb25maWdTb3J0Q29sdW1uc0FycmF5LCBvcmlnaW5hbFNvcnRDb2x1bW5zQXJyYXkpO1xuICAgICAgaWYgKGNvbFRvRGVsSW5WaXNpYmxlQ29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29sVG9EZWxJblZpc2libGVDb2wuZm9yRWFjaCgoY29sRGVsKSA9PiB7XG4gICAgICAgICAgdGhpcy5zb3J0Q29sQXJyYXkuZm9yRWFjaCgoY29sLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sLmNvbHVtbk5hbWUgPT09IGNvbERlbC5jb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICAgIHRoaXMuc29ydENvbEFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW5zdXJpbmcgY29sdW1uIGV4aXN0ZW5jZSBhbmQgY2hlY2tpbmcgaXRzIG9yZGVyYWJsZSBzdGF0ZVxuICAgIGZvciAobGV0IGkgPSB0aGlzLnNvcnRDb2xBcnJheS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgY29sTmFtZSA9IHRoaXMuc29ydENvbEFycmF5W2ldLmNvbHVtbk5hbWU7XG4gICAgICBjb25zdCBvQ29sID0gdGhpcy5nZXRPQ29sdW1uKGNvbE5hbWUpO1xuICAgICAgaWYgKCFVdGlsLmlzRGVmaW5lZChvQ29sKSB8fCAhb0NvbC5vcmRlcmFibGUpIHtcbiAgICAgICAgdGhpcy5zb3J0Q29sQXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgcHJvdGVjdGVkIGVuc3VyZUNvbHVtbnNPcmRlcigpIHtcblxuICAgIGxldCBjb2x1bW5zT3JkZXIgPSBbXTtcbiAgICBpZiAodGhpcy5zdGF0ZS5jb2x1bW5zRGlzcGxheSkge1xuICAgICAgY29sdW1uc09yZGVyID0gdGhpcy5zdGF0ZS5jb2x1bW5zRGlzcGxheS5tYXAoaXRlbSA9PiBpdGVtLmF0dHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2x1bW5zT3JkZXIgPSB0aGlzLmNvbEFycmF5LmZpbHRlcihhdHRyID0+IHRoaXMudmlzaWJsZUNvbEFycmF5LmluZGV4T2YoYXR0cikgPT09IC0xKTtcbiAgICAgIGNvbHVtbnNPcmRlci5wdXNoKC4uLnRoaXMudmlzaWJsZUNvbEFycmF5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmNvbHVtbnMuc29ydCgoYTogT0NvbHVtbiwgYjogT0NvbHVtbikgPT4ge1xuICAgICAgaWYgKGNvbHVtbnNPcmRlci5pbmRleE9mKGEuYXR0cikgPT09IC0xKSB7XG4gICAgICAgIC8vIGlmIGl0IGlzIG5vdCBpbiBsb2NhbCBzdG9yYWdlIGJlY2F1c2UgaXQgaXMgbmV3LCBrZWVwIG9yZGVyXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnNPcmRlci5pbmRleE9mKGEuYXR0cikgLSBjb2x1bW5zT3JkZXIuaW5kZXhPZihiLmF0dHIpO1xuICAgICAgfVxuICAgIH0pO1xuXG5cbiAgfVxuXG4gIGluaXRpYWxpemVQYXJhbXMoKTogdm9pZCB7XG4gICAgLy8gSWYgdmlzaWJsZS1jb2x1bW5zIGlzIG5vdCBwcmVzZW50IHRoZW4gdmlzaWJsZS1jb2x1bW5zIGlzIGFsbCBjb2x1bW5zXG4gICAgaWYgKCF0aGlzLnZpc2libGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb2xBcnJheS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29sQXJyYXkuZm9yRWFjaCgoeDogc3RyaW5nKSA9PiB0aGlzLnJlZ2lzdGVyQ29sdW1uKHgpKTtcbiAgICAgIHRoaXMuZW5zdXJlQ29sdW1uc09yZGVyKCk7XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgcXVpY2tGaWx0ZXJcbiAgICB0aGlzLl9vVGFibGVPcHRpb25zLmZpbHRlciA9IHRoaXMucXVpY2tGaWx0ZXI7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5jdXJyZW50UGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuc3RhdGUuY3VycmVudFBhZ2U7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBwYWdpbmF0b3JcbiAgICBpZiAoIXRoaXMucGFnaW5hdG9yICYmIHRoaXMucGFnaW5hdGlvbkNvbnRyb2xzKSB7XG4gICAgICB0aGlzLnBhZ2luYXRvciA9IG5ldyBPQmFzZVRhYmxlUGFnaW5hdG9yKCk7XG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSA9IHRoaXMucXVlcnlSb3dzO1xuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnNob3dGaXJzdExhc3RCdXR0b25zID0gdGhpcy5zaG93UGFnaW5hdG9yRmlyc3RMYXN0QnV0dG9ucztcbiAgICB9XG5cbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHRoaXMuc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlKSkge1xuICAgICAgdGhpcy5fb1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZSA9ICEhdGhpcy5zdGF0ZS5zZWxlY3RDb2x1bW5WaXNpYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjaGVja2luZyB0aGUgb3JpZ2luYWwgc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlIHdpdGggc2VsZWN0LWNvbHVtbi12aXNpYmxlIGluIGluaXRpYWwgY29uZmlndXJhdGlvbiBpbiBsb2NhbCBzdG9yYWdlXG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5zZWxlY3RDb2x1bW5WaXNpYmxlKVxuICAgICAgICAmJiB0aGlzLnNlbGVjdEFsbENoZWNrYm94VmlzaWJsZSA9PT0gdGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5zZWxlY3RDb2x1bW5WaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGUgPSAhIXRoaXMuc3RhdGUuc2VsZWN0Q29sdW1uVmlzaWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGUgPSB0aGlzLnNlbGVjdEFsbENoZWNrYm94VmlzaWJsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL0luaXRpYWxpemUgc2hvdyBmaWx0ZXIgYnkgY29sdW1uIGljb25cbiAgICB0aGlzLmlzQ29sdW1uRmlsdGVyc0FjdGl2ZSA9IHRoaXMuZmlsdGVyQ29sdW1uQWN0aXZlQnlEZWZhdWx0O1xuXG4gICAgdGhpcy5pbml0aWFsaXplQ2hlY2tib3hDb2x1bW4oKTtcblxuICAgIGlmICh0aGlzLnN0b3JlU3RhdGUpIHtcbiAgICAgIC8vIGlmIHF1ZXJ5LXJvd3MgaW4gaW5pdGlhbCBjb25maWd1cmF0aW9uIGlzIGVxdWFscyB0byBvcmlnaW5hbCBxdWVyeS1yb3dzIGlucHV0XG4gICAgICAvLyBxdWVyeV9yb3dzIHdpbGwgYmUgdGhlIHZhbHVlIGluIGxvY2FsIHN0b3JhZ2VcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnN0YXRlLnF1ZXJ5Um93cykgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5zdGF0ZS5pbml0aWFsQ29uZmlndXJhdGlvbi5xdWVyeVJvd3MpXG4gICAgICAgICYmIHRoaXMuc3RhdGUuaW5pdGlhbENvbmZpZ3VyYXRpb24ucXVlcnlSb3dzID09PSB0aGlzLm9yaWdpbmFsUXVlcnlSb3dzKSB7XG4gICAgICAgIHRoaXMucXVlcnlSb3dzID0gdGhpcy5zdGF0ZS5xdWVyeVJvd3M7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHRoaXMuX3NlbGVjdGlvbikpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRoaXMuaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKSwgW10sIHRydWUsIHRoaXMuY29tcGFyZVJvdygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbjtcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlRXhwYW5kZWRDb2x1bW4oKSB7XG4gICAgaWYgKCF0aGlzLnRhYmxlUm93RXhwYW5kYWJsZT8uZXhwYW5kYWJsZUNvbHVtblZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1uc1swXSA9PT0gQ29kZXMuTkFNRV9DT0xVTU5fU0VMRUNUICYmXG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zWzFdICE9PSBDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFKSB7XG4gICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLnNwbGljZSgxLCAwLCBDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnNbMF0gIT09IENvZGVzLk5BTUVfQ09MVU1OX0VYUEFOREFCTEUpIHtcbiAgICAgIHRoaXMuX29UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnMudW5zaGlmdChDb2Rlcy5OQU1FX0NPTFVNTl9FWFBBTkRBQkxFKTtcbiAgICB9XG5cbiAgfVxuXG4gIHJlZ2lzdGVyVGFiTGlzdGVuZXIoKSB7XG4gICAgLy8gV2hlbiB0YWJsZSBpcyBjb250YWluZWQgaW50byB0YWIgY29tcG9uZW50LCBpdCBpcyBuZWNlc3NhcnkgdG8gaW5pdCB0YWJsZSBjb21wb25lbnQgd2hlbiBhdHRhY2hlZCB0byBET00uXG4gICAgdGhpcy50YWJHcm91cENoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMudGFiR3JvdXBDb250YWluZXIuc2VsZWN0ZWRUYWJDaGFuZ2Uuc3Vic2NyaWJlKChldnQpID0+IHtcbiAgICAgIGxldCBpbnRlcnZhbDtcbiAgICAgIGNvbnN0IHRpbWVyQ2FsbGJhY2sgPSAodGFiOiBNYXRUYWIpID0+IHtcbiAgICAgICAgaWYgKHRhYiAmJiB0YWIuY29udGVudC5pc0F0dGFjaGVkKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgaWYgKHRhYiA9PT0gdGhpcy50YWJDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zaWRlVGFiQnVnV29ya2Fyb3VuZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ1F1ZXJ5KSB7XG4gICAgICAgICAgICAgIHRoaXMucXVlcnlEYXRhKHRoaXMucGVuZGluZ1F1ZXJ5RmlsdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHsgdGltZXJDYWxsYmFjayhldnQudGFiKTsgfSwgMTAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbnNpZGVUYWJCdWdXb3JrYXJvdW5kKCkge1xuICAgIHRoaXMucmVmcmVzaFNvcnRIZWFkZXJzKCk7XG4gIH1cblxuICByZWdpc3RlclNvcnRMaXN0ZW5lcigpIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5zb3J0KSkge1xuICAgICAgdGhpcy5zb3J0U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5zb3J0U3Vic2NyaXB0aW9uID0gdGhpcy5zb3J0Lm9Tb3J0Q2hhbmdlLnN1YnNjcmliZSh0aGlzLmhhbmRsZVNvcnRDaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLnNvcnQuc2V0TXVsdGlwbGVTb3J0KHRoaXMubXVsdGlwbGVTb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlU29ydENoYW5nZShzb3J0QXJyYXk6IGFueVtdKSB7XG4gICAgdGhpcy5zb3J0Q29sQXJyYXkgPSBbXTtcbiAgICBzb3J0QXJyYXkuZm9yRWFjaCgoc29ydCkgPT4ge1xuICAgICAgaWYgKHNvcnQuZGlyZWN0aW9uICE9PSAnJykge1xuICAgICAgICB0aGlzLnNvcnRDb2xBcnJheS5wdXNoKHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiBzb3J0LmlkLFxuICAgICAgICAgIGFzY2VuZGVudDogc29ydC5kaXJlY3Rpb24gPT09IENvZGVzLkFTQ19TT1JUXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMub25Tb3J0Q2hhbmdlLmVtaXQodGhpcy5zb3J0Q29sQXJyYXkpO1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICB0aGlzLnJlbG9hZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBzZXREYXRhc291cmNlKCkge1xuICAgIC8vRGVsZXRlZCBwcmV2aW91cyBpbnN0YW5jZSBhbmQgc3Vic2NyaWJlcnNcbiAgICBkZWxldGUgdGhpcy5kYXRhU291cmNlO1xuICAgIGlmICh0aGlzLm9uUmVuZGVyZWREYXRhQ2hhbmdlKSB0aGlzLm9uUmVuZGVyZWREYXRhQ2hhbmdlLnVuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9UYWJsZURhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlU2VydmljZS5nZXRJbnN0YW5jZSh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyRGF0YVNvdXJjZUxpc3RlbmVycygpO1xuICAgIHRoaXMucmVnaXN0ZXJTb3J0TGlzdGVuZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlckRhdGFTb3VyY2VMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5vblJlbmRlcmVkRGF0YUNoYW5nZSA9IHRoaXMuZGF0YVNvdXJjZS5vblJlbmRlcmVkRGF0YUNoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5zdG9wRWRpdGlvbigpO1xuICAgICAgdGhpcy5jaGVja1NlbGVjdGVkSXRlbURhdGEoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFeHBhbmRlZFJvd0NvbnRhaW5lckNsYXNzKHJvd0luZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBPVGFibGVDb21wb25lbnQuRVhQQU5ERURfUk9XX0NPTlRBSU5FUl9DTEFTUyArIHJvd0luZGV4O1xuICB9XG5cbiAgcHVibGljIGdldEV4cGFuZGFibGVJdGVtcygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kYWJsZUl0ZW0uc2VsZWN0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBleHBhbmRhYmxlIHJvdy5cbiAgICogQHBhcmFtIGl0ZW1cbiAgICogQHBhcmFtIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlUm93RXhwYW5kYWJsZShpdGVtOiBhbnksIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4cGFuZGFibGVJdGVtLnRvZ2dsZShpdGVtKTtcbiAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuZ2V0VmFsdWUoKS5maW5kSW5kZXgoKHJvdykgPT4gdGhpcy5rZXlzQXJyYXkuZXZlcnkoa2V5ID0+IHJvd1trZXldID09PSBpdGVtW2tleV0pKTtcblxuICAgIGlmICh0aGlzLnBvcnRhbEhvc3Rbcm93SW5kZXhdKSB7XG4gICAgICB0aGlzLnBvcnRhbEhvc3Rbcm93SW5kZXhdLmRldGFjaCgpO1xuICAgIH1cbiAgICBjb25zdCBpc0NvbGxhcHNlZCA9IHRoaXMuZ2V0U3RhdGVFeHBhbmQoaXRlbSkgPT09ICdjb2xsYXBzZWQnO1xuICAgIGNvbnN0IGV2ZW50VGFibGVSb3dFeHBhbmRhYmxlQ2hhbmdlID0gdGhpcy5lbWl0VGFibGVSb3dFeHBhbmRhYmxlQ2hhbmdlRXZlbnQoaXRlbSwgcm93SW5kZXgpO1xuICAgIGlmIChpc0NvbGxhcHNlZCkge1xuICAgICAgdGhpcy50YWJsZVJvd0V4cGFuZGFibGUub25Db2xsYXBzZWQuZW1pdChldmVudFRhYmxlUm93RXhwYW5kYWJsZUNoYW5nZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLicgKyB0aGlzLmdldEV4cGFuZGVkUm93Q29udGFpbmVyQ2xhc3Mocm93SW5kZXgpKTtcbiAgICAgIHRoaXMucG9ydGFsSG9zdFtyb3dJbmRleF0gPSBuZXcgRG9tUG9ydGFsT3V0bGV0KFxuICAgICAgICBjb250YWluZXJFbGVtZW50LFxuICAgICAgICBudWxsLFxuICAgICAgICB0aGlzLmFwcFJlZixcbiAgICAgICAgdGhpcy5pbmplY3RvclxuICAgICAgKTtcblxuICAgICAgY29uc3QgdGVtcGxhdGVQb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy50YWJsZVJvd0V4cGFuZGFibGUudGVtcGxhdGVSZWYsIHRoaXMuX3ZpZXdDb250YWluZXJSZWYsIHsgJGltcGxpY2l0OiBpdGVtIH0pO1xuICAgICAgdGhpcy5wb3J0YWxIb3N0W3Jvd0luZGV4XS5hdHRhY2hUZW1wbGF0ZVBvcnRhbCh0ZW1wbGF0ZVBvcnRhbCk7XG4gICAgICB0aGlzLnRhYmxlUm93RXhwYW5kYWJsZS5vbkV4cGFuZGVkLmVtaXQoZXZlbnRUYWJsZVJvd0V4cGFuZGFibGVDaGFuZ2UpO1xuICAgIH1cblxuICB9XG5cbiAgc2F2ZVJvd0V4cGFuZFN0YXRlKGFkZGVkOiBhbnlbXSwgcmVtb3ZlZDogYW55W10pIHtcbiAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlLmV4cGFuZGFibGVSb3dzID8/IFtdO1xuXG4gICAgY29uc3QgZXh0cmFjdEtleXMgPSAoaXRlbTogYW55KSA9PlxuICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGl0ZW0pLmZpbHRlcigoW2tleV0pID0+IHRoaXMua2V5c0FycmF5LmluY2x1ZGVzKGtleSkpKTtcblxuICAgIGNvbnN0IGlzU2FtZVJvdyA9IHRoaXMuY29tcGFyZVJvdygpO1xuXG4gICAgLy8gQWRkIGV4cGFuZGFibGUgaXRlbXNcbiAgICBpZiAoYWRkZWQ/Lmxlbmd0aCkge1xuICAgICAgYWRkZWQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3Qgcm93SW5kZXggPSB0aGlzLmdldFZhbHVlKCkuZmluZEluZGV4KHJvdyA9PiBpc1NhbWVSb3cocm93LCBpdGVtKSk7XG4gICAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBzdGF0ZS5zb21lKHN0YXRlSXRlbSA9PiBpc1NhbWVSb3coc3RhdGVJdGVtLmtleXMsIGl0ZW0pKTtcblxuICAgICAgICBpZiAocm93SW5kZXggIT09IC0xICYmICFhbHJlYWR5RXhpc3RzKSB7XG4gICAgICAgICAgc3RhdGUucHVzaCh7IGtleXM6IGV4dHJhY3RLZXlzKGl0ZW0pIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgZXhwYW5kYWJsZSBpdGVtc1xuICAgIGlmIChyZW1vdmVkPy5sZW5ndGgpIHtcbiAgICAgIHJlbW92ZWQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXhUb1JlbW92ZSA9IHN0YXRlLmZpbmRJbmRleChzdGF0ZUl0ZW0gPT4gaXNTYW1lUm93KHN0YXRlSXRlbS5rZXlzLCBpdGVtKSk7XG4gICAgICAgIGlmIChpbmRleFRvUmVtb3ZlICE9PSAtMSkge1xuICAgICAgICAgIHN0YXRlLnNwbGljZShpbmRleFRvUmVtb3ZlLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS5leHBhbmRhYmxlUm93cyA9IHN0YXRlO1xuICB9XG5cbiAgZGVzdHJveUFsbFBvcnRhbEhvc3RzKCk6IHZvaWQge1xuICAgIHRoaXMucG9ydGFsSG9zdC5mb3JFYWNoKGhvc3QgPT4ge1xuICAgICAgaWYgKGhvc3QuaGFzQXR0YWNoZWQoKSkge1xuICAgICAgICBob3N0LmRldGFjaCgpOyAgIC8vIERldGFjaCB0aGUgcG9ydGFsIGNvbnRlbnRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHJvdyBleHBhbmRhYmxlIGJ5IHJvdyBpbmRleFxuICAgKiBAcGFyYW0gcm93SW5kZXhcbiAgICogQHBhcmFtIFtldmVudF1cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVSb3dFeHBhbmRhYmxlQnlSb3dJbmRleChyb3dJbmRleDogbnVtYmVyLCBldmVudD86IEV2ZW50KSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0VmFsdWUoKVtyb3dJbmRleF07XG4gICAgdGhpcy50b2dnbGVSb3dFeHBhbmRhYmxlKGl0ZW0sIGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFRhYmxlUm93RXhwYW5kYWJsZUNoYW5nZUV2ZW50KGRhdGEsIHJvd0luZGV4KSB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgT1RhYmxlUm93RXhwYW5kZWRDaGFuZ2UoKTtcbiAgICBldmVudC5yb3dJbmRleCA9IHJvd0luZGV4O1xuICAgIGV2ZW50LmRhdGEgPSBkYXRhO1xuXG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGlzRXhwYW5kZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kYWJsZUl0ZW0uaXNTZWxlY3RlZChkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdGF0ZUV4cGFuZChyb3cpIHtcbiAgICByZXR1cm4gdGhpcy5pc0V4cGFuZGVkKHJvdykgPyAnZXhwYW5kZWQnIDogJ2NvbGxhcHNlZCc7XG4gIH1cblxuICBwdWJsaWMgaXNDb2x1bW5FeHBhbmRhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoVXRpbC5pc0RlZmluZWQodGhpcy50YWJsZVJvd0V4cGFuZGFibGUpICYmIFV0aWwuaXNEZWZpbmVkKHRoaXMuX29UYWJsZU9wdGlvbnMuZXhwYW5kYWJsZUNvbHVtbikpID8gdGhpcy5fb1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uLnZpc2libGUgOiBmYWxzZTtcbiAgfVxuXG4gIGdldCBoYXNFeHBhbmRlZFJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy50YWJsZVJvd0V4cGFuZGFibGUpO1xuICB9XG5cbiAgcHVibGljIGhhc0luc2VydGFibGVSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKHRoaXMub1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TnVtVmlzaWJsZUNvbHVtbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5vVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBtYW5hZ2VzIHRoZSBjYWxsIHRvIHRoZSBzZXJ2aWNlXG4gICAqIEBwYXJhbSBmaWx0ZXJcbiAgICogQHBhcmFtIG92cnJBcmdzXG4gICAqL1xuICBxdWVyeURhdGEoZmlsdGVyPzogYW55LCBvdnJyQXJncz86IE9RdWVyeURhdGFBcmdzKSB7XG4gICAgLy8gSWYgdGFiIGV4aXN0cyBhbmQgaXMgbm90IGFjdGl2ZSB0aGVuIHdhaXQgZm9yIHF1ZXJ5RGF0YVxuICAgIGlmICh0aGlzLmlzSW5zaWRlSW5hY3RpdmVUYWIoKSkge1xuICAgICAgdGhpcy5wZW5kaW5nUXVlcnkgPSB0cnVlO1xuICAgICAgdGhpcy5wZW5kaW5nUXVlcnlGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ1F1ZXJ5ID0gZmFsc2U7XG4gICAgdGhpcy5wZW5kaW5nUXVlcnlGaWx0ZXIgPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnF1ZXJ5Q2VsbFJlbmRlcmVycygpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBDbGVhbiB1cCBleGlzdGluZyBwb3J0YWwgaG9zdHMgYmVmb3JlIHJlLXJlbmRlcmluZyB0byBwcmV2ZW50IGR1cGxpY2F0ZSBvciBvcnBoYW5lZCBjb21wb25lbnRzXG4gICAgICB0aGlzLmRlc3Ryb3lBbGxQb3J0YWxIb3N0cygpO1xuICAgICAgc3VwZXIucXVlcnlEYXRhKGZpbHRlciwgb3ZyckFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzSW5zaWRlSW5hY3RpdmVUYWIoKTogYm9vbGVhbiB7XG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnRhYkNvbnRhaW5lciAmJiB0aGlzLnRhYkdyb3VwQ29udGFpbmVyKSB7XG4gICAgICByZXN1bHQgPSAhKHRoaXMudGFiQ29udGFpbmVyLmlzQWN0aXZlIHx8ICh0aGlzLnRhYkdyb3VwQ29udGFpbmVyLnNlbGVjdGVkSW5kZXggPT09IHRoaXMudGFiQ29udGFpbmVyLnBvc2l0aW9uKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRDb21wb25lbnRGaWx0ZXIoZXhpc3RpbmdGaWx0ZXI6IGFueSA9IHt9KTogYW55IHtcbiAgICBsZXQgZmlsdGVyID0gZXhpc3RpbmdGaWx0ZXI7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhmaWx0ZXIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcGFyZW50SXRlbUV4cHIgPSBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRFeHByZXNzaW9uRnJvbU9iamVjdChmaWx0ZXIpO1xuICAgICAgICBmaWx0ZXIgPSB7fTtcbiAgICAgICAgZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5GSUxURVJfRVhQUkVTU0lPTl9LRVldID0gcGFyZW50SXRlbUV4cHI7XG4gICAgICB9XG4gICAgICBjb25zdCBiZUNvbEZpbHRlciA9IHRoaXMuZ2V0Q29sdW1uRmlsdGVyc0V4cHJlc3Npb24oKTtcbiAgICAgIC8vIEFkZCBjb2x1bW4gZmlsdGVycyBiYXNpYyBleHByZXNzaW9uIHRvIGN1cnJlbnQgZmlsdGVyXG4gICAgICBpZiAoYmVDb2xGaWx0ZXIgJiYgIVV0aWwuaXNEZWZpbmVkKGZpbHRlcltGaWx0ZXJFeHByZXNzaW9uVXRpbHMuRklMVEVSX0VYUFJFU1NJT05fS0VZXSkpIHtcbiAgICAgICAgZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5GSUxURVJfRVhQUkVTU0lPTl9LRVldID0gYmVDb2xGaWx0ZXI7XG4gICAgICB9IGVsc2UgaWYgKGJlQ29sRmlsdGVyKSB7XG4gICAgICAgIGZpbHRlcltGaWx0ZXJFeHByZXNzaW9uVXRpbHMuRklMVEVSX0VYUFJFU1NJT05fS0VZXSA9XG4gICAgICAgICAgRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24oZmlsdGVyW0ZpbHRlckV4cHJlc3Npb25VdGlscy5GSUxURVJfRVhQUkVTU0lPTl9LRVldLCBiZUNvbEZpbHRlciwgRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX0FORCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmdldENvbXBvbmVudEZpbHRlcihmaWx0ZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFF1aWNrRmlsdGVyRXhwcmVzc2lvbigpOiBFeHByZXNzaW9uIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5vVGFibGVRdWlja0ZpbHRlckNvbXBvbmVudCkgJiYgdGhpcy5wYWdlYWJsZSkge1xuICAgICAgcmV0dXJuIHRoaXMub1RhYmxlUXVpY2tGaWx0ZXJDb21wb25lbnQuZmlsdGVyRXhwcmVzc2lvbjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldENvbHVtbkZpbHRlcnNFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24ge1xuICAgIC8vIEFwcGx5IGNvbHVtbiBmaWx0ZXJzXG4gICAgY29uc3QgY29sdW1uRmlsdGVyczogT0NvbHVtblZhbHVlRmlsdGVyW10gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29sdW1uVmFsdWVGaWx0ZXJzKCk7XG4gICAgY29uc3QgYmVDb2x1bW5GaWx0ZXJzOiBBcnJheTxFeHByZXNzaW9uPiA9IFtdO1xuICAgIGNvbHVtbkZpbHRlcnMuZm9yRWFjaChjb2xGaWx0ZXIgPT4ge1xuICAgICAgLy8gUHJlcGFyZSBiYXNpYyBleHByZXNzaW9uc1xuICAgICAgc3dpdGNoIChjb2xGaWx0ZXIub3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLklOOlxuICAgICAgICAgIGlmIChVdGlsLmlzQXJyYXkoY29sRmlsdGVyLnZhbHVlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlc0luOiBBcnJheTxFeHByZXNzaW9uPiA9IGNvbEZpbHRlci52YWx1ZXMubWFwKHZhbHVlID0+IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25FcXVhbHMoY29sRmlsdGVyLmF0dHIsIHZhbHVlKSk7XG4gICAgICAgICAgICBsZXQgYmVJbjogRXhwcmVzc2lvbiA9IGJlc0luLnBvcCgpO1xuICAgICAgICAgICAgYmVzSW4uZm9yRWFjaChiZSA9PiB7XG4gICAgICAgICAgICAgIGJlSW4gPSBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRDb21wbGV4RXhwcmVzc2lvbihiZUluLCBiZSwgRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX09SKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goYmVJbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbHVtblZhbHVlRmlsdGVyT3BlcmF0b3IuQkVUV0VFTjpcbiAgICAgICAgICBpZiAoVXRpbC5pc0FycmF5KGNvbEZpbHRlci52YWx1ZXMpICYmIGNvbEZpbHRlci52YWx1ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBiZUZyb20gPSBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRFeHByZXNzaW9uTW9yZUVxdWFsKGNvbEZpbHRlci5hdHRyLCBjb2xGaWx0ZXIudmFsdWVzWzBdKTtcbiAgICAgICAgICAgIGNvbnN0IGJlVG8gPSBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRFeHByZXNzaW9uTGVzc0VxdWFsKGNvbEZpbHRlci5hdHRyLCBjb2xGaWx0ZXIudmFsdWVzWzFdKTtcbiAgICAgICAgICAgIGJlQ29sdW1uRmlsdGVycy5wdXNoKEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZENvbXBsZXhFeHByZXNzaW9uKGJlRnJvbSwgYmVUbywgRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX0FORCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLkVRVUFMOlxuICAgICAgICAgIGJlQ29sdW1uRmlsdGVycy5wdXNoKEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25MaWtlKGNvbEZpbHRlci5hdHRyLCBjb2xGaWx0ZXIudmFsdWVzKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29sdW1uVmFsdWVGaWx0ZXJPcGVyYXRvci5MRVNTX0VRVUFMOlxuICAgICAgICAgIGJlQ29sdW1uRmlsdGVycy5wdXNoKEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25MZXNzRXF1YWwoY29sRmlsdGVyLmF0dHIsIGNvbEZpbHRlci52YWx1ZXMpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb2x1bW5WYWx1ZUZpbHRlck9wZXJhdG9yLk1PUkVfRVFVQUw6XG4gICAgICAgICAgYmVDb2x1bW5GaWx0ZXJzLnB1c2goRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbk1vcmVFcXVhbChjb2xGaWx0ZXIuYXR0ciwgY29sRmlsdGVyLnZhbHVlcykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgfSk7XG4gICAgLy8gQnVpbGQgY29tcGxldGUgY29sdW1uIGZpbHRlcnMgYmFzaWMgZXhwcmVzc2lvblxuICAgIGxldCBiZUNvbEZpbHRlcjogRXhwcmVzc2lvbiA9IGJlQ29sdW1uRmlsdGVycy5wb3AoKTtcbiAgICBiZUNvbHVtbkZpbHRlcnMuZm9yRWFjaChiZSA9PiB7XG4gICAgICBiZUNvbEZpbHRlciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZENvbXBsZXhFeHByZXNzaW9uKGJlQ29sRmlsdGVyLCBiZSwgRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX0FORCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGJlQ29sRmlsdGVyO1xuICB9XG5cbiAgdXBkYXRlUGFnaW5hdGlvbkluZm8ocXVlcnlSZXM6IFNlcnZpY2VSZXNwb25zZSkge1xuICAgIHN1cGVyLnVwZGF0ZVBhZ2luYXRpb25JbmZvKHF1ZXJ5UmVzKTtcbiAgfVxuXG4gIGluaXRWaWV3UG9ydChkYXRhOiBhbnlbXSkge1xuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCAmJiBkYXRhKSB7XG4gICAgICBjb25zdCBoZWFkZXJFbFJlZiA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGhlYWRlclNlbGVjdG9yKTtcbiAgICAgIGNvbnN0IGZvb3RlckVsUmVmID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoZm9vdGVyU2VsZWN0b3IpO1xuICAgICAgY29uc3Qgcm93RWxSZWYgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcihyb3dTZWxlY3Rvcik7XG5cbiAgICAgIGNvbnN0IGhlYWRlckhlaWdodCA9IGhlYWRlckVsUmVmID8gaGVhZGVyRWxSZWYub2Zmc2V0SGVpZ2h0IDogMDtcbiAgICAgIGNvbnN0IGZvb3RlckhlaWdodCA9IGZvb3RlckVsUmVmID8gZm9vdGVyRWxSZWYub2Zmc2V0SGVpZ2h0IDogMDtcbiAgICAgIGNvbnN0IHJvd0hlaWdodCA9IHJvd0VsUmVmID8gcm93RWxSZWYub2Zmc2V0SGVpZ2h0IDogT1RhYmxlQ29tcG9uZW50LkRFRkFVTFRfUk9XX0hFSUdIVDtcblxuICAgICAgLy8gc2V0IGNvbmZpZyB2aWV3cG9ydFxuICAgICAgdGhpcy5zY3JvbGxTdHJhdGVneS5zZXRDb25maWcocm93SGVpZ2h0LCBoZWFkZXJIZWlnaHQsIGZvb3RlckhlaWdodCk7XG4gICAgICBpZiAodGhpcy5wcmV2aW91c1JlbmRlcmVyRGF0YSAhPT0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YSkge1xuICAgICAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LmRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0RGF0YShkYXRhOiBhbnksIHNxbFR5cGVzOiBhbnkpIHtcbiAgICAvKiBUaGlzIGNvZGUgaXMgbm90IHB1dCBpbiB0aGUgc3VwZXIgbWV0aG9kIGJlY2F1c2UgaXQgaXMgbm90IGNhbGxlZCBmcm9tIHRoZSBjbGFzcyBpdHNlbGYgKi9cbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5ICYmIGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlPy5yZWluaXRpYWxpemVQYWdpbmF0aW9uQ29udGV4dCh0aGlzLnF1ZXJ5Um93cyk7XG4gICAgfVxuXG4gICAgdGhpcy5kYW9UYWJsZS5zcWxUeXBlc0NoYW5nZS5uZXh0KHNxbFR5cGVzKTtcbiAgICB0aGlzLmRhb1RhYmxlLnNldERhdGFBcnJheShkYXRhKTtcbiAgICBpZiAodGhpcy5wYWdlYWJsZSkge1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5vblBhZ2luYXRlZERhdGFMb2FkZWQsIGRhdGEpO1xuICAgIH1cbiAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLm9uRGF0YUxvYWRlZCwgdGhpcy5kYW9UYWJsZS5kYXRhKTtcbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQgJiYgZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pbml0Vmlld1BvcnQoZGF0YSk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FuU2V0U3RhdGljRGF0YShzdGF0aWNEYXRhKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLmNhblNldFN0YXRpY0RhdGEoc3RhdGljRGF0YSkgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5kYW9UYWJsZSk7XG4gIH1cblxuICBzaG93RGlhbG9nRXJyb3IoZXJyb3I6IHN0cmluZywgZXJyb3JPcHRpb25hbD86IHN0cmluZykge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChlcnJvcikgJiYgIVV0aWwuaXNPYmplY3QoZXJyb3IpKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgZXJyb3JPcHRpb25hbCk7XG4gICAgfVxuICB9XG5cbiAgcHJvamVjdENvbnRlbnRDaGFuZ2VkKCkge1xuICAgIGNvbnN0IGRhdGFDaGFuZ2VkID0gdGhpcy5wcmV2aW91c1JlbmRlcmVyRGF0YSAhPT0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YTtcblxuICAgIGlmIChkYXRhQ2hhbmdlZCkge1xuICAgICAgdGhpcy5wcmV2aW91c1JlbmRlcmVyRGF0YSA9IHRoaXMuZGF0YVNvdXJjZS5yZW5kZXJlZERhdGE7XG5cbiAgICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25Db250ZW50Q2hhbmdlLCB0aGlzLmRhdGFTb3VyY2UucmVuZGVyZWREYXRhKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5zZWxlY3Rpb24gJiYgdGhpcy5kYXRhU291cmNlPy5yZW5kZXJlZERhdGE/Lmxlbmd0aCA+IDAgJiYgdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmNoZWNrU2VsZWN0ZWRJdGVtRGF0YSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlZnJlc2hFeHBhbmRhYmxlUm93U3RhdGUpIHtcbiAgICAgIHRoaXMucmVmcmVzaEV4cGFuZGFibGVSb3dTdGF0ZSA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2VsZWN0aW9uSXRlbXMgPSB0aGlzLnN0YXRlLmV4cGFuZGFibGVSb3dzPy5zbGljZSgpIHx8IFtdXG4gICAgICB0aGlzLmV4cGFuZGFibGVJdGVtPy5jbGVhcigpO1xuICAgICAgdGhpcy5zdGF0ZS5leHBhbmRhYmxlUm93cyA9IHNlbGVjdGlvbkl0ZW1zO1xuICAgICAgdGhpcy5yZXN0b3JlRXhwYW5kYWJsZVJvd1N0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzdG9yZUV4cGFuZGFibGVSb3dTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50YWJsZVJvd0V4cGFuZGFibGUgJiYgdGhpcy5zdGF0ZT8uZXhwYW5kYWJsZVJvd3MpIHtcbiAgICAgIHRoaXMuc3RhdGUuZXhwYW5kYWJsZVJvd3MuZm9yRWFjaChleHBhbmRhYmxlUm93ID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UmVuZGVyZWRWYWx1ZSgpOztcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgY29uc3Qgcm93SW5kZXggPSBkYXRhLmZpbmRJbmRleCgocm93KSA9PiB0aGlzLmtleXNBcnJheS5ldmVyeShrZXkgPT4gcm93W2tleV0gPT09IGV4cGFuZGFibGVSb3cua2V5c1trZXldKSk7XG4gICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gcm93SW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUm93RXhwYW5kYWJsZShkYXRhW3Jvd0luZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRBdHRyaWJ1dGVzVmFsdWVzVG9RdWVyeSgpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCBjb2x1bW5zID0gc3VwZXIuZ2V0QXR0cmlidXRlc1ZhbHVlc1RvUXVlcnkoKTtcbiAgICBpZiAodGhpcy5hdm9pZFF1ZXJ5Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gY29sdW1ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBjb2wgPSBjb2x1bW5zW2ldO1xuICAgICAgICBpZiAodGhpcy5hdm9pZFF1ZXJ5Q29sdW1ucy5pbmRleE9mKGNvbCkgIT09IC0xKSB7XG4gICAgICAgICAgY29sdW1ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICBnZXRRdWVyeUFyZ3VtZW50cyhmaWx0ZXI6IG9iamVjdCwgb3ZyckFyZ3M/OiBPUXVlcnlEYXRhQXJncyk6IE9RdWVyeVBhcmFtcyB7XG4gICAgY29uc3QgcXVlcnlBcmd1bWVudHMgPSBzdXBlci5nZXRRdWVyeUFyZ3VtZW50cyhmaWx0ZXIsIG92cnJBcmdzKTtcbiAgICBxdWVyeUFyZ3VtZW50cy5zcWxUeXBlcyA9IHtcbiAgICAgIC4uLnRoaXMuZ2V0U3FsVHlwZXNGb3JGaWx0ZXIocXVlcnlBcmd1bWVudHMuY29sdW1ucyksXG4gICAgICAuLi5vdnJyQXJncyA/IG92cnJBcmdzLnNxbHR5cGVzIHx8IHt9IDoge31cbiAgICB9O1xuXG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIHF1ZXJ5QXJndW1lbnRzLnNvcnQgPSB0aGlzLnNvcnRDb2xBcnJheTtcbiAgICAgIGlmICh0aGlzLnBhZ2luYXRvci5pc1Nob3dpbmdBbGxSb3dzKG92cnJBcmdzPy5vZmZzZXQpICYmIHRoaXMuc3RhdGU/LnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyKSB7XG4gICAgICAgIHF1ZXJ5QXJndW1lbnRzLm92cnJBcmdzLmxlbmd0aCA9IHRoaXMuc3RhdGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBxdWVyeUFyZ3VtZW50cztcbiAgfVxuXG4gIGdldFNxbFR5cGVzRm9yRmlsdGVyKGZpbHRlcik6IG9iamVjdCB7XG4gICAgY29uc3QgYWxsU3FsVHlwZXMgPSB0aGlzLmdldFNxbFR5cGVzKCk7XG4gICAgY29uc3Qgc3FsVHlwZXMgPSB7fTtcbiAgICBpZiAoIVV0aWwuaXNPYmplY3RFbXB0eShmaWx0ZXIpKSB7XG4gICAgICBPYmplY3Qua2V5cyhhbGxTcWxUeXBlcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLmluZGV4T2Yoa2V5KSAhPT0gLTEgJiYgYWxsU3FsVHlwZXNba2V5XSAhPT0gU1FMVHlwZXMuT1RIRVIpIHtcbiAgICAgICAgICBzcWxUeXBlc1trZXldID0gYWxsU3FsVHlwZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzcWxUeXBlcztcbiAgfVxuXG4gIG9uRXhwb3J0QnV0dG9uQ2xpY2tlZCgpIHtcbiAgICBpZiAodGhpcy5vVGFibGVNZW51KSB7XG4gICAgICB0aGlzLm9UYWJsZU1lbnUub25FeHBvcnRCdXR0b25DbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2VDb2x1bW5zVmlzaWJpbGl0eUNsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uQ2hhbmdlQ29sdW1uc1Zpc2liaWxpdHlDbGlja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgb25NYXRUYWJsZUNvbnRlbnRDaGFuZ2VkKCkge1xuICAgIC8vXG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgbmF2aWdhdGlvbiB0byBuZXcgaXRlbSBpbnNlcnRpb25cbiAgICovXG4gIGFkZCgpIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgaWYgKHRoaXMuc2hvd05vdGlmaWNhdGlvbk9mUmVhZE9ubHkpIHtcbiAgICAgICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3BlbignTUVTU0FHRVMuT1BFUkFUSU9OX05PVF9BTExPV0VEX1JFQURPTkxZJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX0lOU0VSVCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuaW5zZXJ0RGV0YWlsKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBzZWxlY3RlZCByb3dzXG4gICAqIEBwYXJhbSBbY2xlYXJTZWxlY3RlZEl0ZW1zXVxuICAgKi9cbiAgcmVtb3ZlKGNsZWFyU2VsZWN0ZWRJdGVtczogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIGlmICh0aGlzLnNob3dOb3RpZmljYXRpb25PZlJlYWRPbmx5KSB7XG4gICAgICAgIHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4oJ01FU1NBR0VTLk9QRVJBVElPTl9OT1RfQUxMT1dFRF9SRUFET05MWScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hlY2tFbmFibGVkQWN0aW9uUGVybWlzc2lvbihQZXJtaXNzaW9uc1V0aWxzLkFDVElPTl9ERUxFVEUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcbiAgICBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuY29uZmlybSgnQ09ORklSTScsICdNRVNTQUdFUy5DT05GSVJNX0RFTEVURScpLnRoZW4ocmVzID0+IHtcbiAgICAgIGlmIChyZXMgPT09IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVNlcnZpY2UgJiYgKHRoaXMuZGVsZXRlTWV0aG9kIGluIHRoaXMuZGF0YVNlcnZpY2UpICYmIHRoaXMuZW50aXR5ICYmICh0aGlzLmtleXNBcnJheS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBTZXJ2aWNlVXRpbHMuZ2V0QXJyYXlQcm9wZXJ0aWVzKHNlbGVjdGVkSXRlbXMsIHRoaXMua2V5c0FycmF5KTtcbiAgICAgICAgICBjb25zdCBzcWxUeXBlc0FyZyA9IHRoaXMuZ2V0U3FsVHlwZXNPZktleXMoKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdTZXJ2aWNlLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5kYW9UYWJsZS5yZW1vdmVRdWVyeShmaWx0ZXJzLCBzcWxUeXBlc0FyZykuc3Vic2NyaWJlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuZXh0OiAodikgPT4ge1xuICAgICAgICAgICAgICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMub25Sb3dEZWxldGVkLCBzZWxlY3RlZEl0ZW1zKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RGlhbG9nRXJyb3IoZSwgJ01FU1NBR0VTLkVSUk9SX0RFTEVURScpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEVuc3VyaW5nIHRoYXQgdGhlIGRlbGV0ZWQgaXRlbXMgd2lsbCBub3QgbG9uZ2VyIGJlIHBhcnQgb2YgdGhlIHNlbGVjdGlvbk1vZGVsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3QoaXRlbSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUxheW91dE1hbmFnZXIpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUxheW91dE1hbmFnZXIuY2xvc2VEZXRhaWxzKGZpbHRlcnMsIHsgZXhpdFdpdGhvdXRDb25maXJtYXRpb246IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkRGF0YSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGVsZXRlTG9jYWxJdGVtcygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNsZWFyU2VsZWN0ZWRJdGVtcykge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNocyB0YWJsZSBjb21wb25lbnRcbiAgICovXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5yZWxvYWREYXRhKCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYW5kIHNlbGVjdCBhbGwgY2hlY2tib3hcbiAgICovXG4gIHNob3dBbmRTZWxlY3RBbGxDaGVja2JveCgpIHtcbiAgICBpZiAodGhpcy5pc1NlbGVjdGlvbk1vZGVNdWx0aXBsZSgpKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RBbGxDaGVja2JveCkge1xuICAgICAgICB0aGlzLl9vVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94Q29sdW1uKCk7XG4gICAgICB0aGlzLnNlbGVjdEFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHJlbG9hZFBhZ2luYXRlZERhdGFGcm9tU3RhcnQoY2xlYXJTZWxlY3RlZEl0ZW1zOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICAvLyBJbml0aWFsaXplIHBhZ2UgaW5kZXhcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAwO1xuICAgICAgdGhpcy5yZWxvYWREYXRhKGNsZWFyU2VsZWN0ZWRJdGVtcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZHMgZGF0YVxuICAgKi9cbiAgcmVsb2FkRGF0YShjbGVhclNlbGVjdGVkSXRlbXM6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgdGhpcy5sb2FkaW5nU2VydmljZS5zZXRMb2FkaW5nKHRydWUpO1xuICAgIHRoaXMucmVsb2FkRGF0YVdpdGhDbGVhckV4cGFuZGFibGVSb3dzKGNsZWFyU2VsZWN0ZWRJdGVtcywgY2xlYXJTZWxlY3RlZEl0ZW1zKVxuICB9XG5cbiAgcmVsb2FkRGF0YVdpdGhDbGVhckV4cGFuZGFibGVSb3dzKGNsZWFyU2VsZWN0ZWRJdGVtczogYm9vbGVhbiA9IHRydWUsIGNsZWFyRXhwYW5kYWJsZUl0ZW1zOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmICghdGhpcy5jaGVja0VuYWJsZWRBY3Rpb25QZXJtaXNzaW9uKFBlcm1pc3Npb25zVXRpbHMuQUNUSU9OX1JFRlJFU0gpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFibGVSb3dFeHBhbmRhYmxlKSB7XG4gICAgICBpZiAoY2xlYXJFeHBhbmRhYmxlSXRlbXMpIHtcbiAgICAgICAgdGhpcy5leHBhbmRhYmxlSXRlbT8uY2xlYXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVmcmVzaEV4cGFuZGFibGVSb3dTdGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb21wb25lbnRTdGF0ZVNlcnZpY2UucmVmcmVzaFNlbGVjdGlvbigpO1xuXG4gICAgaWYgKGNsZWFyU2VsZWN0ZWRJdGVtcykge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLmZpbmlzaFF1ZXJ5U3Vic2NyaXB0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5wZW5kaW5nUXVlcnkgPSB0cnVlO1xuICAgIGxldCBxdWVyeUFyZ3M6IE9RdWVyeURhdGFBcmdzO1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICBxdWVyeUFyZ3MgPSB7XG4gICAgICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucXVlcnlSb3dzLFxuICAgICAgICBsZW5ndGg6IHRoaXMucXVlcnlSb3dzXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLnN0b3BFZGl0aW9uKGZhbHNlKTtcbiAgICB0aGlzLnF1ZXJ5RGF0YSh2b2lkIDAsIHF1ZXJ5QXJncyk7XG4gIH1cblxuICBoYW5kbGVDbGljayhyb3c6IGFueSwgY29sdW1uOiBPQ29sdW1uLCByb3dJbmRleDogbnVtYmVyLCBjZWxsUmVmOiBFbGVtZW50UmVmLCBldmVudDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuY2xpY2tTdWJqZWN0Lm5leHQoeyByb3csIGNvbHVtbiwgY2VsbFJlZiwgcm93SW5kZXgsIGV2ZW50IH0pO1xuICB9XG5cbiAgZG9IYW5kbGVDbGljayhyb3c6IGFueSwgY29sdW1uOiBzdHJpbmcsIHJvd0luZGV4OiBudW1iZXIsICRldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICBpZiAodGhpcy5zaG93Tm90aWZpY2F0aW9uT2ZSZWFkT25seSkge1xuICAgICAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKCdNRVNTQUdFUy5PUEVSQVRJT05fTk9UX0FMTE9XRURfUkVBRE9OTFknKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub2VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoKHRoaXMuZGV0YWlsTW9kZSA9PT0gQ29kZXMuREVUQUlMX01PREVfQ0xJQ0spKSB7XG4gICAgICB0aGlzLmhhbmRsZURldGFpbE1vZGVDbGljayhyb3csIGNvbHVtbiwgcm93SW5kZXgsICRldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG11bHRpcGxlIHNlbGVjdGlvbiAoQ3RybC9DbWQgb3IgU2hpZnQpXG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKSkge1xuICAgICAgaWYgKCRldmVudC5jdHJsS2V5IHx8ICRldmVudC5tZXRhS2V5KSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTXVsdGlwbGVTZWxlY3Rpb25DdHJsKHJvdywgY29sdW1uLCByb3dJbmRleCwgJGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoJGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTXVsdGlwbGVTZWxlY3Rpb25TaGlmdChyb3csIGNvbHVtbiwgcm93SW5kZXgsICRldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0aW9uIG1vZGVzIE9USEVSIHRoYW4gJ25vbmUnXG4gICAgaWYgKCF0aGlzLmlzU2VsZWN0aW9uTW9kZU5vbmUoKSkge1xuICAgICAgdGhpcy5oYW5kbGVPdGhlclNlbGVjdGlvbk1vZGVzKHJvdyk7XG5cbiAgICB9XG4gICAgLy8gRW1pdCBvbkNsaWNrIGV2ZW50IGV2ZW4gd2hlbiBzZWxlY3Rpb24gaXMgZGlzYWJsZWRcbiAgICB0aGlzLm9uQ2xpY2suZW1pdCh7IHJvdzogcm93LCByb3dJbmRleDogcm93SW5kZXgsIG1vdXNlRXZlbnQ6ICRldmVudCwgY29sdW1uTmFtZTogY29sdW1uLCBjZWxsOiByb3dbY29sdW1uXSB9KTtcblxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVPdGhlclNlbGVjdGlvbk1vZGVzKHJvdzogYW55KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xuICAgIGlmICh0aGlzLmlzUm93U2VsZWN0ZWQocm93KSAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmVkaXRpb25FbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk9uUm93Q2xpY2spIHtcbiAgICAgIHRoaXMudG9nZ2xlUm93U2VsZWN0aW9uKHJvdyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEZXRhaWxNb2RlQ2xpY2socm93OiBhbnksIGNvbHVtbjogc3RyaW5nLCByb3dJbmRleDogbnVtYmVyLCAkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pc05hdmlnYXRpbmcpIHJldHVybjtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmlzTmF2aWdhdGluZyA9IHRydWU7XG5cbiAgICB0aGlzLm9uQ2xpY2suZW1pdCh7IHJvdzogcm93LCByb3dJbmRleDogcm93SW5kZXgsIG1vdXNlRXZlbnQ6ICRldmVudCwgY29sdW1uTmFtZTogY29sdW1uLCBjZWxsOiByb3dbY29sdW1uXSB9KTtcbiAgICB0aGlzLnNhdmVEYXRhTmF2aWdhdGlvbkluTG9jYWxTdG9yYWdlKCk7XG4gICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIHRoaXMuc2VsZWN0ZWRSb3cocm93KTtcbiAgICB0aGlzLnZpZXdEZXRhaWwocm93KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTXVsdGlwbGVTZWxlY3Rpb25DdHJsKHJvdzogYW55LCBjb2x1bW46IHN0cmluZywgcm93SW5kZXg6IG51bWJlciwgJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uT25Sb3dDbGljaykge1xuICAgICAgdGhpcy5zZWxlY3RlZFJvdyhyb3cpO1xuICAgIH1cbiAgICB0aGlzLm9uQ2xpY2suZW1pdCh7IHJvdzogcm93LCByb3dJbmRleDogcm93SW5kZXgsIG1vdXNlRXZlbnQ6ICRldmVudCwgY29sdW1uTmFtZTogY29sdW1uLCBjZWxsOiByb3dbY29sdW1uXSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTXVsdGlwbGVTZWxlY3Rpb25TaGlmdChyb3c6IGFueSwgY29sdW1uOiBzdHJpbmcsIHJvd0luZGV4OiBudW1iZXIsICRldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbk9uUm93Q2xpY2spIHtcbiAgICAgIHRoaXMuaGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24ocm93KTtcbiAgICB9XG4gICAgdGhpcy5vbkNsaWNrLmVtaXQoeyByb3c6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4LCBtb3VzZUV2ZW50OiAkZXZlbnQsIGNvbHVtbk5hbWU6IGNvbHVtbiwgY2VsbDogcm93W2NvbHVtbl0gfSk7XG4gIH1cblxuICAvKipcbiAqIEhhbmRsZXMgbXVsdGlwbGUgc2VsZWN0aW9uIHdpdGggU2hpZnQga2V5IChyYW5nZSBzZWxlY3Rpb24pXG4gKiAqL1xuICBoYW5kbGVNdWx0aXBsZVNlbGVjdGlvbihpdGVtOiBhbnkpIHtcbiAgICAvLyBFeGl0IGlmIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlIGlzIG5vdCBlbmFibGVkXG4gICAgaWYgKCF0aGlzLmlzU2VsZWN0aW9uTW9kZU11bHRpcGxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyBzZWxlY3Rpb24sIHNlbGVjdCB0aGUgY3VycmVudCByb3dcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTXVsdGlwbGVzUm93cyhbaXRlbV0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzZWxlY3RlZCByb3cgYW5kIHRoZSBjdXJyZW50IHJvd1xuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5pbmRleE9mKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkWzBdKTtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5pbmRleE9mKGl0ZW0pO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSByYW5nZSBvZiBpbmRpY2VzIHRvIHNlbGVjdFxuICAgIGNvbnN0IGluZGV4RnJvbSA9IE1hdGgubWluKGZpcnN0LCBsYXN0KTtcbiAgICBjb25zdCBpbmRleFRvID0gTWF0aC5tYXgoZmlyc3QsIGxhc3QpO1xuXG5cbiAgICAvLyBHZXQgYWxsIHJvd3Mgd2l0aGluIHRoZSBzZWxlY3RlZCByYW5nZVxuICAgIGNvbnN0IHJvd3NJblJhbmdlID0gdGhpcy5kYXRhU291cmNlLnJlbmRlcmVkRGF0YS5zbGljZShpbmRleEZyb20sIGluZGV4VG8gKyAxKTtcblxuICAgIC8vIFRlbXBvcmFyaWx5IGRpc2FibGUgc2VsZWN0aW9uIGV2ZW50cyB3aGlsZSBjbGVhcmluZ1xuICAgIHRoaXMudHJpZ2dlclNlbGVjdGlvbkV2ZW50cyA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgdGhpcy50cmlnZ2VyU2VsZWN0aW9uRXZlbnRzID0gdHJ1ZTtcblxuICAgIC8vIFNlbGVjdCBhbGwgdmFsaWQgcm93cyB3aXRoaW4gdGhlIHJhbmdlXG4gICAgdGhpcy5zZWxlY3RlZE11bHRpcGxlc1Jvd3Mocm93c0luUmFuZ2UpO1xuXG4gIH1cblxuICBwcm90ZWN0ZWQgc2F2ZURhdGFOYXZpZ2F0aW9uSW5Mb2NhbFN0b3JhZ2UoKSB7XG4gICAgc3VwZXIuc2F2ZURhdGFOYXZpZ2F0aW9uSW5Mb2NhbFN0b3JhZ2UoKTtcbiAgICB0aGlzLnN0b3JlUGFnaW5hdGlvblN0YXRlID0gdHJ1ZTtcbiAgfVxuXG4gIGhhbmRsZURvdWJsZUNsaWNrKHJvdzogYW55LCBjb2x1bW46IE9Db2x1bW4sIHJvd0luZGV4OiBudW1iZXIsIGNlbGxSZWY6IEVsZW1lbnRSZWYsIGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5kYmxjbGlja1N1YmplY3QubmV4dCh7IHJvdywgY29sdW1uLCBjZWxsUmVmLCByb3dJbmRleCwgZXZlbnQgfSk7XG4gIH1cblxuICBnZXQgZWRpdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29UYWJsZU9wdGlvbnMuY29sdW1ucy5zb21lKGl0ZW0gPT4gaXRlbS5lZGl0aW5nKTtcbiAgfVxuXG4gIGhhbmRsZURPTUNsaWNrKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuX29UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lZGl0aW9uRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG92ZXJsYXlDb250YWluZXIgPSBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Nkay1vdmVybGF5LWNvbnRhaW5lcicpWzBdO1xuICAgIGlmIChvdmVybGF5Q29udGFpbmVyICYmIG92ZXJsYXlDb250YWluZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vLXRhYmxlLWNvbnRhaW5lcicpO1xuICAgIGNvbnN0IHRhYmxlQ29udGVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuby10YWJsZS1jb250YWluZXIgdGFibGUubWF0LXRhYmxlJyk7XG4gICAgaWYgKHRhYmxlQ29udGFpbmVyICYmIHRhYmxlQ29udGVudCAmJiB0YWJsZUNvbnRhaW5lci5jb250YWlucyhldmVudC50YXJnZXQpICYmICF0YWJsZUNvbnRlbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhY3RpdmF0ZUNvbHVtbkVkaXRpb24oY29sdW1uOiBPQ29sdW1uLCByb3c6IGFueSwgY2VsbFJlZjogYW55KSB7XG4gICAgaWYgKGNlbGxSZWYgJiYgY29sdW1uLmVkaXRpbmcgJiYgdGhpcy5lZGl0aW5nQ2VsbCA9PT0gY2VsbFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW5QZXJtaXNzaW9uczogT1Blcm1pc3Npb25zID0gdGhpcy5nZXRPQ29sdW1uUGVybWlzc2lvbnMoY29sdW1uLmF0dHIpO1xuICAgIGlmIChjb2x1bW5QZXJtaXNzaW9ucy5lbmFibGVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGAke2NvbHVtbi5hdHRyfSBlZGl0aW9uIG5vdCBhbGxvd2VkIGR1ZSB0byBwZXJtaXNzaW9uc2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25BbmRFZGl0aW5nKCk7XG4gICAgdGhpcy5zZWxlY3RlZFJvdyhyb3cpO1xuICAgIHRoaXMuZWRpdGluZ0NlbGwgPSBjZWxsUmVmO1xuICAgIGNvbnN0IHJvd0RhdGEgPSB7fTtcbiAgICB0aGlzLmtleXNBcnJheS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHJvd0RhdGFba2V5XSA9IHJvd1trZXldO1xuICAgIH0pO1xuICAgIHJvd0RhdGFbY29sdW1uLmF0dHJdID0gcm93W2NvbHVtbi5hdHRyXTtcbiAgICB0aGlzLmVkaXRpbmdSb3cgPSByb3c7XG4gICAgY29sdW1uLmVkaXRpbmcgPSB0cnVlO1xuICAgIGNvbHVtbi5lZGl0b3Iuc3RhcnRFZGl0aW9uKHJvd0RhdGEpO1xuICB9XG5cbiAgdXBkYXRlQ2VsbERhdGEoY29sdW1uOiBPQ29sdW1uLCBkYXRhOiBhbnksIHNhdmVDaGFuZ2VzOiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrRW5hYmxlZEFjdGlvblBlcm1pc3Npb24oUGVybWlzc2lvbnNVdGlscy5BQ1RJT05fVVBEQVRFKSkge1xuICAgICAgY29uc3QgcmVzID0gbmV3IE9ic2VydmFibGUoaW5uZXJPYnNlcnZlciA9PiB7XG4gICAgICAgIGlubmVyT2JzZXJ2ZXIuZXJyb3IoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgY29sdW1uLmVkaXRpbmcgPSBmYWxzZTtcbiAgICBpZiAoc2F2ZUNoYW5nZXMgJiYgdGhpcy5lZGl0aW5nUm93ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5lZGl0aW5nUm93LCBkYXRhKTtcbiAgICB9XG4gICAgdGhpcy5zdG9wRWRpdGlvbigpO1xuICAgIGlmIChzYXZlQ2hhbmdlcyAmJiBjb2x1bW4uZWRpdG9yLnVwZGF0ZVJlY29yZE9uRWRpdCkge1xuICAgICAgY29uc3QgdG9VcGRhdGUgPSB7fTtcbiAgICAgIHRvVXBkYXRlW2NvbHVtbi5hdHRyXSA9IGRhdGFbY29sdW1uLmF0dHJdO1xuICAgICAgY29uc3Qga3YgPSB0aGlzLmV4dHJhY3RLZXlzRnJvbVJlY29yZChkYXRhKTtcbiAgICAgIGNvbnN0IHVwZGF0ZU9ic2VydmFibGUgPSB0aGlzLnVwZGF0ZVJlY29yZChrdiwgdG9VcGRhdGUpO1xuXG4gICAgICBpZiAodXBkYXRlT2JzZXJ2YWJsZSkge1xuICAgICAgICB1cGRhdGVPYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAvLyBSZXN0b3JlIHNjcm9sbCBwb3NpdGlvbiBBRlRFUiB0aGUgdXBkYXRlXG4gICAgICAgICAgICB0aGlzLnNhdmVTY3JvbGxQb3NpdGlvbigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgdXBkYXRpbmcgY2VsbDonLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1cGRhdGVPYnNlcnZhYmxlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEtleXNWYWx1ZXMoKTogYW55W10ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldEFsbFZhbHVlcygpO1xuICAgIHJldHVybiBkYXRhLm1hcCgocm93KSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7fTtcbiAgICAgIHRoaXMua2V5c0FycmF5LmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAocm93W2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9ialtrZXldID0gcm93W2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0pO1xuICB9XG5cbiAgb25TaG93c1NlbGVjdHMoKSB7XG4gICAgaWYgKHRoaXMub1RhYmxlTWVudSkge1xuICAgICAgdGhpcy5vVGFibGVNZW51Lm9uU2hvd3NTZWxlY3RzKCk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZUNoZWNrYm94Q29sdW1uKCkge1xuICAgIC8vIEluaXRpYWxpemluZyByb3cgc2VsZWN0aW9uIGxpc3RlbmVyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGlvbkNoYW5nZVN1YnNjcmlwdGlvbiAmJiAhdGhpcy5pc1NlbGVjdGlvbk1vZGVOb25lKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5zZWxlY3Rpb24uY2hhbmdlZC5zdWJzY3JpYmUoKHNlbGVjdGlvbkRhdGE6IFNlbGVjdGlvbkNoYW5nZTxhbnk+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+IGMuYXR0ciA9PT0gY29sLmF0dHIpO1xuICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgY29sLnRpdGxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh1cGRhdGVkLnRpdGxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5tYXRUYWJsZT8ucmVtb3ZlSGVhZGVyUm93RGVmKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICogU2F2ZXMgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uXG4gICovXG4gIHByaXZhdGUgc2F2ZVNjcm9sbFBvc2l0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCkge1xuICAgICAgdGhpcy5zYXZlZFNjcm9sbFBvc2l0aW9uID0gdGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQubWVhc3VyZVNjcm9sbE9mZnNldCgpO1xuICAgICAgdGhpcy5zY3JvbGxTdHJhdGVneS5zZXRTYXZlZFNjcm9sbFBvc2l0aW9uKHRoaXMuc2F2ZWRTY3JvbGxQb3NpdGlvbik7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJvLXRhYmxlLWNvbnRhaW5lclwiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IHN0cmV0Y2hcIiBbc3R5bGUuZGlzcGxheV09XCJpc1Zpc2libGUoKT8gJycgOiAnbm9uZSdcIlxuICBbY2xhc3MuYmxvY2stZXZlbnRzXT1cImxvYWRpbmdTZXJ2aWNlLmlzUHJvY2Vzc2luZyQgfCBhc3luY1wiPlxuICA8by1kYXRhLXRvb2xiYXIgI3RhYmxlVG9vbGJhciAqbmdJZj1cImhhc0NvbnRyb2xzKClcIiBbdGl0bGVdPVwidGl0bGVcIiBbc2hvdy10aXRsZV09XCJzaG93VGl0bGVcIiBjbGFzcz1cIm8tdGFibGUtdG9vbGJhclwiPlxuICAgIDxuZy1jb250YWluZXIgby1kYXRhLXRvb2xiYXItcHJvamVjdGlvbi1zdGFydD5cbiAgICAgIDxvLXRhYmxlLWJ1dHRvbnMgI3RhYmxlQnV0dG9ucyBbaW5zZXJ0LWJ1dHRvbl09XCJpbnNlcnRCdXR0b25cIiBbcmVmcmVzaC1idXR0b25dPVwicmVmcmVzaEJ1dHRvblwiIFtkZWxldGUtYnV0dG9uXT1cInNob3dEZWxldGVCdXR0b25cIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiby10YWJsZS1idXR0b25cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L28tdGFibGUtYnV0dG9ucz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbby10YWJsZS10b29sYmFyXVtwb3NpdGlvbj1zdGFydF1cIiBuZ1Byb2plY3RBcz1cIltvLWRhdGEtdG9vbGJhci1jdXN0b20tcHJvamVjdGlvbi1zdGFydF1cIj5cbiAgICA8L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW28tdGFibGUtdG9vbGJhcl1bcG9zaXRpb249ZW5kXVwiIG5nUHJvamVjdEFzPVwiW28tZGF0YS10b29sYmFyLWN1c3RvbS1wcm9qZWN0aW9uLWVuZF1cIj5cbiAgICA8L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW28tdGFibGUtdG9vbGJhcl1cIiBuZ1Byb2plY3RBcz1cIltvLWRhdGEtdG9vbGJhci1jdXN0b20tcHJvamVjdGlvbi1zdGFydF1cIj5cbiAgICA8L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRhaW5lciBvLWRhdGEtdG9vbGJhci1wcm9qZWN0aW9uLWVuZD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWlja2ZpbHRlckNvbnRlbnRDaGlsZDsgZWxzZSBkZWZhdWx0UXVpY2tGaWx0ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiby10YWJsZS1xdWlja2ZpbHRlclwiPjwvbmctY29udGVudD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0UXVpY2tGaWx0ZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWlja0ZpbHRlclwiPlxuICAgICAgICAgIDxvLXRhYmxlLXF1aWNrZmlsdGVyIChvbkNoYW5nZSk9XCJ0YWJsZVF1aWNrRmlsdGVyQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9vLXRhYmxlLXF1aWNrZmlsdGVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cInNob3dUYWJsZU1lbnVCdXR0b25cIiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJvLXRhYmxlLW1lbnUtYnV0dG9uXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInRhYmxlTWVudS5tYXRNZW51XCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOm1vcmVfdmVydFwiPjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxvLXRhYmxlLW1lbnUgI3RhYmxlTWVudSBbc2VsZWN0LWFsbC1jaGVja2JveF09XCJzZWxlY3RBbGxDaGVja2JveFwiIFtleHBvcnQtYnV0dG9uXT1cImV4cG9ydEJ1dHRvblwiXG4gICAgICAgIFtjb2x1bW5zLXZpc2liaWxpdHktYnV0dG9uXT1cImNvbHVtbnNWaXNpYmlsaXR5QnV0dG9uXCIgW3Nob3ctY29uZmlndXJhdGlvbi1vcHRpb25dPVwic2hvd0NvbmZpZ3VyYXRpb25PcHRpb25cIlxuICAgICAgICBbc2hvdy1maWx0ZXItb3B0aW9uXT1cInNob3dGaWx0ZXJPcHRpb25cIiBbc2hvdy1yZXBvcnQtb24tZGVtYW5kLW9wdGlvbl09XCJzaG93UmVwb3J0T25EZW1hbmRPcHRpb25cIlxuICAgICAgICBbc2hvdy1jaGFydHMtb24tZGVtYW5kLW9wdGlvbl09XCJzaG93Q2hhcnRzT25EZW1hbmRPcHRpb25cIiBbc2hvdy1yZXNldC13aWR0aC1vcHRpb25dPVwic2hvd1Jlc2V0V2lkdGhPcHRpb25cIiBbc2hvdy1ncm91cC1ieS1vcHRpb25dPVwiZ3JvdXBhYmxlXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm8tdGFibGUtb3B0aW9uXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9vLXRhYmxlLW1lbnU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvby1kYXRhLXRvb2xiYXI+XG5cbiAgPGRpdiAjdGFibGVCb2R5IGNsYXNzPVwiby10YWJsZS1ib2R5IG8tc2Nyb2xsXCIgW2NsYXNzLmhvcml6b250YWwtc2Nyb2xsXT1cImhvcml6b250YWxTY3JvbGxcIiBbY2xhc3Muc2Nyb2xsZWRdPVwiaG9yaXpvbnRhbFNjcm9sbGVkXCJcbiAgICBbbmdTdHlsZV09XCJ7J3Zpc2liaWxpdHknOiBzcGlubmVyQ29udGFpbmVyID8gJ2hpZGRlbicgOiAndmlzaWJsZSd9XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlbmFibGVkVmlydHVhbFNjcm9sbDsgZWxzZSB0YWJsZVdpdGhWaXJ0dWFsU2Nyb2xsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiby10YWJsZS1vdmVyZmxvdyBvLXNjcm9sbFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3RhYmxlV2l0aFZpcnR1YWxTY3JvbGw+XG4gICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICN2aXJ0dWFsU2Nyb2xsVmlld1BvcnQgZnhGbGV4PlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbiAgPCEtLVRBQkxFIFBBR0lOQVRPUi0tPlxuICA8bWF0LXBhZ2luYXRvciAqbmdJZj1cInBhZ2luYXRvclwiICNtYXRwYWdpbmF0b3IgW2xlbmd0aF09XCJkYXRhU291cmNlPy5yZXN1bHRzTGVuZ3RoXCIgW3BhZ2VJbmRleF09XCJwYWdpbmF0b3IucGFnZUluZGV4XCIgW3BhZ2VTaXplXT1cInF1ZXJ5Um93c1wiXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdpbmF0b3IucGFnZVNpemVPcHRpb25zXCIgKHBhZ2UpPVwib25DaGFuZ2VQYWdlKCRldmVudClcIiBbc2hvd0ZpcnN0TGFzdEJ1dHRvbnNdPVwicGFnaW5hdG9yLnNob3dGaXJzdExhc3RCdXR0b25zXCJcbiAgICBbbmdTdHlsZV09XCJ7J3Zpc2liaWxpdHknOiBzcGlubmVyQ29udGFpbmVyID8gJ2hpZGRlbicgOiAndmlzaWJsZSd9XCI+XG4gIDwvbWF0LXBhZ2luYXRvcj5cblxuICA8IS0tTE9BRElORy0tPlxuICA8ZGl2ICNzcGlubmVyQ29udGFpbmVyICpuZ0lmPVwic2hvd0xvYWRpbmcgfCBhc3luY1wiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiBbbmdTdHlsZV09XCJ7J3RvcC5weCc6IHRvb2xCYXJIZWlnaHR9XCJcbiAgICBjbGFzcz1cInNwaW5uZXItY29udGFpbmVyXCIgW2NsYXNzLnNwaW5uZXItY29udGFpbmVyLXNjcm9sbGFibGVdPVwibG9hZGluZ1Njcm9sbCB8IGFzeW5jXCI+XG4gICAgPG8tdGFibGUtc2tlbGV0b24+PC9vLXRhYmxlLXNrZWxldG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIERpc2FibGUgYmxvY2tlciAtLT5cbiAgPGRpdiAqbmdJZj1cIiFlbmFibGVkXCIgY2xhc3M9XCJvLXRhYmxlLWRpc2FibGVkLWJsb2NrZXJcIj48L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RhYmxlPlxuICA8dGFibGUgbWF0LXRhYmxlICN0YWJsZSBbY2xhc3MuYXV0b2FkanVzdGVkXT1cImF1dG9BZGp1c3RcIiBbdHJhY2tCeV09XCJnZXRUcmFja0J5RnVuY3Rpb24oKVwiIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBvTWF0U29ydFxuICAgIFtvTWF0U29ydENvbHVtbnNdPVwic29ydENvbEFycmF5XCIgW25nQ2xhc3NdPVwicm93SGVpZ2h0T2JzZXJ2YWJsZSB8IGFzeW5jXCIgKGNka09ic2VydmVDb250ZW50KT1cInByb2plY3RDb250ZW50Q2hhbmdlZCgpXCJcbiAgICBvVGFibGVFeHBhbmRlZEZvb3RlciBbb1RhYmxlRXhwYW5kZWRGb290ZXJDb2xzcGFuXT1cInZpc2libGVDb2xBcnJheS5sZW5ndGhcIlxuICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwic2hvd0V4cGFuZGFibGVSb3coKVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJvbnRpbWl6ZS13ZWIgdGFibGVcIj5cblxuICAgIDwhLS1DaGVja2JveCBDb2x1bW4gLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm5hbWVcIiAqbmdJZj1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLnZpc2libGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGVDb2x1bW5TZWxlY3RBbGxDb250ZW50Q2hpbGQ7IGVsc2UgY3VzdG9tSGVhZGVyU2VsZWN0QWxsVGVtcGxhdGVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiICpuZ0lmPVwiaXNTZWxlY3Rpb25Nb2RlTXVsdGlwbGUoKVwiPlxuICAgICAgICAgICAgPG8tdGFibGUtaGVhZGVyLXNlbGVjdC1hbGwgW2NvbHVtbl09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtblwiPjwvby10YWJsZS1oZWFkZXItc2VsZWN0LWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggbmFtZT1cImlkW11cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZUNoZWNrYm94KHJvdylcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3Rpb25DaGVja2JveFRvZ2dsZSgkZXZlbnQsIHJvdylcIiBbY2hlY2tlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNjdXN0b21IZWFkZXJTZWxlY3RBbGxUZW1wbGF0ZT5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MucmVzaXphYmxlXT1cInJlc2l6YWJsZVwiIGNsYXNzPVwibWF0LWhlYWRlci1zZWxlY3QtYWxsLXdpdGgtdGl0bGUgby1jZW50ZXJcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi53aWR0aFwiIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4ob1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4pXCJcbiAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLm1heFdpZHRoXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxvLXRhYmxlLWhlYWRlci1zZWxlY3QtYWxsIFtjb2x1bW5dPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW5cIj48L28tdGFibGUtaGVhZGVyLXNlbGVjdC1hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cIm8tY2VudGVyXCIgW3N0eWxlLndpZHRoXT1cIm9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uLndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImdldE1pbldpZHRoQ29sdW1uKG9UYWJsZU9wdGlvbnMuc2VsZWN0Q29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4ubWF4V2lkdGhcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IG5hbWU9XCJpZFtdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVDaGVja2JveChyb3cpXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0aW9uQ2hlY2tib3hUb2dnbGUoJGV2ZW50LCByb3cpXCIgW2NoZWNrZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCI+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG5cbiAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+PC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS1FeHBhbmRhYmxlIENvbHVtbiAtLT5cbiAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwib1RhYmxlT3B0aW9ucy5leHBhbmRhYmxlQ29sdW1uLm5hbWVcIiAqbmdJZj1cImlzQ29sdW1uRXhwYW5kYWJsZSgpXCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICB7eyBvVGFibGVPcHRpb25zLmV4cGFuZGFibGVDb2x1bW4udGl0bGUgfX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O2xldCByb3dJbmRleCA9IGRhdGFJbmRleFwiPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzaG93RXhwYW5kYWJsZUljb24ocm93LCByb3dJbmRleCkgfCBhc3luY1wiIChjbGljayk9XCJ0b2dnbGVSb3dFeHBhbmRhYmxlKHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgKGtleWRvd24pPVwidG9nZ2xlUm93RXhwYW5kYWJsZShyb3csICRldmVudClcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFeHBhbmRlZChyb3cpXCI+e3sgdGFibGVSb3dFeHBhbmRhYmxlLmljb25Db2xsYXBzZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFeHBhbmRlZChyb3cpXCI+e3sgdGFibGVSb3dFeHBhbmRhYmxlLmljb25FeHBhbmQgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEdlbmVyaWMgY29sdW1uIGRlZmluaXRpb24gLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIG9UYWJsZU9wdGlvbnMuY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWVcIj5cbiAgICAgIDwhLS1EZWZpbmUgaGVhZGVyLWNlbGwtLT5cblxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbbmdDbGFzc109XCJnZXRUaXRsZUFsaWduQ2xhc3MoY29sdW1uKVwiIFtjbGFzcy5yZXNpemFibGVdPVwicmVzaXphYmxlXCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4oY29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwiY29sdW1uLm1heFdpZHRoXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICA8by10YWJsZS1oZWFkZXIgW2NvbHVtbl09XCJjb2x1bW5cIj48L28tdGFibGUtaGVhZGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGg+XG5cblxuICAgICAgPCEtLURlZmluZSBtYXQtY2VsbC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWJsZS5tdWx0aVRlbXBsYXRlRGF0YVJvd3M7IGVsc2UgY2VsbFRlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzXCI+XG4gICAgICAgIDx0ZCAjY2VsbCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7bGV0IHJvd0luZGV4ID0gaW5kZXggXCIgW25nQ2xhc3NdPVwiW2NvbHVtbi5jbGFzc05hbWUsIGdldENlbGxBbGlnbkNsYXNzKGNvbHVtbildXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2socm93LCBjb2x1bW4sIHJvd0luZGV4LCBjZWxsLCAkZXZlbnQpXCIgKGRibGNsaWNrKT1cImhhbmRsZURvdWJsZUNsaWNrKHJvdywgY29sdW1uLCByb3dJbmRleCwgY2VsbCwgJGV2ZW50KVwiXG4gICAgICAgICAgW2NsYXNzLmVtcHR5LWNlbGxdPVwiaXNFbXB0eShyb3dbY29sdW1uLm5hbWVdKVwiIFttYXRUb29sdGlwRGlzYWJsZWRdPVwiIWNvbHVtbi5oYXNUb29sdGlwKClcIiBbbWF0VG9vbHRpcF09XCJjb2x1bW4uZ2V0VG9vbHRpcChyb3cpXCJcbiAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI3NTBcIiBtYXRUb29sdGlwQ2xhc3M9XCJvLXRhYmxlLWNlbGwtdG9vbHRpcFwiXG4gICAgICAgICAgW2NsYXNzLm8tbWF0LWNlbGwtbXVsdGlsaW5lXT1cIihjb2x1bW4uaXNNdWx0aWxpbmUgfCBhc3luYylcIiBbb0NvbnRleHRNZW51XT1cInRhYmxlQ29udGV4dE1lbnVcIlxuICAgICAgICAgIFtvQ29udGV4dE1lbnVEYXRhXT1cInsgY2VsbE5hbWU6Y29sdW1uLm5hbWUsIHJvd1ZhbHVlOnJvdywgcm93SW5kZXg6cm93SW5kZXh9XCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFwiXG4gICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCJnZXRNaW5XaWR0aENvbHVtbihjb2x1bW4pXCIgW3N0eWxlLm1heC13aWR0aF09XCJjb2x1bW4ubWF4V2lkdGhcIlxuICAgICAgICAgIFtjbGFzcy5vLXRhYmxlLWVkaXRpbmctY2VsbF09XCJpc1Jvd1NlbGVjdGVkKHJvdykgJiYgY29sdW1uLmVkaXRpbmdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2VsbFJlbmRlcmVyO2NvbnRleHQ6e2NvbHVtbjpjb2x1bW4scm93OnJvd31cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNjZWxsVGVtcGxhdGVNdWx0aVRlbXBsYXRlRGF0YVJvd3M+XG4gICAgICAgIDx0ZCAjY2VsbCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7bGV0IHJvd0luZGV4ID0gZGF0YUluZGV4IFwiIFtuZ0NsYXNzXT1cIltjb2x1bW4uY2xhc3NOYW1lLCBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXVwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKHJvdywgY29sdW1uLCByb3dJbmRleCwgY2VsbCwgJGV2ZW50KVwiIChkYmxjbGljayk9XCJoYW5kbGVEb3VibGVDbGljayhyb3csIGNvbHVtbiwgcm93SW5kZXgsIGNlbGwsICRldmVudClcIlxuICAgICAgICAgIFtjbGFzcy5lbXB0eS1jZWxsXT1cImlzRW1wdHkocm93W2NvbHVtbi5uYW1lXSlcIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFjb2x1bW4uaGFzVG9vbHRpcCgpXCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLmdldFRvb2x0aXAocm93KVwiXG4gICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNzUwXCIgbWF0VG9vbHRpcENsYXNzPVwiby10YWJsZS1jZWxsLXRvb2x0aXBcIlxuICAgICAgICAgIFtjbGFzcy5vLW1hdC1jZWxsLW11bHRpbGluZV09XCIoY29sdW1uLmlzTXVsdGlsaW5lIHwgYXN5bmMpXCIgW29Db250ZXh0TWVudV09XCJ0YWJsZUNvbnRleHRNZW51XCJcbiAgICAgICAgICBbb0NvbnRleHRNZW51RGF0YV09XCJ7IGNlbGxOYW1lOmNvbHVtbi5uYW1lLCByb3dWYWx1ZTpyb3csIHJvd0luZGV4OnJvd0luZGV4fVwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhcIlxuICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiZ2V0TWluV2lkdGhDb2x1bW4oY29sdW1uKVwiIFtzdHlsZS5tYXgtd2lkdGhdPVwiY29sdW1uLm1heFdpZHRoXCJcbiAgICAgICAgICBbY2xhc3Muby10YWJsZS1lZGl0aW5nLWNlbGxdPVwiaXNSb3dTZWxlY3RlZChyb3cpICYmIGNvbHVtbi5lZGl0aW5nXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxSZW5kZXJlcjtjb250ZXh0Ontjb2x1bW46Y29sdW1uLHJvdzpyb3d9XCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8IS0tRGVmaW5lIG1hdC1mb290ZXItY2VsbC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dUb3RhbHMgfCBhc3luY1wiPlxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIFtuZ0NsYXNzXT1cImNvbHVtbi5jbGFzc05hbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIiAqbmdJZj1cImNvbHVtbi5hZ2dyZWdhdGUgJiYgY29sdW1uLmFnZ3JlZ2F0ZS50aXRsZVwiPlxuICAgICAgICAgICAge3sgY29sdW1uLmFnZ3JlZ2F0ZS50aXRsZSB8IG9UcmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbi5yZW5kZXJlciB8fCBjb2x1bW4uYWdncmVnYXRlPy5vcGVyYXRvciA9PT0gJ2NvdW50JzsgZWxzZSByZW5kZXJlclRlbXBsYXRlXCI+XG4gICAgICAgICAgICB7eyBkYXRhU291cmNlLmdldEFnZ3JlZ2F0ZURhdGEoY29sdW1uKSB9fVxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVuZGVyZXJUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNvbHVtbi5yZW5kZXJlciAmJiBjb2x1bW4uYWdncmVnYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLnJlbmRlcmVyLnRlbXBsYXRlcmVmXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjZWxsdmFsdWU6IGRhdGFTb3VyY2UuZ2V0QWdncmVnYXRlRGF0YShjb2x1bW4pfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRXhwYW5kZWQgQ29udGVudCBDb2x1bW4gLSBUaGUgZGV0YWlsIHJvdyBpcyBtYWRlIHVwIG9mIHRoaXMgb25lIGNvbHVtbiB0aGF0IHNwYW5zIGFjcm9zcyBhbGwgY29sdW1ucyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRXhwYW5kZWRSb3dcIj5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZXhwYW5kZWREZXRhaWxcIj5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdztsZXQgcm93SW5kZXg9IGRhdGFJbmRleFwiIFthdHRyLmNvbHNwYW5dPVwib1RhYmxlT3B0aW9ucy52aXNpYmxlQ29sdW1ucy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldEV4cGFuZGVkUm93Q29udGFpbmVyQ2xhc3Mocm93SW5kZXgpXCIgW0BkZXRhaWxFeHBhbmRdPVwiZ2V0U3RhdGVFeHBhbmQocm93KVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tRk9PVEVSLUlOU0VSVEFCTEUtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0xhc3RJbnNlcnRhYmxlUm93ICYmIG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5uYW1lICsgZ2V0U3VmZml4Q29sdW1uSW5zZXJ0YWJsZSgpXCIgKm5nSWY9XCJvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi52aXNpYmxlXCI+XG4gICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBvVGFibGVPcHRpb25zLmNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5uYW1lKyBnZXRTdWZmaXhDb2x1bW5JbnNlcnRhYmxlKClcIj5cblxuICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmIFtuZ0NsYXNzXT1cIltjb2x1bW4uY2xhc3NOYW1lLCBnZXRDZWxsQWxpZ25DbGFzcyhjb2x1bW4pXVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uSW5zZXJ0YWJsZShjb2x1bW4pICYmICFvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnVzZUNlbGxFZGl0b3IoY29sdW1uKVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5zZXJ0YWJsZS1mb3JtLWZpZWxkIG8tdGFibGUtY2VsbC1lZGl0b3ItdGV4dCBvLXRhYmxlLWNlbGwtZWRpdG9yXCIgW2hpZGVSZXF1aXJlZE1hcmtlcl09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5nZXRQbGFjZWhvbGRlcihjb2x1bW4pXCIgW2lkXT1cImNvbHVtbi5hdHRyXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5nZXRDb250cm9sKGNvbHVtbilcIiBbcmVxdWlyZWRdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5pc0NvbHVtblJlcXVpcmVkKGNvbHVtbilcIj5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqb01hdEVycm9yPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5jb2x1bW5IYXNFcnJvcihjb2x1bW4sICdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAge3sgJ0ZPUk1fVkFMSURBVElPTi5SRVFVSVJFRCcgfCBvVHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uSW5zZXJ0YWJsZShjb2x1bW4pICYmIG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQudXNlQ2VsbEVkaXRvcihjb2x1bW4pXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwib1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC5jb2x1bW5FZGl0b3JzW2NvbHVtbi5hdHRyXS50ZW1wbGF0ZXJlZlwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHJvd3ZhbHVlOiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LnJvd0RhdGEgfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpcnN0SW5zZXJ0YWJsZVJvdyAmJiBvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwiZ2V0Q29sdW1uSW5zZXJ0YWJsZShvVGFibGVPcHRpb25zLnNlbGVjdENvbHVtbi5uYW1lKVwiICpuZ0lmPVwib1RhYmxlT3B0aW9ucy5zZWxlY3RDb2x1bW4udmlzaWJsZVwiPlxuICAgICAgICA8dGQgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2Ygb1RhYmxlT3B0aW9ucy5jb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJnZXRDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbi5uYW1lKVwiPlxuXG4gICAgICAgIDx0ZCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW25nQ2xhc3NdPVwiW2NvbHVtbi5jbGFzc05hbWUsIGdldENlbGxBbGlnbkNsYXNzKGNvbHVtbildXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbikgJiYgIW9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQudXNlQ2VsbEVkaXRvcihjb2x1bW4pXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnNlcnRhYmxlLWZvcm0tZmllbGRcIiBbaGlkZVJlcXVpcmVkTWFya2VyXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmdldFBsYWNlaG9sZGVyKGNvbHVtbilcIiBbaWRdPVwiY29sdW1uLmF0dHJcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmdldENvbnRyb2woY29sdW1uKVwiIFtyZXF1aXJlZF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmlzQ29sdW1uUmVxdWlyZWQoY29sdW1uKVwiPlxuICAgICAgICAgICAgICA8bWF0LWVycm9yICpvTWF0RXJyb3I9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmNvbHVtbkhhc0Vycm9yKGNvbHVtbiwgJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICB7eyAnRk9STV9WQUxJREFUSU9OLlJFUVVJUkVEJyB8IG9UcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaXNDb2x1bW5JbnNlcnRhYmxlKGNvbHVtbikgJiYgb1RhYmxlSW5zZXJ0YWJsZVJvd0NvbXBvbmVudC51c2VDZWxsRWRpdG9yKGNvbHVtbilcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmNvbHVtbkVkaXRvcnNbY29sdW1uLmF0dHJdLnRlbXBsYXRlcmVmXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcm93dmFsdWU6IG9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQucm93RGF0YSB9XCI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRGVmaW5pdGlvbiBjb2x1bW4gZ3JvdXAgaGVhZGVyIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBncm91cGluZ0hlYWRlcnNSb3dzOyBsZXQgaSA9IGluZGV4XCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW5cIj5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBncm91cFwiIGNsYXNzPVwiZ3JvdXBpbmctcm93XCIgW29Db250ZXh0TWVudV09XCJ0YWJsZUNvbnRleHRNZW51XCJcbiAgICAgICAgW29Db250ZXh0TWVudURhdGFdPVwieyBjZWxsTmFtZTpjb2x1bW4sIHJvd1ZhbHVlOmdyb3VwLCByb3dJbmRleDppfVwiIFtuZ0NsYXNzXT1cImdldEdyb3VwSGVhZGVyQ2VsbEFsaWduQ2xhc3MoY29sdW1uKVwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaT09PTBcIiBjbGFzcz1cImdyb3VwaW5nLXRpdGxlLXdyYXBwZXJcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctbGVmdCc6IDIwKihncm91cC5sZXZlbC0xKSsncHgnfVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj57eyBncm91cC5leHBhbmRlZCA/ICdleHBhbmRfbW9yZScgOiAnY2hldnJvbl9yaWdodCcgfX08L21hdC1pY29uPlxuICAgICAgICAgIHt7IGdyb3VwLnRpdGxlIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXBpbmctYWdncmVnYXRlXCIgKm5nSWY9XCJncm91cC5oYXNBY3RpdmVBZ2dyZWdhdGUodmlzaWJsZUNvbEFycmF5W2ldKVwiPlxuICAgICAgICAgIHt7IGdyb3VwLmdldENvbHVtbkFjdGl2ZUFnZ3JlZ2F0ZVRpdGxlKHZpc2libGVDb2xBcnJheVtpXSkgfCBvVHJhbnNsYXRlIH19IDpcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWdldE9Db2x1bW5Gcm9tR3JvdXBIZWFkZXJDb2x1bW4oY29sdW1uKS5yZW5kZXJlclwiPlxuICAgICAgICAgICAge3sgZ3JvdXAuZ2V0Q29sdW1uQWdncmVnYXRlVmFsdWUodmlzaWJsZUNvbEFycmF5W2ldKX19XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldE9Db2x1bW5Gcm9tR3JvdXBIZWFkZXJDb2x1bW4oY29sdW1uKS5yZW5kZXJlclwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0T0NvbHVtbkZyb21Hcm91cEhlYWRlckNvbHVtbihjb2x1bW4pLnJlbmRlcmVyPy50ZW1wbGF0ZXJlZjsgY29udGV4dDp7IGNlbGx2YWx1ZTogIGdyb3VwLmdldENvbHVtbkFnZ3JlZ2F0ZVZhbHVlKHZpc2libGVDb2xBcnJheVtpXSkgfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwb3NpdGlvblwiPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPiB7e3Jvd319IDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHIgI3RhYmxlSGVhZGVyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJvVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zOyBzdGlja3k6IGZpeGVkSGVhZGVyXCI+PC90cj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGUubXVsdGlUZW1wbGF0ZURhdGFSb3dzOyBlbHNlIHJvd1RlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzXCI+XG4gICAgICA8dHIgbWF0LXJvdyBvVGFibGVSb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IG9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnM7IHdoZW46aXNOb3RHcm91cDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxuICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCIgW25nQ2xhc3NdPVwicm93IHwgb1RhYmxlUm93Q2xhc3M6IHJvd0luZGV4OiByb3dDbGFzc1wiPlxuICAgICAgPC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3Jvd1RlbXBsYXRlTXVsdGlUZW1wbGF0ZURhdGFSb3dzPlxuICAgICAgPHRyIG1hdC1yb3cgb1RhYmxlUm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBvVGFibGVPcHRpb25zLnZpc2libGVDb2x1bW5zOyB3aGVuOmlzTm90R3JvdXA7IGxldCByb3dJbmRleCA9IGRhdGFJbmRleFwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIiBbbmdDbGFzc109XCJyb3cgfCBvVGFibGVSb3dDbGFzczogcm93SW5kZXg6IHJvd0NsYXNzXCI+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIFJvdyBHcm91cCBoZWFkZXIgLS0+XG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGdyb3VwaW5nSGVhZGVyc1Jvd3M7IHdoZW46aXNHcm91cFwiIChjbGljayk9XCJncm91cEhlYWRlckNsaWNrKHJvdylcIlxuICAgICAgW25nQ2xhc3NdPVwiZ2V0Q2xhc3NOYW1lR3JvdXBIZWFkZXIocm93KVwiPlxuICAgIDwvdHI+XG5cbiAgICA8IS0tIEV4cGFuZGVkIGRldGFpbCByb3ctLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRXhwYW5kZWRSb3dcIj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2V4cGFuZGVkRGV0YWlsJ11cIiBjbGFzcz1cIm8tdGFibGUtcm93LWV4cGFuZGVkXCI+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93TGFzdEluc2VydGFibGVSb3dcIj5cbiAgICAgIDx0ciBtYXQtZm9vdGVyLXJvdyAqbWF0Rm9vdGVyUm93RGVmPVwib1RhYmxlT3B0aW9ucy5jb2x1bW5zSW5zZXJ0YWJsZXM7IHN0aWNreTogdHJ1ZVwiXG4gICAgICAgIChrZXl1cCk9XCJvVGFibGVJbnNlcnRhYmxlUm93Q29tcG9uZW50LmhhbmRsZUtleWJvYXJkRXZlbnQoJGV2ZW50KVwiIGNsYXNzPVwiby10YWJsZS1pbnNlcnRhYmxlXCI+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpcnN0SW5zZXJ0YWJsZVJvd1wiPlxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJvVGFibGVPcHRpb25zLmNvbHVtbnNJbnNlcnRhYmxlczsgc3RpY2t5OiB0cnVlXCJcbiAgICAgICAgKGtleXVwKT1cIm9UYWJsZUluc2VydGFibGVSb3dDb21wb25lbnQuaGFuZGxlS2V5Ym9hcmRFdmVudCgkZXZlbnQpXCIgY2xhc3M9XCJvLXRhYmxlLWluc2VydGFibGVcIj4gPC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1RvdGFscyB8IGFzeW5jXCI+XG4gICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cIm9UYWJsZU9wdGlvbnMudmlzaWJsZUNvbHVtbnM7IHN0aWNreTogdHJ1ZVwiIGNsYXNzPVwiby10YWJsZS1hZ2dyZWdhdGVcIj5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdGFibGU+XG5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGV4dE1lbnVDb250ZW50Q2hpbGQgJiYgY29udGV4dE1lbnVcIj5cbiAgPG8tdGFibGUtY29udGV4dC1tZW51IFtpbnNlcnRdPVwiaW5zZXJ0QnV0dG9uXCIgW2VkaXRdPVwiZWRpdGlvbk1vZGUgIT09IEVESVRfTU9ERV9OT05FXCIgW3ZpZXctZGV0YWlsXT1cImRldGFpbE1vZGUgIT09IERFVEFJTF9NT0RFX05PTkVcIlxuICAgIFtyZWZyZXNoXT1cInJlZnJlc2hCdXR0b25cIiBbZGVsZXRlXT1cImRlbGV0ZUJ1dHRvblwiIFtmaWx0ZXJdPVwic2hvd0ZpbHRlck9wdGlvblwiIFtncm91cC1ieS1yb3ddPVwiZ3JvdXBhYmxlXCI+XG4gIDwvby10YWJsZS1jb250ZXh0LW1lbnU+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNjZWxsUmVuZGVyZXIgbGV0LXJvdz1cInJvd1wiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cblxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInRydWVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImNvbHVtbi5yZW5kZXJlciAhPSBudWxsICYmICghY29sdW1uLmVkaXRpbmcgfHwgY29sdW1uLmVkaXRpbmcgJiYgIWlzUm93U2VsZWN0ZWQocm93KSlcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uLnJlbmRlcmVyPy50ZW1wbGF0ZXJlZjsgY29udGV4dDp7IGNlbGx2YWx1ZTogcm93W2NvbHVtbi5uYW1lXSwgcm93dmFsdWU6cm93IH1cIj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNSb3dTZWxlY3RlZChyb3cpICYmIGNvbHVtbi5lZGl0aW5nXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5lZGl0b3I/LnRlbXBsYXRlcmVmOyBjb250ZXh0OnsgY2VsbHZhbHVlOiByb3dbY29sdW1uLm5hbWVdLCByb3d2YWx1ZTpyb3cgfVwiPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImNvbHVtbi50eXBlID09PSAnZWRpdEJ1dHRvbkluUm93JyB8fCBjb2x1bW4udHlwZSA9PT0gJ2RldGFpbEJ1dHRvbkluUm93J1wiPlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCIgY2xhc3M9XCJvLWFjdGlvbi1jZWxsLXJlbmRlcmVyXCIgKGNsaWNrKT1cIm9uRGV0YWlsQnV0dG9uQ2xpY2soY29sdW1uLCByb3csICRldmVudClcIj5cbiAgICAgICAgICA8bWF0LWljb24+e3sgZ2V0RGV0YWlsQnV0dG9uSWNvbihjb2x1bW4pIH19PC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD57eyByb3dbY29sdW1uLm5hbWVdIH19PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19