UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

565 lines 36.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, ElementRef, HostBinding, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; export class RangeComponent { /** * @param {?} _elf */ constructor(_elf) { this._elf = _elf; this.prefixCls = 'am-slider'; this.offset = []; this.length = []; this._min = 0; this._max = 100; this._step = 1; this._defaultValue = [0, 0, 0]; this._disabled = false; this._marks = {}; this._dots = false; this._included = true; this._count = 1; this._allowCross = true; this._handleStyle = []; this._trackStyle = []; this.onChange = new EventEmitter(); this.onAfterChange = new EventEmitter(); this.amWrapper = true; this._ngModelOnChange = (/** * @return {?} */ () => { }); this._ngModelOnTouched = (/** * @return {?} */ () => { }); } /** * @return {?} */ get min() { return this._min; } /** * @param {?} value * @return {?} */ set min(value) { this._min = value; } /** * @return {?} */ get max() { return this._max; } /** * @param {?} value * @return {?} */ set max(value) { this._max = value; } /** * @return {?} */ get step() { return this._step; } /** * @param {?} value * @return {?} */ set step(value) { this._step = value; } /** * @return {?} */ get value() { return this._value; } /** * @param {?} value * @return {?} */ set value(value) { this.setValue(value); } /** * @param {?} value * @return {?} */ set defaultValue(value) { this._defaultValue = value; this._value = this._defaultValue; this.setValue(value); } /** * @return {?} */ get disabled() { return this._disabled; } /** * @param {?} value * @return {?} */ set disabled(value) { this._disabled = value; } /** * @return {?} */ get marks() { return this._marks; } /** * @param {?} value * @return {?} */ set marks(value) { this._marks = value; } /** * @return {?} */ get dots() { return this._dots; } /** * @param {?} value * @return {?} */ set dots(value) { this._dots = value; } /** * @return {?} */ get included() { return this._included; } /** * @param {?} value * @return {?} */ set included(value) { this._included = value; } /** * @param {?} value * @return {?} */ set count(value) { this._count = value; } /** * @param {?} value * @return {?} */ set allowCross(value) { this._allowCross = value; this.setValueBound(); } /** * @param {?} value * @return {?} */ set pushable(value) { this._pushable = value; if (this.verifyPushable()) { this.setValueBound(); } } /** * @return {?} */ get handleStyle() { return this._handleStyle; } /** * @param {?} value * @return {?} */ set handleStyle(value) { this._handleStyle = value; } /** * @return {?} */ get trackStyle() { return this._trackStyle; } /** * @param {?} value * @return {?} */ set trackStyle(value) { this._trackStyle = value; } /** * @return {?} */ get railStyle() { return this._railStyle; } /** * @param {?} value * @return {?} */ set railStyle(value) { this._railStyle = value; } /** * @return {?} */ setCls() { this.sliderCls = { [`${this.prefixCls}-disabled`]: this._disabled }; } /** * @return {?} */ initialValue() { /** @type {?} */ const minTemp = this._min; if (!this.verifyPushable()) { this._pushable = 0; console.log('pushable设置无效,已大于有些value间隔,被强制设为0'); } /** @type {?} */ const initialValue = Array.apply(null, Array(this._count + 1)).map((/** * @return {?} */ function () { return minTemp; })); this._defaultValue = this._defaultValue !== undefined ? this._defaultValue : initialValue; this._value = this._value !== undefined ? this._value : this._defaultValue; // 验证count值 this._count = this._value.length - 1; // 验证value区间 for (let i = 0; i < this._value.length; i++) { if (this._value[i] < this._min) { this._value[i] = this._min; } else if (this._value[i] > this._max) { this._value[i] = this._max; } } if (this._count > 0) { this.upperBound = Math.max(...this._value); this.lowerBound = Math.min(...this._value); } } /** * @param {?} e * @param {?} i * @return {?} */ handleChange(e, i) { /** @type {?} */ let temp = [...this._value]; temp[i] = e; this.upperBound = Math.max(...temp); this.lowerBound = Math.min(...temp); this.setTrackStyle(temp); this.onChange.emit(temp); } /** * @param {?} e * @param {?} i * @return {?} */ handleAfterChange(e, i) { setTimeout((/** * @return {?} */ () => { this._value[i] = e; this.upperBound = Math.max(...this._value); this.lowerBound = Math.min(...this._value); this.setTrackStyle(this._value); this.onAfterChange.emit(this._value); this._ngModelOnChange(this._value); this.setValueBound(); }), 0); } /** * @param {?} value * @return {?} */ setTrackStyle(value) { if (value && value.length === this._count + 1) { value.sort((/** * @param {?} a * @param {?} b * @return {?} */ (a, b) => a - b)); for (let i = 0; i < this._count; i++) { this.offset[i] = (value[i] * 100) / (this._max - this._min); this.length[i] = ((value[i + 1] - value[i]) * 100) / (this._max - this._min); } } } /** * @return {?} */ setValueBound() { this.maxBound = []; this.minBound = []; if ((this._allowCross && this._pushable === undefined) || this._handleCount <= 1) { for (let i = 0; i < this._handleCount; i++) { this.maxBound[i] = this._max; this.minBound[i] = this._min; } } else { if (this._pushable === undefined) { this._pushable = 0; } for (let i = 0; i < this._handleCount; i++) { this.maxBound[i] = i === this._handleCount - 1 ? this._max : this._value[i + 1] - this._pushable; this.minBound[i] = i === 0 ? this._min : this._value[i - 1] + this._pushable; } } } /** * @return {?} */ verifyPushable() { for (let i = 1; i < this._handleCount; i++) { /** @type {?} */ const diff = this._value[i] - this._value[i - 1]; if (diff < this._pushable) { return false; } } return true; } /** * @param {?} value * @return {?} */ writeValue(value) { this.setValue(value, true); } /** * @param {?} value * @param {?=} isWriteValue * @return {?} */ setValue(value, isWriteValue = false) { if (value) { this._value = value; this._handleCount = this._value.length + 1; this.initialValue(); this.setValueBound(); this.setCls(); this.setTrackStyle(this._value); if (isWriteValue) { this._ngModelOnChange(this._value); } else { this.onAfterChange.emit(this._value); } } } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this._ngModelOnChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this._ngModelOnTouched = fn; } /** * @return {?} */ ngOnInit() { this.initialValue(); this.setValueBound(); this._handleCount = this._count + 1; this.setCls(); /** @type {?} */ const sliderCoords = this._elf.nativeElement.getElementsByClassName('am-slider')[0].getBoundingClientRect(); this.sliderLength = sliderCoords.width; this.sliderStart = sliderCoords.left; } } RangeComponent.decorators = [ { type: Component, args: [{ selector: 'Range , nzm-range', template: "<div class=\"am-slider\" [ngClass]=\"sliderCls\">\n <div class=\"am-slider-rail\" [ngStyle]=\"railStyle\"></div>\n <SliderTrack\n *ngFor=\"let off of offset; let i = index\"\n [className]=\"'am-slider-track'\"\n [included]=\"included\"\n [style]=\"trackStyle[i]\"\n [offset]=\"off\"\n [length]=\"length[i]\"\n ></SliderTrack>\n <SliderSteps\n [max]=\"max\"\n [min]=\"min\"\n [dots]=\"dots\"\n [step]=\"step\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderSteps>\n <SliderHandle\n *ngFor=\"let val of value; let i = index\"\n [max]=\"max\"\n [min]=\"min\"\n [maxBound]=\"maxBound[i]\"\n [minBound]=\"minBound[i]\"\n [value]=\"val\"\n [step]=\"step\"\n [disabled]=\"disabled\"\n [sliderLength]=\"sliderLength\"\n [sliderStart]=\"sliderStart\"\n [handleStyle]=\"handleStyle[i]\"\n (onChange)=\"handleChange($event, i)\"\n (onAfterChange)=\"handleAfterChange($event, i)\"\n ></SliderHandle>\n <SliderMarks\n [max]=\"max\"\n [min]=\"min\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderMarks>\n</div>\n", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => RangeComponent)), multi: true } ] }] } ]; /** @nocollapse */ RangeComponent.ctorParameters = () => [ { type: ElementRef } ]; RangeComponent.propDecorators = { min: [{ type: Input }], max: [{ type: Input }], step: [{ type: Input }], value: [{ type: Input }], defaultValue: [{ type: Input }], disabled: [{ type: Input }], marks: [{ type: Input }], dots: [{ type: Input }], included: [{ type: Input }], count: [{ type: Input }], allowCross: [{ type: Input }], pushable: [{ type: Input }], handleStyle: [{ type: Input }], trackStyle: [{ type: Input }], railStyle: [{ type: Input }], onChange: [{ type: Output }], onAfterChange: [{ type: Output }], amWrapper: [{ type: HostBinding, args: ['class.am-slider-wrapper',] }] }; if (false) { /** @type {?} */ RangeComponent.prototype.prefixCls; /** @type {?} */ RangeComponent.prototype.offset; /** @type {?} */ RangeComponent.prototype.length; /** @type {?} */ RangeComponent.prototype.upperBound; /** @type {?} */ RangeComponent.prototype.lowerBound; /** @type {?} */ RangeComponent.prototype.maxBound; /** @type {?} */ RangeComponent.prototype.minBound; /** @type {?} */ RangeComponent.prototype.sliderCls; /** @type {?} */ RangeComponent.prototype.sliderLength; /** @type {?} */ RangeComponent.prototype.sliderStart; /** * @type {?} * @private */ RangeComponent.prototype._min; /** * @type {?} * @private */ RangeComponent.prototype._max; /** * @type {?} * @private */ RangeComponent.prototype._step; /** * @type {?} * @private */ RangeComponent.prototype._value; /** * @type {?} * @private */ RangeComponent.prototype._defaultValue; /** * @type {?} * @private */ RangeComponent.prototype._disabled; /** * @type {?} * @private */ RangeComponent.prototype._marks; /** * @type {?} * @private */ RangeComponent.prototype._dots; /** * @type {?} * @private */ RangeComponent.prototype._included; /** * @type {?} * @private */ RangeComponent.prototype._count; /** * @type {?} * @private */ RangeComponent.prototype._allowCross; /** * @type {?} * @private */ RangeComponent.prototype._pushable; /** * @type {?} * @private */ RangeComponent.prototype._handleStyle; /** * @type {?} * @private */ RangeComponent.prototype._trackStyle; /** * @type {?} * @private */ RangeComponent.prototype._railStyle; /** * @type {?} * @private */ RangeComponent.prototype._handleCount; /** @type {?} */ RangeComponent.prototype.onChange; /** @type {?} */ RangeComponent.prototype.onAfterChange; /** @type {?} */ RangeComponent.prototype.amWrapper; /** * @type {?} * @private */ RangeComponent.prototype._ngModelOnChange; /** * @type {?} * @private */ RangeComponent.prototype._ngModelOnTouched; /** * @type {?} * @private */ RangeComponent.prototype._elf; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvIiwic291cmNlcyI6WyJyYW5nZS9yYW5nZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBYXpFLE1BQU0sT0FBTyxjQUFjOzs7O0lBMkl6QixZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBMUlwQyxjQUFTLEdBQVcsV0FBVyxDQUFDO1FBQ2hDLFdBQU0sR0FBVSxFQUFFLENBQUM7UUFDbkIsV0FBTSxHQUFVLEVBQUUsQ0FBQztRQVNYLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxTQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ1gsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUVWLGtCQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQXdHekIsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFbkMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBR3hDLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFFbEIscUJBQWdCOzs7UUFB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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnUmFuZ2UgLCBuem0tcmFuZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmFuZ2UuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhbmdlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFJhbmdlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXNsaWRlcic7XG4gIG9mZnNldDogYW55W10gPSBbXTtcbiAgbGVuZ3RoOiBhbnlbXSA9IFtdO1xuICB1cHBlckJvdW5kOiBudW1iZXI7XG4gIGxvd2VyQm91bmQ6IG51bWJlcjtcbiAgbWF4Qm91bmQ6IG51bWJlcltdO1xuICBtaW5Cb3VuZDogbnVtYmVyW107XG4gIHNsaWRlckNsczogb2JqZWN0O1xuICBzbGlkZXJMZW5ndGg6IG51bWJlcjtcbiAgc2xpZGVyU3RhcnQ6IG51bWJlcjtcblxuICBwcml2YXRlIF9taW4gPSAwO1xuICBwcml2YXRlIF9tYXggPSAxMDA7XG4gIHByaXZhdGUgX3N0ZXAgPSAxO1xuICBwcml2YXRlIF92YWx1ZTtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlID0gWzAsIDAsIDBdO1xuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9tYXJrcyA9IHt9O1xuICBwcml2YXRlIF9kb3RzID0gZmFsc2U7XG4gIHByaXZhdGUgX2luY2x1ZGVkID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfY291bnQgPSAxO1xuICBwcml2YXRlIF9hbGxvd0Nyb3NzID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfcHVzaGFibGU7XG4gIHByaXZhdGUgX2hhbmRsZVN0eWxlID0gW107XG4gIHByaXZhdGUgX3RyYWNrU3R5bGUgPSBbXTtcbiAgcHJpdmF0ZSBfcmFpbFN0eWxlO1xuICBwcml2YXRlIF9oYW5kbGVDb3VudDtcblxuICBASW5wdXQoKVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuICBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuICBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc3RlcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdGVwO1xuICB9XG4gIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IFtudW1iZXJdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlOiBbbnVtYmVyXSkge1xuICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWUpIHtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG1hcmtzKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMuX21hcmtzO1xuICB9XG4gIHNldCBtYXJrcyh2YWx1ZTogb2JqZWN0KSB7XG4gICAgdGhpcy5fbWFya3MgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZG90cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZG90cztcbiAgfVxuICBzZXQgZG90cyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2RvdHMgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgaW5jbHVkZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkO1xuICB9XG4gIHNldCBpbmNsdWRlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2luY2x1ZGVkID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGNvdW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9jb3VudCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBhbGxvd0Nyb3NzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fYWxsb3dDcm9zcyA9IHZhbHVlO1xuICAgIHRoaXMuc2V0VmFsdWVCb3VuZCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBwdXNoYWJsZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fcHVzaGFibGUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy52ZXJpZnlQdXNoYWJsZSgpKSB7XG4gICAgICB0aGlzLnNldFZhbHVlQm91bmQoKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGhhbmRsZVN0eWxlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlU3R5bGU7XG4gIH1cbiAgc2V0IGhhbmRsZVN0eWxlKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMuX2hhbmRsZVN0eWxlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHRyYWNrU3R5bGUoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl90cmFja1N0eWxlO1xuICB9XG4gIHNldCB0cmFja1N0eWxlKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMuX3RyYWNrU3R5bGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcmFpbFN0eWxlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5fcmFpbFN0eWxlO1xuICB9XG4gIHNldCByYWlsU3R5bGUodmFsdWU6IGFueVtdKSB7XG4gICAgdGhpcy5fcmFpbFN0eWxlID0gdmFsdWU7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkFmdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1zbGlkZXItd3JhcHBlcicpXG4gIGFtV3JhcHBlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfbmdNb2RlbE9uQ2hhbmdlOiAodmFsdWU6IG51bWJlcltdKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgX25nTW9kZWxPblRvdWNoZWQ6ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxmOiBFbGVtZW50UmVmKSB7fVxuXG4gIHNldENscygpIHtcbiAgICB0aGlzLnNsaWRlckNscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tZGlzYWJsZWRgXTogdGhpcy5fZGlzYWJsZWRcbiAgICB9O1xuICB9XG5cbiAgaW5pdGlhbFZhbHVlKCkge1xuICAgIGNvbnN0IG1pblRlbXAgPSB0aGlzLl9taW47XG4gICAgaWYgKCF0aGlzLnZlcmlmeVB1c2hhYmxlKCkpIHtcbiAgICAgIHRoaXMuX3B1c2hhYmxlID0gMDtcbiAgICAgIGNvbnNvbGUubG9nKCdwdXNoYWJsZeiuvue9ruaXoOaViO+8jOW3suWkp+S6juacieS6m3ZhbHVl6Ze06ZqU77yM6KKr5by65Yi26K6+5Li6MCcpO1xuICAgIH1cbiAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBBcnJheS5hcHBseShudWxsLCBBcnJheSh0aGlzLl9jb3VudCArIDEpKS5tYXAoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbWluVGVtcDtcbiAgICB9KTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCA/IHRoaXMuX2RlZmF1bHRWYWx1ZSA6IGluaXRpYWxWYWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX3ZhbHVlICE9PSB1bmRlZmluZWQgPyB0aGlzLl92YWx1ZSA6IHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICAvLyDpqozor4Fjb3VudOWAvFxuICAgIHRoaXMuX2NvdW50ID0gdGhpcy5fdmFsdWUubGVuZ3RoIC0gMTtcbiAgICAvLyDpqozor4F2YWx1ZeWMuumXtFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLl92YWx1ZVtpXSA8IHRoaXMuX21pbikge1xuICAgICAgICB0aGlzLl92YWx1ZVtpXSA9IHRoaXMuX21pbjtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdmFsdWVbaV0gPiB0aGlzLl9tYXgpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVbaV0gPSB0aGlzLl9tYXg7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb3VudCA+IDApIHtcbiAgICAgIHRoaXMudXBwZXJCb3VuZCA9IE1hdGgubWF4KC4uLnRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMubG93ZXJCb3VuZCA9IE1hdGgubWluKC4uLnRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVDaGFuZ2UoZSwgaSkge1xuICAgIGxldCB0ZW1wID0gWy4uLnRoaXMuX3ZhbHVlXTtcbiAgICB0ZW1wW2ldID0gZTtcbiAgICB0aGlzLnVwcGVyQm91bmQgPSBNYXRoLm1heCguLi50ZW1wKTtcbiAgICB0aGlzLmxvd2VyQm91bmQgPSBNYXRoLm1pbiguLi50ZW1wKTtcbiAgICB0aGlzLnNldFRyYWNrU3R5bGUodGVtcCk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRlbXApO1xuICB9XG5cbiAgaGFuZGxlQWZ0ZXJDaGFuZ2UoZSwgaSkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fdmFsdWVbaV0gPSBlO1xuICAgICAgdGhpcy51cHBlckJvdW5kID0gTWF0aC5tYXgoLi4udGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5sb3dlckJvdW5kID0gTWF0aC5taW4oLi4udGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5zZXRUcmFja1N0eWxlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMub25BZnRlckNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLnNldFZhbHVlQm91bmQoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHNldFRyYWNrU3R5bGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID09PSB0aGlzLl9jb3VudCArIDEpIHtcbiAgICAgIHZhbHVlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY291bnQ7IGkrKykge1xuICAgICAgICB0aGlzLm9mZnNldFtpXSA9ICh2YWx1ZVtpXSAqIDEwMCkgLyAodGhpcy5fbWF4IC0gdGhpcy5fbWluKTtcbiAgICAgICAgdGhpcy5sZW5ndGhbaV0gPSAoKHZhbHVlW2kgKyAxXSAtIHZhbHVlW2ldKSAqIDEwMCkgLyAodGhpcy5fbWF4IC0gdGhpcy5fbWluKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRWYWx1ZUJvdW5kKCkge1xuICAgIHRoaXMubWF4Qm91bmQgPSBbXTtcbiAgICB0aGlzLm1pbkJvdW5kID0gW107XG4gICAgaWYgKCh0aGlzLl9hbGxvd0Nyb3NzICYmIHRoaXMuX3B1c2hhYmxlID09PSB1bmRlZmluZWQpIHx8IHRoaXMuX2hhbmRsZUNvdW50IDw9IDEpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faGFuZGxlQ291bnQ7IGkrKykge1xuICAgICAgICB0aGlzLm1heEJvdW5kW2ldID0gdGhpcy5fbWF4O1xuICAgICAgICB0aGlzLm1pbkJvdW5kW2ldID0gdGhpcy5fbWluO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fcHVzaGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9wdXNoYWJsZSA9IDA7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2hhbmRsZUNvdW50OyBpKyspIHtcbiAgICAgICAgdGhpcy5tYXhCb3VuZFtpXSA9IGkgPT09IHRoaXMuX2hhbmRsZUNvdW50IC0gMSA/IHRoaXMuX21heCA6IHRoaXMuX3ZhbHVlW2kgKyAxXSAtIHRoaXMuX3B1c2hhYmxlO1xuICAgICAgICB0aGlzLm1pbkJvdW5kW2ldID0gaSA9PT0gMCA/IHRoaXMuX21pbiA6IHRoaXMuX3ZhbHVlW2kgLSAxXSArIHRoaXMuX3B1c2hhYmxlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZlcmlmeVB1c2hhYmxlKCkge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5faGFuZGxlQ291bnQ7IGkrKykge1xuICAgICAgY29uc3QgZGlmZiA9IHRoaXMuX3ZhbHVlW2ldIC0gdGhpcy5fdmFsdWVbaSAtIDFdO1xuICAgICAgaWYgKGRpZmYgPCB0aGlzLl9wdXNoYWJsZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlLCB0cnVlKTtcbiAgfVxuXG4gIHNldFZhbHVlKHZhbHVlOiBudW1iZXJbXSwgaXNXcml0ZVZhbHVlID0gZmFsc2UpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLl9oYW5kbGVDb3VudCA9IHRoaXMuX3ZhbHVlLmxlbmd0aCArIDE7XG4gICAgICB0aGlzLmluaXRpYWxWYWx1ZSgpO1xuICAgICAgdGhpcy5zZXRWYWx1ZUJvdW5kKCk7XG4gICAgICB0aGlzLnNldENscygpO1xuICAgICAgdGhpcy5zZXRUcmFja1N0eWxlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIGlmIChpc1dyaXRlVmFsdWUpIHtcbiAgICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BZnRlckNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IG51bWJlcltdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9uZ01vZGVsT25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXRpYWxWYWx1ZSgpO1xuICAgIHRoaXMuc2V0VmFsdWVCb3VuZCgpO1xuICAgIHRoaXMuX2hhbmRsZUNvdW50ID0gdGhpcy5fY291bnQgKyAxO1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgY29uc3Qgc2xpZGVyQ29vcmRzID0gdGhpcy5fZWxmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYW0tc2xpZGVyJylbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5zbGlkZXJMZW5ndGggPSBzbGlkZXJDb29yZHMud2lkdGg7XG4gICAgdGhpcy5zbGlkZXJTdGFydCA9IHNsaWRlckNvb3Jkcy5sZWZ0O1xuICB9XG59XG4iXX0=