UNPKG

@netgrif/components

Version:

Netgrif Application Engine frontend Angular components

44 lines 27.7 kB
import { Component, Inject, Optional } from "@angular/core"; import { AbstractChangePasswordComponent, NAE_MIN_PASSWORD_LENGTH } from '@netgrif/components-core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@netgrif/components-core"; import * as i3 from "@ngx-translate/core"; import * as i4 from "@angular/common"; import * as i5 from "@ngbracket/ngx-layout"; import * as i6 from "@angular/material/button"; import * as i7 from "@angular/material/icon"; import * as i8 from "@angular/material/input"; import * as i9 from "@angular/material/form-field"; import * as i10 from "@angular/material/progress-spinner"; export class ChangePasswordFormComponent extends AbstractChangePasswordComponent { _snackbar; streamChangePassword; constructor(formBuilder, profileService, user, log, translate, minPasswordLength, _snackbar) { super(formBuilder, profileService, user, log, translate, minPasswordLength); this._snackbar = _snackbar; this.streamChangePassword = this.changePassword.subscribe(message => { if (message.success) { this._snackbar.openSuccessSnackBar(message.success); } else { this._snackbar.openErrorSnackBar(message.error); } }); } ngOnDestroy() { this.streamChangePassword.unsubscribe(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChangePasswordFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ProfileService }, { token: i2.UserService }, { token: i2.LoggerService }, { token: i3.TranslateService }, { token: NAE_MIN_PASSWORD_LENGTH, optional: true }, { token: i2.SnackBarService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ChangePasswordFormComponent, selector: "nc-change-password-form", usesInheritance: true, ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutGap=\"24px\">\n <form [formGroup]=\"rootFormGroup\" (ngSubmit)=\"onSubmit()\" class=\"full-width netgrif-input\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"netgrif-input\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">vpn_key</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.changePassword.oldPassword' | translate }}</mat-label>\n <input matInput\n [type]=\"hideOldPassword ? 'password' : 'text'\"\n formControlName=\"oldPassword\" required autocomplete=\"old-password\">\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"hideOldPassword = !hideOldPassword\"\n (keypress)=\"false\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hideOldPassword\">\n <mat-icon\n [color]=\"hideOldPassword ? undefined : 'accent'\">{{hideOldPassword ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n <mat-error *ngIf=\"!isFieldValid('oldPassword')\">{{getErrorMessage('oldPassword')}}</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"netgrif-input\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">vpn_key</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.changePassword.enterNewPass' | translate }}</mat-label>\n <input matInput\n [type]=\"hidePassword ? 'password' : 'text'\"\n formControlName=\"password\" required autocomplete=\"new-password\">\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"hidePassword = !hidePassword\"\n (keypress)=\"false\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hidePassword\">\n <mat-icon\n [color]=\"hidePassword ? undefined : 'accent'\">{{hidePassword ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n <mat-error *ngIf=\"!isFieldValid('password')\">{{getErrorMessage('password')}}</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"netgrif-input\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">vpn_key</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.changePassword.repeatNewPass' | translate }}</mat-label>\n <input matInput\n [type]=\"hideRepeatPassword ? 'password' : 'text'\"\n formControlName=\"confirmPassword\" required autocomplete=\"new-password\">\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"hideRepeatPassword = !hideRepeatPassword\"\n (keypress)=\"false\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hideRepeatPassword\">\n <mat-icon\n [color]=\"hideRepeatPassword ? undefined : 'accent'\">{{hideRepeatPassword ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n <mat-error *ngIf=\"!isFieldValid('confirmPassword')\">{{getErrorMessage('confirmPassword')}}</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxLayoutAlign.xs=\"center\" class=\"margin-top-4\">\n <button fxFlexOffset=\"8px\" fxFlexOffset.xs=\"0\" [disabled]=\"loadingSubmit | async\" mat-raised-button class=\"register-button\" color=\"primary\">\n <mat-spinner *ngIf=\"loadingSubmit | async\"\n mode=\"indeterminate\"\n diameter=\"36\"\n color=\"accent\"\n fxFlex></mat-spinner>\n <span *ngIf=\"(loadingSubmit | async) === false\"\n fxFlex>{{ 'forms.changePassword.changePass' | translate }}</span>\n </button>\n </div>\n </form>\n</div>\n\n", styles: [".font-size-20{font-size:20px}.margin-top-4{margin-top:4px}.full-width{width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i5.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i5.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i5.DefaultFlexOffsetDirective, selector: " [fxFlexOffset], [fxFlexOffset.xs], [fxFlexOffset.sm], [fxFlexOffset.md], [fxFlexOffset.lg], [fxFlexOffset.xl], [fxFlexOffset.lt-sm], [fxFlexOffset.lt-md], [fxFlexOffset.lt-lg], [fxFlexOffset.lt-xl], [fxFlexOffset.gt-xs], [fxFlexOffset.gt-sm], [fxFlexOffset.gt-md], [fxFlexOffset.gt-lg]", inputs: ["fxFlexOffset", "fxFlexOffset.xs", "fxFlexOffset.sm", "fxFlexOffset.md", "fxFlexOffset.lg", "fxFlexOffset.xl", "fxFlexOffset.lt-sm", "fxFlexOffset.lt-md", "fxFlexOffset.lt-lg", "fxFlexOffset.lt-xl", "fxFlexOffset.gt-xs", "fxFlexOffset.gt-sm", "fxFlexOffset.gt-md", "fxFlexOffset.gt-lg"] }, { kind: "directive", type: i5.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChangePasswordFormComponent, decorators: [{ type: Component, args: [{ selector: 'nc-change-password-form', template: "<div fxLayout=\"column\" fxLayoutGap=\"24px\">\n <form [formGroup]=\"rootFormGroup\" (ngSubmit)=\"onSubmit()\" class=\"full-width netgrif-input\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"netgrif-input\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">vpn_key</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.changePassword.oldPassword' | translate }}</mat-label>\n <input matInput\n [type]=\"hideOldPassword ? 'password' : 'text'\"\n formControlName=\"oldPassword\" required autocomplete=\"old-password\">\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"hideOldPassword = !hideOldPassword\"\n (keypress)=\"false\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hideOldPassword\">\n <mat-icon\n [color]=\"hideOldPassword ? undefined : 'accent'\">{{hideOldPassword ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n <mat-error *ngIf=\"!isFieldValid('oldPassword')\">{{getErrorMessage('oldPassword')}}</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"netgrif-input\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">vpn_key</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.changePassword.enterNewPass' | translate }}</mat-label>\n <input matInput\n [type]=\"hidePassword ? 'password' : 'text'\"\n formControlName=\"password\" required autocomplete=\"new-password\">\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"hidePassword = !hidePassword\"\n (keypress)=\"false\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hidePassword\">\n <mat-icon\n [color]=\"hidePassword ? undefined : 'accent'\">{{hidePassword ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n <mat-error *ngIf=\"!isFieldValid('password')\">{{getErrorMessage('password')}}</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"netgrif-input\" >\n <mat-icon color=\"primary\" class=\"netgrif-icon-fix\">vpn_key</mat-icon>\n <mat-form-field fxFlex=\"100\" appearance=\"outline\">\n <mat-label>{{ 'forms.changePassword.repeatNewPass' | translate }}</mat-label>\n <input matInput\n [type]=\"hideRepeatPassword ? 'password' : 'text'\"\n formControlName=\"confirmPassword\" required autocomplete=\"new-password\">\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"hideRepeatPassword = !hideRepeatPassword\"\n (keypress)=\"false\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hideRepeatPassword\">\n <mat-icon\n [color]=\"hideRepeatPassword ? undefined : 'accent'\">{{hideRepeatPassword ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n <mat-error *ngIf=\"!isFieldValid('confirmPassword')\">{{getErrorMessage('confirmPassword')}}</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxLayoutAlign.xs=\"center\" class=\"margin-top-4\">\n <button fxFlexOffset=\"8px\" fxFlexOffset.xs=\"0\" [disabled]=\"loadingSubmit | async\" mat-raised-button class=\"register-button\" color=\"primary\">\n <mat-spinner *ngIf=\"loadingSubmit | async\"\n mode=\"indeterminate\"\n diameter=\"36\"\n color=\"accent\"\n fxFlex></mat-spinner>\n <span *ngIf=\"(loadingSubmit | async) === false\"\n fxFlex>{{ 'forms.changePassword.changePass' | translate }}</span>\n </button>\n </div>\n </form>\n</div>\n\n", styles: [".font-size-20{font-size:20px}.margin-top-4{margin-top:4px}.full-width{width:100%}\n"] }] }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ProfileService }, { type: i2.UserService }, { type: i2.LoggerService }, { type: i3.TranslateService }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_MIN_PASSWORD_LENGTH] }] }, { type: i2.SnackBarService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXBhc3N3b3JkLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzL3NyYy9saWIvZm9ybXMvY2hhbmdlLXBhc3N3b3JkL2NoYW5nZS1wYXNzd29yZC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2Zvcm1zL2NoYW5nZS1wYXNzd29yZC9jaGFuZ2UtcGFzc3dvcmQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBYSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUNILCtCQUErQixFQUsvQix1QkFBdUIsRUFDMUIsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBVWxDLE1BQU0sT0FBTywyQkFBNEIsU0FBUSwrQkFBK0I7SUFVdEQ7SUFSZixvQkFBb0IsQ0FBZTtJQUUxQyxZQUFZLFdBQXdCLEVBQ3hCLGNBQThCLEVBQzlCLElBQWlCLEVBQ2pCLEdBQWtCLEVBQ2xCLFNBQTJCLEVBQ2tCLGlCQUFpQixFQUNwRCxTQUEwQjtRQUM1QyxLQUFLLENBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRDFELGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBRTVDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNoRSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3ZEO2lCQUFNO2dCQUNILElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ25EO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBR0QsV0FBVztRQUNQLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1QyxDQUFDO3dHQXhCUSwyQkFBMkIsbUtBU0osdUJBQXVCOzRGQVQ5QywyQkFBMkIsc0ZDbEJ4QyxtOElBc0VBOzs0RkRwRGEsMkJBQTJCO2tCQUx2QyxTQUFTOytCQUNJLHlCQUF5Qjs7MEJBYXRCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBPcHRpb25hbH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDaGFuZ2VQYXNzd29yZENvbXBvbmVudCxcbiAgICBQcm9maWxlU2VydmljZSxcbiAgICBVc2VyU2VydmljZSxcbiAgICBMb2dnZXJTZXJ2aWNlLFxuICAgIFNuYWNrQmFyU2VydmljZSxcbiAgICBOQUVfTUlOX1BBU1NXT1JEX0xFTkdUSFxufSBmcm9tICdAbmV0Z3JpZi9jb21wb25lbnRzLWNvcmUnO1xuaW1wb3J0IHtGb3JtQnVpbGRlcn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYy1jaGFuZ2UtcGFzc3dvcmQtZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NoYW5nZS1wYXNzd29yZC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jaGFuZ2UtcGFzc3dvcmQtZm9ybS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENoYW5nZVBhc3N3b3JkRm9ybUNvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Q2hhbmdlUGFzc3dvcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgcHVibGljIHN0cmVhbUNoYW5nZVBhc3N3b3JkOiBTdWJzY3JpcHRpb247XG5cbiAgICBjb25zdHJ1Y3Rvcihmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgICAgICAgICAgICAgcHJvZmlsZVNlcnZpY2U6IFByb2ZpbGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHVzZXI6IFVzZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIGxvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfTUlOX1BBU1NXT1JEX0xFTkdUSCkgbWluUGFzc3dvcmRMZW5ndGgsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9zbmFja2JhcjogU25hY2tCYXJTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGZvcm1CdWlsZGVyLCBwcm9maWxlU2VydmljZSwgdXNlciwgbG9nLCB0cmFuc2xhdGUsIG1pblBhc3N3b3JkTGVuZ3RoKTtcbiAgICAgICAgdGhpcy5zdHJlYW1DaGFuZ2VQYXNzd29yZCA9IHRoaXMuY2hhbmdlUGFzc3dvcmQuc3Vic2NyaWJlKG1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW5TdWNjZXNzU25hY2tCYXIobWVzc2FnZS5zdWNjZXNzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc25hY2tiYXIub3BlbkVycm9yU25hY2tCYXIobWVzc2FnZS5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RyZWFtQ2hhbmdlUGFzc3dvcmQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbn1cbiIsIjxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEdhcD1cIjI0cHhcIj5cbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInJvb3RGb3JtR3JvdXBcIiAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIGNsYXNzPVwiZnVsbC13aWR0aCBuZXRncmlmLWlucHV0XCI+XG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIGNsYXNzPVwibmV0Z3JpZi1pbnB1dFwiID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cIm5ldGdyaWYtaWNvbi1maXhcIj52cG5fa2V5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCIxMDBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ2Zvcm1zLmNoYW5nZVBhc3N3b3JkLm9sZFBhc3N3b3JkJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJoaWRlT2xkUGFzc3dvcmQgPyAncGFzc3dvcmQnIDogJ3RleHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwib2xkUGFzc3dvcmRcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJvbGQtcGFzc3dvcmRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGlkZU9sZFBhc3N3b3JkID0gIWhpZGVPbGRQYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGlkZSBwYXNzd29yZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImhpZGVPbGRQYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJoaWRlT2xkUGFzc3dvcmQgPyB1bmRlZmluZWQgOiAnYWNjZW50J1wiPnt7aGlkZU9sZFBhc3N3b3JkID8gJ3Zpc2liaWxpdHlfb2ZmJyA6ICd2aXNpYmlsaXR5J319PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiIWlzRmllbGRWYWxpZCgnb2xkUGFzc3dvcmQnKVwiPnt7Z2V0RXJyb3JNZXNzYWdlKCdvbGRQYXNzd29yZCcpfX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiAgY2xhc3M9XCJuZXRncmlmLWlucHV0XCIgPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwibmV0Z3JpZi1pY29uLWZpeFwiPnZwbl9rZXk8L21hdC1pY29uPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEwMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnZm9ybXMuY2hhbmdlUGFzc3dvcmQuZW50ZXJOZXdQYXNzJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJoaWRlUGFzc3dvcmQgPyAncGFzc3dvcmQnIDogJ3RleHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGlkZVBhc3N3b3JkID0gIWhpZGVQYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGlkZSBwYXNzd29yZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImhpZGVQYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJoaWRlUGFzc3dvcmQgPyB1bmRlZmluZWQgOiAnYWNjZW50J1wiPnt7aGlkZVBhc3N3b3JkID8gJ3Zpc2liaWxpdHlfb2ZmJyA6ICd2aXNpYmlsaXR5J319PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiIWlzRmllbGRWYWxpZCgncGFzc3dvcmQnKVwiPnt7Z2V0RXJyb3JNZXNzYWdlKCdwYXNzd29yZCcpfX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiAgY2xhc3M9XCJuZXRncmlmLWlucHV0XCIgPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwibmV0Z3JpZi1pY29uLWZpeFwiPnZwbl9rZXk8L21hdC1pY29uPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjEwMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnZm9ybXMuY2hhbmdlUGFzc3dvcmQucmVwZWF0TmV3UGFzcycgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiaGlkZVJlcGVhdFBhc3N3b3JkID8gJ3Bhc3N3b3JkJyA6ICd0ZXh0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbmZpcm1QYXNzd29yZFwiIHJlcXVpcmVkIGF1dG9jb21wbGV0ZT1cIm5ldy1wYXNzd29yZFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoaWRlUmVwZWF0UGFzc3dvcmQgPSAhaGlkZVJlcGVhdFBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlwcmVzcyk9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIaWRlIHBhc3N3b3JkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiaGlkZVJlcGVhdFBhc3N3b3JkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImhpZGVSZXBlYXRQYXNzd29yZCA/IHVuZGVmaW5lZCA6ICdhY2NlbnQnXCI+e3toaWRlUmVwZWF0UGFzc3dvcmQgPyAndmlzaWJpbGl0eV9vZmYnIDogJ3Zpc2liaWxpdHknfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCIhaXNGaWVsZFZhbGlkKCdjb25maXJtUGFzc3dvcmQnKVwiPnt7Z2V0RXJyb3JNZXNzYWdlKCdjb25maXJtUGFzc3dvcmQnKX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmRcIiBmeExheW91dEFsaWduLnhzPVwiY2VudGVyXCIgY2xhc3M9XCJtYXJnaW4tdG9wLTRcIj5cbiAgICAgICAgICAgIDxidXR0b24gZnhGbGV4T2Zmc2V0PVwiOHB4XCIgZnhGbGV4T2Zmc2V0LnhzPVwiMFwiIFtkaXNhYmxlZF09XCJsb2FkaW5nU3VibWl0IHwgYXN5bmNcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cInJlZ2lzdGVyLWJ1dHRvblwiIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImxvYWRpbmdTdWJtaXQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbWV0ZXI9XCIzNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhGbGV4PjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIobG9hZGluZ1N1Ym1pdCB8IGFzeW5jKSA9PT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIGZ4RmxleD57eyAnZm9ybXMuY2hhbmdlUGFzc3dvcmQuY2hhbmdlUGFzcycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuPC9kaXY+XG5cbiJdfQ==