@flywheel-io/vision 2.7.5 → 2.7.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/chip-list/chip-list.component.d.ts +6 -3
- package/components/tooltip/tooltip-panel/tooltip-panel.component.d.ts +1 -1
- package/components/typeahead/typeahead.component.d.ts +11 -2
- package/esm2022/components/chip-list/chip-list.component.mjs +19 -4
- package/esm2022/components/dialog/dialog.component.mjs +2 -2
- package/esm2022/components/textarea-input/textarea-input.component.mjs +5 -10
- package/esm2022/components/typeahead/typeahead.component.mjs +42 -16
- package/fesm2022/flywheel-io-vision.mjs +62 -27
- package/fesm2022/flywheel-io-vision.mjs.map +1 -1
- package/package.json +1 -1
- package/scss/config/overlay.scss +2 -1
- package/styles.css +2 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { CdkMenuModule, CdkMenuTrigger } from '@angular/cdk/menu';
|
|
2
2
|
import { NgClass } from '@angular/common';
|
|
3
|
-
import { ChangeDetectorRef, Component, computed, effect, forwardRef, HostListener, inject, input, model, signal, viewChild, viewChildren, } from '@angular/core';
|
|
3
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, forwardRef, HostListener, inject, input, model, signal, viewChild, viewChildren, } from '@angular/core';
|
|
4
4
|
import { toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
5
5
|
import { NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
-
import { map, of,
|
|
6
|
+
import { combineLatest, map, of, switchMap, tap } from 'rxjs';
|
|
7
7
|
import { MenuRegisterDirective } from '../../directives/menu-register.directive';
|
|
8
8
|
import { FwChipModule } from '../chip/chip.module';
|
|
9
9
|
import { FwChipListComponent } from '../chip-list/chip-list.component';
|
|
@@ -33,7 +33,9 @@ export class FwTypeaheadComponent {
|
|
|
33
33
|
this.onTouched = () => {
|
|
34
34
|
};
|
|
35
35
|
this.value = model([]);
|
|
36
|
+
this.value$ = toObservable(this.value);
|
|
36
37
|
this.optionsInput = input([], { alias: 'options' });
|
|
38
|
+
this.optionsInput$ = toObservable(this.optionsInput);
|
|
37
39
|
this.maxOptionsHeight = input('400px');
|
|
38
40
|
this.minOptionsHeight = input('0px');
|
|
39
41
|
this.optionsWidth = input('');
|
|
@@ -44,31 +46,53 @@ export class FwTypeaheadComponent {
|
|
|
44
46
|
this.searchValueChanges$ = toObservable(this.searchValue);
|
|
45
47
|
this.allowNew = input(true);
|
|
46
48
|
this.placeholder = input('Enter tags...');
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Options after they've been both filtered for matching the search and already selected
|
|
51
|
+
*/
|
|
52
|
+
this.filteredOptions$ = combineLatest([
|
|
53
|
+
this.searchValueChanges$,
|
|
54
|
+
this.optionsInput$,
|
|
55
|
+
]).pipe(tap(() => this.loading.set(true)),
|
|
56
|
+
// first determine if it's a function or static options
|
|
57
|
+
switchMap(([searchString, optionInput]) => {
|
|
58
|
+
if (typeof optionInput === 'function') {
|
|
59
|
+
const fetchingFunction = optionInput;
|
|
50
60
|
return fetchingFunction(searchString);
|
|
51
61
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
62
|
+
else {
|
|
63
|
+
// if they're static options we need to do the search filtering
|
|
64
|
+
const filteredOptionInput = optionInput?.filter(opt => opt.toLowerCase().includes(searchString.toLowerCase()));
|
|
65
|
+
return of(filteredOptionInput);
|
|
66
|
+
}
|
|
67
|
+
}),
|
|
68
|
+
// next filter out already selected values
|
|
69
|
+
switchMap(options => combineLatest([of(options), this.value$])), map(([options, currentValue]) => {
|
|
70
|
+
return options?.filter(option => {
|
|
71
|
+
const alreadySelected = currentValue.find(val => val.toLowerCase() === option.toLowerCase());
|
|
57
72
|
return !alreadySelected;
|
|
58
73
|
});
|
|
59
74
|
}), tap(() => this.loading.set(false)));
|
|
60
|
-
|
|
75
|
+
/**
|
|
76
|
+
* Options after they've been both filtered for matching the search and already selected
|
|
77
|
+
*/
|
|
78
|
+
this.filteredOptions = toSignal(this.filteredOptions$);
|
|
61
79
|
this.displayNewOption = computed(() => {
|
|
62
80
|
const newValue = this.searchValue();
|
|
63
81
|
if (!newValue) {
|
|
64
82
|
return false;
|
|
65
83
|
}
|
|
66
|
-
const directMatch = this.
|
|
84
|
+
const directMatch = this.filteredOptions()?.includes?.(newValue);
|
|
67
85
|
const loading = this.loading();
|
|
68
86
|
const alreadySelected = Boolean(this.value().find(val => val.toLowerCase() === newValue.toLowerCase()));
|
|
69
87
|
return this.allowNew() && !alreadySelected && (!directMatch || loading);
|
|
70
88
|
});
|
|
71
89
|
this.addValue = (newValue) => {
|
|
90
|
+
const isInOptions = this.filteredOptions().includes(newValue);
|
|
91
|
+
const isNewWhileDisallowed = !this.allowNew() && !isInOptions;
|
|
92
|
+
const isDuplicate = this.value().includes(newValue.toLowerCase());
|
|
93
|
+
if (isNewWhileDisallowed || isDuplicate) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
72
96
|
this.value.update(prevValue => [
|
|
73
97
|
...prevValue || [],
|
|
74
98
|
newValue,
|
|
@@ -127,7 +151,6 @@ export class FwTypeaheadComponent {
|
|
|
127
151
|
};
|
|
128
152
|
}
|
|
129
153
|
outsideClick() {
|
|
130
|
-
this.onTouched();
|
|
131
154
|
this.trigger().close();
|
|
132
155
|
}
|
|
133
156
|
setDisabledState(isDisabled) {
|
|
@@ -168,6 +191,9 @@ export class FwTypeaheadComponent {
|
|
|
168
191
|
// eslint-disable-next-line @rx-angular/prefer-no-layout-sensitive-apis
|
|
169
192
|
this.inputRef().nativeElement.focus();
|
|
170
193
|
}
|
|
194
|
+
onFocusLoss(_) {
|
|
195
|
+
this.onTouched();
|
|
196
|
+
}
|
|
171
197
|
/* eslint-enable */
|
|
172
198
|
handleKey(e) {
|
|
173
199
|
const handler = this.keyHandlerMap[e.key];
|
|
@@ -205,7 +231,7 @@ export class FwTypeaheadComponent {
|
|
|
205
231
|
useExisting: forwardRef(() => FwTypeaheadComponent),
|
|
206
232
|
multi: true,
|
|
207
233
|
},
|
|
208
|
-
], viewQueries: [{ propertyName: "trigger", first: true, predicate: CdkMenuTrigger, descendants: true, isSignal: true }, { propertyName: "displayedOptions", predicate: FwMenuItemComponent, descendants: true, isSignal: true }, { propertyName: "inputRef", first: true, predicate: ["input"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n (click)=\"focusInput($event)\"\n class=\"input-container\"\n [ngClass]=\"{ 'disabled': disabled() }\"\n [cdkMenuTriggerFor]=\"menuContent\"\n fwMenuRegister\n #inputContainer>\n <fw-chip-list class=\"chips\">\n @for(val of value(); track val) {\n <fw-chip\n color=\"primary\"\n [showClose]=\"true\"\n [title]=\"val\"\n [selectable]=\"false\"\n (close)=\"closeChip(val)\"\n />\n }\n </fw-chip-list>\n <input\n test-id=\"typeahead-input\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [value]=\"searchValue()\"\n (keyup)=\"handleSearchChange($event)\"\n (keydown)=\"handleKey($event)\"\n #input\n type=\"text\"\n />\n @if(loading()) {\n <fw-progress-spinner size=\"small\"/>\n }\n</div>\n<ng-template #menuContent>\n <fw-menu-container\n [maxHeight]=\"maxOptionsHeight()\"\n [minHeight]=\"minOptionsHeight()\"\n [width]=\"optionsWidth() || inputContainer.offsetWidth - 2 + 'px'\"\n >\n <fw-menu>\n @if(loading() && !displayNewOption()) {\n <fw-menu-item title=\"Searching...\" [disabled]=\"true\"/>\n } @else if(!loading()) {\n @for (option of
|
|
234
|
+
], viewQueries: [{ propertyName: "trigger", first: true, predicate: CdkMenuTrigger, descendants: true, isSignal: true }, { propertyName: "displayedOptions", predicate: FwMenuItemComponent, descendants: true, isSignal: true }, { propertyName: "inputRef", first: true, predicate: ["input"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n (click)=\"focusInput($event)\"\n class=\"input-container\"\n [ngClass]=\"{ 'disabled': disabled() }\"\n [cdkMenuTriggerFor]=\"menuContent\"\n fwMenuRegister\n #inputContainer>\n <fw-chip-list class=\"chips\">\n @for(val of value(); track val) {\n <fw-chip\n color=\"primary\"\n [showClose]=\"true\"\n [title]=\"val\"\n [selectable]=\"false\"\n (close)=\"closeChip(val)\"\n />\n }\n </fw-chip-list>\n <input\n test-id=\"typeahead-input\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [value]=\"searchValue()\"\n (keyup)=\"handleSearchChange($event)\"\n (keydown)=\"handleKey($event)\"\n (focusout)=\"onFocusLoss($event)\"\n #input\n type=\"text\"\n />\n @if(loading()) {\n <fw-progress-spinner size=\"small\"/>\n }\n</div>\n<ng-template #menuContent>\n <fw-menu-container\n [maxHeight]=\"maxOptionsHeight()\"\n [minHeight]=\"minOptionsHeight()\"\n [width]=\"optionsWidth() || inputContainer.offsetWidth - 2 + 'px'\"\n >\n <fw-menu>\n @if(loading() && !displayNewOption()) {\n <fw-menu-item title=\"Searching...\" [disabled]=\"true\"/>\n } @else if(!loading()) {\n @for (option of filteredOptions(); track option) {\n <fw-menu-item\n (click)=\"handleOptionClick($event)\"\n (mouseenter)=\"setFocusByValue(option)\"\n [title]=\"option\"\n [focused]=\"focusedOption() === option\"\n [value]=\"option\"\n />\n }\n @empty {\n @if (!displayNewOption()) {\n <fw-menu-item title=\"No tag suggestions\" [disabled]=\"true\"/>\n }\n }\n }\n @if(displayNewOption()) {\n <fw-menu-item\n (click)=\"handleOptionClick($event)\"\n (mouseenter)=\"setFocusByValue(searchValue())\"\n [title]=\"searchValue()\"\n [value]=\"searchValue()\"\n [focused]=\"focusedOption() === searchValue()\">\n <p class=\"new-tag\">New</p>\n </fw-menu-item>\n }\n </fw-menu>\n </fw-menu-container>\n</ng-template>\n", styles: [".new-tag{margin:0;color:var(--typography-light)}:host{display:flex;flex-direction:column;width:100%;line-height:21px}:host.disabled{cursor:not-allowed}:host.disabled fw-icon{cursor:not-allowed!important}:host .chips,:host fw-progress-spinner{margin:-4px 0}:host .input-container{width:100%;box-sizing:border-box;color:var(--typography-light);background:var(--page-light);display:flex;padding:8px;align-items:center;border-radius:6px;border:1px solid var(--separations-input);font-family:Inter,sans-serif}:host .input-container:focus-within{border:1px solid var(--primary-base)}:host .input-container input{min-width:80px;font-size:14px;flex:1 1 80px;color:var(--typography-base);background:var(--page-light);border:none}:host .input-container input:focus{outline:none;border:none}:host .input-container input::placeholder{color:var(--typography-light)}:host .input-container .context{color:var(--typography-light)}:host.errored .input-container,:host.ng-touched.ng-invalid .input-container{border:1px solid var(--red-base)}.disabled{opacity:.4;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: FwTextInputModule }, { kind: "ngmodule", type: FwChipModule }, { kind: "component", type: i1.FwChipComponent, selector: "fw-chip", inputs: ["value", "variant", "color", "icon", "title", "description", "showClose", "disabled", "selected", "textWrap", "selectable"], outputs: ["close", "select"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FwMenuModule }, { kind: "component", type: i2.FwMenuComponent, selector: "fw-menu", inputs: ["disabled", "size", "multiSelect", "useCheckbox", "value"], outputs: ["change"] }, { kind: "component", type: i3.FwMenuContainerComponent, selector: "fw-menu-container, fw-menu-filter", inputs: ["width", "maxHeight", "minHeight", "border", "shadow", "showFilter", "filterText", "focusFilterOnMount", "offset", "emptyText", "filterFn", "additionalMenuItems", "keyHandler"], outputs: ["filteredMenuItemChange", "filterChanged"] }, { kind: "component", type: i4.FwMenuItemComponent, selector: "fw-menu-item", inputs: ["value", "size", "title", "description", "icon", "iconColor", "disabled", "showCheckbox", "checkboxColor", "multiSelect", "hidden", "collapsed", "href", "target", "subItemsOpen", "mouseEnterHandler", "focused", "selected"], outputs: ["mouseEnterHandlerChange", "click"] }, { kind: "ngmodule", type: CdkMenuModule }, { kind: "directive", type: i5.CdkMenuTrigger, selector: "[cdkMenuTriggerFor]", inputs: ["cdkMenuTriggerFor", "cdkMenuPosition", "cdkMenuTriggerData"], outputs: ["cdkMenuOpened", "cdkMenuClosed"], exportAs: ["cdkMenuTriggerFor"] }, { kind: "directive", type: MenuRegisterDirective, selector: "[fwMenuRegister]" }, { kind: "ngmodule", type: FwProgressModule }, { kind: "component", type: i6.FwProgressSpinnerComponent, selector: "fw-progress-spinner", inputs: ["mode", "size", "color", "showValue", "value"] }, { kind: "component", type: FwChipListComponent, selector: "fw-chip-list", inputs: ["resizeDebounceMs"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
209
235
|
}
|
|
210
236
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FwTypeaheadComponent, decorators: [{
|
|
211
237
|
type: Component,
|
|
@@ -225,7 +251,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
225
251
|
useExisting: forwardRef(() => FwTypeaheadComponent),
|
|
226
252
|
multi: true,
|
|
227
253
|
},
|
|
228
|
-
], template: "<div\n (click)=\"focusInput($event)\"\n class=\"input-container\"\n [ngClass]=\"{ 'disabled': disabled() }\"\n [cdkMenuTriggerFor]=\"menuContent\"\n fwMenuRegister\n #inputContainer>\n <fw-chip-list class=\"chips\">\n @for(val of value(); track val) {\n <fw-chip\n color=\"primary\"\n [showClose]=\"true\"\n [title]=\"val\"\n [selectable]=\"false\"\n (close)=\"closeChip(val)\"\n />\n }\n </fw-chip-list>\n <input\n test-id=\"typeahead-input\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [value]=\"searchValue()\"\n (keyup)=\"handleSearchChange($event)\"\n (keydown)=\"handleKey($event)\"\n #input\n type=\"text\"\n />\n @if(loading()) {\n <fw-progress-spinner size=\"small\"/>\n }\n</div>\n<ng-template #menuContent>\n <fw-menu-container\n [maxHeight]=\"maxOptionsHeight()\"\n [minHeight]=\"minOptionsHeight()\"\n [width]=\"optionsWidth() || inputContainer.offsetWidth - 2 + 'px'\"\n >\n <fw-menu>\n @if(loading() && !displayNewOption()) {\n <fw-menu-item title=\"Searching...\" [disabled]=\"true\"/>\n } @else if(!loading()) {\n @for (option of
|
|
254
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n (click)=\"focusInput($event)\"\n class=\"input-container\"\n [ngClass]=\"{ 'disabled': disabled() }\"\n [cdkMenuTriggerFor]=\"menuContent\"\n fwMenuRegister\n #inputContainer>\n <fw-chip-list class=\"chips\">\n @for(val of value(); track val) {\n <fw-chip\n color=\"primary\"\n [showClose]=\"true\"\n [title]=\"val\"\n [selectable]=\"false\"\n (close)=\"closeChip(val)\"\n />\n }\n </fw-chip-list>\n <input\n test-id=\"typeahead-input\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [value]=\"searchValue()\"\n (keyup)=\"handleSearchChange($event)\"\n (keydown)=\"handleKey($event)\"\n (focusout)=\"onFocusLoss($event)\"\n #input\n type=\"text\"\n />\n @if(loading()) {\n <fw-progress-spinner size=\"small\"/>\n }\n</div>\n<ng-template #menuContent>\n <fw-menu-container\n [maxHeight]=\"maxOptionsHeight()\"\n [minHeight]=\"minOptionsHeight()\"\n [width]=\"optionsWidth() || inputContainer.offsetWidth - 2 + 'px'\"\n >\n <fw-menu>\n @if(loading() && !displayNewOption()) {\n <fw-menu-item title=\"Searching...\" [disabled]=\"true\"/>\n } @else if(!loading()) {\n @for (option of filteredOptions(); track option) {\n <fw-menu-item\n (click)=\"handleOptionClick($event)\"\n (mouseenter)=\"setFocusByValue(option)\"\n [title]=\"option\"\n [focused]=\"focusedOption() === option\"\n [value]=\"option\"\n />\n }\n @empty {\n @if (!displayNewOption()) {\n <fw-menu-item title=\"No tag suggestions\" [disabled]=\"true\"/>\n }\n }\n }\n @if(displayNewOption()) {\n <fw-menu-item\n (click)=\"handleOptionClick($event)\"\n (mouseenter)=\"setFocusByValue(searchValue())\"\n [title]=\"searchValue()\"\n [value]=\"searchValue()\"\n [focused]=\"focusedOption() === searchValue()\">\n <p class=\"new-tag\">New</p>\n </fw-menu-item>\n }\n </fw-menu>\n </fw-menu-container>\n</ng-template>\n", styles: [".new-tag{margin:0;color:var(--typography-light)}:host{display:flex;flex-direction:column;width:100%;line-height:21px}:host.disabled{cursor:not-allowed}:host.disabled fw-icon{cursor:not-allowed!important}:host .chips,:host fw-progress-spinner{margin:-4px 0}:host .input-container{width:100%;box-sizing:border-box;color:var(--typography-light);background:var(--page-light);display:flex;padding:8px;align-items:center;border-radius:6px;border:1px solid var(--separations-input);font-family:Inter,sans-serif}:host .input-container:focus-within{border:1px solid var(--primary-base)}:host .input-container input{min-width:80px;font-size:14px;flex:1 1 80px;color:var(--typography-base);background:var(--page-light);border:none}:host .input-container input:focus{outline:none;border:none}:host .input-container input::placeholder{color:var(--typography-light)}:host .input-container .context{color:var(--typography-light)}:host.errored .input-container,:host.ng-touched.ng-invalid .input-container{border:1px solid var(--red-base)}.disabled{opacity:.4;pointer-events:none}\n"] }]
|
|
229
255
|
}], propDecorators: { outsideClick: [{
|
|
230
256
|
type: HostListener,
|
|
231
257
|
args: ['document:click']
|
|
@@ -233,4 +259,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
233
259
|
type: HostListener,
|
|
234
260
|
args: ['click', ['$event']]
|
|
235
261
|
}] } });
|
|
236
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWFoZWFkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3R5cGVhaGVhZC90eXBlYWhlYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdHlwZWFoZWFkL3R5cGVhaGVhZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RSxPQUFP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WSwrM0JBQ1osYUFBYSxzUUFDYixxQkFBcUIsNERBQ3JCLGdCQUFnQixxTEFDaEIsbUJBQW1CLHlEQUNuQixPQUFPOzs0RkFZRSxvQkFBb0I7a0JBeEJoQyxTQUFTOytCQUNFLGNBQWMsY0FDWixJQUFJLFdBQ1A7d0JBQ1AsaUJBQWlCO3dCQUNqQixZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixhQUFhO3dCQUNiLHFCQUFxQjt3QkFDckIsZ0JBQWdCO3dCQUNoQixtQkFBbUI7d0JBQ25CLE9BQU87cUJBQ1IsYUFDVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQzs0QkFDbkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7OEJBSytCLFlBQVk7c0JBQTNDLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQWdDSyxPQUFPO3NCQUF6QyxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka01lbnVNb2R1bGUsIENka01lbnVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL21lbnUnO1xuaW1wb3J0IHsgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbiAgdmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBtYXAsIE9ic2VydmFibGUsIG9mLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE1lbnVSZWdpc3RlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvbWVudS1yZWdpc3Rlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRndDaGlwTW9kdWxlIH0gZnJvbSAnLi4vY2hpcC9jaGlwLm1vZHVsZSc7XG5pbXBvcnQgeyBGd0NoaXBMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vY2hpcC1saXN0L2NoaXAtbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRndNZW51TW9kdWxlIH0gZnJvbSAnLi4vbWVudS9tZW51Lm1vZHVsZSc7XG5pbXBvcnQgeyBGd01lbnVJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbWVudS9tZW51LWl0ZW0vbWVudS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGd1Byb2dyZXNzTW9kdWxlIH0gZnJvbSAnLi4vcHJvZ3Jlc3MvcHJvZ3Jlc3MubW9kdWxlJztcbmltcG9ydCB7IEZ3VGV4dElucHV0TW9kdWxlIH0gZnJvbSAnLi4vdGV4dC1pbnB1dC90ZXh0LWlucHV0Lm1vZHVsZSc7XG5cbnR5cGUgT3B0aW9uRmV0Y2hpbmdGbiA9IChzZWFyY2hTdHJpbmc6IHN0cmluZykgPT4gT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBoYXZpbmcgYSB1c2VyIHNlbGVjdCBtdWx0aXBsZSB2YWx1ZXMgd2hpbGUgYWxzbyBhbGxvd2luZyBhcmJpdHJhcnkgdmFsdWVzIHRvIGJlIGFkZGVkXG4gKiBAc2VlIFtWaXNpb24gRG9jc10oaHR0cHM6Ly9jZG4uZmx5d2hlZWwuaW8vZG9jcy92aXNpb24vbWFzdGVyLz9wYXRoPS9kb2NzL2Zvcm0tY29udHJvbHMtdHlwZWFoZWFkLS1kb2NzKVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmdy10eXBlYWhlYWQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRndUZXh0SW5wdXRNb2R1bGUsXG4gICAgRndDaGlwTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRndNZW51TW9kdWxlLFxuICAgIENka01lbnVNb2R1bGUsXG4gICAgTWVudVJlZ2lzdGVyRGlyZWN0aXZlLFxuICAgIEZ3UHJvZ3Jlc3NNb2R1bGUsXG4gICAgRndDaGlwTGlzdENvbXBvbmVudCxcbiAgICBOZ0NsYXNzLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZ3VHlwZWFoZWFkQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90eXBlYWhlYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdHlwZWFoZWFkLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgRndUeXBlYWhlYWRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJykgb3V0c2lkZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy50cmlnZ2VyKCkuY2xvc2UoKTtcbiAgfVxuXG4gIHRyaWdnZXIgPSB2aWV3Q2hpbGQoQ2RrTWVudVRyaWdnZXIpO1xuICBjaGFuZ2VEZXRlY3RvciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIGxvYWRpbmcgPSBtb2RlbChmYWxzZSk7XG4gIGRpc2FibGVkID0gbW9kZWwoZmFsc2UpO1xuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQuc2V0KGlzRGlzYWJsZWQpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZShpbmNvbWluZ1ZhbHVlOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUuc2V0KGluY29taW5nVmFsdWUpO1xuICB9XG5cbiAgb25DaGFuZ2UgPSAoXzogc3RyaW5nW10pOiB2b2lkID0+IHtcbiAgfTtcblxuICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlRm4pOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2VGbjtcbiAgfVxuXG4gIG9uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHtcbiAgfTtcblxuICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWRGbik6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkRm47XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgdmFsdWUgPSBtb2RlbDxzdHJpbmdbXT4oW10pO1xuICBvcHRpb25zSW5wdXQgPSBpbnB1dDxzdHJpbmdbXSB8IE9wdGlvbkZldGNoaW5nRm4+KFtdLCB7IGFsaWFzOiAnb3B0aW9ucycgfSk7XG5cbiAgbWF4T3B0aW9uc0hlaWdodCA9IGlucHV0KCc0MDBweCcpO1xuICBtaW5PcHRpb25zSGVpZ2h0ID0gaW5wdXQoJzBweCcpO1xuICBvcHRpb25zV2lkdGggPSBpbnB1dCgnJyk7XG5cbiAgbm90aWZ5T25WYWx1ZUNoYW5nZXMgPSBlZmZlY3QoKCkgPT4ge1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSgpKTtcbiAgfSk7XG5cbiAgc2VhcmNoVmFsdWUgPSBtb2RlbCgnJyk7XG4gIHNlYXJjaFZhbHVlQ2hhbmdlcyQgPSB0b09ic2VydmFibGUodGhpcy5zZWFyY2hWYWx1ZSk7XG5cbiAgaGFuZGxlU2VhcmNoQ2hhbmdlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHJpZ2dlcigpLmNsb3NlZCkge1xuICAgICAgdGhpcy50cmlnZ2VyKCkub3BlbigpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZS5zZXQodmFsdWUpO1xuICB9XG5cbiAgYWxsb3dOZXcgPSBpbnB1dCh0cnVlKTtcbiAgcGxhY2Vob2xkZXIgPSBpbnB1dCgnRW50ZXIgdGFncy4uLicpO1xuXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiA9IHRoaXMuc2VhcmNoVmFsdWVDaGFuZ2VzJC5waXBlKFxuICAgIHN0YXJ0V2l0aCgnJyksXG4gICAgdGFwKCgpID0+IHRoaXMubG9hZGluZy5zZXQodHJ1ZSkpLFxuICAgIHN3aXRjaE1hcChzZWFyY2hTdHJpbmcgPT4ge1xuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9uc0lucHV0KCkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgZmV0Y2hpbmdGdW5jdGlvbiA9IHRoaXMub3B0aW9uc0lucHV0KCkgYXMgT3B0aW9uRmV0Y2hpbmdGbjtcbiAgICAgICAgcmV0dXJuIGZldGNoaW5nRnVuY3Rpb24oc2VhcmNoU3RyaW5nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyZWRTdGF0aWNPcHRpb25zJCA9IG9mKHRoaXMub3B0aW9uc0lucHV0KCkgYXMgc3RyaW5nW10pLnBpcGUoXG4gICAgICAgIG1hcChvcHRpb25zID0+IG9wdGlvbnMuZmlsdGVyKG9wdCA9PiBvcHQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZFN0YXRpY09wdGlvbnMkO1xuICAgIH0pLFxuICAgIG1hcChvcHRpb25zID0+IHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZpbHRlcihvcHRpb24gPT4ge1xuICAgICAgICBjb25zdCBhbHJlYWR5U2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCkuZmluZCh2YWwgPT4gdmFsLnRvTG93ZXJDYXNlKCkgPT09IG9wdGlvbi50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgcmV0dXJuICFhbHJlYWR5U2VsZWN0ZWQ7XG4gICAgICB9KTtcbiAgICB9KSxcbiAgICB0YXAoKCkgPT4gdGhpcy5sb2FkaW5nLnNldChmYWxzZSkpLFxuICApO1xuICBvcHRpb25zU2lnbmFsID0gdG9TaWduYWwodGhpcy5vcHRpb25zJCk7XG5cblxuICBjbG9zZUNoaXAoY2hpcFZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBjdXJyZW50VmFsdWUuZmlsdGVyKHZhbCA9PiB2YWwgIT09IGNoaXBWYWx1ZSk7XG4gICAgdGhpcy52YWx1ZS5zZXQobmV3VmFsdWUpO1xuICAgIHRoaXMuZm9jdXNJbnB1dCgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAcngtYW5ndWxhci9uby1leHBsaWNpdC1jaGFuZ2UtZGV0ZWN0aW9uLWFwaXNcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGRpc3BsYXlOZXdPcHRpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLnNlYXJjaFZhbHVlKCk7XG5cbiAgICBpZiAoIW5ld1ZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGlyZWN0TWF0Y2ggPSB0aGlzLm9wdGlvbnNTaWduYWwoKT8uaW5jbHVkZXM/LihuZXdWYWx1ZSk7XG4gICAgY29uc3QgbG9hZGluZyA9IHRoaXMubG9hZGluZygpO1xuICAgIGNvbnN0IGFscmVhZHlTZWxlY3RlZCA9IEJvb2xlYW4odGhpcy52YWx1ZSgpLmZpbmQodmFsID0+IHZhbC50b0xvd2VyQ2FzZSgpID09PSBuZXdWYWx1ZS50b0xvd2VyQ2FzZSgpKSk7XG5cblxuICAgIHJldHVybiB0aGlzLmFsbG93TmV3KCkgJiYgIWFscmVhZHlTZWxlY3RlZCAmJiAoIWRpcmVjdE1hdGNoIHx8IGxvYWRpbmcpO1xuICB9KTtcblxuICBhZGRWYWx1ZSA9IChuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgdGhpcy52YWx1ZS51cGRhdGUocHJldlZhbHVlID0+IFtcbiAgICAgIC4uLnByZXZWYWx1ZSB8fCBbXSxcbiAgICAgIG5ld1ZhbHVlLFxuICAgIF0pO1xuICB9O1xuXG4gIGhhbmRsZU9wdGlvbkNsaWNrID0gKG9wdGlvblZhbHVlKTogdm9pZCA9PiB7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzLmFkZFZhbHVlKG9wdGlvblZhbHVlKTtcbiAgICB0aGlzLmZvY3VzSW5wdXQoKTtcbiAgICB0aGlzLnNlYXJjaFZhbHVlLnNldCgnJyk7XG4gIH07XG5cbiAgcmVzZXRGb2N1c09uT3B0aW9uc0NoYW5nZSA9IGVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRoaXMuZGlzcGxheWVkT3B0aW9ucygpIHx8IHRoaXMuc2VhcmNoVmFsdWUoKSkge1xuICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KDApO1xuICAgIH1cbiAgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcblxuICBkaXNwbGF5ZWRPcHRpb25zID0gdmlld0NoaWxkcmVuKEZ3TWVudUl0ZW1Db21wb25lbnQpO1xuICBmb2N1c2VkSW5kZXggPSBzaWduYWwoMCk7XG4gIGZvY3VzZWRPcHRpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZGlzcGxheWVkT3B0aW9ucygpO1xuICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuXG4gICAgY29uc3Qgb25seU9uZSA9IG9wdGlvbnMubGVuZ3RoID09PSAxO1xuICAgIHJldHVybiBvbmx5T25lID8gdGhpcy5zZWFyY2hWYWx1ZSgpIDogb3B0aW9uc1tmb2N1c2VkXT8udmFsdWU7XG4gIH0pO1xuXG4gIGlucHV0UmVmID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdpbnB1dCcpO1xuXG4gIGZvY3VzSW5wdXQoZTogTW91c2VFdmVudCA9IG51bGwpOiB2b2lkIHtcbiAgICBlPy5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGU/LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAcngtYW5ndWxhci9wcmVmZXItbm8tbGF5b3V0LXNlbnNpdGl2ZS1hcGlzXG4gICAgdGhpcy5pbnB1dFJlZigpLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuICBrZXlIYW5kbGVyTWFwOiB7IFtrZXljb2RlOiBzdHJpbmddOiAoZTogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZCB9ID0ge1xuICAgICdFbnRlcic6ICgpID0+IHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuZm9jdXNlZE9wdGlvbigpIHx8IHRoaXMuc2VhcmNoVmFsdWUoKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHRoaXMudmFsdWUoKS5maW5kKHZhbCA9PiB2YWwudG9Mb3dlckNhc2UoKSA9PT0gbmV3VmFsdWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgIGlmICghbmV3VmFsdWUgfHwgZHVwbGljYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hZGRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlLnNldCgnJyk7XG4gICAgfSxcbiAgICAnQXJyb3dEb3duJzogKCkgPT4ge1xuICAgICAgdGhpcy5tb3ZlRm9jdXNlZCgnZG93bicpO1xuICAgIH0sXG4gICAgJ0Fycm93VXAnOiAoKSA9PiB7XG4gICAgICB0aGlzLm1vdmVGb2N1c2VkKCd1cCcpO1xuICAgIH0sXG4gICAgJ0JhY2tzcGFjZSc6ICgpID0+IHtcbiAgICAgIGNvbnN0IHNlYXJjaElzRW1wdHkgPSAhdGhpcy5zZWFyY2hWYWx1ZSgpOyAvLyBhbnkgZmFsc3kgdmFsdWUgaXMgZW1wdHlcbiAgICAgIGlmIChzZWFyY2hJc0VtcHR5ICYmIHRoaXMudmFsdWUoKT8ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNsb3NlQ2hpcCh0aGlzLnZhbHVlKClbdGhpcy52YWx1ZSgpLmxlbmd0aCAtIDFdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhc2VhcmNoSXNFbXB0eTtcbiAgICB9LFxuICAgICdUYWInOiAoKSA9PiB7XG4gICAgICBpZiAodGhpcy50cmlnZ2VyKCkuaXNPcGVuKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlcigpLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICAvKiBlc2xpbnQtZW5hYmxlICovXG5cbiAgaGFuZGxlS2V5KGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5rZXlIYW5kbGVyTWFwW2Uua2V5XTtcbiAgICBoYW5kbGVyPy4oZSk7XG4gIH1cblxuICBzZXRGb2N1c0J5VmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmRpc3BsYXllZE9wdGlvbnMoKTtcbiAgICBjb25zdCBmb3VuZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0ID0+IG9wdC52YWx1ZSA9PT0gdmFsdWUpO1xuICAgIGNvbnN0IGZpbmFsSW5kZXggPSBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBmb3VuZEluZGV4O1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChmaW5hbEluZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgbW92ZUZvY3VzZWQoZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZGlzcGxheWVkT3B0aW9ucygpO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKTtcblxuICAgIGNvbnN0IGNsYW1wSW5kZXggPSAobjogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgIGlmIChuIDwgMCkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5sZW5ndGggLSAxO1xuICAgICAgfSBlbHNlIGlmIChuID49IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbjtcbiAgICB9O1xuXG4gICAgY29uc3QgaW5kZXhDaGFuZ2UgPSBkaXJlY3Rpb24gPT09ICd1cCcgPyAtMSA6IDE7XG5cbiAgICBjb25zdCBuZXdJbmRleCA9IGNsYW1wSW5kZXgoaW5kZXggKyBpbmRleENoYW5nZSk7XG4gICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5ld0luZGV4KTtcblxuICAgIGNvbnN0IG5ld2x5Rm9jdXNlZCA9IHRoaXMuZGlzcGxheWVkT3B0aW9ucygpW3RoaXMuZm9jdXNlZEluZGV4KCldO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEByeC1hbmd1bGFyL3ByZWZlci1uby1sYXlvdXQtc2Vuc2l0aXZlLWFwaXNcbiAgICBuZXdseUZvY3VzZWQuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgfVxuXG59XG4iLCI8ZGl2XG4gIChjbGljayk9XCJmb2N1c0lucHV0KCRldmVudClcIlxuICBjbGFzcz1cImlucHV0LWNvbnRhaW5lclwiXG4gIFtuZ0NsYXNzXT1cInsgJ2Rpc2FibGVkJzogZGlzYWJsZWQoKSB9XCJcbiAgW2Nka01lbnVUcmlnZ2VyRm9yXT1cIm1lbnVDb250ZW50XCJcbiAgZndNZW51UmVnaXN0ZXJcbiAgI2lucHV0Q29udGFpbmVyPlxuICA8ZnctY2hpcC1saXN0IGNsYXNzPVwiY2hpcHNcIj5cbiAgICBAZm9yKHZhbCBvZiB2YWx1ZSgpOyB0cmFjayB2YWwpIHtcbiAgICAgIDxmdy1jaGlwXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgIFtzaG93Q2xvc2VdPVwidHJ1ZVwiXG4gICAgICAgIFt0aXRsZV09XCJ2YWxcIlxuICAgICAgICBbc2VsZWN0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgIChjbG9zZSk9XCJjbG9zZUNoaXAodmFsKVwiXG4gICAgICAvPlxuICAgIH1cbiAgPC9mdy1jaGlwLWxpc3Q+XG4gIDxpbnB1dFxuICAgIHRlc3QtaWQ9XCJ0eXBlYWhlYWQtaW5wdXRcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlcigpXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgW3ZhbHVlXT1cInNlYXJjaFZhbHVlKClcIlxuICAgIChrZXl1cCk9XCJoYW5kbGVTZWFyY2hDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGtleWRvd24pPVwiaGFuZGxlS2V5KCRldmVudClcIlxuICAgICNpbnB1dFxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgLz5cbiAgQGlmKGxvYWRpbmcoKSkge1xuICAgIDxmdy1wcm9ncmVzcy1zcGlubmVyIHNpemU9XCJzbWFsbFwiLz5cbiAgfVxuPC9kaXY+XG48bmctdGVtcGxhdGUgI21lbnVDb250ZW50PlxuICAgIDxmdy1tZW51LWNvbnRhaW5lclxuICAgICAgW21heEhlaWdodF09XCJtYXhPcHRpb25zSGVpZ2h0KClcIlxuICAgICAgW21pbkhlaWdodF09XCJtaW5PcHRpb25zSGVpZ2h0KClcIlxuICAgICAgW3dpZHRoXT1cIm9wdGlvbnNXaWR0aCgpIHx8IGlucHV0Q29udGFpbmVyLm9mZnNldFdpZHRoIC0gMiArICdweCdcIlxuICAgID5cbiAgICAgIDxmdy1tZW51PlxuICAgICAgICBAaWYobG9hZGluZygpICYmICFkaXNwbGF5TmV3T3B0aW9uKCkpIHtcbiAgICAgICAgICA8ZnctbWVudS1pdGVtIHRpdGxlPVwiU2VhcmNoaW5nLi4uXCIgW2Rpc2FibGVkXT1cInRydWVcIi8+XG4gICAgICAgIH0gQGVsc2UgaWYoIWxvYWRpbmcoKSkge1xuICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBvcHRpb25zU2lnbmFsKCk7IHRyYWNrIG9wdGlvbikge1xuICAgICAgICAgICAgPGZ3LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlT3B0aW9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNldEZvY3VzQnlWYWx1ZShvcHRpb24pXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgIFtmb2N1c2VkXT1cImZvY3VzZWRPcHRpb24oKSA9PT0gb3B0aW9uXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZW1wdHkge1xuICAgICAgICAgICAgQGlmICghZGlzcGxheU5ld09wdGlvbigpKSB7XG4gICAgICAgICAgICAgIDxmdy1tZW51LWl0ZW0gdGl0bGU9XCJObyB0YWcgc3VnZ2VzdGlvbnNcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgQGlmKGRpc3BsYXlOZXdPcHRpb24oKSkge1xuICAgICAgICAgIDxmdy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVPcHRpb25DbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNldEZvY3VzQnlWYWx1ZShzZWFyY2hWYWx1ZSgpKVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwic2VhcmNoVmFsdWUoKVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwic2VhcmNoVmFsdWUoKVwiXG4gICAgICAgICAgICBbZm9jdXNlZF09XCJmb2N1c2VkT3B0aW9uKCkgPT09IHNlYXJjaFZhbHVlKClcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibmV3LXRhZ1wiPk5ldzwvcD5cbiAgICAgICAgICA8L2Z3LW1lbnUtaXRlbT5cbiAgICAgICAgfVxuICAgICAgPC9mdy1tZW51PlxuICAgIDwvZnctbWVudS1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
262
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWFoZWFkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3R5cGVhaGVhZC90eXBlYWhlYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdHlwZWFoZWFkL3R5cGVhaGVhZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFFTixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlGLE9BQU8sRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENB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OzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTTs4QkFHZixZQUFZO3NCQUEzQyxZQUFZO3VCQUFDLGdCQUFnQjtnQkErQkssT0FBTztzQkFBekMsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtNZW51TW9kdWxlLCBDZGtNZW51VHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9tZW51JztcbmltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgbW9kZWwsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxuICB2aWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE1lbnVSZWdpc3RlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvbWVudS1yZWdpc3Rlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRndDaGlwTW9kdWxlIH0gZnJvbSAnLi4vY2hpcC9jaGlwLm1vZHVsZSc7XG5pbXBvcnQgeyBGd0NoaXBMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vY2hpcC1saXN0L2NoaXAtbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRndNZW51TW9kdWxlIH0gZnJvbSAnLi4vbWVudS9tZW51Lm1vZHVsZSc7XG5pbXBvcnQgeyBGd01lbnVJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbWVudS9tZW51LWl0ZW0vbWVudS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGd1Byb2dyZXNzTW9kdWxlIH0gZnJvbSAnLi4vcHJvZ3Jlc3MvcHJvZ3Jlc3MubW9kdWxlJztcbmltcG9ydCB7IEZ3VGV4dElucHV0TW9kdWxlIH0gZnJvbSAnLi4vdGV4dC1pbnB1dC90ZXh0LWlucHV0Lm1vZHVsZSc7XG5cbnR5cGUgT3B0aW9uRmV0Y2hpbmdGbiA9IChzZWFyY2hTdHJpbmc6IHN0cmluZykgPT4gT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBoYXZpbmcgYSB1c2VyIHNlbGVjdCBtdWx0aXBsZSB2YWx1ZXMgd2hpbGUgYWxzbyBhbGxvd2luZyBhcmJpdHJhcnkgdmFsdWVzIHRvIGJlIGFkZGVkXG4gKiBAc2VlIFtWaXNpb24gRG9jc10oaHR0cHM6Ly9jZG4uZmx5d2hlZWwuaW8vZG9jcy92aXNpb24vbWFzdGVyLz9wYXRoPS9kb2NzL2Zvcm0tY29udHJvbHMtdHlwZWFoZWFkLS1kb2NzKVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmdy10eXBlYWhlYWQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRndUZXh0SW5wdXRNb2R1bGUsXG4gICAgRndDaGlwTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRndNZW51TW9kdWxlLFxuICAgIENka01lbnVNb2R1bGUsXG4gICAgTWVudVJlZ2lzdGVyRGlyZWN0aXZlLFxuICAgIEZ3UHJvZ3Jlc3NNb2R1bGUsXG4gICAgRndDaGlwTGlzdENvbXBvbmVudCxcbiAgICBOZ0NsYXNzLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZ3VHlwZWFoZWFkQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90eXBlYWhlYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdHlwZWFoZWFkLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEZ3VHlwZWFoZWFkQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpIG91dHNpZGVDbGljaygpOiB2b2lkIHtcbiAgICAgIHRoaXMudHJpZ2dlcigpLmNsb3NlKCk7XG4gIH1cblxuICB0cmlnZ2VyID0gdmlld0NoaWxkKENka01lbnVUcmlnZ2VyKTtcbiAgY2hhbmdlRGV0ZWN0b3IgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBsb2FkaW5nID0gbW9kZWwoZmFsc2UpO1xuICBkaXNhYmxlZCA9IG1vZGVsKGZhbHNlKTtcblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkLnNldChpc0Rpc2FibGVkKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUoaW5jb21pbmdWYWx1ZTogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlLnNldChpbmNvbWluZ1ZhbHVlKTtcbiAgfVxuXG4gIG9uQ2hhbmdlID0gKF86IHN0cmluZ1tdKTogdm9pZCA9PiB7XG4gIH07XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZUZuKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlRm47XG4gIH1cblxuICBvblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7XG4gIH07XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkRm4pOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IG9uVG91Y2hlZEZuO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKSBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHZhbHVlID0gbW9kZWw8c3RyaW5nW10+KFtdKTtcbiAgdmFsdWUkID0gdG9PYnNlcnZhYmxlKHRoaXMudmFsdWUpO1xuICBvcHRpb25zSW5wdXQgPSBpbnB1dDxzdHJpbmdbXSB8IE9wdGlvbkZldGNoaW5nRm4+KFtdLCB7IGFsaWFzOiAnb3B0aW9ucycgfSk7XG4gIG9wdGlvbnNJbnB1dCQgPSB0b09ic2VydmFibGUodGhpcy5vcHRpb25zSW5wdXQpO1xuXG4gIG1heE9wdGlvbnNIZWlnaHQgPSBpbnB1dCgnNDAwcHgnKTtcbiAgbWluT3B0aW9uc0hlaWdodCA9IGlucHV0KCcwcHgnKTtcbiAgb3B0aW9uc1dpZHRoID0gaW5wdXQoJycpO1xuXG4gIG5vdGlmeU9uVmFsdWVDaGFuZ2VzID0gZWZmZWN0KCgpID0+IHtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUoKSk7XG4gIH0pO1xuXG4gIHNlYXJjaFZhbHVlID0gbW9kZWwoJycpO1xuICBzZWFyY2hWYWx1ZUNoYW5nZXMkID0gdG9PYnNlcnZhYmxlKHRoaXMuc2VhcmNoVmFsdWUpO1xuXG4gIGhhbmRsZVNlYXJjaENoYW5nZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRyaWdnZXIoKS5jbG9zZWQpIHtcbiAgICAgIHRoaXMudHJpZ2dlcigpLm9wZW4oKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMuc2VhcmNoVmFsdWUuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIGFsbG93TmV3ID0gaW5wdXQodHJ1ZSk7XG4gIHBsYWNlaG9sZGVyID0gaW5wdXQoJ0VudGVyIHRhZ3MuLi4nKTtcblxuICAvKipcbiAgICogT3B0aW9ucyBhZnRlciB0aGV5J3ZlIGJlZW4gYm90aCBmaWx0ZXJlZCBmb3IgbWF0Y2hpbmcgdGhlIHNlYXJjaCBhbmQgYWxyZWFkeSBzZWxlY3RlZFxuICAgKi9cbiAgZmlsdGVyZWRPcHRpb25zJDogT2JzZXJ2YWJsZTxzdHJpbmdbXT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLnNlYXJjaFZhbHVlQ2hhbmdlcyQsXG4gICAgdGhpcy5vcHRpb25zSW5wdXQkLFxuICBdKS5waXBlKFxuICAgIHRhcCgoKSA9PiB0aGlzLmxvYWRpbmcuc2V0KHRydWUpKSxcblxuICAgIC8vIGZpcnN0IGRldGVybWluZSBpZiBpdCdzIGEgZnVuY3Rpb24gb3Igc3RhdGljIG9wdGlvbnNcbiAgICBzd2l0Y2hNYXAoKFtzZWFyY2hTdHJpbmcsIG9wdGlvbklucHV0XSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25JbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBmZXRjaGluZ0Z1bmN0aW9uID0gb3B0aW9uSW5wdXQgYXMgT3B0aW9uRmV0Y2hpbmdGbjtcbiAgICAgICAgcmV0dXJuIGZldGNoaW5nRnVuY3Rpb24oc2VhcmNoU3RyaW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZXkncmUgc3RhdGljIG9wdGlvbnMgd2UgbmVlZCB0byBkbyB0aGUgc2VhcmNoIGZpbHRlcmluZ1xuICAgICAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbklucHV0ID0gb3B0aW9uSW5wdXQ/LmZpbHRlcihvcHQgPT4gb3B0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgICAgcmV0dXJuIG9mKGZpbHRlcmVkT3B0aW9uSW5wdXQpO1xuICAgICAgfVxuXG4gICAgfSksXG5cbiAgICAvLyBuZXh0IGZpbHRlciBvdXQgYWxyZWFkeSBzZWxlY3RlZCB2YWx1ZXNcbiAgICBzd2l0Y2hNYXAob3B0aW9ucyA9PiBjb21iaW5lTGF0ZXN0KFtvZihvcHRpb25zKSwgdGhpcy52YWx1ZSRdKSksXG4gICAgbWFwKChbb3B0aW9ucywgY3VycmVudFZhbHVlXSkgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbnM/LmZpbHRlcihvcHRpb24gPT4ge1xuICAgICAgICBjb25zdCBhbHJlYWR5U2VsZWN0ZWQgPSBjdXJyZW50VmFsdWUuZmluZCh2YWwgPT4gdmFsLnRvTG93ZXJDYXNlKCkgPT09IG9wdGlvbi50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgcmV0dXJuICFhbHJlYWR5U2VsZWN0ZWQ7XG4gICAgICB9KTtcbiAgICB9KSxcblxuICAgIHRhcCgoKSA9PiB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKSksXG4gICk7XG4gIC8qKlxuICAgKiBPcHRpb25zIGFmdGVyIHRoZXkndmUgYmVlbiBib3RoIGZpbHRlcmVkIGZvciBtYXRjaGluZyB0aGUgc2VhcmNoIGFuZCBhbHJlYWR5IHNlbGVjdGVkXG4gICAqL1xuICBmaWx0ZXJlZE9wdGlvbnMgPSB0b1NpZ25hbCh0aGlzLmZpbHRlcmVkT3B0aW9ucyQpO1xuXG5cbiAgY2xvc2VDaGlwKGNoaXBWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gY3VycmVudFZhbHVlLmZpbHRlcih2YWwgPT4gdmFsICE9PSBjaGlwVmFsdWUpO1xuICAgIHRoaXMudmFsdWUuc2V0KG5ld1ZhbHVlKTtcbiAgICB0aGlzLmZvY3VzSW5wdXQoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHJ4LWFuZ3VsYXIvbm8tZXhwbGljaXQtY2hhbmdlLWRldGVjdGlvbi1hcGlzXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBkaXNwbGF5TmV3T3B0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5zZWFyY2hWYWx1ZSgpO1xuXG4gICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdE1hdGNoID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKT8uaW5jbHVkZXM/LihuZXdWYWx1ZSk7XG4gICAgY29uc3QgbG9hZGluZyA9IHRoaXMubG9hZGluZygpO1xuICAgIGNvbnN0IGFscmVhZHlTZWxlY3RlZCA9IEJvb2xlYW4odGhpcy52YWx1ZSgpLmZpbmQodmFsID0+IHZhbC50b0xvd2VyQ2FzZSgpID09PSBuZXdWYWx1ZS50b0xvd2VyQ2FzZSgpKSk7XG5cblxuICAgIHJldHVybiB0aGlzLmFsbG93TmV3KCkgJiYgIWFscmVhZHlTZWxlY3RlZCAmJiAoIWRpcmVjdE1hdGNoIHx8IGxvYWRpbmcpO1xuICB9KTtcblxuICBhZGRWYWx1ZSA9IChuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCA9PiB7XG5cbiAgICBjb25zdCBpc0luT3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuaW5jbHVkZXMobmV3VmFsdWUpO1xuICAgIGNvbnN0IGlzTmV3V2hpbGVEaXNhbGxvd2VkID0gIXRoaXMuYWxsb3dOZXcoKSAmJiAhaXNJbk9wdGlvbnM7XG5cbiAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IHRoaXMudmFsdWUoKS5pbmNsdWRlcyhuZXdWYWx1ZS50b0xvd2VyQ2FzZSgpKTtcblxuICAgIGlmIChpc05ld1doaWxlRGlzYWxsb3dlZCB8fCBpc0R1cGxpY2F0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUudXBkYXRlKHByZXZWYWx1ZSA9PiBbXG4gICAgICAuLi5wcmV2VmFsdWUgfHwgW10sXG4gICAgICBuZXdWYWx1ZSxcbiAgICBdKTtcbiAgfTtcblxuICBoYW5kbGVPcHRpb25DbGljayA9IChvcHRpb25WYWx1ZSk6IHZvaWQgPT4ge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5hZGRWYWx1ZShvcHRpb25WYWx1ZSk7XG4gICAgdGhpcy5mb2N1c0lucHV0KCk7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZS5zZXQoJycpO1xuICB9O1xuXG4gIHJlc2V0Rm9jdXNPbk9wdGlvbnNDaGFuZ2UgPSBlZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0aGlzLmRpc3BsYXllZE9wdGlvbnMoKSB8fCB0aGlzLnNlYXJjaFZhbHVlKCkpIHtcbiAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgwKTtcbiAgICB9XG4gIH0sIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XG5cbiAgZGlzcGxheWVkT3B0aW9ucyA9IHZpZXdDaGlsZHJlbihGd01lbnVJdGVtQ29tcG9uZW50KTtcbiAgZm9jdXNlZEluZGV4ID0gc2lnbmFsKDApO1xuICBmb2N1c2VkT3B0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmRpc3BsYXllZE9wdGlvbnMoKTtcbiAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkSW5kZXgoKTtcblxuICAgIGNvbnN0IG9ubHlPbmUgPSBvcHRpb25zLmxlbmd0aCA9PT0gMTtcbiAgICByZXR1cm4gb25seU9uZSA/IHRoaXMuc2VhcmNoVmFsdWUoKSA6IG9wdGlvbnNbZm9jdXNlZF0/LnZhbHVlO1xuICB9KTtcblxuICBpbnB1dFJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+PignaW5wdXQnKTtcblxuICBmb2N1c0lucHV0KGU6IE1vdXNlRXZlbnQgPSBudWxsKTogdm9pZCB7XG4gICAgZT8ucHJldmVudERlZmF1bHQoKTtcbiAgICBlPy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlPy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHJ4LWFuZ3VsYXIvcHJlZmVyLW5vLWxheW91dC1zZW5zaXRpdmUtYXBpc1xuICAgIHRoaXMuaW5wdXRSZWYoKS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBvbkZvY3VzTG9zcyhfOiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cbiAga2V5SGFuZGxlck1hcDogeyBba2V5Y29kZTogc3RyaW5nXTogKGU6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQgfSA9IHtcbiAgICAnRW50ZXInOiAoKSA9PiB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmZvY3VzZWRPcHRpb24oKSB8fCB0aGlzLnNlYXJjaFZhbHVlKCk7XG4gICAgICBjb25zdCBkdXBsaWNhdGUgPSB0aGlzLnZhbHVlKCkuZmluZCh2YWwgPT4gdmFsLnRvTG93ZXJDYXNlKCkgPT09IG5ld1ZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICBpZiAoIW5ld1ZhbHVlIHx8IGR1cGxpY2F0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkVmFsdWUobmV3VmFsdWUpO1xuICAgICAgdGhpcy5zZWFyY2hWYWx1ZS5zZXQoJycpO1xuICAgIH0sXG4gICAgJ0Fycm93RG93bic6ICgpID0+IHtcbiAgICAgIHRoaXMubW92ZUZvY3VzZWQoJ2Rvd24nKTtcbiAgICB9LFxuICAgICdBcnJvd1VwJzogKCkgPT4ge1xuICAgICAgdGhpcy5tb3ZlRm9jdXNlZCgndXAnKTtcbiAgICB9LFxuICAgICdCYWNrc3BhY2UnOiAoKSA9PiB7XG4gICAgICBjb25zdCBzZWFyY2hJc0VtcHR5ID0gIXRoaXMuc2VhcmNoVmFsdWUoKTsgLy8gYW55IGZhbHN5IHZhbHVlIGlzIGVtcHR5XG4gICAgICBpZiAoc2VhcmNoSXNFbXB0eSAmJiB0aGlzLnZhbHVlKCk/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jbG9zZUNoaXAodGhpcy52YWx1ZSgpW3RoaXMudmFsdWUoKS5sZW5ndGggLSAxXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gIXNlYXJjaElzRW1wdHk7XG4gICAgfSxcbiAgICAnVGFiJzogKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudHJpZ2dlcigpLmlzT3Blbikge1xuICAgICAgICB0aGlzLnRyaWdnZXIoKS5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgLyogZXNsaW50LWVuYWJsZSAqL1xuXG4gIGhhbmRsZUtleShlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMua2V5SGFuZGxlck1hcFtlLmtleV07XG4gICAgaGFuZGxlcj8uKGUpO1xuICB9XG5cbiAgc2V0Rm9jdXNCeVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kaXNwbGF5ZWRPcHRpb25zKCk7XG4gICAgY29uc3QgZm91bmRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdCA9PiBvcHQudmFsdWUgPT09IHZhbHVlKTtcbiAgICBjb25zdCBmaW5hbEluZGV4ID0gZm91bmRJbmRleCA9PT0gLTEgPyAwIDogZm91bmRJbmRleDtcbiAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoZmluYWxJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIG1vdmVGb2N1c2VkKGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmRpc3BsYXllZE9wdGlvbnMoKTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG5cbiAgICBjb25zdCBjbGFtcEluZGV4ID0gKG46IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICBpZiAobiA8IDApIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgIH0gZWxzZSBpZiAobiA+PSBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG47XG4gICAgfTtcblxuICAgIGNvbnN0IGluZGV4Q2hhbmdlID0gZGlyZWN0aW9uID09PSAndXAnID8gLTEgOiAxO1xuXG4gICAgY29uc3QgbmV3SW5kZXggPSBjbGFtcEluZGV4KGluZGV4ICsgaW5kZXhDaGFuZ2UpO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChuZXdJbmRleCk7XG5cbiAgICBjb25zdCBuZXdseUZvY3VzZWQgPSB0aGlzLmRpc3BsYXllZE9wdGlvbnMoKVt0aGlzLmZvY3VzZWRJbmRleCgpXTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAcngtYW5ndWxhci9wcmVmZXItbm8tbGF5b3V0LXNlbnNpdGl2ZS1hcGlzXG4gICAgbmV3bHlGb2N1c2VkLnNjcm9sbEludG9WaWV3KCk7XG4gIH1cblxufVxuIiwiPGRpdlxuICAoY2xpY2spPVwiZm9jdXNJbnB1dCgkZXZlbnQpXCJcbiAgY2xhc3M9XCJpbnB1dC1jb250YWluZXJcIlxuICBbbmdDbGFzc109XCJ7ICdkaXNhYmxlZCc6IGRpc2FibGVkKCkgfVwiXG4gIFtjZGtNZW51VHJpZ2dlckZvcl09XCJtZW51Q29udGVudFwiXG4gIGZ3TWVudVJlZ2lzdGVyXG4gICNpbnB1dENvbnRhaW5lcj5cbiAgPGZ3LWNoaXAtbGlzdCBjbGFzcz1cImNoaXBzXCI+XG4gICAgQGZvcih2YWwgb2YgdmFsdWUoKTsgdHJhY2sgdmFsKSB7XG4gICAgICA8ZnctY2hpcFxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBbc2hvd0Nsb3NlXT1cInRydWVcIlxuICAgICAgICBbdGl0bGVdPVwidmFsXCJcbiAgICAgICAgW3NlbGVjdGFibGVdPVwiZmFsc2VcIlxuICAgICAgICAoY2xvc2UpPVwiY2xvc2VDaGlwKHZhbClcIlxuICAgICAgLz5cbiAgICB9XG4gIDwvZnctY2hpcC1saXN0PlxuICA8aW5wdXRcbiAgICB0ZXN0LWlkPVwidHlwZWFoZWFkLWlucHV0XCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIoKVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZSgpXCJcbiAgICAoa2V5dXApPVwiaGFuZGxlU2VhcmNoQ2hhbmdlKCRldmVudClcIlxuICAgIChrZXlkb3duKT1cImhhbmRsZUtleSgkZXZlbnQpXCJcbiAgICAoZm9jdXNvdXQpPVwib25Gb2N1c0xvc3MoJGV2ZW50KVwiXG4gICAgI2lucHV0XG4gICAgdHlwZT1cInRleHRcIlxuICAvPlxuICBAaWYobG9hZGluZygpKSB7XG4gICAgPGZ3LXByb2dyZXNzLXNwaW5uZXIgc2l6ZT1cInNtYWxsXCIvPlxuICB9XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjbWVudUNvbnRlbnQ+XG4gICAgPGZ3LW1lbnUtY29udGFpbmVyXG4gICAgICBbbWF4SGVpZ2h0XT1cIm1heE9wdGlvbnNIZWlnaHQoKVwiXG4gICAgICBbbWluSGVpZ2h0XT1cIm1pbk9wdGlvbnNIZWlnaHQoKVwiXG4gICAgICBbd2lkdGhdPVwib3B0aW9uc1dpZHRoKCkgfHwgaW5wdXRDb250YWluZXIub2Zmc2V0V2lkdGggLSAyICsgJ3B4J1wiXG4gICAgPlxuICAgICAgPGZ3LW1lbnU+XG4gICAgICAgIEBpZihsb2FkaW5nKCkgJiYgIWRpc3BsYXlOZXdPcHRpb24oKSkge1xuICAgICAgICAgIDxmdy1tZW51LWl0ZW0gdGl0bGU9XCJTZWFyY2hpbmcuLi5cIiBbZGlzYWJsZWRdPVwidHJ1ZVwiLz5cbiAgICAgICAgfSBAZWxzZSBpZighbG9hZGluZygpKSB7XG4gICAgICAgICAgQGZvciAob3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFjayBvcHRpb24pIHtcbiAgICAgICAgICAgIDxmdy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZU9wdGlvbkNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRGb2N1c0J5VmFsdWUob3B0aW9uKVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJvcHRpb25cIlxuICAgICAgICAgICAgICBbZm9jdXNlZF09XCJmb2N1c2VkT3B0aW9uKCkgPT09IG9wdGlvblwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGVtcHR5IHtcbiAgICAgICAgICAgIEBpZiAoIWRpc3BsYXlOZXdPcHRpb24oKSkge1xuICAgICAgICAgICAgICA8ZnctbWVudS1pdGVtIHRpdGxlPVwiTm8gdGFnIHN1Z2dlc3Rpb25zXCIgW2Rpc2FibGVkXT1cInRydWVcIi8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIEBpZihkaXNwbGF5TmV3T3B0aW9uKCkpIHtcbiAgICAgICAgICA8ZnctbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlT3B0aW9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRGb2N1c0J5VmFsdWUoc2VhcmNoVmFsdWUoKSlcIlxuICAgICAgICAgICAgW3RpdGxlXT1cInNlYXJjaFZhbHVlKClcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFZhbHVlKClcIlxuICAgICAgICAgICAgW2ZvY3VzZWRdPVwiZm9jdXNlZE9wdGlvbigpID09PSBzZWFyY2hWYWx1ZSgpXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm5ldy10YWdcIj5OZXc8L3A+XG4gICAgICAgICAgPC9mdy1tZW51LWl0ZW0+XG4gICAgICAgIH1cbiAgICAgIDwvZnctbWVudT5cbiAgICA8L2Z3LW1lbnUtY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|