UNPKG

kwikui

Version:

KwikID's UI Component Library in Angular

225 lines 31.7 kB
import { Component, EventEmitter, forwardRef, Input, Output } from "@angular/core"; import { FormControl, FormGroup, NG_VALUE_ACCESSOR } from "@angular/forms"; import { Subscription } from "rxjs"; import { distinctUntilChanged } from "rxjs/operators"; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/kit"; import * as i2 from "@taiga-ui/core"; import * as i3 from "./input-otp-multiple/input-otp-multiple.component"; import * as i4 from "@angular/common"; import * as i5 from "@angular/forms"; export class KwikUIInputOtpComponent { constructor() { this.disabled = false; this.focus = false; this.formControl = new FormControl({}); this.formControlName = "form_control_name"; this.id = ""; this.invalid = false; this.label = ""; this.mask = "# # # #"; this.mode = "single"; this.otpLength = 4; this.placeholder = ""; this.postfix = ""; this.prefix = ""; this.properties = { readOnly: false, hidePlaceholder: false }; this.size = "m"; this.validators = { required: true }; this.getKeyValue = new EventEmitter(); this.formGroup = new FormGroup({}); this.otpMultipleConfig = { allowKeyCodes: [], allowNumbersOnly: true, containerClass: "", containerStyles: {}, disableAutoFocus: true, inputClass: "", inputStyles: {}, isPasswordInput: false, length: this.otpLength, placeholder: "", size: this.size }; this.subscriptions = new Subscription(); } ngOnInit() { this.formGroup.addControl(this.formControlName, this.formControl); this.focus = this.focus === undefined ? false : this.focus; this.invalid = this.invalid === undefined ? false : this.invalid && this.focus; this.validators = Object.assign({}, this.validators); this.properties = Object.assign({}, this.properties); this.mode = this.mode !== "single" && this.mode !== "multiple" ? "multiple" : this.mode; this.otpMultipleConfig = Object.assign(Object.assign({}, this.otpMultipleConfig), { length: this.otpLength, placeholder: this.properties.hidePlaceholder ? "" : this.placeholder.length > 0 ? "0" : this.placeholder, size: this.size }); this.setDisabled(); this.subscriptions.add(this.formGroup.controls[this.formControlName].valueChanges .pipe(distinctUntilChanged()) // makes sure the value has actually changed. .subscribe((value) => this.handleInputValueChange(value))); } ngOnChanges(changes) { if (changes.hasOwnProperty("formControl") && !changes.formControl.firstChange) { this.formControl = changes.formControl.currentValue; } if (changes.hasOwnProperty("invalid") && !changes.invalid.firstChange) { this.invalid = Boolean(changes.invalid.currentValue); this.setError(); } if (changes.hasOwnProperty("focus") && !changes.focus.firstChange) { this.focus = Boolean(changes.focus.currentValue); } if (changes.hasOwnProperty("focus") && !changes.focus.firstChange) { this.focus = Boolean(changes.focus.currentValue); } if (changes.hasOwnProperty("size") && !changes.size.firstChange) { this.size = changes.size.currentValue; } if (changes.hasOwnProperty("disabled") && !changes.disabled.firstChange) { this.disabled = Boolean(changes.disabled.currentValue); this.setDisabled(); } } ngOnDestroy() { this.subscriptions.unsubscribe(); // ensure when component is destroyed the subscription is also and not left open. } /** * @description Handles updating the config object with the latest values for multiple mode */ setConfigProperties() { this.otpMultipleConfig = Object.assign(Object.assign({}, this.otpMultipleConfig), { length: this.otpLength, placeholder: this.placeholder.length > 0 ? "0" : this.placeholder, size: this.size }); } /** * @description Handles setting up of error and focus on the input field is it is invalid */ setDisabled() { if (this.formGroup.controls[this.formControlName] !== undefined) { if (this.disabled === true) { this.formGroup.controls[this.formControlName].disable({ emitEvent: false }); } else { this.formGroup.controls[this.formControlName].enable({ emitEvent: false }); } } } /** * @description Handles setting up of error and focus on the input field is it is invalid */ setError() { if (this.formGroup.controls[this.formControlName] !== undefined && this.formGroup.controls[this.formControlName].invalid) { this.invalid = true; this.focus = true; } else { this.invalid = false; this.focus = false; } } /** * @description Handles firing of 2 events on (keyup) event * * @param value */ handleInputValueChange(value) { if (value === this.formControl.value && this.mode === "single") { this.emitEvent(this.getKeyValue, { key: this.formControlName, value: this.formControl.value }); } } handleInputValueChangeMultiple(value) { if (this.mode === "multiple") { this.formControl.patchValue(value); this.formGroup.controls[this.formControlName].patchValue(value); this.emitEvent(this.getKeyValue, { key: this.formControlName, value: this.formControl.value }); } } handleFocusedChange(e) { if (!this.invalid) { this.focus = e; } } emitEvent(event, data) { event.emit(data); } /** Method Implementations for Abstract Control */ writeValue(value) { } registerOnChange(fn) { } registerOnTouched(fn) { } setDisabledState(isDisabled) { } } /** @nocollapse */ KwikUIInputOtpComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputOtpComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ KwikUIInputOtpComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikUIInputOtpComponent, selector: "kwikui-input-otp", inputs: { disabled: "disabled", focus: "focus", formControl: "formControl", formControlName: "formControlName", id: "id", invalid: "invalid", label: "label", mask: "mask", mode: "mode", otpLength: "otpLength", placeholder: "placeholder", postfix: "postfix", prefix: "prefix", properties: "properties", size: "size", validators: "validators" }, outputs: { getKeyValue: "getKeyValue" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((() => KwikUIInputOtpComponent)), multi: true } ], usesOnChanges: true, ngImport: i0, template: "<div\n [formGroup]=\"formGroup\"\n *ngIf=\"mode === 'single'\"\n id=\"mode-single\"\n>\n <tui-input-phone\n [formControlName]=\"formControlName\"\n [countryCode]=\"''\"\n [phoneMaskAfterCountryCode]=\"mask\"\n [nativeId]=\"id\"\n [pseudoInvalid]=\"invalid === undefined ? null : invalid\"\n [pseudoFocus]=\"focus ?? null\"\n [readOnly]=\"properties?.readOnly ?? false\"\n (focusedChange)=\"handleFocusedChange($event)\"\n >\n {{ label }}\n <span\n class=\"tui-required\"\n *ngIf=\"validators.required\"\n ></span>\n <input\n tuiTextfield\n inputmode=\"numeric\"\n [attr.placeholder]=\"placeholder ?? ''\"\n [attr.required]=\"validators.required\"\n />\n </tui-input-phone>\n</div>\n<div\n [formGroup]=\"formGroup\"\n *ngIf=\"mode === 'multiple'\"\n id=\"mode-multiple\"\n>\n <div\n id=\"mode-multiple-label\"\n *ngIf=\"label !== ''\"\n >\n <span class=\"t-label\">\n <b>\n <p class=\"tui-space_bottom-1 tui-space_left-1 ng-star-inserted\">\n {{ label }}\n <span\n class=\"tui-required\"\n *ngIf=\"validators.required\"\n ></span>\n </p>\n </b>\n </span>\n </div>\n <div id=\"mode-multiple-inputs\">\n <kwikui-input-otp-multiple\n [formCtrl]=\"formControl\"\n [config]=\"otpMultipleConfig\"\n [invalid]=\"invalid === undefined ? null : invalid\"\n [disabled]=\"disabled\"\n [readOnly]=\"properties?.readOnly ?? false\"\n (onInputChange)=\"handleInputValueChangeMultiple($event)\"\n ></kwikui-input-otp-multiple>\n </div>\n</div>\n", styles: ["#mode-multiple{display:flex;flex-direction:column;align-content:center;align-items:stretch}tui-primitive-textfield ::ng-deep .t-input{padding-top:0!important}tui-primitive-textfield{text-align:center}tui-primitive-textfield.size_s{width:var(--tui-height-s)!important}tui-primitive-textfield.size_m{width:var(--tui-height-m)!important}tui-primitive-textfield.size_l{width:var(--tui-height-l)!important}\n"], components: [{ type: i1.TuiInputPhoneComponent, selector: "tui-input-phone", inputs: ["countryCode", "phoneMaskAfterCountryCode", "allowText", "search"], outputs: ["searchChange"] }, { type: i2.TuiTextfieldComponent, selector: "input[tuiTextfield], textarea[tuiTextfield]" }, { type: i3.KwikUIInputOtpMultipleComponent, selector: "kwikui-input-otp-multiple", inputs: ["config", "disabled", "formCtrl", "invalid", "readOnly"], outputs: ["onInputChange"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.TuiInputPhoneDirective, selector: "tui-input-phone" }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputOtpComponent, decorators: [{ type: Component, args: [{ selector: "kwikui-input-otp", templateUrl: "./input-otp.component.html", styleUrls: ["./input-otp.component.scss"], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((() => KwikUIInputOtpComponent)), multi: true } ] }] }], ctorParameters: function () { return []; }, propDecorators: { disabled: [{ type: Input }], focus: [{ type: Input }], formControl: [{ type: Input }], formControlName: [{ type: Input }], id: [{ type: Input }], invalid: [{ type: Input }], label: [{ type: Input }], mask: [{ type: Input }], mode: [{ type: Input }], otpLength: [{ type: Input }], placeholder: [{ type: Input }], postfix: [{ type: Input }], prefix: [{ type: Input }], properties: [{ type: Input }], size: [{ type: Input }], validators: [{ type: Input }], getKeyValue: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtb3RwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWt1aS9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tL2lucHV0LW90cC9pbnB1dC1vdHAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa3VpL3NyYy9saWIvY29tcG9uZW50cy9jdXN0b20vaW5wdXQtb3RwL2lucHV0LW90cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsRUFDbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBY3RELE1BQU0sT0FBTyx1QkFBdUI7SUFzRGxDO1FBcERTLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUVkLGdCQUFXLEdBQWdCLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRS9DLG9CQUFlLEdBQUcsbUJBQW1CLENBQUM7UUFFdEMsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUVSLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFaEIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLFNBQUksR0FBRyxTQUFTLENBQUM7UUFFakIsU0FBSSxHQUEwQixRQUFRLENBQUM7UUFFdkMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUVkLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBRWpCLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFF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ZCxLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJrd2lrdWktaW5wdXQtb3RwXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vaW5wdXQtb3RwLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9pbnB1dC1vdHAuY29tcG9uZW50LnNjc3NcIl0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gS3dpa1VJSW5wdXRPdHBDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgS3dpa1VJSW5wdXRPdHBDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGZvY3VzID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKHt9KTtcblxuICBASW5wdXQoKSBmb3JtQ29udHJvbE5hbWUgPSBcImZvcm1fY29udHJvbF9uYW1lXCI7XG5cbiAgQElucHV0KCkgaWQgPSBcIlwiO1xuXG4gIEBJbnB1dCgpIGludmFsaWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSBsYWJlbCA9IFwiXCI7XG5cbiAgQElucHV0KCkgbWFzayA9IFwiIyAjICMgI1wiO1xuXG4gIEBJbnB1dCgpIG1vZGU6IFwic2luZ2xlXCIgfCBcIm11bHRpcGxlXCIgPSBcInNpbmdsZVwiO1xuXG4gIEBJbnB1dCgpIG90cExlbmd0aCA9IDQ7XG5cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSBcIlwiO1xuXG4gIEBJbnB1dCgpIHBvc3RmaXggPSBcIlwiO1xuXG4gIEBJbnB1dCgpIHByZWZpeCA9IFwiXCI7XG5cbiAgQElucHV0KCkgcHJvcGVydGllcyA9IHsgcmVhZE9ubHk6IGZhbHNlLCBoaWRlUGxhY2Vob2xkZXI6IGZhbHNlIH07XG5cbiAgQElucHV0KCkgc2l6ZTogXCJzXCIgfCBcIm1cIiB8IFwibFwiID0gXCJtXCI7XG5cbiAgQElucHV0KCkgdmFsaWRhdG9ycyA9IHsgcmVxdWlyZWQ6IHRydWUgfTtcblxuICBAT3V0cHV0KCkgZ2V0S2V5VmFsdWU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcblxuICBvdHBNdWx0aXBsZUNvbmZpZyA9IHtcbiAgICBhbGxvd0tleUNvZGVzOiBbXSxcbiAgICBhbGxvd051bWJlcnNPbmx5OiB0cnVlLFxuICAgIGNvbnRhaW5lckNsYXNzOiBcIlwiLFxuICAgIGNvbnRhaW5lclN0eWxlczoge30sXG4gICAgZGlzYWJsZUF1dG9Gb2N1czogdHJ1ZSxcbiAgICBpbnB1dENsYXNzOiBcIlwiLFxuICAgIGlucHV0U3R5bGVzOiB7fSxcbiAgICBpc1Bhc3N3b3JkSW5wdXQ6IGZhbHNlLFxuICAgIGxlbmd0aDogdGhpcy5vdHBMZW5ndGgsXG4gICAgcGxhY2Vob2xkZXI6IFwiXCIsXG4gICAgc2l6ZTogdGhpcy5zaXplXG4gIH07XG5cbiAgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuYWRkQ29udHJvbCh0aGlzLmZvcm1Db250cm9sTmFtZSwgdGhpcy5mb3JtQ29udHJvbCk7XG4gICAgdGhpcy5mb2N1cyA9IHRoaXMuZm9jdXMgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdGhpcy5mb2N1cztcbiAgICB0aGlzLmludmFsaWQgPVxuICAgICAgdGhpcy5pbnZhbGlkID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMuaW52YWxpZCAmJiB0aGlzLmZvY3VzO1xuICAgIHRoaXMudmFsaWRhdG9ycyA9IHsgLi4udGhpcy52YWxpZGF0b3JzIH07XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0geyAuLi50aGlzLnByb3BlcnRpZXMgfTtcbiAgICB0aGlzLm1vZGUgPVxuICAgICAgdGhpcy5tb2RlICE9PSBcInNpbmdsZVwiICYmIHRoaXMubW9kZSAhPT0gXCJtdWx0aXBsZVwiXG4gICAgICAgID8gXCJtdWx0aXBsZVwiXG4gICAgICAgIDogdGhpcy5tb2RlO1xuICAgIHRoaXMub3RwTXVsdGlwbGVDb25maWcgPSB7XG4gICAgICAuLi50aGlzLm90cE11bHRpcGxlQ29uZmlnLFxuICAgICAgbGVuZ3RoOiB0aGlzLm90cExlbmd0aCxcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnByb3BlcnRpZXMuaGlkZVBsYWNlaG9sZGVyXG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IHRoaXMucGxhY2Vob2xkZXIubGVuZ3RoID4gMFxuICAgICAgICAgID8gXCIwXCJcbiAgICAgICAgICA6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICBzaXplOiB0aGlzLnNpemVcbiAgICB9O1xuICAgIHRoaXMuc2V0RGlzYWJsZWQoKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZvcm1Db250cm9sTmFtZV0udmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpIC8vIG1ha2VzIHN1cmUgdGhlIHZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5oYW5kbGVJbnB1dFZhbHVlQ2hhbmdlKHZhbHVlKSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoXCJmb3JtQ29udHJvbFwiKSAmJlxuICAgICAgIWNoYW5nZXMuZm9ybUNvbnRyb2wuZmlyc3RDaGFuZ2VcbiAgICApIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPSBjaGFuZ2VzLmZvcm1Db250cm9sLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoXCJpbnZhbGlkXCIpICYmICFjaGFuZ2VzLmludmFsaWQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IEJvb2xlYW4oY2hhbmdlcy5pbnZhbGlkLmN1cnJlbnRWYWx1ZSk7XG4gICAgICB0aGlzLnNldEVycm9yKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KFwiZm9jdXNcIikgJiYgIWNoYW5nZXMuZm9jdXMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuZm9jdXMgPSBCb29sZWFuKGNoYW5nZXMuZm9jdXMuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoXCJmb2N1c1wiKSAmJiAhY2hhbmdlcy5mb2N1cy5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5mb2N1cyA9IEJvb2xlYW4oY2hhbmdlcy5mb2N1cy5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShcInNpemVcIikgJiYgIWNoYW5nZXMuc2l6ZS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5zaXplID0gY2hhbmdlcy5zaXplLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoXCJkaXNhYmxlZFwiKSAmJiAhY2hhbmdlcy5kaXNhYmxlZC5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IEJvb2xlYW4oY2hhbmdlcy5kaXNhYmxlZC5jdXJyZW50VmFsdWUpO1xuICAgICAgdGhpcy5zZXREaXNhYmxlZCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIC8vIGVuc3VyZSB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgdGhlIHN1YnNjcmlwdGlvbiBpcyBhbHNvIGFuZCBub3QgbGVmdCBvcGVuLlxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHVwZGF0aW5nIHRoZSBjb25maWcgb2JqZWN0IHdpdGggdGhlIGxhdGVzdCB2YWx1ZXMgZm9yIG11bHRpcGxlIG1vZGVcbiAgICovXG4gIHNldENvbmZpZ1Byb3BlcnRpZXMoKSB7XG4gICAgdGhpcy5vdHBNdWx0aXBsZUNvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMub3RwTXVsdGlwbGVDb25maWcsXG4gICAgICBsZW5ndGg6IHRoaXMub3RwTGVuZ3RoLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIubGVuZ3RoID4gMCA/IFwiMFwiIDogdGhpcy5wbGFjZWhvbGRlcixcbiAgICAgIHNpemU6IHRoaXMuc2l6ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc2V0dGluZyB1cCBvZiBlcnJvciBhbmQgZm9jdXMgb24gdGhlIGlucHV0IGZpZWxkIGlzIGl0IGlzIGludmFsaWRcbiAgICovXG4gIHNldERpc2FibGVkKCkge1xuICAgIGlmICh0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZvcm1Db250cm9sTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLmRpc2FibGUoe1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZvcm1Db250cm9sTmFtZV0uZW5hYmxlKHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzZXR0aW5nIHVwIG9mIGVycm9yIGFuZCBmb2N1cyBvbiB0aGUgaW5wdXQgZmllbGQgaXMgaXQgaXMgaW52YWxpZFxuICAgKi9cbiAgc2V0RXJyb3IoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXS5pbnZhbGlkXG4gICAgKSB7XG4gICAgICB0aGlzLmludmFsaWQgPSB0cnVlO1xuICAgICAgdGhpcy5mb2N1cyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IGZhbHNlO1xuICAgICAgdGhpcy5mb2N1cyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBmaXJpbmcgb2YgMiBldmVudHMgb24gKGtleXVwKSBldmVudFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIGhhbmRsZUlucHV0VmFsdWVDaGFuZ2UodmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSAmJiB0aGlzLm1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KHRoaXMuZ2V0S2V5VmFsdWUsIHtcbiAgICAgICAga2V5OiB0aGlzLmZvcm1Db250cm9sTmFtZSxcbiAgICAgICAgdmFsdWU6IHRoaXMuZm9ybUNvbnRyb2wudmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUlucHV0VmFsdWVDaGFuZ2VNdWx0aXBsZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5lbWl0RXZlbnQodGhpcy5nZXRLZXlWYWx1ZSwge1xuICAgICAgICBrZXk6IHRoaXMuZm9ybUNvbnRyb2xOYW1lLFxuICAgICAgICB2YWx1ZTogdGhpcy5mb3JtQ29udHJvbC52YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRm9jdXNlZENoYW5nZShlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuaW52YWxpZCkge1xuICAgICAgdGhpcy5mb2N1cyA9IGU7XG4gICAgfVxuICB9XG5cbiAgZW1pdEV2ZW50KGV2ZW50OiBhbnksIGRhdGE6IGFueSkge1xuICAgIGV2ZW50LmVtaXQoZGF0YSk7XG4gIH1cblxuICAvKiogTWV0aG9kIEltcGxlbWVudGF0aW9ucyBmb3IgQWJzdHJhY3QgQ29udHJvbCAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHt9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7fVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHt9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge31cbn1cbiIsIjxkaXZcbiAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICAqbmdJZj1cIm1vZGUgPT09ICdzaW5nbGUnXCJcbiAgaWQ9XCJtb2RlLXNpbmdsZVwiXG4+XG4gIDx0dWktaW5wdXQtcGhvbmVcbiAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZvcm1Db250cm9sTmFtZVwiXG4gICAgW2NvdW50cnlDb2RlXT1cIicnXCJcbiAgICBbcGhvbmVNYXNrQWZ0ZXJDb3VudHJ5Q29kZV09XCJtYXNrXCJcbiAgICBbbmF0aXZlSWRdPVwiaWRcIlxuICAgIFtwc2V1ZG9JbnZhbGlkXT1cImludmFsaWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBpbnZhbGlkXCJcbiAgICBbcHNldWRvRm9jdXNdPVwiZm9jdXMgPz8gbnVsbFwiXG4gICAgW3JlYWRPbmx5XT1cInByb3BlcnRpZXM/LnJlYWRPbmx5ID8/IGZhbHNlXCJcbiAgICAoZm9jdXNlZENoYW5nZSk9XCJoYW5kbGVGb2N1c2VkQ2hhbmdlKCRldmVudClcIlxuICA+XG4gICAge3sgbGFiZWwgfX1cbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJ0dWktcmVxdWlyZWRcIlxuICAgICAgKm5nSWY9XCJ2YWxpZGF0b3JzLnJlcXVpcmVkXCJcbiAgICA+PC9zcGFuPlxuICAgIDxpbnB1dFxuICAgICAgdHVpVGV4dGZpZWxkXG4gICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyID8/ICcnXCJcbiAgICAgIFthdHRyLnJlcXVpcmVkXT1cInZhbGlkYXRvcnMucmVxdWlyZWRcIlxuICAgIC8+XG4gIDwvdHVpLWlucHV0LXBob25lPlxuPC9kaXY+XG48ZGl2XG4gIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgKm5nSWY9XCJtb2RlID09PSAnbXVsdGlwbGUnXCJcbiAgaWQ9XCJtb2RlLW11bHRpcGxlXCJcbj5cbiAgPGRpdlxuICAgIGlkPVwibW9kZS1tdWx0aXBsZS1sYWJlbFwiXG4gICAgKm5nSWY9XCJsYWJlbCAhPT0gJydcIlxuICA+XG4gICAgPHNwYW4gY2xhc3M9XCJ0LWxhYmVsXCI+XG4gICAgICA8Yj5cbiAgICAgICAgPHAgY2xhc3M9XCJ0dWktc3BhY2VfYm90dG9tLTEgdHVpLXNwYWNlX2xlZnQtMSBuZy1zdGFyLWluc2VydGVkXCI+XG4gICAgICAgICAge3sgbGFiZWwgfX1cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktcmVxdWlyZWRcIlxuICAgICAgICAgICAgKm5nSWY9XCJ2YWxpZGF0b3JzLnJlcXVpcmVkXCJcbiAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICA8L2I+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBpZD1cIm1vZGUtbXVsdGlwbGUtaW5wdXRzXCI+XG4gICAgPGt3aWt1aS1pbnB1dC1vdHAtbXVsdGlwbGVcbiAgICAgIFtmb3JtQ3RybF09XCJmb3JtQ29udHJvbFwiXG4gICAgICBbY29uZmlnXT1cIm90cE11bHRpcGxlQ29uZmlnXCJcbiAgICAgIFtpbnZhbGlkXT1cImludmFsaWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBpbnZhbGlkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbcmVhZE9ubHldPVwicHJvcGVydGllcz8ucmVhZE9ubHkgPz8gZmFsc2VcIlxuICAgICAgKG9uSW5wdXRDaGFuZ2UpPVwiaGFuZGxlSW5wdXRWYWx1ZUNoYW5nZU11bHRpcGxlKCRldmVudClcIlxuICAgID48L2t3aWt1aS1pbnB1dC1vdHAtbXVsdGlwbGU+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=