@meshmakers/shared-ui 0.0.0-0 → 2.0.2211-13005

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 (40) hide show
  1. package/README.md +27 -27
  2. package/esm2020/lib/confirmation-dialog/confirmation-dialog.module.mjs +40 -40
  3. package/esm2020/lib/confirmation-dialog/confirmation-window/confirmation-window.component.mjs +65 -65
  4. package/esm2020/lib/confirmation-dialog/services/confirmation.service.mjs +68 -68
  5. package/esm2020/lib/confirmation-dialog/shared/confirmation.mjs +15 -15
  6. package/esm2020/lib/ia-shared-ui/ia-autocomplete-input/ia-autocomplete-input.mjs +263 -263
  7. package/esm2020/lib/ia-shared-ui/ia-entity-select-input/ia-entity-select-input.component.mjs +264 -264
  8. package/esm2020/lib/ia-shared-ui/ia-notification-bar/ia-notification-bar.component.mjs +35 -35
  9. package/esm2020/lib/ia-shared-ui/ia-shared-ui.module.mjs +66 -66
  10. package/esm2020/lib/ia-shared-ui/message-details/message-details.component.mjs +24 -24
  11. package/esm2020/lib/progress-notifier/progress-notifier.module.mjs +44 -44
  12. package/esm2020/lib/progress-notifier/progress-window/progress-window.component.mjs +33 -33
  13. package/esm2020/lib/progress-notifier/services/progress-notifier.service.mjs +58 -58
  14. package/esm2020/lib/progress-notifier/shared/progressValue.mjs +3 -3
  15. package/esm2020/lib/shared/abstractDetailsComponent.mjs +37 -37
  16. package/esm2020/lib/shared/commonValidators.mjs +29 -29
  17. package/esm2020/meshmakers-shared-ui.mjs +4 -4
  18. package/esm2020/public-api.mjs +15 -15
  19. package/fesm2015/meshmakers-shared-ui.mjs +925 -925
  20. package/fesm2015/meshmakers-shared-ui.mjs.map +1 -1
  21. package/fesm2020/meshmakers-shared-ui.mjs +916 -916
  22. package/fesm2020/meshmakers-shared-ui.mjs.map +1 -1
  23. package/index.d.ts +5 -5
  24. package/lib/confirmation-dialog/confirmation-dialog.module.d.ts +13 -13
  25. package/lib/confirmation-dialog/confirmation-window/confirmation-window.component.d.ts +21 -21
  26. package/lib/confirmation-dialog/services/confirmation.service.d.ts +14 -14
  27. package/lib/confirmation-dialog/shared/confirmation.d.ts +20 -20
  28. package/lib/ia-shared-ui/ia-autocomplete-input/ia-autocomplete-input.d.ts +69 -69
  29. package/lib/ia-shared-ui/ia-entity-select-input/ia-entity-select-input.component.d.ts +70 -70
  30. package/lib/ia-shared-ui/ia-notification-bar/ia-notification-bar.component.d.ts +15 -15
  31. package/lib/ia-shared-ui/ia-shared-ui.module.d.ts +19 -19
  32. package/lib/ia-shared-ui/message-details/message-details.component.d.ts +13 -13
  33. package/lib/progress-notifier/progress-notifier.module.d.ts +14 -14
  34. package/lib/progress-notifier/progress-window/progress-window.component.d.ts +23 -23
  35. package/lib/progress-notifier/services/progress-notifier.service.d.ts +17 -17
  36. package/lib/progress-notifier/shared/progressValue.d.ts +4 -4
  37. package/lib/shared/abstractDetailsComponent.d.ts +15 -15
  38. package/lib/shared/commonValidators.d.ts +10 -10
  39. package/package.json +1 -1
  40. package/public-api.d.ts +11 -11
@@ -1,263 +1,263 @@
1
- import { Component, EventEmitter, forwardRef, HostBinding, Input, ViewChild } from '@angular/core';
2
- import { MatFormFieldControl } from "@angular/material/form-field";
3
- import { FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
4
- import { coerceBooleanProperty } from "@angular/cdk/coercion";
5
- import { debounceTime, filter, map, switchMap, tap } from "rxjs/operators";
6
- import { Subject } from "rxjs";
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/cdk/a11y";
9
- import * as i2 from "@angular/common";
10
- import * as i3 from "@angular/material/autocomplete";
11
- import * as i4 from "@angular/material/core";
12
- import * as i5 from "@angular/material/input";
13
- import * as i6 from "@angular/material/progress-spinner";
14
- import * as i7 from "@angular/forms";
15
- export class IaAutocompleteInput {
16
- constructor(elRef, injector, fm) {
17
- this.elRef = elRef;
18
- this.injector = injector;
19
- this.fm = fm;
20
- this.filteredStrings = [];
21
- this.stateChanges = new Subject();
22
- this.id = `ia-autocomplete-${IaAutocompleteInput.nextId++}`;
23
- this.valueChange = new EventEmitter();
24
- this.describedBy = '';
25
- this._disabled = false;
26
- this._required = false;
27
- this._propagateChange = (_) => {
28
- };
29
- this._onTouched = () => {
30
- };
31
- this.searchFormControl = new FormControl();
32
- this.isLoading = false;
33
- this._disabled = false;
34
- this.focused = false;
35
- fm.monitor(elRef.nativeElement, true).subscribe(origin => {
36
- this.focused = !!origin;
37
- this.stateChanges.next();
38
- });
39
- }
40
- get dataSource() {
41
- return this._dataSource;
42
- }
43
- set dataSource(value) {
44
- this._dataSource = value;
45
- }
46
- get disabled() {
47
- return this._disabled;
48
- }
49
- set disabled(dis) {
50
- this._disabled = coerceBooleanProperty(dis);
51
- this._disabled ? this.searchFormControl.disable() : this.searchFormControl.enable();
52
- this.stateChanges.next();
53
- }
54
- get placeholder() {
55
- return this._placeholder;
56
- }
57
- set placeholder(plh) {
58
- this._placeholder = plh;
59
- this.stateChanges.next();
60
- }
61
- get required() {
62
- return this._required;
63
- }
64
- set required(req) {
65
- this._required = coerceBooleanProperty(req);
66
- this.inputField.required = this._required;
67
- this.stateChanges.next();
68
- }
69
- get prefix() {
70
- return this._prefix;
71
- }
72
- set prefix(value) {
73
- if (value !== this._prefix) {
74
- this._prefix = value;
75
- }
76
- }
77
- get value() {
78
- return this._selectedString;
79
- }
80
- set value(value) {
81
- if (value !== this._selectedString) {
82
- this._selectedString = value;
83
- this.searchFormControl.setValue(value);
84
- this.valueChange.emit(value);
85
- this._propagateChange(this._selectedString);
86
- this.stateChanges.next();
87
- }
88
- }
89
- get empty() {
90
- let n = this.searchFormControl.value;
91
- return !!!n;
92
- }
93
- get shouldLabelFloat() {
94
- return this.focused || !this.empty;
95
- }
96
- ngOnInit() {
97
- this.ngControl = this.injector.get(NgControl, null);
98
- if (this.ngControl != null) {
99
- this.ngControl.valueAccessor = this;
100
- }
101
- // If prefix defined, usually this is used for a code scanner.
102
- // The goal is to select the entity in direct way.
103
- if (this._prefix) {
104
- this.searchFormControl
105
- .valueChanges
106
- .pipe(debounceTime(300), filter(value => typeof value === 'string'), filter(value => value.startsWith(this._prefix)), tap(() => this.value = null), tap(() => this.isLoading = true), map(value => this._dataSource.onPreprocessSearchString(value)), switchMap(value => this._dataSource.onFilter(value)))
107
- .subscribe(resultSet => {
108
- if (resultSet.list.length === 1) {
109
- this.value = resultSet[0];
110
- }
111
- else {
112
- this.filteredStrings = resultSet.list;
113
- this.searchFormControl.patchValue(resultSet.searchTerm, { emitEvent: false });
114
- }
115
- this.isLoading = false;
116
- });
117
- }
118
- // This is the search functionality when search by human.
119
- this.searchFormControl
120
- .valueChanges
121
- .pipe(debounceTime(300), tap(value => {
122
- this.filteredStrings = [];
123
- }), filter(value => value != null && value.toString().length >= 1), tap(() => this.isLoading = true), map(value => this._dataSource.onPreprocessSearchString(value)), tap(value => this.value = value), switchMap(value => this._dataSource.onFilter(value)))
124
- .subscribe(resultSet => {
125
- this.filteredStrings = resultSet.list;
126
- this.searchFormControl.patchValue(resultSet.searchTerm, { emitEvent: false });
127
- this.isLoading = false;
128
- });
129
- }
130
- ngOnDestroy() {
131
- this.stateChanges.complete();
132
- this.fm.stopMonitoring(this.elRef.nativeElement);
133
- }
134
- ngDoCheck() {
135
- if (this.ngControl) {
136
- this.errorState = this.ngControl.invalid && this.ngControl.touched;
137
- this.stateChanges.next();
138
- }
139
- }
140
- clear() {
141
- this.filteredStrings = [];
142
- this.searchFormControl.reset(null);
143
- }
144
- focus() {
145
- this.elRef.nativeElement.querySelector('input').focus();
146
- }
147
- onOptionSelected(event) {
148
- this.value = event.option.value;
149
- this.filteredStrings = [];
150
- }
151
- onOptionActivated(event) {
152
- this.activatedValue = event.option?.value;
153
- }
154
- onAutoCompleteClosed() {
155
- if (this.activatedValue) {
156
- this.value = this.activatedValue;
157
- this.activatedValue = null;
158
- }
159
- }
160
- reset() {
161
- this.value = null;
162
- }
163
- onFocusOut() {
164
- if (this.filteredStrings.length === 1) {
165
- this.activatedValue = this.filteredStrings[0];
166
- this.value = this.filteredStrings[0];
167
- }
168
- }
169
- onTouched() {
170
- this._onTouched();
171
- this.stateChanges.next();
172
- }
173
- registerOnChange(fn) {
174
- this._propagateChange = fn;
175
- }
176
- registerOnTouched(fn) {
177
- this.onTouched = fn;
178
- }
179
- writeValue(obj) {
180
- this.clear();
181
- this.value = obj;
182
- }
183
- setDisabledState(isDisabled) {
184
- this.disabled = isDisabled;
185
- }
186
- onContainerClick(event) {
187
- if (event.target.tagName.toLowerCase() != 'input') {
188
- this.focus();
189
- }
190
- }
191
- setDescribedByIds(ids) {
192
- this.describedBy = ids.join(' ');
193
- }
194
- validate(control) {
195
- const selection = control.value;
196
- if (typeof selection === 'string' && selection.length < 1) {
197
- return { incorrect: true };
198
- }
199
- return null;
200
- }
201
- }
202
- IaAutocompleteInput.nextId = 0;
203
- IaAutocompleteInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: IaAutocompleteInput, deps: [{ token: i0.ElementRef }, { token: i0.Injector }, { token: i1.FocusMonitor }], target: i0.ɵɵFactoryTarget.Component });
204
- IaAutocompleteInput.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.2", type: IaAutocompleteInput, selector: "ia-autocomplete", inputs: { dataSource: "dataSource", disabled: "disabled", placeholder: "placeholder", required: "required", prefix: "prefix" }, host: { properties: { "id": "this.id", "attr.aria-describedby": "this.describedBy", "class.floating": "this.shouldLabelFloat" } }, providers: [
205
- {
206
- provide: NG_VALUE_ACCESSOR,
207
- useExisting: forwardRef(() => IaAutocompleteInput),
208
- multi: true
209
- },
210
- {
211
- provide: MatFormFieldControl,
212
- useExisting: IaAutocompleteInput
213
- },
214
- {
215
- provide: NG_VALIDATORS,
216
- useExisting: forwardRef(() => IaAutocompleteInput),
217
- multi: true
218
- }
219
- ], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\" [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder\" matInput>\n<mat-autocomplete #auto=\"matAutocomplete\"\n (closed)=\"onAutoCompleteClosed()\" (optionActivated)=\"onOptionActivated($event)\"\n (optionSelected)=\"onOptionSelected($event)\">\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </mat-option>\n <ng-container *ngIf=\"!isLoading\">\n <mat-option *ngFor=\"let str of filteredStrings\" [value]=\"str\">\n {{str}}\n </mat-option>\n </ng-container>\n</mat-autocomplete>\n", styles: ["span{opacity:0;transition:opacity .2s}:host.floating span{opacity:1}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i3.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
220
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: IaAutocompleteInput, decorators: [{
221
- type: Component,
222
- args: [{ selector: 'ia-autocomplete', host: {
223
- '[id]': 'id',
224
- '[attr.aria-describedby]': 'describedBy'
225
- }, providers: [
226
- {
227
- provide: NG_VALUE_ACCESSOR,
228
- useExisting: forwardRef(() => IaAutocompleteInput),
229
- multi: true
230
- },
231
- {
232
- provide: MatFormFieldControl,
233
- useExisting: IaAutocompleteInput
234
- },
235
- {
236
- provide: NG_VALIDATORS,
237
- useExisting: forwardRef(() => IaAutocompleteInput),
238
- multi: true
239
- }
240
- ], template: "<input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\" [matAutocomplete]=\"auto\"\n [placeholder]=\"placeholder\" matInput>\n<mat-autocomplete #auto=\"matAutocomplete\"\n (closed)=\"onAutoCompleteClosed()\" (optionActivated)=\"onOptionActivated($event)\"\n (optionSelected)=\"onOptionSelected($event)\">\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n </mat-option>\n <ng-container *ngIf=\"!isLoading\">\n <mat-option *ngFor=\"let str of filteredStrings\" [value]=\"str\">\n {{str}}\n </mat-option>\n </ng-container>\n</mat-autocomplete>\n", styles: ["span{opacity:0;transition:opacity .2s}:host.floating span{opacity:1}\n"] }]
241
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Injector }, { type: i1.FocusMonitor }]; }, propDecorators: { id: [{
242
- type: HostBinding
243
- }], inputField: [{
244
- type: ViewChild,
245
- args: ['input']
246
- }], describedBy: [{
247
- type: HostBinding,
248
- args: ['attr.aria-describedby']
249
- }], dataSource: [{
250
- type: Input
251
- }], disabled: [{
252
- type: Input
253
- }], placeholder: [{
254
- type: Input
255
- }], required: [{
256
- type: Input
257
- }], prefix: [{
258
- type: Input
259
- }], shouldLabelFloat: [{
260
- type: HostBinding,
261
- args: ['class.floating']
262
- }] } });
263
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWEtYXV0b2NvbXBsZXRlLWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVzaG1ha2Vycy9zaGFyZWQtdWkvc3JjL2xpYi9pYS1zaGFyZWQtdWkvaWEtYXV0b2NvbXBsZXRlLWlucHV0L2lhLWF1dG9jb21wbGV0ZS1pbnB1dC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lc2htYWtlcnMvc2hhcmVkLXVpL3NyYy9saWIvaWEtc2hhcmVkLXVpL2lhLWF1dG9jb21wbGV0ZS1pbnB1dC9pYS1hdXRvY29tcGxldGUtaW5wdXQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUVYLEtBQUssRUFHTCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUdMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLFNBQVMsRUFHVixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHekUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7O0FBNkI3QixNQUFNLE9BQU8sbUJBQW1CO0lBa0I5QixZQUFtQixLQUFpQixFQUFVLFFBQWtCLEVBQVUsRUFBZ0I7UUFBdkUsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFjO1FBWm5GLG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBSXRCLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNwQixPQUFFLEdBQUcsbUJBQW1CLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDL0UsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUdsQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQTBCdkQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQXlCbEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQXdNbEIscUJBQWdCLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRTtRQUN0QyxDQUFDLENBQUM7UUFFTSxlQUFVLEdBQUcsR0FBRyxFQUFFO1FBQzFCLENBQUMsQ0FBQztRQTFQQSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUlELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQ1csVUFBVSxDQUFDLEtBQTZCO1FBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFJRCxJQUNXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLFFBQVEsQ0FBQyxHQUFHO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBSUQsSUFDVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxXQUFXLENBQUMsR0FBRztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFJRCxJQUNXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLFFBQVEsQ0FBQyxHQUFHO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFJRCxJQUNXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsTUFBTSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztTQUN0QjtJQUNILENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQVcsS0FBSyxDQUFDLEtBQVU7UUFDekIsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNsQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQ1csZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztTQUNyQztRQUVELDhEQUE4RDtRQUM5RCxrREFBa0Q7UUFDbEQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxpQkFBaUI7aUJBQ25CLFlBQVk7aUJBQ1osSUFBSSxDQUNILFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLEVBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQy9DLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUM1QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFDaEMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUM5RCxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUNyRDtpQkFDQSxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBRXJCLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0I7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUN0QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztpQkFDN0U7Z0JBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFFekIsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsaUJBQWlCO2FBQ25CLFlBQVk7YUFDWixJQUFJLENBQ0gsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDUixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQ0YsRUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQzlELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUNoQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQzlELEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEVBQ2hDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3JEO2FBQ0EsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUN0QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN6QixDQUFDLENBQ0YsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDbkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsS0FBbUM7UUFDekQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0saUJBQWlCLENBQUMsS0FBb0M7UUFDM0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztJQUM1QyxDQUFDO0lBRU0sb0JBQW9CO1FBRXpCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUV2QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FFNUI7SUFDSCxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFTSxVQUFVO1FBRWYsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QztJQUNILENBQUM7SUFFTSxTQUFTO1FBRWQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVNLGdCQUFnQixDQUFDLEVBQU87UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0saUJBQWlCLENBQUMsRUFBTztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sVUFBVSxDQUFDLEdBQVE7UUFDeEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLFVBQW1CO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxLQUFpQjtRQUN2QyxJQUFLLEtBQUssQ0FBQyxNQUFrQixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxPQUFPLEVBQUU7WUFDOUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRU0saUJBQWlCLENBQUMsR0FBYTtRQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUF3QjtRQUMvQixNQUFNLFNBQVMsR0FBUSxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3JDLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFhLFNBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25FLE9BQU8sRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O0FBclFjLDBCQUFNLEdBQUcsQ0FBRSxDQUFBO2dIQUhmLG1CQUFtQjtvR0FBbkIsbUJBQW1CLDZTQWpCbkI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztZQUNsRCxLQUFLLEVBQUUsSUFBSTtTQUNaO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFdBQVcsRUFBRSxtQkFBbUI7U0FDakM7UUFDRDtZQUNFLE9BQU8sRUFBRSxhQUFhO1lBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUM7WUFDbEQsS0FBSyxFQUFFLElBQUk7U0FDWjtLQUNGLCtIQ3ZESCw2ckJBY0E7MkZEMkNhLG1CQUFtQjtrQkF6Qi9CLFNBQVM7K0JBQ0UsaUJBQWlCLFFBR3JCO3dCQUNKLE1BQU0sRUFBRSxJQUFJO3dCQUNaLHlCQUF5QixFQUFFLGFBQWE7cUJBQ3pDLGFBQ1U7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxtQkFBbUI7NEJBQzVCLFdBQVcscUJBQXFCO3lCQUNqQzt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO21KQWE4QixFQUFFO3NCQUFoQyxXQUFXO2dCQUdnQixVQUFVO3NCQUFyQyxTQUFTO3VCQUFDLE9BQU87Z0JBQzRCLFdBQVc7c0JBQXhELFdBQVc7dUJBQUMsdUJBQXVCO2dCQXNCekIsVUFBVTtzQkFEcEIsS0FBSztnQkFRSyxRQUFRO3NCQURsQixLQUFLO2dCQWNLLFdBQVc7c0JBRHJCLEtBQUs7Z0JBYUssUUFBUTtzQkFEbEIsS0FBSztnQkFjSyxNQUFNO3NCQURoQixLQUFLO2dCQStCSyxnQkFBZ0I7c0JBRDFCLFdBQVc7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBEb0NoZWNrLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdEZvcm1GaWVsZENvbnRyb2x9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkXCI7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIE5nQ29udHJvbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gXCJAYW5ndWxhci9jZGsvY29lcmNpb25cIjtcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YXB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHtNYXRBdXRvY29tcGxldGVBY3RpdmF0ZWRFdmVudCwgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZVwiO1xuaW1wb3J0IHtNYXRJbnB1dH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2lucHV0XCI7XG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge0ZvY3VzTW9uaXRvcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9hMTF5XCI7XG5pbXBvcnQge0F1dG9Db21wbGV0ZURhdGFTb3VyY2V9IGZyb20gXCJAbWVzaG1ha2Vycy9zaGFyZWQtc2VydmljZXNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWEtYXV0b2NvbXBsZXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2lhLWF1dG9jb21wbGV0ZS1pbnB1dC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaWEtYXV0b2NvbXBsZXRlLWlucHV0LmNzcyddLFxuICBob3N0OiB7XG4gICAgJ1tpZF0nOiAnaWQnLFxuICAgICdbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XSc6ICdkZXNjcmliZWRCeSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJYUF1dG9jb21wbGV0ZUlucHV0KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBNYXRGb3JtRmllbGRDb250cm9sLFxuICAgICAgdXNlRXhpc3Rpbmc6IElhQXV0b2NvbXBsZXRlSW5wdXRcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJYUF1dG9jb21wbGV0ZUlucHV0KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIElhQXV0b2NvbXBsZXRlSW5wdXQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgRG9DaGVjaywgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE1hdEZvcm1GaWVsZENvbnRyb2w8YW55PiwgVmFsaWRhdG9yIHtcblxuXG4gIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG4gIHB1YmxpYyByZWFkb25seSBzZWFyY2hGb3JtQ29udHJvbDogRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBpc0xvYWRpbmc6IGJvb2xlYW47XG4gIHB1YmxpYyBmaWx0ZXJlZFN0cmluZ3M6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbDtcbiAgcHVibGljIGVycm9yU3RhdGU6IGJvb2xlYW47XG4gIHB1YmxpYyBmb2N1c2VkOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgQEhvc3RCaW5kaW5nKCkgcHVibGljIHJlYWRvbmx5IGlkID0gYGlhLWF1dG9jb21wbGV0ZS0ke0lhQXV0b2NvbXBsZXRlSW5wdXQubmV4dElkKyt9YDtcbiAgcHVibGljIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBwcml2YXRlIF9zZWxlY3RlZFN0cmluZzogc3RyaW5nO1xuICBAVmlld0NoaWxkKCdpbnB1dCcpIHByaXZhdGUgaW5wdXRGaWVsZDogTWF0SW5wdXQ7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRlc2NyaWJlZGJ5JykgcHJpdmF0ZSBkZXNjcmliZWRCeSA9ICcnO1xuICBwcml2YXRlIGFjdGl2YXRlZFZhbHVlOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGVsUmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvciwgcHJpdmF0ZSBmbTogRm9jdXNNb25pdG9yKSB7XG5cbiAgICB0aGlzLnNlYXJjaEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgIGZtLm1vbml0b3IoZWxSZWYubmF0aXZlRWxlbWVudCwgdHJ1ZSkuc3Vic2NyaWJlKG9yaWdpbiA9PiB7XG4gICAgICB0aGlzLmZvY3VzZWQgPSAhIW9yaWdpbjtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2RhdGFTb3VyY2U6IEF1dG9Db21wbGV0ZURhdGFTb3VyY2U7XG5cbiAgcHVibGljIGdldCBkYXRhU291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkYXRhU291cmNlKHZhbHVlOiBBdXRvQ29tcGxldGVEYXRhU291cmNlKSB7XG4gICAgdGhpcy5fZGF0YVNvdXJjZSA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQoZGlzKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkoZGlzKTtcbiAgICB0aGlzLl9kaXNhYmxlZCA/IHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wuZGlzYWJsZSgpIDogdGhpcy5zZWFyY2hGb3JtQ29udHJvbC5lbmFibGUoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICB9XG5cbiAgcHVibGljIHNldCBwbGFjZWhvbGRlcihwbGgpIHtcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHBsaDtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1aXJlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICB9XG5cbiAgcHVibGljIHNldCByZXF1aXJlZChyZXEpIHtcbiAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShyZXEpO1xuICAgIHRoaXMuaW5wdXRGaWVsZC5yZXF1aXJlZCA9IHRoaXMuX3JlcXVpcmVkO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ByZWZpeDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgcHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWZpeDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgcHJlZml4KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX3ByZWZpeCkge1xuICAgICAgdGhpcy5fcHJlZml4ID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFN0cmluZztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fc2VsZWN0ZWRTdHJpbmcpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkU3RyaW5nID0gdmFsdWU7XG4gICAgICB0aGlzLnNlYXJjaEZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UodGhpcy5fc2VsZWN0ZWRTdHJpbmcpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZW1wdHkoKSB7XG4gICAgbGV0IG4gPSB0aGlzLnNlYXJjaEZvcm1Db250cm9sLnZhbHVlO1xuICAgIHJldHVybiAhISFuO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mbG9hdGluZycpXG4gIHB1YmxpYyBnZXQgc2hvdWxkTGFiZWxGbG9hdCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwpO1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG5cbiAgICAvLyBJZiBwcmVmaXggZGVmaW5lZCwgdXN1YWxseSB0aGlzIGlzIHVzZWQgZm9yIGEgY29kZSBzY2FubmVyLlxuICAgIC8vIFRoZSBnb2FsIGlzIHRvIHNlbGVjdCB0aGUgZW50aXR5IGluIGRpcmVjdCB3YXkuXG4gICAgaWYgKHRoaXMuX3ByZWZpeCkge1xuICAgICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbFxuICAgICAgICAudmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSxcbiAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gdmFsdWUuc3RhcnRzV2l0aCh0aGlzLl9wcmVmaXgpKSxcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy52YWx1ZSA9IG51bGwpLFxuICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLmlzTG9hZGluZyA9IHRydWUpLFxuICAgICAgICAgIG1hcCh2YWx1ZSA9PiB0aGlzLl9kYXRhU291cmNlLm9uUHJlcHJvY2Vzc1NlYXJjaFN0cmluZyh2YWx1ZSkpLFxuICAgICAgICAgIHN3aXRjaE1hcCh2YWx1ZSA9PiB0aGlzLl9kYXRhU291cmNlLm9uRmlsdGVyKHZhbHVlKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHJlc3VsdFNldCA9PiB7XG5cbiAgICAgICAgICBpZiAocmVzdWx0U2V0Lmxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gcmVzdWx0U2V0WzBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3RyaW5ncyA9IHJlc3VsdFNldC5saXN0O1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbC5wYXRjaFZhbHVlKHJlc3VsdFNldC5zZWFyY2hUZXJtLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyB0aGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgd2hlbiBzZWFyY2ggYnkgaHVtYW4uXG4gICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbFxuICAgICAgLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICB0YXAodmFsdWUgPT4ge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN0cmluZ3MgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID49IDEpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5pc0xvYWRpbmcgPSB0cnVlKSxcbiAgICAgICAgbWFwKHZhbHVlID0+IHRoaXMuX2RhdGFTb3VyY2Uub25QcmVwcm9jZXNzU2VhcmNoU3RyaW5nKHZhbHVlKSksXG4gICAgICAgIHRhcCh2YWx1ZSA9PiB0aGlzLnZhbHVlID0gdmFsdWUpLFxuICAgICAgICBzd2l0Y2hNYXAodmFsdWUgPT4gdGhpcy5fZGF0YVNvdXJjZS5vbkZpbHRlcih2YWx1ZSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdFNldCA9PiB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJlZFN0cmluZ3MgPSByZXN1bHRTZXQubGlzdDtcbiAgICAgICAgICB0aGlzLnNlYXJjaEZvcm1Db250cm9sLnBhdGNoVmFsdWUocmVzdWx0U2V0LnNlYXJjaFRlcm0sIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5mbS5zdG9wTW9uaXRvcmluZyh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgdGhpcy5lcnJvclN0YXRlID0gdGhpcy5uZ0NvbnRyb2wuaW52YWxpZCAmJiB0aGlzLm5nQ29udHJvbC50b3VjaGVkO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLmZpbHRlcmVkU3RyaW5ncyA9IFtdO1xuICAgIHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wucmVzZXQobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXMoKSB7XG4gICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykuZm9jdXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbk9wdGlvblNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KSB7XG4gICAgdGhpcy52YWx1ZSA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcbiAgICB0aGlzLmZpbHRlcmVkU3RyaW5ncyA9IFtdO1xuICB9XG5cbiAgcHVibGljIG9uT3B0aW9uQWN0aXZhdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVBY3RpdmF0ZWRFdmVudCkge1xuICAgIHRoaXMuYWN0aXZhdGVkVmFsdWUgPSBldmVudC5vcHRpb24/LnZhbHVlO1xuICB9XG5cbiAgcHVibGljIG9uQXV0b0NvbXBsZXRlQ2xvc2VkKCkge1xuXG4gICAgaWYgKHRoaXMuYWN0aXZhdGVkVmFsdWUpIHtcblxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuYWN0aXZhdGVkVmFsdWU7XG4gICAgICB0aGlzLmFjdGl2YXRlZFZhbHVlID0gbnVsbDtcblxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzT3V0KCkge1xuXG4gICAgaWYgKHRoaXMuZmlsdGVyZWRTdHJpbmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5hY3RpdmF0ZWRWYWx1ZSA9IHRoaXMuZmlsdGVyZWRTdHJpbmdzWzBdO1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZmlsdGVyZWRTdHJpbmdzWzBdO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblRvdWNoZWQoKSB7XG5cbiAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICB0aGlzLnZhbHVlID0gb2JqO1xuICB9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgcHVibGljIG9uQ29udGFpbmVyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2lucHV0Jykge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXREZXNjcmliZWRCeUlkcyhpZHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5kZXNjcmliZWRCeSA9IGlkcy5qb2luKCcgJyk7XG4gIH1cblxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0aW9uOiBhbnkgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICh0eXBlb2Ygc2VsZWN0aW9uID09PSAnc3RyaW5nJyAmJiAoPHN0cmluZz5zZWxlY3Rpb24pLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybiB7aW5jb3JyZWN0OiB0cnVlfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9wcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7XG4gIH07XG5cbiAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge1xuICB9O1xufVxuIiwiPGlucHV0ICNpbnB1dCAoYmx1cik9XCJvblRvdWNoZWQoKVwiIChmb2N1c291dCk9XCJvbkZvY3VzT3V0KClcIiBbZm9ybUNvbnRyb2xdPVwic2VhcmNoRm9ybUNvbnRyb2xcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIG1hdElucHV0PlxuPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgKGNsb3NlZCk9XCJvbkF1dG9Db21wbGV0ZUNsb3NlZCgpXCIgKG9wdGlvbkFjdGl2YXRlZCk9XCJvbk9wdGlvbkFjdGl2YXRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudClcIj5cbiAgPG1hdC1vcHRpb24gKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImlzLWxvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gIDwvbWF0LW9wdGlvbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cbiAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgc3RyIG9mIGZpbHRlcmVkU3RyaW5nc1wiIFt2YWx1ZV09XCJzdHJcIj5cbiAgICAgIHt7c3RyfX1cbiAgICA8L21hdC1vcHRpb24+XG4gIDwvbmctY29udGFpbmVyPlxuPC9tYXQtYXV0b2NvbXBsZXRlPlxuIl19
1
+ import { Component, EventEmitter, forwardRef, HostBinding, Input, ViewChild } from '@angular/core';
2
+ import { MatFormFieldControl } from "@angular/material/form-field";
3
+ import { FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
4
+ import { coerceBooleanProperty } from "@angular/cdk/coercion";
5
+ import { debounceTime, filter, map, switchMap, tap } from "rxjs/operators";
6
+ import { Subject } from "rxjs";
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/cdk/a11y";
9
+ import * as i2 from "@angular/common";
10
+ import * as i3 from "@angular/material/autocomplete";
11
+ import * as i4 from "@angular/material/core";
12
+ import * as i5 from "@angular/material/input";
13
+ import * as i6 from "@angular/material/progress-spinner";
14
+ import * as i7 from "@angular/forms";
15
+ export class IaAutocompleteInput {
16
+ constructor(elRef, injector, fm) {
17
+ this.elRef = elRef;
18
+ this.injector = injector;
19
+ this.fm = fm;
20
+ this.filteredStrings = [];
21
+ this.stateChanges = new Subject();
22
+ this.id = `ia-autocomplete-${IaAutocompleteInput.nextId++}`;
23
+ this.valueChange = new EventEmitter();
24
+ this.describedBy = '';
25
+ this._disabled = false;
26
+ this._required = false;
27
+ this._propagateChange = (_) => {
28
+ };
29
+ this._onTouched = () => {
30
+ };
31
+ this.searchFormControl = new FormControl();
32
+ this.isLoading = false;
33
+ this._disabled = false;
34
+ this.focused = false;
35
+ fm.monitor(elRef.nativeElement, true).subscribe(origin => {
36
+ this.focused = !!origin;
37
+ this.stateChanges.next();
38
+ });
39
+ }
40
+ get dataSource() {
41
+ return this._dataSource;
42
+ }
43
+ set dataSource(value) {
44
+ this._dataSource = value;
45
+ }
46
+ get disabled() {
47
+ return this._disabled;
48
+ }
49
+ set disabled(dis) {
50
+ this._disabled = coerceBooleanProperty(dis);
51
+ this._disabled ? this.searchFormControl.disable() : this.searchFormControl.enable();
52
+ this.stateChanges.next();
53
+ }
54
+ get placeholder() {
55
+ return this._placeholder;
56
+ }
57
+ set placeholder(plh) {
58
+ this._placeholder = plh;
59
+ this.stateChanges.next();
60
+ }
61
+ get required() {
62
+ return this._required;
63
+ }
64
+ set required(req) {
65
+ this._required = coerceBooleanProperty(req);
66
+ this.inputField.required = this._required;
67
+ this.stateChanges.next();
68
+ }
69
+ get prefix() {
70
+ return this._prefix;
71
+ }
72
+ set prefix(value) {
73
+ if (value !== this._prefix) {
74
+ this._prefix = value;
75
+ }
76
+ }
77
+ get value() {
78
+ return this._selectedString;
79
+ }
80
+ set value(value) {
81
+ if (value !== this._selectedString) {
82
+ this._selectedString = value;
83
+ this.searchFormControl.setValue(value);
84
+ this.valueChange.emit(value);
85
+ this._propagateChange(this._selectedString);
86
+ this.stateChanges.next();
87
+ }
88
+ }
89
+ get empty() {
90
+ let n = this.searchFormControl.value;
91
+ return !!!n;
92
+ }
93
+ get shouldLabelFloat() {
94
+ return this.focused || !this.empty;
95
+ }
96
+ ngOnInit() {
97
+ this.ngControl = this.injector.get(NgControl, null);
98
+ if (this.ngControl != null) {
99
+ this.ngControl.valueAccessor = this;
100
+ }
101
+ // If prefix defined, usually this is used for a code scanner.
102
+ // The goal is to select the entity in direct way.
103
+ if (this._prefix) {
104
+ this.searchFormControl
105
+ .valueChanges
106
+ .pipe(debounceTime(300), filter(value => typeof value === 'string'), filter(value => value.startsWith(this._prefix)), tap(() => this.value = null), tap(() => this.isLoading = true), map(value => this._dataSource.onPreprocessSearchString(value)), switchMap(value => this._dataSource.onFilter(value)))
107
+ .subscribe(resultSet => {
108
+ if (resultSet.list.length === 1) {
109
+ this.value = resultSet[0];
110
+ }
111
+ else {
112
+ this.filteredStrings = resultSet.list;
113
+ this.searchFormControl.patchValue(resultSet.searchTerm, { emitEvent: false });
114
+ }
115
+ this.isLoading = false;
116
+ });
117
+ }
118
+ // This is the search functionality when search by human.
119
+ this.searchFormControl
120
+ .valueChanges
121
+ .pipe(debounceTime(300), tap(value => {
122
+ this.filteredStrings = [];
123
+ }), filter(value => value != null && value.toString().length >= 1), tap(() => this.isLoading = true), map(value => this._dataSource.onPreprocessSearchString(value)), tap(value => this.value = value), switchMap(value => this._dataSource.onFilter(value)))
124
+ .subscribe(resultSet => {
125
+ this.filteredStrings = resultSet.list;
126
+ this.searchFormControl.patchValue(resultSet.searchTerm, { emitEvent: false });
127
+ this.isLoading = false;
128
+ });
129
+ }
130
+ ngOnDestroy() {
131
+ this.stateChanges.complete();
132
+ this.fm.stopMonitoring(this.elRef.nativeElement);
133
+ }
134
+ ngDoCheck() {
135
+ if (this.ngControl) {
136
+ this.errorState = this.ngControl.invalid && this.ngControl.touched;
137
+ this.stateChanges.next();
138
+ }
139
+ }
140
+ clear() {
141
+ this.filteredStrings = [];
142
+ this.searchFormControl.reset(null);
143
+ }
144
+ focus() {
145
+ this.elRef.nativeElement.querySelector('input').focus();
146
+ }
147
+ onOptionSelected(event) {
148
+ this.value = event.option.value;
149
+ this.filteredStrings = [];
150
+ }
151
+ onOptionActivated(event) {
152
+ this.activatedValue = event.option?.value;
153
+ }
154
+ onAutoCompleteClosed() {
155
+ if (this.activatedValue) {
156
+ this.value = this.activatedValue;
157
+ this.activatedValue = null;
158
+ }
159
+ }
160
+ reset() {
161
+ this.value = null;
162
+ }
163
+ onFocusOut() {
164
+ if (this.filteredStrings.length === 1) {
165
+ this.activatedValue = this.filteredStrings[0];
166
+ this.value = this.filteredStrings[0];
167
+ }
168
+ }
169
+ onTouched() {
170
+ this._onTouched();
171
+ this.stateChanges.next();
172
+ }
173
+ registerOnChange(fn) {
174
+ this._propagateChange = fn;
175
+ }
176
+ registerOnTouched(fn) {
177
+ this.onTouched = fn;
178
+ }
179
+ writeValue(obj) {
180
+ this.clear();
181
+ this.value = obj;
182
+ }
183
+ setDisabledState(isDisabled) {
184
+ this.disabled = isDisabled;
185
+ }
186
+ onContainerClick(event) {
187
+ if (event.target.tagName.toLowerCase() != 'input') {
188
+ this.focus();
189
+ }
190
+ }
191
+ setDescribedByIds(ids) {
192
+ this.describedBy = ids.join(' ');
193
+ }
194
+ validate(control) {
195
+ const selection = control.value;
196
+ if (typeof selection === 'string' && selection.length < 1) {
197
+ return { incorrect: true };
198
+ }
199
+ return null;
200
+ }
201
+ }
202
+ IaAutocompleteInput.nextId = 0;
203
+ IaAutocompleteInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: IaAutocompleteInput, deps: [{ token: i0.ElementRef }, { token: i0.Injector }, { token: i1.FocusMonitor }], target: i0.ɵɵFactoryTarget.Component });
204
+ IaAutocompleteInput.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.2", type: IaAutocompleteInput, selector: "ia-autocomplete", inputs: { dataSource: "dataSource", disabled: "disabled", placeholder: "placeholder", required: "required", prefix: "prefix" }, host: { properties: { "id": "this.id", "attr.aria-describedby": "this.describedBy", "class.floating": "this.shouldLabelFloat" } }, providers: [
205
+ {
206
+ provide: NG_VALUE_ACCESSOR,
207
+ useExisting: forwardRef(() => IaAutocompleteInput),
208
+ multi: true
209
+ },
210
+ {
211
+ provide: MatFormFieldControl,
212
+ useExisting: IaAutocompleteInput
213
+ },
214
+ {
215
+ provide: NG_VALIDATORS,
216
+ useExisting: forwardRef(() => IaAutocompleteInput),
217
+ multi: true
218
+ }
219
+ ], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\" [matAutocomplete]=\"auto\"\r\n [placeholder]=\"placeholder\" matInput>\r\n<mat-autocomplete #auto=\"matAutocomplete\"\r\n (closed)=\"onAutoCompleteClosed()\" (optionActivated)=\"onOptionActivated($event)\"\r\n (optionSelected)=\"onOptionSelected($event)\">\r\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\r\n <mat-spinner diameter=\"50\"></mat-spinner>\r\n </mat-option>\r\n <ng-container *ngIf=\"!isLoading\">\r\n <mat-option *ngFor=\"let str of filteredStrings\" [value]=\"str\">\r\n {{str}}\r\n </mat-option>\r\n </ng-container>\r\n</mat-autocomplete>\r\n", styles: ["span{opacity:0;transition:opacity .2s}:host.floating span{opacity:1}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i3.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
220
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: IaAutocompleteInput, decorators: [{
221
+ type: Component,
222
+ args: [{ selector: 'ia-autocomplete', host: {
223
+ '[id]': 'id',
224
+ '[attr.aria-describedby]': 'describedBy'
225
+ }, providers: [
226
+ {
227
+ provide: NG_VALUE_ACCESSOR,
228
+ useExisting: forwardRef(() => IaAutocompleteInput),
229
+ multi: true
230
+ },
231
+ {
232
+ provide: MatFormFieldControl,
233
+ useExisting: IaAutocompleteInput
234
+ },
235
+ {
236
+ provide: NG_VALIDATORS,
237
+ useExisting: forwardRef(() => IaAutocompleteInput),
238
+ multi: true
239
+ }
240
+ ], template: "<input #input (blur)=\"onTouched()\" (focusout)=\"onFocusOut()\" [formControl]=\"searchFormControl\" [matAutocomplete]=\"auto\"\r\n [placeholder]=\"placeholder\" matInput>\r\n<mat-autocomplete #auto=\"matAutocomplete\"\r\n (closed)=\"onAutoCompleteClosed()\" (optionActivated)=\"onOptionActivated($event)\"\r\n (optionSelected)=\"onOptionSelected($event)\">\r\n <mat-option *ngIf=\"isLoading\" class=\"is-loading\">\r\n <mat-spinner diameter=\"50\"></mat-spinner>\r\n </mat-option>\r\n <ng-container *ngIf=\"!isLoading\">\r\n <mat-option *ngFor=\"let str of filteredStrings\" [value]=\"str\">\r\n {{str}}\r\n </mat-option>\r\n </ng-container>\r\n</mat-autocomplete>\r\n", styles: ["span{opacity:0;transition:opacity .2s}:host.floating span{opacity:1}\n"] }]
241
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Injector }, { type: i1.FocusMonitor }]; }, propDecorators: { id: [{
242
+ type: HostBinding
243
+ }], inputField: [{
244
+ type: ViewChild,
245
+ args: ['input']
246
+ }], describedBy: [{
247
+ type: HostBinding,
248
+ args: ['attr.aria-describedby']
249
+ }], dataSource: [{
250
+ type: Input
251
+ }], disabled: [{
252
+ type: Input
253
+ }], placeholder: [{
254
+ type: Input
255
+ }], required: [{
256
+ type: Input
257
+ }], prefix: [{
258
+ type: Input
259
+ }], shouldLabelFloat: [{
260
+ type: HostBinding,
261
+ args: ['class.floating']
262
+ }] } });
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWEtYXV0b2NvbXBsZXRlLWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVzaG1ha2Vycy9zaGFyZWQtdWkvc3JjL2xpYi9pYS1zaGFyZWQtdWkvaWEtYXV0b2NvbXBsZXRlLWlucHV0L2lhLWF1dG9jb21wbGV0ZS1pbnB1dC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lc2htYWtlcnMvc2hhcmVkLXVpL3NyYy9saWIvaWEtc2hhcmVkLXVpL2lhLWF1dG9jb21wbGV0ZS1pbnB1dC9pYS1hdXRvY29tcGxldGUtaW5wdXQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUVYLEtBQUssRUFHTCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUdMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLFNBQVMsRUFHVixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHekUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7O0FBNkI3QixNQUFNLE9BQU8sbUJBQW1CO0lBa0I5QixZQUFtQixLQUFpQixFQUFVLFFBQWtCLEVBQVUsRUFBZ0I7UUFBdkUsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFjO1FBWm5GLG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBSXRCLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNwQixPQUFFLEdBQUcsbUJBQW1CLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDL0UsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUdsQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQTBCdkQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQXlCbEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQXdNbEIscUJBQWdCLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRTtRQUN0QyxDQUFDLENBQUM7UUFFTSxlQUFVLEdBQUcsR0FBRyxFQUFFO1FBQzFCLENBQUMsQ0FBQztRQTFQQSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUlELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQ1csVUFBVSxDQUFDLEtBQTZCO1FBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFJRCxJQUNXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLFFBQVEsQ0FBQyxHQUFHO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBSUQsSUFDVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxXQUFXLENBQUMsR0FBRztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFJRCxJQUNXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLFFBQVEsQ0FBQyxHQUFHO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFJRCxJQUNXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsTUFBTSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztTQUN0QjtJQUNILENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQVcsS0FBSyxDQUFDLEtBQVU7UUFDekIsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNsQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQ1csZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztTQUNyQztRQUVELDhEQUE4RDtRQUM5RCxrREFBa0Q7UUFDbEQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxpQkFBaUI7aUJBQ25CLFlBQVk7aUJBQ1osSUFBSSxDQUNILFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLEVBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQy9DLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUM1QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFDaEMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUM5RCxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUNyRDtpQkFDQSxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBRXJCLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUMvQixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0I7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUN0QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztpQkFDN0U7Z0JBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFFekIsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsaUJBQWlCO2FBQ25CLFlBQVk7YUFDWixJQUFJLENBQ0gsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDUixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQ0YsRUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQzlELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUNoQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQzlELEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEVBQ2hDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3JEO2FBQ0EsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUN0QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN6QixDQUFDLENBQ0YsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDbkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsS0FBbUM7UUFDekQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0saUJBQWlCLENBQUMsS0FBb0M7UUFDM0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztJQUM1QyxDQUFDO0lBRU0sb0JBQW9CO1FBRXpCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUV2QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FFNUI7SUFDSCxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFTSxVQUFVO1FBRWYsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QztJQUNILENBQUM7SUFFTSxTQUFTO1FBRWQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVNLGdCQUFnQixDQUFDLEVBQU87UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0saUJBQWlCLENBQUMsRUFBTztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0sVUFBVSxDQUFDLEdBQVE7UUFDeEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLFVBQW1CO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxLQUFpQjtRQUN2QyxJQUFLLEtBQUssQ0FBQyxNQUFrQixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxPQUFPLEVBQUU7WUFDOUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRU0saUJBQWlCLENBQUMsR0FBYTtRQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUF3QjtRQUMvQixNQUFNLFNBQVMsR0FBUSxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3JDLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFhLFNBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25FLE9BQU8sRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O0FBclFjLDBCQUFNLEdBQUcsQ0FBRSxDQUFBO2dIQUhmLG1CQUFtQjtvR0FBbkIsbUJBQW1CLDZTQWpCbkI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztZQUNsRCxLQUFLLEVBQUUsSUFBSTtTQUNaO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFdBQVcsRUFBRSxtQkFBbUI7U0FDakM7UUFDRDtZQUNFLE9BQU8sRUFBRSxhQUFhO1lBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUM7WUFDbEQsS0FBSyxFQUFFLElBQUk7U0FDWjtLQUNGLCtIQ3ZESCx5dEJBY0E7MkZEMkNhLG1CQUFtQjtrQkF6Qi9CLFNBQVM7K0JBQ0UsaUJBQWlCLFFBR3JCO3dCQUNKLE1BQU0sRUFBRSxJQUFJO3dCQUNaLHlCQUF5QixFQUFFLGFBQWE7cUJBQ3pDLGFBQ1U7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxtQkFBbUI7NEJBQzVCLFdBQVcscUJBQXFCO3lCQUNqQzt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO21KQWE4QixFQUFFO3NCQUFoQyxXQUFXO2dCQUdnQixVQUFVO3NCQUFyQyxTQUFTO3VCQUFDLE9BQU87Z0JBQzRCLFdBQVc7c0JBQXhELFdBQVc7dUJBQUMsdUJBQXVCO2dCQXNCekIsVUFBVTtzQkFEcEIsS0FBSztnQkFRSyxRQUFRO3NCQURsQixLQUFLO2dCQWNLLFdBQVc7c0JBRHJCLEtBQUs7Z0JBYUssUUFBUTtzQkFEbEIsS0FBSztnQkFjSyxNQUFNO3NCQURoQixLQUFLO2dCQStCSyxnQkFBZ0I7c0JBRDFCLFdBQVc7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRG9DaGVjayxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEluamVjdG9yLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TWF0Rm9ybUZpZWxkQ29udHJvbH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcclxuaW1wb3J0IHtcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgTkdfVkFMSURBVE9SUyxcclxuICBOR19WQUxVRV9BQ0NFU1NPUixcclxuICBOZ0NvbnRyb2wsXHJcbiAgVmFsaWRhdGlvbkVycm9ycyxcclxuICBWYWxpZGF0b3JcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gXCJAYW5ndWxhci9jZGsvY29lcmNpb25cIjtcclxuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRhcH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlQWN0aXZhdGVkRXZlbnQsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnR9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGVcIjtcclxuaW1wb3J0IHtNYXRJbnB1dH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2lucHV0XCI7XHJcbmltcG9ydCB7U3ViamVjdH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtGb2N1c01vbml0b3J9IGZyb20gXCJAYW5ndWxhci9jZGsvYTExeVwiO1xyXG5pbXBvcnQge0F1dG9Db21wbGV0ZURhdGFTb3VyY2V9IGZyb20gXCJAbWVzaG1ha2Vycy9zaGFyZWQtc2VydmljZXNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaWEtYXV0b2NvbXBsZXRlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaWEtYXV0b2NvbXBsZXRlLWlucHV0Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2lhLWF1dG9jb21wbGV0ZS1pbnB1dC5jc3MnXSxcclxuICBob3N0OiB7XHJcbiAgICAnW2lkXSc6ICdpZCcsXHJcbiAgICAnW2F0dHIuYXJpYS1kZXNjcmliZWRieV0nOiAnZGVzY3JpYmVkQnknXHJcbiAgfSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IElhQXV0b2NvbXBsZXRlSW5wdXQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCxcclxuICAgICAgdXNlRXhpc3Rpbmc6IElhQXV0b2NvbXBsZXRlSW5wdXRcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IElhQXV0b2NvbXBsZXRlSW5wdXQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIElhQXV0b2NvbXBsZXRlSW5wdXQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgRG9DaGVjaywgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE1hdEZvcm1GaWVsZENvbnRyb2w8YW55PiwgVmFsaWRhdG9yIHtcclxuXHJcblxyXG4gIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XHJcbiAgcHVibGljIHJlYWRvbmx5IHNlYXJjaEZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcclxuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuO1xyXG4gIHB1YmxpYyBmaWx0ZXJlZFN0cmluZ3M6IHN0cmluZ1tdID0gW107XHJcbiAgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sO1xyXG4gIHB1YmxpYyBlcnJvclN0YXRlOiBib29sZWFuO1xyXG4gIHB1YmxpYyBmb2N1c2VkOiBib29sZWFuO1xyXG4gIHB1YmxpYyByZWFkb25seSBzdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIEBIb3N0QmluZGluZygpIHB1YmxpYyByZWFkb25seSBpZCA9IGBpYS1hdXRvY29tcGxldGUtJHtJYUF1dG9jb21wbGV0ZUlucHV0Lm5leHRJZCsrfWA7XHJcbiAgcHVibGljIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIHByaXZhdGUgX3NlbGVjdGVkU3RyaW5nOiBzdHJpbmc7XHJcbiAgQFZpZXdDaGlsZCgnaW5wdXQnKSBwcml2YXRlIGlucHV0RmllbGQ6IE1hdElucHV0O1xyXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRlc2NyaWJlZGJ5JykgcHJpdmF0ZSBkZXNjcmliZWRCeSA9ICcnO1xyXG4gIHByaXZhdGUgYWN0aXZhdGVkVmFsdWU6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGVsUmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvciwgcHJpdmF0ZSBmbTogRm9jdXNNb25pdG9yKSB7XHJcblxyXG4gICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuX2Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIGZtLm1vbml0b3IoZWxSZWYubmF0aXZlRWxlbWVudCwgdHJ1ZSkuc3Vic2NyaWJlKG9yaWdpbiA9PiB7XHJcbiAgICAgIHRoaXMuZm9jdXNlZCA9ICEhb3JpZ2luO1xyXG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2RhdGFTb3VyY2U6IEF1dG9Db21wbGV0ZURhdGFTb3VyY2U7XHJcblxyXG4gIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGRhdGFTb3VyY2UodmFsdWU6IEF1dG9Db21wbGV0ZURhdGFTb3VyY2UpIHtcclxuICAgIHRoaXMuX2RhdGFTb3VyY2UgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQoZGlzKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShkaXMpO1xyXG4gICAgdGhpcy5fZGlzYWJsZWQgPyB0aGlzLnNlYXJjaEZvcm1Db250cm9sLmRpc2FibGUoKSA6IHRoaXMuc2VhcmNoRm9ybUNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHBsYWNlaG9sZGVyKHBsaCkge1xyXG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBwbGg7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXF1aXJlZCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHJlcXVpcmVkKHJlcSkge1xyXG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkocmVxKTtcclxuICAgIHRoaXMuaW5wdXRGaWVsZC5yZXF1aXJlZCA9IHRoaXMuX3JlcXVpcmVkO1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlZml4OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBwcmVmaXgoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmVmaXg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHByZWZpeCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX3ByZWZpeCkge1xyXG4gICAgICB0aGlzLl9wcmVmaXggPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFN0cmluZztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9zZWxlY3RlZFN0cmluZykge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZFN0cmluZyA9IHZhbHVlO1xyXG4gICAgICB0aGlzLnNlYXJjaEZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcclxuICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKHRoaXMuX3NlbGVjdGVkU3RyaW5nKTtcclxuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBlbXB0eSgpIHtcclxuICAgIGxldCBuID0gdGhpcy5zZWFyY2hGb3JtQ29udHJvbC52YWx1ZTtcclxuICAgIHJldHVybiAhISFuO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mbG9hdGluZycpXHJcbiAgcHVibGljIGdldCBzaG91bGRMYWJlbEZsb2F0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9jdXNlZCB8fCAhdGhpcy5lbXB0eTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwpO1xyXG4gICAgaWYgKHRoaXMubmdDb250cm9sICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgcHJlZml4IGRlZmluZWQsIHVzdWFsbHkgdGhpcyBpcyB1c2VkIGZvciBhIGNvZGUgc2Nhbm5lci5cclxuICAgIC8vIFRoZSBnb2FsIGlzIHRvIHNlbGVjdCB0aGUgZW50aXR5IGluIGRpcmVjdCB3YXkuXHJcbiAgICBpZiAodGhpcy5fcHJlZml4KSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRm9ybUNvbnRyb2xcclxuICAgICAgICAudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcclxuICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSxcclxuICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZS5zdGFydHNXaXRoKHRoaXMuX3ByZWZpeCkpLFxyXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMudmFsdWUgPSBudWxsKSxcclxuICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLmlzTG9hZGluZyA9IHRydWUpLFxyXG4gICAgICAgICAgbWFwKHZhbHVlID0+IHRoaXMuX2RhdGFTb3VyY2Uub25QcmVwcm9jZXNzU2VhcmNoU3RyaW5nKHZhbHVlKSksXHJcbiAgICAgICAgICBzd2l0Y2hNYXAodmFsdWUgPT4gdGhpcy5fZGF0YVNvdXJjZS5vbkZpbHRlcih2YWx1ZSkpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUocmVzdWx0U2V0ID0+IHtcclxuXHJcbiAgICAgICAgICBpZiAocmVzdWx0U2V0Lmxpc3QubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSByZXN1bHRTZXRbMF07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3RyaW5ncyA9IHJlc3VsdFNldC5saXN0O1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm1Db250cm9sLnBhdGNoVmFsdWUocmVzdWx0U2V0LnNlYXJjaFRlcm0sIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhpcyBpcyB0aGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgd2hlbiBzZWFyY2ggYnkgaHVtYW4uXHJcbiAgICB0aGlzLnNlYXJjaEZvcm1Db250cm9sXHJcbiAgICAgIC52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXHJcbiAgICAgICAgdGFwKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN0cmluZ3MgPSBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApLFxyXG4gICAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID49IDEpLFxyXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmlzTG9hZGluZyA9IHRydWUpLFxyXG4gICAgICAgIG1hcCh2YWx1ZSA9PiB0aGlzLl9kYXRhU291cmNlLm9uUHJlcHJvY2Vzc1NlYXJjaFN0cmluZyh2YWx1ZSkpLFxyXG4gICAgICAgIHRhcCh2YWx1ZSA9PiB0aGlzLnZhbHVlID0gdmFsdWUpLFxyXG4gICAgICAgIHN3aXRjaE1hcCh2YWx1ZSA9PiB0aGlzLl9kYXRhU291cmNlLm9uRmlsdGVyKHZhbHVlKSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdFNldCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkU3RyaW5ncyA9IHJlc3VsdFNldC5saXN0O1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbC5wYXRjaFZhbHVlKHJlc3VsdFNldC5zZWFyY2hUZXJtLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLmZtLnN0b3BNb25pdG9yaW5nKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcclxuICAgICAgdGhpcy5lcnJvclN0YXRlID0gdGhpcy5uZ0NvbnRyb2wuaW52YWxpZCAmJiB0aGlzLm5nQ29udHJvbC50b3VjaGVkO1xyXG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXIoKSB7XHJcbiAgICB0aGlzLmZpbHRlcmVkU3RyaW5ncyA9IFtdO1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtQ29udHJvbC5yZXNldChudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb2N1cygpIHtcclxuICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25PcHRpb25TZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCkge1xyXG4gICAgdGhpcy52YWx1ZSA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcclxuICAgIHRoaXMuZmlsdGVyZWRTdHJpbmdzID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25PcHRpb25BY3RpdmF0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZUFjdGl2YXRlZEV2ZW50KSB7XHJcbiAgICB0aGlzLmFjdGl2YXRlZFZhbHVlID0gZXZlbnQub3B0aW9uPy52YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkF1dG9Db21wbGV0ZUNsb3NlZCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5hY3RpdmF0ZWRWYWx1ZSkge1xyXG5cclxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuYWN0aXZhdGVkVmFsdWU7XHJcbiAgICAgIHRoaXMuYWN0aXZhdGVkVmFsdWUgPSBudWxsO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldCgpIHtcclxuICAgIHRoaXMudmFsdWUgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRm9jdXNPdXQoKSB7XHJcblxyXG4gICAgaWYgKHRoaXMuZmlsdGVyZWRTdHJpbmdzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICB0aGlzLmFjdGl2YXRlZFZhbHVlID0gdGhpcy5maWx0ZXJlZFN0cmluZ3NbMF07XHJcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmZpbHRlcmVkU3RyaW5nc1swXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblRvdWNoZWQoKSB7XHJcblxyXG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXIoKTtcclxuICAgIHRoaXMudmFsdWUgPSBvYmo7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNvbnRhaW5lckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2lucHV0Jykge1xyXG4gICAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGVzY3JpYmVkQnlJZHMoaWRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXNjcmliZWRCeSA9IGlkcy5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb246IGFueSA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gJ3N0cmluZycgJiYgKDxzdHJpbmc+c2VsZWN0aW9uKS5sZW5ndGggPCAxKSB7XHJcbiAgICAgIHJldHVybiB7aW5jb3JyZWN0OiB0cnVlfTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4ge1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgX29uVG91Y2hlZCA9ICgpID0+IHtcclxuICB9O1xyXG59XHJcbiIsIjxpbnB1dCAjaW5wdXQgKGJsdXIpPVwib25Ub3VjaGVkKClcIiAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCIgW2Zvcm1Db250cm9sXT1cInNlYXJjaEZvcm1Db250cm9sXCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcclxuICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIG1hdElucHV0PlxyXG48bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbG9zZWQpPVwib25BdXRvQ29tcGxldGVDbG9zZWQoKVwiIChvcHRpb25BY3RpdmF0ZWQpPVwib25PcHRpb25BY3RpdmF0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudClcIj5cclxuICA8bWF0LW9wdGlvbiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwiaXMtbG9hZGluZ1wiPlxyXG4gICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxyXG4gIDwvbWF0LW9wdGlvbj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxyXG4gICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHN0ciBvZiBmaWx0ZXJlZFN0cmluZ3NcIiBbdmFsdWVdPVwic3RyXCI+XHJcbiAgICAgIHt7c3RyfX1cclxuICAgIDwvbWF0LW9wdGlvbj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4iXX0=