UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

89 lines 21.9 kB
import { NgIf } from '@angular/common'; import { ChangeDetectionStrategy, Component, computed, inject, Input, signal, ViewEncapsulation, } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { MaskitoDirective } from '@maskito/angular'; import { maskitoAddOnFocusPlugin, maskitoPrefixPostprocessorGenerator, maskitoRemoveOnBlurPlugin, } from '@maskito/kit'; import { tuiAsControl, TuiControl } from '@taiga-ui/cdk/classes'; import { tuiFallbackValueProvider } from '@taiga-ui/cdk/tokens'; import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom'; import { tuiDirectiveBinding } from '@taiga-ui/cdk/utils/miscellaneous'; import { TuiTextfieldContent, TuiWithTextfield } from '@taiga-ui/core/components/textfield'; import { TuiIcons } from '@taiga-ui/core/directives/icons'; import { TuiSlider, tuiSliderOptionsProvider } from '@taiga-ui/kit/components/slider'; import { tuiMaskito } from '@taiga-ui/kit/utils'; import { TUI_INPUT_COLOR_OPTIONS } from './input-color.options'; import * as i0 from "@angular/core"; import * as i1 from "@maskito/angular"; import * as i2 from "@taiga-ui/core/components/textfield"; import * as i3 from "@angular/forms"; import * as i4 from "@taiga-ui/kit/components/slider"; const REGEX = /[0-9a-fA-F]/; class TuiInputColor extends TuiControl { constructor() { super(...arguments); this.options = inject(TUI_INPUT_COLOR_OPTIONS); this.el = tuiInjectElement(); this.list = this.el.getAttribute('list'); this.format = signal(this.options.format); this.align = signal(this.options.align); this.icon = tuiDirectiveBinding(TuiIcons, 'iconStart', computed(() => this.align() === 'left' ? '"data:image/svg+xml;utf8,<svg xmlns=http://www.w3.org/2000/svg></svg>"' : ''), {}); this.maskito = tuiMaskito(computed((length = this.format().length * 2) => ({ mask: ['#', ...Array.from({ length }).fill(REGEX)], postprocessors: [maskitoPrefixPostprocessorGenerator('#')], plugins: [maskitoAddOnFocusPlugin('#'), maskitoRemoveOnBlurPlugin('#')], overwriteMode: 'replace', }))); this.filled = computed(() => this.format() === 'hex' ? this.value().length === 7 : this.value().length === 9); this.opacity = computed(() => this.filled() && this.format() === 'hexa' ? Number.parseInt(this.value().slice(-2), 16) : 255); } set alignSetter(align) { this.align.set(align); } set formatSetter(mode) { this.format.set(mode); } onInput(value) { this.onChange(this.format() === 'hex' ? value : `${value}${toHex(this.opacity())}`); } onOpacity(opacity) { const value = this.filled() ? this.value().slice(0, 7) : '#000000'; this.onChange(`${value}${toHex(opacity)}`); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputColor, deps: null, target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiInputColor, isStandalone: true, selector: "input[tuiInputColor]", inputs: { alignSetter: ["align", "alignSetter"], formatSetter: ["format", "formatSetter"] }, host: { attributes: { "ngSkipHydration": "true", "inputmode": "numeric", "spellcheck": "false" }, listeners: { "input": "onChange($event.target.value)" }, properties: { "disabled": "disabled()", "value": "value()", "attr.list": "null" } }, providers: [ tuiAsControl(TuiInputColor), tuiFallbackValueProvider(''), tuiSliderOptionsProvider({ trackColor: 'transparent' }), ], usesInheritance: true, hostDirectives: [{ directive: i1.MaskitoDirective }, { directive: i2.TuiWithTextfield }], ngImport: i0, template: "<ng-container *tuiTextfieldContent>\n <input\n #input\n tabindex=\"-1\"\n type=\"color\"\n class=\"tui-input-color_picker\"\n [attr.list]=\"list\"\n [class.tui-input-color_left]=\"align() === 'left'\"\n [disabled]=\"!interactive()\"\n [style.--t-opacity]=\"filled() ? opacity() / 255 : 0\"\n [value]=\"value().length > 6 ? value().slice(0, 7) : ''\"\n (input)=\"onInput(input.value)\"\n />\n <input\n *ngIf=\"format() === 'hexa' && interactive()\"\n max=\"255\"\n tuiSlider\n type=\"range\"\n [ngModel]=\"opacity()\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onOpacity($event)\"\n (pointerdown.stop)=\"el.focus()\"\n />\n</ng-container>\n", styles: [".tui-input-color_picker.tui-input-color_picker{position:relative;font-size:1rem;inline-size:calc(var(--t-height) / 2);block-size:calc(var(--t-height) / 2);border:none;border-radius:100%;padding:0!important;overflow:hidden;cursor:pointer;background:repeating-conic-gradient(var(--tui-border-normal) 0% 25%,transparent 0% 50%);box-shadow:0 0 0 1px var(--tui-border-normal)}.tui-input-color_picker.tui-input-color_picker:disabled{cursor:default}tui-textfield[data-size=s] .tui-input-color_picker{margin-inline-end:.25rem}tui-textfield[data-size=l] .tui-input-color_picker{margin-inline-end:-.25rem}.tui-input-color_picker.tui-input-color_left{position:absolute;top:50%;left:calc(var(--t-height) / 4);inset-inline-start:calc(var(--t-height) / 4);transform:translateY(-50%)}.tui-input-color_picker::-webkit-color-swatch-wrapper{padding:0}.tui-input-color_picker::-webkit-color-swatch{border:none;opacity:var(--t-opacity)}.tui-input-color_picker::-moz-color-swatch{border:none;opacity:var(--t-opacity)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TuiSliderComponent, selector: "input[type=range][tuiSlider]", inputs: ["size", "segments"] }, { kind: "directive", type: TuiTextfieldContent, selector: "ng-template[tuiTextfieldContent]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } export { TuiInputColor }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputColor, decorators: [{ type: Component, args: [{ standalone: true, selector: 'input[tuiInputColor]', imports: [FormsModule, NgIf, TuiSlider, TuiTextfieldContent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [ tuiAsControl(TuiInputColor), tuiFallbackValueProvider(''), tuiSliderOptionsProvider({ trackColor: 'transparent' }), ], hostDirectives: [MaskitoDirective, TuiWithTextfield], host: { ngSkipHydration: 'true', inputmode: 'numeric', spellcheck: 'false', '[disabled]': 'disabled()', '[value]': 'value()', '[attr.list]': 'null', '(input)': 'onChange($event.target.value)', }, template: "<ng-container *tuiTextfieldContent>\n <input\n #input\n tabindex=\"-1\"\n type=\"color\"\n class=\"tui-input-color_picker\"\n [attr.list]=\"list\"\n [class.tui-input-color_left]=\"align() === 'left'\"\n [disabled]=\"!interactive()\"\n [style.--t-opacity]=\"filled() ? opacity() / 255 : 0\"\n [value]=\"value().length > 6 ? value().slice(0, 7) : ''\"\n (input)=\"onInput(input.value)\"\n />\n <input\n *ngIf=\"format() === 'hexa' && interactive()\"\n max=\"255\"\n tuiSlider\n type=\"range\"\n [ngModel]=\"opacity()\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onOpacity($event)\"\n (pointerdown.stop)=\"el.focus()\"\n />\n</ng-container>\n", styles: [".tui-input-color_picker.tui-input-color_picker{position:relative;font-size:1rem;inline-size:calc(var(--t-height) / 2);block-size:calc(var(--t-height) / 2);border:none;border-radius:100%;padding:0!important;overflow:hidden;cursor:pointer;background:repeating-conic-gradient(var(--tui-border-normal) 0% 25%,transparent 0% 50%);box-shadow:0 0 0 1px var(--tui-border-normal)}.tui-input-color_picker.tui-input-color_picker:disabled{cursor:default}tui-textfield[data-size=s] .tui-input-color_picker{margin-inline-end:.25rem}tui-textfield[data-size=l] .tui-input-color_picker{margin-inline-end:-.25rem}.tui-input-color_picker.tui-input-color_left{position:absolute;top:50%;left:calc(var(--t-height) / 4);inset-inline-start:calc(var(--t-height) / 4);transform:translateY(-50%)}.tui-input-color_picker::-webkit-color-swatch-wrapper{padding:0}.tui-input-color_picker::-webkit-color-swatch{border:none;opacity:var(--t-opacity)}.tui-input-color_picker::-moz-color-swatch{border:none;opacity:var(--t-opacity)}\n"] }] }], propDecorators: { alignSetter: [{ type: Input, args: ['align'] }], formatSetter: [{ type: Input, args: ['format'] }] } }); function toHex(value) { return value.toString(16).padStart(2, '0'); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtY29sb3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvaW5wdXQtY29sb3IvaW5wdXQtY29sb3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvaW5wdXQtY29sb3IvaW5wdXQtY29sb3IudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixtQ0FBbUMsRUFDbkMseUJBQXlCLEdBQzVCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFDLG1CQUFtQixFQUFFLGdCQUFnQixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDMUYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBRXpELE9BQU8sRUFBQyxTQUFTLEVBQUUsd0JBQXdCLEVBQUMsTUFBTSxpQ0FBaUMs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QixLQUFLO3VCQUFDLE9BQU87Z0JBTUgsWUFBWTtzQkFEdEIsS0FBSzt1QkFBQyxRQUFROztBQWtCbkIsU0FBUyxLQUFLLENBQUMsS0FBYTtJQUN4QixPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ0lmfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIHNpZ25hbCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Zvcm1zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge01hc2tpdG9EaXJlY3RpdmV9IGZyb20gJ0BtYXNraXRvL2FuZ3VsYXInO1xuaW1wb3J0IHtcbiAgICBtYXNraXRvQWRkT25Gb2N1c1BsdWdpbixcbiAgICBtYXNraXRvUHJlZml4UG9zdHByb2Nlc3NvckdlbmVyYXRvcixcbiAgICBtYXNraXRvUmVtb3ZlT25CbHVyUGx1Z2luLFxufSBmcm9tICdAbWFza2l0by9raXQnO1xuaW1wb3J0IHt0dWlBc0NvbnRyb2wsIFR1aUNvbnRyb2x9IGZyb20gJ0B0YWlnYS11aS9jZGsvY2xhc3Nlcyc7XG5pbXBvcnQge3R1aUZhbGxiYWNrVmFsdWVQcm92aWRlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay90b2tlbnMnO1xuaW1wb3J0IHt0dWlJbmplY3RFbGVtZW50fSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL2RvbSc7XG5pbXBvcnQge3R1aURpcmVjdGl2ZUJpbmRpbmd9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQge1R1aVRleHRmaWVsZENvbnRlbnQsIFR1aVdpdGhUZXh0ZmllbGR9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7VHVpSWNvbnN9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvaWNvbnMnO1xuaW1wb3J0IHR5cGUge1R1aUhvcml6b250YWxEaXJlY3Rpb259IGZyb20gJ0B0YWlnYS11aS9jb3JlL3R5cGVzJztcbmltcG9ydCB7VHVpU2xpZGVyLCB0dWlTbGlkZXJPcHRpb25zUHJvdmlkZXJ9IGZyb20gJ0B0YWlnYS11aS9raXQvY29tcG9uZW50cy9zbGlkZXInO1xuaW1wb3J0IHt0dWlNYXNraXRvfSBmcm9tICdAdGFpZ2EtdWkva2l0L3V0aWxzJztcblxuaW1wb3J0IHR5cGUge1R1aUlucHV0Q29sb3JPcHRpb25zfSBmcm9tICcuL2lucHV0LWNvbG9yLm9wdGlvbnMnO1xuaW1wb3J0IHtUVUlfSU5QVVRfQ09MT1JfT1BUSU9OU30gZnJvbSAnLi9pbnB1dC1jb2xvci5vcHRpb25zJztcblxuY29uc3QgUkVHRVggPSAvWzAtOWEtZkEtRl0vO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnaW5wdXRbdHVpSW5wdXRDb2xvcl0nLFxuICAgIGltcG9ydHM6IFtGb3Jtc01vZHVsZSwgTmdJZiwgVHVpU2xpZGVyLCBUdWlUZXh0ZmllbGRDb250ZW50XSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQtY29sb3IudGVtcGxhdGUuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtY29sb3Iuc3R5bGUubGVzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHR1aUFzQ29udHJvbChUdWlJbnB1dENvbG9yKSxcbiAgICAgICAgdHVpRmFsbGJhY2tWYWx1ZVByb3ZpZGVyKCcnKSxcbiAgICAgICAgdHVpU2xpZGVyT3B0aW9uc1Byb3ZpZGVyKHt0cmFja0NvbG9yOiAndHJhbnNwYXJlbnQnfSksXG4gICAgXSxcbiAgICBob3N0RGlyZWN0aXZlczogW01hc2tpdG9EaXJlY3RpdmUsIFR1aVdpdGhUZXh0ZmllbGRdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgbmdTa2lwSHlkcmF0aW9uOiAndHJ1ZScsXG4gICAgICAgIGlucHV0bW9kZTogJ251bWVyaWMnLFxuICAgICAgICBzcGVsbGNoZWNrOiAnZmFsc2UnLFxuICAgICAgICAnW2Rpc2FibGVkXSc6ICdkaXNhYmxlZCgpJyxcbiAgICAgICAgJ1t2YWx1ZV0nOiAndmFsdWUoKScsXG4gICAgICAgICdbYXR0ci5saXN0XSc6ICdudWxsJyxcbiAgICAgICAgJyhpbnB1dCknOiAnb25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSknLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aUlucHV0Q29sb3IgZXh0ZW5kcyBUdWlDb250cm9sPHN0cmluZz4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zID0gaW5qZWN0KFRVSV9JTlBVVF9DT0xPUl9PUFRJT05TKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWwgPSB0dWlJbmplY3RFbGVtZW50PEhUTUxJbnB1dEVsZW1lbnQ+KCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGxpc3QgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZSgnbGlzdCcpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBmb3JtYXQgPSBzaWduYWwodGhpcy5vcHRpb25zLmZvcm1hdCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFsaWduID0gc2lnbmFsPFR1aUhvcml6b250YWxEaXJlY3Rpb24+KHRoaXMub3B0aW9ucy5hbGlnbik7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaWNvbiA9IHR1aURpcmVjdGl2ZUJpbmRpbmcoXG4gICAgICAgIFR1aUljb25zLFxuICAgICAgICAnaWNvblN0YXJ0JyxcbiAgICAgICAgY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgICAgIHRoaXMuYWxpZ24oKSA9PT0gJ2xlZnQnXG4gICAgICAgICAgICAgICAgPyAnXCJkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnPjwvc3ZnPlwiJ1xuICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICksXG4gICAgICAgIHt9LFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWFza2l0byA9IHR1aU1hc2tpdG8oXG4gICAgICAgIGNvbXB1dGVkKChsZW5ndGggPSB0aGlzLmZvcm1hdCgpLmxlbmd0aCAqIDIpID0+ICh7XG4gICAgICAgICAgICBtYXNrOiBbJyMnLCAuLi5BcnJheS5mcm9tPFJlZ0V4cD4oe2xlbmd0aH0pLmZpbGwoUkVHRVgpXSxcbiAgICAgICAgICAgIHBvc3Rwcm9jZXNzb3JzOiBbbWFza2l0b1ByZWZpeFBvc3Rwcm9jZXNzb3JHZW5lcmF0b3IoJyMnKV0sXG4gICAgICAgICAgICBwbHVnaW5zOiBbbWFza2l0b0FkZE9uRm9jdXNQbHVnaW4oJyMnKSwgbWFza2l0b1JlbW92ZU9uQmx1clBsdWdpbignIycpXSxcbiAgICAgICAgICAgIG92ZXJ3cml0ZU1vZGU6ICdyZXBsYWNlJyxcbiAgICAgICAgfSkpLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsbGVkID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5mb3JtYXQoKSA9PT0gJ2hleCcgPyB0aGlzLnZhbHVlKCkubGVuZ3RoID09PSA3IDogdGhpcy52YWx1ZSgpLmxlbmd0aCA9PT0gOSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wYWNpdHkgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLmZpbGxlZCgpICYmIHRoaXMuZm9ybWF0KCkgPT09ICdoZXhhJ1xuICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VJbnQodGhpcy52YWx1ZSgpLnNsaWNlKC0yKSwgMTYpXG4gICAgICAgICAgICA6IDI1NSxcbiAgICApO1xuXG4gICAgQElucHV0KCdhbGlnbicpXG4gICAgcHVibGljIHNldCBhbGlnblNldHRlcihhbGlnbjogVHVpSW5wdXRDb2xvck9wdGlvbnNbJ2FsaWduJ10pIHtcbiAgICAgICAgdGhpcy5hbGlnbi5zZXQoYWxpZ24pO1xuICAgIH1cblxuICAgIEBJbnB1dCgnZm9ybWF0JylcbiAgICBwdWJsaWMgc2V0IGZvcm1hdFNldHRlcihtb2RlOiBUdWlJbnB1dENvbG9yT3B0aW9uc1snZm9ybWF0J10pIHtcbiAgICAgICAgdGhpcy5mb3JtYXQuc2V0KG1vZGUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbklucHV0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0KCkgPT09ICdoZXgnID8gdmFsdWUgOiBgJHt2YWx1ZX0ke3RvSGV4KHRoaXMub3BhY2l0eSgpKX1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbk9wYWNpdHkob3BhY2l0eTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWxsZWQoKSA/IHRoaXMudmFsdWUoKS5zbGljZSgwLCA3KSA6ICcjMDAwMDAwJztcblxuICAgICAgICB0aGlzLm9uQ2hhbmdlKGAke3ZhbHVlfSR7dG9IZXgob3BhY2l0eSl9YCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0b0hleCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyk7XG59XG4iLCI8bmctY29udGFpbmVyICp0dWlUZXh0ZmllbGRDb250ZW50PlxuICAgIDxpbnB1dFxuICAgICAgICAjaW5wdXRcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgIGNsYXNzPVwidHVpLWlucHV0LWNvbG9yX3BpY2tlclwiXG4gICAgICAgIFthdHRyLmxpc3RdPVwibGlzdFwiXG4gICAgICAgIFtjbGFzcy50dWktaW5wdXQtY29sb3JfbGVmdF09XCJhbGlnbigpID09PSAnbGVmdCdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIWludGVyYWN0aXZlKClcIlxuICAgICAgICBbc3R5bGUuLS10LW9wYWNpdHldPVwiZmlsbGVkKCkgPyBvcGFjaXR5KCkgLyAyNTUgOiAwXCJcbiAgICAgICAgW3ZhbHVlXT1cInZhbHVlKCkubGVuZ3RoID4gNiA/IHZhbHVlKCkuc2xpY2UoMCwgNykgOiAnJ1wiXG4gICAgICAgIChpbnB1dCk9XCJvbklucHV0KGlucHV0LnZhbHVlKVwiXG4gICAgLz5cbiAgICA8aW5wdXRcbiAgICAgICAgKm5nSWY9XCJmb3JtYXQoKSA9PT0gJ2hleGEnICYmIGludGVyYWN0aXZlKClcIlxuICAgICAgICBtYXg9XCIyNTVcIlxuICAgICAgICB0dWlTbGlkZXJcbiAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgW25nTW9kZWxdPVwib3BhY2l0eSgpXCJcbiAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uT3BhY2l0eSgkZXZlbnQpXCJcbiAgICAgICAgKHBvaW50ZXJkb3duLnN0b3ApPVwiZWwuZm9jdXMoKVwiXG4gICAgLz5cbjwvbmctY29udGFpbmVyPlxuIl19