@taiga-ui/kit
Version:
Taiga UI Angular main components kit
105 lines • 19.7 kB
JavaScript
import { __decorate } from "tslib";
import { ContentChildren, DestroyRef, Directive, ElementRef, inject, } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { EMPTY_QUERY } from '@taiga-ui/cdk/constants';
import { tuiPreventDefault, tuiQueryListChanges, tuiTypedFromEvent, } from '@taiga-ui/cdk/observables';
import { tuiGetClosestFocusable } from '@taiga-ui/cdk/utils/focus';
import { tuiPure } from '@taiga-ui/cdk/utils/miscellaneous';
import { TuiDropdownDirective } from '@taiga-ui/core/directives/dropdown';
import { debounceTime, EMPTY, filter, map, merge, shareReplay, switchMap, take, tap, } from 'rxjs';
import * as i0 from "@angular/core";
class TuiDataListDropdownManager {
constructor() {
this.dropdowns = EMPTY_QUERY;
this.els = EMPTY_QUERY;
this.destroyRef = inject(DestroyRef);
}
ngAfterViewInit() {
this.right$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((index) => {
this.tryToFocus(index);
});
merge(this.immediate$, this.debounce$)
.pipe(switchMap((active) => {
this.dropdowns.forEach((dropdown, index) => {
dropdown.toggle(index === active);
});
const element = this.els.get(active);
const dropdown = this.dropdowns.get(active);
const ref = dropdown?.ref();
if (!element || !dropdown || !ref) {
return EMPTY;
}
const { nativeElement } = ref.location;
const mouseEnter$ = tuiTypedFromEvent(nativeElement, 'mouseenter').pipe(take(1));
const esc$ = merge(tuiTypedFromEvent(element.nativeElement, 'keydown'), tuiTypedFromEvent(nativeElement, 'keydown')).pipe(filter(({ key }) => key === 'Escape'));
return merge(mouseEnter$, esc$).pipe(tap((event) => {
if (dropdown.ref()) {
event.stopPropagation();
}
element.nativeElement.focus();
dropdown.toggle('offsetX' in event);
}));
}), takeUntilDestroyed(this.destroyRef))
.subscribe();
}
get elements$() {
return tuiQueryListChanges(this.els).pipe(map((array) => array.map(({ nativeElement }) => nativeElement)), shareReplay({ bufferSize: 1, refCount: true }));
}
get right$() {
return this.elements$.pipe(switchMap((elements) => merge(...elements.map((element, index) => tuiTypedFromEvent(element, 'keydown').pipe(filter(({ key }) => key === 'ArrowRight'), tuiPreventDefault(), map(() => index))))));
}
get immediate$() {
return this.elements$.pipe(switchMap((elements) => merge(...elements.map((element, index) => tuiTypedFromEvent(element, 'click').pipe(map(() => index))))));
}
get debounce$() {
return this.elements$.pipe(switchMap((elements) => merge(...elements.map((element, index) => merge(tuiTypedFromEvent(element, 'focus'), tuiTypedFromEvent(element, 'blur')).pipe(filter(({ relatedTarget }) => this.notInDropdown(relatedTarget, index)), map(({ type }) => (type === 'focus' ? index : NaN)))))), debounceTime(300));
}
notInDropdown(element, index) {
return !this.dropdowns
.get(index)
?.ref()
?.location.nativeElement.contains(element);
}
tryToFocus(index) {
const content = this.dropdowns.get(index)?.ref()?.location.nativeElement;
if (!content) {
return;
}
// First item is focus trap
const focusTrap = tuiGetClosestFocusable({ initial: content, root: content });
const item = tuiGetClosestFocusable({
initial: focusTrap || content,
root: content,
});
item?.focus();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDataListDropdownManager, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiDataListDropdownManager, isStandalone: true, selector: "tui-data-list[tuiDataListDropdownManager]", queries: [{ propertyName: "dropdowns", predicate: TuiDropdownDirective, descendants: true }, { propertyName: "els", predicate: TuiDropdownDirective, descendants: true, read: ElementRef }], ngImport: i0 }); }
}
__decorate([
tuiPure
], TuiDataListDropdownManager.prototype, "elements$", null);
__decorate([
tuiPure
], TuiDataListDropdownManager.prototype, "right$", null);
__decorate([
tuiPure
], TuiDataListDropdownManager.prototype, "immediate$", null);
__decorate([
tuiPure
], TuiDataListDropdownManager.prototype, "debounce$", null);
export { TuiDataListDropdownManager };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDataListDropdownManager, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: 'tui-data-list[tuiDataListDropdownManager]',
}]
}], propDecorators: { dropdowns: [{
type: ContentChildren,
args: [TuiDropdownDirective, { descendants: true }]
}], els: [{
type: ContentChildren,
args: [TuiDropdownDirective, { read: ElementRef, descendants: true }]
}], elements$: [], right$: [], immediate$: [], debounce$: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LWRyb3Bkb3duLW1hbmFnZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2RpcmVjdGl2ZXMvZGF0YS1saXN0LWRyb3Bkb3duLW1hbmFnZXIvZGF0YS1saXN0LWRyb3Bkb3duLW1hbmFnZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUgsZUFBZSxFQUNmLFVBQVUsRUFDVixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sR0FFVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNILGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ3BCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQzFELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFDSCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUVMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsR0FDTixNQUFNLE1BQU0sQ0FBQzs7QUFFZCxNQUlhLDBCQUEwQjtJQUp2QztRQU1xQixjQUFTLEdBQW9DLFdBQVcsQ0FBQztRQUd6RCxRQUFHLEdBQXVDLFdBQVcsQ0FBQztRQUV0RCxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBbUlwRDtJQWpJVSxlQUFlO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFD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O29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsMkNBQTJDO2lCQUN4RDs4QkFHb0IsU0FBUztzQkFEekIsZUFBZTt1QkFBQyxvQkFBb0IsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUM7Z0JBSXpDLEdBQUc7c0JBRG5CLGVBQWU7dUJBQUMsb0JBQW9CLEVBQUUsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUM7Z0JBb0RoRSxTQUFTLE1BUVQsTUFBTSxNQWlCTixVQUFVLE1BYVYsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgdHlwZSBBZnRlclZpZXdJbml0LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBEZXN0cm95UmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICB0eXBlIFF1ZXJ5TGlzdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtFTVBUWV9RVUVSWX0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgICB0dWlQcmV2ZW50RGVmYXVsdCxcbiAgICB0dWlRdWVyeUxpc3RDaGFuZ2VzLFxuICAgIHR1aVR5cGVkRnJvbUV2ZW50LFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrL29ic2VydmFibGVzJztcbmltcG9ydCB7dHVpR2V0Q2xvc2VzdEZvY3VzYWJsZX0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9mb2N1cyc7XG5pbXBvcnQge3R1aVB1cmV9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQge1R1aURyb3Bkb3duRGlyZWN0aXZlfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2Ryb3Bkb3duJztcbmltcG9ydCB7XG4gICAgZGVib3VuY2VUaW1lLFxuICAgIEVNUFRZLFxuICAgIGZpbHRlcixcbiAgICBtYXAsXG4gICAgbWVyZ2UsXG4gICAgdHlwZSBPYnNlcnZhYmxlLFxuICAgIHNoYXJlUmVwbGF5LFxuICAgIHN3aXRjaE1hcCxcbiAgICB0YWtlLFxuICAgIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICd0dWktZGF0YS1saXN0W3R1aURhdGFMaXN0RHJvcGRvd25NYW5hZ2VyXScsXG59KVxuZXhwb3J0IGNsYXNzIFR1aURhdGFMaXN0RHJvcGRvd25NYW5hZ2VyIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgQENvbnRlbnRDaGlsZHJlbihUdWlEcm9wZG93bkRpcmVjdGl2ZSwge2Rlc2NlbmRhbnRzOiB0cnVlfSlcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bkb3duczogUXVlcnlMaXN0PFR1aURyb3Bkb3duRGlyZWN0aXZlPiA9IEVNUFRZX1FVRVJZO1xuXG4gICAgQENvbnRlbnRDaGlsZHJlbihUdWlEcm9wZG93bkRpcmVjdGl2ZSwge3JlYWQ6IEVsZW1lbnRSZWYsIGRlc2NlbmRhbnRzOiB0cnVlfSlcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsczogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PiA9IEVNUFRZX1FVRVJZO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yaWdodCQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzKGluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbWVyZ2UodGhpcy5pbW1lZGlhdGUkLCB0aGlzLmRlYm91bmNlJClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoYWN0aXZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25zLmZvckVhY2goKGRyb3Bkb3duLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24udG9nZ2xlKGluZGV4ID09PSBhY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbHMuZ2V0KGFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5kcm9wZG93bnMuZ2V0KGFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZiA9IGRyb3Bkb3duPy5yZWYoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIWRyb3Bkb3duIHx8ICFyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHtuYXRpdmVFbGVtZW50fSA9IHJlZi5sb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW91c2VFbnRlciQgPSB0dWlUeXBlZEZyb21FdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAnbW91c2VlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICkucGlwZSh0YWtlKDEpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjJCA9IG1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdHVpVHlwZWRGcm9tRXZlbnQoZWxlbWVudC5uYXRpdmVFbGVtZW50LCAna2V5ZG93bicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHVpVHlwZWRGcm9tRXZlbnQobmF0aXZlRWxlbWVudCwgJ2tleWRvd24nKSxcbiAgICAgICAgICAgICAgICAgICAgKS5waXBlKGZpbHRlcigoe2tleX0pID0+IGtleSA9PT0gJ0VzY2FwZScpKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2UobW91c2VFbnRlciQsIGVzYyQpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duLnJlZigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLnRvZ2dsZSgnb2Zmc2V0WCcgaW4gZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgQHR1aVB1cmVcbiAgICBwcml2YXRlIGdldCBlbGVtZW50cyQoKTogT2JzZXJ2YWJsZTxyZWFkb25seSBIVE1MRWxlbWVudFtdPiB7XG4gICAgICAgIHJldHVybiB0dWlRdWVyeUxpc3RDaGFuZ2VzKHRoaXMuZWxzKS5waXBlKFxuICAgICAgICAgICAgbWFwKChhcnJheSkgPT4gYXJyYXkubWFwKCh7bmF0aXZlRWxlbWVudH0pID0+IG5hdGl2ZUVsZW1lbnQpKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KHtidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZX0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIEB0dWlQdXJlXG4gICAgcHJpdmF0ZSBnZXQgcmlnaHQkKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzJC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChlbGVtZW50cykgPT5cbiAgICAgICAgICAgICAgICBtZXJnZShcbiAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudHMubWFwKChlbGVtZW50LCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KGVsZW1lbnQsICdrZXlkb3duJykucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKHtrZXl9KSA9PiBrZXkgPT09ICdBcnJvd1JpZ2h0JyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpUHJldmVudERlZmF1bHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBAdHVpUHVyZVxuICAgIHByaXZhdGUgZ2V0IGltbWVkaWF0ZSQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMkLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGVsZW1lbnRzKSA9PlxuICAgICAgICAgICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAuLi5lbGVtZW50cy5tYXAoKGVsZW1lbnQsIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdHVpVHlwZWRGcm9tRXZlbnQoZWxlbWVudCwgJ2NsaWNrJykucGlwZShtYXAoKCkgPT4gaW5kZXgpKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBAdHVpUHVyZVxuICAgIHByaXZhdGUgZ2V0IGRlYm91bmNlJCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cyQucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoZWxlbWVudHMpID0+XG4gICAgICAgICAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCwgaW5kZXgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlUeXBlZEZyb21FdmVudChlbGVtZW50LCAnZm9jdXMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlUeXBlZEZyb21FdmVudChlbGVtZW50LCAnYmx1cicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcigoe3JlbGF0ZWRUYXJnZXR9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdEluRHJvcGRvd24ocmVsYXRlZFRhcmdldCwgaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCh7dHlwZX0pID0+ICh0eXBlID09PSAnZm9jdXMnID8gaW5kZXggOiBOYU4pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdEluRHJvcGRvd24oZWxlbWVudDogRXZlbnRUYXJnZXQgfCBudWxsLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kcm9wZG93bnNcbiAgICAgICAgICAgIC5nZXQoaW5kZXgpXG4gICAgICAgICAgICA/LnJlZigpXG4gICAgICAgICAgICA/LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZHJvcGRvd25zLmdldChpbmRleCk/LnJlZigpPy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgaXRlbSBpcyBmb2N1cyB0cmFwXG4gICAgICAgIGNvbnN0IGZvY3VzVHJhcCA9IHR1aUdldENsb3Nlc3RGb2N1c2FibGUoe2luaXRpYWw6IGNvbnRlbnQsIHJvb3Q6IGNvbnRlbnR9KTtcbiAgICAgICAgY29uc3QgaXRlbSA9IHR1aUdldENsb3Nlc3RGb2N1c2FibGUoe1xuICAgICAgICAgICAgaW5pdGlhbDogZm9jdXNUcmFwIHx8IGNvbnRlbnQsXG4gICAgICAgICAgICByb290OiBjb250ZW50LFxuICAgICAgICB9KTtcblxuICAgICAgICBpdGVtPy5mb2N1cygpO1xuICAgIH1cbn1cbiJdfQ==