UNPKG

ng-spin-box

Version:

<h2>Spinbox Directive for Angular.</h2>

298 lines 38.9 kB
import * as tslib_1 from "tslib"; import { Directive, ElementRef, Input, HostListener, Renderer2, Output, EventEmitter } from '@angular/core'; var SpinBoxDirective = /** @class */ (function () { function SpinBoxDirective(el, renderer) { this.el = el; this.renderer = renderer; this._hasFocus = false; this.valueToBeSet = 0; this.changeByMouse = new EventEmitter(); this._initView(); } Object.defineProperty(SpinBoxDirective.prototype, "_isDisabled", { get: function () { return this.el.nativeElement.disabled; }, enumerable: true, configurable: true }); SpinBoxDirective.prototype._initView = function () { var _this = this; var node = this.el.nativeElement; var parent = node.parentNode; // Create Wrapper Element var wrapper = this.renderer.createElement('div'); this.renderer.addClass(wrapper, 'ng-spin-box-wrapper'); this.renderer.setAttribute(wrapper, 'style', "\n position: relative;\n display: inline-block;\n "); // Wrap Input in our Custom Wrapper this.renderer.appendChild(wrapper, node); this.renderer.appendChild(parent, wrapper); // Add Up/Down Buttons for UserInteraction var buttonUp = this.renderer.createElement('button'); this.renderer.appendChild(wrapper, buttonUp); this.renderer.addClass(buttonUp, 'ng-spin-box-btn-up'); this.renderer.listen(buttonUp, 'click', function (e) { _this._clickSpinBoxButton(e, true); }); this.renderer.setAttribute(buttonUp, 'tabIndex', '-1'); this.renderer.setAttribute(buttonUp, 'style', "\n position: absolute;\n top: 0;\n right: 0;\n height: 50%;\n "); // Add Up/Down Buttons for UserInteraction var buttonDown = this.renderer.createElement('button'); this.renderer.appendChild(wrapper, buttonDown); this.renderer.addClass(buttonDown, 'ng-spin-box-btn-down'); this.renderer.listen(buttonDown, 'click', function (e) { _this._clickSpinBoxButton(e, false); }); this.renderer.setAttribute(buttonDown, 'tabIndex', '-1'); this.renderer.setAttribute(buttonDown, 'style', "\n position: absolute;\n bottom: 0;\n right: 0;\n height: 50%;\n "); }; SpinBoxDirective.prototype._clickSpinBoxButton = function (event, shouldInrease) { event.preventDefault(); event.stopPropagation(); if (!this._isDisabled) { this.el.nativeElement.focus(); this._increaseDecreaseValue(shouldInrease); } }; /** * Increase Decrease Value of SpinBox * @param shouldInrease If true, increase the Value, * Else Decrease the Value. */ SpinBoxDirective.prototype._increaseDecreaseValue = function (shouldInrease) { var valueStr = this.el.nativeElement.value; var value = +(valueStr || 0); var precision = +(this.decimal || 0); /** * Add Decimal logic */ var multiplier = Math.pow(10, (precision + 2)); var decimalValue = value * multiplier; decimalValue = +decimalValue.toFixed(precision + 2); var step = (+this.step) || 1; // Get Cursor Position var cursorPosition = this.el.nativeElement.selectionStart; var decimalPosition = valueStr.indexOf(this._getDecimalSeparator); var cursorFactor = (cursorPosition - decimalPosition); // Convert String type values to boolean, to stop the need of Data Binding var shouldSnapToStep = typeof this.snapToStep === 'string' ? JSON.parse(this.snapToStep) : this.snapToStep; if (shouldInrease) { if (this.stepAtCursor && (cursorPosition <= valueStr.length - 2)) { var stepMultiplier = Math.pow(10, (precision + 2) - cursorFactor); decimalValue += (1 * stepMultiplier); } else { if (shouldSnapToStep) { var decimalVal = Math.round((decimalValue) / (step * multiplier)) * (step * multiplier); if (decimalVal > (decimalValue)) { decimalVal -= (step * multiplier); } decimalValue = (decimalVal) + (step * multiplier); } else { decimalValue += (step * multiplier); } } } else { // if (this.stepAtCursor && (cursorPosition > decimalPosition && cursorPosition <= valueStr.length - 2)) { if (this.stepAtCursor && (cursorPosition <= valueStr.length - 2)) { var stepMultiplier = Math.pow(10, (precision + 2) - cursorFactor); decimalValue -= (1 * stepMultiplier); } else { if (shouldSnapToStep) { var decimalVal = Math.round((decimalValue) / (step * multiplier)) * (step * multiplier); if (decimalVal < (decimalValue)) { decimalVal += (step * multiplier); } decimalValue = (decimalVal) - (step * multiplier); } else { decimalValue -= (step * multiplier); } } } var finalValue = (decimalValue / multiplier).toFixed(precision); // If input value is entered out of bounds, then upon scrolling it, it jumps to a value within bounds. if ((+finalValue) >= (+this.min || -Infinity) && (+finalValue) <= (+this.max || Infinity)) { this.valueToBeSet = +finalValue; } else if ((+finalValue) < (+this.min || -Infinity)) { this.valueToBeSet = this.min; } else if ((+finalValue) > (+this.max || Infinity)) { this.valueToBeSet = this.max; } if (this.changeByMouse) { this.changeByMouse.emit(finalValue); } // Value to be set needs to be string var valueToBeSetStr = (+this.valueToBeSet).toFixed(precision); this.renderer.setProperty(this.el.nativeElement, 'value', valueToBeSetStr); // Trigger Input Event var event; try { event = new Event('input', { bubbles: true, cancelable: false }); } catch (e) { event = document.createEvent('Event'); event.initEvent('input', true, false); } // dispatch the event this.el.nativeElement.dispatchEvent(event); if (valueStr.indexOf(this._getDecimalSeparator) !== -1) { this.el.nativeElement.selectionStart = cursorPosition; this.el.nativeElement.selectionEnd = cursorPosition; } }; SpinBoxDirective.prototype.onFocus = function () { this._hasFocus = true; }; SpinBoxDirective.prototype.onBlur = function () { var setLimitOnBlur = typeof this.setLimitOnBlur === 'string' ? JSON.parse(this.setLimitOnBlur) : this.setLimitOnBlur; if (setLimitOnBlur) { this._hasFocus = false; // On blur, if the entered values is out of bounds, it should jump within bounds var value = +(this.el.nativeElement.value || 0); var shouldInrease = false; if (value > this.max) { this._increaseDecreaseValue(shouldInrease); } else if (value < this.min) { shouldInrease = true; this._increaseDecreaseValue(shouldInrease); } } }; SpinBoxDirective.prototype.onMouseWheel = function (event) { event.preventDefault(); if (!this._hasFocus || this._isDisabled) { return; } (event.deltaY > 0) ? this._increaseDecreaseValue(false) : this._increaseDecreaseValue(true); }; SpinBoxDirective.prototype.onKeydown = function (event) { var key = event.key; var cursorPosition = this.el.nativeElement.selectionStart; // console.log('The Event triggered', key, event); if (key === 'ArrowUp' || key === 'Up') { if (event.shiftKey) { return; } else { this._increaseDecreaseValue(true); } } else if (key === 'ArrowDown' || key === 'Down') { if (event.shiftKey) { return; } else { this._increaseDecreaseValue(false); } } // Allow special key presses if (event.ctrlKey || event.metaKey || key === 'ArrowLeft' || key === 'ArrowRight' || key === 'Backspace' || key === 'Delete' || key === 'Tab' || key === 'Left' || key === 'Right') { return; } // Allow a minus sign if the value can be negative if (key === '-' && cursorPosition === 0 && (this.min && this.min < 0)) { return; } // Allow Entry with valid Precision if (this._checkPrecision(key)) { return; } // Allow digits // if ((/[0-9]/g).test(key)) { // return; // } // Prevent the default action event.preventDefault(); }; Object.defineProperty(SpinBoxDirective.prototype, "_getDecimalSeparator", { get: function () { var number = 1.1; return number.toLocaleString().substring(1, 2); }, enumerable: true, configurable: true }); SpinBoxDirective.prototype._checkPrecision = function (key) { var decimal = (+this.decimal) || 0; var refElement = this.el.nativeElement; var value = refElement.value.substr(0, refElement.selectionStart) + key + refElement.value.substr(refElement.selectionEnd); var regexString = '^\\d+\\' + this._getDecimalSeparator + '?\\d{0,' + decimal + '}$'; return new RegExp(regexString, 'g').test(value); }; SpinBoxDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: Renderer2 } ]; }; tslib_1.__decorate([ Input('min'), tslib_1.__metadata("design:type", Number) ], SpinBoxDirective.prototype, "min", void 0); tslib_1.__decorate([ Input('max'), tslib_1.__metadata("design:type", Number) ], SpinBoxDirective.prototype, "max", void 0); tslib_1.__decorate([ Input('step'), tslib_1.__metadata("design:type", Number) ], SpinBoxDirective.prototype, "step", void 0); tslib_1.__decorate([ Input('decimal'), tslib_1.__metadata("design:type", Number) ], SpinBoxDirective.prototype, "decimal", void 0); tslib_1.__decorate([ Input('snapToStep'), tslib_1.__metadata("design:type", Boolean) ], SpinBoxDirective.prototype, "snapToStep", void 0); tslib_1.__decorate([ Input('stepAtCursor'), tslib_1.__metadata("design:type", Boolean) ], SpinBoxDirective.prototype, "stepAtCursor", void 0); tslib_1.__decorate([ Input('setLimitOnBlur'), tslib_1.__metadata("design:type", Boolean) ], SpinBoxDirective.prototype, "setLimitOnBlur", void 0); tslib_1.__decorate([ Output('changeByMouse'), tslib_1.__metadata("design:type", EventEmitter) ], SpinBoxDirective.prototype, "changeByMouse", void 0); tslib_1.__decorate([ HostListener('focus'), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", []), tslib_1.__metadata("design:returntype", void 0) ], SpinBoxDirective.prototype, "onFocus", null); tslib_1.__decorate([ HostListener('blur'), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", []), tslib_1.__metadata("design:returntype", void 0) ], SpinBoxDirective.prototype, "onBlur", null); tslib_1.__decorate([ HostListener('wheel', ['$event']), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [WheelEvent]), tslib_1.__metadata("design:returntype", void 0) ], SpinBoxDirective.prototype, "onMouseWheel", null); tslib_1.__decorate([ HostListener('keydown', ['$event']), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [KeyboardEvent]), tslib_1.__metadata("design:returntype", void 0) ], SpinBoxDirective.prototype, "onKeydown", null); SpinBoxDirective = tslib_1.__decorate([ Directive({ // tslint:disable-next-line selector: '[ngSpinBox]' }), tslib_1.__metadata("design:paramtypes", [ElementRef, Renderer2]) ], SpinBoxDirective); return SpinBoxDirective; }()); export { SpinBoxDirective }; // this.renderer.setElementProperty(this.el.nativeElement, 'value', validString); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbi1ib3guZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctc3Bpbi1ib3gvIiwic291cmNlcyI6WyJzcmMvYXBwL25nLXNwaW4tYm94L3NwaW4tYm94LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU81RztJQWVFLDBCQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFMdkQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUVRLGtCQUFhLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHaEYsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxzQkFBSSx5Q0FBVzthQUFmO1lBQ0UsTUFBTSxDQUFvQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWMsQ0FBQyxRQUFRLENBQUM7UUFDNUQsQ0FBQzs7O09BQUE7SUFFTyxvQ0FBUyxHQUFqQjtRQUFBLGlCQXdDQztRQXZDQyxJQUFNLElBQUksR0FBcUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDckQsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMvQix5QkFBeUI7UUFDekIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxpRUFHNUMsQ0FB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bVE3QixpRkFBaUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBIb3N0TGlzdGVuZXIsIFJlbmRlcmVyMiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gIHNlbGVjdG9yOiAnW25nU3BpbkJveF0nXG59KVxuZXhwb3J0IGNsYXNzIFNwaW5Cb3hEaXJlY3RpdmUge1xuXG4gIEBJbnB1dCgnbWluJykgbWluOiBudW1iZXI7XG4gIEBJbnB1dCgnbWF4JykgbWF4OiBudW1iZXI7XG4gIEBJbnB1dCgnc3RlcCcpIHN0ZXA6IG51bWJlcjtcbiAgQElucHV0KCdkZWNpbWFsJykgZGVjaW1hbDogbnVtYmVyO1xuICBASW5wdXQoJ3NuYXBUb1N0ZXAnKSBzbmFwVG9TdGVwOiBib29sZWFuO1xuICBASW5wdXQoJ3N0ZXBBdEN1cnNvcicpIHN0ZXBBdEN1cnNvcjogYm9vbGVhbjtcbiAgQElucHV0KCdzZXRMaW1pdE9uQmx1cicpIHNldExpbWl0T25CbHVyOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2hhc0ZvY3VzID0gZmFsc2U7XG4gIHZhbHVlVG9CZVNldCA9IDA7XG5cbiAgQE91dHB1dCgnY2hhbmdlQnlNb3VzZScpIGNoYW5nZUJ5TW91c2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHRoaXMuX2luaXRWaWV3KCk7XG4gIH1cblxuICBnZXQgX2lzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICg8SFRNTElucHV0RWxlbWVudD50aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLmRpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFZpZXcoKSB7XG4gICAgY29uc3Qgbm9kZSA9IDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgLy8gQ3JlYXRlIFdyYXBwZXIgRWxlbWVudFxuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3Mod3JhcHBlciwgJ25nLXNwaW4tYm94LXdyYXBwZXInKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh3cmFwcGVyLCAnc3R5bGUnLCBgXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgYCk7XG5cbiAgICAvLyBXcmFwIElucHV0IGluIG91ciBDdXN0b20gV3JhcHBlclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQod3JhcHBlciwgbm9kZSk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnQsIHdyYXBwZXIpO1xuXG4gICAgLy8gQWRkIFVwL0Rvd24gQnV0dG9ucyBmb3IgVXNlckludGVyYWN0aW9uXG4gICAgY29uc3QgYnV0dG9uVXAgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQod3JhcHBlciwgYnV0dG9uVXApO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnV0dG9uVXAsICduZy1zcGluLWJveC1idG4tdXAnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihidXR0b25VcCwgJ2NsaWNrJywgKGU6IEV2ZW50KSA9PiB7IHRoaXMuX2NsaWNrU3BpbkJveEJ1dHRvbihlLCB0cnVlKTsgfSk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnV0dG9uVXAsICd0YWJJbmRleCcsICctMScpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGJ1dHRvblVwLCAnc3R5bGUnLCBgXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIGhlaWdodDogNTAlO1xuICAgIGApO1xuXG4gICAgLy8gQWRkIFVwL0Rvd24gQnV0dG9ucyBmb3IgVXNlckludGVyYWN0aW9uXG4gICAgY29uc3QgYnV0dG9uRG93biA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh3cmFwcGVyLCBidXR0b25Eb3duKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbkRvd24sICduZy1zcGluLWJveC1idG4tZG93bicpO1xuICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKGJ1dHRvbkRvd24sICdjbGljaycsIChlOiBFdmVudCkgPT4geyB0aGlzLl9jbGlja1NwaW5Cb3hCdXR0b24oZSwgZmFsc2UpOyB9KTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShidXR0b25Eb3duLCAndGFiSW5kZXgnLCAnLTEnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShidXR0b25Eb3duLCAnc3R5bGUnLCBgXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBib3R0b206IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIGhlaWdodDogNTAlO1xuICAgIGApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xpY2tTcGluQm94QnV0dG9uKGV2ZW50OiBFdmVudCwgc2hvdWxkSW5yZWFzZTogYm9vbGVhbikge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLl9pc0Rpc2FibGVkKSB7XG4gICAgICAoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5lbC5uYXRpdmVFbGVtZW50KS5mb2N1cygpO1xuICAgICAgdGhpcy5faW5jcmVhc2VEZWNyZWFzZVZhbHVlKHNob3VsZElucmVhc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZWFzZSBEZWNyZWFzZSBWYWx1ZSBvZiBTcGluQm94XG4gICAqIEBwYXJhbSBzaG91bGRJbnJlYXNlIElmIHRydWUsIGluY3JlYXNlIHRoZSBWYWx1ZSxcbiAgICogRWxzZSBEZWNyZWFzZSB0aGUgVmFsdWUuXG4gICAqL1xuICBwcml2YXRlIF9pbmNyZWFzZURlY3JlYXNlVmFsdWUoc2hvdWxkSW5yZWFzZTogYm9vbGVhbikge1xuICAgIGNvbnN0IHZhbHVlU3RyID0gKDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuZWwubmF0aXZlRWxlbWVudCkudmFsdWU7XG4gICAgY29uc3QgdmFsdWU6IG51bWJlciB8IHN0cmluZyA9ICsodmFsdWVTdHIgfHwgMCk7XG5cbiAgICBjb25zdCBwcmVjaXNpb24gPSArKHRoaXMuZGVjaW1hbCB8fCAwKTtcbiAgICAvKipcbiAgICAgKiBBZGQgRGVjaW1hbCBsb2dpY1xuICAgICAqL1xuICAgIGNvbnN0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgKHByZWNpc2lvbiArIDIpKTtcbiAgICBsZXQgZGVjaW1hbFZhbHVlID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgIGRlY2ltYWxWYWx1ZSA9ICtkZWNpbWFsVmFsdWUudG9GaXhlZChwcmVjaXNpb24gKyAyKTtcblxuICAgIGNvbnN0IHN0ZXAgPSAoK3RoaXMuc3RlcCkgfHwgMTtcblxuICAgIC8vIEdldCBDdXJzb3IgUG9zaXRpb25cbiAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9ICg8SFRNTElucHV0RWxlbWVudD50aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdGlvblN0YXJ0O1xuICAgIGNvbnN0IGRlY2ltYWxQb3NpdGlvbiA9IHZhbHVlU3RyLmluZGV4T2YodGhpcy5fZ2V0RGVjaW1hbFNlcGFyYXRvcik7XG4gICAgY29uc3QgY3Vyc29yRmFjdG9yID0gKGN1cnNvclBvc2l0aW9uIC0gZGVjaW1hbFBvc2l0aW9uKTtcblxuICAgIC8vIENvbnZlcnQgU3RyaW5nIHR5cGUgdmFsdWVzIHRvIGJvb2xlYW4sIHRvIHN0b3AgdGhlIG5lZWQgb2YgRGF0YSBCaW5kaW5nXG4gICAgY29uc3Qgc2hvdWxkU25hcFRvU3RlcCA9IHR5cGVvZiB0aGlzLnNuYXBUb1N0ZXAgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZSh0aGlzLnNuYXBUb1N0ZXApIDogdGhpcy5zbmFwVG9TdGVwO1xuXG4gICAgaWYgKHNob3VsZElucmVhc2UpIHtcbiAgICAgIGlmICh0aGlzLnN0ZXBBdEN1cnNvciAmJiAoY3Vyc29yUG9zaXRpb24gPD0gdmFsdWVTdHIubGVuZ3RoIC0gMikpIHtcbiAgICAgICAgY29uc3Qgc3RlcE11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgKHByZWNpc2lvbiArIDIpIC0gY3Vyc29yRmFjdG9yKTtcbiAgICAgICAgZGVjaW1hbFZhbHVlICs9ICgxICogc3RlcE11bHRpcGxpZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNob3VsZFNuYXBUb1N0ZXApIHtcbiAgICAgICAgICBsZXQgZGVjaW1hbFZhbCA9IE1hdGgucm91bmQoKGRlY2ltYWxWYWx1ZSkgLyAoc3RlcCAqIG11bHRpcGxpZXIpKSAqIChzdGVwICogbXVsdGlwbGllcik7XG4gICAgICAgICAgaWYgKGRlY2ltYWxWYWwgPiAoZGVjaW1hbFZhbHVlKSkge1xuICAgICAgICAgICAgZGVjaW1hbFZhbCAtPSAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWNpbWFsVmFsdWUgPSAoZGVjaW1hbFZhbCkgKyAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlY2ltYWxWYWx1ZSArPSAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmICh0aGlzLnN0ZXBBdEN1cnNvciAmJiAoY3Vyc29yUG9zaXRpb24gPiBkZWNpbWFsUG9zaXRpb24gJiYgY3Vyc29yUG9zaXRpb24gPD0gdmFsdWVTdHIubGVuZ3RoIC0gMikpIHtcbiAgICAgIGlmICh0aGlzLnN0ZXBBdEN1cnNvciAmJiAoY3Vyc29yUG9zaXRpb24gPD0gdmFsdWVTdHIubGVuZ3RoIC0gMikpIHtcbiAgICAgICAgY29uc3Qgc3RlcE11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgKHByZWNpc2lvbiArIDIpIC0gY3Vyc29yRmFjdG9yKTtcbiAgICAgICAgZGVjaW1hbFZhbHVlIC09ICgxICogc3RlcE11bHRpcGxpZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNob3VsZFNuYXBUb1N0ZXApIHtcbiAgICAgICAgICBsZXQgZGVjaW1hbFZhbCA9IE1hdGgucm91bmQoKGRlY2ltYWxWYWx1ZSkgLyAoc3RlcCAqIG11bHRpcGxpZXIpKSAqIChzdGVwICogbXVsdGlwbGllcik7XG4gICAgICAgICAgaWYgKGRlY2ltYWxWYWwgPCAoZGVjaW1hbFZhbHVlKSkge1xuICAgICAgICAgICAgZGVjaW1hbFZhbCArPSAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWNpbWFsVmFsdWUgPSAoZGVjaW1hbFZhbCkgLSAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlY2ltYWxWYWx1ZSAtPSAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxWYWx1ZSA9IChkZWNpbWFsVmFsdWUgLyBtdWx0aXBsaWVyKS50b0ZpeGVkKHByZWNpc2lvbik7XG5cbiAgICAvLyBJZiBpbnB1dCB2YWx1ZSBpcyBlbnRlcmVkIG91dCBvZiBib3VuZHMsIHRoZW4gdXBvbiBzY3JvbGxpbmcgaXQsIGl0IGp1bXBzIHRvIGEgdmFsdWUgd2l0aGluIGJvdW5kcy5cbiAgICBpZiAoKCtmaW5hbFZhbHVlKSA+PSAoK3RoaXMubWluIHx8IC1JbmZpbml0eSkgJiYgKCtmaW5hbFZhbHVlKSA8PSAoK3RoaXMubWF4IHx8IEluZmluaXR5KSkge1xuICAgICAgdGhpcy52YWx1ZVRvQmVTZXQgPSArZmluYWxWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKCgrZmluYWxWYWx1ZSkgPCAoK3RoaXMubWluIHx8IC1JbmZpbml0eSkpIHtcbiAgICAgIHRoaXMudmFsdWVUb0JlU2V0ID0gdGhpcy5taW47XG4gICAgfSBlbHNlIGlmICgoK2ZpbmFsVmFsdWUpID4gKCt0aGlzLm1heCB8fCBJbmZpbml0eSkpIHtcbiAgICAgIHRoaXMudmFsdWVUb0JlU2V0ID0gdGhpcy5tYXg7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoYW5nZUJ5TW91c2UpIHtcbiAgICAgIHRoaXMuY2hhbmdlQnlNb3VzZS5lbWl0KGZpbmFsVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFZhbHVlIHRvIGJlIHNldCBuZWVkcyB0byBiZSBzdHJpbmdcbiAgICBjb25zdCB2YWx1ZVRvQmVTZXRTdHIgPSAoK3RoaXMudmFsdWVUb0JlU2V0KS50b0ZpeGVkKHByZWNpc2lvbik7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlVG9CZVNldFN0cik7XG5cbiAgICAvLyBUcmlnZ2VyIElucHV0IEV2ZW50XG4gICAgbGV0IGV2ZW50O1xuICAgIHRyeSB7XG4gICAgICBldmVudCA9IG5ldyBFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IGZhbHNlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICBldmVudC5pbml0RXZlbnQoJ2lucHV0JywgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIGRpc3BhdGNoIHRoZSBldmVudFxuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgIGlmICh2YWx1ZVN0ci5pbmRleE9mKHRoaXMuX2dldERlY2ltYWxTZXBhcmF0b3IpICE9PSAtMSkge1xuICAgICAgKDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuZWwubmF0aXZlRWxlbWVudCkuc2VsZWN0aW9uU3RhcnQgPSBjdXJzb3JQb3NpdGlvbjtcbiAgICAgICg8SFRNTElucHV0RWxlbWVudD50aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdGlvbkVuZCA9IGN1cnNvclBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJykgb25Gb2N1cygpIHtcbiAgICB0aGlzLl9oYXNGb2N1cyA9IHRydWU7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJykgb25CbHVyKCkge1xuICAgIGNvbnN0IHNldExpbWl0T25CbHVyID0gdHlwZW9mIHRoaXMuc2V0TGltaXRPbkJsdXIgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZSh0aGlzLnNldExpbWl0T25CbHVyKSA6IHRoaXMuc2V0TGltaXRPbkJsdXI7XG4gICAgaWYgKHNldExpbWl0T25CbHVyKSB7XG4gICAgICB0aGlzLl9oYXNGb2N1cyA9IGZhbHNlO1xuICAgICAgLy8gT24gYmx1ciwgaWYgdGhlIGVudGVyZWQgdmFsdWVzIGlzIG91dCBvZiBib3VuZHMsIGl0IHNob3VsZCBqdW1wIHdpdGhpbiBib3VuZHNcbiAgICAgIGNvbnN0IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgPSArKCg8SFRNTElucHV0RWxlbWVudD50aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLnZhbHVlIHx8IDApO1xuICAgICAgbGV0IHNob3VsZElucmVhc2UgPSBmYWxzZTtcbiAgICAgIGlmICh2YWx1ZSA+IHRoaXMubWF4KSB7XG4gICAgICAgIHRoaXMuX2luY3JlYXNlRGVjcmVhc2VWYWx1ZShzaG91bGRJbnJlYXNlKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgICBzaG91bGRJbnJlYXNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faW5jcmVhc2VEZWNyZWFzZVZhbHVlKHNob3VsZElucmVhc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3doZWVsJywgWyckZXZlbnQnXSkgb25Nb3VzZVdoZWVsKGV2ZW50OiBXaGVlbEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2hhc0ZvY3VzIHx8IHRoaXMuX2lzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKGV2ZW50LmRlbHRhWSA+IDApID8gdGhpcy5faW5jcmVhc2VEZWNyZWFzZVZhbHVlKGZhbHNlKSA6IHRoaXMuX2luY3JlYXNlRGVjcmVhc2VWYWx1ZSh0cnVlKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKSBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSAoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5lbC5uYXRpdmVFbGVtZW50KS5zZWxlY3Rpb25TdGFydDtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdUaGUgRXZlbnQgdHJpZ2dlcmVkJywga2V5LCBldmVudCk7XG5cbiAgICBpZiAoa2V5ID09PSAnQXJyb3dVcCcgfHwga2V5ID09PSAnVXAnKSB7XG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5jcmVhc2VEZWNyZWFzZVZhbHVlKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnQXJyb3dEb3duJyB8fCBrZXkgPT09ICdEb3duJykge1xuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2luY3JlYXNlRGVjcmVhc2VWYWx1ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgc3BlY2lhbCBrZXkgcHJlc3Nlc1xuICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHxcbiAgICAgIGtleSA9PT0gJ0Fycm93TGVmdCcgfHwga2V5ID09PSAnQXJyb3dSaWdodCcgfHwga2V5ID09PSAnQmFja3NwYWNlJyB8fFxuICAgICAga2V5ID09PSAnRGVsZXRlJyB8fCBrZXkgPT09ICdUYWInIHx8IGtleSA9PT0gJ0xlZnQnIHx8IGtleSA9PT0gJ1JpZ2h0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFsbG93IGEgbWludXMgc2lnbiBpZiB0aGUgdmFsdWUgY2FuIGJlIG5lZ2F0aXZlXG4gICAgaWYgKGtleSA9PT0gJy0nICYmIGN1cnNvclBvc2l0aW9uID09PSAwICYmICh0aGlzLm1pbiAmJiB0aGlzLm1pbiA8IDApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgRW50cnkgd2l0aCB2YWxpZCBQcmVjaXNpb25cbiAgICBpZiAodGhpcy5fY2hlY2tQcmVjaXNpb24oa2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFsbG93IGRpZ2l0c1xuICAgIC8vIGlmICgoL1swLTldL2cpLnRlc3Qoa2V5KSkge1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIC8vIFByZXZlbnQgdGhlIGRlZmF1bHQgYWN0aW9uXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2dldERlY2ltYWxTZXBhcmF0b3IoKSB7XG4gICAgY29uc3QgbnVtYmVyID0gMS4xO1xuICAgIHJldHVybiBudW1iZXIudG9Mb2NhbGVTdHJpbmcoKS5zdWJzdHJpbmcoMSwgMik7XG4gIH1cblxuICBwcml2YXRlIF9jaGVja1ByZWNpc2lvbihrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGRlY2ltYWwgPSAoK3RoaXMuZGVjaW1hbCkgfHwgMDtcbiAgICBjb25zdCByZWZFbGVtZW50ID0gKDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgY29uc3QgdmFsdWUgPSByZWZFbGVtZW50LnZhbHVlLnN1YnN0cigwLCByZWZFbGVtZW50LnNlbGVjdGlvblN0YXJ0KSArIGtleSArIHJlZkVsZW1lbnQudmFsdWUuc3Vic3RyKHJlZkVsZW1lbnQuc2VsZWN0aW9uRW5kKTtcbiAgICBjb25zdCByZWdleFN0cmluZyA9ICdeXFxcXGQrXFxcXCcgKyB0aGlzLl9nZXREZWNpbWFsU2VwYXJhdG9yICsgJz9cXFxcZHswLCcgKyBkZWNpbWFsICsgJ30kJztcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleFN0cmluZywgJ2cnKS50ZXN0KHZhbHVlKTtcbiAgfVxuXG59XG4vLyB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRQcm9wZXJ0eSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbGlkU3RyaW5nKTtcbiJdfQ==