@huntsman-cancer-institute/input 16.0.1 → 17.0.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.
Files changed (54) hide show
  1. package/date/date-base.d.ts +65 -65
  2. package/date/date-date-range.component.d.ts +32 -32
  3. package/date/date-date.component.d.ts +53 -53
  4. package/date/date-validator.d.ts +17 -17
  5. package/date/date.module.d.ts +16 -16
  6. package/dropdown/dropdown-index.d.ts +6 -6
  7. package/dropdown/dropdown-select-result.component.d.ts +23 -23
  8. package/dropdown/dropdown-select.component.d.ts +76 -76
  9. package/dropdown/dropdown.component.d.ts +40 -40
  10. package/dropdown/dropdown.module.d.ts +13 -13
  11. package/dropdown/dropdown.service.d.ts +51 -51
  12. package/dropdown/messages.d.ts +11 -11
  13. package/dropdown/select-item.d.ts +16 -16
  14. package/dropdown/template-dropdown.directive.d.ts +12 -12
  15. package/esm2022/date/date-base.mjs +114 -114
  16. package/esm2022/date/date-date-range.component.mjs +92 -92
  17. package/esm2022/date/date-date.component.mjs +189 -189
  18. package/esm2022/date/date-validator.mjs +40 -40
  19. package/esm2022/date/date.module.mjs +60 -60
  20. package/esm2022/dropdown/dropdown-index.mjs +5 -5
  21. package/esm2022/dropdown/dropdown-select-result.component.mjs +85 -85
  22. package/esm2022/dropdown/dropdown-select.component.mjs +360 -360
  23. package/esm2022/dropdown/dropdown.component.mjs +170 -170
  24. package/esm2022/dropdown/dropdown.module.mjs +50 -50
  25. package/esm2022/dropdown/dropdown.service.mjs +133 -133
  26. package/esm2022/dropdown/messages.mjs +9 -9
  27. package/esm2022/dropdown/select-item.mjs +11 -11
  28. package/esm2022/dropdown/template-dropdown.directive.mjs +26 -26
  29. package/esm2022/huntsman-cancer-institute-input.mjs +4 -4
  30. package/esm2022/index.mjs +19 -19
  31. package/esm2022/inline/inline.component.mjs +179 -179
  32. package/esm2022/inline/inline.module.mjs +28 -28
  33. package/esm2022/search/search.component.mjs +157 -157
  34. package/esm2022/search/search.module.mjs +32 -32
  35. package/esm2022/select/custom-combobox.component.mjs +531 -531
  36. package/esm2022/select/custom-multi-combobox.component.mjs +232 -232
  37. package/esm2022/select/md-multi-select.component.mjs +127 -127
  38. package/esm2022/select/md-select.component.mjs +107 -107
  39. package/esm2022/select/native-select.component.mjs +188 -188
  40. package/esm2022/select/select.module.mjs +83 -83
  41. package/fesm2022/huntsman-cancer-institute-input.mjs +2797 -2797
  42. package/fesm2022/huntsman-cancer-institute-input.mjs.map +1 -1
  43. package/index.d.ts +20 -20
  44. package/inline/inline.component.d.ts +66 -66
  45. package/inline/inline.module.d.ts +9 -9
  46. package/package.json +7 -7
  47. package/search/search.component.d.ts +42 -42
  48. package/search/search.module.d.ts +10 -10
  49. package/select/custom-combobox.component.d.ts +98 -98
  50. package/select/custom-multi-combobox.component.d.ts +50 -50
  51. package/select/md-multi-select.component.d.ts +32 -32
  52. package/select/md-select.component.d.ts +30 -30
  53. package/select/native-select.component.d.ts +37 -37
  54. package/select/select.module.d.ts +21 -21
@@ -1,460 +1,460 @@
1
- import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostBinding, Injector, Input, Output, ViewChild, ViewEncapsulation } from "@angular/core";
2
- import { UntypedFormControl, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
3
- import { combineLatest, Subscription } from "rxjs";
4
- import { debounceTime } from "rxjs/operators";
5
- import { CdkVirtualScrollViewport } from "@angular/cdk/scrolling";
6
- import { MatLegacyAutocompleteTrigger as MatAutocompleteTrigger } from "@angular/material/legacy-autocomplete";
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common";
9
- import * as i2 from "@angular/forms";
10
- import * as i3 from "@angular/material/legacy-form-field";
11
- import * as i4 from "@angular/material/legacy-core";
12
- import * as i5 from "@angular/cdk/scrolling";
13
- import * as i6 from "@angular/material/legacy-autocomplete";
14
- import * as i7 from "@angular/material/legacy-input";
15
- import * as i8 from "@angular/material/legacy-tooltip";
16
- import * as i9 from "@angular/material/legacy-progress-spinner";
17
- export class CustomComboBoxComponent {
18
- set customFieldClasses(value) {
19
- this._customFieldClasses = value ? value : "";
20
- }
21
- get customFieldClasses() {
22
- return !!this._customFieldClasses ? this._customFieldClasses : "mat-form-field-should-float";
23
- }
24
- set customOptionClasses(value) {
25
- this._customOptionClasses = value ? value : "";
26
- }
27
- get customOptionClasses() {
28
- return !!this._customOptionClasses ? this._customOptionClasses : "";
29
- }
30
- constructor(cdr, injector) {
31
- this.cdr = cdr;
32
- this.injector = injector;
33
- this.optionSizePx = 25;
34
- this.numOptionsToShow = 10;
35
- this.maxOptionsToShow = 10;
36
- this.customViewportClass = "";
37
- this.placeholder = "";
38
- // Removes the placeholder after a selection is made
39
- this.temporaryPlaceholder = false;
40
- this.tooltip = "";
41
- this.allowNone = true;
42
- this.selectTextOnOpen = true;
43
- // tell mat-dialog to pass initial focus to the inner input
44
- this._cdkFocusInitial = null;
45
- this.cdkFocusInitial = undefined;
46
- // on tab, skip the host element and focus the input
47
- this._tabindex = null;
48
- this.tabindex = 0;
49
- this.forceShowNone = false;
50
- this.options = [];
51
- this.allowLoader = false;
52
- this.isOpen = false;
53
- this.loadedOptions = [];
54
- this.forceEmitObject = false;
55
- this.appearance = "";
56
- // Set to empty to not show errors
57
- this.defineErrors = { required: "This is a required field" };
58
- this._showLoader = false;
59
- this._customFieldClasses = "";
60
- this._customOptionClasses = "";
61
- this.outerControl = new UntypedFormControl();
62
- this.innerControl = new UntypedFormControl(null);
63
- this.ignoreInnerControlChanges = false;
64
- this.subs = new Subscription();
65
- this.noNgControl = false;
66
- this.viewportVisibleRange = {
67
- start: 0,
68
- end: this.numOptionsToShow - 1
69
- };
70
- this.clickInProgress = false;
71
- this.optionSelected = new EventEmitter();
72
- this.optionChanged = new EventEmitter();
73
- this.optionsLoaded = new EventEmitter();
74
- this.onChangeFn = () => { };
75
- this.onTouchedFn = () => { };
76
- this.displayFn = (opt) => {
77
- return opt ? (this.displayField ? opt[this.displayField] : opt) : undefined;
78
- };
79
- }
80
- ngOnInit() {
81
- this._showLoader = this.allowLoader && (!this.options || this.options.length === 0);
82
- }
83
- ngAfterViewInit() {
84
- let ngControl = this.injector.get(NgControl, null);
85
- if (ngControl && ngControl.control) {
86
- this.outerControl = ngControl.control;
87
- this.innerControl.setValidators(this.outerControl.validator);
88
- this.innerControl.setAsyncValidators(this.outerControl.asyncValidator);
89
- this.innerControl.updateValueAndValidity();
90
- this.cdr.detectChanges();
91
- }
92
- else {
93
- this.noNgControl = true;
94
- }
95
- this.subs.add(this.innerControl.valueChanges.pipe(debounceTime(300)).subscribe((_value) => {
96
- if (this.isOpen && !this.ignoreInnerControlChanges) {
97
- this.filterOptions();
98
- }
99
- else {
100
- this.ignoreInnerControlChanges = false;
101
- }
102
- }));
103
- // work around for validators not always propagating
104
- this.subs.add(this.outerControl.statusChanges.subscribe((_event) => {
105
- this.innerControl.setValidators(this.outerControl.validator);
106
- this.innerControl.setAsyncValidators(this.outerControl.asyncValidator);
107
- this.innerControl.updateValueAndValidity();
108
- this.innerControl.setErrors(this.outerControl.errors);
109
- if (this.outerControl.touched) {
110
- this.innerControl.markAsTouched();
111
- }
112
- }));
113
- // this object is used to control the active state when keying up and down
114
- this.keyManager = this.autoCompleteTrigger.autocomplete._keyManager;
115
- this.keyManager.withWrap(false);
116
- this.subs.add(combineLatest([
117
- this.viewport.renderedRangeStream,
118
- this.viewport.scrolledIndexChange
119
- ]).subscribe(([renderedRange, scrolledIndex]) => {
120
- // Instead of loading the whole item list at once, the virtual scroll viewport buffers
121
- // a range of entries, only a portion of which are within the visible fold
122
- this.viewportRenderRange = renderedRange;
123
- // we have to figure out the visible range ourselves
124
- let len = Math.min(this.loadedOptions.length + (this.allowNone ? 1 : 0), this.numOptionsToShow - 1);
125
- this.viewportVisibleRange = {
126
- start: scrolledIndex,
127
- end: scrolledIndex + len
128
- };
129
- }));
130
- }
131
- ngOnChanges(changes) {
132
- if (changes.options) {
133
- let optionsChange = changes.options;
134
- if (!optionsChange.currentValue || optionsChange.currentValue.length < 1) {
135
- this.options = [];
136
- if (this.innerControl.value != null) {
137
- //Reset the innerControl value of the dropdown list to an empty array in case of no results are present to be displayed.
138
- //This flushes out the stale value from the list if there are no results to be displayed.
139
- this.innerControl.setValue([]);
140
- }
141
- }
142
- let currentOpts = optionsChange.currentValue;
143
- if (currentOpts && "length" in currentOpts && currentOpts !== optionsChange.previousValue) {
144
- this._showLoader = false;
145
- this.optionsLoaded.emit();
146
- // If number of options is less than our max, reduce size of overlay
147
- this.numOptionsToShow = Math.min(currentOpts.length + (this.allowNone ? 1 : 0), this.maxOptionsToShow);
148
- }
149
- else {
150
- this._showLoader = true;
151
- }
152
- }
153
- setTimeout(() => {
154
- // The autocomplete will automatically pop open once it has options filtered into it,
155
- // but we don't want it to on initial page load or when tabbing though
156
- if (this.isOpen) {
157
- this.filterOptions();
158
- }
159
- else {
160
- this.loadOnlyCurrentValue(this.outerControl.value);
161
- }
162
- });
163
- }
164
- writeValue(obj) {
165
- this.loadOnlyCurrentValue(obj);
166
- }
167
- registerOnChange(fn) {
168
- this.onChangeFn = fn;
169
- }
170
- registerOnTouched(fn) {
171
- this.onTouchedFn = fn;
172
- }
173
- setDisabledState(isDisabled) {
174
- if (isDisabled) {
175
- this.innerControl.disable();
176
- }
177
- else {
178
- this.innerControl.enable();
179
- }
180
- }
181
- getError() {
182
- for (const error in this.outerControl.errors) {
183
- if (this.defineErrors && error in this.defineErrors) {
184
- return this.defineErrors[error];
185
- }
186
- }
187
- }
188
- loadOnlyCurrentValue(cntrlVal) {
189
- if (!this.options || this.options.length < 1) {
190
- return;
191
- }
192
- let newValue = null;
193
- if (cntrlVal !== null && cntrlVal !== undefined) {
194
- let currentlySelected = this.options.find((opt) => {
195
- let optValue = this.valueField ? opt[this.valueField] : opt;
196
- if (this.forceEmitObject) {
197
- let outerValue = cntrlVal ? (this.valueField ? cntrlVal[this.valueField] : cntrlVal) : null;
198
- if (optValue === outerValue) {
199
- return true;
200
- }
201
- }
202
- else {
203
- return optValue === cntrlVal;
204
- }
205
- });
206
- if (currentlySelected) {
207
- newValue = currentlySelected;
208
- }
209
- }
210
- // prefer to check id if it has one vs straight against it's object identity
211
- if (this.innerControl.value && newValue != null && this.valueField) {
212
- if (this.innerControl.value[this.valueField] !== newValue[this.valueField]) {
213
- this.ignoreInnerControlChanges = true;
214
- this.innerControl.setValue(newValue);
215
- this.optionSelected.emit(newValue[this.valueField]);
216
- }
217
- }
218
- else if (this.innerControl.value !== newValue) {
219
- this.ignoreInnerControlChanges = true;
220
- this.innerControl.setValue(newValue);
221
- let nv = newValue ? ((this.valueField && !this.forceEmitObject) ? newValue[this.valueField] : newValue) : null;
222
- this.optionSelected.emit(nv);
223
- }
224
- }
225
- filterOptions(showAll = false) {
226
- this.forceShowNone = showAll;
227
- this.isOpen = true;
228
- if (!this.options || this.options.length < 1) {
229
- return;
230
- }
231
- if (showAll || !this.innerControl.value) {
232
- this.loadedOptions = [...this.options];
233
- }
234
- else {
235
- let searchValue = "";
236
- if (typeof this.innerControl.value === "string") {
237
- searchValue = this.innerControl.value.toLowerCase();
238
- }
239
- else if (this.displayField) {
240
- searchValue = this.innerControl.value[this.displayField].toLowerCase();
241
- }
242
- this.loadedOptions = this.options.filter((opt) => {
243
- let optDisplay = (this.displayField ? opt[this.displayField] : opt).toLowerCase();
244
- return optDisplay.includes(searchValue);
245
- });
246
- this.forceShowNone = this.loadedOptions.length === 0;
247
- }
248
- this.selectedIndex = this.getOptIndex(this.outerControl.value);
249
- }
250
- showLoader() {
251
- return this.allowLoader && this._showLoader;
252
- }
253
- open() {
254
- if (this.innerControl.disabled) {
255
- return;
256
- }
257
- // The autocomplete will only open when options are loaded
258
- this.filterOptions(true);
259
- this.autoCompleteTrigger.openPanel();
260
- }
261
- close() {
262
- this.autoCompleteTrigger.closePanel();
263
- }
264
- onOpened() {
265
- this.forceShowNone = true;
266
- if (this.isOpen) {
267
- return;
268
- }
269
- this.isOpen = true;
270
- if (this.selectTextOnOpen) {
271
- this.inputElement.nativeElement.select(); // Highlights text
272
- }
273
- if (this.selectedIndex > 0) {
274
- // make the selected option also the active option
275
- this.activeValue = this.getOptVal(this.loadedOptions[this.selectedIndex]);
276
- setTimeout(() => {
277
- this.scrollToSelectedOption();
278
- });
279
- }
280
- }
281
- onClosed() {
282
- if (!this.isOpen) {
283
- return;
284
- }
285
- this.isOpen = false;
286
- if (!this.innerControl.value && this.outerControl.value) {
287
- this.selectOption(null);
288
- }
289
- this.loadOnlyCurrentValue(this.outerControl.value);
290
- // reset the options so the autocomplete won't automatically open on the next tab through
291
- this.loadedOptions = [];
292
- }
293
- startClick() {
294
- // clicking on certain parts of the mat-field will "flicker" the focus, triggering
295
- // error validation early. This tracks those internal clicks so they can be ignored
296
- this.clickInProgress = true;
297
- }
298
- endClick() {
299
- this.clickInProgress = false;
300
- }
301
- onClick(event) {
302
- event.stopPropagation();
303
- if (!this.isOpen) {
304
- this.open();
305
- }
306
- }
307
- toggleOpen(event) {
308
- event.stopPropagation();
309
- if (this.isOpen) {
310
- this.close();
311
- }
312
- else {
313
- this.open();
314
- }
315
- }
316
- onKey(event) {
317
- if (event.key === "Tab" || event.key === "Enter") {
318
- return;
319
- }
320
- else {
321
- if (!this.isOpen) {
322
- this.open();
323
- }
324
- // There is a bug where the cdk a11y KeyManager implementation is not compatible with
325
- // the MatAutocompleteTrigger, which causes the Drop-down not scroll with keyboard
326
- // on long option lists.
327
- //
328
- // https://github.com/angular/components/issues/16598
329
- //
330
- // This work around takes control of the keyboard and manually scrolls and activates
331
- // the options
332
- //
333
- // References:
334
- // https://github.com/angular/components/blob/master/src/material/autocomplete/autocomplete-trigger.ts
335
- // https://github.com/angular/components/blob/master/src/cdk/a11y/key-manager/list-key-manager.ts
336
- // https://github.com/angular/components/blob/master/src/cdk/a11y/key-manager/activedescendant-key-manager.ts
337
- if (event.key === "ArrowUp" || event.key === "ArrowDown") {
338
- event.stopPropagation();
339
- this.initActiveItem();
340
- this.shiftActiveItem(event.key);
341
- this.checkActiveBoundaries();
342
- }
343
- }
344
- }
345
- // before our keypress binding even triggers, angular has already moved the active selection
346
- // unsyncing it with our display. this code re-initializes the active option
347
- initActiveItem() {
348
- if (this.activeValue === undefined || this.activeValue === null) {
349
- this.keyManager.setFirstItemActive();
350
- }
351
- else {
352
- let activeIndex = this.getActiveIndex();
353
- // this does the conversion from an index within all options down to a position within the
354
- // displayed range, which is all the keymanager is aware of
355
- let position = activeIndex - this.viewportRenderRange.start;
356
- this.keyManager.setActiveItem(position);
357
- }
358
- }
359
- shiftActiveItem(key) {
360
- if (key === "ArrowUp") {
361
- this.keyManager.setPreviousItemActive();
362
- }
363
- else if (key === "ArrowDown") {
364
- this.keyManager.setNextItemActive();
365
- }
366
- if (this.keyManager.activeItem) {
367
- this.activeValue = this.getOptVal(this.keyManager.activeItem.value);
368
- }
369
- }
370
- // check if the active option index is within the displayed viewport window
371
- // if not, scroll it into view
372
- checkActiveBoundaries() {
373
- let activeIndex = this.getActiveIndex();
374
- if (activeIndex < this.viewportVisibleRange.start) {
375
- setTimeout(() => {
376
- this.viewport.scrollToOffset(activeIndex * this.optionSizePx);
377
- });
378
- }
379
- else if (activeIndex > this.viewportVisibleRange.end) {
380
- setTimeout(() => {
381
- this.viewport.scrollToOffset((activeIndex - (this.numOptionsToShow - 1)) * this.optionSizePx);
382
- });
383
- }
384
- }
385
- getActiveIndex() {
386
- let activeIndex = 0;
387
- if (this.activeValue !== undefined && this.activeValue !== null) {
388
- // if we added a none option the returned index would be off by one
389
- let valIndex = this.getOptIndex(this.activeValue) + (this.allowNone && (this.forceShowNone || !this.innerControl.value) ? 1 : 0);
390
- // the index should be within the range of our entire buffer, or just allow it to reset
391
- if (valIndex >= this.viewportRenderRange.start
392
- && (!this.viewportRenderRange.end || valIndex <= this.viewportRenderRange.end)) {
393
- activeIndex = valIndex;
394
- }
395
- }
396
- return activeIndex;
397
- }
398
- onFocus() {
399
- if (!this.isOpen) {
400
- // Highlights text
401
- if (this.selectTextOnOpen) {
402
- this.inputElement.nativeElement.select();
403
- }
404
- }
405
- }
406
- onFocusOut() {
407
- // mark control touched and trigger error validation
408
- if (!this.clickInProgress) {
409
- this.close();
410
- this.onTouchedFn();
411
- }
412
- }
413
- selectOption(opt) {
414
- let newVal = this.getOptVal(opt, this.forceEmitObject);
415
- if (this.noNgControl) {
416
- this.outerControl.setValue(newVal);
417
- }
418
- this.onChangeFn(newVal);
419
- this.optionSelected.emit(newVal);
420
- this.optionChanged.emit(newVal);
421
- }
422
- scrollToSelectedOption() {
423
- // scroll to the currently selected option when we open the dropdown
424
- if (this.selectedIndex > 0) {
425
- let offsetIndex = this.selectedIndex + (this.allowNone ? 1 : 0); // adjust for None entry
426
- offsetIndex -= (this.numOptionsToShow / 2) - 1; // calculate middle of viewport
427
- this.viewport.scrollToOffset(offsetIndex * this.optionSizePx);
428
- }
429
- }
430
- getOptVal(opt, forceObject = false) {
431
- if (this.valueField && !forceObject) {
432
- if (opt !== null && opt !== undefined && typeof opt === "object" && this.valueField in opt) {
433
- return opt[this.valueField];
434
- }
435
- else {
436
- return undefined;
437
- }
438
- }
439
- return opt;
440
- }
441
- getOptIndex(optValue) {
442
- // find the index for the currently selected option
443
- if (optValue !== null && optValue !== undefined) {
444
- return this.loadedOptions.findIndex((option) => {
445
- return this.getOptVal(option) === optValue;
446
- });
447
- }
448
- return undefined;
449
- }
450
- ngOnDestroy() {
451
- this.subs.unsubscribe();
452
- }
453
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomComboBoxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
454
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CustomComboBoxComponent, selector: "hci-combobox", inputs: { maxOptionsToShow: "maxOptionsToShow", customViewportClass: "customViewportClass", customFieldClasses: "customFieldClasses", customOptionClasses: "customOptionClasses", label: "label", placeholder: "placeholder", temporaryPlaceholder: "temporaryPlaceholder", tooltip: "tooltip", allowNone: "allowNone", selectTextOnOpen: "selectTextOnOpen", cdkFocusInitial: "cdkFocusInitial", tabindex: "tabindex", options: "options", allowLoader: "allowLoader", valueField: "valueField", forceEmitObject: "forceEmitObject", displayField: "displayField", appearance: "appearance", floatLabel: "floatLabel", defineErrors: "defineErrors" }, outputs: { optionSelected: "optionSelected", optionChanged: "optionChanged", optionsLoaded: "optionsLoaded" }, host: { properties: { "attr.cdkFocusInitial": "this._cdkFocusInitial", "attr.tabindex": "this._tabindex" }, classAttribute: "hci-combobox-container" }, providers: [{
455
- provide: NG_VALUE_ACCESSOR,
456
- useExisting: forwardRef(() => CustomComboBoxComponent),
457
- multi: true,
1
+ import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostBinding, Injector, Input, Output, ViewChild, ViewEncapsulation } from "@angular/core";
2
+ import { UntypedFormControl, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
3
+ import { combineLatest, Subscription } from "rxjs";
4
+ import { debounceTime } from "rxjs/operators";
5
+ import { CdkVirtualScrollViewport } from "@angular/cdk/scrolling";
6
+ import { MatLegacyAutocompleteTrigger as MatAutocompleteTrigger } from "@angular/material/legacy-autocomplete";
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common";
9
+ import * as i2 from "@angular/forms";
10
+ import * as i3 from "@angular/material/legacy-form-field";
11
+ import * as i4 from "@angular/material/legacy-core";
12
+ import * as i5 from "@angular/cdk/scrolling";
13
+ import * as i6 from "@angular/material/legacy-autocomplete";
14
+ import * as i7 from "@angular/material/legacy-input";
15
+ import * as i8 from "@angular/material/legacy-tooltip";
16
+ import * as i9 from "@angular/material/legacy-progress-spinner";
17
+ export class CustomComboBoxComponent {
18
+ set customFieldClasses(value) {
19
+ this._customFieldClasses = value ? value : "";
20
+ }
21
+ get customFieldClasses() {
22
+ return !!this._customFieldClasses ? this._customFieldClasses : "mat-form-field-should-float";
23
+ }
24
+ set customOptionClasses(value) {
25
+ this._customOptionClasses = value ? value : "";
26
+ }
27
+ get customOptionClasses() {
28
+ return !!this._customOptionClasses ? this._customOptionClasses : "";
29
+ }
30
+ constructor(cdr, injector) {
31
+ this.cdr = cdr;
32
+ this.injector = injector;
33
+ this.optionSizePx = 25;
34
+ this.numOptionsToShow = 10;
35
+ this.maxOptionsToShow = 10;
36
+ this.customViewportClass = "";
37
+ this.placeholder = "";
38
+ // Removes the placeholder after a selection is made
39
+ this.temporaryPlaceholder = false;
40
+ this.tooltip = "";
41
+ this.allowNone = true;
42
+ this.selectTextOnOpen = true;
43
+ // tell mat-dialog to pass initial focus to the inner input
44
+ this._cdkFocusInitial = null;
45
+ this.cdkFocusInitial = undefined;
46
+ // on tab, skip the host element and focus the input
47
+ this._tabindex = null;
48
+ this.tabindex = 0;
49
+ this.forceShowNone = false;
50
+ this.options = [];
51
+ this.allowLoader = false;
52
+ this.isOpen = false;
53
+ this.loadedOptions = [];
54
+ this.forceEmitObject = false;
55
+ this.appearance = "";
56
+ // Set to empty to not show errors
57
+ this.defineErrors = { required: "This is a required field" };
58
+ this._showLoader = false;
59
+ this._customFieldClasses = "";
60
+ this._customOptionClasses = "";
61
+ this.outerControl = new UntypedFormControl();
62
+ this.innerControl = new UntypedFormControl(null);
63
+ this.ignoreInnerControlChanges = false;
64
+ this.subs = new Subscription();
65
+ this.noNgControl = false;
66
+ this.viewportVisibleRange = {
67
+ start: 0,
68
+ end: this.numOptionsToShow - 1
69
+ };
70
+ this.clickInProgress = false;
71
+ this.optionSelected = new EventEmitter();
72
+ this.optionChanged = new EventEmitter();
73
+ this.optionsLoaded = new EventEmitter();
74
+ this.onChangeFn = () => { };
75
+ this.onTouchedFn = () => { };
76
+ this.displayFn = (opt) => {
77
+ return opt ? (this.displayField ? opt[this.displayField] : opt) : undefined;
78
+ };
79
+ }
80
+ ngOnInit() {
81
+ this._showLoader = this.allowLoader && (!this.options || this.options.length === 0);
82
+ }
83
+ ngAfterViewInit() {
84
+ let ngControl = this.injector.get(NgControl, null);
85
+ if (ngControl && ngControl.control) {
86
+ this.outerControl = ngControl.control;
87
+ this.innerControl.setValidators(this.outerControl.validator);
88
+ this.innerControl.setAsyncValidators(this.outerControl.asyncValidator);
89
+ this.innerControl.updateValueAndValidity();
90
+ this.cdr.detectChanges();
91
+ }
92
+ else {
93
+ this.noNgControl = true;
94
+ }
95
+ this.subs.add(this.innerControl.valueChanges.pipe(debounceTime(300)).subscribe((_value) => {
96
+ if (this.isOpen && !this.ignoreInnerControlChanges) {
97
+ this.filterOptions();
98
+ }
99
+ else {
100
+ this.ignoreInnerControlChanges = false;
101
+ }
102
+ }));
103
+ // work around for validators not always propagating
104
+ this.subs.add(this.outerControl.statusChanges.subscribe((_event) => {
105
+ this.innerControl.setValidators(this.outerControl.validator);
106
+ this.innerControl.setAsyncValidators(this.outerControl.asyncValidator);
107
+ this.innerControl.updateValueAndValidity();
108
+ this.innerControl.setErrors(this.outerControl.errors);
109
+ if (this.outerControl.touched) {
110
+ this.innerControl.markAsTouched();
111
+ }
112
+ }));
113
+ // this object is used to control the active state when keying up and down
114
+ this.keyManager = this.autoCompleteTrigger.autocomplete._keyManager;
115
+ this.keyManager.withWrap(false);
116
+ this.subs.add(combineLatest([
117
+ this.viewport.renderedRangeStream,
118
+ this.viewport.scrolledIndexChange
119
+ ]).subscribe(([renderedRange, scrolledIndex]) => {
120
+ // Instead of loading the whole item list at once, the virtual scroll viewport buffers
121
+ // a range of entries, only a portion of which are within the visible fold
122
+ this.viewportRenderRange = renderedRange;
123
+ // we have to figure out the visible range ourselves
124
+ let len = Math.min(this.loadedOptions.length + (this.allowNone ? 1 : 0), this.numOptionsToShow - 1);
125
+ this.viewportVisibleRange = {
126
+ start: scrolledIndex,
127
+ end: scrolledIndex + len
128
+ };
129
+ }));
130
+ }
131
+ ngOnChanges(changes) {
132
+ if (changes.options) {
133
+ let optionsChange = changes.options;
134
+ if (!optionsChange.currentValue || optionsChange.currentValue.length < 1) {
135
+ this.options = [];
136
+ if (this.innerControl.value != null) {
137
+ //Reset the innerControl value of the dropdown list to an empty array in case of no results are present to be displayed.
138
+ //This flushes out the stale value from the list if there are no results to be displayed.
139
+ this.innerControl.setValue([]);
140
+ }
141
+ }
142
+ let currentOpts = optionsChange.currentValue;
143
+ if (currentOpts && "length" in currentOpts && currentOpts !== optionsChange.previousValue) {
144
+ this._showLoader = false;
145
+ this.optionsLoaded.emit();
146
+ // If number of options is less than our max, reduce size of overlay
147
+ this.numOptionsToShow = Math.min(currentOpts.length + (this.allowNone ? 1 : 0), this.maxOptionsToShow);
148
+ }
149
+ else {
150
+ this._showLoader = true;
151
+ }
152
+ }
153
+ setTimeout(() => {
154
+ // The autocomplete will automatically pop open once it has options filtered into it,
155
+ // but we don't want it to on initial page load or when tabbing though
156
+ if (this.isOpen) {
157
+ this.filterOptions();
158
+ }
159
+ else {
160
+ this.loadOnlyCurrentValue(this.outerControl.value);
161
+ }
162
+ });
163
+ }
164
+ writeValue(obj) {
165
+ this.loadOnlyCurrentValue(obj);
166
+ }
167
+ registerOnChange(fn) {
168
+ this.onChangeFn = fn;
169
+ }
170
+ registerOnTouched(fn) {
171
+ this.onTouchedFn = fn;
172
+ }
173
+ setDisabledState(isDisabled) {
174
+ if (isDisabled) {
175
+ this.innerControl.disable();
176
+ }
177
+ else {
178
+ this.innerControl.enable();
179
+ }
180
+ }
181
+ getError() {
182
+ for (const error in this.outerControl.errors) {
183
+ if (this.defineErrors && error in this.defineErrors) {
184
+ return this.defineErrors[error];
185
+ }
186
+ }
187
+ }
188
+ loadOnlyCurrentValue(cntrlVal) {
189
+ if (!this.options || this.options.length < 1) {
190
+ return;
191
+ }
192
+ let newValue = null;
193
+ if (cntrlVal !== null && cntrlVal !== undefined) {
194
+ let currentlySelected = this.options.find((opt) => {
195
+ let optValue = this.valueField ? opt[this.valueField] : opt;
196
+ if (this.forceEmitObject) {
197
+ let outerValue = cntrlVal ? (this.valueField ? cntrlVal[this.valueField] : cntrlVal) : null;
198
+ if (optValue === outerValue) {
199
+ return true;
200
+ }
201
+ }
202
+ else {
203
+ return optValue === cntrlVal;
204
+ }
205
+ });
206
+ if (currentlySelected) {
207
+ newValue = currentlySelected;
208
+ }
209
+ }
210
+ // prefer to check id if it has one vs straight against it's object identity
211
+ if (this.innerControl.value && newValue != null && this.valueField) {
212
+ if (this.innerControl.value[this.valueField] !== newValue[this.valueField]) {
213
+ this.ignoreInnerControlChanges = true;
214
+ this.innerControl.setValue(newValue);
215
+ this.optionSelected.emit(newValue[this.valueField]);
216
+ }
217
+ }
218
+ else if (this.innerControl.value !== newValue) {
219
+ this.ignoreInnerControlChanges = true;
220
+ this.innerControl.setValue(newValue);
221
+ let nv = newValue ? ((this.valueField && !this.forceEmitObject) ? newValue[this.valueField] : newValue) : null;
222
+ this.optionSelected.emit(nv);
223
+ }
224
+ }
225
+ filterOptions(showAll = false) {
226
+ this.forceShowNone = showAll;
227
+ this.isOpen = true;
228
+ if (!this.options || this.options.length < 1) {
229
+ return;
230
+ }
231
+ if (showAll || !this.innerControl.value) {
232
+ this.loadedOptions = [...this.options];
233
+ }
234
+ else {
235
+ let searchValue = "";
236
+ if (typeof this.innerControl.value === "string") {
237
+ searchValue = this.innerControl.value.toLowerCase();
238
+ }
239
+ else if (this.displayField) {
240
+ searchValue = this.innerControl.value[this.displayField].toLowerCase();
241
+ }
242
+ this.loadedOptions = this.options.filter((opt) => {
243
+ let optDisplay = (this.displayField ? opt[this.displayField] : opt).toLowerCase();
244
+ return optDisplay.includes(searchValue);
245
+ });
246
+ this.forceShowNone = this.loadedOptions.length === 0;
247
+ }
248
+ this.selectedIndex = this.getOptIndex(this.outerControl.value);
249
+ }
250
+ showLoader() {
251
+ return this.allowLoader && this._showLoader;
252
+ }
253
+ open() {
254
+ if (this.innerControl.disabled) {
255
+ return;
256
+ }
257
+ // The autocomplete will only open when options are loaded
258
+ this.filterOptions(true);
259
+ this.autoCompleteTrigger.openPanel();
260
+ }
261
+ close() {
262
+ this.autoCompleteTrigger.closePanel();
263
+ }
264
+ onOpened() {
265
+ this.forceShowNone = true;
266
+ if (this.isOpen) {
267
+ return;
268
+ }
269
+ this.isOpen = true;
270
+ if (this.selectTextOnOpen) {
271
+ this.inputElement.nativeElement.select(); // Highlights text
272
+ }
273
+ if (this.selectedIndex > 0) {
274
+ // make the selected option also the active option
275
+ this.activeValue = this.getOptVal(this.loadedOptions[this.selectedIndex]);
276
+ setTimeout(() => {
277
+ this.scrollToSelectedOption();
278
+ });
279
+ }
280
+ }
281
+ onClosed() {
282
+ if (!this.isOpen) {
283
+ return;
284
+ }
285
+ this.isOpen = false;
286
+ if (!this.innerControl.value && this.outerControl.value) {
287
+ this.selectOption(null);
288
+ }
289
+ this.loadOnlyCurrentValue(this.outerControl.value);
290
+ // reset the options so the autocomplete won't automatically open on the next tab through
291
+ this.loadedOptions = [];
292
+ }
293
+ startClick() {
294
+ // clicking on certain parts of the mat-field will "flicker" the focus, triggering
295
+ // error validation early. This tracks those internal clicks so they can be ignored
296
+ this.clickInProgress = true;
297
+ }
298
+ endClick() {
299
+ this.clickInProgress = false;
300
+ }
301
+ onClick(event) {
302
+ event.stopPropagation();
303
+ if (!this.isOpen) {
304
+ this.open();
305
+ }
306
+ }
307
+ toggleOpen(event) {
308
+ event.stopPropagation();
309
+ if (this.isOpen) {
310
+ this.close();
311
+ }
312
+ else {
313
+ this.open();
314
+ }
315
+ }
316
+ onKey(event) {
317
+ if (event.key === "Tab" || event.key === "Enter") {
318
+ return;
319
+ }
320
+ else {
321
+ if (!this.isOpen) {
322
+ this.open();
323
+ }
324
+ // There is a bug where the cdk a11y KeyManager implementation is not compatible with
325
+ // the MatAutocompleteTrigger, which causes the Drop-down not scroll with keyboard
326
+ // on long option lists.
327
+ //
328
+ // https://github.com/angular/components/issues/16598
329
+ //
330
+ // This work around takes control of the keyboard and manually scrolls and activates
331
+ // the options
332
+ //
333
+ // References:
334
+ // https://github.com/angular/components/blob/master/src/material/autocomplete/autocomplete-trigger.ts
335
+ // https://github.com/angular/components/blob/master/src/cdk/a11y/key-manager/list-key-manager.ts
336
+ // https://github.com/angular/components/blob/master/src/cdk/a11y/key-manager/activedescendant-key-manager.ts
337
+ if (event.key === "ArrowUp" || event.key === "ArrowDown") {
338
+ event.stopPropagation();
339
+ this.initActiveItem();
340
+ this.shiftActiveItem(event.key);
341
+ this.checkActiveBoundaries();
342
+ }
343
+ }
344
+ }
345
+ // before our keypress binding even triggers, angular has already moved the active selection
346
+ // unsyncing it with our display. this code re-initializes the active option
347
+ initActiveItem() {
348
+ if (this.activeValue === undefined || this.activeValue === null) {
349
+ this.keyManager.setFirstItemActive();
350
+ }
351
+ else {
352
+ let activeIndex = this.getActiveIndex();
353
+ // this does the conversion from an index within all options down to a position within the
354
+ // displayed range, which is all the keymanager is aware of
355
+ let position = activeIndex - this.viewportRenderRange.start;
356
+ this.keyManager.setActiveItem(position);
357
+ }
358
+ }
359
+ shiftActiveItem(key) {
360
+ if (key === "ArrowUp") {
361
+ this.keyManager.setPreviousItemActive();
362
+ }
363
+ else if (key === "ArrowDown") {
364
+ this.keyManager.setNextItemActive();
365
+ }
366
+ if (this.keyManager.activeItem) {
367
+ this.activeValue = this.getOptVal(this.keyManager.activeItem.value);
368
+ }
369
+ }
370
+ // check if the active option index is within the displayed viewport window
371
+ // if not, scroll it into view
372
+ checkActiveBoundaries() {
373
+ let activeIndex = this.getActiveIndex();
374
+ if (activeIndex < this.viewportVisibleRange.start) {
375
+ setTimeout(() => {
376
+ this.viewport.scrollToOffset(activeIndex * this.optionSizePx);
377
+ });
378
+ }
379
+ else if (activeIndex > this.viewportVisibleRange.end) {
380
+ setTimeout(() => {
381
+ this.viewport.scrollToOffset((activeIndex - (this.numOptionsToShow - 1)) * this.optionSizePx);
382
+ });
383
+ }
384
+ }
385
+ getActiveIndex() {
386
+ let activeIndex = 0;
387
+ if (this.activeValue !== undefined && this.activeValue !== null) {
388
+ // if we added a none option the returned index would be off by one
389
+ let valIndex = this.getOptIndex(this.activeValue) + (this.allowNone && (this.forceShowNone || !this.innerControl.value) ? 1 : 0);
390
+ // the index should be within the range of our entire buffer, or just allow it to reset
391
+ if (valIndex >= this.viewportRenderRange.start
392
+ && (!this.viewportRenderRange.end || valIndex <= this.viewportRenderRange.end)) {
393
+ activeIndex = valIndex;
394
+ }
395
+ }
396
+ return activeIndex;
397
+ }
398
+ onFocus() {
399
+ if (!this.isOpen) {
400
+ // Highlights text
401
+ if (this.selectTextOnOpen) {
402
+ this.inputElement.nativeElement.select();
403
+ }
404
+ }
405
+ }
406
+ onFocusOut() {
407
+ // mark control touched and trigger error validation
408
+ if (!this.clickInProgress) {
409
+ this.close();
410
+ this.onTouchedFn();
411
+ }
412
+ }
413
+ selectOption(opt) {
414
+ let newVal = this.getOptVal(opt, this.forceEmitObject);
415
+ if (this.noNgControl) {
416
+ this.outerControl.setValue(newVal);
417
+ }
418
+ this.onChangeFn(newVal);
419
+ this.optionSelected.emit(newVal);
420
+ this.optionChanged.emit(newVal);
421
+ }
422
+ scrollToSelectedOption() {
423
+ // scroll to the currently selected option when we open the dropdown
424
+ if (this.selectedIndex > 0) {
425
+ let offsetIndex = this.selectedIndex + (this.allowNone ? 1 : 0); // adjust for None entry
426
+ offsetIndex -= (this.numOptionsToShow / 2) - 1; // calculate middle of viewport
427
+ this.viewport.scrollToOffset(offsetIndex * this.optionSizePx);
428
+ }
429
+ }
430
+ getOptVal(opt, forceObject = false) {
431
+ if (this.valueField && !forceObject) {
432
+ if (opt !== null && opt !== undefined && typeof opt === "object" && this.valueField in opt) {
433
+ return opt[this.valueField];
434
+ }
435
+ else {
436
+ return undefined;
437
+ }
438
+ }
439
+ return opt;
440
+ }
441
+ getOptIndex(optValue) {
442
+ // find the index for the currently selected option
443
+ if (optValue !== null && optValue !== undefined) {
444
+ return this.loadedOptions.findIndex((option) => {
445
+ return this.getOptVal(option) === optValue;
446
+ });
447
+ }
448
+ return undefined;
449
+ }
450
+ ngOnDestroy() {
451
+ this.subs.unsubscribe();
452
+ }
453
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CustomComboBoxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
454
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: CustomComboBoxComponent, selector: "hci-combobox", inputs: { maxOptionsToShow: "maxOptionsToShow", customViewportClass: "customViewportClass", customFieldClasses: "customFieldClasses", customOptionClasses: "customOptionClasses", label: "label", placeholder: "placeholder", temporaryPlaceholder: "temporaryPlaceholder", tooltip: "tooltip", allowNone: "allowNone", selectTextOnOpen: "selectTextOnOpen", cdkFocusInitial: "cdkFocusInitial", tabindex: "tabindex", options: "options", allowLoader: "allowLoader", valueField: "valueField", forceEmitObject: "forceEmitObject", displayField: "displayField", appearance: "appearance", floatLabel: "floatLabel", defineErrors: "defineErrors" }, outputs: { optionSelected: "optionSelected", optionChanged: "optionChanged", optionsLoaded: "optionsLoaded" }, host: { properties: { "attr.cdkFocusInitial": "this._cdkFocusInitial", "attr.tabindex": "this._tabindex" }, classAttribute: "hci-combobox-container" }, providers: [{
455
+ provide: NG_VALUE_ACCESSOR,
456
+ useExisting: forwardRef(() => CustomComboBoxComponent),
457
+ multi: true,
458
458
  }], viewQueries: [{ propertyName: "viewport", first: true, predicate: ["viewport"], descendants: true, static: true }, { propertyName: "inputElement", first: true, predicate: ["input"], descendants: true, static: true }, { propertyName: "autoCompleteTrigger", first: true, predicate: ["input"], descendants: true, read: MatAutocompleteTrigger }], usesOnChanges: true, ngImport: i0, template: `
459
459
  <mat-form-field (click)="onClick($event)"
460
460
  (mousedown)="startClick()"
@@ -529,10 +529,10 @@ export class CustomComboBoxComponent {
529
529
  </mat-error>
530
530
  <ng-content></ng-content>
531
531
  </mat-form-field>
532
- `, isInline: true, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i3.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "component", type: i4.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i6.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i6.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i8.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], encapsulation: i0.ViewEncapsulation.None }); }
533
- }
534
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomComboBoxComponent, decorators: [{
535
- type: Component,
532
+ `, isInline: true, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i3.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "component", type: i4.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i6.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i6.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i8.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], encapsulation: i0.ViewEncapsulation.None }); }
533
+ }
534
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CustomComboBoxComponent, decorators: [{
535
+ type: Component,
536
536
  args: [{ selector: "hci-combobox", template: `
537
537
  <mat-form-field (click)="onClick($event)"
538
538
  (mousedown)="startClick()"
@@ -607,73 +607,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
607
607
  </mat-error>
608
608
  <ng-content></ng-content>
609
609
  </mat-form-field>
610
- `, providers: [{
611
- provide: NG_VALUE_ACCESSOR,
612
- useExisting: forwardRef(() => CustomComboBoxComponent),
613
- multi: true,
614
- }], host: {
615
- class: "hci-combobox-container"
616
- }, encapsulation: ViewEncapsulation.None, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"] }]
617
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Injector }]; }, propDecorators: { maxOptionsToShow: [{
618
- type: Input
619
- }], customViewportClass: [{
620
- type: Input
621
- }], customFieldClasses: [{
622
- type: Input
623
- }], customOptionClasses: [{
624
- type: Input
625
- }], label: [{
626
- type: Input
627
- }], placeholder: [{
628
- type: Input
629
- }], temporaryPlaceholder: [{
630
- type: Input
631
- }], tooltip: [{
632
- type: Input
633
- }], allowNone: [{
634
- type: Input
635
- }], selectTextOnOpen: [{
636
- type: Input
637
- }], _cdkFocusInitial: [{
638
- type: HostBinding,
639
- args: ["attr.cdkFocusInitial"]
640
- }], cdkFocusInitial: [{
641
- type: Input
642
- }], _tabindex: [{
643
- type: HostBinding,
644
- args: ["attr.tabindex"]
645
- }], tabindex: [{
646
- type: Input
647
- }], options: [{
648
- type: Input
649
- }], allowLoader: [{
650
- type: Input
651
- }], valueField: [{
652
- type: Input
653
- }], forceEmitObject: [{
654
- type: Input
655
- }], displayField: [{
656
- type: Input
657
- }], appearance: [{
658
- type: Input
659
- }], floatLabel: [{
660
- type: Input
661
- }], defineErrors: [{
662
- type: Input
663
- }], optionSelected: [{
664
- type: Output
665
- }], optionChanged: [{
666
- type: Output
667
- }], optionsLoaded: [{
668
- type: Output
669
- }], viewport: [{
670
- type: ViewChild,
671
- args: ["viewport", { static: true }]
672
- }], inputElement: [{
673
- type: ViewChild,
674
- args: ["input", { static: true }]
675
- }], autoCompleteTrigger: [{
676
- type: ViewChild,
677
- args: ["input", { read: MatAutocompleteTrigger, static: false }]
678
- }] } });
679
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0L3NyYy9zZWxlY3QvY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZILE9BQU8sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUMsNEJBQTRCLElBQUksc0JBQXNCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7Ozs7Ozs7QUF5STdHLE1BQU0sT0FBTyx1QkFBdUI7SUFVbEMsSUFDVyxrQkFBa0IsQ0FBQyxLQUFhO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUM7SUFDL0YsQ0FBQztJQUVELElBQ1csbUJBQW1CLENBQUMsS0FBYTtRQUMxQyxJQUFJLENBQUMs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QixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBeUJJLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUdQLFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUlyQyxZQUFZO3NCQURYLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFJbEMsbUJBQW1CO3NCQURsQixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEluamVjdG9yLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZSxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3RW5jYXBzdWxhdGlvblxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVW50eXBlZEZvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUiwgTmdDb250cm9sfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7ZGVib3VuY2VUaW1lfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnR9IGZyb20gXCJAYW5ndWxhci9jZGsvc2Nyb2xsaW5nXCI7XHJcbmltcG9ydCB7TWF0TGVnYWN5QXV0b2NvbXBsZXRlVHJpZ2dlciBhcyBNYXRBdXRvY29tcGxldGVUcmlnZ2VyfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWF1dG9jb21wbGV0ZVwiO1xyXG5pbXBvcnQge0xpc3RSYW5nZX0gZnJvbSBcIkBhbmd1bGFyL2Nkay9jb2xsZWN0aW9uc1wiO1xyXG5pbXBvcnQge0xpc3RLZXlNYW5hZ2VyLCBIaWdobGlnaHRhYmxlfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XHJcbmltcG9ydCB7TWF0TGVnYWN5T3B0aW9uIGFzIE1hdE9wdGlvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1jb3JlXCI7XHJcbmltcG9ydCB7TGVnYWN5RmxvYXRMYWJlbFR5cGUgYXMgRmxvYXRMYWJlbFR5cGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZm9ybS1maWVsZFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiaGNpLWNvbWJvYm94XCIsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxtYXQtZm9ybS1maWVsZCAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0Q2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNldXApPVwiZW5kQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwidGhpcy50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjdXN0b21GaWVsZENsYXNzZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgPG1hdC1sYWJlbCAqbmdJZj1cImxhYmVsICE9PSB1bmRlZmluZWRcIj57eyBsYWJlbCB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LWxhYmVsICpuZ0lmPVwibGFiZWwgPT09IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgIHt7IHRlbXBvcmFyeVBsYWNlaG9sZGVyID8gKGlubmVyQ29udHJvbC52YWx1ZSA/ICcnIDogcGxhY2Vob2xkZXIpIDogcGxhY2Vob2xkZXIgfX1cclxuICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCAjaW5wdXRcclxuICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICBuYW1lPVwiY3VzdG9tQ29tYm9Cb3hGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInRlbXBvcmFyeVBsYWNlaG9sZGVyID8gKGlubmVyQ29udHJvbC52YWx1ZSA/ICcnIDogcGxhY2Vob2xkZXIpIDogcGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcclxuICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiaW5uZXJDb250cm9sXCJcclxuICAgICAgICAgICAgIFthdHRyLmNka0ZvY3VzSW5pdGlhbF09XCJjZGtGb2N1c0luaXRpYWwgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjZGtGb2N1c0luaXRpYWxcIlxyXG4gICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcclxuICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5KCRldmVudClcIlxyXG4gICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCJcclxuICAgICAgICAgICAgID5cclxuICAgICAgPGRpdiBtYXRTdWZmaXhcclxuICAgICAgICAgICBjbGFzcz1cImhjaS1jb21ib2JveC1hcnJvdy13cmFwcGVyXCJcclxuICAgICAgICAgICAoY2xpY2spID0gXCJ0b2dnbGVPcGVuKCRldmVudClcIlxyXG4gICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnRDbGljaygpXCJcclxuICAgICAgICAgICAobW91c2V1cCk9XCJlbmRDbGljaygpXCJcclxuICAgICAgICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhjaS1jb21ib2JveC1hcnJvd1wiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG1hdC1zcGlubmVyIG1hdFN1ZmZpeCAqbmdJZj1cInNob3dMb2FkZXIoKVwiIFtkaWFtZXRlcl09XCIzMFwiIHN0eWxlPVwiZmxvYXQ6IHJpZ2h0OyBtYXJnaW4tbGVmdDogOHB4XCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvQWN0aXZlRmlyc3RPcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cInRoaXMuc2VsZWN0T3B0aW9uKCRldmVudC5vcHRpb24udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW5lZCk9XCJ0aGlzLm9uT3BlbmVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2VkKT1cInRoaXMub25DbG9zZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5V2l0aF09XCJ0aGlzLmRpc3BsYXlGblwiPlxyXG4gICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgI3ZpZXdwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJpc09wZW4gPyBudWxsIDogJ25vbmUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGNpLWNvbWJvYm94LXZpZXdwb3J0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT0gXCJjdXN0b21WaWV3cG9ydENsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJvcHRpb25TaXplUHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJudW1PcHRpb25zVG9TaG93ICogb3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5CdWZmZXJQeF09XCJudW1PcHRpb25zVG9TaG93ICogb3B0aW9uU2l6ZVB4ICogMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4QnVmZmVyUHhdPVwibnVtT3B0aW9uc1RvU2hvdyAqIG9wdGlvblNpemVQeCAqIDNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNldXApPVwiZW5kQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cImFsbG93Tm9uZSAmJiBpc09wZW4gJiYgKHRoaXMuZm9yY2VTaG93Tm9uZSB8fCAhdGhpcy5pbm5lckNvbnRyb2wudmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImN1c3RvbU9wdGlvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJvcHRpb25TaXplUHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICBOb25lXHJcbiAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiAqY2RrVmlydHVhbEZvcj1cImxldCBvcHQgb2YgdGhpcy5sb2FkZWRPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY3VzdG9tT3B0aW9uQ2xhc3Nlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGNpLWNvbWJvYm94LXNlbGVjdGVkXT1cIih2YWx1ZUZpZWxkID8gb3B0W3ZhbHVlRmllbGRdIDogb3B0KSA9PT0gb3V0ZXJDb250cm9sLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tYXQtc2VsZWN0ZWRdPVwiKHZhbHVlRmllbGQgPyBvcHRbdmFsdWVGaWVsZF0gOiBvcHQpID09PSBvdXRlckNvbnRyb2wudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJvcHRpb25TaXplUHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBkaXNwbGF5RmllbGQgPyBvcHRbZGlzcGxheUZpZWxkXSA6IG9wdCB9fVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxyXG4gICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgIDxtYXQtZXJyb3I+XHJcbiAgICAgICAge3sgZ2V0RXJyb3IoKSB9fVxyXG4gICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICBgLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ3VzdG9tQ29tYm9Cb3hDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWUsXHJcbiAgfV0sXHJcbiAgaG9zdDoge1xyXG4gICAgY2xhc3M6IFwiaGNpLWNvbWJvYm94LWNvbnRhaW5lclwiXHJcbiAgfSxcclxuICBzdHlsZXM6IFtgXHJcbiAgICAuaGNpLWNvbWJvYm94LWNvbnRhaW5lciB7XHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIH1cclxuXHJcbiAgICAuaGNpLWNvbWJvYm94LWFycm93IHtcclxuICAgICAgd2lkdGg6IDA7XHJcbiAgICAgIGhlaWdodDogMDtcclxuICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDtcclxuICAgICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XHJcbiAgICAgIGJvcmRlci10b3A6IDVweCBzb2xpZDtcclxuICAgICAgbWFyZ2luOiAwIDRweDtcclxuICAgICAgY29sb3I6IHJnYmEoMCwwLDAsLjU0KTtcclxuICAgIH1cclxuXHJcbiAgICAuaGNpLWNvbWJvYm94LWFycm93LXdyYXBwZXIge1xyXG4gICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xyXG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgbWF0LW9wdGlvbiB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6IDAgLjJyZW07XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC12aWV3cG9ydCBtYXQtb3B0aW9uIC5tYXQtb3B0aW9uLXRleHQge1xyXG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgLmhjaS1jb21ib2JveC1zZWxlY3RlZCB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGRkZGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC12aWV3cG9ydCAubWF0LWFjdGl2ZSB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2YzZjM7XHJcbiAgICB9XHJcblxyXG4gICAgLyogZml4IGppdHRlcnkgc2Nyb2xsIGJ1ZyBpbiBjaHJvbWUgKi9cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQge1xyXG4gICAgICBvdmVyZmxvdy1hbmNob3I6IG5vbmU7XHJcbiAgICB9XHJcbiAgYF0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEN1c3RvbUNvbWJvQm94Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBwdWJsaWMgb3B0aW9uU2l6ZVB4OiBudW1iZXIgPSAyNTtcclxuICBwdWJsaWMgbnVtT3B0aW9uc1RvU2hvdzogbnVtYmVyID0gMTA7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIG1heE9wdGlvbnNUb1Nob3c6IG51bWJlciA9IDEwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjdXN0b21WaWV3cG9ydENsYXNzOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgY3VzdG9tRmllbGRDbGFzc2VzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2N1c3RvbUZpZWxkQ2xhc3NlcyA9IHZhbHVlID8gdmFsdWUgOiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXN0b21GaWVsZENsYXNzZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAhIXRoaXMuX2N1c3RvbUZpZWxkQ2xhc3NlcyA/IHRoaXMuX2N1c3RvbUZpZWxkQ2xhc3NlcyA6IFwibWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0XCI7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgY3VzdG9tT3B0aW9uQ2xhc3Nlcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jdXN0b21PcHRpb25DbGFzc2VzID0gdmFsdWUgPyB2YWx1ZSA6IFwiXCI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1c3RvbU9wdGlvbkNsYXNzZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAhIXRoaXMuX2N1c3RvbU9wdGlvbkNsYXNzZXMgPyB0aGlzLl9jdXN0b21PcHRpb25DbGFzc2VzIDogXCJcIjtcclxuICB9XHJcblxyXG4gIC8vIElmIGEgbGFiZWwgaXMgbm90IHNwZWNpZmllZCB0aGUgcGxhY2Vob2xkZXIgaXMgcHJvbW90ZWQgdG8gYSBsYWJlbC5cclxuICAvLyBUbyBjcmVhdGUgYSBmb3JtIGZpZWxkIHdpdGggb25seSBhIHBsYWNlaG9sZGVyLCBzcGVjaWZ5IGFuIGVtcHR5XHJcbiAgLy8gbGFiZWwgdG8gcHJldmVudCB0aGUgcGxhY2Vob2xkZXIgZnJvbSBiZWluZyBwcm9tb3RlZC5cclxuICBASW5wdXQoKSBwdWJsaWMgbGFiZWw6IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIC8vIFJlbW92ZXMgdGhlIHBsYWNlaG9sZGVyIGFmdGVyIGEgc2VsZWN0aW9uIGlzIG1hZGVcclxuICBASW5wdXQoKSBwdWJsaWMgdGVtcG9yYXJ5UGxhY2Vob2xkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIHRvb2x0aXA6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgcHVibGljIGFsbG93Tm9uZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RUZXh0T25PcGVuID0gdHJ1ZTtcclxuXHJcbiAgLy8gdGVsbCBtYXQtZGlhbG9nIHRvIHBhc3MgaW5pdGlhbCBmb2N1cyB0byB0aGUgaW5uZXIgaW5wdXRcclxuICBASG9zdEJpbmRpbmcoXCJhdHRyLmNka0ZvY3VzSW5pdGlhbFwiKSBfY2RrRm9jdXNJbml0aWFsID0gbnVsbDtcclxuICBASW5wdXQoKSBwdWJsaWMgY2RrRm9jdXNJbml0aWFsOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIG9uIHRhYiwgc2tpcCB0aGUgaG9zdCBlbGVtZW50IGFuZCBmb2N1cyB0aGUgaW5wdXRcclxuICBASG9zdEJpbmRpbmcoXCJhdHRyLnRhYmluZGV4XCIpIF90YWJpbmRleCA9IG51bGw7XHJcbiAgQElucHV0KCkgcHVibGljIHRhYmluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICBwdWJsaWMgZm9yY2VTaG93Tm9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogYW55W10gPSBbXTtcclxuICBASW5wdXQoKSBhbGxvd0xvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxvYWRlZE9wdGlvbnM6IGFueVtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyB2YWx1ZUZpZWxkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHJpdmF0ZSBmb3JjZUVtaXRPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBwdWJsaWMgZGlzcGxheUZpZWxkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIGFwcGVhcmFuY2U6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgcHVibGljIGZsb2F0TGFiZWw6IEZsb2F0TGFiZWxUeXBlO1xyXG5cclxuICAvLyBTZXQgdG8gZW1wdHkgdG8gbm90IHNob3cgZXJyb3JzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVmaW5lRXJyb3JzOiBhbnkgPSB7cmVxdWlyZWQ6IFwiVGhpcyBpcyBhIHJlcXVpcmVkIGZpZWxkXCJ9O1xyXG5cclxuICBwcml2YXRlIF9zaG93TG9hZGVyID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY3VzdG9tRmllbGRDbGFzc2VzOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHByaXZhdGUgX2N1c3RvbU9wdGlvbkNsYXNzZXM6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIHB1YmxpYyBvdXRlckNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICBwdWJsaWMgaW5uZXJDb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwpO1xyXG4gIHByaXZhdGUgaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3ViczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIHByaXZhdGUgbm9OZ0NvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2VsZWN0ZWRJbmRleDogbnVtYmVyO1xyXG5cclxuICBrZXlNYW5hZ2VyOiBMaXN0S2V5TWFuYWdlcjxIaWdobGlnaHRhYmxlPjtcclxuICB2aWV3cG9ydFJlbmRlclJhbmdlOiBMaXN0UmFuZ2U7XHJcbiAgdmlld3BvcnRWaXNpYmxlUmFuZ2U6IExpc3RSYW5nZSA9IHtcclxuICAgIHN0YXJ0OiAwLFxyXG4gICAgZW5kOiB0aGlzLm51bU9wdGlvbnNUb1Nob3cgLSAxXHJcbiAgfTtcclxuXHJcbiAgYWN0aXZlVmFsdWU6IGFueTtcclxuXHJcbiAgcHVibGljIGNsaWNrSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgb3B0aW9uU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9wdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9wdGlvbnNMb2FkZWQ6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG5cclxuICBAVmlld0NoaWxkKFwidmlld3BvcnRcIiwge3N0YXRpYzogdHJ1ZX0pXHJcbiAgdmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcclxuXHJcbiAgQFZpZXdDaGlsZChcImlucHV0XCIsIHtzdGF0aWM6IHRydWV9KVxyXG4gIGlucHV0RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgQFZpZXdDaGlsZChcImlucHV0XCIsIHtyZWFkOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyLCBzdGF0aWM6IGZhbHNlfSlcclxuICBhdXRvQ29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xyXG5cclxuICBwcml2YXRlIG9uQ2hhbmdlRm46ICh2YWw6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkRm46ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgcHVibGljIGRpc3BsYXlGbjogKG9wdD86IGFueSkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkID0gKG9wdD86IGFueSkgPT4ge1xyXG4gICAgcmV0dXJuIG9wdCA/ICh0aGlzLmRpc3BsYXlGaWVsZCA/IG9wdFt0aGlzLmRpc3BsYXlGaWVsZF0gOiBvcHQpIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zaG93TG9hZGVyID0gdGhpcy5hbGxvd0xvYWRlciAmJiAoISB0aGlzLm9wdGlvbnMgfHwgdGhpcy5vcHRpb25zLmxlbmd0aCA9PT0gMCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgbmdDb250cm9sOiBOZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwpO1xyXG4gICAgaWYgKG5nQ29udHJvbCAmJiBuZ0NvbnRyb2wuY29udHJvbCkge1xyXG4gICAgICB0aGlzLm91dGVyQ29udHJvbCA9IG5nQ29udHJvbC5jb250cm9sO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMub3V0ZXJDb250cm9sLnZhbGlkYXRvcik7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLm91dGVyQ29udHJvbC5hc3luY1ZhbGlkYXRvcik7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ub05nQ29udHJvbCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdWJzLmFkZCh0aGlzLmlubmVyQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSkuc3Vic2NyaWJlKChfdmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5pc09wZW4gJiYgIXRoaXMuaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlcykge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlcyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcblxyXG4gICAgLy8gd29yayBhcm91bmQgZm9yIHZhbGlkYXRvcnMgbm90IGFsd2F5cyBwcm9wYWdhdGluZ1xyXG4gICAgdGhpcy5zdWJzLmFkZCh0aGlzLm91dGVyQ29udHJvbC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoX2V2ZW50OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLm91dGVyQ29udHJvbC52YWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5vdXRlckNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldEVycm9ycyh0aGlzLm91dGVyQ29udHJvbC5lcnJvcnMpO1xyXG5cclxuICAgICAgaWYgKHRoaXMub3V0ZXJDb250cm9sLnRvdWNoZWQpIHtcclxuICAgICAgICB0aGlzLmlubmVyQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuXHJcbiAgICAvLyB0aGlzIG9iamVjdCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIGFjdGl2ZSBzdGF0ZSB3aGVuIGtleWluZyB1cCBhbmQgZG93blxyXG4gICAgdGhpcy5rZXlNYW5hZ2VyID0gdGhpcy5hdXRvQ29tcGxldGVUcmlnZ2VyLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlcjtcclxuICAgIHRoaXMua2V5TWFuYWdlci53aXRoV3JhcChmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5zdWJzLmFkZChjb21iaW5lTGF0ZXN0KFtcclxuICAgICAgdGhpcy52aWV3cG9ydC5yZW5kZXJlZFJhbmdlU3RyZWFtLFxyXG4gICAgICB0aGlzLnZpZXdwb3J0LnNjcm9sbGVkSW5kZXhDaGFuZ2VcclxuICAgIF0pLnN1YnNjcmliZSgoW3JlbmRlcmVkUmFuZ2UsIHNjcm9sbGVkSW5kZXhdOiBbTGlzdFJhbmdlLCBudW1iZXJdKSA9PiB7XHJcblxyXG4gICAgICAvLyBJbnN0ZWFkIG9mIGxvYWRpbmcgdGhlIHdob2xlIGl0ZW0gbGlzdCBhdCBvbmNlLCB0aGUgdmlydHVhbCBzY3JvbGwgdmlld3BvcnQgYnVmZmVyc1xyXG4gICAgICAvLyBhIHJhbmdlIG9mIGVudHJpZXMsIG9ubHkgYSBwb3J0aW9uIG9mIHdoaWNoIGFyZSB3aXRoaW4gdGhlIHZpc2libGUgZm9sZFxyXG4gICAgICB0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2UgPSByZW5kZXJlZFJhbmdlO1xyXG5cclxuICAgICAgLy8gd2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSB2aXNpYmxlIHJhbmdlIG91cnNlbHZlc1xyXG4gICAgICBsZXQgbGVuOiBudW1iZXIgPSBNYXRoLm1pbih0aGlzLmxvYWRlZE9wdGlvbnMubGVuZ3RoICsgKHRoaXMuYWxsb3dOb25lID8gMSA6IDApLCB0aGlzLm51bU9wdGlvbnNUb1Nob3cgLSAxKTtcclxuXHJcbiAgICAgIHRoaXMudmlld3BvcnRWaXNpYmxlUmFuZ2UgPSB7XHJcbiAgICAgICAgc3RhcnQ6IHNjcm9sbGVkSW5kZXgsXHJcbiAgICAgICAgZW5kOiBzY3JvbGxlZEluZGV4ICsgbGVuXHJcbiAgICAgIH07XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5vcHRpb25zKSB7XHJcbiAgICAgIGxldCBvcHRpb25zQ2hhbmdlOiBTaW1wbGVDaGFuZ2UgPSBjaGFuZ2VzLm9wdGlvbnM7XHJcbiAgICAgIGlmICghb3B0aW9uc0NoYW5nZS5jdXJyZW50VmFsdWUgfHwgb3B0aW9uc0NoYW5nZS5jdXJyZW50VmFsdWUubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIGlmKHRoaXMuaW5uZXJDb250cm9sLnZhbHVlICE9IG51bGwpe1xyXG4gICAgICAgICAgLy9SZXNldCB0aGUgaW5uZXJDb250cm9sIHZhbHVlIG9mIHRoZSBkcm9wZG93biBsaXN0IHRvIGFuIGVtcHR5IGFycmF5IGluIGNhc2Ugb2Ygbm8gcmVzdWx0cyBhcmUgcHJlc2VudCB0byBiZSBkaXNwbGF5ZWQuXHJcbiAgICAgICAgICAvL1RoaXMgZmx1c2hlcyBvdXQgdGhlIHN0YWxlIHZhbHVlIGZyb20gdGhlIGxpc3QgaWYgdGhlcmUgYXJlIG5vIHJlc3VsdHMgdG8gYmUgZGlzcGxheWVkLlxyXG4gICAgICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsdWUoW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGN1cnJlbnRPcHRzOiBhbnlbXSA9IDxhbnlbXT5vcHRpb25zQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgaWYgKGN1cnJlbnRPcHRzICYmIFwibGVuZ3RoXCIgaW4gY3VycmVudE9wdHMgJiYgY3VycmVudE9wdHMgIT09IG9wdGlvbnNDaGFuZ2UucHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3Nob3dMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9wdGlvbnNMb2FkZWQuZW1pdCgpO1xyXG5cclxuICAgICAgICAvLyBJZiBudW1iZXIgb2Ygb3B0aW9ucyBpcyBsZXNzIHRoYW4gb3VyIG1heCwgcmVkdWNlIHNpemUgb2Ygb3ZlcmxheVxyXG4gICAgICAgIHRoaXMubnVtT3B0aW9uc1RvU2hvdyA9IE1hdGgubWluKGN1cnJlbnRPcHRzLmxlbmd0aCArICh0aGlzLmFsbG93Tm9uZSA/IDEgOiAwKSwgdGhpcy5tYXhPcHRpb25zVG9TaG93KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zaG93TG9hZGVyID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvLyBUaGUgYXV0b2NvbXBsZXRlIHdpbGwgYXV0b21hdGljYWxseSBwb3Agb3BlbiBvbmNlIGl0IGhhcyBvcHRpb25zIGZpbHRlcmVkIGludG8gaXQsXHJcbiAgICAgIC8vIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvIG9uIGluaXRpYWwgcGFnZSBsb2FkIG9yIHdoZW4gdGFiYmluZyB0aG91Z2hcclxuICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sb2FkT25seUN1cnJlbnRWYWx1ZSh0aGlzLm91dGVyQ29udHJvbC52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkT25seUN1cnJlbnRWYWx1ZShvYmopO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvcigpOiBzdHJpbmcge1xyXG4gICAgZm9yIChjb25zdCBlcnJvciBpbiB0aGlzLm91dGVyQ29udHJvbC5lcnJvcnMpIHtcclxuICAgICAgaWYgKHRoaXMuZGVmaW5lRXJyb3JzICYmIGVycm9yIGluIHRoaXMuZGVmaW5lRXJyb3JzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmaW5lRXJyb3JzW2Vycm9yXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkT25seUN1cnJlbnRWYWx1ZShjbnRybFZhbDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMubGVuZ3RoIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5ld1ZhbHVlOiBhbnkgPSBudWxsO1xyXG4gICAgaWYgKGNudHJsVmFsICE9PSBudWxsICYmIGNudHJsVmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IGN1cnJlbnRseVNlbGVjdGVkOiBhbnkgPSB0aGlzLm9wdGlvbnMuZmluZCgob3B0OiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgb3B0VmFsdWU6IGFueSA9IHRoaXMudmFsdWVGaWVsZCA/IG9wdFt0aGlzLnZhbHVlRmllbGRdIDogb3B0O1xyXG4gICAgICAgIGlmICh0aGlzLmZvcmNlRW1pdE9iamVjdCkge1xyXG4gICAgICAgICAgbGV0IG91dGVyVmFsdWU6IGFueSA9IGNudHJsVmFsID8gKHRoaXMudmFsdWVGaWVsZCA/IGNudHJsVmFsW3RoaXMudmFsdWVGaWVsZF0gOiBjbnRybFZhbCkgOiBudWxsO1xyXG4gICAgICAgICAgaWYgKG9wdFZhbHVlID09PSBvdXRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gb3B0VmFsdWUgPT09IGNudHJsVmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChjdXJyZW50bHlTZWxlY3RlZCkge1xyXG4gICAgICAgIG5ld1ZhbHVlID0gY3VycmVudGx5U2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcmVmZXIgdG8gY2hlY2sgaWQgaWYgaXQgaGFzIG9uZSAgdnMgc3RyYWlnaHQgYWdhaW5zdCBpdCdzIG9iamVjdCBpZGVudGl0eVxyXG4gICAgaWYgKHRoaXMuaW5uZXJDb250cm9sLnZhbHVlICYmIG5ld1ZhbHVlICE9IG51bGwgJiYgdGhpcy52YWx1ZUZpZWxkKSB7XHJcbiAgICAgIGlmICh0aGlzLmlubmVyQ29udHJvbC52YWx1ZVt0aGlzLnZhbHVlRmllbGRdICE9PSBuZXdWYWx1ZVt0aGlzLnZhbHVlRmllbGRdKSB7XHJcbiAgICAgICAgdGhpcy5pZ25vcmVJbm5lckNvbnRyb2xDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRWYWx1ZShuZXdWYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25TZWxlY3RlZC5lbWl0KG5ld1ZhbHVlW3RoaXMudmFsdWVGaWVsZF0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5uZXJDb250cm9sLnZhbHVlICE9PSBuZXdWYWx1ZSkge1xyXG4gICAgICB0aGlzLmlnbm9yZUlubmVyQ29udHJvbENoYW5nZXMgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRWYWx1ZShuZXdWYWx1ZSk7XHJcbiAgICAgIGxldCBudiA9IG5ld1ZhbHVlID8gKCh0aGlzLnZhbHVlRmllbGQgJiYgIXRoaXMuZm9yY2VFbWl0T2JqZWN0KSA/IG5ld1ZhbHVlW3RoaXMudmFsdWVGaWVsZF0gOiBuZXdWYWx1ZSkgOiBudWxsO1xyXG4gICAgICB0aGlzLm9wdGlvblNlbGVjdGVkLmVtaXQobnYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJPcHRpb25zKHNob3dBbGw6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JjZVNob3dOb25lID0gc2hvd0FsbDtcclxuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy5vcHRpb25zIHx8IHRoaXMub3B0aW9ucy5sZW5ndGggPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2hvd0FsbCB8fCAhdGhpcy5pbm5lckNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgdGhpcy5sb2FkZWRPcHRpb25zID0gWy4uLnRoaXMub3B0aW9uc107XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgc2VhcmNoVmFsdWU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5pbm5lckNvbnRyb2wudmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBzZWFyY2hWYWx1ZSA9IHRoaXMuaW5uZXJDb250cm9sLnZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNwbGF5RmllbGQpIHtcclxuICAgICAgICBzZWFyY2hWYWx1ZSA9IHRoaXMuaW5uZXJDb250cm9sLnZhbHVlW3RoaXMuZGlzcGxheUZpZWxkXS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubG9hZGVkT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdDogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IG9wdERpc3BsYXk6IHN0cmluZyA9ICh0aGlzLmRpc3BsYXlGaWVsZCA/IG9wdFt0aGlzLmRpc3BsYXlGaWVsZF0gOiBvcHQpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIG9wdERpc3BsYXkuaW5jbHVkZXMoc2VhcmNoVmFsdWUpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5mb3JjZVNob3dOb25lID0gdGhpcy5sb2FkZWRPcHRpb25zLmxlbmd0aCA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLmdldE9wdEluZGV4KHRoaXMub3V0ZXJDb250cm9sLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93TG9hZGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsb3dMb2FkZXIgJiYgdGhpcy5fc2hvd0xvYWRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuKCkge1xyXG4gICAgaWYgKHRoaXMuaW5uZXJDb250cm9sLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgYXV0b2NvbXBsZXRlIHdpbGwgb25seSBvcGVuIHdoZW4gb3B0aW9ucyBhcmUgbG9hZGVkXHJcbiAgICB0aGlzLmZpbHRlck9wdGlvbnModHJ1ZSk7XHJcbiAgICB0aGlzLmF1dG9Db21wbGV0ZVRyaWdnZXIub3BlblBhbmVsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKSB7XHJcbiAgICB0aGlzLmF1dG9Db21wbGV0ZVRyaWdnZXIuY2xvc2VQYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uT3BlbmVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JjZVNob3dOb25lID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcblxyXG4gICAgaWYodGhpcy5zZWxlY3RUZXh0T25PcGVuKXtcclxuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZWxlY3QoKTsgLy8gSGlnaGxpZ2h0cyB0ZXh0XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA+IDApIHtcclxuICAgICAgLy8gbWFrZSB0aGUgc2VsZWN0ZWQgb3B0aW9uIGFsc28gdGhlIGFjdGl2ZSBvcHRpb25cclxuICAgICAgdGhpcy5hY3RpdmVWYWx1ZSA9IHRoaXMuZ2V0T3B0VmFsKHRoaXMubG9hZGVkT3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdKTtcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE9wdGlvbigpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsb3NlZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc09wZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAmJiB0aGlzLm91dGVyQ29udHJvbC52YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdE9wdGlvbihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvYWRPbmx5Q3VycmVudFZhbHVlKHRoaXMub3V0ZXJDb250cm9sLnZhbHVlKTtcclxuXHJcbiAgICAvLyByZXNldCB0aGUgb3B0aW9ucyBzbyB0aGUgYXV0b2NvbXBsZXRlIHdvbid0IGF1dG9tYXRpY2FsbHkgb3BlbiBvbiB0aGUgbmV4dCB0YWIgdGhyb3VnaFxyXG4gICAgdGhpcy5sb2FkZWRPcHRpb25zID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRDbGljaygpIHtcclxuICAgIC8vIGNsaWNraW5nIG9uIGNlcnRhaW4gcGFydHMgb2YgdGhlIG1hdC1maWVsZCB3aWxsIFwiZmxpY2tlclwiIHRoZSBmb2N1cywgdHJpZ2dlcmluZ1xyXG4gICAgLy8gZXJyb3IgdmFsaWRhdGlvbiBlYXJseS4gVGhpcyB0cmFja3MgdGhvc2UgaW50ZXJuYWwgY2xpY2tzIHNvIHRoZXkgY2FuIGJlIGlnbm9yZWRcclxuICAgIHRoaXMuY2xpY2tJblByb2dyZXNzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlbmRDbGljaygpIHtcclxuICAgIHRoaXMuY2xpY2tJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZU9wZW4oZXZlbnQ6IE1vdXNlRXZlbnQpOnZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIlRhYlwiIHx8IGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcclxuICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIGNkayBhMTF5IEtleU1hbmFnZXIgaW1wbGVtZW50YXRpb24gaXMgbm90IGNvbXBhdGlibGUgd2l0aFxyXG4gICAgICAvLyB0aGUgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciwgd2hpY2ggY2F1c2VzIHRoZSBEcm9wLWRvd24gbm90IHNjcm9sbCB3aXRoIGtleWJvYXJkXHJcbiAgICAgIC8vIG9uIGxvbmcgb3B0aW9uIGxpc3RzLlxyXG4gICAgICAvL1xyXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xNjU5OFxyXG4gICAgICAvL1xyXG4gICAgICAvLyBUaGlzIHdvcmsgYXJvdW5kIHRha2VzIGNvbnRyb2wgb2YgdGhlIGtleWJvYXJkIGFuZCBtYW51YWxseSBzY3JvbGxzIGFuZCBhY3RpdmF0ZXNcclxuICAgICAgLy8gdGhlIG9wdGlvbnNcclxuICAgICAgLy9cclxuICAgICAgLy8gUmVmZXJlbmNlczpcclxuICAgICAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2Jsb2IvbWFzdGVyL3NyYy9tYXRlcmlhbC9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLXRyaWdnZXIudHNcclxuICAgICAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2Jsb2IvbWFzdGVyL3NyYy9jZGsvYTExeS9rZXktbWFuYWdlci9saXN0LWtleS1tYW5hZ2VyLnRzXHJcbiAgICAgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21hc3Rlci9zcmMvY2RrL2ExMXkva2V5LW1hbmFnZXIvYWN0aXZlZGVzY2VuZGFudC1rZXktbWFuYWdlci50c1xyXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93VXBcIiB8fCBldmVudC5rZXkgPT09IFwiQXJyb3dEb3duXCIpIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0QWN0aXZlSXRlbSgpO1xyXG4gICAgICAgIHRoaXMuc2hpZnRBY3RpdmVJdGVtKGV2ZW50LmtleSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0FjdGl2ZUJvdW5kYXJpZXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gYmVmb3JlIG91ciBrZXlwcmVzcyBiaW5kaW5nIGV2ZW4gdHJpZ2dlcnMsIGFuZ3VsYXIgaGFzIGFscmVhZHkgbW92ZWQgdGhlIGFjdGl2ZSBzZWxlY3Rpb25cclxuICAvLyB1bnN5bmNpbmcgaXQgd2l0aCBvdXIgZGlzcGxheS4gdGhpcyBjb2RlIHJlLWluaXRpYWxpemVzIHRoZSBhY3RpdmUgb3B0aW9uXHJcbiAgaW5pdEFjdGl2ZUl0ZW0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuYWN0aXZlVmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGFjdGl2ZUluZGV4OiBudW1iZXIgPSB0aGlzLmdldEFjdGl2ZUluZGV4KCk7XHJcblxyXG4gICAgICAvLyB0aGlzIGRvZXMgdGhlIGNvbnZlcnNpb24gZnJvbSBhbiBpbmRleCB3aXRoaW4gYWxsIG9wdGlvbnMgZG93biB0byBhIHBvc2l0aW9uIHdpdGhpbiB0aGVcclxuICAgICAgLy8gZGlzcGxheWVkIHJhbmdlLCB3aGljaCBpcyBhbGwgdGhlIGtleW1hbmFnZXIgaXMgYXdhcmUgb2ZcclxuICAgICAgbGV0IHBvc2l0aW9uID0gYWN0aXZlSW5kZXggLSB0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2Uuc3RhcnQ7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHBvc2l0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNoaWZ0QWN0aXZlSXRlbShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGtleSA9PT0gXCJBcnJvd1VwXCIpIHtcclxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xyXG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiQXJyb3dEb3duXCIpIHtcclxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldE5leHRJdGVtQWN0aXZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMua2V5TWFuYWdlci5hY3RpdmVJdGVtKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVmFsdWUgPSB0aGlzLmdldE9wdFZhbCgoPE1hdE9wdGlvbj50aGlzLmtleU1hbmFnZXIuYWN0aXZlSXRlbSkudmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gY2hlY2sgaWYgdGhlIGFjdGl2ZSBvcHRpb24gaW5kZXggaXMgd2l0aGluIHRoZSBkaXNwbGF5ZWQgdmlld3BvcnQgd2luZG93XHJcbiAgLy8gaWYgbm90LCBzY3JvbGwgaXQgaW50byB2aWV3XHJcbiAgY2hlY2tBY3RpdmVCb3VuZGFyaWVzKCk6IHZvaWQge1xyXG4gICAgbGV0IGFjdGl2ZUluZGV4OiBudW1iZXIgPSB0aGlzLmdldEFjdGl2ZUluZGV4KCk7XHJcblxyXG4gICAgaWYgKGFjdGl2ZUluZGV4IDwgdGhpcy52aWV3cG9ydFZpc2libGVSYW5nZS5zdGFydCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnZpZXdwb3J0LnNjcm9sbFRvT2Zmc2V0KGFjdGl2ZUluZGV4ICogdGhpcy5vcHRpb25TaXplUHgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKGFjdGl2ZUluZGV4ID4gdGhpcy52aWV3cG9ydFZpc2libGVSYW5nZS5lbmQpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxUb09mZnNldCgoYWN0aXZlSW5kZXggLSAodGhpcy5udW1PcHRpb25zVG9TaG93IC0gMSkpICogdGhpcy5vcHRpb25TaXplUHgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZUluZGV4KCkge1xyXG4gICAgbGV0IGFjdGl2ZUluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmICh0aGlzLmFjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5hY3RpdmVWYWx1ZSAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgLy8gaWYgd2UgYWRkZWQgYSBub25lIG9wdGlvbiB0aGUgcmV0dXJuZWQgaW5kZXggd291bGQgYmUgb2ZmIGJ5IG9uZVxyXG4gICAgICBsZXQgdmFsSW5kZXggPSB0aGlzLmdldE9wdEluZGV4KHRoaXMuYWN0aXZlVmFsdWUpICsgKHRoaXMuYWxsb3dOb25lICYmICh0aGlzLmZvcmNlU2hvd05vbmUgfHwgIXRoaXMuaW5uZXJDb250cm9sLnZhbHVlKSA/IDEgOiAwKTtcclxuXHJcbiAgICAgIC8vIHRoZSBpbmRleCBzaG91bGQgYmUgd2l0aGluIHRoZSByYW5nZSBvZiBvdXIgZW50aXJlIGJ1ZmZlciwgb3IganVzdCBhbGxvdyBpdCB0byByZXNldFxyXG4gICAgICBpZiAodmFsSW5kZXggPj0gdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlLnN0YXJ0XHJcbiAgICAgICAgJiYgKCF0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2UuZW5kIHx8IHZhbEluZGV4IDw9IHRoaXMudmlld3BvcnRSZW5kZXJSYW5nZS5lbmQpXHJcbiAgICAgICkge1xyXG4gICAgICAgIGFjdGl2ZUluZGV4ID0gdmFsSW5kZXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYWN0aXZlSW5kZXg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1cygpIHtcclxuICAgIGlmICghdGhpcy5pc09wZW4pIHtcclxuICAgICAgLy8gSGlnaGxpZ2h0cyB0ZXh0XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdFRleHRPbk9wZW4pIHtcclxuICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNlbGVjdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1c091dCgpIHtcclxuICAgIC8vIG1hcmsgY29udHJvbCB0b3VjaGVkIGFuZCB0cmlnZ2VyIGVycm9yIHZhbGlkYXRpb25cclxuICAgIGlmICghdGhpcy5jbGlja0luUHJvZ3Jlc3MpIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0T3B0aW9uKG9wdDogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgbmV3VmFsID0gdGhpcy5nZXRPcHRWYWwob3B0LCB0aGlzLmZvcmNlRW1pdE9iamVjdCk7XHJcblxyXG4gICAgaWYgKHRoaXMubm9OZ0NvbnRyb2wpIHtcclxuICAgICAgdGhpcy5vdXRlckNvbnRyb2wuc2V0VmFsdWUobmV3VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uQ2hhbmdlRm4obmV3VmFsKTtcclxuICAgIHRoaXMub3B0aW9uU2VsZWN0ZWQuZW1pdChuZXdWYWwpO1xyXG4gICAgdGhpcy5vcHRpb25DaGFuZ2VkLmVtaXQobmV3VmFsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb1NlbGVjdGVkT3B0aW9uKCk6IHZvaWQge1xyXG4gICAgLy8gc2Nyb2xsIHRvIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uIHdoZW4gd2Ugb3BlbiB0aGUgZHJvcGRvd25cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPiAwKSB7XHJcbiAgICAgIGxldCBvZmZzZXRJbmRleDogbnVtYmVyID0gdGhpcy5zZWxlY3RlZEluZGV4ICsgKHRoaXMuYWxsb3dOb25lID8gMSA6IDApOyAvLyBhZGp1c3QgZm9yIE5vbmUgZW50cnlcclxuICAgICAgb2Zmc2V0SW5kZXggLT0gKHRoaXMubnVtT3B0aW9uc1RvU2hvdyAvIDIpIC0gMTsgLy8gY2FsY3VsYXRlIG1pZGRsZSBvZiB2aWV3cG9ydFxyXG4gICAgICB0aGlzLnZpZXdwb3J0LnNjcm9sbFRvT2Zmc2V0KG9mZnNldEluZGV4ICogdGhpcy5vcHRpb25TaXplUHgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0T3B0VmFsKG9wdDogYW55LCBmb3JjZU9iamVjdDogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcclxuICAgIGlmICh0aGlzLnZhbHVlRmllbGQgJiYgIWZvcmNlT2JqZWN0KSB7XHJcbiAgICAgIGlmIChvcHQgIT09IG51bGwgJiYgb3B0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdCA9PT0gXCJvYmplY3RcIiAmJiB0aGlzLnZhbHVlRmllbGQgaW4gb3B0KSB7XHJcbiAgICAgICAgcmV0dXJuIG9wdFt0aGlzLnZhbHVlRmllbGRdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvcHQ7XHJcbiAgfVxyXG5cclxuICBnZXRPcHRJbmRleChvcHRWYWx1ZTogYW55KTogbnVtYmVyIHtcclxuICAgIC8vIGZpbmQgdGhlIGluZGV4IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvblxyXG4gICAgaWYgKG9wdFZhbHVlICE9PSBudWxsICYmIG9wdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubG9hZGVkT3B0aW9ucy5maW5kSW5kZXgoKG9wdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0VmFsKG9wdGlvbikgPT09IG9wdFZhbHVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vicy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG4iXX0=
610
+ `, providers: [{
611
+ provide: NG_VALUE_ACCESSOR,
612
+ useExisting: forwardRef(() => CustomComboBoxComponent),
613
+ multi: true,
614
+ }], host: {
615
+ class: "hci-combobox-container"
616
+ }, encapsulation: ViewEncapsulation.None, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"] }]
617
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Injector }], propDecorators: { maxOptionsToShow: [{
618
+ type: Input
619
+ }], customViewportClass: [{
620
+ type: Input
621
+ }], customFieldClasses: [{
622
+ type: Input
623
+ }], customOptionClasses: [{
624
+ type: Input
625
+ }], label: [{
626
+ type: Input
627
+ }], placeholder: [{
628
+ type: Input
629
+ }], temporaryPlaceholder: [{
630
+ type: Input
631
+ }], tooltip: [{
632
+ type: Input
633
+ }], allowNone: [{
634
+ type: Input
635
+ }], selectTextOnOpen: [{
636
+ type: Input
637
+ }], _cdkFocusInitial: [{
638
+ type: HostBinding,
639
+ args: ["attr.cdkFocusInitial"]
640
+ }], cdkFocusInitial: [{
641
+ type: Input
642
+ }], _tabindex: [{
643
+ type: HostBinding,
644
+ args: ["attr.tabindex"]
645
+ }], tabindex: [{
646
+ type: Input
647
+ }], options: [{
648
+ type: Input
649
+ }], allowLoader: [{
650
+ type: Input
651
+ }], valueField: [{
652
+ type: Input
653
+ }], forceEmitObject: [{
654
+ type: Input
655
+ }], displayField: [{
656
+ type: Input
657
+ }], appearance: [{
658
+ type: Input
659
+ }], floatLabel: [{
660
+ type: Input
661
+ }], defineErrors: [{
662
+ type: Input
663
+ }], optionSelected: [{
664
+ type: Output
665
+ }], optionChanged: [{
666
+ type: Output
667
+ }], optionsLoaded: [{
668
+ type: Output
669
+ }], viewport: [{
670
+ type: ViewChild,
671
+ args: ["viewport", { static: true }]
672
+ }], inputElement: [{
673
+ type: ViewChild,
674
+ args: ["input", { static: true }]
675
+ }], autoCompleteTrigger: [{
676
+ type: ViewChild,
677
+ args: ["input", { read: MatAutocompleteTrigger, static: false }]
678
+ }] } });
679
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0L3NyYy9zZWxlY3QvY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZILE9BQU8sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUMsNEJBQTRCLElBQUksc0JBQXNCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7Ozs7Ozs7QUF5STdHLE1BQU0sT0FBTyx1QkFBdUI7SUFVbEMsSUFDVyxrQkFBa0IsQ0FBQyxLQUFhO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUM7SUFDL0YsQ0FBQztJQUVELElBQ1csbUJBQW1CLENBQUMsS0FBYTtRQUMxQyxJQUFJLENBQUMs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QUFJLEVBQUM7Z0JBSWxDLG1CQUFtQjtzQkFEbEIsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgZm9yd2FyZFJlZixcclxuICBIb3N0QmluZGluZyxcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2UsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFVudHlwZWRGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IsIE5nQ29udHJvbH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgU3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZX0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7Q2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xyXG5pbXBvcnQge01hdExlZ2FjeUF1dG9jb21wbGV0ZVRyaWdnZXIgYXMgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1hdXRvY29tcGxldGVcIjtcclxuaW1wb3J0IHtMaXN0UmFuZ2V9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuaW1wb3J0IHtMaXN0S2V5TWFuYWdlciwgSGlnaGxpZ2h0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xyXG5pbXBvcnQge01hdExlZ2FjeU9wdGlvbiBhcyBNYXRPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktY29yZVwiO1xyXG5pbXBvcnQge0xlZ2FjeUZsb2F0TGFiZWxUeXBlIGFzIEZsb2F0TGFiZWxUeXBlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWZvcm0tZmllbGRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImhjaS1jb21ib2JveFwiLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cImVuZENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInRoaXMudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY3VzdG9tRmllbGRDbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbCAhPT0gdW5kZWZpbmVkXCI+e3sgbGFiZWwgfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1sYWJlbCAqbmdJZj1cImxhYmVsID09PSB1bmRlZmluZWRcIj5cclxuICAgICAgICB7eyB0ZW1wb3JhcnlQbGFjZWhvbGRlciA/IChpbm5lckNvbnRyb2wudmFsdWUgPyAnJyA6IHBsYWNlaG9sZGVyKSA6IHBsYWNlaG9sZGVyIH19XHJcbiAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgI2lucHV0XHJcbiAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgbmFtZT1cImN1c3RvbUNvbWJvQm94RmlsdGVyXCJcclxuICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ0ZW1wb3JhcnlQbGFjZWhvbGRlciA/IChpbm5lckNvbnRyb2wudmFsdWUgPyAnJyA6IHBsYWNlaG9sZGVyKSA6IHBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXHJcbiAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImlubmVyQ29udHJvbFwiXHJcbiAgICAgICAgICAgICBbYXR0ci5jZGtGb2N1c0luaXRpYWxdPVwiY2RrRm9jdXNJbml0aWFsID09PSB1bmRlZmluZWQgPyBudWxsIDogY2RrRm9jdXNJbml0aWFsXCJcclxuICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXHJcbiAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoKVwiXHJcbiAgICAgICAgICAgICA+XHJcbiAgICAgIDxkaXYgbWF0U3VmZml4XHJcbiAgICAgICAgICAgY2xhc3M9XCJoY2ktY29tYm9ib3gtYXJyb3ctd3JhcHBlclwiXHJcbiAgICAgICAgICAgKGNsaWNrKSA9IFwidG9nZ2xlT3BlbigkZXZlbnQpXCJcclxuICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0Q2xpY2soKVwiXHJcbiAgICAgICAgICAgKG1vdXNldXApPVwiZW5kQ2xpY2soKVwiXHJcbiAgICAgICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoY2ktY29tYm9ib3gtYXJyb3dcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtc3Bpbm5lciBtYXRTdWZmaXggKm5nSWY9XCJzaG93TG9hZGVyKClcIiBbZGlhbWV0ZXJdPVwiMzBcIiBzdHlsZT1cImZsb2F0OiByaWdodDsgbWFyZ2luLWxlZnQ6IDhweFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0FjdGl2ZUZpcnN0T3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJ0aGlzLnNlbGVjdE9wdGlvbigkZXZlbnQub3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuZWQpPVwidGhpcy5vbk9wZW5lZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsb3NlZCk9XCJ0aGlzLm9uQ2xvc2VkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwidGhpcy5kaXNwbGF5Rm5cIj5cclxuICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICN2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiaXNPcGVuID8gbnVsbCA6ICdub25lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhjaS1jb21ib2JveC12aWV3cG9ydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109IFwiY3VzdG9tVmlld3BvcnRDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwibnVtT3B0aW9uc1RvU2hvdyAqIG9wdGlvblNpemVQeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluQnVmZmVyUHhdPVwibnVtT3B0aW9uc1RvU2hvdyAqIG9wdGlvblNpemVQeCAqIDJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heEJ1ZmZlclB4XT1cIm51bU9wdGlvbnNUb1Nob3cgKiBvcHRpb25TaXplUHggKiAzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnRDbGljaygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cImVuZENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJhbGxvd05vbmUgJiYgaXNPcGVuICYmICh0aGlzLmZvcmNlU2hvd05vbmUgfHwgIXRoaXMuaW5uZXJDb250cm9sLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjdXN0b21PcHRpb25DbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgTm9uZVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0IG9mIHRoaXMubG9hZGVkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImN1c3RvbU9wdGlvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhjaS1jb21ib2JveC1zZWxlY3RlZF09XCIodmFsdWVGaWVsZCA/IG9wdFt2YWx1ZUZpZWxkXSA6IG9wdCkgPT09IG91dGVyQ29udHJvbC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWF0LXNlbGVjdGVkXT1cIih2YWx1ZUZpZWxkID8gb3B0W3ZhbHVlRmllbGRdIDogb3B0KSA9PT0gb3V0ZXJDb250cm9sLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZGlzcGxheUZpZWxkID8gb3B0W2Rpc3BsYXlGaWVsZF0gOiBvcHQgfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cclxuICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICA8bWF0LWVycm9yPlxyXG4gICAgICAgIHt7IGdldEVycm9yKCkgfX1cclxuICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgYCxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEN1c3RvbUNvbWJvQm94Q29tcG9uZW50KSxcclxuICAgIG11bHRpOiB0cnVlLFxyXG4gIH1dLFxyXG4gIGhvc3Q6IHtcclxuICAgIGNsYXNzOiBcImhjaS1jb21ib2JveC1jb250YWluZXJcIlxyXG4gIH0sXHJcbiAgc3R5bGVzOiBbYFxyXG4gICAgLmhjaS1jb21ib2JveC1jb250YWluZXIge1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC1hcnJvdyB7XHJcbiAgICAgIHdpZHRoOiAwO1xyXG4gICAgICBoZWlnaHQ6IDA7XHJcbiAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XHJcbiAgICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50O1xyXG4gICAgICBib3JkZXItdG9wOiA1cHggc29saWQ7XHJcbiAgICAgIG1hcmdpbjogMCA0cHg7XHJcbiAgICAgIGNvbG9yOiByZ2JhKDAsMCwwLC41NCk7XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC1hcnJvdy13cmFwcGVyIHtcclxuICAgICAgZGlzcGxheTogdGFibGUtY2VsbDtcclxuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuICAgIH1cclxuXHJcbiAgICAuaGNpLWNvbWJvYm94LXZpZXdwb3J0IG1hdC1vcHRpb24ge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBwYWRkaW5nOiAwIC4ycmVtO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgbWF0LW9wdGlvbiAubWF0LW9wdGlvbi10ZXh0IHtcclxuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIH1cclxuXHJcbiAgICAuaGNpLWNvbWJvYm94LXZpZXdwb3J0IC5oY2ktY29tYm9ib3gtc2VsZWN0ZWQge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgLm1hdC1hY3RpdmUge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIGZpeCBqaXR0ZXJ5IHNjcm9sbCBidWcgaW4gY2hyb21lICovXHJcbiAgICAuaGNpLWNvbWJvYm94LXZpZXdwb3J0IHtcclxuICAgICAgb3ZlcmZsb3ctYW5jaG9yOiBub25lO1xyXG4gICAgfVxyXG4gIGBdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21Db21ib0JveENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgcHVibGljIG9wdGlvblNpemVQeDogbnVtYmVyID0gMjU7XHJcbiAgcHVibGljIG51bU9wdGlvbnNUb1Nob3c6IG51bWJlciA9IDEwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBtYXhPcHRpb25zVG9TaG93OiBudW1iZXIgPSAxMDtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY3VzdG9tVmlld3BvcnRDbGFzczogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGN1c3RvbUZpZWxkQ2xhc3Nlcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jdXN0b21GaWVsZENsYXNzZXMgPSB2YWx1ZSA/IHZhbHVlIDogXCJcIjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VzdG9tRmllbGRDbGFzc2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gISF0aGlzLl9jdXN0b21GaWVsZENsYXNzZXMgPyB0aGlzLl9jdXN0b21GaWVsZENsYXNzZXMgOiBcIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFwiO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGN1c3RvbU9wdGlvbkNsYXNzZXModmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fY3VzdG9tT3B0aW9uQ2xhc3NlcyA9IHZhbHVlID8gdmFsdWUgOiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXN0b21PcHRpb25DbGFzc2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gISF0aGlzLl9jdXN0b21PcHRpb25DbGFzc2VzID8gdGhpcy5fY3VzdG9tT3B0aW9uQ2xhc3NlcyA6IFwiXCI7XHJcbiAgfVxyXG5cclxuICAvLyBJZiBhIGxhYmVsIGlzIG5vdCBzcGVjaWZpZWQgdGhlIHBsYWNlaG9sZGVyIGlzIHByb21vdGVkIHRvIGEgbGFiZWwuXHJcbiAgLy8gVG8gY3JlYXRlIGEgZm9ybSBmaWVsZCB3aXRoIG9ubHkgYSBwbGFjZWhvbGRlciwgc3BlY2lmeSBhbiBlbXB0eVxyXG4gIC8vIGxhYmVsIHRvIHByZXZlbnQgdGhlIHBsYWNlaG9sZGVyIGZyb20gYmVpbmcgcHJvbW90ZWQuXHJcbiAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAvLyBSZW1vdmVzIHRoZSBwbGFjZWhvbGRlciBhZnRlciBhIHNlbGVjdGlvbiBpcyBtYWRlXHJcbiAgQElucHV0KCkgcHVibGljIHRlbXBvcmFyeVBsYWNlaG9sZGVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyB0b29sdGlwOiBzdHJpbmcgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhbGxvd05vbmU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0VGV4dE9uT3BlbiA9IHRydWU7XHJcblxyXG4gIC8vIHRlbGwgbWF0LWRpYWxvZyB0byBwYXNzIGluaXRpYWwgZm9jdXMgdG8gdGhlIGlubmVyIGlucHV0XHJcbiAgQEhvc3RCaW5kaW5nKFwiYXR0ci5jZGtGb2N1c0luaXRpYWxcIikgX2Nka0ZvY3VzSW5pdGlhbCA9IG51bGw7XHJcbiAgQElucHV0KCkgcHVibGljIGNka0ZvY3VzSW5pdGlhbDogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAvLyBvbiB0YWIsIHNraXAgdGhlIGhvc3QgZWxlbWVudCBhbmQgZm9jdXMgdGhlIGlucHV0XHJcbiAgQEhvc3RCaW5kaW5nKFwiYXR0ci50YWJpbmRleFwiKSBfdGFiaW5kZXggPSBudWxsO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJpbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgcHVibGljIGZvcmNlU2hvd05vbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIG9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgYWxsb3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBsb2FkZWRPcHRpb25zOiBhbnlbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgdmFsdWVGaWVsZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHByaXZhdGUgZm9yY2VFbWl0T2JqZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHVibGljIGRpc3BsYXlGaWVsZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhcHBlYXJhbmNlOiBzdHJpbmcgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmbG9hdExhYmVsOiBGbG9hdExhYmVsVHlwZTtcclxuXHJcbiAgLy8gU2V0IHRvIGVtcHR5IHRvIG5vdCBzaG93IGVycm9yc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlZmluZUVycm9yczogYW55ID0ge3JlcXVpcmVkOiBcIlRoaXMgaXMgYSByZXF1aXJlZCBmaWVsZFwifTtcclxuXHJcbiAgcHJpdmF0ZSBfc2hvd0xvYWRlciA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2N1c3RvbUZpZWxkQ2xhc3Nlczogc3RyaW5nID0gXCJcIjtcclxuICBwcml2YXRlIF9jdXN0b21PcHRpb25DbGFzc2VzOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBwdWJsaWMgb3V0ZXJDb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XHJcbiAgcHVibGljIGlubmVyQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbChudWxsKTtcclxuICBwcml2YXRlIGlnbm9yZUlubmVyQ29udHJvbENoYW5nZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHN1YnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBwcml2YXRlIG5vTmdDb250cm9sOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNlbGVjdGVkSW5kZXg6IG51bWJlcjtcclxuXHJcbiAga2V5TWFuYWdlcjogTGlzdEtleU1hbmFnZXI8SGlnaGxpZ2h0YWJsZT47XHJcbiAgdmlld3BvcnRSZW5kZXJSYW5nZTogTGlzdFJhbmdlO1xyXG4gIHZpZXdwb3J0VmlzaWJsZVJhbmdlOiBMaXN0UmFuZ2UgPSB7XHJcbiAgICBzdGFydDogMCxcclxuICAgIGVuZDogdGhpcy5udW1PcHRpb25zVG9TaG93IC0gMVxyXG4gIH07XHJcblxyXG4gIGFjdGl2ZVZhbHVlOiBhbnk7XHJcblxyXG4gIHB1YmxpYyBjbGlja0luUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIG9wdGlvblNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvcHRpb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvcHRpb25zTG9hZGVkOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZChcInZpZXdwb3J0XCIsIHtzdGF0aWM6IHRydWV9KVxyXG4gIHZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJpbnB1dFwiLCB7c3RhdGljOiB0cnVlfSlcclxuICBpbnB1dEVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJpbnB1dFwiLCB7cmVhZDogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciwgc3RhdGljOiBmYWxzZX0pXHJcbiAgYXV0b0NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcclxuXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZUZuOiAodmFsOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuICBwcml2YXRlIG9uVG91Y2hlZEZuOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIHB1YmxpYyBkaXNwbGF5Rm46IChvcHQ/OiBhbnkpID0+IHN0cmluZyB8IHVuZGVmaW5lZCA9IChvcHQ/OiBhbnkpID0+IHtcclxuICAgIHJldHVybiBvcHQgPyAodGhpcy5kaXNwbGF5RmllbGQgPyBvcHRbdGhpcy5kaXNwbGF5RmllbGRdIDogb3B0KSA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2hvd0xvYWRlciA9IHRoaXMuYWxsb3dMb2FkZXIgJiYgKCEgdGhpcy5vcHRpb25zIHx8IHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDApO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IG5nQ29udHJvbDogTmdDb250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sLCBudWxsKTtcclxuICAgIGlmIChuZ0NvbnRyb2wgJiYgbmdDb250cm9sLmNvbnRyb2wpIHtcclxuICAgICAgdGhpcy5vdXRlckNvbnRyb2wgPSBuZ0NvbnRyb2wuY29udHJvbDtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLm91dGVyQ29udHJvbC52YWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5vdXRlckNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubm9OZ0NvbnRyb2wgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3Vicy5hZGQodGhpcy5pbm5lckNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpLnN1YnNjcmliZSgoX3ZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHRoaXMuaXNPcGVuICYmICF0aGlzLmlnbm9yZUlubmVyQ29udHJvbENoYW5nZXMpIHtcclxuICAgICAgICB0aGlzLmZpbHRlck9wdGlvbnMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlnbm9yZUlubmVyQ29udHJvbENoYW5nZXMgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG5cclxuICAgIC8vIHdvcmsgYXJvdW5kIGZvciB2YWxpZGF0b3JzIG5vdCBhbHdheXMgcHJvcGFnYXRpbmdcclxuICAgIHRoaXMuc3Vicy5hZGQodGhpcy5vdXRlckNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKF9ldmVudDogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldFZhbGlkYXRvcnModGhpcy5vdXRlckNvbnRyb2wudmFsaWRhdG9yKTtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKHRoaXMub3V0ZXJDb250cm9sLmFzeW5jVmFsaWRhdG9yKTtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRFcnJvcnModGhpcy5vdXRlckNvbnRyb2wuZXJyb3JzKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm91dGVyQ29udHJvbC50b3VjaGVkKSB7XHJcbiAgICAgICAgdGhpcy5pbm5lckNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcblxyXG4gICAgLy8gdGhpcyBvYmplY3QgaXMgdXNlZCB0byBjb250cm9sIHRoZSBhY3RpdmUgc3RhdGUgd2hlbiBrZXlpbmcgdXAgYW5kIGRvd25cclxuICAgIHRoaXMua2V5TWFuYWdlciA9IHRoaXMuYXV0b0NvbXBsZXRlVHJpZ2dlci5hdXRvY29tcGxldGUuX2tleU1hbmFnZXI7XHJcbiAgICB0aGlzLmtleU1hbmFnZXIud2l0aFdyYXAoZmFsc2UpO1xyXG5cclxuICAgIHRoaXMuc3Vicy5hZGQoY29tYmluZUxhdGVzdChbXHJcbiAgICAgIHRoaXMudmlld3BvcnQucmVuZGVyZWRSYW5nZVN0cmVhbSxcclxuICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxlZEluZGV4Q2hhbmdlXHJcbiAgICBdKS5zdWJzY3JpYmUoKFtyZW5kZXJlZFJhbmdlLCBzY3JvbGxlZEluZGV4XTogW0xpc3RSYW5nZSwgbnVtYmVyXSkgPT4ge1xyXG5cclxuICAgICAgLy8gSW5zdGVhZCBvZiBsb2FkaW5nIHRoZSB3aG9sZSBpdGVtIGxpc3QgYXQgb25jZSwgdGhlIHZpcnR1YWwgc2Nyb2xsIHZpZXdwb3J0IGJ1ZmZlcnNcclxuICAgICAgLy8gYSByYW5nZSBvZiBlbnRyaWVzLCBvbmx5IGEgcG9ydGlvbiBvZiB3aGljaCBhcmUgd2l0aGluIHRoZSB2aXNpYmxlIGZvbGRcclxuICAgICAgdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlID0gcmVuZGVyZWRSYW5nZTtcclxuXHJcbiAgICAgIC8vIHdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgdmlzaWJsZSByYW5nZSBvdXJzZWx2ZXNcclxuICAgICAgbGV0IGxlbjogbnVtYmVyID0gTWF0aC5taW4odGhpcy5sb2FkZWRPcHRpb25zLmxlbmd0aCArICh0aGlzLmFsbG93Tm9uZSA/IDEgOiAwKSwgdGhpcy5udW1PcHRpb25zVG9TaG93IC0gMSk7XHJcblxyXG4gICAgICB0aGlzLnZpZXdwb3J0VmlzaWJsZVJhbmdlID0ge1xyXG4gICAgICAgIHN0YXJ0OiBzY3JvbGxlZEluZGV4LFxyXG4gICAgICAgIGVuZDogc2Nyb2xsZWRJbmRleCArIGxlblxyXG4gICAgICB9O1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMub3B0aW9ucykge1xyXG4gICAgICBsZXQgb3B0aW9uc0NoYW5nZTogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy5vcHRpb25zO1xyXG4gICAgICBpZiAoIW9wdGlvbnNDaGFuZ2UuY3VycmVudFZhbHVlIHx8IG9wdGlvbnNDaGFuZ2UuY3VycmVudFZhbHVlLmxlbmd0aCA8IDEpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcclxuICAgICAgICBpZih0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAhPSBudWxsKXtcclxuICAgICAgICAgIC8vUmVzZXQgdGhlIGlubmVyQ29udHJvbCB2YWx1ZSBvZiB0aGUgZHJvcGRvd24gbGlzdCB0byBhbiBlbXB0eSBhcnJheSBpbiBjYXNlIG9mIG5vIHJlc3VsdHMgYXJlIHByZXNlbnQgdG8gYmUgZGlzcGxheWVkLlxyXG4gICAgICAgICAgLy9UaGlzIGZsdXNoZXMgb3V0IHRoZSBzdGFsZSB2YWx1ZSBmcm9tIHRoZSBsaXN0IGlmIHRoZXJlIGFyZSBubyByZXN1bHRzIHRvIGJlIGRpc3BsYXllZC5cclxuICAgICAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldFZhbHVlKFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjdXJyZW50T3B0czogYW55W10gPSA8YW55W10+b3B0aW9uc0NoYW5nZS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIGlmIChjdXJyZW50T3B0cyAmJiBcImxlbmd0aFwiIGluIGN1cnJlbnRPcHRzICYmIGN1cnJlbnRPcHRzICE9PSBvcHRpb25zQ2hhbmdlLnByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9zaG93TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zTG9hZGVkLmVtaXQoKTtcclxuXHJcbiAgICAgICAgLy8gSWYgbnVtYmVyIG9mIG9wdGlvbnMgaXMgbGVzcyB0aGFuIG91ciBtYXgsIHJlZHVjZSBzaXplIG9mIG92ZXJsYXlcclxuICAgICAgICB0aGlzLm51bU9wdGlvbnNUb1Nob3cgPSBNYXRoLm1pbihjdXJyZW50T3B0cy5sZW5ndGggKyAodGhpcy5hbGxvd05vbmUgPyAxIDogMCksIHRoaXMubWF4T3B0aW9uc1RvU2hvdyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc2hvd0xvYWRlciA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gVGhlIGF1dG9jb21wbGV0ZSB3aWxsIGF1dG9tYXRpY2FsbHkgcG9wIG9wZW4gb25jZSBpdCBoYXMgb3B0aW9ucyBmaWx0ZXJlZCBpbnRvIGl0LFxyXG4gICAgICAvLyBidXQgd2UgZG9uJ3Qgd2FudCBpdCB0byBvbiBpbml0aWFsIHBhZ2UgbG9hZCBvciB3aGVuIHRhYmJpbmcgdGhvdWdoXHJcbiAgICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9hZE9ubHlDdXJyZW50VmFsdWUodGhpcy5vdXRlckNvbnRyb2wudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZE9ubHlDdXJyZW50VmFsdWUob2JqKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZUZuID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZEZuID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChpc0Rpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLmRpc2FibGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLmVuYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RXJyb3IoKTogc3RyaW5nIHtcclxuICAgIGZvciAoY29uc3QgZXJyb3IgaW4gdGhpcy5vdXRlckNvbnRyb2wuZXJyb3JzKSB7XHJcbiAgICAgIGlmICh0aGlzLmRlZmluZUVycm9ycyAmJiBlcnJvciBpbiB0aGlzLmRlZmluZUVycm9ycykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmluZUVycm9yc1tlcnJvcl07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZE9ubHlDdXJyZW50VmFsdWUoY250cmxWYWw6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMgfHwgdGhpcy5vcHRpb25zLmxlbmd0aCA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBuZXdWYWx1ZTogYW55ID0gbnVsbDtcclxuICAgIGlmIChjbnRybFZhbCAhPT0gbnVsbCAmJiBjbnRybFZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCBjdXJyZW50bHlTZWxlY3RlZDogYW55ID0gdGhpcy5vcHRpb25zLmZpbmQoKG9wdDogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IG9wdFZhbHVlOiBhbnkgPSB0aGlzLnZhbHVlRmllbGQgPyBvcHRbdGhpcy52YWx1ZUZpZWxkXSA6IG9wdDtcclxuICAgICAgICBpZiAodGhpcy5mb3JjZUVtaXRPYmplY3QpIHtcclxuICAgICAgICAgIGxldCBvdXRlclZhbHVlOiBhbnkgPSBjbnRybFZhbCA/ICh0aGlzLnZhbHVlRmllbGQgPyBjbnRybFZhbFt0aGlzLnZhbHVlRmllbGRdIDogY250cmxWYWwpIDogbnVsbDtcclxuICAgICAgICAgIGlmIChvcHRWYWx1ZSA9PT0gb3V0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG9wdFZhbHVlID09PSBjbnRybFZhbDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoY3VycmVudGx5U2VsZWN0ZWQpIHtcclxuICAgICAgICBuZXdWYWx1ZSA9IGN1cnJlbnRseVNlbGVjdGVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJlZmVyIHRvIGNoZWNrIGlkIGlmIGl0IGhhcyBvbmUgIHZzIHN0cmFpZ2h0IGFnYWluc3QgaXQncyBvYmplY3QgaWRlbnRpdHlcclxuICAgIGlmICh0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAmJiBuZXdWYWx1ZSAhPSBudWxsICYmIHRoaXMudmFsdWVGaWVsZCkge1xyXG4gICAgICBpZiAodGhpcy5pbm5lckNvbnRyb2wudmFsdWVbdGhpcy52YWx1ZUZpZWxkXSAhPT0gbmV3VmFsdWVbdGhpcy52YWx1ZUZpZWxkXSkge1xyXG4gICAgICAgIHRoaXMuaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsdWUobmV3VmFsdWUpO1xyXG4gICAgICAgIHRoaXMub3B0aW9uU2VsZWN0ZWQuZW1pdChuZXdWYWx1ZVt0aGlzLnZhbHVlRmllbGRdKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcclxuICAgICAgdGhpcy5pZ25vcmVJbm5lckNvbnRyb2xDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsdWUobmV3VmFsdWUpO1xyXG4gICAgICBsZXQgbnYgPSBuZXdWYWx1ZSA/ICgodGhpcy52YWx1ZUZpZWxkICYmICF0aGlzLmZvcmNlRW1pdE9iamVjdCkgPyBuZXdWYWx1ZVt0aGlzLnZhbHVlRmllbGRdIDogbmV3VmFsdWUpIDogbnVsbDtcclxuICAgICAgdGhpcy5vcHRpb25TZWxlY3RlZC5lbWl0KG52KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyT3B0aW9ucyhzaG93QWxsOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9yY2VTaG93Tm9uZSA9IHNob3dBbGw7XHJcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMubGVuZ3RoIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNob3dBbGwgfHwgIXRoaXMuaW5uZXJDb250cm9sLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMubG9hZGVkT3B0aW9ucyA9IFsuLi50aGlzLm9wdGlvbnNdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHNlYXJjaFZhbHVlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuaW5uZXJDb250cm9sLnZhbHVlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgc2VhcmNoVmFsdWUgPSB0aGlzLmlubmVyQ29udHJvbC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGlzcGxheUZpZWxkKSB7XHJcbiAgICAgICAgc2VhcmNoVmFsdWUgPSB0aGlzLmlubmVyQ29udHJvbC52YWx1ZVt0aGlzLmRpc3BsYXlGaWVsZF0udG9Mb3dlckNhc2UoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxvYWRlZE9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBvcHREaXNwbGF5OiBzdHJpbmcgPSAodGhpcy5kaXNwbGF5RmllbGQgPyBvcHRbdGhpcy5kaXNwbGF5RmllbGRdIDogb3B0KS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHJldHVybiBvcHREaXNwbGF5LmluY2x1ZGVzKHNlYXJjaFZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZm9yY2VTaG93Tm9uZSA9IHRoaXMubG9hZGVkT3B0aW9ucy5sZW5ndGggPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5nZXRPcHRJbmRleCh0aGlzLm91dGVyQ29udHJvbC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd0xvYWRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFsbG93TG9hZGVyICYmIHRoaXMuX3Nob3dMb2FkZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3BlbigpIHtcclxuICAgIGlmICh0aGlzLmlubmVyQ29udHJvbC5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlIGF1dG9jb21wbGV0ZSB3aWxsIG9ubHkgb3BlbiB3aGVuIG9wdGlvbnMgYXJlIGxvYWRlZFxyXG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKHRydWUpO1xyXG4gICAgdGhpcy5hdXRvQ29tcGxldGVUcmlnZ2VyLm9wZW5QYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlKCkge1xyXG4gICAgdGhpcy5hdXRvQ29tcGxldGVUcmlnZ2VyLmNsb3NlUGFuZWwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk9wZW5lZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9yY2VTaG93Tm9uZSA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xyXG5cclxuICAgIGlmKHRoaXMuc2VsZWN0VGV4dE9uT3Blbil7XHJcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7IC8vIEhpZ2hsaWdodHMgdGV4dFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPiAwKSB7XHJcbiAgICAgIC8vIG1ha2UgdGhlIHNlbGVjdGVkIG9wdGlvbiBhbHNvIHRoZSBhY3RpdmUgb3B0aW9uXHJcbiAgICAgIHRoaXMuYWN0aXZlVmFsdWUgPSB0aGlzLmdldE9wdFZhbCh0aGlzLmxvYWRlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XSk7XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWRPcHRpb24oKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbG9zZWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghdGhpcy5pbm5lckNvbnRyb2wudmFsdWUgJiYgdGhpcy5vdXRlckNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RPcHRpb24obnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkT25seUN1cnJlbnRWYWx1ZSh0aGlzLm91dGVyQ29udHJvbC52YWx1ZSk7XHJcblxyXG4gICAgLy8gcmVzZXQgdGhlIG9wdGlvbnMgc28gdGhlIGF1dG9jb21wbGV0ZSB3b24ndCBhdXRvbWF0aWNhbGx5IG9wZW4gb24gdGhlIG5leHQgdGFiIHRocm91Z2hcclxuICAgIHRoaXMubG9hZGVkT3B0aW9ucyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0Q2xpY2soKSB7XHJcbiAgICAvLyBjbGlja2luZyBvbiBjZXJ0YWluIHBhcnRzIG9mIHRoZSBtYXQtZmllbGQgd2lsbCBcImZsaWNrZXJcIiB0aGUgZm9jdXMsIHRyaWdnZXJpbmdcclxuICAgIC8vIGVycm9yIHZhbGlkYXRpb24gZWFybHkuIFRoaXMgdHJhY2tzIHRob3NlIGludGVybmFsIGNsaWNrcyBzbyB0aGV5IGNhbiBiZSBpZ25vcmVkXHJcbiAgICB0aGlzLmNsaWNrSW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW5kQ2xpY2soKSB7XHJcbiAgICB0aGlzLmNsaWNrSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKCF0aGlzLmlzT3Blbikge1xyXG4gICAgICB0aGlzLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVPcGVuKGV2ZW50OiBNb3VzZUV2ZW50KTp2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIiB8fCBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRoZXJlIGlzIGEgYnVnIHdoZXJlIHRoZSBjZGsgYTExeSBLZXlNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGlzIG5vdCBjb21wYXRpYmxlIHdpdGhcclxuICAgICAgLy8gdGhlIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIsIHdoaWNoIGNhdXNlcyB0aGUgRHJvcC1kb3duIG5vdCBzY3JvbGwgd2l0aCBrZXlib2FyZFxyXG4gICAgICAvLyBvbiBsb25nIG9wdGlvbiBsaXN0cy5cclxuICAgICAgLy9cclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTY1OThcclxuICAgICAgLy9cclxuICAgICAgLy8gVGhpcyB3b3JrIGFyb3VuZCB0YWtlcyBjb250cm9sIG9mIHRoZSBrZXlib2FyZCBhbmQgbWFudWFsbHkgc2Nyb2xscyBhbmQgYWN0aXZhdGVzXHJcbiAgICAgIC8vIHRoZSBvcHRpb25zXHJcbiAgICAgIC8vXHJcbiAgICAgIC8vIFJlZmVyZW5jZXM6XHJcbiAgICAgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21hc3Rlci9zcmMvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS10cmlnZ2VyLnRzXHJcbiAgICAgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21hc3Rlci9zcmMvY2RrL2ExMXkva2V5LW1hbmFnZXIvbGlzdC1rZXktbWFuYWdlci50c1xyXG4gICAgICAvLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvYmxvYi9tYXN0ZXIvc3JjL2Nkay9hMTF5L2tleS1tYW5hZ2VyL2FjdGl2ZWRlc2NlbmRhbnQta2V5LW1hbmFnZXIudHNcclxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd1VwXCIgfHwgZXZlbnQua2V5ID09PSBcIkFycm93RG93blwiKSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdEFjdGl2ZUl0ZW0oKTtcclxuICAgICAgICB0aGlzLnNoaWZ0QWN0aXZlSXRlbShldmVudC5rZXkpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tBY3RpdmVCb3VuZGFyaWVzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGJlZm9yZSBvdXIga2V5cHJlc3MgYmluZGluZyBldmVuIHRyaWdnZXJzLCBhbmd1bGFyIGhhcyBhbHJlYWR5IG1vdmVkIHRoZSBhY3RpdmUgc2VsZWN0aW9uXHJcbiAgLy8gdW5zeW5jaW5nIGl0IHdpdGggb3VyIGRpc3BsYXkuIHRoaXMgY29kZSByZS1pbml0aWFsaXplcyB0aGUgYWN0aXZlIG9wdGlvblxyXG4gIGluaXRBY3RpdmVJdGVtKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlVmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmFjdGl2ZVZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBhY3RpdmVJbmRleDogbnVtYmVyID0gdGhpcy5nZXRBY3RpdmVJbmRleCgpO1xyXG5cclxuICAgICAgLy8gdGhpcyBkb2VzIHRoZSBjb252ZXJzaW9uIGZyb20gYW4gaW5kZXggd2l0aGluIGFsbCBvcHRpb25zIGRvd24gdG8gYSBwb3NpdGlvbiB3aXRoaW4gdGhlXHJcbiAgICAgIC8vIGRpc3BsYXllZCByYW5nZSwgd2hpY2ggaXMgYWxsIHRoZSBrZXltYW5hZ2VyIGlzIGF3YXJlIG9mXHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IGFjdGl2ZUluZGV4IC0gdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlLnN0YXJ0O1xyXG4gICAgICB0aGlzLmtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShwb3NpdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaGlmdEFjdGl2ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChrZXkgPT09IFwiQXJyb3dVcFwiKSB7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTtcclxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIkFycm93RG93blwiKSB7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXROZXh0SXRlbUFjdGl2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmtleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVZhbHVlID0gdGhpcy5nZXRPcHRWYWwoKDxNYXRPcHRpb24+dGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pLnZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGNoZWNrIGlmIHRoZSBhY3RpdmUgb3B0aW9uIGluZGV4IGlzIHdpdGhpbiB0aGUgZGlzcGxheWVkIHZpZXdwb3J0IHdpbmRvd1xyXG4gIC8vIGlmIG5vdCwgc2Nyb2xsIGl0IGludG8gdmlld1xyXG4gIGNoZWNrQWN0aXZlQm91bmRhcmllcygpOiB2b2lkIHtcclxuICAgIGxldCBhY3RpdmVJbmRleDogbnVtYmVyID0gdGhpcy5nZXRBY3RpdmVJbmRleCgpO1xyXG5cclxuICAgIGlmIChhY3RpdmVJbmRleCA8IHRoaXMudmlld3BvcnRWaXNpYmxlUmFuZ2Uuc3RhcnQpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxUb09mZnNldChhY3RpdmVJbmRleCAqIHRoaXMub3B0aW9uU2l6ZVB4KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChhY3RpdmVJbmRleCA+IHRoaXMudmlld3BvcnRWaXNpYmxlUmFuZ2UuZW5kKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudmlld3BvcnQuc2Nyb2xsVG9PZmZzZXQoKGFjdGl2ZUluZGV4IC0gKHRoaXMubnVtT3B0aW9uc1RvU2hvdyAtIDEpKSAqIHRoaXMub3B0aW9uU2l6ZVB4KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRBY3RpdmVJbmRleCgpIHtcclxuICAgIGxldCBhY3RpdmVJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5hY3RpdmVWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYWN0aXZlVmFsdWUgIT09IG51bGwpIHtcclxuXHJcbiAgICAgIC8vIGlmIHdlIGFkZGVkIGEgbm9uZSBvcHRpb24gdGhlIHJldHVybmVkIGluZGV4IHdvdWxkIGJlIG9mZiBieSBvbmVcclxuICAgICAgbGV0IHZhbEluZGV4ID0gdGhpcy5nZXRPcHRJbmRleCh0aGlzLmFjdGl2ZVZhbHVlKSArICh0aGlzLmFsbG93Tm9uZSAmJiAodGhpcy5mb3JjZVNob3dOb25lIHx8ICF0aGlzLmlubmVyQ29udHJvbC52YWx1ZSkgPyAxIDogMCk7XHJcblxyXG4gICAgICAvLyB0aGUgaW5kZXggc2hvdWxkIGJlIHdpdGhpbiB0aGUgcmFuZ2Ugb2Ygb3VyIGVudGlyZSBidWZmZXIsIG9yIGp1c3QgYWxsb3cgaXQgdG8gcmVzZXRcclxuICAgICAgaWYgKHZhbEluZGV4ID49IHRoaXMudmlld3BvcnRSZW5kZXJSYW5nZS5zdGFydFxyXG4gICAgICAgICYmICghdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlLmVuZCB8fCB2YWxJbmRleCA8PSB0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2UuZW5kKVxyXG4gICAgICApIHtcclxuICAgICAgICBhY3RpdmVJbmRleCA9IHZhbEluZGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFjdGl2ZUluZGV4O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRm9jdXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIC8vIEhpZ2hsaWdodHMgdGV4dFxyXG4gICAgICBpZiAodGhpcy5zZWxlY3RUZXh0T25PcGVuKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRm9jdXNPdXQoKSB7XHJcbiAgICAvLyBtYXJrIGNvbnRyb2wgdG91Y2hlZCBhbmQgdHJpZ2dlciBlcnJvciB2YWxpZGF0aW9uXHJcbiAgICBpZiAoIXRoaXMuY2xpY2tJblByb2dyZXNzKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgdGhpcy5vblRvdWNoZWRGbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdE9wdGlvbihvcHQ6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IG5ld1ZhbCA9IHRoaXMuZ2V0T3B0VmFsKG9wdCwgdGhpcy5mb3JjZUVtaXRPYmplY3QpO1xyXG5cclxuICAgIGlmICh0aGlzLm5vTmdDb250cm9sKSB7XHJcbiAgICAgIHRoaXMub3V0ZXJDb250cm9sLnNldFZhbHVlKG5ld1ZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vbkNoYW5nZUZuKG5ld1ZhbCk7XHJcbiAgICB0aGlzLm9wdGlvblNlbGVjdGVkLmVtaXQobmV3VmFsKTtcclxuICAgIHRoaXMub3B0aW9uQ2hhbmdlZC5lbWl0KG5ld1ZhbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9TZWxlY3RlZE9wdGlvbigpOiB2b2lkIHtcclxuICAgIC8vIHNjcm9sbCB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbiB3aGVuIHdlIG9wZW4gdGhlIGRyb3Bkb3duXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEluZGV4ID4gMCkge1xyXG4gICAgICBsZXQgb2Zmc2V0SW5kZXg6IG51bWJlciA9IHRoaXMuc2VsZWN0ZWRJbmRleCArICh0aGlzLmFsbG93Tm9uZSA/IDEgOiAwKTsgLy8gYWRqdXN0IGZvciBOb25lIGVudHJ5XHJcbiAgICAgIG9mZnNldEluZGV4IC09ICh0aGlzLm51bU9wdGlvbnNUb1Nob3cgLyAyKSAtIDE7IC8vIGNhbGN1bGF0ZSBtaWRkbGUgb2Ygdmlld3BvcnRcclxuICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxUb09mZnNldChvZmZzZXRJbmRleCAqIHRoaXMub3B0aW9uU2l6ZVB4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE9wdFZhbChvcHQ6IGFueSwgZm9yY2VPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XHJcbiAgICBpZiAodGhpcy52YWx1ZUZpZWxkICYmICFmb3JjZU9iamVjdCkge1xyXG4gICAgICBpZiAob3B0ICE9PSBudWxsICYmIG9wdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHQgPT09IFwib2JqZWN0XCIgJiYgdGhpcy52YWx1ZUZpZWxkIGluIG9wdCkge1xyXG4gICAgICAgIHJldHVybiBvcHRbdGhpcy52YWx1ZUZpZWxkXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3B0O1xyXG4gIH1cclxuXHJcbiAgZ2V0T3B0SW5kZXgob3B0VmFsdWU6IGFueSk6IG51bWJlciB7XHJcbiAgICAvLyBmaW5kIHRoZSBpbmRleCBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb25cclxuICAgIGlmIChvcHRWYWx1ZSAhPT0gbnVsbCAmJiBvcHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRlZE9wdGlvbnMuZmluZEluZGV4KChvcHRpb246IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldE9wdFZhbChvcHRpb24pID09PSBvcHRWYWx1ZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnMudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuIl19