UNPKG

ng-cw-v12

Version:

Angular UI component library

266 lines 36.7 kB
import { Component, forwardRef, HostListener, Input } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "./local.service"; import * as i2 from "@angular/common"; import * as i3 from "@angular/forms"; export class OtpComponent { constructor(eleRef, cd, ls) { this.eleRef = eleRef; this.cd = cd; this.ls = ls; this.ncLength = 6; this.ncSize = 'default'; this.simpleMode = false; this.maskMode = false; this.disabledMode = false; this.readonlyMode = false; this.integerOnlyMode = false; this.autofocusMode = false; this.inputArr = []; this.innerValue = []; this.curIndex = -1; this.inputDoms = []; this.canCopy = false; this.onChangeCallback = () => { }; this.onTouchedCallback = () => { }; } set ncDisabled(value) { this.disabledMode = value !== null && value !== undefined && value !== false && value !== 'false'; } set ncReadonly(value) { this.readonlyMode = value !== null && value !== undefined && value !== false && value !== 'false'; } set ncMask(value) { this.maskMode = value !== null && value !== undefined && value !== false && value !== 'false'; } set ncSimple(value) { this.simpleMode = value !== null && value !== undefined && value !== false && value !== 'false'; } set ncIntegerOnly(value) { this.integerOnlyMode = value !== null && value !== undefined && value !== false && value !== 'false'; } set ncAutofocus(value) { this.autofocusMode = value !== null && value !== undefined && value !== false && value !== 'false'; } handleKeyDown(event) { if (this.curIndex == -1) { return; } if (event.ctrlKey && (event.key == "v" || event.key === "V")) { //防止ctrl+v时v执行nextInput return; } if (event.code == 'Space') { event.preventDefault(); return; } if (event.key == 'Backspace' || event.key == 'Delete') { setTimeout(() => { //先执行删除操作,再执行lastInput this.lastInput(this.curIndex); }); return; } if (event.key == 'ArrowLeft') { setTimeout(() => { this.lastInput(this.curIndex); }); return; } if (event.key == 'ArrowRight') { setTimeout(() => { this.nextInput(this.curIndex); }); return; } if (this.integerOnlyMode) { if (!(/^[0-9]{1}$/.test(event.key))) { event.preventDefault(); } else { setTimeout(() => { //先执行输入操作,再执行nextInput this.nextInput(this.curIndex); }); } } else { if (/^[a-zA-Z0-9]{1}$/.test(event.key)) { setTimeout(() => { //先执行输入操作,再执行nextInput this.nextInput(this.curIndex); }); } } } ngOnInit() { this.inputArr = Array.from({ length: this.ncLength }); } ngAfterViewInit() { var _a; this.inputDoms = this.eleRef.nativeElement.querySelectorAll('.otp-input'); if (this.autofocusMode) { setTimeout(() => { this.inputDoms[0].focus(); }); } const otpContainer = this.eleRef.nativeElement.querySelector(`.otp-container`); const parent = (_a = otpContainer.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement; //nc-otp的父级 if (this.ls.isBrowser) { document.addEventListener('click', (event) => { //选中parent或parent内部元素 if (event.target == parent || parent.contains((event.target))) { this.canCopy = true; } else { this.canCopy = false; } }); document.addEventListener('paste', (event) => { if (this.canCopy) { // 阻止默认粘贴行为 event.preventDefault(); // 获取剪贴板数据 const clipboardData = event.clipboardData; let pastedData = clipboardData.getData('Text'); // 处理获取的文本数据 if (pastedData && pastedData.length > 0 && !this.disabledMode && !this.readonlyMode) { //删除空格 pastedData = pastedData.replace(/\s+/g, ''); let pastedDataArr = pastedData.split(''); //integerOnlyMode下存在非数字中断粘贴 if (this.integerOnlyMode) { for (let d of pastedDataArr) { if (isNaN(Number(d))) { return; } } } while (pastedDataArr.length < this.ncLength) { pastedDataArr.push(null); } if (pastedDataArr.length > this.ncLength) { pastedDataArr = pastedDataArr.slice(0, this.ncLength); } for (let i = 0; i < pastedDataArr.length; i++) { pastedDataArr[i] = !pastedDataArr[i] ? null : (isNaN(Number(pastedDataArr[i])) ? pastedDataArr[i] : Number(pastedDataArr[i])); } this.value = [...pastedDataArr]; } } }); } } ngOnDestroy() { if (this.ls.isBrowser) { document.removeEventListener('click', () => { }); document.removeEventListener('paste', () => { }); } } inputFocus(index) { this.curIndex = index; const inputElement = this.inputDoms[index]; if (inputElement.value) { inputElement.select(); } } inputBlur(index) { this.curIndex = -1; } lastInput(index) { const lastIndex = index == 0 ? index : index - 1; const lastInput = this.inputDoms[lastIndex]; lastInput.focus(); } nextInput(index) { const nextIndex = index == this.ncLength - 1 ? index : index + 1; const nextInput = this.inputDoms[nextIndex]; nextInput.focus(); } get value() { return this.innerValue; } set value(v) { if (JSON.stringify(v) !== JSON.stringify(this.innerValue)) { this.innerValue = v; this.onChangeCallback(v); } } // 从模型写入值到视图 writeValue(value) { if (JSON.stringify(value) !== JSON.stringify(this.innerValue)) { this.innerValue = value; this.cd.markForCheck(); } } // 注册 onChange 事件 registerOnChange(fn) { this.onChangeCallback = fn; } // 注册 onTouched 事件 registerOnTouched(fn) { this.onTouchedCallback = fn; } onInputChange(index, event) { //integerOnlyMode下非数字置空 if (this.integerOnlyMode && isNaN(Number(event))) { const inputElement = this.inputDoms[index]; inputElement.value = ''; event = ''; } let temp = [...this.value]; //补齐数组 while (temp.length < this.ncLength) { temp.push(null); } if (temp.length > this.ncLength) { temp = temp.slice(0, this.ncLength); } temp.splice(index, 1, event == '' ? null : (isNaN(Number(event)) ? event : Number(event))); this.value = [...temp]; //执行set value } } OtpComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: OtpComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.LocalService }], target: i0.ɵɵFactoryTarget.Component }); OtpComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: OtpComponent, selector: "nc-otp", inputs: { ncLength: "ncLength", ncSize: "ncSize", ncDisabled: "ncDisabled", ncReadonly: "ncReadonly", ncMask: "ncMask", ncSimple: "ncSimple", ncIntegerOnly: "ncIntegerOnly", ncAutofocus: "ncAutofocus" }, host: { listeners: { "window:keydown": "handleKeyDown($event)" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => OtpComponent), multi: true } ], ngImport: i0, template: "<div class=\"otp-container\" style=\"--gap: {{ncSize == 'small' ? '8px' : (ncSize == 'large' ? '12px' : '10px')}}\">\r\n <input *ngFor=\"let input of inputArr;let index = index;\" class=\"otp-input\" [class.otp-input-simple]=\"simpleMode\"\r\n [class.otp-input-large]=\"ncSize == 'large'\" [class.otp-input-small]=\"ncSize == 'small'\"\r\n [class.otp-input-mask]=\"maskMode\" type=\"text\" autocomplete=\"off\" [disabled]=\"disabledMode\"\r\n [readonly]=\"readonlyMode\" maxlength=\"1\" (focus)=\"inputFocus(index)\" (blur)=\"inputBlur(index)\"\r\n [ngModel]=\"value ? value[index]: null\" (ngModelChange)=\"onInputChange(index, $event)\">\r\n</div>", styles: [".otp-container{display:flex;grid-gap:var(--gap);gap:var(--gap);width:-moz-fit-content;width:fit-content}.otp-container .otp-input{width:35px;height:33px;font-size:14px;color:#334155;background:#ffffff;padding:.5em .75em;border:1px solid #cbd5e1;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s,outline-color .2s;-webkit-appearance:none;appearance:none;border-radius:6px;box-shadow:0 0 #0000,0 0 #0000,0 1px 2px #1212170d;text-align:center}.otp-container .otp-input:hover{border-color:#94a3b8}.otp-container .otp-input:focus{outline:1px solid #3b82f6;outline-offset:-1px;box-shadow:none;border-color:#94a3b8}.otp-container .otp-input::selection{background-color:#eff5fe;color:#393ada}.otp-container .otp-input:disabled{border:1px solid #DDD;background-color:#f5f5f5;color:#aca899;opacity:1}.otp-container .otp-input-simple{border-width:0 0 2px 0;border-color:#64748b;box-shadow:none;border-radius:0;background:none;color:#42769e}.otp-container .otp-input-simple:focus{outline:none;box-shadow:none;border-color:#3b82f6}.otp-container .otp-input-simple:disabled{border-color:#ddd;border-width:0 0 2px 0;background-color:#fff0;color:#aca899;opacity:1}.otp-container .otp-input-mask{-webkit-text-security:disc}.otp-container .otp-input-large{width:45px;height:43px;font-size:18px}.otp-container .otp-input-small{width:27px;height:25px;padding:.3em .55em;font-size:12px}\n"], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: OtpComponent, decorators: [{ type: Component, args: [{ selector: 'nc-otp', templateUrl: './otp.component.html', styleUrls: ['./otp.component.less'], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => OtpComponent), multi: true } ] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.LocalService }]; }, propDecorators: { ncLength: [{ type: Input }], ncSize: [{ type: Input }], ncDisabled: [{ type: Input }], ncReadonly: [{ type: Input }], ncMask: [{ type: Input }], ncSimple: [{ type: Input }], ncIntegerOnly: [{ type: Input }], ncAutofocus: [{ type: Input }], handleKeyDown: [{ type: HostListener, args: ['window:keydown', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvb3RwL290cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL290cC9vdHAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQyxTQUFTLEVBQWMsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzVJLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQWVuRCxNQUFNLE9BQU8sWUFBWTtJQXFDdkIsWUFBb0IsTUFBa0IsRUFBVSxFQUFxQixFQUFVLEVBQWdCO1FBQTNFLFdBQU0sR0FBTixNQUFNLENBQVk7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUFVLE9BQUUsR0FBRixFQUFFLENBQWM7UUFwQ3RGLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFDckIsV0FBTSxHQUFrQyxTQUFTLENBQUM7UUFvQjNELGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUUvQixhQUFRLEdBQWUsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBZSxFQUFFLENBQUM7UUFDNUIsYUFBUSxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLGNBQVMsR0FBNEIsRUFBRSxDQUFDO1FBQ3hDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDakIscUJBQWdCLEdBQXFCLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxzQkFBaUIsR0FBZSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7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O3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBmb3J3YXJkUmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTG9jYWxTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbC5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmMtb3RwJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vb3RwLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9vdHAuY29tcG9uZW50Lmxlc3MnXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE90cENvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgT3RwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIG5jTGVuZ3RoOiBudW1iZXIgPSA2O1xyXG4gIEBJbnB1dCgpIG5jU2l6ZTogJ3NtYWxsJyB8ICdkZWZhdWx0JyB8ICdsYXJnZScgPSAnZGVmYXVsdCc7XHJcbiAgQElucHV0KCkgc2V0IG5jRGlzYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGlzYWJsZWRNb2RlID0gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgdmFsdWUgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBuY1JlYWRvbmx5KHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLnJlYWRvbmx5TW9kZSA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBASW5wdXQoKSBzZXQgbmNNYXNrKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLm1hc2tNb2RlID0gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgdmFsdWUgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBuY1NpbXBsZSh2YWx1ZTogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5zaW1wbGVNb2RlID0gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgdmFsdWUgIT09ICdmYWxzZSc7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBuY0ludGVnZXJPbmx5KHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLmludGVnZXJPbmx5TW9kZSA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBASW5wdXQoKSBzZXQgbmNBdXRvZm9jdXModmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuYXV0b2ZvY3VzTW9kZSA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuXHJcbiAgc2ltcGxlTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1hc2tNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGlzYWJsZWRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcmVhZG9ubHlNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaW50ZWdlck9ubHlNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgYXV0b2ZvY3VzTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpbnB1dEFycjogQXJyYXk8YW55PiA9IFtdO1xyXG4gIGlubmVyVmFsdWU6IEFycmF5PGFueT4gPSBbXTtcclxuICBjdXJJbmRleDogbnVtYmVyID0gLTE7XHJcbiAgaW5wdXREb21zOiBBcnJheTxIVE1MSW5wdXRFbGVtZW50PiA9IFtdO1xyXG4gIGNhbkNvcHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIG9uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7IH07XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9ICgpID0+IHsgfTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGxzOiBMb2NhbFNlcnZpY2UpIHsgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuY3VySW5kZXggPT0gLTEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldmVudC5jdHJsS2V5ICYmIChldmVudC5rZXkgPT0gXCJ2XCIgfHwgZXZlbnQua2V5ID09PSBcIlZcIikpIHtcclxuICAgICAgLy/pmLLmraJjdHJsK3bml7Z25omn6KGMbmV4dElucHV0XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXZlbnQuY29kZSA9PSAnU3BhY2UnKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXZlbnQua2V5ID09ICdCYWNrc3BhY2UnIHx8IGV2ZW50LmtleSA9PSAnRGVsZXRlJykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvL+WFiOaJp+ihjOWIoOmZpOaTjeS9nO+8jOWGjeaJp+ihjGxhc3RJbnB1dFxyXG4gICAgICAgIHRoaXMubGFzdElucHV0KHRoaXMuY3VySW5kZXgpO1xyXG4gICAgICB9KVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LmtleSA9PSAnQXJyb3dMZWZ0Jykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmxhc3RJbnB1dCh0aGlzLmN1ckluZGV4KTtcclxuICAgICAgfSlcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldmVudC5rZXkgPT0gJ0Fycm93UmlnaHQnKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubmV4dElucHV0KHRoaXMuY3VySW5kZXgpO1xyXG4gICAgICB9KVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaW50ZWdlck9ubHlNb2RlKSB7XHJcbiAgICAgIGlmICghKC9eWzAtOV17MX0kLy50ZXN0KGV2ZW50LmtleSkpKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIC8v5YWI5omn6KGM6L6T5YWl5pON5L2c77yM5YaN5omn6KGMbmV4dElucHV0XHJcbiAgICAgICAgICB0aGlzLm5leHRJbnB1dCh0aGlzLmN1ckluZGV4KTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoL15bYS16QS1aMC05XXsxfSQvLnRlc3QoZXZlbnQua2V5KSkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgLy/lhYjmiafooYzovpPlhaXmk43kvZzvvIzlho3miafooYxuZXh0SW5wdXRcclxuICAgICAgICAgIHRoaXMubmV4dElucHV0KHRoaXMuY3VySW5kZXgpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbnB1dEFyciA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMubmNMZW5ndGggfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlucHV0RG9tcyA9IHRoaXMuZWxlUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm90cC1pbnB1dCcpO1xyXG4gICAgaWYgKHRoaXMuYXV0b2ZvY3VzTW9kZSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmlucHV0RG9tc1swXS5mb2N1cygpO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG90cENvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB0aGlzLmVsZVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC5vdHAtY29udGFpbmVyYCk7XHJcbiAgICBjb25zdCBwYXJlbnQgPSBvdHBDb250YWluZXIucGFyZW50RWxlbWVudD8ucGFyZW50RWxlbWVudDsvL25jLW90cOeahOeItue6p1xyXG5cclxuICAgIGlmICh0aGlzLmxzLmlzQnJvd3Nlcikge1xyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgIC8v6YCJ5LitcGFyZW505oiWcGFyZW505YaF6YOo5YWD57SgXHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PSBwYXJlbnQgfHwgcGFyZW50IS5jb250YWlucygoZXZlbnQudGFyZ2V0KSBhcyBOb2RlKSkge1xyXG4gICAgICAgICAgdGhpcy5jYW5Db3B5ID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jYW5Db3B5ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIFxyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbkNvcHkpIHtcclxuICAgICAgICAgIC8vIOmYu+atoum7mOiupOeymOi0tOihjOS4ulxyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICBcclxuICAgICAgICAgIC8vIOiOt+WPluWJqui0tOadv+aVsOaNrlxyXG4gICAgICAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE7XHJcbiAgICAgICAgICBsZXQgcGFzdGVkRGF0YSA9IGNsaXBib2FyZERhdGEhLmdldERhdGEoJ1RleHQnKTtcclxuICBcclxuICAgICAgICAgIC8vIOWkhOeQhuiOt+WPlueahOaWh+acrOaVsOaNrlxyXG4gICAgICAgICAgaWYgKHBhc3RlZERhdGEgJiYgcGFzdGVkRGF0YS5sZW5ndGggPiAwICYmICF0aGlzLmRpc2FibGVkTW9kZSAmJiAhdGhpcy5yZWFkb25seU1vZGUpIHtcclxuICAgICAgICAgICAgLy/liKDpmaTnqbrmoLxcclxuICAgICAgICAgICAgcGFzdGVkRGF0YSA9IHBhc3RlZERhdGEucmVwbGFjZSgvXFxzKy9nLCAnJyk7XHJcbiAgICAgICAgICAgIGxldCBwYXN0ZWREYXRhQXJyOiBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBudWxsPiA9IHBhc3RlZERhdGEuc3BsaXQoJycpO1xyXG4gICAgICAgICAgICAvL2ludGVnZXJPbmx5TW9kZeS4i+WtmOWcqOmdnuaVsOWtl+S4reaWreeymOi0tFxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlZ2VyT25seU1vZGUpIHtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBkIG9mIHBhc3RlZERhdGFBcnIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc05hTihOdW1iZXIoZCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2hpbGUgKHBhc3RlZERhdGFBcnIubGVuZ3RoIDwgdGhpcy5uY0xlbmd0aCkge1xyXG4gICAgICAgICAgICAgIHBhc3RlZERhdGFBcnIucHVzaChudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFzdGVkRGF0YUFyci5sZW5ndGggPiB0aGlzLm5jTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgcGFzdGVkRGF0YUFyciA9IHBhc3RlZERhdGFBcnIuc2xpY2UoMCwgdGhpcy5uY0xlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXN0ZWREYXRhQXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgcGFzdGVkRGF0YUFycltpXSA9ICFwYXN0ZWREYXRhQXJyW2ldID8gbnVsbCA6IChpc05hTihOdW1iZXIocGFzdGVkRGF0YUFycltpXSkpID8gcGFzdGVkRGF0YUFycltpXSA6IE51bWJlcihwYXN0ZWREYXRhQXJyW2ldKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFsuLi5wYXN0ZWREYXRhQXJyXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5scy5pc0Jyb3dzZXIpIHtcclxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IH0pO1xyXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScsICgpID0+IHsgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnB1dEZvY3VzKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuY3VySW5kZXggPSBpbmRleDtcclxuICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IHRoaXMuaW5wdXREb21zW2luZGV4XTtcclxuICAgIGlmIChpbnB1dEVsZW1lbnQudmFsdWUpIHtcclxuICAgICAgaW5wdXRFbGVtZW50LnNlbGVjdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5wdXRCbHVyKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuY3VySW5kZXggPSAtMTtcclxuICB9XHJcblxyXG4gIGxhc3RJbnB1dChpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBsYXN0SW5kZXg6IG51bWJlciA9IGluZGV4ID09IDAgPyBpbmRleCA6IGluZGV4IC0gMTtcclxuICAgIGNvbnN0IGxhc3RJbnB1dCA9IHRoaXMuaW5wdXREb21zW2xhc3RJbmRleF07XHJcbiAgICBsYXN0SW5wdXQuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIG5leHRJbnB1dChpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBuZXh0SW5kZXg6IG51bWJlciA9IGluZGV4ID09IHRoaXMubmNMZW5ndGggLSAxID8gaW5kZXggOiBpbmRleCArIDE7XHJcbiAgICBjb25zdCBuZXh0SW5wdXQgPSB0aGlzLmlucHV0RG9tc1tuZXh0SW5kZXhdO1xyXG4gICAgbmV4dElucHV0LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmlubmVyVmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkodikgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMuaW5uZXJWYWx1ZSkpIHtcclxuICAgICAgdGhpcy5pbm5lclZhbHVlID0gdjtcclxuICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5LuO5qih5Z6L5YaZ5YWl5YC85Yiw6KeG5Zu+XHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkodmFsdWUpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmlubmVyVmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuaW5uZXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5rOo5YaMIG9uQ2hhbmdlIOS6i+S7tlxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gZm47XHJcbiAgfVxyXG5cclxuICAvLyDms6jlhowgb25Ub3VjaGVkIOS6i+S7tlxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcclxuICB9XHJcblxyXG4gIG9uSW5wdXRDaGFuZ2UoaW5kZXg6IG51bWJlciwgZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgLy9pbnRlZ2VyT25seU1vZGXkuIvpnZ7mlbDlrZfnva7nqbpcclxuICAgIGlmICh0aGlzLmludGVnZXJPbmx5TW9kZSAmJiBpc05hTihOdW1iZXIoZXZlbnQpKSkge1xyXG4gICAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSB0aGlzLmlucHV0RG9tc1tpbmRleF07XHJcbiAgICAgIGlucHV0RWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICBldmVudCA9ICcnO1xyXG4gICAgfVxyXG4gICAgbGV0IHRlbXAgPSBbLi4udGhpcy52YWx1ZV07XHJcbiAgICAvL+ihpem9kOaVsOe7hFxyXG4gICAgd2hpbGUgKHRlbXAubGVuZ3RoIDwgdGhpcy5uY0xlbmd0aCkge1xyXG4gICAgICB0ZW1wLnB1c2gobnVsbCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGVtcC5sZW5ndGggPiB0aGlzLm5jTGVuZ3RoKSB7XHJcbiAgICAgIHRlbXAgPSB0ZW1wLnNsaWNlKDAsIHRoaXMubmNMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgdGVtcC5zcGxpY2UoaW5kZXgsIDEsIGV2ZW50ID09ICcnID8gbnVsbCA6IChpc05hTihOdW1iZXIoZXZlbnQpKSA/IGV2ZW50IDogTnVtYmVyKGV2ZW50KSkpO1xyXG4gICAgdGhpcy52YWx1ZSA9IFsuLi50ZW1wXTsvL+aJp+ihjHNldCB2YWx1ZVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwib3RwLWNvbnRhaW5lclwiIHN0eWxlPVwiLS1nYXA6IHt7bmNTaXplID09ICdzbWFsbCcgPyAnOHB4JyA6IChuY1NpemUgPT0gJ2xhcmdlJyA/ICcxMnB4JyA6ICcxMHB4Jyl9fVwiPlxyXG4gICAgPGlucHV0ICpuZ0Zvcj1cImxldCBpbnB1dCBvZiBpbnB1dEFycjtsZXQgaW5kZXggPSBpbmRleDtcIiBjbGFzcz1cIm90cC1pbnB1dFwiIFtjbGFzcy5vdHAtaW5wdXQtc2ltcGxlXT1cInNpbXBsZU1vZGVcIlxyXG4gICAgICAgIFtjbGFzcy5vdHAtaW5wdXQtbGFyZ2VdPVwibmNTaXplID09ICdsYXJnZSdcIiBbY2xhc3Mub3RwLWlucHV0LXNtYWxsXT1cIm5jU2l6ZSA9PSAnc21hbGwnXCJcclxuICAgICAgICBbY2xhc3Mub3RwLWlucHV0LW1hc2tdPVwibWFza01vZGVcIiB0eXBlPVwidGV4dFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZE1vZGVcIlxyXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seU1vZGVcIiBtYXhsZW5ndGg9XCIxXCIgKGZvY3VzKT1cImlucHV0Rm9jdXMoaW5kZXgpXCIgKGJsdXIpPVwiaW5wdXRCbHVyKGluZGV4KVwiXHJcbiAgICAgICAgW25nTW9kZWxdPVwidmFsdWUgPyB2YWx1ZVtpbmRleF06IG51bGxcIiAobmdNb2RlbENoYW5nZSk9XCJvbklucHV0Q2hhbmdlKGluZGV4LCAkZXZlbnQpXCI+XHJcbjwvZGl2PiJdfQ==