@marcura/marcura-combobox 6.1.0 → 6.1.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 (64) hide show
  1. package/README.md +24 -24
  2. package/esm2020/lib/combobox.injectables.mjs +5 -5
  3. package/esm2020/lib/combobox.module.mjs +103 -103
  4. package/esm2020/lib/components/abstract-combobox/abstract-combobox.component.mjs +240 -240
  5. package/esm2020/lib/components/abstract-dropdown/abstract-dropdown.component.mjs +230 -230
  6. package/esm2020/lib/components/combobox/combobox.component.mjs +365 -361
  7. package/esm2020/lib/components/combobox-popup-footer/combobox-popup-footer.component.mjs +38 -38
  8. package/esm2020/lib/components/dropdown/dropdown.component.mjs +234 -234
  9. package/esm2020/lib/components/multiselect/multiselect.component.mjs +247 -247
  10. package/esm2020/lib/directives/combobox-item-template.directive.mjs +13 -13
  11. package/esm2020/lib/directives/dropdown-item-template.directive.mjs +13 -13
  12. package/esm2020/lib/directives/dropdown-value-template.directive.mjs +13 -13
  13. package/esm2020/lib/directives/multiselect-item-template.directive.mjs +13 -13
  14. package/esm2020/lib/directives/multiselect-tag-template.directive.mjs +13 -13
  15. package/esm2020/lib/directives/multiselect-tag-wrapper.directive.mjs +60 -60
  16. package/esm2020/lib/model/combobox-changed.event.mjs +4 -4
  17. package/esm2020/lib/model/combobox-item.type.mjs +12 -12
  18. package/esm2020/lib/model/combobox-kendo-component.interface.mjs +2 -2
  19. package/esm2020/lib/model/combobox-localization.interface.mjs +2 -2
  20. package/esm2020/lib/model/combobox-search-fn.type.mjs +1 -1
  21. package/esm2020/lib/model/combobox-search-settings-operator.enum.mjs +6 -6
  22. package/esm2020/lib/model/combobox-search-settings.interface.mjs +2 -2
  23. package/esm2020/lib/model/dropdown-changed.event.mjs +4 -4
  24. package/esm2020/lib/model/dropdown-kendo-component.interface.mjs +2 -2
  25. package/esm2020/lib/model/dropdown-localization.interface.mjs +2 -2
  26. package/esm2020/lib/model/dropdown-localizer.interface.mjs +2 -2
  27. package/esm2020/lib/model/multiselect-changed.event.mjs +4 -4
  28. package/esm2020/lib/model/multiselect-localization.interface.mjs +2 -2
  29. package/esm2020/marcura-marcura-combobox.mjs +4 -4
  30. package/esm2020/public-api.mjs +25 -25
  31. package/fesm2015/marcura-marcura-combobox.mjs +1482 -1478
  32. package/fesm2015/marcura-marcura-combobox.mjs.map +1 -1
  33. package/fesm2020/marcura-marcura-combobox.mjs +1477 -1473
  34. package/fesm2020/marcura-marcura-combobox.mjs.map +1 -1
  35. package/index.d.ts +5 -5
  36. package/lib/combobox.injectables.d.ts +8 -8
  37. package/lib/combobox.module.d.ts +25 -25
  38. package/lib/components/abstract-combobox/abstract-combobox.component.d.ts +59 -59
  39. package/lib/components/abstract-dropdown/abstract-dropdown.component.d.ts +76 -76
  40. package/lib/components/combobox/combobox.component.d.ts +65 -64
  41. package/lib/components/combobox-popup-footer/combobox-popup-footer.component.d.ts +13 -13
  42. package/lib/components/dropdown/dropdown.component.d.ts +45 -45
  43. package/lib/components/multiselect/multiselect.component.d.ts +51 -51
  44. package/lib/directives/combobox-item-template.directive.d.ts +5 -5
  45. package/lib/directives/dropdown-item-template.directive.d.ts +5 -5
  46. package/lib/directives/dropdown-value-template.directive.d.ts +5 -5
  47. package/lib/directives/multiselect-item-template.directive.d.ts +5 -5
  48. package/lib/directives/multiselect-tag-template.directive.d.ts +5 -5
  49. package/lib/directives/multiselect-tag-wrapper.directive.d.ts +21 -21
  50. package/lib/model/combobox-changed.event.d.ts +3 -3
  51. package/lib/model/combobox-item.type.d.ts +4 -4
  52. package/lib/model/combobox-kendo-component.interface.d.ts +7 -7
  53. package/lib/model/combobox-localization.interface.d.ts +5 -5
  54. package/lib/model/combobox-search-fn.type.d.ts +3 -3
  55. package/lib/model/combobox-search-settings-operator.enum.d.ts +4 -4
  56. package/lib/model/combobox-search-settings.interface.d.ts +5 -5
  57. package/lib/model/dropdown-changed.event.d.ts +3 -3
  58. package/lib/model/dropdown-kendo-component.interface.d.ts +6 -6
  59. package/lib/model/dropdown-localization.interface.d.ts +3 -3
  60. package/lib/model/dropdown-localizer.interface.d.ts +5 -5
  61. package/lib/model/multiselect-changed.event.d.ts +3 -3
  62. package/lib/model/multiselect-localization.interface.d.ts +5 -5
  63. package/package.json +1 -1
  64. package/public-api.d.ts +24 -24
@@ -1,231 +1,231 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { FormControl } from '@angular/forms';
3
- import { AbstractControlComponent, ControlBlurredEvent, ControlState, ControlType, } from '@marcura/marcura-common';
4
- import { BehaviorSubject } from 'rxjs';
5
- import * as i0 from "@angular/core";
6
- export class AbstractDropdownComponent extends AbstractControlComponent {
7
- get valueField() {
8
- return this._valueField;
9
- }
10
- set valueField(valueField) {
11
- if (valueField && this._valueField !== valueField) {
12
- this._valueField = valueField;
13
- }
14
- }
15
- get valueKey() {
16
- return this._valueField.toString();
17
- }
18
- get textField() {
19
- return this._textField;
20
- }
21
- set textField(textField) {
22
- if (textField && this._textField !== textField) {
23
- this._textField = textField;
24
- }
25
- }
26
- get textKey() {
27
- return this._textField.toString();
28
- }
29
- get isLoading() {
30
- return this._isLoading.value;
31
- }
32
- set isLoading(isLoading) {
33
- this._isLoading.next(isLoading);
34
- // Mark hasIsLoadingCssClass @HostBinding for check.
35
- this._changeDetectorRef.markForCheck();
36
- }
37
- get state() {
38
- return this._state;
39
- }
40
- set state(state) {
41
- if (this._state !== state) {
42
- this._state = state;
43
- this._isHighlightedState = state === ControlState.Highlighted;
44
- this._changeDetectorRef.markForCheck();
45
- }
46
- }
47
- get type() {
48
- return this._type;
49
- }
50
- set type(type) {
51
- if (this._type !== type) {
52
- this._type = type;
53
- this._isSuccessType = type === ControlType.Success;
54
- this._isErrorType = type === ControlType.Error;
55
- this._isWarningType = type === ControlType.Warning;
56
- this._changeDetectorRef.markForCheck();
57
- }
58
- }
59
- get items() {
60
- return this._items;
61
- }
62
- set items(items) {
63
- this._items = items || [];
64
- }
65
- get isOpen() {
66
- return this._isOpen.value.isOpen;
67
- }
68
- constructor(_changeDetectorRef) {
69
- super();
70
- this._changeDetectorRef = _changeDetectorRef;
71
- // TODO: technical debt - figure out way of putting default value
72
- this._valueField = 'id';
73
- this._textField = 'name';
74
- this._resetedValue = null;
75
- this._items = [];
76
- this._isOpen = new BehaviorSubject({
77
- isOpen: false,
78
- shouldEmit: false,
79
- });
80
- this._isLoading = new BehaviorSubject(false);
81
- this._type = null;
82
- this._state = null;
83
- this._isSuccessType = this._type === ControlType.Success;
84
- this._isErrorType = this._type === ControlType.Error;
85
- this._isWarningType = this._type === ControlType.Warning;
86
- this._isHighlightedState = this._state === ControlState.Highlighted;
87
- this.valueFormControl = new FormControl();
88
- this.placeholder = '';
89
- this.hasReset = true;
90
- this.listHeight = 200;
91
- /**
92
- * @deprecated please try to avoid it, as it forced me to create ComboboxItem<TItem>
93
- * with union of weird types. Item should be an object in most cases...
94
- */
95
- this.isPrimitiveValue = false;
96
- this.isOutline = false;
97
- this.opened = new EventEmitter();
98
- this.closed = new EventEmitter();
99
- }
100
- _setComponent(component) {
101
- this._component = component;
102
- }
103
- _emitChanged(value) { }
104
- _reset() {
105
- const hasValueChanged = this.hasValueChanged(this.defaultValue);
106
- if (hasValueChanged) {
107
- this.writeValue(this.defaultValue);
108
- this.formControl.reset(this.defaultValue);
109
- this.valueFormControl.reset(this.defaultValue);
110
- this._component.reset();
111
- this._emitChanged(this.defaultValue);
112
- }
113
- else {
114
- this.formControl.markAsPristine();
115
- this.formControl.markAsUntouched();
116
- this.valueFormControl.reset(this.defaultValue);
117
- this._component.reset();
118
- }
119
- }
120
- init() {
121
- this._observer.listen(this._isDisabled, (isDisabled) => {
122
- if (isDisabled) {
123
- this.valueFormControl.disable();
124
- }
125
- else {
126
- this.valueFormControl.enable();
127
- }
128
- });
129
- }
130
- open(shouldEmitEvent = true) {
131
- this._component.toggle(true);
132
- this._isOpen.next({ isOpen: true, shouldEmit: shouldEmitEvent });
133
- }
134
- close(shouldEmitEvent = true) {
135
- this._component.toggle(false);
136
- this._isOpen.next({ isOpen: false, shouldEmit: shouldEmitEvent });
137
- }
138
- toggle(shouldEmitEvent = true) {
139
- if (this._isOpen) {
140
- this.close(shouldEmitEvent);
141
- }
142
- else {
143
- this.open(shouldEmitEvent);
144
- }
145
- }
146
- focus() {
147
- this._component.focus();
148
- }
149
- blur() {
150
- this._component.blur();
151
- }
152
- onOpened() {
153
- this._isOpen.next({ isOpen: true, shouldEmit: true });
154
- }
155
- onClosed() {
156
- this._isOpen.next({ isOpen: false, shouldEmit: true });
157
- }
158
- onFocused() {
159
- this.focused.emit();
160
- }
161
- onBlurred() {
162
- this.blurred.emit(new ControlBlurredEvent(this.value, this._resetedValue || this._focusedValue, this.hasValueChanged(this._resetedValue || this._focusedValue)));
163
- this._resetedValue = null;
164
- }
165
- onChanged(value) {
166
- value = value === undefined ? this.defaultValue : value;
167
- this.value = value;
168
- this.propagateChanged(value);
169
- this.propagateTouched();
170
- this._emitChanged(value);
171
- }
172
- onResetClicked() {
173
- if (!this.hasReset) {
174
- return;
175
- }
176
- this._resetedValue = this.value;
177
- this.focus();
178
- this._reset();
179
- this.open();
180
- }
181
- writeValue(value) {
182
- // CSS class @HostBindings aren't updated with OnPush change detection strategy,
183
- // and are to be marked for check.
184
- this._changeDetectorRef.markForCheck();
185
- this.valueFormControl.setValue(value);
186
- super.writeValue(value);
187
- }
188
- setDisabledState(isDisabled) {
189
- super.setDisabledState(isDisabled);
190
- // Mark hasIsDisabledCssClass @HostBinding for check.
191
- this._changeDetectorRef.markForCheck();
192
- }
193
- }
194
- AbstractDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: AbstractDropdownComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
195
- AbstractDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: AbstractDropdownComponent, selector: "ng-component", inputs: { valueField: "valueField", textField: "textField", placeholder: "placeholder", isLoading: "isLoading", hasReset: "hasReset", popupClass: "popupClass", state: "state", type: "type", items: "items", listHeight: "listHeight", isPrimitiveValue: "isPrimitiveValue", isOutline: "isOutline" }, outputs: { opened: "opened", closed: "closed" }, usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
196
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: AbstractDropdownComponent, decorators: [{
197
- type: Component,
198
- args: [{
199
- template: '',
200
- changeDetection: ChangeDetectionStrategy.OnPush,
201
- }]
202
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { valueField: [{
203
- type: Input
204
- }], textField: [{
205
- type: Input
206
- }], placeholder: [{
207
- type: Input
208
- }], isLoading: [{
209
- type: Input
210
- }], hasReset: [{
211
- type: Input
212
- }], popupClass: [{
213
- type: Input
214
- }], state: [{
215
- type: Input
216
- }], type: [{
217
- type: Input
218
- }], items: [{
219
- type: Input
220
- }], listHeight: [{
221
- type: Input
222
- }], isPrimitiveValue: [{
223
- type: Input
224
- }], isOutline: [{
225
- type: Input
226
- }], opened: [{
227
- type: Output
228
- }], closed: [{
229
- type: Output
230
- }] } });
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { FormControl } from '@angular/forms';
3
+ import { AbstractControlComponent, ControlBlurredEvent, ControlState, ControlType, } from '@marcura/marcura-common';
4
+ import { BehaviorSubject } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ export class AbstractDropdownComponent extends AbstractControlComponent {
7
+ get valueField() {
8
+ return this._valueField;
9
+ }
10
+ set valueField(valueField) {
11
+ if (valueField && this._valueField !== valueField) {
12
+ this._valueField = valueField;
13
+ }
14
+ }
15
+ get valueKey() {
16
+ return this._valueField.toString();
17
+ }
18
+ get textField() {
19
+ return this._textField;
20
+ }
21
+ set textField(textField) {
22
+ if (textField && this._textField !== textField) {
23
+ this._textField = textField;
24
+ }
25
+ }
26
+ get textKey() {
27
+ return this._textField.toString();
28
+ }
29
+ get isLoading() {
30
+ return this._isLoading.value;
31
+ }
32
+ set isLoading(isLoading) {
33
+ this._isLoading.next(isLoading);
34
+ // Mark hasIsLoadingCssClass @HostBinding for check.
35
+ this._changeDetectorRef.markForCheck();
36
+ }
37
+ get state() {
38
+ return this._state;
39
+ }
40
+ set state(state) {
41
+ if (this._state !== state) {
42
+ this._state = state;
43
+ this._isHighlightedState = state === ControlState.Highlighted;
44
+ this._changeDetectorRef.markForCheck();
45
+ }
46
+ }
47
+ get type() {
48
+ return this._type;
49
+ }
50
+ set type(type) {
51
+ if (this._type !== type) {
52
+ this._type = type;
53
+ this._isSuccessType = type === ControlType.Success;
54
+ this._isErrorType = type === ControlType.Error;
55
+ this._isWarningType = type === ControlType.Warning;
56
+ this._changeDetectorRef.markForCheck();
57
+ }
58
+ }
59
+ get items() {
60
+ return this._items;
61
+ }
62
+ set items(items) {
63
+ this._items = items || [];
64
+ }
65
+ get isOpen() {
66
+ return this._isOpen.value.isOpen;
67
+ }
68
+ constructor(_changeDetectorRef) {
69
+ super();
70
+ this._changeDetectorRef = _changeDetectorRef;
71
+ // TODO: technical debt - figure out way of putting default value
72
+ this._valueField = 'id';
73
+ this._textField = 'name';
74
+ this._resetedValue = null;
75
+ this._items = [];
76
+ this._isOpen = new BehaviorSubject({
77
+ isOpen: false,
78
+ shouldEmit: false,
79
+ });
80
+ this._isLoading = new BehaviorSubject(false);
81
+ this._type = null;
82
+ this._state = null;
83
+ this._isSuccessType = this._type === ControlType.Success;
84
+ this._isErrorType = this._type === ControlType.Error;
85
+ this._isWarningType = this._type === ControlType.Warning;
86
+ this._isHighlightedState = this._state === ControlState.Highlighted;
87
+ this.valueFormControl = new FormControl();
88
+ this.placeholder = '';
89
+ this.hasReset = true;
90
+ this.listHeight = 200;
91
+ /**
92
+ * @deprecated please try to avoid it, as it forced me to create ComboboxItem<TItem>
93
+ * with union of weird types. Item should be an object in most cases...
94
+ */
95
+ this.isPrimitiveValue = false;
96
+ this.isOutline = false;
97
+ this.opened = new EventEmitter();
98
+ this.closed = new EventEmitter();
99
+ }
100
+ _setComponent(component) {
101
+ this._component = component;
102
+ }
103
+ _emitChanged(value) { }
104
+ _reset() {
105
+ const hasValueChanged = this.hasValueChanged(this.defaultValue);
106
+ if (hasValueChanged) {
107
+ this.writeValue(this.defaultValue);
108
+ this.formControl.reset(this.defaultValue);
109
+ this.valueFormControl.reset(this.defaultValue);
110
+ this._component.reset();
111
+ this._emitChanged(this.defaultValue);
112
+ }
113
+ else {
114
+ this.formControl.markAsPristine();
115
+ this.formControl.markAsUntouched();
116
+ this.valueFormControl.reset(this.defaultValue);
117
+ this._component.reset();
118
+ }
119
+ }
120
+ init() {
121
+ this._observer.listen(this._isDisabled, (isDisabled) => {
122
+ if (isDisabled) {
123
+ this.valueFormControl.disable();
124
+ }
125
+ else {
126
+ this.valueFormControl.enable();
127
+ }
128
+ });
129
+ }
130
+ open(shouldEmitEvent = true) {
131
+ this._component.toggle(true);
132
+ this._isOpen.next({ isOpen: true, shouldEmit: shouldEmitEvent });
133
+ }
134
+ close(shouldEmitEvent = true) {
135
+ this._component.toggle(false);
136
+ this._isOpen.next({ isOpen: false, shouldEmit: shouldEmitEvent });
137
+ }
138
+ toggle(shouldEmitEvent = true) {
139
+ if (this._isOpen) {
140
+ this.close(shouldEmitEvent);
141
+ }
142
+ else {
143
+ this.open(shouldEmitEvent);
144
+ }
145
+ }
146
+ focus() {
147
+ this._component.focus();
148
+ }
149
+ blur() {
150
+ this._component.blur();
151
+ }
152
+ onOpened() {
153
+ this._isOpen.next({ isOpen: true, shouldEmit: true });
154
+ }
155
+ onClosed() {
156
+ this._isOpen.next({ isOpen: false, shouldEmit: true });
157
+ }
158
+ onFocused() {
159
+ this.focused.emit();
160
+ }
161
+ onBlurred() {
162
+ this.blurred.emit(new ControlBlurredEvent(this.value, this._resetedValue || this._focusedValue, this.hasValueChanged(this._resetedValue || this._focusedValue)));
163
+ this._resetedValue = null;
164
+ }
165
+ onChanged(value) {
166
+ value = value === undefined ? this.defaultValue : value;
167
+ this.value = value;
168
+ this.propagateChanged(value);
169
+ this.propagateTouched();
170
+ this._emitChanged(value);
171
+ }
172
+ onResetClicked() {
173
+ if (!this.hasReset) {
174
+ return;
175
+ }
176
+ this._resetedValue = this.value;
177
+ this.focus();
178
+ this._reset();
179
+ this.open();
180
+ }
181
+ writeValue(value) {
182
+ // CSS class @HostBindings aren't updated with OnPush change detection strategy,
183
+ // and are to be marked for check.
184
+ this._changeDetectorRef.markForCheck();
185
+ this.valueFormControl.setValue(value);
186
+ super.writeValue(value);
187
+ }
188
+ setDisabledState(isDisabled) {
189
+ super.setDisabledState(isDisabled);
190
+ // Mark hasIsDisabledCssClass @HostBinding for check.
191
+ this._changeDetectorRef.markForCheck();
192
+ }
193
+ }
194
+ AbstractDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: AbstractDropdownComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
195
+ AbstractDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: AbstractDropdownComponent, selector: "ng-component", inputs: { valueField: "valueField", textField: "textField", placeholder: "placeholder", isLoading: "isLoading", hasReset: "hasReset", popupClass: "popupClass", state: "state", type: "type", items: "items", listHeight: "listHeight", isPrimitiveValue: "isPrimitiveValue", isOutline: "isOutline" }, outputs: { opened: "opened", closed: "closed" }, usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
196
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: AbstractDropdownComponent, decorators: [{
197
+ type: Component,
198
+ args: [{
199
+ template: '',
200
+ changeDetection: ChangeDetectionStrategy.OnPush,
201
+ }]
202
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { valueField: [{
203
+ type: Input
204
+ }], textField: [{
205
+ type: Input
206
+ }], placeholder: [{
207
+ type: Input
208
+ }], isLoading: [{
209
+ type: Input
210
+ }], hasReset: [{
211
+ type: Input
212
+ }], popupClass: [{
213
+ type: Input
214
+ }], state: [{
215
+ type: Input
216
+ }], type: [{
217
+ type: Input
218
+ }], items: [{
219
+ type: Input
220
+ }], listHeight: [{
221
+ type: Input
222
+ }], isPrimitiveValue: [{
223
+ type: Input
224
+ }], isOutline: [{
225
+ type: Input
226
+ }], opened: [{
227
+ type: Output
228
+ }], closed: [{
229
+ type: Output
230
+ }] } });
231
231
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Fic3RyYWN0LWRyb3Bkb3duL2Fic3RyYWN0LWRyb3Bkb3duLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLG1CQUFtQixFQUVuQixZQUFZLEVBQ1osV0FBVyxHQUtaLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLE1BQU0sQ0FBQzs7QUFhckMsTUFBTSxPQUFnQix5QkFLcEIsU0FBUSx3QkFBNEU7SUFvQnBGLElBQ1csVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQVcsVUFBVSxDQUFDLFVBQXVCO1FBQzNDLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssVUFBVSxFQUFFO1lBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELElBQ1csU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUNELElBQVcsU0FBUyxDQUFDLFNBQXNCO1FBQ3pDLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQzlDLElBQUksQ0FBQyxVQUFVLEdB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TUFBTTtnQkFHUyxNQUFNO3NCQURyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbENvbXBvbmVudCxcbiAgQ29udHJvbEJsdXJyZWRFdmVudCxcbiAgQ29udHJvbENoYW5nZWRFdmVudCxcbiAgQ29udHJvbFN0YXRlLFxuICBDb250cm9sVHlwZSxcbiAgSU9wZW5hYmxlQ29udHJvbENvbXBvbmVudCxcbiAgSVN0YXRlYWJsZUNvbnRyb2xDb21wb25lbnQsXG4gIElUeXBlYWJsZUNvbnRyb2xDb21wb25lbnQsXG4gIE5pbCxcbn0gZnJvbSAnQG1hcmN1cmEvbWFyY3VyYS1jb21tb24nO1xuaW1wb3J0IHtHcm91cFJlc3VsdH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWRhdGEtcXVlcnknO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtJRHJvcGRvd25LZW5kb0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vbW9kZWwvZHJvcGRvd24ta2VuZG8tY29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQge0NvbWJvYm94SXRlbX0gZnJvbSAnLi4vLi4vbW9kZWwvY29tYm9ib3gtaXRlbS50eXBlJztcblxuaW50ZXJmYWNlIElEcm9wZG93bk9wZW5lZEV2ZW50IHtcbiAgaXNPcGVuOiBib29sZWFuO1xuICBzaG91bGRFbWl0OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGU6ICcnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REcm9wZG93bkNvbXBvbmVudDxcbiAgVEl0ZW0sXG4gIFRWYWx1ZSxcbiAgVEtlbmRvQ29tcG9uZW50IGV4dGVuZHMgSURyb3Bkb3duS2VuZG9Db21wb25lbnQgPSBJRHJvcGRvd25LZW5kb0NvbXBvbmVudCxcbiAgVENoYW5nZWRFdmVudCBleHRlbmRzIENvbnRyb2xDaGFuZ2VkRXZlbnQ8VFZhbHVlPiA9IENvbnRyb2xDaGFuZ2VkRXZlbnQ8VFZhbHVlPlxuPiBleHRlbmRzIEFic3RyYWN0Q29udHJvbENvbXBvbmVudDxUVmFsdWUsIENvbnRyb2xCbHVycmVkRXZlbnQ8VFZhbHVlPiwgVENoYW5nZWRFdmVudD5cbiAgaW1wbGVtZW50cyBJT3BlbmFibGVDb250cm9sQ29tcG9uZW50LCBJU3RhdGVhYmxlQ29udHJvbENvbXBvbmVudCwgSVR5cGVhYmxlQ29udHJvbENvbXBvbmVudCB7XG4gIC8vIFRPRE86IHRlY2huaWNhbCBkZWJ0IC0gZmlndXJlIG91dCB3YXkgb2YgcHV0dGluZyBkZWZhdWx0IHZhbHVlXG4gIHByaXZhdGUgX3ZhbHVlRmllbGQ6IGtleW9mIFRJdGVtID0gJ2lkJyBhcyBhbnk7XG4gIHByaXZhdGUgX3RleHRGaWVsZDogIGtleW9mIFRJdGVtID0gJ25hbWUnIGFzIGFueTtcbiAgcHJvdGVjdGVkIF9yZXNldGVkVmFsdWU6IFRWYWx1ZSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgX2NvbXBvbmVudCE6IFRLZW5kb0NvbXBvbmVudDtcbiAgcHJvdGVjdGVkIF9pdGVtczogQ29tYm9ib3hJdGVtPFRJdGVtPltdID0gW107XG4gIHByb3RlY3RlZCByZWFkb25seSBfaXNPcGVuOiBCZWhhdmlvclN1YmplY3Q8SURyb3Bkb3duT3BlbmVkRXZlbnQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJRHJvcGRvd25PcGVuZWRFdmVudD4oe1xuICAgIGlzT3BlbjogZmFsc2UsXG4gICAgc2hvdWxkRW1pdDogZmFsc2UsXG4gIH0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2lzTG9hZGluZzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBfdHlwZTogQ29udHJvbFR5cGUgfCBOaWwgPSBudWxsO1xuICBwcm90ZWN0ZWQgX3N0YXRlOiBDb250cm9sU3RhdGUgfCBOaWwgPSBudWxsO1xuICBwcm90ZWN0ZWQgX2lzU3VjY2Vzc1R5cGU6IGJvb2xlYW4gPSB0aGlzLl90eXBlID09PSBDb250cm9sVHlwZS5TdWNjZXNzO1xuICBwcm90ZWN0ZWQgX2lzRXJyb3JUeXBlOiBib29sZWFuID0gdGhpcy5fdHlwZSA9PT0gQ29udHJvbFR5cGUuRXJyb3I7XG4gIHByb3RlY3RlZCBfaXNXYXJuaW5nVHlwZTogYm9vbGVhbiA9IHRoaXMuX3R5cGUgPT09IENvbnRyb2xUeXBlLldhcm5pbmc7XG4gIHByb3RlY3RlZCBfaXNIaWdobGlnaHRlZFN0YXRlOiBib29sZWFuID0gdGhpcy5fc3RhdGUgPT09IENvbnRyb2xTdGF0ZS5IaWdobGlnaHRlZDtcbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sPFRWYWx1ZSB8IG51bGw+ID0gbmV3IEZvcm1Db250cm9sKCk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgdmFsdWVGaWVsZCgpOiBrZXlvZiBUSXRlbSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlRmllbGQ7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZUZpZWxkKHZhbHVlRmllbGQ6IGtleW9mIFRJdGVtKSB7XG4gICAgaWYgKHZhbHVlRmllbGQgJiYgdGhpcy5fdmFsdWVGaWVsZCAhPT0gdmFsdWVGaWVsZCkge1xuICAgICAgdGhpcy5fdmFsdWVGaWVsZCA9IHZhbHVlRmllbGQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCB2YWx1ZUtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZUZpZWxkLnRvU3RyaW5nKCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IHRleHRGaWVsZCgpOiBrZXlvZiBUSXRlbSB7XG4gICAgcmV0dXJuIHRoaXMuX3RleHRGaWVsZDtcbiAgfVxuICBwdWJsaWMgc2V0IHRleHRGaWVsZCh0ZXh0RmllbGQ6IGtleW9mIFRJdGVtKSB7XG4gICAgaWYgKHRleHRGaWVsZCAmJiB0aGlzLl90ZXh0RmllbGQgIT09IHRleHRGaWVsZCkge1xuICAgICAgdGhpcy5fdGV4dEZpZWxkID0gdGV4dEZpZWxkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGV4dEtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90ZXh0RmllbGQudG9TdHJpbmcoKTtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNMb2FkaW5nLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNMb2FkaW5nKGlzTG9hZGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzTG9hZGluZy5uZXh0KGlzTG9hZGluZyk7XG4gICAgLy8gTWFyayBoYXNJc0xvYWRpbmdDc3NDbGFzcyBASG9zdEJpbmRpbmcgZm9yIGNoZWNrLlxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoYXNSZXNldDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwb3B1cENsYXNzPzogc3RyaW5nO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IENvbnRyb2xTdGF0ZSB8IE5pbCB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhdGUoc3RhdGU6IENvbnRyb2xTdGF0ZSB8IE5pbCkge1xuICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLl9pc0hpZ2hsaWdodGVkU3RhdGUgPSBzdGF0ZSA9PT0gQ29udHJvbFN0YXRlLkhpZ2hsaWdodGVkO1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBDb250cm9sVHlwZSB8IE5pbCB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cbiAgcHVibGljIHNldCB0eXBlKHR5cGU6IENvbnRyb2xUeXBlIHwgTmlsKSB7XG4gICAgaWYgKHRoaXMuX3R5cGUgIT09IHR5cGUpIHtcbiAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgICAgdGhpcy5faXNTdWNjZXNzVHlwZSA9IHR5cGUgPT09IENvbnRyb2xUeXBlLlN1Y2Nlc3M7XG4gICAgICB0aGlzLl9pc0Vycm9yVHlwZSA9IHR5cGUgPT09IENvbnRyb2xUeXBlLkVycm9yO1xuICAgICAgdGhpcy5faXNXYXJuaW5nVHlwZSA9IHR5cGUgPT09IENvbnRyb2xUeXBlLldhcm5pbmc7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBpdGVtcygpOiBDb21ib2JveEl0ZW08VEl0ZW0+W10ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuICBwdWJsaWMgc2V0IGl0ZW1zKGl0ZW1zOiBDb21ib2JveEl0ZW08VEl0ZW0+W10pIHtcbiAgICB0aGlzLl9pdGVtcyA9IGl0ZW1zIHx8IFtdO1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsaXN0SGVpZ2h0OiBudW1iZXIgPSAyMDA7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHBsZWFzZSB0cnkgdG8gYXZvaWQgaXQsIGFzIGl0IGZvcmNlZCBtZSB0byBjcmVhdGUgQ29tYm9ib3hJdGVtPFRJdGVtPlxuICAgKiAgICAgICAgICAgICB3aXRoIHVuaW9uIG9mIHdlaXJkIHR5cGVzLiBJdGVtIHNob3VsZCBiZSBhbiBvYmplY3QgaW4gbW9zdCBjYXNlcy4uLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGlzUHJpbWl0aXZlVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcHVibGljIGlzT3V0bGluZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJlYWRvbmx5IG9wZW5lZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJlYWRvbmx5IGNsb3NlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuLnZhbHVlLmlzT3BlbjtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NldENvbXBvbmVudChjb21wb25lbnQ6IFRLZW5kb0NvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZW1pdENoYW5nZWQodmFsdWU6IFRWYWx1ZSk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgX3Jlc2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc1ZhbHVlQ2hhbmdlZDogYm9vbGVhbiA9IHRoaXMuaGFzVmFsdWVDaGFuZ2VkKHRoaXMuZGVmYXVsdFZhbHVlKTtcblxuICAgIGlmIChoYXNWYWx1ZUNoYW5nZWQpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnJlc2V0KHRoaXMuZGVmYXVsdFZhbHVlKTtcbiAgICAgIHRoaXMudmFsdWVGb3JtQ29udHJvbC5yZXNldCh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB0aGlzLl9jb21wb25lbnQucmVzZXQoKTtcbiAgICAgIHRoaXMuX2VtaXRDaGFuZ2VkKHRoaXMuZGVmYXVsdFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgIHRoaXMudmFsdWVGb3JtQ29udHJvbC5yZXNldCh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB0aGlzLl9jb21wb25lbnQucmVzZXQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9vYnNlcnZlci5saXN0ZW4odGhpcy5faXNEaXNhYmxlZCwgKGlzRGlzYWJsZWQpID0+IHtcbiAgICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICAgIHRoaXMudmFsdWVGb3JtQ29udHJvbC5kaXNhYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlRm9ybUNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb3BlbihzaG91bGRFbWl0RXZlbnQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy5fY29tcG9uZW50LnRvZ2dsZSh0cnVlKTtcbiAgICB0aGlzLl9pc09wZW4ubmV4dCh7aXNPcGVuOiB0cnVlLCBzaG91bGRFbWl0OiBzaG91bGRFbWl0RXZlbnR9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZShzaG91bGRFbWl0RXZlbnQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy5fY29tcG9uZW50LnRvZ2dsZShmYWxzZSk7XG4gICAgdGhpcy5faXNPcGVuLm5leHQoe2lzT3BlbjogZmFsc2UsIHNob3VsZEVtaXQ6IHNob3VsZEVtaXRFdmVudH0pO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZShzaG91bGRFbWl0RXZlbnQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzT3Blbikge1xuICAgICAgdGhpcy5jbG9zZShzaG91bGRFbWl0RXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW4oc2hvdWxkRW1pdEV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fY29tcG9uZW50LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgYmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb21wb25lbnQuYmx1cigpO1xuICB9XG5cbiAgcHVibGljIG9uT3BlbmVkKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzT3Blbi5uZXh0KHtpc09wZW46IHRydWUsIHNob3VsZEVtaXQ6IHRydWV9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsb3NlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc09wZW4ubmV4dCh7aXNPcGVuOiBmYWxzZSwgc2hvdWxkRW1pdDogdHJ1ZX0pO1xuICB9XG5cbiAgcHVibGljIG9uRm9jdXNlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWQuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIG9uQmx1cnJlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmJsdXJyZWQuZW1pdChcbiAgICAgIG5ldyBDb250cm9sQmx1cnJlZEV2ZW50PFRWYWx1ZT4oXG4gICAgICAgIHRoaXMudmFsdWUsXG4gICAgICAgIHRoaXMuX3Jlc2V0ZWRWYWx1ZSB8fCB0aGlzLl9mb2N1c2VkVmFsdWUsXG4gICAgICAgIHRoaXMuaGFzVmFsdWVDaGFuZ2VkKHRoaXMuX3Jlc2V0ZWRWYWx1ZSB8fCB0aGlzLl9mb2N1c2VkVmFsdWUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLl9yZXNldGVkVmFsdWUgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlZCh2YWx1ZTogVFZhbHVlKTogdm9pZCB7XG4gICAgdmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2VkKHZhbHVlKTtcbiAgICB0aGlzLnByb3BhZ2F0ZVRvdWNoZWQoKTtcbiAgICB0aGlzLl9lbWl0Q2hhbmdlZCh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25SZXNldENsaWNrZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc1Jlc2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzZXRlZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB0aGlzLmZvY3VzKCk7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgICB0aGlzLm9wZW4oKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSB3cml0ZVZhbHVlKHZhbHVlOiBUVmFsdWUpOiB2b2lkIHtcbiAgICAvLyBDU1MgY2xhc3MgQEhvc3RCaW5kaW5ncyBhcmVuJ3QgdXBkYXRlZCB3aXRoIE9uUHVzaCBjaGFuZ2UgZGV0ZWN0aW9uIHN0cmF0ZWd5LFxuICAgIC8vIGFuZCBhcmUgdG8gYmUgbWFya2VkIGZvciBjaGVjay5cbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnZhbHVlRm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHN1cGVyLnNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCk7XG4gICAgLy8gTWFyayBoYXNJc0Rpc2FibGVkQ3NzQ2xhc3MgQEhvc3RCaW5kaW5nIGZvciBjaGVjay5cbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIl19