UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

74 lines 22.9 kB
import { Component, Input } from '@angular/core'; import { ApiService } from '@c8y/ngx-components/api'; import { Observable } from 'rxjs'; import { filter, map } from 'rxjs/operators'; import { ActionService } from '../../action/action.service'; import { BreadcrumbService } from '../../breadcrumb/breadcrumb.service'; import { AppStateService } from '../../common/ui-state.service'; import { DocsService } from '../../docs/docs.service'; import { SearchService } from '../../search/search.service'; import { UserMenuService } from '../../user/user-menu.service'; import { HeaderService } from '../header.service'; import * as i0 from "@angular/core"; import * as i1 from "../header.service"; import * as i2 from "../../action/action.service"; import * as i3 from "../../breadcrumb/breadcrumb.service"; import * as i4 from "../../search/search.service"; import * as i5 from "../../common/ui-state.service"; import * as i6 from "../../user/user-menu.service"; import * as i7 from "../../docs/docs.service"; import * as i8 from "@c8y/ngx-components/api"; import * as i9 from "../../application/app-icon.component"; import * as i10 from "../../application/app-switcher.component"; import * as i11 from "../../search/search-outlet.component"; import * as i12 from "../../common/icon.directive"; import * as i13 from "@angular/common"; import * as i14 from "../../action/action-outlet.component"; import * as i15 from "../../breadcrumb/breadcrumb-outlet.component"; import * as i16 from "ngx-bootstrap/tooltip"; import * as i17 from "../../drawer/drawer-outlet/drawer-outlet.component"; import * as i18 from "../title/title-outlet.component"; import * as i19 from "../../i18n/c8y-translate.pipe"; import * as i20 from "../../common/shorten-user-name.pipe"; import * as i21 from "../../common/user-name-initials.pipe"; export class HeaderBarComponent { constructor(headerService, actionService, breadcrumbService, searchService, appState, userMenuService, docs, apiService) { this.headerService = headerService; this.actionService = actionService; this.breadcrumbService = breadcrumbService; this.searchService = searchService; this.appState = appState; this.userMenuService = userMenuService; this.docs = docs; this.apiService = apiService; this.canToggle$ = this.headerService.canToggleNavigator$; this.appState$ = this.appState.state$.asObservable(); this.headerOpen = false; this.loadingClass$ = new Observable(); /** * Can be set to show an header bar with only * title, app-switcher and user-menu */ this.simple = false; this.app$ = this.appState.currentApplication.pipe(filter(app => !!app)); this.loadingClass$ = this.apiService.isLoading$.pipe(map(loading => ({ active: loading }))); } ngAfterViewInit() { this.headerService.verifyIfNavOpen(); } toggleDrawer() { this.headerService.toggleRightDrawer(); } closeDrawer() { this.headerService.closeRightDrawer(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderBarComponent, deps: [{ token: i1.HeaderService }, { token: i2.ActionService }, { token: i3.BreadcrumbService }, { token: i4.SearchService }, { token: i5.AppStateService }, { token: i6.UserMenuService }, { token: i7.DocsService }, { token: i8.ApiService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: HeaderBarComponent, selector: "c8y-header-bar", inputs: { simple: "simple" }, ngImport: i0, template: "<div\n class=\"app-main-header\"\n [ngClass]=\"{\n open: (headerService.navigatorOpen$ | async) && !simple,\n drawerOpen: headerService.rightDrawerOpen$ | async\n }\"\n>\n <div\n class=\"header-bar\"\n role=\"banner\"\n >\n <button\n class=\"navigator-toggle main-header-button\"\n title=\"{{ 'Toggle navigation bar' | translate }}\"\n [attr.aria-expanded]=\"headerService.navigatorOpen$ | async\"\n [attr.aria-controls]=\"'navigator'\"\n type=\"button\"\n data-cy=\"header-bar--main-header-button\"\n (click)=\"headerService.toggleNavigator()\"\n *ngIf=\"(headerService.canToggleNavigator$ | async) && !simple\"\n >\n <i\n [c8yIcon]=\"'outdent'\"\n *ngIf=\"!(headerService.navigatorOpen$ | async)\"\n ></i>\n <i\n [c8yIcon]=\"'dedent-right'\"\n *ngIf=\"headerService.navigatorOpen$ | async\"\n ></i>\n </button>\n <div class=\"app-view\">\n <c8y-app-icon\n [name]=\"(appState$ | async).app.name\"\n [contextPath]=\"(appState$ | async).app.contextPath\"\n [app]=\"(app$ | async) || (appState$ | async).app\"\n ></c8y-app-icon>\n\n <span class=\"page-header\">\n <c8y-title-outlet></c8y-title-outlet>\n <c8y-breadcrumb-outlet\n class=\"app-breadcrumbs\"\n *ngIf=\"!simple\"\n [breadcrumbs]=\"breadcrumbService.items$ | async\"\n ></c8y-breadcrumb-outlet>\n </span>\n </div>\n <c8y-search-outlet\n class=\"main-header-item\"\n title=\"{{ 'Search' | translate }}\"\n *ngIf=\"!simple\"\n [search]=\"searchService.items$ | async\"\n ></c8y-search-outlet>\n <c8y-action-outlet\n *ngIf=\"!simple\"\n [items]=\"actionService.items$ | async\"\n ></c8y-action-outlet>\n <c8y-app-switcher\n class=\"main-header-item\"\n title=\"{{ 'Application switcher' | translate }}\"\n *ngIf=\"appState.currentUser.value\"\n ></c8y-app-switcher>\n\n <button\n class=\"main-header-button drawer-toggle\"\n [attr.aria-label]=\"appState.currentUser | async | shortenUserName\"\n tooltip=\"{{ appState.currentUser | async | shortenUserName }}\"\n placement=\"left\"\n [attr.aria-expanded]=\"headerService.rightDrawerOpen$ | async\"\n [attr.aria-controls]=\"'right-drawer'\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"toggleDrawer()\"\n [attr.data-cy]=\"'right-drawer-toggle-button'\"\n >\n <span\n class=\"user-dot\"\n title=\"{{ appState.currentUser | async | shortenUserName }}\"\n *ngIf=\"appState.currentUser | async\"\n data-cy=\"header-bar--user-dot\"\n >\n {{ appState.currentUser | async | userNameInitials }}\n </span>\n <span class=\"close-dot\">&times;</span>\n </button>\n </div>\n <div class=\"head-toggler\">\n <button\n title=\"{{ 'Toggle' | translate }}\"\n type=\"button\"\n (click)=\"headerService.toggle()\"\n >\n <i [c8yIcon]=\"'angle-right'\"></i>\n </button>\n </div>\n <c8y-drawer-outlet\n id=\"right-drawer\"\n [tabindex]=\"(headerService.rightDrawerOpen$ | async) ? '0' : '-1'\"\n [attr.aria-hidden]=\"!(headerService.rightDrawerOpen$ | async)\"\n position=\"right\"\n [open]=\"headerService.rightDrawerOpen$ | async\"\n ></c8y-drawer-outlet>\n <div\n class=\"loading-bar\"\n [ngClass]=\"loadingClass$ | async\"\n ></div>\n</div>\n", dependencies: [{ kind: "component", type: i9.AppIconComponent, selector: "c8y-app-icon", inputs: ["contextPath", "name", "app"] }, { kind: "component", type: i10.AppSwitcherComponent, selector: "c8y-app-switcher" }, { kind: "component", type: i11.SearchOutletComponent, selector: "c8y-search-outlet", inputs: ["search"] }, { kind: "directive", type: i12.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i14.ActionOutletComponent, selector: "c8y-action-outlet", inputs: ["items"] }, { kind: "component", type: i15.BreadcrumbOutletComponent, selector: "c8y-breadcrumb-outlet", inputs: ["breadcrumbs"] }, { kind: "directive", type: i16.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i17.DrawerOutletComponent, selector: "c8y-drawer-outlet", inputs: ["position", "open"] }, { kind: "component", type: i18.TitleOutletComponent, selector: "c8y-title-outlet" }, { kind: "pipe", type: i19.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i13.AsyncPipe, name: "async" }, { kind: "pipe", type: i20.ShortenUserNamePipe, name: "shortenUserName" }, { kind: "pipe", type: i21.UserNameInitialsPipe, name: "userNameInitials" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderBarComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-header-bar', template: "<div\n class=\"app-main-header\"\n [ngClass]=\"{\n open: (headerService.navigatorOpen$ | async) && !simple,\n drawerOpen: headerService.rightDrawerOpen$ | async\n }\"\n>\n <div\n class=\"header-bar\"\n role=\"banner\"\n >\n <button\n class=\"navigator-toggle main-header-button\"\n title=\"{{ 'Toggle navigation bar' | translate }}\"\n [attr.aria-expanded]=\"headerService.navigatorOpen$ | async\"\n [attr.aria-controls]=\"'navigator'\"\n type=\"button\"\n data-cy=\"header-bar--main-header-button\"\n (click)=\"headerService.toggleNavigator()\"\n *ngIf=\"(headerService.canToggleNavigator$ | async) && !simple\"\n >\n <i\n [c8yIcon]=\"'outdent'\"\n *ngIf=\"!(headerService.navigatorOpen$ | async)\"\n ></i>\n <i\n [c8yIcon]=\"'dedent-right'\"\n *ngIf=\"headerService.navigatorOpen$ | async\"\n ></i>\n </button>\n <div class=\"app-view\">\n <c8y-app-icon\n [name]=\"(appState$ | async).app.name\"\n [contextPath]=\"(appState$ | async).app.contextPath\"\n [app]=\"(app$ | async) || (appState$ | async).app\"\n ></c8y-app-icon>\n\n <span class=\"page-header\">\n <c8y-title-outlet></c8y-title-outlet>\n <c8y-breadcrumb-outlet\n class=\"app-breadcrumbs\"\n *ngIf=\"!simple\"\n [breadcrumbs]=\"breadcrumbService.items$ | async\"\n ></c8y-breadcrumb-outlet>\n </span>\n </div>\n <c8y-search-outlet\n class=\"main-header-item\"\n title=\"{{ 'Search' | translate }}\"\n *ngIf=\"!simple\"\n [search]=\"searchService.items$ | async\"\n ></c8y-search-outlet>\n <c8y-action-outlet\n *ngIf=\"!simple\"\n [items]=\"actionService.items$ | async\"\n ></c8y-action-outlet>\n <c8y-app-switcher\n class=\"main-header-item\"\n title=\"{{ 'Application switcher' | translate }}\"\n *ngIf=\"appState.currentUser.value\"\n ></c8y-app-switcher>\n\n <button\n class=\"main-header-button drawer-toggle\"\n [attr.aria-label]=\"appState.currentUser | async | shortenUserName\"\n tooltip=\"{{ appState.currentUser | async | shortenUserName }}\"\n placement=\"left\"\n [attr.aria-expanded]=\"headerService.rightDrawerOpen$ | async\"\n [attr.aria-controls]=\"'right-drawer'\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"toggleDrawer()\"\n [attr.data-cy]=\"'right-drawer-toggle-button'\"\n >\n <span\n class=\"user-dot\"\n title=\"{{ appState.currentUser | async | shortenUserName }}\"\n *ngIf=\"appState.currentUser | async\"\n data-cy=\"header-bar--user-dot\"\n >\n {{ appState.currentUser | async | userNameInitials }}\n </span>\n <span class=\"close-dot\">&times;</span>\n </button>\n </div>\n <div class=\"head-toggler\">\n <button\n title=\"{{ 'Toggle' | translate }}\"\n type=\"button\"\n (click)=\"headerService.toggle()\"\n >\n <i [c8yIcon]=\"'angle-right'\"></i>\n </button>\n </div>\n <c8y-drawer-outlet\n id=\"right-drawer\"\n [tabindex]=\"(headerService.rightDrawerOpen$ | async) ? '0' : '-1'\"\n [attr.aria-hidden]=\"!(headerService.rightDrawerOpen$ | async)\"\n position=\"right\"\n [open]=\"headerService.rightDrawerOpen$ | async\"\n ></c8y-drawer-outlet>\n <div\n class=\"loading-bar\"\n [ngClass]=\"loadingClass$ | async\"\n ></div>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.HeaderService }, { type: i2.ActionService }, { type: i3.BreadcrumbService }, { type: i4.SearchService }, { type: i5.AppStateService }, { type: i6.UserMenuService }, { type: i7.DocsService }, { type: i8.ApiService }], propDecorators: { simple: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9jb3JlL2hlYWRlci9oZWFkZXItYmFyL2hlYWRlci1iYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vY29yZS9oZWFkZXIvaGVhZGVyLWJhci9oZWFkZXItYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1sRCxNQUFNLE9BQU8sa0JBQWtCO0lBYTdCLFlBQ1MsYUFBNEIsRUFDNUIsYUFBNEIsRUFDNUIsaUJBQW9DLEVBQ3BDLGFBQTRCLEVBQzVCLFFBQXlCLEVBQ3pCLGVBQWdDLEVBQ2hDLElBQWlCLEVBQ2pCLFVBQXNCO1FBUHRCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFNBQUksR0FBSixJQUFJLENBQWE7UUFDakIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQXBCL0IsZUFBVSxHQUF3QixJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDO1FBQ3pFLGNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVoRCxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGtCQUFhLEdBQUcsSUFBSSxVQUFVLEVBQXVCLENBQUM7UUFDdEQ7OztXQUdHO1FBRUgsV0FBTSxHQUFHLEtBQUssQ0FBQztRQVliLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDeEMsQ0FBQzsrR0FyQ1Usa0JBQWtCO21HQUFsQixrQkFBa0Isb0ZDakIvQixzNUdBMEdBOzs0RkR6RmEsa0JBQWtCO2tCQUo5QixTQUFTOytCQUNFLGdCQUFnQjt5UkFjMUIsTUFBTTtzQkFETCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUFwcGxpY2F0aW9uIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvYXBpJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2FjdGlvbi9hY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBCcmVhZGNydW1iU2VydmljZSB9IGZyb20gJy4uLy4uL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IERvY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZG9jcy9kb2NzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyTWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi91c2VyL3VzZXItbWVudS5zZXJ2aWNlJztcbmltcG9ydCB7IEhlYWRlclNlcnZpY2UgfSBmcm9tICcuLi9oZWFkZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1oZWFkZXItYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2hlYWRlci1iYXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEhlYWRlckJhckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBjYW5Ub2dnbGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5oZWFkZXJTZXJ2aWNlLmNhblRvZ2dsZU5hdmlnYXRvciQ7XG4gIGFwcFN0YXRlJCA9IHRoaXMuYXBwU3RhdGUuc3RhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICBhcHAkOiBPYnNlcnZhYmxlPElBcHBsaWNhdGlvbj47XG4gIGhlYWRlck9wZW4gPSBmYWxzZTtcbiAgbG9hZGluZ0NsYXNzJCA9IG5ldyBPYnNlcnZhYmxlPHsgYWN0aXZlOiBib29sZWFuIH0+KCk7XG4gIC8qKlxuICAgKiBDYW4gYmUgc2V0IHRvIHNob3cgYW4gaGVhZGVyIGJhciB3aXRoIG9ubHlcbiAgICogdGl0bGUsIGFwcC1zd2l0Y2hlciBhbmQgdXNlci1tZW51XG4gICAqL1xuICBASW5wdXQoKVxuICBzaW1wbGUgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaGVhZGVyU2VydmljZTogSGVhZGVyU2VydmljZSxcbiAgICBwdWJsaWMgYWN0aW9uU2VydmljZTogQWN0aW9uU2VydmljZSxcbiAgICBwdWJsaWMgYnJlYWRjcnVtYlNlcnZpY2U6IEJyZWFkY3J1bWJTZXJ2aWNlLFxuICAgIHB1YmxpYyBzZWFyY2hTZXJ2aWNlOiBTZWFyY2hTZXJ2aWNlLFxuICAgIHB1YmxpYyBhcHBTdGF0ZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHB1YmxpYyB1c2VyTWVudVNlcnZpY2U6IFVzZXJNZW51U2VydmljZSxcbiAgICBwdWJsaWMgZG9jczogRG9jc1NlcnZpY2UsXG4gICAgcHVibGljIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5hcHAkID0gdGhpcy5hcHBTdGF0ZS5jdXJyZW50QXBwbGljYXRpb24ucGlwZShmaWx0ZXIoYXBwID0+ICEhYXBwKSk7XG4gICAgdGhpcy5sb2FkaW5nQ2xhc3MkID0gdGhpcy5hcGlTZXJ2aWNlLmlzTG9hZGluZyQucGlwZShtYXAobG9hZGluZyA9PiAoeyBhY3RpdmU6IGxvYWRpbmcgfSkpKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmhlYWRlclNlcnZpY2UudmVyaWZ5SWZOYXZPcGVuKCk7XG4gIH1cblxuICB0b2dnbGVEcmF3ZXIoKSB7XG4gICAgdGhpcy5oZWFkZXJTZXJ2aWNlLnRvZ2dsZVJpZ2h0RHJhd2VyKCk7XG4gIH1cblxuICBjbG9zZURyYXdlcigpIHtcbiAgICB0aGlzLmhlYWRlclNlcnZpY2UuY2xvc2VSaWdodERyYXdlcigpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiYXBwLW1haW4taGVhZGVyXCJcbiAgW25nQ2xhc3NdPVwie1xuICAgIG9wZW46IChoZWFkZXJTZXJ2aWNlLm5hdmlnYXRvck9wZW4kIHwgYXN5bmMpICYmICFzaW1wbGUsXG4gICAgZHJhd2VyT3BlbjogaGVhZGVyU2VydmljZS5yaWdodERyYXdlck9wZW4kIHwgYXN5bmNcbiAgfVwiXG4+XG4gIDxkaXZcbiAgICBjbGFzcz1cImhlYWRlci1iYXJcIlxuICAgIHJvbGU9XCJiYW5uZXJcIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJuYXZpZ2F0b3ItdG9nZ2xlIG1haW4taGVhZGVyLWJ1dHRvblwiXG4gICAgICB0aXRsZT1cInt7ICdUb2dnbGUgbmF2aWdhdGlvbiBiYXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaGVhZGVyU2VydmljZS5uYXZpZ2F0b3JPcGVuJCB8IGFzeW5jXCJcbiAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ25hdmlnYXRvcidcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBkYXRhLWN5PVwiaGVhZGVyLWJhci0tbWFpbi1oZWFkZXItYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJoZWFkZXJTZXJ2aWNlLnRvZ2dsZU5hdmlnYXRvcigpXCJcbiAgICAgICpuZ0lmPVwiKGhlYWRlclNlcnZpY2UuY2FuVG9nZ2xlTmF2aWdhdG9yJCB8IGFzeW5jKSAmJiAhc2ltcGxlXCJcbiAgICA+XG4gICAgICA8aVxuICAgICAgICBbYzh5SWNvbl09XCInb3V0ZGVudCdcIlxuICAgICAgICAqbmdJZj1cIiEoaGVhZGVyU2VydmljZS5uYXZpZ2F0b3JPcGVuJCB8IGFzeW5jKVwiXG4gICAgICA+PC9pPlxuICAgICAgPGlcbiAgICAgICAgW2M4eUljb25dPVwiJ2RlZGVudC1yaWdodCdcIlxuICAgICAgICAqbmdJZj1cImhlYWRlclNlcnZpY2UubmF2aWdhdG9yT3BlbiQgfCBhc3luY1wiXG4gICAgICA+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJhcHAtdmlld1wiPlxuICAgICAgPGM4eS1hcHAtaWNvblxuICAgICAgICBbbmFtZV09XCIoYXBwU3RhdGUkIHwgYXN5bmMpLmFwcC5uYW1lXCJcbiAgICAgICAgW2NvbnRleHRQYXRoXT1cIihhcHBTdGF0ZSQgfCBhc3luYykuYXBwLmNvbnRleHRQYXRoXCJcbiAgICAgICAgW2FwcF09XCIoYXBwJCB8IGFzeW5jKSB8fCAoYXBwU3RhdGUkIHwgYXN5bmMpLmFwcFwiXG4gICAgICA+PC9jOHktYXBwLWljb24+XG5cbiAgICAgIDxzcGFuIGNsYXNzPVwicGFnZS1oZWFkZXJcIj5cbiAgICAgICAgPGM4eS10aXRsZS1vdXRsZXQ+PC9jOHktdGl0bGUtb3V0bGV0PlxuICAgICAgICA8Yzh5LWJyZWFkY3J1bWItb3V0bGV0XG4gICAgICAgICAgY2xhc3M9XCJhcHAtYnJlYWRjcnVtYnNcIlxuICAgICAgICAgICpuZ0lmPVwiIXNpbXBsZVwiXG4gICAgICAgICAgW2JyZWFkY3J1bWJzXT1cImJyZWFkY3J1bWJTZXJ2aWNlLml0ZW1zJCB8IGFzeW5jXCJcbiAgICAgICAgPjwvYzh5LWJyZWFkY3J1bWItb3V0bGV0PlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxjOHktc2VhcmNoLW91dGxldFxuICAgICAgY2xhc3M9XCJtYWluLWhlYWRlci1pdGVtXCJcbiAgICAgIHRpdGxlPVwie3sgJ1NlYXJjaCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgKm5nSWY9XCIhc2ltcGxlXCJcbiAgICAgIFtzZWFyY2hdPVwic2VhcmNoU2VydmljZS5pdGVtcyQgfCBhc3luY1wiXG4gICAgPjwvYzh5LXNlYXJjaC1vdXRsZXQ+XG4gICAgPGM4eS1hY3Rpb24tb3V0bGV0XG4gICAgICAqbmdJZj1cIiFzaW1wbGVcIlxuICAgICAgW2l0ZW1zXT1cImFjdGlvblNlcnZpY2UuaXRlbXMkIHwgYXN5bmNcIlxuICAgID48L2M4eS1hY3Rpb24tb3V0bGV0PlxuICAgIDxjOHktYXBwLXN3aXRjaGVyXG4gICAgICBjbGFzcz1cIm1haW4taGVhZGVyLWl0ZW1cIlxuICAgICAgdGl0bGU9XCJ7eyAnQXBwbGljYXRpb24gc3dpdGNoZXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICpuZ0lmPVwiYXBwU3RhdGUuY3VycmVudFVzZXIudmFsdWVcIlxuICAgID48L2M4eS1hcHAtc3dpdGNoZXI+XG5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cIm1haW4taGVhZGVyLWJ1dHRvbiBkcmF3ZXItdG9nZ2xlXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXBwU3RhdGUuY3VycmVudFVzZXIgfCBhc3luYyB8IHNob3J0ZW5Vc2VyTmFtZVwiXG4gICAgICB0b29sdGlwPVwie3sgYXBwU3RhdGUuY3VycmVudFVzZXIgfCBhc3luYyB8IHNob3J0ZW5Vc2VyTmFtZSB9fVwiXG4gICAgICBwbGFjZW1lbnQ9XCJsZWZ0XCJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaGVhZGVyU2VydmljZS5yaWdodERyYXdlck9wZW4kIHwgYXN5bmNcIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCIncmlnaHQtZHJhd2VyJ1wiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZURyYXdlcigpXCJcbiAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ3JpZ2h0LWRyYXdlci10b2dnbGUtYnV0dG9uJ1wiXG4gICAgPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJ1c2VyLWRvdFwiXG4gICAgICAgIHRpdGxlPVwie3sgYXBwU3RhdGUuY3VycmVudFVzZXIgfCBhc3luYyB8IHNob3J0ZW5Vc2VyTmFtZSB9fVwiXG4gICAgICAgICpuZ0lmPVwiYXBwU3RhdGUuY3VycmVudFVzZXIgfCBhc3luY1wiXG4gICAgICAgIGRhdGEtY3k9XCJoZWFkZXItYmFyLS11c2VyLWRvdFwiXG4gICAgICA+XG4gICAgICAgIHt7IGFwcFN0YXRlLmN1cnJlbnRVc2VyIHwgYXN5bmMgfCB1c2VyTmFtZUluaXRpYWxzIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNsb3NlLWRvdFwiPiZ0aW1lczs8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiaGVhZC10b2dnbGVyXCI+XG4gICAgPGJ1dHRvblxuICAgICAgdGl0bGU9XCJ7eyAnVG9nZ2xlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJoZWFkZXJTZXJ2aWNlLnRvZ2dsZSgpXCJcbiAgICA+XG4gICAgICA8aSBbYzh5SWNvbl09XCInYW5nbGUtcmlnaHQnXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGM4eS1kcmF3ZXItb3V0bGV0XG4gICAgaWQ9XCJyaWdodC1kcmF3ZXJcIlxuICAgIFt0YWJpbmRleF09XCIoaGVhZGVyU2VydmljZS5yaWdodERyYXdlck9wZW4kIHwgYXN5bmMpID8gJzAnIDogJy0xJ1wiXG4gICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIShoZWFkZXJTZXJ2aWNlLnJpZ2h0RHJhd2VyT3BlbiQgfCBhc3luYylcIlxuICAgIHBvc2l0aW9uPVwicmlnaHRcIlxuICAgIFtvcGVuXT1cImhlYWRlclNlcnZpY2UucmlnaHREcmF3ZXJPcGVuJCB8IGFzeW5jXCJcbiAgPjwvYzh5LWRyYXdlci1vdXRsZXQ+XG4gIDxkaXZcbiAgICBjbGFzcz1cImxvYWRpbmctYmFyXCJcbiAgICBbbmdDbGFzc109XCJsb2FkaW5nQ2xhc3MkIHwgYXN5bmNcIlxuICA+PC9kaXY+XG48L2Rpdj5cbiJdfQ==