@rivet-health/design-system 40.37.0 → 40.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/overlay/overlay.directive.mjs +2 -2
- package/esm2020/lib/overlay/overlay.service.mjs +20 -23
- package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +115 -61
- package/esm2020/lib/table/table/state.mjs +3 -3
- package/esm2020/lib/table/table/table/table.component.mjs +17 -3
- package/esm2020/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +3 -3
- package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +3 -3
- package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +3 -3
- package/esm2020/lib/visualization/time-series/time-series.component.mjs +3 -3
- package/fesm2015/rivet-health-design-system.mjs +148 -97
- package/fesm2015/rivet-health-design-system.mjs.map +1 -1
- package/fesm2020/rivet-health-design-system.mjs +160 -95
- package/fesm2020/rivet-health-design-system.mjs.map +1 -1
- package/lib/overlay/overlay.service.d.ts +6 -3
- package/lib/table/table/state-helpers/column-helpers.d.ts +3 -1
- package/lib/table/table/state.d.ts +2 -0
- package/lib/table/table/table/table.component.d.ts +3 -0
- package/package.json +1 -1
|
@@ -11,7 +11,7 @@ export class OverlayDirective {
|
|
|
11
11
|
}
|
|
12
12
|
ngOnDestroy() {
|
|
13
13
|
if (this.key)
|
|
14
|
-
this.
|
|
14
|
+
this.overlayService.remove(this.key);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
OverlayDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OverlayDirective, deps: [{ token: i0.TemplateRef }, { token: i1.OverlayService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
@@ -22,4 +22,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
22
22
|
selector: '[riv-overlay]',
|
|
23
23
|
}]
|
|
24
24
|
}], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i1.OverlayService }]; } });
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9vdmVybGF5L292ZXJsYXkuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWtDLE1BQU0sZUFBZSxDQUFDOzs7QUFNMUUsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixZQUNtQixRQUEyQixFQUMzQixjQUE4QjtRQUQ5QixhQUFRLEdBQVIsUUFBUSxDQUFtQjtRQUMzQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFDOUMsQ0FBQztJQUlKLFFBQVE7UUFDTixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLEdBQUc7WUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckQsQ0FBQzs7OEdBZFUsZ0JBQWdCO2tHQUFoQixnQkFBZ0I7NEZBQWhCLGdCQUFnQjtrQkFINUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtpQkFDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIE9uRGVzdHJveSwgT25Jbml0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuL292ZXJsYXkuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tyaXYtb3ZlcmxheV0nLFxufSlcbmV4cG9ydCBjbGFzcyBPdmVybGF5RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXlTZXJ2aWNlOiBPdmVybGF5U2VydmljZSxcbiAgKSB7fVxuXG4gIHByaXZhdGUga2V5PzogU3ltYm9sO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMua2V5ID0gdGhpcy5vdmVybGF5U2VydmljZS5hZGQodGhpcy50ZW1wbGF0ZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5rZXkpIHRoaXMub3ZlcmxheVNlcnZpY2UucmVtb3ZlKHRoaXMua2V5KTtcbiAgfVxufVxuIl19
|
|
@@ -2,37 +2,34 @@ import { Injectable } from '@angular/core';
|
|
|
2
2
|
import { BehaviorSubject } from 'rxjs';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export class OverlayService {
|
|
5
|
-
constructor() {
|
|
5
|
+
constructor(zone) {
|
|
6
|
+
this.zone = zone;
|
|
6
7
|
this.overlays = new BehaviorSubject(new Map());
|
|
7
8
|
}
|
|
8
|
-
|
|
9
|
-
// to detect changes properly when the source of an event is from within a
|
|
10
|
-
// template that is being removed as a result of that event. The Angular
|
|
11
|
-
// template sees a cached version of the overlays Map (even though the
|
|
12
|
-
// component TypeScript picks up on the changed Map), regardless of trying to
|
|
13
|
-
// trigger change detection manually. Moving the change to the next tick with
|
|
14
|
-
// this faux async fixes the issue. We may be able to remove them after an
|
|
15
|
-
// Angular upgrade (TODO).
|
|
16
|
-
// https://www.notion.so/rivet/Resolve-TODOs-after-Angular-upgrade-1f2667eb2a3180b79f6ad92a7e576f08
|
|
17
|
-
async add(overlay) {
|
|
18
|
-
await Promise.resolve();
|
|
9
|
+
add(overlay) {
|
|
19
10
|
const key = Symbol();
|
|
20
|
-
|
|
21
|
-
overlays.set(key, overlay);
|
|
22
|
-
this.overlays.next(overlays);
|
|
11
|
+
this.update(overlays => overlays.set(key, overlay));
|
|
23
12
|
return key;
|
|
24
13
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
14
|
+
remove(key) {
|
|
15
|
+
this.update(overlays => overlays.delete(key));
|
|
16
|
+
}
|
|
17
|
+
// Deferred because the template misses the change when the triggering event
|
|
18
|
+
// comes from a template being removed by it; run in the zone so it renders.
|
|
19
|
+
// TODO: remove the deferral after an Angular upgrade.
|
|
20
|
+
// https://www.notion.so/rivet/Resolve-TODOs-after-Angular-upgrade-1f2667eb2a3180b79f6ad92a7e576f08
|
|
21
|
+
update(change) {
|
|
22
|
+
queueMicrotask(() => this.zone.run(() => {
|
|
23
|
+
const overlays = new Map(this.overlays.getValue());
|
|
24
|
+
change(overlays);
|
|
25
|
+
this.overlays.next(overlays);
|
|
26
|
+
}));
|
|
30
27
|
}
|
|
31
28
|
}
|
|
32
|
-
OverlayService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OverlayService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
29
|
+
OverlayService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OverlayService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
33
30
|
OverlayService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OverlayService, providedIn: 'root' });
|
|
34
31
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OverlayService, decorators: [{
|
|
35
32
|
type: Injectable,
|
|
36
33
|
args: [{ providedIn: 'root' }]
|
|
37
|
-
}] });
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvb3ZlcmxheS9vdmVybGF5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFLdkMsTUFBTSxPQUFPLGNBQWM7SUFDekIsWUFBNkIsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7UUFFbEMsYUFBUSxHQUFHLElBQUksZUFBZSxDQUFXLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUZmLENBQUM7SUFJdEMsR0FBRyxDQUFDLE9BQTBCO1FBQ25DLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxHQUFXO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSw0RUFBNEU7SUFDNUUsc0RBQXNEO0lBQ3RELG1HQUFtRztJQUMzRixNQUFNLENBQUMsTUFBb0M7UUFDakQsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDakIsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzs7NEdBM0JVLGNBQWM7Z0hBQWQsY0FBYyxjQURELE1BQU07NEZBQ25CLGNBQWM7a0JBRDFCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB0eXBlIE92ZXJsYXlzID0gTWFwPFN5bWJvbCwgVGVtcGxhdGVSZWY8dm9pZD4+O1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIE92ZXJsYXlTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB6b25lOiBOZ1pvbmUpIHt9XG5cbiAgcHVibGljIG92ZXJsYXlzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPdmVybGF5cz4obmV3IE1hcCgpKTtcblxuICBwdWJsaWMgYWRkKG92ZXJsYXk6IFRlbXBsYXRlUmVmPHZvaWQ+KTogU3ltYm9sIHtcbiAgICBjb25zdCBrZXkgPSBTeW1ib2woKTtcbiAgICB0aGlzLnVwZGF0ZShvdmVybGF5cyA9PiBvdmVybGF5cy5zZXQoa2V5LCBvdmVybGF5KSk7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmUoa2V5OiBTeW1ib2wpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZShvdmVybGF5cyA9PiBvdmVybGF5cy5kZWxldGUoa2V5KSk7XG4gIH1cblxuICAvLyBEZWZlcnJlZCBiZWNhdXNlIHRoZSB0ZW1wbGF0ZSBtaXNzZXMgdGhlIGNoYW5nZSB3aGVuIHRoZSB0cmlnZ2VyaW5nIGV2ZW50XG4gIC8vIGNvbWVzIGZyb20gYSB0ZW1wbGF0ZSBiZWluZyByZW1vdmVkIGJ5IGl0OyBydW4gaW4gdGhlIHpvbmUgc28gaXQgcmVuZGVycy5cbiAgLy8gVE9ETzogcmVtb3ZlIHRoZSBkZWZlcnJhbCBhZnRlciBhbiBBbmd1bGFyIHVwZ3JhZGUuXG4gIC8vIGh0dHBzOi8vd3d3Lm5vdGlvbi5zby9yaXZldC9SZXNvbHZlLVRPRE9zLWFmdGVyLUFuZ3VsYXItdXBncmFkZS0xZjI2NjdlYjJhMzE4MGI3OWY2YWQ5MmE3ZTU3NmYwOFxuICBwcml2YXRlIHVwZGF0ZShjaGFuZ2U6IChvdmVybGF5czogT3ZlcmxheXMpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PlxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlzID0gbmV3IE1hcCh0aGlzLm92ZXJsYXlzLmdldFZhbHVlKCkpO1xuICAgICAgICBjaGFuZ2Uob3ZlcmxheXMpO1xuICAgICAgICB0aGlzLm92ZXJsYXlzLm5leHQob3ZlcmxheXMpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { difference } from 'lodash';
|
|
1
|
+
import { difference, partition as lodashPartition } from 'lodash';
|
|
2
2
|
import { RivTable } from '../state';
|
|
3
3
|
export var TableColumnHelpers;
|
|
4
4
|
(function (TableColumnHelpers) {
|
|
@@ -29,29 +29,51 @@ export var TableColumnHelpers;
|
|
|
29
29
|
// interrupt their existing setup.
|
|
30
30
|
const columnNamesWithoutUserSettings = difference([...supportedColumns.keys()], state.display.columnSettings.map(({ key }) => key));
|
|
31
31
|
// Throw out settings for columns no longer offered by the table.
|
|
32
|
-
const
|
|
32
|
+
const onlyColumnsWithUserSettings = state.display.columnSettings.filter(({ key }) => supportedColumns.has(key));
|
|
33
|
+
const columnsWithUserSettings = onlyColumnsWithUserSettings.map(columnSetting => {
|
|
34
|
+
return {
|
|
35
|
+
...columnSetting,
|
|
36
|
+
/*
|
|
37
|
+
Overwrite the enabled/pinned state if the column should be "always pinned".
|
|
38
|
+
Otherwise, respect the saved user settings.
|
|
39
|
+
*/
|
|
40
|
+
enabled: !!supportedColumns.get(columnSetting.key)?.alwaysPinned
|
|
41
|
+
? true
|
|
42
|
+
: columnSetting.enabled,
|
|
43
|
+
pinned: !!supportedColumns.get(columnSetting.key)?.alwaysPinned
|
|
44
|
+
? true
|
|
45
|
+
: columnSetting.pinned,
|
|
46
|
+
};
|
|
47
|
+
});
|
|
33
48
|
const columnsWithoutUserSettings = [
|
|
34
49
|
...columnNamesWithoutUserSettings,
|
|
35
50
|
].map((key) => ({
|
|
36
51
|
key,
|
|
37
52
|
enabled: true,
|
|
38
53
|
preferredWidth: 'auto',
|
|
39
|
-
pinned: !!supportedColumns.get(key)?.defaultPinned
|
|
54
|
+
pinned: !!supportedColumns.get(key)?.defaultPinned ||
|
|
55
|
+
!!supportedColumns.get(key)?.alwaysPinned,
|
|
40
56
|
}));
|
|
41
|
-
return orderIntentionally([...columnsWithUserSettings, ...columnsWithoutUserSettings], columnNameMap);
|
|
57
|
+
return orderIntentionally([...columnsWithUserSettings, ...columnsWithoutUserSettings], columnNameMap, supportedColumns);
|
|
42
58
|
}
|
|
43
59
|
TableColumnHelpers.getAllColumns = getAllColumns;
|
|
44
|
-
function orderIntentionally(columns, columnNameMap) {
|
|
60
|
+
function orderIntentionally(columns, columnNameMap, columnMetadataMap) {
|
|
61
|
+
const [alwaysPinnedColumns, sometimesPinnedColumns] = lodashPartition(columns, column => {
|
|
62
|
+
const currentColumnMetadata = columnMetadataMap.get(column.key);
|
|
63
|
+
return currentColumnMetadata?.alwaysPinned ?? false;
|
|
64
|
+
});
|
|
65
|
+
const [pinnedColumns, unpinnedColumns] = lodashPartition(sometimesPinnedColumns, column => column.pinned);
|
|
66
|
+
const [enabledUnpinnedColumns, disabledColumns] = lodashPartition(unpinnedColumns, column => column.enabled);
|
|
67
|
+
const sortedDisabledColumns = disabledColumns.sort((a, b) => {
|
|
68
|
+
const aName = columnNameMap.get(a.key) ?? a.key;
|
|
69
|
+
const bName = columnNameMap.get(b.key) ?? b.key;
|
|
70
|
+
return aName.localeCompare(bName);
|
|
71
|
+
});
|
|
45
72
|
return [
|
|
46
|
-
...
|
|
47
|
-
...
|
|
48
|
-
...
|
|
49
|
-
|
|
50
|
-
.sort((a, b) => {
|
|
51
|
-
const aName = columnNameMap.get(a.key) ?? a.key;
|
|
52
|
-
const bName = columnNameMap.get(b.key) ?? b.key;
|
|
53
|
-
return aName.localeCompare(bName);
|
|
54
|
-
}),
|
|
73
|
+
...alwaysPinnedColumns,
|
|
74
|
+
...pinnedColumns,
|
|
75
|
+
...enabledUnpinnedColumns,
|
|
76
|
+
...sortedDisabledColumns,
|
|
55
77
|
];
|
|
56
78
|
}
|
|
57
79
|
function getAlignment(metadata, index, allowSelection) {
|
|
@@ -87,6 +109,11 @@ export var TableColumnHelpers;
|
|
|
87
109
|
}
|
|
88
110
|
TableColumnHelpers.resolveColumns = resolveColumns;
|
|
89
111
|
function changeColumnPin(state, columns, columnNameMap, column, pinned) {
|
|
112
|
+
const currentColumnMetadata = columns.get(column);
|
|
113
|
+
// You cannot change the pinned status of an always pinned column
|
|
114
|
+
if (!!currentColumnMetadata?.alwaysPinned) {
|
|
115
|
+
return state;
|
|
116
|
+
}
|
|
90
117
|
const allColumns = getAllColumns(state, columns, columnNameMap);
|
|
91
118
|
if (pinned) {
|
|
92
119
|
const target = allColumns.find(c => c.key === column);
|
|
@@ -107,25 +134,43 @@ export var TableColumnHelpers;
|
|
|
107
134
|
pinned: c.key === column ? pinned : c.pinned,
|
|
108
135
|
// Check/enable if being pinned
|
|
109
136
|
enabled: c.key === column && pinned ? true : c.enabled,
|
|
110
|
-
})), columnNameMap),
|
|
137
|
+
})), columnNameMap, columns),
|
|
111
138
|
},
|
|
112
139
|
};
|
|
113
140
|
}
|
|
114
141
|
TableColumnHelpers.changeColumnPin = changeColumnPin;
|
|
115
142
|
function changeColumnsFreezeState(state, columns, columnNameMap, index, freeze) {
|
|
116
143
|
const allColumns = getAllColumns(state, columns, columnNameMap);
|
|
144
|
+
const updatedColumnSettings = allColumns.map((currentColumnSettings, currentIndex) => {
|
|
145
|
+
const currentColumnMetadata = columns.get(currentColumnSettings.key);
|
|
146
|
+
const isColumnAlwaysPinned = currentColumnMetadata?.alwaysPinned ?? false;
|
|
147
|
+
if (isColumnAlwaysPinned) {
|
|
148
|
+
return {
|
|
149
|
+
...currentColumnSettings,
|
|
150
|
+
pinned: true,
|
|
151
|
+
enabled: true,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
...currentColumnSettings,
|
|
156
|
+
pinned: freeze && currentIndex <= index,
|
|
157
|
+
};
|
|
158
|
+
});
|
|
117
159
|
return {
|
|
118
160
|
...state,
|
|
119
161
|
display: {
|
|
120
162
|
...state.display,
|
|
121
|
-
columnSettings:
|
|
122
|
-
return { ...c, pinned: freeze && i <= index };
|
|
123
|
-
}),
|
|
163
|
+
columnSettings: updatedColumnSettings,
|
|
124
164
|
},
|
|
125
165
|
};
|
|
126
166
|
}
|
|
127
167
|
TableColumnHelpers.changeColumnsFreezeState = changeColumnsFreezeState;
|
|
128
168
|
function moveColumnTo(state, columns, columnNameMap, column, position) {
|
|
169
|
+
const currentColumnMetadata = columns.get(column);
|
|
170
|
+
// You cannot move an always pinned column
|
|
171
|
+
if (!!currentColumnMetadata?.alwaysPinned) {
|
|
172
|
+
return state;
|
|
173
|
+
}
|
|
129
174
|
const allColumns = getAllColumns(state, columns, columnNameMap);
|
|
130
175
|
const previousIndex = allColumns.findIndex(c => c.key === column);
|
|
131
176
|
const lastIndex = position == 'end' ? allColumns.findIndex(c => !c.enabled) : 0;
|
|
@@ -138,18 +183,23 @@ export var TableColumnHelpers;
|
|
|
138
183
|
allColumns.filter(col => col.enabled).length >= RivTable.ColumnsMaxShown)
|
|
139
184
|
return state;
|
|
140
185
|
const movedState = changeColumnOrder(state, columns, columnNameMap, previousIndex, newIndex);
|
|
141
|
-
//Make sure the column is enabled
|
|
186
|
+
// Make sure the column is enabled
|
|
142
187
|
return changeColumnEnabled(movedState, columns, columnNameMap, column, true);
|
|
143
188
|
}
|
|
144
189
|
TableColumnHelpers.moveColumnTo = moveColumnTo;
|
|
145
190
|
function changeColumnOrder(state, columns, columnNameMap, previousIndex, newIndex) {
|
|
146
191
|
const allColumns = getAllColumns(state, columns, columnNameMap);
|
|
192
|
+
const itemToMove = allColumns[previousIndex];
|
|
193
|
+
const currentColumnMetadata = columns.get(itemToMove.key);
|
|
194
|
+
// You cannot move an always pinned column
|
|
195
|
+
if (!!currentColumnMetadata?.alwaysPinned) {
|
|
196
|
+
return state;
|
|
197
|
+
}
|
|
147
198
|
// First, put the columns in the desired order.
|
|
148
|
-
const item = allColumns[previousIndex];
|
|
149
199
|
const withoutItem = allColumns.filter((_, i) => i !== previousIndex);
|
|
150
200
|
const reordered = [
|
|
151
201
|
...withoutItem.slice(0, newIndex),
|
|
152
|
-
|
|
202
|
+
itemToMove,
|
|
153
203
|
...withoutItem.slice(newIndex),
|
|
154
204
|
];
|
|
155
205
|
// Then, we may need to fix the pins (all pinned columns appear at the
|
|
@@ -171,7 +221,7 @@ export var TableColumnHelpers;
|
|
|
171
221
|
else
|
|
172
222
|
return settings;
|
|
173
223
|
});
|
|
174
|
-
const wasDisabled = !
|
|
224
|
+
const wasDisabled = !itemToMove.enabled;
|
|
175
225
|
const becameEnabled = updated[newIndex].enabled;
|
|
176
226
|
if (wasDisabled && becameEnabled) {
|
|
177
227
|
const enabledCount = allColumns.filter(c => c.enabled).length;
|
|
@@ -184,27 +234,52 @@ export var TableColumnHelpers;
|
|
|
184
234
|
...state,
|
|
185
235
|
display: {
|
|
186
236
|
...state.display,
|
|
187
|
-
columnSettings: orderIntentionally(updated, columnNameMap),
|
|
237
|
+
columnSettings: orderIntentionally(updated, columnNameMap, columns),
|
|
188
238
|
},
|
|
189
239
|
};
|
|
190
240
|
}
|
|
191
241
|
TableColumnHelpers.changeColumnOrder = changeColumnOrder;
|
|
242
|
+
function columnSettingAfterEnabledChange(currentColumnSettings, columnMetadataMap, enabled) {
|
|
243
|
+
const currentColumnMetadata = columnMetadataMap.get(currentColumnSettings.key);
|
|
244
|
+
const isColumnAlwaysPinned = currentColumnMetadata?.alwaysPinned ?? false;
|
|
245
|
+
const isColumnAlwaysVisible = currentColumnMetadata?.alwaysVisible ?? false;
|
|
246
|
+
if (isColumnAlwaysPinned) {
|
|
247
|
+
return {
|
|
248
|
+
...currentColumnSettings,
|
|
249
|
+
enabled: true,
|
|
250
|
+
pinned: true,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
if (isColumnAlwaysVisible) {
|
|
254
|
+
return {
|
|
255
|
+
...currentColumnSettings,
|
|
256
|
+
enabled: true,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
...currentColumnSettings,
|
|
261
|
+
enabled: enabled,
|
|
262
|
+
// Unpin if being unchecked
|
|
263
|
+
pinned: !enabled ? false : currentColumnSettings.pinned,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
192
266
|
function changeColumnEnabled(state, columns, columnNameMap, column, enabled) {
|
|
193
267
|
const allColumns = getAllColumns(state, columns, columnNameMap);
|
|
194
268
|
if (enabled &&
|
|
195
269
|
allColumns.filter(col => col.enabled).length >= RivTable.ColumnsMaxShown) {
|
|
196
270
|
return state;
|
|
197
271
|
}
|
|
272
|
+
const updatedColumnSettings = allColumns.map(currentColumnSettings => {
|
|
273
|
+
if (currentColumnSettings.key !== column) {
|
|
274
|
+
return currentColumnSettings;
|
|
275
|
+
}
|
|
276
|
+
return columnSettingAfterEnabledChange(currentColumnSettings, columns, enabled);
|
|
277
|
+
});
|
|
198
278
|
return {
|
|
199
279
|
...state,
|
|
200
280
|
display: {
|
|
201
281
|
...state.display,
|
|
202
|
-
columnSettings: orderIntentionally(
|
|
203
|
-
...c,
|
|
204
|
-
enabled: c.key === column ? enabled : c.enabled,
|
|
205
|
-
// Unpin if being unchecked
|
|
206
|
-
pinned: c.key === column && !enabled ? false : c.pinned,
|
|
207
|
-
})), columnNameMap),
|
|
282
|
+
columnSettings: orderIntentionally(updatedColumnSettings, columnNameMap, columns),
|
|
208
283
|
},
|
|
209
284
|
};
|
|
210
285
|
}
|
|
@@ -215,26 +290,13 @@ export var TableColumnHelpers;
|
|
|
215
290
|
return state;
|
|
216
291
|
}
|
|
217
292
|
const updatedColumnSettings = allColumns.map(currentColumnSettings => {
|
|
218
|
-
|
|
219
|
-
const isColumnAlwaysVisible = currentColumnMetadata?.alwaysVisible ?? false;
|
|
220
|
-
if (isColumnAlwaysVisible) {
|
|
221
|
-
return {
|
|
222
|
-
...currentColumnSettings,
|
|
223
|
-
enabled: true,
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
return {
|
|
227
|
-
...currentColumnSettings,
|
|
228
|
-
enabled: enabled,
|
|
229
|
-
// Unpin if being unchecked
|
|
230
|
-
pinned: !enabled ? false : currentColumnSettings.pinned,
|
|
231
|
-
};
|
|
293
|
+
return columnSettingAfterEnabledChange(currentColumnSettings, columns, enabled);
|
|
232
294
|
});
|
|
233
295
|
return {
|
|
234
296
|
...state,
|
|
235
297
|
display: {
|
|
236
298
|
...state.display,
|
|
237
|
-
columnSettings: orderIntentionally(updatedColumnSettings, columnNameMap),
|
|
299
|
+
columnSettings: orderIntentionally(updatedColumnSettings, columnNameMap, columns),
|
|
238
300
|
},
|
|
239
301
|
};
|
|
240
302
|
}
|
|
@@ -258,31 +320,21 @@ export var TableColumnHelpers;
|
|
|
258
320
|
...state,
|
|
259
321
|
display: {
|
|
260
322
|
...state.display,
|
|
261
|
-
columnSettings: orderIntentionally(defaultColumnState, columnNameMap),
|
|
323
|
+
columnSettings: orderIntentionally(defaultColumnState, columnNameMap, columns),
|
|
262
324
|
},
|
|
263
325
|
};
|
|
264
326
|
}
|
|
265
327
|
TableColumnHelpers.resetToDefaultColumns = resetToDefaultColumns;
|
|
266
|
-
function
|
|
267
|
-
return new Map([...columns.entries()].map(([name, metadata]) => [
|
|
328
|
+
function convertInMemoryColumnMetadataMap(columns) {
|
|
329
|
+
return new Map([...columns.entries()].map(([name, { orderKey, ...metadata }]) => [
|
|
268
330
|
name,
|
|
269
331
|
{
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
searchable: metadata.searchable,
|
|
273
|
-
description: metadata.description,
|
|
274
|
-
minWidth: metadata.minWidth,
|
|
275
|
-
dataType: metadata.dataType,
|
|
276
|
-
defaultPinned: metadata.defaultPinned,
|
|
277
|
-
clickPreventDefault: metadata.clickPreventDefault,
|
|
278
|
-
clickStopPropagation: metadata.clickStopPropagation,
|
|
279
|
-
displayName: metadata.displayName,
|
|
280
|
-
alwaysVisible: metadata.alwaysVisible,
|
|
281
|
-
tooltipForHideIcon: metadata.tooltipForHideIcon,
|
|
332
|
+
...metadata,
|
|
333
|
+
orderable: !!orderKey,
|
|
282
334
|
},
|
|
283
335
|
]));
|
|
284
336
|
}
|
|
285
|
-
TableColumnHelpers.
|
|
337
|
+
TableColumnHelpers.convertInMemoryColumnMetadataMap = convertInMemoryColumnMetadataMap;
|
|
286
338
|
function getColumnSettingsColumnList(state) {
|
|
287
339
|
const allColumnMetadata = [
|
|
288
340
|
...state.display.columns,
|
|
@@ -301,6 +353,8 @@ export var TableColumnHelpers;
|
|
|
301
353
|
isLastPinnedColumn: column.pinned && !nextColumnPinned,
|
|
302
354
|
alwaysVisible: currentColumnMetadata?.alwaysVisible ?? false,
|
|
303
355
|
tooltipForHideIcon: currentColumnMetadata?.tooltipForHideIcon,
|
|
356
|
+
alwaysPinned: currentColumnMetadata?.alwaysPinned ?? false,
|
|
357
|
+
tooltipForReorderIcon: currentColumnMetadata?.tooltipForReorderIcon,
|
|
304
358
|
highlightIndices: [],
|
|
305
359
|
};
|
|
306
360
|
});
|
|
@@ -308,4 +362,4 @@ export var TableColumnHelpers;
|
|
|
308
362
|
}
|
|
309
363
|
TableColumnHelpers.getColumnSettingsColumnList = getColumnSettingsColumnList;
|
|
310
364
|
})(TableColumnHelpers || (TableColumnHelpers = {}));
|
|
311
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi90YWJsZS90YWJsZS9zdGF0ZS1oZWxwZXJzL2NvbHVtbi1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFcEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVwQyxNQUFNLEtBQVcsa0JBQWtCLENBdWdCbEM7QUF2Z0JELFdBQWlCLGtCQUFrQjtJQUNqQyxTQUFnQixrQkFBa0IsQ0FDaEMsUUFBaUMsRUFDakMsT0FBZ0I7UUFFaEIsSUFBSSxPQUFPO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFDM0IsUUFBUSxRQUFRLEVBQUU7WUFDaEIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxNQUFNLENBQUM7WUFDaEIsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFdBQVc7Z0JBQ2QsT0FBTyxRQUFRLENBQUM7WUFDbEIsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sT0FBTyxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJQWpCZSxxQ0FBa0IscUJBaUJqQyxDQUFBO0lBRUQsU0FBZ0IsYUFBYSxDQU0zQixLQUFxQyxFQUNyQyxnQkFBaUQsRUFDakQsYUFBd0M7UUFFeEMsNEVBQTRFO1FBQzVFLDRFQUE0RTtRQUM1RSwyRUFBMkU7UUFDM0UsNkVBQTZFO1FBQzdFLHlFQUF5RTtRQUN6RSx1RUFBdUU7UUFDdkUsa0NBQWtDO1FBQ2xDLE1BQU0sOEJBQThCLEdBQUcsVUFBVSxDQUMvQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsRUFDNUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FB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QWEsSUFBSSxLQUFLO2dCQUM1RCxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0I7Z0JBQzdELGdCQUFnQixFQUFFLEVBQUU7YUFDckIsQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO1FBRUYsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQW5DZSw4Q0FBMkIsOEJBbUMxQyxDQUFBO0FBQ0gsQ0FBQyxFQXZnQmdCLGtCQUFrQixLQUFsQixrQkFBa0IsUUF1Z0JsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSGlnaGxpZ2h0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vdmlzdWFsaXphdGlvbi9oaWdobGlnaHQvaGlnaGxpZ2h0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSaXZUYWJsZSB9IGZyb20gJy4uL3N0YXRlJztcblxuZXhwb3J0IG5hbWVzcGFjZSBUYWJsZUNvbHVtbkhlbHBlcnMge1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uQWxpZ25tZW50KFxuICAgIGRhdGFUeXBlOiBSaXZUYWJsZS5Db2x1bW5EYXRhVHlwZSxcbiAgICBpc0ZpcnN0OiBib29sZWFuLFxuICApOiBSaXZUYWJsZS5Db2x1bW5BbGlnbm1lbnQge1xuICAgIGlmIChpc0ZpcnN0KSByZXR1cm4gJ2xlZnQnO1xuICAgIHN3aXRjaCAoZGF0YVR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgY2FzZSAnbG9uZ1RleHQnOlxuICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgICAgY2FzZSAnYWR2YW5jZWQnOlxuICAgICAgY2FzZSAnaWNvbic6XG4gICAgICBjYXNlICdzaG9ydFRleHQnOlxuICAgICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgICBjYXNlICdjdXJyZW5jeSc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICB9XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZ2V0QWxsQ29sdW1uczxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KFxuICAgIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgc3VwcG9ydGVkQ29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICApOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPltdIHtcbiAgICAvLyBJZiB0aGUgdGFibGUgb2ZmZXJzIG1vcmUgY29sdW1ucyB0aGFuIHRoZSB1c2VyIGhhcyBjb25maWd1cmF0aW9uIHNldHRpbmdzXG4gICAgLy8gZm9yIChvciBpZiB0aGUgdXNlciBoYXMgbm8gY29uZmlndXJhdGlvbiBzZXR0aW5ncyB5ZXQpLCB3ZSdsbCBhcHBlbmQgdGhlbVxuICAgIC8vIHRvIHRoZSBlbmQgKHVubGVzcyB0aGV5IHNob3VsZCBiZSBwaW5uZWQgYnkgZGVmYXVsdCwgaW4gd2hpY2ggY2FzZSB3ZSdsbFxuICAgIC8vIGFwcGVuZCB0aGVtIGFmdGVyIHRoZSBvdGhlciBwaW5uZWQgY29sdW1ucykuIFRoaXMgZW5zdXJlcyB0aGF0IG5ldyBjb2x1bW5zXG4gICAgLy8gd2UgYWRkIHRvIGV4aXN0aW5nIHRhYmxlcyBvdmVyIHRpbWUgKDEpIGdldCBkaXNwbGF5ZWQgZXZlbiB0aG91Z2ggdGhleVxuICAgIC8vIGRvbid0IGFwcGVhciBpbiB0aGUgdXNlcidzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgeWV0LCBhbmQgKDIpIGRvbid0XG4gICAgLy8gaW50ZXJydXB0IHRoZWlyIGV4aXN0aW5nIHNldHVwLlxuICAgIGNvbnN0IGNvbHVtbk5hbWVzV2l0aG91dFVzZXJTZXR0aW5ncyA9IGRpZmZlcmVuY2UoXG4gICAgICBbLi4uc3VwcG9ydGVkQ29sdW1ucy5rZXlzKCldLFxuICAgICAgc3RhdGUuZGlzcGxheS5jb2x1bW5TZXR0aW5ncy5tYXAoKHsga2V5IH0pID0+IGtleSksXG4gICAgKTtcblxuICAgIC8vIFRocm93IG91dCBzZXR0aW5ncyBmb3IgY29sdW1ucyBubyBsb25nZXIgb2ZmZXJlZCBieSB0aGUgdGFibGUuXG4gICAgY29uc3QgY29sdW1uc1dpdGhVc2VyU2V0dGluZ3M6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10gPVxuICAgICAgc3RhdGUuZGlzcGxheS5jb2x1bW5TZXR0aW5ncy5maWx0ZXIoKHsga2V5IH0pID0+XG4gICAgICAgIHN1cHBvcnRlZENvbHVtbnMuaGFzKGtleSksXG4gICAgICApO1xuXG4gICAgY29uc3QgY29sdW1uc1dpdGhvdXRVc2VyU2V0dGluZ3M6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10gPSBbXG4gICAgICAuLi5jb2x1bW5OYW1lc1dpdGhvdXRVc2VyU2V0dGluZ3MsXG4gICAgXS5tYXAoKGtleTogQykgPT4gKHtcbiAgICAgIGtleSxcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBwcmVmZXJyZWRXaWR0aDogJ2F1dG8nLFxuICAgICAgcGlubmVkOiAhIXN1cHBvcnRlZENvbHVtbnMuZ2V0KGtleSk/LmRlZmF1bHRQaW5uZWQsXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIG9yZGVySW50ZW50aW9uYWxseShcbiAgICAgIFsuLi5jb2x1bW5zV2l0aFVzZXJTZXR0aW5ncywgLi4uY29sdW1uc1dpdGhvdXRVc2VyU2V0dGluZ3NdLFxuICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gb3JkZXJJbnRlbnRpb25hbGx5PEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4+KFxuICAgIGNvbHVtbnM6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgKTogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLmNvbHVtbnMuZmlsdGVyKHYgPT4gdi5waW5uZWQpLFxuICAgICAgLi4uY29sdW1ucy5maWx0ZXIodiA9PiB2LmVuYWJsZWQgJiYgIXYucGlubmVkKSxcbiAgICAgIC4uLmNvbHVtbnNcbiAgICAgICAgLmZpbHRlcih2ID0+ICF2LmVuYWJsZWQgJiYgIXYucGlubmVkKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIGNvbnN0IGFOYW1lID0gY29sdW1uTmFtZU1hcC5nZXQoYS5rZXkpID8/IGEua2V5O1xuICAgICAgICAgIGNvbnN0IGJOYW1lID0gY29sdW1uTmFtZU1hcC5nZXQoYi5rZXkpID8/IGIua2V5O1xuICAgICAgICAgIHJldHVybiBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lKTtcbiAgICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEFsaWdubWVudChcbiAgICBtZXRhZGF0YTogUml2VGFibGUuQ29sdW1uTWV0YWRhdGEsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBhbGxvd1NlbGVjdGlvbj86IGJvb2xlYW4sXG4gICk6IFJpdlRhYmxlLkNvbHVtbkFsaWdubWVudCB7XG4gICAgcmV0dXJuIGdldENvbHVtbkFsaWdubWVudChcbiAgICAgIG1ldGFkYXRhLmRhdGFUeXBlLFxuICAgICAgaW5kZXggPT09IDAgJiYgIWFsbG93U2VsZWN0aW9uLFxuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbHVtbnM8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIHN1cHBvcnRlZENvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgICBhbGxvd1NlbGVjdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICBmaWx0ZXJUbzogJ2VuYWJsZWQnIHwgJ2Rpc2FibGVkJyxcbiAgKTogUml2VGFibGUuRnVsbENvbHVtbjxDPltdIHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gZ2V0QWxsQ29sdW1ucyhzdGF0ZSwgc3VwcG9ydGVkQ29sdW1ucywgY29sdW1uTmFtZU1hcCk7XG4gICAgcmV0dXJuIGFsbENvbHVtbnNcbiAgICAgIC5maWx0ZXIoKHsgZW5hYmxlZCB9KSA9PiAoZmlsdGVyVG8gPT09ICdlbmFibGVkJyA/IGVuYWJsZWQgOiAhZW5hYmxlZCkpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoXG4gICAgICAgICAgZnVsbENvbHVtbnM6IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz5bXSxcbiAgICAgICAgICBzZXR0aW5nczogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz4sXG4gICAgICAgICAgaTogbnVtYmVyLFxuICAgICAgICApOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+W10gPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gc3VwcG9ydGVkQ29sdW1ucy5nZXQoc2V0dGluZ3Mua2V5KSE7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRXaWR0aCA9XG4gICAgICAgICAgICBzZXR0aW5ncy5wcmVmZXJyZWRXaWR0aCA9PT0gJ2F1dG8nXG4gICAgICAgICAgICAgID8gbWV0YWRhdGEubWluV2lkdGhcbiAgICAgICAgICAgICAgOiBNYXRoLm1heChtZXRhZGF0YS5taW5XaWR0aCwgc2V0dGluZ3MucHJlZmVycmVkV2lkdGgpO1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ29sdW1uOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+IHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAgIGZ1bGxDb2x1bW5zW2kgLSAxXTtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4uZnVsbENvbHVtbnMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnNldHRpbmdzLFxuICAgICAgICAgICAgICAuLi5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgd2lkdGg6IHJlc29sdmVkV2lkdGgsXG4gICAgICAgICAgICAgIGxlZnQ6IHNldHRpbmdzLnBpbm5lZFxuICAgICAgICAgICAgICAgID8gcHJldmlvdXNDb2x1bW5cbiAgICAgICAgICAgICAgICAgID8gKHByZXZpb3VzQ29sdW1uLmxlZnQgfHwgMCkgKyBwcmV2aW91c0NvbHVtbi53aWR0aFxuICAgICAgICAgICAgICAgICAgOiAhIWFsbG93U2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICA/IDQwXG4gICAgICAgICAgICAgICAgICA6IDBcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgIGFsaWdubWVudDogZ2V0QWxpZ25tZW50KG1ldGFkYXRhLCBpLCAhIWFsbG93U2VsZWN0aW9uKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgfSxcbiAgICAgICAgW10sXG4gICAgICApO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUNvbHVtblBpbjxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KFxuICAgIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICAgIGNvbHVtbjogQyxcbiAgICBwaW5uZWQ6IGJvb2xlYW4sXG4gICk6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IGdldEFsbENvbHVtbnMoc3RhdGUsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApO1xuXG4gICAgaWYgKHBpbm5lZCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gYWxsQ29sdW1ucy5maW5kKGMgPT4gYy5rZXkgPT09IGNvbHVtbik7XG4gICAgICBjb25zdCB3YXNFbmFibGVkID0gISF0YXJnZXQ/LmVuYWJsZWQ7XG4gICAgICBpZiAoIXdhc0VuYWJsZWQpIHtcbiAgICAgICAgY29uc3QgZW5hYmxlZENvdW50ID0gYWxsQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5lbmFibGVkKS5sZW5ndGg7XG4gICAgICAgIGlmIChlbmFibGVkQ291bnQgPj0gUml2VGFibGUuQ29sdW1uc01heFNob3duKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlOyAvLyByZWZ1c2UgdGhlIHBpbiBzaW5jZSBpdCB3b3VsZCBleGNlZWQgdGhlIG1heFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBjb2x1bW5TZXR0aW5nczogb3JkZXJJbnRlbnRpb25hbGx5KFxuICAgICAgICAgIGFsbENvbHVtbnMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgIC4uLmMsXG4gICAgICAgICAgICBwaW5uZWQ6IGMua2V5ID09PSBjb2x1bW4gPyBwaW5uZWQgOiBjLnBpbm5lZCxcbiAgICAgICAgICAgIC8vIENoZWNrL2VuYWJsZSBpZiBiZWluZyBwaW5uZWRcbiAgICAgICAgICAgIGVuYWJsZWQ6IGMua2V5ID09PSBjb2x1bW4gJiYgcGlubmVkID8gdHJ1ZSA6IGMuZW5hYmxlZCxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VDb2x1bW5zRnJlZXplU3RhdGU8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGZyZWV6ZTogYm9vbGVhbixcbiAgKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gZ2V0QWxsQ29sdW1ucyhzdGF0ZSwgY29sdW1ucywgY29sdW1uTmFtZU1hcCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICAgIGNvbHVtblNldHRpbmdzOiBhbGxDb2x1bW5zLm1hcCgoYywgaSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7IC4uLmMsIHBpbm5lZDogZnJlZXplICYmIGkgPD0gaW5kZXggfTtcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbW92ZUNvbHVtblRvPFxuICAgIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gICAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4gID4oXG4gICAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgICBjb2x1bW5zOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+LFxuICAgIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gICAgY29sdW1uOiBDLFxuICAgIHBvc2l0aW9uOiAnc3RhcnQnIHwgJ2VuZCcsXG4gICk6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IGdldEFsbENvbHVtbnMoc3RhdGUsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApO1xuICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBhbGxDb2x1bW5zLmZpbmRJbmRleChjID0+IGMua2V5ID09PSBjb2x1bW4pO1xuICAgIGNvbnN0IGxhc3RJbmRleCA9XG4gICAgICBwb3NpdGlvbiA9PSAnZW5kJyA/IGFsbENvbHVtbnMuZmluZEluZGV4KGMgPT4gIWMuZW5hYmxlZCkgOiAwO1xuICAgIGNvbnN0IG5ld0luZGV4ID1cbiAgICAgIHBvc2l0aW9uID09ICdzdGFydCdcbiAgICAgICAgPyAwXG4gICAgICAgIDogbGFzdEluZGV4ID09IC0xXG4gICAgICAgID8gYWxsQ29sdW1ucy5sZW5ndGggLSAxXG4gICAgICAgIDogbGFzdEluZGV4O1xuXG4gICAgaWYgKFxuICAgICAgIWFsbENvbHVtbnNbcHJldmlvdXNJbmRleF0uZW5hYmxlZCAmJlxuICAgICAgYWxsQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5lbmFibGVkKS5sZW5ndGggPj0gUml2VGFibGUuQ29sdW1uc01heFNob3duXG4gICAgKVxuICAgICAgcmV0dXJuIHN0YXRlO1xuXG4gICAgY29uc3QgbW92ZWRTdGF0ZSA9IGNoYW5nZUNvbHVtbk9yZGVyKFxuICAgICAgc3RhdGUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgIHByZXZpb3VzSW5kZXgsXG4gICAgICBuZXdJbmRleCxcbiAgICApO1xuICAgIC8vTWFrZSBzdXJlIHRoZSBjb2x1bW4gaXMgZW5hYmxlZFxuICAgIHJldHVybiBjaGFuZ2VDb2x1bW5FbmFibGVkKFxuICAgICAgbW92ZWRTdGF0ZSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgY29sdW1uLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUNvbHVtbk9yZGVyPFxuICAgIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gICAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4gID4oXG4gICAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgICBjb2x1bW5zOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+LFxuICAgIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gICAgcHJldmlvdXNJbmRleDogbnVtYmVyLFxuICAgIG5ld0luZGV4OiBudW1iZXIsXG4gICk6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IGdldEFsbENvbHVtbnMoc3RhdGUsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApO1xuXG4gICAgLy8gRmlyc3QsIHB1dCB0aGUgY29sdW1ucyBpbiB0aGUgZGVzaXJlZCBvcmRlci5cbiAgICBjb25zdCBpdGVtID0gYWxsQ29sdW1uc1twcmV2aW91c0luZGV4XTtcbiAgICBjb25zdCB3aXRob3V0SXRlbSA9IGFsbENvbHVtbnMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBwcmV2aW91c0luZGV4KTtcbiAgICBjb25zdCByZW9yZGVyZWQgPSBbXG4gICAgICAuLi53aXRob3V0SXRlbS5zbGljZSgwLCBuZXdJbmRleCksXG4gICAgICBpdGVtLFxuICAgICAgLi4ud2l0aG91dEl0ZW0uc2xpY2UobmV3SW5kZXgpLFxuICAgIF07XG5cbiAgICAvLyBUaGVuLCB3ZSBtYXkgbmVlZCB0byBmaXggdGhlIHBpbnMgKGFsbCBwaW5uZWQgY29sdW1ucyBhcHBlYXIgYXQgdGhlXG4gICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBjb2x1bW5zIGFycmF5KSBzaW5jZSB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIGRyYWdcbiAgICAvLyBhbmQgZHJvcCBjb2x1bW5zIHRvIGFuZCBmcm9tIHRoZSBwaW5uZWQgYXJlYS4gSWYgdGhlIHVzZXIgZHJhZ3MgYVxuICAgIC8vIGNvbHVtbiBhY3Jvc3MgdGhhdCB0aHJlc2hvbGQsIHVwZGF0ZSBpdHMgcGlubmVkIHN0YXR1cy5cbiAgICBjb25zdCB1cGRhdGVkID0gcmVvcmRlcmVkLm1hcCgoc2V0dGluZ3MsIGksIGFycikgPT4ge1xuICAgICAgaWYgKG5ld0luZGV4ID09PSBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc2V0dGluZ3MsXG4gICAgICAgICAgcGlubmVkOiBzZXR0aW5ncy5waW5uZWRcbiAgICAgICAgICAgID8gYXJyW2kgLSAxXT8ucGlubmVkID8/IHRydWVcbiAgICAgICAgICAgIDogYXJyW2kgKyAxXT8ucGlubmVkID8/IGZhbHNlLFxuICAgICAgICAgIGVuYWJsZWQ6IHNldHRpbmdzLmVuYWJsZWRcbiAgICAgICAgICAgID8gYXJyW2kgLSAxXT8uZW5hYmxlZCA/PyB0cnVlXG4gICAgICAgICAgICA6IGFycltpICsgMV0/LmVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgcmV0dXJuIHNldHRpbmdzO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgd2FzRGlzYWJsZWQgPSAhaXRlbS5lbmFibGVkO1xuICAgIGNvbnN0IGJlY2FtZUVuYWJsZWQgPSB1cGRhdGVkW25ld0luZGV4XS5lbmFibGVkO1xuICAgIGlmICh3YXNEaXNhYmxlZCAmJiBiZWNhbWVFbmFibGVkKSB7XG4gICAgICBjb25zdCBlbmFibGVkQ291bnQgPSBhbGxDb2x1bW5zLmZpbHRlcihjID0+IGMuZW5hYmxlZCkubGVuZ3RoO1xuICAgICAgaWYgKGVuYWJsZWRDb3VudCA+PSBSaXZUYWJsZS5Db2x1bW5zTWF4U2hvd24pIHtcbiAgICAgICAgLy8gUmVmdXNlIHRoZSBtb3ZlOyBrZWVwIHN0YXRlIGFzLWlzXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICAgIGNvbHVtblNldHRpbmdzOiBvcmRlckludGVudGlvbmFsbHkodXBkYXRlZCwgY29sdW1uTmFtZU1hcCksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gY2hhbmdlQ29sdW1uRW5hYmxlZDxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KFxuICAgIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICAgIGNvbHVtbjogQyxcbiAgICBlbmFibGVkOiBib29sZWFuLFxuICApOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKHN0YXRlLCBjb2x1bW5zLCBjb2x1bW5OYW1lTWFwKTtcbiAgICBpZiAoXG4gICAgICBlbmFibGVkICYmXG4gICAgICBhbGxDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmVuYWJsZWQpLmxlbmd0aCA+PSBSaXZUYWJsZS5Db2x1bW5zTWF4U2hvd25cbiAgICApIHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICAgIGNvbHVtblNldHRpbmdzOiBvcmRlckludGVudGlvbmFsbHkoXG4gICAgICAgICAgYWxsQ29sdW1ucy5tYXAoYyA9PiAoe1xuICAgICAgICAgICAgLi4uYyxcbiAgICAgICAgICAgIGVuYWJsZWQ6IGMua2V5ID09PSBjb2x1bW4gPyBlbmFibGVkIDogYy5lbmFibGVkLFxuICAgICAgICAgICAgLy8gVW5waW4gaWYgYmVpbmcgdW5jaGVja2VkXG4gICAgICAgICAgICBwaW5uZWQ6IGMua2V5ID09PSBjb2x1bW4gJiYgIWVuYWJsZWQgPyBmYWxzZSA6IGMucGlubmVkLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUFsbENvbHVtbnM8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgICBlbmFibGVkOiBib29sZWFuLFxuICApOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKHN0YXRlLCBjb2x1bW5zLCBjb2x1bW5OYW1lTWFwKTtcbiAgICBpZiAoZW5hYmxlZCAmJiBhbGxDb2x1bW5zLmxlbmd0aCA+IFJpdlRhYmxlLkNvbHVtbnNNYXhTaG93bikge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRDb2x1bW5TZXR0aW5nczogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bXSA9IGFsbENvbHVtbnMubWFwKFxuICAgICAgY3VycmVudENvbHVtblNldHRpbmdzID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbk1ldGFkYXRhOiBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YSB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgY29sdW1ucy5nZXQoY3VycmVudENvbHVtblNldHRpbmdzLmtleSk7XG4gICAgICAgIGNvbnN0IGlzQ29sdW1uQWx3YXlzVmlzaWJsZTogYm9vbGVhbiA9XG4gICAgICAgICAgY3VycmVudENvbHVtbk1ldGFkYXRhPy5hbHdheXNWaXNpYmxlID8/IGZhbHNlO1xuXG4gICAgICAgIGlmIChpc0NvbHVtbkFsd2F5c1Zpc2libGUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY3VycmVudENvbHVtblNldHRpbmdzLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jdXJyZW50Q29sdW1uU2V0dGluZ3MsXG4gICAgICAgICAgZW5hYmxlZDogZW5hYmxlZCxcbiAgICAgICAgICAvLyBVbnBpbiBpZiBiZWluZyB1bmNoZWNrZWRcbiAgICAgICAgICBwaW5uZWQ6ICFlbmFibGVkID8gZmFsc2UgOiBjdXJyZW50Q29sdW1uU2V0dGluZ3MucGlubmVkLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBjb2x1bW5TZXR0aW5nczogb3JkZXJJbnRlbnRpb25hbGx5KFxuICAgICAgICAgIHVwZGF0ZWRDb2x1bW5TZXR0aW5ncyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUNvbHVtbldpZHRoPFxuICAgIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gICAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4gID4oXG4gICAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgICBjb2x1bW5zOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+LFxuICAgIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gICAgY29sdW1uOiBDLFxuICAgIHByZWZlcnJlZFdpZHRoOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPlsncHJlZmVycmVkV2lkdGgnXSxcbiAgKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gZ2V0QWxsQ29sdW1ucyhzdGF0ZSwgY29sdW1ucywgY29sdW1uTmFtZU1hcCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBjb2x1bW5TZXR0aW5nczogYWxsQ29sdW1ucy5tYXAoYyA9PiAoe1xuICAgICAgICAgIC4uLmMsXG4gICAgICAgICAgcHJlZmVycmVkV2lkdGg6IGMua2V5ID09PSBjb2x1bW4gPyBwcmVmZXJyZWRXaWR0aCA6IGMucHJlZmVycmVkV2lkdGgsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZXNldFRvRGVmYXVsdENvbHVtbnM8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgICBkZWZhdWx0Q29sdW1uU3RhdGU6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10sXG4gICk6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBjb2x1bW5TZXR0aW5nczogb3JkZXJJbnRlbnRpb25hbGx5KGRlZmF1bHRDb2x1bW5TdGF0ZSwgY29sdW1uTmFtZU1hcCksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29sdW1uTWV0YWRhdGFNYXA8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICA+KFxuICAgIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Jbk1lbW9yeUNvbHVtbk1ldGFkYXRhPFI+PixcbiAgKTogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPiB7XG4gICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICBbLi4uY29sdW1ucy5lbnRyaWVzKCldLm1hcCgoW25hbWUsIG1ldGFkYXRhXSkgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICB7XG4gICAgICAgICAgb3JkZXJhYmxlOiAhIW1ldGFkYXRhLm9yZGVyS2V5LFxuICAgICAgICAgIGZpbHRlcmFibGU6IG1ldGFkYXRhLmZpbHRlcmFibGUsXG4gICAgICAgICAgc2VhcmNoYWJsZTogbWV0YWRhdGEuc2VhcmNoYWJsZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICAgICAgbWluV2lkdGg6IG1ldGFkYXRhLm1pbldpZHRoLFxuICAgICAgICAgIGRhdGFUeXBlOiBtZXRhZGF0YS5kYXRhVHlwZSxcbiAgICAgICAgICBkZWZhdWx0UGlubmVkOiBtZXRhZGF0YS5kZWZhdWx0UGlubmVkLFxuICAgICAgICAgIGNsaWNrUHJldmVudERlZmF1bHQ6IG1ldGFkYXRhLmNsaWNrUHJldmVudERlZmF1bHQsXG4gICAgICAgICAgY2xpY2tTdG9wUHJvcGFnYXRpb246IG1ldGFkYXRhLmNsaWNrU3RvcFByb3BhZ2F0aW9uLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiBtZXRhZGF0YS5kaXNwbGF5TmFtZSxcbiAgICAgICAgICBhbHdheXNWaXNpYmxlOiBtZXRhZGF0YS5hbHdheXNWaXNpYmxlLFxuICAgICAgICAgIHRvb2x0aXBGb3JIaWRlSWNvbjogbWV0YWRhdGEudG9vbHRpcEZvckhpZGVJY29uLFxuICAgICAgICB9LFxuICAgICAgXSksXG4gICAgKTtcbiAgfVxuXG4gIGV4cG9ydCB0eXBlIENvbHVtbkxpc3Q8QyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbj4gPVxuICAgIChSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPiAmIHtcbiAgICAgIHJlc29sdmVkTmFtZTogQyB8IHN0cmluZztcbiAgICAgIGhpZ2hsaWdodEluZGljZXM6IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgICBzdGF0ZUluZGV4OiBudW1iZXI7XG4gICAgICBpc0xhc3RQaW5uZWRDb2x1bW46IGJvb2xlYW47XG4gICAgICBhbHdheXNWaXNpYmxlOiBib29sZWFuO1xuICAgICAgdG9vbHRpcEZvckhpZGVJY29uPzogc3RyaW5nO1xuICAgIH0pW107XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtblNldHRpbmdzQ29sdW1uTGlzdDxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KHN0YXRlOiBSaXZUYWJsZS5GdWxsU3RhdGU8UiwgQywgRiwgRz4pOiBDb2x1bW5MaXN0PEM+IHtcbiAgICBjb25zdCBhbGxDb2x1bW5NZXRhZGF0YSA9IFtcbiAgICAgIC4uLnN0YXRlLmRpc3BsYXkuY29sdW1ucyxcbiAgICAgIC4uLnN0YXRlLmRpc3BsYXkuZGlzYWJsZWRDb2x1bW5zLFxuICAgIF07XG4gICAgY29uc3QgY29sdW1uc0xlbmd0aCA9IHN0YXRlLmRpc3BsYXkuYWxsQ29sdW1ucy5sZW5ndGg7XG4gICAgY29uc3QgYWxsQ29sdW1uczogQ29sdW1uTGlzdDxDPiA9IHN0YXRlLmRpc3BsYXkuYWxsQ29sdW1ucy5tYXAoXG4gICAgICAoY29sdW1uLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRDb2x1bW5QaW5uZWQgPVxuICAgICAgICAgIGkgKyAyIDw9IGNvbHVtbnNMZW5ndGhcbiAgICAgICAgICAgID8gc3RhdGUuZGlzcGxheS5hbGxDb2x1bW5zW2kgKyAxXS5waW5uZWRcbiAgICAgICAgICAgIDogZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbk1ldGFkYXRhOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+IHwgdW5kZWZpbmVkID1cbiAgICAgICAgICBhbGxDb2x1bW5NZXRhZGF0YS5maW5kKG1ldGFkYXRhID0+IG1ldGFkYXRhLmtleSA9PT0gY29sdW1uLmtleSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgcmVzb2x2ZWROYW1lOlxuICAgICAgICAgICAgc3RhdGUuZGlzcGxheS5jb2x1bW5OYW1lTWFwLmdldChjb2x1bW4ua2V5KSA/PyBjb2x1bW4ua2V5LFxuICAgICAgICAgIHN0YXRlSW5kZXg6IGksXG4gICAgICAgICAgaXNMYXN0UGlubmVkQ29sdW1uOiBjb2x1bW4ucGlubmVkICYmICFuZXh0Q29sdW1uUGlubmVkLFxuICAgICAgICAgIGFsd2F5c1Zpc2libGU6IGN1cnJlbnRDb2x1bW5NZXRhZGF0YT8uYWx3YXlzVmlzaWJsZSA/PyBmYWxzZSxcbiAgICAgICAgICB0b29sdGlwRm9ySGlkZUljb246IGN1cnJlbnRDb2x1bW5NZXRhZGF0YT8udG9vbHRpcEZvckhpZGVJY29uLFxuICAgICAgICAgIGhpZ2hsaWdodEluZGljZXM6IFtdLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGFsbENvbHVtbnM7XG4gIH1cbn1cbiJdfQ==
|
|
365
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi90YWJsZS90YWJsZS9zdGF0ZS1oZWxwZXJzL2NvbHVtbi1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXBDLE1BQU0sS0FBVyxrQkFBa0IsQ0E2bkJsQztBQTduQkQsV0FBaUIsa0JBQWtCO0lBQ2pDLFNBQWdCLGtCQUFrQixDQUNoQyxRQUFpQyxFQUNqQyxPQUFnQjtRQUVoQixJQUFJLE9BQU87WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMzQixRQUFRLFFBQVEsRUFBRTtZQUNoQixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssVUFBVTtnQkFDYixPQUFPLE1BQU0sQ0FBQztZQUNoQixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssV0FBVztnQkFDZCxPQUFPLFFBQVEsQ0FBQztZQUNsQixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxPQUFPLENBQUM7U0FDbEI7SUFDSCxDQUFDO0lBakJlLHFDQUFrQixxQkFpQmpDLENBQUE7SUFFRCxTQUFnQixhQUFhLENBTTNCLEtBQXFDLEVBQ3JDLGdCQUFpRCxFQUNqRCxhQUF3QztRQUV4Qyw0RUFBNEU7UUFDNUUsNEVBQTRFO1FBQzVFLDJFQUEyRTtRQUMzRSw2RUFBNkU7UUFDN0UseUVBQXlFO1FBQ3pFLHVFQUF1RTtRQUN2RSxrQ0FBa0M7UUFDbEMsTUFBTSw4QkFBOEIsR0FBRyxVQUFVLENBQy9DLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUM1QixLQUFLLENBQUMsT0FB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TSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ1osTUFBTSxnQkFBZ0IsR0FDcEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxhQUFhO2dCQUNwQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU07Z0JBQ3hDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFFWixNQUFNLHFCQUFxQixHQUN6QixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVsRSxPQUFPO2dCQUNMLEdBQUcsTUFBTTtnQkFDVCxZQUFZLEVBQ1YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRztnQkFDM0QsVUFBVSxFQUFFLENBQUM7Z0JBQ2Isa0JBQWtCLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQjtnQkFDdEQsYUFBYSxFQUFFLHFCQUFxQixFQUFFLGFBQWEsSUFBSSxLQUFLO2dCQUM1RCxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0I7Z0JBQzdELFlBQVksRUFBRSxxQkFBcUIsRUFBRSxZQUFZLElBQUksS0FBSztnQkFDMUQscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCO2dCQUNuRSxnQkFBZ0IsRUFBRSxFQUFFO2FBQ3JCLENBQUM7UUFDSixDQUFDLENBQ0YsQ0FBQztRQUVGLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFyQ2UsOENBQTJCLDhCQXFDMUMsQ0FBQTtBQUNILENBQUMsRUE3bkJnQixrQkFBa0IsS0FBbEIsa0JBQWtCLFFBNm5CbEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkaWZmZXJlbmNlLCBwYXJ0aXRpb24gYXMgbG9kYXNoUGFydGl0aW9uIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEhpZ2hsaWdodENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3Zpc3VhbGl6YXRpb24vaGlnaGxpZ2h0L2hpZ2hsaWdodC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUml2VGFibGUgfSBmcm9tICcuLi9zdGF0ZSc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGFibGVDb2x1bW5IZWxwZXJzIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtbkFsaWdubWVudChcbiAgICBkYXRhVHlwZTogUml2VGFibGUuQ29sdW1uRGF0YVR5cGUsXG4gICAgaXNGaXJzdDogYm9vbGVhbixcbiAgKTogUml2VGFibGUuQ29sdW1uQWxpZ25tZW50IHtcbiAgICBpZiAoaXNGaXJzdCkgcmV0dXJuICdsZWZ0JztcbiAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ2xvbmdUZXh0JzpcbiAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICAgIGNhc2UgJ2FkdmFuY2VkJzpcbiAgICAgIGNhc2UgJ2ljb24nOlxuICAgICAgY2FzZSAnc2hvcnRUZXh0JzpcbiAgICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgICAgY2FzZSAnY3VycmVuY3knOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldEFsbENvbHVtbnM8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIHN1cHBvcnRlZENvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgKTogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bXSB7XG4gICAgLy8gSWYgdGhlIHRhYmxlIG9mZmVycyBtb3JlIGNvbHVtbnMgdGhhbiB0aGUgdXNlciBoYXMgY29uZmlndXJhdGlvbiBzZXR0aW5nc1xuICAgIC8vIGZvciAob3IgaWYgdGhlIHVzZXIgaGFzIG5vIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgeWV0KSwgd2UnbGwgYXBwZW5kIHRoZW1cbiAgICAvLyB0byB0aGUgZW5kICh1bmxlc3MgdGhleSBzaG91bGQgYmUgcGlubmVkIGJ5IGRlZmF1bHQsIGluIHdoaWNoIGNhc2Ugd2UnbGxcbiAgICAvLyBhcHBlbmQgdGhlbSBhZnRlciB0aGUgb3RoZXIgcGlubmVkIGNvbHVtbnMpLiBUaGlzIGVuc3VyZXMgdGhhdCBuZXcgY29sdW1uc1xuICAgIC8vIHdlIGFkZCB0byBleGlzdGluZyB0YWJsZXMgb3ZlciB0aW1lICgxKSBnZXQgZGlzcGxheWVkIGV2ZW4gdGhvdWdoIHRoZXlcbiAgICAvLyBkb24ndCBhcHBlYXIgaW4gdGhlIHVzZXIncyBjb25maWd1cmF0aW9uIHNldHRpbmdzIHlldCwgYW5kICgyKSBkb24ndFxuICAgIC8vIGludGVycnVwdCB0aGVpciBleGlzdGluZyBzZXR1cC5cbiAgICBjb25zdCBjb2x1bW5OYW1lc1dpdGhvdXRVc2VyU2V0dGluZ3MgPSBkaWZmZXJlbmNlKFxuICAgICAgWy4uLnN1cHBvcnRlZENvbHVtbnMua2V5cygpXSxcbiAgICAgIHN0YXRlLmRpc3BsYXkuY29sdW1uU2V0dGluZ3MubWFwKCh7IGtleSB9KSA9PiBrZXkpLFxuICAgICk7XG5cbiAgICAvLyBUaHJvdyBvdXQgc2V0dGluZ3MgZm9yIGNvbHVtbnMgbm8gbG9uZ2VyIG9mZmVyZWQgYnkgdGhlIHRhYmxlLlxuICAgIGNvbnN0IG9ubHlDb2x1bW5zV2l0aFVzZXJTZXR0aW5nczogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bXSA9XG4gICAgICBzdGF0ZS5kaXNwbGF5LmNvbHVtblNldHRpbmdzLmZpbHRlcigoeyBrZXkgfSkgPT5cbiAgICAgICAgc3VwcG9ydGVkQ29sdW1ucy5oYXMoa2V5KSxcbiAgICAgICk7XG4gICAgY29uc3QgY29sdW1uc1dpdGhVc2VyU2V0dGluZ3M6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10gPVxuICAgICAgb25seUNvbHVtbnNXaXRoVXNlclNldHRpbmdzLm1hcChjb2x1bW5TZXR0aW5nID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb2x1bW5TZXR0aW5nLFxuICAgICAgICAgIC8qXG4gICAgICAgICAgICBPdmVyd3JpdGUgdGhlIGVuYWJsZWQvcGlubmVkIHN0YXRlIGlmIHRoZSBjb2x1bW4gc2hvdWxkIGJlIFwiYWx3YXlzIHBpbm5lZFwiLlxuICAgICAgICAgICAgT3RoZXJ3aXNlLCByZXNwZWN0IHRoZSBzYXZlZCB1c2VyIHNldHRpbmdzLlxuICAgICAgICAgICovXG4gICAgICAgICAgZW5hYmxlZDogISFzdXBwb3J0ZWRDb2x1bW5zLmdldChjb2x1bW5TZXR0aW5nLmtleSk/LmFsd2F5c1Bpbm5lZFxuICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICA6IGNvbHVtblNldHRpbmcuZW5hYmxlZCxcbiAgICAgICAgICBwaW5uZWQ6ICEhc3VwcG9ydGVkQ29sdW1ucy5nZXQoY29sdW1uU2V0dGluZy5rZXkpPy5hbHdheXNQaW5uZWRcbiAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgOiBjb2x1bW5TZXR0aW5nLnBpbm5lZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgY29sdW1uc1dpdGhvdXRVc2VyU2V0dGluZ3M6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10gPSBbXG4gICAgICAuLi5jb2x1bW5OYW1lc1dpdGhvdXRVc2VyU2V0dGluZ3MsXG4gICAgXS5tYXAoKGtleTogQykgPT4gKHtcbiAgICAgIGtleSxcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBwcmVmZXJyZWRXaWR0aDogJ2F1dG8nLFxuICAgICAgcGlubmVkOlxuICAgICAgICAhIXN1cHBvcnRlZENvbHVtbnMuZ2V0KGtleSk/LmRlZmF1bHRQaW5uZWQgfHxcbiAgICAgICAgISFzdXBwb3J0ZWRDb2x1bW5zLmdldChrZXkpPy5hbHdheXNQaW5uZWQsXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIG9yZGVySW50ZW50aW9uYWxseShcbiAgICAgIFsuLi5jb2x1bW5zV2l0aFVzZXJTZXR0aW5ncywgLi4uY29sdW1uc1dpdGhvdXRVc2VyU2V0dGluZ3NdLFxuICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgIHN1cHBvcnRlZENvbHVtbnMsXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9yZGVySW50ZW50aW9uYWxseTxDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uPihcbiAgICBjb2x1bW5zOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPltdLFxuICAgIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gICAgY29sdW1uTWV0YWRhdGFNYXA6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICk6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10ge1xuICAgIGNvbnN0IFthbHdheXNQaW5uZWRDb2x1bW5zLCBzb21ldGltZXNQaW5uZWRDb2x1bW5zXSA9IGxvZGFzaFBhcnRpdGlvbihcbiAgICAgIGNvbHVtbnMsXG4gICAgICBjb2x1bW4gPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uTWV0YWRhdGE6IFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhIHwgdW5kZWZpbmVkID1cbiAgICAgICAgICBjb2x1bW5NZXRhZGF0YU1hcC5nZXQoY29sdW1uLmtleSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDb2x1bW5NZXRhZGF0YT8uYWx3YXlzUGlubmVkID8/IGZhbHNlO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgW3Bpbm5lZENvbHVtbnMsIHVucGlubmVkQ29sdW1uc10gPSBsb2Rhc2hQYXJ0aXRpb24oXG4gICAgICBzb21ldGltZXNQaW5uZWRDb2x1bW5zLFxuICAgICAgY29sdW1uID0+IGNvbHVtbi5waW5uZWQsXG4gICAgKTtcblxuICAgIGNvbnN0IFtlbmFibGVkVW5waW5uZWRDb2x1bW5zLCBkaXNhYmxlZENvbHVtbnNdID0gbG9kYXNoUGFydGl0aW9uKFxuICAgICAgdW5waW5uZWRDb2x1bW5zLFxuICAgICAgY29sdW1uID0+IGNvbHVtbi5lbmFibGVkLFxuICAgICk7XG5cbiAgICBjb25zdCBzb3J0ZWREaXNhYmxlZENvbHVtbnMgPSBkaXNhYmxlZENvbHVtbnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYU5hbWUgPSBjb2x1bW5OYW1lTWFwLmdldChhLmtleSkgPz8gYS5rZXk7XG4gICAgICBjb25zdCBiTmFtZSA9IGNvbHVtbk5hbWVNYXAuZ2V0KGIua2V5KSA/PyBiLmtleTtcbiAgICAgIHJldHVybiBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBbXG4gICAgICAuLi5hbHdheXNQaW5uZWRDb2x1bW5zLFxuICAgICAgLi4ucGlubmVkQ29sdW1ucyxcbiAgICAgIC4uLmVuYWJsZWRVbnBpbm5lZENvbHVtbnMsXG4gICAgICAuLi5zb3J0ZWREaXNhYmxlZENvbHVtbnMsXG4gICAgXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEFsaWdubWVudChcbiAgICBtZXRhZGF0YTogUml2VGFibGUuQ29sdW1uTWV0YWRhdGEsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBhbGxvd1NlbGVjdGlvbj86IGJvb2xlYW4sXG4gICk6IFJpdlRhYmxlLkNvbHVtbkFsaWdubWVudCB7XG4gICAgcmV0dXJuIGdldENvbHVtbkFsaWdubWVudChcbiAgICAgIG1ldGFkYXRhLmRhdGFUeXBlLFxuICAgICAgaW5kZXggPT09IDAgJiYgIWFsbG93U2VsZWN0aW9uLFxuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbHVtbnM8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIHN1cHBvcnRlZENvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgICBhbGxvd1NlbGVjdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICBmaWx0ZXJUbzogJ2VuYWJsZWQnIHwgJ2Rpc2FibGVkJyxcbiAgKTogUml2VGFibGUuRnVsbENvbHVtbjxDPltdIHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gZ2V0QWxsQ29sdW1ucyhzdGF0ZSwgc3VwcG9ydGVkQ29sdW1ucywgY29sdW1uTmFtZU1hcCk7XG4gICAgcmV0dXJuIGFsbENvbHVtbnNcbiAgICAgIC5maWx0ZXIoKHsgZW5hYmxlZCB9KSA9PiAoZmlsdGVyVG8gPT09ICdlbmFibGVkJyA/IGVuYWJsZWQgOiAhZW5hYmxlZCkpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoXG4gICAgICAgICAgZnVsbENvbHVtbnM6IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz5bXSxcbiAgICAgICAgICBzZXR0aW5nczogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz4sXG4gICAgICAgICAgaTogbnVtYmVyLFxuICAgICAgICApOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+W10gPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gc3VwcG9ydGVkQ29sdW1ucy5nZXQoc2V0dGluZ3Mua2V5KSE7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRXaWR0aCA9XG4gICAgICAgICAgICBzZXR0aW5ncy5wcmVmZXJyZWRXaWR0aCA9PT0gJ2F1dG8nXG4gICAgICAgICAgICAgID8gbWV0YWRhdGEubWluV2lkdGhcbiAgICAgICAgICAgICAgOiBNYXRoLm1heChtZXRhZGF0YS5taW5XaWR0aCwgc2V0dGluZ3MucHJlZmVycmVkV2lkdGgpO1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ29sdW1uOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+IHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAgIGZ1bGxDb2x1bW5zW2kgLSAxXTtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4uZnVsbENvbHVtbnMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnNldHRpbmdzLFxuICAgICAgICAgICAgICAuLi5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgd2lkdGg6IHJlc29sdmVkV2lkdGgsXG4gICAgICAgICAgICAgIGxlZnQ6IHNldHRpbmdzLnBpbm5lZFxuICAgICAgICAgICAgICAgID8gcHJldmlvdXNDb2x1bW5cbiAgICAgICAgICAgICAgICAgID8gKHByZXZpb3VzQ29sdW1uLmxlZnQgfHwgMCkgKyBwcmV2aW91c0NvbHVtbi53aWR0aFxuICAgICAgICAgICAgICAgICAgOiAhIWFsbG93U2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICA/IDQwXG4gICAgICAgICAgICAgICAgICA6IDBcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgIGFsaWdubWVudDogZ2V0QWxpZ25tZW50KG1ldGFkYXRhLCBpLCAhIWFsbG93U2VsZWN0aW9uKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgfSxcbiAgICAgICAgW10sXG4gICAgICApO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUNvbHVtblBpbjxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KFxuICAgIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICAgIGNvbHVtbjogQyxcbiAgICBwaW5uZWQ6IGJvb2xlYW4sXG4gICk6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gICAgY29uc3QgY3VycmVudENvbHVtbk1ldGFkYXRhOiBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YSB8IHVuZGVmaW5lZCA9XG4gICAgICBjb2x1bW5zLmdldChjb2x1bW4pO1xuXG4gICAgLy8gWW91IGNhbm5vdCBjaGFuZ2UgdGhlIHBpbm5lZCBzdGF0dXMgb2YgYW4gYWx3YXlzIHBpbm5lZCBjb2x1bW5cbiAgICBpZiAoISFjdXJyZW50Q29sdW1uTWV0YWRhdGE/LmFsd2F5c1Bpbm5lZCkge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKHN0YXRlLCBjb2x1bW5zLCBjb2x1bW5OYW1lTWFwKTtcblxuICAgIGlmIChwaW5uZWQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGFsbENvbHVtbnMuZmluZChjID0+IGMua2V5ID09PSBjb2x1bW4pO1xuICAgICAgY29uc3Qgd2FzRW5hYmxlZCA9ICEhdGFyZ2V0Py5lbmFibGVkO1xuICAgICAgaWYgKCF3YXNFbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IGVuYWJsZWRDb3VudCA9IGFsbENvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZW5hYmxlZCkubGVuZ3RoO1xuICAgICAgICBpZiAoZW5hYmxlZENvdW50ID49IFJpdlRhYmxlLkNvbHVtbnNNYXhTaG93bikge1xuICAgICAgICAgIHJldHVybiBzdGF0ZTsgLy8gcmVmdXNlIHRoZSBwaW4gc2luY2UgaXQgd291bGQgZXhjZWVkIHRoZSBtYXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgICAgY29sdW1uU2V0dGluZ3M6IG9yZGVySW50ZW50aW9uYWxseShcbiAgICAgICAgICBhbGxDb2x1bW5zLm1hcChjID0+ICh7XG4gICAgICAgICAgICAuLi5jLFxuICAgICAgICAgICAgcGlubmVkOiBjLmtleSA9PT0gY29sdW1uID8gcGlubmVkIDogYy5waW5uZWQsXG4gICAgICAgICAgICAvLyBDaGVjay9lbmFibGUgaWYgYmVpbmcgcGlubmVkXG4gICAgICAgICAgICBlbmFibGVkOiBjLmtleSA9PT0gY29sdW1uICYmIHBpbm5lZCA/IHRydWUgOiBjLmVuYWJsZWQsXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VDb2x1bW5zRnJlZXplU3RhdGU8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGZyZWV6ZTogYm9vbGVhbixcbiAgKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gZ2V0QWxsQ29sdW1ucyhzdGF0ZSwgY29sdW1ucywgY29sdW1uTmFtZU1hcCk7XG5cbiAgICBjb25zdCB1cGRhdGVkQ29sdW1uU2V0dGluZ3M6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10gPSBhbGxDb2x1bW5zLm1hcChcbiAgICAgIChjdXJyZW50Q29sdW1uU2V0dGluZ3MsIGN1cnJlbnRJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uTWV0YWRhdGE6IFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhIHwgdW5kZWZpbmVkID1cbiAgICAgICAgICBjb2x1bW5zLmdldChjdXJyZW50Q29sdW1uU2V0dGluZ3Mua2V5KTtcblxuICAgICAgICBjb25zdCBpc0NvbHVtbkFsd2F5c1Bpbm5lZDogYm9vbGVhbiA9XG4gICAgICAgICAgY3VycmVudENvbHVtbk1ldGFkYXRhPy5hbHdheXNQaW5uZWQgPz8gZmFsc2U7XG5cbiAgICAgICAgaWYgKGlzQ29sdW1uQWx3YXlzUGlubmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnRDb2x1bW5TZXR0aW5ncyxcbiAgICAgICAgICAgIHBpbm5lZDogdHJ1ZSxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY3VycmVudENvbHVtblNldHRpbmdzLFxuICAgICAgICAgIHBpbm5lZDogZnJlZXplICYmIGN1cnJlbnRJbmRleCA8PSBpbmRleCxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgICAgY29sdW1uU2V0dGluZ3M6IHVwZGF0ZWRDb2x1bW5TZXR0aW5ncyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtb3ZlQ29sdW1uVG88XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgICBjb2x1bW46IEMsXG4gICAgcG9zaXRpb246ICdzdGFydCcgfCAnZW5kJyxcbiAgKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgICBjb25zdCBjdXJyZW50Q29sdW1uTWV0YWRhdGE6IFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhIHwgdW5kZWZpbmVkID1cbiAgICAgIGNvbHVtbnMuZ2V0KGNvbHVtbik7XG5cbiAgICAvLyBZb3UgY2Fubm90IG1vdmUgYW4gYWx3YXlzIHBpbm5lZCBjb2x1bW5cbiAgICBpZiAoISFjdXJyZW50Q29sdW1uTWV0YWRhdGE/LmFsd2F5c1Bpbm5lZCkge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKHN0YXRlLCBjb2x1bW5zLCBjb2x1bW5OYW1lTWFwKTtcbiAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gYWxsQ29sdW1ucy5maW5kSW5kZXgoYyA9PiBjLmtleSA9PT0gY29sdW1uKTtcbiAgICBjb25zdCBsYXN0SW5kZXggPVxuICAgICAgcG9zaXRpb24gPT0gJ2VuZCcgPyBhbGxDb2x1bW5zLmZpbmRJbmRleChjID0+ICFjLmVuYWJsZWQpIDogMDtcbiAgICBjb25zdCBuZXdJbmRleCA9XG4gICAgICBwb3NpdGlvbiA9PSAnc3RhcnQnXG4gICAgICAgID8gMFxuICAgICAgICA6IGxhc3RJbmRleCA9PSAtMVxuICAgICAgICA/IGFsbENvbHVtbnMubGVuZ3RoIC0gMVxuICAgICAgICA6IGxhc3RJbmRleDtcblxuICAgIGlmIChcbiAgICAgICFhbGxDb2x1bW5zW3ByZXZpb3VzSW5kZXhdLmVuYWJsZWQgJiZcbiAgICAgIGFsbENvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZW5hYmxlZCkubGVuZ3RoID49IFJpdlRhYmxlLkNvbHVtbnNNYXhTaG93blxuICAgIClcbiAgICAgIHJldHVybiBzdGF0ZTtcblxuICAgIGNvbnN0IG1vdmVkU3RhdGUgPSBjaGFuZ2VDb2x1bW5PcmRlcihcbiAgICAgIHN0YXRlLFxuICAgICAgY29sdW1ucyxcbiAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICBwcmV2aW91c0luZGV4LFxuICAgICAgbmV3SW5kZXgsXG4gICAgKTtcbiAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbHVtbiBpcyBlbmFibGVkXG4gICAgcmV0dXJuIGNoYW5nZUNvbHVtbkVuYWJsZWQoXG4gICAgICBtb3ZlZFN0YXRlLFxuICAgICAgY29sdW1ucyxcbiAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICBjb2x1bW4sXG4gICAgICB0cnVlLFxuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gY2hhbmdlQ29sdW1uT3JkZXI8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgICBwcmV2aW91c0luZGV4OiBudW1iZXIsXG4gICAgbmV3SW5kZXg6IG51bWJlcixcbiAgKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gZ2V0QWxsQ29sdW1ucyhzdGF0ZSwgY29sdW1ucywgY29sdW1uTmFtZU1hcCk7XG5cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gYWxsQ29sdW1uc1twcmV2aW91c0luZGV4XTtcblxuICAgIGNvbnN0IGN1cnJlbnRDb2x1bW5NZXRhZGF0YTogUml2VGFibGUuQ29sdW1uTWV0YWRhdGEgfCB1bmRlZmluZWQgPVxuICAgICAgY29sdW1ucy5nZXQoaXRlbVRvTW92ZS5rZXkpO1xuICAgIC8vIFlvdSBjYW5ub3QgbW92ZSBhbiBhbHdheXMgcGlubmVkIGNvbHVtblxuICAgIGlmICghIWN1cnJlbnRDb2x1bW5NZXRhZGF0YT8uYWx3YXlzUGlubmVkKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgLy8gRmlyc3QsIHB1dCB0aGUgY29sdW1ucyBpbiB0aGUgZGVzaXJlZCBvcmRlci5cbiAgICBjb25zdCB3aXRob3V0SXRlbSA9IGFsbENvbHVtbnMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBwcmV2aW91c0luZGV4KTtcbiAgICBjb25zdCByZW9yZGVyZWQgPSBbXG4gICAgICAuLi53aXRob3V0SXRlbS5zbGljZSgwLCBuZXdJbmRleCksXG4gICAgICBpdGVtVG9Nb3ZlLFxuICAgICAgLi4ud2l0aG91dEl0ZW0uc2xpY2UobmV3SW5kZXgpLFxuICAgIF07XG5cbiAgICAvLyBUaGVuLCB3ZSBtYXkgbmVlZCB0byBmaXggdGhlIHBpbnMgKGFsbCBwaW5uZWQgY29sdW1ucyBhcHBlYXIgYXQgdGhlXG4gICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBjb2x1bW5zIGFycmF5KSBzaW5jZSB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIGRyYWdcbiAgICAvLyBhbmQgZHJvcCBjb2x1bW5zIHRvIGFuZCBmcm9tIHRoZSBwaW5uZWQgYXJlYS4gSWYgdGhlIHVzZXIgZHJhZ3MgYVxuICAgIC8vIGNvbHVtbiBhY3Jvc3MgdGhhdCB0aHJlc2hvbGQsIHVwZGF0ZSBpdHMgcGlubmVkIHN0YXR1cy5cbiAgICBjb25zdCB1cGRhdGVkID0gcmVvcmRlcmVkLm1hcCgoc2V0dGluZ3MsIGksIGFycikgPT4ge1xuICAgICAgaWYgKG5ld0luZGV4ID09PSBpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc2V0dGluZ3MsXG4gICAgICAgICAgcGlubmVkOiBzZXR0aW5ncy5waW5uZWRcbiAgICAgICAgICAgID8gYXJyW2kgLSAxXT8ucGlubmVkID8/IHRydWVcbiAgICAgICAgICAgIDogYXJyW2kgKyAxXT8ucGlubmVkID8/IGZhbHNlLFxuICAgICAgICAgIGVuYWJsZWQ6IHNldHRpbmdzLmVuYWJsZWRcbiAgICAgICAgICAgID8gYXJyW2kgLSAxXT8uZW5hYmxlZCA/PyB0cnVlXG4gICAgICAgICAgICA6IGFycltpICsgMV0/LmVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgcmV0dXJuIHNldHRpbmdzO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgd2FzRGlzYWJsZWQgPSAhaXRlbVRvTW92ZS5lbmFibGVkO1xuICAgIGNvbnN0IGJlY2FtZUVuYWJsZWQgPSB1cGRhdGVkW25ld0luZGV4XS5lbmFibGVkO1xuICAgIGlmICh3YXNEaXNhYmxlZCAmJiBiZWNhbWVFbmFibGVkKSB7XG4gICAgICBjb25zdCBlbmFibGVkQ291bnQgPSBhbGxDb2x1bW5zLmZpbHRlcihjID0+IGMuZW5hYmxlZCkubGVuZ3RoO1xuICAgICAgaWYgKGVuYWJsZWRDb3VudCA+PSBSaXZUYWJsZS5Db2x1bW5zTWF4U2hvd24pIHtcbiAgICAgICAgLy8gUmVmdXNlIHRoZSBtb3ZlOyBrZWVwIHN0YXRlIGFzLWlzXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICAgIGNvbHVtblNldHRpbmdzOiBvcmRlckludGVudGlvbmFsbHkodXBkYXRlZCwgY29sdW1uTmFtZU1hcCwgY29sdW1ucyksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjb2x1bW5TZXR0aW5nQWZ0ZXJFbmFibGVkQ2hhbmdlPEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4+KFxuICAgIGN1cnJlbnRDb2x1bW5TZXR0aW5nczogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz4sXG4gICAgY29sdW1uTWV0YWRhdGFNYXA6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgZW5hYmxlZDogYm9vbGVhbixcbiAgKTogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz4ge1xuICAgIGNvbnN0IGN1cnJlbnRDb2x1bW5NZXRhZGF0YTogUml2VGFibGUuQ29sdW1uTWV0YWRhdGEgfCB1bmRlZmluZWQgPVxuICAgICAgY29sdW1uTWV0YWRhdGFNYXAuZ2V0KGN1cnJlbnRDb2x1bW5TZXR0aW5ncy5rZXkpO1xuXG4gICAgY29uc3QgaXNDb2x1bW5BbHdheXNQaW5uZWQ6IGJvb2xlYW4gPVxuICAgICAgY3VycmVudENvbHVtbk1ldGFkYXRhPy5hbHdheXNQaW5uZWQgPz8gZmFsc2U7XG4gICAgY29uc3QgaXNDb2x1bW5BbHdheXNWaXNpYmxlOiBib29sZWFuID1cbiAgICAgIGN1cnJlbnRDb2x1bW5NZXRhZGF0YT8uYWx3YXlzVmlzaWJsZSA/PyBmYWxzZTtcblxuICAgIGlmIChpc0NvbHVtbkFsd2F5c1Bpbm5lZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY3VycmVudENvbHVtblNldHRpbmdzLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBwaW5uZWQ6IHRydWUsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoaXNDb2x1bW5BbHdheXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jdXJyZW50Q29sdW1uU2V0dGluZ3MsXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jdXJyZW50Q29sdW1uU2V0dGluZ3MsXG4gICAgICBlbmFibGVkOiBlbmFibGVkLFxuICAgICAgLy8gVW5waW4gaWYgYmVpbmcgdW5jaGVja2VkXG4gICAgICBwaW5uZWQ6ICFlbmFibGVkID8gZmFsc2UgOiBjdXJyZW50Q29sdW1uU2V0dGluZ3MucGlubmVkLFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gY2hhbmdlQ29sdW1uRW5hYmxlZDxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KFxuICAgIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICAgIGNvbHVtbjogQyxcbiAgICBlbmFibGVkOiBib29sZWFuLFxuICApOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKHN0YXRlLCBjb2x1bW5zLCBjb2x1bW5OYW1lTWFwKTtcbiAgICBpZiAoXG4gICAgICBlbmFibGVkICYmXG4gICAgICBhbGxDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmVuYWJsZWQpLmxlbmd0aCA+PSBSaXZUYWJsZS5Db2x1bW5zTWF4U2hvd25cbiAgICApIHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkQ29sdW1uU2V0dGluZ3M6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10gPSBhbGxDb2x1bW5zLm1hcChcbiAgICAgIGN1cnJlbnRDb2x1bW5TZXR0aW5ncyA9PiB7XG4gICAgICAgIGlmIChjdXJyZW50Q29sdW1uU2V0dGluZ3Mua2V5ICE9PSBjb2x1bW4pIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudENvbHVtblNldHRpbmdzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbHVtblNldHRpbmdBZnRlckVuYWJsZWRDaGFuZ2UoXG4gICAgICAgICAgY3VycmVudENvbHVtblNldHRpbmdzLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgZW5hYmxlZCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgICAgY29sdW1uU2V0dGluZ3M6IG9yZGVySW50ZW50aW9uYWxseShcbiAgICAgICAgICB1cGRhdGVkQ29sdW1uU2V0dGluZ3MsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUFsbENvbHVtbnM8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgICBlbmFibGVkOiBib29sZWFuLFxuICApOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKHN0YXRlLCBjb2x1bW5zLCBjb2x1bW5OYW1lTWFwKTtcbiAgICBpZiAoZW5hYmxlZCAmJiBhbGxDb2x1bW5zLmxlbmd0aCA+IFJpdlRhYmxlLkNvbHVtbnNNYXhTaG93bikge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRDb2x1bW5TZXR0aW5nczogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bXSA9IGFsbENvbHVtbnMubWFwKFxuICAgICAgY3VycmVudENvbHVtblNldHRpbmdzID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbHVtblNldHRpbmdBZnRlckVuYWJsZWRDaGFuZ2UoXG4gICAgICAgICAgY3VycmVudENvbHVtblNldHRpbmdzLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgZW5hYmxlZCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgICAgY29sdW1uU2V0dGluZ3M6IG9yZGVySW50ZW50aW9uYWxseShcbiAgICAgICAgICB1cGRhdGVkQ29sdW1uU2V0dGluZ3MsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUNvbHVtbldpZHRoPFxuICAgIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gICAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4gID4oXG4gICAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgICBjb2x1bW5zOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+LFxuICAgIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gICAgY29sdW1uOiBDLFxuICAgIHByZWZlcnJlZFdpZHRoOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPlsncHJlZmVycmVkV2lkdGgnXSxcbiAgKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gZ2V0QWxsQ29sdW1ucyhzdGF0ZSwgY29sdW1ucywgY29sdW1uTmFtZU1hcCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBjb2x1bW5TZXR0aW5nczogYWxsQ29sdW1ucy5tYXAoYyA9PiAoe1xuICAgICAgICAgIC4uLmMsXG4gICAgICAgICAgcHJlZmVycmVkV2lkdGg6IGMua2V5ID09PSBjb2x1bW4gPyBwcmVmZXJyZWRXaWR0aCA6IGMucHJlZmVycmVkV2lkdGgsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZXNldFRvRGVmYXVsdENvbHVtbnM8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgICBkZWZhdWx0Q29sdW1uU3RhdGU6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10sXG4gICk6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBjb2x1bW5TZXR0aW5nczogb3JkZXJJbnRlbnRpb25hbGx5KFxuICAgICAgICAgIGRlZmF1bHRDb2x1bW5TdGF0ZSxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gY29udmVydEluTWVtb3J5Q29sdW1uTWV0YWRhdGFNYXA8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICA+KFxuICAgIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Jbk1lbW9yeUNvbHVtbk1ldGFkYXRhPFI+PixcbiAgKTogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPiB7XG4gICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICBbLi4uY29sdW1ucy5lbnRyaWVzKCldLm1hcCgoW25hbWUsIHsgb3JkZXJLZXksIC4uLm1ldGFkYXRhIH1dKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5tZXRhZGF0YSxcbiAgICAgICAgICBvcmRlcmFibGU6ICEhb3JkZXJLZXksXG4gICAgICAgIH0sXG4gICAgICBdKSxcbiAgICApO1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgQ29sdW1uTGlzdDxDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uPiA9XG4gICAgKFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+ICYge1xuICAgICAgcmVzb2x2ZWROYW1lOiBDIHwgc3RyaW5nO1xuICAgICAgaGlnaGxpZ2h0SW5kaWNlczogSGlnaGxpZ2h0Q29tcG9uZW50LkhpZ2hsaWdodEluZGljZXNbXTtcbiAgICAgIHN0YXRlSW5kZXg6IG51bWJlcjtcbiAgICAgIGlzTGFzdFBpbm5lZENvbHVtbjogYm9vbGVhbjtcbiAgICAgIGFsd2F5c1Zpc2libGU6IGJvb2xlYW47XG4gICAgICB0b29sdGlwRm9ySGlkZUljb24/OiBzdHJpbmc7XG4gICAgICBhbHdheXNQaW5uZWQ6IGJvb2xlYW47XG4gICAgICB0b29sdGlwRm9yUmVvcmRlckljb24/OiBzdHJpbmc7XG4gICAgfSlbXTtcblxuICBleHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uU2V0dGluZ3NDb2x1bW5MaXN0PFxuICAgIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gICAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4gID4oc3RhdGU6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPik6IENvbHVtbkxpc3Q8Qz4ge1xuICAgIGNvbnN0IGFsbENvbHVtbk1ldGFkYXRhID0gW1xuICAgICAgLi4uc3RhdGUuZGlzcGxheS5jb2x1bW5zLFxuICAgICAgLi4uc3RhdGUuZGlzcGxheS5kaXNhYmxlZENvbHVtbnMsXG4gICAgXTtcbiAgICBjb25zdCBjb2x1bW5zTGVuZ3RoID0gc3RhdGUuZGlzcGxheS5hbGxDb2x1bW5zLmxlbmd0aDtcbiAgICBjb25zdCBhbGxDb2x1bW5zOiBDb2x1bW5MaXN0PEM+ID0gc3RhdGUuZGlzcGxheS5hbGxDb2x1bW5zLm1hcChcbiAgICAgIChjb2x1bW4sIGkpID0+IHtcbiAgICAgICAgY29uc3QgbmV4dENvbHVtblBpbm5lZCA9XG4gICAgICAgICAgaSArIDIgPD0gY29sdW1uc0xlbmd0aFxuICAgICAgICAgICAgPyBzdGF0ZS5kaXNwbGF5LmFsbENvbHVtbnNbaSArIDFdLnBpbm5lZFxuICAgICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uTWV0YWRhdGE6IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz4gfCB1bmRlZmluZWQgPVxuICAgICAgICAgIGFsbENvbHVtbk1ldGFkYXRhLmZpbmQobWV0YWRhdGEgPT4gbWV0YWRhdGEua2V5ID09PSBjb2x1bW4ua2V5KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICByZXNvbHZlZE5hbWU6XG4gICAgICAgICAgICBzdGF0ZS5kaXNwbGF5LmNvbHVtbk5hbWVNYXAuZ2V0KGNvbHVtbi5rZXkpID8/IGNvbHVtbi5rZXksXG4gICAgICAgICAgc3RhdGVJbmRleDogaSxcbiAgICAgICAgICBpc0xhc3RQaW5uZWRDb2x1bW46IGNvbHVtbi5waW5uZWQgJiYgIW5leHRDb2x1bW5QaW5uZWQsXG4gICAgICAgICAgYWx3YXlzVmlzaWJsZTogY3VycmVudENvbHVtbk1ldGFkYXRhPy5hbHdheXNWaXNpYmxlID8/IGZhbHNlLFxuICAgICAgICAgIHRvb2x0aXBGb3JIaWRlSWNvbjogY3VycmVudENvbHVtbk1ldGFkYXRhPy50b29sdGlwRm9ySGlkZUljb24sXG4gICAgICAgICAgYWx3YXlzUGlubmVkOiBjdXJyZW50Q29sdW1uTWV0YWRhdGE/LmFsd2F5c1Bpbm5lZCA/PyBmYWxzZSxcbiAgICAgICAgICB0b29sdGlwRm9yUmVvcmRlckljb246IGN1cnJlbnRDb2x1bW5NZXRhZGF0YT8udG9vbHRpcEZvclJlb3JkZXJJY29uLFxuICAgICAgICAgIGhpZ2hsaWdodEluZGljZXM6IFtdLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGFsbENvbHVtbnM7XG4gIH1cbn1cbiJdfQ==
|