UNPKG

ng-zorro-antd-mobile

Version:

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

459 lines 32.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, Input, Output, EventEmitter, HostListener, ViewEncapsulation } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; export class SliderHandleComponent { /** * @param {?} _elf * @param {?} _sanitizer */ constructor(_elf, _sanitizer) { this._elf = _elf; this._sanitizer = _sanitizer; this._disabled = false; this._marks = {}; this._isDraging = false; this.onChange = new EventEmitter(); this.onAfterChange = new EventEmitter(); this.mouseDown = (/** * @param {?} event * @return {?} */ event => { if (!this._disabled && this.isMouseTarget(event)) { this._startX = event.clientX; this._handleStatus = 'start'; this._isDraging = true; document.addEventListener('mousemove', this.mouseMove, false); document.addEventListener('mouseup', this.mouseUp, false); this.pauseEvent(event); } }); this.mouseMove = (/** * @param {?} event * @return {?} */ event => { if (!this._disabled && this._isDraging) { this.pauseEvent(event); /** @type {?} */ const pos = event.clientX; this._value = Math.round(this.calcValueByPos(pos)); this.left = this.calcOffset(this._value); if (this._oldValue !== this._value) { this._oldValue = this._value; this.onChange.emit(this._value); } } }); this.mouseUp = (/** * @param {?} event * @return {?} */ event => { if (!this._disabled && this._isDraging) { this._handleStatus = 'end'; this._isDraging = false; /** @type {?} */ const pos = event.clientX; this._value = Math.round(this.calcValueByPos(pos)); this.left = this.calcOffset(this._value); this.onAfterChange.emit(this._value); } }); } /** * @param {?} value * @return {?} */ set min(value) { this._min = value; } /** * @param {?} value * @return {?} */ set max(value) { this._max = value; } /** * @param {?} value * @return {?} */ set minBound(value) { this._minBound = value; } /** * @param {?} value * @return {?} */ set maxBound(value) { this._maxBound = value; } /** * @param {?} value * @return {?} */ set step(value) { this._step = value; } /** * @param {?} value * @return {?} */ set value(value) { this._value = value; if (this._value) { this.left = this.calcOffset(this._value); } } /** * @param {?} value * @return {?} */ set disabled(value) { this._disabled = value; } /** * @param {?} value * @return {?} */ set sliderLength(value) { this._sliderLength = value; } /** * @param {?} value * @return {?} */ set sliderStart(value) { this._sliderStart = value; } /** * @return {?} */ get handleStyle() { return this._handleStyle; } /** * @param {?} value * @return {?} */ set handleStyle(value) { this._handleStyle = value; } /* 手势操作 */ /** * @param {?} event * @return {?} */ panstart(event) { // event.preventDefault(); if (!this._disabled) { this._startX = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientX; this._handleStatus = 'start'; this._isDraging = true; } } /** * @param {?} event * @return {?} */ panmove(event) { event.preventDefault(); if (!this._disabled && this._isDraging) { /** @type {?} */ const pos = event.changedTouches[0].clientX; this._value = Math.round(this.calcValueByPos(pos)); this.left = this.calcOffset(this._value); if (this._oldValue !== this._value) { this._oldValue = this._value; this.onChange.emit(this._value); } } } /** * @param {?} event * @return {?} */ panend(event) { event.preventDefault(); if (!this._disabled && this._isDraging) { this._handleStatus = 'end'; this._isDraging = false; /** @type {?} */ const pos = event.changedTouches[0].clientX; this._value = Math.round(this.calcValueByPos(pos)); this.left = this.calcOffset(this._value); this.onAfterChange.emit(this._value); } } /** * @param {?} pos * @return {?} */ calcValueByPos(pos) { /** @type {?} */ const offset = pos - this._sliderStart; /** @type {?} */ let value = this.calcValue(offset); if (value <= this._minBound) { value = this._minBound; } if (value >= this._maxBound) { value = this._maxBound; } /** @type {?} */ const closestPoint = this.getClosestPoint(value); return this._step === null ? closestPoint : parseFloat(closestPoint.toFixed(this.getPrecision(this._step))); } /** * @param {?} offset * @return {?} */ calcValue(offset) { /** @type {?} */ const ratio = Math.abs(Math.max(offset, 0) / this._sliderLength); /** @type {?} */ const value = ratio * (this._max - this._min) + this._min; return value; } /** * @param {?} val * @return {?} */ getClosestPoint(val) { /** @type {?} */ const points = Object.keys(this._marks).map(parseFloat); if (this._step !== null) { /** @type {?} */ const closestStep = Math.round((val - this._min) / this._step) * this._step + this._min; points.push(closestStep); } /** @type {?} */ const diffs = points.map((/** * @param {?} point * @return {?} */ function (point) { return Math.abs(val - point); })); return points[diffs.indexOf(Math.min.apply(Math, this.toConsumableArray(diffs)))]; } /** * @param {?} step * @return {?} */ getPrecision(step) { /** @type {?} */ const stepString = step.toString(); /** @type {?} */ let precision = 0; if (stepString.indexOf('.') >= 0) { precision = stepString.length - stepString.indexOf('.') - 1; } return precision; } /** * @param {?} value * @return {?} */ calcOffset(value) { /** @type {?} */ const ratio = (value - this._min) / (this._max - this._min); return ratio * 100; } /** * @param {?} e * @return {?} */ pauseEvent(e) { e.stopPropagation(); e.preventDefault(); } /** * @param {?} event * @return {?} */ isMouseTarget(event) { /** @type {?} */ let target = event.target; /** @type {?} */ let parentFound = false; while (target !== null && !parentFound) { if (target === this._elf.nativeElement) { parentFound = true; } target = target.parentElement; } return parentFound; } /** * @param {?} arr * @return {?} */ toConsumableArray(arr) { if (Array.isArray(arr)) { /** @type {?} */ const arr2 = Array(arr.length); for (let i = 0; i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } /** * @return {?} */ ngOnInit() { /** @type {?} */ const self = this; this._elf.nativeElement.addEventListener('mousedown', this.mouseDown, false); this._handleOffsetX = this._elf.nativeElement.getBoundingClientRect().x; this.left = this.calcOffset(this._value); this._minBound = this._minBound === undefined ? this._min : this._minBound; this._maxBound = this._maxBound === undefined ? this._max : this._maxBound; } /** * @return {?} */ ngOnDestroy() { document.removeEventListener('mousemove', this.mouseMove, false); document.removeEventListener('mouseup', this.mouseUp, false); } } SliderHandleComponent.decorators = [ { type: Component, args: [{ selector: 'SliderHandle, nzm-slider-handle', template: "<div role=\"slider\" class=\"am-slider-handle\" [ngStyle]=\"handleStyle\" [style.left.%]=\"left\"></div>\n", encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ SliderHandleComponent.ctorParameters = () => [ { type: ElementRef }, { type: DomSanitizer } ]; SliderHandleComponent.propDecorators = { min: [{ type: Input }], max: [{ type: Input }], minBound: [{ type: Input }], maxBound: [{ type: Input }], step: [{ type: Input }], value: [{ type: Input }], disabled: [{ type: Input }], sliderLength: [{ type: Input }], sliderStart: [{ type: Input }], handleStyle: [{ type: Input }], onChange: [{ type: Output }], onAfterChange: [{ type: Output }], panstart: [{ type: HostListener, args: ['touchstart', ['$event'],] }], panmove: [{ type: HostListener, args: ['touchmove', ['$event'],] }], panend: [{ type: HostListener, args: ['touchend', ['$event'],] }] }; if (false) { /** @type {?} */ SliderHandleComponent.prototype.left; /** * @type {?} * @private */ SliderHandleComponent.prototype._min; /** * @type {?} * @private */ SliderHandleComponent.prototype._max; /** * @type {?} * @private */ SliderHandleComponent.prototype._step; /** * @type {?} * @private */ SliderHandleComponent.prototype._value; /** * @type {?} * @private */ SliderHandleComponent.prototype._disabled; /** * @type {?} * @private */ SliderHandleComponent.prototype._marks; /** * @type {?} * @private */ SliderHandleComponent.prototype._handleStyle; /** * @type {?} * @private */ SliderHandleComponent.prototype._sliderLength; /** * @type {?} * @private */ SliderHandleComponent.prototype._sliderStart; /** * @type {?} * @private */ SliderHandleComponent.prototype._minBound; /** * @type {?} * @private */ SliderHandleComponent.prototype._maxBound; /** * @type {?} * @private */ SliderHandleComponent.prototype._startX; /** * @type {?} * @private */ SliderHandleComponent.prototype._isDraging; /** * @type {?} * @private */ SliderHandleComponent.prototype._handleStatus; /** * @type {?} * @private */ SliderHandleComponent.prototype._handleOffsetX; /** * @type {?} * @private */ SliderHandleComponent.prototype._oldValue; /** @type {?} */ SliderHandleComponent.prototype.onChange; /** @type {?} */ SliderHandleComponent.prototype.onAfterChange; /** @type {?} */ SliderHandleComponent.prototype.mouseDown; /** @type {?} */ SliderHandleComponent.prototype.mouseMove; /** @type {?} */ SliderHandleComponent.prototype.mouseUp; /** * @type {?} * @private */ SliderHandleComponent.prototype._elf; /** * @type {?} * @private */ SliderHandleComponent.prototype._sanitizer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWhhbmRsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInNsaWRlci9zbGlkZXItaGFuZGxlL3NsaWRlci1oYW5kbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBRVosaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU96RCxNQUFNLE9BQU8scUJBQXFCOzs7OztJQTRHaEMsWUFBb0IsSUFBZ0IsRUFBVSxVQUF3QjtRQUFsRCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQXJHOUQsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixXQUFNLEdBQVcsRUFBRSxDQUFDO1FBT3BCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFvRHBDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRW5DLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQXlDeEMsY0FBUzs7OztRQUFHLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzlELFFBQVEs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aW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1NsaWRlckhhbmRsZSwgbnptLXNsaWRlci1oYW5kbGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2xpZGVyLWhhbmRsZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVySGFuZGxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBsZWZ0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfbWluOiBudW1iZXI7XG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBwcml2YXRlIF9zdGVwOiBudW1iZXI7XG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXI7XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX21hcmtzOiBvYmplY3QgPSB7fTtcbiAgcHJpdmF0ZSBfaGFuZGxlU3R5bGU6IG9iamVjdDtcbiAgcHJpdmF0ZSBfc2xpZGVyTGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgX3NsaWRlclN0YXJ0OiBudW1iZXI7XG4gIHByaXZhdGUgX21pbkJvdW5kOiBudW1iZXI7XG4gIHByaXZhdGUgX21heEJvdW5kOiBudW1iZXI7XG4gIHByaXZhdGUgX3N0YXJ0WDogbnVtYmVyO1xuICBwcml2YXRlIF9pc0RyYWdpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaGFuZGxlU3RhdHVzOiBzdHJpbmc7XG4gIHByaXZhdGUgX2hhbmRsZU9mZnNldFg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfb2xkVmFsdWU6IG51bWJlcjtcblxuICBASW5wdXQoKVxuICBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWluQm91bmQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbkJvdW5kID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG1heEJvdW5kKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhCb3VuZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2xpZGVyTGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zbGlkZXJMZW5ndGggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2xpZGVyU3RhcnQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NsaWRlclN0YXJ0ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGhhbmRsZVN0eWxlKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZVN0eWxlO1xuICB9XG4gIHNldCBoYW5kbGVTdHlsZSh2YWx1ZTogb2JqZWN0KSB7XG4gICAgdGhpcy5faGFuZGxlU3R5bGUgPSB2YWx1ZTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQWZ0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKiDmiYvlir/mk43kvZwgKi9cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gIHBhbnN0YXJ0KGV2ZW50KSB7XG4gICAgLy8gZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICB0aGlzLl9zdGFydFggPSBldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ3N0YXJ0JztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgcGFubW92ZShldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIGNvbnN0IHBvcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB0aGlzLl92YWx1ZSA9IE1hdGgucm91bmQodGhpcy5jYWxjVmFsdWVCeVBvcyhwb3MpKTtcbiAgICAgIHRoaXMubGVmdCA9IHRoaXMuY2FsY09mZnNldCh0aGlzLl92YWx1ZSk7XG4gICAgICBpZiAodGhpcy5fb2xkVmFsdWUgIT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICAgIHRoaXMuX29sZFZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgcGFuZW5kKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmIHRoaXMuX2lzRHJhZ2luZykge1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ2VuZCc7XG4gICAgICB0aGlzLl9pc0RyYWdpbmcgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHBvcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB0aGlzLl92YWx1ZSA9IE1hdGgucm91bmQodGhpcy5jYWxjVmFsdWVCeVBvcyhwb3MpKTtcbiAgICAgIHRoaXMubGVmdCA9IHRoaXMuY2FsY09mZnNldCh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLm9uQWZ0ZXJDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBtb3VzZURvd24gPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLmlzTW91c2VUYXJnZXQoZXZlbnQpKSB7XG4gICAgICB0aGlzLl9zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ3N0YXJ0JztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IHRydWU7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuICAgICAgdGhpcy5wYXVzZUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBtb3VzZU1vdmUgPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIHRoaXMucGF1c2VFdmVudChldmVudCk7XG4gICAgICBjb25zdCBwb3MgPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5fdmFsdWUgPSBNYXRoLnJvdW5kKHRoaXMuY2FsY1ZhbHVlQnlQb3MocG9zKSk7XG4gICAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgICAgaWYgKHRoaXMuX29sZFZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgICB0aGlzLl9vbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG1vdXNlVXAgPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVN0YXR1cyA9ICdlbmQnO1xuICAgICAgdGhpcy5faXNEcmFnaW5nID0gZmFsc2U7XG4gICAgICBjb25zdCBwb3MgPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5fdmFsdWUgPSBNYXRoLnJvdW5kKHRoaXMuY2FsY1ZhbHVlQnlQb3MocG9zKSk7XG4gICAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5vbkFmdGVyQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGNWYWx1ZUJ5UG9zKHBvcykge1xuICAgIGNvbnN0IG9mZnNldCA9IHBvcyAtIHRoaXMuX3NsaWRlclN0YXJ0O1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuY2FsY1ZhbHVlKG9mZnNldCk7XG4gICAgaWYgKHZhbHVlIDw9IHRoaXMuX21pbkJvdW5kKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuX21pbkJvdW5kO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPj0gdGhpcy5fbWF4Qm91bmQpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5fbWF4Qm91bmQ7XG4gICAgfVxuICAgIGNvbnN0IGNsb3Nlc3RQb2ludCA9IHRoaXMuZ2V0Q2xvc2VzdFBvaW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5fc3RlcCA9PT0gbnVsbCA/IGNsb3Nlc3RQb2ludCA6IHBhcnNlRmxvYXQoY2xvc2VzdFBvaW50LnRvRml4ZWQodGhpcy5nZXRQcmVjaXNpb24odGhpcy5fc3RlcCkpKTtcbiAgfVxuXG4gIGNhbGNWYWx1ZShvZmZzZXQpIHtcbiAgICBjb25zdCByYXRpbyA9IE1hdGguYWJzKE1hdGgubWF4KG9mZnNldCwgMCkgLyB0aGlzLl9zbGlkZXJMZW5ndGgpO1xuICAgIGNvbnN0IHZhbHVlID0gcmF0aW8gKiAodGhpcy5fbWF4IC0gdGhpcy5fbWluKSArIHRoaXMuX21pbjtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBnZXRDbG9zZXN0UG9pbnQodmFsKSB7XG4gICAgY29uc3QgcG9pbnRzID0gT2JqZWN0LmtleXModGhpcy5fbWFya3MpLm1hcChwYXJzZUZsb2F0KTtcbiAgICBpZiAodGhpcy5fc3RlcCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY2xvc2VzdFN0ZXAgPSBNYXRoLnJvdW5kKCh2YWwgLSB0aGlzLl9taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwICsgdGhpcy5fbWluO1xuICAgICAgcG9pbnRzLnB1c2goY2xvc2VzdFN0ZXApO1xuICAgIH1cbiAgICBjb25zdCBkaWZmcyA9IHBvaW50cy5tYXAoZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh2YWwgLSBwb2ludCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBvaW50c1tkaWZmcy5pbmRleE9mKE1hdGgubWluLmFwcGx5KE1hdGgsIHRoaXMudG9Db25zdW1hYmxlQXJyYXkoZGlmZnMpKSldO1xuICB9XG5cbiAgZ2V0UHJlY2lzaW9uKHN0ZXApIHtcbiAgICBjb25zdCBzdGVwU3RyaW5nID0gc3RlcC50b1N0cmluZygpO1xuICAgIGxldCBwcmVjaXNpb24gPSAwO1xuICAgIGlmIChzdGVwU3RyaW5nLmluZGV4T2YoJy4nKSA+PSAwKSB7XG4gICAgICBwcmVjaXNpb24gPSBzdGVwU3RyaW5nLmxlbmd0aCAtIHN0ZXBTdHJpbmcuaW5kZXhPZignLicpIC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHByZWNpc2lvbjtcbiAgfVxuXG4gIGNhbGNPZmZzZXQodmFsdWUpIHtcbiAgICBjb25zdCByYXRpbyA9ICh2YWx1ZSAtIHRoaXMuX21pbikgLyAodGhpcy5fbWF4IC0gdGhpcy5fbWluKTtcbiAgICByZXR1cm4gcmF0aW8gKiAxMDA7XG4gIH1cblxuICBwYXVzZUV2ZW50KGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIGlzTW91c2VUYXJnZXQoZXZlbnQpIHtcbiAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGxldCBwYXJlbnRGb3VuZCA9IGZhbHNlO1xuICAgIHdoaWxlICh0YXJnZXQgIT09IG51bGwgJiYgIXBhcmVudEZvdW5kKSB7XG4gICAgICBpZiAodGFyZ2V0ID09PSB0aGlzLl9lbGYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBwYXJlbnRGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudEZvdW5kO1xuICB9XG5cbiAgdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgICAgY29uc3QgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyMltpXSA9IGFycltpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnIyO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubW91c2VEb3duLCBmYWxzZSk7XG4gICAgdGhpcy5faGFuZGxlT2Zmc2V0WCA9IHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLng7XG4gICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLl9taW5Cb3VuZCA9IHRoaXMuX21pbkJvdW5kID09PSB1bmRlZmluZWQgPyB0aGlzLl9taW4gOiB0aGlzLl9taW5Cb3VuZDtcbiAgICB0aGlzLl9tYXhCb3VuZCA9IHRoaXMuX21heEJvdW5kID09PSB1bmRlZmluZWQgPyB0aGlzLl9tYXggOiB0aGlzLl9tYXhCb3VuZDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuICB9XG59XG4iXX0=