UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

57 lines 14.6 kB
import { NgForOf, NgIf, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, computed, effect, inject, Input, signal, } from '@angular/core'; import { tuiAsControl, TuiControl } from '@taiga-ui/cdk/classes'; import { TUI_ALLOW_SIGNAL_WRITES } from '@taiga-ui/cdk/constants'; import { tuiIsPresent } from '@taiga-ui/cdk/utils/miscellaneous'; import { tuiAsTextfieldAccessor, TuiTextfieldDirective, TuiWithTextfield, } from '@taiga-ui/core/components/textfield'; import { TUI_ITEMS_HANDLERS } from '@taiga-ui/core/directives/items-handlers'; import { tuiIsFlat } from '@taiga-ui/kit/utils'; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/core/components/textfield"; class TuiNativeSelect extends TuiControl { constructor() { super(...arguments); this.textfield = inject(TuiTextfieldDirective); this.isFlat = tuiIsFlat; this.placeholder = signal(''); this.itemsHandlers = inject(TUI_ITEMS_HANDLERS); this.stringified = computed((value = this.value()) => tuiIsPresent(value) ? this.itemsHandlers.stringify()(value) : ''); this.showPlaceholder = computed(() => this.placeholder() && !this.stringified()); this.isSelected = computed((value = this.value()) => (x) => tuiIsPresent(value) && this.itemsHandlers.identityMatcher()(x, value)); this.valueEffect = effect(() => { this.textfield.value.set(this.stringified()); }, TUI_ALLOW_SIGNAL_WRITES); this.items = []; this.labels = []; } // TODO(v5): use signal inputs set placeholderSetter(x) { this.placeholder.set(x); } setValue(value) { this.onChange(value); } selectOption(index) { const items = (this.items?.flat() ?? []); this.onChange(items[index - (this.showPlaceholder() ? 1 : 0)] ?? null); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiNativeSelect, deps: null, target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiNativeSelect, isStandalone: true, selector: "select[tuiSelect]", inputs: { items: "items", labels: "labels", placeholderSetter: ["placeholder", "placeholderSetter"] }, host: { listeners: { "change": "selectOption($event.target.options.selectedIndex)" }, properties: { "attr.aria-invalid": "invalid()", "disabled": "!interactive()" } }, providers: [tuiAsTextfieldAccessor(TuiNativeSelect), tuiAsControl(TuiNativeSelect)], usesInheritance: true, hostDirectives: [{ directive: i1.TuiWithTextfield }], ngImport: i0, template: "<option\n *ngIf=\"showPlaceholder()\"\n disabled\n selected\n value=\"\"\n>\n {{ placeholder() }}\n</option>\n\n<ng-container *ngIf=\"items && !isFlat(items); else flatItems\">\n <optgroup\n *ngFor=\"let group of labels; let index = index\"\n [label]=\"labels[index]\"\n >\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items[index]}\" />\n </optgroup>\n</ng-container>\n\n<ng-template #flatItems>\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items}\" />\n</ng-template>\n\n<ng-template\n #options\n let-items\n>\n <option\n *ngFor=\"let option of items\"\n [disabled]=\"itemsHandlers.disabledItemHandler()(option)\"\n [selected]=\"isSelected()(option)\"\n [value]=\"itemsHandlers.stringify()(option)\"\n >\n {{ itemsHandlers.stringify()(option) }}\n </option>\n</ng-template>\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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiNativeSelect }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiNativeSelect, decorators: [{ type: Component, args: [{ standalone: true, selector: 'select[tuiSelect]', imports: [NgForOf, NgIf, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiAsTextfieldAccessor(TuiNativeSelect), tuiAsControl(TuiNativeSelect)], hostDirectives: [TuiWithTextfield], host: { '[attr.aria-invalid]': 'invalid()', '[disabled]': '!interactive()', '(change)': 'selectOption($event.target.options.selectedIndex)', }, template: "<option\n *ngIf=\"showPlaceholder()\"\n disabled\n selected\n value=\"\"\n>\n {{ placeholder() }}\n</option>\n\n<ng-container *ngIf=\"items && !isFlat(items); else flatItems\">\n <optgroup\n *ngFor=\"let group of labels; let index = index\"\n [label]=\"labels[index]\"\n >\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items[index]}\" />\n </optgroup>\n</ng-container>\n\n<ng-template #flatItems>\n <ng-container *ngTemplateOutlet=\"options; context: {$implicit: items}\" />\n</ng-template>\n\n<ng-template\n #options\n let-items\n>\n <option\n *ngFor=\"let option of items\"\n [disabled]=\"itemsHandlers.disabledItemHandler()(option)\"\n [selected]=\"isSelected()(option)\"\n [value]=\"itemsHandlers.stringify()(option)\"\n >\n {{ itemsHandlers.stringify()(option) }}\n </option>\n</ng-template>\n" }] }], propDecorators: { items: [{ type: Input }], labels: [{ type: Input }], placeholderSetter: [{ type: Input, args: ['placeholder'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXQvY29tcG9uZW50cy9zZWxlY3QvbmF0aXZlLXNlbGVjdC9uYXRpdmUtc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL3NlbGVjdC9uYXRpdmUtc2VsZWN0L25hdGl2ZS1zZWxlY3QudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFFL0QsT0FBTyxFQUNILHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsZ0JBQWdCLEdBQ25CLE1BQU0scUNBQXFDLENBQUM7QUFFN0MsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDNUUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHFCQUFxQixDQUFDOzs7QUFFOUMsTUFjYSxlQUNULFNBQVEsVUFBb0I7SUFmaEM7O1FBa0JxQixjQUFTLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFeEMsV0FBTSxHQUFHLFNBQVMsQ0FBQztRQUNuQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixrQkFBYSxHQUF3QixNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVoRSxnQkFBVyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUMvRCxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDbkUsQ0FBQztRQUVpQixvQkFBZSxHQUFHLFFBQVEsQ0FDekMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUNsRCxDQUFDO1FBRWlCLGVBQVUsR0FBRyxRQUFRLENBQ3BDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQ3JCLENBQUMsQ0FBSSxFQUFFLEVBQUUsQ0FDTCxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQ2hGLENBQUM7UUFFaUIsZ0JBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUdyQixVQUFLLEdBQXNELEVBQUUsQ0FBQztRQUc5RCxXQUFNLEdBQXNCLEVBQUUsQ0FBQztLQWlCekM7SUFmRyw4QkFBOEI7SUFDOUIsSUFDVyxpQkFBaUIsQ0FBQyxDQUFTO1FBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBZTtRQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFUyxZQUFZLENBQUMsS0FBYTtRQUNoQyxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFRLENBQUM7UUFFaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7SUFDM0UsQ0FBQzsrR0FoRFEsZUFBZTttR0FBZixlQUFlLCtVQVJiLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLEVBQUUsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDLHVHQzdCdkYsczVCQW1DQSw0Q0RUYyxPQUFPLG1IQUFFLElBQUksNkZBQUUsZ0JBQWdCOztTQVdoQyxlQUFlOzRGQUFmLGVBQWU7a0JBZDNCLFNBQVM7aUNBQ00sSUFBSSxZQUNOLG1CQUFtQixXQUNwQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsbUJBRXpCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEMsQ0FBQyxzQkFBc0IsaUJBQWlCLEVBQUUsWUFBWSxpQkFBaUIsQ0FBQyxrQkFDbkUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUM1Qjt3QkFDRixxQkFBcUIsRUFBRSxXQUFXO3dCQUNsQyxZQUFZLEVBQUUsZ0JBQWdCO3dCQUM5QixVQUFVLEVBQUUsbURBQW1EO3FCQUNsRTs4QkErQk0sS0FBSztzQkFEWCxLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFLSyxpQkFBaUI7c0JBRDNCLEtBQUs7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdGb3JPZiwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIGVmZmVjdCxcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dHVpQXNDb250cm9sLCBUdWlDb250cm9sfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NsYXNzZXMnO1xuaW1wb3J0IHtUVUlfQUxMT1dfU0lHTkFMX1dSSVRFU30gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHt0dWlJc1ByZXNlbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQgdHlwZSB7VHVpVGV4dGZpZWxkQWNjZXNzb3J9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7XG4gICAgdHVpQXNUZXh0ZmllbGRBY2Nlc3NvcixcbiAgICBUdWlUZXh0ZmllbGREaXJlY3RpdmUsXG4gICAgVHVpV2l0aFRleHRmaWVsZCxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy90ZXh0ZmllbGQnO1xuaW1wb3J0IHR5cGUge1R1aUl0ZW1zSGFuZGxlcnN9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvaXRlbXMtaGFuZGxlcnMnO1xuaW1wb3J0IHtUVUlfSVRFTVNfSEFORExFUlN9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvaXRlbXMtaGFuZGxlcnMnO1xuaW1wb3J0IHt0dWlJc0ZsYXR9IGZyb20gJ0B0YWlnYS11aS9raXQvdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnc2VsZWN0W3R1aVNlbGVjdF0nLFxuICAgIGltcG9ydHM6IFtOZ0Zvck9mLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0XSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmF0aXZlLXNlbGVjdC50ZW1wbGF0ZS5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFt0dWlBc1RleHRmaWVsZEFjY2Vzc29yKFR1aU5hdGl2ZVNlbGVjdCksIHR1aUFzQ29udHJvbChUdWlOYXRpdmVTZWxlY3QpXSxcbiAgICBob3N0RGlyZWN0aXZlczogW1R1aVdpdGhUZXh0ZmllbGRdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1thdHRyLmFyaWEtaW52YWxpZF0nOiAnaW52YWxpZCgpJyxcbiAgICAgICAgJ1tkaXNhYmxlZF0nOiAnIWludGVyYWN0aXZlKCknLFxuICAgICAgICAnKGNoYW5nZSknOiAnc2VsZWN0T3B0aW9uKCRldmVudC50YXJnZXQub3B0aW9ucy5zZWxlY3RlZEluZGV4KScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpTmF0aXZlU2VsZWN0PFQ+XG4gICAgZXh0ZW5kcyBUdWlDb250cm9sPFQgfCBudWxsPlxuICAgIGltcGxlbWVudHMgVHVpVGV4dGZpZWxkQWNjZXNzb3I8VD5cbntcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRleHRmaWVsZCA9IGluamVjdChUdWlUZXh0ZmllbGREaXJlY3RpdmUpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzRmxhdCA9IHR1aUlzRmxhdDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBzaWduYWwoJycpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpdGVtc0hhbmRsZXJzOiBUdWlJdGVtc0hhbmRsZXJzPFQ+ID0gaW5qZWN0KFRVSV9JVEVNU19IQU5ETEVSUyk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyaW5naWZpZWQgPSBjb21wdXRlZCgodmFsdWUgPSB0aGlzLnZhbHVlKCkpID0+XG4gICAgICAgIHR1aUlzUHJlc2VudCh2YWx1ZSkgPyB0aGlzLml0ZW1zSGFuZGxlcnMuc3RyaW5naWZ5KCkodmFsdWUpIDogJycsXG4gICAgKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBzaG93UGxhY2Vob2xkZXIgPSBjb21wdXRlZChcbiAgICAgICAgKCkgPT4gdGhpcy5wbGFjZWhvbGRlcigpICYmICF0aGlzLnN0cmluZ2lmaWVkKCksXG4gICAgKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1NlbGVjdGVkID0gY29tcHV0ZWQoXG4gICAgICAgICh2YWx1ZSA9IHRoaXMudmFsdWUoKSkgPT5cbiAgICAgICAgICAgICh4OiBUKSA9PlxuICAgICAgICAgICAgICAgIHR1aUlzUHJlc2VudCh2YWx1ZSkgJiYgdGhpcy5pdGVtc0hhbmRsZXJzLmlkZW50aXR5TWF0Y2hlcigpKHgsIHZhbHVlKSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZhbHVlRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgdGhpcy50ZXh0ZmllbGQudmFsdWUuc2V0KHRoaXMuc3RyaW5naWZpZWQoKSk7XG4gICAgfSwgVFVJX0FMTE9XX1NJR05BTF9XUklURVMpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXRlbXM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgVFtdPiB8IHJlYWRvbmx5IFRbXSB8IG51bGwgPSBbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxhYmVsczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIFRPRE8odjUpOiB1c2Ugc2lnbmFsIGlucHV0c1xuICAgIEBJbnB1dCgncGxhY2Vob2xkZXInKVxuICAgIHB1YmxpYyBzZXQgcGxhY2Vob2xkZXJTZXR0ZXIoeDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXIuc2V0KHgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRWYWx1ZSh2YWx1ZTogVCB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNlbGVjdE9wdGlvbihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMuaXRlbXM/LmZsYXQoKSA/PyBbXSkgYXMgVFtdO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UoaXRlbXNbaW5kZXggLSAodGhpcy5zaG93UGxhY2Vob2xkZXIoKSA/IDEgOiAwKV0gPz8gbnVsbCk7XG4gICAgfVxufVxuIiwiPG9wdGlvblxuICAgICpuZ0lmPVwic2hvd1BsYWNlaG9sZGVyKClcIlxuICAgIGRpc2FibGVkXG4gICAgc2VsZWN0ZWRcbiAgICB2YWx1ZT1cIlwiXG4+XG4gICAge3sgcGxhY2Vob2xkZXIoKSB9fVxuPC9vcHRpb24+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtcyAmJiAhaXNGbGF0KGl0ZW1zKTsgZWxzZSBmbGF0SXRlbXNcIj5cbiAgICA8b3B0Z3JvdXBcbiAgICAgICAgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGxhYmVsczsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICBbbGFiZWxdPVwibGFiZWxzW2luZGV4XVwiXG4gICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwib3B0aW9uczsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbXNbaW5kZXhdfVwiIC8+XG4gICAgPC9vcHRncm91cD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2ZsYXRJdGVtcz5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwib3B0aW9uczsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbXN9XCIgLz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNvcHRpb25zXG4gICAgbGV0LWl0ZW1zXG4+XG4gICAgPG9wdGlvblxuICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGl0ZW1zXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIml0ZW1zSGFuZGxlcnMuZGlzYWJsZWRJdGVtSGFuZGxlcigpKG9wdGlvbilcIlxuICAgICAgICBbc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZCgpKG9wdGlvbilcIlxuICAgICAgICBbdmFsdWVdPVwiaXRlbXNIYW5kbGVycy5zdHJpbmdpZnkoKShvcHRpb24pXCJcbiAgICA+XG4gICAgICAgIHt7IGl0ZW1zSGFuZGxlcnMuc3RyaW5naWZ5KCkob3B0aW9uKSB9fVxuICAgIDwvb3B0aW9uPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==