@sd-angular/core 1.0.78 → 1.0.81

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.
Files changed (52) hide show
  1. package/bundles/sd-angular-core-chip.umd.js +325 -108
  2. package/bundles/sd-angular-core-chip.umd.js.map +1 -1
  3. package/bundles/sd-angular-core-chip.umd.min.js +2 -2
  4. package/bundles/sd-angular-core-chip.umd.min.js.map +1 -1
  5. package/bundles/sd-angular-core-grid-material.umd.js +1 -1
  6. package/bundles/sd-angular-core-grid-material.umd.js.map +1 -1
  7. package/bundles/sd-angular-core-grid-material.umd.min.js +1 -1
  8. package/bundles/sd-angular-core-grid-material.umd.min.js.map +1 -1
  9. package/bundles/sd-angular-core-input.umd.js +1 -1
  10. package/bundles/sd-angular-core-input.umd.js.map +1 -1
  11. package/bundles/sd-angular-core-input.umd.min.js +1 -1
  12. package/bundles/sd-angular-core-input.umd.min.js.map +1 -1
  13. package/bundles/sd-angular-core-loading.umd.js +367 -22
  14. package/bundles/sd-angular-core-loading.umd.js.map +1 -1
  15. package/bundles/sd-angular-core-loading.umd.min.js +15 -1
  16. package/bundles/sd-angular-core-loading.umd.min.js.map +1 -1
  17. package/bundles/sd-angular-core-radio.umd.js +39 -25
  18. package/bundles/sd-angular-core-radio.umd.js.map +1 -1
  19. package/bundles/sd-angular-core-radio.umd.min.js +2 -2
  20. package/bundles/sd-angular-core-radio.umd.min.js.map +1 -1
  21. package/bundles/sd-angular-core-select.umd.js +1 -1
  22. package/bundles/sd-angular-core-select.umd.js.map +1 -1
  23. package/bundles/sd-angular-core-select.umd.min.js +2 -2
  24. package/bundles/sd-angular-core-select.umd.min.js.map +1 -1
  25. package/chip/sd-angular-core-chip.metadata.json +1 -1
  26. package/chip/src/lib/chip.component.d.ts +8 -13
  27. package/esm2015/chip/src/lib/chip.component.js +279 -96
  28. package/esm2015/grid-material/src/lib/components/desktop-cell-view/desktop-cell-view.component.js +2 -2
  29. package/esm2015/input/src/lib/input.component.js +2 -2
  30. package/esm2015/loading/src/lib/loading.service.js +49 -14
  31. package/esm2015/radio/src/lib/radio.component.js +39 -25
  32. package/esm2015/select/src/lib/select.component.js +2 -2
  33. package/fesm2015/sd-angular-core-chip.js +278 -95
  34. package/fesm2015/sd-angular-core-chip.js.map +1 -1
  35. package/fesm2015/sd-angular-core-grid-material.js +1 -1
  36. package/fesm2015/sd-angular-core-grid-material.js.map +1 -1
  37. package/fesm2015/sd-angular-core-input.js +1 -1
  38. package/fesm2015/sd-angular-core-input.js.map +1 -1
  39. package/fesm2015/sd-angular-core-loading.js +48 -13
  40. package/fesm2015/sd-angular-core-loading.js.map +1 -1
  41. package/fesm2015/sd-angular-core-radio.js +38 -25
  42. package/fesm2015/sd-angular-core-radio.js.map +1 -1
  43. package/fesm2015/sd-angular-core-select.js +1 -1
  44. package/fesm2015/sd-angular-core-select.js.map +1 -1
  45. package/grid-material/sd-angular-core-grid-material.metadata.json +1 -1
  46. package/input/sd-angular-core-input.metadata.json +1 -1
  47. package/loading/sd-angular-core-loading.metadata.json +1 -1
  48. package/loading/src/lib/loading.service.d.ts +5 -2
  49. package/package.json +1 -1
  50. package/radio/sd-angular-core-radio.metadata.json +1 -1
  51. package/radio/src/lib/radio.component.d.ts +5 -5
  52. package/{sd-angular-core-1.0.78.tgz → sd-angular-core-1.0.81.tgz} +0 -0
@@ -1,15 +1,14 @@
1
- var _name, _form, _itemChanges, _items, _subscription, _updateValidator;
2
- import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
- import { Component, Input, ViewChild, Output, EventEmitter, ChangeDetectorRef, ContentChild } from '@angular/core';
1
+ var _name, _form, _addable, _allItems, _allItem, _cache, _delay, _itemsChanges, _filteredItems, _subscription, _updateValidator, _loadItems, _loadSelectedItems;
2
+ import { __awaiter, __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { Component, Input, ViewChild, Output, EventEmitter, ChangeDetectorRef, ContentChild, ChangeDetectionStrategy } from '@angular/core';
4
4
  import { COMMA, ENTER } from '@angular/cdk/keycodes';
5
- import { map, startWith } from 'rxjs/operators';
5
+ import { debounceTime, map, startWith, switchMap } from 'rxjs/operators';
6
6
  import * as uuid from 'uuid';
7
7
  import { NgForm, FormControl, Validators } from '@angular/forms';
8
- import { Subscription, Subject } from 'rxjs';
9
- import { SdUtilityService } from '@sd-angular/core/utility';
8
+ import { Subscription, BehaviorSubject, combineLatest } from 'rxjs';
10
9
  import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
11
10
  import { SdChipDisplayDef } from './directives/sd-chip-display-def.directive';
12
- import { SdViewDefDirective } from '@sd-angular/core/common';
11
+ import { SdFormControl, SdViewDefDirective } from '@sd-angular/core/common';
13
12
  class SdChipErrotStateMatcher {
14
13
  constructor(formControl) {
15
14
  this.formControl = formControl;
@@ -21,18 +20,34 @@ class SdChipErrotStateMatcher {
21
20
  }
22
21
  }
23
22
  export class SdChip {
24
- constructor(ref, utilityService) {
23
+ constructor(ref) {
25
24
  this.ref = ref;
26
- this.utilityService = utilityService;
27
25
  _name.set(this, uuid.v4());
28
26
  this.separatorKeysCodes = [ENTER, COMMA];
29
27
  this.selectable = true;
30
28
  _form.set(this, void 0);
29
+ _addable.set(this, void 0);
31
30
  this.removable = true;
32
- _itemChanges.set(this, new Subject());
33
- _items.set(this, []);
31
+ // @Input() set items(items: undefined | any[]) {
32
+ // if (!items) {
33
+ // this.#items = [];
34
+ // } else if (Array.isArray(items)) {
35
+ // this.#items = items.filter(e => (e ?? '').toString().trim() !== '');
36
+ // } else {
37
+ // this.#items = items;
38
+ // }
39
+ // this.inputControl.updateValueAndValidity();
40
+ // this.#itemChanges.next(this.items);
41
+ // }
42
+ // Server search
43
+ this.loading = false;
44
+ _allItems.set(this, void 0);
45
+ _allItem.set(this, {});
46
+ _cache.set(this, {});
47
+ _delay.set(this, 200); // Sau khoảng thời gian delay nếu không có thay đổi thì thì mới bắt đầu thực hiện gọi hàm
48
+ _itemsChanges.set(this, new BehaviorSubject([]));
34
49
  this.limit = 50;
35
- this.selectedItems = [];
50
+ _filteredItems.set(this, void 0);
36
51
  // Validator
37
52
  this.isRequired = false;
38
53
  this.modelChange = new EventEmitter();
@@ -41,7 +56,7 @@ export class SdChip {
41
56
  this.chipSelected = new EventEmitter();
42
57
  this.isFocused = false;
43
58
  this.inputControl = new FormControl();
44
- this.formControl = new FormControl();
59
+ this.formControl = new SdFormControl();
45
60
  this.matcher = new SdChipErrotStateMatcher(this.formControl);
46
61
  _subscription.set(this, new Subscription());
47
62
  _updateValidator.set(this, () => {
@@ -62,40 +77,112 @@ export class SdChip {
62
77
  this.formControl.setAsyncValidators(asyncValidators);
63
78
  this.formControl.updateValueAndValidity();
64
79
  });
65
- this.filter = (value) => {
66
- return __classPrivateFieldGet(this, _items).filter(item => {
67
- var _a;
68
- if ((_a = this.formControl.value) === null || _a === void 0 ? void 0 : _a.some(val => val === item[this.valueField])) {
69
- return false;
70
- }
71
- return !value || this.utilityService.changeAliasLowerCase(item[this.displayField])
72
- .indexOf(this.utilityService.changeAliasLowerCase(value)) !== -1;
73
- }).filter((item, index) => index < this.limit);
74
- };
80
+ _loadItems.set(this, (searchText, items) => __awaiter(this, void 0, void 0, function* () {
81
+ searchText = (searchText === null || searchText === void 0 ? void 0 : searchText.toString()) || '';
82
+ if (__classPrivateFieldGet(this, _cache)[searchText] === undefined) {
83
+ this.loading = true;
84
+ const results = yield items(searchText).catch(() => []).finally(() => this.loading = false);
85
+ const objItem = Array.toObject(results, this.valueField);
86
+ __classPrivateFieldSet(this, _allItem, Object.assign(Object.assign({}, __classPrivateFieldGet(this, _allItem)), objItem));
87
+ __classPrivateFieldGet(this, _cache)[searchText] = results.union(this.valueField);
88
+ }
89
+ // if (!this.multiple) {
90
+ // return this.#cache[searchText];
91
+ // }
92
+ const selectedItems = yield __classPrivateFieldGet(this, _loadSelectedItems).call(this, this.formControl.value, items);
93
+ // Đưa những selectedItems lên đầu nếu không mat-select-trigger sẽ không work
94
+ return [...selectedItems, ...__classPrivateFieldGet(this, _cache)[searchText]].union(this.valueField);
95
+ }));
96
+ _loadSelectedItems.set(this, (value, items) => __awaiter(this, void 0, void 0, function* () {
97
+ if (!(value === null || value === void 0 ? void 0 : value.toString())) {
98
+ return [];
99
+ }
100
+ const values = Array.isArray(value) ? value : [value];
101
+ if (!this.valueField && !this.displayField) {
102
+ return values;
103
+ }
104
+ this.loading = true;
105
+ if (values.some(val => __classPrivateFieldGet(this, _allItem)[val] === undefined)) {
106
+ const results = yield items(value, true).catch(() => []).finally(() => this.loading = false);
107
+ const objItem = Array.toObject(results, this.valueField);
108
+ const objValue = Array.toObject(values.map(val => ({ [val === null || val === void 0 ? void 0 : val.toString()]: { [this.valueField]: val, [this.displayField]: val } })), this.valueField);
109
+ __classPrivateFieldSet(this, _allItem, Object.assign(Object.assign(Object.assign({}, objValue), __classPrivateFieldGet(this, _allItem)), objItem));
110
+ }
111
+ return values.map(val => { var _a; return (_a = __classPrivateFieldGet(this, _allItem)[val === null || val === void 0 ? void 0 : val.toString()]) !== null && _a !== void 0 ? _a : { [this.valueField]: val, [this.displayField]: val }; });
112
+ }));
75
113
  this.onAdd = (event) => {
76
- var _a, _b;
114
+ var _a, _b, _c, _d, _e;
77
115
  // Add item only when MatAutocomplete is not open
78
116
  // To make sure this does not conflict with OptionSelected Event
79
- if (!this.matAutocomplete.isOpen) {
80
- const value = ((_a = event.value) !== null && _a !== void 0 ? _a : '').toString().toLowerCase().trim();
81
- if (value) {
82
- const item = __classPrivateFieldGet(this, _items).find(e => e[this.displayField]
83
- && e[this.displayField].toString().toLowerCase().trim() === value);
117
+ // if (!this.matAutocomplete.isOpen) {
118
+ // const value = (event.value ?? '').toString().trim();
119
+ // if (value) {
120
+ // if (this.valueField && this.displayField) {
121
+ // const item = this.#filteredItems.find(e => e[this.displayField] === value);
122
+ // if (item) {
123
+ // const values: (string | number)[] = this.formControl.value ?? [];
124
+ // values.push(item[this.valueField]);
125
+ // this.formControl.setValue(values);
126
+ // } else if (this.#addable) {
127
+ // const values: (string | number)[] = this.formControl.value ?? [];
128
+ // values.push(value);
129
+ // this.formControl.setValue(values);
130
+ // }
131
+ // } else {
132
+ // console.log(value);
133
+ // console.log(this.#filteredItems);
134
+ // const item = this.#filteredItems.find(item => item === value);
135
+ // if (item) {
136
+ // const values: (string | number)[] = this.formControl.value ?? [];
137
+ // values.push(item);
138
+ // this.formControl.setValue(values);
139
+ // } else if (this.#addable) {
140
+ // const values: (string | number)[] = this.formControl.value ?? [];
141
+ // values.push(value);
142
+ // this.formControl.setValue(values);
143
+ // }
144
+ // }
145
+ // }
146
+ // this.inputControl.setValue('');
147
+ // }
148
+ const value = ((_a = event.value) !== null && _a !== void 0 ? _a : '').toString().trim();
149
+ if (value) {
150
+ if (this.valueField && this.displayField) {
151
+ const item = __classPrivateFieldGet(this, _filteredItems).find(e => e[this.displayField] === value);
84
152
  if (item) {
85
153
  const values = (_b = this.formControl.value) !== null && _b !== void 0 ? _b : [];
86
154
  values.push(item[this.valueField]);
87
155
  this.formControl.setValue(values);
88
156
  }
157
+ else if (__classPrivateFieldGet(this, _addable)) {
158
+ const values = (_c = this.formControl.value) !== null && _c !== void 0 ? _c : [];
159
+ values.push(value);
160
+ this.formControl.setValue(values);
161
+ }
162
+ }
163
+ else {
164
+ const item = __classPrivateFieldGet(this, _filteredItems).find(item => item === value);
165
+ if (item) {
166
+ const values = (_d = this.formControl.value) !== null && _d !== void 0 ? _d : [];
167
+ values.push(item);
168
+ this.formControl.setValue(values);
169
+ }
170
+ else if (__classPrivateFieldGet(this, _addable)) {
171
+ const values = (_e = this.formControl.value) !== null && _e !== void 0 ? _e : [];
172
+ values.push(value);
173
+ this.formControl.setValue(values);
174
+ }
89
175
  }
90
- this.inputControl.setValue('');
91
176
  }
177
+ this.input.nativeElement.value = '';
178
+ this.inputControl.setValue('');
92
179
  };
93
180
  // andn1 viết để xử lý tạm us B2B1D-18289 ở S69
94
181
  this.onAdd2 = (event) => {
95
182
  var _a, _b;
96
183
  const value = ((_a = event.value) !== null && _a !== void 0 ? _a : '').toString().toLowerCase().trim();
97
184
  if (value) {
98
- const item = __classPrivateFieldGet(this, _items).find(e => e[this.valueField]
185
+ const item = __classPrivateFieldGet(this, _filteredItems).find(e => e[this.valueField]
99
186
  && e[this.valueField].toString().toLowerCase().trim() === value);
100
187
  if (item) {
101
188
  const values = (_b = this.formControl.value) !== null && _b !== void 0 ? _b : [];
@@ -106,56 +193,92 @@ export class SdChip {
106
193
  }
107
194
  }
108
195
  this.inputControl.setValue('');
109
- this.ref.detectChanges();
110
196
  };
111
197
  this.onRemove = (item) => {
112
198
  var _a;
113
199
  const values = (_a = this.formControl.value) !== null && _a !== void 0 ? _a : [];
114
- this.formControl.setValue(values.filter(value => (item === null || item === void 0 ? void 0 : item[this.valueField]) !== value));
200
+ if (typeof (item) === 'string' || typeof (item) === 'number') {
201
+ this.formControl.setValue(values.filter(value => item !== value));
202
+ }
203
+ else if (this.valueField) {
204
+ this.formControl.setValue(values.filter(value => (item === null || item === void 0 ? void 0 : item[this.valueField]) !== value));
205
+ }
115
206
  this.inputControl.setValue('');
116
207
  };
117
208
  this.select = (item) => {
118
209
  this.chipSelected.emit(item);
119
210
  };
211
+ // onSelect = (event: MatAutocompleteSelectedEvent) => {
212
+ // const value = (event.option.value?.[this.valueField] ?? '').toString().trim();
213
+ // if (value) {
214
+ // const item = this.#items.find(e => e[this.valueField]
215
+ // && e[this.valueField].toString().trim() === value);
216
+ // if (item) {
217
+ // const values: (string | number)[] = this.formControl.value ?? [];
218
+ // values.push(item[this.valueField]);
219
+ // this.formControl.setValue(values);
220
+ // this.input.nativeElement.value = '';
221
+ // this.inputControl.setValue('');
222
+ // setTimeout(() => {
223
+ // this.autocompleteTrigger?.openPanel();
224
+ // }, 0);
225
+ // }
226
+ // }
227
+ // }
120
228
  this.onSelect = (event) => {
121
- var _a, _b, _c;
122
- const value = ((_b = (_a = event.option.value) === null || _a === void 0 ? void 0 : _a[this.valueField]) !== null && _b !== void 0 ? _b : '').toString().trim();
123
- if (value) {
124
- const item = __classPrivateFieldGet(this, _items).find(e => e[this.valueField]
125
- && e[this.valueField].toString().trim() === value);
126
- if (item) {
127
- const values = (_c = this.formControl.value) !== null && _c !== void 0 ? _c : [];
128
- values.push(item[this.valueField]);
129
- this.formControl.setValue(values);
130
- this.input.nativeElement.value = '';
131
- this.inputControl.setValue('');
132
- setTimeout(() => {
133
- var _a;
134
- (_a = this.autocompleteTrigger) === null || _a === void 0 ? void 0 : _a.openPanel();
135
- }, 0);
136
- }
137
- }
138
- };
139
- this.displayFn = (value) => {
140
- if (typeof value === 'string') {
141
- if (!__classPrivateFieldGet(this, _items)) {
142
- return undefined;
143
- }
144
- const selectedItem = __classPrivateFieldGet(this, _items).find(item => item[this.valueField] === value);
145
- if (selectedItem) {
146
- return selectedItem[this.displayField];
147
- }
148
- if (__classPrivateFieldGet(this, _items).some(item => item[this.displayField].toLowerCase().indexOf(value.toLowerCase()) !== -1)) {
149
- return value;
229
+ var _a;
230
+ const item = event.option.value;
231
+ const values = (_a = this.formControl.value) !== null && _a !== void 0 ? _a : [];
232
+ if (item) {
233
+ if (typeof (item) === 'string' || typeof (item) === 'number') {
234
+ if (!values.includes(item)) {
235
+ values.push(item);
236
+ this.formControl.setValue(values);
237
+ this.modelChange.emit(values);
238
+ this.sdChange.emit(values);
239
+ setTimeout(() => {
240
+ var _a;
241
+ (_a = this.autocompleteTrigger) === null || _a === void 0 ? void 0 : _a.openPanel();
242
+ }, 0);
243
+ }
150
244
  }
151
- else {
152
- return undefined;
245
+ else if (this.valueField) {
246
+ const val = (item === null || item === void 0 ? void 0 : item[this.valueField]) || null;
247
+ if (!values.includes(val)) {
248
+ values.push(val);
249
+ this.formControl.setValue(values);
250
+ this.modelChange.emit(values);
251
+ this.sdChange.emit(values);
252
+ setTimeout(() => {
253
+ var _a;
254
+ (_a = this.autocompleteTrigger) === null || _a === void 0 ? void 0 : _a.openPanel();
255
+ }, 0);
256
+ }
153
257
  }
154
- }
155
- else {
156
- return value ? value[this.displayField] : undefined;
258
+ this.input.nativeElement.value = '';
259
+ this.inputControl.setValue('', {
260
+ emitEvent: false
261
+ });
157
262
  }
158
263
  };
264
+ // displayFn = (value: string | { [key: string]: string }): string | undefined => {
265
+ // if (typeof value === 'string') {
266
+ // if (!this.#items) {
267
+ // return undefined;
268
+ // }
269
+ // const selectedItem = this.#items.find(item => item[this.valueField] === value);
270
+ // if (selectedItem) {
271
+ // return selectedItem[this.displayField];
272
+ // }
273
+ // if (this.#items.some(item => item[this.displayField].toLowerCase().indexOf(value.toLowerCase()) !== -1)) {
274
+ // return value;
275
+ // } else {
276
+ // return undefined;
277
+ // }
278
+ // } else {
279
+ // return value ? value[this.displayField] : undefined;
280
+ // }
281
+ // }
159
282
  this.onFocus = () => {
160
283
  this.isFocused = true;
161
284
  this.inputControl.setValue('');
@@ -207,30 +330,32 @@ export class SdChip {
207
330
  }
208
331
  }
209
332
  }
333
+ set addable(val) {
334
+ __classPrivateFieldSet(this, _addable, (val === '') || val);
335
+ }
210
336
  set _removable(val) {
211
337
  this.removable = (val === '') || val;
212
338
  }
213
339
  set items(items) {
340
+ __classPrivateFieldSet(this, _delay, 0);
214
341
  if (!items) {
215
- __classPrivateFieldSet(this, _items, []);
342
+ __classPrivateFieldGet(this, _itemsChanges).next([]);
216
343
  }
217
344
  else if (Array.isArray(items)) {
218
- __classPrivateFieldSet(this, _items, items.filter(e => (e !== null && e !== void 0 ? e : '').toString().trim() !== ''));
345
+ __classPrivateFieldGet(this, _itemsChanges).next(items.filter(e => e !== null && e !== undefined));
219
346
  }
220
347
  else {
221
- __classPrivateFieldSet(this, _items, items);
348
+ __classPrivateFieldSet(this, _delay, 500);
349
+ __classPrivateFieldGet(this, _itemsChanges).next(items);
222
350
  }
223
- this.inputControl.updateValueAndValidity();
224
- __classPrivateFieldGet(this, _itemChanges).next(this.items);
351
+ this.formControl.updateValueAndValidity();
225
352
  }
226
353
  // model
227
354
  set model(values) {
228
355
  if (!Array.isArray(values)) {
229
356
  values = [];
230
357
  }
231
- this.formControl.setValue(values, {
232
- emitEvent: false
233
- });
358
+ this.formControl.setValue(values);
234
359
  }
235
360
  set required(val) {
236
361
  this.isRequired = (val === '') || val;
@@ -257,28 +382,85 @@ export class SdChip {
257
382
  }
258
383
  }
259
384
  ngOnInit() {
260
- this.filteredItems = this.inputControl.valueChanges.pipe(startWith(''), map(item => { var _a; return typeof item === 'string' ? item : ((_a = item === null || item === void 0 ? void 0 : item[this.displayField]) !== null && _a !== void 0 ? _a : ''); }), map(name => this.filter(name)));
261
385
  }
262
386
  ngAfterViewInit() {
263
387
  var _a;
264
- __classPrivateFieldGet(this, _subscription).add(this.formControl.valueChanges.subscribe(() => {
265
- const values = this.formControl.value || [];
266
- this.selectedItems = __classPrivateFieldGet(this, _items).filter(item => values.findIndex(value => value === (item === null || item === void 0 ? void 0 : item[this.valueField])) !== -1);
267
- this.modelChange.emit(values);
268
- this.sdChange.emit(values);
269
- setTimeout(() => {
270
- var _a;
271
- (_a = __classPrivateFieldGet(this, _form)) === null || _a === void 0 ? void 0 : _a.markAsDirty();
272
- }, 0);
388
+ __classPrivateFieldGet(this, _subscription).add(this.formControl.sdChanges.subscribe(() => {
389
+ this.ref.markForCheck();
273
390
  }));
274
- __classPrivateFieldGet(this, _subscription).add(__classPrivateFieldGet(this, _itemChanges).pipe(startWith(__classPrivateFieldGet(this, _items))).subscribe(() => {
391
+ __classPrivateFieldSet(this, _allItems, combineLatest([
392
+ __classPrivateFieldGet(this, _itemsChanges).asObservable(),
393
+ this.inputControl.valueChanges.pipe(startWith(''), debounceTime(__classPrivateFieldGet(this, _delay))),
394
+ this.formControl.valueChanges.pipe(startWith(this.formControl.value))
395
+ ]).pipe(switchMap(([items]) => __awaiter(this, void 0, void 0, function* () {
396
+ const val = this.inputControl.value;
275
397
  const values = this.formControl.value || [];
276
- this.selectedItems = [];
277
- for (const value of values) {
278
- const item = __classPrivateFieldGet(this, _items).find(e => (e === null || e === void 0 ? void 0 : e[this.valueField]) === value) || {};
279
- this.selectedItems.push(Object.assign(Object.assign({}, item), { [this.valueField]: value }));
398
+ if (typeof (items) === 'function') {
399
+ return yield __classPrivateFieldGet(this, _loadItems).call(this, val, items);
280
400
  }
281
- }));
401
+ __classPrivateFieldSet(this, _allItem, items.toObject(this.valueField));
402
+ const hasFields = !!this.valueField && !!this.displayField;
403
+ __classPrivateFieldSet(this, _filteredItems, items.filter(item => {
404
+ const value = hasFields ? item[this.valueField] : item;
405
+ const display = hasFields ? item[this.displayField] : item;
406
+ if (String.aliasIncludes(value, val) || String.aliasIncludes(display, val)) {
407
+ return true;
408
+ }
409
+ return values.some(e => e === value);
410
+ }));
411
+ return __classPrivateFieldGet(this, _filteredItems);
412
+ }))));
413
+ this.selectedItems = combineLatest([
414
+ __classPrivateFieldGet(this, _itemsChanges).asObservable(),
415
+ this.formControl.valueChanges.pipe(startWith(this.formControl.value))
416
+ ])
417
+ .pipe(switchMap(([items, val]) => __awaiter(this, void 0, void 0, function* () {
418
+ var _b;
419
+ // Vì một số lý do chưa xác định mà khi sử dụng sdViewDef thì khi chuyển sang dạng view sẽ trigger val = null
420
+ // Nhưng formControl.value vẫn có giá trị đúng nên thực hiện gán val = this.formControl.value;
421
+ val = this.formControl.value;
422
+ if (!this.valueField) {
423
+ return this.formControl.value;
424
+ }
425
+ if (typeof (items) === 'function') {
426
+ return yield __classPrivateFieldGet(this, _loadSelectedItems).call(this, val, items);
427
+ }
428
+ return (_b = (this.formControl.value || [])) === null || _b === void 0 ? void 0 : _b.map(value => {
429
+ return (items === null || items === void 0 ? void 0 : items.find(item => item[this.valueField] === value)) || {
430
+ [this.valueField]: value,
431
+ [this.displayField]: value
432
+ };
433
+ });
434
+ })));
435
+ this.filteredItems = __classPrivateFieldGet(this, _allItems).pipe(map(allItems => allItems.filter(item => {
436
+ const values = this.formControl.value || [];
437
+ if (this.valueField) {
438
+ return !values.includes(item === null || item === void 0 ? void 0 : item[this.valueField]);
439
+ }
440
+ return !values.includes(item);
441
+ }).paging(this.limit)));
442
+ // this.display = this.selectedItems.pipe(
443
+ // map(selectedItems => selectedItems?.map(item => this.displayField ? item[this.displayField] : item)?.join(', ')));
444
+ // this.#subscription.add(this.formControl.valueChanges.subscribe(() => {
445
+ // const values: (string | number)[] = this.formControl.value || [];
446
+ // this.selectedItems = this.#items.filter(item => values.findIndex(value => value === item?.[this.valueField]) !== -1);
447
+ // this.modelChange.emit(values);
448
+ // this.sdChange.emit(values);
449
+ // setTimeout(() => {
450
+ // this.#form?.markAsDirty();
451
+ // }, 0);
452
+ // }));
453
+ // this.#subscription.add(this.#itemChanges.pipe(startWith(this.#items)).subscribe(() => {
454
+ // const values: (string | number)[] = this.formControl.value || [];
455
+ // this.selectedItems = [];
456
+ // for (const value of values) {
457
+ // const item = this.#items.find(e => e?.[this.valueField] === value) || {};
458
+ // this.selectedItems.push({
459
+ // ...item,
460
+ // [this.valueField]: value
461
+ // });
462
+ // }
463
+ // }));
282
464
  (_a = __classPrivateFieldGet(this, _form)) === null || _a === void 0 ? void 0 : _a.addControl(__classPrivateFieldGet(this, _name), this.formControl);
283
465
  }
284
466
  ngOnDestroy() {
@@ -287,22 +469,23 @@ export class SdChip {
287
469
  __classPrivateFieldGet(this, _subscription).unsubscribe();
288
470
  }
289
471
  }
290
- _name = new WeakMap(), _form = new WeakMap(), _itemChanges = new WeakMap(), _items = new WeakMap(), _subscription = new WeakMap(), _updateValidator = new WeakMap();
472
+ _name = new WeakMap(), _form = new WeakMap(), _addable = new WeakMap(), _allItems = new WeakMap(), _allItem = new WeakMap(), _cache = new WeakMap(), _delay = new WeakMap(), _itemsChanges = new WeakMap(), _filteredItems = new WeakMap(), _subscription = new WeakMap(), _updateValidator = new WeakMap(), _loadItems = new WeakMap(), _loadSelectedItems = new WeakMap();
291
473
  SdChip.decorators = [
292
474
  { type: Component, args: [{
293
475
  selector: 'sd-chip',
294
- template: "<div class=\"d-flex align-items-center\" [class.sd-view]=\"sdView?.templateRef\" [class.c-focused]=\"isFocused\"\r\n [class.c-disabled]=\"formControl.disabled\" (click)=\"onClick()\">\r\n <ng-container *ngIf=\"sdView?.templateRef && !autocompleteTrigger?.panelOpen && !isFocused; else default\">\r\n <ng-container *ngTemplateOutlet=\"sdView.templateRef;context: { value: formControl.value}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #default>\r\n <mat-form-field class=\"c-md\" [ngClass]=\"{'c-sm': size === 'sm'}\" appearance=\"outline\">\r\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\r\n <mat-chip-list [formControl]=\"formControl\" #chipList>\r\n <ng-container *ngFor=\"let item of selectedItems\">\r\n <mat-chip *ngIf=\"item\" [selectable]=\"selectable\" [removable]=\"true\" (removed)=\"onRemove(item)\"\r\n [selected]=\"item.isSelected\" (selectionChange)=\"select(item)\" [disabled]=\"inputControl.disabled\"\r\n (click)=\"item.isSelected = !item.isSelected\">\r\n <ng-container *ngIf=\"sdChipDisplay?.templateRef\">\r\n <ng-container *ngTemplateOutlet=\"sdChipDisplay.templateRef;context:{item: item}\">\r\n </ng-container>\r\n </ng-container>\r\n <span *ngIf=\"!sdChipDisplay?.templateRef\">{{item[displayField] || item[valueField]}}</span>\r\n <mat-icon *ngIf=\"!inputControl.disabled && item | sdRemovableChip:removable\" matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </ng-container>\r\n <input #autocompleteTrigger [formControl]=\"inputControl\" [placeholder]=\"placeholder || label\"\r\n [matAutocomplete]=\"auto\" [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n (matChipInputTokenEnd)=\"onAdd($event)\" autocomplete=\"off\" [errorStateMatcher]=\"matcher\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" matInput #input>\r\n </mat-chip-list>\r\n <mat-error *ngIf=\"formControl?.errors?.minItem\">\r\n {{formControl?.errors?.minItem}}\r\n </mat-error>\r\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayFn\" (optionSelected)=\"onSelect($event)\">\r\n <mat-option *ngFor=\"let item of filteredItems | async\" [value]=\"item\">\r\n {{item[displayField]}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </ng-template>\r\n</div>",
476
+ template: "<div class=\"d-flex align-items-center\" [class.sd-view]=\"sdView?.templateRef\" [class.c-focused]=\"isFocused\"\r\n [class.c-disabled]=\"formControl.disabled\" (click)=\"onClick()\">\r\n <ng-container *ngIf=\"sdView?.templateRef && !autocompleteTrigger?.panelOpen && !isFocused; else default\">\r\n <ng-container *ngTemplateOutlet=\"sdView.templateRef;context: { value: formControl.value}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #default>\r\n <mat-form-field class=\"c-md\" [ngClass]=\"{'c-sm': size === 'sm'}\" appearance=\"outline\">\r\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\r\n <mat-chip-list [formControl]=\"formControl\" #chipList>\r\n <ng-container *ngFor=\"let item of selectedItems | async\">\r\n <mat-chip *ngIf=\"item\" [selectable]=\"selectable\" [removable]=\"true\" (removed)=\"onRemove(item)\"\r\n [selected]=\"item.isSelected\" (selectionChange)=\"select(item)\" [disabled]=\"inputControl.disabled\"\r\n (click)=\"item.isSelected = !item.isSelected\">\r\n <ng-container *ngIf=\"sdChipDisplay?.templateRef\">\r\n <ng-container *ngTemplateOutlet=\"sdChipDisplay.templateRef;context:{item: item}\">\r\n </ng-container>\r\n </ng-container>\r\n <span *ngIf=\"!sdChipDisplay?.templateRef\">{{item[displayField] || item[valueField] || item}}</span>\r\n <mat-icon *ngIf=\"!inputControl.disabled && item | sdRemovableChip:removable\" matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </ng-container>\r\n <input #autocompleteTrigger [formControl]=\"inputControl\" [placeholder]=\"placeholder || label\"\r\n [matAutocomplete]=\"auto\" [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n (matChipInputTokenEnd)=\"onAdd($event)\" autocomplete=\"off\" [errorStateMatcher]=\"matcher\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" matInput #input>\r\n </mat-chip-list>\r\n <mat-error *ngIf=\"formControl?.errors?.minItem\">\r\n {{formControl?.errors?.minItem}}\r\n </mat-error>\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event)\">\r\n <mat-option *ngFor=\"let item of filteredItems | async\" [value]=\"item\" matTooltipPosition=\"above\"\r\n [matTooltip]=\"displayField ? item[displayField] : item\">\r\n {{ displayField ? item[displayField] : item }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </ng-template>\r\n</div>",
477
+ changeDetection: ChangeDetectionStrategy.OnPush,
295
478
  styles: [":host{display:block;padding-top:5px}:host ::ng-deep mat-form-field.c-md .mat-form-field-infix{min-height:43.5px;padding:2px 0}:host ::ng-deep mat-form-field.c-md .mat-standard-chip{min-height:26px;padding:7px 10px}:host ::ng-deep mat-form-field.c-md .mat-standard-chip.mat-chip-with-trailing-icon{padding:7px 7px 7px 10px}.sd-view:not(.c-focused):not(.c-disabled):hover{background-color:#ebecf0}"]
296
479
  },] }
297
480
  ];
298
481
  SdChip.ctorParameters = () => [
299
- { type: ChangeDetectorRef },
300
- { type: SdUtilityService }
482
+ { type: ChangeDetectorRef }
301
483
  ];
302
484
  SdChip.propDecorators = {
303
485
  name: [{ type: Input }],
304
486
  size: [{ type: Input }],
305
487
  form: [{ type: Input }],
488
+ addable: [{ type: Input }],
306
489
  label: [{ type: Input }],
307
490
  valueField: [{ type: Input }],
308
491
  displayField: [{ type: Input }],
@@ -326,4 +509,4 @@ SdChip.propDecorators = {
326
509
  sdView: [{ type: ContentChild, args: [SdViewDefDirective,] }],
327
510
  sdChipDisplay: [{ type: ContentChild, args: [SdChipDisplayDef,] }]
328
511
  };
329
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvbmdoaWF0dDE1X29uZW1vdW50L0RvY3VtZW50cy9saWItY29yZS11aS9wcm9qZWN0cy9zZC1jb3JlL2NoaXAvIiwic291cmNlcyI6WyJzcmMvbGliL2NoaXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixZQUFZLEVBR1osaUJBQWlCLEVBRWpCLFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBVyxXQUFXLEVBQTRDLFVBQVUsRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4SSxPQUFPLEVBQWMsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUc1RCxPQUFPLEVBQWlELHNCQUFzQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHdkgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsTUFBTSx1QkFBdUI7SUFDM0IsWUFBb0IsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7SUFBSSxDQUFDO0lBQ2pELFlBQVksQ0FBQyxPQUEyQixFQUFFLElBQXdDOztRQUNoRixNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMzQyxP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b0JBT0wsS0FBSzt1QkFVTCxLQUFLO21CQU1MLEtBQUssU0FBQyxLQUFLO21CQUtYLEtBQUssU0FBQyxLQUFLOzBCQUlYLE1BQU07dUJBR04sS0FBSzt1QkFXTCxNQUFNO3VCQUNOLE1BQU07MkJBQ04sTUFBTTtvQkFFTixTQUFTLFNBQUMsT0FBTzs4QkFDakIsU0FBUyxTQUFDLE1BQU07dUJBQ2hCLFNBQVMsU0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2tDQUN0QyxTQUFTLFNBQUMsc0JBQXNCLEVBQUUsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7cUJBQ2xFLFlBQVksU0FBQyxrQkFBa0I7NEJBQy9CLFlBQVksU0FBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkluaXQsIE9uRGVzdHJveSxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgQ29udGVudENoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENPTU1BLCBFTlRFUiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XHJcbmltcG9ydCB7IG1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xyXG5pbXBvcnQgeyBOZ0Zvcm0sIE5nTW9kZWwsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvckZuLCBBc3luY1ZhbGlkYXRvckZuLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTZFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS91dGlsaXR5JztcclxuaW1wb3J0IHsgU2RUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQHNkLWFuZ3VsYXIvY29yZS90cmFuc2xhdGUnO1xyXG5pbXBvcnQgeyBNYXRDaGlwSW5wdXRFdmVudCwgTWF0Q2hpcExpc3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XHJcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZSwgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XHJcbmltcG9ydCB7IFNkQ2hpcFVwZGF0ZSB9IGZyb20gJy4vY2hpcC5tb2RlbCc7XHJcbmltcG9ydCB7IEVycm9yU3RhdGVNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XHJcbmltcG9ydCB7IFNkQ2hpcERpc3BsYXlEZWYgfSBmcm9tICcuL2RpcmVjdGl2ZXMvc2QtY2hpcC1kaXNwbGF5LWRlZi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTZFZpZXdEZWZEaXJlY3RpdmUgfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL2NvbW1vbic7XHJcblxyXG5jbGFzcyBTZENoaXBFcnJvdFN0YXRlTWF0Y2hlciBpbXBsZW1lbnRzIEVycm9yU3RhdGVNYXRjaGVyIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1Db250cm9sOiBGb3JtQ29udHJvbCkgeyB9XHJcbiAgaXNFcnJvclN0YXRlKGNvbnRyb2w6IEZvcm1Db250cm9sIHwgbnVsbCwgZm9ybTogRm9ybUdyb3VwRGlyZWN0aXZlIHwgTmdGb3JtIHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaXNTdWJtaXR0ZWQgPSBmb3JtICYmIGZvcm0uc3VibWl0dGVkO1xyXG4gICAgcmV0dXJuICEhKHRoaXMuZm9ybUNvbnRyb2w/LmludmFsaWQgJiYgKHRoaXMuZm9ybUNvbnRyb2w/LmRpcnR5IHx8IHRoaXMuZm9ybUNvbnRyb2w/LnRvdWNoZWQgfHwgaXNTdWJtaXR0ZWQpKTtcclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2QtY2hpcCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NoaXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NoaXAuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2RDaGlwIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gICNuYW1lID0gdXVpZC52NCgpO1xyXG4gIEBJbnB1dCgpIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XHJcbiAgICBpZiAodmFsKSB7XHJcbiAgICAgIHRoaXMuI25hbWUgPSB2YWw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW10gPSBbRU5URVIsIENPTU1BXTtcclxuICBzZWxlY3RhYmxlID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzaXplOiAnc20nIHwgJ2xnJztcclxuICAjZm9ybTogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIHNldCBmb3JtKHZhbDogTmdGb3JtIHwgRm9ybUdyb3VwKSB7XHJcbiAgICBpZiAodmFsKSB7XHJcbiAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBOZ0Zvcm0pIHtcclxuICAgICAgICB0aGlzLiNmb3JtID0gdmFsLmZvcm07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy4jZm9ybSA9IHZhbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHZhbHVlRmllbGQ6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNwbGF5RmllbGQ6IHN0cmluZztcclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIHJlbW92YWJsZTogYm9vbGVhbiB8ICgoaXRlbTogYW55KSA9PiBib29sZWFuKSA9IHRydWU7XHJcbiAgQElucHV0KCdyZW1vdmFibGUnKSBzZXQgX3JlbW92YWJsZSh2YWw6ICcnIHwgYm9vbGVhbiB8ICgoaXRlbTogYW55KSA9PiBib29sZWFuKSkge1xyXG4gICAgdGhpcy5yZW1vdmFibGUgPSAodmFsID09PSAnJykgfHwgdmFsO1xyXG4gIH1cclxuICAjaXRlbUNoYW5nZXMgPSBuZXcgU3ViamVjdDxhbnlbXT4oKTtcclxuICAjaXRlbXM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgc2V0IGl0ZW1zKGl0ZW1zOiB1bmRlZmluZWQgfCBhbnlbXSkge1xyXG4gICAgaWYgKCFpdGVtcykge1xyXG4gICAgICB0aGlzLiNpdGVtcyA9IFtdO1xyXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xyXG4gICAgICB0aGlzLiNpdGVtcyA9IGl0ZW1zLmZpbHRlcihlID0+IChlID8/ICcnKS50b1N0cmluZygpLnRyaW0oKSAhPT0gJycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy4jaXRlbXMgPSBpdGVtcztcclxuICAgIH1cclxuICAgIHRoaXMuaW5wdXRDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuI2l0ZW1DaGFuZ2VzLm5leHQodGhpcy5pdGVtcyk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIGxpbWl0ID0gNTA7XHJcbiAgc2VsZWN0ZWRJdGVtczogYW55W10gPSBbXTtcclxuICBmaWx0ZXJlZEl0ZW1zOiBPYnNlcnZhYmxlPGFueVtdPjtcclxuXHJcbiAgaXB0OiBhbnk7XHJcblxyXG4gIC8vIG1vZGVsXHJcbiAgQElucHV0KCkgc2V0IG1vZGVsKHZhbHVlczogdW5kZWZpbmVkIHwgKHN0cmluZyB8IG51bWJlcilbXSkge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcclxuICAgICAgdmFsdWVzID0gW107XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlcywge1xyXG4gICAgICBlbWl0RXZlbnQ6IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8gVmFsaWRhdG9yXHJcbiAgaXNSZXF1aXJlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCByZXF1aXJlZCh2YWw6IGJvb2xlYW4gfCAnJykge1xyXG4gICAgdGhpcy5pc1JlcXVpcmVkID0gKHZhbCA9PT0gJycpIHx8IHZhbDtcclxuICAgIHRoaXMuI3VwZGF0ZVZhbGlkYXRvcigpO1xyXG4gIH1cclxuXHJcbiAgbWluOiBudW1iZXI7XHJcbiAgQElucHV0KCdtaW4nKSBzZXQgcE1pbih2YWw6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgdGhpcy5taW4gPSArdmFsIHx8IDA7XHJcbiAgICB0aGlzLiN1cGRhdGVWYWxpZGF0b3IoKTtcclxuICB9XHJcbiAgbWF4OiBudW1iZXI7XHJcbiAgQElucHV0KCdtYXgnKSBzZXQgcE1heCh2YWw6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgdGhpcy5tYXggPSArdmFsIHx8IDA7XHJcbiAgICB0aGlzLiN1cGRhdGVWYWxpZGF0b3IoKTtcclxuICB9XHJcbiAgQE91dHB1dCgpIG1vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBPcHRpb25hbFxyXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlZCh2YWw6IGJvb2xlYW4gfCAnJykge1xyXG4gICAgdmFsID0gKHZhbCA9PT0gJycpIHx8IHZhbDtcclxuICAgIGlmICh2YWwpIHtcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICAgIHRoaXMuaW5wdXRDb250cm9sLmRpc2FibGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICAgIHRoaXMuaW5wdXRDb250cm9sLmVuYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIHNkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuICBAT3V0cHV0KCkgc2RVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPFNkQ2hpcFVwZGF0ZT4oKTtcclxuICBAT3V0cHV0KCkgY2hpcFNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0JykgaW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnYXV0bycpIG1hdEF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlO1xyXG4gIEBWaWV3Q2hpbGQoJ2NoaXBMaXN0JywgeyBzdGF0aWM6IHRydWUgfSkgY2hpcExpc3Q6IE1hdENoaXBMaXN0O1xyXG4gIEBWaWV3Q2hpbGQoTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciwgeyByZWFkOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyIH0pIGF1dG9jb21wbGV0ZVRyaWdnZXI6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXI7XHJcbiAgQENvbnRlbnRDaGlsZChTZFZpZXdEZWZEaXJlY3RpdmUpIHNkVmlldzogU2RWaWV3RGVmRGlyZWN0aXZlO1xyXG4gIEBDb250ZW50Q2hpbGQoU2RDaGlwRGlzcGxheURlZikgc2RDaGlwRGlzcGxheTogU2RDaGlwRGlzcGxheURlZjtcclxuICBpc0ZvY3VzZWQgPSBmYWxzZTtcclxuICBpbnB1dENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcclxuICBmb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gIG1hdGNoZXIgPSBuZXcgU2RDaGlwRXJyb3RTdGF0ZU1hdGNoZXIodGhpcy5mb3JtQ29udHJvbCk7XHJcbiAgI3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgdXRpbGl0eVNlcnZpY2U6IFNkVXRpbGl0eVNlcnZpY2UpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gdGhpcy5pbnB1dENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXHJcbiAgICAgIHN0YXJ0V2l0aDxzdHJpbmcgfCB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PignJyksXHJcbiAgICAgIG1hcChpdGVtID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyA/IGl0ZW0gOiAoaXRlbT8uW3RoaXMuZGlzcGxheUZpZWxkXSA/PyAnJykpLFxyXG4gICAgICBtYXAobmFtZSA9PiB0aGlzLmZpbHRlcihuYW1lKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbHVlczogKHN0cmluZyB8IG51bWJlcilbXSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgfHwgW107XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuI2l0ZW1zLmZpbHRlcihpdGVtID0+IHZhbHVlcy5maW5kSW5kZXgodmFsdWUgPT4gdmFsdWUgPT09IGl0ZW0/Llt0aGlzLnZhbHVlRmllbGRdKSAhPT0gLTEpO1xyXG4gICAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQodmFsdWVzKTtcclxuICAgICAgdGhpcy5zZENoYW5nZS5lbWl0KHZhbHVlcyk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuI2Zvcm0/Lm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgIH0sIDApO1xyXG4gICAgfSkpO1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLiNpdGVtQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLiNpdGVtcykpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbHVlczogKHN0cmluZyB8IG51bWJlcilbXSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgfHwgW107XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLiNpdGVtcy5maW5kKGUgPT4gZT8uW3RoaXMudmFsdWVGaWVsZF0gPT09IHZhbHVlKSB8fCB7fTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgW3RoaXMudmFsdWVGaWVsZF06IHZhbHVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICAgIHRoaXMuI2Zvcm0/LmFkZENvbnRyb2wodGhpcy4jbmFtZSwgdGhpcy5mb3JtQ29udHJvbCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuI2Zvcm0/LnJlbW92ZUNvbnRyb2wodGhpcy4jbmFtZSk7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gICN1cGRhdGVWYWxpZGF0b3IgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbC5jbGVhckFzeW5jVmFsaWRhdG9ycygpO1xyXG4gICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gICAgY29uc3QgYXN5bmNWYWxpZGF0b3JzOiBBc3luY1ZhbGlkYXRvckZuW10gPSBbXTtcclxuICAgIGlmICh0aGlzLmlzUmVxdWlyZWQpIHtcclxuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubWluID4gMCkge1xyXG4gICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5taW4pKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1heCA+IDApIHtcclxuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMubWF4KSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhhc3luY1ZhbGlkYXRvcnMpO1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXIgPSAodmFsdWU6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1bXSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy4jaXRlbXNcclxuICAgICAgLmZpbHRlcihpdGVtID0+IHtcclxuICAgICAgICBpZiAodGhpcy5mb3JtQ29udHJvbC52YWx1ZT8uc29tZSh2YWwgPT4gdmFsID09PSBpdGVtW3RoaXMudmFsdWVGaWVsZF0pKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAhdmFsdWUgfHwgdGhpcy51dGlsaXR5U2VydmljZS5jaGFuZ2VBbGlhc0xvd2VyQ2FzZShpdGVtW3RoaXMuZGlzcGxheUZpZWxkXSlcclxuICAgICAgICAgIC5pbmRleE9mKHRoaXMudXRpbGl0eVNlcnZpY2UuY2hhbmdlQWxpYXNMb3dlckNhc2UodmFsdWUpKSAhPT0gLTE7XHJcbiAgICAgIH0pLmZpbHRlcigoaXRlbSwgaW5kZXgpID0+IGluZGV4IDwgdGhpcy5saW1pdCk7XHJcbiAgfVxyXG5cclxuICBvbkFkZCA9IChldmVudDogTWF0Q2hpcElucHV0RXZlbnQpOiB2b2lkID0+IHtcclxuICAgIC8vIEFkZCBpdGVtIG9ubHkgd2hlbiBNYXRBdXRvY29tcGxldGUgaXMgbm90IG9wZW5cclxuICAgIC8vIFRvIG1ha2Ugc3VyZSB0aGlzIGRvZXMgbm90IGNvbmZsaWN0IHdpdGggT3B0aW9uU2VsZWN0ZWQgRXZlbnRcclxuICAgIGlmICghdGhpcy5tYXRBdXRvY29tcGxldGUuaXNPcGVuKSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlID8/ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xyXG4gICAgICBpZiAodmFsdWUpIHtcclxuXHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuI2l0ZW1zLmZpbmQoZSA9PiBlW3RoaXMuZGlzcGxheUZpZWxkXVxyXG4gICAgICAgICAgJiYgZVt0aGlzLmRpc3BsYXlGaWVsZF0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKSA9PT0gdmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA/PyBbXTtcclxuICAgICAgICAgIHZhbHVlcy5wdXNoKGl0ZW1bdGhpcy52YWx1ZUZpZWxkXSk7XHJcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKCcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGFuZG4xIHZp4bq/dCDEkeG7gyB44butIGzDvSB04bqhbSB1cyBCMkIxRC0xODI4OSDhu58gUzY5XHJcbiAgb25BZGQyID0gKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQgPT4ge1xyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlID8/ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLiNpdGVtcy5maW5kKGUgPT4gZVt0aGlzLnZhbHVlRmllbGRdXHJcbiAgICAgICAgJiYgZVt0aGlzLnZhbHVlRmllbGRdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS50cmltKCkgPT09IHZhbHVlKTtcclxuXHJcbiAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA/PyBbXTtcclxuICAgICAgICBpZiAoIXZhbHVlcy5pbmNsdWRlcyhpdGVtW3RoaXMudmFsdWVGaWVsZF0pKSB7XHJcbiAgICAgICAgICB2YWx1ZXMucHVzaChpdGVtW3RoaXMudmFsdWVGaWVsZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKCcnKTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG9uUmVtb3ZlID0gKGl0ZW06IGFueSk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA/PyBbXTtcclxuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWVzLmZpbHRlcih2YWx1ZSA9PiBpdGVtPy5bdGhpcy52YWx1ZUZpZWxkXSAhPT0gdmFsdWUpKTtcclxuICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKCcnKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdCA9IChpdGVtOiBhbnkpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuY2hpcFNlbGVjdGVkLmVtaXQoaXRlbSk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdCA9IChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCkgPT4ge1xyXG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQub3B0aW9uLnZhbHVlPy5bdGhpcy52YWx1ZUZpZWxkXSA/PyAnJykudG9TdHJpbmcoKS50cmltKCk7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuI2l0ZW1zLmZpbmQoZSA9PiBlW3RoaXMudmFsdWVGaWVsZF1cclxuICAgICAgICAmJiBlW3RoaXMudmFsdWVGaWVsZF0udG9TdHJpbmcoKS50cmltKCkgPT09IHZhbHVlKTtcclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICBjb25zdCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10gPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlID8/IFtdO1xyXG4gICAgICAgIHZhbHVlcy5wdXNoKGl0ZW1bdGhpcy52YWx1ZUZpZWxkXSk7XHJcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZXMpO1xyXG4gICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKCcnKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlcj8ub3BlblBhbmVsKCk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRpc3BsYXlGbiA9ICh2YWx1ZTogc3RyaW5nIHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICBpZiAoIXRoaXMuI2l0ZW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLiNpdGVtcy5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLnZhbHVlRmllbGRdID09PSB2YWx1ZSk7XHJcbiAgICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtW3RoaXMuZGlzcGxheUZpZWxkXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy4jaXRlbXMuc29tZShpdGVtID0+IGl0ZW1bdGhpcy5kaXNwbGF5RmllbGRdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih2YWx1ZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlW3RoaXMuZGlzcGxheUZpZWxkXSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRm9jdXMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmlzRm9jdXNlZCA9IHRydWU7XHJcbiAgICB0aGlzLmlucHV0Q29udHJvbC5zZXRWYWx1ZSgnJyk7XHJcbiAgICAvLyB0aGlzLmlucHV0Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBvbkJsdXIgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUoJycsIHtcclxuICAgICAgZW1pdEV2ZW50OiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrID0gKCkgPT4ge1xyXG4gICAgaWYgKHRoaXMuc2RWaWV3Py50ZW1wbGF0ZVJlZikge1xyXG4gICAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wuZGlzYWJsZWQgJiYgIXRoaXMuaXNGb2N1c2VkKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb2N1cyA9ICgpID0+IHtcclxuICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXI/Lm9wZW5QYW5lbCgpO1xyXG4gICAgICB0aGlzLmlucHV0Py5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIG9uQ2xlYXIgPSAoJGV2ZW50PzogYW55KSA9PiB7XHJcbiAgICAkZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUoJycpO1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShbXSk7XHJcbiAgICB0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXI/Lm9wZW5QYW5lbCgpO1xyXG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxufVxyXG4iXX0=
512
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvbmdoaWF0dDE1X29uZW1vdW50L0RvY3VtZW50cy9saWItY29yZS11aS9wcm9qZWN0cy9zZC1jb3JlL2NoaXAvIiwic291cmNlcyI6WyJzcmMvbGliL2NoaXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixZQUFZLEVBR1osaUJBQWlCLEVBRWpCLFlBQVksRUFDWix1QkFBdUIsRUFDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQTRDLFVBQVUsRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvSCxPQUFPLEVBQWMsWUFBWSxFQUFXLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHekYsT0FBTyxFQUFpRCxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR3ZILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RSxNQUFNLHVCQUF1QjtJQUMzQixZQUFvQixXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtJQUFJLENBQUM7SUFDakQsWUFBWSxDQUFDLE9BQTJCLEVBQUUsSUFBd0M7O1FBQ2hGLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFD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QztnQkFDVCxRQUFRLEVBQUUsU0FBUztnQkFDbkIsb2pGQUFvQztnQkFFcEMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07O2FBQ2hEOzs7WUFoQ0MsaUJBQWlCOzs7bUJBbUNoQixLQUFLO21CQU9MLEtBQUs7bUJBRUwsS0FBSztzQkFVTCxLQUFLO29CQUdMLEtBQUs7eUJBQ0wsS0FBSzsyQkFDTCxLQUFLOzBCQUNMLEtBQUs7eUJBRUwsS0FBSyxTQUFDLFdBQVc7b0JBeUJqQixLQUFLO29CQVlMLEtBQUs7b0JBUUwsS0FBSzt1QkFRTCxLQUFLO21CQU1MLEtBQUssU0FBQyxLQUFLO21CQUtYLEtBQUssU0FBQyxLQUFLOzBCQUlYLE1BQU07dUJBR04sS0FBSzt1QkFXTCxNQUFNO3VCQUNOLE1BQU07MkJBQ04sTUFBTTtvQkFFTixTQUFTLFNBQUMsT0FBTzs4QkFDakIsU0FBUyxTQUFDLE1BQU07dUJBQ2hCLFNBQVMsU0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2tDQUN0QyxTQUFTLFNBQUMsc0JBQXNCLEVBQUUsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7cUJBQ2xFLFlBQVksU0FBQyxrQkFBa0I7NEJBQy9CLFlBQVksU0FBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkluaXQsIE9uRGVzdHJveSxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENPTU1BLCBFTlRFUiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSAndXVpZCc7XHJcbmltcG9ydCB7IE5nRm9ybSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIEFzeW5jVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMsIEZvcm1Hcm91cERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2RVdGlsaXR5U2VydmljZSB9IGZyb20gJ0BzZC1hbmd1bGFyL2NvcmUvdXRpbGl0eSc7XHJcbmltcG9ydCB7IE1hdENoaXBJbnB1dEV2ZW50LCBNYXRDaGlwTGlzdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgU2RDaGlwVXBkYXRlIH0gZnJvbSAnLi9jaGlwLm1vZGVsJztcclxuaW1wb3J0IHsgRXJyb3JTdGF0ZU1hdGNoZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgU2RDaGlwRGlzcGxheURlZiB9IGZyb20gJy4vZGlyZWN0aXZlcy9zZC1jaGlwLWRpc3BsYXktZGVmLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNkRm9ybUNvbnRyb2wsIFNkVmlld0RlZkRpcmVjdGl2ZSB9IGZyb20gJ0BzZC1hbmd1bGFyL2NvcmUvY29tbW9uJztcclxuXHJcbmNsYXNzIFNkQ2hpcEVycm90U3RhdGVNYXRjaGVyIGltcGxlbWVudHMgRXJyb3JTdGF0ZU1hdGNoZXIge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sKSB7IH1cclxuICBpc0Vycm9yU3RhdGUoY29udHJvbDogRm9ybUNvbnRyb2wgfCBudWxsLCBmb3JtOiBGb3JtR3JvdXBEaXJlY3RpdmUgfCBOZ0Zvcm0gfCBudWxsKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpc1N1Ym1pdHRlZCA9IGZvcm0gJiYgZm9ybS5zdWJtaXR0ZWQ7XHJcbiAgICByZXR1cm4gISEodGhpcy5mb3JtQ29udHJvbD8uaW52YWxpZCAmJiAodGhpcy5mb3JtQ29udHJvbD8uZGlydHkgfHwgdGhpcy5mb3JtQ29udHJvbD8udG91Y2hlZCB8fCBpc1N1Ym1pdHRlZCkpO1xyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZC1jaGlwJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2hpcC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY2hpcC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZENoaXAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgI25hbWUgPSB1dWlkLnY0KCk7XHJcbiAgQElucHV0KCkgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWwpIHtcclxuICAgICAgdGhpcy4jbmFtZSA9IHZhbDtcclxuICAgIH1cclxuICB9XHJcbiAgc2VwYXJhdG9yS2V5c0NvZGVzOiBudW1iZXJbXSA9IFtFTlRFUiwgQ09NTUFdO1xyXG4gIHNlbGVjdGFibGUgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNpemU6ICdzbScgfCAnbGcnO1xyXG4gICNmb3JtOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgc2V0IGZvcm0odmFsOiBOZ0Zvcm0gfCBGb3JtR3JvdXApIHtcclxuICAgIGlmICh2YWwpIHtcclxuICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE5nRm9ybSkge1xyXG4gICAgICAgIHRoaXMuI2Zvcm0gPSB2YWwuZm9ybTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLiNmb3JtID0gdmFsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gICNhZGRhYmxlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHNldCBhZGRhYmxlKHZhbDogJycgfCBib29sZWFuKSB7XHJcbiAgICB0aGlzLiNhZGRhYmxlID0gKHZhbCA9PT0gJycpIHx8IHZhbDtcclxuICB9XHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcclxuICBASW5wdXQoKSB2YWx1ZUZpZWxkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGlzcGxheUZpZWxkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuICByZW1vdmFibGU6IGJvb2xlYW4gfCAoKGl0ZW06IGFueSkgPT4gYm9vbGVhbikgPSB0cnVlO1xyXG4gIEBJbnB1dCgncmVtb3ZhYmxlJykgc2V0IF9yZW1vdmFibGUodmFsOiAnJyB8IGJvb2xlYW4gfCAoKGl0ZW06IGFueSkgPT4gYm9vbGVhbikpIHtcclxuICAgIHRoaXMucmVtb3ZhYmxlID0gKHZhbCA9PT0gJycpIHx8IHZhbDtcclxuICB9XHJcbiAgLy8gQElucHV0KCkgc2V0IGl0ZW1zKGl0ZW1zOiB1bmRlZmluZWQgfCBhbnlbXSkge1xyXG4gIC8vICAgaWYgKCFpdGVtcykge1xyXG4gIC8vICAgICB0aGlzLiNpdGVtcyA9IFtdO1xyXG4gIC8vICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xyXG4gIC8vICAgICB0aGlzLiNpdGVtcyA9IGl0ZW1zLmZpbHRlcihlID0+IChlID8/ICcnKS50b1N0cmluZygpLnRyaW0oKSAhPT0gJycpO1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgdGhpcy4jaXRlbXMgPSBpdGVtcztcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMuaW5wdXRDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAvLyAgIHRoaXMuI2l0ZW1DaGFuZ2VzLm5leHQodGhpcy5pdGVtcyk7XHJcbiAgLy8gfVxyXG4gIC8vIFNlcnZlciBzZWFyY2hcclxuICBsb2FkaW5nID0gZmFsc2U7XHJcbiAgI2FsbEl0ZW1zOiBPYnNlcnZhYmxlPGFueVtdPjtcclxuICAjYWxsSXRlbToge1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55XHJcbiAgfSA9IHt9O1xyXG4gICNjYWNoZToge1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55W11cclxuICB9ID0ge307XHJcbiAgI2RlbGF5ID0gMjAwOyAvLyBTYXUga2hv4bqjbmcgdGjhu51pIGdpYW4gZGVsYXkgbuG6v3Uga2jDtG5nIGPDsyB0aGF5IMSR4buVaSB0aMOsIHRow6wgbeG7m2kgYuG6r3QgxJHhuqd1IHRo4buxYyBoaeG7h24gZ+G7jWkgaMOgbVxyXG4gICNpdGVtc0NoYW5nZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdIHwgU2VhcmNoRnVuYz4oW10pO1xyXG4gIEBJbnB1dCgpIHNldCBpdGVtcyhpdGVtczogdW5kZWZpbmVkIHwgYW55W10gfCBTZWFyY2hGdW5jKSB7XHJcbiAgICB0aGlzLiNkZWxheSA9IDA7XHJcbiAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgIHRoaXMuI2l0ZW1zQ2hhbmdlcy5uZXh0KFtdKTtcclxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcclxuICAgICAgdGhpcy4jaXRlbXNDaGFuZ2VzLm5leHQoaXRlbXMuZmlsdGVyKGUgPT4gZSAhPT0gbnVsbCAmJiBlICE9PSB1bmRlZmluZWQpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuI2RlbGF5ID0gNTAwO1xyXG4gICAgICB0aGlzLiNpdGVtc0NoYW5nZXMubmV4dChpdGVtcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICB9XHJcbiAgQElucHV0KCkgbGltaXQgPSA1MDtcclxuICBzZWxlY3RlZEl0ZW1zOiBPYnNlcnZhYmxlPGFueVtdPjtcclxuICBmaWx0ZXJlZEl0ZW1zOiBPYnNlcnZhYmxlPGFueVtdPjtcclxuICAjZmlsdGVyZWRJdGVtczogYW55W107XHJcblxyXG4gIGlwdDogYW55O1xyXG5cclxuICAvLyBtb2RlbFxyXG4gIEBJbnB1dCgpIHNldCBtb2RlbCh2YWx1ZXM6IHVuZGVmaW5lZCB8IChzdHJpbmcgfCBudW1iZXIpW10pIHtcclxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XHJcbiAgICAgIHZhbHVlcyA9IFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZXMpO1xyXG4gIH1cclxuICAvLyBWYWxpZGF0b3JcclxuICBpc1JlcXVpcmVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IHJlcXVpcmVkKHZhbDogYm9vbGVhbiB8ICcnKSB7XHJcbiAgICB0aGlzLmlzUmVxdWlyZWQgPSAodmFsID09PSAnJykgfHwgdmFsO1xyXG4gICAgdGhpcy4jdXBkYXRlVmFsaWRhdG9yKCk7XHJcbiAgfVxyXG5cclxuICBtaW46IG51bWJlcjtcclxuICBASW5wdXQoJ21pbicpIHNldCBwTWluKHZhbDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLm1pbiA9ICt2YWwgfHwgMDtcclxuICAgIHRoaXMuI3VwZGF0ZVZhbGlkYXRvcigpO1xyXG4gIH1cclxuICBtYXg6IG51bWJlcjtcclxuICBASW5wdXQoJ21heCcpIHNldCBwTWF4KHZhbDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLm1heCA9ICt2YWwgfHwgMDtcclxuICAgIHRoaXMuI3VwZGF0ZVZhbGlkYXRvcigpO1xyXG4gIH1cclxuICBAT3V0cHV0KCkgbW9kZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vIE9wdGlvbmFsXHJcbiAgQElucHV0KCkgc2V0IGRpc2FibGVkKHZhbDogYm9vbGVhbiB8ICcnKSB7XHJcbiAgICB2YWwgPSAodmFsID09PSAnJykgfHwgdmFsO1xyXG4gICAgaWYgKHZhbCkge1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgICAgdGhpcy5pbnB1dENvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5lbmFibGUoKTtcclxuICAgICAgdGhpcy5pbnB1dENvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgc2RDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG4gIEBPdXRwdXQoKSBzZFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2RDaGlwVXBkYXRlPigpO1xyXG4gIEBPdXRwdXQoKSBjaGlwU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnaW5wdXQnKSBpbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdhdXRvJykgbWF0QXV0b2NvbXBsZXRlOiBNYXRBdXRvY29tcGxldGU7XHJcbiAgQFZpZXdDaGlsZCgnY2hpcExpc3QnLCB7IHN0YXRpYzogdHJ1ZSB9KSBjaGlwTGlzdDogTWF0Q2hpcExpc3Q7XHJcbiAgQFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGVUcmlnZ2VyLCB7IHJlYWQ6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIgfSkgYXV0b2NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcclxuICBAQ29udGVudENoaWxkKFNkVmlld0RlZkRpcmVjdGl2ZSkgc2RWaWV3OiBTZFZpZXdEZWZEaXJlY3RpdmU7XHJcbiAgQENvbnRlbnRDaGlsZChTZENoaXBEaXNwbGF5RGVmKSBzZENoaXBEaXNwbGF5OiBTZENoaXBEaXNwbGF5RGVmO1xyXG4gIGlzRm9jdXNlZCA9IGZhbHNlO1xyXG4gIGlucHV0Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gIGZvcm1Db250cm9sID0gbmV3IFNkRm9ybUNvbnRyb2woKTtcclxuICBtYXRjaGVyID0gbmV3IFNkQ2hpcEVycm90U3RhdGVNYXRjaGVyKHRoaXMuZm9ybUNvbnRyb2wpO1xyXG4gICNzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmZvcm1Db250cm9sLnNkQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pKTtcclxuICAgIHRoaXMuI2FsbEl0ZW1zID0gY29tYmluZUxhdGVzdChbXHJcbiAgICAgIHRoaXMuI2l0ZW1zQ2hhbmdlcy5hc09ic2VydmFibGUoKSxcclxuICAgICAgdGhpcy5pbnB1dENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKCcnKSwgZGVib3VuY2VUaW1lKHRoaXMuI2RlbGF5KSksXHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpKV0pLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKGFzeW5jIChbaXRlbXNdKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmlucHV0Q29udHJvbC52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgfHwgW107XHJcbiAgICAgICAgICBpZiAodHlwZW9mIChpdGVtcykgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2xvYWRJdGVtcyh2YWwsIGl0ZW1zKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuI2FsbEl0ZW0gPSBpdGVtcy50b09iamVjdCh0aGlzLnZhbHVlRmllbGQpO1xyXG4gICAgICAgICAgY29uc3QgaGFzRmllbGRzID0gISF0aGlzLnZhbHVlRmllbGQgJiYgISF0aGlzLmRpc3BsYXlGaWVsZDtcclxuICAgICAgICAgIHRoaXMuI2ZpbHRlcmVkSXRlbXMgPSBpdGVtcy5maWx0ZXIoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaGFzRmllbGRzID8gaXRlbVt0aGlzLnZhbHVlRmllbGRdIDogaXRlbTtcclxuICAgICAgICAgICAgY29uc3QgZGlzcGxheSA9IGhhc0ZpZWxkcyA/IGl0ZW1bdGhpcy5kaXNwbGF5RmllbGRdIDogaXRlbTtcclxuICAgICAgICAgICAgaWYgKFN0cmluZy5hbGlhc0luY2x1ZGVzKHZhbHVlLCB2YWwpIHx8IFN0cmluZy5hbGlhc0luY2x1ZGVzKGRpc3BsYXksIHZhbCkpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzLnNvbWUoZSA9PiBlID09PSB2YWx1ZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLiNmaWx0ZXJlZEl0ZW1zO1xyXG4gICAgICAgIH0pKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IGNvbWJpbmVMYXRlc3QoW1xyXG4gICAgICB0aGlzLiNpdGVtc0NoYW5nZXMuYXNPYnNlcnZhYmxlKCksXHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpKV0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcChhc3luYyAoW2l0ZW1zLCB2YWxdKSA9PiB7XHJcbiAgICAgICAgICAvLyBWw6wgbeG7mXQgc+G7kSBsw70gZG8gY2jGsGEgeMOhYyDEkeG7i25oIG3DoCBraGkgc+G7rSBk4bulbmcgc2RWaWV3RGVmIHRow6wga2hpIGNodXnhu4NuIHNhbmcgZOG6oW5nIHZpZXcgc+G6vSB0cmlnZ2VyIHZhbCA9IG51bGxcclxuICAgICAgICAgIC8vIE5oxrBuZyBmb3JtQ29udHJvbC52YWx1ZSB24bqrbiBjw7MgZ2nDoSB0cuG7iyDEkcO6bmcgbsOqbiB0aOG7sWMgaGnhu4duIGfDoW4gdmFsID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcclxuICAgICAgICAgIHZhbCA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgICBpZiAoIXRoaXMudmFsdWVGaWVsZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0eXBlb2YgKGl0ZW1zKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jbG9hZFNlbGVjdGVkSXRlbXModmFsLCBpdGVtcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgfHwgW10pPy5tYXAodmFsdWUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXM/LmZpbmQoaXRlbSA9PiBpdGVtW3RoaXMudmFsdWVGaWVsZF0gPT09IHZhbHVlKSB8fCB7XHJcbiAgICAgICAgICAgICAgW3RoaXMudmFsdWVGaWVsZF06IHZhbHVlLFxyXG4gICAgICAgICAgICAgIFt0aGlzLmRpc3BsYXlGaWVsZF06IHZhbHVlXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gdGhpcy4jYWxsSXRlbXMucGlwZShtYXAoYWxsSXRlbXMgPT4gYWxsSXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xyXG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlIHx8IFtdO1xyXG4gICAgICBpZiAodGhpcy52YWx1ZUZpZWxkKSB7XHJcbiAgICAgICAgcmV0dXJuICF2YWx1ZXMuaW5jbHVkZXMoaXRlbT8uW3RoaXMudmFsdWVGaWVsZF0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAhdmFsdWVzLmluY2x1ZGVzKGl0ZW0pO1xyXG4gICAgfSkucGFnaW5nKHRoaXMubGltaXQpKSk7XHJcbiAgICAvLyB0aGlzLmRpc3BsYXkgPSB0aGlzLnNlbGVjdGVkSXRlbXMucGlwZShcclxuICAgIC8vICAgbWFwKHNlbGVjdGVkSXRlbXMgPT4gc2VsZWN0ZWRJdGVtcz8ubWFwKGl0ZW0gPT4gdGhpcy5kaXNwbGF5RmllbGQgPyBpdGVtW3RoaXMuZGlzcGxheUZpZWxkXSA6IGl0ZW0pPy5qb2luKCcsICcpKSk7XHJcbiAgICAvLyB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAvLyAgIGNvbnN0IHZhbHVlczogKHN0cmluZyB8IG51bWJlcilbXSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgfHwgW107XHJcbiAgICAvLyAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuI2l0ZW1zLmZpbHRlcihpdGVtID0+IHZhbHVlcy5maW5kSW5kZXgodmFsdWUgPT4gdmFsdWUgPT09IGl0ZW0/Llt0aGlzLnZhbHVlRmllbGRdKSAhPT0gLTEpO1xyXG4gICAgLy8gICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQodmFsdWVzKTtcclxuICAgIC8vICAgdGhpcy5zZENoYW5nZS5lbWl0KHZhbHVlcyk7XHJcbiAgICAvLyAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICAgIHRoaXMuI2Zvcm0/Lm1hcmtBc0RpcnR5KCk7XHJcbiAgICAvLyAgIH0sIDApO1xyXG4gICAgLy8gfSkpO1xyXG4gICAgLy8gdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLiNpdGVtQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLiNpdGVtcykpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAvLyAgIGNvbnN0IHZhbHVlczogKHN0cmluZyB8IG51bWJlcilbXSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgfHwgW107XHJcbiAgICAvLyAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gICAgLy8gICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xyXG4gICAgLy8gICAgIGNvbnN0IGl0ZW0gPSB0aGlzLiNpdGVtcy5maW5kKGUgPT4gZT8uW3RoaXMudmFsdWVGaWVsZF0gPT09IHZhbHVlKSB8fCB7fTtcclxuICAgIC8vICAgICB0aGlzLnNlbGVjdGVkSXRlbXMucHVzaCh7XHJcbiAgICAvLyAgICAgICAuLi5pdGVtLFxyXG4gICAgLy8gICAgICAgW3RoaXMudmFsdWVGaWVsZF06IHZhbHVlXHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pKTtcclxuICAgIHRoaXMuI2Zvcm0/LmFkZENvbnRyb2wodGhpcy4jbmFtZSwgdGhpcy5mb3JtQ29udHJvbCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuI2Zvcm0/LnJlbW92ZUNvbnRyb2wodGhpcy4jbmFtZSk7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gICN1cGRhdGVWYWxpZGF0b3IgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbC5jbGVhckFzeW5jVmFsaWRhdG9ycygpO1xyXG4gICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gICAgY29uc3QgYXN5bmNWYWxpZGF0b3JzOiBBc3luY1ZhbGlkYXRvckZuW10gPSBbXTtcclxuICAgIGlmICh0aGlzLmlzUmVxdWlyZWQpIHtcclxuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubWluID4gMCkge1xyXG4gICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5taW4pKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1heCA+IDApIHtcclxuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMubWF4KSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhhc3luY1ZhbGlkYXRvcnMpO1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICAjbG9hZEl0ZW1zID0gYXN5bmMgKHNlYXJjaFRleHQ6IHN0cmluZywgaXRlbXM6IFNlYXJjaEZ1bmMpID0+IHtcclxuICAgIHNlYXJjaFRleHQgPSBzZWFyY2hUZXh0Py50b1N0cmluZygpIHx8ICcnO1xyXG4gICAgaWYgKHRoaXMuI2NhY2hlW3NlYXJjaFRleHRdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGl0ZW1zKHNlYXJjaFRleHQpLmNhdGNoKCgpID0+IFtdKS5maW5hbGx5KCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcclxuICAgICAgY29uc3Qgb2JqSXRlbSA9IEFycmF5LnRvT2JqZWN0KHJlc3VsdHMsIHRoaXMudmFsdWVGaWVsZCk7XHJcbiAgICAgIHRoaXMuI2FsbEl0ZW0gPSB7XHJcbiAgICAgICAgLi4udGhpcy4jYWxsSXRlbSxcclxuICAgICAgICAuLi5vYmpJdGVtXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuI2NhY2hlW3NlYXJjaFRleHRdID0gcmVzdWx0cy51bmlvbih0aGlzLnZhbHVlRmllbGQpO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgKCF0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAvLyAgIHJldHVybiB0aGlzLiNjYWNoZVtzZWFyY2hUZXh0XTtcclxuICAgIC8vIH1cclxuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBhd2FpdCB0aGlzLiNsb2FkU2VsZWN0ZWRJdGVtcyh0aGlzLmZvcm1Db250cm9sLnZhbHVlLCBpdGVtcyk7XHJcbiAgICAvLyDEkMawYSBuaOG7r25nIHNlbGVjdGVkSXRlbXMgbMOqbiDEkeG6p3UgbuG6v3Uga2jDtG5nIG1hdC1zZWxlY3QtdHJpZ2dlciBz4bq9IGtow7RuZyB3b3JrXHJcbiAgICByZXR1cm4gWy4uLnNlbGVjdGVkSXRlbXMsIC4uLnRoaXMuI2NhY2hlW3NlYXJjaFRleHRdXS51bmlvbih0aGlzLnZhbHVlRmllbGQpO1xyXG4gIH1cclxuXHJcbiAgI2xvYWRTZWxlY3RlZEl0ZW1zID0gYXN5bmMgKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgaXRlbXM6IFNlYXJjaEZ1bmMpID0+IHtcclxuICAgIGlmICghdmFsdWU/LnRvU3RyaW5nKCkpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XHJcbiAgICBpZiAoIXRoaXMudmFsdWVGaWVsZCAmJiAhdGhpcy5kaXNwbGF5RmllbGQpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlcztcclxuICAgIH1cclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICBpZiAodmFsdWVzLnNvbWUodmFsID0+IHRoaXMuI2FsbEl0ZW1bdmFsXSA9PT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgaXRlbXModmFsdWUsIHRydWUpLmNhdGNoKCgpID0+IFtdKS5maW5hbGx5KCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcclxuICAgICAgY29uc3Qgb2JqSXRlbSA9IEFycmF5LnRvT2JqZWN0KHJlc3VsdHMsIHRoaXMudmFsdWVGaWVsZCk7XHJcbiAgICAgIGNvbnN0IG9ialZhbHVlID0gQXJyYXkudG9PYmplY3QoXHJcbiAgICAgICAgdmFsdWVzLm1hcCh2YWwgPT4gKHsgW3ZhbD8udG9TdHJpbmcoKV06IHsgW3RoaXMudmFsdWVGaWVsZF06IHZhbCwgW3RoaXMuZGlzcGxheUZpZWxkXTogdmFsIH0gfSkpLCB0aGlzLnZhbHVlRmllbGQpO1xyXG4gICAgICB0aGlzLiNhbGxJdGVtID0ge1xyXG4gICAgICAgIC4uLm9ialZhbHVlLFxyXG4gICAgICAgIC4uLnRoaXMuI2FsbEl0ZW0sXHJcbiAgICAgICAgLi4ub2JqSXRlbVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlcy5tYXAodmFsID0+IHRoaXMuI2FsbEl0ZW1bdmFsPy50b1N0cmluZygpXSA/PyB7IFt0aGlzLnZhbHVlRmllbGRdOiB2YWwsIFt0aGlzLmRpc3BsYXlGaWVsZF06IHZhbCB9KTtcclxuICB9XHJcblxyXG4gIG9uQWRkID0gKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgLy8gQWRkIGl0ZW0gb25seSB3aGVuIE1hdEF1dG9jb21wbGV0ZSBpcyBub3Qgb3BlblxyXG4gICAgLy8gVG8gbWFrZSBzdXJlIHRoaXMgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBPcHRpb25TZWxlY3RlZCBFdmVudFxyXG4gICAgLy8gaWYgKCF0aGlzLm1hdEF1dG9jb21wbGV0ZS5pc09wZW4pIHtcclxuICAgIC8vICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudmFsdWUgPz8gJycpLnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgLy8gICBpZiAodmFsdWUpIHtcclxuICAgIC8vICAgICBpZiAodGhpcy52YWx1ZUZpZWxkICYmIHRoaXMuZGlzcGxheUZpZWxkKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCBpdGVtID0gdGhpcy4jZmlsdGVyZWRJdGVtcy5maW5kKGUgPT4gZVt0aGlzLmRpc3BsYXlGaWVsZF0gPT09IHZhbHVlKTtcclxuICAgIC8vICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHZhbHVlczogKHN0cmluZyB8IG51bWJlcilbXSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUgPz8gW107XHJcbiAgICAvLyAgICAgICAgIHZhbHVlcy5wdXNoKGl0ZW1bdGhpcy52YWx1ZUZpZWxkXSk7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWVzKTtcclxuICAgIC8vICAgICAgIH0gZWxzZSBpZiAodGhpcy4jYWRkYWJsZSkge1xyXG4gICAgLy8gICAgICAgICBjb25zdCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10gPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlID8/IFtdO1xyXG4gICAgLy8gICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWVzKTtcclxuICAgIC8vICAgICAgIH1cclxuICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgY29uc29sZS5sb2codmFsdWUpO1xyXG4gICAgLy8gICAgICAgY29uc29sZS5sb2codGhpcy4jZmlsdGVyZWRJdGVtcyk7XHJcbiAgICAvLyAgICAgICBjb25zdCBpdGVtID0gdGhpcy4jZmlsdGVyZWRJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbSA9PT0gdmFsdWUpO1xyXG4gICAgLy8gICAgICAgaWYgKGl0ZW0pIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA/PyBbXTtcclxuICAgIC8vICAgICAgICAgdmFsdWVzLnB1c2goaXRlbSk7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWVzKTtcclxuICAgIC8vICAgICAgIH0gZWxzZSBpZiAodGhpcy4jYWRkYWJsZSkge1xyXG4gICAgLy8gICAgICAgICBjb25zdCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10gPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlID8/IFtdO1xyXG4gICAgLy8gICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWVzKTtcclxuICAgIC8vICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUoJycpO1xyXG4gICAgLy8gfVxyXG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudmFsdWUgPz8gJycpLnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGlmICh0aGlzLnZhbHVlRmllbGQgJiYgdGhpcy5kaXNwbGF5RmllbGQpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy4jZmlsdGVyZWRJdGVtcy5maW5kKGUgPT4gZVt0aGlzLmRpc3BsYXlGaWVsZF0gPT09IHZhbHVlKTtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA/PyBbXTtcclxuICAgICAgICAgIHZhbHVlcy5wdXNoKGl0ZW1bdGhpcy52YWx1ZUZpZWxkXSk7XHJcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlcyk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNhZGRhYmxlKSB7XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10gPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlID8/IFtdO1xyXG4gICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy4jZmlsdGVyZWRJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbSA9PT0gdmFsdWUpO1xyXG4gICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10gPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlID8/IFtdO1xyXG4gICAgICAgICAgdmFsdWVzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlcyk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNhZGRhYmxlKSB7XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10gPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlID8/IFtdO1xyXG4gICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICB0aGlzLmlucHV0Q29udHJvbC5zZXRWYWx1ZSgnJyk7XHJcbiAgfVxyXG5cclxuICAvLyBhbmRuMSB2aeG6v3QgxJHhu4MgeOG7rSBsw70gdOG6oW0gdXMgQjJCMUQtMTgyODkg4bufIFM2OVxyXG4gIG9uQWRkMiA9IChldmVudDogTWF0Q2hpcElucHV0RXZlbnQpOiB2b2lkID0+IHtcclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC52YWx1ZSA/PyAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy4jZmlsdGVyZWRJdGVtcy5maW5kKGUgPT4gZVt0aGlzLnZhbHVlRmllbGRdXHJcbiAgICAgICAgJiYgZVt0aGlzLnZhbHVlRmllbGRdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS50cmltKCkgPT09IHZhbHVlKTtcclxuXHJcbiAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA/PyBbXTtcclxuICAgICAgICBpZiAoIXZhbHVlcy5pbmNsdWRlcyhpdGVtW3RoaXMudmFsdWVGaWVsZF0pKSB7XHJcbiAgICAgICAgICB2YWx1ZXMucHVzaChpdGVtW3RoaXMudmFsdWVGaWVsZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKCcnKTtcclxuICB9XHJcblxyXG4gIG9uUmVtb3ZlID0gKGl0ZW06IGFueSk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA/PyBbXTtcclxuICAgIGlmICh0eXBlb2YgKGl0ZW0pID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgKGl0ZW0pID09PSAnbnVtYmVyJykge1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlcy5maWx0ZXIodmFsdWUgPT4gaXRlbSAhPT0gdmFsdWUpKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZUZpZWxkKSB7XHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWVzLmZpbHRlcih2YWx1ZSA9PiBpdGVtPy5bdGhpcy52YWx1ZUZpZWxkXSAhPT0gdmFsdWUpKTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKCcnKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdCA9IChpdGVtOiBhbnkpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuY2hpcFNlbGVjdGVkLmVtaXQoaXRlbSk7XHJcbiAgfVxyXG5cclxuICAvLyBvblNlbGVjdCA9IChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCkgPT4ge1xyXG4gIC8vICAgY29uc3QgdmFsdWUgPSAoZXZlbnQub3B0aW9uLnZhbHVlPy5bdGhpcy52YWx1ZUZpZWxkXSA/PyAnJykudG9TdHJpbmcoKS50cmltKCk7XHJcbiAgLy8gICBpZiAodmFsdWUpIHtcclxuICAvLyAgICAgY29uc3QgaXRlbSA9IHRoaXMuI2l0ZW1zLmZpbmQoZSA9PiBlW3RoaXMudmFsdWVGaWVsZF1cclxuICAvLyAgICAgICAmJiBlW3RoaXMudmFsdWVGaWVsZF0udG9TdHJpbmcoKS50cmltKCkgPT09IHZhbHVlKTtcclxuICAvLyAgICAgaWYgKGl0ZW0pIHtcclxuICAvLyAgICAgICBjb25zdCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10gPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlID8/IFtdO1xyXG4gIC8vICAgICAgIHZhbHVlcy5wdXNoKGl0ZW1bdGhpcy52YWx1ZUZpZWxkXSk7XHJcbiAgLy8gICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZXMpO1xyXG4gIC8vICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gIC8vICAgICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKCcnKTtcclxuICAvLyAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAvLyAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlcj8ub3BlblBhbmVsKCk7XHJcbiAgLy8gICAgICAgfSwgMCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIG9uU2VsZWN0ID0gKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCBpdGVtID0gZXZlbnQub3B0aW9uLnZhbHVlO1xyXG4gICAgY29uc3QgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSA/PyBbXTtcclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgKGl0ZW0pID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgKGl0ZW0pID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIGlmICghdmFsdWVzLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgICAgICAgICB2YWx1ZXMucHVzaChpdGVtKTtcclxuICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWVzKTtcclxuICAgICAgICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh2YWx1ZXMpO1xyXG4gICAgICAgICAgdGhpcy5zZENoYW5nZS5lbWl0KHZhbHVlcyk7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVUcmlnZ2VyPy5vcGVuUGFuZWwoKTtcclxuICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlRmllbGQpIHtcclxuICAgICAgICBjb25zdCB2YWwgPSBpdGVtPy5bdGhpcy52YWx1ZUZpZWxkXSB8fCBudWxsO1xyXG4gICAgICAgIGlmICghdmFsdWVzLmluY2x1ZGVzKHZhbCkpIHtcclxuICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbCk7XHJcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlcyk7XHJcbiAgICAgICAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQodmFsdWVzKTtcclxuICAgICAgICAgIHRoaXMuc2RDaGFuZ2UuZW1pdCh2YWx1ZXMpO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlcj8ub3BlblBhbmVsKCk7XHJcbiAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKCcnLCB7XHJcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGRpc3BsYXlGbiA9ICh2YWx1ZTogc3RyaW5nIHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XHJcbiAgLy8gICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gIC8vICAgICBpZiAoIXRoaXMuI2l0ZW1zKSB7XHJcbiAgLy8gICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLiNpdGVtcy5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLnZhbHVlRmllbGRdID09PSB2YWx1ZSk7XHJcbiAgLy8gICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcclxuICAvLyAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtW3RoaXMuZGlzcGxheUZpZWxkXTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBpZiAodGhpcy4jaXRlbXMuc29tZShpdGVtID0+IGl0ZW1bdGhpcy5kaXNwbGF5RmllbGRdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih2YWx1ZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpKSB7XHJcbiAgLy8gICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlW3RoaXMuZGlzcGxheUZpZWxkXSA6IHVuZGVmaW5lZDtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIG9uRm9jdXMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmlzRm9jdXNlZCA9IHRydWU7XHJcbiAgICB0aGlzLmlucHV0Q29udHJvbC5zZXRWYWx1ZSgnJyk7XHJcbiAgICAvLyB0aGlzLmlucHV0Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBvbkJsdXIgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUoJycsIHtcclxuICAgICAgZW1pdEV2ZW50OiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrID0gKCkgPT4ge1xyXG4gICAgaWYgKHRoaXMuc2RWaWV3Py50ZW1wbGF0ZVJlZikge1xyXG4gICAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wuZGlzYWJsZWQgJiYgIXRoaXMuaXNGb2N1c2VkKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb2N1cyA9ICgpID0+IHtcclxuICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXI/Lm9wZW5QYW5lbCgpO1xyXG4gICAgICB0aGlzLmlucHV0Py5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIG9uQ2xlYXIgPSAoJGV2ZW50PzogYW55KSA9PiB7XHJcbiAgICAkZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUoJycpO1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShbXSk7XHJcbiAgICB0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXI/Lm9wZW5QYW5lbCgpO1xyXG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxufVxyXG5cclxudHlwZSBTZWFyY2hGdW5jID0gKHNlYXJjaFRleHQ/OiBzdHJpbmcgfCBzdHJpbmdbXSwgaXNGb3JtVmFsdWU/OiBib29sZWFuKSA9PiBQcm9taXNlPGFueVtdPjsiXX0=