UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

281 lines (280 loc) 22.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { DefaultControlValueAccessor } from './../common/default-control-value-accessor'; import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms'; import { Component, forwardRef, Input, ElementRef, ViewChild, Renderer2 } from '@angular/core'; import { debounceTime } from 'rxjs/operators'; import { Subject } from 'rxjs'; export class AsiInputNumberComponent extends DefaultControlValueAccessor { /** * @param {?} renderer * @param {?} elementRef */ constructor(renderer, elementRef) { super(); this.renderer = renderer; this.elementRef = elementRef; /** * Label position */ this.labelPosition = 'top'; /** * Increment value when click on + or - */ this.step = 1; /** * Allow you to disable the input */ this.disableInput = false; /** * Allow you to hide the action button */ this.hideAction = false; /** * Delay before value change */ this.delay = 0; /** * Number regex */ this.pattern = new RegExp('^-?[0-9]*[,\.]{0,1}[0-9]{0,2}$'); /** * pattern used to managed typed value, if this pattern is true the 'value' will be the last valide one */ this.toleratePattern = new RegExp('^[0-9]*[,\.]{1}$'); /** * use a non decimal pattern '^-?[0-9]*$' */ this.noDecimal = false; this.inputControl = new FormControl(); this.outputDelayValue = new Subject(); } /** * @return {?} */ ngOnInit() { if (this.noDecimal) { this.pattern = new RegExp('^-?[0-9]*$'); } this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition); this.inputControl.valueChanges.subscribe((value) => { if (value === '' || value == null) { this.outputDelayValue.next(null); this.oldValideValue = null; return; } /** @type {?} */ const tolerateValue = !this.noDecimal && this.toleratePattern.test(value); /** @type {?} */ const minusPossible = (this.min == null || this.min < 0) && value.length === 1 && value.indexOf('-') !== -1; value = value.replace(',', '\.'); if (this.pattern.test(value)) { if (!isNaN(Number(value))) { // The value is a number if (!(this.max != null && value > this.max) && !(this.min != null && value < this.min) && !tolerateValue) { this.outputDelayValue.next(Number(value)); if (Number(value) !== 0) { this.oldValideValue = value; } else { this.oldValideValue = 0; } return; } } else if (minusPossible) { this.outputDelayValue.next(null); this.oldValideValue = value; return; } } if (!tolerateValue && !minusPossible) { this.inputControl.setValue(this.oldValideValue, { emitEvent: false }); } else { this.oldValideValue = value; this.inputControl.setValue(value, { emitEvent: false }); } }); this.outputDelayValue.pipe(debounceTime(this.delay)).subscribe((value) => { this.value = value; }); if (this.stepIncrease == null) { this.stepIncrease = this.step; } if (this.stepDecrease == null) { this.stepDecrease = this.step; } } /** * @return {?} */ increase() { if (this.inputControl.value == null || this.inputControl.value === '') { this.inputControl.setValue(this.stepIncrease + ''); } else { /** @type {?} */ const number = Number(this.inputControl.value); this.inputControl.setValue(number + this.stepIncrease + ''); } } /** * @return {?} */ decrease() { if (this.inputControl.value == null || this.inputControl.value === '') { this.inputControl.setValue(-this.stepDecrease + ''); } else { /** @type {?} */ const number = Number(this.inputControl.value); this.inputControl.setValue(number - this.stepDecrease + ''); } } /** * @param {?} value * @return {?} */ writeValue(value) { if (value != null && this.pattern.test(value)) { this.inputControl.setValue(value, { emitEvent: false }); this._value = value; } else { this.inputControl.setValue(null, { emitEvent: false }); this._value = null; } this.oldValideValue = this._value; } } AsiInputNumberComponent.decorators = [ { type: Component, args: [{ selector: 'asi-input-number', host: { 'class': 'asi-component asi-input-number' }, template: "<label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\n<div class=\"number-select\">\n <asi-button *ngIf=\"!hideAction\" class=\"minus\" size=\"mini\" [disabled]=\"disabled\" type=\"button\" (click)=\"decrease()\">-</asi-button>\n <input #input [attr.disabled]=\"disabled || disableInput ? '' : null\"\n [attr.id]=\"id\" [attr.name]=\"name\" type=\"text\" class=\"asi-focus-error\" [formControl]=\"inputControl\" />\n <asi-button *ngIf=\"!hideAction\" class=\"plus\" size=\"mini\" [disabled]=\"disabled\" type=\"button\" (click)=\"increase()\">+</asi-button>\n</div>\n", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AsiInputNumberComponent), multi: true } ] }] } ]; /** @nocollapse */ AsiInputNumberComponent.ctorParameters = () => [ { type: Renderer2 }, { type: ElementRef } ]; AsiInputNumberComponent.propDecorators = { id: [{ type: Input }], name: [{ type: Input }], label: [{ type: Input }], labelPosition: [{ type: Input }], step: [{ type: Input }], stepIncrease: [{ type: Input }], stepDecrease: [{ type: Input }], disableInput: [{ type: Input }], hideAction: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }], delay: [{ type: Input }], pattern: [{ type: Input }], toleratePattern: [{ type: Input }], noDecimal: [{ type: Input }], inputElm: [{ type: ViewChild, args: ['input',] }] }; if (false) { /** * html id * @type {?} */ AsiInputNumberComponent.prototype.id; /** * html name * @type {?} */ AsiInputNumberComponent.prototype.name; /** * Label to display (is translated) * @type {?} */ AsiInputNumberComponent.prototype.label; /** * Label position * @type {?} */ AsiInputNumberComponent.prototype.labelPosition; /** * Increment value when click on + or - * @type {?} */ AsiInputNumberComponent.prototype.step; /** * Increment value when click on + * @type {?} */ AsiInputNumberComponent.prototype.stepIncrease; /** * Decrement value when click on - * @type {?} */ AsiInputNumberComponent.prototype.stepDecrease; /** * Allow you to disable the input * @type {?} */ AsiInputNumberComponent.prototype.disableInput; /** * Allow you to hide the action button * @type {?} */ AsiInputNumberComponent.prototype.hideAction; /** * Min value * @type {?} */ AsiInputNumberComponent.prototype.min; /** * Max value * @type {?} */ AsiInputNumberComponent.prototype.max; /** * Delay before value change * @type {?} */ AsiInputNumberComponent.prototype.delay; /** * Number regex * @type {?} */ AsiInputNumberComponent.prototype.pattern; /** * pattern used to managed typed value, if this pattern is true the 'value' will be the last valide one * @type {?} */ AsiInputNumberComponent.prototype.toleratePattern; /** * use a non decimal pattern '^-?[0-9]*$' * @type {?} */ AsiInputNumberComponent.prototype.noDecimal; /** @type {?} */ AsiInputNumberComponent.prototype.inputElm; /** @type {?} */ AsiInputNumberComponent.prototype.inputControl; /** @type {?} */ AsiInputNumberComponent.prototype.oldValideValue; /** @type {?} */ AsiInputNumberComponent.prototype.outputDelayValue; /** @type {?} */ AsiInputNumberComponent.prototype.renderer; /** @type {?} */ AsiInputNumberComponent.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWlucHV0LW51bWJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWlucHV0LW51bWJlci9hc2ktaW5wdXQtbnVtYmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQVUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWUvQixNQUFNLDhCQUErQixTQUFRLDJCQUEyQjs7Ozs7SUFvRHRFLFlBQW9CLFFBQW1CLEVBQzdCO1FBQ1IsS0FBSyxFQUFFLENBQUM7UUFGVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQzdCLGVBQVUsR0FBVixVQUFVOzs7OzZCQTNDMkUsS0FBSzs7OztvQkFHcEYsQ0FBQzs7Ozs0QkFTTyxLQUFLOzs7OzBCQUdQLEtBQUs7Ozs7cUJBU1YsQ0FBQzs7Ozt1QkFHQyxJQUFJLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQzs7OzsrQkFHcEMsSUFBSSxNQUFNLENBQUMsa0JBQWtCLENBQUM7Ozs7eUJBR3BDLEtBQUs7NEJBSVgsSUFBSSxXQUFXLEVBQUU7Z0NBR2IsSUFBSSxPQUFPLEVBQVU7S0FLdkM7Ozs7SUFFRCxRQUFRO1FBQ04sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE1BQU0s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RixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2RSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUNwQixDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1NBQzlCO1FBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUMvQjtLQUNGOzs7O0lBRUQsUUFBUTtRQUNOLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDcEQ7UUFBQyxJQUFJLENBQUMsQ0FBQzs7WUFDTixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztTQUM3RDtLQUNGOzs7O0lBRUQsUUFBUTtRQUNOLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNyRDtRQUFDLElBQUksQ0FBQyxDQUFDOztZQUNOLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQzdEO0tBQ0Y7Ozs7O0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDckI7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0tBQ25DOzs7WUE3SkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRTtnQkFDbkQscW1CQUE4QztnQkFDOUMsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUM7d0JBQ3RELEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGO2FBQ0Y7Ozs7WUFoQnFFLFNBQVM7WUFBeEMsVUFBVTs7O2lCQW9COUMsS0FBSzttQkFFTCxLQUFLO29CQUdMLEtBQUs7NEJBRUwsS0FBSzttQkFHTCxLQUFLOzJCQUdMLEtBQUs7MkJBR0wsS0FBSzsyQkFHTCxLQUFLO3lCQUdMLEtBQUs7a0JBR0wsS0FBSztrQkFHTCxLQUFLO29CQUdMLEtBQUs7c0JBR0wsS0FBSzs4QkFHTCxLQUFLO3dCQUdMLEtBQUs7dUJBRUwsU0FBUyxTQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLy4uL2NvbW1vbi9kZWZhdWx0LWNvbnRyb2wtdmFsdWUtYWNjZXNzb3InO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgRWxlbWVudFJlZiwgT25Jbml0LCBWaWV3Q2hpbGQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FzaS1pbnB1dC1udW1iZXInLFxuICBob3N0OiB7ICdjbGFzcyc6ICdhc2ktY29tcG9uZW50IGFzaS1pbnB1dC1udW1iZXInIH0sXG4gIHRlbXBsYXRlVXJsOiAnYXNpLWlucHV0LW51bWJlci5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNpSW5wdXROdW1iZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQXNpSW5wdXROdW1iZXJDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8qKiBodG1sIGlkICovXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIC8qKiBodG1sIG5hbWUgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBMYWJlbCB0byBkaXNwbGF5IChpcyB0cmFuc2xhdGVkKSAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuICAvKiogTGFiZWwgcG9zaXRpb24gKi9cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnYm90dG9tLWNlbnRlcicgfCAndG9wLWNlbnRlcicgPSAndG9wJztcblxuICAvKiogSW5jcmVtZW50IHZhbHVlIHdoZW4gY2xpY2sgb24gKyBvciAtICovXG4gIEBJbnB1dCgpIHN0ZXAgPSAxO1xuXG4gIC8qKiBJbmNyZW1lbnQgdmFsdWUgd2hlbiBjbGljayBvbiArICovXG4gIEBJbnB1dCgpIHN0ZXBJbmNyZWFzZTogbnVtYmVyO1xuXG4gIC8qKiBEZWNyZW1lbnQgdmFsdWUgd2hlbiBjbGljayBvbiAtICovXG4gIEBJbnB1dCgpIHN0ZXBEZWNyZWFzZTogbnVtYmVyO1xuXG4gIC8qKiBBbGxvdyB5b3UgdG8gZGlzYWJsZSB0aGUgaW5wdXQgKi9cbiAgQElucHV0KCkgZGlzYWJsZUlucHV0ID0gZmFsc2U7XG5cbiAgLyoqIEFsbG93IHlvdSB0byBoaWRlIHRoZSBhY3Rpb24gYnV0dG9uICovXG4gIEBJbnB1dCgpIGhpZGVBY3Rpb24gPSBmYWxzZTtcblxuICAvKiogTWluIHZhbHVlICovXG4gIEBJbnB1dCgpIG1pbjogbnVtYmVyO1xuXG4gIC8qKiBNYXggdmFsdWUgKi9cbiAgQElucHV0KCkgbWF4OiBudW1iZXI7XG5cbiAgLyoqIERlbGF5IGJlZm9yZSB2YWx1ZSBjaGFuZ2UgKi9cbiAgQElucHV0KCkgZGVsYXkgPSAwO1xuXG4gIC8qKiBOdW1iZXIgcmVnZXggKi9cbiAgQElucHV0KCkgcGF0dGVybiA9IG5ldyBSZWdFeHAoJ14tP1swLTldKlssXFwuXXswLDF9WzAtOV17MCwyfSQnKTtcblxuICAvKiogcGF0dGVybiB1c2VkIHRvIG1hbmFnZWQgdHlwZWQgdmFsdWUsIGlmIHRoaXMgcGF0dGVybiBpcyB0cnVlIHRoZSAndmFsdWUnIHdpbGwgYmUgdGhlIGxhc3QgdmFsaWRlIG9uZSAqL1xuICBASW5wdXQoKSB0b2xlcmF0ZVBhdHRlcm4gPSBuZXcgUmVnRXhwKCdeWzAtOV0qWyxcXC5dezF9JCcpO1xuXG4gIC8qKiB1c2UgYSBub24gZGVjaW1hbCBwYXR0ZXJuICdeLT9bMC05XSokJyAqL1xuICBASW5wdXQoKSBub0RlY2ltYWwgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdpbnB1dCcpIGlucHV0RWxtOiBFbGVtZW50UmVmO1xuXG4gIGlucHV0Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBwcml2YXRlIG9sZFZhbGlkZVZhbHVlOiBhbnk7XG5cbiAgb3V0cHV0RGVsYXlWYWx1ZSA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLm5vRGVjaW1hbCkge1xuICAgICAgdGhpcy5wYXR0ZXJuID0gbmV3IFJlZ0V4cCgnXi0/WzAtOV0qJCcpO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdsYWJlbC0nICsgdGhpcy5sYWJlbFBvc2l0aW9uKTtcblxuICAgIHRoaXMuaW5wdXRDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vdXRwdXREZWxheVZhbHVlLm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMub2xkVmFsaWRlVmFsdWUgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvbGVyYXRlVmFsdWUgPSAhdGhpcy5ub0RlY2ltYWwgJiYgdGhpcy50b2xlcmF0ZVBhdHRlcm4udGVzdCh2YWx1ZSk7XG4gICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgYSBtaW51cyBhbmQgaXMgYXV0aG9yaXplZFxuICAgICAgY29uc3QgbWludXNQb3NzaWJsZSA9ICh0aGlzLm1pbiA9PSBudWxsIHx8IHRoaXMubWluIDwgMCkgJiYgdmFsdWUubGVuZ3RoID09PSAxICYmIHZhbHVlLmluZGV4T2YoJy0nKSAhPT0gLTE7XG5cbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnLCcsICdcXC4nKTtcblxuICAgICAgaWYgKHRoaXMucGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgICBpZiAoIWlzTmFOKE51bWJlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIGEgbnVtYmVyXG4gICAgICAgICAgaWYgKCEodGhpcy5tYXggIT0gbnVsbCAmJiB2YWx1ZSA+IHRoaXMubWF4KVxuICAgICAgICAgICAgJiYgISh0aGlzLm1pbiAhPSBudWxsICYmIHZhbHVlIDwgdGhpcy5taW4pICYmICF0b2xlcmF0ZVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm91dHB1dERlbGF5VmFsdWUubmV4dChOdW1iZXIodmFsdWUpKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIodmFsdWUpICE9PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMub2xkVmFsaWRlVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMub2xkVmFsaWRlVmFsdWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChtaW51c1Bvc3NpYmxlKSB7XG4gICAgICAgICAgdGhpcy5vdXRwdXREZWxheVZhbHVlLm5leHQobnVsbCk7XG4gICAgICAgICAgdGhpcy5vbGRWYWxpZGVWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRvbGVyYXRlVmFsdWUgJiYgIW1pbnVzUG9zc2libGUpIHtcbiAgICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUodGhpcy5vbGRWYWxpZGVWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbGRWYWxpZGVWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmlucHV0Q29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5vdXRwdXREZWxheVZhbHVlLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVsYXkpKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5zdGVwSW5jcmVhc2UgPT0gbnVsbCkge1xuICAgICAgdGhpcy5zdGVwSW5jcmVhc2UgPSB0aGlzLnN0ZXBcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGVwRGVjcmVhc2UgPT0gbnVsbCkge1xuICAgICAgdGhpcy5zdGVwRGVjcmVhc2UgPSB0aGlzLnN0ZXA7XG4gICAgfVxuICB9XG5cbiAgaW5jcmVhc2UoKSB7XG4gICAgaWYgKHRoaXMuaW5wdXRDb250cm9sLnZhbHVlID09IG51bGwgfHwgdGhpcy5pbnB1dENvbnRyb2wudmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLmlucHV0Q29udHJvbC5zZXRWYWx1ZSh0aGlzLnN0ZXBJbmNyZWFzZSArICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbnVtYmVyID0gTnVtYmVyKHRoaXMuaW5wdXRDb250cm9sLnZhbHVlKTtcbiAgICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKG51bWJlciArIHRoaXMuc3RlcEluY3JlYXNlICsgJycpO1xuICAgIH1cbiAgfVxuXG4gIGRlY3JlYXNlKCkge1xuICAgIGlmICh0aGlzLmlucHV0Q29udHJvbC52YWx1ZSA9PSBudWxsIHx8IHRoaXMuaW5wdXRDb250cm9sLnZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUoLXRoaXMuc3RlcERlY3JlYXNlICsgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBudW1iZXIgPSBOdW1iZXIodGhpcy5pbnB1dENvbnRyb2wudmFsdWUpO1xuICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUobnVtYmVyIC0gdGhpcy5zdGVwRGVjcmVhc2UgKyAnJyk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdGhpcy5wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICB0aGlzLmlucHV0Q29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLm9sZFZhbGlkZVZhbHVlID0gdGhpcy5fdmFsdWU7XG4gIH1cbn1cbiJdfQ==