UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

81 lines 19.7 kB
import { AsyncPipe, NgIf, PercentPipe } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { TUI_FALSE_HANDLER } from '@taiga-ui/cdk/constants'; import { tuiClamp } from '@taiga-ui/cdk/utils/math'; import { TuiButton } from '@taiga-ui/core/components/button'; import { TuiHint } from '@taiga-ui/core/directives/hint'; import { TuiSlider } from '@taiga-ui/kit/components/slider'; import { TUI_PREVIEW_ICONS, TUI_PREVIEW_ZOOM_TEXTS } from '@taiga-ui/kit/tokens'; import { map, merge, of, startWith, switchMap, timer } from 'rxjs'; import { TuiPreviewAction } from '../action/preview-action.directive'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@taiga-ui/core/directives/hint"; import * as i3 from "@taiga-ui/kit/components/slider"; const STEP = 0.5; class TuiPreviewZoom { constructor() { this.icons = inject(TUI_PREVIEW_ICONS); this.zoomTexts$ = inject(TUI_PREVIEW_ZOOM_TEXTS); this.min = 0.5; this.max = 2; this.value = 1; this.valueChange = new EventEmitter(); this.reset = new EventEmitter(); this.hintShow$ = this.valueChange.pipe(switchMap(() => merge(of(true), timer(1000).pipe(map(TUI_FALSE_HANDLER)))), startWith(false)); } get leftButtonDisabled() { return this.value === this.min; } get rightButtonDisabled() { return this.value === this.max; } get collapseVisible() { return this.value > this.min; } onModelChange(value) { const clamped = tuiClamp(value, this.min, this.max); if (clamped === this.value) { return; } this.value = clamped; this.valueChange.emit(clamped); } onReset() { this.reset.emit(); } onMinus() { this.onModelChange(this.value - STEP); } onPlus() { this.onModelChange(this.value < 1 ? 1 : this.value + STEP); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiPreviewZoom, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiPreviewZoom, isStandalone: true, selector: "tui-preview-zoom", inputs: { min: "min", max: "max", value: "value" }, outputs: { valueChange: "valueChange", reset: "reset" }, ngImport: i0, template: "<ng-container *ngIf=\"zoomTexts$ | async as texts\">\n <section class=\"t-zoom\">\n <button\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-sign_minus\"\n [disabled]=\"leftButtonDisabled\"\n [iconStart]=\"icons.zoomOut\"\n (click)=\"onMinus()\"\n >\n {{ texts.zoomOut }}\n </button>\n <label tuiSliderThumbLabel>\n <div\n [tuiHint]=\"hint\"\n [tuiHintManual]=\"!!(hintShow$ | async)\"\n ></div>\n\n <ng-template #hint>\n {{ (valueChange | async) || value | percent }}\n </ng-template>\n\n <input\n step=\"any\"\n tuiSlider\n tuiTheme=\"dark\"\n type=\"range\"\n class=\"t-slider\"\n [max]=\"max\"\n [min]=\"min\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onModelChange($event)\"\n />\n </label>\n <button\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-sign_plus\"\n [disabled]=\"rightButtonDisabled\"\n [iconStart]=\"icons.zoomIn\"\n (click)=\"onPlus()\"\n >\n {{ texts.zoomIn }}\n </button>\n </section>\n\n <button\n tuiHintAppearance=\"dark\"\n tuiHintDescribe\n tuiHintDirection=\"top-right\"\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-reset-button\"\n [class.t-invisible]=\"!collapseVisible\"\n [iconStart]=\"icons.zoomReset\"\n [tuiHint]=\"texts.reset\"\n (click)=\"onReset()\"\n ></button>\n</ng-container>\n", styles: [":host{position:relative;display:flex}.t-zoom{border-radius:1rem;background:#686868f5;color:#fff;display:flex;font:var(--tui-font-text-s);justify-content:space-between;align-items:center;inline-size:12rem}.t-slider{inline-size:7.5rem}.t-sign_minus{border-top-right-radius:0;border-bottom-right-radius:0}.t-sign_plus{border-top-left-radius:0;border-bottom-left-radius:0}.t-invisible{visibility:hidden}.t-reset-button{margin-inline-start:.3125rem}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.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: i1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.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: "pipe", type: PercentPipe, name: "percent" }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: i2.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }, { kind: "directive", type: i2.TuiHintDescribe, selector: "[tuiHintDescribe]", inputs: ["tuiHintDescribe"] }, { kind: "directive", type: i2.TuiHintManual, selector: "[tuiHint][tuiHintManual]", inputs: ["tuiHintManual"] }, { kind: "directive", type: TuiPreviewAction, selector: "[tuiPreviewAction]" }, { kind: "component", type: i3.TuiSliderComponent, selector: "input[type=range][tuiSlider]", inputs: ["size", "segments"] }, { kind: "component", type: i3.TuiSliderThumbLabel, selector: "[tuiSliderThumbLabel]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiPreviewZoom }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiPreviewZoom, decorators: [{ type: Component, args: [{ standalone: true, selector: 'tui-preview-zoom', imports: [ AsyncPipe, FormsModule, NgIf, PercentPipe, TuiButton, TuiHint, TuiPreviewAction, TuiSlider, ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"zoomTexts$ | async as texts\">\n <section class=\"t-zoom\">\n <button\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-sign_minus\"\n [disabled]=\"leftButtonDisabled\"\n [iconStart]=\"icons.zoomOut\"\n (click)=\"onMinus()\"\n >\n {{ texts.zoomOut }}\n </button>\n <label tuiSliderThumbLabel>\n <div\n [tuiHint]=\"hint\"\n [tuiHintManual]=\"!!(hintShow$ | async)\"\n ></div>\n\n <ng-template #hint>\n {{ (valueChange | async) || value | percent }}\n </ng-template>\n\n <input\n step=\"any\"\n tuiSlider\n tuiTheme=\"dark\"\n type=\"range\"\n class=\"t-slider\"\n [max]=\"max\"\n [min]=\"min\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onModelChange($event)\"\n />\n </label>\n <button\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-sign_plus\"\n [disabled]=\"rightButtonDisabled\"\n [iconStart]=\"icons.zoomIn\"\n (click)=\"onPlus()\"\n >\n {{ texts.zoomIn }}\n </button>\n </section>\n\n <button\n tuiHintAppearance=\"dark\"\n tuiHintDescribe\n tuiHintDirection=\"top-right\"\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-reset-button\"\n [class.t-invisible]=\"!collapseVisible\"\n [iconStart]=\"icons.zoomReset\"\n [tuiHint]=\"texts.reset\"\n (click)=\"onReset()\"\n ></button>\n</ng-container>\n", styles: [":host{position:relative;display:flex}.t-zoom{border-radius:1rem;background:#686868f5;color:#fff;display:flex;font:var(--tui-font-text-s);justify-content:space-between;align-items:center;inline-size:12rem}.t-slider{inline-size:7.5rem}.t-sign_minus{border-top-right-radius:0;border-bottom-right-radius:0}.t-sign_plus{border-top-left-radius:0;border-bottom-left-radius:0}.t-invisible{visibility:hidden}.t-reset-button{margin-inline-start:.3125rem}\n"] }] }], propDecorators: { min: [{ type: Input }], max: [{ type: Input }], value: [{ type: Input }], valueChange: [{ type: Output }], reset: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy16b29tLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL3ByZXZpZXcvem9vbS9wcmV2aWV3LXpvb20uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvcHJldmlldy96b29tL3ByZXZpZXctem9vbS50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzFELE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9FLE9BQU8sRUFBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVqRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7QUFFcEUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBRWpCLE1BaUJhLGNBQWM7SUFqQjNCO1FBa0J1QixVQUFLLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBR3hELFFBQUcsR0FBRyxHQUFHLENBQUM7UUFHVixRQUFHLEdBQUcsQ0FBQyxDQUFDO1FBR1IsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUdELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUd6QyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVqQyxjQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQzdDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQzFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FDbkIsQ0FBQztLQW9DTDtJQWxDRyxJQUFjLGtCQUFrQjtRQUM1QixPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBYyxtQkFBbUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQWMsZUFBZTtRQUN6QixPQUFPLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNqQyxDQUFDO0lBRVMsYUFBYSxDQUFDLEtBQWE7UUFDakMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVwRCxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3hCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFUyxPQUFPO1FBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRVMsT0FBTztRQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRVMsTUFBTTtRQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMvRCxDQUFDOytHQXpEUSxjQUFjO21HQUFkLGNBQWMseUxDdkMzQiwwMkRBK0RBLG1mRHJDUSxTQUFTLDZDQUNULFdBQVcsNndCQUNYLElBQUksd0ZBQ0osV0FBVyxnREFDWCxTQUFTLHlnQkFFVCxnQkFBZ0I7O1NBT1gsY0FBYzs0RkFBZCxjQUFjO2tCQWpCMUIsU0FBUztpQ0FDTSxJQUFJLFlBQ04sa0JBQWtCLFdBQ25CO3dCQUNMLFNBQVM7d0JBQ1QsV0FBVzt3QkFDWCxJQUFJO3dCQUNKLFdBQVc7d0JBQ1gsU0FBUzt3QkFDVCxPQUFPO3dCQUNQLGdCQUFnQjt3QkFDaEIsU0FBUztxQkFDWixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTTs4QkFPeEMsR0FBRztzQkFEVCxLQUFLO2dCQUlDLEdBQUc7c0JBRFQsS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUs7Z0JBSVUsV0FBVztzQkFEMUIsTUFBTTtnQkFJUyxLQUFLO3NCQURwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBc3luY1BpcGUsIE5nSWYsIFBlcmNlbnRQaXBlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtUVUlfRkFMU0VfSEFORExFUn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHt0dWlDbGFtcH0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9tYXRoJztcbmltcG9ydCB7VHVpQnV0dG9ufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2J1dHRvbic7XG5pbXBvcnQge1R1aUhpbnR9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvaGludCc7XG5pbXBvcnQge1R1aVNsaWRlcn0gZnJvbSAnQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL3NsaWRlcic7XG5pbXBvcnQge1RVSV9QUkVWSUVXX0lDT05TLCBUVUlfUFJFVklFV19aT09NX1RFWFRTfSBmcm9tICdAdGFpZ2EtdWkva2l0L3Rva2Vucyc7XG5pbXBvcnQge21hcCwgbWVyZ2UsIG9mLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGltZXJ9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1R1aVByZXZpZXdBY3Rpb259IGZyb20gJy4uL2FjdGlvbi9wcmV2aWV3LWFjdGlvbi5kaXJlY3RpdmUnO1xuXG5jb25zdCBTVEVQID0gMC41O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndHVpLXByZXZpZXctem9vbScsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBBc3luY1BpcGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBOZ0lmLFxuICAgICAgICBQZXJjZW50UGlwZSxcbiAgICAgICAgVHVpQnV0dG9uLFxuICAgICAgICBUdWlIaW50LFxuICAgICAgICBUdWlQcmV2aWV3QWN0aW9uLFxuICAgICAgICBUdWlTbGlkZXIsXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcHJldmlldy16b29tLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3ByZXZpZXctem9vbS5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFR1aVByZXZpZXdab29tIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaWNvbnMgPSBpbmplY3QoVFVJX1BSRVZJRVdfSUNPTlMpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB6b29tVGV4dHMkID0gaW5qZWN0KFRVSV9QUkVWSUVXX1pPT01fVEVYVFMpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluID0gMC41O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4ID0gMjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHZhbHVlID0gMTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc2V0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGhpbnRTaG93JCA9IHRoaXMudmFsdWVDaGFuZ2UucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IG1lcmdlKG9mKHRydWUpLCB0aW1lcigxMDAwKS5waXBlKG1hcChUVUlfRkFMU0VfSEFORExFUikpKSksXG4gICAgICAgIHN0YXJ0V2l0aChmYWxzZSksXG4gICAgKTtcblxuICAgIHByb3RlY3RlZCBnZXQgbGVmdEJ1dHRvbkRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5taW47XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCByaWdodEJ1dHRvbkRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5tYXg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBjb2xsYXBzZVZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlID4gdGhpcy5taW47XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uTW9kZWxDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGFtcGVkID0gdHVpQ2xhbXAodmFsdWUsIHRoaXMubWluLCB0aGlzLm1heCk7XG5cbiAgICAgICAgaWYgKGNsYW1wZWQgPT09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFsdWUgPSBjbGFtcGVkO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY2xhbXBlZCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uUmVzZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzZXQuZW1pdCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbk1pbnVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy52YWx1ZSAtIFNURVApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblBsdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLnZhbHVlIDwgMSA/IDEgOiB0aGlzLnZhbHVlICsgU1RFUCk7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInpvb21UZXh0cyQgfCBhc3luYyBhcyB0ZXh0c1wiPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwidC16b29tXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR1aUljb25CdXR0b25cbiAgICAgICAgICAgIHR1aVByZXZpZXdBY3Rpb25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJ0LXNpZ25fbWludXNcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxlZnRCdXR0b25EaXNhYmxlZFwiXG4gICAgICAgICAgICBbaWNvblN0YXJ0XT1cImljb25zLnpvb21PdXRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWludXMoKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IHRleHRzLnpvb21PdXQgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxsYWJlbCB0dWlTbGlkZXJUaHVtYkxhYmVsPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIFt0dWlIaW50XT1cImhpbnRcIlxuICAgICAgICAgICAgICAgIFt0dWlIaW50TWFudWFsXT1cIiEhKGhpbnRTaG93JCB8IGFzeW5jKVwiXG4gICAgICAgICAgICA+PC9kaXY+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaGludD5cbiAgICAgICAgICAgICAgICB7eyAodmFsdWVDaGFuZ2UgfCBhc3luYykgfHwgdmFsdWUgfCBwZXJjZW50IH19XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBzdGVwPVwiYW55XCJcbiAgICAgICAgICAgICAgICB0dWlTbGlkZXJcbiAgICAgICAgICAgICAgICB0dWlUaGVtZT1cImRhcmtcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0LXNsaWRlclwiXG4gICAgICAgICAgICAgICAgW21heF09XCJtYXhcIlxuICAgICAgICAgICAgICAgIFttaW5dPVwibWluXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR1aUljb25CdXR0b25cbiAgICAgICAgICAgIHR1aVByZXZpZXdBY3Rpb25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJ0LXNpZ25fcGx1c1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicmlnaHRCdXR0b25EaXNhYmxlZFwiXG4gICAgICAgICAgICBbaWNvblN0YXJ0XT1cImljb25zLnpvb21JblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25QbHVzKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyB0ZXh0cy56b29tSW4gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9zZWN0aW9uPlxuXG4gICAgPGJ1dHRvblxuICAgICAgICB0dWlIaW50QXBwZWFyYW5jZT1cImRhcmtcIlxuICAgICAgICB0dWlIaW50RGVzY3JpYmVcbiAgICAgICAgdHVpSGludERpcmVjdGlvbj1cInRvcC1yaWdodFwiXG4gICAgICAgIHR1aUljb25CdXR0b25cbiAgICAgICAgdHVpUHJldmlld0FjdGlvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJ0LXJlc2V0LWJ1dHRvblwiXG4gICAgICAgIFtjbGFzcy50LWludmlzaWJsZV09XCIhY29sbGFwc2VWaXNpYmxlXCJcbiAgICAgICAgW2ljb25TdGFydF09XCJpY29ucy56b29tUmVzZXRcIlxuICAgICAgICBbdHVpSGludF09XCJ0ZXh0cy5yZXNldFwiXG4gICAgICAgIChjbGljayk9XCJvblJlc2V0KClcIlxuICAgID48L2J1dHRvbj5cbjwvbmctY29udGFpbmVyPlxuIl19