verben-ng-ui 1.3.4 → 1.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/esm2022/src/lib/components/data-columns/data-columns.component.mjs +45 -9
  2. package/esm2022/src/lib/components/data-filter/data-filter.component.mjs +179 -24
  3. package/esm2022/src/lib/components/data-filter/data-filter.types.mjs +9 -1
  4. package/esm2022/src/lib/components/data-table/data-table.types.mjs +18 -2
  5. package/esm2022/src/lib/components/data-view/data-view.component.mjs +3 -3
  6. package/esm2022/src/lib/components/date-picker/date-picker.component.mjs +3 -3
  7. package/fesm2022/verben-ng-ui-src-lib-components-data-columns.mjs +43 -7
  8. package/fesm2022/verben-ng-ui-src-lib-components-data-columns.mjs.map +1 -1
  9. package/fesm2022/verben-ng-ui-src-lib-components-data-filter.mjs +185 -22
  10. package/fesm2022/verben-ng-ui-src-lib-components-data-filter.mjs.map +1 -1
  11. package/fesm2022/verben-ng-ui-src-lib-components-data-table.mjs +18 -1
  12. package/fesm2022/verben-ng-ui-src-lib-components-data-table.mjs.map +1 -1
  13. package/fesm2022/verben-ng-ui-src-lib-components-data-view.mjs +2 -2
  14. package/fesm2022/verben-ng-ui-src-lib-components-data-view.mjs.map +1 -1
  15. package/fesm2022/verben-ng-ui-src-lib-components-date-picker.mjs +2 -2
  16. package/fesm2022/verben-ng-ui-src-lib-components-date-picker.mjs.map +1 -1
  17. package/package.json +52 -52
  18. package/src/lib/components/data-columns/data-columns.component.d.ts +12 -3
  19. package/src/lib/components/data-filter/data-filter.component.d.ts +59 -7
  20. package/src/lib/components/data-filter/data-filter.types.d.ts +4 -2
  21. package/src/lib/components/data-table/data-table.types.d.ts +31 -0
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
1
+ import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "verben-ng-ui/src/lib/components/svg";
4
4
  import * as i2 from "verben-ng-ui/src/lib/components/card";
@@ -6,21 +6,46 @@ export class DataColumnsComponent {
6
6
  columns;
7
7
  enableDragAndDrop = true;
8
8
  maxVisibleItems = 5;
9
+ /**
10
+ * Optional restored/active selection: the columns that should be checked, in
11
+ * the order to display them. When provided, the panel opens reflecting this
12
+ * (these checked and ordered first, remaining columns shown unchecked).
13
+ * Defaults to "all columns checked" when omitted.
14
+ */
15
+ selectedColumns;
9
16
  columnsUpdated = new EventEmitter();
10
17
  visibleColumns = [];
11
18
  showAllColumns = false;
12
19
  draggedIndex = null;
13
20
  selectAll = false;
14
21
  columnVisibility = new Map();
22
+ // Set once the user edits the panel, so later host input changes don't clobber
23
+ // their in-progress selection. Reset to defaults by Reset.
24
+ userTouched = false;
15
25
  ngOnInit() {
16
26
  this.initializeColumns();
17
27
  }
28
+ ngOnChanges(changes) {
29
+ // Re-derive from inputs whenever the host provides them (e.g. saved column
30
+ // arrangement restored asynchronously), unless the user has started editing.
31
+ if ((changes['selectedColumns'] || changes['columns']) && !this.userTouched) {
32
+ this.initializeColumns();
33
+ }
34
+ }
18
35
  initializeColumns() {
19
- this.visibleColumns = [...this.columns];
20
- // Initialize visibility map with current column states
21
- this.visibleColumns.forEach((column) => {
22
- this.columnVisibility.set(column.id, true);
23
- });
36
+ this.columnVisibility = new Map();
37
+ const selected = this.selectedColumns;
38
+ if (selected && selected.length) {
39
+ const selectedIds = new Set(selected.map((column) => column.id));
40
+ const hidden = this.columns.filter((column) => !selectedIds.has(column.id));
41
+ // Selected (checked) first, in their saved order, then the rest unchecked.
42
+ this.visibleColumns = [...selected, ...hidden];
43
+ this.visibleColumns.forEach((column) => this.columnVisibility.set(column.id, selectedIds.has(column.id)));
44
+ }
45
+ else {
46
+ this.visibleColumns = [...this.columns];
47
+ this.visibleColumns.forEach((column) => this.columnVisibility.set(column.id, true));
48
+ }
24
49
  this.updateSelectAllStatus();
25
50
  }
26
51
  get columnsToShow() {
@@ -53,6 +78,7 @@ export class DataColumnsComponent {
53
78
  const temp = this.visibleColumns[fromIndex];
54
79
  this.visibleColumns[fromIndex] = this.visibleColumns[toIndex];
55
80
  this.visibleColumns[toIndex] = temp;
81
+ this.userTouched = true;
56
82
  // Staged only — applied/emitted when the user clicks Save (see template).
57
83
  }
58
84
  // Column Selection functionality
@@ -62,12 +88,14 @@ export class DataColumnsComponent {
62
88
  this.visibleColumns.forEach((column) => {
63
89
  this.columnVisibility.set(column.id, newValue);
64
90
  });
91
+ this.userTouched = true;
65
92
  // Staged only — applied/emitted when the user clicks Save (see template).
66
93
  }
67
94
  toggleColumnVisibility(columnId) {
68
95
  const currentValue = this.columnVisibility.get(columnId);
69
96
  this.columnVisibility.set(columnId, !currentValue);
70
97
  this.updateSelectAllStatus();
98
+ this.userTouched = true;
71
99
  // Staged only — applied/emitted when the user clicks Save (see template).
72
100
  }
73
101
  isColumnVisible(columnId) {
@@ -82,7 +110,13 @@ export class DataColumnsComponent {
82
110
  : column.header;
83
111
  }
84
112
  resetColumns() {
85
- this.initializeColumns();
113
+ // Reset restores the default (all columns visible, config order) regardless
114
+ // of the restored selection, then applies immediately.
115
+ this.userTouched = true;
116
+ this.columnVisibility = new Map();
117
+ this.visibleColumns = [...this.columns];
118
+ this.visibleColumns.forEach((column) => this.columnVisibility.set(column.id, true));
119
+ this.updateSelectAllStatus();
86
120
  this.emitUpdatedColumns();
87
121
  }
88
122
  emitUpdatedColumns() {
@@ -94,7 +128,7 @@ export class DataColumnsComponent {
94
128
  .length;
95
129
  }
96
130
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataColumnsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
97
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.10", type: DataColumnsComponent, selector: "lib-data-columns", inputs: { columns: "columns", enableDragAndDrop: "enableDragAndDrop", maxVisibleItems: "maxVisibleItems" }, outputs: { columnsUpdated: "columnsUpdated" }, ngImport: i0, template: "<verben-card width=\"24rem\" borderRadius=\"1rem\" [border]=\"'1px solid var(--vbn-color-primary)'\" bgColor=\"var(--vbn-color-surface)\">\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Column <sup>({{ activeColumnCount }})</sup></h4>\n <button class=\"reset-button\" (click)=\"resetColumns()\">Reset</button>\n </div>\n \n <div card-body class=\"card-body\">\n <!-- Column Options -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Properties</h3>\n <verben-svg icon=\"info\" [width]=\"15\" [height]=\"15\" fill=\"var(--vbn-color-text-muted)\"></verben-svg>\n </div>\n \n <!-- Select All -->\n <div class=\"select-all-wrapper\">\n <label class=\"select-all\">\n <input \n type=\"checkbox\" \n [checked]=\"selectAll\"\n (change)=\"toggleSelectAll()\"\n />\n <span>Select All</span>\n </label>\n </div>\n \n @for (column of columnsToShow; track column.id) {\n <div \n class=\"column-option\"\n [attr.draggable]=\"enableDragAndDrop\"\n (dragstart)=\"onDragStart($index, $event)\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($index, $event)\"\n >\n <div class=\"column-option-content\">\n @if (enableDragAndDrop) {\n <verben-svg\n icon=\"square-dot\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text)\"\n class=\"drag-handle\"\n ></verben-svg>\n }\n <input \n type=\"checkbox\" \n [checked]=\"isColumnVisible(column.id)\"\n (change)=\"toggleColumnVisibility(column.id)\"\n />\n <span>{{ getColumnHeader(column) }}</span>\n </div>\n </div>\n }\n \n @if (visibleColumns.length > maxVisibleItems) {\n <button\n (click)=\"showAllColumns = !showAllColumns\"\n class=\"show-more\"\n >\n <span>{{ showAllColumns ? \"Show Less\" : \"Show More\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n }\n </section>\n </div>\n \n <div card-footer class=\"card-footer\">\n <button class=\"save-button\" (click)=\"emitUpdatedColumns()\">Save</button>\n </div>\n </verben-card>", styles: [".card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.header-title sup{color:var(--vbn-color-border-focus)}.reset-button{color:var(--vbn-color-border-focus);background-color:transparent;border:none;cursor:pointer;font-size:12px}.card-body{display:flex;flex-direction:column;gap:.5rem}.section{display:flex;flex-direction:column;gap:.75rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.select-all-wrapper{display:flex;align-items:center}.select-all{display:flex;align-items:center;gap:.5rem;font-size:12px;font-weight:500;cursor:pointer}.column-option{margin:0 -1.5rem;cursor:move}.column-option-content{display:flex;align-items:center;gap:.5rem;font-size:12px}.drag-handle{cursor:grab}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer;font-size:12px}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.save-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "component", type: i1.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i2.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }] });
131
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.10", type: DataColumnsComponent, selector: "lib-data-columns", inputs: { columns: "columns", enableDragAndDrop: "enableDragAndDrop", maxVisibleItems: "maxVisibleItems", selectedColumns: "selectedColumns" }, outputs: { columnsUpdated: "columnsUpdated" }, usesOnChanges: true, ngImport: i0, template: "<verben-card width=\"24rem\" borderRadius=\"1rem\" [border]=\"'1px solid var(--vbn-color-primary)'\" bgColor=\"var(--vbn-color-surface)\">\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Column <sup>({{ activeColumnCount }})</sup></h4>\n <button class=\"reset-button\" (click)=\"resetColumns()\">Reset</button>\n </div>\n \n <div card-body class=\"card-body\">\n <!-- Column Options -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Properties</h3>\n <verben-svg icon=\"info\" [width]=\"15\" [height]=\"15\" fill=\"var(--vbn-color-text-muted)\"></verben-svg>\n </div>\n \n <!-- Select All -->\n <div class=\"select-all-wrapper\">\n <label class=\"select-all\">\n <input \n type=\"checkbox\" \n [checked]=\"selectAll\"\n (change)=\"toggleSelectAll()\"\n />\n <span>Select All</span>\n </label>\n </div>\n \n @for (column of columnsToShow; track column.id) {\n <div \n class=\"column-option\"\n [attr.draggable]=\"enableDragAndDrop\"\n (dragstart)=\"onDragStart($index, $event)\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($index, $event)\"\n >\n <div class=\"column-option-content\">\n @if (enableDragAndDrop) {\n <verben-svg\n icon=\"square-dot\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text)\"\n class=\"drag-handle\"\n ></verben-svg>\n }\n <input \n type=\"checkbox\" \n [checked]=\"isColumnVisible(column.id)\"\n (change)=\"toggleColumnVisibility(column.id)\"\n />\n <span>{{ getColumnHeader(column) }}</span>\n </div>\n </div>\n }\n \n @if (visibleColumns.length > maxVisibleItems) {\n <button\n (click)=\"showAllColumns = !showAllColumns\"\n class=\"show-more\"\n >\n <span>{{ showAllColumns ? \"Show Less\" : \"Show More\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n }\n </section>\n </div>\n \n <div card-footer class=\"card-footer\">\n <button class=\"save-button\" (click)=\"emitUpdatedColumns()\">Save</button>\n </div>\n </verben-card>", styles: [".card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.header-title sup{color:var(--vbn-color-border-focus)}.reset-button{color:var(--vbn-color-border-focus);background-color:transparent;border:none;cursor:pointer;font-size:12px}.card-body{display:flex;flex-direction:column;gap:.5rem}.section{display:flex;flex-direction:column;gap:.75rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.select-all-wrapper{display:flex;align-items:center}.select-all{display:flex;align-items:center;gap:.5rem;font-size:12px;font-weight:500;cursor:pointer}.column-option{margin:0 -1.5rem;cursor:move}.column-option-content{display:flex;align-items:center;gap:.5rem;font-size:12px}.drag-handle{cursor:grab}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer;font-size:12px}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.save-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "component", type: i1.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i2.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }] });
98
132
  }
99
133
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataColumnsComponent, decorators: [{
100
134
  type: Component,
@@ -105,7 +139,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImpo
105
139
  type: Input
106
140
  }], maxVisibleItems: [{
107
141
  type: Input
142
+ }], selectedColumns: [{
143
+ type: Input
108
144
  }], columnsUpdated: [{
109
145
  type: Output
110
146
  }] } });
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb2x1bW5zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS1jb2x1bW5zL2RhdGEtY29sdW1ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtY29sdW1ucy9kYXRhLWNvbHVtbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQVUvRSxNQUFNLE9BQU8sb0JBQW9CO0lBQ3RCLE9BQU8sQ0FBeUI7SUFDaEMsaUJBQWlCLEdBQVksSUFBSSxDQUFDO0lBQ2xDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFDM0IsY0FBYyxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO0lBRXJFLGNBQWMsR0FBMEIsRUFBRSxDQUFDO0lBQzNDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsWUFBWSxHQUFrQixJQUFJLENBQUM7SUFDbkMsU0FBUyxHQUFZLEtBQUssQ0FBQztJQUMzQixnQkFBZ0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVuRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMs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dCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb24gfSBmcm9tICd2ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGF0YS1jb2x1bW5zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtY29sdW1ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYXRhLWNvbHVtbnMuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFDb2x1bW5zQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgY29sdW1ucyE6IENvbHVtbkRlZmluaXRpb248VD5bXTtcbiAgQElucHV0KCkgZW5hYmxlRHJhZ0FuZERyb3A6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBtYXhWaXNpYmxlSXRlbXM6IG51bWJlciA9IDU7XG4gIEBPdXRwdXQoKSBjb2x1bW5zVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uRGVmaW5pdGlvbjxUPltdPigpO1xuXG4gIHZpc2libGVDb2x1bW5zOiBDb2x1bW5EZWZpbml0aW9uPFQ+W10gPSBbXTtcbiAgc2hvd0FsbENvbHVtbnMgPSBmYWxzZTtcbiAgZHJhZ2dlZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbHVtblZpc2liaWxpdHk6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbHVtbnMoKSB7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IFsuLi50aGlzLmNvbHVtbnNdO1xuICAgIC8vIEluaXRpYWxpemUgdmlzaWJpbGl0eSBtYXAgd2l0aCBjdXJyZW50IGNvbHVtbiBzdGF0ZXNcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5LnNldChjb2x1bW4uaWQsIHRydWUpO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0QWxsU3RhdHVzKCk7XG4gIH1cblxuICBnZXQgY29sdW1uc1RvU2hvdygpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93QWxsQ29sdW1uc1xuICAgICAgPyB0aGlzLnZpc2libGVDb2x1bW5zXG4gICAgICA6IHRoaXMudmlzaWJsZUNvbHVtbnMuc2xpY2UoMCwgdGhpcy5tYXhWaXNpYmxlSXRlbXMpO1xuICB9XG5cbiAgLy8gRHJhZyBhbmQgRHJvcCBmdW5jdGlvbmFsaXR5XG4gIG9uRHJhZ1N0YXJ0KGluZGV4OiBudW1iZXIsIGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlRHJhZ0FuZERyb3ApIHJldHVybjtcbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IGluZGV4O1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlcj8uc2V0RGF0YSgndGV4dC9wbGFpbicsIFN0cmluZyhpbmRleCkpO1xuICB9XG5cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZURyYWdBbmREcm9wKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIG9uRHJvcChpbmRleDogbnVtYmVyLCBldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZURyYWdBbmREcm9wKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy5kcmFnZ2VkSW5kZXggIT09IG51bGwgJiYgdGhpcy5kcmFnZ2VkSW5kZXggIT09IGluZGV4KSB7XG4gICAgICB0aGlzLnN3YXBDb2x1bW5zKHRoaXMuZHJhZ2dlZEluZGV4LCBpbmRleCk7XG4gICAgfVxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3dhcENvbHVtbnMoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHRlbXAgPSB0aGlzLnZpc2libGVDb2x1bW5zW2Zyb21JbmRleF07XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uc1tmcm9tSW5kZXhdID0gdGhpcy52aXNpYmxlQ29sdW1uc1t0b0luZGV4XTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zW3RvSW5kZXhdID0gdGVtcDtcbiAgICAvLyBTdGFnZWQgb25seSDigJQgYXBwbGllZC9lbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFNhdmUgKHNlZSB0ZW1wbGF0ZSkuXG4gIH1cblxuICAvLyBDb2x1bW4gU2VsZWN0aW9uIGZ1bmN0aW9uYWxpdHlcbiAgdG9nZ2xlU2VsZWN0QWxsKCkge1xuICAgIHRoaXMuc2VsZWN0QWxsID0gIXRoaXMuc2VsZWN0QWxsO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5zZWxlY3RBbGw7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIHRoaXMuY29sdW1uVmlzaWJpbGl0eS5zZXQoY29sdW1uLmlkLCBuZXdWYWx1ZSk7XG4gICAgfSk7XG4gICAgLy8gU3RhZ2VkIG9ubHkg4oCUIGFwcGxpZWQvZW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBTYXZlIChzZWUgdGVtcGxhdGUpLlxuICB9XG5cbiAgdG9nZ2xlQ29sdW1uVmlzaWJpbGl0eShjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5jb2x1bW5WaXNpYmlsaXR5LmdldChjb2x1bW5JZCk7XG4gICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5LnNldChjb2x1bW5JZCwgIWN1cnJlbnRWYWx1ZSk7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RBbGxTdGF0dXMoKTtcbiAgICAvLyBTdGFnZWQgb25seSDigJQgYXBwbGllZC9lbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFNhdmUgKHNlZSB0ZW1wbGF0ZSkuXG4gIH1cblxuICBpc0NvbHVtblZpc2libGUoY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblZpc2liaWxpdHkuZ2V0KGNvbHVtbklkKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0QWxsU3RhdHVzKCkge1xuICAgIHRoaXMuc2VsZWN0QWxsID0gQXJyYXkuZnJvbSh0aGlzLmNvbHVtblZpc2liaWxpdHkudmFsdWVzKCkpLmV2ZXJ5KFxuICAgICAgKHZhbHVlKSA9PiB2YWx1ZVxuICAgICk7XG4gIH1cblxuICBnZXRDb2x1bW5IZWFkZXIoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIGNvbHVtbi5oZWFkZXIgPT09ICdmdW5jdGlvbidcbiAgICAgID8gY29sdW1uLmhlYWRlcih7fSlcbiAgICAgIDogY29sdW1uLmhlYWRlcjtcbiAgfVxuXG4gIHJlc2V0Q29sdW1ucygpIHtcbiAgICB0aGlzLmluaXRpYWxpemVDb2x1bW5zKCk7XG4gICAgdGhpcy5lbWl0VXBkYXRlZENvbHVtbnMoKTtcbiAgfVxuXG4gIGVtaXRVcGRhdGVkQ29sdW1ucygpIHtcbiAgICBjb25zdCB1cGRhdGVkQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+XG4gICAgICB0aGlzLmNvbHVtblZpc2liaWxpdHkuZ2V0KGNvbHVtbi5pZClcbiAgICApO1xuICAgIHRoaXMuY29sdW1uc1VwZGF0ZWQuZW1pdCh1cGRhdGVkQ29sdW1ucyk7XG4gIH1cblxuICBnZXQgYWN0aXZlQ29sdW1uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNvbHVtblZpc2liaWxpdHkudmFsdWVzKCkpLmZpbHRlcigodmFsdWUpID0+IHZhbHVlKVxuICAgICAgLmxlbmd0aDtcbiAgfVxufVxuIiwiPHZlcmJlbi1jYXJkIHdpZHRoPVwiMjRyZW1cIiBib3JkZXJSYWRpdXM9XCIxcmVtXCIgW2JvcmRlcl09XCInMXB4IHNvbGlkIHZhcigtLXZibi1jb2xvci1wcmltYXJ5KSdcIiBiZ0NvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXN1cmZhY2UpXCI+XG4gICAgPGRpdiBjYXJkLWhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XG4gICAgICA8aDQgY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5Db2x1bW4gPHN1cD4oe3sgYWN0aXZlQ29sdW1uQ291bnQgfX0pPC9zdXA+PC9oND5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJyZXNldC1idXR0b25cIiAoY2xpY2spPVwicmVzZXRDb2x1bW5zKClcIj5SZXNldDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBcbiAgICA8ZGl2IGNhcmQtYm9keSBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgICAgPCEtLSBDb2x1bW4gT3B0aW9ucyAtLT5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+UHJvcGVydGllczwvaDM+XG4gICAgICAgICAgPHZlcmJlbi1zdmcgaWNvbj1cImluZm9cIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCIgZmlsbD1cInZhcigtLXZibi1jb2xvci10ZXh0LW11dGVkKVwiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgPC9kaXY+XG4gIFxuICAgICAgICA8IS0tIFNlbGVjdCBBbGwgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtYWxsLXdyYXBwZXJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZWxlY3QtYWxsXCI+XG4gICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RBbGxcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5TZWxlY3QgQWxsPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnNUb1Nob3c7IHRyYWNrIGNvbHVtbi5pZCkge1xuICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICBjbGFzcz1cImNvbHVtbi1vcHRpb25cIlxuICAgICAgICAgICAgW2F0dHIuZHJhZ2dhYmxlXT1cImVuYWJsZURyYWdBbmREcm9wXCJcbiAgICAgICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGluZGV4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxuICAgICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRpbmRleCwgJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1vcHRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICBAaWYgKGVuYWJsZURyYWdBbmREcm9wKSB7XG4gICAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICAgIGljb249XCJzcXVhcmUtZG90XCJcbiAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcmFnLWhhbmRsZVwiXG4gICAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNDb2x1bW5WaXNpYmxlKGNvbHVtbi5pZClcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQ29sdW1uVmlzaWJpbGl0eShjb2x1bW4uaWQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgZ2V0Q29sdW1uSGVhZGVyKGNvbHVtbikgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICBcbiAgICAgICAgQGlmICh2aXNpYmxlQ29sdW1ucy5sZW5ndGggPiBtYXhWaXNpYmxlSXRlbXMpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cInNob3dBbGxDb2x1bW5zID0gIXNob3dBbGxDb2x1bW5zXCJcbiAgICAgICAgICBjbGFzcz1cInNob3ctbW9yZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj57eyBzaG93QWxsQ29sdW1ucyA/IFwiU2hvdyBMZXNzXCIgOiBcIlNob3cgTW9yZVwiIH19PC9zcGFuPlxuICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICBpY29uPVwiY2hldnJvblwiXG4gICAgICAgICAgICBbd2lkdGhdPVwiOFwiXG4gICAgICAgICAgICBbaGVpZ2h0XT1cIjZcIlxuICAgICAgICAgICAgZmlsbD1cInZhcigtLXZibi1jb2xvci10ZXh0KVwiXG4gICAgICAgICAgICBzdHJva2U9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dClcIlxuICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9kaXY+XG4gIFxuICAgIDxkaXYgY2FyZC1mb290ZXIgY2xhc3M9XCJjYXJkLWZvb3RlclwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNhdmUtYnV0dG9uXCIgKGNsaWNrKT1cImVtaXRVcGRhdGVkQ29sdW1ucygpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L3ZlcmJlbi1jYXJkPiJdfQ==
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb2x1bW5zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS1jb2x1bW5zL2RhdGEtY29sdW1ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtY29sdW1ucy9kYXRhLWNvbHVtbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQzs7OztBQVV2QixNQUFNLE9BQU8sb0JBQW9CO0lBQ3RCLE9BQU8sQ0FBeUI7SUFDaEMsaUJBQWlCLEdBQVksSUFBSSxDQUFDO0lBQ2xDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFDckM7Ozs7O09BS0c7SUFDTSxlQUFlLENBQXlCO0lBQ3ZDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztJQUVyRSxjQUFjLEdBQTBCLEVBQUUsQ0FBQztJQUMzQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLFlBQVksR0FBa0IsSUFBSSxDQUFDO0lBQ25DLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDM0IsZ0JBQWdCLEdBQXlCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbkQsK0VBQStFO0lBQy9FLDJEQUEyRDtJQUNuRCxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBRTVCLFFBQVE7UUFDTixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLDJFQUEyRTtRQUMzRSw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENB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LENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO2FBQ3ZFLE1BQU0sQ0FBQztJQUNaLENBQUM7d0dBdkpVLG9CQUFvQjs0RkFBcEIsb0JBQW9CLDRRQ2xCakMscXNGQTJFZ0I7OzRGRHpESCxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usa0JBQWtCOzhCQUtuQixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBT0csZUFBZTtzQkFBdkIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb24gfSBmcm9tICd2ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGF0YS1jb2x1bW5zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtY29sdW1ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYXRhLWNvbHVtbnMuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFDb2x1bW5zQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb2x1bW5zITogQ29sdW1uRGVmaW5pdGlvbjxUPltdO1xuICBASW5wdXQoKSBlbmFibGVEcmFnQW5kRHJvcDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIG1heFZpc2libGVJdGVtczogbnVtYmVyID0gNTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHJlc3RvcmVkL2FjdGl2ZSBzZWxlY3Rpb246IHRoZSBjb2x1bW5zIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQsIGluXG4gICAqIHRoZSBvcmRlciB0byBkaXNwbGF5IHRoZW0uIFdoZW4gcHJvdmlkZWQsIHRoZSBwYW5lbCBvcGVucyByZWZsZWN0aW5nIHRoaXNcbiAgICogKHRoZXNlIGNoZWNrZWQgYW5kIG9yZGVyZWQgZmlyc3QsIHJlbWFpbmluZyBjb2x1bW5zIHNob3duIHVuY2hlY2tlZCkuXG4gICAqIERlZmF1bHRzIHRvIFwiYWxsIGNvbHVtbnMgY2hlY2tlZFwiIHdoZW4gb21pdHRlZC5cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkQ29sdW1ucz86IENvbHVtbkRlZmluaXRpb248VD5bXTtcbiAgQE91dHB1dCgpIGNvbHVtbnNVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW5EZWZpbml0aW9uPFQ+W10+KCk7XG5cbiAgdmlzaWJsZUNvbHVtbnM6IENvbHVtbkRlZmluaXRpb248VD5bXSA9IFtdO1xuICBzaG93QWxsQ29sdW1ucyA9IGZhbHNlO1xuICBkcmFnZ2VkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBzZWxlY3RBbGw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29sdW1uVmlzaWJpbGl0eTogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG4gIC8vIFNldCBvbmNlIHRoZSB1c2VyIGVkaXRzIHRoZSBwYW5lbCwgc28gbGF0ZXIgaG9zdCBpbnB1dCBjaGFuZ2VzIGRvbid0IGNsb2JiZXJcbiAgLy8gdGhlaXIgaW4tcHJvZ3Jlc3Mgc2VsZWN0aW9uLiBSZXNldCB0byBkZWZhdWx0cyBieSBSZXNldC5cbiAgcHJpdmF0ZSB1c2VyVG91Y2hlZCA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAvLyBSZS1kZXJpdmUgZnJvbSBpbnB1dHMgd2hlbmV2ZXIgdGhlIGhvc3QgcHJvdmlkZXMgdGhlbSAoZS5nLiBzYXZlZCBjb2x1bW5cbiAgICAvLyBhcnJhbmdlbWVudCByZXN0b3JlZCBhc3luY2hyb25vdXNseSksIHVubGVzcyB0aGUgdXNlciBoYXMgc3RhcnRlZCBlZGl0aW5nLlxuICAgIGlmICgoY2hhbmdlc1snc2VsZWN0ZWRDb2x1bW5zJ10gfHwgY2hhbmdlc1snY29sdW1ucyddKSAmJiAhdGhpcy51c2VyVG91Y2hlZCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplQ29sdW1ucygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbHVtbnMoKSB7XG4gICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5ID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZENvbHVtbnM7XG5cbiAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZElkcyA9IG5ldyBTZXQoc2VsZWN0ZWQubWFwKChjb2x1bW4pID0+IGNvbHVtbi5pZCkpO1xuICAgICAgY29uc3QgaGlkZGVuID0gdGhpcy5jb2x1bW5zLmZpbHRlcihcbiAgICAgICAgKGNvbHVtbikgPT4gIXNlbGVjdGVkSWRzLmhhcyhjb2x1bW4uaWQpXG4gICAgICApO1xuICAgICAgLy8gU2VsZWN0ZWQgKGNoZWNrZWQpIGZpcnN0LCBpbiB0aGVpciBzYXZlZCBvcmRlciwgdGhlbiB0aGUgcmVzdCB1bmNoZWNrZWQuXG4gICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gWy4uLnNlbGVjdGVkLCAuLi5oaWRkZW5dO1xuICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+XG4gICAgICAgIHRoaXMuY29sdW1uVmlzaWJpbGl0eS5zZXQoY29sdW1uLmlkLCBzZWxlY3RlZElkcy5oYXMoY29sdW1uLmlkKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5zXTtcbiAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PlxuICAgICAgICB0aGlzLmNvbHVtblZpc2liaWxpdHkuc2V0KGNvbHVtbi5pZCwgdHJ1ZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTZWxlY3RBbGxTdGF0dXMoKTtcbiAgfVxuXG4gIGdldCBjb2x1bW5zVG9TaG93KCkge1xuICAgIHJldHVybiB0aGlzLnNob3dBbGxDb2x1bW5zXG4gICAgICA/IHRoaXMudmlzaWJsZUNvbHVtbnNcbiAgICAgIDogdGhpcy52aXNpYmxlQ29sdW1ucy5zbGljZSgwLCB0aGlzLm1heFZpc2libGVJdGVtcyk7XG4gIH1cblxuICAvLyBEcmFnIGFuZCBEcm9wIGZ1bmN0aW9uYWxpdHlcbiAgb25EcmFnU3RhcnQoaW5kZXg6IG51bWJlciwgZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIGlmICghdGhpcy5lbmFibGVEcmFnQW5kRHJvcCkgcmV0dXJuO1xuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gaW5kZXg7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyPy5zZXREYXRhKCd0ZXh0L3BsYWluJywgU3RyaW5nKGluZGV4KSk7XG4gIH1cblxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlRHJhZ0FuZERyb3ApIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgb25Ecm9wKGluZGV4OiBudW1iZXIsIGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlRHJhZ0FuZERyb3ApIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLmRyYWdnZWRJbmRleCAhPT0gbnVsbCAmJiB0aGlzLmRyYWdnZWRJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgIHRoaXMuc3dhcENvbHVtbnModGhpcy5kcmFnZ2VkSW5kZXgsIGluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5kcmFnZ2VkSW5kZXggPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzd2FwQ29sdW1ucyhmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgdGVtcCA9IHRoaXMudmlzaWJsZUNvbHVtbnNbZnJvbUluZGV4XTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zW2Zyb21JbmRleF0gPSB0aGlzLnZpc2libGVDb2x1bW5zW3RvSW5kZXhdO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnNbdG9JbmRleF0gPSB0ZW1wO1xuICAgIHRoaXMudXNlclRvdWNoZWQgPSB0cnVlO1xuICAgIC8vIFN0YWdlZCBvbmx5IOKAlCBhcHBsaWVkL2VtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgU2F2ZSAoc2VlIHRlbXBsYXRlKS5cbiAgfVxuXG4gIC8vIENvbHVtbiBTZWxlY3Rpb24gZnVuY3Rpb25hbGl0eVxuICB0b2dnbGVTZWxlY3RBbGwoKSB7XG4gICAgdGhpcy5zZWxlY3RBbGwgPSAhdGhpcy5zZWxlY3RBbGw7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLnNlbGVjdEFsbDtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5LnNldChjb2x1bW4uaWQsIG5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgICB0aGlzLnVzZXJUb3VjaGVkID0gdHJ1ZTtcbiAgICAvLyBTdGFnZWQgb25seSDigJQgYXBwbGllZC9lbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFNhdmUgKHNlZSB0ZW1wbGF0ZSkuXG4gIH1cblxuICB0b2dnbGVDb2x1bW5WaXNpYmlsaXR5KGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmNvbHVtblZpc2liaWxpdHkuZ2V0KGNvbHVtbklkKTtcbiAgICB0aGlzLmNvbHVtblZpc2liaWxpdHkuc2V0KGNvbHVtbklkLCAhY3VycmVudFZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdEFsbFN0YXR1cygpO1xuICAgIHRoaXMudXNlclRvdWNoZWQgPSB0cnVlO1xuICAgIC8vIFN0YWdlZCBvbmx5IOKAlCBhcHBsaWVkL2VtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgU2F2ZSAoc2VlIHRlbXBsYXRlKS5cbiAgfVxuXG4gIGlzQ29sdW1uVmlzaWJsZShjb2x1bW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uVmlzaWJpbGl0eS5nZXQoY29sdW1uSWQpID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3RBbGxTdGF0dXMoKSB7XG4gICAgdGhpcy5zZWxlY3RBbGwgPSBBcnJheS5mcm9tKHRoaXMuY29sdW1uVmlzaWJpbGl0eS52YWx1ZXMoKSkuZXZlcnkoXG4gICAgICAodmFsdWUpID0+IHZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIGdldENvbHVtbkhlYWRlcihjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4pOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgY29sdW1uLmhlYWRlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBjb2x1bW4uaGVhZGVyKHt9KVxuICAgICAgOiBjb2x1bW4uaGVhZGVyO1xuICB9XG5cbiAgcmVzZXRDb2x1bW5zKCkge1xuICAgIC8vIFJlc2V0IHJlc3RvcmVzIHRoZSBkZWZhdWx0IChhbGwgY29sdW1ucyB2aXNpYmxlLCBjb25maWcgb3JkZXIpIHJlZ2FyZGxlc3NcbiAgICAvLyBvZiB0aGUgcmVzdG9yZWQgc2VsZWN0aW9uLCB0aGVuIGFwcGxpZXMgaW1tZWRpYXRlbHkuXG4gICAgdGhpcy51c2VyVG91Y2hlZCA9IHRydWU7XG4gICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5zXTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT5cbiAgICAgIHRoaXMuY29sdW1uVmlzaWJpbGl0eS5zZXQoY29sdW1uLmlkLCB0cnVlKVxuICAgICk7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RBbGxTdGF0dXMoKTtcbiAgICB0aGlzLmVtaXRVcGRhdGVkQ29sdW1ucygpO1xuICB9XG5cbiAgZW1pdFVwZGF0ZWRDb2x1bW5zKCkge1xuICAgIGNvbnN0IHVwZGF0ZWRDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT5cbiAgICAgIHRoaXMuY29sdW1uVmlzaWJpbGl0eS5nZXQoY29sdW1uLmlkKVxuICAgICk7XG4gICAgdGhpcy5jb2x1bW5zVXBkYXRlZC5lbWl0KHVwZGF0ZWRDb2x1bW5zKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVDb2x1bW5Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY29sdW1uVmlzaWJpbGl0eS52YWx1ZXMoKSkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUpXG4gICAgICAubGVuZ3RoO1xuICB9XG59XG4iLCI8dmVyYmVuLWNhcmQgd2lkdGg9XCIyNHJlbVwiIGJvcmRlclJhZGl1cz1cIjFyZW1cIiBbYm9yZGVyXT1cIicxcHggc29saWQgdmFyKC0tdmJuLWNvbG9yLXByaW1hcnkpJ1wiIGJnQ29sb3I9XCJ2YXIoLS12Ym4tY29sb3Itc3VyZmFjZSlcIj5cbiAgICA8ZGl2IGNhcmQtaGVhZGVyIGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cbiAgICAgIDxoNCBjbGFzcz1cImhlYWRlci10aXRsZVwiPkNvbHVtbiA8c3VwPih7eyBhY3RpdmVDb2x1bW5Db3VudCB9fSk8L3N1cD48L2g0PlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInJlc2V0LWJ1dHRvblwiIChjbGljayk9XCJyZXNldENvbHVtbnMoKVwiPlJlc2V0PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIFxuICAgIDxkaXYgY2FyZC1ib2R5IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICA8IS0tIENvbHVtbiBPcHRpb25zIC0tPlxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5Qcm9wZXJ0aWVzPC9oMz5cbiAgICAgICAgICA8dmVyYmVuLXN2ZyBpY29uPVwiaW5mb1wiIFt3aWR0aF09XCIxNVwiIFtoZWlnaHRdPVwiMTVcIiBmaWxsPVwidmFyKC0tdmJuLWNvbG9yLXRleHQtbXV0ZWQpXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICAgIDwhLS0gU2VsZWN0IEFsbCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1hbGwtd3JhcHBlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNlbGVjdC1hbGxcIj5cbiAgICAgICAgICAgIDxpbnB1dCBcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdEFsbFwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlNlbGVjdCBBbGw8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gIFxuICAgICAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1uc1RvU2hvdzsgdHJhY2sgY29sdW1uLmlkKSB7XG4gICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgIGNsYXNzPVwiY29sdW1uLW9wdGlvblwiXG4gICAgICAgICAgICBbYXR0ci5kcmFnZ2FibGVdPVwiZW5hYmxlRHJhZ0FuZERyb3BcIlxuICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkaW5kZXgsICRldmVudClcIlxuICAgICAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGluZGV4LCAkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLW9wdGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgIEBpZiAoZW5hYmxlRHJhZ0FuZERyb3ApIHtcbiAgICAgICAgICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgICAgICAgICAgaWNvbj1cInNxdWFyZS1kb3RcIlxuICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgICAgICAgZmlsbD1cInZhcigtLXZibi1jb2xvci10ZXh0KVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRyYWctaGFuZGxlXCJcbiAgICAgICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxpbnB1dCBcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0NvbHVtblZpc2libGUoY29sdW1uLmlkKVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVDb2x1bW5WaXNpYmlsaXR5KGNvbHVtbi5pZClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRDb2x1bW5IZWFkZXIoY29sdW1uKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gIFxuICAgICAgICBAaWYgKHZpc2libGVDb2x1bW5zLmxlbmd0aCA+IG1heFZpc2libGVJdGVtcykge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAoY2xpY2spPVwic2hvd0FsbENvbHVtbnMgPSAhc2hvd0FsbENvbHVtbnNcIlxuICAgICAgICAgIGNsYXNzPVwic2hvdy1tb3JlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuPnt7IHNob3dBbGxDb2x1bW5zID8gXCJTaG93IExlc3NcIiA6IFwiU2hvdyBNb3JlXCIgfX08L3NwYW4+XG4gICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgIGljb249XCJjaGV2cm9uXCJcbiAgICAgICAgICAgIFt3aWR0aF09XCI4XCJcbiAgICAgICAgICAgIFtoZWlnaHRdPVwiNlwiXG4gICAgICAgICAgICBmaWxsPVwidmFyKC0tdmJuLWNvbG9yLXRleHQpXCJcbiAgICAgICAgICAgIHN0cm9rZT1cInZhcigtLXZibi1jb2xvci10ZXh0KVwiXG4gICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2Rpdj5cbiAgXG4gICAgPGRpdiBjYXJkLWZvb3RlciBjbGFzcz1cImNhcmQtZm9vdGVyXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwic2F2ZS1idXR0b25cIiAoY2xpY2spPVwiZW1pdFVwZGF0ZWRDb2x1bW5zKClcIj5TYXZlPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvdmVyYmVuLWNhcmQ+Il19