@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
JavaScript
/**
* @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==