@angular/material-experimental 14.0.0-rc.1 → 14.0.0-rc.2
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/esm2020/mdc-chips/chip-action.mjs +42 -76
- package/esm2020/mdc-chips/chip-grid.mjs +58 -69
- package/esm2020/mdc-chips/chip-icons.mjs +18 -32
- package/esm2020/mdc-chips/chip-input.mjs +2 -5
- package/esm2020/mdc-chips/chip-listbox.mjs +21 -63
- package/esm2020/mdc-chips/chip-option.mjs +36 -81
- package/esm2020/mdc-chips/chip-row.mjs +50 -74
- package/esm2020/mdc-chips/chip-set.mjs +116 -117
- package/esm2020/mdc-chips/chip.mjs +80 -165
- package/esm2020/mdc-chips/module.mjs +2 -2
- package/esm2020/mdc-chips/public-api.mjs +2 -2
- package/esm2020/mdc-chips/tokens.mjs +33 -0
- package/esm2020/mdc-list/list-base.mjs +1 -9
- package/esm2020/mdc-list/list-option.mjs +37 -19
- package/esm2020/mdc-list/selection-list.mjs +121 -121
- package/esm2020/version.mjs +1 -1
- package/fesm2015/material-experimental.mjs +1 -1
- package/fesm2015/material-experimental.mjs.map +1 -1
- package/fesm2015/mdc-chips.mjs +510 -766
- package/fesm2015/mdc-chips.mjs.map +1 -1
- package/fesm2015/mdc-list.mjs +158 -344
- package/fesm2015/mdc-list.mjs.map +1 -1
- package/fesm2020/material-experimental.mjs +1 -1
- package/fesm2020/material-experimental.mjs.map +1 -1
- package/fesm2020/mdc-chips.mjs +413 -672
- package/fesm2020/mdc-chips.mjs.map +1 -1
- package/fesm2020/mdc-list.mjs +157 -333
- package/fesm2020/mdc-list.mjs.map +1 -1
- package/mdc-chips/index.d.ts +102 -162
- package/mdc-list/index.d.ts +42 -66
- package/package.json +3 -3
- package/esm2020/mdc-chips/chip-default-options.mjs +0 -11
- package/esm2020/mdc-chips/emit-event.mjs +0 -27
- package/esm2020/mdc-list/interactive-list-base.mjs +0 -196
package/mdc-list/index.d.ts
CHANGED
|
@@ -13,8 +13,6 @@ import { InjectionToken } from '@angular/core';
|
|
|
13
13
|
import { MAT_LIST } from '@angular/material/list';
|
|
14
14
|
import { MAT_NAV_LIST } from '@angular/material/list';
|
|
15
15
|
import { MAT_SELECTION_LIST_VALUE_ACCESSOR } from '@angular/material/list';
|
|
16
|
-
import { MDCListAdapter } from '@material/list';
|
|
17
|
-
import { MDCListFoundation } from '@material/list';
|
|
18
16
|
import { NgZone } from '@angular/core';
|
|
19
17
|
import { OnChanges } from '@angular/core';
|
|
20
18
|
import { OnDestroy } from '@angular/core';
|
|
@@ -100,42 +98,6 @@ export declare class MatActionList extends MatListBase {
|
|
|
100
98
|
static ɵcmp: i0.ɵɵComponentDeclaration<MatActionList, "mat-action-list", ["matActionList"], {}, {}, never, ["*"], false>;
|
|
101
99
|
}
|
|
102
100
|
|
|
103
|
-
declare abstract class MatInteractiveListBase<T extends MatListItemBase> extends MatListBase implements AfterViewInit, OnDestroy {
|
|
104
|
-
_element: ElementRef<HTMLElement>;
|
|
105
|
-
_handleKeydown(event: KeyboardEvent): void;
|
|
106
|
-
_handleClick(event: MouseEvent): void;
|
|
107
|
-
_handleFocusin(event: FocusEvent): void;
|
|
108
|
-
_handleFocusout(event: FocusEvent): void;
|
|
109
|
-
/** Items in the interactive list. */
|
|
110
|
-
abstract _items: QueryList<T>;
|
|
111
|
-
_itemsArr: T[];
|
|
112
|
-
_document: Document;
|
|
113
|
-
protected _foundation: MDCListFoundation;
|
|
114
|
-
protected _adapter: MDCListAdapter;
|
|
115
|
-
private _subscriptions;
|
|
116
|
-
protected constructor(_element: ElementRef<HTMLElement>, document: any);
|
|
117
|
-
protected _initWithAdapter(adapter: MDCListAdapter): void;
|
|
118
|
-
ngAfterViewInit(): void;
|
|
119
|
-
ngOnDestroy(): void;
|
|
120
|
-
protected _watchListItems(): void;
|
|
121
|
-
/**
|
|
122
|
-
* Clears the tabindex of all items so that no items are reachable through tab key.
|
|
123
|
-
* MDC intends to always have only one tabbable item that will receive focus first.
|
|
124
|
-
* This first item is selected by MDC automatically on blur or by manually invoking
|
|
125
|
-
* the `setTabindexToFirstSelectedOrFocusedItem` method.
|
|
126
|
-
*/
|
|
127
|
-
private _clearTabindexForAllItems;
|
|
128
|
-
/**
|
|
129
|
-
* Resets tabindex for all options and sets tabindex for the first selected option or
|
|
130
|
-
* previously focused item so that an item can be reached when users tab into the list.
|
|
131
|
-
*/
|
|
132
|
-
protected _resetTabindexToFirstSelectedOrFocusedItem(): void;
|
|
133
|
-
_elementAtIndex(index: number): HTMLElement | undefined;
|
|
134
|
-
_indexForElement(element: Element | null): number;
|
|
135
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<MatInteractiveListBase<any>, never>;
|
|
136
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<MatInteractiveListBase<any>, never, never, {}, {}, never, never, false>;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
101
|
export declare class MatList extends MatListBase {
|
|
140
102
|
static ɵfac: i0.ɵɵFactoryDeclaration<MatList, never>;
|
|
141
103
|
static ɵcmp: i0.ɵɵComponentDeclaration<MatList, "mat-list", ["matList"], {}, {}, never, ["*"], false>;
|
|
@@ -235,11 +197,9 @@ declare abstract class MatListItemBase implements AfterViewInit, OnDestroy, Ripp
|
|
|
235
197
|
* @docs-private
|
|
236
198
|
*/
|
|
237
199
|
get rippleDisabled(): boolean;
|
|
238
|
-
|
|
200
|
+
constructor(_elementRef: ElementRef<HTMLElement>, _ngZone: NgZone, _listBase: MatListBase, _platform: Platform, globalRippleOptions?: RippleGlobalOptions, animationMode?: string);
|
|
239
201
|
ngAfterViewInit(): void;
|
|
240
202
|
ngOnDestroy(): void;
|
|
241
|
-
/** Gets the label for the list item. This is used for the typeahead. */
|
|
242
|
-
_getItemLabel(): string;
|
|
243
203
|
/** Whether the list item has icons or avatars. */
|
|
244
204
|
_hasIconOrAvatar(): boolean;
|
|
245
205
|
private _initInteractiveListItem;
|
|
@@ -345,12 +305,11 @@ export declare class MatListModule {
|
|
|
345
305
|
}
|
|
346
306
|
|
|
347
307
|
export declare class MatListOption extends MatListItemBase implements ListOption, OnInit, OnDestroy {
|
|
348
|
-
_selectionList
|
|
308
|
+
private _selectionList;
|
|
349
309
|
private _changeDetectorRef;
|
|
350
310
|
_lines: QueryList<MatListItemLine>;
|
|
351
311
|
_titles: QueryList<MatListItemTitle>;
|
|
352
312
|
_unscopedContent: ElementRef<HTMLSpanElement>;
|
|
353
|
-
_itemText: ElementRef<HTMLElement>;
|
|
354
313
|
/**
|
|
355
314
|
* Emits when the selected state of the option has changed.
|
|
356
315
|
* Use to facilitate two-data binding to the `selected` property.
|
|
@@ -376,13 +335,15 @@ export declare class MatListOption extends MatListItemBase implements ListOption
|
|
|
376
335
|
* clear the value of `selected` in the first cycle.
|
|
377
336
|
*/
|
|
378
337
|
private _inputsInitialized;
|
|
379
|
-
constructor(
|
|
338
|
+
constructor(elementRef: ElementRef<HTMLElement>, ngZone: NgZone, _selectionList: SelectionList, platform: Platform, _changeDetectorRef: ChangeDetectorRef, globalRippleOptions?: RippleGlobalOptions, animationMode?: string);
|
|
380
339
|
ngOnInit(): void;
|
|
381
340
|
ngOnDestroy(): void;
|
|
382
341
|
/** Toggles the selection state of the option. */
|
|
383
342
|
toggle(): void;
|
|
384
343
|
/** Allows for programmatic focusing of the option. */
|
|
385
344
|
focus(): void;
|
|
345
|
+
/** Gets the text label of the list option. Used for the typeahead functionality in the list. */
|
|
346
|
+
getLabel(): string;
|
|
386
347
|
/** Whether a checkbox is shown at the given position. */
|
|
387
348
|
_hasCheckboxAt(position: MatListOptionCheckboxPosition): boolean;
|
|
388
349
|
/** Whether icons or avatars are shown at the given position. */
|
|
@@ -403,6 +364,10 @@ export declare class MatListOption extends MatListItemBase implements ListOption
|
|
|
403
364
|
* list changed.
|
|
404
365
|
*/
|
|
405
366
|
_markForCheck(): void;
|
|
367
|
+
/** Toggles the option's value based on a user interacion. */
|
|
368
|
+
_toggleOnInteraction(): void;
|
|
369
|
+
/** Sets the tabindex of the list option. */
|
|
370
|
+
_setTabindex(value: number): void;
|
|
406
371
|
static ɵfac: i0.ɵɵFactoryDeclaration<MatListOption, [null, null, null, null, null, { optional: true; }, { optional: true; }]>;
|
|
407
372
|
static ɵcmp: i0.ɵɵComponentDeclaration<MatListOption, "mat-list-option", ["matListOption"], { "checkboxPosition": "checkboxPosition"; "color": "color"; "value": "value"; "selected": "selected"; }, { "selectedChange": "selectedChange"; }, ["_lines", "_titles"], ["[matListItemAvatar],[matListItemIcon]", "[matListItemTitle]", "[matListItemLine]", "*", "mat-divider"], false>;
|
|
408
373
|
}
|
|
@@ -428,9 +393,17 @@ export declare class MatNavList extends MatListBase {
|
|
|
428
393
|
static ɵcmp: i0.ɵɵComponentDeclaration<MatNavList, "mat-nav-list", ["matNavList"], {}, {}, never, ["*"], false>;
|
|
429
394
|
}
|
|
430
395
|
|
|
431
|
-
export declare class MatSelectionList extends
|
|
432
|
-
|
|
396
|
+
export declare class MatSelectionList extends MatListBase implements SelectionList, ControlValueAccessor, AfterViewInit, OnChanges, OnDestroy {
|
|
397
|
+
_element: ElementRef<HTMLElement>;
|
|
398
|
+
private _ngZone;
|
|
433
399
|
private _initialized;
|
|
400
|
+
private _keyManager;
|
|
401
|
+
/** Emits when the list has been destroyed. */
|
|
402
|
+
private _destroyed;
|
|
403
|
+
/** Whether the list has been destroyed. */
|
|
404
|
+
private _isDestroyed;
|
|
405
|
+
/** View to model callback that should be called whenever the selected options change. */
|
|
406
|
+
private _onChange;
|
|
434
407
|
_items: QueryList<MatListOption>;
|
|
435
408
|
/** Emits a change event whenever the selected state of an option changes. */
|
|
436
409
|
readonly selectionChange: EventEmitter<MatSelectionListChange>;
|
|
@@ -445,19 +418,14 @@ export declare class MatSelectionList extends MatInteractiveListBase<MatListOpti
|
|
|
445
418
|
/** Whether selection is limited to one or multiple items (default multiple). */
|
|
446
419
|
get multiple(): boolean;
|
|
447
420
|
set multiple(value: BooleanInput);
|
|
421
|
+
private _multiple;
|
|
448
422
|
/** The currently selected options. */
|
|
449
423
|
selectedOptions: SelectionModel<MatListOption>;
|
|
450
|
-
/** View to model callback that should be called whenever the selected options change. */
|
|
451
|
-
private _onChange;
|
|
452
424
|
/** Keeps track of the currently-selected value. */
|
|
453
425
|
_value: string[] | null;
|
|
454
|
-
/** Emits when the list has been destroyed. */
|
|
455
|
-
private _destroyed;
|
|
456
426
|
/** View to model callback that should be called if the list or its options lost focus. */
|
|
457
427
|
_onTouched: () => void;
|
|
458
|
-
|
|
459
|
-
private _isDestroyed;
|
|
460
|
-
constructor(element: ElementRef<HTMLElement>, document: any);
|
|
428
|
+
constructor(_element: ElementRef<HTMLElement>, _ngZone: NgZone);
|
|
461
429
|
ngAfterViewInit(): void;
|
|
462
430
|
ngOnChanges(changes: SimpleChanges): void;
|
|
463
431
|
ngOnDestroy(): void;
|
|
@@ -479,18 +447,8 @@ export declare class MatSelectionList extends MatInteractiveListBase<MatListOpti
|
|
|
479
447
|
registerOnChange(fn: (value: any) => void): void;
|
|
480
448
|
/** Implemented as part of ControlValueAccessor. */
|
|
481
449
|
registerOnTouched(fn: () => void): void;
|
|
482
|
-
/**
|
|
483
|
-
* Resets tabindex for all options and sets tabindex for the first selected option so that
|
|
484
|
-
* it will become active when users tab into the selection-list. This will be a noop if the
|
|
485
|
-
* list is currently focused as otherwise multiple options might become reachable through tab.
|
|
486
|
-
* e.g. A user currently already focused an option. We set tabindex to a new option but the
|
|
487
|
-
* focus on the current option does persist. Pressing `TAB` then might go to the other option
|
|
488
|
-
* that received a tabindex. We can skip the reset here as the MDC foundation resets the
|
|
489
|
-
* tabindex to the first selected option automatically once the current item is blurred.
|
|
490
|
-
*/
|
|
491
|
-
private _resetTabindexForItemsIfBlurred;
|
|
450
|
+
/** Watches for changes in the selected state of the options and updates the list accordingly. */
|
|
492
451
|
private _watchForSelectionChange;
|
|
493
|
-
private _syncSelectedOptionsWithFoundation;
|
|
494
452
|
/** Sets the selected options based on the specified values. */
|
|
495
453
|
private _setOptionsFromValues;
|
|
496
454
|
/** Returns the values of the selected options. */
|
|
@@ -504,6 +462,23 @@ export declare class MatSelectionList extends MatInteractiveListBase<MatListOpti
|
|
|
504
462
|
private _setAllOptionsSelected;
|
|
505
463
|
/** The option components contained within this selection-list. */
|
|
506
464
|
get options(): QueryList<MatListOption>;
|
|
465
|
+
/** Handles keydown events within the list. */
|
|
466
|
+
_handleKeydown(event: KeyboardEvent): void;
|
|
467
|
+
/** Handles focusout events within the list. */
|
|
468
|
+
private _handleFocusout;
|
|
469
|
+
/** Handles focusin events within the list. */
|
|
470
|
+
private _handleFocusin;
|
|
471
|
+
/** Sets up the logic for maintaining the roving tabindex. */
|
|
472
|
+
private _setupRovingTabindex;
|
|
473
|
+
/**
|
|
474
|
+
* Sets an option as active.
|
|
475
|
+
* @param index Index of the active option. If set to -1, no option will be active.
|
|
476
|
+
*/
|
|
477
|
+
private _setActiveOption;
|
|
478
|
+
/** Resets the active option to the first selected option. */
|
|
479
|
+
private _resetActiveOption;
|
|
480
|
+
/** Returns whether the focus is currently within the list. */
|
|
481
|
+
private _containsFocus;
|
|
507
482
|
static ɵfac: i0.ɵɵFactoryDeclaration<MatSelectionList, never>;
|
|
508
483
|
static ɵcmp: i0.ɵɵComponentDeclaration<MatSelectionList, "mat-selection-list", ["matSelectionList"], { "color": "color"; "compareWith": "compareWith"; "multiple": "multiple"; }, { "selectionChange": "selectionChange"; }, ["_items"], ["*"], false>;
|
|
509
484
|
}
|
|
@@ -551,8 +526,9 @@ export declare interface SelectionList extends MatListBase {
|
|
|
551
526
|
selectedOptions: SelectionModel<MatListOption>;
|
|
552
527
|
compareWith: (o1: any, o2: any) => boolean;
|
|
553
528
|
_value: string[] | null;
|
|
554
|
-
_reportValueChange
|
|
555
|
-
|
|
529
|
+
_reportValueChange(): void;
|
|
530
|
+
_emitChangeEvent(options: MatListOption[]): void;
|
|
531
|
+
_onTouched(): void;
|
|
556
532
|
}
|
|
557
533
|
|
|
558
534
|
export { }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular/material-experimental",
|
|
3
|
-
"version": "14.0.0-rc.
|
|
3
|
+
"version": "14.0.0-rc.2",
|
|
4
4
|
"description": "Experimental components for Angular Material",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -426,12 +426,12 @@
|
|
|
426
426
|
},
|
|
427
427
|
"peerDependencies": {
|
|
428
428
|
"@angular/animations": "^14.0.0-0 || ^15.0.0",
|
|
429
|
-
"@angular/cdk": "14.0.0-rc.
|
|
429
|
+
"@angular/cdk": "14.0.0-rc.2",
|
|
430
430
|
"@angular/core": "^14.0.0-0 || ^15.0.0",
|
|
431
431
|
"@angular/common": "^14.0.0-0 || ^15.0.0",
|
|
432
432
|
"@angular/forms": "^14.0.0-0 || ^15.0.0",
|
|
433
433
|
"@angular/platform-browser": "^14.0.0-0 || ^15.0.0",
|
|
434
|
-
"@angular/material": "14.0.0-rc.
|
|
434
|
+
"@angular/material": "14.0.0-rc.2"
|
|
435
435
|
},
|
|
436
436
|
"dependencies": {
|
|
437
437
|
"tslib": "^2.3.0",
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import { InjectionToken } from '@angular/core';
|
|
9
|
-
/** Injection token to be used to override the default options for the chips module. */
|
|
10
|
-
export const MAT_CHIPS_DEFAULT_OPTIONS = new InjectionToken('mat-chips-default-options');
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC1kZWZhdWx0LW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwtZXhwZXJpbWVudGFsL21kYy1jaGlwcy9jaGlwLWRlZmF1bHQtb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBUTdDLHVGQUF1RjtBQUN2RixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLGNBQWMsQ0FDekQsMkJBQTJCLENBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtJbmplY3Rpb25Ub2tlbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKiBEZWZhdWx0IG9wdGlvbnMsIGZvciB0aGUgY2hpcHMgbW9kdWxlLCB0aGF0IGNhbiBiZSBvdmVycmlkZGVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXRDaGlwc0RlZmF1bHRPcHRpb25zIHtcbiAgLyoqIFRoZSBsaXN0IG9mIGtleSBjb2RlcyB0aGF0IHdpbGwgdHJpZ2dlciBhIGNoaXBFbmQgZXZlbnQuICovXG4gIHNlcGFyYXRvcktleUNvZGVzOiByZWFkb25seSBudW1iZXJbXSB8IFJlYWRvbmx5U2V0PG51bWJlcj47XG59XG5cbi8qKiBJbmplY3Rpb24gdG9rZW4gdG8gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvcHRpb25zIGZvciB0aGUgY2hpcHMgbW9kdWxlLiAqL1xuZXhwb3J0IGNvbnN0IE1BVF9DSElQU19ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWF0Q2hpcHNEZWZhdWx0T3B0aW9ucz4oXG4gICdtYXQtY2hpcHMtZGVmYXVsdC1vcHRpb25zJyxcbik7XG4iXX0=
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Emits a custom event from an element.
|
|
10
|
-
* @param element Element from which to emit the event.
|
|
11
|
-
* @param _document Document that the element is placed in.
|
|
12
|
-
* @param eventName Name of the event.
|
|
13
|
-
* @param data Data attached to the event.
|
|
14
|
-
* @param shouldBubble Whether the event should bubble.
|
|
15
|
-
*/
|
|
16
|
-
export function emitCustomEvent(element, _document, eventName, data, shouldBubble) {
|
|
17
|
-
let event;
|
|
18
|
-
if (typeof CustomEvent === 'function') {
|
|
19
|
-
event = new CustomEvent(eventName, { bubbles: shouldBubble, detail: data });
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
event = _document.createEvent('CustomEvent');
|
|
23
|
-
event.initCustomEvent(eventName, shouldBubble, false, data);
|
|
24
|
-
}
|
|
25
|
-
element.dispatchEvent(event);
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1pdC1ldmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC1leHBlcmltZW50YWwvbWRjLWNoaXBzL2VtaXQtZXZlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLE9BQW9CLEVBQ3BCLFNBQW1CLEVBQ25CLFNBQWlCLEVBQ2pCLElBQU8sRUFDUCxZQUFxQjtJQUVyQixJQUFJLEtBQXFCLENBQUM7SUFDMUIsSUFBSSxPQUFPLFdBQVcsS0FBSyxVQUFVLEVBQUU7UUFDckMsS0FBSyxHQUFHLElBQUksV0FBVyxDQUFJLFNBQVMsRUFBRSxFQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7S0FDOUU7U0FBTTtRQUNMLEtBQUssR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdDLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDN0Q7SUFFRCxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBFbWl0cyBhIGN1c3RvbSBldmVudCBmcm9tIGFuIGVsZW1lbnQuXG4gKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IGZyb20gd2hpY2ggdG8gZW1pdCB0aGUgZXZlbnQuXG4gKiBAcGFyYW0gX2RvY3VtZW50IERvY3VtZW50IHRoYXQgdGhlIGVsZW1lbnQgaXMgcGxhY2VkIGluLlxuICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudC5cbiAqIEBwYXJhbSBkYXRhIERhdGEgYXR0YWNoZWQgdG8gdGhlIGV2ZW50LlxuICogQHBhcmFtIHNob3VsZEJ1YmJsZSBXaGV0aGVyIHRoZSBldmVudCBzaG91bGQgYnViYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW1pdEN1c3RvbUV2ZW50PFQ+KFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgZXZlbnROYW1lOiBzdHJpbmcsXG4gIGRhdGE6IFQsXG4gIHNob3VsZEJ1YmJsZTogYm9vbGVhbixcbik6IHZvaWQge1xuICBsZXQgZXZlbnQ6IEN1c3RvbUV2ZW50PFQ+O1xuICBpZiAodHlwZW9mIEN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8VD4oZXZlbnROYW1lLCB7YnViYmxlczogc2hvdWxkQnViYmxlLCBkZXRhaWw6IGRhdGF9KTtcbiAgfSBlbHNlIHtcbiAgICBldmVudCA9IF9kb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICBldmVudC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCBzaG91bGRCdWJibGUsIGZhbHNlLCBkYXRhKTtcbiAgfVxuXG4gIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG4iXX0=
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import { DOCUMENT } from '@angular/common';
|
|
9
|
-
import { Directive, ElementRef, Inject } from '@angular/core';
|
|
10
|
-
import { MDCListFoundation } from '@material/list';
|
|
11
|
-
import { Subscription } from 'rxjs';
|
|
12
|
-
import { startWith } from 'rxjs/operators';
|
|
13
|
-
import { MatListBase } from './list-base';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
/** @docs-private */
|
|
16
|
-
export class MatInteractiveListBase extends MatListBase {
|
|
17
|
-
constructor(_element, document) {
|
|
18
|
-
super();
|
|
19
|
-
this._element = _element;
|
|
20
|
-
this._itemsArr = [];
|
|
21
|
-
this._subscriptions = new Subscription();
|
|
22
|
-
this._document = document;
|
|
23
|
-
this._isNonInteractive = false;
|
|
24
|
-
}
|
|
25
|
-
_handleKeydown(event) {
|
|
26
|
-
const index = this._indexForElement(event.target);
|
|
27
|
-
this._foundation.handleKeydown(event, this._elementAtIndex(index) === event.target, index);
|
|
28
|
-
}
|
|
29
|
-
_handleClick(event) {
|
|
30
|
-
// The `isCheckboxAlreadyUpdatedInAdapter` parameter can always be `false` as it only has an
|
|
31
|
-
// effect if the list is recognized as checkbox selection list. For such lists, we would
|
|
32
|
-
// always want to toggle the checkbox on list item click. MDC added this parameter so that
|
|
33
|
-
// they can avoid dispatching a fake `change` event when the checkbox is directly clicked
|
|
34
|
-
// for the list item. We don't need this as we do not have an underlying native checkbox
|
|
35
|
-
// that is reachable by users through interaction.
|
|
36
|
-
// https://github.com/material-components/material-components-web/blob/08ca4d0ec5f359bc3a20bd2a302fa6b733b5e135/packages/mdc-list/component.ts#L308-L310
|
|
37
|
-
this._foundation.handleClick(this._indexForElement(event.target),
|
|
38
|
-
/* isCheckboxAlreadyUpdatedInAdapter */ false, event);
|
|
39
|
-
}
|
|
40
|
-
_handleFocusin(event) {
|
|
41
|
-
const itemIndex = this._indexForElement(event.target);
|
|
42
|
-
const tabIndex = this._itemsArr[itemIndex]?._hostElement.tabIndex;
|
|
43
|
-
// If the newly focused item is not the designated item that should have received focus
|
|
44
|
-
// first through keyboard interaction, the tabindex of the previously designated list item
|
|
45
|
-
// needs to be cleared, so that only one list item is reachable through tab key at any time.
|
|
46
|
-
// MDC sets a tabindex for the newly focused item, so we do not need to set a tabindex for it.
|
|
47
|
-
// Workaround for: https://github.com/material-components/material-components-web/issues/6363.
|
|
48
|
-
if (tabIndex === undefined || tabIndex === -1) {
|
|
49
|
-
this._clearTabindexForAllItems();
|
|
50
|
-
}
|
|
51
|
-
this._foundation.handleFocusIn(itemIndex);
|
|
52
|
-
}
|
|
53
|
-
_handleFocusout(event) {
|
|
54
|
-
this._foundation.handleFocusOut(this._indexForElement(event.target));
|
|
55
|
-
}
|
|
56
|
-
_initWithAdapter(adapter) {
|
|
57
|
-
this._adapter = adapter;
|
|
58
|
-
this._foundation = new MDCListFoundation(adapter);
|
|
59
|
-
}
|
|
60
|
-
ngAfterViewInit() {
|
|
61
|
-
if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this._foundation) {
|
|
62
|
-
throw Error('MDC list foundation not initialized for Angular Material list.');
|
|
63
|
-
}
|
|
64
|
-
this._foundation.init();
|
|
65
|
-
this._watchListItems();
|
|
66
|
-
// Enable typeahead and focus wrapping for interactive lists.
|
|
67
|
-
this._foundation.setHasTypeahead(true);
|
|
68
|
-
this._foundation.setWrapFocus(true);
|
|
69
|
-
}
|
|
70
|
-
ngOnDestroy() {
|
|
71
|
-
this._foundation.destroy();
|
|
72
|
-
this._subscriptions.unsubscribe();
|
|
73
|
-
}
|
|
74
|
-
_watchListItems() {
|
|
75
|
-
this._subscriptions.add(this._items.changes.pipe(startWith(null)).subscribe(() => {
|
|
76
|
-
this._itemsArr = this._items.toArray();
|
|
77
|
-
// Whenever the items change, the foundation needs to be notified through the `layout`
|
|
78
|
-
// method. It caches items for the typeahead and detects the list type based on the items.
|
|
79
|
-
this._foundation.layout();
|
|
80
|
-
// The list items changed, so we reset the tabindex for all items and
|
|
81
|
-
// designate one list item that will be reachable through tab.
|
|
82
|
-
this._resetTabindexToFirstSelectedOrFocusedItem();
|
|
83
|
-
}));
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Clears the tabindex of all items so that no items are reachable through tab key.
|
|
87
|
-
* MDC intends to always have only one tabbable item that will receive focus first.
|
|
88
|
-
* This first item is selected by MDC automatically on blur or by manually invoking
|
|
89
|
-
* the `setTabindexToFirstSelectedOrFocusedItem` method.
|
|
90
|
-
*/
|
|
91
|
-
_clearTabindexForAllItems() {
|
|
92
|
-
for (let items of this._itemsArr) {
|
|
93
|
-
items._hostElement.setAttribute('tabindex', '-1');
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Resets tabindex for all options and sets tabindex for the first selected option or
|
|
98
|
-
* previously focused item so that an item can be reached when users tab into the list.
|
|
99
|
-
*/
|
|
100
|
-
_resetTabindexToFirstSelectedOrFocusedItem() {
|
|
101
|
-
this._clearTabindexForAllItems();
|
|
102
|
-
// MDC does not expose the method for setting the tabindex to the first selected
|
|
103
|
-
// or previously focused item. We can still access the method as private class
|
|
104
|
-
// members are accessible in the transpiled JavaScript. Tracked upstream with:
|
|
105
|
-
// TODO: https://github.com/material-components/material-components-web/issues/6375
|
|
106
|
-
this._foundation.setTabindexToFirstSelectedOrFocusedItem();
|
|
107
|
-
}
|
|
108
|
-
_elementAtIndex(index) {
|
|
109
|
-
return this._itemsArr[index]?._hostElement;
|
|
110
|
-
}
|
|
111
|
-
_indexForElement(element) {
|
|
112
|
-
return element ? this._itemsArr.findIndex(i => i._hostElement.contains(element)) : -1;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
MatInteractiveListBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-rc.1", ngImport: i0, type: MatInteractiveListBase, deps: [{ token: i0.ElementRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive });
|
|
116
|
-
MatInteractiveListBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.0-rc.1", type: MatInteractiveListBase, host: { listeners: { "keydown": "_handleKeydown($event)", "click": "_handleClick($event)", "focusin": "_handleFocusin($event)", "focusout": "_handleFocusout($event)" } }, usesInheritance: true, ngImport: i0 });
|
|
117
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-rc.1", ngImport: i0, type: MatInteractiveListBase, decorators: [{
|
|
118
|
-
type: Directive,
|
|
119
|
-
args: [{
|
|
120
|
-
host: {
|
|
121
|
-
'(keydown)': '_handleKeydown($event)',
|
|
122
|
-
'(click)': '_handleClick($event)',
|
|
123
|
-
'(focusin)': '_handleFocusin($event)',
|
|
124
|
-
'(focusout)': '_handleFocusout($event)',
|
|
125
|
-
},
|
|
126
|
-
}]
|
|
127
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: undefined, decorators: [{
|
|
128
|
-
type: Inject,
|
|
129
|
-
args: [DOCUMENT]
|
|
130
|
-
}] }]; } });
|
|
131
|
-
// TODO: replace with class once material-components-web/pull/6256 is available.
|
|
132
|
-
/** Gets an instance of `MDcListAdapter` for the given interactive list. */
|
|
133
|
-
export function getInteractiveListAdapter(list) {
|
|
134
|
-
return {
|
|
135
|
-
getListItemCount() {
|
|
136
|
-
return list._items.length;
|
|
137
|
-
},
|
|
138
|
-
listItemAtIndexHasClass(index, className) {
|
|
139
|
-
const element = list._elementAtIndex(index);
|
|
140
|
-
return element ? element.classList.contains(className) : false;
|
|
141
|
-
},
|
|
142
|
-
addClassForElementIndex(index, className) {
|
|
143
|
-
list._elementAtIndex(index)?.classList.add(className);
|
|
144
|
-
},
|
|
145
|
-
removeClassForElementIndex(index, className) {
|
|
146
|
-
list._elementAtIndex(index)?.classList.remove(className);
|
|
147
|
-
},
|
|
148
|
-
getAttributeForElementIndex(index, attr) {
|
|
149
|
-
const element = list._elementAtIndex(index);
|
|
150
|
-
return element ? element.getAttribute(attr) : null;
|
|
151
|
-
},
|
|
152
|
-
setAttributeForElementIndex(index, attr, value) {
|
|
153
|
-
list._elementAtIndex(index)?.setAttribute(attr, value);
|
|
154
|
-
},
|
|
155
|
-
getFocusedElementIndex() {
|
|
156
|
-
return list._indexForElement(list._document?.activeElement);
|
|
157
|
-
},
|
|
158
|
-
isFocusInsideList() {
|
|
159
|
-
return list._element.nativeElement.contains(list._document?.activeElement);
|
|
160
|
-
},
|
|
161
|
-
isRootFocused() {
|
|
162
|
-
return list._element.nativeElement === list._document?.activeElement;
|
|
163
|
-
},
|
|
164
|
-
focusItemAtIndex(index) {
|
|
165
|
-
list._elementAtIndex(index)?.focus();
|
|
166
|
-
},
|
|
167
|
-
// Gets the text for a list item for the typeahead
|
|
168
|
-
getPrimaryTextAtIndex(index) {
|
|
169
|
-
return list._itemsArr[index]._getItemLabel();
|
|
170
|
-
},
|
|
171
|
-
// MDC uses this method to disable focusable children of list items. However, we believe that
|
|
172
|
-
// this is not an accessible pattern and should be avoided, therefore we intentionally do not
|
|
173
|
-
// implement this method. In addition, implementing this would require violating Angular
|
|
174
|
-
// Material's general principle of not having components modify DOM elements they do not own.
|
|
175
|
-
// A user who feels they really need this feature can simply listen to the `(focus)` and
|
|
176
|
-
// `(blur)` events on the list item and enable/disable focus on the children themselves as
|
|
177
|
-
// appropriate.
|
|
178
|
-
setTabIndexForListItemChildren() { },
|
|
179
|
-
// The following methods have a dummy implementation in the base class because they are only
|
|
180
|
-
// applicable to certain types of lists. They should be implemented for the concrete classes
|
|
181
|
-
// where they are applicable.
|
|
182
|
-
hasCheckboxAtIndex() {
|
|
183
|
-
return false;
|
|
184
|
-
},
|
|
185
|
-
hasRadioAtIndex(index) {
|
|
186
|
-
return false;
|
|
187
|
-
},
|
|
188
|
-
setCheckedCheckboxOrRadioAtIndex(index, checked) { },
|
|
189
|
-
isCheckboxCheckedAtIndex(index) {
|
|
190
|
-
return false;
|
|
191
|
-
},
|
|
192
|
-
notifySelectionChange() { },
|
|
193
|
-
notifyAction() { },
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3RpdmUtbGlzdC1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21hdGVyaWFsLWV4cGVyaW1lbnRhbC9tZGMtbGlzdC9pbnRlcmFjdGl2ZS1saXN0LWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBaUIsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUMsV0FBVyxFQUFrQixNQUFNLGFBQWEsQ0FBQzs7QUFVekQsb0JBQW9CO0FBQ3BCLE1BQU0sT0FBZ0Isc0JBQ3BCLFNBQVEsV0FBVztJQXFEbkIsWUFBNkIsUUFBaUMsRUFBb0IsUUFBYTtRQUM3RixLQUFLLEVBQUUsQ0FBQztRQURtQixhQUFRLEdBQVIsUUFBUSxDQUF5QjtRQVI5RCxjQUFTLEdBQVEsRUFBRSxDQUFDO1FBTVosbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSTFDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQXRERCxjQUFjLENBQUMsS0FBb0I7UUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxNQUFxQixDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMs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QyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELGFBQWE7WUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxnQkFBZ0IsQ0FBQyxLQUFhO1lBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDdkMsQ0FBQztRQUNELGtEQUFrRDtRQUNsRCxxQkFBcUIsQ0FBQyxLQUFhO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQyxDQUFDO1FBRUQsNkZBQTZGO1FBQzdGLDZGQUE2RjtRQUM3Rix3RkFBd0Y7UUFDeEYsNkZBQTZGO1FBQzdGLHdGQUF3RjtRQUN4RiwwRkFBMEY7UUFDMUYsZUFBZTtRQUNmLDhCQUE4QixLQUFJLENBQUM7UUFFbkMsNEZBQTRGO1FBQzVGLDRGQUE0RjtRQUM1Riw2QkFBNkI7UUFDN0Isa0JBQWtCO1lBQ2hCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELGVBQWUsQ0FBQyxLQUFhO1lBQzNCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELGdDQUFnQyxDQUFDLEtBQWEsRUFBRSxPQUFnQixJQUFHLENBQUM7UUFDcEUsd0JBQXdCLENBQUMsS0FBYTtZQUNwQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxxQkFBcUIsS0FBSSxDQUFDO1FBQzFCLFlBQVksS0FBSSxDQUFDO0tBQ2xCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0FmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkRlc3Ryb3ksIFF1ZXJ5TGlzdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01EQ0xpc3RBZGFwdGVyLCBNRENMaXN0Rm91bmRhdGlvbn0gZnJvbSAnQG1hdGVyaWFsL2xpc3QnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtzdGFydFdpdGh9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TWF0TGlzdEJhc2UsIE1hdExpc3RJdGVtQmFzZX0gZnJvbSAnLi9saXN0LWJhc2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgaG9zdDoge1xuICAgICcoa2V5ZG93biknOiAnX2hhbmRsZUtleWRvd24oJGV2ZW50KScsXG4gICAgJyhjbGljayknOiAnX2hhbmRsZUNsaWNrKCRldmVudCknLFxuICAgICcoZm9jdXNpbiknOiAnX2hhbmRsZUZvY3VzaW4oJGV2ZW50KScsXG4gICAgJyhmb2N1c291dCknOiAnX2hhbmRsZUZvY3Vzb3V0KCRldmVudCknLFxuICB9LFxufSlcbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWF0SW50ZXJhY3RpdmVMaXN0QmFzZTxUIGV4dGVuZHMgTWF0TGlzdEl0ZW1CYXNlPlxuICBleHRlbmRzIE1hdExpc3RCYXNlXG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIF9oYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9pbmRleEZvckVsZW1lbnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICB0aGlzLl9mb3VuZGF0aW9uLmhhbmRsZUtleWRvd24oZXZlbnQsIHRoaXMuX2VsZW1lbnRBdEluZGV4KGluZGV4KSA9PT0gZXZlbnQudGFyZ2V0LCBpbmRleCk7XG4gIH1cblxuICBfaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAvLyBUaGUgYGlzQ2hlY2tib3hBbHJlYWR5VXBkYXRlZEluQWRhcHRlcmAgcGFyYW1ldGVyIGNhbiBhbHdheXMgYmUgYGZhbHNlYCBhcyBpdCBvbmx5IGhhcyBhblxuICAgIC8vIGVmZmVjdCBpZiB0aGUgbGlzdCBpcyByZWNvZ25pemVkIGFzIGNoZWNrYm94IHNlbGVjdGlvbiBsaXN0LiBGb3Igc3VjaCBsaXN0cywgd2Ugd291bGRcbiAgICAvLyBhbHdheXMgd2FudCB0byB0b2dnbGUgdGhlIGNoZWNrYm94IG9uIGxpc3QgaXRlbSBjbGljay4gTURDIGFkZGVkIHRoaXMgcGFyYW1ldGVyIHNvIHRoYXRcbiAgICAvLyB0aGV5IGNhbiBhdm9pZCBkaXNwYXRjaGluZyBhIGZha2UgYGNoYW5nZWAgZXZlbnQgd2hlbiB0aGUgY2hlY2tib3ggaXMgZGlyZWN0bHkgY2xpY2tlZFxuICAgIC8vIGZvciB0aGUgbGlzdCBpdGVtLiBXZSBkb24ndCBuZWVkIHRoaXMgYXMgd2UgZG8gbm90IGhhdmUgYW4gdW5kZXJseWluZyBuYXRpdmUgY2hlY2tib3hcbiAgICAvLyB0aGF0IGlzIHJlYWNoYWJsZSBieSB1c2VycyB0aHJvdWdoIGludGVyYWN0aW9uLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRlcmlhbC1jb21wb25lbnRzL21hdGVyaWFsLWNvbXBvbmVudHMtd2ViL2Jsb2IvMDhjYTRkMGVjNWYzNTliYzNhMjBiZDJhMzAyZmE2YjczM2I1ZTEzNS9wYWNrYWdlcy9tZGMtbGlzdC9jb21wb25lbnQudHMjTDMwOC1MMzEwXG4gICAgdGhpcy5fZm91bmRhdGlvbi5oYW5kbGVDbGljayhcbiAgICAgIHRoaXMuX2luZGV4Rm9yRWxlbWVudChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLFxuICAgICAgLyogaXNDaGVja2JveEFscmVhZHlVcGRhdGVkSW5BZGFwdGVyICovIGZhbHNlLFxuICAgICAgZXZlbnQsXG4gICAgKTtcbiAgfVxuXG4gIF9oYW5kbGVGb2N1c2luKGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy5faW5kZXhGb3JFbGVtZW50KGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgY29uc3QgdGFiSW5kZXggPSB0aGlzLl9pdGVtc0FycltpdGVtSW5kZXhdPy5faG9zdEVsZW1lbnQudGFiSW5kZXg7XG5cbiAgICAvLyBJZiB0aGUgbmV3bHkgZm9jdXNlZCBpdGVtIGlzIG5vdCB0aGUgZGVzaWduYXRlZCBpdGVtIHRoYXQgc2hvdWxkIGhhdmUgcmVjZWl2ZWQgZm9jdXNcbiAgICAvLyBmaXJzdCB0aHJvdWdoIGtleWJvYXJkIGludGVyYWN0aW9uLCB0aGUgdGFiaW5kZXggb2YgdGhlIHByZXZpb3VzbHkgZGVzaWduYXRlZCBsaXN0IGl0ZW1cbiAgICAvLyBuZWVkcyB0byBiZSBjbGVhcmVkLCBzbyB0aGF0IG9ubHkgb25lIGxpc3QgaXRlbSBpcyByZWFjaGFibGUgdGhyb3VnaCB0YWIga2V5IGF0IGFueSB0aW1lLlxuICAgIC8vIE1EQyBzZXRzIGEgdGFiaW5kZXggZm9yIHRoZSBuZXdseSBmb2N1c2VkIGl0ZW0sIHNvIHdlIGRvIG5vdCBuZWVkIHRvIHNldCBhIHRhYmluZGV4IGZvciBpdC5cbiAgICAvLyBXb3JrYXJvdW5kIGZvcjogaHR0cHM6Ly9naXRodWIuY29tL21hdGVyaWFsLWNvbXBvbmVudHMvbWF0ZXJpYWwtY29tcG9uZW50cy13ZWIvaXNzdWVzLzYzNjMuXG4gICAgaWYgKHRhYkluZGV4ID09PSB1bmRlZmluZWQgfHwgdGFiSW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLl9jbGVhclRhYmluZGV4Rm9yQWxsSXRlbXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9mb3VuZGF0aW9uLmhhbmRsZUZvY3VzSW4oaXRlbUluZGV4KTtcbiAgfVxuXG4gIF9oYW5kbGVGb2N1c291dChldmVudDogRm9jdXNFdmVudCkge1xuICAgIHRoaXMuX2ZvdW5kYXRpb24uaGFuZGxlRm9jdXNPdXQodGhpcy5faW5kZXhGb3JFbGVtZW50KGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpO1xuICB9XG5cbiAgLyoqIEl0ZW1zIGluIHRoZSBpbnRlcmFjdGl2ZSBsaXN0LiAqL1xuICBhYnN0cmFjdCBfaXRlbXM6IFF1ZXJ5TGlzdDxUPjtcbiAgX2l0ZW1zQXJyOiBUW10gPSBbXTtcbiAgX2RvY3VtZW50OiBEb2N1bWVudDtcblxuICBwcm90ZWN0ZWQgX2ZvdW5kYXRpb246IE1EQ0xpc3RGb3VuZGF0aW9uO1xuICBwcm90ZWN0ZWQgX2FkYXB0ZXI6IE1EQ0xpc3RBZGFwdGVyO1xuXG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHB1YmxpYyBfZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sIEBJbmplY3QoRE9DVU1FTlQpIGRvY3VtZW50OiBhbnkpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7XG4gICAgdGhpcy5faXNOb25JbnRlcmFjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9pbml0V2l0aEFkYXB0ZXIoYWRhcHRlcjogTURDTGlzdEFkYXB0ZXIpIHtcbiAgICB0aGlzLl9hZGFwdGVyID0gYWRhcHRlcjtcbiAgICB0aGlzLl9mb3VuZGF0aW9uID0gbmV3IE1EQ0xpc3RGb3VuZGF0aW9uKGFkYXB0ZXIpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICgodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSAmJiAhdGhpcy5fZm91bmRhdGlvbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ01EQyBsaXN0IGZvdW5kYXRpb24gbm90IGluaXRpYWxpemVkIGZvciBBbmd1bGFyIE1hdGVyaWFsIGxpc3QuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZm91bmRhdGlvbi5pbml0KCk7XG4gICAgdGhpcy5fd2F0Y2hMaXN0SXRlbXMoKTtcblxuICAgIC8vIEVuYWJsZSB0eXBlYWhlYWQgYW5kIGZvY3VzIHdyYXBwaW5nIGZvciBpbnRlcmFjdGl2ZSBsaXN0cy5cbiAgICB0aGlzLl9mb3VuZGF0aW9uLnNldEhhc1R5cGVhaGVhZCh0cnVlKTtcbiAgICB0aGlzLl9mb3VuZGF0aW9uLnNldFdyYXBGb2N1cyh0cnVlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2ZvdW5kYXRpb24uZGVzdHJveSgpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfd2F0Y2hMaXN0SXRlbXMoKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLl9pdGVtcy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9pdGVtc0FyciA9IHRoaXMuX2l0ZW1zLnRvQXJyYXkoKTtcbiAgICAgICAgLy8gV2hlbmV2ZXIgdGhlIGl0ZW1zIGNoYW5nZSwgdGhlIGZvdW5kYXRpb24gbmVlZHMgdG8gYmUgbm90aWZpZWQgdGhyb3VnaCB0aGUgYGxheW91dGBcbiAgICAgICAgLy8gbWV0aG9kLiBJdCBjYWNoZXMgaXRlbXMgZm9yIHRoZSB0eXBlYWhlYWQgYW5kIGRldGVjdHMgdGhlIGxpc3QgdHlwZSBiYXNlZCBvbiB0aGUgaXRlbXMuXG4gICAgICAgIHRoaXMuX2ZvdW5kYXRpb24ubGF5b3V0KCk7XG5cbiAgICAgICAgLy8gVGhlIGxpc3QgaXRlbXMgY2hhbmdlZCwgc28gd2UgcmVzZXQgdGhlIHRhYmluZGV4IGZvciBhbGwgaXRlbXMgYW5kXG4gICAgICAgIC8vIGRlc2lnbmF0ZSBvbmUgbGlzdCBpdGVtIHRoYXQgd2lsbCBiZSByZWFjaGFibGUgdGhyb3VnaCB0YWIuXG4gICAgICAgIHRoaXMuX3Jlc2V0VGFiaW5kZXhUb0ZpcnN0U2VsZWN0ZWRPckZvY3VzZWRJdGVtKCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgdGFiaW5kZXggb2YgYWxsIGl0ZW1zIHNvIHRoYXQgbm8gaXRlbXMgYXJlIHJlYWNoYWJsZSB0aHJvdWdoIHRhYiBrZXkuXG4gICAqIE1EQyBpbnRlbmRzIHRvIGFsd2F5cyBoYXZlIG9ubHkgb25lIHRhYmJhYmxlIGl0ZW0gdGhhdCB3aWxsIHJlY2VpdmUgZm9jdXMgZmlyc3QuXG4gICAqIFRoaXMgZmlyc3QgaXRlbSBpcyBzZWxlY3RlZCBieSBNREMgYXV0b21hdGljYWxseSBvbiBibHVyIG9yIGJ5IG1hbnVhbGx5IGludm9raW5nXG4gICAqIHRoZSBgc2V0VGFiaW5kZXhUb0ZpcnN0U2VsZWN0ZWRPckZvY3VzZWRJdGVtYCBtZXRob2QuXG4gICAqL1xuICBwcml2YXRlIF9jbGVhclRhYmluZGV4Rm9yQWxsSXRlbXMoKSB7XG4gICAgZm9yIChsZXQgaXRlbXMgb2YgdGhpcy5faXRlbXNBcnIpIHtcbiAgICAgIGl0ZW1zLl9ob3N0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0YWJpbmRleCBmb3IgYWxsIG9wdGlvbnMgYW5kIHNldHMgdGFiaW5kZXggZm9yIHRoZSBmaXJzdCBzZWxlY3RlZCBvcHRpb24gb3JcbiAgICogcHJldmlvdXNseSBmb2N1c2VkIGl0ZW0gc28gdGhhdCBhbiBpdGVtIGNhbiBiZSByZWFjaGVkIHdoZW4gdXNlcnMgdGFiIGludG8gdGhlIGxpc3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3Jlc2V0VGFiaW5kZXhUb0ZpcnN0U2VsZWN0ZWRPckZvY3VzZWRJdGVtKCkge1xuICAgIHRoaXMuX2NsZWFyVGFiaW5kZXhGb3JBbGxJdGVtcygpO1xuICAgIC8vIE1EQyBkb2VzIG5vdCBleHBvc2UgdGhlIG1ldGhvZCBmb3Igc2V0dGluZyB0aGUgdGFiaW5kZXggdG8gdGhlIGZpcnN0IHNlbGVjdGVkXG4gICAgLy8gb3IgcHJldmlvdXNseSBmb2N1c2VkIGl0ZW0uIFdlIGNhbiBzdGlsbCBhY2Nlc3MgdGhlIG1ldGhvZCBhcyBwcml2YXRlIGNsYXNzXG4gICAgLy8gbWVtYmVycyBhcmUgYWNjZXNzaWJsZSBpbiB0aGUgdHJhbnNwaWxlZCBKYXZhU2NyaXB0LiBUcmFja2VkIHVwc3RyZWFtIHdpdGg6XG4gICAgLy8gVE9ETzogaHR0cHM6Ly9naXRodWIuY29tL21hdGVyaWFsLWNvbXBvbmVudHMvbWF0ZXJpYWwtY29tcG9uZW50cy13ZWIvaXNzdWVzLzYzNzVcbiAgICAodGhpcy5fZm91bmRhdGlvbiBhcyBhbnkpLnNldFRhYmluZGV4VG9GaXJzdFNlbGVjdGVkT3JGb2N1c2VkSXRlbSgpO1xuICB9XG5cbiAgX2VsZW1lbnRBdEluZGV4KGluZGV4OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zQXJyW2luZGV4XT8uX2hvc3RFbGVtZW50O1xuICB9XG5cbiAgX2luZGV4Rm9yRWxlbWVudChlbGVtZW50OiBFbGVtZW50IHwgbnVsbCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGVsZW1lbnQgPyB0aGlzLl9pdGVtc0Fyci5maW5kSW5kZXgoaSA9PiBpLl9ob3N0RWxlbWVudC5jb250YWlucyhlbGVtZW50KSkgOiAtMTtcbiAgfVxufVxuXG4vLyBUT0RPOiByZXBsYWNlIHdpdGggY2xhc3Mgb25jZSBtYXRlcmlhbC1jb21wb25lbnRzLXdlYi9wdWxsLzYyNTYgaXMgYXZhaWxhYmxlLlxuLyoqIEdldHMgYW4gaW5zdGFuY2Ugb2YgYE1EY0xpc3RBZGFwdGVyYCBmb3IgdGhlIGdpdmVuIGludGVyYWN0aXZlIGxpc3QuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW50ZXJhY3RpdmVMaXN0QWRhcHRlcihcbiAgbGlzdDogTWF0SW50ZXJhY3RpdmVMaXN0QmFzZTxNYXRMaXN0SXRlbUJhc2U+LFxuKTogTURDTGlzdEFkYXB0ZXIge1xuICByZXR1cm4ge1xuICAgIGdldExpc3RJdGVtQ291bnQoKSB7XG4gICAgICByZXR1cm4gbGlzdC5faXRlbXMubGVuZ3RoO1xuICAgIH0sXG4gICAgbGlzdEl0ZW1BdEluZGV4SGFzQ2xhc3MoaW5kZXg6IG51bWJlciwgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBsaXN0Ll9lbGVtZW50QXRJbmRleChpbmRleCk7XG4gICAgICByZXR1cm4gZWxlbWVudCA/IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkgOiBmYWxzZTtcbiAgICB9LFxuICAgIGFkZENsYXNzRm9yRWxlbWVudEluZGV4KGluZGV4OiBudW1iZXIsIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICBsaXN0Ll9lbGVtZW50QXRJbmRleChpbmRleCk/LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICB9LFxuICAgIHJlbW92ZUNsYXNzRm9yRWxlbWVudEluZGV4KGluZGV4OiBudW1iZXIsIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICBsaXN0Ll9lbGVtZW50QXRJbmRleChpbmRleCk/LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICB9LFxuICAgIGdldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleChpbmRleDogbnVtYmVyLCBhdHRyOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBsaXN0Ll9lbGVtZW50QXRJbmRleChpbmRleCk7XG4gICAgICByZXR1cm4gZWxlbWVudCA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHIpIDogbnVsbDtcbiAgICB9LFxuICAgIHNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleChpbmRleDogbnVtYmVyLCBhdHRyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIGxpc3QuX2VsZW1lbnRBdEluZGV4KGluZGV4KT8uc2V0QXR0cmlidXRlKGF0dHIsIHZhbHVlKTtcbiAgICB9LFxuICAgIGdldEZvY3VzZWRFbGVtZW50SW5kZXgoKSB7XG4gICAgICByZXR1cm4gbGlzdC5faW5kZXhGb3JFbGVtZW50KGxpc3QuX2RvY3VtZW50Py5hY3RpdmVFbGVtZW50KTtcbiAgICB9LFxuICAgIGlzRm9jdXNJbnNpZGVMaXN0KCkge1xuICAgICAgcmV0dXJuIGxpc3QuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhsaXN0Ll9kb2N1bWVudD8uYWN0aXZlRWxlbWVudCk7XG4gICAgfSxcbiAgICBpc1Jvb3RGb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIGxpc3QuX2VsZW1lbnQubmF0aXZlRWxlbWVudCA9PT0gbGlzdC5fZG9jdW1lbnQ/LmFjdGl2ZUVsZW1lbnQ7XG4gICAgfSxcbiAgICBmb2N1c0l0ZW1BdEluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICAgIGxpc3QuX2VsZW1lbnRBdEluZGV4KGluZGV4KT8uZm9jdXMoKTtcbiAgICB9LFxuICAgIC8vIEdldHMgdGhlIHRleHQgZm9yIGEgbGlzdCBpdGVtIGZvciB0aGUgdHlwZWFoZWFkXG4gICAgZ2V0UHJpbWFyeVRleHRBdEluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBsaXN0Ll9pdGVtc0FycltpbmRleF0uX2dldEl0ZW1MYWJlbCgpO1xuICAgIH0sXG5cbiAgICAvLyBNREMgdXNlcyB0aGlzIG1ldGhvZCB0byBkaXNhYmxlIGZvY3VzYWJsZSBjaGlsZHJlbiBvZiBsaXN0IGl0ZW1zLiBIb3dldmVyLCB3ZSBiZWxpZXZlIHRoYXRcbiAgICAvLyB0aGlzIGlzIG5vdCBhbiBhY2Nlc3NpYmxlIHBhdHRlcm4gYW5kIHNob3VsZCBiZSBhdm9pZGVkLCB0aGVyZWZvcmUgd2UgaW50ZW50aW9uYWxseSBkbyBub3RcbiAgICAvLyBpbXBsZW1lbnQgdGhpcyBtZXRob2QuIEluIGFkZGl0aW9uLCBpbXBsZW1lbnRpbmcgdGhpcyB3b3VsZCByZXF1aXJlIHZpb2xhdGluZyBBbmd1bGFyXG4gICAgLy8gTWF0ZXJpYWwncyBnZW5lcmFsIHByaW5jaXBsZSBvZiBub3QgaGF2aW5nIGNvbXBvbmVudHMgbW9kaWZ5IERPTSBlbGVtZW50cyB0aGV5IGRvIG5vdCBvd24uXG4gICAgLy8gQSB1c2VyIHdobyBmZWVscyB0aGV5IHJlYWxseSBuZWVkIHRoaXMgZmVhdHVyZSBjYW4gc2ltcGx5IGxpc3RlbiB0byB0aGUgYChmb2N1cylgIGFuZFxuICAgIC8vIGAoYmx1cilgIGV2ZW50cyBvbiB0aGUgbGlzdCBpdGVtIGFuZCBlbmFibGUvZGlzYWJsZSBmb2N1cyBvbiB0aGUgY2hpbGRyZW4gdGhlbXNlbHZlcyBhc1xuICAgIC8vIGFwcHJvcHJpYXRlLlxuICAgIHNldFRhYkluZGV4Rm9yTGlzdEl0ZW1DaGlsZHJlbigpIHt9LFxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGhhdmUgYSBkdW1teSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgYmFzZSBjbGFzcyBiZWNhdXNlIHRoZXkgYXJlIG9ubHlcbiAgICAvLyBhcHBsaWNhYmxlIHRvIGNlcnRhaW4gdHlwZXMgb2YgbGlzdHMuIFRoZXkgc2hvdWxkIGJlIGltcGxlbWVudGVkIGZvciB0aGUgY29uY3JldGUgY2xhc3Nlc1xuICAgIC8vIHdoZXJlIHRoZXkgYXJlIGFwcGxpY2FibGUuXG4gICAgaGFzQ2hlY2tib3hBdEluZGV4KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgaGFzUmFkaW9BdEluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIHNldENoZWNrZWRDaGVja2JveE9yUmFkaW9BdEluZGV4KGluZGV4OiBudW1iZXIsIGNoZWNrZWQ6IGJvb2xlYW4pIHt9LFxuICAgIGlzQ2hlY2tib3hDaGVja2VkQXRJbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBub3RpZnlTZWxlY3Rpb25DaGFuZ2UoKSB7fSxcbiAgICBub3RpZnlBY3Rpb24oKSB7fSxcbiAgfTtcbn1cbiJdfQ==
|