ngx-material-drawer
Version:
[npm_img]: https://img.shields.io/npm/v/ngx-material-drawer.svg?colorB=0E7FBF [npm_url]: https://www.npmjs.com/package/ngx-material-drawer
163 lines • 21.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, ViewChild, ElementRef } from '@angular/core';
import { NgxNavService } from '../utils/nav.service';
import { NgxMaterialDrawerEventEmitter } from '../utils/mat-event-emitter.service';
import { trigger, style, animate, transition } from '@angular/animations';
import { NgxUtilsService } from '../utils/utils.service';
export class NgxTopNavComponent {
/**
* @param {?} matEventEmitterService
* @param {?} navService
* @param {?} ngxUtilsService
*/
constructor(matEventEmitterService, navService, ngxUtilsService) {
this.matEventEmitterService = matEventEmitterService;
this.navService = navService;
this.ngxUtilsService = ngxUtilsService;
this.searchValue = "";
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.matEventEmitterService.onNavStateChange.subscribe((/**
* @param {?} flag
* @return {?}
*/
(flag) => {
this.isDrawerOpened = flag.isOpened;
}));
this.matEventEmitterService.onSideNavClosed.subscribe((/**
* @param {?} flag
* @return {?}
*/
(flag) => {
this.isDrawerOpened = flag.isOpened;
}));
this.matEventEmitterService.onSideNavClosed.subscribe((/**
* @param {?} flag
* @return {?}
*/
(flag) => {
this.isDrawerOpened = flag.isOpened;
}));
}
/**
* @param {?} item
* @return {?}
*/
onItemSelected(item) {
if (!item.children || !item.children.length) {
this.matEventEmitterService.menuItemClick(item);
}
}
/**
* @return {?}
*/
toggleSearchBar() {
this.isSearchActive = !this.isSearchActive;
/** @type {?} */
let searchObject = {
value: this.searchValue,
inputRef: this.ngxSearchBox
};
if (this.isSearchActive) {
this.matEventEmitterService.serachInputOpen(searchObject);
}
else {
this.matEventEmitterService.serachInputClosed(searchObject);
}
}
/**
* @param {?} event
* @return {?}
*/
onSearchValueChange(event) {
/** @type {?} */
let searchObject = {
value: this.searchValue,
inputRef: this.ngxSearchBox
};
this.matEventEmitterService.searchValueChange(searchObject);
}
/**
* @param {?} event
* @return {?}
*/
onSerachFocusIn(event) {
/** @type {?} */
let searchObject = {
value: this.searchValue,
inputRef: this.ngxSearchBox
};
this.matEventEmitterService.serachFocusIn(searchObject);
}
/**
* @param {?} event
* @return {?}
*/
onSerachFocusOut(event) {
/** @type {?} */
let searchObject = {
value: this.searchValue,
inputRef: this.ngxSearchBox
};
this.matEventEmitterService.serachFocusOut(searchObject);
}
}
NgxTopNavComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-top-nav',
template: "<mat-toolbar\r\n color=\"primary\"\r\n class=\"mat-elevation-z1 ngx-material-toolbar\"\r\n>\r\n <ng-container *ngIf=\"!isSearchActive\">\r\n <!-- DrawerToggle menu -->\r\n <button\r\n class=\"btn-toggle\"\r\n mat-icon-button\r\n id=\"menu\"\r\n (click)=\"navService.toggleNav()\"\r\n >\r\n <!-- <mat-icon>{{config?.toggleIcon ? config.toggleIcon : 'menu'}}</mat-icon> -->\r\n <div\r\n class=\"wrapper-menu\"\r\n *ngIf=\"!config?.toggleIcon\"\r\n [ngClass]=\"isDrawerOpened ? 'open' : 'close'\"\r\n >\r\n <div class=\"line-menu half start\"></div>\r\n <div class=\"line-menu\"></div>\r\n <div class=\"line-menu half end\"></div>\r\n </div>\r\n <ng-container *ngIf=\"config?.toggleIcon\">\r\n <mat-icon>\r\n {{!isDrawerOpened ? config.toggleIcon : config?.closedToggleIcon ? config?.closedToggleIcon : 'close'}}\r\n </mat-icon>\r\n </ng-container>\r\n </button>\r\n <span>\r\n {{config?.appName ? config.appName : 'Default name'}}\r\n </span>\r\n <!-- Right Menu -->\r\n <span class=\"toolbar-spacer\"></span>\r\n <div\r\n class=\"right-nav\"\r\n [ngStyle]=\"config?.rightMenus?.style? config?.rightMenus.style : ''\"\r\n >\r\n <button\r\n *ngIf=\"config?.search?.isEnable\"\r\n mat-button\r\n mat-icon-button\r\n (click)=\"toggleSearchBar()\"\r\n >\r\n <mat-icon>search</mat-icon>\r\n </button>\r\n <ng-container *ngIf=\"config?.rightMenus?.data\">\r\n <span *ngFor=\"let item of config?.rightMenus?.data\">\r\n <!-- Handle branch node buttons here -->\r\n <span *ngIf=\"item.children && item.children.length > 0\">\r\n <ng-container *ngIf=\"item.component; else elseBlock\">\r\n <lib-card-holder\r\n [matMenuTriggerFor]=\"menu.childMenu\"\r\n [cardData]=\"ngxUtilsService.getExtendedData(item.component)\"\r\n ></lib-card-holder>\r\n </ng-container>\r\n <ng-template #elseBlock>\r\n <button\r\n *ngIf=\"item.displayName?.trim()\"\r\n [ngStyle]=\"item?.style? item.style : ''\"\r\n mat-button\r\n [matMenuTriggerFor]=\"menu.childMenu\"\r\n [disabled]=\"item.disabled\"\r\n >\r\n <mat-icon>{{item.iconName}}</mat-icon>\r\n <span>{{item.displayName}}</span>\r\n </button>\r\n <button\r\n *ngIf=\"!item?.displayName?.trim()\"\r\n [ngStyle]=\"item?.style? item.style : ''\"\r\n mat-icon-button\r\n [matMenuTriggerFor]=\"menu.childMenu\"\r\n [disabled]=\"item.disabled\"\r\n >\r\n <mat-icon>{{item.iconName}}</mat-icon>\r\n </button>\r\n </ng-template>\r\n <lib-menu-list-item\r\n #menu\r\n [menus]=\"item.children\"\r\n ></lib-menu-list-item>\r\n </span>\r\n <!-- Leaf node buttons here -->\r\n <span *ngIf=\"!item.children || item.children.length === 0\">\r\n <ng-container *ngIf=\"item.component; else elseBlock\">\r\n <lib-card-holder [cardData]=\"ngxUtilsService.getExtendedData(item.component)\"></lib-card-holder>\r\n </ng-container>\r\n <ng-template #elseBlock>\r\n <button\r\n *ngIf=\"item.displayName?.trim()\"\r\n [ngStyle]=\"item?.style? item.style : ''\"\r\n mat-button\r\n (click)=\"onItemSelected(item)\"\r\n [disabled]=\"item.disabled\"\r\n >\r\n <mat-icon>{{item.iconName}}</mat-icon>\r\n <span>{{item.displayName}}</span>\r\n </button>\r\n <button\r\n *ngIf=\"!item?.displayName?.trim()\"\r\n [ngStyle]=\"item?.style? item.style : ''\"\r\n mat-icon-button\r\n (click)=\"onItemSelected(item)\"\r\n [disabled]=\"item.disabled\"\r\n >\r\n <mat-icon>{{item.iconName}}</mat-icon>\r\n </button>\r\n </ng-template>\r\n </span>\r\n </span>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"isSearchActive\">\r\n <div\r\n class=\"searchBarMain\"\r\n [ngStyle]=\"config?.search?.style ? config?.search?.style : ''\"\r\n [@enterAnimation]\r\n >\r\n <i\r\n (click)=\"toggleSearchBar()\"\r\n class=\"material-icons searchBarSearchIcon\"\r\n >\r\n {{config?.search?.backIcon ? config?.search?.backIcon : 'arrow_back'}}\r\n </i>\r\n <input\r\n type=\"text\"\r\n #ngxSearchBox\r\n name=\"header-search\"\r\n [(ngModel)]=\"searchValue\"\r\n class=\"searchBarInput\"\r\n (input)=\"onSearchValueChange($event)\"\r\n (focus)=\"onSerachFocusIn($event)\"\r\n (focusout)=\"onSerachFocusOut($event)\"\r\n [placeholder]=\"config?.search?.placeHolder ? config?.search?.placeHolder : 'Search, discover, explore...'\"\r\n >\r\n <i\r\n *ngIf=\"searchValue.length\"\r\n (click)=\"searchValue = ''\"\r\n class=\"material-icons clearSearchBarField\"\r\n >\r\n {{config?.search?.clearIcon ? config?.search?.clearIcon : 'clear'}}\r\n </i>\r\n </div>\r\n </ng-container>\r\n</mat-toolbar>\r\n",
animations: [
trigger('enterAnimation', [
transition(':enter', [
style({ transform: 'translateX(100%)', opacity: 0 }),
animate('500ms', style({ transform: 'translateX(0)', opacity: 1 }))
]),
transition(':leave', [
style({ transform: 'translateX(0)', opacity: 1 }),
animate('500ms', style({ transform: 'translateX(100%)', opacity: 0 }))
])
])
],
styles: [".ngx-material-toolbar .wrapper-menu{width:40px;height:25px;display:flex;flex-direction:column;justify-content:space-between;cursor:pointer;transition:transform 330ms ease-out}.ngx-material-toolbar .wrapper-menu.open{transform:rotate(-45deg)}.ngx-material-toolbar .line-menu{background-color:#fff;border-radius:5px;width:100%;height:4px}.ngx-material-toolbar .line-menu.half{width:50%}.ngx-material-toolbar .line-menu.start{transition:transform 330ms cubic-bezier(.54,-.81,.57,.57);transform-origin:right}.ngx-material-toolbar .open .line-menu.start{transform:rotate(-90deg) translateX(3px)}.ngx-material-toolbar .line-menu.end{align-self:flex-end;transition:transform 330ms cubic-bezier(.54,-.81,.57,.57);transform-origin:left}.ngx-material-toolbar .open .line-menu.end{transform:rotate(-90deg) translateX(-3px)}.ngx-material-toolbar .btn-toggle{margin-right:5px}.ngx-material-toolbar .toolbar-spacer{flex:1 1 auto}.ngx-material-toolbar .right-nav{display:flex}.ngx-material-toolbar .searchBarMain{background:#fff;width:90%;margin:11px auto 0;height:42px;border-radius:2px;box-shadow:0 1px 8px 0 rgba(0,0,0,.14);position:fixed;left:0;right:0;top:0}.ngx-material-toolbar .searchBarMain i.searchBarSearchIcon{height:100%;line-height:42px;float:left;width:52px;cursor:pointer;text-align:center;color:rgba(68,68,68,.5)}.ngx-material-toolbar .searchBarMain input.searchBarInput{height:42px;padding:0 32px 0 0;margin:0;border:0;box-sizing:border-box;background:0 0;width:calc(100% - 52px);outline:0;font-size:16px;color:rgba(0,0,0,.76);font-weight:400;font-family:Roboto,sans-serif}.ngx-material-toolbar .searchBarMain i.clearSearchBarField{position:absolute;right:12px;top:11px;color:rgba(0,0,0,.84);font-size:20px;cursor:pointer}"]
}] }
];
/** @nocollapse */
NgxTopNavComponent.ctorParameters = () => [
{ type: NgxMaterialDrawerEventEmitter },
{ type: NgxNavService },
{ type: NgxUtilsService }
];
NgxTopNavComponent.propDecorators = {
ngxSearchBox: [{ type: ViewChild, args: ["ngxSearchBox", { static: false },] }],
config: [{ type: Input }]
};
if (false) {
/** @type {?} */
NgxTopNavComponent.prototype.ngxSearchBox;
/** @type {?} */
NgxTopNavComponent.prototype.config;
/** @type {?} */
NgxTopNavComponent.prototype.isDrawerOpened;
/** @type {?} */
NgxTopNavComponent.prototype.isSearchActive;
/** @type {?} */
NgxTopNavComponent.prototype.searchValue;
/** @type {?} */
NgxTopNavComponent.prototype.matEventEmitterService;
/** @type {?} */
NgxTopNavComponent.prototype.navService;
/** @type {?} */
NgxTopNavComponent.prototype.ngxUtilsService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wLW5hdi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0ZXJpYWwtZHJhd2VyLyIsInNvdXJjZXMiOlsibGliL2FwcC90b3AtbmF2L3RvcC1uYXYuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBc0J6RCxNQUFNLE9BQU8sa0JBQWtCOzs7Ozs7SUFPN0IsWUFBbUIsc0JBQXFELEVBQy9ELFVBQXlCLEVBQ3pCLGVBQWdDO1FBRnRCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBK0I7UUFDL0QsZUFBVSxHQUFWLFVBQVUsQ0FBZTtRQUN6QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFKbEMsZ0JBQVcsR0FBVyxFQUFFLENBQUM7SUFJYSxDQUFDOzs7O0lBRTlDLFFBQVE7SUFDUixDQUFDOzs7O0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUNuRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdEMsQ0FBQyxFQUFDLENBQUE7UUFDRixJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ2xFLElBQUksQ0FBQyxjQUFjLEdB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QUU7cUJBQzNDLEtBQUs7Ozs7SUFETiwwQ0FBdUU7O0lBQ3ZFLG9DQUFxQjs7SUFDckIsNENBQXNCOztJQUN0Qiw0Q0FBK0I7O0lBQy9CLHlDQUFnQzs7SUFFcEIsb0RBQTREOztJQUN0RSx3Q0FBZ0M7O0lBQ2hDLDZDQUF1QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5neE5hdlNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9uYXYuc2VydmljZSc7XHJcbmltcG9ydCB7IE5neE1hdGVyaWFsRHJhd2VyRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvbWF0LWV2ZW50LWVtaXR0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IHRyaWdnZXIsIHN0eWxlLCBhbmltYXRlLCB0cmFuc2l0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IE5neFV0aWxzU2VydmljZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLnNlcnZpY2UnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRvcC1uYXYnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90b3AtbmF2LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90b3AtbmF2LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcihcclxuICAgICAgJ2VudGVyQW5pbWF0aW9uJywgW1xyXG4gICAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXHJcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpJywgb3BhY2l0eTogMCB9KSxcclxuICAgICAgICBhbmltYXRlKCc1MDBtcycsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwKScsIG9wYWNpdHk6IDEgfSkpXHJcbiAgICAgIF0pLFxyXG4gICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXHJcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApJywgb3BhY2l0eTogMSB9KSxcclxuICAgICAgICBhbmltYXRlKCc1MDBtcycsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKScsIG9wYWNpdHk6IDAgfSkpXHJcbiAgICAgIF0pXHJcbiAgICBdXHJcbiAgICApXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFRvcE5hdkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZChcIm5neFNlYXJjaEJveFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgbmd4U2VhcmNoQm94OiBFbGVtZW50UmVmO1xyXG4gIEBJbnB1dCgpIGNvbmZpZzogYW55O1xyXG4gIHB1YmxpYyBpc0RyYXdlck9wZW5lZDtcclxuICBwdWJsaWMgaXNTZWFyY2hBY3RpdmU6IGJvb2xlYW47XHJcbiAgcHVibGljIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWF0RXZlbnRFbWl0dGVyU2VydmljZTogTmd4TWF0ZXJpYWxEcmF3ZXJFdmVudEVtaXR0ZXIsXHJcbiAgICBwdWJsaWMgbmF2U2VydmljZTogTmd4TmF2U2VydmljZSxcclxuICAgIHB1YmxpYyBuZ3hVdGlsc1NlcnZpY2U6IE5neFV0aWxzU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5tYXRFdmVudEVtaXR0ZXJTZXJ2aWNlLm9uTmF2U3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKChmbGFnOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5pc0RyYXdlck9wZW5lZCA9IGZsYWcuaXNPcGVuZWQ7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5tYXRFdmVudEVtaXR0ZXJTZXJ2aWNlLm9uU2lkZU5hdkNsb3NlZC5zdWJzY3JpYmUoKGZsYWc6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmlzRHJhd2VyT3BlbmVkID0gZmxhZy5pc09wZW5lZDtcclxuICAgIH0pXHJcbiAgICB0aGlzLm1hdEV2ZW50RW1pdHRlclNlcnZpY2Uub25TaWRlTmF2Q2xvc2VkLnN1YnNjcmliZSgoZmxhZzogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuaXNEcmF3ZXJPcGVuZWQgPSBmbGFnLmlzT3BlbmVkO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkl0ZW1TZWxlY3RlZChpdGVtOiBhbnkpIHtcclxuICAgIGlmICghaXRlbS5jaGlsZHJlbiB8fCAhaXRlbS5jaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5tYXRFdmVudEVtaXR0ZXJTZXJ2aWNlLm1lbnVJdGVtQ2xpY2soaXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlU2VhcmNoQmFyKCkge1xyXG4gICAgdGhpcy5pc1NlYXJjaEFjdGl2ZSA9ICF0aGlzLmlzU2VhcmNoQWN0aXZlO1xyXG4gICAgbGV0IHNlYXJjaE9iamVjdCA9IHtcclxuICAgICAgdmFsdWU6IHRoaXMuc2VhcmNoVmFsdWUsXHJcbiAgICAgIGlucHV0UmVmOiB0aGlzLm5neFNlYXJjaEJveFxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNTZWFyY2hBY3RpdmUpIHtcclxuICAgICAgdGhpcy5tYXRFdmVudEVtaXR0ZXJTZXJ2aWNlLnNlcmFjaElucHV0T3BlbihzZWFyY2hPYmplY3QpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1hdEV2ZW50RW1pdHRlclNlcnZpY2Uuc2VyYWNoSW5wdXRDbG9zZWQoc2VhcmNoT2JqZWN0KVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNlYXJjaFZhbHVlQ2hhbmdlKGV2ZW50KSB7XHJcbiAgICBsZXQgc2VhcmNoT2JqZWN0ID0ge1xyXG4gICAgICB2YWx1ZTogdGhpcy5zZWFyY2hWYWx1ZSxcclxuICAgICAgaW5wdXRSZWY6IHRoaXMubmd4U2VhcmNoQm94XHJcbiAgICB9XHJcbiAgICB0aGlzLm1hdEV2ZW50RW1pdHRlclNlcnZpY2Uuc2VhcmNoVmFsdWVDaGFuZ2Uoc2VhcmNoT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNlcmFjaEZvY3VzSW4oZXZlbnQpIHtcclxuICAgIGxldCBzZWFyY2hPYmplY3QgPSB7XHJcbiAgICAgIHZhbHVlOiB0aGlzLnNlYXJjaFZhbHVlLFxyXG4gICAgICBpbnB1dFJlZjogdGhpcy5uZ3hTZWFyY2hCb3hcclxuICAgIH1cclxuICAgIHRoaXMubWF0RXZlbnRFbWl0dGVyU2VydmljZS5zZXJhY2hGb2N1c0luKHNlYXJjaE9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TZXJhY2hGb2N1c091dChldmVudCkge1xyXG4gICAgbGV0IHNlYXJjaE9iamVjdCA9IHtcclxuICAgICAgdmFsdWU6IHRoaXMuc2VhcmNoVmFsdWUsXHJcbiAgICAgIGlucHV0UmVmOiB0aGlzLm5neFNlYXJjaEJveFxyXG4gICAgfVxyXG4gICAgdGhpcy5tYXRFdmVudEVtaXR0ZXJTZXJ2aWNlLnNlcmFjaEZvY3VzT3V0KHNlYXJjaE9iamVjdCk7XHJcbiAgfVxyXG59Il19