@sumaris-net/ngx-components 1.6.3 → 1.6.7
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/bundles/sumaris-net.ngx-components.umd.js +241 -146
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/doc/changelog.md +10 -1
- package/esm2015/src/app/shared/form/field.component.js +2 -2
- package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +72 -44
- package/esm2015/src/app/shared/material/autocomplete/testing/autocomplete.test.js +6 -6
- package/esm2015/src/app/shared/material/chips/material.chips.js +72 -51
- package/esm2015/src/app/shared/material/chips/testing/chips.test.js +49 -16
- package/esm2015/src/app/shared/material/datetime/material.date.js +2 -2
- package/esm2015/src/app/shared/material/datetime/material.dateshort.js +2 -2
- package/esm2015/src/app/shared/material/datetime/material.datetime.js +4 -4
- package/esm2015/src/app/shared/material/duration/material.duration.js +2 -2
- package/fesm2015/sumaris-net.ngx-components.js +229 -148
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +1 -1
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +4 -3
- package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +4 -5
- package/src/app/shared/material/chips/material.chips.d.ts +9 -5
- package/src/app/shared/material/chips/testing/chips.test.d.ts +1 -1
- package/src/app/shared/material/datetime/material.datetime.d.ts +2 -2
- package/src/theme/_ngx-components.scss +3 -1
- package/sumaris-net.ngx-components.metadata.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { __awaiter } from "tslib";
|
|
2
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, forwardRef,
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, forwardRef, Input, Optional, Output, ViewChild } from '@angular/core';
|
|
3
3
|
import { FormGroupDirective, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
4
|
import { BehaviorSubject, isObservable, merge, Subject, Subscription, timer } from 'rxjs';
|
|
5
5
|
import { debounceTime, distinctUntilChanged, filter, map, mergeMap, startWith, switchMap, takeUntil, takeWhile, tap } from 'rxjs/operators';
|
|
6
6
|
import { changeCaseToUnderscore, isNil, isNilOrBlank, isNotNil, isNotNilOrBlank, isNotNilString, joinPropertiesPath, suggestFromArray, toBoolean, toNumber } from '../../functions';
|
|
7
|
-
import { focusInput,
|
|
7
|
+
import { focusInput, selectInputRange } from '../../inputs';
|
|
8
8
|
import { firstNotNilPromise } from '../../observables';
|
|
9
9
|
import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
|
10
10
|
import { fromScrollEndEvent } from '../../events';
|
|
@@ -30,10 +30,11 @@ export class MatAutocompleteConfigHolder {
|
|
|
30
30
|
const attributesOrFn = attributes.map((a, index) => typeof a === 'function' && options.attributes[index] || a);
|
|
31
31
|
const filter = Object.assign({ searchAttribute: attributes.length === 1 ? attributes[0] : undefined, searchAttributes: attributes.length > 1 ? attributes : undefined }, options.filter);
|
|
32
32
|
const displayWith = options.displayWith || ((obj) => obj && joinPropertiesPath(obj, attributes));
|
|
33
|
-
const
|
|
33
|
+
const equals = options.equals || ((o1, o2) => o1 && o2 && o1.id === o2.id);
|
|
34
34
|
const config = Object.assign(Object.assign({}, options), { attributes: attributesOrFn, suggestFn,
|
|
35
35
|
filter,
|
|
36
|
-
displayWith,
|
|
36
|
+
displayWith,
|
|
37
|
+
equals });
|
|
37
38
|
this.fields[fieldName] = config;
|
|
38
39
|
return config;
|
|
39
40
|
}
|
|
@@ -44,7 +45,7 @@ export class MatAutocompleteConfigHolder {
|
|
|
44
45
|
return this.fields[fieldName] || this.add(fieldName);
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
|
-
const noop = () => { };
|
|
48
|
+
const noop = (_) => { };
|
|
48
49
|
const ɵ0 = noop;
|
|
49
50
|
export class MatAutocompleteField {
|
|
50
51
|
constructor(cd, formGroupDir) {
|
|
@@ -64,13 +65,13 @@ export class MatAutocompleteField {
|
|
|
64
65
|
this.fetchMoreThreshold = '15%';
|
|
65
66
|
this.suggestLengthThreshold = null;
|
|
66
67
|
this.showLoadingSpinner = true;
|
|
68
|
+
this.debug = false;
|
|
67
69
|
this.clicked = new EventEmitter();
|
|
68
70
|
this.blurred = new EventEmitter();
|
|
69
71
|
this.focused = new EventEmitter();
|
|
70
72
|
this.dropButtonClick = new EventEmitter(true);
|
|
71
73
|
this.keydownEscape = new EventEmitter();
|
|
72
74
|
this.keyupEnter = new EventEmitter();
|
|
73
|
-
this.animationsDisabled = true;
|
|
74
75
|
this._readonly = false;
|
|
75
76
|
this.$inputItems = new BehaviorSubject(undefined);
|
|
76
77
|
this.$filteredItems = new BehaviorSubject(undefined);
|
|
@@ -141,6 +142,9 @@ export class MatAutocompleteField {
|
|
|
141
142
|
get enabled() {
|
|
142
143
|
return !this._readonly && this.formControl.enabled;
|
|
143
144
|
}
|
|
145
|
+
get loading() {
|
|
146
|
+
return isNil(this.$filteredItems.value);
|
|
147
|
+
}
|
|
144
148
|
ngOnInit() {
|
|
145
149
|
var _a, _b;
|
|
146
150
|
this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
|
|
@@ -161,7 +165,7 @@ export class MatAutocompleteField {
|
|
|
161
165
|
this.mobile = toBoolean(this.mobile, this.config.mobile);
|
|
162
166
|
this.suggestLengthThreshold = toNumber(this.suggestLengthThreshold, this.config.suggestLengthThreshold || 0);
|
|
163
167
|
this.showAllOnFocus = toBoolean(this.showAllOnFocus, toBoolean(this.config.showAllOnFocus, this.suggestLengthThreshold <= 0));
|
|
164
|
-
this.showPanelOnFocus = toBoolean(this.showPanelOnFocus, toBoolean(this.config.showPanelOnFocus));
|
|
168
|
+
this.showPanelOnFocus = toBoolean(this.showPanelOnFocus, toBoolean(this.config.showPanelOnFocus, true));
|
|
165
169
|
this.classList = this.classList || this.config.class;
|
|
166
170
|
this.debounceTime = toNumber(this.debounceTime, this.config.debounceTime);
|
|
167
171
|
this.highlightAccent = toBoolean(this.highlightAccent, toBoolean(this.config.highlightAccent));
|
|
@@ -220,6 +224,14 @@ export class MatAutocompleteField {
|
|
|
220
224
|
switchMap((filter) => this.suggest('*', filter)))
|
|
221
225
|
.subscribe(items => this.$inputItems.next(items)));
|
|
222
226
|
}
|
|
227
|
+
// Send value to suggest when :
|
|
228
|
+
// - is nil and '*', and no min length threshold
|
|
229
|
+
// - is not nil and not a string type (e.g. object)
|
|
230
|
+
// - is not nil and is a string, and has enough character
|
|
231
|
+
const thresholdFilterFn = (value) => (isNilOrBlank(value) || (value === '*')
|
|
232
|
+
? (this.suggestLengthThreshold <= 0)
|
|
233
|
+
: (!(typeof value === 'string')
|
|
234
|
+
|| value.length >= this.suggestLengthThreshold));
|
|
223
235
|
const filteredItemsChanges = merge(
|
|
224
236
|
// Reload event (no distinctUntilChanged() pipe, to force reload even if same value)
|
|
225
237
|
this._reload$,
|
|
@@ -231,15 +243,15 @@ export class MatAutocompleteField {
|
|
|
231
243
|
// Filter if not enough character
|
|
232
244
|
filter(value => value.length >= this.suggestLengthThreshold),
|
|
233
245
|
// Wait a debounce time
|
|
234
|
-
debounceTime(this.debounceTime)
|
|
246
|
+
debounceTime(this.debounceTime),
|
|
235
247
|
// DEBUG
|
|
236
|
-
|
|
237
|
-
),
|
|
248
|
+
tap((value) => console.debug(this.logPrefix + ' Search text changes:', value))),
|
|
238
249
|
// Object set: use it (no distinctUntilChanged() pipe need)
|
|
239
250
|
this.formControl.valueChanges
|
|
240
251
|
.pipe(startWith(this.formControl.value), filter(value => (this.searchable && isNotNil(value) && typeof value === 'object')), tap(value => {
|
|
241
252
|
// DEBUG
|
|
242
|
-
|
|
253
|
+
if (this.debug)
|
|
254
|
+
console.debug(this.logPrefix + ' object changes:', value);
|
|
243
255
|
// Update the display value (if need)
|
|
244
256
|
const displayValue = this.displayWith(value) || '';
|
|
245
257
|
if (this.displayValue !== displayValue) {
|
|
@@ -249,37 +261,35 @@ export class MatAutocompleteField {
|
|
|
249
261
|
this.matInputText.nativeElement.value = this.displayValue;
|
|
250
262
|
}
|
|
251
263
|
}
|
|
252
|
-
})
|
|
264
|
+
}),
|
|
253
265
|
// DEBUG
|
|
254
|
-
|
|
255
|
-
),
|
|
266
|
+
tap(value => this.debug && console.debug(this.logPrefix + ' Received an object value: ', value))),
|
|
267
|
+
// On dropdown button click (no distinctUntilChanged(), nor debounceTime)
|
|
268
|
+
this.dropButtonClick
|
|
269
|
+
.pipe(filter(event => this.searchable && this.enabled && (!event || !event.defaultPrevented)), map(_ => this.showAllOnFocus ? '*' : this.formControl.value),
|
|
270
|
+
// Make enough characters
|
|
271
|
+
filter(thresholdFilterFn)),
|
|
256
272
|
// Merge some observables, with a common distinctUntilChanged() pipe, and NO debounceTime
|
|
257
273
|
merge(
|
|
258
274
|
// Focus or click => Load all
|
|
259
275
|
merge(this.focused, this.clicked)
|
|
260
|
-
.pipe(filter(_ => this.enabled && this.searchable), map(_ => this.showAllOnFocus ? '*' : this.formControl.value)
|
|
261
|
-
//
|
|
262
|
-
this.
|
|
263
|
-
.pipe(filter(
|
|
264
|
-
|
|
276
|
+
.pipe(filter(_ => this.enabled && this.searchable), map(_ => this.showAllOnFocus ? '*' : this.formControl.value),
|
|
277
|
+
// DEBUG
|
|
278
|
+
tap(value => this.debug && console.debug(this.logPrefix + ' Received focused or clicked event: ', value))), merge(this.$inputItems, this._$filter)
|
|
279
|
+
.pipe(filter(_ => this.searchable && this.enabled), map(_ => this.formControl.value),
|
|
280
|
+
// DEBUG
|
|
281
|
+
tap(value => this.debug && console.debug(this.logPrefix + ' Received $inputItems or filter event: ', value))))
|
|
265
282
|
.pipe(
|
|
266
|
-
//
|
|
267
|
-
|
|
268
|
-
// - is nil, and there is no min length threshold
|
|
269
|
-
// - is not nil and not a string type (e.g. object)
|
|
270
|
-
// - is not nil and is a string, and has enough character
|
|
271
|
-
filter(value => value === '*'
|
|
272
|
-
|| (isNil(value)
|
|
273
|
-
? (this.suggestLengthThreshold <= 0)
|
|
274
|
-
: (!(typeof value === 'string')
|
|
275
|
-
|| value.length >= this.suggestLengthThreshold))),
|
|
283
|
+
// Make sure there is enough characters
|
|
284
|
+
filter(thresholdFilterFn),
|
|
276
285
|
// Distinguish changes
|
|
277
|
-
|
|
286
|
+
// - do NOT filter if loading, to force update after a blur event
|
|
287
|
+
distinctUntilChanged((v1, v2) => !this.loading && (v1 === v2 || this.equals(v1, v2)))))
|
|
278
288
|
.pipe(
|
|
279
289
|
// Suggest values
|
|
280
290
|
mergeMap(value => this.suggest(value, this.filter)),
|
|
281
291
|
// DEBUG
|
|
282
|
-
|
|
292
|
+
tap(items => this.debug && console.debug(this.logPrefix + ' Received from suggest: ', items)),
|
|
283
293
|
// Store implicit value (will use it onBlur if not other value selected)
|
|
284
294
|
tap(items => this.updateImplicitValue(items)));
|
|
285
295
|
// Fetch more events
|
|
@@ -312,7 +322,9 @@ export class MatAutocompleteField {
|
|
|
312
322
|
this._subscription.add(this.blurred
|
|
313
323
|
.pipe(
|
|
314
324
|
// Skip if not searchable
|
|
315
|
-
filter(_ => this.searchable), map(_ => this.formControl.value)
|
|
325
|
+
filter(_ => this.searchable), map(_ => this.formControl.value),
|
|
326
|
+
// DEBUG
|
|
327
|
+
tap(value => console.debug(this.logPrefix + ' Received blurred event: ', value)))
|
|
316
328
|
.subscribe(value => {
|
|
317
329
|
// When leave component without object, use implicit value if :
|
|
318
330
|
// - an explicit value
|
|
@@ -323,12 +335,14 @@ export class MatAutocompleteField {
|
|
|
323
335
|
this.formControl.markAsPending({ emitEvent: false, onlySelf: true });
|
|
324
336
|
this.formControl.updateValueAndValidity({ emitEvent: false, onlySelf: true });
|
|
325
337
|
this.checkIfTouched();
|
|
338
|
+
this.$filteredItems.next([this._implicitValue]);
|
|
326
339
|
}
|
|
327
340
|
else if (isNilOrBlank(value)) {
|
|
328
341
|
this.writeValue(null);
|
|
329
342
|
this.formControl.markAsPending({ emitEvent: false, onlySelf: true });
|
|
330
343
|
this.formControl.updateValueAndValidity({ emitEvent: false, onlySelf: true });
|
|
331
344
|
this.checkIfTouched();
|
|
345
|
+
this.$filteredItems.next(undefined);
|
|
332
346
|
}
|
|
333
347
|
this._implicitValue = null; // reset the implicit value
|
|
334
348
|
}));
|
|
@@ -358,7 +372,9 @@ export class MatAutocompleteField {
|
|
|
358
372
|
this._openedSubscription.unsubscribe();
|
|
359
373
|
}
|
|
360
374
|
this.$inputItems.complete();
|
|
375
|
+
this.$inputItems.unsubscribe();
|
|
361
376
|
this.$filteredItems.complete();
|
|
377
|
+
this.$filteredItems.unsubscribe();
|
|
362
378
|
this._reload$.complete();
|
|
363
379
|
this._$filter.complete();
|
|
364
380
|
this.dropButtonClick.complete();
|
|
@@ -394,7 +410,7 @@ export class MatAutocompleteField {
|
|
|
394
410
|
}
|
|
395
411
|
writeValue(value) {
|
|
396
412
|
// DEBUG
|
|
397
|
-
// console.debug(this.logPrefix +
|
|
413
|
+
// console.debug(this.logPrefix + ' Writing value: ', value);
|
|
398
414
|
if (value !== this.formControl.value) {
|
|
399
415
|
this.formControl.patchValue(value, { emitEvent: false });
|
|
400
416
|
this._onChangeCallback(value);
|
|
@@ -431,15 +447,20 @@ export class MatAutocompleteField {
|
|
|
431
447
|
if (event.stopPropagation)
|
|
432
448
|
event.stopPropagation();
|
|
433
449
|
event.returnValue = false;
|
|
434
|
-
//DEBUG
|
|
450
|
+
// DEBUG
|
|
451
|
+
if (this.debug)
|
|
452
|
+
console.debug(this.logPrefix + ' Cancelling focus event');
|
|
435
453
|
return false;
|
|
436
454
|
}
|
|
437
|
-
|
|
455
|
+
if (this.debug)
|
|
456
|
+
console.debug(this.logPrefix + ' Select input content');
|
|
457
|
+
const hasContent = true; // selectInputContent(event);
|
|
438
458
|
// If combo is empty, or if has content but should force to show panel on focus
|
|
439
|
-
if (!hasContent ||
|
|
459
|
+
if (!hasContent || this.showPanelOnFocus || this.showAllOnFocus) {
|
|
440
460
|
// DEBUG
|
|
441
|
-
|
|
442
|
-
|
|
461
|
+
if (this.debug)
|
|
462
|
+
console.debug(this.logPrefix + ' Emit focus event');
|
|
463
|
+
this.focused.emit();
|
|
443
464
|
return true;
|
|
444
465
|
}
|
|
445
466
|
return false;
|
|
@@ -453,11 +474,14 @@ export class MatAutocompleteField {
|
|
|
453
474
|
if (event.stopPropagation)
|
|
454
475
|
event.stopPropagation();
|
|
455
476
|
event.returnValue = false;
|
|
456
|
-
//DEBUG
|
|
477
|
+
// DEBUG
|
|
478
|
+
if (this.debug)
|
|
479
|
+
console.debug(this.logPrefix + " Cancelling blur event");
|
|
457
480
|
return false;
|
|
458
481
|
}
|
|
459
482
|
//DEBUG
|
|
460
|
-
|
|
483
|
+
if (this.debug)
|
|
484
|
+
console.debug(this.logPrefix + ' Blur: move caret to the beginning');
|
|
461
485
|
// Move caret to the beginning (fix issue IMAGINE-469)
|
|
462
486
|
selectInputRange(event.target, 0, 0);
|
|
463
487
|
this.blurred.emit(event);
|
|
@@ -568,6 +592,7 @@ export class MatAutocompleteField {
|
|
|
568
592
|
/* -- private method -- */
|
|
569
593
|
suggest(value, filter) {
|
|
570
594
|
return __awaiter(this, void 0, void 0, function* () {
|
|
595
|
+
// Call suggestion function
|
|
571
596
|
let res = yield this.suggestFn(value, filter);
|
|
572
597
|
// DEBUG
|
|
573
598
|
//console.debug(this.logPrefix + ' Filtered items by suggestFn:', value, res);
|
|
@@ -588,6 +613,9 @@ export class MatAutocompleteField {
|
|
|
588
613
|
this._moreItemsCount = fetchMore && (this._itemCount - data.length) || 0;
|
|
589
614
|
res = data;
|
|
590
615
|
}
|
|
616
|
+
// DEBUG
|
|
617
|
+
if (this.debug)
|
|
618
|
+
console.debug(this.logPrefix + ' Filtered items by suggestFn:', value, res);
|
|
591
619
|
return res;
|
|
592
620
|
});
|
|
593
621
|
}
|
|
@@ -659,14 +687,14 @@ MatAutocompleteField.decorators = [
|
|
|
659
687
|
{ type: Component, args: [{
|
|
660
688
|
// eslint-disable-next-line @angular-eslint/component-selector
|
|
661
689
|
selector: 'mat-autocomplete-field',
|
|
662
|
-
template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <mat-form-field *ngIf=\"_readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [title]=\"displayValue\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n
|
|
690
|
+
template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n <mat-form-field *ngIf=\"_readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [title]=\"displayValue\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\" readonly>\n <ion-text>{{displayWith(value)}}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n\n <ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"displayValue\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Basic select -->\n <mat-select #matSelect\n *ngIf=\"!searchable; else searchableTemplate\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"classList\"\n [style.width]=\"panelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [required]=\"required\">\n <mat-select-trigger>{{ displayWith(value) }}</mat-select-trigger>\n\n <!-- header -->\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i; last as isLast\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- None option -->\n <mat-option *ngIf=\"!required\" class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <ng-container *ngIf=\"$filteredItems | async; let items\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label>{{noResultMessage | translate}}</ion-label>\n </mat-option>\n\n <!-- options -->\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text>{{item | propertyGet: path }}</ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initMatSelectInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n </mat-select>\n\n\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <ng-template #searchableTemplate>\n <input matInput #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowdown)=\"dropButtonClick.emit($event)\">\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i; last as last\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n <ion-text color=\"light\" *ngIf=\"last && itemCount; let count\" class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n <ng-container *ngIf=\"$filteredItems | async; else loadingTemplate; let items\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path | highlight: { search: formControl.value, withAccent: highlightAccent }\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initAutocompleteInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(matInputText.value | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n\n </ng-template>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n <ng-content select=\"[matError]\"></ng-content>\n\n </mat-form-field>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-align-self-center\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"searchable\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</mat-icon>\n </button>\n <button matSuffix type=\"button\" mat-icon-button tabindex=\"-1\"\n *ngIf=\"enabled && mobile && !searchable && !multiple\"\n [title]=\"'COMMON.BTN_SEARCH'|translate\"\n (click)=\"toggleSearch($event)\">\n <mat-icon>search</mat-icon>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n",
|
|
663
691
|
providers: [{
|
|
664
692
|
provide: NG_VALUE_ACCESSOR,
|
|
665
693
|
multi: true,
|
|
666
694
|
useExisting: forwardRef(() => MatAutocompleteField)
|
|
667
695
|
}],
|
|
668
696
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
669
|
-
styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label{white-space:normal!important}button[hidden]{display:none}mat-icon.select-arrow{color:rgba(0,0,0,.47);font-size:150%}
|
|
697
|
+
styles: [":host{display:inline-block;position:relative}:host.ion-text-wrap ion-label{white-space:normal!important}button[hidden]{display:none}mat-icon.select-arrow{color:rgba(0,0,0,.47);font-size:150%}"]
|
|
670
698
|
},] }
|
|
671
699
|
];
|
|
672
700
|
MatAutocompleteField.ctorParameters = () => [
|
|
@@ -704,6 +732,7 @@ MatAutocompleteField.propDecorators = {
|
|
|
704
732
|
fetchMoreThreshold: [{ type: Input }],
|
|
705
733
|
suggestLengthThreshold: [{ type: Input }],
|
|
706
734
|
showLoadingSpinner: [{ type: Input }],
|
|
735
|
+
debug: [{ type: Input }],
|
|
707
736
|
clicked: [{ type: Output, args: ['click',] }],
|
|
708
737
|
blurred: [{ type: Output, args: ['blur',] }],
|
|
709
738
|
focused: [{ type: Output, args: ['focus',] }],
|
|
@@ -714,11 +743,10 @@ MatAutocompleteField.propDecorators = {
|
|
|
714
743
|
matInputText: [{ type: ViewChild, args: ['matInputText',] }],
|
|
715
744
|
autocomplete: [{ type: ViewChild, args: [MatAutocomplete,] }],
|
|
716
745
|
autocompleteTrigger: [{ type: ViewChild, args: [MatAutocompleteTrigger,] }],
|
|
717
|
-
animationsDisabled: [{ type: HostBinding, args: ['@.disabled',] }],
|
|
718
746
|
filter: [{ type: Input }],
|
|
719
747
|
readonly: [{ type: Input }],
|
|
720
748
|
tabindex: [{ type: Input }],
|
|
721
749
|
items: [{ type: Input }]
|
|
722
750
|
};
|
|
723
751
|
export { ɵ0 };
|
|
724
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuYXV0b2NvbXBsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL21hdGVyaWFsLmF1dG9jb21wbGV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlMLE9BQU8sRUFBb0Msa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RyxPQUFPLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEcsT0FBTyxFQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUksT0FBTyxFQUFDLHNCQUFzQixFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xMLE9BQU8sRUFBQyxVQUFVLEVBQWdCLGtCQUFrQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzVGLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBSXJELE9BQU8sRUFBQyxlQUFlLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSxnQ0FB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QUMsWUFBWTtxQkFxQ3hCLEtBQUs7dUJBWUwsS0FBSzt1QkFTTCxLQUFLO29CQVNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGlzT2JzZXJ2YWJsZSwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGltZXJ9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRha2VXaGlsZSwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0ZldGNoTW9yZUZuLCBMb2FkUmVzdWx0LCBTdWdnZXN0Rm4sIFN1Z2dlc3RTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge2NoYW5nZUNhc2VUb1VuZGVyc2NvcmUsIGlzTmlsLCBpc05pbE9yQmxhbmssIGlzTm90TmlsLCBpc05vdE5pbE9yQmxhbmssIGlzTm90TmlsU3RyaW5nLCBqb2luUHJvcGVydGllc1BhdGgsIHN1Z2dlc3RGcm9tQXJyYXksIHRvQm9vbGVhbiwgdG9OdW1iZXJ9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQge2ZvY3VzSW5wdXQsIElucHV0RWxlbWVudCwgc2VsZWN0SW5wdXRDb250ZW50LCBzZWxlY3RJbnB1dFJhbmdlfSBmcm9tICcuLi8uLi9pbnB1dHMnO1xuaW1wb3J0IHtmaXJzdE5vdE5pbFByb21pc2V9IGZyb20gJy4uLy4uL29ic2VydmFibGVzJztcbmltcG9ydCB7RGlzcGxheUZuLCBFcXVhbHNGbn0gZnJvbSAnLi4vLi4vZm9ybS9maWVsZC5tb2RlbCc7XG5pbXBvcnQge0Zsb2F0TGFiZWxUeXBlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7TWF0U2VsZWN0fSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHtNYXRBdXRvY29tcGxldGUsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXJ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQge2Zyb21TY3JvbGxFbmRFdmVudH0gZnJvbSAnLi4vLi4vZXZlbnRzJztcblxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc8VCA9IGFueSwgRiA9IGFueT4ge1xuICBhdHRyaWJ1dGVzOiBzdHJpbmdbXTtcbiAgc3VnZ2VzdEZuPzogKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBhbnkpID0+IFByb21pc2U8VFtdIHwgTG9hZFJlc3VsdDxUPj47XG4gIGZpbHRlcj86IFBhcnRpYWw8Rj47XG4gIGl0ZW1zPzogT2JzZXJ2YWJsZTxUW10+IHwgVFtdO1xuICBjb2x1bW5TaXplcz86IChudW1iZXIgfCAnYXV0bycgfCB1bmRlZmluZWQpW107XG4gIGNvbHVtbk5hbWVzPzogKHN0cmluZyB8IHVuZGVmaW5lZClbXTtcbiAgZGlzcGxheVdpdGg/OiBEaXNwbGF5Rm47XG4gIGVxdWFscz86IEVxdWFsc0ZuOyAvLyBVc2VkIGJ5IDxtYXQtY2hpcHMtZmllbGQ+XG4gIHNob3dBbGxPbkZvY3VzPzogYm9vbGVhbjtcbiAgc2hvd1BhbmVsT25Gb2N1cz86IGJvb2xlYW47XG4gIGNsYXNzPzogc3RyaW5nO1xuICBtb2JpbGU/OiBib29sZWFuO1xuICBkZWJvdW5jZVRpbWU/OiBudW1iZXI7XG4gIHN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIGhpZ2hsaWdodEFjY2VudD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBNYXRBdXRvY29tcGxldGVGaWVsZEFkZE9wdGlvbnM8VCA9IGFueSwgRiA9IGFueT4gZXh0ZW5kcyBQYXJ0aWFsPE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnPFQsIEY+PiB7XG4gIHNlcnZpY2U/OiBTdWdnZXN0U2VydmljZTxULCBGPjtcbn1cblxuZXhwb3J0IGNsYXNzIE1hdEF1dG9jb21wbGV0ZUNvbmZpZ0hvbGRlciB7XG4gIGZpZWxkczoge1xuICAgIFtrZXk6IHN0cmluZ106IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnO1xuICB9ID0ge307XG5cbiAgZ2V0VXNlckF0dHJpYnV0ZXM6IChmaWVsZE5hbWU6IHN0cmluZywgZGVmYXVsdEF0dHJpYnV0ZXM/OiBzdHJpbmdbXSkgPT4gc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvcHRpb25zPzoge1xuICAgIGdldFVzZXJBdHRyaWJ1dGVzOiAoZmllbGROYW1lOiBzdHJpbmcsIGRlZmF1bHRBdHRyaWJ1dGVzPzogc3RyaW5nW10pID0+IHN0cmluZ1tdO1xuICB9KSB7XG4gICAgLy8gU3RvcmUgdGhlIGZ1bmN0aW9uIGZyb20gb3B0aW9ucyAoZS5nLiBnZXQgZnJvbSB1c2VyIHNldHRpbmdzKVxuICAgIC8vIG9yIGNyZWF0ZSBhIGRlZmF1bHQgZnVuY3Rpb25cbiAgICB0aGlzLmdldFVzZXJBdHRyaWJ1dGVzID0gb3B0aW9ucz8uZ2V0VXNlckF0dHJpYnV0ZXMgfHxcbiAgICAgICgoZmllbGROYW1lLCBkZWZhdWx0QXR0cmlidXRlcykgPT4gZGVmYXVsdEF0dHJpYnV0ZXMgfHwgWydsYWJlbCcsICduYW1lJ10pO1xuICB9XG5cbiAgYWRkPFQgPSBhbnksIEYgPSBhbnk+KGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zPzogTWF0QXV0b2NvbXBsZXRlRmllbGRBZGRPcHRpb25zPFQsIEY+KTogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc8VCwgRj4ge1xuICAgIGlmICghZmllbGROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBhZGQgY29uZmlnLCB3aXRoIG5hbWU6ICcgKyAoZmllbGROYW1lIHx8ICd1bmRlZmluZWQnKSk7XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IDxNYXRBdXRvY29tcGxldGVGaWVsZEFkZE9wdGlvbnM+e307XG4gICAgY29uc3Qgc3VnZ2VzdEZuOiBTdWdnZXN0Rm48VCwgRj4gPSBvcHRpb25zLnN1Z2dlc3RGblxuICAgICAgfHwgKG9wdGlvbnMuc2VydmljZSAmJiAoKHYsIGYpID0+IG9wdGlvbnMuc2VydmljZS5zdWdnZXN0KHYsIGYpKSlcbiAgICAgIHx8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gKHRoaXMuZ2V0VXNlckF0dHJpYnV0ZXMoZmllbGROYW1lLCBvcHRpb25zLmF0dHJpYnV0ZXMpIHx8IFsnbGFiZWwnLCAnbmFtZSddKTtcbiAgICAvLyBLZWVwIG9yaWdpbmFsIHRoZSBmdW5jdGlvbiBmcm9tIG9wdGlvbnMsIHdoZW4gZXhpc3RzXG4gICAgY29uc3QgYXR0cmlidXRlc09yRm4gPSBhdHRyaWJ1dGVzLm1hcCgoYSwgaW5kZXgpID0+IHR5cGVvZiBhID09PSAnZnVuY3Rpb24nICYmIG9wdGlvbnMuYXR0cmlidXRlc1tpbmRleF0gfHwgYSk7XG4gICAgY29uc3QgZmlsdGVyOiBQYXJ0aWFsPEY+ID0ge1xuICAgICAgc2VhcmNoQXR0cmlidXRlOiBhdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMSA/IGF0dHJpYnV0ZXNbMF0gOiB1bmRlZmluZWQsXG4gICAgICBzZWFyY2hBdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLmxlbmd0aCA+IDEgPyBhdHRyaWJ1dGVzIDogdW5kZWZpbmVkLFxuICAgICAgLi4ub3B0aW9ucy5maWx0ZXJcbiAgICB9O1xuICAgIGNvbnN0IGRpc3BsYXlXaXRoID0gb3B0aW9ucy5kaXNwbGF5V2l0aCB8fCAoKG9iaikgPT4gb2JqICYmIGpvaW5Qcm9wZXJ0aWVzUGF0aChvYmosIGF0dHJpYnV0ZXMpKTtcbiAgICBjb25zdCBjb21wYXJlV2l0aCA9IG9wdGlvbnMuZXF1YWxzIHx8ICgobzE6IGFueSwgbzI6IGFueSkgPT4gbzEgJiYgbzIgJiYgbzEuaWQgPT09IG8yLmlkKTtcblxuICAgIGNvbnN0IGNvbmZpZzogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWcgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlc09yRm4sXG4gICAgICBzdWdnZXN0Rm4sXG4gICAgICBmaWx0ZXIsXG4gICAgICBkaXNwbGF5V2l0aCxcbiAgICAgIGVxdWFsczogY29tcGFyZVdpdGhcbiAgICB9O1xuXG4gICAgdGhpcy5maWVsZHNbZmllbGROYW1lXSA9IGNvbmZpZztcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgZ2V0PFQgPSBhbnk+KGZpZWxkTmFtZTogc3RyaW5nKTogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc8VD4ge1xuICAgIGlmICghZmllbGROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBhZGQgY29uZmlnLCB3aXRoIG5hbWU6ICcgKyAoZmllbGROYW1lIHx8ICd1bmRlZmluZWQnKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpZWxkc1tmaWVsZE5hbWVdIHx8IHRoaXMuYWRkKGZpZWxkTmFtZSkgYXMgTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc8VD47XG4gIH1cbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdtYXQtYXV0b2NvbXBsZXRlLWZpZWxkJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWF0ZXJpYWwuYXV0b2NvbXBsZXRlLnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5odG1sJyxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIG11bHRpOiB0cnVlLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1hdEF1dG9jb21wbGV0ZUZpZWxkKVxuICB9XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTWF0QXV0b2NvbXBsZXRlRmllbGQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXRFbGVtZW50LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcblxuXG4gIEBJbnB1dCgpIGVxdWFsczogRXF1YWxzRm47XG4gIEBJbnB1dCgpIGxvZ1ByZWZpeCA9ICdbbWF0LWF1dG9jb21wbGV0ZV0gJztcbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuICBASW5wdXQoKSBmb3JtQ29udHJvbE5hbWU6IHN0cmluZyA9IG51bGw7XG4gIEBJbnB1dCgpIGZsb2F0TGFiZWw6IEZsb2F0TGFiZWxUeXBlO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBzdWdnZXN0Rm46IFN1Z2dlc3RGbjxhbnksIGFueT47XG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgY2xlYXJhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRlYm91bmNlVGltZTogbnVtYmVyID0gbnVsbDtcbiAgQElucHV0KCkgZGlzcGxheVdpdGg6IERpc3BsYXlGbiB8IG51bGw7XG4gIEBJbnB1dCgpIGRpc3BsYXlBdHRyaWJ1dGVzOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgZGlzcGxheUNvbHVtblNpemVzOiAobnVtYmVyIHwgJ2F1dG8nIHwgdW5kZWZpbmVkKVtdO1xuICBASW5wdXQoKSBkaXNwbGF5Q29sdW1uTmFtZXM6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBoaWdobGlnaHRBY2NlbnQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNob3dBbGxPbkZvY3VzOiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93UGFuZWxPbkZvY3VzOiBib29sZWFuO1xuICBASW5wdXQoKSBhdXRvZm9jdXM6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNvbmZpZzogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc7XG4gIEBJbnB1dCgpIGkxOG5QcmVmaXggPSAnUkVGRVJFTlRJQUwuJztcbiAgQElucHV0KCkgbm9SZXN1bHRNZXNzYWdlID0gJ0NPTU1PTi5OT19SRVNVTFQnO1xuICBASW5wdXQoJ2NsYXNzJykgY2xhc3NMaXN0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhbmVsV2lkdGg6IHN0cmluZztcbiAgQElucHV0KCkgbWF0QXV0b2NvbXBsZXRlUG9zaXRpb246ICdhdXRvJyB8ICdhYm92ZScgfCAnYmVsb3cnO1xuICBASW5wdXQoKSBtdWx0aXBsZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGl0ZW1TaXplID0gJzQ4cHgnO1xuICBASW5wdXQoKSBmZXRjaE1vcmVUaHJlc2hvbGQ6IHN0cmluZyA9ICcxNSUnO1xuICBASW5wdXQoKSBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBzaG93TG9hZGluZ1NwaW5uZXIgPSB0cnVlO1xuXG4gIEBPdXRwdXQoJ2NsaWNrJykgY2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgQE91dHB1dCgnYmx1cicpIGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIEBPdXRwdXQoJ2ZvY3VzJykgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyb3BCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VUlFdmVudD4odHJ1ZSk7XG4gIEBPdXRwdXQoJ2tleWRvd24uZXNjYXBlJykga2V5ZG93bkVzY2FwZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdrZXl1cC5lbnRlcicpIGtleXVwRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKCdtYXRTZWxlY3QnKSBtYXRTZWxlY3Q6IE1hdFNlbGVjdDtcbiAgQFZpZXdDaGlsZCgnbWF0SW5wdXRUZXh0JykgbWF0SW5wdXRUZXh0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZSkgYXV0b2NvbXBsZXRlOiBNYXRBdXRvY29tcGxldGU7XG4gIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcikgYXV0b2NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcblxuICBASG9zdEJpbmRpbmcoJ0AuZGlzYWJsZWQnKVxuICBhbmltYXRpb25zRGlzYWJsZWQgPSB0cnVlO1xuXG5cbiAgX3JlYWRvbmx5ID0gZmFsc2U7XG4gIF90YWJpbmRleDogbnVtYmVyO1xuICBtYXRTZWxlY3RJdGVtcyQ6IE9ic2VydmFibGU8YW55W10+O1xuICAkaW5wdXRJdGVtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XG4gICRmaWx0ZXJlZEl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcbiAgc2VhcmNoYWJsZTogYm9vbGVhbjtcbiAgZGlzcGxheVZhbHVlID0gJyc7XG4gIF9tb3JlSXRlbXNDb3VudDogbnVtYmVyO1xuICBfZmV0Y2hNb3JlJCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgcHJpdmF0ZSBfb25GZXRjaE1vcmVDYWxsYmFjazogRmV0Y2hNb3JlRm48TG9hZFJlc3VsdDxhbnk+PjtcbiAgcHJpdmF0ZSBfaW1wbGljaXRWYWx1ZTogYW55O1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2l0ZW1zU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX29wZW5lZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF8kZmlsdGVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgX2l0ZW1Db3VudDogbnVtYmVyO1xuICBwcml2YXRlIF9yZWxvYWQkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZVxuICApIHtcbiAgfVxuXG4gIGdldCBpdGVtQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbUNvdW50O1xuICB9XG5cbiAgZ2V0IGNhbkZldGNoTW9yZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayAmJiB0aGlzLl9tb3JlSXRlbXNDb3VudCA+IDA7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZmlsdGVyKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuXyRmaWx0ZXIudmFsdWUpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBTZXR0aW5nIGZpbHRlcjpcIiwgdmFsdWUpO1xuICAgICAgdGhpcy5fJGZpbHRlci5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZmlsdGVyKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuXyRmaWx0ZXIudmFsdWU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcmVhZG9ubHkodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yZWFkb25seSA9IHZhbHVlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRhYmluZGV4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90YWJpbmRleCA9IHZhbHVlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgdGFiaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiaW5kZXg7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaXRlbXModmFsdWU6IE9ic2VydmFibGU8YW55W10+IHwgYW55W10pIHtcbiAgICAvLyBSZW1vdmUgcHJldmlvdXMgc3Vic2NyaXB0aW9uIG9uIGl0ZW1zLCAoaWYgZXhpdHMpXG4gICAgaWYgKHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uKSB7XG4gICAgICBjb25zb2xlLndhcm4odGhpcy5sb2dQcmVmaXggKyAnIEl0ZW1zIHJlY2VpdmVkIHR3aWNlICEnKTtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5yZW1vdmUodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pO1xuICAgICAgdGhpcy5faXRlbXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNPYnNlcnZhYmxlPGFueVtdPih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uID0gdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgdmFsdWUuc3Vic2NyaWJlKHYgPT4ge1xuICAgICAgICAgIC8vY29uc29sZS53YXJuKHRoaXMubG9nUHJlZml4ICsgXCIgUmVjZWl2ZWQgaXRlbXM6IFwiLCB2KTtcbiAgICAgICAgICB0aGlzLiRpbnB1dEl0ZW1zLm5leHQodik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsdWUgIT09IHRoaXMuJGlucHV0SXRlbXMudmFsdWUpIHtcbiAgICAgICAgdGhpcy4kaW5wdXRJdGVtcy5uZXh0KHZhbHVlIGFzIGFueVtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgaXRlbXMoKTogT2JzZXJ2YWJsZTxhbnlbXT4gfCBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuJGlucHV0SXRlbXM7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcbiAgfVxuXG4gIGdldCBkaXNhYmxlZCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkb25seSB8fCB0aGlzLmZvcm1Db250cm9sLmRpc2FibGVkO1xuICB9XG5cbiAgZ2V0IGVuYWJsZWQoKTogYW55IHtcbiAgICByZXR1cm4gIXRoaXMuX3JlYWRvbmx5ICYmIHRoaXMuZm9ybUNvbnRyb2wuZW5hYmxlZDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Db250cm9sIHx8IHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmIHRoaXMuZm9ybUdyb3VwRGlyLmZvcm0uZ2V0KHRoaXMuZm9ybUNvbnRyb2xOYW1lKSBhcyBGb3JtQ29udHJvbDtcbiAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBtYW5kYXRvcnkgYXR0cmlidXRlIFxcJ2Zvcm1Db250cm9sXFwnIG9yIFxcJ2Zvcm1Db250cm9sTmFtZVxcJyBpbiA8bWF0LWF1dG9jb21wbGV0ZS1maWVsZD4uJyk7XG5cbiAgICAvLyBDb25maWd1cmF0aW9uIGZyb20gY29uZmlnIG9iamVjdFxuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5zdWdnZXN0Rm4gPSB0aGlzLnN1Z2dlc3RGbiB8fCB0aGlzLmNvbmZpZy5zdWdnZXN0Rm47XG4gICAgICBpZiAoIXRoaXMuc3VnZ2VzdEZuICYmIHRoaXMuY29uZmlnLml0ZW1zKSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmNvbmZpZy5pdGVtcztcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVyID0gdGhpcy5maWx0ZXIgfHwgdGhpcy5jb25maWcuZmlsdGVyO1xuICAgICAgdGhpcy5kaXNwbGF5QXR0cmlidXRlcyA9IHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgfHwgdGhpcy5jb25maWcuYXR0cmlidXRlcztcbiAgICAgIHRoaXMuZGlzcGxheUNvbHVtblNpemVzID0gdGhpcy5kaXNwbGF5Q29sdW1uU2l6ZXMgfHwgdGhpcy5jb25maWcuY29sdW1uU2l6ZXM7XG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyA9IHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzIHx8IHRoaXMuY29uZmlnLmNvbHVtbk5hbWVzO1xuICAgICAgdGhpcy5kaXNwbGF5V2l0aCA9IHRoaXMuZGlzcGxheVdpdGggfHwgdGhpcy5jb25maWcuZGlzcGxheVdpdGg7XG4gICAgICB0aGlzLmVxdWFscyA9IHRoaXMuZXF1YWxzIHx8IHRoaXMuY29uZmlnLmVxdWFscztcbiAgICAgIHRoaXMubW9iaWxlID0gdG9Cb29sZWFuKHRoaXMubW9iaWxlLCB0aGlzLmNvbmZpZy5tb2JpbGUpO1xuICAgICAgdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkID0gdG9OdW1iZXIodGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkLCB0aGlzLmNvbmZpZy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkIHx8IDApO1xuICAgICAgdGhpcy5zaG93QWxsT25Gb2N1cyA9IHRvQm9vbGVhbih0aGlzLnNob3dBbGxPbkZvY3VzLCB0b0Jvb2xlYW4odGhpcy5jb25maWcuc2hvd0FsbE9uRm9jdXMsIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA8PSAwKSk7XG4gICAgICB0aGlzLnNob3dQYW5lbE9uRm9jdXMgPSB0b0Jvb2xlYW4odGhpcy5zaG93UGFuZWxPbkZvY3VzLCB0b0Jvb2xlYW4odGhpcy5jb25maWcuc2hvd1BhbmVsT25Gb2N1cykpO1xuICAgICAgdGhpcy5jbGFzc0xpc3QgPSB0aGlzLmNsYXNzTGlzdCB8fCB0aGlzLmNvbmZpZy5jbGFzcztcbiAgICAgIHRoaXMuZGVib3VuY2VUaW1lID0gdG9OdW1iZXIodGhpcy5kZWJvdW5jZVRpbWUsIHRoaXMuY29uZmlnLmRlYm91bmNlVGltZSk7XG4gICAgICB0aGlzLmhpZ2hsaWdodEFjY2VudCA9ICB0b0Jvb2xlYW4odGhpcy5oaWdobGlnaHRBY2NlbnQsIHRvQm9vbGVhbih0aGlzLmNvbmZpZy5oaWdobGlnaHRBY2NlbnQpKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgIHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzIHx8IHRoaXMuZmlsdGVyPy5hdHRyaWJ1dGVzIHx8IFsnbGFiZWwnLCAnbmFtZSddO1xuICAgIHRoaXMuZGlzcGxheVdpdGggPSB0aGlzLmRpc3BsYXlXaXRoIHx8ICgob2JqKSA9PiBvYmogJiYgam9pblByb3BlcnRpZXNQYXRoKG9iaiwgdGhpcy5kaXNwbGF5QXR0cmlidXRlcykpO1xuICAgIHRoaXMuZGlzcGxheUNvbHVtblNpemVzID0gdGhpcy5kaXNwbGF5Q29sdW1uU2l6ZXNcbiAgICAgIC8vIGlmIG9ubHkgY29sdW1uOiBhdXRvIHNpemVcbiAgICAgIHx8ICh0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMSAmJiBbdW5kZWZpbmVkXSlcbiAgICAgIC8vIENvbXB1dGVkIGNvbHVtbiBzaXplOlxuICAgICAgLy8gLSBpZiBsYWJlbCB0aGVuIGNvbCBzaXplID0gMlxuICAgICAgLy8gLSBpZiByYW5rT3JkZXIgdGhlbiBjb2wgc2l6ZSA9IDFcbiAgICAgIC8vIC0gZXNlID0+IGF1dG8gc2l6ZVxuICAgICAgfHwgdGhpcy5kaXNwbGF5QXR0cmlidXRlcy5tYXAoYXR0ciA9PlxuICAgICAgICAoYXR0ciAmJiBhdHRyLmVuZHNXaXRoKCdsYWJlbCcpKSA/IDJcbiAgICAgICAgOiAoKGF0dHIgJiYgYXR0ci5lbmRzV2l0aCgncmFua09yZGVyJykpID8gMVxuICAgICAgICAgIDogdW5kZWZpbmVkKSk7XG4gICAgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLm1hcCgoYXR0ciwgaW5kZXgpID0+IHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzICYmIHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzW2luZGV4XSB8fFxuICAgICAgKHRoaXMuaTE4blByZWZpeCArIGNoYW5nZUNhc2VUb1VuZGVyc2NvcmUoYXR0cikudG9VcHBlckNhc2UoKSkpO1xuICAgIHRoaXMubW9iaWxlID0gdG9Cb29sZWFuKHRoaXMubW9iaWxlLCBmYWxzZSk7XG4gICAgdGhpcy5zZWFyY2hhYmxlID0gIXRoaXMubW9iaWxlICYmICF0aGlzLm11bHRpcGxlO1xuICAgIHRoaXMuZXF1YWxzID0gdGhpcy5lcXVhbHMgfHwgKChvMSwgbzIpID0+IG8xICYmIG8yICYmIG8xLmlkID09PSBvMi5pZCk7XG4gICAgY29uc3QgY2xhc3NMaXN0ID0gdGhpcy5jbGFzc0xpc3Q/LnNwbGl0KCcgJyk7XG4gICAgdGhpcy5wYW5lbFdpZHRoID0gdGhpcy5wYW5lbFdpZHRoIHx8IChjbGFzc0xpc3QgJiYgKFxuICAgICAgKGNsYXNzTGlzdC5pbmNsdWRlcygnbWluLXdpZHRoLW1lZGl1bScpICYmICczMDBweCcpXG4gICAgICB8fCAoY2xhc3NMaXN0LmluY2x1ZGVzKCdtaW4td2lkdGgtbGFyZ2UnKSAmJiAnNDAwcHgnKVxuICAgICAgfHwgKGNsYXNzTGlzdC5pbmNsdWRlcygnbWluLXdpZHRoLXhsYXJnZScpICYmICc0NTBweCcpXG4gICAgICB8fCAoY2xhc3NMaXN0LmluY2x1ZGVzKCdtYXQtYXV0b2NvbXBsZXRlLXBhbmVsLWZ1bGwtc2l6ZScpICYmICcxMDB2dycpXG4gICAgKSk7XG4gICAgdGhpcy5zaG93UGFuZWxPbkZvY3VzID0gdG9Cb29sZWFuKHRoaXMuc2hvd1BhbmVsT25Gb2N1cywgdHJ1ZSk7XG4gICAgdGhpcy5kZWJvdW5jZVRpbWUgPSB0b051bWJlcih0aGlzLmRlYm91bmNlVGltZSwgMjUwKTtcbiAgICB0aGlzLmhpZ2hsaWdodEFjY2VudCA9IHRvQm9vbGVhbih0aGlzLmhpZ2hsaWdodEFjY2VudCwgZmFsc2UpO1xuICAgIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA9IHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCB8fCAwO1xuICAgIHRoaXMubWF0QXV0b2NvbXBsZXRlUG9zaXRpb24gPSB0aGlzLm1hdEF1dG9jb21wbGV0ZVBvc2l0aW9uIHx8ICh0aGlzLm1vYmlsZSAmJiB0aGlzLnNlYXJjaGFibGUgPyAnYWJvdmUnIDogJ2F1dG8nKTsgLy8gT24gbW9iaWxlLCBzZXQgcG9zaXRpb24gdG8gYWJvdmUgKGJlY2F1c2Ugb2YgYm90dG9tIGtleWJvYXJkKVxuXG4gICAgLy8gTm8gc3VnZ2VzdEZuOiBmaWx0ZXIgb24gdGhlIGdpdmVuIGl0ZW1zXG4gICAgaWYgKCF0aGlzLnN1Z2dlc3RGbikge1xuICAgICAgY29uc3Qgc3VnZ2VzdEZyb21BcnJheUZuOiBTdWdnZXN0Rm48YW55LCBhbnk+ID0gYXN5bmMgKHZhbHVlLCBmaWx0ZXIpID0+IHtcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBDYWxsaW5nIHN1Z2dlc3RGcm9tQXJyYXkgd2l0aCB2YWx1ZT0nLCB2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHN1Z2dlc3RGcm9tQXJyYXkodGhpcy4kaW5wdXRJdGVtcy52YWx1ZSwgdmFsdWUsIHtcbiAgICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzLFxuICAgICAgICAgIC4uLmZpbHRlclxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvLyBXYWl0IChvbmNlKSB0aGF0IGl0ZW1zIGFyZSBsb2FkZWQsIHRoZW4gY2FsbCBzdWdnZXN0IGZyb20gYXJyYXkgZm5cbiAgICAgIHRoaXMuc3VnZ2VzdEZuID0gYXN5bmMgKHZhbHVlLCBmaWx0ZXIpID0+IHtcbiAgICAgICAgaWYgKGlzTmlsKHRoaXMuJGlucHV0SXRlbXMudmFsdWUpKSB7XG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBXYWl0aW5nIGl0ZW1zIHRvIGJlIHNldC4uLlwiKTtcblxuICAgICAgICAgIGF3YWl0IGZpcnN0Tm90TmlsUHJvbWlzZSh0aGlzLiRpbnB1dEl0ZW1zKTtcblxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgUmVjZWl2ZWQgaXRlbXM6XCIsIHRoaXMuaW5wdXRJdGVtcyQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VnZ2VzdEZuID0gc3VnZ2VzdEZyb21BcnJheUZuO1xuICAgICAgICByZXR1cm4gdGhpcy5zdWdnZXN0Rm4odmFsdWUsIGZpbHRlcik7IC8vIExvb3BcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICghdGhpcy5zZWFyY2hhYmxlKSB7XG4gICAgICAvLyBNYW51YWxseSBmaWxsIGlucHV0IGl0ZW1zLCBmcm9tIHRoZSBnaXZlbiBzdWdnZXN0IGZ1bmN0aW9uXG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICB0aGlzLl8kZmlsdGVyLnBpcGUoXG4gICAgICAgICAgc3RhcnRXaXRoPGFueSwgYW55Pih0aGlzLmZpbHRlciksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDI1MCksXG4gICAgICAgICAgdGFrZVdoaWxlKChfKSA9PiAhdGhpcy5zZWFyY2hhYmxlKSwgLy8gQ2xvc2Ugc3Vic2NyaXB0aW9uLCB3aGVuIGVuYWJsaW5nIHNlYXJjaCAobm8gbW9yZSBtYXQtc2VsZWN0KVxuICAgICAgICAgIHN3aXRjaE1hcCgoZmlsdGVyKSA9PiB0aGlzLnN1Z2dlc3QoJyonLCBmaWx0ZXIpKVxuICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZShpdGVtcyA9PiB0aGlzLiRpbnB1dEl0ZW1zLm5leHQoaXRlbXMpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zQ2hhbmdlcyA9IG1lcmdlKFxuXG4gICAgICAvLyBSZWxvYWQgZXZlbnQgKG5vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgcGlwZSwgdG8gZm9yY2UgcmVsb2FkIGV2ZW4gaWYgc2FtZSB2YWx1ZSlcbiAgICAgIHRoaXMuX3JlbG9hZCQsXG5cbiAgICAgIC8vIFNlYXJjaCB0ZXh0IChubyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIGJlY2F1c2Ugb2YgdGhlIGRlYm91bmNlVGltZSgpIHBpcGUpXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gdGhpcy5lbmFibGVkICYmIHRoaXMuc2VhcmNoYWJsZSAmJiBpc05vdE5pbFN0cmluZyh2YWx1ZSkpLFxuICAgICAgICAgIC8vIE1hcmsgYXMgbG9hZGluZyAodG8gc2hvdyBsb2FkaW5nIHNwaW5uZXIpIC0gZWFybGllciBhcyBwb3NzaWJsZSwgc28gYmVmb3JlIHRoZSBkZWJvdW5jZSB0aW1lXG4gICAgICAgICAgdGFwKF8gPT4gdGhpcy5zaG93TG9hZGluZ1NwaW5uZXIgJiYgdGhpcy5tYXJrQXNMb2FkaW5nKCkpLFxuICAgICAgICAgIC8vIEZpbHRlciBpZiBub3QgZW5vdWdoIGNoYXJhY3RlclxuICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZS5sZW5ndGggPj0gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkKSxcbiAgICAgICAgICAvLyBXYWl0IGEgZGVib3VuY2UgdGltZVxuICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZSlcbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vdGFwKCh2YWx1ZSkgPT4gY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgU2VhcmNoIHRleHQgY2hhbmdlczonLCB2YWx1ZSkpLFxuICAgICAgICApLFxuXG4gICAgICAvLyBPYmplY3Qgc2V0OiB1c2UgaXQgKG5vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgcGlwZSBuZWVkKVxuICAgICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3RhcnRXaXRoPGFueSwgYW55Pih0aGlzLmZvcm1Db250cm9sLnZhbHVlKSxcbiAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gKHRoaXMuc2VhcmNoYWJsZSAmJiBpc05vdE5pbCh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykpLFxuICAgICAgICAgIHRhcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBvYmplY3QgY2hhbmdlczonLCB2YWx1ZSlcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5IHZhbHVlIChpZiBuZWVkKVxuICAgICAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gdGhpcy5kaXNwbGF5V2l0aCh2YWx1ZSkgfHwgJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5VmFsdWUgIT09IGRpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IGRpc3BsYXlWYWx1ZTtcblxuICAgICAgICAgICAgICAvLyBBcHBseSB0byB0aGUgaW5wdXRbdHlwZT10ZXh0XSBmaWVsZFxuICAgICAgICAgICAgICBpZiAodGhpcy5tYXRJbnB1dFRleHQgJiYgdGhpcy5tYXRJbnB1dFRleHQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF0SW5wdXRUZXh0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLmRpc3BsYXlWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvL3RhcCh2YWx1ZSA9PiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBhbiBvYmplY3QgdmFsdWU6ICcsIHZhbHVlKSlcbiAgICAgICAgKSxcblxuICAgICAgLy8gTWVyZ2Ugc29tZSBvYnNlcnZhYmxlcywgd2l0aCBhIGNvbW1vbiBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIHBpcGUsIGFuZCBOTyBkZWJvdW5jZVRpbWVcbiAgICAgIG1lcmdlKFxuICAgICAgICAvLyBGb2N1cyBvciBjbGljayA9PiBMb2FkIGFsbFxuICAgICAgICBtZXJnZSh0aGlzLmZvY3VzZWQsIHRoaXMuY2xpY2tlZClcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIGZpbHRlcihfID0+IHRoaXMuZW5hYmxlZCAmJiB0aGlzLnNlYXJjaGFibGUpLFxuICAgICAgICAgICAgbWFwKF8gPT4gdGhpcy5zaG93QWxsT25Gb2N1cyA/ICcqJyA6IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpXG4gICAgICAgICAgKSxcbiAgICAgICAgLy8gT24gZHJvcGRvd24gYnV0dG9uIGNsaWNrXG4gICAgICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gdGhpcy5zZWFyY2hhYmxlICYmIHRoaXMuZW5hYmxlZCAmJiAoIWV2ZW50IHx8ICFldmVudC5kZWZhdWx0UHJldmVudGVkKSksXG4gICAgICAgICAgICBtYXAoXyA9PiB0aGlzLnNob3dBbGxPbkZvY3VzID8gJyonIDogdGhpcy5mb3JtQ29udHJvbC52YWx1ZSlcbiAgICAgICAgICApLFxuICAgICAgICBtZXJnZSh0aGlzLiRpbnB1dEl0ZW1zLCB0aGlzLl8kZmlsdGVyKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKF8gPT4gdGhpcy5zZWFyY2hhYmxlICYmIHRoaXMuZW5hYmxlZCksXG4gICAgICAgICAgICBtYXAoXyA9PiB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSxcblxuICAgICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAgIC8vdGFwKHZhbHVlID0+IGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkICRpbnB1dEl0ZW1zIG9yIGZpbHRlciBldmVudDogJywgdmFsdWUpKVxuICAgICAgICAgIClcbiAgICAgIClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gU3RhcnQgdG8gc3VnZ2VzdCB3aGVuIDpcbiAgICAgICAgICAvLyAtICcqJ1xuICAgICAgICAgIC8vIC0gaXMgbmlsLCBhbmQgdGhlcmUgaXMgbm8gbWluIGxlbmd0aCB0aHJlc2hvbGRcbiAgICAgICAgICAvLyAtIGlzIG5vdCBuaWwgYW5kIG5vdCBhIHN0cmluZyB0eXBlIChlLmcuIG9iamVjdClcbiAgICAgICAgICAvLyAtIGlzIG5vdCBuaWwgYW5kIGlzIGEgc3RyaW5nLCBhbmQgaGFzIGVub3VnaCBjaGFyYWN0ZXJcbiAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gdmFsdWUgPT09ICcqJ1xuICAgICAgICAgICAgfHwgKGlzTmlsKHZhbHVlKVxuICAgICAgICAgICAgICA/ICh0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPD0gMClcbiAgICAgICAgICAgICAgOiAoISh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIHx8IHZhbHVlLmxlbmd0aCA+PSB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICAvLyBEaXN0aW5ndWlzaCBjaGFuZ2VzXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vdGFwKHZhbHVlID0+IGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIHVwZGF0ZSBldmVudDogJywgdmFsdWUpKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAucGlwZShcblxuICAgICAgICAvLyBTdWdnZXN0IHZhbHVlc1xuICAgICAgICBtZXJnZU1hcCh2YWx1ZSA9PiB0aGlzLnN1Z2dlc3QodmFsdWUsIHRoaXMuZmlsdGVyKSksXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vdGFwKGl0ZW1zID0+IGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGZyb20gc3VnZ2VzdDogJywgaXRlbXMpKSxcblxuICAgICAgICAvLyBTdG9yZSBpbXBsaWNpdCB2YWx1ZSAod2lsbCB1c2UgaXQgb25CbHVyIGlmIG5vdCBvdGhlciB2YWx1ZSBzZWxlY3RlZClcbiAgICAgICAgdGFwKGl0ZW1zID0+IHRoaXMudXBkYXRlSW1wbGljaXRWYWx1ZShpdGVtcykpXG4gICAgICApO1xuXG4gICAgLy8gRmV0Y2ggbW9yZSBldmVudHNcbiAgICBjb25zdCBmZXRjaE1vcmVJdGVtc0NoYW5nZXMgPSB0aGlzLl9mZXRjaE1vcmUkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKGV2ZW50ID0+IGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpKSwgLy8gQXZvaWQgdG8gY2xvc2UgdGhlIG1hdC1zZWxlY3RcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuY2FuRmV0Y2hNb3JlKSxcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4gdGhpcy5mZXRjaE1vcmUoKSksXG5cbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy90YXAobW9yZUl0ZW1zID0+IGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGZyb20gZmV0Y2ggTW9yZTogJywgbW9yZUl0ZW1zKSksXG5cbiAgICAgICAgLy8gQ29uY2F0IHRvIGV4aXN0aW5nIGl0ZW1zXG4gICAgICAgIG1hcChtb3JlSXRlbXMgPT4gKHRoaXMuJGZpbHRlcmVkSXRlbXMudmFsdWUgfHwgW10pLmNvbmNhdChtb3JlSXRlbXMpKVxuICAgICAgKTtcblxuICAgIC8vIFVwZGF0ZSBmaWx0ZXJlZCBpdGVtc1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBtZXJnZShcbiAgICAgICAgdGhpcy4kaW5wdXRJdGVtcyxcblxuICAgICAgICAvLyBVcGRhdGUgaXRlbXMgZXZlbnRzXG4gICAgICAgIGZpbHRlcmVkSXRlbXNDaGFuZ2VzLFxuXG4gICAgICAgIC8vIEZldGNoIG1vcmUgZXZlbnRzXG4gICAgICAgIGZldGNoTW9yZUl0ZW1zQ2hhbmdlc1xuICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKGl0ZW1zID0+IHtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgY29udHJvbCB2YWx1ZSBpcyBpbnNpZGUgKG1hdC1zZWxlY3QpXG4gICAgICAgICAgaWYgKGl0ZW1zICYmICF0aGlzLnNlYXJjaGFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGlmIChpc05vdE5pbCh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBpdGVtcy5maW5kSW5kZXgoaXRlbSA9PiB0aGlzLmVxdWFscyhpdGVtLCB2YWx1ZSkpID09PSAtMSkge1xuICAgICAgICAgICAgICAvLyBJZiBmb3JtIHZhbHVlIGlzIG1pc3Npbmc6IGFkZCBpdCB0byB0aGUgbGlzdFxuICAgICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEVtaXQgaXRlbXNcbiAgICAgICAgICB0aGlzLiRmaWx0ZXJlZEl0ZW1zLm5leHQoaXRlbXMpO1xuICAgICAgICB9KSk7XG5cbiAgICAvLyBBcHBseWluZyBpbXBsaWNpdCB2YWx1ZSwgb24gYmx1clxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmJsdXJyZWRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gU2tpcCBpZiBub3Qgc2VhcmNoYWJsZVxuICAgICAgICAgIGZpbHRlcihfID0+IHRoaXMuc2VhcmNoYWJsZSksXG4gICAgICAgICAgbWFwKF8gPT4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAvLyBXaGVuIGxlYXZlIGNvbXBvbmVudCB3aXRob3V0IG9iamVjdCwgdXNlIGltcGxpY2l0IHZhbHVlIGlmIDpcbiAgICAgICAgICAvLyAtIGFuIGV4cGxpY2l0IHZhbHVlXG4gICAgICAgICAgLy8gLSBmaWVsZCBpcyBub3QgZW1wdHkgKHVzZXIgZmlsbCBzb21ldGhpbmcpXG4gICAgICAgICAgLy8gLSBPUiBmaWVsZCBlbXB0eSBidXQgaXMgcmVxdWlyZWRcbiAgICAgICAgICBpZiAodGhpcy5faW1wbGljaXRWYWx1ZSAmJiAoKHRoaXMucmVxdWlyZWQgJiYgaXNOaWxPckJsYW5rKHZhbHVlKSkgfHwgKGlzTm90TmlsT3JCbGFuayh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykpKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5faW1wbGljaXRWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1BlbmRpbmcoe2VtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlfSk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrSWZUb3VjaGVkKCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc05pbE9yQmxhbmsodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1BlbmRpbmcoe2VtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlfSk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrSWZUb3VjaGVkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSBudWxsOyAvLyByZXNldCB0aGUgaW1wbGljaXQgdmFsdWVcbiAgICAgICAgfSkpO1xuXG4gICAgLy8gTGlzdGVuIGZvcm0gY29udHJvbCBzdGF0dXMgY2hhbmdlXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICAvL2ZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IHN0YXRlXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVja0lmVG91Y2hlZCgpKVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5rZXlkb3duRXNjYXBlLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIENsb3NpbmcgdGhlIHBhbmVsIChrZXlkb3duLmVzY2FwZSlcIik7XG5cbiAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLiRpbnB1dEl0ZW1zLmNvbXBsZXRlKCk7XG4gICAgdGhpcy4kZmlsdGVyZWRJdGVtcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3JlbG9hZCQuY29tcGxldGUoKTtcbiAgICB0aGlzLl8kZmlsdGVyLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLmRyb3BCdXR0b25DbGljay5jb21wbGV0ZSgpO1xuICAgIHRoaXMuY2xpY2tlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuYmx1cnJlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZm9jdXNlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMua2V5ZG93bkVzY2FwZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMua2V5dXBFbnRlci5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2ZldGNoTW9yZSQuY29tcGxldGUoKTtcblxuICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9IG51bGw7XG4gICAgdGhpcy5kaXNwbGF5V2l0aCA9IG51bGw7XG4gICAgdGhpcy5lcXVhbHMgPSBudWxsO1xuICAgIHRoaXMuc3VnZ2VzdEZuID0gbnVsbDtcbiAgICB0aGlzLiRmaWx0ZXJlZEl0ZW1zID0gbnVsbDtcbiAgICB0aGlzLm1hdFNlbGVjdEl0ZW1zJCA9IG51bGw7XG4gICAgdGhpcy5jb25maWcgPSBudWxsO1xuICAgIHRoaXMuY2xhc3NMaXN0ID0gbnVsbDtcblxuICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gbnVsbDtcblxuICAgIC8vIERlc3Ryb3kgdGhlICdhdXRvY29tcGxldGUnIGluc3RhbmNlLCB0byBhdm9pZCBtZW1vcnkgbGVha1xuICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZSkge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZS5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byByZWxvYWQgY29udGVudC4gVXNlZnVsIHdoZW4gZmlsdGVyIGhhcyBiZWVuIGNoYW5nZWQgYnV0IG5vdCBkZXRlY3RlZFxuICAgKi9cbiAgcmVsb2FkSXRlbXModmFsdWU/OiBhbnkpIHtcbiAgICAvLyBGb3JjZSBhIHJlZnJlc2hcbiAgICB0aGlzLl9yZWxvYWQkLm5leHQodmFsdWUgfHwgJyonKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIERFQlVHXG4gICAgLy8gY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFdyaXRpbmcgdmFsdWU6IFwiLCB2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUgIT09IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGlzRGlzYWJsZWQgJiYgdGhpcy5hdXRvY29tcGxldGU/LmlzT3Blbikge1xuICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBmb2N1cygpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hhYmxlKSB7XG4gICAgICBmb2N1c0lucHV0KHRoaXMubWF0SW5wdXRUZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXRTZWxlY3Q/LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVySW5wdXRUZXh0Rm9jdXNFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuXG4gICAgLy8gSWdub3JlIGV2ZW50IGZyb20gbWF0LW9wdGlvblxuICAgIGlmIChldmVudC5yZWxhdGVkVGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgZXZlbnQucmVsYXRlZFRhcmdldC50YWdOYW1lID09PSAnTUFULU9QVElPTicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAvL0RFQlVHIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIENhbmNlbGxpbmcgZm9jdXMgZXZlbnQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNDb250ZW50ID0gc2VsZWN0SW5wdXRDb250ZW50KGV2ZW50KTtcblxuICAgIC8vIElmIGNvbWJvIGlzIGVtcHR5LCBvciBpZiBoYXMgY29udGVudCBidXQgc2hvdWxkIGZvcmNlIHRvIHNob3cgcGFuZWwgb24gZm9jdXNcbiAgICBpZiAoIWhhc0NvbnRlbnQgfHwgKHRoaXMuc2hvd1BhbmVsT25Gb2N1cyAmJiB0aGlzLnNob3dBbGxPbkZvY3VzKSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgRW1pdCBmb2N1cyBldmVudCcpO1xuICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZpbHRlcklucHV0VGV4dEJsdXJFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuXG4gICAgLy8gSWdub3JlIGV2ZW50IGZyb20gbWF0LW9wdGlvblxuICAgIGlmIChldmVudC5yZWxhdGVkVGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgZXZlbnQucmVsYXRlZFRhcmdldC50YWdOYW1lID09PSAnTUFULU9QVElPTicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAvL0RFQlVHIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBDYW5jZWxsaW5nIGJsdXIgZXZlbnRcIik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9ERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgQmx1cjogbW92ZSBjYXJldCB0byB0aGUgYmVnaW5uaW5nJyk7XG5cbiAgICAvLyBNb3ZlIGNhcmV0IHRvIHRoZSBiZWdpbm5pbmcgKGZpeCBpc3N1ZSBJTUFHSU5FLTQ2OSlcbiAgICBzZWxlY3RJbnB1dFJhbmdlKGV2ZW50LnRhcmdldCBhcyBhbnksIDAsIDApO1xuXG4gICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZmlsdGVyTWF0U2VsZWN0Rm9jdXNFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgIC8vIERFQlVHXG4gICAgLy8gY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFJlY2VpdmVkIDxtYXQtc2VsZWN0PiBmb2N1cyBldmVudFwiLCBldmVudCk7XG4gICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgZmlsdGVyTWF0U2VsZWN0Qmx1ckV2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICAvLyBERUJVR1xuICAgIC8vIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBSZWNlaXZlZCA8bWF0LXNlbGVjdD4gYmx1ciBldmVudFwiLCBldmVudCk7XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvLyBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgQ2FuY2VsbGluZyA8bWF0LXNlbGVjdD4gYmx1ciBldmVudFwiKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmJsdXJyZWQuZW1pdChldmVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0b2dnbGVTZWFyY2goZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICBjb25zdCBzZWFyY2hhYmxlID0gIXRoaXMuc2VhcmNoYWJsZTtcbiAgICBpZiAoc2VhcmNoYWJsZSAmJiB0aGlzLnNlYXJjaGFibGUgJiYgdGhpcy5tYXRJbnB1dFRleHQpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWFyY2hhYmxlID0gc2VhcmNoYWJsZTtcbiAgICAgIGlmIChzZWFyY2hhYmxlKSB7XG4gICAgICAgIHRoaXMuYXV0b2ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93UGFuZWxPbkZvY3VzID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyVmFsdWUoZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBfaW5pdEF1dG9jb21wbGV0ZUluZmluaXRlU2Nyb2xsKHRocmVzaG9sZD86IHN0cmluZykge1xuICAgIGlmICghdGhpcy5hdXRvY29tcGxldGUpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEluaXQgYXV0b2NvbXBsZXRlIHNjcm9sbCBsaXN0ZW5lcicpO1xuXG4gICAgaWYgKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3BlbmVkJDogT2JzZXJ2YWJsZTxhbnk+ID0gdGhpcy5hdXRvY29tcGxldGUuX2lzT3BlblxuICAgICAgPyB0aW1lcigwKVxuICAgICAgOiB0aGlzLmF1dG9jb21wbGV0ZS5vcGVuZWQucGlwZShkZWJvdW5jZVRpbWUoMjAwKSk7XG4gICAgY29uc3Qgc2Nyb2xsRW5kJCA9IG9wZW5lZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKF8pID0+IHRoaXMuZ2V0QXV0b2NvbXBsZXRlUGFuZWwoKSksXG4gICAgICAgIGZpbHRlcihpc05vdE5pbCksXG4gICAgICAgIHN3aXRjaE1hcCgocGFuZWwpID0+IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuYXV0b2NvbXBsZXRlLmNsb3NlZClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAvLyBUcmlnZ2VyIGZldGNoIG1vcmUsIGVuZCBlbmQgc2Nyb2xsIHJlYWNoZWRcbiAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24gPSBzY3JvbGxFbmQkXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2ZldGNoTW9yZSQuZW1pdCgpKTtcblxuICAgIC8vIFJlZ2lzdGVyIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIF9pbml0TWF0U2VsZWN0SW5maW5pdGVTY3JvbGwodGhyZXNob2xkPzogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLm1hdFNlbGVjdCkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgSW5pdCBtYXQtc2VsZWN0IHNjcm9sbCBsaXN0ZW5lcicpO1xuXG4gICAgaWYgKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3BlbmVkJDogT2JzZXJ2YWJsZTxhbnk+ID0gdGhpcy5tYXRTZWxlY3QucGFuZWxPcGVuXG4gICAgICA/IHRpbWVyKDApXG4gICAgICA6IHRoaXMubWF0U2VsZWN0Ll9vcGVuZWRTdHJlYW0ucGlwZShkZWJvdW5jZVRpbWUoMjAwKSk7XG4gICAgY29uc3Qgc2Nyb2xsRW5kJCA9IG9wZW5lZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKF8pID0+IHRoaXMuZ2V0TWF0U2VsZWN0UGFuZWwoKSksXG4gICAgICAgIGZpbHRlcihpc05vdE5pbCksXG4gICAgICAgIHN3aXRjaE1hcCgocGFuZWwpID0+IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubWF0U2VsZWN0Ll9jbG9zZWRTdHJlYW0pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApO1xuXG4gICAgLy8gVHJpZ2dlciBmZXRjaCBtb3JlLCBlbmQgZW5kIHNjcm9sbCByZWFjaGVkXG4gICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uID0gc2Nyb2xsRW5kJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihfID0+IHRoaXMuX21vcmVJdGVtc0NvdW50ID4gMClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZmV0Y2hNb3JlJC5lbWl0KCkpO1xuXG4gICAgLy8gUmVnaXN0ZXIgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuc2VhcmNoYWJsZSAmJiB0aGlzLmF1dG9jb21wbGV0ZT8uaXNPcGVuKVxuICAgICAgfHwgKHRoaXMubWF0U2VsZWN0Py5wYW5lbE9wZW4pXG4gICAgICB8fCBmYWxzZTtcbiAgfVxuXG4gIGNsb3NlUGFuZWwoKSB7XG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlcj8uY2xvc2VQYW5lbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRTZWxlY3Q/LnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5tYXRTZWxlY3Q/LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyogLS0gcHJpdmF0ZSBtZXRob2QgLS0gKi9cblxuICBwcml2YXRlIGFzeW5jIHN1Z2dlc3QodmFsdWU6IGFueSwgZmlsdGVyPzogYW55KTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGxldCByZXMgPSBhd2FpdCB0aGlzLnN1Z2dlc3RGbih2YWx1ZSwgZmlsdGVyKTtcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBGaWx0ZXJlZCBpdGVtcyBieSBzdWdnZXN0Rm46JywgdmFsdWUsIHJlcyk7XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IDA7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAwO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IChyZXMgYXMgYW55W10pLmxlbmd0aCB8fCAwO1xuICAgICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCB7ZGF0YSwgdG90YWwsIGZldGNoTW9yZX0gPSByZXMgYXMgTG9hZFJlc3VsdDxhbnk+O1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gdG9OdW1iZXIodG90YWwsIGRhdGEgJiYgZGF0YS5sZW5ndGggfHwgMCk7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gZmV0Y2hNb3JlO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSBmZXRjaE1vcmUgJiYgKHRoaXMuX2l0ZW1Db3VudCAtIGRhdGEubGVuZ3RoKSB8fCAwO1xuICAgICAgcmVzID0gZGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcyBhcyBhbnlbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hNb3JlKCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoIXRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2spIHJldHVybiBbXTtcblxuICAgIC8vIFNhdmUgdGhlbiByZW1vdmUgZmV0Y2ggZnVuY3Rpb24gKHRvIGF2b2lkIG11bHRpLWNhbGwpXG4gICAgY29uc3QgZmV0Y2hNb3JlRm4gPSB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrO1xuICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB7ZGF0YSwgdG90YWwsIGZldGNoTW9yZX0gPSBhd2FpdCBmZXRjaE1vcmVGbigpO1xuICAgIHRoaXMuX2l0ZW1Db3VudCA9IHRvdGFsIHx8IHRoaXMuX2l0ZW1Db3VudDtcbiAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gZmV0Y2hNb3JlO1xuICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gTWF0aC5tYXgoMCwgdGhpcy5fbW9yZUl0ZW1zQ291bnQgLSBkYXRhLmxlbmd0aCk7IC8vIEJvcm5lIG1pbiA9IDBcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW1wbGljaXRWYWx1ZShpdGVtczogYW55W10pIHtcbiAgICBpZiAodGhpcy5zZWFyY2hhYmxlKSB7XG4gICAgICAvLyBTdG9yZSBpbXBsaWNpdCB2YWx1ZSAod2lsbCB1c2UgaXQgb25CbHVyIGlmIG5vdCBvdGhlciB2YWx1ZSBzZWxlY3RlZClcbiAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IGl0ZW1zWzBdO1xuICAgICAgICAvL3RoaXMuZm9ybUNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZUb3VjaGVkKCkge1xuICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnRvdWNoZWQpIHtcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXV0b2NvbXBsZXRlUGFuZWwoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGVsZSA9IHRoaXMuYXV0b2NvbXBsZXRlPy5vcHRpb25zLmxhc3Q/Ll9nZXRIb3N0RWxlbWVudCgpLnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKCFlbGUpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICBjb25zb2xlLndhcm4odGhpcy5sb2dQcmVmaXggKyAnIFVuYWJsZSB0byBmaW5kIHRoZSBhdXRvY29tcGxldGUgZGl2Li4uJyk7XG4gICAgfVxuICAgIHJldHVybiBlbGU7XG4gIH1cblxuICBwcml2YXRlIGdldE1hdFNlbGVjdFBhbmVsKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBlbGUgPSB0aGlzLm1hdFNlbGVjdC5vcHRpb25zLmxhc3Q/Ll9nZXRIb3N0RWxlbWVudCgpLnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKCFlbGUpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICBjb25zb2xlLndhcm4odGhpcy5sb2dQcmVmaXggKyAnIFVuYWJsZSB0byBmaW5kIHRoZSBtYXQtc2VsZWN0IGNvbnRhaW5lci4uLicpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0FzTG9hZGluZygpIHtcbiAgICBpZiAodGhpcy4kZmlsdGVyZWRJdGVtcy52YWx1ZSkge1xuICAgICAgdGhpcy4kZmlsdGVyZWRJdGVtcy5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLl9pdGVtQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gMDtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==
|
|
752
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuYXV0b2NvbXBsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL21hdGVyaWFsLmF1dG9jb21wbGV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsVUFBVSxFQUFlLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUwsT0FBTyxFQUFvQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hHLE9BQU8sRUFBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNwRyxPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxSSxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbEwsT0FBTyxFQUFDLFVBQVUsRUFBb0MsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDNUYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFJckQsT0FBTyxFQUFDLGVBQWUsRUFBRSxzQkFBc0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZGLE9BQU8sRUFB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QkFBc0I7cUJBbUNoQyxLQUFLO3VCQVlMLEtBQUs7dUJBU0wsS0FBSztvQkFTTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cERpcmVjdGl2ZSwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBpc09ic2VydmFibGUsIG1lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRpbWVyfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIG1lcmdlTWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YWtlV2hpbGUsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtGZXRjaE1vcmVGbiwgTG9hZFJlc3VsdCwgU3VnZ2VzdEZuLCBTdWdnZXN0U2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlLCBpc05pbCwgaXNOaWxPckJsYW5rLCBpc05vdE5pbCwgaXNOb3ROaWxPckJsYW5rLCBpc05vdE5pbFN0cmluZywgam9pblByb3BlcnRpZXNQYXRoLCBzdWdnZXN0RnJvbUFycmF5LCB0b0Jvb2xlYW4sIHRvTnVtYmVyfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHtmb2N1c0lucHV0LCBJbnB1dEVsZW1lbnQsIHNlbGVjdElucHV0Q29udGVudCwgc2VsZWN0SW5wdXRSYW5nZX0gZnJvbSAnLi4vLi4vaW5wdXRzJztcbmltcG9ydCB7Zmlyc3ROb3ROaWxQcm9taXNlfSBmcm9tICcuLi8uLi9vYnNlcnZhYmxlcyc7XG5pbXBvcnQge0Rpc3BsYXlGbiwgRXF1YWxzRm59IGZyb20gJy4uLy4uL2Zvcm0vZmllbGQubW9kZWwnO1xuaW1wb3J0IHtGbG9hdExhYmVsVHlwZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQge01hdFNlbGVjdH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHtmcm9tU2Nyb2xsRW5kRXZlbnR9IGZyb20gJy4uLy4uL2V2ZW50cyc7XG5cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnPFQgPSBhbnksIEYgPSBhbnk+IHtcbiAgYXR0cmlidXRlczogc3RyaW5nW107XG4gIHN1Z2dlc3RGbj86ICh2YWx1ZTogYW55LCBvcHRpb25zPzogYW55KSA9PiBQcm9taXNlPFRbXSB8IExvYWRSZXN1bHQ8VD4+O1xuICBmaWx0ZXI/OiBQYXJ0aWFsPEY+O1xuICBpdGVtcz86IE9ic2VydmFibGU8VFtdPiB8IFRbXTtcbiAgY29sdW1uU2l6ZXM/OiAobnVtYmVyIHwgJ2F1dG8nIHwgdW5kZWZpbmVkKVtdO1xuICBjb2x1bW5OYW1lcz86IChzdHJpbmcgfCB1bmRlZmluZWQpW107XG4gIGRpc3BsYXlXaXRoPzogRGlzcGxheUZuO1xuICBlcXVhbHM/OiBFcXVhbHNGbjsgLy8gVXNlZCBieSA8bWF0LWNoaXBzLWZpZWxkPlxuICBzaG93QWxsT25Gb2N1cz86IGJvb2xlYW47XG4gIHNob3dQYW5lbE9uRm9jdXM/OiBib29sZWFuO1xuICBjbGFzcz86IHN0cmluZztcbiAgbW9iaWxlPzogYm9vbGVhbjtcbiAgZGVib3VuY2VUaW1lPzogbnVtYmVyO1xuICBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkPzogbnVtYmVyO1xuICBoaWdobGlnaHRBY2NlbnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgTWF0QXV0b2NvbXBsZXRlRmllbGRBZGRPcHRpb25zPFQgPSBhbnksIEYgPSBhbnk+IGV4dGVuZHMgUGFydGlhbDxNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZzxULCBGPj4ge1xuICBzZXJ2aWNlPzogU3VnZ2VzdFNlcnZpY2U8VCwgRj47XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRBdXRvY29tcGxldGVDb25maWdIb2xkZXIge1xuICBmaWVsZHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZztcbiAgfSA9IHt9O1xuXG4gIGdldFVzZXJBdHRyaWJ1dGVzOiAoZmllbGROYW1lOiBzdHJpbmcsIGRlZmF1bHRBdHRyaWJ1dGVzPzogc3RyaW5nW10pID0+IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb3B0aW9ucz86IHtcbiAgICBnZXRVc2VyQXR0cmlidXRlczogKGZpZWxkTmFtZTogc3RyaW5nLCBkZWZhdWx0QXR0cmlidXRlcz86IHN0cmluZ1tdKSA9PiBzdHJpbmdbXTtcbiAgfSkge1xuICAgIC8vIFN0b3JlIHRoZSBmdW5jdGlvbiBmcm9tIG9wdGlvbnMgKGUuZy4gZ2V0IGZyb20gdXNlciBzZXR0aW5ncylcbiAgICAvLyBvciBjcmVhdGUgYSBkZWZhdWx0IGZ1bmN0aW9uXG4gICAgdGhpcy5nZXRVc2VyQXR0cmlidXRlcyA9IG9wdGlvbnM/LmdldFVzZXJBdHRyaWJ1dGVzIHx8XG4gICAgICAoKGZpZWxkTmFtZSwgZGVmYXVsdEF0dHJpYnV0ZXMpID0+IGRlZmF1bHRBdHRyaWJ1dGVzIHx8IFsnbGFiZWwnLCAnbmFtZSddKTtcbiAgfVxuXG4gIGFkZDxUID0gYW55LCBGID0gYW55PihmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9ucz86IE1hdEF1dG9jb21wbGV0ZUZpZWxkQWRkT3B0aW9uczxULCBGPik6IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnPFQsIEY+IHtcbiAgICBpZiAoIWZpZWxkTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gYWRkIGNvbmZpZywgd2l0aCBuYW1lOiAnICsgKGZpZWxkTmFtZSB8fCAndW5kZWZpbmVkJykpO1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCA8TWF0QXV0b2NvbXBsZXRlRmllbGRBZGRPcHRpb25zPnt9O1xuICAgIGNvbnN0IHN1Z2dlc3RGbjogU3VnZ2VzdEZuPFQsIEY+ID0gb3B0aW9ucy5zdWdnZXN0Rm5cbiAgICAgIHx8IChvcHRpb25zLnNlcnZpY2UgJiYgKCh2LCBmKSA9PiBvcHRpb25zLnNlcnZpY2Uuc3VnZ2VzdCh2LCBmKSkpXG4gICAgICB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9ICh0aGlzLmdldFVzZXJBdHRyaWJ1dGVzKGZpZWxkTmFtZSwgb3B0aW9ucy5hdHRyaWJ1dGVzKSB8fCBbJ2xhYmVsJywgJ25hbWUnXSk7XG4gICAgLy8gS2VlcCBvcmlnaW5hbCB0aGUgZnVuY3Rpb24gZnJvbSBvcHRpb25zLCB3aGVuIGV4aXN0c1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNPckZuID0gYXR0cmlidXRlcy5tYXAoKGEsIGluZGV4KSA9PiB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyAmJiBvcHRpb25zLmF0dHJpYnV0ZXNbaW5kZXhdIHx8IGEpO1xuICAgIGNvbnN0IGZpbHRlcjogUGFydGlhbDxGPiA9IHtcbiAgICAgIHNlYXJjaEF0dHJpYnV0ZTogYXR0cmlidXRlcy5sZW5ndGggPT09IDEgPyBhdHRyaWJ1dGVzWzBdIDogdW5kZWZpbmVkLFxuICAgICAgc2VhcmNoQXR0cmlidXRlczogYXR0cmlidXRlcy5sZW5ndGggPiAxID8gYXR0cmlidXRlcyA6IHVuZGVmaW5lZCxcbiAgICAgIC4uLm9wdGlvbnMuZmlsdGVyXG4gICAgfTtcbiAgICBjb25zdCBkaXNwbGF5V2l0aCA9IG9wdGlvbnMuZGlzcGxheVdpdGggfHwgKChvYmopID0+IG9iaiAmJiBqb2luUHJvcGVydGllc1BhdGgob2JqLCBhdHRyaWJ1dGVzKSk7XG4gICAgY29uc3QgZXF1YWxzID0gb3B0aW9ucy5lcXVhbHMgfHwgKChvMTogYW55LCBvMjogYW55KSA9PiBvMSAmJiBvMiAmJiBvMS5pZCA9PT0gbzIuaWQpO1xuXG4gICAgY29uc3QgY29uZmlnOiBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzT3JGbixcbiAgICAgIHN1Z2dlc3RGbixcbiAgICAgIGZpbHRlcixcbiAgICAgIGRpc3BsYXlXaXRoLFxuICAgICAgZXF1YWxzXG4gICAgfTtcblxuICAgIHRoaXMuZmllbGRzW2ZpZWxkTmFtZV0gPSBjb25maWc7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIGdldDxUID0gYW55PihmaWVsZE5hbWU6IHN0cmluZyk6IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnPFQ+IHtcbiAgICBpZiAoIWZpZWxkTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gYWRkIGNvbmZpZywgd2l0aCBuYW1lOiAnICsgKGZpZWxkTmFtZSB8fCAndW5kZWZpbmVkJykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maWVsZHNbZmllbGROYW1lXSB8fCB0aGlzLmFkZChmaWVsZE5hbWUpIGFzIE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnPFQ+O1xuICB9XG59XG5cbmNvbnN0IG5vb3AgPSAoXz86IGFueSkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ21hdC1hdXRvY29tcGxldGUtZmllbGQnLFxuICBzdHlsZVVybHM6IFsnLi9tYXRlcmlhbC5hdXRvY29tcGxldGUuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0ZXJpYWwuYXV0b2NvbXBsZXRlLmh0bWwnLFxuICBwcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgbXVsdGk6IHRydWUsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0QXV0b2NvbXBsZXRlRmllbGQpXG4gIH1dLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNYXRBdXRvY29tcGxldGVGaWVsZCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dEVsZW1lbnQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuXG4gIEBJbnB1dCgpIGVxdWFsczogRXF1YWxzRm47XG4gIEBJbnB1dCgpIGxvZ1ByZWZpeCA9ICdbbWF0LWF1dG9jb21wbGV0ZV0gJztcbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuICBASW5wdXQoKSBmb3JtQ29udHJvbE5hbWU6IHN0cmluZyA9IG51bGw7XG4gIEBJbnB1dCgpIGZsb2F0TGFiZWw6IEZsb2F0TGFiZWxUeXBlO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBzdWdnZXN0Rm46IFN1Z2dlc3RGbjxhbnksIGFueT47XG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgY2xlYXJhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRlYm91bmNlVGltZTogbnVtYmVyID0gbnVsbDtcbiAgQElucHV0KCkgZGlzcGxheVdpdGg6IERpc3BsYXlGbiB8IG51bGw7XG4gIEBJbnB1dCgpIGRpc3BsYXlBdHRyaWJ1dGVzOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgZGlzcGxheUNvbHVtblNpemVzOiAobnVtYmVyIHwgJ2F1dG8nIHwgdW5kZWZpbmVkKVtdO1xuICBASW5wdXQoKSBkaXNwbGF5Q29sdW1uTmFtZXM6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBoaWdobGlnaHRBY2NlbnQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNob3dBbGxPbkZvY3VzOiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93UGFuZWxPbkZvY3VzOiBib29sZWFuO1xuICBASW5wdXQoKSBhdXRvZm9jdXM6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNvbmZpZzogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc7XG4gIEBJbnB1dCgpIGkxOG5QcmVmaXggPSAnUkVGRVJFTlRJQUwuJztcbiAgQElucHV0KCkgbm9SZXN1bHRNZXNzYWdlID0gJ0NPTU1PTi5OT19SRVNVTFQnO1xuICBASW5wdXQoJ2NsYXNzJykgY2xhc3NMaXN0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhbmVsV2lkdGg6IHN0cmluZztcbiAgQElucHV0KCkgbWF0QXV0b2NvbXBsZXRlUG9zaXRpb246ICdhdXRvJyB8ICdhYm92ZScgfCAnYmVsb3cnO1xuICBASW5wdXQoKSBtdWx0aXBsZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGl0ZW1TaXplID0gJzQ4cHgnO1xuICBASW5wdXQoKSBmZXRjaE1vcmVUaHJlc2hvbGQ6IHN0cmluZyA9ICcxNSUnO1xuICBASW5wdXQoKSBzdWdnZXN0TGVuZ3RoVGhyZXNob2xkOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBzaG93TG9hZGluZ1NwaW5uZXIgPSB0cnVlO1xuICBASW5wdXQoKSBkZWJ1ZyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoJ2NsaWNrJykgY2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgQE91dHB1dCgnYmx1cicpIGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIEBPdXRwdXQoJ2ZvY3VzJykgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyb3BCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VUlFdmVudD4odHJ1ZSk7XG4gIEBPdXRwdXQoJ2tleWRvd24uZXNjYXBlJykga2V5ZG93bkVzY2FwZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdrZXl1cC5lbnRlcicpIGtleXVwRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKCdtYXRTZWxlY3QnKSBtYXRTZWxlY3Q6IE1hdFNlbGVjdDtcbiAgQFZpZXdDaGlsZCgnbWF0SW5wdXRUZXh0JykgbWF0SW5wdXRUZXh0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZSkgYXV0b2NvbXBsZXRlOiBNYXRBdXRvY29tcGxldGU7XG4gIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcikgYXV0b2NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcblxuICBfcmVhZG9ubHkgPSBmYWxzZTtcbiAgX3RhYmluZGV4OiBudW1iZXI7XG4gIG1hdFNlbGVjdEl0ZW1zJDogT2JzZXJ2YWJsZTxhbnlbXT47XG4gICRpbnB1dEl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcbiAgJGZpbHRlcmVkSXRlbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xuICBzZWFyY2hhYmxlOiBib29sZWFuO1xuICBkaXNwbGF5VmFsdWUgPSAnJztcbiAgX21vcmVJdGVtc0NvdW50OiBudW1iZXI7XG4gIF9mZXRjaE1vcmUkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcblxuICBwcml2YXRlIF9vbkZldGNoTW9yZUNhbGxiYWNrOiBGZXRjaE1vcmVGbjxMb2FkUmVzdWx0PGFueT4+O1xuICBwcml2YXRlIF9pbXBsaWNpdFZhbHVlOiBhbnk7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBfaXRlbXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfb3BlbmVkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgXyRmaWx0ZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfaXRlbUNvdW50OiBudW1iZXI7XG4gIHByaXZhdGUgX3JlbG9hZCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlXG4gICkge1xuICB9XG5cbiAgZ2V0IGl0ZW1Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pdGVtQ291bnQ7XG4gIH1cblxuICBnZXQgY2FuRmV0Y2hNb3JlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrICYmIHRoaXMuX21vcmVJdGVtc0NvdW50ID4gMDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmaWx0ZXIodmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fJGZpbHRlci52YWx1ZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFNldHRpbmcgZmlsdGVyOlwiLCB2YWx1ZSk7XG4gICAgICB0aGlzLl8kZmlsdGVyLm5leHQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmaWx0ZXIoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fJGZpbHRlci52YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFiaW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RhYmluZGV4ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBpdGVtcyh2YWx1ZTogT2JzZXJ2YWJsZTxhbnlbXT4gfCBhbnlbXSkge1xuICAgIC8vIFJlbW92ZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gb24gaXRlbXMsIChpZiBleGl0cylcbiAgICBpZiAodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgSXRlbXMgcmVjZWl2ZWQgdHdpY2UgIScpO1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZSh0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbik7XG4gICAgICB0aGlzLl9pdGVtc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmIChpc09ic2VydmFibGU8YW55W10+KHZhbHVlKSkge1xuICAgICAgdGhpcy5faXRlbXNTdWJzY3JpcHRpb24gPSB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICB2YWx1ZS5zdWJzY3JpYmUodiA9PiB7XG4gICAgICAgICAgLy9jb25zb2xlLndhcm4odGhpcy5sb2dQcmVmaXggKyBcIiBSZWNlaXZlZCBpdGVtczogXCIsIHYpO1xuICAgICAgICAgIHRoaXMuJGlucHV0SXRlbXMubmV4dCh2KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy4kaW5wdXRJdGVtcy52YWx1ZSkge1xuICAgICAgICB0aGlzLiRpbnB1dEl0ZW1zLm5leHQodmFsdWUgYXMgYW55W10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBpdGVtcygpOiBPYnNlcnZhYmxlPGFueVtdPiB8IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy4kaW5wdXRJdGVtcztcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkb25seSB8fCB0aGlzLmZvcm1Db250cm9sLmRpc2FibGVkO1xuICB9XG5cbiAgZ2V0IGVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl9yZWFkb25seSAmJiB0aGlzLmZvcm1Db250cm9sLmVuYWJsZWQ7XG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOaWwodGhpcy4kZmlsdGVyZWRJdGVtcy52YWx1ZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZvcm1Db250cm9sID0gdGhpcy5mb3JtQ29udHJvbCB8fCB0aGlzLmZvcm1Db250cm9sTmFtZSAmJiB0aGlzLmZvcm1Hcm91cERpciAmJiB0aGlzLmZvcm1Hcm91cERpci5mb3JtLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgbWFuZGF0b3J5IGF0dHJpYnV0ZSBcXCdmb3JtQ29udHJvbFxcJyBvciBcXCdmb3JtQ29udHJvbE5hbWVcXCcgaW4gPG1hdC1hdXRvY29tcGxldGUtZmllbGQ+LicpO1xuXG4gICAgLy8gQ29uZmlndXJhdGlvbiBmcm9tIGNvbmZpZyBvYmplY3RcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuc3VnZ2VzdEZuID0gdGhpcy5zdWdnZXN0Rm4gfHwgdGhpcy5jb25maWcuc3VnZ2VzdEZuO1xuICAgICAgaWYgKCF0aGlzLnN1Z2dlc3RGbiAmJiB0aGlzLmNvbmZpZy5pdGVtcykge1xuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5jb25maWcuaXRlbXM7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZmlsdGVyIHx8IHRoaXMuY29uZmlnLmZpbHRlcjtcbiAgICAgIHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMgPSB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzIHx8IHRoaXMuY29uZmlnLmF0dHJpYnV0ZXM7XG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA9IHRoaXMuZGlzcGxheUNvbHVtblNpemVzIHx8IHRoaXMuY29uZmlnLmNvbHVtblNpemVzO1xuICAgICAgdGhpcy5kaXNwbGF5Q29sdW1uTmFtZXMgPSB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyB8fCB0aGlzLmNvbmZpZy5jb2x1bW5OYW1lcztcbiAgICAgIHRoaXMuZGlzcGxheVdpdGggPSB0aGlzLmRpc3BsYXlXaXRoIHx8IHRoaXMuY29uZmlnLmRpc3BsYXlXaXRoO1xuICAgICAgdGhpcy5lcXVhbHMgPSB0aGlzLmVxdWFscyB8fCB0aGlzLmNvbmZpZy5lcXVhbHM7XG4gICAgICB0aGlzLm1vYmlsZSA9IHRvQm9vbGVhbih0aGlzLm1vYmlsZSwgdGhpcy5jb25maWcubW9iaWxlKTtcbiAgICAgIHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCA9IHRvTnVtYmVyKHRoaXMuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCwgdGhpcy5jb25maWcuc3VnZ2VzdExlbmd0aFRocmVzaG9sZCB8fCAwKTtcbiAgICAgIHRoaXMuc2hvd0FsbE9uRm9jdXMgPSB0b0Jvb2xlYW4odGhpcy5zaG93QWxsT25Gb2N1cywgdG9Cb29sZWFuKHRoaXMuY29uZmlnLnNob3dBbGxPbkZvY3VzLCB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPD0gMCkpO1xuICAgICAgdGhpcy5zaG93UGFuZWxPbkZvY3VzID0gdG9Cb29sZWFuKHRoaXMuc2hvd1BhbmVsT25Gb2N1cywgdG9Cb29sZWFuKHRoaXMuY29uZmlnLnNob3dQYW5lbE9uRm9jdXMsIHRydWUpKTtcbiAgICAgIHRoaXMuY2xhc3NMaXN0ID0gdGhpcy5jbGFzc0xpc3QgfHwgdGhpcy5jb25maWcuY2xhc3M7XG4gICAgICB0aGlzLmRlYm91bmNlVGltZSA9IHRvTnVtYmVyKHRoaXMuZGVib3VuY2VUaW1lLCB0aGlzLmNvbmZpZy5kZWJvdW5jZVRpbWUpO1xuICAgICAgdGhpcy5oaWdobGlnaHRBY2NlbnQgPSAgdG9Cb29sZWFuKHRoaXMuaGlnaGxpZ2h0QWNjZW50LCB0b0Jvb2xlYW4odGhpcy5jb25maWcuaGlnaGxpZ2h0QWNjZW50KSk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICB0aGlzLmRpc3BsYXlBdHRyaWJ1dGVzID0gdGhpcy5kaXNwbGF5QXR0cmlidXRlcyB8fCB0aGlzLmZpbHRlcj8uYXR0cmlidXRlcyB8fCBbJ2xhYmVsJywgJ25hbWUnXTtcbiAgICB0aGlzLmRpc3BsYXlXaXRoID0gdGhpcy5kaXNwbGF5V2l0aCB8fCAoKG9iaikgPT4gb2JqICYmIGpvaW5Qcm9wZXJ0aWVzUGF0aChvYmosIHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMpKTtcbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5TaXplcyA9IHRoaXMuZGlzcGxheUNvbHVtblNpemVzXG4gICAgICAvLyBpZiBvbmx5IGNvbHVtbjogYXV0byBzaXplXG4gICAgICB8fCAodGhpcy5kaXNwbGF5QXR0cmlidXRlcy5sZW5ndGggPT09IDEgJiYgW3VuZGVmaW5lZF0pXG4gICAgICAvLyBDb21wdXRlZCBjb2x1bW4gc2l6ZTpcbiAgICAgIC8vIC0gaWYgbGFiZWwgdGhlbiBjb2wgc2l6ZSA9IDJcbiAgICAgIC8vIC0gaWYgcmFua09yZGVyIHRoZW4gY29sIHNpemUgPSAxXG4gICAgICAvLyAtIGVzZSA9PiBhdXRvIHNpemVcbiAgICAgIHx8IHRoaXMuZGlzcGxheUF0dHJpYnV0ZXMubWFwKGF0dHIgPT5cbiAgICAgICAgKGF0dHIgJiYgYXR0ci5lbmRzV2l0aCgnbGFiZWwnKSkgPyAyXG4gICAgICAgIDogKChhdHRyICYmIGF0dHIuZW5kc1dpdGgoJ3JhbmtPcmRlcicpKSA/IDFcbiAgICAgICAgICA6IHVuZGVmaW5lZCkpO1xuICAgIHRoaXMuZGlzcGxheUNvbHVtbk5hbWVzID0gdGhpcy5kaXNwbGF5QXR0cmlidXRlcy5tYXAoKGF0dHIsIGluZGV4KSA9PiB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lcyAmJiB0aGlzLmRpc3BsYXlDb2x1bW5OYW1lc1tpbmRleF0gfHxcbiAgICAgICh0aGlzLmkxOG5QcmVmaXggKyBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlKGF0dHIpLnRvVXBwZXJDYXNlKCkpKTtcbiAgICB0aGlzLm1vYmlsZSA9IHRvQm9vbGVhbih0aGlzLm1vYmlsZSwgZmFsc2UpO1xuICAgIHRoaXMuc2VhcmNoYWJsZSA9ICF0aGlzLm1vYmlsZSAmJiAhdGhpcy5tdWx0aXBsZTtcbiAgICB0aGlzLmVxdWFscyA9IHRoaXMuZXF1YWxzIHx8ICgobzEsIG8yKSA9PiBvMSAmJiBvMiAmJiBvMS5pZCA9PT0gbzIuaWQpO1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMuY2xhc3NMaXN0Py5zcGxpdCgnICcpO1xuICAgIHRoaXMucGFuZWxXaWR0aCA9IHRoaXMucGFuZWxXaWR0aCB8fCAoY2xhc3NMaXN0ICYmIChcbiAgICAgIChjbGFzc0xpc3QuaW5jbHVkZXMoJ21pbi13aWR0aC1tZWRpdW0nKSAmJiAnMzAwcHgnKVxuICAgICAgfHwgKGNsYXNzTGlzdC5pbmNsdWRlcygnbWluLXdpZHRoLWxhcmdlJykgJiYgJzQwMHB4JylcbiAgICAgIHx8IChjbGFzc0xpc3QuaW5jbHVkZXMoJ21pbi13aWR0aC14bGFyZ2UnKSAmJiAnNDUwcHgnKVxuICAgICAgfHwgKGNsYXNzTGlzdC5pbmNsdWRlcygnbWF0LWF1dG9jb21wbGV0ZS1wYW5lbC1mdWxsLXNpemUnKSAmJiAnMTAwdncnKVxuICAgICkpO1xuICAgIHRoaXMuc2hvd1BhbmVsT25Gb2N1cyA9IHRvQm9vbGVhbih0aGlzLnNob3dQYW5lbE9uRm9jdXMsIHRydWUpO1xuICAgIHRoaXMuZGVib3VuY2VUaW1lID0gdG9OdW1iZXIodGhpcy5kZWJvdW5jZVRpbWUsIDI1MCk7XG4gICAgdGhpcy5oaWdobGlnaHRBY2NlbnQgPSB0b0Jvb2xlYW4odGhpcy5oaWdobGlnaHRBY2NlbnQsIGZhbHNlKTtcbiAgICB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgPSB0aGlzLnN1Z2dlc3RMZW5ndGhUaHJlc2hvbGQgfHwgMDtcbiAgICB0aGlzLm1hdEF1dG9jb21wbGV0ZVBvc2l0aW9uID0gdGhpcy5tYXRBdXRvY29tcGxldGVQb3NpdGlvbiB8fCAodGhpcy5tb2JpbGUgJiYgdGhpcy5zZWFyY2hhYmxlID8gJ2Fib3ZlJyA6ICdhdXRvJyk7IC8vIE9uIG1vYmlsZSwgc2V0IHBvc2l0aW9uIHRvIGFib3ZlIChiZWNhdXNlIG9mIGJvdHRvbSBrZXlib2FyZClcblxuICAgIC8vIE5vIHN1Z2dlc3RGbjogZmlsdGVyIG9uIHRoZSBnaXZlbiBpdGVtc1xuICAgIGlmICghdGhpcy5zdWdnZXN0Rm4pIHtcbiAgICAgIGNvbnN0IHN1Z2dlc3RGcm9tQXJyYXlGbjogU3VnZ2VzdEZuPGFueSwgYW55PiA9IGFzeW5jICh2YWx1ZSwgZmlsdGVyKSA9PiB7XG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgQ2FsbGluZyBzdWdnZXN0RnJvbUFycmF5IHdpdGggdmFsdWU9JywgdmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBzdWdnZXN0RnJvbUFycmF5KHRoaXMuJGlucHV0SXRlbXMudmFsdWUsIHZhbHVlLCB7XG4gICAgICAgICAgc2VhcmNoQXR0cmlidXRlczogdGhpcy5kaXNwbGF5QXR0cmlidXRlcyxcbiAgICAgICAgICAuLi5maWx0ZXJcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLy8gV2FpdCAob25jZSkgdGhhdCBpdGVtcyBhcmUgbG9hZGVkLCB0aGVuIGNhbGwgc3VnZ2VzdCBmcm9tIGFycmF5IGZuXG4gICAgICB0aGlzLnN1Z2dlc3RGbiA9IGFzeW5jICh2YWx1ZSwgZmlsdGVyKSA9PiB7XG4gICAgICAgIGlmIChpc05pbCh0aGlzLiRpbnB1dEl0ZW1zLnZhbHVlKSkge1xuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgV2FpdGluZyBpdGVtcyB0byBiZSBzZXQuLi5cIik7XG5cbiAgICAgICAgICBhd2FpdCBmaXJzdE5vdE5pbFByb21pc2UodGhpcy4kaW5wdXRJdGVtcyk7XG5cbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFJlY2VpdmVkIGl0ZW1zOlwiLCB0aGlzLmlucHV0SXRlbXMkLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1Z2dlc3RGbiA9IHN1Z2dlc3RGcm9tQXJyYXlGbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VnZ2VzdEZuKHZhbHVlLCBmaWx0ZXIpOyAvLyBMb29wXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VhcmNoYWJsZSkge1xuICAgICAgLy8gTWFudWFsbHkgZmlsbCBpbnB1dCBpdGVtcywgZnJvbSB0aGUgZ2l2ZW4gc3VnZ2VzdCBmdW5jdGlvblxuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgdGhpcy5fJGZpbHRlci5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aDxhbnksIGFueT4odGhpcy5maWx0ZXIpLFxuICAgICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICAgIHRha2VXaGlsZSgoXykgPT4gIXRoaXMuc2VhcmNoYWJsZSksIC8vIENsb3NlIHN1YnNjcmlwdGlvbiwgd2hlbiBlbmFibGluZyBzZWFyY2ggKG5vIG1vcmUgbWF0LXNlbGVjdClcbiAgICAgICAgICBzd2l0Y2hNYXAoKGZpbHRlcikgPT4gdGhpcy5zdWdnZXN0KCcqJywgZmlsdGVyKSlcbiAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoaXRlbXMgPT4gdGhpcy4kaW5wdXRJdGVtcy5uZXh0KGl0ZW1zKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB2YWx1ZSB0byBzdWdnZXN0IHdoZW4gOlxuICAgIC8vIC0gaXMgbmlsIGFuZCAnKicsIGFuZCBubyBtaW4gbGVuZ3RoIHRocmVzaG9sZFxuICAgIC8vIC0gaXMgbm90IG5pbCBhbmQgbm90IGEgc3RyaW5nIHR5cGUgKGUuZy4gb2JqZWN0KVxuICAgIC8vIC0gaXMgbm90IG5pbCBhbmQgaXMgYSBzdHJpbmcsIGFuZCBoYXMgZW5vdWdoIGNoYXJhY3RlclxuICAgIGNvbnN0IHRocmVzaG9sZEZpbHRlckZuID0gKHZhbHVlKSA9PiAoaXNOaWxPckJsYW5rKHZhbHVlKSB8fCAodmFsdWUgPT09ICcqJylcbiAgICAgICAgPyAodGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkIDw9IDApXG4gICAgICAgIDogKCEodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgICAgICB8fCB2YWx1ZS5sZW5ndGggPj0gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkKVxuICAgICk7XG5cbiAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zQ2hhbmdlcyA9IG1lcmdlKFxuXG4gICAgICAvLyBSZWxvYWQgZXZlbnQgKG5vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgcGlwZSwgdG8gZm9yY2UgcmVsb2FkIGV2ZW4gaWYgc2FtZSB2YWx1ZSlcbiAgICAgIHRoaXMuX3JlbG9hZCQsXG5cbiAgICAgIC8vIFNlYXJjaCB0ZXh0IChubyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIGJlY2F1c2Ugb2YgdGhlIGRlYm91bmNlVGltZSgpIHBpcGUpXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gdGhpcy5lbmFibGVkICYmIHRoaXMuc2VhcmNoYWJsZSAmJiBpc05vdE5pbFN0cmluZyh2YWx1ZSkpLFxuICAgICAgICAgIC8vIE1hcmsgYXMgbG9hZGluZyAodG8gc2hvdyBsb2FkaW5nIHNwaW5uZXIpIC0gZWFybGllciBhcyBwb3NzaWJsZSwgc28gYmVmb3JlIHRoZSBkZWJvdW5jZSB0aW1lXG4gICAgICAgICAgdGFwKF8gPT4gdGhpcy5zaG93TG9hZGluZ1NwaW5uZXIgJiYgdGhpcy5tYXJrQXNMb2FkaW5nKCkpLFxuICAgICAgICAgIC8vIEZpbHRlciBpZiBub3QgZW5vdWdoIGNoYXJhY3RlclxuICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZS5sZW5ndGggPj0gdGhpcy5zdWdnZXN0TGVuZ3RoVGhyZXNob2xkKSxcbiAgICAgICAgICAvLyBXYWl0IGEgZGVib3VuY2UgdGltZVxuICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZSksXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICB0YXAoKHZhbHVlKSA9PiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBTZWFyY2ggdGV4dCBjaGFuZ2VzOicsIHZhbHVlKSlcbiAgICAgICAgKSxcblxuICAgICAgLy8gT2JqZWN0IHNldDogdXNlIGl0IChubyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIHBpcGUgbmVlZClcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aDxhbnksIGFueT4odGhpcy5mb3JtQ29udHJvbC52YWx1ZSksXG4gICAgICAgICAgZmlsdGVyKHZhbHVlID0+ICh0aGlzLnNlYXJjaGFibGUgJiYgaXNOb3ROaWwodmFsdWUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpKSxcbiAgICAgICAgICB0YXAodmFsdWUgPT4ge1xuICAgICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBvYmplY3QgY2hhbmdlczonLCB2YWx1ZSlcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5IHZhbHVlIChpZiBuZWVkKVxuICAgICAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gdGhpcy5kaXNwbGF5V2l0aCh2YWx1ZSkgfHwgJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5VmFsdWUgIT09IGRpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IGRpc3BsYXlWYWx1ZTtcblxuICAgICAgICAgICAgICAvLyBBcHBseSB0byB0aGUgaW5wdXRbdHlwZT10ZXh0XSBmaWVsZFxuICAgICAgICAgICAgICBpZiAodGhpcy5tYXRJbnB1dFRleHQgJiYgdGhpcy5tYXRJbnB1dFRleHQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF0SW5wdXRUZXh0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLmRpc3BsYXlWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgdGFwKHZhbHVlID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgYW4gb2JqZWN0IHZhbHVlOiAnLCB2YWx1ZSkpXG4gICAgICAgICksXG5cbiAgICAgIC8vIE9uIGRyb3Bkb3duIGJ1dHRvbiBjbGljayAobm8gZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgbm9yIGRlYm91bmNlVGltZSlcbiAgICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihldmVudCA9PiB0aGlzLnNlYXJjaGFibGUgJiYgdGhpcy5lbmFibGVkICYmICghZXZlbnQgfHwgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpKSxcbiAgICAgICAgICBtYXAoXyA9PiB0aGlzLnNob3dBbGxPbkZvY3VzID8gJyonIDogdGhpcy5mb3JtQ29udHJvbC52YWx1ZSksXG4gICAgICAgICAgLy8gTWFrZSBlbm91Z2ggY2hhcmFjdGVyc1xuICAgICAgICAgIGZpbHRlcih0aHJlc2hvbGRGaWx0ZXJGbilcbiAgICAgICAgKSxcblxuICAgICAgLy8gTWVyZ2Ugc29tZSBvYnNlcnZhYmxlcywgd2l0aCBhIGNvbW1vbiBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIHBpcGUsIGFuZCBOTyBkZWJvdW5jZVRpbWVcbiAgICAgIG1lcmdlKFxuICAgICAgICAvLyBGb2N1cyBvciBjbGljayA9PiBMb2FkIGFsbFxuICAgICAgICBtZXJnZSh0aGlzLmZvY3VzZWQsIHRoaXMuY2xpY2tlZClcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIGZpbHRlcihfID0+IHRoaXMuZW5hYmxlZCAmJiB0aGlzLnNlYXJjaGFibGUpLFxuICAgICAgICAgICAgbWFwKF8gPT4gdGhpcy5zaG93QWxsT25Gb2N1cyA/ICcqJyA6IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpLFxuICAgICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAgIHRhcCh2YWx1ZSA9PiB0aGlzLmRlYnVnICYmIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGZvY3VzZWQgb3IgY2xpY2tlZCBldmVudDogJywgdmFsdWUpKVxuICAgICAgICAgICksXG4gICAgICAgIG1lcmdlKHRoaXMuJGlucHV0SXRlbXMsIHRoaXMuXyRmaWx0ZXIpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoXyA9PiB0aGlzLnNlYXJjaGFibGUgJiYgdGhpcy5lbmFibGVkKSxcbiAgICAgICAgICAgIG1hcChfID0+IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpLFxuXG4gICAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgICAgdGFwKHZhbHVlID0+IHRoaXMuZGVidWcgJiYgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgUmVjZWl2ZWQgJGlucHV0SXRlbXMgb3IgZmlsdGVyIGV2ZW50OiAnLCB2YWx1ZSkpXG4gICAgICAgICAgKVxuICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIGNoYXJhY3RlcnNcbiAgICAgICAgICBmaWx0ZXIodGhyZXNob2xkRmlsdGVyRm4pLFxuICAgICAgICAgIC8vIERpc3Rpbmd1aXNoIGNoYW5nZXNcbiAgICAgICAgICAvLyAtIGRvIE5PVCBmaWx0ZXIgaWYgbG9hZGluZywgdG8gZm9yY2UgdXBkYXRlIGFmdGVyIGEgYmx1ciBldmVudFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh2MSwgdjIpID0+ICF0aGlzLmxvYWRpbmcgJiYgKHYxID09PSB2MiB8fCB0aGlzLmVxdWFscyh2MSwgdjIpKSksXG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvL3RhcCh2YWx1ZSA9PiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCB1cGRhdGUgZXZlbnQ6ICcsIHZhbHVlKSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnBpcGUoXG5cbiAgICAgICAgLy8gU3VnZ2VzdCB2YWx1ZXNcbiAgICAgICAgbWVyZ2VNYXAodmFsdWUgPT4gdGhpcy5zdWdnZXN0KHZhbHVlLCB0aGlzLmZpbHRlcikpLFxuICAgICAgICAvLyBERUJVR1xuICAgICAgICB0YXAoaXRlbXMgPT4gdGhpcy5kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBmcm9tIHN1Z2dlc3Q6ICcsIGl0ZW1zKSksXG5cbiAgICAgICAgLy8gU3RvcmUgaW1wbGljaXQgdmFsdWUgKHdpbGwgdXNlIGl0IG9uQmx1ciBpZiBub3Qgb3RoZXIgdmFsdWUgc2VsZWN0ZWQpXG4gICAgICAgIHRhcChpdGVtcyA9PiB0aGlzLnVwZGF0ZUltcGxpY2l0VmFsdWUoaXRlbXMpKVxuICAgICAgKTtcblxuICAgIC8vIEZldGNoIG1vcmUgZXZlbnRzXG4gICAgY29uc3QgZmV0Y2hNb3JlSXRlbXNDaGFuZ2VzID0gdGhpcy5fZmV0Y2hNb3JlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChldmVudCA9PiBldmVudD8ucHJldmVudERlZmF1bHQoKSksIC8vIEF2b2lkIHRvIGNsb3NlIHRoZSBtYXQtc2VsZWN0XG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmNhbkZldGNoTW9yZSksXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMuZmV0Y2hNb3JlKCkpLFxuXG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vdGFwKG1vcmVJdGVtcyA9PiBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBSZWNlaXZlZCBmcm9tIGZldGNoIE1vcmU6ICcsIG1vcmVJdGVtcykpLFxuXG4gICAgICAgIC8vIENvbmNhdCB0byBleGlzdGluZyBpdGVtc1xuICAgICAgICBtYXAobW9yZUl0ZW1zID0+ICh0aGlzLiRmaWx0ZXJlZEl0ZW1zLnZhbHVlIHx8IFtdKS5jb25jYXQobW9yZUl0ZW1zKSlcbiAgICAgICk7XG5cbiAgICAvLyBVcGRhdGUgZmlsdGVyZWQgaXRlbXNcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMuJGlucHV0SXRlbXMsXG5cbiAgICAgICAgLy8gVXBkYXRlIGl0ZW1zIGV2ZW50c1xuICAgICAgICBmaWx0ZXJlZEl0ZW1zQ2hhbmdlcyxcblxuICAgICAgICAvLyBGZXRjaCBtb3JlIGV2ZW50c1xuICAgICAgICBmZXRjaE1vcmVJdGVtc0NoYW5nZXNcbiAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShpdGVtcyA9PiB7XG4gICAgICAgICAgLy8gTWFrZSBzdXJlIGNvbnRyb2wgdmFsdWUgaXMgaW5zaWRlIChtYXQtc2VsZWN0KVxuICAgICAgICAgIGlmIChpdGVtcyAmJiAhdGhpcy5zZWFyY2hhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBpZiAoaXNOb3ROaWwodmFsdWUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgaXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gdGhpcy5lcXVhbHMoaXRlbSwgdmFsdWUpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgLy8gSWYgZm9ybSB2YWx1ZSBpcyBtaXNzaW5nOiBhZGQgaXQgdG8gdGhlIGxpc3RcbiAgICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFbWl0IGl0ZW1zXG4gICAgICAgICAgdGhpcy4kZmlsdGVyZWRJdGVtcy5uZXh0KGl0ZW1zKTtcbiAgICAgICAgfSkpO1xuXG4gICAgLy8gQXBwbHlpbmcgaW1wbGljaXQgdmFsdWUsIG9uIGJsdXJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5ibHVycmVkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIC8vIFNraXAgaWYgbm90IHNlYXJjaGFibGVcbiAgICAgICAgICBmaWx0ZXIoXyA9PiB0aGlzLnNlYXJjaGFibGUpLFxuICAgICAgICAgIG1hcChfID0+IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpLFxuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgdGFwKHZhbHVlID0+IGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFJlY2VpdmVkIGJsdXJyZWQgZXZlbnQ6ICcsIHZhbHVlKSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgLy8gV2hlbiBsZWF2ZSBjb21wb25lbnQgd2l0aG91dCBvYmplY3QsIHVzZSBpbXBsaWNpdCB2YWx1ZSBpZiA6XG4gICAgICAgICAgLy8gLSBhbiBleHBsaWNpdCB2YWx1ZVxuICAgICAgICAgIC8vIC0gZmllbGQgaXMgbm90IGVtcHR5ICh1c2VyIGZpbGwgc29tZXRoaW5nKVxuICAgICAgICAgIC8vIC0gT1IgZmllbGQgZW1wdHkgYnV0IGlzIHJlcXVpcmVkXG4gICAgICAgICAgaWYgKHRoaXMuX2ltcGxpY2l0VmFsdWUgJiYgKCh0aGlzLnJlcXVpcmVkICYmIGlzTmlsT3JCbGFuayh2YWx1ZSkpIHx8IChpc05vdE5pbE9yQmxhbmsodmFsdWUpICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpKSkge1xuICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuX2ltcGxpY2l0VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQZW5kaW5nKHtlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZX0pO1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZX0pO1xuICAgICAgICAgICAgdGhpcy5jaGVja0lmVG91Y2hlZCgpO1xuICAgICAgICAgICAgdGhpcy4kZmlsdGVyZWRJdGVtcy5uZXh0KFt0aGlzLl9pbXBsaWNpdFZhbHVlXSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc05pbE9yQmxhbmsodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1BlbmRpbmcoe2VtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDogZmFsc2UsIG9ubHlTZWxmOiB0cnVlfSk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrSWZUb3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLiRmaWx0ZXJlZEl0ZW1zLm5leHQodW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IG51bGw7IC8vIHJlc2V0IHRoZSBpbXBsaWNpdCB2YWx1ZVxuICAgICAgICB9KSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9ybSBjb250cm9sIHN0YXR1cyBjaGFuZ2VcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIC8vZmlsdGVyKCgpID0+IHRoaXMuZW5hYmxlZCksXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICApXG4gICAgICAgIC8vIFVwZGF0ZSBjb21wb25lbnQgc3RhdGVcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNoZWNrSWZUb3VjaGVkKCkpXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmtleWRvd25Fc2NhcGUuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgQ2xvc2luZyB0aGUgcGFuZWwgKGtleWRvd24uZXNjYXBlKVwiKTtcblxuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5faXRlbXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX2l0ZW1zU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLiRpbnB1dEl0ZW1zLmNvbXBsZXRlKCk7XG4gICAgdGhpcy4kaW5wdXRJdGVtcy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuJGZpbHRlcmVkSXRlbXMuY29tcGxldGUoKTtcbiAgICB0aGlzLiRmaWx0ZXJlZEl0ZW1zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fcmVsb2FkJC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuXyRmaWx0ZXIuY29tcGxldGUoKTtcblxuICAgIHRoaXMuZHJvcEJ1dHRvbkNsaWNrLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5jbGlja2VkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5ibHVycmVkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5mb2N1c2VkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5rZXlkb3duRXNjYXBlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5rZXl1cEVudGVyLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZmV0Y2hNb3JlJC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5faW1wbGljaXRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZvcm1Db250cm9sID0gbnVsbDtcbiAgICB0aGlzLmRpc3BsYXlXaXRoID0gbnVsbDtcbiAgICB0aGlzLmVxdWFscyA9IG51bGw7XG4gICAgdGhpcy5zdWdnZXN0Rm4gPSBudWxsO1xuICAgIHRoaXMuJGZpbHRlcmVkSXRlbXMgPSBudWxsO1xuICAgIHRoaXMubWF0U2VsZWN0SXRlbXMkID0gbnVsbDtcbiAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgdGhpcy5jbGFzc0xpc3QgPSBudWxsO1xuXG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSBudWxsO1xuXG4gICAgLy8gRGVzdHJveSB0aGUgJ2F1dG9jb21wbGV0ZScgaW5zdGFuY2UsIHRvIGF2b2lkIG1lbW9yeSBsZWFrXG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlKSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZS5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byByZWxvYWQgY29udGVudC4gVXNlZnVsIHdoZW4gZmlsdGVyIGhhcyBiZWVuIGNoYW5nZWQgYnV0IG5vdCBkZXRlY3RlZFxuICAgKi9cbiAgcmVsb2FkSXRlbXModmFsdWU/OiBhbnkpIHtcbiAgICAvLyBGb3JjZSBhIHJlZnJlc2hcbiAgICB0aGlzLl9yZWxvYWQkLm5leHQodmFsdWUgfHwgJyonKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIERFQlVHXG4gICAgLy8gY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgV3JpdGluZyB2YWx1ZTogJywgdmFsdWUpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnBhdGNoVmFsdWUodmFsdWUsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc0Rpc2FibGVkICYmIHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgaWYgKHRoaXMuc2VhcmNoYWJsZSkge1xuICAgICAgZm9jdXNJbnB1dCh0aGlzLm1hdElucHV0VGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWF0U2VsZWN0Py5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIGZpbHRlcklucHV0VGV4dEZvY3VzRXZlbnQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIC8vIElnbm9yZSBldmVudCBmcm9tIG1hdC1vcHRpb25cbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQudGFnTmFtZSA9PT0gJ01BVC1PUFRJT04nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgLy8gREVCVUdcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBDYW5jZWxsaW5nIGZvY3VzIGV2ZW50Jyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIFNlbGVjdCBpbnB1dCBjb250ZW50Jyk7XG4gICAgY29uc3QgaGFzQ29udGVudCA9IHRydWU7IC8vIHNlbGVjdElucHV0Q29udGVudChldmVudCk7XG5cbiAgICAvLyBJZiBjb21ibyBpcyBlbXB0eSwgb3IgaWYgaGFzIGNvbnRlbnQgYnV0IHNob3VsZCBmb3JjZSB0byBzaG93IHBhbmVsIG9uIGZvY3VzXG4gICAgaWYgKCFoYXNDb250ZW50IHx8IHRoaXMuc2hvd1BhbmVsT25Gb2N1cyB8fCB0aGlzLnNob3dBbGxPbkZvY3VzKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEVtaXQgZm9jdXMgZXZlbnQnKTtcbiAgICAgIHRoaXMuZm9jdXNlZC5lbWl0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZmlsdGVySW5wdXRUZXh0Qmx1ckV2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIC8vIERFQlVHXG4gICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIENhbmNlbGxpbmcgYmx1ciBldmVudFwiKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vREVCVUdcbiAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgQmx1cjogbW92ZSBjYXJldCB0byB0aGUgYmVnaW5uaW5nJyk7XG5cbiAgICAvLyBNb3ZlIGNhcmV0IHRvIHRoZSBiZWdpbm5pbmcgKGZpeCBpc3N1ZSBJTUFHSU5FLTQ2OSlcbiAgICBzZWxlY3RJbnB1dFJhbmdlKGV2ZW50LnRhcmdldCBhcyBhbnksIDAsIDApO1xuXG4gICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZmlsdGVyTWF0U2VsZWN0Rm9jdXNFdmVudChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgIC8vIERFQlVHXG4gICAgLy8gY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArIFwiIFJlY2VpdmVkIDxtYXQtc2VsZWN0PiBmb2N1cyBldmVudFwiLCBldmVudCk7XG4gICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgZmlsdGVyTWF0U2VsZWN0Qmx1ckV2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICAvLyBERUJVR1xuICAgIC8vIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBSZWNlaXZlZCA8bWF0LXNlbGVjdD4gYmx1ciBldmVudFwiLCBldmVudCk7XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBtYXQtb3B0aW9uXG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvLyBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgXCIgQ2FuY2VsbGluZyA8bWF0LXNlbGVjdD4gYmx1ciBldmVudFwiKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmJsdXJyZWQuZW1pdChldmVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0b2dnbGVTZWFyY2goZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICBjb25zdCBzZWFyY2hhYmxlID0gIXRoaXMuc2VhcmNoYWJsZTtcbiAgICBpZiAoc2VhcmNoYWJsZSAmJiB0aGlzLnNlYXJjaGFibGUgJiYgdGhpcy5tYXRJbnB1dFRleHQpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWFyY2hhYmxlID0gc2VhcmNoYWJsZTtcbiAgICAgIGlmIChzZWFyY2hhYmxlKSB7XG4gICAgICAgIHRoaXMuYXV0b2ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93UGFuZWxPbkZvY3VzID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyVmFsdWUoZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBfaW5pdEF1dG9jb21wbGV0ZUluZmluaXRlU2Nyb2xsKHRocmVzaG9sZD86IHN0cmluZykge1xuICAgIGlmICghdGhpcy5hdXRvY29tcGxldGUpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEluaXQgYXV0b2NvbXBsZXRlIHNjcm9sbCBsaXN0ZW5lcicpO1xuXG4gICAgaWYgKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3BlbmVkJDogT2JzZXJ2YWJsZTxhbnk+ID0gdGhpcy5hdXRvY29tcGxldGUuX2lzT3BlblxuICAgICAgPyB0aW1lcigwKVxuICAgICAgOiB0aGlzLmF1dG9jb21wbGV0ZS5vcGVuZWQucGlwZShkZWJvdW5jZVRpbWUoMjAwKSk7XG4gICAgY29uc3Qgc2Nyb2xsRW5kJCA9IG9wZW5lZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKF8pID0+IHRoaXMuZ2V0QXV0b2NvbXBsZXRlUGFuZWwoKSksXG4gICAgICAgIGZpbHRlcihpc05vdE5pbCksXG4gICAgICAgIHN3aXRjaE1hcCgocGFuZWwpID0+IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuYXV0b2NvbXBsZXRlLmNsb3NlZClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAvLyBUcmlnZ2VyIGZldGNoIG1vcmUsIGVuZCBlbmQgc2Nyb2xsIHJlYWNoZWRcbiAgICB0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24gPSBzY3JvbGxFbmQkXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2ZldGNoTW9yZSQuZW1pdCgpKTtcblxuICAgIC8vIFJlZ2lzdGVyIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIF9pbml0TWF0U2VsZWN0SW5maW5pdGVTY3JvbGwodGhyZXNob2xkPzogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLm1hdFNlbGVjdCkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1Zyh0aGlzLmxvZ1ByZWZpeCArICcgSW5pdCBtYXQtc2VsZWN0IHNjcm9sbCBsaXN0ZW5lcicpO1xuXG4gICAgaWYgKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3BlbmVkJDogT2JzZXJ2YWJsZTxhbnk+ID0gdGhpcy5tYXRTZWxlY3QucGFuZWxPcGVuXG4gICAgICA/IHRpbWVyKDApXG4gICAgICA6IHRoaXMubWF0U2VsZWN0Ll9vcGVuZWRTdHJlYW0ucGlwZShkZWJvdW5jZVRpbWUoMjAwKSk7XG4gICAgY29uc3Qgc2Nyb2xsRW5kJCA9IG9wZW5lZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKF8pID0+IHRoaXMuZ2V0TWF0U2VsZWN0UGFuZWwoKSksXG4gICAgICAgIGZpbHRlcihpc05vdE5pbCksXG4gICAgICAgIHN3aXRjaE1hcCgocGFuZWwpID0+IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubWF0U2VsZWN0Ll9jbG9zZWRTdHJlYW0pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApO1xuXG4gICAgLy8gVHJpZ2dlciBmZXRjaCBtb3JlLCBlbmQgZW5kIHNjcm9sbCByZWFjaGVkXG4gICAgdGhpcy5fb3BlbmVkU3Vic2NyaXB0aW9uID0gc2Nyb2xsRW5kJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihfID0+IHRoaXMuX21vcmVJdGVtc0NvdW50ID4gMClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZmV0Y2hNb3JlJC5lbWl0KCkpO1xuXG4gICAgLy8gUmVnaXN0ZXIgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLl9vcGVuZWRTdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuc2VhcmNoYWJsZSAmJiB0aGlzLmF1dG9jb21wbGV0ZT8uaXNPcGVuKVxuICAgICAgfHwgKHRoaXMubWF0U2VsZWN0Py5wYW5lbE9wZW4pXG4gICAgICB8fCBmYWxzZTtcbiAgfVxuXG4gIGNsb3NlUGFuZWwoKSB7XG4gICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlPy5pc09wZW4pIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlcj8uY2xvc2VQYW5lbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRTZWxlY3Q/LnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5tYXRTZWxlY3Q/LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyogLS0gcHJpdmF0ZSBtZXRob2QgLS0gKi9cblxuICBwcml2YXRlIGFzeW5jIHN1Z2dlc3QodmFsdWU6IGFueSwgZmlsdGVyPzogYW55KTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIC8vIENhbGwgc3VnZ2VzdGlvbiBmdW5jdGlvblxuICAgIGxldCByZXMgPSBhd2FpdCB0aGlzLnN1Z2dlc3RGbih2YWx1ZSwgZmlsdGVyKTtcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBGaWx0ZXJlZCBpdGVtcyBieSBzdWdnZXN0Rm46JywgdmFsdWUsIHJlcyk7XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IDA7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAwO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IChyZXMgYXMgYW55W10pLmxlbmd0aCB8fCAwO1xuICAgICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21vcmVJdGVtc0NvdW50ID0gMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCB7ZGF0YSwgdG90YWwsIGZldGNoTW9yZX0gPSByZXMgYXMgTG9hZFJlc3VsdDxhbnk+O1xuICAgICAgdGhpcy5faXRlbUNvdW50ID0gdG9OdW1iZXIodG90YWwsIGRhdGEgJiYgZGF0YS5sZW5ndGggfHwgMCk7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gZmV0Y2hNb3JlO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSBmZXRjaE1vcmUgJiYgKHRoaXMuX2l0ZW1Db3VudCAtIGRhdGEubGVuZ3RoKSB8fCAwO1xuICAgICAgcmVzID0gZGF0YTtcbiAgICB9XG5cbiAgICAvLyBERUJVR1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBGaWx0ZXJlZCBpdGVtcyBieSBzdWdnZXN0Rm46JywgdmFsdWUsIHJlcyk7XG5cbiAgICByZXR1cm4gcmVzIGFzIGFueVtdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE1vcmUoKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGlmICghdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjaykgcmV0dXJuIFtdO1xuXG4gICAgLy8gU2F2ZSB0aGVuIHJlbW92ZSBmZXRjaCBmdW5jdGlvbiAodG8gYXZvaWQgbXVsdGktY2FsbClcbiAgICBjb25zdCBmZXRjaE1vcmVGbiA9IHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2s7XG4gICAgdGhpcy5fb25GZXRjaE1vcmVDYWxsYmFjayA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHtkYXRhLCB0b3RhbCwgZmV0Y2hNb3JlfSA9IGF3YWl0IGZldGNoTW9yZUZuKCk7XG4gICAgdGhpcy5faXRlbUNvdW50ID0gdG90YWwgfHwgdGhpcy5faXRlbUNvdW50O1xuICAgIHRoaXMuX29uRmV0Y2hNb3JlQ2FsbGJhY2sgPSBmZXRjaE1vcmU7XG4gICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSBNYXRoLm1heCgwLCB0aGlzLl9tb3JlSXRlbXNDb3VudCAtIGRhdGEubGVuZ3RoKTsgLy8gQm9ybmUgbWluID0gMFxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbXBsaWNpdFZhbHVlKGl0ZW1zOiBhbnlbXSkge1xuICAgIGlmICh0aGlzLnNlYXJjaGFibGUpIHtcbiAgICAgIC8vIFN0b3JlIGltcGxpY2l0IHZhbHVlICh3aWxsIHVzZSBpdCBvbkJsdXIgaWYgbm90IG90aGVyIHZhbHVlIHNlbGVjdGVkKVxuICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gaXRlbXNbMF07XG4gICAgICAgIC8vdGhpcy5mb3JtQ29udHJvbC5zZXRFcnJvcnMobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbXBsaWNpdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJZlRvdWNoZWQoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdXRvY29tcGxldGVQYW5lbCgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZWxlID0gdGhpcy5hdXRvY29tcGxldGU/Lm9wdGlvbnMubGFzdD8uX2dldEhvc3RFbGVtZW50KCkucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIWVsZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgVW5hYmxlIHRvIGZpbmQgdGhlIGF1dG9jb21wbGV0ZSBkaXYuLi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWF0U2VsZWN0UGFuZWwoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGVsZSA9IHRoaXMubWF0U2VsZWN0Lm9wdGlvbnMubGFzdD8uX2dldEhvc3RFbGVtZW50KCkucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIWVsZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLmxvZ1ByZWZpeCArICcgVW5hYmxlIHRvIGZpbmQgdGhlIG1hdC1zZWxlY3QgY29udGFpbmVyLi4uJyk7XG4gICAgfVxuICAgIHJldHVybiBlbGU7XG4gIH1cblxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQXNMb2FkaW5nKCkge1xuICAgIGlmICh0aGlzLiRmaWx0ZXJlZEl0ZW1zLnZhbHVlKSB7XG4gICAgICB0aGlzLiRmaWx0ZXJlZEl0ZW1zLm5leHQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2ltcGxpY2l0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9vbkZldGNoTW9yZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbW9yZUl0ZW1zQ291bnQgPSAwO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|