kwikui
Version:
KwikID's UI Component Library in Angular
208 lines • 29.7 kB
JavaScript
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 { throwErrorMessage } from "../../../../helpers/kwikui.common.helpers";
import { DEFAULT_VALUES, VALIDATE_KEY_VALUES } from "./input-phone.constants";
import { isValidKeyValue } from "./input-phone.validation";
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/kit";
import * as i2 from "@taiga-ui/core";
import * as i3 from "@angular/forms";
import * as i4 from "@angular/common";
export class KwikUIInputPhoneComponent {
constructor() {
this.countryCode = DEFAULT_VALUES.countryCode;
this.disabled = DEFAULT_VALUES.disabled;
this.focus = DEFAULT_VALUES.focus;
this.formControl = new FormControl({});
this.formControlName = DEFAULT_VALUES.formControlName;
this.hintContent = DEFAULT_VALUES.hintContent;
this.icon = DEFAULT_VALUES.icon;
this.id = DEFAULT_VALUES.id;
this.invalid = DEFAULT_VALUES.invalid;
this.isShowLabelOutside = DEFAULT_VALUES.isShowLabelOutside;
this.label = DEFAULT_VALUES.label;
this.phoneMaskAfterCountryCode = DEFAULT_VALUES.phoneMaskAfterCountryCode;
this.placeholder = DEFAULT_VALUES.placeholder;
this.postfix = DEFAULT_VALUES.postfix;
this.prefix = DEFAULT_VALUES.prefix;
this.properties = { readOnly: false };
this.removeCountryCodeFromValue = DEFAULT_VALUES.removeCountryCodeFromValue;
this.size = DEFAULT_VALUES.size;
this.validators = { required: true };
this.getKeyValue = new EventEmitter();
this.formGroup = new FormGroup({});
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.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) {
const verifyChange = (key) => {
return changes.hasOwnProperty(key) && !changes[key].firstChange;
};
for (const change of Object.entries(changes)) {
const key = change[0];
const value = change[1].currentValue;
this.validateInputProperty(key, value);
}
if (verifyChange("formControl")) {
this.formControl = changes.formControl.currentValue;
}
if (verifyChange("invalid")) {
this.invalid = Boolean(changes.invalid.currentValue);
this.setError();
}
if (verifyChange("isShowLabelOutside")) {
this.isShowLabelOutside = Boolean(changes.isShowLabelOutside.currentValue);
}
if (verifyChange("focus")) {
this.focus = Boolean(changes.focus.currentValue);
}
if (verifyChange("disabled")) {
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.
}
validateInputProperty(key, value) {
if (VALIDATE_KEY_VALUES[key] && !isValidKeyValue(key, value)) {
this[key] = DEFAULT_VALUES[key];
throwErrorMessage("kwikui-input-phone", this.id, key, value, DEFAULT_VALUES[key]);
}
}
/**
* @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.emitEvent(this.getKeyValue, {
key: this.formControlName,
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 */ KwikUIInputPhoneComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputPhoneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ KwikUIInputPhoneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikUIInputPhoneComponent, selector: "kwikui-input-phone", inputs: { countryCode: "countryCode", disabled: "disabled", focus: "focus", formControl: "formControl", formControlName: "formControlName", hintContent: "hintContent", icon: "icon", id: "id", invalid: "invalid", isShowLabelOutside: "isShowLabelOutside", label: "label", phoneMaskAfterCountryCode: "phoneMaskAfterCountryCode", placeholder: "placeholder", postfix: "postfix", prefix: "prefix", properties: "properties", removeCountryCodeFromValue: "removeCountryCodeFromValue", size: "size", validators: "validators" }, outputs: { getKeyValue: "getKeyValue" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((() => KwikUIInputPhoneComponent)),
multi: true
}
], usesOnChanges: true, ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n <p\n *ngIf=\"isShowLabelOutside\"\n class=\"tui-space_bottom-2\"\n >\n <b>\n {{ label }}\n <span *ngIf=\"validators.required\">*</span>\n </b>\n </p>\n <tui-input-phone\n [countryCode]=\"removeCountryCodeFromValue ? '' : countryCode\"\n [formControlName]=\"formControlName\"\n [nativeId]=\"id\"\n [phoneMaskAfterCountryCode]=\"phoneMaskAfterCountryCode\"\n [pseudoFocus]=\"focus ?? null\"\n [pseudoInvalid]=\"invalid === undefined ? null : invalid\"\n [readOnly]=\"properties?.readOnly ?? false\"\n [tuiHintContent]=\"hintContent\"\n [tuiTextfieldCleaner]=\"true\"\n [tuiTextfieldLabelOutside]=\"isShowLabelOutside\"\n [tuiTextfieldIconLeft]=\"icon\"\n [tuiTextfieldPrefix]=\"removeCountryCodeFromValue ? countryCode : ''\"\n [tuiTextfieldSize]=\"size\"\n (focusedChange)=\"handleFocusedChange($event)\"\n >\n <div *ngIf=\"!isShowLabelOutside\">\n {{ label }}\n <span\n class=\"tui-required\"\n *ngIf=\"validators.required\"\n ></span>\n </div>\n <div *ngIf=\"isShowLabelOutside\">\n {{ placeholder }}\n </div>\n <input\n tuiTextfield\n type=\"tel\"\n inputmode=\"tel\"\n [attr.placeholder]=\"placeholder ?? ''\"\n [attr.required]=\"validators.required\"\n />\n </tui-input-phone>\n</div>\n", styles: [""], components: [{ type: i1.TuiInputPhoneComponent, selector: "tui-input-phone", inputs: ["countryCode", "phoneMaskAfterCountryCode", "allowText", "search"], outputs: ["searchChange"] }, { type: i2.TuiTextfieldComponent, selector: "input[tuiTextfield], textarea[tuiTextfield]" }], directives: [{ type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.TuiInputPhoneDirective, selector: "tui-input-phone" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.TuiHintOptionsDirective, selector: "[tuiHintContent]", inputs: ["tuiHintContent", "tuiHintDirection", "tuiHintAppearance", "tuiHintShowDelay", "tuiHintHideDelay"] }, { type: i2.TuiTextfieldCleanerDirective, selector: "[tuiTextfieldCleaner]", inputs: ["tuiTextfieldCleaner"] }, { type: i2.TuiTextfieldLabelOutsideDirective, selector: "[tuiTextfieldLabelOutside]", inputs: ["tuiTextfieldLabelOutside"] }, { type: i2.TuiTextfieldIconLeftDirective, selector: "[tuiTextfieldIconLeft]", inputs: ["tuiTextfieldIconLeft"] }, { type: i2.TuiTextfieldPrefixDirective, selector: "[tuiTextfieldPrefix]", inputs: ["tuiTextfieldPrefix"] }, { type: i2.TuiTextfieldSizeDirective, selector: "[tuiTextfieldSize]", inputs: ["tuiTextfieldSize"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputPhoneComponent, decorators: [{
type: Component,
args: [{
selector: "kwikui-input-phone",
templateUrl: "./input-phone.component.html",
styleUrls: ["./input-phone.component.scss"],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((() => KwikUIInputPhoneComponent)),
multi: true
}
]
}]
}], ctorParameters: function () { return []; }, propDecorators: { countryCode: [{
type: Input
}], disabled: [{
type: Input
}], focus: [{
type: Input
}], formControl: [{
type: Input
}], formControlName: [{
type: Input
}], hintContent: [{
type: Input
}], icon: [{
type: Input
}], id: [{
type: Input
}], invalid: [{
type: Input
}], isShowLabelOutside: [{
type: Input
}], label: [{
type: Input
}], phoneMaskAfterCountryCode: [{
type: Input
}], placeholder: [{
type: Input
}], postfix: [{
type: Input
}], prefix: [{
type: Input
}], properties: [{
type: Input
}], removeCountryCodeFromValue: [{
type: Input
}], size: [{
type: Input
}], validators: [{
type: Input
}], getKeyValue: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtcGhvbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa3VpL3NyYy9saWIvY29tcG9uZW50cy9jb3JlL2lucHV0cy9pbnB1dC1waG9uZS9pbnB1dC1waG9uZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lrdWkvc3JjL2xpYi9jb21wb25lbnRzL2NvcmUvaW5wdXRzL2lucHV0LXBob25lL2lucHV0LXBob25lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBR0wsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7O0FBYzNELE1BQU0sT0FBTyx5QkFBeUI7SUFnRHBDO1FBOUNTLGdCQUFXLEdBQVcsY0FBYyxDQUFDLFdBQVcsQ0FBQztRQUVqRCxhQUFRLEdBQVksY0FBYyxDQUFDLFFBQVEsQ0FBQztRQUU1QyxVQUFLLEdBQVksY0FBYyxDQUFDLEtBQUssQ0FBQztRQUV0QyxnQkFBVyxHQUFnQixJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUvQyxvQkFBZSxH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SztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsRUFBRTtzQkFBVixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBR0csSUFBSTtzQkFBWixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyB0aHJvd0Vycm9yTWVzc2FnZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9oZWxwZXJzL2t3aWt1aS5jb21tb24uaGVscGVyc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9WQUxVRVMsIFZBTElEQVRFX0tFWV9WQUxVRVMgfSBmcm9tIFwiLi9pbnB1dC1waG9uZS5jb25zdGFudHNcIjtcbmltcG9ydCB7IFRLd2lrVUlJbnB1dFBob25lU2l6ZSB9IGZyb20gXCIuL2lucHV0LXBob25lLmRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBpc1ZhbGlkS2V5VmFsdWUgfSBmcm9tIFwiLi9pbnB1dC1waG9uZS52YWxpZGF0aW9uXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJrd2lrdWktaW5wdXQtcGhvbmVcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9pbnB1dC1waG9uZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vaW5wdXQtcGhvbmUuY29tcG9uZW50LnNjc3NcIl0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gS3dpa1VJSW5wdXRQaG9uZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBLd2lrVUlJbnB1dFBob25lQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgY291bnRyeUNvZGU6IHN0cmluZyA9IERFRkFVTFRfVkFMVUVTLmNvdW50cnlDb2RlO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gREVGQVVMVF9WQUxVRVMuZGlzYWJsZWQ7XG5cbiAgQElucHV0KCkgZm9jdXM6IGJvb2xlYW4gPSBERUZBVUxUX1ZBTFVFUy5mb2N1cztcblxuICBASW5wdXQoKSBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woe30pO1xuXG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMuZm9ybUNvbnRyb2xOYW1lO1xuXG4gIEBJbnB1dCgpIGhpbnRDb250ZW50OiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5oaW50Q29udGVudDtcblxuICBASW5wdXQoKSBpY29uOiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5pY29uO1xuXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5pZDtcblxuICBASW5wdXQoKSBpbnZhbGlkOiBib29sZWFuID0gREVGQVVMVF9WQUxVRVMuaW52YWxpZDtcblxuICBASW5wdXQoKSBpc1Nob3dMYWJlbE91dHNpZGU6IGJvb2xlYW4gPSBERUZBVUxUX1ZBTFVFUy5pc1Nob3dMYWJlbE91dHNpZGU7XG5cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9IERFRkFVTFRfVkFMVUVTLmxhYmVsO1xuXG4gIEBJbnB1dCgpIHBob25lTWFza0FmdGVyQ291bnRyeUNvZGU6IHN0cmluZyA9XG4gICAgREVGQVVMVF9WQUxVRVMucGhvbmVNYXNrQWZ0ZXJDb3VudHJ5Q29kZTtcblxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMucGxhY2Vob2xkZXI7XG5cbiAgQElucHV0KCkgcG9zdGZpeDogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMucG9zdGZpeDtcblxuICBASW5wdXQoKSBwcmVmaXg6IHN0cmluZyA9IERFRkFVTFRfVkFMVUVTLnByZWZpeDtcblxuICBASW5wdXQoKSBwcm9wZXJ0aWVzID0geyByZWFkT25seTogZmFsc2UgfTtcblxuICBASW5wdXQoKSByZW1vdmVDb3VudHJ5Q29kZUZyb21WYWx1ZTogYm9vbGVhbiA9XG4gICAgREVGQVVMVF9WQUxVRVMucmVtb3ZlQ291bnRyeUNvZGVGcm9tVmFsdWU7XG5cbiAgQElucHV0KCkgc2l6ZTogVEt3aWtVSUlucHV0UGhvbmVTaXplID0gREVGQVVMVF9WQUxVRVMuc2l6ZTtcblxuICBASW5wdXQoKSB2YWxpZGF0b3JzID0geyByZXF1aXJlZDogdHJ1ZSB9O1xuXG4gIEBPdXRwdXQoKSBnZXRLZXlWYWx1ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBmb3JtR3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLmFkZENvbnRyb2wodGhpcy5mb3JtQ29udHJvbE5hbWUsIHRoaXMuZm9ybUNvbnRyb2wpO1xuICAgIHRoaXMuZm9jdXMgPSB0aGlzLmZvY3VzID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMuZm9jdXM7XG4gICAgdGhpcy5pbnZhbGlkID1cbiAgICAgIHRoaXMuaW52YWxpZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLmludmFsaWQgJiYgdGhpcy5mb2N1cztcbiAgICB0aGlzLnZhbGlkYXRvcnMgPSB7IC4uLnRoaXMudmFsaWRhdG9ycyB9O1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4udGhpcy5wcm9wZXJ0aWVzIH07XG4gICAgdGhpcy5zZXREaXNhYmxlZCgpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSkgLy8gbWFrZXMgc3VyZSB0aGUgdmFsdWUgaGFzIGFjdHVhbGx5IGNoYW5nZWQuXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLmhhbmRsZUlucHV0VmFsdWVDaGFuZ2UodmFsdWUpKVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgdmVyaWZ5Q2hhbmdlID0gKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFjaGFuZ2VzW2tleV0uZmlyc3RDaGFuZ2U7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIE9iamVjdC5lbnRyaWVzKGNoYW5nZXMpKSB7XG4gICAgICBjb25zdCBrZXk6IHN0cmluZyA9IGNoYW5nZVswXTtcbiAgICAgIGNvbnN0IHZhbHVlOiBhbnkgPSBjaGFuZ2VbMV0uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy52YWxpZGF0ZUlucHV0UHJvcGVydHkoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvcm1Db250cm9sXCIpKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sID0gY2hhbmdlcy5mb3JtQ29udHJvbC5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJpbnZhbGlkXCIpKSB7XG4gICAgICB0aGlzLmludmFsaWQgPSBCb29sZWFuKGNoYW5nZXMuaW52YWxpZC5jdXJyZW50VmFsdWUpO1xuICAgICAgdGhpcy5zZXRFcnJvcigpO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiaXNTaG93TGFiZWxPdXRzaWRlXCIpKSB7XG4gICAgICB0aGlzLmlzU2hvd0xhYmVsT3V0c2lkZSA9IEJvb2xlYW4oY2hhbmdlcy5pc1Nob3dMYWJlbE91dHNpZGUuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvY3VzXCIpKSB7XG4gICAgICB0aGlzLmZvY3VzID0gQm9vbGVhbihjaGFuZ2VzLmZvY3VzLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJkaXNhYmxlZFwiKSkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IEJvb2xlYW4oY2hhbmdlcy5kaXNhYmxlZC5jdXJyZW50VmFsdWUpO1xuICAgICAgdGhpcy5zZXREaXNhYmxlZCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIC8vIGVuc3VyZSB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgdGhlIHN1YnNjcmlwdGlvbiBpcyBhbHNvIGFuZCBub3QgbGVmdCBvcGVuLlxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUlucHV0UHJvcGVydHkoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoVkFMSURBVEVfS0VZX1ZBTFVFU1trZXldICYmICFpc1ZhbGlkS2V5VmFsdWUoa2V5LCB2YWx1ZSkpIHtcbiAgICAgIHRoaXNba2V5XSA9IERFRkFVTFRfVkFMVUVTW2tleV07XG4gICAgICB0aHJvd0Vycm9yTWVzc2FnZShcbiAgICAgICAgXCJrd2lrdWktaW5wdXQtcGhvbmVcIixcbiAgICAgICAgdGhpcy5pZCxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgREVGQVVMVF9WQUxVRVNba2V5XVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc2V0dGluZyB1cCBvZiBlcnJvciBhbmQgZm9jdXMgb24gdGhlIGlucHV0IGZpZWxkIGlzIGl0IGlzIGludmFsaWRcbiAgICovXG4gIHNldERpc2FibGVkKCkge1xuICAgIGlmICh0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZvcm1Db250cm9sTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLmRpc2FibGUoe1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZvcm1Db250cm9sTmFtZV0uZW5hYmxlKHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzZXR0aW5nIHVwIG9mIGVycm9yIGFuZCBmb2N1cyBvbiB0aGUgaW5wdXQgZmllbGQgaXMgaXQgaXMgaW52YWxpZFxuICAgKi9cbiAgc2V0RXJyb3IoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXS5pbnZhbGlkXG4gICAgKSB7XG4gICAgICB0aGlzLmludmFsaWQgPSB0cnVlO1xuICAgICAgdGhpcy5mb2N1cyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IGZhbHNlO1xuICAgICAgdGhpcy5mb2N1cyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBmaXJpbmcgb2YgMiBldmVudHMgb24gKGtleXVwKSBldmVudFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIGhhbmRsZUlucHV0VmFsdWVDaGFuZ2UodmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQodGhpcy5nZXRLZXlWYWx1ZSwge1xuICAgICAgICBrZXk6IHRoaXMuZm9ybUNvbnRyb2xOYW1lLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRm9jdXNlZENoYW5nZShlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuaW52YWxpZCkge1xuICAgICAgdGhpcy5mb2N1cyA9IGU7XG4gICAgfVxuICB9XG5cbiAgZW1pdEV2ZW50KGV2ZW50OiBhbnksIGRhdGE6IGFueSkge1xuICAgIGV2ZW50LmVtaXQoZGF0YSk7XG4gIH1cblxuICAvKiogTWV0aG9kIEltcGxlbWVudGF0aW9ucyBmb3IgQWJzdHJhY3QgQ29udHJvbCAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHt9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7fVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHt9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge31cbn1cbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cbiAgPHBcbiAgICAqbmdJZj1cImlzU2hvd0xhYmVsT3V0c2lkZVwiXG4gICAgY2xhc3M9XCJ0dWktc3BhY2VfYm90dG9tLTJcIlxuICA+XG4gICAgPGI+XG4gICAgICB7eyBsYWJlbCB9fVxuICAgICAgPHNwYW4gKm5nSWY9XCJ2YWxpZGF0b3JzLnJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICA8L2I+XG4gIDwvcD5cbiAgPHR1aS1pbnB1dC1waG9uZVxuICAgIFtjb3VudHJ5Q29kZV09XCJyZW1vdmVDb3VudHJ5Q29kZUZyb21WYWx1ZSA/ICcnIDogY291bnRyeUNvZGVcIlxuICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZm9ybUNvbnRyb2xOYW1lXCJcbiAgICBbbmF0aXZlSWRdPVwiaWRcIlxuICAgIFtwaG9uZU1hc2tBZnRlckNvdW50cnlDb2RlXT1cInBob25lTWFza0FmdGVyQ291bnRyeUNvZGVcIlxuICAgIFtwc2V1ZG9Gb2N1c109XCJmb2N1cyA/PyBudWxsXCJcbiAgICBbcHNldWRvSW52YWxpZF09XCJpbnZhbGlkID09PSB1bmRlZmluZWQgPyBudWxsIDogaW52YWxpZFwiXG4gICAgW3JlYWRPbmx5XT1cInByb3BlcnRpZXM/LnJlYWRPbmx5ID8/IGZhbHNlXCJcbiAgICBbdHVpSGludENvbnRlbnRdPVwiaGludENvbnRlbnRcIlxuICAgIFt0dWlUZXh0ZmllbGRDbGVhbmVyXT1cInRydWVcIlxuICAgIFt0dWlUZXh0ZmllbGRMYWJlbE91dHNpZGVdPVwiaXNTaG93TGFiZWxPdXRzaWRlXCJcbiAgICBbdHVpVGV4dGZpZWxkSWNvbkxlZnRdPVwiaWNvblwiXG4gICAgW3R1aVRleHRmaWVsZFByZWZpeF09XCJyZW1vdmVDb3VudHJ5Q29kZUZyb21WYWx1ZSA/IGNvdW50cnlDb2RlIDogJydcIlxuICAgIFt0dWlUZXh0ZmllbGRTaXplXT1cInNpemVcIlxuICAgIChmb2N1c2VkQ2hhbmdlKT1cImhhbmRsZUZvY3VzZWRDaGFuZ2UoJGV2ZW50KVwiXG4gID5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzU2hvd0xhYmVsT3V0c2lkZVwiPlxuICAgICAge3sgbGFiZWwgfX1cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwidHVpLXJlcXVpcmVkXCJcbiAgICAgICAgKm5nSWY9XCJ2YWxpZGF0b3JzLnJlcXVpcmVkXCJcbiAgICAgID48L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImlzU2hvd0xhYmVsT3V0c2lkZVwiPlxuICAgICAge3sgcGxhY2Vob2xkZXIgfX1cbiAgICA8L2Rpdj5cbiAgICA8aW5wdXRcbiAgICAgIHR1aVRleHRmaWVsZFxuICAgICAgdHlwZT1cInRlbFwiXG4gICAgICBpbnB1dG1vZGU9XCJ0ZWxcIlxuICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgPz8gJydcIlxuICAgICAgW2F0dHIucmVxdWlyZWRdPVwidmFsaWRhdG9ycy5yZXF1aXJlZFwiXG4gICAgLz5cbiAgPC90dWktaW5wdXQtcGhvbmU+XG48L2Rpdj5cbiJdfQ==