UNPKG

ontimize-web-ngx

Version:
90 lines 23 kB
import { __decorate, __metadata } from "tslib"; import { Component, ElementRef, Injector, ViewEncapsulation } from '@angular/core'; import { Router } from '@angular/router'; import { BooleanInputConverter } from '../../decorators'; import { AuthService } from '../../services/auth.service'; import { DialogService } from '../../services/dialog.service'; import { OUserInfoService } from '../../services/o-user-info.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@angular/common"; import * as i3 from "@angular/flex-layout/flex"; import * as i4 from "@angular/flex-layout/extended"; import * as i5 from "@angular/material/icon"; import * as i6 from "@angular/material/menu"; import * as i7 from "@angular/material/tooltip"; import * as i8 from "../../pipes/o-translate.pipe"; export const DEFAULT_INPUTS_O_USER_INFO = [ 'showProfile: show-profile', 'showSettings: show-settings', 'showLogout: show-logout' ]; export const DEFAULT_OUTPUTS_O_USER_INFO = []; export class OUserInfoComponent { constructor(elRef, injector, router) { this.elRef = elRef; this.injector = injector; this.router = router; this.showLogout = true; this.showSettings = true; this.showProfile = false; this.dialogService = this.injector.get(DialogService); this.authService = this.injector.get(AuthService); this.oUserInfoService = this.injector.get(OUserInfoService); this.userInfo = this.oUserInfoService.getUserInfo(); this.userInfoSubscription = this.oUserInfoService.getUserInfoObservable().subscribe(res => { this.userInfo = res; }); } ngOnDestroy() { this.userInfoSubscription.unsubscribe(); } onLogoutClick() { this.authService.logoutWithConfirmation(); } onSettingsClick() { this.router.navigate(['main/settings']); } onProfileClick() { this.router.navigate(['main/profile']); } get existsUserInfo() { return this.userInfo !== undefined; } get avatar() { return this.userInfo ? this.userInfo.avatar : undefined; } get username() { return this.userInfo ? this.userInfo.username : undefined; } registerUserInfoConfiguration(userInfoMenu) { this.userInfoConfiguration = userInfoMenu; this.updateInputsByConfiguration(); } updateInputsByConfiguration() { this.showLogout = this.userInfoConfiguration ? this.userInfoConfiguration.showLogout : this.showLogout; this.showProfile = this.userInfoConfiguration ? this.userInfoConfiguration.showProfile : this.showProfile; this.showSettings = this.userInfoConfiguration ? this.userInfoConfiguration.showSettings : this.showSettings; } } OUserInfoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OUserInfoComponent, deps: [{ token: i0.ElementRef }, { token: i0.Injector }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); OUserInfoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OUserInfoComponent, selector: "o-user-info", inputs: { showProfile: ["show-profile", "showProfile"], showSettings: ["show-settings", "showSettings"], showLogout: ["show-logout", "showLogout"] }, host: { properties: { "class.o-user-info": "true" } }, ngImport: i0, template: "<div class=\"o-user-info-container\" fxLayout=\"row\" fxLayoutAlign=\"center\">\n <ng-container *ngIf=\"existsUserInfo\">\n <div class=\"o-user-info-wrapper\" fxLayout=\"row\" fxLayoutAlign=\"center center\" [matMenuTriggerFor]=\"menu\"\n fxLayoutGap=\"16px\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"o-user-info-avatar-wrapper\">\n <img [src]=\"avatar\" *ngIf=\"avatar\" alt=\"avatar image\"/>\n </div>\n <span class=\"o-user-info-username\" *ngIf=\"username\"> {{ username }}</span>\n <mat-icon svgIcon=\"ontimize:keyboard_arrow_down\"></mat-icon>\n </div>\n <mat-menu #menu=\"matMenu\" yPosition=\"below\" class=\"o-mat-menu\">\n <button type=\"button\" mat-menu-item (click)=\"onProfileClick()\" *ngIf=\"showProfile\">\n <mat-icon>person</mat-icon>\n <span>{{ 'APP_LAYOUT.USER_PROFILE' | oTranslate }}</span>\n </button>\n <button type=\"button\" mat-menu-item (click)=\"onSettingsClick()\" *ngIf=\"showSettings\">\n <mat-icon svgIcon=\"ontimize:settings\"></mat-icon>\n <span>{{ 'APP_LAYOUT.SETTINGS' | oTranslate }}</span>\n </button>\n <ng-container *ngIf=\"userInfoConfiguration\">\n <button *ngFor=\"let item of userInfoConfiguration.userInfoConfigurationItems\" type=\"button\" mat-menu-item\n [matTooltip]=\"item.name | oTranslate\" matTooltipDisabled=\"item.tooltip\" [ngClass]=\"item.class\"\n (click)=\"item.triggerOnClick($event)\">\n <mat-icon>{{item.icon}} </mat-icon>\n <span>{{ item.name | oTranslate }}</span>\n </button>\n </ng-container>\n <button type=\"button\" mat-menu-item (click)=\"onLogoutClick()\" *ngIf=\"showLogout\">\n <mat-icon svgIcon=\"ontimize:power_settings_new\"></mat-icon>\n <span>{{ 'LOGOUT' | oTranslate }}</span>\n </button>\n\n </mat-menu>\n </ng-container>\n</div>", styles: [".o-user-info .o-user-info-container{cursor:pointer;height:100%}.o-user-info .o-user-info-avatar-wrapper{width:30px;height:30px;overflow:hidden;border-radius:100%}.o-user-info .o-user-info-avatar-wrapper img{max-width:100%;height:auto}.o-user-info mat-icon{font-size:16px;line-height:26px;height:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.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: i3.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: i3.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: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "pipe", type: i8.OTranslatePipe, name: "oTranslate" }], encapsulation: i0.ViewEncapsulation.None }); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OUserInfoComponent.prototype, "showLogout", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OUserInfoComponent.prototype, "showSettings", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OUserInfoComponent.prototype, "showProfile", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OUserInfoComponent, decorators: [{ type: Component, args: [{ selector: 'o-user-info', inputs: DEFAULT_INPUTS_O_USER_INFO, outputs: DEFAULT_OUTPUTS_O_USER_INFO, encapsulation: ViewEncapsulation.None, host: { '[class.o-user-info]': 'true' }, template: "<div class=\"o-user-info-container\" fxLayout=\"row\" fxLayoutAlign=\"center\">\n <ng-container *ngIf=\"existsUserInfo\">\n <div class=\"o-user-info-wrapper\" fxLayout=\"row\" fxLayoutAlign=\"center center\" [matMenuTriggerFor]=\"menu\"\n fxLayoutGap=\"16px\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"o-user-info-avatar-wrapper\">\n <img [src]=\"avatar\" *ngIf=\"avatar\" alt=\"avatar image\"/>\n </div>\n <span class=\"o-user-info-username\" *ngIf=\"username\"> {{ username }}</span>\n <mat-icon svgIcon=\"ontimize:keyboard_arrow_down\"></mat-icon>\n </div>\n <mat-menu #menu=\"matMenu\" yPosition=\"below\" class=\"o-mat-menu\">\n <button type=\"button\" mat-menu-item (click)=\"onProfileClick()\" *ngIf=\"showProfile\">\n <mat-icon>person</mat-icon>\n <span>{{ 'APP_LAYOUT.USER_PROFILE' | oTranslate }}</span>\n </button>\n <button type=\"button\" mat-menu-item (click)=\"onSettingsClick()\" *ngIf=\"showSettings\">\n <mat-icon svgIcon=\"ontimize:settings\"></mat-icon>\n <span>{{ 'APP_LAYOUT.SETTINGS' | oTranslate }}</span>\n </button>\n <ng-container *ngIf=\"userInfoConfiguration\">\n <button *ngFor=\"let item of userInfoConfiguration.userInfoConfigurationItems\" type=\"button\" mat-menu-item\n [matTooltip]=\"item.name | oTranslate\" matTooltipDisabled=\"item.tooltip\" [ngClass]=\"item.class\"\n (click)=\"item.triggerOnClick($event)\">\n <mat-icon>{{item.icon}} </mat-icon>\n <span>{{ item.name | oTranslate }}</span>\n </button>\n </ng-container>\n <button type=\"button\" mat-menu-item (click)=\"onLogoutClick()\" *ngIf=\"showLogout\">\n <mat-icon svgIcon=\"ontimize:power_settings_new\"></mat-icon>\n <span>{{ 'LOGOUT' | oTranslate }}</span>\n </button>\n\n </mat-menu>\n </ng-container>\n</div>", styles: [".o-user-info .o-user-info-container{cursor:pointer;height:100%}.o-user-info .o-user-info-avatar-wrapper{width:30px;height:30px;overflow:hidden;border-radius:100%}.o-user-info .o-user-info-avatar-wrapper img{max-width:100%;height:auto}.o-user-info mat-icon{font-size:16px;line-height:26px;height:100%}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Injector }, { type: i1.Router }]; }, propDecorators: { showLogout: [], showSettings: [], showProfile: [] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby11c2VyLWluZm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvdXNlci1pbmZvL28tdXNlci1pbmZvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3VzZXItaW5mby9vLXVzZXItaW5mby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFhLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd6QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxnQkFBZ0IsRUFBWSxNQUFNLG9DQUFvQyxDQUFDOzs7Ozs7Ozs7O0FBR2hGLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHO0lBQ3hDLDJCQUEyQjtJQUMzQiw2QkFBNkI7SUFDN0IseUJBQXlCO0NBQzFCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFhOUMsTUFBTSxPQUFPLGtCQUFrQjtJQW9CN0IsWUFDWSxLQUFpQixFQUNqQixRQUFrQixFQUNsQixNQUFjO1FBRmQsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFibkIsZUFBVSxHQUFZLElBQUksQ0FBQztRQUczQixpQkFBWSxH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TUFBTTtxQkFDOUI7NklBWU0sVUFBVSxNQUdWLFlBQVksTUFHWixXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3RvciwgT25EZXN0cm95LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBPVXNlckluZm9TZXJ2aWNlLCBVc2VySW5mbyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL28tdXNlci1pbmZvLnNlcnZpY2UnO1xuaW1wb3J0IHsgT1VzZXJJbmZvQ29uZmlndXJhdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4vdXNlci1pbmZvLWNvbmZpZ3VyYXRpb24vby11c2VyLWluZm8tY29uZmlndXJhdGlvbi5kaXJlY3RpdmUnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9JTlBVVFNfT19VU0VSX0lORk8gPSBbXG4gICdzaG93UHJvZmlsZTogc2hvdy1wcm9maWxlJyxcbiAgJ3Nob3dTZXR0aW5nczogc2hvdy1zZXR0aW5ncycsXG4gICdzaG93TG9nb3V0OiBzaG93LWxvZ291dCdcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19VU0VSX0lORk8gPSBbXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby11c2VyLWluZm8nLFxuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fVVNFUl9JTkZPLFxuICBvdXRwdXRzOiBERUZBVUxUX09VVFBVVFNfT19VU0VSX0lORk8sXG4gIHRlbXBsYXRlVXJsOiAnLi9vLXVzZXItaW5mby5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL28tdXNlci1pbmZvLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLm8tdXNlci1pbmZvXSc6ICd0cnVlJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE9Vc2VySW5mb0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgcHJvdGVjdGVkIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2U7XG4gIHByb3RlY3RlZCBhdXRoU2VydmljZTogQXV0aFNlcnZpY2U7XG4gIHByb3RlY3RlZCBvVXNlckluZm9TZXJ2aWNlOiBPVXNlckluZm9TZXJ2aWNlO1xuXG4gIHVzZXJJbmZvU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCB1c2VySW5mbzogVXNlckluZm87XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHB1YmxpYyBzaG93TG9nb3V0OiBib29sZWFuID0gdHJ1ZTtcblxuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHVibGljIHNob3dTZXR0aW5nczogYm9vbGVhbiA9IHRydWU7XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHB1YmxpYyBzaG93UHJvZmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyB1c2VySW5mb0NvbmZpZ3VyYXRpb246IE9Vc2VySW5mb0NvbmZpZ3VyYXRpb25EaXJlY3RpdmU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyXG4gICkge1xuICAgIHRoaXMuZGlhbG9nU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KERpYWxvZ1NlcnZpY2UpO1xuICAgIHRoaXMuYXV0aFNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChBdXRoU2VydmljZSk7XG4gICAgdGhpcy5vVXNlckluZm9TZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoT1VzZXJJbmZvU2VydmljZSk7XG5cbiAgICB0aGlzLnVzZXJJbmZvID0gdGhpcy5vVXNlckluZm9TZXJ2aWNlLmdldFVzZXJJbmZvKCk7XG4gICAgdGhpcy51c2VySW5mb1N1YnNjcmlwdGlvbiA9IHRoaXMub1VzZXJJbmZvU2VydmljZS5nZXRVc2VySW5mb09ic2VydmFibGUoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIHRoaXMudXNlckluZm8gPSByZXM7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVzZXJJbmZvU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBvbkxvZ291dENsaWNrKCkge1xuICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nb3V0V2l0aENvbmZpcm1hdGlvbigpO1xuICB9XG5cbiAgb25TZXR0aW5nc0NsaWNrKCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbWFpbi9zZXR0aW5ncyddKTtcbiAgfVxuXG4gIG9uUHJvZmlsZUNsaWNrKCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbWFpbi9wcm9maWxlJ10pO1xuICB9XG5cbiAgZ2V0IGV4aXN0c1VzZXJJbmZvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnVzZXJJbmZvICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYXZhdGFyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudXNlckluZm8gPyB0aGlzLnVzZXJJbmZvLmF2YXRhciA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCB1c2VybmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnVzZXJJbmZvID8gdGhpcy51c2VySW5mby51c2VybmFtZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlZ2lzdGVyVXNlckluZm9Db25maWd1cmF0aW9uKHVzZXJJbmZvTWVudTogT1VzZXJJbmZvQ29uZmlndXJhdGlvbkRpcmVjdGl2ZSkge1xuICAgIHRoaXMudXNlckluZm9Db25maWd1cmF0aW9uID0gdXNlckluZm9NZW51O1xuICAgIHRoaXMudXBkYXRlSW5wdXRzQnlDb25maWd1cmF0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUlucHV0c0J5Q29uZmlndXJhdGlvbigpIHtcbiAgICB0aGlzLnNob3dMb2dvdXQgPSB0aGlzLnVzZXJJbmZvQ29uZmlndXJhdGlvbiA/IHRoaXMudXNlckluZm9Db25maWd1cmF0aW9uLnNob3dMb2dvdXQgOiB0aGlzLnNob3dMb2dvdXQ7XG4gICAgdGhpcy5zaG93UHJvZmlsZSA9IHRoaXMudXNlckluZm9Db25maWd1cmF0aW9uID8gdGhpcy51c2VySW5mb0NvbmZpZ3VyYXRpb24uc2hvd1Byb2ZpbGUgOiB0aGlzLnNob3dQcm9maWxlO1xuICAgIHRoaXMuc2hvd1NldHRpbmdzID0gdGhpcy51c2VySW5mb0NvbmZpZ3VyYXRpb24gPyB0aGlzLnVzZXJJbmZvQ29uZmlndXJhdGlvbi5zaG93U2V0dGluZ3MgOiB0aGlzLnNob3dTZXR0aW5ncztcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiby11c2VyLWluZm8tY29udGFpbmVyXCIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiY2VudGVyXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJleGlzdHNVc2VySW5mb1wiPlxuICAgIDxkaXYgY2xhc3M9XCJvLXVzZXItaW5mby13cmFwcGVyXCIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcbiAgICAgIGZ4TGF5b3V0R2FwPVwiMTZweFwiPlxuICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCIgY2xhc3M9XCJvLXVzZXItaW5mby1hdmF0YXItd3JhcHBlclwiPlxuICAgICAgICA8aW1nIFtzcmNdPVwiYXZhdGFyXCIgKm5nSWY9XCJhdmF0YXJcIiBhbHQ9XCJhdmF0YXIgaW1hZ2VcIi8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiby11c2VyLWluZm8tdXNlcm5hbWVcIiAqbmdJZj1cInVzZXJuYW1lXCI+IHt7IHVzZXJuYW1lIH19PC9zcGFuPlxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJvbnRpbWl6ZTprZXlib2FyZF9hcnJvd19kb3duXCI+PC9tYXQtaWNvbj5cbiAgICA8L2Rpdj5cbiAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCIgeVBvc2l0aW9uPVwiYmVsb3dcIiBjbGFzcz1cIm8tbWF0LW1lbnVcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uUHJvZmlsZUNsaWNrKClcIiAqbmdJZj1cInNob3dQcm9maWxlXCI+XG4gICAgICAgIDxtYXQtaWNvbj5wZXJzb248L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj57eyAnQVBQX0xBWU9VVC5VU0VSX1BST0ZJTEUnIHwgb1RyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25TZXR0aW5nc0NsaWNrKClcIiAqbmdJZj1cInNob3dTZXR0aW5nc1wiPlxuICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOnNldHRpbmdzXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+e3sgJ0FQUF9MQVlPVVQuU0VUVElOR1MnIHwgb1RyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZXJJbmZvQ29uZmlndXJhdGlvblwiPlxuICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIHVzZXJJbmZvQ29uZmlndXJhdGlvbi51c2VySW5mb0NvbmZpZ3VyYXRpb25JdGVtc1wiIHR5cGU9XCJidXR0b25cIiBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiaXRlbS5uYW1lIHwgb1RyYW5zbGF0ZVwiIG1hdFRvb2x0aXBEaXNhYmxlZD1cIml0ZW0udG9vbHRpcFwiIFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3NcIlxuICAgICAgICAgIChjbGljayk9XCJpdGVtLnRyaWdnZXJPbkNsaWNrKCRldmVudClcIj5cbiAgICAgICAgICA8bWF0LWljb24+e3tpdGVtLmljb259fSA8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7IGl0ZW0ubmFtZSB8IG9UcmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbkxvZ291dENsaWNrKClcIiAqbmdJZj1cInNob3dMb2dvdXRcIj5cbiAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJvbnRpbWl6ZTpwb3dlcl9zZXR0aW5nc19uZXdcIj48L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj57eyAnTE9HT1VUJyB8IG9UcmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cblxuICAgIDwvbWF0LW1lbnU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+Il19