UNPKG

kwikui

Version:

KwikID's UI Component Library in Angular

277 lines 44.3 kB
import { Component, EventEmitter, Input, Output } from "@angular/core"; import { FormControl, FormGroup } from "@angular/forms"; import { KeyboardUtil } from "./input-otp-multiple.util"; import * as i0 from "@angular/core"; import * as i1 from "./input-otp-multiple.pipe"; import * as i2 from "@angular/common"; import * as i3 from "@angular/forms"; export class KwikUIInputOtpMultipleComponent { constructor(keysPipe) { this.keysPipe = keysPipe; this.config = { length: 4, size: "m" }; this.disabled = false; this.invalid = false; this.readOnly = false; this.onInputChange = new EventEmitter(); this.inputControls = new Array(this.config.length); this.componentKey = Math.random().toString(36).substring(2) + new Date().getTime().toString(36); } get inputType() { var _a, _b; return ((_a = this.config) === null || _a === void 0 ? void 0 : _a.isPasswordInput) ? "password" : ((_b = this.config) === null || _b === void 0 ? void 0 : _b.allowNumbersOnly) ? "tel" : "text"; } ngOnInit() { this.otpForm = new FormGroup({}); for (let index = 0; index < this.config.length; index++) { this.otpForm.addControl(this.getControlName(index), new FormControl()); } this.invalid = this.invalid === undefined ? false : this.invalid; this.readOnly = this.readOnly === undefined ? false : this.readOnly; this.disabled = this.disabled === undefined ? false : this.disabled; this.disableInputs(); this.updateValue(); this.otpForm.valueChanges.subscribe((v) => { this.keysPipe.transform(this.otpForm.controls).forEach((k) => { const val = this.otpForm.controls[k].value; if (val && val.length > 1) { if (val.length >= this.config.length) { this.setValue(val); } else { this.rebuildValue(); } } }); }); } updateValue() { for (let index = 0; index < this.config.length; index++) { this.otpForm.controls[this.getControlName(index)].patchValue(this.formCtrl.value.charAt(index)); } } ngOnChanges(changes) { if (changes.hasOwnProperty("formCtrl") && !changes.formCtrl.firstChange) { this.formCtrl = changes.formCtrl.currentValue; this.updateValue(); } if (changes.hasOwnProperty("invalid") && !changes.invalid.firstChange) { this.invalid = Boolean(changes.invalid.currentValue); } if (changes.hasOwnProperty("readOnly") && !changes.readOnly.firstChange) { this.readOnly = Boolean(changes.readOnly.currentValue); } if (changes.hasOwnProperty("disabled") && !changes.disabled.firstChange) { this.disabled = Boolean(changes.disabled.currentValue); this.disableInputs(); } if (changes.hasOwnProperty("config") && !changes.config.firstChange) { this.config = changes.config.currentValue; } } ngAfterViewInit() { if (!this.config.disableAutoFocus) { const containerItem = document.getElementById(`c_${this.componentKey}`); if (containerItem) { const ele = containerItem.getElementsByClassName("otp-input")[0]; if (ele && ele.focus) { ele.focus(); } } } } getControlName(idx) { return `ctrl_${idx}`; } disableInputs() { if (this.disabled) { this.formCtrl.disable({ emitEvent: false }); this.otpForm.disable({ emitEvent: false }); this.keysPipe.transform(this.otpForm.controls).forEach((k) => { this.otpForm.controls[k].disable({ emitEvent: false }); }); } else { this.formCtrl.enable({ emitEvent: false }); this.otpForm.enable({ emitEvent: false }); this.keysPipe.transform(this.otpForm.controls).forEach((k) => { this.otpForm.controls[k].enable({ emitEvent: false }); }); } } onKeyDown($event, inputIdx) { if (KeyboardUtil.ifSpacebar($event)) { $event.preventDefault(); return false; } } onInput($event) { const newVal = this.currentVal ? `${this.currentVal}${$event.target.value}` : $event.target.value; if (this.config.allowNumbersOnly && !this.validateNumber(newVal)) { $event.target.value = ""; $event.stopPropagation(); $event.preventDefault(); } } onKeyUp($event, inputIdx) { const nextInputId = this.appendKey(`otp_${inputIdx + 1}`); const prevInputId = this.appendKey(`otp_${inputIdx - 1}`); if (KeyboardUtil.ifRightArrow($event)) { $event.preventDefault(); this.setSelected(nextInputId); return; } if (KeyboardUtil.ifLeftArrow($event)) { $event.preventDefault(); this.setSelected(prevInputId); return; } if (KeyboardUtil.ifBackspaceOrDelete($event) && !$event.target.value) { this.setSelected(prevInputId); this.rebuildValue(); return; } if (!$event.target.value) { return; } if (this.ifValidKeyCode($event)) { this.setSelected(nextInputId); } this.rebuildValue(); } validateNumber(val) { return val && /^\d*\.?\d*$/.test(val); } appendKey(id) { return `${id}_${this.componentKey}`; } setSelected(eleId) { this.focusTo(eleId); const ele = document.getElementById(eleId); if (ele && ele.setSelectionRange) { setTimeout(() => { ele.setSelectionRange(0, 1); }, 0); } } ifValidKeyCode(event) { const inp = event.key; const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); return (isMobile || /[a-zA-Z0-9-_]/.test(inp) || (this.config.allowKeyCodes && this.config.allowKeyCodes.includes(event.keyCode))); } focusTo(eleId) { const ele = document.getElementById(eleId); if (ele) { ele.focus(); } } // method to set component value setValue(value) { if (this.config.allowNumbersOnly && isNaN(value)) { return; } this.otpForm.reset(); if (!value) { this.rebuildValue(); return; } value = value.toString().replace(/\s/g, ""); // remove whitespace Array.from(value).forEach((c, idx) => { if (this.otpForm.get(this.getControlName(idx))) { this.otpForm.get(this.getControlName(idx)).setValue(c); } }); if (!this.config.disableAutoFocus) { const containerItem = document.getElementById(`c_${this.componentKey}`); const indexOfElementToFocus = value.length < this.config.length ? value.length : this.config.length - 1; const ele = containerItem.getElementsByClassName("otp-input")[indexOfElementToFocus]; if (ele && ele.focus) { ele.focus(); } } this.rebuildValue(); } rebuildValue() { var _a; let val = ""; this.keysPipe.transform(this.otpForm.controls).forEach((k) => { if (this.otpForm.controls[k].value) { let ctrlVal = this.otpForm.controls[k].value; const isLengthExceed = ctrlVal.length > 1; let isCaseTransformEnabled = !this.config.allowNumbersOnly && this.config.letterCase && (this.config.letterCase.toLocaleLowerCase() == "upper" || this.config.letterCase.toLocaleLowerCase() == "lower"); ctrlVal = ctrlVal[0]; const transformedVal = isCaseTransformEnabled ? this.config.letterCase.toLocaleLowerCase() == "upper" ? ctrlVal.toUpperCase() : ctrlVal.toLowerCase() : ctrlVal; if (isCaseTransformEnabled && transformedVal == ctrlVal) { isCaseTransformEnabled = false; } else { ctrlVal = transformedVal; } val += ctrlVal; if (isLengthExceed || isCaseTransformEnabled) { this.otpForm.controls[k].setValue(ctrlVal); } } }); if ((_a = this.formCtrl) === null || _a === void 0 ? void 0 : _a.setValue) { this.formCtrl.setValue(val); } this.onInputChange.emit(val); this.currentVal = val; } handlePaste(e) { // Get pasted data via clipboard API const clipboardData = e.clipboardData || window.clipboardData; if (clipboardData) { var pastedData = clipboardData.getData("Text"); } // Stop data actually being pasted into div e.stopPropagation(); e.preventDefault(); if (!pastedData || (this.config.allowNumbersOnly && !this.validateNumber(pastedData))) { return; } this.setValue(pastedData); } } /** @nocollapse */ KwikUIInputOtpMultipleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputOtpMultipleComponent, deps: [{ token: i1.KeysPipe }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ KwikUIInputOtpMultipleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikUIInputOtpMultipleComponent, selector: "kwikui-input-otp-multiple", inputs: { config: "config", disabled: "disabled", formCtrl: "formCtrl", invalid: "invalid", readOnly: "readOnly" }, outputs: { onInputChange: "onInputChange" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"kwikui-input-otp-multiple-wrapper wrapper {{ config.containerClass }}\"\n id=\"c_{{ componentKey }}\"\n *ngIf=\"otpForm?.controls\"\n [ngStyle]=\"config.containerStyles\"\n>\n <input\n (paste)=\"handlePaste($event)\"\n [pattern]=\"config.allowNumbersOnly ? '\\\\d*' : ''\"\n [type]=\"inputType\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly ?? false\"\n [placeholder]=\"config?.placeholder || ''\"\n [ngStyle]=\"config.inputStyles\"\n [class.input-otp-disabled]=\"disabled\"\n [class.input-otp-readonly]=\"readOnly ?? false\"\n [class.input-otp-s]=\"config?.size === 's'\"\n [class.input-otp-m]=\"config?.size === 'm'\"\n [class.input-otp-l]=\"config?.size === 'l'\"\n [class.input-otp-invalid]=\"invalid\"\n class=\"input-otp {{ config.inputClass }}\"\n autocomplete=\"one-time-code\"\n *ngFor=\"let item of otpForm?.controls | keys; let i = index\"\n [formControl]=\"otpForm.controls[item]\"\n #inp\n id=\"otp_{{ i }}_{{ componentKey }}\"\n (keyup)=\"onKeyUp($event, i)\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event, i)\"\n />\n</div>\n", styles: ["input{animation:tuiPresent 1s;background:var(--tui-base-01);border-inline-end-width:var(--border-end, 0);border-inline-start-width:var(--border-start, 0);border-radius:var(--tui-radius-l);border-width:0 var(--border-end, 0) 0 var(--border-start, 0);border:1px solid var(--tui-base-03);box-shadow:0 .125rem .1875rem #0000001a;box-sizing:border-box;color:var(--tui-text-01);font:var(--tui-font-text-m);height:var(--tui-height-l);line-height:1.25rem;max-height:var(--tui-height-l);min-height:var(--tui-height-l);overflow:hidden;padding:0 var(--tui-padding-l);resize:none;text-align:center;text-indent:var(--text-indent);text-overflow:clip;text-transform:inherit;transition-duration:var(--tui-duration, .3s);transition-property:box-shadow,background,border;transition-timing-function:ease-in-out;white-space:nowrap;width:var(--tui-height-l)}input.input-otp-s{border-radius:var(--tui-radius-m)!important;font:var(--tui-font-text-s)!important;height:var(--tui-height-s)!important;max-height:var(--tui-height-s)!important;min-height:var(--tui-height-s)!important;padding:0 var(--tui-padding-xs)!important;width:var(--tui-height-s)!important}input.input-otp-m{border-radius:var(--tui-radius-m)!important;font:var(--tui-font-text-m)!important;height:var(--tui-height-m)!important;max-height:var(--tui-height-m)!important;min-height:var(--tui-height-m)!important;padding:0 var(--tui-padding-m)!important;width:var(--tui-height-m)!important}input.input-otp-l{border-radius:var(--tui-radius-l)!important;font:var(--tui-font-text-l)!important;height:var(--tui-height-l)!important;max-height:var(--tui-height-l)!important;min-height:var(--tui-height-l)!important;padding:0 var(--tui-padding-l)!important;width:var(--tui-height-l)!important}input:read-only{box-shadow:none!important;border:1px solid var(--tui-base-04)!important}input:read-only:focus,input:read-only:active,input:read-only:focus-visible,input:read-only:focus-within{transition:none!important;border:2px solid var(--tui-base-04)!important}input:disabled{box-shadow:none!important;pointer-events:none!important;opacity:.56!important;opacity:var(--tui-disabled-opacity)!important}input.input-otp-invalid,input.input-otp-invalid:focus,input.input-otp-invalid:active,input.input-otp-invalid:focus-visible,input.input-otp-invalid:focus-within{border:solid var(--tui-error-fill-night)!important;box-shadow:none!important;outline:none!important;transition-property:box-shadow,border;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out}input:focus,input:active,input:focus-visible,input:focus-within{box-shadow:none;border:solid var(--tui-primary);outline:none;transition-property:box-shadow,border;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out}input::placeholder,input:-webkit-input-placeholder,input::-webkit-input-placeholder,input:-moz-placeholder,input::-moz-placeholder,input::-ms-input-placeholder{-moz-user-select:none!important;-ms-user-select:none!important;-webkit-user-select:none!important;color:var(--tui-text-03)!important;opacity:.5!important;display:block!important;font:var(--tui-font-text-s)!important;overflow:hidden!important;pointer-events:none!important;text-overflow:ellipsis!important;transform:translateY(0)!important;transition-duration:var(--tui-duration, .3s)!important;-webkit-transition-property:transform,font-size,color,letter-spacing!important;-moz-transition-property:transform,font-size,color,letter-spacing!important;-ms-transition-property:transform,font-size,color,letter-spacing!important;transition-property:transform,font-size,color,letter-spacing!important;transition-timing-function:ease-in-out!important;user-select:none!important;white-space:nowrap!important;width:100%!important;will-change:transform!important}.kwikui-input-otp-multiple-wrapper input:not(:last-child){margin-right:.5rem}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { 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.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], pipes: { "keys": i1.KeysPipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputOtpMultipleComponent, decorators: [{ type: Component, args: [{ selector: "kwikui-input-otp-multiple", templateUrl: "./input-otp-multiple.component.html", styleUrls: ["./input-otp-multiple.component.scss"] }] }], ctorParameters: function () { return [{ type: i1.KeysPipe }]; }, propDecorators: { config: [{ type: Input }], disabled: [{ type: Input }], formCtrl: [{ type: Input }], invalid: [{ type: Input }], readOnly: [{ type: Input }], onInputChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtb3RwLW11bHRpcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWt1aS9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tL2lucHV0LW90cC9pbnB1dC1vdHAtbXVsdGlwbGUvaW5wdXQtb3RwLW11bHRpcGxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWt1aS9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tL2lucHV0LW90cC9pbnB1dC1vdHAtbXVsdGlwbGUvaW5wdXQtb3RwLW11bHRpcGxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7O0FBT3pELE1BQU0sT0FBTywrQkFBK0I7SUE4QjFDLFlBQW9CLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUE3QjdCLFdBQU0sR0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBRTFDLGFBQVEsR0FBbUIsS0FBSyxDQUFDO1FBSWpDLFlBQU8sR0FBbUIsS0FBSyxDQUFDO1FBRWhDLGFBQVEsR0FBbUIsS0FBSyxDQUFDO1FBRWhDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQU1yRCxrQkFBYSxHQUFrQixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdELGlCQUFZLEdBQ1YsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFB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QUFRO3NCQUFoQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tIFwiLi9pbnB1dC1vdHAtbXVsdGlwbGUuY29uZmlnXCI7XG5pbXBvcnQgeyBLZXlzUGlwZSB9IGZyb20gXCIuL2lucHV0LW90cC1tdWx0aXBsZS5waXBlXCI7XG5pbXBvcnQgeyBLZXlib2FyZFV0aWwgfSBmcm9tIFwiLi9pbnB1dC1vdHAtbXVsdGlwbGUudXRpbFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwia3dpa3VpLWlucHV0LW90cC1tdWx0aXBsZVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2lucHV0LW90cC1tdWx0aXBsZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vaW5wdXQtb3RwLW11bHRpcGxlLmNvbXBvbmVudC5zY3NzXCJdXG59KVxuZXhwb3J0IGNsYXNzIEt3aWtVSUlucHV0T3RwTXVsdGlwbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBjb25maWc6IENvbmZpZyA9IHsgbGVuZ3RoOiA0LCBzaXplOiBcIm1cIiB9O1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuIHwgbnVsbCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGZvcm1DdHJsOiBGb3JtQ29udHJvbDtcblxuICBASW5wdXQoKSBpbnZhbGlkOiBib29sZWFuIHwgbnVsbCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHJlYWRPbmx5OiBib29sZWFuIHwgbnVsbCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBvbklucHV0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgb3RwRm9ybTogRm9ybUdyb3VwO1xuXG4gIGN1cnJlbnRWYWw6IHN0cmluZztcblxuICBpbnB1dENvbnRyb2xzOiBGb3JtQ29udHJvbFtdID0gbmV3IEFycmF5KHRoaXMuY29uZmlnLmxlbmd0aCk7XG5cbiAgY29tcG9uZW50S2V5ID1cbiAgICBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMikgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKS50b1N0cmluZygzNik7XG5cbiAgZ2V0IGlucHV0VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LmlzUGFzc3dvcmRJbnB1dFxuICAgICAgPyBcInBhc3N3b3JkXCJcbiAgICAgIDogdGhpcy5jb25maWc/LmFsbG93TnVtYmVyc09ubHlcbiAgICAgICAgPyBcInRlbFwiXG4gICAgICAgIDogXCJ0ZXh0XCI7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGtleXNQaXBlOiBLZXlzUGlwZSkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm90cEZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jb25maWcubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB0aGlzLm90cEZvcm0uYWRkQ29udHJvbCh0aGlzLmdldENvbnRyb2xOYW1lKGluZGV4KSwgbmV3IEZvcm1Db250cm9sKCkpO1xuICAgIH1cblxuICAgIHRoaXMuaW52YWxpZCA9IHRoaXMuaW52YWxpZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLmludmFsaWQ7XG4gICAgdGhpcy5yZWFkT25seSA9IHRoaXMucmVhZE9ubHkgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdGhpcy5yZWFkT25seTtcbiAgICB0aGlzLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLmRpc2FibGVkO1xuXG4gICAgdGhpcy5kaXNhYmxlSW5wdXRzKCk7XG5cbiAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7XG5cbiAgICB0aGlzLm90cEZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodjogb2JqZWN0KSA9PiB7XG4gICAgICB0aGlzLmtleXNQaXBlLnRyYW5zZm9ybSh0aGlzLm90cEZvcm0uY29udHJvbHMpLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy5vdHBGb3JtLmNvbnRyb2xzW2tdLnZhbHVlO1xuICAgICAgICBpZiAodmFsICYmIHZhbC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgaWYgKHZhbC5sZW5ndGggPj0gdGhpcy5jb25maWcubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKHZhbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZFZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVZhbHVlKCkge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmNvbmZpZy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHRoaXMub3RwRm9ybS5jb250cm9sc1t0aGlzLmdldENvbnRyb2xOYW1lKGluZGV4KV0ucGF0Y2hWYWx1ZShcbiAgICAgICAgdGhpcy5mb3JtQ3RybC52YWx1ZS5jaGFyQXQoaW5kZXgpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShcImZvcm1DdHJsXCIpICYmICFjaGFuZ2VzLmZvcm1DdHJsLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmZvcm1DdHJsID0gY2hhbmdlcy5mb3JtQ3RybC5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KFwiaW52YWxpZFwiKSAmJiAhY2hhbmdlcy5pbnZhbGlkLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmludmFsaWQgPSBCb29sZWFuKGNoYW5nZXMuaW52YWxpZC5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShcInJlYWRPbmx5XCIpICYmICFjaGFuZ2VzLnJlYWRPbmx5LmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnJlYWRPbmx5ID0gQm9vbGVhbihjaGFuZ2VzLnJlYWRPbmx5LmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KFwiZGlzYWJsZWRcIikgJiYgIWNoYW5nZXMuZGlzYWJsZWQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBCb29sZWFuKGNoYW5nZXMuZGlzYWJsZWQuY3VycmVudFZhbHVlKTtcbiAgICAgIHRoaXMuZGlzYWJsZUlucHV0cygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShcImNvbmZpZ1wiKSAmJiAhY2hhbmdlcy5jb25maWcuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gY2hhbmdlcy5jb25maWcuY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmRpc2FibGVBdXRvRm9jdXMpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckl0ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY18ke3RoaXMuY29tcG9uZW50S2V5fWApO1xuICAgICAgaWYgKGNvbnRhaW5lckl0ZW0pIHtcbiAgICAgICAgY29uc3QgZWxlOiBhbnkgPSBjb250YWluZXJJdGVtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJvdHAtaW5wdXRcIilbMF07XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmZvY3VzKSB7XG4gICAgICAgICAgZWxlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRyb2xOYW1lKGlkeCkge1xuICAgIHJldHVybiBgY3RybF8ke2lkeH1gO1xuICB9XG5cbiAgZGlzYWJsZUlucHV0cygpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5mb3JtQ3RybC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMub3RwRm9ybS5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMua2V5c1BpcGUudHJhbnNmb3JtKHRoaXMub3RwRm9ybS5jb250cm9scykuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICB0aGlzLm90cEZvcm0uY29udHJvbHNba10uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtQ3RybC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5vdHBGb3JtLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLmtleXNQaXBlLnRyYW5zZm9ybSh0aGlzLm90cEZvcm0uY29udHJvbHMpLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgdGhpcy5vdHBGb3JtLmNvbnRyb2xzW2tdLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvbktleURvd24oJGV2ZW50LCBpbnB1dElkeCkge1xuICAgIGlmIChLZXlib2FyZFV0aWwuaWZTcGFjZWJhcigkZXZlbnQpKSB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBvbklucHV0KCRldmVudCkge1xuICAgIGNvbnN0IG5ld1ZhbCA9IHRoaXMuY3VycmVudFZhbFxuICAgICAgPyBgJHt0aGlzLmN1cnJlbnRWYWx9JHskZXZlbnQudGFyZ2V0LnZhbHVlfWBcbiAgICAgIDogJGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICBpZiAodGhpcy5jb25maWcuYWxsb3dOdW1iZXJzT25seSAmJiAhdGhpcy52YWxpZGF0ZU51bWJlcihuZXdWYWwpKSB7XG4gICAgICAkZXZlbnQudGFyZ2V0LnZhbHVlID0gXCJcIjtcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uS2V5VXAoJGV2ZW50LCBpbnB1dElkeCkge1xuICAgIGNvbnN0IG5leHRJbnB1dElkID0gdGhpcy5hcHBlbmRLZXkoYG90cF8ke2lucHV0SWR4ICsgMX1gKTtcbiAgICBjb25zdCBwcmV2SW5wdXRJZCA9IHRoaXMuYXBwZW5kS2V5KGBvdHBfJHtpbnB1dElkeCAtIDF9YCk7XG4gICAgaWYgKEtleWJvYXJkVXRpbC5pZlJpZ2h0QXJyb3coJGV2ZW50KSkge1xuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldFNlbGVjdGVkKG5leHRJbnB1dElkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEtleWJvYXJkVXRpbC5pZkxlZnRBcnJvdygkZXZlbnQpKSB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWQocHJldklucHV0SWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoS2V5Ym9hcmRVdGlsLmlmQmFja3NwYWNlT3JEZWxldGUoJGV2ZW50KSAmJiAhJGV2ZW50LnRhcmdldC52YWx1ZSkge1xuICAgICAgdGhpcy5zZXRTZWxlY3RlZChwcmV2SW5wdXRJZCk7XG4gICAgICB0aGlzLnJlYnVpbGRWYWx1ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghJGV2ZW50LnRhcmdldC52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlmVmFsaWRLZXlDb2RlKCRldmVudCkpIHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWQobmV4dElucHV0SWQpO1xuICAgIH1cbiAgICB0aGlzLnJlYnVpbGRWYWx1ZSgpO1xuICB9XG5cbiAgdmFsaWRhdGVOdW1iZXIodmFsKSB7XG4gICAgcmV0dXJuIHZhbCAmJiAvXlxcZCpcXC4/XFxkKiQvLnRlc3QodmFsKTtcbiAgfVxuXG4gIGFwcGVuZEtleShpZCkge1xuICAgIHJldHVybiBgJHtpZH1fJHt0aGlzLmNvbXBvbmVudEtleX1gO1xuICB9XG5cbiAgc2V0U2VsZWN0ZWQoZWxlSWQpIHtcbiAgICB0aGlzLmZvY3VzVG8oZWxlSWQpO1xuICAgIGNvbnN0IGVsZTogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlSWQpO1xuICAgIGlmIChlbGUgJiYgZWxlLnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlLnNldFNlbGVjdGlvblJhbmdlKDAsIDEpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgaWZWYWxpZEtleUNvZGUoZXZlbnQpIHtcbiAgICBjb25zdCBpbnAgPSBldmVudC5rZXk7XG4gICAgY29uc3QgaXNNb2JpbGUgPSAvaVBob25lfGlQYWR8aVBvZHxBbmRyb2lkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICByZXR1cm4gKFxuICAgICAgaXNNb2JpbGUgfHxcbiAgICAgIC9bYS16QS1aMC05LV9dLy50ZXN0KGlucCkgfHxcbiAgICAgICh0aGlzLmNvbmZpZy5hbGxvd0tleUNvZGVzICYmXG4gICAgICAgIHRoaXMuY29uZmlnLmFsbG93S2V5Q29kZXMuaW5jbHVkZXMoZXZlbnQua2V5Q29kZSkpXG4gICAgKTtcbiAgfVxuXG4gIGZvY3VzVG8oZWxlSWQpIHtcbiAgICBjb25zdCBlbGU6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZUlkKTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICBlbGUuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICAvLyBtZXRob2QgdG8gc2V0IGNvbXBvbmVudCB2YWx1ZVxuXG4gIHNldFZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5jb25maWcuYWxsb3dOdW1iZXJzT25seSAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdHBGb3JtLnJlc2V0KCk7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhpcy5yZWJ1aWxkVmFsdWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnJlcGxhY2UoL1xccy9nLCBcIlwiKTsgLy8gcmVtb3ZlIHdoaXRlc3BhY2VcbiAgICBBcnJheS5mcm9tKHZhbHVlKS5mb3JFYWNoKChjLCBpZHgpID0+IHtcbiAgICAgIGlmICh0aGlzLm90cEZvcm0uZ2V0KHRoaXMuZ2V0Q29udHJvbE5hbWUoaWR4KSkpIHtcbiAgICAgICAgdGhpcy5vdHBGb3JtLmdldCh0aGlzLmdldENvbnRyb2xOYW1lKGlkeCkpLnNldFZhbHVlKGMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghdGhpcy5jb25maWcuZGlzYWJsZUF1dG9Gb2N1cykge1xuICAgICAgY29uc3QgY29udGFpbmVySXRlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBjXyR7dGhpcy5jb21wb25lbnRLZXl9YCk7XG4gICAgICBjb25zdCBpbmRleE9mRWxlbWVudFRvRm9jdXMgPVxuICAgICAgICB2YWx1ZS5sZW5ndGggPCB0aGlzLmNvbmZpZy5sZW5ndGhcbiAgICAgICAgICA/IHZhbHVlLmxlbmd0aFxuICAgICAgICAgIDogdGhpcy5jb25maWcubGVuZ3RoIC0gMTtcbiAgICAgIGNvbnN0IGVsZTogYW55ID1cbiAgICAgICAgY29udGFpbmVySXRlbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwib3RwLWlucHV0XCIpW1xuICAgICAgICAgIGluZGV4T2ZFbGVtZW50VG9Gb2N1c1xuICAgICAgICBdO1xuICAgICAgaWYgKGVsZSAmJiBlbGUuZm9jdXMpIHtcbiAgICAgICAgZWxlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVidWlsZFZhbHVlKCk7XG4gIH1cblxuICByZWJ1aWxkVmFsdWUoKSB7XG4gICAgbGV0IHZhbCA9IFwiXCI7XG4gICAgdGhpcy5rZXlzUGlwZS50cmFuc2Zvcm0odGhpcy5vdHBGb3JtLmNvbnRyb2xzKS5mb3JFYWNoKChrKSA9PiB7XG4gICAgICBpZiAodGhpcy5vdHBGb3JtLmNvbnRyb2xzW2tdLnZhbHVlKSB7XG4gICAgICAgIGxldCBjdHJsVmFsID0gdGhpcy5vdHBGb3JtLmNvbnRyb2xzW2tdLnZhbHVlO1xuICAgICAgICBjb25zdCBpc0xlbmd0aEV4Y2VlZCA9IGN0cmxWYWwubGVuZ3RoID4gMTtcbiAgICAgICAgbGV0IGlzQ2FzZVRyYW5zZm9ybUVuYWJsZWQgPVxuICAgICAgICAgICF0aGlzLmNvbmZpZy5hbGxvd051bWJlcnNPbmx5ICYmXG4gICAgICAgICAgdGhpcy5jb25maWcubGV0dGVyQ2FzZSAmJlxuICAgICAgICAgICh0aGlzLmNvbmZpZy5sZXR0ZXJDYXNlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gXCJ1cHBlclwiIHx8XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5sZXR0ZXJDYXNlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gXCJsb3dlclwiKTtcbiAgICAgICAgY3RybFZhbCA9IGN0cmxWYWxbMF07XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsID0gaXNDYXNlVHJhbnNmb3JtRW5hYmxlZFxuICAgICAgICAgID8gdGhpcy5jb25maWcubGV0dGVyQ2FzZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09IFwidXBwZXJcIlxuICAgICAgICAgICAgPyBjdHJsVmFsLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgIDogY3RybFZhbC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgOiBjdHJsVmFsO1xuICAgICAgICBpZiAoaXNDYXNlVHJhbnNmb3JtRW5hYmxlZCAmJiB0cmFuc2Zvcm1lZFZhbCA9PSBjdHJsVmFsKSB7XG4gICAgICAgICAgaXNDYXNlVHJhbnNmb3JtRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0cmxWYWwgPSB0cmFuc2Zvcm1lZFZhbDtcbiAgICAgICAgfVxuICAgICAgICB2YWwgKz0gY3RybFZhbDtcbiAgICAgICAgaWYgKGlzTGVuZ3RoRXhjZWVkIHx8IGlzQ2FzZVRyYW5zZm9ybUVuYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLm90cEZvcm0uY29udHJvbHNba10uc2V0VmFsdWUoY3RybFZhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGhpcy5mb3JtQ3RybD8uc2V0VmFsdWUpIHtcbiAgICAgIHRoaXMuZm9ybUN0cmwuc2V0VmFsdWUodmFsKTtcbiAgICB9XG4gICAgdGhpcy5vbklucHV0Q2hhbmdlLmVtaXQodmFsKTtcbiAgICB0aGlzLmN1cnJlbnRWYWwgPSB2YWw7XG4gIH1cblxuICBoYW5kbGVQYXN0ZShlKSB7XG4gICAgLy8gR2V0IHBhc3RlZCBkYXRhIHZpYSBjbGlwYm9hcmQgQVBJXG4gICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGUuY2xpcGJvYXJkRGF0YSB8fCAod2luZG93IGFzIGFueSkuY2xpcGJvYXJkRGF0YTtcbiAgICBpZiAoY2xpcGJvYXJkRGF0YSkge1xuICAgICAgdmFyIHBhc3RlZERhdGEgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJUZXh0XCIpO1xuICAgIH1cbiAgICAvLyBTdG9wIGRhdGEgYWN0dWFsbHkgYmVpbmcgcGFzdGVkIGludG8gZGl2XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKFxuICAgICAgIXBhc3RlZERhdGEgfHxcbiAgICAgICh0aGlzLmNvbmZpZy5hbGxvd051bWJlcnNPbmx5ICYmICF0aGlzLnZhbGlkYXRlTnVtYmVyKHBhc3RlZERhdGEpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldFZhbHVlKHBhc3RlZERhdGEpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwia3dpa3VpLWlucHV0LW90cC1tdWx0aXBsZS13cmFwcGVyIHdyYXBwZXIge3sgY29uZmlnLmNvbnRhaW5lckNsYXNzIH19XCJcbiAgaWQ9XCJjX3t7IGNvbXBvbmVudEtleSB9fVwiXG4gICpuZ0lmPVwib3RwRm9ybT8uY29udHJvbHNcIlxuICBbbmdTdHlsZV09XCJjb25maWcuY29udGFpbmVyU3R5bGVzXCJcbj5cbiAgPGlucHV0XG4gICAgKHBhc3RlKT1cImhhbmRsZVBhc3RlKCRldmVudClcIlxuICAgIFtwYXR0ZXJuXT1cImNvbmZpZy5hbGxvd051bWJlcnNPbmx5ID8gJ1xcXFxkKicgOiAnJ1wiXG4gICAgW3R5cGVdPVwiaW5wdXRUeXBlXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtyZWFkb25seV09XCJyZWFkT25seSA/PyBmYWxzZVwiXG4gICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZz8ucGxhY2Vob2xkZXIgfHwgJydcIlxuICAgIFtuZ1N0eWxlXT1cImNvbmZpZy5pbnB1dFN0eWxlc1wiXG4gICAgW2NsYXNzLmlucHV0LW90cC1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2NsYXNzLmlucHV0LW90cC1yZWFkb25seV09XCJyZWFkT25seSA/PyBmYWxzZVwiXG4gICAgW2NsYXNzLmlucHV0LW90cC1zXT1cImNvbmZpZz8uc2l6ZSA9PT0gJ3MnXCJcbiAgICBbY2xhc3MuaW5wdXQtb3RwLW1dPVwiY29uZmlnPy5zaXplID09PSAnbSdcIlxuICAgIFtjbGFzcy5pbnB1dC1vdHAtbF09XCJjb25maWc/LnNpemUgPT09ICdsJ1wiXG4gICAgW2NsYXNzLmlucHV0LW90cC1pbnZhbGlkXT1cImludmFsaWRcIlxuICAgIGNsYXNzPVwiaW5wdXQtb3RwIHt7IGNvbmZpZy5pbnB1dENsYXNzIH19XCJcbiAgICBhdXRvY29tcGxldGU9XCJvbmUtdGltZS1jb2RlXCJcbiAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBvdHBGb3JtPy5jb250cm9scyB8IGtleXM7IGxldCBpID0gaW5kZXhcIlxuICAgIFtmb3JtQ29udHJvbF09XCJvdHBGb3JtLmNvbnRyb2xzW2l0ZW1dXCJcbiAgICAjaW5wXG4gICAgaWQ9XCJvdHBfe3sgaSB9fV97eyBjb21wb25lbnRLZXkgfX1cIlxuICAgIChrZXl1cCk9XCJvbktleVVwKCRldmVudCwgaSlcIlxuICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxuICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQsIGkpXCJcbiAgLz5cbjwvZGl2PlxuIl19