verben-ng-ui 1.3.3 → 1.3.5
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.
- package/esm2022/src/lib/components/data-columns/data-columns.component.mjs +48 -12
- package/esm2022/src/lib/components/data-filter/data-filter.component.mjs +174 -25
- package/esm2022/src/lib/components/data-filter/data-filter.module.mjs +7 -3
- package/esm2022/src/lib/components/data-filter/data-filter.types.mjs +9 -1
- package/esm2022/src/lib/components/data-import/data-import.component.mjs +6 -3
- package/esm2022/src/lib/components/data-import/data-import.service.mjs +35 -4
- package/esm2022/src/lib/components/data-table/data-table.types.mjs +18 -2
- package/esm2022/src/lib/components/data-view/data-view.component.mjs +3 -3
- package/fesm2022/verben-ng-ui-src-lib-components-data-columns.mjs +46 -10
- package/fesm2022/verben-ng-ui-src-lib-components-data-columns.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-filter.mjs +186 -25
- package/fesm2022/verben-ng-ui-src-lib-components-data-filter.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-import.mjs +39 -5
- package/fesm2022/verben-ng-ui-src-lib-components-data-import.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-table.mjs +18 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-table.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-view.mjs +2 -2
- package/fesm2022/verben-ng-ui-src-lib-components-data-view.mjs.map +1 -1
- package/package.json +81 -81
- package/src/lib/components/data-columns/data-columns.component.d.ts +12 -3
- package/src/lib/components/data-filter/data-filter.component.d.ts +59 -7
- package/src/lib/components/data-filter/data-filter.module.d.ts +2 -1
- package/src/lib/components/data-filter/data-filter.types.d.ts +4 -2
- package/src/lib/components/data-import/data-import.component.d.ts +3 -0
- package/src/lib/components/data-import/data-import.service.d.ts +7 -0
- 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.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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,7 +78,8 @@ export class DataColumnsComponent {
|
|
|
53
78
|
const temp = this.visibleColumns[fromIndex];
|
|
54
79
|
this.visibleColumns[fromIndex] = this.visibleColumns[toIndex];
|
|
55
80
|
this.visibleColumns[toIndex] = temp;
|
|
56
|
-
this.
|
|
81
|
+
this.userTouched = true;
|
|
82
|
+
// Staged only — applied/emitted when the user clicks Save (see template).
|
|
57
83
|
}
|
|
58
84
|
// Column Selection functionality
|
|
59
85
|
toggleSelectAll() {
|
|
@@ -62,13 +88,15 @@ export class DataColumnsComponent {
|
|
|
62
88
|
this.visibleColumns.forEach((column) => {
|
|
63
89
|
this.columnVisibility.set(column.id, newValue);
|
|
64
90
|
});
|
|
65
|
-
this.
|
|
91
|
+
this.userTouched = true;
|
|
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();
|
|
71
|
-
this.
|
|
98
|
+
this.userTouched = true;
|
|
99
|
+
// Staged only — applied/emitted when the user clicks Save (see template).
|
|
72
100
|
}
|
|
73
101
|
isColumnVisible(columnId) {
|
|
74
102
|
return this.columnVisibility.get(columnId) ?? false;
|
|
@@ -82,7 +110,13 @@ export class DataColumnsComponent {
|
|
|
82
110
|
: column.header;
|
|
83
111
|
}
|
|
84
112
|
resetColumns() {
|
|
85
|
-
|
|
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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Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb24gfSBmcm9tICd2ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGF0YS1jb2x1bW5zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtY29sdW1ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYXRhLWNvbHVtbnMuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFDb2x1bW5zQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgY29sdW1ucyE6IENvbHVtbkRlZmluaXRpb248VD5bXTtcbiAgQElucHV0KCkgZW5hYmxlRHJhZ0FuZERyb3A6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBtYXhWaXNpYmxlSXRlbXM6IG51bWJlciA9IDU7XG4gIEBPdXRwdXQoKSBjb2x1bW5zVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uRGVmaW5pdGlvbjxUPltdPigpO1xuXG4gIHZpc2libGVDb2x1bW5zOiBDb2x1bW5EZWZpbml0aW9uPFQ+W10gPSBbXTtcbiAgc2hvd0FsbENvbHVtbnMgPSBmYWxzZTtcbiAgZHJhZ2dlZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbHVtblZpc2liaWxpdHk6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbHVtbnMoKSB7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IFsuLi50aGlzLmNvbHVtbnNdO1xuICAgIC8vIEluaXRpYWxpemUgdmlzaWJpbGl0eSBtYXAgd2l0aCBjdXJyZW50IGNvbHVtbiBzdGF0ZXNcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5WaXNpYmlsaXR5LnNldChjb2x1bW4uaWQsIHRydWUpO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0QWxsU3RhdHVzKCk7XG4gIH1cblxuICBnZXQgY29sdW1uc1RvU2hvdygpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93QWxsQ29sdW1uc1xuICAgICAgPyB0aGlzLnZpc2libGVDb2x1bW5zXG4gICAgICA6IHRoaXMudmlzaWJsZUNvbHVtbnMuc2xpY2UoMCwgdGhpcy5tYXhWaXNpYmxlSXRlbXMpO1xuICB9XG5cbiAgLy8gRHJhZyBhbmQgRHJvcCBmdW5jdGlvbmFsaXR5XG4gIG9uRHJhZ1N0YXJ0KGluZGV4OiBudW1iZXIsIGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlRHJhZ0FuZERyb3ApIHJldHVybjtcbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IGluZGV4O1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlcj8uc2V0RGF0YSgndGV4dC9wbGFpbicsIFN0cmluZyhpbmRleCkpO1xuICB9XG5cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZURyYWdBbmREcm9wKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIG9uRHJvcChpbmRleDogbnVtYmVyLCBldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZURyYWdBbmREcm9wKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy5kcmFnZ2VkSW5kZXggIT09IG51bGwgJiYgdGhpcy5kcmFnZ2VkSW5kZXggIT09IGluZGV4KSB7XG4gICAgICB0aGlzLnN3YXBDb2x1bW5zKHRoaXMuZHJhZ2dlZEluZGV4LCBpbmRleCk7XG4gICAgfVxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3dhcENvbHVtbnMoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHRlbXAgPSB0aGlzLnZpc2libGVDb2x1bW5zW2Zyb21JbmRleF07XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uc1tmcm9tSW5kZXhdID0gdGhpcy52aXNpYmxlQ29sdW1uc1t0b0luZGV4XTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zW3RvSW5kZXhdID0gdGVtcDtcbiAgICB0aGlzLmVtaXRVcGRhdGVkQ29sdW1ucygpO1xuICB9XG5cbiAgLy8gQ29sdW1uIFNlbGVjdGlvbiBmdW5jdGlvbmFsaXR5XG4gIHRvZ2dsZVNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLnNlbGVjdEFsbCA9ICF0aGlzLnNlbGVjdEFsbDtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuc2VsZWN0QWxsO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICB0aGlzLmNvbHVtblZpc2liaWxpdHkuc2V0KGNvbHVtbi5pZCwgbmV3VmFsdWUpO1xuICAgIH0pO1xuICAgIHRoaXMuZW1pdFVwZGF0ZWRDb2x1bW5zKCk7XG4gIH1cblxuICB0b2dnbGVDb2x1bW5WaXNpYmlsaXR5KGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmNvbHVtblZpc2liaWxpdHkuZ2V0KGNvbHVtbklkKTtcbiAgICB0aGlzLmNvbHVtblZpc2liaWxpdHkuc2V0KGNvbHVtbklkLCAhY3VycmVudFZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdEFsbFN0YXR1cygpO1xuICAgIHRoaXMuZW1pdFVwZGF0ZWRDb2x1bW5zKCk7XG4gIH1cblxuICBpc0NvbHVtblZpc2libGUoY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblZpc2liaWxpdHkuZ2V0KGNvbHVtbklkKSA/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
|