@taiga-ui/layout
Version:
A package with Taiga UI layout components
81 lines • 20 kB
JavaScript
import { NgForOf, NgIf, NgTemplateOutlet } from '@angular/common';
import { ChangeDetectionStrategy, Component, computed, ContentChildren, ElementRef, inject, Input, signal, TemplateRef, ViewChild, } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { NgControl } from '@angular/forms';
import { WaResizeObserverService } from '@ng-web-apis/resize-observer';
import { EMPTY_QUERY } from '@taiga-ui/cdk/constants';
import { TuiItem } from '@taiga-ui/cdk/directives/item';
import { tuiControlValue, tuiQueryListChanges, tuiZonefull, } from '@taiga-ui/cdk/observables';
import { tuiIsControlEmpty } from '@taiga-ui/cdk/utils/miscellaneous';
import { TuiButton, tuiButtonOptionsProvider } from '@taiga-ui/core/components/button';
import { TuiTextfieldOptionsDirective } from '@taiga-ui/core/components/textfield';
import { distinctUntilChanged, map, merge, switchMap } from 'rxjs';
import { TuiSearchFilterComponent } from './search-filter.component';
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/core/components/textfield";
const WIDTH = 12;
class TuiSearchFiltersComponent {
constructor() {
this.children = EMPTY_QUERY;
this.controls = signal([]);
this.templates = EMPTY_QUERY;
this.overflown = toSignal(inject(WaResizeObserverService, { self: true }).pipe(map((entry) => {
const width = entry[0]?.contentRect.width ?? 0;
return Math.floor((width - this.more) / WIDTH / this.unit);
}), distinctUntilChanged(), tuiZonefull()), { initialValue: 0 });
this.enabled = computed(() => this.controls().some(({ control }, index) => control && index >= this.overflown() && !tuiIsControlEmpty(control)));
this.size = 'm';
}
// TODO: Refactor to signal queries when Angular is updated
ngAfterContentInit() {
tuiQueryListChanges(this.children)
.pipe(switchMap((all) => merge(...all.map((c) => tuiControlValue(c)))), map(() => this.children.toArray()))
.subscribe((controls) => this.controls.set(controls));
}
onReset() {
this.children.forEach(({ control }, index) => {
if (control && index >= this.overflown()) {
control.setValue(null);
}
});
}
get unit() {
return this.rem?.nativeElement.offsetWidth || 16;
}
get more() {
return this.button?.nativeElement.clientWidth || 0;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiSearchFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiSearchFiltersComponent, isStandalone: true, selector: "tui-search-filters", inputs: { size: "size" }, providers: [
WaResizeObserverService,
tuiButtonOptionsProvider({ size: 'xs', appearance: 'flat' }),
], queries: [{ propertyName: "children", predicate: NgControl, descendants: true }, { propertyName: "templates", predicate: TuiItem, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "rem", first: true, predicate: ["rem"], descendants: true }, { propertyName: "button", first: true, predicate: TuiButton, descendants: true, read: ElementRef }], hostDirectives: [{ directive: i1.TuiTextfieldOptionsDirective, inputs: ["tuiTextfieldSize", "size"] }], ngImport: i0, template: "<ng-container *ngFor=\"let template of templates; let i = index\">\n <ng-container\n *ngIf=\"i < overflown()\"\n [ngTemplateOutlet]=\"template\"\n />\n</ng-container>\n<div\n #rem\n class=\"t-rem\"\n></div>\n<button\n *ngIf=\"overflown() < templates.length\"\n appearance=\"secondary\"\n tuiIconButton\n tuiSearchFilter\n type=\"button\"\n class=\"t-button\"\n [class._active]=\"enabled()\"\n [size]=\"size\"\n>\n <form\n class=\"t-form\"\n (reset)=\"onReset()\"\n >\n <fieldset\n class=\"t-header\"\n [disabled]=\"!enabled()\"\n >\n <ng-content />\n </fieldset>\n <ng-container *ngFor=\"let template of templates; let i = index\">\n <ng-container\n *ngIf=\"i >= overflown()\"\n [ngTemplateOutlet]=\"template\"\n />\n </ng-container>\n </form>\n</button>\n", styles: [":host{display:flex;flex:1;gap:inherit;justify-content:flex-end;min-inline-size:0}.t-rem{position:absolute;inline-size:1rem}.t-button{overflow:visible}.t-button._active:after{content:\"\";position:absolute;top:.25rem;right:.25rem;display:block;inline-size:.625rem;block-size:.625rem;background:var(--tui-status-warning);transform:translate(50%,-50%);border-radius:100%;margin:0}.t-form{display:flex;min-inline-size:25.5rem;max-inline-size:33rem;flex-direction:column;gap:.75rem;padding:0 1.5rem 1.5rem;box-sizing:border-box}.t-header{display:flex;justify-content:space-between;padding:1.25rem 0;margin:0 0 .5rem;border:none;box-shadow:inset 0 -1px var(--tui-border-normal);font:var(--tui-font-text-ui-l);font-weight:700}\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: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: TuiSearchFilterComponent, selector: "button[tuiSearchFilter]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiSearchFiltersComponent };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiSearchFiltersComponent, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'tui-search-filters', imports: [NgForOf, NgIf, NgTemplateOutlet, TuiButton, TuiSearchFilterComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
WaResizeObserverService,
tuiButtonOptionsProvider({ size: 'xs', appearance: 'flat' }),
], hostDirectives: [
{
directive: TuiTextfieldOptionsDirective,
inputs: ['tuiTextfieldSize: size'],
},
], template: "<ng-container *ngFor=\"let template of templates; let i = index\">\n <ng-container\n *ngIf=\"i < overflown()\"\n [ngTemplateOutlet]=\"template\"\n />\n</ng-container>\n<div\n #rem\n class=\"t-rem\"\n></div>\n<button\n *ngIf=\"overflown() < templates.length\"\n appearance=\"secondary\"\n tuiIconButton\n tuiSearchFilter\n type=\"button\"\n class=\"t-button\"\n [class._active]=\"enabled()\"\n [size]=\"size\"\n>\n <form\n class=\"t-form\"\n (reset)=\"onReset()\"\n >\n <fieldset\n class=\"t-header\"\n [disabled]=\"!enabled()\"\n >\n <ng-content />\n </fieldset>\n <ng-container *ngFor=\"let template of templates; let i = index\">\n <ng-container\n *ngIf=\"i >= overflown()\"\n [ngTemplateOutlet]=\"template\"\n />\n </ng-container>\n </form>\n</button>\n", styles: [":host{display:flex;flex:1;gap:inherit;justify-content:flex-end;min-inline-size:0}.t-rem{position:absolute;inline-size:1rem}.t-button{overflow:visible}.t-button._active:after{content:\"\";position:absolute;top:.25rem;right:.25rem;display:block;inline-size:.625rem;block-size:.625rem;background:var(--tui-status-warning);transform:translate(50%,-50%);border-radius:100%;margin:0}.t-form{display:flex;min-inline-size:25.5rem;max-inline-size:33rem;flex-direction:column;gap:.75rem;padding:0 1.5rem 1.5rem;box-sizing:border-box}.t-header{display:flex;justify-content:space-between;padding:1.25rem 0;margin:0 0 .5rem;border:none;box-shadow:inset 0 -1px var(--tui-border-normal);font:var(--tui-font-text-ui-l);font-weight:700}\n"] }]
}], propDecorators: { rem: [{
type: ViewChild,
args: ['rem']
}], button: [{
type: ViewChild,
args: [TuiButton, { read: ElementRef }]
}], children: [{
type: ContentChildren,
args: [NgControl, { descendants: true }]
}], templates: [{
type: ContentChildren,
args: [TuiItem, { descendants: true, read: TemplateRef }]
}], size: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGF5b3V0L2NvbXBvbmVudHMvc2VhcmNoL3NlYXJjaC1maWx0ZXJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xheW91dC9jb21wb25lbnRzL3NlYXJjaC9zZWFyY2gtZmlsdGVycy50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDaEUsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLGVBQWUsRUFDZixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDdEQsT0FBTyxFQUNILGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsV0FBVyxHQUNkLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFDLFNBQVMsRUFBRSx3QkFBd0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JGLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBRWpGLE9BQU8sRUFB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LG1EQWVnQixTQUFTLCtEQUtULE9BQU8sMkJBQTRCLFdBQVcsa0pBUnBELFNBQVMsMkJBQVMsVUFBVSxxSUN6RDNDLHU3QkFzQ0EsMndCREFjLE9BQU8sbUhBQUUsSUFBSSw2RkFBRSxnQkFBZ0Isb0pBQUUsU0FBUyxvSUFBRSx3QkFBd0I7O1NBZXJFLHlCQUF5Qjs0RkFBekIseUJBQXlCO2tCQWxCckMsU0FBUztpQ0FDTSxJQUFJLFlBQ04sb0JBQW9CLFdBQ3JCLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsd0JBQXdCLENBQUMsbUJBRzlELHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1AsdUJBQXVCO3dCQUN2Qix3QkFBd0IsQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBQyxDQUFDO3FCQUM3RCxrQkFDZTt3QkFDWjs0QkFDSSxTQUFTLEVBQUUsNEJBQTRCOzRCQUN2QyxNQUFNLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQzt5QkFDckM7cUJBQ0o7OEJBSWdCLEdBQUc7c0JBRG5CLFNBQVM7dUJBQUMsS0FBSztnQkFJQyxNQUFNO3NCQUR0QixTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUM7Z0JBSXZCLFFBQVE7c0JBRHhCLGVBQWU7dUJBQUMsU0FBUyxFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQztnQkFNNUIsU0FBUztzQkFEM0IsZUFBZTt1QkFBQyxPQUFPLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUM7Z0JBd0J6RCxJQUFJO3NCQURWLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIHR5cGUgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIHR5cGUgUXVlcnlMaXN0LFxuICAgIHNpZ25hbCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0b1NpZ25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtOZ0NvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7V2FSZXNpemVPYnNlcnZlclNlcnZpY2V9IGZyb20gJ0BuZy13ZWItYXBpcy9yZXNpemUtb2JzZXJ2ZXInO1xuaW1wb3J0IHtFTVBUWV9RVUVSWX0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHtUdWlJdGVtfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RpcmVjdGl2ZXMvaXRlbSc7XG5pbXBvcnQge1xuICAgIHR1aUNvbnRyb2xWYWx1ZSxcbiAgICB0dWlRdWVyeUxpc3RDaGFuZ2VzLFxuICAgIHR1aVpvbmVmdWxsLFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrL29ic2VydmFibGVzJztcbmltcG9ydCB7dHVpSXNDb250cm9sRW1wdHl9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQge1R1aUJ1dHRvbiwgdHVpQnV0dG9uT3B0aW9uc1Byb3ZpZGVyfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2J1dHRvbic7XG5pbXBvcnQge1R1aVRleHRmaWVsZE9wdGlvbnNEaXJlY3RpdmV9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7dHlwZSBUdWlTaXplU30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHtkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBtZXJnZSwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtUdWlTZWFyY2hGaWx0ZXJDb21wb25lbnR9IGZyb20gJy4vc2VhcmNoLWZpbHRlci5jb21wb25lbnQnO1xuXG5jb25zdCBXSURUSCA9IDEyO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndHVpLXNlYXJjaC1maWx0ZXJzJyxcbiAgICBpbXBvcnRzOiBbTmdGb3JPZiwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCwgVHVpQnV0dG9uLCBUdWlTZWFyY2hGaWx0ZXJDb21wb25lbnRdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2gtZmlsdGVycy50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zZWFyY2gtZmlsdGVycy5zdHlsZXMubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBXYVJlc2l6ZU9ic2VydmVyU2VydmljZSxcbiAgICAgICAgdHVpQnV0dG9uT3B0aW9uc1Byb3ZpZGVyKHtzaXplOiAneHMnLCBhcHBlYXJhbmNlOiAnZmxhdCd9KSxcbiAgICBdLFxuICAgIGhvc3REaXJlY3RpdmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZTogVHVpVGV4dGZpZWxkT3B0aW9uc0RpcmVjdGl2ZSxcbiAgICAgICAgICAgIGlucHV0czogWyd0dWlUZXh0ZmllbGRTaXplOiBzaXplJ10sXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpU2VhcmNoRmlsdGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICAgIEBWaWV3Q2hpbGQoJ3JlbScpXG4gICAgcHJpdmF0ZSByZWFkb25seSByZW0/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoVHVpQnV0dG9uLCB7cmVhZDogRWxlbWVudFJlZn0pXG4gICAgcHJpdmF0ZSByZWFkb25seSBidXR0b24/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oTmdDb250cm9sLCB7ZGVzY2VuZGFudHM6IHRydWV9KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IFF1ZXJ5TGlzdDxOZ0NvbnRyb2w+ID0gRU1QVFlfUVVFUlk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2xzID0gc2lnbmFsPHJlYWRvbmx5IE5nQ29udHJvbFtdPihbXSk7XG5cbiAgICBAQ29udGVudENoaWxkcmVuKFR1aUl0ZW0sIHtkZXNjZW5kYW50czogdHJ1ZSwgcmVhZDogVGVtcGxhdGVSZWZ9KVxuICAgIHByb3RlY3RlZCByZWFkb25seSB0ZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PiA9IEVNUFRZX1FVRVJZO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG92ZXJmbG93biA9IHRvU2lnbmFsKFxuICAgICAgICBpbmplY3QoV2FSZXNpemVPYnNlcnZlclNlcnZpY2UsIHtzZWxmOiB0cnVlfSkucGlwZShcbiAgICAgICAgICAgIG1hcCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IGVudHJ5WzBdPy5jb250ZW50UmVjdC53aWR0aCA/PyAwO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHdpZHRoIC0gdGhpcy5tb3JlKSAvIFdJRFRIIC8gdGhpcy51bml0KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIHR1aVpvbmVmdWxsKCksXG4gICAgICAgICksXG4gICAgICAgIHtpbml0aWFsVmFsdWU6IDB9LFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZW5hYmxlZCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMuY29udHJvbHMoKS5zb21lKFxuICAgICAgICAgICAgKHtjb250cm9sfSwgaW5kZXgpID0+XG4gICAgICAgICAgICAgICAgY29udHJvbCAmJiBpbmRleCA+PSB0aGlzLm92ZXJmbG93bigpICYmICF0dWlJc0NvbnRyb2xFbXB0eShjb250cm9sKSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2l6ZTogVHVpU2l6ZVMgPSAnbSc7XG5cbiAgICAvLyBUT0RPOiBSZWZhY3RvciB0byBzaWduYWwgcXVlcmllcyB3aGVuIEFuZ3VsYXIgaXMgdXBkYXRlZFxuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHR1aVF1ZXJ5TGlzdENoYW5nZXModGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoYWxsKSA9PiBtZXJnZSguLi5hbGwubWFwKChjKSA9PiB0dWlDb250cm9sVmFsdWUoYykpKSksXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHRoaXMuY2hpbGRyZW4udG9BcnJheSgpKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNvbnRyb2xzKSA9PiB0aGlzLmNvbnRyb2xzLnNldChjb250cm9scykpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKHtjb250cm9sfSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChjb250cm9sICYmIGluZGV4ID49IHRoaXMub3ZlcmZsb3duKCkpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCB1bml0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbT8ubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCB8fCAxNjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBtb3JlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1dHRvbj8ubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCB8fCAwO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRlbXBsYXRlIG9mIHRlbXBsYXRlczsgbGV0IGkgPSBpbmRleFwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJpIDwgb3ZlcmZsb3duKClcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiXG4gICAgLz5cbjwvbmctY29udGFpbmVyPlxuPGRpdlxuICAgICNyZW1cbiAgICBjbGFzcz1cInQtcmVtXCJcbj48L2Rpdj5cbjxidXR0b25cbiAgICAqbmdJZj1cIm92ZXJmbG93bigpIDwgdGVtcGxhdGVzLmxlbmd0aFwiXG4gICAgYXBwZWFyYW5jZT1cInNlY29uZGFyeVwiXG4gICAgdHVpSWNvbkJ1dHRvblxuICAgIHR1aVNlYXJjaEZpbHRlclxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwidC1idXR0b25cIlxuICAgIFtjbGFzcy5fYWN0aXZlXT1cImVuYWJsZWQoKVwiXG4gICAgW3NpemVdPVwic2l6ZVwiXG4+XG4gICAgPGZvcm1cbiAgICAgICAgY2xhc3M9XCJ0LWZvcm1cIlxuICAgICAgICAocmVzZXQpPVwib25SZXNldCgpXCJcbiAgICA+XG4gICAgICAgIDxmaWVsZHNldFxuICAgICAgICAgICAgY2xhc3M9XCJ0LWhlYWRlclwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVuYWJsZWQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IC8+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRlbXBsYXRlIG9mIHRlbXBsYXRlczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaSA+PSBvdmVyZmxvd24oKVwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9mb3JtPlxuPC9idXR0b24+XG4iXX0=