UNPKG

@experteam-mx/ngx-input-number

Version:

Angular input number for Experteam apps

181 lines 24.1 kB
import { Component, Input, ViewChild } from '@angular/core'; import { IMaskDirective } from 'angular-imask'; import * as i0 from "@angular/core"; import * as i1 from "./ngx-input-number.service"; import * as i2 from "@angular/forms"; import * as i3 from "angular-imask"; export class NgxInputNumberComponent { _ChangeDetectorRef; _NgxInputNumberService; inputElement; iMaskDir; control; negative; autofocus = false; decimals; max; idForLabel = ''; tabIndex; addClass = 'form-control-sm'; groupSeparator; radixPoint; lblKeyInvalid; lblKeyInvalidRender; imask; placeholder = '0'; resetControl = false; prevValue = ''; validateError = false; constructor(_ChangeDetectorRef, _NgxInputNumberService) { this._ChangeDetectorRef = _ChangeDetectorRef; this._NgxInputNumberService = _NgxInputNumberService; } ngAfterViewInit() { this.iMaskDir.maskRef?.updateValue(); if (this.autofocus) { setTimeout(() => { this.inputElement.nativeElement.focus(); }); } } render() { this.control.setValue(String(this.control.value).replace('.', this._NgxInputNumberService.radixPoint)); this._ChangeDetectorRef.detectChanges(); this.lblKeyInvalidRender = this._NgxInputNumberService.lblKeyInvalid; this.imask = { mask: Number, scale: this._NgxInputNumberService.decimals, thousandsSeparator: this._NgxInputNumberService.groupSeparator, padFractionalZeros: true, normalizeZeros: true, radix: this._NgxInputNumberService.radixPoint, max: this._NgxInputNumberService.max, min: this._NgxInputNumberService.negative ? -999999999999999999999999999999999 : 0, format: (x) => { if (typeof x !== 'string' && x === null && !this.resetControl) { this.resetControl = true; this.inputElement.nativeElement.value = null; this.iMaskDir.maskRef?.updateValue(); setTimeout(() => { this.iMaskDir.maskRef?.updateControl(); this.control.setValue(null); this.resetControl = false; }); return null; } return String(x); } }; if (this.lblKeyInvalid !== undefined) { this.lblKeyInvalidRender = this.lblKeyInvalid; } if (this.negative !== undefined) { this.imask.min = this.negative ? -999999999999999999999999999999999 : 0; } if (this.max !== undefined) { this.imask.max = this.max; } if (this.groupSeparator !== undefined) { this.imask.thousandsSeparator = this.groupSeparator; } if (this.radixPoint !== undefined) { this.imask.radix = this.radixPoint; } if (this.decimals !== undefined) { this.imask.scale = this.decimals; } setTimeout(() => { if (this.inputElement.nativeElement.value == '' && (this.control.value === null || this.control.value === '' || this.control.value === 0)) { this.control.setValue(''); } }); } ngOnInit() { this._NgxInputNumberService.getChangeEvent().subscribe((configs) => { if (configs) { this.render(); } }); } ngOnChanges() { this.render(); } onKeydown(e) { this.prevValue = e.target.value; } onBlur() { this.validateError = false; } onFocus() { setTimeout(() => { this.validateError = true; }, 1000); } onKeyup(e) { if (!this.validateError) return; let scapeKeys = [ 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Escape', 'Backspace', 'Delete', '.', ',', '-', 'Tab', ]; if (e.target.value == '' && !scapeKeys.includes(e.key)) { this.control.setValue(''); } if (!scapeKeys.includes(e.key) && this.prevValue === e.target.value && e.key != this.prevValue) { this.inputElement.nativeElement.classList.add('key-invalid'); setTimeout(() => { this.inputElement.nativeElement.classList.remove('key-invalid'); }, 1000); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgxInputNumberComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NgxInputNumberService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: NgxInputNumberComponent, selector: "app-input-number", inputs: { control: "control", negative: "negative", autofocus: "autofocus", decimals: "decimals", max: "max", idForLabel: "idForLabel", tabIndex: "tabIndex", addClass: "addClass", groupSeparator: "groupSeparator", radixPoint: "radixPoint", lblKeyInvalid: "lblKeyInvalid" }, viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }, { propertyName: "iMaskDir", first: true, predicate: IMaskDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"position-relative\">\r\n <input\r\n #inputElement\r\n type=\"text\"\r\n class=\"text-end form-control {{ addClass }}\"\r\n [class.is-invalid]=\"control.touched && control.invalid\"\r\n [formControl]=\"control\"\r\n [tabindex]=\"tabIndex\"\r\n [id]=\"idForLabel\"\r\n [imask]=\"imask\"\r\n [unmask]=\"'typed'\"\r\n (keyup)=\"onKeyup($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"onBlur()\"\r\n (focus)=\"onFocus()\"\r\n >\r\n <label class=\"lbl-key-invalid position-absolute top-100 end-0 p-2 d-none\" [innerHTML]=\"lblKeyInvalidRender\"></label>\r\n</div>\r\n", styles: ["input.key-invalid{border-color:#dc3545!important;box-shadow:0 0 0 .25rem #dc354540!important}input.key-invalid+.lbl-key-invalid{background-color:#dc3545;color:#fff;display:block!important;z-index:1}\n"], dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.IMaskDirective, selector: "[imask]", inputs: ["imask", "unmask", "imaskElement"], outputs: ["accept", "complete"], exportAs: ["imask"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgxInputNumberComponent, decorators: [{ type: Component, args: [{ selector: 'app-input-number', template: "<div class=\"position-relative\">\r\n <input\r\n #inputElement\r\n type=\"text\"\r\n class=\"text-end form-control {{ addClass }}\"\r\n [class.is-invalid]=\"control.touched && control.invalid\"\r\n [formControl]=\"control\"\r\n [tabindex]=\"tabIndex\"\r\n [id]=\"idForLabel\"\r\n [imask]=\"imask\"\r\n [unmask]=\"'typed'\"\r\n (keyup)=\"onKeyup($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"onBlur()\"\r\n (focus)=\"onFocus()\"\r\n >\r\n <label class=\"lbl-key-invalid position-absolute top-100 end-0 p-2 d-none\" [innerHTML]=\"lblKeyInvalidRender\"></label>\r\n</div>\r\n", styles: ["input.key-invalid{border-color:#dc3545!important;box-shadow:0 0 0 .25rem #dc354540!important}input.key-invalid+.lbl-key-invalid{background-color:#dc3545;color:#fff;display:block!important;z-index:1}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.NgxInputNumberService }], propDecorators: { inputElement: [{ type: ViewChild, args: ['inputElement'] }], iMaskDir: [{ type: ViewChild, args: [IMaskDirective, { static: false }] }], control: [{ type: Input }], negative: [{ type: Input }], autofocus: [{ type: Input }], decimals: [{ type: Input }], max: [{ type: Input }], idForLabel: [{ type: Input }], tabIndex: [{ type: Input }], addClass: [{ type: Input }], groupSeparator: [{ type: Input }], radixPoint: [{ type: Input }], lblKeyInvalid: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWlucHV0LW51bWJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHBlcnRlYW0tbXgvbmd4LWlucHV0LW51bWJlci9zcmMvbGliL25neC1pbnB1dC1udW1iZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXhwZXJ0ZWFtLW14L25neC1pbnB1dC1udW1iZXIvc3JjL2xpYi9uZ3gtaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsS0FBSyxFQUdMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQTtBQUd0QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFBOzs7OztBQVE5QyxNQUFNLE9BQU8sdUJBQXVCO0lBdUJ4QjtJQUNBO0lBdEJpQixZQUFZLENBQWE7SUFDTixRQUFRLENBQStCO0lBQzVFLE9BQU8sQ0FBYztJQUNyQixRQUFRLENBQU07SUFDZCxTQUFTLEdBQVEsS0FBSyxDQUFBO0lBQ3RCLFFBQVEsQ0FBSztJQUNiLEdBQUcsQ0FBSztJQUNSLFVBQVUsR0FBUSxFQUFFLENBQUE7SUFDcEIsUUFBUSxDQUFLO0lBQ2IsUUFBUSxHQUFRLGlCQUFpQixDQUFBO0lBQ2pDLGNBQWMsQ0FBSztJQUNuQixVQUFVLENBQUs7SUFDZixhQUFhLENBQUs7SUFDM0IsbUJBQW1CLENBQUs7SUFDeEIsS0FBSyxDQUFLO0lBQ1YsV0FBVyxHQUFHLEdBQUcsQ0FBQTtJQUNqQixZQUFZLEdBQUcsS0FBSyxDQUFBO0lBQ3BCLFNBQVMsR0FBUSxFQUFFLENBQUE7SUFDbkIsYUFBYSxHQUFZLEtBQUssQ0FBQTtJQUU5QixZQUNVLGtCQUFxQyxFQUNyQyxzQkFBNkM7UUFEN0MsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUNyQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVC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LEVBQ0QsSUFBSSxDQUNMLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQzt3R0FoTFUsdUJBQXVCOzRGQUF2Qix1QkFBdUIsbWRBR3ZCLGNBQWMscUVDdkIzQiwrcUJBa0JBOzs0RkRFYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0Usa0JBQWtCOzBIQU1ELFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDcUIsUUFBUTtzQkFBckQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNuQyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuaW1wb3J0IHsgTmd4SW5wdXROdW1iZXJTZXJ2aWNlIH0gZnJvbSAnLi9uZ3gtaW5wdXQtbnVtYmVyLnNlcnZpY2UnXHJcbmltcG9ydCB7IElNYXNrRGlyZWN0aXZlIH0gZnJvbSAnYW5ndWxhci1pbWFzaydcclxuaW1wb3J0IHsgTWFza2VkTnVtYmVyIH0gZnJvbSAnaW1hc2snXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1pbnB1dC1udW1iZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uZ3gtaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5zYXNzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE5neElucHV0TnVtYmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xyXG5cclxuICBAVmlld0NoaWxkKCdpbnB1dEVsZW1lbnQnKSBpbnB1dEVsZW1lbnQhOiBFbGVtZW50UmVmXHJcbiAgQFZpZXdDaGlsZChJTWFza0RpcmVjdGl2ZSwgeyBzdGF0aWM6IGZhbHNlIH0pIGlNYXNrRGlyITogSU1hc2tEaXJlY3RpdmU8TWFza2VkTnVtYmVyPlxyXG4gIEBJbnB1dCgpIGNvbnRyb2whOiBGb3JtQ29udHJvbFxyXG4gIEBJbnB1dCgpIG5lZ2F0aXZlITogYW55XHJcbiAgQElucHV0KCkgYXV0b2ZvY3VzOiBhbnkgPSBmYWxzZVxyXG4gIEBJbnB1dCgpIGRlY2ltYWxzOiBhbnlcclxuICBASW5wdXQoKSBtYXg6IGFueVxyXG4gIEBJbnB1dCgpIGlkRm9yTGFiZWw6IGFueSA9ICcnXHJcbiAgQElucHV0KCkgdGFiSW5kZXg6IGFueVxyXG4gIEBJbnB1dCgpIGFkZENsYXNzOiBhbnkgPSAnZm9ybS1jb250cm9sLXNtJ1xyXG4gIEBJbnB1dCgpIGdyb3VwU2VwYXJhdG9yOiBhbnlcclxuICBASW5wdXQoKSByYWRpeFBvaW50OiBhbnlcclxuICBASW5wdXQoKSBsYmxLZXlJbnZhbGlkOiBhbnlcclxuICBsYmxLZXlJbnZhbGlkUmVuZGVyOiBhbnlcclxuICBpbWFzazogYW55XHJcbiAgcGxhY2Vob2xkZXIgPSAnMCdcclxuICByZXNldENvbnRyb2wgPSBmYWxzZVxyXG4gIHByZXZWYWx1ZTogYW55ID0gJydcclxuICB2YWxpZGF0ZUVycm9yOiBib29sZWFuID0gZmFsc2VcclxuXHJcbiAgY29uc3RydWN0b3IgKFxyXG4gICAgcHJpdmF0ZSBfQ2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBfTmd4SW5wdXROdW1iZXJTZXJ2aWNlOiBOZ3hJbnB1dE51bWJlclNlcnZpY2UsXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0ICgpOiB2b2lkIHtcclxuICAgIHRoaXMuaU1hc2tEaXIubWFza1JlZj8udXBkYXRlVmFsdWUoKVxyXG5cclxuICAgIGlmICh0aGlzLmF1dG9mb2N1cykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKClcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbmRlciAoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoU3RyaW5nKHRoaXMuY29udHJvbC52YWx1ZSkucmVwbGFjZSgnLicsIHRoaXMuX05neElucHV0TnVtYmVyU2VydmljZS5yYWRpeFBvaW50KSlcclxuXHJcbiAgICB0aGlzLl9DaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcclxuXHJcbiAgICB0aGlzLmxibEtleUludmFsaWRSZW5kZXIgPSB0aGlzLl9OZ3hJbnB1dE51bWJlclNlcnZpY2UubGJsS2V5SW52YWxpZFxyXG5cclxuICAgIHRoaXMuaW1hc2sgPSB7XHJcbiAgICAgIG1hc2s6IE51bWJlcixcclxuICAgICAgc2NhbGU6IHRoaXMuX05neElucHV0TnVtYmVyU2VydmljZS5kZWNpbWFscyxcclxuICAgICAgdGhvdXNhbmRzU2VwYXJhdG9yOiB0aGlzLl9OZ3hJbnB1dE51bWJlclNlcnZpY2UuZ3JvdXBTZXBhcmF0b3IsXHJcbiAgICAgIHBhZEZyYWN0aW9uYWxaZXJvczogdHJ1ZSxcclxuICAgICAgbm9ybWFsaXplWmVyb3M6IHRydWUsXHJcbiAgICAgIHJhZGl4OiB0aGlzLl9OZ3hJbnB1dE51bWJlclNlcnZpY2UucmFkaXhQb2ludCxcclxuICAgICAgbWF4OiB0aGlzLl9OZ3hJbnB1dE51bWJlclNlcnZpY2UubWF4LFxyXG4gICAgICBtaW46IHRoaXMuX05neElucHV0TnVtYmVyU2VydmljZS5uZWdhdGl2ZSA/IC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgOiAwLFxyXG4gICAgICBmb3JtYXQ6ICh4OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHggIT09ICdzdHJpbmcnICYmIHggPT09IG51bGwgJiYgIXRoaXMucmVzZXRDb250cm9sKSB7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0Q29udHJvbCA9IHRydWVcclxuICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsXHJcbiAgICAgICAgICB0aGlzLmlNYXNrRGlyLm1hc2tSZWY/LnVwZGF0ZVZhbHVlKClcclxuICAgICAgICAgIHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmlNYXNrRGlyLm1hc2tSZWY/LnVwZGF0ZUNvbnRyb2woKVxyXG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShudWxsKVxyXG4gICAgICAgICAgICAgIHRoaXMucmVzZXRDb250cm9sID0gZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKVxyXG5cclxuICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gU3RyaW5nKHgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5sYmxLZXlJbnZhbGlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5sYmxLZXlJbnZhbGlkUmVuZGVyID0gdGhpcy5sYmxLZXlJbnZhbGlkXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmltYXNrLm1pbiA9IHRoaXMubmVnYXRpdmUgPyAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDogMFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1heCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaW1hc2subWF4ID0gdGhpcy5tYXhcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5ncm91cFNlcGFyYXRvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaW1hc2sudGhvdXNhbmRzU2VwYXJhdG9yID0gdGhpcy5ncm91cFNlcGFyYXRvclxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucmFkaXhQb2ludCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaW1hc2sucmFkaXggPSB0aGlzLnJhZGl4UG9pbnRcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kZWNpbWFscyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaW1hc2suc2NhbGUgPSB0aGlzLmRlY2ltYWxzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dChcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID09ICcnICYmICh0aGlzLmNvbnRyb2wudmFsdWUgPT09IG51bGwgfHwgdGhpcy5jb250cm9sLnZhbHVlID09PSAnJyB8fCB0aGlzLmNvbnRyb2wudmFsdWUgPT09IDApKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoJycpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9OZ3hJbnB1dE51bWJlclNlcnZpY2UuZ2V0Q2hhbmdlRXZlbnQoKS5zdWJzY3JpYmUoXHJcbiAgICAgIChjb25maWdzKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbmZpZ3MpIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzICgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVuZGVyKClcclxuICB9XHJcblxyXG4gIG9uS2V5ZG93biAoZTogYW55KSB7XHJcbiAgICB0aGlzLnByZXZWYWx1ZSA9IGUudGFyZ2V0LnZhbHVlXHJcbiAgfVxyXG5cclxuICBvbkJsdXIgKCkge1xyXG4gICAgdGhpcy52YWxpZGF0ZUVycm9yID0gZmFsc2VcclxuICB9XHJcblxyXG4gIG9uRm9jdXMgKCkge1xyXG4gICAgc2V0VGltZW91dChcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGVFcnJvciA9IHRydWVcclxuICAgICAgfSxcclxuICAgICAgMTAwMFxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgb25LZXl1cCAoZTogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVFcnJvcikgcmV0dXJuXHJcblxyXG4gICAgbGV0IHNjYXBlS2V5czogYW55W10gPSBbXHJcbiAgICAgICdBcnJvd0xlZnQnLFxyXG4gICAgICAnQXJyb3dSaWdodCcsXHJcbiAgICAgICdBcnJvd1VwJyxcclxuICAgICAgJ0Fycm93RG93bicsXHJcbiAgICAgICdFc2NhcGUnLFxyXG4gICAgICAnQmFja3NwYWNlJyxcclxuICAgICAgJ0RlbGV0ZScsXHJcbiAgICAgICcuJyxcclxuICAgICAgJywnLFxyXG4gICAgICAnLScsXHJcbiAgICAgICdUYWInLFxyXG4gICAgXVxyXG5cclxuICAgIGlmKFxyXG4gICAgICBlLnRhcmdldC52YWx1ZSA9PSAnJ1xyXG4gICAgICAmJlxyXG4gICAgICAhc2NhcGVLZXlzLmluY2x1ZGVzKGUua2V5KVxyXG4gICAgKXtcclxuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKCcnKVxyXG4gICAgfVxyXG5cclxuICAgIGlmKFxyXG4gICAgICAhc2NhcGVLZXlzLmluY2x1ZGVzKGUua2V5KVxyXG4gICAgICAmJlxyXG4gICAgICB0aGlzLnByZXZWYWx1ZSA9PT0gZS50YXJnZXQudmFsdWVcclxuICAgICAgJiZcclxuICAgICAgZS5rZXkgIT0gdGhpcy5wcmV2VmFsdWVcclxuICAgICl7XHJcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgna2V5LWludmFsaWQnKVxyXG4gICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgna2V5LWludmFsaWQnKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgMTAwMFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgPGlucHV0XHJcbiAgICAgICAgI2lucHV0RWxlbWVudFxyXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICBjbGFzcz1cInRleHQtZW5kIGZvcm0tY29udHJvbCB7eyBhZGRDbGFzcyB9fVwiXHJcbiAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuaW52YWxpZFwiXHJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxyXG4gICAgICAgIFt0YWJpbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgW2lkXT1cImlkRm9yTGFiZWxcIlxyXG4gICAgICAgIFtpbWFza109XCJpbWFza1wiXHJcbiAgICAgICAgW3VubWFza109XCIndHlwZWQnXCJcclxuICAgICAgICAoa2V5dXApPVwib25LZXl1cCgkZXZlbnQpXCJcclxuICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgPlxyXG4gICAgPGxhYmVsIGNsYXNzPVwibGJsLWtleS1pbnZhbGlkIHBvc2l0aW9uLWFic29sdXRlIHRvcC0xMDAgZW5kLTAgcC0yIGQtbm9uZVwiIFtpbm5lckhUTUxdPVwibGJsS2V5SW52YWxpZFJlbmRlclwiPjwvbGFiZWw+XHJcbjwvZGl2PlxyXG4iXX0=