UNPKG

@taiga-ui/kit

Version:
213 lines • 27.5 kB
var TuiInputCountComponent_1; import { __decorate, __param } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, HostBinding, Inject, Input, Optional, Self, ViewChild, } from '@angular/core'; import { NgControl } from '@angular/forms'; import { AbstractTuiControl, CHAR_NO_BREAK_SPACE, clamp, isNativeFocused, isPresent, setNativeFocused, TUI_FOCUSABLE_ITEM_ACCESSOR, TUI_IS_MOBILE, tuiDefaultProp, tuiPure, } from '@taiga-ui/cdk'; import { formatNumber, TUI_TEXTFIELD_APPEARANCE, TUI_TEXTFIELD_SIZE, TuiAppearance, tuiCreateNumberMask, TuiPrimitiveTextfieldComponent, TuiSizeL, TuiSizeS, TuiTextfieldSizeDirective, TuiTextMaskOptions, TuiWithOptionalMinMax, } from '@taiga-ui/core'; import { TUI_PLUS_MINUS_TEXTS } from '@taiga-ui/kit/tokens'; import { Observable } from 'rxjs'; // @dynamic let TuiInputCountComponent = TuiInputCountComponent_1 = class TuiInputCountComponent extends AbstractTuiControl { constructor(control, changeDetectorRef, appearance, textfieldSize, minusTexts$, isMobile) { super(control, changeDetectorRef); this.appearance = appearance; this.textfieldSize = textfieldSize; this.minusTexts$ = minusTexts$; this.isMobile = isMobile; this.step = 1; this.min = 0; this.max = Infinity; this.hideButtons = false; this.postfix = ''; } getMask(allowNegative) { return { mask: tuiCreateNumberMask({ allowNegative }), guide: false }; } get nativeFocusableElement() { return !this.primitiveTextfield || this.computedDisabled ? null : this.primitiveTextfield.nativeFocusableElement; } get size() { return this.textfieldSize.size; } get focused() { return isNativeFocused(this.nativeFocusableElement); } get hasButtons() { return !this.hideButtons && this.appearance !== "table" /* Table */; } get exampleText() { return String(this.min); } get computedValue() { return formatNumber(this.value); } get minusButtonDisabled() { return (this.disabled || this.readOnly || (isPresent(this.value) && this.value <= this.min)); } get plusButtonDisabled() { return (this.disabled || this.readOnly || (isPresent(this.value) && this.value >= this.max)); } onButtonMouseDown(event, disabled = false) { if (disabled || !this.nativeFocusableElement || this.isMobile) { return; } event.preventDefault(); setNativeFocused(this.nativeFocusableElement); } onFocused(focused) { if (!focused) { this.onBlur(); } this.updateFocused(focused); } onHovered(hovered) { this.updateHovered(hovered); } onPressed(pressed) { this.updatePressed(pressed); } onValueChange() { const capped = this.capValue(this.nativeNumberValue); if (capped === null || isNaN(capped)) { return; } const newValue = formatNumber(capped); if (this.nativeValue !== newValue) { this.nativeValue = newValue; } this.updateValue(capped); } decreaseValue() { if (this.readOnly) { return; } const newValue = (this.value || 0) - this.step; this.safeUpdateValue(newValue); } increaseValue() { if (this.readOnly) { return; } const newValue = (this.value || 0) + this.step; this.safeUpdateValue(newValue); } onKeydown(event) { switch (event.key) { case 'ArrowUp': case 'Up': this.increaseValue(); event.preventDefault(); break; case 'ArrowDown': case 'Down': this.decreaseValue(); event.preventDefault(); break; default: break; } } getFallbackValue() { return 0; } get nativeNumberValue() { return parseInt(this.nativeValue.split(CHAR_NO_BREAK_SPACE).join(''), 10); } get nativeValue() { return this.nativeFocusableElement ? this.nativeFocusableElement.value : ''; } set nativeValue(value) { if (!this.nativeFocusableElement) { return; } this.nativeFocusableElement.value = value; } safeUpdateValue(newValue) { const value = clamp(newValue, this.min, this.max); this.updateValue(value); this.nativeValue = formatNumber(value); } capValue(value) { const capped = Math.min(value, this.max); return isNaN(capped) || capped < this.min ? null : capped; } onBlur() { const value = Math.max(this.nativeNumberValue || 0, this.min); const formattedValue = formatNumber(value); this.nativeValue = formattedValue; this.updateValue(value); if (this.primitiveTextfield) { this.primitiveTextfield.value = formattedValue; } } }; TuiInputCountComponent.ctorParameters = () => [ { type: NgControl, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NgControl,] }] }, { type: ChangeDetectorRef, decorators: [{ type: Inject, args: [ChangeDetectorRef,] }] }, { type: String, decorators: [{ type: Inject, args: [TUI_TEXTFIELD_APPEARANCE,] }] }, { type: TuiTextfieldSizeDirective, decorators: [{ type: Inject, args: [TUI_TEXTFIELD_SIZE,] }] }, { type: Observable, decorators: [{ type: Inject, args: [TUI_PLUS_MINUS_TEXTS,] }] }, { type: Boolean, decorators: [{ type: Inject, args: [TUI_IS_MOBILE,] }] } ]; __decorate([ Input(), tuiDefaultProp() ], TuiInputCountComponent.prototype, "step", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputCountComponent.prototype, "min", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputCountComponent.prototype, "max", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputCountComponent.prototype, "hideButtons", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputCountComponent.prototype, "postfix", void 0); __decorate([ tuiPure ], TuiInputCountComponent.prototype, "getMask", null); __decorate([ ViewChild(TuiPrimitiveTextfieldComponent) ], TuiInputCountComponent.prototype, "primitiveTextfield", void 0); __decorate([ HostBinding('attr.data-tui-host-size') ], TuiInputCountComponent.prototype, "size", null); __decorate([ HostBinding('class._has-buttons') ], TuiInputCountComponent.prototype, "hasButtons", null); TuiInputCountComponent = TuiInputCountComponent_1 = __decorate([ Component({ selector: 'tui-input-count', template: "<tui-primitive-textfield\n class=\"textfield\"\n tuiValueAccessor\n tuiTextfieldAutocomplete=\"off\"\n tuiTextfieldInputMode=\"numeric\"\n [tuiTextfieldMaxLength]=\"18\"\n [pseudoFocused]=\"pseudoFocused\"\n [pseudoHovered]=\"pseudoHovered\"\n [pseudoPressed]=\"pseudoPressed\"\n [focusable]=\"focusable\"\n [nativeId]=\"nativeId\"\n [postfix]=\"postfix\"\n [disabled]=\"disabled\"\n [readOnly]=\"readOnly\"\n [textMask]=\"getMask(min < 0)\"\n [invalid]=\"computedInvalid\"\n [value]=\"computedValue\"\n (valueChange)=\"onValueChange()\"\n (keydown)=\"onKeydown($event)\"\n (focusedChange)=\"onFocused($event)\"\n (hoveredChange)=\"onHovered($event)\"\n (pressedChange)=\"onPressed($event)\"\n>\n <ng-content></ng-content>\n</tui-primitive-textfield>\n<ng-container *ngIf=\"hasButtons && (minusTexts$ | async) as texts\">\n <section class=\"buttons\">\n <button\n tuiIconButton\n type=\"button\"\n automation-id=\"tui-input-count__plus-button\"\n size=\"s\"\n icon=\"tuiIconPlus\"\n class=\"button button_plus\"\n appearance=\"textfield\"\n [title]=\"texts[0]\"\n [disabled]=\"plusButtonDisabled\"\n [focusable]=\"false\"\n (mousedown)=\"onButtonMouseDown($event, plusButtonDisabled)\"\n (click)=\"increaseValue()\"\n ></button>\n <button\n tuiIconButton\n type=\"button\"\n automation-id=\"tui-input-count__minus-button\"\n size=\"s\"\n icon=\"tuiIconMinus\"\n class=\"button button_minus\"\n appearance=\"textfield\"\n [disabled]=\"minusButtonDisabled\"\n [focusable]=\"false\"\n [title]=\"texts[1]\"\n (mousedown)=\"onButtonMouseDown($event, minusButtonDisabled)\"\n (click)=\"decreaseValue()\"\n ></button>\n </section>\n</ng-container>\n", changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: TUI_FOCUSABLE_ITEM_ACCESSOR, useExisting: forwardRef(() => TuiInputCountComponent_1), }, ], styles: [":host{font:var(--tui-font-text-s);display:flex;border-radius:var(--tui-radius-m);height:var(--tui-height-m);color:var(--tui-text-01)}:host._disabled{pointer-events:none}:host[data-tui-host-size='l']{font:var(--tui-font-text-m);height:var(--tui-height-l)}.textfield{position:relative;border-radius:inherit;width:100%}:host._has-buttons .textfield{border-top-right-radius:0;border-bottom-right-radius:0}.buttons{display:flex;flex-direction:column;margin-left:2px;height:100%}.button.button{display:flex;width:calc(var(--tui-height-m) * .75);height:calc(50% - 1px)}.button.button_plus{margin-bottom:2px;border-radius:0 var(--tui-radius-m) 0 0}.button.button_minus{border-radius:0 0 var(--tui-radius-m)}:host[data-tui-host-size='l'] .button.button{width:calc(var(--tui-height-l) * .75)}"] }), __param(0, Optional()), __param(0, Self()), __param(0, Inject(NgControl)), __param(1, Inject(ChangeDetectorRef)), __param(2, Inject(TUI_TEXTFIELD_APPEARANCE)), __param(3, Inject(TUI_TEXTFIELD_SIZE)), __param(4, Inject(TUI_PLUS_MINUS_TEXTS)), __param(5, Inject(TUI_IS_MOBILE)) ], TuiInputCountComponent); export { TuiInputCountComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtY291bnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL2lucHV0LWNvdW50LyIsInNvdXJjZXMiOlsiaW5wdXQtY291bnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUNILGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsS0FBSyxFQUNMLGVBQWUsRUFDZixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLDJCQUEyQixFQUMzQixhQUFhLEVBQ2IsY0FBYyxFQUVkLE9BQU8sR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsWUFBWSxFQUNaLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLG1CQUFtQixFQUNuQiw4QkFBOEIsRUFDOUIsUUFBUSxFQUNSLFFBQVEsRUFDUix5QkFBeUIsRUFDekIsa0JBQWtCLEVBQ2xCLHFCQUFxQixHQUN4QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFaEMsV0FBVztBQWFYLElBQWEsc0JBQXNCLDhCQUFuQyxNQUFhLHNCQUNULFNBQVEsa0JBQTBCO0lBOEJsQyxZQUlJLE9BQXlCLEVBQ0UsaUJBQW9DLEVBRTlDLFVBQWtCLEVBRWxCLGFBQXdDLEVBRWhELFdBQXlDLEVBQ1YsUUFBaUI7UUFFekQsS0FBSyxDQUFDLE9BQU8sRUFB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d0RBR2pDO0FBbEVRLHNCQUFzQjtJQVpsQyxTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUUsaUJBQWlCO1FBQzNCLGsrREFBMEM7UUFFMUMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07UUFDL0MsU0FBUyxFQUFFO1lBQ1A7Z0JBQ0ksT0FBTyxFQUFFLDJCQUEyQjtnQkFDcEMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBc0IsQ0FBQzthQUN4RDtTQUNKOztLQUNKLENBQUM7SUFpQ08sV0FBQSxRQUFRLEVBQUUsQ0FBQTtJQUNWLFdBQUEsSUFBSSxFQUFFLENBQUE7SUFDTixXQUFBLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUVqQixXQUFBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQ3pCLFdBQUEsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUE7SUFFaEMsV0FBQSxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUUxQixXQUFBLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0lBRTVCLFdBQUEsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0dBM0NqQixzQkFBc0IsQ0FzTmxDO1NBdE5ZLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9wdGlvbmFsLFxuICAgIFNlbGYsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TmdDb250cm9sfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0VHVpQ29udHJvbCxcbiAgICBDSEFSX05PX0JSRUFLX1NQQUNFLFxuICAgIGNsYW1wLFxuICAgIGlzTmF0aXZlRm9jdXNlZCxcbiAgICBpc1ByZXNlbnQsXG4gICAgc2V0TmF0aXZlRm9jdXNlZCxcbiAgICBUVUlfRk9DVVNBQkxFX0lURU1fQUNDRVNTT1IsXG4gICAgVFVJX0lTX01PQklMRSxcbiAgICB0dWlEZWZhdWx0UHJvcCxcbiAgICBUdWlGb2N1c2FibGVFbGVtZW50QWNjZXNzb3IsXG4gICAgdHVpUHVyZSxcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQge1xuICAgIGZvcm1hdE51bWJlcixcbiAgICBUVUlfVEVYVEZJRUxEX0FQUEVBUkFOQ0UsXG4gICAgVFVJX1RFWFRGSUVMRF9TSVpFLFxuICAgIFR1aUFwcGVhcmFuY2UsXG4gICAgdHVpQ3JlYXRlTnVtYmVyTWFzayxcbiAgICBUdWlQcmltaXRpdmVUZXh0ZmllbGRDb21wb25lbnQsXG4gICAgVHVpU2l6ZUwsXG4gICAgVHVpU2l6ZVMsXG4gICAgVHVpVGV4dGZpZWxkU2l6ZURpcmVjdGl2ZSxcbiAgICBUdWlUZXh0TWFza09wdGlvbnMsXG4gICAgVHVpV2l0aE9wdGlvbmFsTWluTWF4LFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZSc7XG5pbXBvcnQge1RVSV9QTFVTX01JTlVTX1RFWFRTfSBmcm9tICdAdGFpZ2EtdWkva2l0L3Rva2Vucyc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuXG4vLyBAZHluYW1pY1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0dWktaW5wdXQtY291bnQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC1jb3VudC50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbnB1dC1jb3VudC5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRVSV9GT0NVU0FCTEVfSVRFTV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFR1aUlucHV0Q291bnRDb21wb25lbnQpLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aUlucHV0Q291bnRDb21wb25lbnRcbiAgICBleHRlbmRzIEFic3RyYWN0VHVpQ29udHJvbDxudW1iZXI+XG4gICAgaW1wbGVtZW50cyBUdWlXaXRoT3B0aW9uYWxNaW5NYXg8bnVtYmVyPiwgVHVpRm9jdXNhYmxlRWxlbWVudEFjY2Vzc29yIHtcbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgc3RlcCA9IDE7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgbWluID0gMDtcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBtYXggPSBJbmZpbml0eTtcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBoaWRlQnV0dG9ucyA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIHBvc3RmaXggPSAnJztcblxuICAgIEB0dWlQdXJlXG4gICAgZ2V0TWFzayhhbGxvd05lZ2F0aXZlOiBib29sZWFuKTogVHVpVGV4dE1hc2tPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHttYXNrOiB0dWlDcmVhdGVOdW1iZXJNYXNrKHthbGxvd05lZ2F0aXZlfSksIGd1aWRlOiBmYWxzZX07XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZChUdWlQcmltaXRpdmVUZXh0ZmllbGRDb21wb25lbnQpXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmltaXRpdmVUZXh0ZmllbGQ/OiBUdWlQcmltaXRpdmVUZXh0ZmllbGRDb21wb25lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQFNlbGYoKVxuICAgICAgICBASW5qZWN0KE5nQ29udHJvbClcbiAgICAgICAgY29udHJvbDogTmdDb250cm9sIHwgbnVsbCxcbiAgICAgICAgQEluamVjdChDaGFuZ2VEZXRlY3RvclJlZikgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBASW5qZWN0KFRVSV9URVhURklFTERfQVBQRUFSQU5DRSlcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhcHBlYXJhbmNlOiBzdHJpbmcsXG4gICAgICAgIEBJbmplY3QoVFVJX1RFWFRGSUVMRF9TSVpFKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHRleHRmaWVsZFNpemU6IFR1aVRleHRmaWVsZFNpemVEaXJlY3RpdmUsXG4gICAgICAgIEBJbmplY3QoVFVJX1BMVVNfTUlOVVNfVEVYVFMpXG4gICAgICAgIHJlYWRvbmx5IG1pbnVzVGV4dHMkOiBPYnNlcnZhYmxlPFtzdHJpbmcsIHN0cmluZ10+LFxuICAgICAgICBASW5qZWN0KFRVSV9JU19NT0JJTEUpIHByaXZhdGUgcmVhZG9ubHkgaXNNb2JpbGU6IGJvb2xlYW4sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGNvbnRyb2wsIGNoYW5nZURldGVjdG9yUmVmKTtcbiAgICB9XG5cbiAgICBnZXQgbmF0aXZlRm9jdXNhYmxlRWxlbWVudCgpOiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiAhdGhpcy5wcmltaXRpdmVUZXh0ZmllbGQgfHwgdGhpcy5jb21wdXRlZERpc2FibGVkXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogdGhpcy5wcmltaXRpdmVUZXh0ZmllbGQubmF0aXZlRm9jdXNhYmxlRWxlbWVudDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS10dWktaG9zdC1zaXplJylcbiAgICBnZXQgc2l6ZSgpOiBUdWlTaXplTCB8IFR1aVNpemVTIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dGZpZWxkU2l6ZS5zaXplO1xuICAgIH1cblxuICAgIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNOYXRpdmVGb2N1c2VkKHRoaXMubmF0aXZlRm9jdXNhYmxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5faGFzLWJ1dHRvbnMnKVxuICAgIGdldCBoYXNCdXR0b25zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuaGlkZUJ1dHRvbnMgJiYgdGhpcy5hcHBlYXJhbmNlICE9PSBUdWlBcHBlYXJhbmNlLlRhYmxlO1xuICAgIH1cblxuICAgIGdldCBleGFtcGxlVGV4dCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMubWluKTtcbiAgICB9XG5cbiAgICBnZXQgY29tcHV0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZm9ybWF0TnVtYmVyKHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIGdldCBtaW51c0J1dHRvbkRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCB8fFxuICAgICAgICAgICAgdGhpcy5yZWFkT25seSB8fFxuICAgICAgICAgICAgKGlzUHJlc2VudCh0aGlzLnZhbHVlKSAmJiB0aGlzLnZhbHVlIDw9IHRoaXMubWluKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBwbHVzQnV0dG9uRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkIHx8XG4gICAgICAgICAgICB0aGlzLnJlYWRPbmx5IHx8XG4gICAgICAgICAgICAoaXNQcmVzZW50KHRoaXMudmFsdWUpICYmIHRoaXMudmFsdWUgPj0gdGhpcy5tYXgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb25CdXR0b25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGRpc2FibGVkIHx8ICF0aGlzLm5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQgfHwgdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0TmF0aXZlRm9jdXNlZCh0aGlzLm5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIG9uRm9jdXNlZChmb2N1c2VkOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghZm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5vbkJsdXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlRm9jdXNlZChmb2N1c2VkKTtcbiAgICB9XG5cbiAgICBvbkhvdmVyZWQoaG92ZXJlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnVwZGF0ZUhvdmVyZWQoaG92ZXJlZCk7XG4gICAgfVxuXG4gICAgb25QcmVzc2VkKHByZXNzZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVQcmVzc2VkKHByZXNzZWQpO1xuICAgIH1cblxuICAgIG9uVmFsdWVDaGFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IGNhcHBlZCA9IHRoaXMuY2FwVmFsdWUodGhpcy5uYXRpdmVOdW1iZXJWYWx1ZSk7XG5cbiAgICAgICAgaWYgKGNhcHBlZCA9PT0gbnVsbCB8fCBpc05hTihjYXBwZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGZvcm1hdE51bWJlcihjYXBwZWQpO1xuXG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZVZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShjYXBwZWQpO1xuICAgIH1cblxuICAgIGRlY3JlYXNlVmFsdWUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9ICh0aGlzLnZhbHVlIHx8IDApIC0gdGhpcy5zdGVwO1xuXG4gICAgICAgIHRoaXMuc2FmZVVwZGF0ZVZhbHVlKG5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICBpbmNyZWFzZVZhbHVlKCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSAodGhpcy52YWx1ZSB8fCAwKSArIHRoaXMuc3RlcDtcblxuICAgICAgICB0aGlzLnNhZmVVcGRhdGVWYWx1ZShuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgIGNhc2UgJ1VwJzpcbiAgICAgICAgICAgICAgICB0aGlzLmluY3JlYXNlVmFsdWUoKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgIGNhc2UgJ0Rvd24nOlxuICAgICAgICAgICAgICAgIHRoaXMuZGVjcmVhc2VWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEZhbGxiYWNrVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbmF0aXZlTnVtYmVyVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMubmF0aXZlVmFsdWUuc3BsaXQoQ0hBUl9OT19CUkVBS19TUEFDRSkuam9pbignJyksIDEwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBuYXRpdmVWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50ID8gdGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50LnZhbHVlIDogJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXQgbmF0aXZlVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMubmF0aXZlRm9jdXNhYmxlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYWZlVXBkYXRlVmFsdWUobmV3VmFsdWU6IG51bWJlcikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNsYW1wKG5ld1ZhbHVlLCB0aGlzLm1pbiwgdGhpcy5tYXgpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gZm9ybWF0TnVtYmVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhcFZhbHVlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY2FwcGVkID0gTWF0aC5taW4odmFsdWUsIHRoaXMubWF4KTtcblxuICAgICAgICByZXR1cm4gaXNOYU4oY2FwcGVkKSB8fCBjYXBwZWQgPCB0aGlzLm1pbiA/IG51bGwgOiBjYXBwZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkJsdXIoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5tYXgodGhpcy5uYXRpdmVOdW1iZXJWYWx1ZSB8fCAwLCB0aGlzLm1pbik7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gZm9ybWF0TnVtYmVyKHZhbHVlKTtcblxuICAgICAgICB0aGlzLm5hdGl2ZVZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLnByaW1pdGl2ZVRleHRmaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVUZXh0ZmllbGQudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==