@ethlete/core 3.12.0 → 3.13.1

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.
@@ -1,7 +1,8 @@
1
1
  import { assertInInjectionContext } from '@angular/core';
2
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
- import { BehaviorSubject, combineLatest, map, shareReplay, startWith, tap } from 'rxjs';
2
+ import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
3
+ import { BehaviorSubject, combineLatest, filter, map, shareReplay, startWith, take, takeUntil, tap, } from 'rxjs';
4
4
  import { switchQueryListChanges } from './angular.utils';
5
+ import { createDestroy } from './destroy.utils';
5
6
  const isObject = (value) => {
6
7
  return typeof value === 'object' && value !== null;
7
8
  };
@@ -19,27 +20,6 @@ const getObjectProperty = (obj, prop) => {
19
20
  return value;
20
21
  };
21
22
  export class SelectionModel {
22
- constructor() {
23
- this._selection$ = new BehaviorSubject([]);
24
- this._options$ = new BehaviorSubject([]);
25
- this._valueBinding$ = new BehaviorSubject(null);
26
- this._keyBinding$ = new BehaviorSubject(null);
27
- this._labelBinding$ = new BehaviorSubject(null);
28
- this._disabledBinding$ = new BehaviorSubject(null);
29
- this._allowMultiple$ = new BehaviorSubject(false);
30
- this._filter$ = new BehaviorSubject('');
31
- this.value$ = combineLatest([this.selection$, this.valueBinding$, this.allowMultiple$]).pipe(map(([selection, valueBinding, allowMultiple]) => {
32
- if (allowMultiple) {
33
- return selection.map((option) => this.execFnOrGetOptionProperty(option, valueBinding));
34
- }
35
- const [option] = selection;
36
- if (!option)
37
- return null;
38
- return this.execFnOrGetOptionProperty(option, valueBinding);
39
- }));
40
- this.filteredOptions$ = combineLatest([this.options$, this.filter$, this.labelBinding$]).pipe(map(([options, filter]) => this.getFilteredOptions(filter, options)), shareReplay({ bufferSize: 1, refCount: true }));
41
- this._optionsAndSelection$ = combineLatest([this._options$, this._selection$]);
42
- }
43
23
  get selection$() {
44
24
  return this._selection$.asObservable();
45
25
  }
@@ -88,6 +68,40 @@ export class SelectionModel {
88
68
  get filter() {
89
69
  return this._filter$.value;
90
70
  }
71
+ constructor() {
72
+ this._destroy$ = createDestroy();
73
+ this._lastSelectionSetSubscription = null;
74
+ this._selection$ = new BehaviorSubject([]);
75
+ this._options$ = new BehaviorSubject([]);
76
+ this.optionsSignal = toSignal(this.options$);
77
+ this._valueBinding$ = new BehaviorSubject(null);
78
+ this._keyBinding$ = new BehaviorSubject(null);
79
+ this._labelBinding$ = new BehaviorSubject(null);
80
+ this._disabledBinding$ = new BehaviorSubject(null);
81
+ this._allowMultiple$ = new BehaviorSubject(false);
82
+ this._filter$ = new BehaviorSubject('');
83
+ this.value$ = combineLatest([this.selection$, this.valueBinding$, this.allowMultiple$]).pipe(map(([selection, valueBinding, allowMultiple]) => {
84
+ if (allowMultiple) {
85
+ return selection.map((option) => this.execFnOrGetOptionProperty(option, valueBinding));
86
+ }
87
+ const [option] = selection;
88
+ if (!option)
89
+ return null;
90
+ return this.execFnOrGetOptionProperty(option, valueBinding);
91
+ }));
92
+ this.filteredOptions$ = combineLatest([this.options$, this.filter$, this.labelBinding$]).pipe(map(([options, filter]) => this.getFilteredOptions(filter, options)), shareReplay({ bufferSize: 1, refCount: true }));
93
+ this._optionsAndSelection$ = combineLatest([this._options$, this._selection$]);
94
+ this.allowMultiple$
95
+ .pipe(tap(() => {
96
+ if (this.allowMultiple)
97
+ return;
98
+ const [option] = this.selection;
99
+ if (!option)
100
+ return;
101
+ this.setSelection([option]);
102
+ }), takeUntilDestroyed())
103
+ .subscribe();
104
+ }
91
105
  setSelection(selection) {
92
106
  if (!Array.isArray(selection)) {
93
107
  selection = [selection];
@@ -95,6 +109,24 @@ export class SelectionModel {
95
109
  this._selection$.next(selection);
96
110
  return this;
97
111
  }
112
+ setSelectionFromValue(value) {
113
+ if (Array.isArray(value)) {
114
+ const selection = value.map((v) => this.getOptionByValue(v)).filter((v) => v !== undefined);
115
+ this.setSelection(selection);
116
+ }
117
+ else {
118
+ const selection = this.getOptionByValue(value);
119
+ if (selection) {
120
+ this.setSelection(selection);
121
+ }
122
+ }
123
+ }
124
+ setSelectionFromValue$(value) {
125
+ this._lastSelectionSetSubscription?.unsubscribe();
126
+ this._lastSelectionSetSubscription = this.options$
127
+ .pipe(takeUntil(this._destroy$), filter((o) => !!o.length), tap(() => this.setSelectionFromValue(value)), take(1))
128
+ .subscribe();
129
+ }
98
130
  setValueBinding(fnOrPropertyPath) {
99
131
  this._valueBinding$.next(fnOrPropertyPath);
100
132
  return this;
@@ -142,6 +174,7 @@ export class SelectionModel {
142
174
  this._options$.next([]);
143
175
  this._valueBinding$.next(null);
144
176
  this._keyBinding$.next(null);
177
+ this._disabledBinding$.next(null);
145
178
  this._labelBinding$.next(null);
146
179
  this._allowMultiple$.next(false);
147
180
  }
@@ -191,29 +224,40 @@ export class SelectionModel {
191
224
  getOptionByIndex(index, options = this.getFilteredOptions()) {
192
225
  return options[index] || null;
193
226
  }
194
- getOptionByOffset(offset, index, options = this.getFilteredOptions(), config = { clamp: true }) {
195
- const { loop, clamp } = config;
227
+ getOptionByOffset(offset, index, config = { clamp: true }) {
228
+ const { loop, clamp, skipDisabled, options = this.getFilteredOptions() } = config;
196
229
  const newIndex = index + offset;
197
230
  const remainingOffset = newIndex * -1;
231
+ let optionResult = null;
198
232
  if (newIndex < 0) {
199
233
  if (loop) {
200
- return this.getOptionByOffset(remainingOffset, options.length - 1, options, config);
234
+ optionResult = this.getOptionByOffset(remainingOffset, options.length - 1, config);
201
235
  }
202
- if (clamp) {
203
- return this.getFirstOption();
236
+ else if (clamp) {
237
+ optionResult = this.getFirstOption();
238
+ }
239
+ else {
240
+ optionResult = null;
204
241
  }
205
- return null;
206
242
  }
207
- if (newIndex >= options.length) {
243
+ else if (newIndex >= options.length) {
208
244
  if (loop) {
209
- return this.getOptionByOffset(remainingOffset, 0, options, config);
245
+ optionResult = this.getOptionByOffset(remainingOffset, 0, config);
210
246
  }
211
- if (clamp) {
212
- return this.getLastOption();
247
+ else if (clamp) {
248
+ optionResult = this.getLastOption();
213
249
  }
214
- return null;
250
+ else {
251
+ optionResult = null;
252
+ }
253
+ }
254
+ else {
255
+ optionResult = this.getOptionByIndex(newIndex);
256
+ }
257
+ if (optionResult && skipDisabled && this.isDisabled(optionResult)) {
258
+ return this.getOptionByOffset(offset, newIndex, config);
215
259
  }
216
- return this.getOptionByIndex(newIndex);
260
+ return optionResult;
217
261
  }
218
262
  getFirstOption(options = this.getFilteredOptions()) {
219
263
  return this.getOptionByIndex(0, options);
@@ -245,7 +289,7 @@ export class SelectionModel {
245
289
  const index = this.getNonMultipleSelectedOptionIndex();
246
290
  if (index === null)
247
291
  return null;
248
- return this.getOptionByOffset(index, offset, this.getFilteredOptions(), config);
292
+ return this.getOptionByOffset(index, offset, config);
249
293
  }
250
294
  getLabel(option) {
251
295
  return this.execFnOrGetOptionProperty(option, this.labelBinding);
@@ -267,6 +311,11 @@ export class SelectionModel {
267
311
  }
268
312
  return getObjectProperty(option, fnOrPropertyPath);
269
313
  }
314
+ execFnOrGetOptionPropertyNullable(option, fnOrPropertyPath) {
315
+ if (!fnOrPropertyPath || !isObject(option))
316
+ return null;
317
+ return this.execFnOrGetOptionProperty(option, fnOrPropertyPath);
318
+ }
270
319
  getOptionProperty(option, propertyPath) {
271
320
  if (!propertyPath || !isObject(option))
272
321
  return option;
@@ -277,7 +326,7 @@ export class SelectionModel {
277
326
  return this.getOption(optionKey, this.keyBinding, this.selection) !== undefined;
278
327
  }
279
328
  isDisabled(option) {
280
- return this.execFnOrGetOptionProperty(option, this.disabledBinding);
329
+ return !!this.execFnOrGetOptionPropertyNullable(option, this.disabledBinding);
281
330
  }
282
331
  getFilteredOptions(filter = this.filter, options = this.options) {
283
332
  if (!filter)
@@ -335,4 +384,4 @@ export class SelectionModel {
335
384
  }
336
385
  }
337
386
  }
338
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLW1vZGVsLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvdXRpbHMvc2VsZWN0aW9uLW1vZGVsLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFjLEVBQW9DLEVBQUU7SUFDcEUsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztBQUNyRCxDQUFDLENBQUM7QUFFRixNQUFNLGlCQUFpQixHQUFHLENBQUMsR0FBNEIsRUFBRSxJQUFZLEVBQUUsRUFBRTtJQUN2RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTFDLElBQUksQ0FBQyxjQUFjO1FBQUUsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5QixJQUFJLEtBQUssR0FBWSxHQUFHLENBQUM7SUFFekIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUV2QyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JCO0lBRUQs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QztTQUMxRDthQUFNO1lBQ0wsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBtYXAsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHlwZWRRdWVyeUxpc3QgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBzd2l0Y2hRdWVyeUxpc3RDaGFuZ2VzIH0gZnJvbSAnLi9hbmd1bGFyLnV0aWxzJztcblxuY29uc3QgaXNPYmplY3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufTtcblxuY29uc3QgZ2V0T2JqZWN0UHJvcGVydHkgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcHJvcDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGhhc0RvdE5vdGF0aW9uID0gcHJvcC5pbmNsdWRlcygnLicpO1xuXG4gIGlmICghaGFzRG90Tm90YXRpb24pIHJldHVybiBvYmpbcHJvcF07XG5cbiAgY29uc3QgcHJvcHMgPSBwcm9wLnNwbGl0KCcuJyk7XG5cbiAgbGV0IHZhbHVlOiB1bmtub3duID0gb2JqO1xuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgIGlmICghaXNPYmplY3QodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgdmFsdWUgPSB2YWx1ZVtwcm9wXTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydCB0eXBlIFNlbGVjdGlvbk1vZGVsVHlwZXMgPSBzdHJpbmcgfCBudW1iZXIgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd247XG5leHBvcnQgdHlwZSBTZWxlY3Rpb25Nb2RlbFByb3BlcnR5UGF0aCA9IHN0cmluZztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFNlbGVjdGlvbk1vZGVsT3B0aW9uVmFsdWVGbjxUIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWxUeXBlcyA9IGFueT4gPSAob3B0aW9uOiBUKSA9PiB1bmtub3duO1xuXG4vKipcbiAqIFlvdSBjYW4gdXNlIGEgcHJvcGVydHkgcGF0aCBvciBhIGZ1bmN0aW9uIHRvIGdldCB0aGUgdmFsdWUgb2YgYW4gb3B0aW9uLiBUaGUgZnVuY3Rpb24gc2hvdWxkIGJlIGFzICoqbGlnaHR3ZWlnaHQgYXMgcG9zc2libGUqKiBhcyBpdCB3aWxsIGJlIGNhbGxlZCAqKmEgbG90KiouXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFByb3BlcnR5IHBhdGhcbiAqIFwiaWRcIiAvLyBvcHRpb24uaWRcbiAqIFwidXNlci5uYW1lXCIgLy8gb3B0aW9uLnVzZXIubmFtZVxuICpcbiAqIC8vIEZ1bmN0aW9uXG4gKiAob3B0aW9uKSA9PiBvcHRpb24uaWQgLy8gb3B0aW9uLmlkXG4gKiAob3B0aW9uKSA9PiBvcHRpb24udXNlci5uYW1lIC8vIG9wdGlvbi51c2VyLm5hbWVcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFNlbGVjdGlvbk1vZGVsQmluZGluZzxUIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWxUeXBlcyA9IGFueT4gPVxuICB8IFNlbGVjdGlvbk1vZGVsUHJvcGVydHlQYXRoXG4gIHwgU2VsZWN0aW9uTW9kZWxPcHRpb25WYWx1ZUZuPFQ+O1xuXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uTW9kZWw8VCBleHRlbmRzIFNlbGVjdGlvbk1vZGVsVHlwZXMgPSB1bmtub3duPiB7XG4gIGdldCBzZWxlY3Rpb24kKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb24kLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldCBzZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbiQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VFtdPihbXSk7XG5cbiAgZ2V0IG9wdGlvbnMkKCkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucyQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pO1xuXG4gIGdldCB2YWx1ZUJpbmRpbmckKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZUJpbmRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldCB2YWx1ZUJpbmRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlQmluZGluZyQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfdmFsdWVCaW5kaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgZ2V0IGtleUJpbmRpbmckKCkge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFt0aGlzLl9rZXlCaW5kaW5nJCwgdGhpcy52YWx1ZUJpbmRpbmckXSkucGlwZShcbiAgICAgIG1hcCgoW2tleUJpbmRpbmcsIHZhbHVlQmluZGluZ10pID0+IGtleUJpbmRpbmcgfHwgdmFsdWVCaW5kaW5nKSxcbiAgICApO1xuICB9XG4gIGdldCBrZXlCaW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9rZXlCaW5kaW5nJC52YWx1ZSB8fCB0aGlzLnZhbHVlQmluZGluZztcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF9rZXlCaW5kaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgZ2V0IGxhYmVsQmluZGluZyQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhYmVsQmluZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgZ2V0IGxhYmVsQmluZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFiZWxCaW5kaW5nJC52YWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF9sYWJlbEJpbmRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZWxlY3Rpb25Nb2RlbEJpbmRpbmc8VD4gfCBudWxsPihudWxsKTtcblxuICBnZXQgZGlzYWJsZWRCaW5kaW5nJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWRCaW5kaW5nJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBnZXQgZGlzYWJsZWRCaW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZEJpbmRpbmckLnZhbHVlO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rpc2FibGVkQmluZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGw+KG51bGwpO1xuXG4gIGdldCBhbGxvd011bHRpcGxlJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dNdWx0aXBsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgZ2V0IGFsbG93TXVsdGlwbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbG93TXVsdGlwbGUkLnZhbHVlO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FsbG93TXVsdGlwbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgZ2V0IGZpbHRlciQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlciQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgZ2V0IGZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyJC52YWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcblxuICByZWFkb25seSB2YWx1ZSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnNlbGVjdGlvbiQsIHRoaXMudmFsdWVCaW5kaW5nJCwgdGhpcy5hbGxvd011bHRpcGxlJF0pLnBpcGUoXG4gICAgbWFwKChbc2VsZWN0aW9uLCB2YWx1ZUJpbmRpbmcsIGFsbG93TXVsdGlwbGVdKSA9PiB7XG4gICAgICBpZiAoYWxsb3dNdWx0aXBsZSkge1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uLm1hcCgob3B0aW9uKSA9PiB0aGlzLmV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHkob3B0aW9uLCB2YWx1ZUJpbmRpbmcpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgW29wdGlvbl0gPSBzZWxlY3Rpb247XG5cbiAgICAgIGlmICghb3B0aW9uKSByZXR1cm4gbnVsbDtcblxuICAgICAgcmV0dXJuIHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHZhbHVlQmluZGluZyk7XG4gICAgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgZmlsdGVyZWRPcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMub3B0aW9ucyQsIHRoaXMuZmlsdGVyJCwgdGhpcy5sYWJlbEJpbmRpbmckXSkucGlwZShcbiAgICBtYXAoKFtvcHRpb25zLCBmaWx0ZXJdKSA9PiB0aGlzLmdldEZpbHRlcmVkT3B0aW9ucyhmaWx0ZXIsIG9wdGlvbnMpKSxcbiAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNBbmRTZWxlY3Rpb24kID0gY29tYmluZUxhdGVzdChbdGhpcy5fb3B0aW9ucyQsIHRoaXMuX3NlbGVjdGlvbiRdKTtcblxuICBzZXRTZWxlY3Rpb24oc2VsZWN0aW9uOiBUIHwgVFtdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGVjdGlvbikpIHtcbiAgICAgIHNlbGVjdGlvbiA9IFtzZWxlY3Rpb25dO1xuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGlvbiQubmV4dChzZWxlY3Rpb24pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRWYWx1ZUJpbmRpbmcoZm5PclByb3BlcnR5UGF0aDogU2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQ+IHwgbnVsbCkge1xuICAgIHRoaXMuX3ZhbHVlQmluZGluZyQubmV4dChmbk9yUHJvcGVydHlQYXRoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0S2V5QmluZGluZyhmbk9yUHJvcGVydHlQYXRoOiBTZWxlY3Rpb25Nb2RlbEJpbmRpbmc8VD4gfCBudWxsKSB7XG4gICAgdGhpcy5fa2V5QmluZGluZyQubmV4dChmbk9yUHJvcGVydHlQYXRoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TGFiZWxCaW5kaW5nKGZuT3JQcm9wZXJ0eVBhdGg6IFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGwpIHtcbiAgICB0aGlzLl9sYWJlbEJpbmRpbmckLm5leHQoZm5PclByb3BlcnR5UGF0aCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldERpc2FibGVkQmluZGluZyhmbk9yUHJvcGVydHlQYXRoOiBTZWxlY3Rpb25Nb2RlbEJpbmRpbmc8VD4gfCBudWxsKSB7XG4gICAgdGhpcy5fZGlzYWJsZWRCaW5kaW5nJC5uZXh0KGZuT3JQcm9wZXJ0eVBhdGgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPcHRpb25zKG9wdGlvbnM6IFRbXSkge1xuICAgIHRoaXMuX29wdGlvbnMkLm5leHQob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE9wdGlvbnNGcm9tUXVlcnlMaXN0KHF1ZXJ5TGlzdDogVHlwZWRRdWVyeUxpc3Q8VD4pIHtcbiAgICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQodGhpcy5zZXRPcHRpb25zRnJvbVF1ZXJ5TGlzdCk7XG5cbiAgICBxdWVyeUxpc3QuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChxdWVyeUxpc3QpLFxuICAgICAgICB0YXAoKGxpc3QpID0+IHRoaXMuc2V0T3B0aW9ucyhsaXN0LnRvQXJyYXkoKSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3B0aW9uc0Zyb21RdWVyeUxpc3QkKHF1ZXJ5TGlzdCQ6IE9ic2VydmFibGU8VHlwZWRRdWVyeUxpc3Q8VD4gfCBudWxsIHwgdW5kZWZpbmVkPikge1xuICAgIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCh0aGlzLnNldE9wdGlvbnNGcm9tUXVlcnlMaXN0JCk7XG5cbiAgICBxdWVyeUxpc3QkXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoUXVlcnlMaXN0Q2hhbmdlcygpLFxuICAgICAgICB0YXAoKGxpc3QpID0+IHRoaXMuc2V0T3B0aW9ucyhsaXN0Py50b0FycmF5KCkgfHwgW10pKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEFsbG93TXVsdGlwbGUoYWxsb3dNdWx0aXBsZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FsbG93TXVsdGlwbGUkLm5leHQoYWxsb3dNdWx0aXBsZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEZpbHRlcihmaWx0ZXI6IHN0cmluZyB8IG51bGwpIHtcbiAgICBjb25zdCBzYW5pdGl6ZWRGaWx0ZXIgPSBmaWx0ZXI/LnRyaW0oKSB8fCAnJztcblxuICAgIHRoaXMuX2ZpbHRlciQubmV4dChzYW5pdGl6ZWRGaWx0ZXIpO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uJC5uZXh0KFtdKTtcbiAgICB0aGlzLl9vcHRpb25zJC5uZXh0KFtdKTtcbiAgICB0aGlzLl92YWx1ZUJpbmRpbmckLm5leHQobnVsbCk7XG4gICAgdGhpcy5fa2V5QmluZGluZyQubmV4dChudWxsKTtcbiAgICB0aGlzLl9sYWJlbEJpbmRpbmckLm5leHQobnVsbCk7XG4gICAgdGhpcy5fYWxsb3dNdWx0aXBsZSQubmV4dChmYWxzZSk7XG4gIH1cblxuICBnZXRPcHRpb25CeVZhbHVlJCh2YWx1ZTogdW5rbm93bikge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zQW5kU2VsZWN0aW9uJC5waXBlKG1hcCgoKSA9PiB0aGlzLmdldE9wdGlvbkJ5VmFsdWUodmFsdWUpKSk7XG4gIH1cblxuICBnZXRPcHRpb25CeUxhYmVsJChsYWJlbDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNBbmRTZWxlY3Rpb24kLnBpcGUobWFwKCgpID0+IHRoaXMuZ2V0T3B0aW9uQnlMYWJlbChsYWJlbCkpKTtcbiAgfVxuXG4gIGdldE9wdGlvbkJ5S2V5JChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zQW5kU2VsZWN0aW9uJC5waXBlKG1hcCgoKSA9PiB0aGlzLmdldE9wdGlvbkJ5S2V5KGtleSkpKTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQkKG9wdGlvbjogVCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb24kLnBpcGUobWFwKCgpID0+IHRoaXMuaXNTZWxlY3RlZChvcHRpb24pKSk7XG4gIH1cblxuICBpc0Rpc2FibGVkJChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0FuZFNlbGVjdGlvbiQucGlwZShtYXAoKCkgPT4gdGhpcy5pc0Rpc2FibGVkKG9wdGlvbikpKTtcbiAgfVxuXG4gIGdldExhYmVsJChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbEJpbmRpbmckLnBpcGUobWFwKChsYWJlbEJpbmRpbmcpID0+IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIGxhYmVsQmluZGluZykpKTtcbiAgfVxuXG4gIGdldFZhbHVlJChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZUJpbmRpbmckLnBpcGUobWFwKCh2YWx1ZUJpbmRpbmcpID0+IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHZhbHVlQmluZGluZykpKTtcbiAgfVxuXG4gIGdldEtleSQob3B0aW9uOiBUKSB7XG4gICAgcmV0dXJuIHRoaXMua2V5QmluZGluZyQucGlwZShtYXAoKGtleUJpbmRpbmcpID0+IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIGtleUJpbmRpbmcpKSk7XG4gIH1cblxuICBnZXRPcHRpb25CeVZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uKHZhbHVlLCB0aGlzLnZhbHVlQmluZGluZyk7XG4gIH1cblxuICBnZXRPcHRpb25CeUxhYmVsKGxhYmVsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPcHRpb24obGFiZWwsIHRoaXMubGFiZWxCaW5kaW5nKTtcbiAgfVxuXG4gIGdldE9wdGlvbkJ5S2V5KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uKGtleSwgdGhpcy5rZXlCaW5kaW5nKTtcbiAgfVxuXG4gIGdldE9wdGlvbihcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBwcm9wZXJ0eVBhdGg6IFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGwgPSBudWxsLFxuICAgIG9wdGlvbnMgPSBbLi4udGhpcy5vcHRpb25zLCAuLi50aGlzLnNlbGVjdGlvbl0sXG4gICkge1xuICAgIGlmICghcHJvcGVydHlQYXRoKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbiA9PT0gdmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zLmZpbmQoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCFpc09iamVjdChvcHRpb24pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0aGlzLmV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHkob3B0aW9uLCBwcm9wZXJ0eVBhdGgpID09PSB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldE9wdGlvbkJ5SW5kZXgoaW5kZXg6IG51bWJlciwgb3B0aW9ucyA9IHRoaXMuZ2V0RmlsdGVyZWRPcHRpb25zKCkpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIG9wdGlvbnNbaW5kZXhdIHx8IG51bGw7XG4gIH1cblxuICBnZXRPcHRpb25CeU9mZnNldChcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIG9wdGlvbnMgPSB0aGlzLmdldEZpbHRlcmVkT3B0aW9ucygpLFxuICAgIGNvbmZpZzogeyBsb29wPzogYm9vbGVhbjsgY2xhbXA/OiBib29sZWFuIH0gPSB7IGNsYW1wOiB0cnVlIH0sXG4gICk6IFQgfCBudWxsIHtcbiAgICBjb25zdCB7IGxvb3AsIGNsYW1wIH0gPSBjb25maWc7XG5cbiAgICBjb25zdCBuZXdJbmRleCA9IGluZGV4ICsgb2Zmc2V0O1xuICAgIGNvbnN0IHJlbWFpbmluZ09mZnNldCA9IG5ld0luZGV4ICogLTE7XG5cbiAgICBpZiAobmV3SW5kZXggPCAwKSB7XG4gICAgICBpZiAobG9vcCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25CeU9mZnNldChyZW1haW5pbmdPZmZzZXQsIG9wdGlvbnMubGVuZ3RoIC0gMSwgb3B0aW9ucywgY29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNsYW1wKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpcnN0T3B0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChuZXdJbmRleCA+PSBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgaWYgKGxvb3ApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uQnlPZmZzZXQocmVtYWluaW5nT2Zmc2V0LCAwLCBvcHRpb25zLCBjb25maWcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2xhbXApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFzdE9wdGlvbigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25CeUluZGV4KG5ld0luZGV4KTtcbiAgfVxuXG4gIGdldEZpcnN0T3B0aW9uKG9wdGlvbnMgPSB0aGlzLmdldEZpbHRlcmVkT3B0aW9ucygpKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkJ5SW5kZXgoMCwgb3B0aW9ucyk7XG4gIH1cblxuICBnZXRMYXN0T3B0aW9uKG9wdGlvbnMgPSB0aGlzLmdldEZpbHRlcmVkT3B0aW9ucygpKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkJ5SW5kZXgob3B0aW9ucy5sZW5ndGggLSAxLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldE9wdGlvbkluZGV4KG9wdGlvbjogVCwgb3B0aW9ucyA9IHRoaXMuZ2V0RmlsdGVyZWRPcHRpb25zKCkpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShvcHRpb24pO1xuICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IHRoaXMuZ2V0S2V5KG8pID09PSBrZXkpO1xuXG4gICAgcmV0dXJuIGluZGV4ID09PSAtMSA/IG51bGwgOiBpbmRleDtcbiAgfVxuXG4gIGdldE5vbk11bHRpcGxlU2VsZWN0ZWRPcHRpb24oKTogVCB8IG51bGwge1xuICAgIGlmICh0aGlzLmFsbG93TXVsdGlwbGUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uWzBdIHx8IG51bGw7XG4gIH1cblxuICBnZXROb25NdWx0aXBsZVNlbGVjdGVkT3B0aW9uSW5kZXgoKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dNdWx0aXBsZSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBvcHQgPSB0aGlzLmdldE5vbk11bHRpcGxlU2VsZWN0ZWRPcHRpb24oKTtcblxuICAgIGlmICghb3B0KSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkluZGV4KG9wdCk7XG4gIH1cblxuICBnZXROb25NdWx0aXBsZU9wdGlvbkJ5T2Zmc2V0RnJvbVNlbGVjdGVkKFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIGNvbmZpZzogeyBsb29wPzogYm9vbGVhbjsgY2xhbXA/OiBib29sZWFuIH0gPSB7IGNsYW1wOiB0cnVlIH0sXG4gICkge1xuICAgIGlmICh0aGlzLmFsbG93TXVsdGlwbGUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmdldE5vbk11bHRpcGxlU2VsZWN0ZWRPcHRpb25JbmRleCgpO1xuXG4gICAgaWYgKGluZGV4ID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkJ5T2Zmc2V0KGluZGV4LCBvZmZzZXQsIHRoaXMuZ2V0RmlsdGVyZWRPcHRpb25zKCksIGNvbmZpZyk7XG4gIH1cblxuICBnZXRMYWJlbChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjRm5PckdldE9wdGlvblByb3BlcnR5KG9wdGlvbiwgdGhpcy5sYWJlbEJpbmRpbmcpO1xuICB9XG5cbiAgZ2V0VmFsdWUob3B0aW9uOiBUKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHRoaXMudmFsdWVCaW5kaW5nKTtcbiAgfVxuXG4gIGdldEtleShvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjRm5PckdldE9wdGlvblByb3BlcnR5KG9wdGlvbiwgdGhpcy5rZXlCaW5kaW5nKTtcbiAgfVxuXG4gIGdldERpc2FibGVkKG9wdGlvbjogVCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHkob3B0aW9uLCB0aGlzLmRpc2FibGVkQmluZGluZyk7XG4gIH1cblxuICBleGVjRm5PckdldE9wdGlvblByb3BlcnR5KG9wdGlvbjogVCwgZm5PclByb3BlcnR5UGF0aDogU2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQ+IHwgbnVsbCkge1xuICAgIGlmICghZm5PclByb3BlcnR5UGF0aCB8fCAhaXNPYmplY3Qob3B0aW9uKSkgcmV0dXJuIG9wdGlvbjtcblxuICAgIGlmICh0eXBlb2YgZm5PclByb3BlcnR5UGF0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGZuT3JQcm9wZXJ0eVBhdGgob3B0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0T2JqZWN0UHJvcGVydHkob3B0aW9uLCBmbk9yUHJvcGVydHlQYXRoKTtcbiAgfVxuXG4gIGdldE9wdGlvblByb3BlcnR5KG9wdGlvbjogVCwgcHJvcGVydHlQYXRoOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgaWYgKCFwcm9wZXJ0eVBhdGggfHwgIWlzT2JqZWN0KG9wdGlvbikpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gZ2V0T2JqZWN0UHJvcGVydHkob3B0aW9uLCBwcm9wZXJ0eVBhdGgpO1xuICB9XG5cbiAgaXNTZWxlY3RlZChvcHRpb246IFQpIHtcbiAgICBjb25zdCBvcHRpb25LZXkgPSB0aGlzLmV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHkob3B0aW9uLCB0aGlzLmtleUJpbmRpbmcpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uKG9wdGlvbktleSwgdGhpcy5rZXlCaW5kaW5nLCB0aGlzLnNlbGVjdGlvbikgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlzRGlzYWJsZWQob3B0aW9uOiBUKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHRoaXMuZGlzYWJsZWRCaW5kaW5nKTtcbiAgfVxuXG4gIGdldEZpbHRlcmVkT3B0aW9ucyhmaWx0ZXIgPSB0aGlzLmZpbHRlciwgb3B0aW9ucyA9IHRoaXMub3B0aW9ucykge1xuICAgIGlmICghZmlsdGVyKSByZXR1cm4gb3B0aW9ucztcblxuICAgIGNvbnN0IHNwbGl0RmlsdGVyID0gZmlsdGVyLnNwbGl0KCcgJykuZmlsdGVyKChmKSA9PiBmKTtcblxuICAgIHJldHVybiBvcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0TGFiZWwob3B0aW9uKTtcblxuICAgICAgaWYgKCFsYWJlbCB8fCB0eXBlb2YgbGFiZWwgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHNwbGl0TGFiZWwgPSBsYWJlbC5zcGxpdCgnICcpLmZpbHRlcigobCkgPT4gbCk7XG5cbiAgICAgIHJldHVybiBzcGxpdEZpbHRlci5ldmVyeSgoZikgPT4gc3BsaXRMYWJlbC5zb21lKChsKSA9PiBsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZi50b0xvd2VyQ2FzZSgpKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkU2VsZWN0ZWRPcHRpb24ob3B0aW9uOiBUKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dNdWx0aXBsZSkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZChvcHRpb24pKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX3NlbGVjdGlvbiQubmV4dChbLi4udGhpcy5zZWxlY3Rpb24sIG9wdGlvbl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoW29wdGlvbl0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVNlbGVjdGVkT3B0aW9uKG9wdGlvbjogVCkge1xuICAgIGNvbnN0IG9wdGlvbktleSA9IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHRoaXMua2V5QmluZGluZyk7XG5cbiAgICBpZiAoIXRoaXMuaXNTZWxlY3RlZChvcHRpb24pKSByZXR1cm47XG5cbiAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoXG4gICAgICB0aGlzLnNlbGVjdGlvbi5maWx0ZXIoKHNlbGVjdGVkT3B0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShzZWxlY3RlZE9wdGlvbiwgdGhpcy5rZXlCaW5kaW5nKTtcblxuICAgICAgICByZXR1cm4ga2V5ICE9PSBvcHRpb25LZXk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgY2xlYXJTZWxlY3RlZE9wdGlvbnMoKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uJC5uZXh0KFtdKTtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdGVkT3B0aW9uKG9wdGlvbjogVCkge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQob3B0aW9uKSkge1xuICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZE9wdGlvbihvcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLy8gRklYTUU6IFRvZ2dsZSBzaG91bGQgcmVzcGVjdCBkaXNhYmxlZCBiaW5kaW5nIGlmIGl0IGV4aXN0c1xuICB0b2dnbGVBbGxTZWxlY3RlZE9wdGlvbnMoKSB7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gdGhpcy5nZXRGaWx0ZXJlZE9wdGlvbnMoKTtcbiAgICBjb25zdCB1bnNlbGVjdGVkT3B0aW9ucyA9IGZpbHRlcmVkT3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gIXRoaXMuaXNTZWxlY3RlZChvcHRpb24pKTtcblxuICAgIGlmICh1bnNlbGVjdGVkT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHVuc2VsZWN0ZWRPcHRpb25zLmZpbHRlcigobykgPT4gIXRoaXMuc2VsZWN0aW9uLnNvbWUoKHMpID0+IHRoaXMuZ2V0S2V5KHMpID09PSB0aGlzLmdldEtleShvKSkpO1xuXG4gICAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoWy4uLnRoaXMuc2VsZWN0aW9uLCAuLi5zZWxlY3Rpb25dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24uZmlsdGVyKChzKSA9PiAhZmlsdGVyZWRPcHRpb25zLnNvbWUoKG8pID0+IHRoaXMuZ2V0S2V5KG8pID09PSB0aGlzLmdldEtleShzKSkpO1xuXG4gICAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoc2VsZWN0aW9uKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
387
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLW1vZGVsLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvdXRpbHMvc2VsZWN0aW9uLW1vZGVsLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUUsT0FBTyxFQUNMLGVBQWUsRUFHZixhQUFhLEVBQ2IsTUFBTSxFQUNOLEdBQUcsRUFDSCxXQUFXLEVBQ1gsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBYyxFQUFvQyxFQUFFO0lBQ3BFLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEdBQTRCLEVBQUUsSUFBWSxFQUFFLEVBQUU7SUFDdkUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUxQyxJQUFJLENBQUMsY0FBYztRQUFFLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFOUIsSUFBSSxLQUFLLEdBQVksR0FBRyxDQUFDO0lBRXpCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMs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QUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3Vic2NyaXB0aW9uLFxuICBjb21iaW5lTGF0ZXN0LFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG4gIHN0YXJ0V2l0aCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHlwZWRRdWVyeUxpc3QgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBzd2l0Y2hRdWVyeUxpc3RDaGFuZ2VzIH0gZnJvbSAnLi9hbmd1bGFyLnV0aWxzJztcbmltcG9ydCB7IGNyZWF0ZURlc3Ryb3kgfSBmcm9tICcuL2Rlc3Ryb3kudXRpbHMnO1xuXG5jb25zdCBpc09iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGw7XG59O1xuXG5jb25zdCBnZXRPYmplY3RQcm9wZXJ0eSA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgaGFzRG90Tm90YXRpb24gPSBwcm9wLmluY2x1ZGVzKCcuJyk7XG5cbiAgaWYgKCFoYXNEb3ROb3RhdGlvbikgcmV0dXJuIG9ialtwcm9wXTtcblxuICBjb25zdCBwcm9wcyA9IHByb3Auc3BsaXQoJy4nKTtcblxuICBsZXQgdmFsdWU6IHVua25vd24gPSBvYmo7XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICB2YWx1ZSA9IHZhbHVlW3Byb3BdO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuZXhwb3J0IHR5cGUgU2VsZWN0aW9uTW9kZWxUeXBlcyA9IHN0cmluZyB8IG51bWJlciB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bjtcbmV4cG9ydCB0eXBlIFNlbGVjdGlvbk1vZGVsUHJvcGVydHlQYXRoID0gc3RyaW5nO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgU2VsZWN0aW9uTW9kZWxPcHRpb25WYWx1ZUZuPFQgZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbFR5cGVzID0gYW55PiA9IChvcHRpb246IFQpID0+IHVua25vd247XG5cbi8qKlxuICogWW91IGNhbiB1c2UgYSBwcm9wZXJ0eSBwYXRoIG9yIGEgZnVuY3Rpb24gdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhbiBvcHRpb24uIFRoZSBmdW5jdGlvbiBzaG91bGQgYmUgYXMgKipsaWdodHdlaWdodCBhcyBwb3NzaWJsZSoqIGFzIGl0IHdpbGwgYmUgY2FsbGVkICoqYSBsb3QqKi5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUHJvcGVydHkgcGF0aFxuICogXCJpZFwiIC8vIG9wdGlvbi5pZFxuICogXCJ1c2VyLm5hbWVcIiAvLyBvcHRpb24udXNlci5uYW1lXG4gKlxuICogLy8gRnVuY3Rpb25cbiAqIChvcHRpb24pID0+IG9wdGlvbi5pZCAvLyBvcHRpb24uaWRcbiAqIChvcHRpb24pID0+IG9wdGlvbi51c2VyLm5hbWUgLy8gb3B0aW9uLnVzZXIubmFtZVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgU2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQgZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbFR5cGVzID0gYW55PiA9XG4gIHwgU2VsZWN0aW9uTW9kZWxQcm9wZXJ0eVBhdGhcbiAgfCBTZWxlY3Rpb25Nb2RlbE9wdGlvblZhbHVlRm48VD47XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbDxUIGV4dGVuZHMgU2VsZWN0aW9uTW9kZWxUeXBlcyA9IHVua25vd24+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBjcmVhdGVEZXN0cm95KCk7XG4gIHByaXZhdGUgX2xhc3RTZWxlY3Rpb25TZXRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGdldCBzZWxlY3Rpb24kKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb24kLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldCBzZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbiQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VFtdPihbXSk7XG5cbiAgZ2V0IG9wdGlvbnMkKCkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucyQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pO1xuICByZWFkb25seSBvcHRpb25zU2lnbmFsID0gdG9TaWduYWwodGhpcy5vcHRpb25zJCk7XG5cbiAgZ2V0IHZhbHVlQmluZGluZyQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlQmluZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgZ2V0IHZhbHVlQmluZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVCaW5kaW5nJC52YWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF92YWx1ZUJpbmRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZWxlY3Rpb25Nb2RlbEJpbmRpbmc8VD4gfCBudWxsPihudWxsKTtcblxuICBnZXQga2V5QmluZGluZyQoKSB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW3RoaXMuX2tleUJpbmRpbmckLCB0aGlzLnZhbHVlQmluZGluZyRdKS5waXBlKFxuICAgICAgbWFwKChba2V5QmluZGluZywgdmFsdWVCaW5kaW5nXSkgPT4ga2V5QmluZGluZyB8fCB2YWx1ZUJpbmRpbmcpLFxuICAgICk7XG4gIH1cbiAgZ2V0IGtleUJpbmRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2tleUJpbmRpbmckLnZhbHVlIHx8IHRoaXMudmFsdWVCaW5kaW5nO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX2tleUJpbmRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZWxlY3Rpb25Nb2RlbEJpbmRpbmc8VD4gfCBudWxsPihudWxsKTtcblxuICBnZXQgbGFiZWxCaW5kaW5nJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFiZWxCaW5kaW5nJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBnZXQgbGFiZWxCaW5kaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9sYWJlbEJpbmRpbmckLnZhbHVlO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xhYmVsQmluZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGw+KG51bGwpO1xuXG4gIGdldCBkaXNhYmxlZEJpbmRpbmckKCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZEJpbmRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldCBkaXNhYmxlZEJpbmRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkQmluZGluZyQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlzYWJsZWRCaW5kaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgZ2V0IGFsbG93TXVsdGlwbGUkKCkge1xuICAgIHJldHVybiB0aGlzLl9hbGxvd011bHRpcGxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBnZXQgYWxsb3dNdWx0aXBsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dNdWx0aXBsZSQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfYWxsb3dNdWx0aXBsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBnZXQgZmlsdGVyJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBnZXQgZmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXIkLnZhbHVlO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gIHJlYWRvbmx5IHZhbHVlJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuc2VsZWN0aW9uJCwgdGhpcy52YWx1ZUJpbmRpbmckLCB0aGlzLmFsbG93TXVsdGlwbGUkXSkucGlwZShcbiAgICBtYXAoKFtzZWxlY3Rpb24sIHZhbHVlQmluZGluZywgYWxsb3dNdWx0aXBsZV0pID0+IHtcbiAgICAgIGlmIChhbGxvd011bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24ubWFwKChvcHRpb24pID0+IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHZhbHVlQmluZGluZykpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbb3B0aW9uXSA9IHNlbGVjdGlvbjtcblxuICAgICAgaWYgKCFvcHRpb24pIHJldHVybiBudWxsO1xuXG4gICAgICByZXR1cm4gdGhpcy5leGVjRm5PckdldE9wdGlvblByb3BlcnR5KG9wdGlvbiwgdmFsdWVCaW5kaW5nKTtcbiAgICB9KSxcbiAgKTtcblxuICByZWFkb25seSBmaWx0ZXJlZE9wdGlvbnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5vcHRpb25zJCwgdGhpcy5maWx0ZXIkLCB0aGlzLmxhYmVsQmluZGluZyRdKS5waXBlKFxuICAgIG1hcCgoW29wdGlvbnMsIGZpbHRlcl0pID0+IHRoaXMuZ2V0RmlsdGVyZWRPcHRpb25zKGZpbHRlciwgb3B0aW9ucykpLFxuICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSksXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc0FuZFNlbGVjdGlvbiQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9vcHRpb25zJCwgdGhpcy5fc2VsZWN0aW9uJF0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYWxsb3dNdWx0aXBsZSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmFsbG93TXVsdGlwbGUpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IFtvcHRpb25dID0gdGhpcy5zZWxlY3Rpb247XG5cbiAgICAgICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24oW29wdGlvbl0pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRTZWxlY3Rpb24oc2VsZWN0aW9uOiBUIHwgVFtdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGVjdGlvbikpIHtcbiAgICAgIHNlbGVjdGlvbiA9IFtzZWxlY3Rpb25dO1xuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGlvbiQubmV4dChzZWxlY3Rpb24pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRTZWxlY3Rpb25Gcm9tVmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHZhbHVlLm1hcCgodikgPT4gdGhpcy5nZXRPcHRpb25CeVZhbHVlKHYpKS5maWx0ZXIoKHYpOiB2IGlzIFQgPT4gdiAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgdGhpcy5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5nZXRPcHRpb25CeVZhbHVlKHZhbHVlKTtcblxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldFNlbGVjdGlvbkZyb21WYWx1ZSQodmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9sYXN0U2VsZWN0aW9uU2V0U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5fbGFzdFNlbGVjdGlvblNldFN1YnNjcmlwdGlvbiA9IHRoaXMub3B0aW9ucyRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoKG8pID0+ICEhby5sZW5ndGgpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5zZXRTZWxlY3Rpb25Gcm9tVmFsdWUodmFsdWUpKSxcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHNldFZhbHVlQmluZGluZyhmbk9yUHJvcGVydHlQYXRoOiBTZWxlY3Rpb25Nb2RlbEJpbmRpbmc8VD4gfCBudWxsKSB7XG4gICAgdGhpcy5fdmFsdWVCaW5kaW5nJC5uZXh0KGZuT3JQcm9wZXJ0eVBhdGgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRLZXlCaW5kaW5nKGZuT3JQcm9wZXJ0eVBhdGg6IFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGwpIHtcbiAgICB0aGlzLl9rZXlCaW5kaW5nJC5uZXh0KGZuT3JQcm9wZXJ0eVBhdGgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMYWJlbEJpbmRpbmcoZm5PclByb3BlcnR5UGF0aDogU2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQ+IHwgbnVsbCkge1xuICAgIHRoaXMuX2xhYmVsQmluZGluZyQubmV4dChmbk9yUHJvcGVydHlQYXRoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRCaW5kaW5nKGZuT3JQcm9wZXJ0eVBhdGg6IFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGwpIHtcbiAgICB0aGlzLl9kaXNhYmxlZEJpbmRpbmckLm5leHQoZm5PclByb3BlcnR5UGF0aCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE9wdGlvbnMob3B0aW9uczogVFtdKSB7XG4gICAgdGhpcy5fb3B0aW9ucyQubmV4dChvcHRpb25zKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3B0aW9uc0Zyb21RdWVyeUxpc3QocXVlcnlMaXN0OiBUeXBlZFF1ZXJ5TGlzdDxUPikge1xuICAgIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCh0aGlzLnNldE9wdGlvbnNGcm9tUXVlcnlMaXN0KTtcblxuICAgIHF1ZXJ5TGlzdC5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHF1ZXJ5TGlzdCksXG4gICAgICAgIHRhcCgobGlzdCkgPT4gdGhpcy5zZXRPcHRpb25zKGxpc3QudG9BcnJheSgpKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPcHRpb25zRnJvbVF1ZXJ5TGlzdCQocXVlcnlMaXN0JDogT2JzZXJ2YWJsZTxUeXBlZFF1ZXJ5TGlzdDxUPiB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0KHRoaXMuc2V0T3B0aW9uc0Zyb21RdWVyeUxpc3QkKTtcblxuICAgIHF1ZXJ5TGlzdCRcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hRdWVyeUxpc3RDaGFuZ2VzKCksXG4gICAgICAgIHRhcCgobGlzdCkgPT4gdGhpcy5zZXRPcHRpb25zKGxpc3Q/LnRvQXJyYXkoKSB8fCBbXSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QWxsb3dNdWx0aXBsZShhbGxvd011bHRpcGxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fYWxsb3dNdWx0aXBsZSQubmV4dChhbGxvd011bHRpcGxlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RmlsdGVyKGZpbHRlcjogc3RyaW5nIHwgbnVsbCkge1xuICAgIGNvbnN0IHNhbml0aXplZEZpbHRlciA9IGZpbHRlcj8udHJpbSgpIHx8ICcnO1xuXG4gICAgdGhpcy5fZmlsdGVyJC5uZXh0KHNhbml0aXplZEZpbHRlcik7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoW10pO1xuICAgIHRoaXMuX29wdGlvbnMkLm5leHQoW10pO1xuICAgIHRoaXMuX3ZhbHVlQmluZGluZyQubmV4dChudWxsKTtcbiAgICB0aGlzLl9rZXlCaW5kaW5nJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rpc2FibGVkQmluZGluZyQubmV4dChudWxsKTtcbiAgICB0aGlzLl9sYWJlbEJpbmRpbmckLm5leHQobnVsbCk7XG4gICAgdGhpcy5fYWxsb3dNdWx0aXBsZSQubmV4dChmYWxzZSk7XG4gIH1cblxuICBnZXRPcHRpb25CeVZhbHVlJCh2YWx1ZTogdW5rbm93bikge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zQW5kU2VsZWN0aW9uJC5waXBlKG1hcCgoKSA9PiB0aGlzLmdldE9wdGlvbkJ5VmFsdWUodmFsdWUpKSk7XG4gIH1cblxuICBnZXRPcHRpb25CeUxhYmVsJChsYWJlbDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNBbmRTZWxlY3Rpb24kLnBpcGUobWFwKCgpID0+IHRoaXMuZ2V0T3B0aW9uQnlMYWJlbChsYWJlbCkpKTtcbiAgfVxuXG4gIGdldE9wdGlvbkJ5S2V5JChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zQW5kU2VsZWN0aW9uJC5waXBlKG1hcCgoKSA9PiB0aGlzLmdldE9wdGlvbkJ5S2V5KGtleSkpKTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQkKG9wdGlvbjogVCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb24kLnBpcGUobWFwKCgpID0+IHRoaXMuaXNTZWxlY3RlZChvcHRpb24pKSk7XG4gIH1cblxuICBpc0Rpc2FibGVkJChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0FuZFNlbGVjdGlvbiQucGlwZShtYXAoKCkgPT4gdGhpcy5pc0Rpc2FibGVkKG9wdGlvbikpKTtcbiAgfVxuXG4gIGdldExhYmVsJChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbEJpbmRpbmckLnBpcGUobWFwKChsYWJlbEJpbmRpbmcpID0+IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIGxhYmVsQmluZGluZykpKTtcbiAgfVxuXG4gIGdldFZhbHVlJChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZUJpbmRpbmckLnBpcGUobWFwKCh2YWx1ZUJpbmRpbmcpID0+IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHZhbHVlQmluZGluZykpKTtcbiAgfVxuXG4gIGdldEtleSQob3B0aW9uOiBUKSB7XG4gICAgcmV0dXJuIHRoaXMua2V5QmluZGluZyQucGlwZShtYXAoKGtleUJpbmRpbmcpID0+IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIGtleUJpbmRpbmcpKSk7XG4gIH1cblxuICBnZXRPcHRpb25CeVZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uKHZhbHVlLCB0aGlzLnZhbHVlQmluZGluZyk7XG4gIH1cblxuICBnZXRPcHRpb25CeUxhYmVsKGxhYmVsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPcHRpb24obGFiZWwsIHRoaXMubGFiZWxCaW5kaW5nKTtcbiAgfVxuXG4gIGdldE9wdGlvbkJ5S2V5KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uKGtleSwgdGhpcy5rZXlCaW5kaW5nKTtcbiAgfVxuXG4gIGdldE9wdGlvbihcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBwcm9wZXJ0eVBhdGg6IFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGwgPSBudWxsLFxuICAgIG9wdGlvbnMgPSBbLi4udGhpcy5vcHRpb25zLCAuLi50aGlzLnNlbGVjdGlvbl0sXG4gICkge1xuICAgIGlmICghcHJvcGVydHlQYXRoKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbiA9PT0gdmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zLmZpbmQoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCFpc09iamVjdChvcHRpb24pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0aGlzLmV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHkob3B0aW9uLCBwcm9wZXJ0eVBhdGgpID09PSB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldE9wdGlvbkJ5SW5kZXgoaW5kZXg6IG51bWJlciwgb3B0aW9ucyA9IHRoaXMuZ2V0RmlsdGVyZWRPcHRpb25zKCkpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIG9wdGlvbnNbaW5kZXhdIHx8IG51bGw7XG4gIH1cblxuICBnZXRPcHRpb25CeU9mZnNldChcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGNvbmZpZzogeyBsb29wPzogYm9vbGVhbjsgY2xhbXA/OiBib29sZWFuOyBza2lwRGlzYWJsZWQ/OiBib29sZWFuOyBvcHRpb25zPzogVFtdIH0gPSB7IGNsYW1wOiB0cnVlIH0sXG4gICk6IFQgfCBudWxsIHtcbiAgICBjb25zdCB7IGxvb3AsIGNsYW1wLCBza2lwRGlzYWJsZWQsIG9wdGlvbnMgPSB0aGlzLmdldEZpbHRlcmVkT3B0aW9ucygpIH0gPSBjb25maWc7XG5cbiAgICBjb25zdCBuZXdJbmRleCA9IGluZGV4ICsgb2Zmc2V0O1xuICAgIGNvbnN0IHJlbWFpbmluZ09mZnNldCA9IG5ld0luZGV4ICogLTE7XG5cbiAgICBsZXQgb3B0aW9uUmVzdWx0OiBUIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAobmV3SW5kZXggPCAwKSB7XG4gICAgICBpZiAobG9vcCkge1xuICAgICAgICBvcHRpb25SZXN1bHQgPSB0aGlzLmdldE9wdGlvbkJ5T2Zmc2V0KHJlbWFpbmluZ09mZnNldCwgb3B0aW9ucy5sZW5ndGggLSAxLCBjb25maWcpO1xuICAgICAgfSBlbHNlIGlmIChjbGFtcCkge1xuICAgICAgICBvcHRpb25SZXN1bHQgPSB0aGlzLmdldEZpcnN0T3B0aW9uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25SZXN1bHQgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV3SW5kZXggPj0gb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGlmIChsb29wKSB7XG4gICAgICAgIG9wdGlvblJlc3VsdCA9IHRoaXMuZ2V0T3B0aW9uQnlPZmZzZXQocmVtYWluaW5nT2Zmc2V0LCAwLCBjb25maWcpO1xuICAgICAgfSBlbHNlIGlmIChjbGFtcCkge1xuICAgICAgICBvcHRpb25SZXN1bHQgPSB0aGlzLmdldExhc3RPcHRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvblJlc3VsdCA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvblJlc3VsdCA9IHRoaXMuZ2V0T3B0aW9uQnlJbmRleChuZXdJbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvblJlc3VsdCAmJiBza2lwRGlzYWJsZWQgJiYgdGhpcy5pc0Rpc2FibGVkKG9wdGlvblJlc3VsdCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkJ5T2Zmc2V0KG9mZnNldCwgbmV3SW5kZXgsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvblJlc3VsdDtcbiAgfVxuXG4gIGdldEZpcnN0T3B0aW9uKG9wdGlvbnMgPSB0aGlzLmdldEZpbHRlcmVkT3B0aW9ucygpKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkJ5SW5kZXgoMCwgb3B0aW9ucyk7XG4gIH1cblxuICBnZXRMYXN0T3B0aW9uKG9wdGlvbnMgPSB0aGlzLmdldEZpbHRlcmVkT3B0aW9ucygpKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkJ5SW5kZXgob3B0aW9ucy5sZW5ndGggLSAxLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldE9wdGlvbkluZGV4KG9wdGlvbjogVCwgb3B0aW9ucyA9IHRoaXMuZ2V0RmlsdGVyZWRPcHRpb25zKCkpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShvcHRpb24pO1xuICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IHRoaXMuZ2V0S2V5KG8pID09PSBrZXkpO1xuXG4gICAgcmV0dXJuIGluZGV4ID09PSAtMSA/IG51bGwgOiBpbmRleDtcbiAgfVxuXG4gIGdldE5vbk11bHRpcGxlU2VsZWN0ZWRPcHRpb24oKTogVCB8IG51bGwge1xuICAgIGlmICh0aGlzLmFsbG93TXVsdGlwbGUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uWzBdIHx8IG51bGw7XG4gIH1cblxuICBnZXROb25NdWx0aXBsZVNlbGVjdGVkT3B0aW9uSW5kZXgoKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dNdWx0aXBsZSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBvcHQgPSB0aGlzLmdldE5vbk11bHRpcGxlU2VsZWN0ZWRPcHRpb24oKTtcblxuICAgIGlmICghb3B0KSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkluZGV4KG9wdCk7XG4gIH1cblxuICBnZXROb25NdWx0aXBsZU9wdGlvbkJ5T2Zmc2V0RnJvbVNlbGVjdGVkKFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIGNvbmZpZzogeyBsb29wPzogYm9vbGVhbjsgY2xhbXA/OiBib29sZWFuIH0gPSB7IGNsYW1wOiB0cnVlIH0sXG4gICkge1xuICAgIGlmICh0aGlzLmFsbG93TXVsdGlwbGUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmdldE5vbk11bHRpcGxlU2VsZWN0ZWRPcHRpb25JbmRleCgpO1xuXG4gICAgaWYgKGluZGV4ID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkJ5T2Zmc2V0KGluZGV4LCBvZmZzZXQsIGNvbmZpZyk7XG4gIH1cblxuICBnZXRMYWJlbChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjRm5PckdldE9wdGlvblByb3BlcnR5KG9wdGlvbiwgdGhpcy5sYWJlbEJpbmRpbmcpO1xuICB9XG5cbiAgZ2V0VmFsdWUob3B0aW9uOiBUKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHRoaXMudmFsdWVCaW5kaW5nKTtcbiAgfVxuXG4gIGdldEtleShvcHRpb246IFQpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjRm5PckdldE9wdGlvblByb3BlcnR5KG9wdGlvbiwgdGhpcy5rZXlCaW5kaW5nKTtcbiAgfVxuXG4gIGdldERpc2FibGVkKG9wdGlvbjogVCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHkob3B0aW9uLCB0aGlzLmRpc2FibGVkQmluZGluZyk7XG4gIH1cblxuICBleGVjRm5PckdldE9wdGlvblByb3BlcnR5KG9wdGlvbjogVCwgZm5PclByb3BlcnR5UGF0aDogU2VsZWN0aW9uTW9kZWxCaW5kaW5nPFQ+IHwgbnVsbCkge1xuICAgIGlmICghZm5PclByb3BlcnR5UGF0aCB8fCAhaXNPYmplY3Qob3B0aW9uKSkgcmV0dXJuIG9wdGlvbjtcblxuICAgIGlmICh0eXBlb2YgZm5PclByb3BlcnR5UGF0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGZuT3JQcm9wZXJ0eVBhdGgob3B0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0T2JqZWN0UHJvcGVydHkob3B0aW9uLCBmbk9yUHJvcGVydHlQYXRoKTtcbiAgfVxuXG4gIGV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHlOdWxsYWJsZShvcHRpb246IFQsIGZuT3JQcm9wZXJ0eVBhdGg6IFNlbGVjdGlvbk1vZGVsQmluZGluZzxUPiB8IG51bGwpIHtcbiAgICBpZiAoIWZuT3JQcm9wZXJ0eVBhdGggfHwgIWlzT2JqZWN0KG9wdGlvbikpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIGZuT3JQcm9wZXJ0eVBhdGgpO1xuICB9XG5cbiAgZ2V0T3B0aW9uUHJvcGVydHkob3B0aW9uOiBULCBwcm9wZXJ0eVBhdGg6IHN0cmluZyB8IG51bGwpIHtcbiAgICBpZiAoIXByb3BlcnR5UGF0aCB8fCAhaXNPYmplY3Qob3B0aW9uKSkgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBnZXRPYmplY3RQcm9wZXJ0eShvcHRpb24sIHByb3BlcnR5UGF0aCk7XG4gIH1cblxuICBpc1NlbGVjdGVkKG9wdGlvbjogVCkge1xuICAgIGNvbnN0IG9wdGlvbktleSA9IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHRoaXMua2V5QmluZGluZyk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRPcHRpb24ob3B0aW9uS2V5LCB0aGlzLmtleUJpbmRpbmcsIHRoaXMuc2VsZWN0aW9uKSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNEaXNhYmxlZChvcHRpb246IFQpIHtcbiAgICByZXR1cm4gISF0aGlzLmV4ZWNGbk9yR2V0T3B0aW9uUHJvcGVydHlOdWxsYWJsZShvcHRpb24sIHRoaXMuZGlzYWJsZWRCaW5kaW5nKTtcbiAgfVxuXG4gIGdldEZpbHRlcmVkT3B0aW9ucyhmaWx0ZXIgPSB0aGlzLmZpbHRlciwgb3B0aW9ucyA9IHRoaXMub3B0aW9ucykge1xuICAgIGlmICghZmlsdGVyKSByZXR1cm4gb3B0aW9ucztcblxuICAgIGNvbnN0IHNwbGl0RmlsdGVyID0gZmlsdGVyLnNwbGl0KCcgJykuZmlsdGVyKChmKSA9PiBmKTtcblxuICAgIHJldHVybiBvcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0TGFiZWwob3B0aW9uKTtcblxuICAgICAgaWYgKCFsYWJlbCB8fCB0eXBlb2YgbGFiZWwgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHNwbGl0TGFiZWwgPSBsYWJlbC5zcGxpdCgnICcpLmZpbHRlcigobCkgPT4gbCk7XG5cbiAgICAgIHJldHVybiBzcGxpdEZpbHRlci5ldmVyeSgoZikgPT4gc3BsaXRMYWJlbC5zb21lKChsKSA9PiBsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZi50b0xvd2VyQ2FzZSgpKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkU2VsZWN0ZWRPcHRpb24ob3B0aW9uOiBUKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dNdWx0aXBsZSkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZChvcHRpb24pKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX3NlbGVjdGlvbiQubmV4dChbLi4udGhpcy5zZWxlY3Rpb24sIG9wdGlvbl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoW29wdGlvbl0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVNlbGVjdGVkT3B0aW9uKG9wdGlvbjogVCkge1xuICAgIGNvbnN0IG9wdGlvbktleSA9IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShvcHRpb24sIHRoaXMua2V5QmluZGluZyk7XG5cbiAgICBpZiAoIXRoaXMuaXNTZWxlY3RlZChvcHRpb24pKSByZXR1cm47XG5cbiAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoXG4gICAgICB0aGlzLnNlbGVjdGlvbi5maWx0ZXIoKHNlbGVjdGVkT3B0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZXhlY0ZuT3JHZXRPcHRpb25Qcm9wZXJ0eShzZWxlY3RlZE9wdGlvbiwgdGhpcy5rZXlCaW5kaW5nKTtcblxuICAgICAgICByZXR1cm4ga2V5ICE9PSBvcHRpb25LZXk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgY2xlYXJTZWxlY3RlZE9wdGlvbnMoKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uJC5uZXh0KFtdKTtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdGVkT3B0aW9uKG9wdGlvbjogVCkge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQob3B0aW9uKSkge1xuICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZE9wdGlvbihvcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZFNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLy8gRklYTUU6IFRvZ2dsZSBzaG91bGQgcmVzcGVjdCBkaXNhYmxlZCBiaW5kaW5nIGlmIGl0IGV4aXN0c1xuICB0b2dnbGVBbGxTZWxlY3RlZE9wdGlvbnMoKSB7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gdGhpcy5nZXRGaWx0ZXJlZE9wdGlvbnMoKTtcbiAgICBjb25zdCB1bnNlbGVjdGVkT3B0aW9ucyA9IGZpbHRlcmVkT3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gIXRoaXMuaXNTZWxlY3RlZChvcHRpb24pKTtcblxuICAgIGlmICh1bnNlbGVjdGVkT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHVuc2VsZWN0ZWRPcHRpb25zLmZpbHRlcigobykgPT4gIXRoaXMuc2VsZWN0aW9uLnNvbWUoKHMpID0+IHRoaXMuZ2V0S2V5KHMpID09PSB0aGlzLmdldEtleShvKSkpO1xuXG4gICAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoWy4uLnRoaXMuc2VsZWN0aW9uLCAuLi5zZWxlY3Rpb25dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24uZmlsdGVyKChzKSA9PiAhZmlsdGVyZWRPcHRpb25zLnNvbWUoKG8pID0+IHRoaXMuZ2V0S2V5KG8pID09PSB0aGlzLmdldEtleShzKSkpO1xuXG4gICAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQoc2VsZWN0aW9uKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==