UNPKG

@neocomplexx/ngx-neo-directives

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

275 lines 29.1 kB
/** * @fileoverview added by tsickle * Generated from: lib/neo-decimalNumbers.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, HostListener, Input, ElementRef, Renderer2 } from '@angular/core'; import { NgModel } from '@angular/forms'; export class NeoDecimalNumbersDirective { /** * @param {?} el * @param {?} renderer * @param {?} model */ constructor(el, renderer, model) { this.el = el; this.renderer = renderer; this.model = model; this.decimals = 2; this.allowNullValue = false; this.haveDecimalPoint = false; } /** * @return {?} */ ngOnInit() { if ((/** @type {?} */ (this.decimals)) == "") this.decimals = 2; if ((/** @type {?} */ (this.allowNullValue)) === "") this.allowNullValue = true; this.el.nativeElement.type = "number"; this.regex = new RegExp('^[0-9]+(\\.[0-9]{0,' + this.decimals + '})?$'); } /** * @param {?} e * @return {?} */ blockPaste(e) { /** @type {?} */ const clipboardData = e.clipboardData || window['clipboardData']; /** @type {?} */ let pastedData = clipboardData.getData('text/plain').split(",").join("."); /** @type {?} */ let posPoint = pastedData.lastIndexOf('.'); if (posPoint > -1) { pastedData = pastedData.substring(0, posPoint).split(".").join("") + pastedData.substring(posPoint); posPoint = pastedData.lastIndexOf('.'); if (posPoint + this.decimals < pastedData.length) { pastedData = pastedData.substring(0, posPoint + this.decimals + 1); } } /** @type {?} */ const onlyNumbers = Array.from(pastedData).map((/** * @param {?} x * @return {?} */ x => this.isNumber(x))).reduce((/** * @param {?} prev * @param {?} el * @return {?} */ (prev, el) => prev && el), true); /** @type {?} */ const a = this.regex.test(pastedData); setTimeout((/** * @return {?} */ () => { if (onlyNumbers && a) { this.el.nativeElement.value = pastedData; } else { this.el.nativeElement.value = '0'; } }), 10); } /** * @return {?} */ onfocus() { if (this.el.nativeElement.value == "0") { this.el.nativeElement.value = null; } } /** * @return {?} */ onBlur() { /** @type {?} */ let current = this.el.nativeElement.value; if (current == "") { if (this.allowNullValue) { this.el.nativeElement.value = null; this.model.control.setValue(null); } else { this.el.nativeElement.value = "0"; this.model.control.setValue(0); } } else { this.el.nativeElement.type = "text"; this.el.nativeElement.type = "number"; if (this.el.nativeElement.max && this.el.nativeElement.valueAsNumber > +this.el.nativeElement.max) { this.el.nativeElement.value = this.el.nativeElement.max; this.model.control.setValue(this.el.nativeElement.valueAsNumber); } } } /** * @param {?} event * @return {?} */ onKeyUp(event) { /** @type {?} */ let current = this.el.nativeElement.value; current = current.split("-").join(""); /** @type {?} */ let posPoint = current.indexOf('.'); if (posPoint > -1) { this.el.nativeElement.value = current.substring(0, posPoint + 1) + current.substring(posPoint).split(".").join(""); } if (this.haveDecimalPoint && current == "" && this.prev > "") { this.haveDecimalPoint = false; this.el.nativeElement.value = this.prev + (this.prev.endsWith(".0") ? "" : ".0"); this.el.nativeElement.type = "text"; this.el.nativeElement.selectionStart = this.el.nativeElement.value.length - 1; this.el.nativeElement.selectionEnd = this.el.nativeElement.value.length; this.el.nativeElement.type = "number"; return; } if (this.isSpecial(event) || current == "") { if (event.keyCode == 8 || current != "") { this.prev = current; /** @type {?} */ const dotIndex = current.toString().indexOf('.'); if (dotIndex >= 0) this.haveDecimalPoint = false; } return; } if (!this.isNumber(event)) { event.preventDefault(); event.stopPropagation(); return false; } if (current) { current = current.toString(); /** @type {?} */ const dotIndex = current.indexOf('.'); if ((dotIndex >= 0) && ((current.length - 1) - dotIndex > this.decimals)) { this.renderer.setProperty(this.el.nativeElement, 'value', current.slice(0, dotIndex + this.decimals + 1)); } } else { this.renderer.setProperty(this.el.nativeElement, 'value', this.prev); } } /** * @param {?} event * @return {?} */ onKeyDown(event) { if (this.isSpecial(event)) { return; } if (!this.isNumber(event)) { event.preventDefault(); event.stopPropagation(); return false; } /** @type {?} */ let current = this.el.nativeElement.value; if (this.isDecimalPoint(event)) { this.haveDecimalPoint = true; if (!current.endsWith(".0")) { this.el.nativeElement.value = current + ".0"; this.el.nativeElement.type = "text"; this.el.nativeElement.selectionStart = this.el.nativeElement.value.length - 1; this.el.nativeElement.selectionEnd = this.el.nativeElement.value.length; this.el.nativeElement.type = "number"; } } this.prev = current; } /** * @private * @param {?} e * @return {?} */ isSpecial(e) { return e.key === 'Delete' || (e.key === 'Tab' || e.keyCode == 9) || (e.key === 'Backspace' || e.keyCode == 8) || e.key === 'ArrowLeft' || e.altKey || e.ctrlKey || e.key === 'Home' || e.key === 'End' || e.key === 'PageDown' || e.key === 'PageUp' || e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'ArrowRight' || e.key === 'Control' || e.key === 'Alt' || e.key === 'Shift' || (((/** @type {?} */ (e))).keyIdentifier == 'Down' || ((/** @type {?} */ (e))).keyIdentifier == 'Up'); } /** * @private * @param {?} e * @return {?} */ isNumber(e) { if (e instanceof KeyboardEvent) { return ((e.key >= '0' && e.key <= '9') || ((e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105)) || (e.key === '.' || e.key === ',') || (e.keyCode === 188 || e.keyCode === 190 || e.keyCode === 229)); } else { return ((e >= '0' && e <= '9') || (e === '.' || e === ',')); } } /** * @private * @param {?} e * @return {?} */ isDecimalPoint(e) { return (e.key === '.' || e.key === ',') || (e.keyCode === 188 || e.keyCode === 190 || e.keyCode === 229); } } NeoDecimalNumbersDirective.decorators = [ { type: Directive, args: [{ selector: '[isDecimal]', },] } ]; /** @nocollapse */ NeoDecimalNumbersDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: NgModel } ]; NeoDecimalNumbersDirective.propDecorators = { decimals: [{ type: Input, args: ['isDecimal',] }], allowNullValue: [{ type: Input, args: ['allowNullValue',] }], blockPaste: [{ type: HostListener, args: ['paste', ['$event'],] }], onfocus: [{ type: HostListener, args: ['focus',] }], onBlur: [{ type: HostListener, args: ['blur',] }], onKeyUp: [{ type: HostListener, args: ['keyup', ['$event'],] }], onKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }] }; if (false) { /** @type {?} */ NeoDecimalNumbersDirective.prototype.decimals; /** @type {?} */ NeoDecimalNumbersDirective.prototype.allowNullValue; /** * @type {?} * @private */ NeoDecimalNumbersDirective.prototype.prev; /** * @type {?} * @private */ NeoDecimalNumbersDirective.prototype.regex; /** * @type {?} * @private */ NeoDecimalNumbersDirective.prototype.haveDecimalPoint; /** * @type {?} * @private */ NeoDecimalNumbersDirective.prototype.el; /** * @type {?} * @private */ NeoDecimalNumbersDirective.prototype.renderer; /** * @type {?} * @private */ NeoDecimalNumbersDirective.prototype.model; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVvLWRlY2ltYWxOdW1iZXJzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWRpcmVjdGl2ZXMvIiwic291cmNlcyI6WyJsaWIvbmVvLWRlY2ltYWxOdW1iZXJzLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUt6QyxNQUFNLE9BQU8sMEJBQTBCOzs7Ozs7SUFTbkMsWUFBb0IsRUFBYyxFQUFVLFFBQW1CLEVBQVUsS0FBYztRQUFuRSxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFVLFVBQUssR0FBTCxLQUFLLENBQVM7UUFQbkUsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNSLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBSXhDLHFCQUFnQixHQUFHLEtBQUssQ0FBQztJQUdqQyxDQUFDOzs7O0lBRUQsUUFBUTtRQUNKLElBQUksbUJBQUssSUFBSSxDQUFDLFFBQVEsRUFBQSxJQUFJLEVBQUU7WUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNoRCxJQUFJLG1CQUFLLElBQUksQ0FBQyxjQUFjLEVBQUEsS0FBSyxFQUFFO1lBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDaEUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQTtRQUNyQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDNUUsQ0FBQzs7Ozs7SUFFa0MsVUFBVSxDQUFDLENBQWlCOztj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Q0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzdHLENBQUM7OztZQWxLSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGFBQWE7YUFDMUI7Ozs7WUFMd0MsVUFBVTtZQUFFLFNBQVM7WUFDckQsT0FBTzs7O3VCQU9YLEtBQUssU0FBQyxXQUFXOzZCQUNqQixLQUFLLFNBQUMsZ0JBQWdCO3lCQWdCdEIsWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztzQkF5QmhDLFlBQVksU0FBQyxPQUFPO3FCQU1wQixZQUFZLFNBQUMsTUFBTTtzQkFvQm5CLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7d0JBOENoQyxZQUFZLFNBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDOzs7O0lBbEhuQyw4Q0FBaUM7O0lBQ2pDLG9EQUFnRDs7Ozs7SUFDaEQsMENBQWtCOzs7OztJQUNsQiwyQ0FBc0I7Ozs7O0lBRXRCLHNEQUFpQzs7Ozs7SUFFckIsd0NBQXNCOzs7OztJQUFFLDhDQUEyQjs7Ozs7SUFBRSwyQ0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ01vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpc0RlY2ltYWxdJyxcbn0pXG5leHBvcnQgY2xhc3MgTmVvRGVjaW1hbE51bWJlcnNEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQElucHV0KCdpc0RlY2ltYWwnKSBkZWNpbWFscyA9IDI7XG4gICAgQElucHV0KCdhbGxvd051bGxWYWx1ZScpIGFsbG93TnVsbFZhbHVlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBwcmV2OiBhbnk7XG4gICAgcHJpdmF0ZSByZWdleDogUmVnRXhwO1xuXG4gICAgcHJpdmF0ZSBoYXZlRGVjaW1hbFBvaW50ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgbW9kZWw6IE5nTW9kZWwpIHtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKDxhbnk+dGhpcy5kZWNpbWFscyA9PSBcIlwiKSB0aGlzLmRlY2ltYWxzID0gMjtcbiAgICAgICAgaWYgKDxhbnk+dGhpcy5hbGxvd051bGxWYWx1ZSA9PT0gXCJcIikgdGhpcy5hbGxvd051bGxWYWx1ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC50eXBlID0gXCJudW1iZXJcIlxuICAgICAgICB0aGlzLnJlZ2V4ID0gbmV3IFJlZ0V4cCgnXlswLTldKyhcXFxcLlswLTldezAsJyArIHRoaXMuZGVjaW1hbHMgKyAnfSk/JCcpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3Bhc3RlJywgWyckZXZlbnQnXSkgYmxvY2tQYXN0ZShlOiBDbGlwYm9hcmRFdmVudCkge1xuICAgICAgICBjb25zdCBjbGlwYm9hcmREYXRhOiBEYXRhVHJhbnNmZXIgPSBlLmNsaXBib2FyZERhdGEgfHwgd2luZG93WydjbGlwYm9hcmREYXRhJ107XG4gICAgICAgIGxldCBwYXN0ZWREYXRhOiBzdHJpbmcgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKS5zcGxpdChcIixcIikuam9pbihcIi5cIik7XG5cbiAgICAgICAgbGV0IHBvc1BvaW50ID0gcGFzdGVkRGF0YS5sYXN0SW5kZXhPZignLicpO1xuICAgICAgICBpZiAocG9zUG9pbnQgPiAtMSkge1xuICAgICAgICAgICAgcGFzdGVkRGF0YSA9IHBhc3RlZERhdGEuc3Vic3RyaW5nKDAsIHBvc1BvaW50KS5zcGxpdChcIi5cIikuam9pbihcIlwiKSArIHBhc3RlZERhdGEuc3Vic3RyaW5nKHBvc1BvaW50KTtcbiAgICAgICAgICAgIHBvc1BvaW50ID0gcGFzdGVkRGF0YS5sYXN0SW5kZXhPZignLicpO1xuICAgICAgICAgICAgaWYgKHBvc1BvaW50ICsgdGhpcy5kZWNpbWFscyA8IHBhc3RlZERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcGFzdGVkRGF0YSA9IHBhc3RlZERhdGEuc3Vic3RyaW5nKDAsIHBvc1BvaW50ICsgdGhpcy5kZWNpbWFscyArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb25seU51bWJlcnMgPSBBcnJheS5mcm9tKHBhc3RlZERhdGEpLm1hcCh4ID0+IHRoaXMuaXNOdW1iZXIoeCkpLnJlZHVjZSgocHJldiwgZWwpID0+IHByZXYgJiYgZWwsIHRydWUpO1xuICAgICAgICBjb25zdCBhID0gdGhpcy5yZWdleC50ZXN0KHBhc3RlZERhdGEpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChvbmx5TnVtYmVycyAmJiBhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gcGFzdGVkRGF0YTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJzAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgXG4gICAgICAgIH0sIDEwKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1cycpIG9uZm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPT0gXCIwXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJykgb25CbHVyKCkge1xuICAgICAgICBsZXQgY3VycmVudDogc3RyaW5nID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgICAgICBpZiAoY3VycmVudCA9PSBcIlwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd051bGxWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNvbnRyb2wuc2V0VmFsdWUoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudHlwZSA9IFwidGV4dFwiO1xuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnR5cGUgPSBcIm51bWJlclwiO1xuICAgICAgICAgICAgaWYgKHRoaXMuZWwubmF0aXZlRWxlbWVudC5tYXggJiYgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlQXNOdW1iZXIgPiArdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm1heCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5tYXg7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jb250cm9sLnNldFZhbHVlKHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZUFzTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleXVwJywgWyckZXZlbnQnXSkgb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuXG4gICAgICAgIGxldCBjdXJyZW50OiBzdHJpbmcgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNwbGl0KFwiLVwiKS5qb2luKFwiXCIpO1xuICAgICAgICBsZXQgcG9zUG9pbnQgPSBjdXJyZW50LmluZGV4T2YoJy4nKTtcbiAgICAgICAgaWYgKHBvc1BvaW50ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IGN1cnJlbnQuc3Vic3RyaW5nKDAsIHBvc1BvaW50ICsgMSkgKyBjdXJyZW50LnN1YnN0cmluZyhwb3NQb2ludCkuc3BsaXQoXCIuXCIpLmpvaW4oXCJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXZlRGVjaW1hbFBvaW50ICYmIGN1cnJlbnQgPT0gXCJcIiAmJiB0aGlzLnByZXYgPiBcIlwiKSB7XG4gICAgICAgICAgICB0aGlzLmhhdmVEZWNpbWFsUG9pbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMucHJldiArICh0aGlzLnByZXYuZW5kc1dpdGgoXCIuMFwiKSA/IFwiXCIgOiBcIi4wXCIpO1xuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudHlwZSA9IFwibnVtYmVyXCI7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1NwZWNpYWwoZXZlbnQpIHx8IGN1cnJlbnQgPT0gXCJcIikgeyBcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IDggfHwgY3VycmVudCAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2ID0gY3VycmVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBkb3RJbmRleCA9IGN1cnJlbnQudG9TdHJpbmcoKS5pbmRleE9mKCcuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGRvdEluZGV4ID49IDApIHRoaXMuaGF2ZURlY2ltYWxQb2ludCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuOyBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc051bWJlcihldmVudCkpIHsgXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgZG90SW5kZXggPSBjdXJyZW50LmluZGV4T2YoJy4nKTtcbiAgICAgICAgICAgIGlmICgoZG90SW5kZXggPj0gMCkgJiYgKChjdXJyZW50Lmxlbmd0aCAtIDEpIC0gZG90SW5kZXggPiB0aGlzLmRlY2ltYWxzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBjdXJyZW50LnNsaWNlKDAsIGRvdEluZGV4ICsgdGhpcy5kZWNpbWFscyArIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB0aGlzLnByZXYpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSkgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTcGVjaWFsKGV2ZW50KSkgeyByZXR1cm47IH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNOdW1iZXIoZXZlbnQpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGN1cnJlbnQ6IHN0cmluZyA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZTtcblxuICAgICAgICBpZiAodGhpcy5pc0RlY2ltYWxQb2ludChldmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuaGF2ZURlY2ltYWxQb2ludCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnQuZW5kc1dpdGgoXCIuMFwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IGN1cnJlbnQgKyBcIi4wXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudHlwZSA9IFwibnVtYmVyXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2ID0gY3VycmVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU3BlY2lhbChlOiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBlLmtleSA9PT0gJ0RlbGV0ZScgfHwgKGUua2V5ID09PSAnVGFiJyB8fCBlLmtleUNvZGUgPT0gOSkgfHwgKGUua2V5ID09PSAnQmFja3NwYWNlJyB8fCBlLmtleUNvZGUgPT0gOCkgfHwgZS5rZXkgPT09ICdBcnJvd0xlZnQnIHx8XG4gICAgICAgICAgICBlLmFsdEtleSB8fCBlLmN0cmxLZXkgfHwgZS5rZXkgPT09ICdIb21lJyB8fCBlLmtleSA9PT0gJ0VuZCcgfHwgZS5rZXkgPT09ICdQYWdlRG93bicgfHwgZS5rZXkgPT09ICdQYWdlVXAnIHx8XG4gICAgICAgICAgICBlLmtleSA9PT0gJ0Fycm93RG93bicgfHwgZS5rZXkgPT09ICdBcnJvd1VwJyB8fCBlLmtleSA9PT0gJ0Fycm93UmlnaHQnIHx8IGUua2V5ID09PSAnQ29udHJvbCcgfHwgZS5rZXkgPT09ICdBbHQnIHx8IGUua2V5ID09PSAnU2hpZnQnIHx8XG4gICAgICAgICAgICAoKDxhbnk+ZSkua2V5SWRlbnRpZmllciA9PSAnRG93bicgfHwgKDxhbnk+ZSkua2V5SWRlbnRpZmllciA9PSAnVXAnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTnVtYmVyKGU6IEtleWJvYXJkRXZlbnQgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gKChlLmtleSA+PSAnMCcgJiYgZS5rZXkgPD0gJzknKSB8fCAoKGUua2V5Q29kZSA+PSA0OCAmJiBlLmtleUNvZGUgPD0gNTcpIHx8IChlLmtleUNvZGUgPj0gOTYgJiYgZS5rZXlDb2RlIDw9IDEwNSkpIHx8IFxuICAgICAgICAgICAgICAgICAgICAoZS5rZXkgPT09ICcuJyB8fCBlLmtleSA9PT0gJywnKSB8fCAoZS5rZXlDb2RlID09PSAxODggfHwgZS5rZXlDb2RlID09PSAxOTAgfHwgZS5rZXlDb2RlID09PSAyMjkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoKGUgPj0gJzAnICYmIGUgPD0gJzknKSB8fCAoZSA9PT0gJy4nIHx8IGUgPT09ICcsJykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RlY2ltYWxQb2ludChlOiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoZS5rZXkgPT09ICcuJyB8fCBlLmtleSA9PT0gJywnKSB8fCAoZS5rZXlDb2RlID09PSAxODggfHwgZS5rZXlDb2RlID09PSAxOTAgfHwgZS5rZXlDb2RlID09PSAyMjkpO1xuICAgIH1cbn1cbiJdfQ==