@recursyve/ngx-material-components 18.0.0-beta.0
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.
- package/esm2022/index.mjs +14 -0
- package/esm2022/recursyve-ngx-material-components.mjs +5 -0
- package/esm2022/typeahead/async-typeahead.mjs +112 -0
- package/esm2022/typeahead/constants.mjs +3 -0
- package/esm2022/typeahead/index.mjs +5 -0
- package/esm2022/typeahead/provider.mjs +9 -0
- package/esm2022/typeahead/providers/async-typeahead.provider.mjs +3 -0
- package/esm2022/typeahead/providers/async-typeahead.service.mjs +129 -0
- package/esm2022/typeahead/providers/index.mjs +3 -0
- package/esm2022/typeahead/recursyve-ngx-material-components-typeahead.mjs +5 -0
- package/esm2022/typeahead/typeahead-base.mjs +456 -0
- package/esm2022/typeahead/typeahead.mjs +79 -0
- package/fesm2022/recursyve-ngx-material-components-typeahead.mjs +772 -0
- package/fesm2022/recursyve-ngx-material-components-typeahead.mjs.map +1 -0
- package/fesm2022/recursyve-ngx-material-components.mjs +20 -0
- package/fesm2022/recursyve-ngx-material-components.mjs.map +1 -0
- package/index.d.ts +8 -0
- package/package.json +31 -0
- package/typeahead/async-typeahead.d.ts +23 -0
- package/typeahead/constants.d.ts +2 -0
- package/typeahead/index.d.ts +4 -0
- package/typeahead/provider.d.ts +3 -0
- package/typeahead/providers/async-typeahead.provider.d.ts +11 -0
- package/typeahead/providers/async-typeahead.service.d.ts +39 -0
- package/typeahead/providers/index.d.ts +2 -0
- package/typeahead/typeahead-base.d.ts +99 -0
- package/typeahead/typeahead.d.ts +12 -0
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
import { ActiveDescendantKeyManager } from "@angular/cdk/a11y";
|
|
2
|
+
import { SelectionModel } from "@angular/cdk/collections";
|
|
3
|
+
import { DOWN_ARROW, ENTER, hasModifierKey, LEFT_ARROW, RIGHT_ARROW, SPACE, UP_ARROW } from "@angular/cdk/keycodes";
|
|
4
|
+
import { CdkConnectedOverlay, CdkOverlayOrigin } from "@angular/cdk/overlay";
|
|
5
|
+
import { ChangeDetectorRef, computed, DestroyRef, Directive, effect, ElementRef, inject, input, signal, viewChild, ViewChildren } from "@angular/core";
|
|
6
|
+
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
|
|
7
|
+
import { FormBuilder, NgControl } from "@angular/forms";
|
|
8
|
+
import { _getOptionScrollPosition, MatOption } from "@angular/material/core";
|
|
9
|
+
import { MAT_FORM_FIELD } from "@angular/material/form-field";
|
|
10
|
+
import { debounceTime, defer, distinctUntilChanged, merge, startWith, Subject, switchMap, take, takeUntil } from "rxjs";
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
/**
|
|
13
|
+
* Implementation of the same panel and overlay logic as the official Angular MatSelect.
|
|
14
|
+
* This used some of the logic from MatSelect to make this component look and feel like a MatSelect.
|
|
15
|
+
*/
|
|
16
|
+
export class NiceTypeaheadBase {
|
|
17
|
+
options;
|
|
18
|
+
labelProperty = input();
|
|
19
|
+
formatLabelFn = input();
|
|
20
|
+
static nextId = 0;
|
|
21
|
+
_input = viewChild("input");
|
|
22
|
+
_panel = viewChild("panel");
|
|
23
|
+
_overlayDir = viewChild(CdkConnectedOverlay);
|
|
24
|
+
_focused = false;
|
|
25
|
+
_required = false;
|
|
26
|
+
_disabled = false;
|
|
27
|
+
_panelOpen = false;
|
|
28
|
+
_compareWith = (o1, o2) => o1 === o2;
|
|
29
|
+
_value = signal(null);
|
|
30
|
+
_empty = computed(() => !this._value());
|
|
31
|
+
_placeholder = signal("");
|
|
32
|
+
_searchValue = signal("");
|
|
33
|
+
_elementRef = inject(ElementRef);
|
|
34
|
+
_destroyRef = inject(DestroyRef);
|
|
35
|
+
_changeDetectorRef = inject(ChangeDetectorRef);
|
|
36
|
+
_fb = inject(FormBuilder);
|
|
37
|
+
_searchControl = this._fb.nonNullable.control("");
|
|
38
|
+
_initialized = new Subject();
|
|
39
|
+
_parentFormField = inject(MAT_FORM_FIELD, { optional: true });
|
|
40
|
+
id = `nice-typeahead-${NiceTypeaheadBase.nextId++}`;
|
|
41
|
+
controlType = "nice-typeahead";
|
|
42
|
+
stateChanges = new Subject();
|
|
43
|
+
optionSelectionChanges = defer(() => {
|
|
44
|
+
const options = this.options;
|
|
45
|
+
if (options) {
|
|
46
|
+
return options.changes.pipe(startWith(options), switchMap(() => merge(...options.map(option => option.onSelectionChange))));
|
|
47
|
+
}
|
|
48
|
+
return this._initialized.pipe(switchMap(() => this.optionSelectionChanges));
|
|
49
|
+
});
|
|
50
|
+
ngControl = inject(NgControl, { optional: true, self: true });
|
|
51
|
+
_panelDoneAnimatingStream = new Subject();
|
|
52
|
+
_keyManager;
|
|
53
|
+
_preferredOverlayOrigin;
|
|
54
|
+
_overlayWidth;
|
|
55
|
+
_selectionModel;
|
|
56
|
+
_onChange;
|
|
57
|
+
_onTouch;
|
|
58
|
+
get placeholder() {
|
|
59
|
+
return this._placeholder();
|
|
60
|
+
}
|
|
61
|
+
set placeholder(placeholder) {
|
|
62
|
+
this._placeholder.set(placeholder);
|
|
63
|
+
this.stateChanges.next();
|
|
64
|
+
}
|
|
65
|
+
get focused() {
|
|
66
|
+
return this._focused;
|
|
67
|
+
}
|
|
68
|
+
set focused(isFocused) {
|
|
69
|
+
this._focused = isFocused;
|
|
70
|
+
this.stateChanges.next();
|
|
71
|
+
}
|
|
72
|
+
get required() {
|
|
73
|
+
return this._required;
|
|
74
|
+
}
|
|
75
|
+
set required(isRequired) {
|
|
76
|
+
this._required = isRequired;
|
|
77
|
+
this.stateChanges.next();
|
|
78
|
+
}
|
|
79
|
+
get disabled() {
|
|
80
|
+
return this._disabled;
|
|
81
|
+
}
|
|
82
|
+
set disabled(value) {
|
|
83
|
+
this._disabled = value;
|
|
84
|
+
this.stateChanges.next();
|
|
85
|
+
}
|
|
86
|
+
get value() {
|
|
87
|
+
return this._value();
|
|
88
|
+
}
|
|
89
|
+
set value(value) {
|
|
90
|
+
const hasAssigned = this._assignValue(value);
|
|
91
|
+
if (hasAssigned) {
|
|
92
|
+
this._onChange?.(value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
get empty() {
|
|
96
|
+
return !this._value();
|
|
97
|
+
}
|
|
98
|
+
get shouldLabelFloat() {
|
|
99
|
+
return this.focused || !this.empty;
|
|
100
|
+
}
|
|
101
|
+
get errorState() {
|
|
102
|
+
return false; // Implement error state logic as needed
|
|
103
|
+
}
|
|
104
|
+
get panelOpen() {
|
|
105
|
+
return this._panelOpen;
|
|
106
|
+
}
|
|
107
|
+
constructor() {
|
|
108
|
+
effect(() => {
|
|
109
|
+
this._input()?.nativeElement.focus();
|
|
110
|
+
});
|
|
111
|
+
if (this.ngControl) {
|
|
112
|
+
// Note: we provide the value accessor through here, instead of
|
|
113
|
+
// the `providers` to avoid running into a circular import.
|
|
114
|
+
this.ngControl.valueAccessor = this;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
ngOnInit() {
|
|
118
|
+
this._selectionModel = new SelectionModel();
|
|
119
|
+
this._searchControl.valueChanges.pipe(takeUntilDestroyed(this._destroyRef), debounceTime(250), distinctUntilChanged()).subscribe((value) => this._searchValue.set(value));
|
|
120
|
+
}
|
|
121
|
+
ngAfterViewInit() {
|
|
122
|
+
this._initialized.next();
|
|
123
|
+
this._initialized.complete();
|
|
124
|
+
this._initKeyManager();
|
|
125
|
+
this.options.changes.pipe(startWith(null), takeUntilDestroyed(this._destroyRef)).subscribe(() => {
|
|
126
|
+
this._resetOptions();
|
|
127
|
+
this._initializeSelection();
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
ngOnDestroy() {
|
|
131
|
+
this.stateChanges.complete();
|
|
132
|
+
}
|
|
133
|
+
onContainerClick(event) {
|
|
134
|
+
if (this.disabled) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
this.stateChanges.next();
|
|
138
|
+
if (event.target.tagName.toLowerCase() !== "input") {
|
|
139
|
+
this.onFocusChanged(true);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
setDescribedByIds(ids) {
|
|
143
|
+
const controlElement = this._elementRef.nativeElement.querySelector(".nice-typeahead");
|
|
144
|
+
if (!controlElement) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
controlElement.setAttribute("aria-describedby", ids.join(" "));
|
|
148
|
+
}
|
|
149
|
+
onFocusChanged(isFocused) {
|
|
150
|
+
this.focused = isFocused;
|
|
151
|
+
this.stateChanges.next();
|
|
152
|
+
if (isFocused) {
|
|
153
|
+
this.open();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
writeValue(value) {
|
|
157
|
+
this._assignValue(value);
|
|
158
|
+
}
|
|
159
|
+
registerOnChange(fn) {
|
|
160
|
+
this._onChange = fn;
|
|
161
|
+
}
|
|
162
|
+
registerOnTouched(fn) {
|
|
163
|
+
this._onTouch = fn;
|
|
164
|
+
}
|
|
165
|
+
formatLabel(item) {
|
|
166
|
+
if (typeof item === "string") {
|
|
167
|
+
return item;
|
|
168
|
+
}
|
|
169
|
+
const fn = this.formatLabelFn();
|
|
170
|
+
if (fn) {
|
|
171
|
+
return fn(item);
|
|
172
|
+
}
|
|
173
|
+
const property = this.labelProperty();
|
|
174
|
+
if (!property) {
|
|
175
|
+
return item?.toString() ?? "";
|
|
176
|
+
}
|
|
177
|
+
if (!(typeof item === "object") || item === null) {
|
|
178
|
+
return item?.toString() ?? "";
|
|
179
|
+
}
|
|
180
|
+
if (property in item) {
|
|
181
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
182
|
+
// @ts-ignore
|
|
183
|
+
return item[property];
|
|
184
|
+
}
|
|
185
|
+
return item.toString();
|
|
186
|
+
}
|
|
187
|
+
removeActiveValue() {
|
|
188
|
+
this.value = null;
|
|
189
|
+
this._selectionModel.clear();
|
|
190
|
+
this._keyManager.setActiveItem(-1);
|
|
191
|
+
this._changeDetectorRef.markForCheck();
|
|
192
|
+
}
|
|
193
|
+
open() {
|
|
194
|
+
if (!this._canOpen()) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// It's important that we read this as late as possible, because doing so earlier will
|
|
198
|
+
// return a different element since it's based on queries in the form field which may
|
|
199
|
+
// not have run yet. Also this needs to be assigned before we measure the overlay width.
|
|
200
|
+
if (this._parentFormField) {
|
|
201
|
+
this._preferredOverlayOrigin = this._parentFormField.getConnectedOverlayOrigin();
|
|
202
|
+
}
|
|
203
|
+
this._overlayWidth = this._getOverlayWidth(this._preferredOverlayOrigin);
|
|
204
|
+
this._panelOpen = true;
|
|
205
|
+
this._keyManager.withHorizontalOrientation(null);
|
|
206
|
+
this._changeDetectorRef.markForCheck();
|
|
207
|
+
// Required for the MDC form field to pick up when the overlay has been opened.
|
|
208
|
+
this.stateChanges.next();
|
|
209
|
+
}
|
|
210
|
+
close() {
|
|
211
|
+
if (!this._panelOpen) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
this._focused = false;
|
|
215
|
+
this._panelOpen = false;
|
|
216
|
+
this._changeDetectorRef.markForCheck();
|
|
217
|
+
this._searchValue.set("");
|
|
218
|
+
// Required for the MDC form field to pick up when the overlay has been closed.
|
|
219
|
+
this.stateChanges.next();
|
|
220
|
+
}
|
|
221
|
+
focus(options) {
|
|
222
|
+
this._elementRef.nativeElement.focus(options);
|
|
223
|
+
}
|
|
224
|
+
_handleKeydown(event) {
|
|
225
|
+
if (this.disabled) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (this.panelOpen) {
|
|
229
|
+
this._handleOpenKeydown(event);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
this._handleClosedKeydown(event);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
_handleScrollEnd() {
|
|
236
|
+
console.log("scroll end");
|
|
237
|
+
}
|
|
238
|
+
_canOpen() {
|
|
239
|
+
return !this._panelOpen && !this.disabled;
|
|
240
|
+
}
|
|
241
|
+
_onAttached() {
|
|
242
|
+
this._overlayDir()?.positionChange.pipe(take(1)).subscribe(() => {
|
|
243
|
+
this._changeDetectorRef.detectChanges();
|
|
244
|
+
this._positioningSettled();
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
_initKeyManager() {
|
|
248
|
+
this._keyManager = new ActiveDescendantKeyManager(this.options)
|
|
249
|
+
.withVerticalOrientation()
|
|
250
|
+
.withHomeAndEnd()
|
|
251
|
+
.withPageUpDown()
|
|
252
|
+
.withAllowedModifierKeys(["shiftKey"])
|
|
253
|
+
.skipPredicate(this._skipPredicate);
|
|
254
|
+
this._keyManager.tabOut.subscribe(() => {
|
|
255
|
+
if (this.panelOpen) {
|
|
256
|
+
if (this._keyManager.activeItem) {
|
|
257
|
+
this._keyManager.activeItem._selectViaInteraction();
|
|
258
|
+
}
|
|
259
|
+
this.focus();
|
|
260
|
+
this.close();
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
this._keyManager.change.subscribe(() => {
|
|
264
|
+
if (this._panelOpen && this._panel()) {
|
|
265
|
+
this._scrollOptionIntoView(this._keyManager.activeItemIndex || 0);
|
|
266
|
+
}
|
|
267
|
+
else if (!this._panelOpen && this._keyManager.activeItem) {
|
|
268
|
+
this._keyManager.activeItem._selectViaInteraction();
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
_getOverlayWidth(preferredOrigin) {
|
|
273
|
+
const refToMeasure = preferredOrigin instanceof CdkOverlayOrigin
|
|
274
|
+
? preferredOrigin.elementRef
|
|
275
|
+
: preferredOrigin || this._elementRef;
|
|
276
|
+
return refToMeasure.nativeElement.getBoundingClientRect().width;
|
|
277
|
+
}
|
|
278
|
+
_skipPredicate = (option) => {
|
|
279
|
+
if (this.panelOpen) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
return option.disabled;
|
|
283
|
+
};
|
|
284
|
+
_positioningSettled() {
|
|
285
|
+
this._scrollOptionIntoView(this._keyManager.activeItemIndex || 0);
|
|
286
|
+
}
|
|
287
|
+
_scrollOptionIntoView(index) {
|
|
288
|
+
const option = this.options.toArray()[index];
|
|
289
|
+
if (!option) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
const panel = this._panel()?.nativeElement;
|
|
293
|
+
if (!panel) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const element = option._getHostElement();
|
|
297
|
+
if (index === 0) {
|
|
298
|
+
// If we've got one group label before the option and we're at the top option,
|
|
299
|
+
// scroll the list to the top. This is better UX than scrolling the list to the
|
|
300
|
+
// top of the option, because it allows the user to read the top group's label.
|
|
301
|
+
panel.scrollTop = 0;
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
panel.scrollTop = _getOptionScrollPosition(element.offsetTop, element.offsetHeight, panel.scrollTop, panel.offsetHeight);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
_resetOptions() {
|
|
308
|
+
this.optionSelectionChanges.pipe(takeUntil(this.options.changes), takeUntilDestroyed(this._destroyRef)).subscribe((event) => {
|
|
309
|
+
this._onSelect(event.source);
|
|
310
|
+
if (event.isUserInput && this._panelOpen) {
|
|
311
|
+
this.close();
|
|
312
|
+
this.focus();
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
_onSelect(option) {
|
|
317
|
+
this.value = option.value;
|
|
318
|
+
this._setSelectionByValue(option.value);
|
|
319
|
+
this._selectOptionByValue(option.value);
|
|
320
|
+
this.stateChanges.next();
|
|
321
|
+
}
|
|
322
|
+
_initializeSelection() {
|
|
323
|
+
// Defer setting the value in order to avoid the "Expression
|
|
324
|
+
// has changed after it was checked" errors from Angular.
|
|
325
|
+
Promise.resolve().then(() => {
|
|
326
|
+
if (this.ngControl) {
|
|
327
|
+
this._value.set(this.ngControl.value);
|
|
328
|
+
}
|
|
329
|
+
const _value = this.value;
|
|
330
|
+
if (_value) {
|
|
331
|
+
this._selectOptionByValue(_value);
|
|
332
|
+
}
|
|
333
|
+
this._setSelectionByValue(_value);
|
|
334
|
+
this._highlightCorrectOption();
|
|
335
|
+
this.stateChanges.next();
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
_setSelectionByValue(value) {
|
|
339
|
+
this.options.forEach(option => option.setInactiveStyles());
|
|
340
|
+
this._selectionModel.clear();
|
|
341
|
+
const correspondingOption = value ? this._selectOptionByValue(value) : null;
|
|
342
|
+
// Shift focus to the active item. Note that we shouldn't do this in multiple
|
|
343
|
+
// mode, because we don't know what option the user interacted with last.
|
|
344
|
+
if (correspondingOption) {
|
|
345
|
+
correspondingOption.select(false);
|
|
346
|
+
this._keyManager.updateActiveItem(correspondingOption);
|
|
347
|
+
}
|
|
348
|
+
else if (!this.panelOpen) {
|
|
349
|
+
// Otherwise reset the highlighted option. Note that we only want to do this while
|
|
350
|
+
// closed, because doing it while open can shift the user's focus unnecessarily.
|
|
351
|
+
this._keyManager.updateActiveItem(-1);
|
|
352
|
+
}
|
|
353
|
+
this._changeDetectorRef.markForCheck();
|
|
354
|
+
}
|
|
355
|
+
_selectOptionByValue(value) {
|
|
356
|
+
const correspondingOption = this.options.find((option) => {
|
|
357
|
+
// Skip options that are already in the model. This allows us to handle cases
|
|
358
|
+
// where the same primitive value is selected multiple times.
|
|
359
|
+
if (this._selectionModel.isSelected(option)) {
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
try {
|
|
363
|
+
// Treat null as a special reset value.
|
|
364
|
+
return option.value != null && this._compareWith(option.value, value);
|
|
365
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
if (correspondingOption) {
|
|
372
|
+
this._selectionModel.select(correspondingOption);
|
|
373
|
+
}
|
|
374
|
+
return correspondingOption;
|
|
375
|
+
}
|
|
376
|
+
_highlightCorrectOption() {
|
|
377
|
+
if (!this._keyManager) {
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
if (this.empty) {
|
|
381
|
+
// Find the index of the first *enabled* option. Avoid calling `_keyManager.setActiveItem`
|
|
382
|
+
// because it activates the first option that passes the skip predicate, rather than the
|
|
383
|
+
// first *enabled* option.
|
|
384
|
+
let firstEnabledOptionIndex = -1;
|
|
385
|
+
for (let index = 0; index < this.options.length; index++) {
|
|
386
|
+
const option = this.options.get(index);
|
|
387
|
+
if (!option.disabled) {
|
|
388
|
+
firstEnabledOptionIndex = index;
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
this._keyManager.setActiveItem(firstEnabledOptionIndex);
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
this._keyManager.setActiveItem(this._selectionModel.selected[0]);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
_handleClosedKeydown(event) {
|
|
399
|
+
const keyCode = event.keyCode;
|
|
400
|
+
const isArrowKey = keyCode === DOWN_ARROW ||
|
|
401
|
+
keyCode === UP_ARROW ||
|
|
402
|
+
keyCode === LEFT_ARROW ||
|
|
403
|
+
keyCode === RIGHT_ARROW;
|
|
404
|
+
const isOpenKey = keyCode === ENTER || keyCode === SPACE;
|
|
405
|
+
const manager = this._keyManager;
|
|
406
|
+
// Open the select on ALT + arrow key to match the native <select>
|
|
407
|
+
if ((!manager.isTyping() && isOpenKey && !hasModifierKey(event)) ||
|
|
408
|
+
(event.altKey && isArrowKey)) {
|
|
409
|
+
event.preventDefault(); // prevents the page from scrolling down when pressing space
|
|
410
|
+
this.open();
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
_handleOpenKeydown(event) {
|
|
414
|
+
const manager = this._keyManager;
|
|
415
|
+
const keyCode = event.keyCode;
|
|
416
|
+
const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
|
|
417
|
+
const isTyping = manager.isTyping();
|
|
418
|
+
if (isArrowKey && event.altKey) {
|
|
419
|
+
// Close the select on ALT + arrow key to match the native <select>
|
|
420
|
+
event.preventDefault();
|
|
421
|
+
this.close();
|
|
422
|
+
// Don't do anything in this case if the user is typing,
|
|
423
|
+
// because the typing sequence can include the space key.
|
|
424
|
+
}
|
|
425
|
+
else if (!isTyping &&
|
|
426
|
+
(keyCode === ENTER || keyCode === SPACE) &&
|
|
427
|
+
manager.activeItem &&
|
|
428
|
+
!hasModifierKey(event)) {
|
|
429
|
+
event.preventDefault();
|
|
430
|
+
manager.activeItem._selectViaInteraction();
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
manager.onKeydown(event);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
_assignValue(newValue) {
|
|
437
|
+
// Always re-assign an array, because it might have been mutated.
|
|
438
|
+
if (newValue !== this.value) {
|
|
439
|
+
if (this.options) {
|
|
440
|
+
this._setSelectionByValue(newValue);
|
|
441
|
+
}
|
|
442
|
+
this._value.set(newValue);
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
return false;
|
|
446
|
+
}
|
|
447
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NiceTypeaheadBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
448
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "18.2.13", type: NiceTypeaheadBase, inputs: { labelProperty: { classPropertyName: "labelProperty", publicName: "labelProperty", isSignal: true, isRequired: false, transformFunction: null }, formatLabelFn: { classPropertyName: "formatLabelFn", publicName: "formatLabelFn", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_input", first: true, predicate: ["input"], descendants: true, isSignal: true }, { propertyName: "_panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "_overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "options", predicate: MatOption, descendants: true }], ngImport: i0 });
|
|
449
|
+
}
|
|
450
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NiceTypeaheadBase, decorators: [{
|
|
451
|
+
type: Directive
|
|
452
|
+
}], ctorParameters: () => [], propDecorators: { options: [{
|
|
453
|
+
type: ViewChildren,
|
|
454
|
+
args: [MatOption]
|
|
455
|
+
}] } });
|
|
456
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWFoZWFkLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwtY29tcG9uZW50cy90eXBlYWhlYWQvdHlwZWFoZWFkLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RSxPQUFPLEVBRUgsaUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFJTCxNQUFNLEVBQ04sU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQXdCLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsU0FBUyxFQUE0QixNQUFNLHdCQUF3QixDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxjQUFjLEVBQXFDLE1BQU0sOEJBQThCLENBQUM7QUFDakcsT0FBTyxFQUNILFlBQVksRUFDWixLQUFLLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFFTCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNaLE1BQU0sTUFBTSxDQUFDOztBQUVkOzs7R0FHRztBQUVILE1BQU0sT0FBTyxp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Q0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixtRUFBbUU7WUFDbkUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLHdEQUF3RDtZQUN4RCx5REFBeUQ7UUFDN0QsQ0FBQzthQUFNLElBQ0gsQ0FBQyxRQUFRO1lBQ1QsQ0FBQyxPQUFPLEtBQUssS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLENBQUM7WUFDeEMsT0FBTyxDQUFDLFVBQVU7WUFDbEIsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQ3hCLENBQUM7WUFDQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9DLENBQUM7YUFBTSxDQUFDO1lBQ0osT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0wsQ0FBQztJQUVTLFlBQVksQ0FBQyxRQUFrQjtRQUNyQyxpRUFBaUU7UUFDakUsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7d0dBM2lCUSxpQkFBaUI7NEZBQWpCLGlCQUFpQix1akJBa0JpQixtQkFBbUIsNkVBVmhELFNBQVM7OzRGQVJkLGlCQUFpQjtrQkFEN0IsU0FBUzt3REFVVyxPQUFPO3NCQUR2QixZQUFZO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciB9IGZyb20gXCJAYW5ndWxhci9jZGsvYTExeVwiO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zXCI7XG5pbXBvcnQgeyBET1dOX0FSUk9XLCBFTlRFUiwgaGFzTW9kaWZpZXJLZXksIExFRlRfQVJST1csIFJJR0hUX0FSUk9XLCBTUEFDRSwgVVBfQVJST1cgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2tleWNvZGVzXCI7XG5pbXBvcnQgeyBDZGtDb25uZWN0ZWRPdmVybGF5LCBDZGtPdmVybGF5T3JpZ2luIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9vdmVybGF5XCI7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgY29tcHV0ZWQsXG4gICAgRGVzdHJveVJlZixcbiAgICBEaXJlY3RpdmUsXG4gICAgZWZmZWN0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIjtcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQnVpbGRlciwgTmdDb250cm9sIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBfZ2V0T3B0aW9uU2Nyb2xsUG9zaXRpb24sIE1hdE9wdGlvbiwgTWF0T3B0aW9uU2VsZWN0aW9uQ2hhbmdlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NvcmVcIjtcbmltcG9ydCB7IE1BVF9GT1JNX0ZJRUxELCBNYXRGb3JtRmllbGQsIE1hdEZvcm1GaWVsZENvbnRyb2wgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xuaW1wb3J0IHtcbiAgICBkZWJvdW5jZVRpbWUsXG4gICAgZGVmZXIsXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gICAgbWVyZ2UsXG4gICAgT2JzZXJ2YWJsZSxcbiAgICBzdGFydFdpdGgsXG4gICAgU3ViamVjdCxcbiAgICBzd2l0Y2hNYXAsXG4gICAgdGFrZSxcbiAgICB0YWtlVW50aWxcbn0gZnJvbSBcInJ4anNcIjtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2FtZSBwYW5lbCBhbmQgb3ZlcmxheSBsb2dpYyBhcyB0aGUgb2ZmaWNpYWwgQW5ndWxhciBNYXRTZWxlY3QuXG4gKiBUaGlzIHVzZWQgc29tZSBvZiB0aGUgbG9naWMgZnJvbSBNYXRTZWxlY3QgdG8gbWFrZSB0aGlzIGNvbXBvbmVudCBsb29rIGFuZCBmZWVsIGxpa2UgYSBNYXRTZWxlY3QuXG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIE5pY2VUeXBlYWhlYWRCYXNlPFQ+XG4gICAgaW1wbGVtZW50c1xuICAgICAgICBNYXRGb3JtRmllbGRDb250cm9sPFQ+LFxuICAgICAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICAgICAgT25Jbml0LFxuICAgICAgICBBZnRlclZpZXdJbml0LFxuICAgICAgICBPbkRlc3Ryb3lcbntcbiAgICBAVmlld0NoaWxkcmVuKE1hdE9wdGlvbilcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnMhOiBRdWVyeUxpc3Q8TWF0T3B0aW9uPjtcblxuICAgIHB1YmxpYyByZWFkb25seSBsYWJlbFByb3BlcnR5ID0gaW5wdXQ8c3RyaW5nPigpO1xuICAgIHB1YmxpYyByZWFkb25seSBmb3JtYXRMYWJlbEZuID0gaW5wdXQ8KCh2YWx1ZTogVCkgPT4gc3RyaW5nKT4oKTtcblxuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2lucHV0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KFwiaW5wdXRcIik7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wYW5lbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oXCJwYW5lbFwiKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX292ZXJsYXlEaXIgPSB2aWV3Q2hpbGQoQ2RrQ29ubmVjdGVkT3ZlcmxheSk7XG5cbiAgICBwcm90ZWN0ZWQgX2ZvY3VzZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX3JlcXVpcmVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfcGFuZWxPcGVuID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9jb21wYXJlV2l0aCA9IChvMTogVCwgbzI6IFQpID0+IG8xID09PSBvMjtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfdmFsdWUgPSBzaWduYWw8VCB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZW1wdHkgPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5fdmFsdWUoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wbGFjZWhvbGRlciA9IHNpZ25hbChcIlwiKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3NlYXJjaFZhbHVlID0gc2lnbmFsKFwiXCIpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9lbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2ZiID0gaW5qZWN0KEZvcm1CdWlsZGVyKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfc2VhcmNoQ29udHJvbCA9IHRoaXMuX2ZiLm5vbk51bGxhYmxlLmNvbnRyb2woXCJcIik7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9pbml0aWFsaXplZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3BhcmVudEZvcm1GaWVsZCA9IGluamVjdDxNYXRGb3JtRmllbGQ+KE1BVF9GT1JNX0ZJRUxELCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmcgPSBgbmljZS10eXBlYWhlYWQtJHtOaWNlVHlwZWFoZWFkQmFzZS5uZXh0SWQrK31gO1xuICAgIHB1YmxpYyByZWFkb25seSBjb250cm9sVHlwZTogc3RyaW5nID0gXCJuaWNlLXR5cGVhaGVhZFwiO1xuICAgIHB1YmxpYyByZWFkb25seSBzdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25TZWxlY3Rpb25DaGFuZ2VzOiBPYnNlcnZhYmxlPE1hdE9wdGlvblNlbGVjdGlvbkNoYW5nZT4gPSBkZWZlcigoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgob3B0aW9ucyksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IG1lcmdlKC4uLm9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24ub25TZWxlY3Rpb25DaGFuZ2UpKSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkLnBpcGUoc3dpdGNoTWFwKCgpID0+IHRoaXMub3B0aW9uU2VsZWN0aW9uQ2hhbmdlcykpO1xuICAgIH0pO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IG5nQ29udHJvbCA9IGluamVjdChOZ0NvbnRyb2wsIHsgb3B0aW9uYWw6IHRydWUsIHNlbGY6IHRydWUgfSk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgX3BhbmVsRG9uZUFuaW1hdGluZ1N0cmVhbSA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAgIHB1YmxpYyBfa2V5TWFuYWdlciE6IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyPE1hdE9wdGlvbj47XG4gICAgcHVibGljIF9wcmVmZXJyZWRPdmVybGF5T3JpZ2luPzogQ2RrT3ZlcmxheU9yaWdpbiB8IEVsZW1lbnRSZWY7XG4gICAgcHVibGljIF9vdmVybGF5V2lkdGghOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgcHVibGljIF9zZWxlY3Rpb25Nb2RlbCE6IFNlbGVjdGlvbk1vZGVsPE1hdE9wdGlvbj47XG4gICAgcHVibGljIF9vbkNoYW5nZT86ICh2YWx1ZTogVCB8IG51bGwpID0+IHZvaWQ7XG4gICAgcHVibGljIF9vblRvdWNoPzogKCkgPT4gdm9pZDtcblxuICAgIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwbGFjZWhvbGRlcihwbGFjZWhvbGRlcikge1xuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlci5zZXQocGxhY2Vob2xkZXIpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9jdXNlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZvY3VzZWQoaXNGb2N1c2VkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzZWQgPSBpc0ZvY3VzZWQ7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByZXF1aXJlZChpc1JlcXVpcmVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3JlcXVpcmVkID0gaXNSZXF1aXJlZDtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IFQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICAgICAgY29uc3QgaGFzQXNzaWduZWQgPSB0aGlzLl9hc3NpZ25WYWx1ZSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGhhc0Fzc2lnbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZT8uKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fdmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNob3VsZExhYmVsRmxvYXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvY3VzZWQgfHwgIXRoaXMuZW1wdHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlcnJvclN0YXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEltcGxlbWVudCBlcnJvciBzdGF0ZSBsb2dpYyBhcyBuZWVkZWRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhbmVsT3BlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhbmVsT3BlbjtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2lucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICAgICAgICAvLyBOb3RlOiB3ZSBwcm92aWRlIHRoZSB2YWx1ZSBhY2Nlc3NvciB0aHJvdWdoIGhlcmUsIGluc3RlYWQgb2ZcbiAgICAgICAgICAgIC8vIHRoZSBgcHJvdmlkZXJzYCB0byBhdm9pZCBydW5uaW5nIGludG8gYSBjaXJjdWxhciBpbXBvcnQuXG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8TWF0T3B0aW9uPigpO1xuXG4gICAgICAgIHRoaXMuX3NlYXJjaENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLl9zZWFyY2hWYWx1ZS5zZXQodmFsdWUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplZC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkLmNvbXBsZXRlKCk7XG5cbiAgICAgICAgdGhpcy5faW5pdEtleU1hbmFnZXIoKTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aChudWxsKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXRPcHRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplU2VsZWN0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Db250YWluZXJDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgICAgICBpZiAoKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgdGhpcy5vbkZvY3VzQ2hhbmdlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZXNjcmliZWRCeUlkcyhpZHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubmljZS10eXBlYWhlYWRcIik7XG4gICAgICAgIGlmICghY29udHJvbEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRyb2xFbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIiwgaWRzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Gb2N1c0NoYW5nZWQoaXNGb2N1c2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGlzRm9jdXNlZDtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuXG4gICAgICAgIGlmIChpc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYXNzaWduVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IFQgfCBudWxsKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2ggPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0TGFiZWwoaXRlbTogVCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmbiA9IHRoaXMuZm9ybWF0TGFiZWxGbigpO1xuICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgIHJldHVybiBmbihpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5sYWJlbFByb3BlcnR5KCk7XG4gICAgICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtPy50b1N0cmluZygpID8/IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISh0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIikgfHwgaXRlbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0/LnRvU3RyaW5nKCkgPz8gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eSBpbiBpdGVtKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gaXRlbVtwcm9wZXJ0eV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVBY3RpdmVWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSgtMSk7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2Nhbk9wZW4oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdGhhdCB3ZSByZWFkIHRoaXMgYXMgbGF0ZSBhcyBwb3NzaWJsZSwgYmVjYXVzZSBkb2luZyBzbyBlYXJsaWVyIHdpbGxcbiAgICAgICAgLy8gcmV0dXJuIGEgZGlmZmVyZW50IGVsZW1lbnQgc2luY2UgaXQncyBiYXNlZCBvbiBxdWVyaWVzIGluIHRoZSBmb3JtIGZpZWxkIHdoaWNoIG1heVxuICAgICAgICAvLyBub3QgaGF2ZSBydW4geWV0LiBBbHNvIHRoaXMgbmVlZHMgdG8gYmUgYXNzaWduZWQgYmVmb3JlIHdlIG1lYXN1cmUgdGhlIG92ZXJsYXkgd2lkdGguXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnRGb3JtRmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZWZlcnJlZE92ZXJsYXlPcmlnaW4gPSB0aGlzLl9wYXJlbnRGb3JtRmllbGQuZ2V0Q29ubmVjdGVkT3ZlcmxheU9yaWdpbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb3ZlcmxheVdpZHRoID0gdGhpcy5fZ2V0T3ZlcmxheVdpZHRoKHRoaXMuX3ByZWZlcnJlZE92ZXJsYXlPcmlnaW4pO1xuICAgICAgICB0aGlzLl9wYW5lbE9wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24obnVsbCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVkIGZvciB0aGUgTURDIGZvcm0gZmllbGQgdG8gcGljayB1cCB3aGVuIHRoZSBvdmVybGF5IGhhcyBiZWVuIG9wZW5lZC5cbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9wYW5lbE9wZW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcGFuZWxPcGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIHRoaXMuX3NlYXJjaFZhbHVlLnNldChcIlwiKTtcblxuICAgICAgICAvLyBSZXF1aXJlZCBmb3IgdGhlIE1EQyBmb3JtIGZpZWxkIHRvIHBpY2sgdXAgd2hlbiB0aGUgb3ZlcmxheSBoYXMgYmVlbiBjbG9zZWQuXG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9jdXMob3B0aW9ucz86IEZvY3VzT3B0aW9ucyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIF9oYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZU9wZW5LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUNsb3NlZEtleWRvd24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIF9oYW5kbGVTY3JvbGxFbmQoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwic2Nyb2xsIGVuZFwiKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY2FuT3BlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9wYW5lbE9wZW4gJiYgIXRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9vbkF0dGFjaGVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vdmVybGF5RGlyKCk/LnBvc2l0aW9uQ2hhbmdlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uaW5nU2V0dGxlZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2luaXRLZXlNYW5hZ2VyKCkge1xuICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyID0gbmV3IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyPE1hdE9wdGlvbj4odGhpcy5vcHRpb25zKVxuICAgICAgICAgICAgLndpdGhWZXJ0aWNhbE9yaWVudGF0aW9uKClcbiAgICAgICAgICAgIC53aXRoSG9tZUFuZEVuZCgpXG4gICAgICAgICAgICAud2l0aFBhZ2VVcERvd24oKVxuICAgICAgICAgICAgLndpdGhBbGxvd2VkTW9kaWZpZXJLZXlzKFtcInNoaWZ0S2V5XCJdKVxuICAgICAgICAgICAgLnNraXBQcmVkaWNhdGUodGhpcy5fc2tpcFByZWRpY2F0ZSk7XG5cbiAgICAgICAgdGhpcy5fa2V5TWFuYWdlci50YWJPdXQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhbmVsT3Blbikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2tleU1hbmFnZXIuY2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcGFuZWxPcGVuICYmIHRoaXMuX3BhbmVsKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxPcHRpb25JbnRvVmlldyh0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleCB8fCAwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3BhbmVsT3BlbiAmJiB0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0uX3NlbGVjdFZpYUludGVyYWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZ2V0T3ZlcmxheVdpZHRoKHByZWZlcnJlZE9yaWdpbj86IEVsZW1lbnRSZWY8RWxlbWVudFJlZj4gfCBDZGtPdmVybGF5T3JpZ2luKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcmVmVG9NZWFzdXJlID1cbiAgICAgICAgICAgIHByZWZlcnJlZE9yaWdpbiBpbnN0YW5jZW9mIENka092ZXJsYXlPcmlnaW5cbiAgICAgICAgICAgICAgICA/IHByZWZlcnJlZE9yaWdpbi5lbGVtZW50UmVmXG4gICAgICAgICAgICAgICAgOiBwcmVmZXJyZWRPcmlnaW4gfHwgdGhpcy5fZWxlbWVudFJlZjtcbiAgICAgICAgcmV0dXJuIHJlZlRvTWVhc3VyZS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfc2tpcFByZWRpY2F0ZSA9IChvcHRpb246IE1hdE9wdGlvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb24uZGlzYWJsZWQ7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfcG9zaXRpb25pbmdTZXR0bGVkKCkge1xuICAgICAgICB0aGlzLl9zY3JvbGxPcHRpb25JbnRvVmlldyh0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleCB8fCAwKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3Njcm9sbE9wdGlvbkludG9WaWV3KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5vcHRpb25zLnRvQXJyYXkoKVtpbmRleF07XG4gICAgICAgIGlmICghb3B0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMuX3BhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmICghcGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvcHRpb24uX2dldEhvc3RFbGVtZW50KCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gSWYgd2UndmUgZ290IG9uZSBncm91cCBsYWJlbCBiZWZvcmUgdGhlIG9wdGlvbiBhbmQgd2UncmUgYXQgdGhlIHRvcCBvcHRpb24sXG4gICAgICAgICAgICAvLyBzY3JvbGwgdGhlIGxpc3QgdG8gdGhlIHRvcC4gVGhpcyBpcyBiZXR0ZXIgVVggdGhhbiBzY3JvbGxpbmcgdGhlIGxpc3QgdG8gdGhlXG4gICAgICAgICAgICAvLyB0b3Agb2YgdGhlIG9wdGlvbiwgYmVjYXVzZSBpdCBhbGxvd3MgdGhlIHVzZXIgdG8gcmVhZCB0aGUgdG9wIGdyb3VwJ3MgbGFiZWwuXG4gICAgICAgICAgICBwYW5lbC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFuZWwuc2Nyb2xsVG9wID0gX2dldE9wdGlvblNjcm9sbFBvc2l0aW9uKFxuICAgICAgICAgICAgICAgIGVsZW1lbnQub2Zmc2V0VG9wLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQub2Zmc2V0SGVpZ2h0LFxuICAgICAgICAgICAgICAgIHBhbmVsLnNjcm9sbFRvcCxcbiAgICAgICAgICAgICAgICBwYW5lbC5vZmZzZXRIZWlnaHQsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9yZXNldE9wdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3B0aW9uU2VsZWN0aW9uQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMub3B0aW9ucy5jaGFuZ2VzKSxcbiAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKVxuICAgICAgICApLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uU2VsZWN0KGV2ZW50LnNvdXJjZSk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5pc1VzZXJJbnB1dCAmJiB0aGlzLl9wYW5lbE9wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX29uU2VsZWN0KG9wdGlvbjogTWF0T3B0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0T3B0aW9uQnlWYWx1ZShvcHRpb24udmFsdWUpO1xuXG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2luaXRpYWxpemVTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIC8vIERlZmVyIHNldHRpbmcgdGhlIHZhbHVlIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBcIkV4cHJlc3Npb25cbiAgICAgICAgLy8gaGFzIGNoYW5nZWQgYWZ0ZXIgaXQgd2FzIGNoZWNrZWRcIiBlcnJvcnMgZnJvbSBBbmd1bGFyLlxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlLnNldCh0aGlzLm5nQ29udHJvbC52YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IF92YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICBpZiAoX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0T3B0aW9uQnlWYWx1ZShfdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc2V0U2VsZWN0aW9uQnlWYWx1ZShfdmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLl9oaWdobGlnaHRDb3JyZWN0T3B0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfc2V0U2VsZWN0aW9uQnlWYWx1ZSh2YWx1ZTogVCB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IG9wdGlvbi5zZXRJbmFjdGl2ZVN0eWxlcygpKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcblxuICAgICAgICBjb25zdCBjb3JyZXNwb25kaW5nT3B0aW9uID0gdmFsdWUgPyB0aGlzLl9zZWxlY3RPcHRpb25CeVZhbHVlKHZhbHVlKSA6IG51bGw7XG5cbiAgICAgICAgLy8gU2hpZnQgZm9jdXMgdG8gdGhlIGFjdGl2ZSBpdGVtLiBOb3RlIHRoYXQgd2Ugc2hvdWxkbid0IGRvIHRoaXMgaW4gbXVsdGlwbGVcbiAgICAgICAgLy8gbW9kZSwgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgb3B0aW9uIHRoZSB1c2VyIGludGVyYWN0ZWQgd2l0aCBsYXN0LlxuICAgICAgICBpZiAoY29ycmVzcG9uZGluZ09wdGlvbikge1xuICAgICAgICAgICAgY29ycmVzcG9uZGluZ09wdGlvbi5zZWxlY3QoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci51cGRhdGVBY3RpdmVJdGVtKGNvcnJlc3BvbmRpbmdPcHRpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnBhbmVsT3Blbikge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHJlc2V0IHRoZSBoaWdobGlnaHRlZCBvcHRpb24uIE5vdGUgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyB3aGlsZVxuICAgICAgICAgICAgLy8gY2xvc2VkLCBiZWNhdXNlIGRvaW5nIGl0IHdoaWxlIG9wZW4gY2FuIHNoaWZ0IHRoZSB1c2VyJ3MgZm9jdXMgdW5uZWNlc3NhcmlseS5cbiAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbSgtMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cblxuICAgIHByb3RlY3RlZCBfc2VsZWN0T3B0aW9uQnlWYWx1ZSh2YWx1ZTogVCk6IE1hdE9wdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGNvcnJlc3BvbmRpbmdPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZCgob3B0aW9uOiBNYXRPcHRpb24pID0+IHtcbiAgICAgICAgICAgIC8vIFNraXAgb3B0aW9ucyB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBtb2RlbC4gVGhpcyBhbGxvd3MgdXMgdG8gaGFuZGxlIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVyZSB0aGUgc2FtZSBwcmltaXRpdmUgdmFsdWUgaXMgc2VsZWN0ZWQgbXVsdGlwbGUgdGltZXMuXG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFRyZWF0IG51bGwgYXMgYSBzcGVjaWFsIHJlc2V0IHZhbHVlLlxuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb24udmFsdWUgIT0gbnVsbCAmJiB0aGlzLl9jb21wYXJlV2l0aChvcHRpb24udmFsdWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvcnJlc3BvbmRpbmdPcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChjb3JyZXNwb25kaW5nT3B0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb3JyZXNwb25kaW5nT3B0aW9uO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfaGlnaGxpZ2h0Q29ycmVjdE9wdGlvbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9rZXlNYW5hZ2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5lbXB0eSkge1xuICAgICAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0ICplbmFibGVkKiBvcHRpb24uIEF2b2lkIGNhbGxpbmcgYF9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW1gXG4gICAgICAgICAgICAvLyBiZWNhdXNlIGl0IGFjdGl2YXRlcyB0aGUgZmlyc3Qgb3B0aW9uIHRoYXQgcGFzc2VzIHRoZSBza2lwIHByZWRpY2F0ZSwgcmF0aGVyIHRoYW4gdGhlXG4gICAgICAgICAgICAvLyBmaXJzdCAqZW5hYmxlZCogb3B0aW9uLlxuICAgICAgICAgICAgbGV0IGZpcnN0RW5hYmxlZE9wdGlvbkluZGV4ID0gLTE7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMub3B0aW9ucy5nZXQoaW5kZXgpITtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdEVuYWJsZWRPcHRpb25JbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShmaXJzdEVuYWJsZWRPcHRpb25JbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0odGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRbMF0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwcm90ZWN0ZWQgX2hhbmRsZUNsb3NlZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG4gICAgICAgIGNvbnN0IGlzQXJyb3dLZXkgPVxuICAgICAgICAgICAga2V5Q29kZSA9PT0gRE9XTl9BUlJPVyB8fFxuICAgICAgICAgICAga2V5Q29kZSA9PT0gVVBfQVJST1cgfHxcbiAgICAgICAgICAgIGtleUNvZGUgPT09IExFRlRfQVJST1cgfHxcbiAgICAgICAgICAgIGtleUNvZGUgPT09IFJJR0hUX0FSUk9XO1xuICAgICAgICBjb25zdCBpc09wZW5LZXkgPSBrZXlDb2RlID09PSBFTlRFUiB8fCBrZXlDb2RlID09PSBTUEFDRTtcbiAgICAgICAgY29uc3QgbWFuYWdlciA9IHRoaXMuX2tleU1hbmFnZXI7XG5cbiAgICAgICAgLy8gT3BlbiB0aGUgc2VsZWN0IG9uIEFMVCArIGFycm93IGtleSB0byBtYXRjaCB0aGUgbmF0aXZlIDxzZWxlY3Q+XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICghbWFuYWdlci5pc1R5cGluZygpICYmIGlzT3BlbktleSAmJiAhaGFzTW9kaWZpZXJLZXkoZXZlbnQpKSB8fFxuICAgICAgICAgICAgKGV2ZW50LmFsdEtleSAmJiBpc0Fycm93S2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHByZXZlbnRzIHRoZSBwYWdlIGZyb20gc2Nyb2xsaW5nIGRvd24gd2hlbiBwcmVzc2luZyBzcGFjZVxuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2hhbmRsZU9wZW5LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLl9rZXlNYW5hZ2VyO1xuICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgICAgICAgY29uc3QgaXNBcnJvd0tleSA9IGtleUNvZGUgPT09IERPV05fQVJST1cgfHwga2V5Q29kZSA9PT0gVVBfQVJST1c7XG4gICAgICAgIGNvbnN0IGlzVHlwaW5nID0gbWFuYWdlci5pc1R5cGluZygpO1xuXG4gICAgICAgIGlmIChpc0Fycm93S2V5ICYmIGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIHNlbGVjdCBvbiBBTFQgKyBhcnJvdyBrZXkgdG8gbWF0Y2ggdGhlIG5hdGl2ZSA8c2VsZWN0PlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGluIHRoaXMgY2FzZSBpZiB0aGUgdXNlciBpcyB0eXBpbmcsXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB0eXBpbmcgc2VxdWVuY2UgY2FuIGluY2x1ZGUgdGhlIHNwYWNlIGtleS5cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICFpc1R5cGluZyAmJlxuICAgICAgICAgICAgKGtleUNvZGUgPT09IEVOVEVSIHx8IGtleUNvZGUgPT09IFNQQUNFKSAmJlxuICAgICAgICAgICAgbWFuYWdlci5hY3RpdmVJdGVtICYmXG4gICAgICAgICAgICAhaGFzTW9kaWZpZXJLZXkoZXZlbnQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIG1hbmFnZXIuYWN0aXZlSXRlbS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfYXNzaWduVmFsdWUobmV3VmFsdWU6IFQgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIEFsd2F5cyByZS1hc3NpZ24gYW4gYXJyYXksIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBiZWVuIG11dGF0ZWQuXG4gICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUobmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl92YWx1ZS5zZXQobmV3VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiJdfQ==
|