@taiga-ui/kit
Version:
Taiga UI Angular main components kit
65 lines • 15.1 kB
JavaScript
import { ChangeDetectionStrategy, Component, computed, inject, Input, signal, } from '@angular/core';
import { NgControl } from '@angular/forms';
import { MaskitoDirective } from '@maskito/angular';
import { TuiRepeatTimes } from '@taiga-ui/cdk/directives/repeat-times';
import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { tuiIsNativeFocused } from '@taiga-ui/cdk/utils/focus';
import { tuiIsString } from '@taiga-ui/cdk/utils/miscellaneous';
import { TUI_TEXTFIELD_OPTIONS, TuiTextfieldContent, } from '@taiga-ui/core/components/textfield';
import { TuiAppearance } from '@taiga-ui/core/directives/appearance';
import { tuiMaskito } from '@taiga-ui/kit/utils';
import * as i0 from "@angular/core";
import * as i1 from "@maskito/angular";
class TuiInputPin {
constructor() {
this.el = tuiInjectElement();
this.mask = signal(/^\d+$/);
this.appearance = inject(TUI_TEXTFIELD_OPTIONS).appearance;
this.control = inject(NgControl);
this.maskito = tuiMaskito(computed(() => ({
mask: this.mask(),
overwriteMode: 'replace',
})));
}
set maskSetter(mask) {
this.mask.set(tuiIsString(mask) ? new RegExp(mask) : mask);
}
onClick(index) {
this.el.focus();
this.el.setSelectionRange(index, index + 1);
}
onSelection() {
if (this.el.selectionStart === this.el.maxLength) {
this.el.setSelectionRange(this.el.maxLength - 1, this.el.maxLength);
}
}
onArrow() {
if (this.el.selectionStart === this.el.maxLength - 1 &&
this.el.selectionEnd === this.el.maxLength) {
this.el.setSelectionRange(this.el.maxLength - 2, this.el.maxLength - 2);
}
}
isFocused(index) {
return (tuiIsNativeFocused(this.el) &&
(this.el.selectionStart === index ||
(this.el.selectionStart === this.el.maxLength &&
index === this.el.maxLength - 1)));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputPin, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiInputPin, isStandalone: true, selector: "input[tuiInputPin]", inputs: { maskSetter: ["mask", "maskSetter"] }, host: { attributes: { "ngSkipHydration": "true", "inputmode": "numeric", "spellcheck": "false" }, listeners: { "selectionchange": "onSelection()", "keydown.arrowLeft": "onArrow()" } }, hostDirectives: [{ directive: i1.MaskitoDirective }], ngImport: i0, template: "<div\n *tuiTextfieldContent\n class=\"t-wrapper\"\n>\n <label\n *tuiRepeatTimes=\"let index of el.maxLength\"\n class=\"t-item\"\n [tuiAppearance]=\"appearance()\"\n [tuiAppearanceFocus]=\"isFocused(index)\"\n [tuiAppearanceMode]=\"control.invalid && control.touched ? 'invalid' : null\"\n (pointerdown.prevent)=\"onClick(index)\"\n >\n <span\n class=\"t-value\"\n [class.t-value_filled]=\"el.value[index]\"\n [textContent]=\"el.value[index] || el.placeholder[index]\"\n ></span>\n </label>\n</div>\n", styles: ["@keyframes blink{50%{opacity:0}}:host{color:transparent;caret-color:transparent;background:transparent;border:none;outline:none}:host::selection{background:transparent}:host::placeholder{color:transparent!important}:host ::ng-deep+.t-content .t-clear{display:none!important}.t-wrapper{position:absolute;top:0;left:0;inline-size:100%;block-size:100%;display:flex;gap:inherit;border-radius:inherit}.t-item{display:flex;flex:1;align-items:center;justify-content:center;border-radius:inherit;pointer-events:auto;cursor:text}.t-item[data-focus=true] .t-value_filled{background:var(--tui-service-selection-background)}.t-item[data-focus=true] .t-value_filled:before{display:none}.t-item[data-focus=true] .t-value:before{content:\"\";block-size:1em;border-inline-start:1px solid var(--tui-text-primary);animation:blink 1s steps(1) infinite}.t-value{color:var(--tui-text-tertiary)}.t-value_filled{color:var(--tui-text-primary)}\n"], dependencies: [{ kind: "directive", type: TuiAppearance, selector: "[tuiAppearance]", inputs: ["tuiAppearance", "tuiAppearanceState", "tuiAppearanceFocus", "tuiAppearanceMode"] }, { kind: "directive", type: TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }, { kind: "directive", type: TuiTextfieldContent, selector: "ng-template[tuiTextfieldContent]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiInputPin };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputPin, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'input[tuiInputPin]', imports: [TuiAppearance, TuiRepeatTimes, TuiTextfieldContent], changeDetection: ChangeDetectionStrategy.OnPush, hostDirectives: [MaskitoDirective], host: {
ngSkipHydration: 'true',
inputmode: 'numeric',
spellcheck: 'false',
'(selectionchange)': 'onSelection()',
'(keydown.arrowLeft)': 'onArrow()',
}, template: "<div\n *tuiTextfieldContent\n class=\"t-wrapper\"\n>\n <label\n *tuiRepeatTimes=\"let index of el.maxLength\"\n class=\"t-item\"\n [tuiAppearance]=\"appearance()\"\n [tuiAppearanceFocus]=\"isFocused(index)\"\n [tuiAppearanceMode]=\"control.invalid && control.touched ? 'invalid' : null\"\n (pointerdown.prevent)=\"onClick(index)\"\n >\n <span\n class=\"t-value\"\n [class.t-value_filled]=\"el.value[index]\"\n [textContent]=\"el.value[index] || el.placeholder[index]\"\n ></span>\n </label>\n</div>\n", styles: ["@keyframes blink{50%{opacity:0}}:host{color:transparent;caret-color:transparent;background:transparent;border:none;outline:none}:host::selection{background:transparent}:host::placeholder{color:transparent!important}:host ::ng-deep+.t-content .t-clear{display:none!important}.t-wrapper{position:absolute;top:0;left:0;inline-size:100%;block-size:100%;display:flex;gap:inherit;border-radius:inherit}.t-item{display:flex;flex:1;align-items:center;justify-content:center;border-radius:inherit;pointer-events:auto;cursor:text}.t-item[data-focus=true] .t-value_filled{background:var(--tui-service-selection-background)}.t-item[data-focus=true] .t-value_filled:before{display:none}.t-item[data-focus=true] .t-value:before{content:\"\";block-size:1em;border-inline-start:1px solid var(--tui-text-primary);animation:blink 1s steps(1) infinite}.t-value{color:var(--tui-text-tertiary)}.t-value_filled{color:var(--tui-text-primary)}\n"] }]
}], propDecorators: { maskSetter: [{
type: Input,
args: ['mask']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtcGluLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL2lucHV0LXBpbi9pbnB1dC1waW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvaW5wdXQtcGluL2lucHV0LXBpbi50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUM5RCxPQUFPLEVBQ0gscUJBQXFCLEVBQ3JCLG1CQUFtQixHQUN0QixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0scUJBQXFCLENBQUM7OztBQUUvQyxNQWdCYSxXQUFXO0lBaEJ4QjtRQWlCdUIsT0FBRSxHQUFHLGdCQUFnQixFQUFvQixDQUFDO1FBQzFDLFNBQUksR0FBRyxNQUFNLENBQWMsT0FBTyxDQUFDLENBQUM7UUFDcEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUN0RCxZQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTVCLFlBQU8sR0FBRyxVQUFVLENBQ25DLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDakIsYUFBYSxFQUFFLFNBQVM7U0FDM0IsQ0FBQyxDQUFDLENBQ04sQ0FBQztLQW1DTDtJQWpDRyxJQUNXLFVBQVUsQ0FBQyxJQUEwQjtRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU0sT0FBTyxDQUFDLEtBQWE7UUFDeEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFO1lBQzlDLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkU7SUFDTCxDQUFDO0lBRU0sT0FBTztRQUNWLElBQ0ksSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQztZQUNoRCxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFDNUM7WUFDRSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUMzRTtJQUNMLENBQUM7SUFFTSxTQUFTLENBQUMsS0FBYTtRQUMxQixPQUFPLENBQ0gsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxLQUFLLEtBQUs7Z0JBQzdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTO29CQUN6QyxLQUFLLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FDNUMsQ0FBQztJQUNOLENBQUM7K0dBN0NRLFdBQVc7bUdBQVgsV0FBVyw2V0N0Q3hCLDhsQkFtQkEsbTlCRE1jLGFBQWEsd0pBQUUsY0FBYyw2R0FBRSxtQkFBbUI7O1NBYW5ELFdBQVc7NEZBQVgsV0FBVztrQkFoQnZCLFNBQVM7aUNBQ00sSUFBSSxZQUNOLG9CQUFvQixXQUNyQixDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLENBQUMsbUJBRzVDLHVCQUF1QixDQUFDLE1BQU0sa0JBQy9CLENBQUMsZ0JBQWdCLENBQUMsUUFDNUI7d0JBQ0YsZUFBZSxFQUFFLE1BQU07d0JBQ3ZCLFNBQVMsRUFBRSxTQUFTO3dCQUNwQixVQUFVLEVBQUUsT0FBTzt3QkFDbkIsbUJBQW1CLEVBQUUsZUFBZTt3QkFDcEMscUJBQXFCLEVBQUUsV0FBVztxQkFDckM7OEJBZ0JVLFVBQVU7c0JBRHBCLEtBQUs7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOZ0NvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TWFza2l0b0RpcmVjdGl2ZX0gZnJvbSAnQG1hc2tpdG8vYW5ndWxhcic7XG5pbXBvcnQgdHlwZSB7TWFza2l0b01hc2t9IGZyb20gJ0BtYXNraXRvL2NvcmUnO1xuaW1wb3J0IHtUdWlSZXBlYXRUaW1lc30gZnJvbSAnQHRhaWdhLXVpL2Nkay9kaXJlY3RpdmVzL3JlcGVhdC10aW1lcyc7XG5pbXBvcnQge3R1aUluamVjdEVsZW1lbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvZG9tJztcbmltcG9ydCB7dHVpSXNOYXRpdmVGb2N1c2VkfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL2ZvY3VzJztcbmltcG9ydCB7dHVpSXNTdHJpbmd9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQge1xuICAgIFRVSV9URVhURklFTERfT1BUSU9OUyxcbiAgICBUdWlUZXh0ZmllbGRDb250ZW50LFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL3RleHRmaWVsZCc7XG5pbXBvcnQge1R1aUFwcGVhcmFuY2V9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvYXBwZWFyYW5jZSc7XG5pbXBvcnQge3R1aU1hc2tpdG99IGZyb20gJ0B0YWlnYS11aS9raXQvdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnaW5wdXRbdHVpSW5wdXRQaW5dJyxcbiAgICBpbXBvcnRzOiBbVHVpQXBwZWFyYW5jZSwgVHVpUmVwZWF0VGltZXMsIFR1aVRleHRmaWVsZENvbnRlbnRdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC1waW4udGVtcGxhdGUuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtcGluLnN0eWxlLmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0RGlyZWN0aXZlczogW01hc2tpdG9EaXJlY3RpdmVdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgbmdTa2lwSHlkcmF0aW9uOiAndHJ1ZScsXG4gICAgICAgIGlucHV0bW9kZTogJ251bWVyaWMnLFxuICAgICAgICBzcGVsbGNoZWNrOiAnZmFsc2UnLFxuICAgICAgICAnKHNlbGVjdGlvbmNoYW5nZSknOiAnb25TZWxlY3Rpb24oKScsXG4gICAgICAgICcoa2V5ZG93bi5hcnJvd0xlZnQpJzogJ29uQXJyb3coKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpSW5wdXRQaW4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBlbCA9IHR1aUluamVjdEVsZW1lbnQ8SFRNTElucHV0RWxlbWVudD4oKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWFzayA9IHNpZ25hbDxNYXNraXRvTWFzaz4oL15cXGQrJC8pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBhcHBlYXJhbmNlID0gaW5qZWN0KFRVSV9URVhURklFTERfT1BUSU9OUykuYXBwZWFyYW5jZTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29udHJvbCA9IGluamVjdChOZ0NvbnRyb2wpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1hc2tpdG8gPSB0dWlNYXNraXRvKFxuICAgICAgICBjb21wdXRlZCgoKSA9PiAoe1xuICAgICAgICAgICAgbWFzazogdGhpcy5tYXNrKCksXG4gICAgICAgICAgICBvdmVyd3JpdGVNb2RlOiAncmVwbGFjZScsXG4gICAgICAgIH0pKSxcbiAgICApO1xuXG4gICAgQElucHV0KCdtYXNrJylcbiAgICBwdWJsaWMgc2V0IG1hc2tTZXR0ZXIobWFzazogTWFza2l0b01hc2sgfCBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tYXNrLnNldCh0dWlJc1N0cmluZyhtYXNrKSA/IG5ldyBSZWdFeHAobWFzaykgOiBtYXNrKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbGljayhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWwuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5lbC5zZXRTZWxlY3Rpb25SYW5nZShpbmRleCwgaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmVsLnNlbGVjdGlvblN0YXJ0ID09PSB0aGlzLmVsLm1heExlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5lbC5zZXRTZWxlY3Rpb25SYW5nZSh0aGlzLmVsLm1heExlbmd0aCAtIDEsIHRoaXMuZWwubWF4TGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkFycm93KCk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmVsLnNlbGVjdGlvblN0YXJ0ID09PSB0aGlzLmVsLm1heExlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgIHRoaXMuZWwuc2VsZWN0aW9uRW5kID09PSB0aGlzLmVsLm1heExlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZWwuc2V0U2VsZWN0aW9uUmFuZ2UodGhpcy5lbC5tYXhMZW5ndGggLSAyLCB0aGlzLmVsLm1heExlbmd0aCAtIDIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzRm9jdXNlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0dWlJc05hdGl2ZUZvY3VzZWQodGhpcy5lbCkgJiZcbiAgICAgICAgICAgICh0aGlzLmVsLnNlbGVjdGlvblN0YXJ0ID09PSBpbmRleCB8fFxuICAgICAgICAgICAgICAgICh0aGlzLmVsLnNlbGVjdGlvblN0YXJ0ID09PSB0aGlzLmVsLm1heExlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICBpbmRleCA9PT0gdGhpcy5lbC5tYXhMZW5ndGggLSAxKSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgKnR1aVRleHRmaWVsZENvbnRlbnRcbiAgICBjbGFzcz1cInQtd3JhcHBlclwiXG4+XG4gICAgPGxhYmVsXG4gICAgICAgICp0dWlSZXBlYXRUaW1lcz1cImxldCBpbmRleCBvZiBlbC5tYXhMZW5ndGhcIlxuICAgICAgICBjbGFzcz1cInQtaXRlbVwiXG4gICAgICAgIFt0dWlBcHBlYXJhbmNlXT1cImFwcGVhcmFuY2UoKVwiXG4gICAgICAgIFt0dWlBcHBlYXJhbmNlRm9jdXNdPVwiaXNGb2N1c2VkKGluZGV4KVwiXG4gICAgICAgIFt0dWlBcHBlYXJhbmNlTW9kZV09XCJjb250cm9sLmludmFsaWQgJiYgY29udHJvbC50b3VjaGVkID8gJ2ludmFsaWQnIDogbnVsbFwiXG4gICAgICAgIChwb2ludGVyZG93bi5wcmV2ZW50KT1cIm9uQ2xpY2soaW5kZXgpXCJcbiAgICA+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInQtdmFsdWVcIlxuICAgICAgICAgICAgW2NsYXNzLnQtdmFsdWVfZmlsbGVkXT1cImVsLnZhbHVlW2luZGV4XVwiXG4gICAgICAgICAgICBbdGV4dENvbnRlbnRdPVwiZWwudmFsdWVbaW5kZXhdIHx8IGVsLnBsYWNlaG9sZGVyW2luZGV4XVwiXG4gICAgICAgID48L3NwYW4+XG4gICAgPC9sYWJlbD5cbjwvZGl2PlxuIl19