@taiga-ui/kit
Version:
Taiga UI Angular main components kit
86 lines • 22.3 kB
JavaScript
import { NgForOf, NgIf } from '@angular/common';
import { ChangeDetectionStrategy, Component, computed, EventEmitter, forwardRef, inject, Input, isSignal, Output, signal, ViewChild, ViewChildren, } from '@angular/core';
import { EMPTY_QUERY } from '@taiga-ui/cdk/constants';
import { TuiElement } from '@taiga-ui/cdk/directives/element';
import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { tuiIsNativeFocused } from '@taiga-ui/cdk/utils/focus';
import { tuiIsPresent } from '@taiga-ui/cdk/utils/miscellaneous';
import { tuiAsDataListAccessor, TuiDataList, TuiDataListComponent, tuiInjectDataListSize, TuiOption, TuiOptionWithValue, } from '@taiga-ui/core/components/data-list';
import { TuiLoader } from '@taiga-ui/core/components/loader';
import { TUI_ITEMS_HANDLERS, } from '@taiga-ui/core/directives/items-handlers';
import { TUI_ITEMS_HANDLERS as TUI_ITEMS_HANDLERS_LEGACY, } from '@taiga-ui/kit/tokens';
import { PolymorpheusOutlet } from '@taiga-ui/polymorpheus';
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/core/components/data-list";
class TuiDataListWrapperComponent {
constructor() {
this.datalist = signal(null);
this.itemsHandlers = inject(TUI_ITEMS_HANDLERS);
// TODO(v5): delete
this.itemsHandlersLegacy = inject(TUI_ITEMS_HANDLERS_LEGACY);
// TODO(v5): delete
this.legacyOptionsQuery = EMPTY_QUERY;
// TODO(v5): delete
this.optionsQuery = EMPTY_QUERY;
this.newOptionMode = tuiInjectElement().hasAttribute('new');
this.items = [];
this.disabledItemHandler = this.newOptionMode
? this.itemsHandlers?.disabledItemHandler()
: this.itemsHandlersLegacy.disabledItemHandler;
this.size = tuiInjectDataListSize();
this.itemClick = new EventEmitter();
this.options = computed(() => this.datalist()?.options() ?? []);
this.itemContent = ({ $implicit }) => this.newOptionMode
? this.itemsHandlers.stringify()($implicit)
: this.itemsHandlersLegacy.stringify($implicit);
}
getContext($implicit, { nativeElement }) {
return { $implicit, active: tuiIsNativeFocused(nativeElement) };
}
// TODO(v5): delete
getOptions(includeDisabled = false) {
return [
...this.legacyOptionsQuery,
...this.optionsQuery,
]
.filter(({ disabled }) => includeDisabled || !disabled)
.map(({ value }) => (isSignal(value) ? value() : value))
.filter(tuiIsPresent);
}
// TODO(v5): use signal `viewChild`
set datalistSetter(x) {
this.datalist.set(x);
}
$cast(items) {
return items;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDataListWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiDataListWrapperComponent, isStandalone: true, selector: "tui-data-list-wrapper:not([labels]), tui-data-list-wrapper:not([labels])[new]", inputs: { items: "items", disabledItemHandler: "disabledItemHandler", emptyContent: "emptyContent", size: "size", itemContent: "itemContent" }, outputs: { itemClick: "itemClick" }, providers: [tuiAsDataListAccessor(TuiDataListWrapperComponent)], viewQueries: [{ propertyName: "datalistSetter", first: true, predicate: TuiDataListComponent, descendants: true }, { propertyName: "legacyOptionsQuery", predicate: i0.forwardRef(function () { return TuiOption; }), descendants: true }, { propertyName: "optionsQuery", predicate: i0.forwardRef(function () { return TuiOptionWithValue; }), descendants: true }], ngImport: i0, template: "<tui-data-list\n *ngIf=\"items; else loading\"\n [emptyContent]=\"emptyContent\"\n [size]=\"size\"\n>\n <ng-container *ngIf=\"newOptionMode; else legacyOptionFallback\">\n <button\n *ngFor=\"let item of $cast(items)\"\n #elementRef=\"elementRef\"\n new\n tuiElement\n tuiOption\n type=\"button\"\n [disabled]=\"disabledItemHandler(item)\"\n [value]=\"item\"\n (click.capture)=\"itemClick.emit(item)\"\n >\n <ng-container *polymorpheusOutlet=\"itemContent as text; context: getContext(item, elementRef)\">\n {{ text }}\n </ng-container>\n </button>\n </ng-container>\n\n <!-- TODO(v5): delete fallback -->\n <ng-template #legacyOptionFallback>\n <button\n *ngFor=\"let item of $cast(items)\"\n #elementRef=\"elementRef\"\n automation-id=\"tui-data-list-wrapper__option\"\n tuiElement\n tuiOption\n type=\"button\"\n [disabled]=\"disabledItemHandler(item)\"\n [value]=\"item\"\n (click)=\"itemClick.emit(item)\"\n >\n <span class=\"t-content\">\n <ng-container *polymorpheusOutlet=\"itemContent as text; context: getContext(item, elementRef)\">\n {{ text }}\n </ng-container>\n </span>\n </button>\n </ng-template>\n</tui-data-list>\n<ng-template #loading>\n <tui-loader\n automation-id=\"tui-data-list-wrapper__loader\"\n class=\"t-loader\"\n />\n</ng-template>\n", styles: [":host{display:block}.t-content{flex:1;min-inline-size:0}.t-loader{margin:.75rem 0}\n"], dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "component", type: i1.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "component", type: i1.TuiOption, selector: "button[tuiOption]:not([new]), a[tuiOption]:not([new]), label[tuiOption]:not([new])", inputs: ["disabled", "value"] }, { kind: "directive", type: i1.TuiOptionNew, selector: "button[tuiOption][new], a[tuiOption][new], label[tuiOption][new]", inputs: ["disabled"] }, { kind: "directive", type: i1.TuiOptionWithValue, selector: "button[tuiOption][value][new], a[tuiOption][value][new], label[tuiOption][value][new]", inputs: ["disabled", "value"] }, { kind: "directive", type: TuiElement, selector: "[tuiElement]", exportAs: ["elementRef"] }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiDataListWrapperComponent };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDataListWrapperComponent, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'tui-data-list-wrapper:not([labels]), tui-data-list-wrapper:not([labels])[new]', imports: [NgForOf, NgIf, PolymorpheusOutlet, TuiDataList, TuiElement, TuiLoader], changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiAsDataListAccessor(TuiDataListWrapperComponent)], template: "<tui-data-list\n *ngIf=\"items; else loading\"\n [emptyContent]=\"emptyContent\"\n [size]=\"size\"\n>\n <ng-container *ngIf=\"newOptionMode; else legacyOptionFallback\">\n <button\n *ngFor=\"let item of $cast(items)\"\n #elementRef=\"elementRef\"\n new\n tuiElement\n tuiOption\n type=\"button\"\n [disabled]=\"disabledItemHandler(item)\"\n [value]=\"item\"\n (click.capture)=\"itemClick.emit(item)\"\n >\n <ng-container *polymorpheusOutlet=\"itemContent as text; context: getContext(item, elementRef)\">\n {{ text }}\n </ng-container>\n </button>\n </ng-container>\n\n <!-- TODO(v5): delete fallback -->\n <ng-template #legacyOptionFallback>\n <button\n *ngFor=\"let item of $cast(items)\"\n #elementRef=\"elementRef\"\n automation-id=\"tui-data-list-wrapper__option\"\n tuiElement\n tuiOption\n type=\"button\"\n [disabled]=\"disabledItemHandler(item)\"\n [value]=\"item\"\n (click)=\"itemClick.emit(item)\"\n >\n <span class=\"t-content\">\n <ng-container *polymorpheusOutlet=\"itemContent as text; context: getContext(item, elementRef)\">\n {{ text }}\n </ng-container>\n </span>\n </button>\n </ng-template>\n</tui-data-list>\n<ng-template #loading>\n <tui-loader\n automation-id=\"tui-data-list-wrapper__loader\"\n class=\"t-loader\"\n />\n</ng-template>\n", styles: [":host{display:block}.t-content{flex:1;min-inline-size:0}.t-loader{margin:.75rem 0}\n"] }]
}], propDecorators: { legacyOptionsQuery: [{
type: ViewChildren,
args: [forwardRef(() => TuiOption)]
}], optionsQuery: [{
type: ViewChildren,
args: [forwardRef(() => TuiOptionWithValue)]
}], items: [{
type: Input
}], disabledItemHandler: [{
type: Input
}], emptyContent: [{
type: Input
}], size: [{
type: Input
}], itemClick: [{
type: Output
}], itemContent: [{
type: Input
}], datalistSetter: [{
type: ViewChild,
args: [TuiDataListComponent]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LXdyYXBwZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvZGF0YS1saXN0LXdyYXBwZXIvZGF0YS1saXN0LXdyYXBwZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvZGF0YS1saXN0LXdyYXBwZXIvZGF0YS1saXN0LXdyYXBwZXIudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFFUixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFFTixNQUFNLEVBQ04sU0FBUyxFQUNULFlBQVksR0FDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBRTVELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRCxPQUFPLEVBQ0gscUJBQXFCLEVBQ3JCLFdBQVcsRUFFWCxvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLFNBQVMsRUFDVCxrQkFBa0IsR0FDckIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDM0QsT0FBTyxFQUNILGtCQUFrQixHQUVyQixNQUFNLDBDQUEwQyxD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UztpQ0FDTSxJQUFJLFlBRVosK0VBQStFLFdBQzFFLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxtQkFHL0QsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLHFCQUFxQiw2QkFBNkIsQ0FBQzs4QkFZNUMsa0JBQWtCO3NCQURwQyxZQUFZO3VCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBS3RCLFlBQVk7c0JBRDlCLFlBQVk7dUJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2dCQU0zQyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQU1DLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsSUFBSTtzQkFEVixLQUFLO2dCQUlVLFNBQVM7c0JBRHhCLE1BQU07Z0JBTUEsV0FBVztzQkFEakIsS0FBSztnQkEwQlEsY0FBYztzQkFEM0IsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05nRm9yT2YsIE5nSWZ9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICB0eXBlIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIGlzU2lnbmFsLFxuICAgIE91dHB1dCxcbiAgICB0eXBlIFF1ZXJ5TGlzdCxcbiAgICBzaWduYWwsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0VNUFRZX1FVRVJZfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NvbnN0YW50cyc7XG5pbXBvcnQge1R1aUVsZW1lbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvZGlyZWN0aXZlcy9lbGVtZW50JztcbmltcG9ydCB7dHlwZSBUdWlCb29sZWFuSGFuZGxlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay90eXBlcyc7XG5pbXBvcnQge3R1aUluamVjdEVsZW1lbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvZG9tJztcbmltcG9ydCB7dHVpSXNOYXRpdmVGb2N1c2VkfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL2ZvY3VzJztcbmltcG9ydCB7dHVpSXNQcmVzZW50fSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21pc2NlbGxhbmVvdXMnO1xuaW1wb3J0IHtcbiAgICB0dWlBc0RhdGFMaXN0QWNjZXNzb3IsXG4gICAgVHVpRGF0YUxpc3QsXG4gICAgdHlwZSBUdWlEYXRhTGlzdEFjY2Vzc29yLFxuICAgIFR1aURhdGFMaXN0Q29tcG9uZW50LFxuICAgIHR1aUluamVjdERhdGFMaXN0U2l6ZSxcbiAgICBUdWlPcHRpb24sXG4gICAgVHVpT3B0aW9uV2l0aFZhbHVlLFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2RhdGEtbGlzdCc7XG5pbXBvcnQge1R1aUxvYWRlcn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9sb2FkZXInO1xuaW1wb3J0IHtcbiAgICBUVUlfSVRFTVNfSEFORExFUlMsXG4gICAgdHlwZSBUdWlJdGVtc0hhbmRsZXJzLFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2l0ZW1zLWhhbmRsZXJzJztcbmltcG9ydCB7dHlwZSBUdWlWYWx1ZUNvbnRlbnRDb250ZXh0fSBmcm9tICdAdGFpZ2EtdWkvY29yZS90eXBlcyc7XG5pbXBvcnQge1xuICAgIFRVSV9JVEVNU19IQU5ETEVSUyBhcyBUVUlfSVRFTVNfSEFORExFUlNfTEVHQUNZLFxuICAgIHR5cGUgVHVpSXRlbXNIYW5kbGVycyBhcyBUdWlJdGVtc0hhbmRsZXJzTGVnYWN5LFxufSBmcm9tICdAdGFpZ2EtdWkva2l0L3Rva2Vucyc7XG5pbXBvcnQge3R5cGUgUG9seW1vcnBoZXVzQ29udGVudCwgUG9seW1vcnBoZXVzT3V0bGV0fSBmcm9tICdAdGFpZ2EtdWkvcG9seW1vcnBoZXVzJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjpcbiAgICAgICAgJ3R1aS1kYXRhLWxpc3Qtd3JhcHBlcjpub3QoW2xhYmVsc10pLCB0dWktZGF0YS1saXN0LXdyYXBwZXI6bm90KFtsYWJlbHNdKVtuZXddJywgLy8gVE9ETyh2NSk6IHJlbW92ZSBbbmV3XVxuICAgIGltcG9ydHM6IFtOZ0Zvck9mLCBOZ0lmLCBQb2x5bW9ycGhldXNPdXRsZXQsIFR1aURhdGFMaXN0LCBUdWlFbGVtZW50LCBUdWlMb2FkZXJdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRhLWxpc3Qtd3JhcHBlci50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kYXRhLWxpc3Qtd3JhcHBlci5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbdHVpQXNEYXRhTGlzdEFjY2Vzc29yKFR1aURhdGFMaXN0V3JhcHBlckNvbXBvbmVudCldLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlEYXRhTGlzdFdyYXBwZXJDb21wb25lbnQ8VCwgSyA9IFQ+IGltcGxlbWVudHMgVHVpRGF0YUxpc3RBY2Nlc3NvcjxUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRhbGlzdCA9IHNpZ25hbDxUdWlEYXRhTGlzdENvbXBvbmVudDxUPiB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXRlbXNIYW5kbGVyczogVHVpSXRlbXNIYW5kbGVyczxUPiA9IGluamVjdChUVUlfSVRFTVNfSEFORExFUlMpO1xuICAgIC8vIFRPRE8odjUpOiBkZWxldGVcbiAgICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1zSGFuZGxlcnNMZWdhY3k6IFR1aUl0ZW1zSGFuZGxlcnNMZWdhY3k8VD4gPSBpbmplY3QoXG4gICAgICAgIFRVSV9JVEVNU19IQU5ETEVSU19MRUdBQ1ksXG4gICAgKTtcblxuICAgIC8vIFRPRE8odjUpOiBkZWxldGVcbiAgICBAVmlld0NoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gVHVpT3B0aW9uKSlcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbGVnYWN5T3B0aW9uc1F1ZXJ5OiBRdWVyeUxpc3Q8VHVpT3B0aW9uPFQ+PiA9IEVNUFRZX1FVRVJZO1xuXG4gICAgLy8gVE9ETyh2NSk6IGRlbGV0ZVxuICAgIEBWaWV3Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBUdWlPcHRpb25XaXRoVmFsdWUpKVxuICAgIHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zUXVlcnk6IFF1ZXJ5TGlzdDxUdWlPcHRpb25XaXRoVmFsdWU8VD4+ID0gRU1QVFlfUVVFUlk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV3T3B0aW9uTW9kZSA9IHR1aUluamVjdEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoJ25ldycpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXRlbXM6IHJlYWRvbmx5IEtbXSB8IG51bGwgPSBbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkSXRlbUhhbmRsZXI6IFR1aUJvb2xlYW5IYW5kbGVyPFQ+ID0gdGhpcy5uZXdPcHRpb25Nb2RlXG4gICAgICAgID8gdGhpcy5pdGVtc0hhbmRsZXJzPy5kaXNhYmxlZEl0ZW1IYW5kbGVyKClcbiAgICAgICAgOiB0aGlzLml0ZW1zSGFuZGxlcnNMZWdhY3kuZGlzYWJsZWRJdGVtSGFuZGxlcjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGVtcHR5Q29udGVudDogUG9seW1vcnBoZXVzQ29udGVudDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNpemUgPSB0dWlJbmplY3REYXRhTGlzdFNpemUoKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGF0YWxpc3QoKT8ub3B0aW9ucygpID8/IFtdKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW1Db250ZW50OiBQb2x5bW9ycGhldXNDb250ZW50PFR1aVZhbHVlQ29udGVudENvbnRleHQ8VD4+ID0gKHskaW1wbGljaXR9KSA9PlxuICAgICAgICB0aGlzLm5ld09wdGlvbk1vZGVcbiAgICAgICAgICAgID8gdGhpcy5pdGVtc0hhbmRsZXJzLnN0cmluZ2lmeSgpKCRpbXBsaWNpdClcbiAgICAgICAgICAgIDogdGhpcy5pdGVtc0hhbmRsZXJzTGVnYWN5LnN0cmluZ2lmeSgkaW1wbGljaXQpO1xuXG4gICAgcHVibGljIGdldENvbnRleHQoXG4gICAgICAgICRpbXBsaWNpdDogVCxcbiAgICAgICAge25hdGl2ZUVsZW1lbnR9OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICApOiBUdWlWYWx1ZUNvbnRlbnRDb250ZXh0PFQ+IHtcbiAgICAgICAgcmV0dXJuIHskaW1wbGljaXQsIGFjdGl2ZTogdHVpSXNOYXRpdmVGb2N1c2VkKG5hdGl2ZUVsZW1lbnQpfTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKHY1KTogZGVsZXRlXG4gICAgcHVibGljIGdldE9wdGlvbnMoaW5jbHVkZURpc2FibGVkID0gZmFsc2UpOiByZWFkb25seSBUW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4udGhpcy5sZWdhY3lPcHRpb25zUXVlcnksIC8vIFRPRE8odjUpOiBkZWxldGVcbiAgICAgICAgICAgIC4uLnRoaXMub3B0aW9uc1F1ZXJ5LFxuICAgICAgICBdXG4gICAgICAgICAgICAuZmlsdGVyKCh7ZGlzYWJsZWR9KSA9PiBpbmNsdWRlRGlzYWJsZWQgfHwgIWRpc2FibGVkKVxuICAgICAgICAgICAgLm1hcCgoe3ZhbHVlfSkgPT4gKGlzU2lnbmFsKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZSkpXG4gICAgICAgICAgICAuZmlsdGVyKHR1aUlzUHJlc2VudCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyh2NSk6IHVzZSBzaWduYWwgYHZpZXdDaGlsZGBcbiAgICBAVmlld0NoaWxkKFR1aURhdGFMaXN0Q29tcG9uZW50KVxuICAgIHByb3RlY3RlZCBzZXQgZGF0YWxpc3RTZXR0ZXIoeDogVHVpRGF0YUxpc3RDb21wb25lbnQ8VD4pIHtcbiAgICAgICAgdGhpcy5kYXRhbGlzdC5zZXQoeCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkICRjYXN0KGl0ZW1zOiByZWFkb25seSBLW10pOiByZWFkb25seSBUW10ge1xuICAgICAgICByZXR1cm4gaXRlbXMgYXMgdW5rbm93biBhcyByZWFkb25seSBUW107XG4gICAgfVxufVxuIiwiPHR1aS1kYXRhLWxpc3RcbiAgICAqbmdJZj1cIml0ZW1zOyBlbHNlIGxvYWRpbmdcIlxuICAgIFtlbXB0eUNvbnRlbnRdPVwiZW1wdHlDb250ZW50XCJcbiAgICBbc2l6ZV09XCJzaXplXCJcbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibmV3T3B0aW9uTW9kZTsgZWxzZSBsZWdhY3lPcHRpb25GYWxsYmFja1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiAkY2FzdChpdGVtcylcIlxuICAgICAgICAgICAgI2VsZW1lbnRSZWY9XCJlbGVtZW50UmVmXCJcbiAgICAgICAgICAgIG5ld1xuICAgICAgICAgICAgdHVpRWxlbWVudFxuICAgICAgICAgICAgdHVpT3B0aW9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZEl0ZW1IYW5kbGVyKGl0ZW0pXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgIChjbGljay5jYXB0dXJlKT1cIml0ZW1DbGljay5lbWl0KGl0ZW0pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqcG9seW1vcnBoZXVzT3V0bGV0PVwiaXRlbUNvbnRlbnQgYXMgdGV4dDsgY29udGV4dDogZ2V0Q29udGV4dChpdGVtLCBlbGVtZW50UmVmKVwiPlxuICAgICAgICAgICAgICAgIHt7IHRleHQgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gVE9ETyh2NSk6IGRlbGV0ZSBmYWxsYmFjayAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2xlZ2FjeU9wdGlvbkZhbGxiYWNrPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiAkY2FzdChpdGVtcylcIlxuICAgICAgICAgICAgI2VsZW1lbnRSZWY9XCJlbGVtZW50UmVmXCJcbiAgICAgICAgICAgIGF1dG9tYXRpb24taWQ9XCJ0dWktZGF0YS1saXN0LXdyYXBwZXJfX29wdGlvblwiXG4gICAgICAgICAgICB0dWlFbGVtZW50XG4gICAgICAgICAgICB0dWlPcHRpb25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkSXRlbUhhbmRsZXIoaXRlbSlcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIml0ZW1DbGljay5lbWl0KGl0ZW0pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpwb2x5bW9ycGhldXNPdXRsZXQ9XCJpdGVtQ29udGVudCBhcyB0ZXh0OyBjb250ZXh0OiBnZXRDb250ZXh0KGl0ZW0sIGVsZW1lbnRSZWYpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRleHQgfX1cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvdHVpLWRhdGEtbGlzdD5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgICA8dHVpLWxvYWRlclxuICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWRhdGEtbGlzdC13cmFwcGVyX19sb2FkZXJcIlxuICAgICAgICBjbGFzcz1cInQtbG9hZGVyXCJcbiAgICAvPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==