ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
288 lines • 39 kB
JavaScript
import { Component, Input, Output, EventEmitter, HostBinding, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "ng-zorro-antd-mobile/icon";
export class StepperComponent {
get max() {
return this._max;
}
set max(value) {
this._max = value;
}
get min() {
return this._min;
}
set min(value) {
this._min = value;
}
get value() {
return this._value;
}
set value(v) {
this._value = v;
}
set step(value) {
this._step = value;
}
set defaultValue(value) {
if (value) {
this._defaultValue = value;
this._value = value;
}
}
get disabled() {
return this._disabled;
}
set disabled(value) {
if (value) {
this._downDisabled = value;
this._upDisabled = value;
}
this._disabled = value;
this.clsStpDisabled = value;
}
get readOnly() {
return this._readOnly;
}
set readOnly(value) {
this._readOnly = value;
}
set showNumber(value) {
this._showNumber = value;
this.clsShowNum = value;
}
constructor() {
this.prefixCls = 'am-stepper';
this._max = Infinity;
this._min = -Infinity;
this._step = 1;
this._disabled = false;
this._readOnly = false;
this._showNumber = false;
this._upDisabled = false;
this._downDisabled = false;
this._isUpClick = false;
this._isDownClick = false;
this._inputLock = false;
this.onChange = new EventEmitter();
this.clsStepper = true;
this.clsStpDisabled = this._disabled;
this.clsShowNum = this._showNumber;
this.onChangeFn = () => { };
this.onTouchFn = () => { };
}
onIncrease() {
if (!this._upDisabled) {
this._value = this.plus(this._value, this._step);
this.onChange.emit(this._value);
this.onChangeFn(this._value);
if (this.plus(this._value, this._step) > this._max) {
this._upDisabled = true;
}
if (this.minus(this._value, this._step) >= this._min) {
this._downDisabled = false;
}
this._isUpClick = true;
this.setCls();
setTimeout(() => {
this._isUpClick = false;
this.setCls();
}, 100);
}
}
onDecrease() {
if (!this._downDisabled) {
this._value = this.minus(this._value, this._step);
this.onChange.emit(this._value);
this.onChangeFn(this._value);
if (this.minus(this._value, this._step) < this._min) {
this._downDisabled = true;
}
if (this.plus(this._value, this._step) <= this._max) {
this._upDisabled = false;
}
this._isDownClick = true;
this.setCls();
setTimeout(() => {
this._isDownClick = false;
this.setCls();
}, 100);
}
}
compositionStart() {
this._inputLock = true;
}
compositionEnd() {
this._inputLock = false;
}
inputChange(event) {
// 'compositionend' is earlier than ngModelChange, Therefore use timer to make ngModelChange runs after 'compositionend' event
setTimeout(() => {
if (this._inputLock) {
return;
}
const allowDecimal = this._step % 1 !== 0;
const allowNegative = this._min < 0;
let decimalFlag = false;
let negativeFlag = false;
if (!event)
event = '';
let value = event.toString().replace(/\D/g, (match, index, str) => {
if (allowDecimal && match === '.' && !decimalFlag) {
decimalFlag = true;
return '.';
}
if (allowNegative && match === '-' && !negativeFlag) {
negativeFlag = true;
return '-';
}
return '';
});
if (negativeFlag && value.indexOf('-') > 0) {
value = value.replace(/-/g, '');
}
if (!isNaN(value)) {
this._value = +value;
this._upDisabled = this.plus(this._value, this._step) > this._max ? true : false;
this._downDisabled = this.minus(this._value, this._step) < this._min ? true : false;
}
this.setCls();
this.onChange.emit(this._value);
this.onChangeFn(this._value);
}, 0);
}
inputBlur() {
let value = +this._value;
if (+this._value === -0) {
value = 0;
}
if (this._value < this._min) {
value = this._min;
}
else if (this._value > this._max) {
value = this._max;
}
const len = this._step.toString().length - this._step.toString().indexOf('.') - 1;
value = +value.toFixed(len);
if (value !== this._value) {
this._value = value;
this.onChange.emit(this._value);
this.onChangeFn(this._value);
}
}
setCls() {
this.upDisableCls = {
[`${this.prefixCls}-handler-up-disabled`]: this._upDisabled,
[`${this.prefixCls}-handler-active`]: this._isUpClick
};
this.downDisableCls = {
[`${this.prefixCls}-handler-down-disabled`]: this._downDisabled,
[`${this.prefixCls}-handler-active`]: this._isDownClick
};
}
ngOnChanges() {
if (this._disabled) {
this._downDisabled = true;
this._upDisabled = true;
}
else {
this._upDisabled = this.plus(this._value, this._step) > this._max ? true : false;
this._downDisabled = this.minus(this._value, this._step) < this._min ? true : false;
}
this.setCls();
}
writeValue(value) {
this._value = value;
this.ngOnChanges();
}
registerOnChange(fn) {
this.onChangeFn = fn;
}
registerOnTouched(fn) {
this.onTouchFn = fn;
}
plus(num1, num2) {
if (num1 === undefined || num1 === null || num2 === undefined || num2 === null) {
return;
}
const baseNum = Math.pow(10, Math.max(this.digitLength(num1), this.digitLength(num2)));
return (this.times(num1, baseNum) + this.times(num2, baseNum)) / baseNum;
}
minus(num1, num2) {
if (num1 === undefined || num1 === null || num2 === undefined || num2 === null) {
return;
}
const baseNum = Math.pow(10, Math.max(this.digitLength(num1), this.digitLength(num2)));
return (this.times(num1, baseNum) - this.times(num2, baseNum)) / baseNum;
}
digitLength(num) {
const eSplit = num.toString().split(/[eE]/);
const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
return len > 0 ? len : 0;
}
times(num1, num2) {
const num1Changed = this.floatToFixed(num1);
const num2Changed = this.floatToFixed(num2);
const baseNum = this.digitLength(num1) + this.digitLength(num2);
const leftValue = num1Changed * num2Changed;
return leftValue / Math.pow(10, baseNum);
}
floatToFixed(num) {
if (num.toString().indexOf('e') === -1) {
return Number(num.toString().replace('.', ''));
}
const dLen = this.digitLength(num);
return dLen > 0 ? this.strip(num * Math.pow(10, dLen)) : num;
}
strip(num, precision = 12) {
return +parseFloat(num.toPrecision(precision));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: StepperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: StepperComponent, selector: "Stepper, nzm-stepper", inputs: { max: "max", min: "min", value: "value", step: "step", defaultValue: "defaultValue", disabled: "disabled", readOnly: "readOnly", showNumber: "showNumber" }, outputs: { onChange: "onChange" }, host: { properties: { "class.am-stepper": "this.clsStepper", "class.am-stepper-disabled": "this.clsStpDisabled", "class.showNumber": "this.clsShowNum" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => StepperComponent),
multi: true
}
], usesOnChanges: true, ngImport: i0, template: "<div class=\"{{ prefixCls }}-handler-wrap\">\n <span\n role=\"button\"\n class=\"{{ prefixCls }}-handler {{ prefixCls }}-handler-up\"\n style=\"line-height:28px;\"\n [ngClass]=\"upDisableCls\"\n (click)=\"onIncrease()\"\n >\n <Icon [type]=\"'plus'\" [size]=\"'xxs'\"> </Icon>\n </span>\n <span\n role=\"button\"\n class=\"{{ prefixCls }}-handler {{ prefixCls }}-handler-down\"\n style=\"line-height:28px;\"\n [ngClass]=\"downDisableCls\"\n (click)=\"onDecrease()\"\n >\n <Icon [type]=\"'minus'\" [size]=\"'xxs'\"> </Icon>\n </span>\n</div>\n<div class=\"{{ prefixCls }}-input-wrap\">\n <input\n type=\"number\"\n pattern=\"\\-?\\d+(\\.\\d+)?\"\n style=\"outline:none\"\n class=\"{{ prefixCls }}-input\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly\"\n [autocomplete]=\"'off'\"\n [max]=\"max\"\n [min]=\"min\"\n [(ngModel)]=\"value\"\n (ngModelChange)=\"inputChange($event)\"\n (compositionstart)=\"compositionStart()\"\n (compositionend)=\"compositionEnd()\"\n (blur)=\"inputBlur()\"\n />\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.IconComponent, selector: "Icon, nzm-icon", inputs: ["color", "type", "src", "size"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: StepperComponent, decorators: [{
type: Component,
args: [{ selector: 'Stepper, nzm-stepper', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => StepperComponent),
multi: true
}
], template: "<div class=\"{{ prefixCls }}-handler-wrap\">\n <span\n role=\"button\"\n class=\"{{ prefixCls }}-handler {{ prefixCls }}-handler-up\"\n style=\"line-height:28px;\"\n [ngClass]=\"upDisableCls\"\n (click)=\"onIncrease()\"\n >\n <Icon [type]=\"'plus'\" [size]=\"'xxs'\"> </Icon>\n </span>\n <span\n role=\"button\"\n class=\"{{ prefixCls }}-handler {{ prefixCls }}-handler-down\"\n style=\"line-height:28px;\"\n [ngClass]=\"downDisableCls\"\n (click)=\"onDecrease()\"\n >\n <Icon [type]=\"'minus'\" [size]=\"'xxs'\"> </Icon>\n </span>\n</div>\n<div class=\"{{ prefixCls }}-input-wrap\">\n <input\n type=\"number\"\n pattern=\"\\-?\\d+(\\.\\d+)?\"\n style=\"outline:none\"\n class=\"{{ prefixCls }}-input\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly\"\n [autocomplete]=\"'off'\"\n [max]=\"max\"\n [min]=\"min\"\n [(ngModel)]=\"value\"\n (ngModelChange)=\"inputChange($event)\"\n (compositionstart)=\"compositionStart()\"\n (compositionend)=\"compositionEnd()\"\n (blur)=\"inputBlur()\"\n />\n</div>\n" }]
}], ctorParameters: () => [], propDecorators: { max: [{
type: Input
}], min: [{
type: Input
}], value: [{
type: Input
}], step: [{
type: Input
}], defaultValue: [{
type: Input
}], disabled: [{
type: Input
}], readOnly: [{
type: Input
}], showNumber: [{
type: Input
}], onChange: [{
type: Output
}], clsStepper: [{
type: HostBinding,
args: ['class.am-stepper']
}], clsStpDisabled: [{
type: HostBinding,
args: ['class.am-stepper-disabled']
}], clsShowNum: [{
type: HostBinding,
args: ['class.showNumber']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL3N0ZXBwZXIvc3RlcHBlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9jb21wb25lbnRzL3N0ZXBwZXIvc3RlcHBlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFhLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQWF6RSxNQUFNLE9BQU8sZ0JBQWdCO0lBb0IzQixJQUNJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUNELElBQ0ksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsS0FBYTtRQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFDSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxDQUFTO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFDRCxJQUNJLElBQUksQ0FBQyxLQUFLO1FBQ1osSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUNELElBQ0ksWUFBWSxDQUFDLEtBQUs7UUFDcEIsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZ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O3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDOzRCQUMvQyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjt3REF1QkcsR0FBRztzQkFETixLQUFLO2dCQVFGLEdBQUc7c0JBRE4sS0FBSztnQkFRRixLQUFLO3NCQURSLEtBQUs7Z0JBUUYsSUFBSTtzQkFEUCxLQUFLO2dCQUtGLFlBQVk7c0JBRGYsS0FBSztnQkFRRixRQUFRO3NCQURYLEtBQUs7Z0JBYUYsUUFBUTtzQkFEWCxLQUFLO2dCQVFGLFVBQVU7c0JBRGIsS0FBSztnQkFNTixRQUFRO3NCQURQLE1BQU07Z0JBSVAsVUFBVTtzQkFEVCxXQUFXO3VCQUFDLGtCQUFrQjtnQkFHL0IsY0FBYztzQkFEYixXQUFXO3VCQUFDLDJCQUEyQjtnQkFHeEMsVUFBVTtzQkFEVCxXQUFXO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIEhvc3RCaW5kaW5nLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1N0ZXBwZXIsIG56bS1zdGVwcGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXBwZXIuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFN0ZXBwZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1zdGVwcGVyJztcbiAgdXBEaXNhYmxlQ2xzOiBvYmplY3Q7XG4gIGRvd25EaXNhYmxlQ2xzOiBvYmplY3Q7XG4gIHN0ZXBwZXJDbHM6IG9iamVjdDtcblxuICBwcml2YXRlIF9tYXg6IG51bWJlciA9IEluZmluaXR5O1xuICBwcml2YXRlIF9taW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgcHJpdmF0ZSBfdmFsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfc3RlcDogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlOiBudW1iZXI7XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3JlYWRPbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3Nob3dOdW1iZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdXBEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9kb3duRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNVcENsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzRG93bkNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lucHV0TG9jayA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG4gIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBtaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG4gIHNldCBtaW4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodjogbnVtYmVyKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2O1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzdGVwKHZhbHVlKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX2Rvd25EaXNhYmxlZCA9IHZhbHVlO1xuICAgICAgdGhpcy5fdXBEaXNhYmxlZCA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICAgIHRoaXMuY2xzU3RwRGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRPbmx5O1xuICB9XG4gIHNldCByZWFkT25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRPbmx5ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHNob3dOdW1iZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93TnVtYmVyID0gdmFsdWU7XG4gICAgdGhpcy5jbHNTaG93TnVtID0gdmFsdWU7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tc3RlcHBlcicpXG4gIGNsc1N0ZXBwZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXN0ZXBwZXItZGlzYWJsZWQnKVxuICBjbHNTdHBEaXNhYmxlZDogYm9vbGVhbiA9IHRoaXMuX2Rpc2FibGVkO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNob3dOdW1iZXInKVxuICBjbHNTaG93TnVtOiBib29sZWFuID0gdGhpcy5fc2hvd051bWJlcjtcbiAgcHJpdmF0ZSBvbkNoYW5nZUZuOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIG9uVG91Y2hGbjogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgb25JbmNyZWFzZSgpIHtcbiAgICBpZiAoIXRoaXMuX3VwRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5wbHVzKHRoaXMuX3ZhbHVlLCB0aGlzLl9zdGVwKTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlRm4odGhpcy5fdmFsdWUpO1xuICAgICAgaWYgKHRoaXMucGx1cyh0aGlzLl92YWx1ZSwgdGhpcy5fc3RlcCkgPiB0aGlzLl9tYXgpIHtcbiAgICAgICAgdGhpcy5fdXBEaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5taW51cyh0aGlzLl92YWx1ZSwgdGhpcy5fc3RlcCkgPj0gdGhpcy5fbWluKSB7XG4gICAgICAgIHRoaXMuX2Rvd25EaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5faXNVcENsaWNrID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5faXNVcENsaWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIG9uRGVjcmVhc2UoKSB7XG4gICAgaWYgKCF0aGlzLl9kb3duRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5taW51cyh0aGlzLl92YWx1ZSwgdGhpcy5fc3RlcCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5vbkNoYW5nZUZuKHRoaXMuX3ZhbHVlKTtcbiAgICAgIGlmICh0aGlzLm1pbnVzKHRoaXMuX3ZhbHVlLCB0aGlzLl9zdGVwKSA8IHRoaXMuX21pbikge1xuICAgICAgICB0aGlzLl9kb3duRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGx1cyh0aGlzLl92YWx1ZSwgdGhpcy5fc3RlcCkgPD0gdGhpcy5fbWF4KSB7XG4gICAgICAgIHRoaXMuX3VwRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzRG93bkNsaWNrID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5faXNEb3duQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRDbHMoKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9zaXRpb25TdGFydCgpIHtcbiAgICB0aGlzLl9pbnB1dExvY2sgPSB0cnVlO1xuICB9XG5cbiAgY29tcG9zaXRpb25FbmQoKSB7XG4gICAgdGhpcy5faW5wdXRMb2NrID0gZmFsc2U7XG4gIH1cblxuICBpbnB1dENoYW5nZShldmVudCkge1xuICAgIC8vICdjb21wb3NpdGlvbmVuZCcgaXMgZWFybGllciB0aGFuIG5nTW9kZWxDaGFuZ2UsIFRoZXJlZm9yZSB1c2UgdGltZXIgdG8gbWFrZSBuZ01vZGVsQ2hhbmdlIHJ1bnMgYWZ0ZXIgJ2NvbXBvc2l0aW9uZW5kJyBldmVudFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lucHV0TG9jaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsbG93RGVjaW1hbCA9IHRoaXMuX3N0ZXAgJSAxICE9PSAwO1xuICAgICAgY29uc3QgYWxsb3dOZWdhdGl2ZSA9IHRoaXMuX21pbiA8IDA7XG4gICAgICBsZXQgZGVjaW1hbEZsYWcgPSBmYWxzZTtcbiAgICAgIGxldCBuZWdhdGl2ZUZsYWcgPSBmYWxzZTtcbiAgICAgIGlmICghZXZlbnQpIGV2ZW50ID0gJyc7XG4gICAgICBsZXQgdmFsdWUgPSBldmVudC50b1N0cmluZygpLnJlcGxhY2UoL1xcRC9nLCAobWF0Y2gsIGluZGV4LCBzdHIpID0+IHtcbiAgICAgICAgaWYgKGFsbG93RGVjaW1hbCAmJiBtYXRjaCA9PT0gJy4nICYmICFkZWNpbWFsRmxhZykge1xuICAgICAgICAgIGRlY2ltYWxGbGFnID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gJy4nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxvd05lZ2F0aXZlICYmIG1hdGNoID09PSAnLScgJiYgIW5lZ2F0aXZlRmxhZykge1xuICAgICAgICAgIG5lZ2F0aXZlRmxhZyA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuICctJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9KTtcbiAgICAgIGlmIChuZWdhdGl2ZUZsYWcgJiYgdmFsdWUuaW5kZXhPZignLScpID4gMCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLy0vZywgJycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9ICt2YWx1ZTtcbiAgICAgICAgdGhpcy5fdXBEaXNhYmxlZCA9IHRoaXMucGx1cyh0aGlzLl92YWx1ZSwgdGhpcy5fc3RlcCkgPiB0aGlzLl9tYXggPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIHRoaXMuX2Rvd25EaXNhYmxlZCA9IHRoaXMubWludXModGhpcy5fdmFsdWUsIHRoaXMuX3N0ZXApIDwgdGhpcy5fbWluID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldENscygpO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMub25DaGFuZ2VGbih0aGlzLl92YWx1ZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBpbnB1dEJsdXIoKSB7XG4gICAgbGV0IHZhbHVlID0gK3RoaXMuX3ZhbHVlO1xuICAgIGlmICgrdGhpcy5fdmFsdWUgPT09IC0wKSB7XG4gICAgICB2YWx1ZSA9IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLl92YWx1ZSA8IHRoaXMuX21pbikge1xuICAgICAgdmFsdWUgPSB0aGlzLl9taW47XG4gICAgfSBlbHNlIGlmICh0aGlzLl92YWx1ZSA+IHRoaXMuX21heCkge1xuICAgICAgdmFsdWUgPSB0aGlzLl9tYXg7XG4gICAgfVxuXG4gICAgY29uc3QgbGVuID0gdGhpcy5fc3RlcC50b1N0cmluZygpLmxlbmd0aCAtIHRoaXMuX3N0ZXAudG9TdHJpbmcoKS5pbmRleE9mKCcuJykgLSAxO1xuICAgIHZhbHVlID0gK3ZhbHVlLnRvRml4ZWQobGVuKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5vbkNoYW5nZUZuKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBzZXRDbHMoKSB7XG4gICAgdGhpcy51cERpc2FibGVDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWhhbmRsZXItdXAtZGlzYWJsZWRgXTogdGhpcy5fdXBEaXNhYmxlZCxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30taGFuZGxlci1hY3RpdmVgXTogdGhpcy5faXNVcENsaWNrXG4gICAgfTtcbiAgICB0aGlzLmRvd25EaXNhYmxlQ2xzID0ge1xuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1oYW5kbGVyLWRvd24tZGlzYWJsZWRgXTogdGhpcy5fZG93bkRpc2FibGVkLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1oYW5kbGVyLWFjdGl2ZWBdOiB0aGlzLl9pc0Rvd25DbGlja1xuICAgIH07XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAodGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuX2Rvd25EaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLl91cERpc2FibGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdXBEaXNhYmxlZCA9IHRoaXMucGx1cyh0aGlzLl92YWx1ZSwgdGhpcy5fc3RlcCkgPiB0aGlzLl9tYXggPyB0cnVlIDogZmFsc2U7XG4gICAgICB0aGlzLl9kb3duRGlzYWJsZWQgPSB0aGlzLm1pbnVzKHRoaXMuX3ZhbHVlLCB0aGlzLl9zdGVwKSA8IHRoaXMuX21pbiA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5uZ09uQ2hhbmdlcygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaEZuID0gZm47XG4gIH1cblxuICBwbHVzKG51bTE6IG51bWJlciwgbnVtMjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAobnVtMSA9PT0gdW5kZWZpbmVkIHx8IG51bTEgPT09IG51bGwgfHwgbnVtMiA9PT0gdW5kZWZpbmVkIHx8IG51bTIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYmFzZU51bSA9IE1hdGgucG93KDEwLCBNYXRoLm1heCh0aGlzLmRpZ2l0TGVuZ3RoKG51bTEpLCB0aGlzLmRpZ2l0TGVuZ3RoKG51bTIpKSk7XG4gICAgcmV0dXJuICh0aGlzLnRpbWVzKG51bTEsIGJhc2VOdW0pICsgdGhpcy50aW1lcyhudW0yLCBiYXNlTnVtKSkgLyBiYXNlTnVtO1xuICB9XG5cbiAgbWludXMobnVtMTogbnVtYmVyLCBudW0yOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmIChudW0xID09PSB1bmRlZmluZWQgfHwgbnVtMSA9PT0gbnVsbCB8fCBudW0yID09PSB1bmRlZmluZWQgfHwgbnVtMiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBiYXNlTnVtID0gTWF0aC5wb3coMTAsIE1hdGgubWF4KHRoaXMuZGlnaXRMZW5ndGgobnVtMSksIHRoaXMuZGlnaXRMZW5ndGgobnVtMikpKTtcbiAgICByZXR1cm4gKHRoaXMudGltZXMobnVtMSwgYmFzZU51bSkgLSB0aGlzLnRpbWVzKG51bTIsIGJhc2VOdW0pKSAvIGJhc2VOdW07XG4gIH1cblxuICBkaWdpdExlbmd0aChudW06IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgZVNwbGl0ID0gbnVtLnRvU3RyaW5nKCkuc3BsaXQoL1tlRV0vKTtcbiAgICBjb25zdCBsZW4gPSAoZVNwbGl0WzBdLnNwbGl0KCcuJylbMV0gfHwgJycpLmxlbmd0aCAtICsoZVNwbGl0WzFdIHx8IDApO1xuICAgIHJldHVybiBsZW4gPiAwID8gbGVuIDogMDtcbiAgfVxuXG4gIHRpbWVzKG51bTE6IG51bWJlciwgbnVtMjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBudW0xQ2hhbmdlZCA9IHRoaXMuZmxvYXRUb0ZpeGVkKG51bTEpO1xuICAgIGNvbnN0IG51bTJDaGFuZ2VkID0gdGhpcy5mbG9hdFRvRml4ZWQobnVtMik7XG4gICAgY29uc3QgYmFzZU51bSA9IHRoaXMuZGlnaXRMZW5ndGgobnVtMSkgKyB0aGlzLmRpZ2l0TGVuZ3RoKG51bTIpO1xuICAgIGNvbnN0IGxlZnRWYWx1ZSA9IG51bTFDaGFuZ2VkICogbnVtMkNoYW5nZWQ7XG4gICAgcmV0dXJuIGxlZnRWYWx1ZSAvIE1hdGgucG93KDEwLCBiYXNlTnVtKTtcbiAgfVxuXG4gIGZsb2F0VG9GaXhlZChudW06IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKG51bS50b1N0cmluZygpLmluZGV4T2YoJ2UnKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBOdW1iZXIobnVtLnRvU3RyaW5nKCkucmVwbGFjZSgnLicsICcnKSk7XG4gICAgfVxuICAgIGNvbnN0IGRMZW4gPSB0aGlzLmRpZ2l0TGVuZ3RoKG51bSk7XG4gICAgcmV0dXJuIGRMZW4gPiAwID8gdGhpcy5zdHJpcChudW0gKiBNYXRoLnBvdygxMCwgZExlbikpIDogbnVtO1xuICB9XG5cbiAgc3RyaXAobnVtOiBudW1iZXIsIHByZWNpc2lvbiA9IDEyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gK3BhcnNlRmxvYXQobnVtLnRvUHJlY2lzaW9uKHByZWNpc2lvbikpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LWhhbmRsZXItd3JhcFwiPlxuICA8c3BhblxuICAgIHJvbGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LWhhbmRsZXIge3sgcHJlZml4Q2xzIH19LWhhbmRsZXItdXBcIlxuICAgIHN0eWxlPVwibGluZS1oZWlnaHQ6MjhweDtcIlxuICAgIFtuZ0NsYXNzXT1cInVwRGlzYWJsZUNsc1wiXG4gICAgKGNsaWNrKT1cIm9uSW5jcmVhc2UoKVwiXG4gID5cbiAgICA8SWNvbiBbdHlwZV09XCIncGx1cydcIiBbc2l6ZV09XCIneHhzJ1wiPiA8L0ljb24+XG4gIDwvc3Bhbj5cbiAgPHNwYW5cbiAgICByb2xlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cInt7IHByZWZpeENscyB9fS1oYW5kbGVyIHt7IHByZWZpeENscyB9fS1oYW5kbGVyLWRvd25cIlxuICAgIHN0eWxlPVwibGluZS1oZWlnaHQ6MjhweDtcIlxuICAgIFtuZ0NsYXNzXT1cImRvd25EaXNhYmxlQ2xzXCJcbiAgICAoY2xpY2spPVwib25EZWNyZWFzZSgpXCJcbiAgPlxuICAgIDxJY29uIFt0eXBlXT1cIidtaW51cydcIiBbc2l6ZV09XCIneHhzJ1wiPiA8L0ljb24+XG4gIDwvc3Bhbj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInt7IHByZWZpeENscyB9fS1pbnB1dC13cmFwXCI+XG4gIDxpbnB1dFxuICAgIHR5cGU9XCJudW1iZXJcIlxuICAgIHBhdHRlcm49XCJcXC0/XFxkKyhcXC5cXGQrKT9cIlxuICAgIHN0eWxlPVwib3V0bGluZTpub25lXCJcbiAgICBjbGFzcz1cInt7IHByZWZpeENscyB9fS1pbnB1dFwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZE9ubHlcIlxuICAgIFthdXRvY29tcGxldGVdPVwiJ29mZidcIlxuICAgIFttYXhdPVwibWF4XCJcbiAgICBbbWluXT1cIm1pblwiXG4gICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwiaW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGNvbXBvc2l0aW9uc3RhcnQpPVwiY29tcG9zaXRpb25TdGFydCgpXCJcbiAgICAoY29tcG9zaXRpb25lbmQpPVwiY29tcG9zaXRpb25FbmQoKVwiXG4gICAgKGJsdXIpPVwiaW5wdXRCbHVyKClcIlxuICAvPlxuPC9kaXY+XG4iXX0=