angular-admin-lte-teliqo
Version:
npm# angular-admin-lte
525 lines (523 loc) • 56.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, NgZone, QueryList, Renderer2, ViewChild, ViewChildren } from '@angular/core';
import { NavigationEnd, PRIMARY_OUTLET, Router } from '@angular/router';
import { RoutingService } from '../../services/routing.service';
import { WrapperService } from '../wrapper/wrapper.service';
import { HeaderService } from '../header/header.service';
import { LayoutStore } from '../layout.store';
import { removeListeners, removeSubscriptions } from '../../helpers';
import { SidebarLeftToggleDirective } from './sidebar-left.directive';
/**
* @record
*/
export function Item() { }
function Item_tsickle_Closure_declarations() {
/** @type {?} */
Item.prototype.id;
/** @type {?} */
Item.prototype.parentId;
/** @type {?} */
Item.prototype.label;
/** @type {?|undefined} */
Item.prototype.route;
/** @type {?|undefined} */
Item.prototype.iconClasses;
/** @type {?|undefined} */
Item.prototype.children;
/** @type {?|undefined} */
Item.prototype.isActive;
/** @type {?|undefined} */
Item.prototype.isCollapsed;
/** @type {?|undefined} */
Item.prototype.disableCollapse;
}
export class SidebarLeftComponent {
/**
* \@method constructor
* @param {?} changeDetectorRef [description]
* @param {?} layoutStore [description]
* @param {?} ngZone [description]
* @param {?} renderer2 [description]
* @param {?} router [description]
* @param {?} routingService [description]
* @param {?} wrapperService [description]
* @param {?} headerService [description]
*/
constructor(changeDetectorRef, layoutStore, ngZone, renderer2, router, routingService, wrapperService, headerService) {
this.changeDetectorRef = changeDetectorRef;
this.layoutStore = layoutStore;
this.ngZone = ngZone;
this.renderer2 = renderer2;
this.router = router;
this.routingService = routingService;
this.wrapperService = wrapperService;
this.headerService = headerService;
this.collapsedItems = [];
this.activatedItems = [];
this.toggleListeners = [];
this.listeners = [];
this.itemsByIds = {};
this.runningAnimations = 0;
this.subscriptions = [];
}
/**
* \@method ngOnInit
* @return {?}
*/
ngOnInit() {
this.subscriptions.push(this.layoutStore.sidebarLeftMenu.subscribe(value => {
this.menu = value;
this.monkeyPatchMenu(this.menu);
if (this.initialized) {
this.setMenuListeners(this.activeUrl);
this.setSidebarListeners();
this.setMenuTogglesListeners();
}
this.initialized = true;
}));
this.subscriptions.push(this.layoutStore.sidebarLeftMenuActiveUrl.subscribe(value => {
this.activeUrl = value;
this.setMenuListeners(value);
}));
this.subscriptions.push(this.routingService.events.subscribe((event) => {
if (event instanceof NavigationEnd) {
this.activeUrl = event.url;
this.setMenuListeners(event.url);
}
}));
this.setSidebarListeners();
}
/**
* \@method ngAfterViewInit
* @return {?}
*/
ngAfterViewInit() {
this.setMenuTogglesListeners();
this.checkMenuWithoutChildren();
}
/**
* \@method ngOnDestroy
* @return {?}
*/
ngOnDestroy() {
this.subscriptions = removeSubscriptions(this.subscriptions);
this.listeners = removeListeners(this.listeners);
this.toggleListeners = removeListeners(this.toggleListeners);
}
/**
* [setSidebarListeners description]
* \@method setSidebarListeners
* @return {?}
*/
setSidebarListeners() {
this.subscriptions.push(this.layoutStore.layout.subscribe((value) => {
this.layout = value;
this.setSidebarHeight();
}));
this.subscriptions.push(this.layoutStore.windowInnerHeight.subscribe((value) => {
this.windowInnerHeight = value;
this.setSidebarHeight();
}));
this.subscriptions.push(this.layoutStore.sidebarLeftMenu.subscribe(() => {
this.changeDetectorRef.detectChanges();
}));
this.ngZone.runOutsideAngular(() => {
this.listeners.push(this.renderer2.listen(this.sidebarElement.nativeElement, 'mouseenter', () => {
this.layoutStore.sidebarLeftMouseOver(true);
}));
this.listeners.push(this.renderer2.listen(this.sidebarElement.nativeElement, 'mouseleave', () => {
this.layoutStore.sidebarLeftMouseOver(false);
}));
});
this.subscriptions.push(this.layoutStore.windowInnerWidth.subscribe((value) => {
this.windowInnerWidth = value;
if (!this.isSidebarLeftCollapsed && this.windowInnerWidth <= 767) {
this.layoutStore.sidebarLeftCollapsed(true);
}
else if (this.windowInnerWidth > 767 && this.isSidebarLeftCollapsed && !this.isSidebarLeftExpandOnOver) {
this.layoutStore.sidebarLeftCollapsed(false);
}
}));
this.subscriptions.push(this.layoutStore.isSidebarLeftMouseOver.subscribe((value) => {
this.isSidebarLeftMouseOver = value;
if (this.isSidebarLeftExpandOnOver) {
this.layoutStore.sidebarLeftCollapsed(!value);
}
}));
this.subscriptions.push(this.layoutStore.isSidebarLeftExpandOnOver.subscribe((value) => {
this.isSidebarLeftExpandOnOver = value;
if (this.windowInnerWidth > 767 && this.isSidebarLeftCollapsed !== undefined) {
this.layoutStore.sidebarLeftCollapsed(value);
}
}));
this.subscriptions.push(this.layoutStore.isSidebarLeftCollapsed.subscribe((value) => {
this.isSidebarLeftCollapsed = value;
if (this.windowInnerWidth <= 767) {
if (value) {
this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-open');
}
else {
this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-open');
}
}
else {
if (this.isSidebarLeftExpandOnOver && !this.isSidebarLeftMouseOver && !value) {
this.layoutStore.sidebarLeftExpandOnOver(false);
}
if (value) {
this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-collapse');
if (this.isSidebarLeftExpandOnOver) {
this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-expanded-on-hover');
}
}
else {
this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-collapse');
if (this.isSidebarLeftExpandOnOver) {
this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-expanded-on-hover');
}
}
}
}));
this.subscriptions.push(this.layoutStore.isSidebarLeftMini.subscribe((value) => {
if (value) {
this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-mini');
}
else {
this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-mini');
}
}));
}
/**
* [setMenuListeners description]
* \@method setMenuListeners
* @param {?} url
* @return {?}
*/
setMenuListeners(url) {
if (url === '/') {
this.activeItems(url);
this.changeDetectorRef.detectChanges();
}
else {
const /** @type {?} */ primaryOutlet = this.router.parseUrl(url).root.children[PRIMARY_OUTLET];
if (primaryOutlet) {
this.activeItems(primaryOutlet.toString());
this.changeDetectorRef.detectChanges();
}
}
if (this.windowInnerWidth <= 767 || this.isSidebarLeftExpandOnOver) {
this.layoutStore.sidebarLeftCollapsed(true);
}
}
/**
* [getIconClasses description]
* \@method getIconClasses
* @param {?} item [description]
* @return {?} [description]
*/
getIconClasses(item) {
if (item.iconClasses || item.iconClasses === '') {
return item.iconClasses;
}
else {
return 'fa fa-circle-o';
}
}
/**
* [visibilityStateStart description]
* \@method visibilityStateStart
* @param {?} event [description]
* @return {?}
*/
visibilityStateStart(event) {
this.runningAnimations++;
this.ngZone.runOutsideAngular(() => {
setTimeout(() => {
this.runningAnimations--;
if (!this.runningAnimations) {
this.layoutStore.setSidebarLeftElementHeight(this.sidebarElement.nativeElement.offsetHeight);
}
}, event.totalTime);
});
}
/**
* [uncollapseItemParents description]
* \@method uncollapseItemParents
* @param {?} item [description]
* @param {?=} isActive [description]
* @return {?}
*/
uncollapseItemParents(item, isActive = false) {
if (isActive) {
item.isActive = true;
this.activatedItems.push(item);
}
item.isCollapsed = false;
this.collapsedItems.push(item);
if (item.parentId) {
this.uncollapseItemParents(this.itemsByIds[item.parentId], isActive);
}
}
/**
* [findItemsByUrl description]
* \@method findItemsByUrl
* @param {?} url [description]
* @param {?} items [description]
* @param {?=} returnItems [description]
* @return {?} [description]
*/
findItemsByUrl(url, items, returnItems = []) {
items.forEach((item) => {
if (item.route === url) {
returnItems.push(item);
}
else if (item.children) {
this.findItemsByUrl(url, item.children, returnItems);
}
});
return returnItems;
}
/**
* [activeItems description]
* \@method activeItems
* @param {?} url [description]
* @return {?}
*/
activeItems(url) {
this.activatedItems.forEach((item) => {
item.isActive = false;
});
this.activatedItems = [];
this.collapsedItems.forEach((item) => {
item.isActive = false;
item.isCollapsed = true;
});
this.collapsedItems = [];
const /** @type {?} */ items = this.findItemsByUrl(url, this.menu);
items.forEach(item => {
item.isActive = true;
this.uncollapseItemParents(item, true);
this.activatedItems.push(item);
});
}
/**
* [monkeyPatchMenu description]
* \@method monkeyPatchMenu
* @param {?} items [description]
* @param {?=} parentId [description]
* @return {?}
*/
monkeyPatchMenu(items, parentId) {
items.forEach((item, index) => {
item.id = parentId ? Number(parentId + '' + index) : index;
if (parentId) {
item.parentId = parentId;
}
if (!item.disableCollapse) {
item.isCollapsed = true;
}
item.isActive = false;
if (parentId || item.children) {
this.itemsByIds[item.id] = item;
}
if (item.children) {
this.monkeyPatchMenu(item.children, item.id);
}
});
}
/**
* [setMenuTogglesListeners description]
* \@method setMenuTogglesListeners
* @return {?}
*/
setMenuTogglesListeners() {
this.toggleListeners = removeListeners(this.toggleListeners);
this.ngZone.runOutsideAngular(() => {
this.sidebarLeftToggleDirectives.forEach((menuToggle) => {
this.toggleListeners.push(this.renderer2.listen(menuToggle.elementRef.nativeElement, 'click', (event) => {
event.preventDefault();
if (menuToggle.item.isCollapsed) {
this.collapsedItems.forEach((item) => {
if (!item.disableCollapse) {
item.isCollapsed = true;
}
});
this.collapsedItems = [];
this.uncollapseItemParents(menuToggle.item);
}
else {
menuToggle.item.isCollapsed = !menuToggle.item.isCollapsed;
}
this.changeDetectorRef.detectChanges();
}));
});
});
}
/**
* [checkMenuWithoutChildren description]
* \@method checkMenuWithoutChildren
* @return {?}
*/
checkMenuWithoutChildren() {
let /** @type {?} */ menuHaveChildren;
this.menu.forEach((item) => {
if (item.children) {
return menuHaveChildren = true;
}
});
if (!menuHaveChildren) {
this.ngZone.runOutsideAngular(() => {
setTimeout(() => {
this.layoutStore.setSidebarLeftElementHeight(this.sidebarElement.nativeElement.offsetHeight);
});
});
}
}
/**
* [setSidebarHeight description]
* \@method setSidebarHeight
* @return {?}
*/
setSidebarHeight() {
if (this.layout === 'fixed') {
const /** @type {?} */ height = this.windowInnerHeight - this.headerService.offsetHeight;
if (height && height !== this.sidebarHeight) {
this.sidebarHeight = height;
this.sidebarOverflow = 'auto';
this.changeDetectorRef.detectChanges();
}
}
else if (this.sidebarHeight) {
this.sidebarOverflow = this.sidebarHeight = null;
this.changeDetectorRef.detectChanges();
}
}
}
SidebarLeftComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-layout-sidebar-left',
template: `<aside class="main-sidebar">
<section class="sidebar" #sidebarElement [style.height.px]="sidebarHeight" [style.overflow]="sidebarOverflow">
<ng-content></ng-content>
<ul class="sidebar-menu">
<ng-container *ngFor="let item of menu">
<ng-container *ngTemplateOutlet="sidebarInner; context: {item: item}"></ng-container>
</ng-container>
</ul>
</section>
</aside>
<ng-template #sidebarInner let-item="item">
<li [class.active]="item.isActive" [class.header]="item.separator" [class.menu-open]="!item.isCollapsed">
<span *ngIf="item.separator">{{item.label}}</span>
<a *ngIf="!item.separator && item.route" [routerLink]="item.route">
<i [class]="getIconClasses(item)"></i><span>{{item.label}}</span>
<span *ngIf="item.children || item.pullRights" class="pull-right-container">
<span *ngFor="let rightItem of item.pullRights" class="pull-right {{rightItem.classes}}">{{rightItem.text}}</span>
<i *ngIf="!item.pullRights" class="fa fa-angle-left pull-right"></i>
</span>
</a>
<a *ngIf="!item.separator && !item.route" href="#" [mkMenuToggle]="item">
<i [class]="getIconClasses(item)"></i><span>{{item.label}}</span>
<span *ngIf="item.children || item.pullRights" class="pull-right-container">
<span *ngFor="let rightItem of item.pullRights" class="pull-right {{rightItem.classes}}">{{rightItem.text}}</span>
<i *ngIf="!item.pullRights" class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul *ngIf="item.children" [collapseAnimation]="item.isCollapsed" (collapseAnimation.start)="visibilityStateStart($event)" class="treeview-menu">
<ng-container *ngFor="let item of item.children">
<ng-container *ngTemplateOutlet="sidebarInner; context: {item: item}"></ng-container>
</ng-container>
</ul>
</li>
</ng-template>
`,
styles: [`.treeview-menu.collapse{display:none}.treeview-menu,.treeview-menu.collapse.in{display:block}`],
changeDetection: ChangeDetectionStrategy.OnPush
},] },
];
/** @nocollapse */
SidebarLeftComponent.ctorParameters = () => [
{ type: ChangeDetectorRef, },
{ type: LayoutStore, },
{ type: NgZone, },
{ type: Renderer2, },
{ type: Router, },
{ type: RoutingService, },
{ type: WrapperService, },
{ type: HeaderService, },
];
SidebarLeftComponent.propDecorators = {
"sidebarElement": [{ type: ViewChild, args: ['sidebarElement',] },],
"sidebarLeftToggleDirectives": [{ type: ViewChildren, args: [SidebarLeftToggleDirective,] },],
};
function SidebarLeftComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
SidebarLeftComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
SidebarLeftComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
SidebarLeftComponent.propDecorators;
/** @type {?} */
SidebarLeftComponent.prototype.menu;
/** @type {?} */
SidebarLeftComponent.prototype.sidebarHeight;
/** @type {?} */
SidebarLeftComponent.prototype.sidebarOverflow;
/** @type {?} */
SidebarLeftComponent.prototype.layout;
/** @type {?} */
SidebarLeftComponent.prototype.isSidebarLeftCollapsed;
/** @type {?} */
SidebarLeftComponent.prototype.isSidebarLeftExpandOnOver;
/** @type {?} */
SidebarLeftComponent.prototype.isSidebarLeftMouseOver;
/** @type {?} */
SidebarLeftComponent.prototype.windowInnerWidth;
/** @type {?} */
SidebarLeftComponent.prototype.windowInnerHeight;
/** @type {?} */
SidebarLeftComponent.prototype.collapsedItems;
/** @type {?} */
SidebarLeftComponent.prototype.activatedItems;
/** @type {?} */
SidebarLeftComponent.prototype.toggleListeners;
/** @type {?} */
SidebarLeftComponent.prototype.listeners;
/** @type {?} */
SidebarLeftComponent.prototype.itemsByIds;
/** @type {?} */
SidebarLeftComponent.prototype.runningAnimations;
/** @type {?} */
SidebarLeftComponent.prototype.subscriptions;
/** @type {?} */
SidebarLeftComponent.prototype.activeUrl;
/** @type {?} */
SidebarLeftComponent.prototype.initialized;
/** @type {?} */
SidebarLeftComponent.prototype.sidebarElement;
/** @type {?} */
SidebarLeftComponent.prototype.sidebarLeftToggleDirectives;
/** @type {?} */
SidebarLeftComponent.prototype.changeDetectorRef;
/** @type {?} */
SidebarLeftComponent.prototype.layoutStore;
/** @type {?} */
SidebarLeftComponent.prototype.ngZone;
/** @type {?} */
SidebarLeftComponent.prototype.renderer2;
/** @type {?} */
SidebarLeftComponent.prototype.router;
/** @type {?} */
SidebarLeftComponent.prototype.routingService;
/** @type {?} */
SidebarLeftComponent.prototype.wrapperService;
/** @type {?} */
SidebarLeftComponent.prototype.headerService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci1sZWZ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItYWRtaW4tbHRlLXRlbGlxby8iLCJzb3VyY2VzIjpbImxpYi9sYXlvdXQvc2lkZWJhci1sZWZ0L3NpZGViYXItbGVmdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUdOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXVCLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFNUYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBRTlELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRzVDLE9BQU8sRUFBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFbkUsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5RHBFLE1BQU07Ozs7Ozs7Ozs7OztJQW9DSixZQUNVLG1CQUNBLGFBQ0EsUUFDQSxXQUNBLFFBQ0EsZ0JBQ0EsZ0JBQ0E7UUFQQSxzQkFBaUIsR0FBakIsaUJBQWlCO1FBQ2pCLGdCQUFXLEdBQVgsV0FBVztRQUNYLFdBQU0sR0FBTixNQUFNO1FBQ04sY0FBUyxHQUFULFNBQVM7UUFDVCxXQUFNLEdBQU4sTUFBTTtRQUNOLG1CQUFjLEdBQWQsY0FBYztRQUNkLG1CQUFjLEdBQWQsY0FBYztRQUNkLGtCQUFh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QkFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3hDO1NBQ0Y7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDeEM7Ozs7WUFuYUosU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx3QkFBd0I7Z0JBQ2xDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FtQ1g7Z0JBQ0MsTUFBTSxFQUFFLENBQUMsK0ZBQStGLENBQUM7Z0JBQ3pHLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEOzs7O1lBL0VDLGlCQUFpQjtZQWtCWCxXQUFXO1lBZmpCLE1BQU07WUFJTixTQUFTO1lBSWtELE1BQU07WUFFM0QsY0FBYztZQUVkLGNBQWM7WUFDZCxhQUFhOzs7K0JBcUZsQixTQUFTLFNBQUMsZ0JBQWdCOzRDQUUxQixZQUFZLFNBQUMsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RXZlbnQgYXMgUm91dGVyRXZlbnQsIE5hdmlnYXRpb25FbmQsIFBSSU1BUllfT1VUTEVULCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7Um91dGluZ1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JvdXRpbmcuc2VydmljZSc7XG5cbmltcG9ydCB7V3JhcHBlclNlcnZpY2V9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBlci5zZXJ2aWNlJztcbmltcG9ydCB7SGVhZGVyU2VydmljZX0gZnJvbSAnLi4vaGVhZGVyL2hlYWRlci5zZXJ2aWNlJztcblxuaW1wb3J0IHtMYXlvdXRTdG9yZX0gZnJvbSAnLi4vbGF5b3V0LnN0b3JlJztcblxuaW1wb3J0IHtBbmltYXRpb25FdmVudH0gZnJvbSAnLi4vLi4vYW5pbWF0aW9ucy9hbmltYXRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQge3JlbW92ZUxpc3RlbmVycywgcmVtb3ZlU3Vic2NyaXB0aW9uc30gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5cbmltcG9ydCB7U2lkZWJhckxlZnRUb2dnbGVEaXJlY3RpdmV9IGZyb20gJy4vc2lkZWJhci1sZWZ0LmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbSB7XG4gIGlkOiBudW1iZXI7XG4gIHBhcmVudElkOiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHJvdXRlPzogc3RyaW5nO1xuICBpY29uQ2xhc3Nlcz86IHN0cmluZztcbiAgY2hpbGRyZW4/OiBBcnJheTxJdGVtPjtcbiAgaXNBY3RpdmU/OiBib29sZWFuO1xuICBpc0NvbGxhcHNlZD86IGJvb2xlYW47XG4gIGRpc2FibGVDb2xsYXBzZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEl0ZW1zID0gQXJyYXk8SXRlbT47XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21rLWxheW91dC1zaWRlYmFyLWxlZnQnLFxuICB0ZW1wbGF0ZTogYDxhc2lkZSBjbGFzcz1cIm1haW4tc2lkZWJhclwiPlxuICA8c2VjdGlvbiBjbGFzcz1cInNpZGViYXJcIiAjc2lkZWJhckVsZW1lbnQgW3N0eWxlLmhlaWdodC5weF09XCJzaWRlYmFySGVpZ2h0XCIgW3N0eWxlLm92ZXJmbG93XT1cInNpZGViYXJPdmVyZmxvd1wiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgXHQ8dWwgY2xhc3M9XCJzaWRlYmFyLW1lbnVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWVudVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2lkZWJhcklubmVyOyBjb250ZXh0OiB7aXRlbTogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICBcdDwvdWw+XG4gIDwvc2VjdGlvbj5cbjwvYXNpZGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2lkZWJhcklubmVyIGxldC1pdGVtPVwiaXRlbVwiPlxuICA8bGkgW2NsYXNzLmFjdGl2ZV09XCJpdGVtLmlzQWN0aXZlXCIgW2NsYXNzLmhlYWRlcl09XCJpdGVtLnNlcGFyYXRvclwiIFtjbGFzcy5tZW51LW9wZW5dPVwiIWl0ZW0uaXNDb2xsYXBzZWRcIj5cbiAgICA8c3BhbiAqbmdJZj1cIml0ZW0uc2VwYXJhdG9yXCI+e3tpdGVtLmxhYmVsfX08L3NwYW4+XG4gICAgPGEgKm5nSWY9XCIhaXRlbS5zZXBhcmF0b3IgJiYgaXRlbS5yb3V0ZVwiIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVcIj5cbiAgICBcdDxpIFtjbGFzc109XCJnZXRJY29uQ2xhc3NlcyhpdGVtKVwiPjwvaT48c3Bhbj57e2l0ZW0ubGFiZWx9fTwvc3Bhbj5cbiAgICBcdDxzcGFuICpuZ0lmPVwiaXRlbS5jaGlsZHJlbiB8fCBpdGVtLnB1bGxSaWdodHNcIiBjbGFzcz1cInB1bGwtcmlnaHQtY29udGFpbmVyXCI+XG4gICAgXHRcdDxzcGFuICpuZ0Zvcj1cImxldCByaWdodEl0ZW0gb2YgaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJwdWxsLXJpZ2h0IHt7cmlnaHRJdGVtLmNsYXNzZXN9fVwiPnt7cmlnaHRJdGVtLnRleHR9fTwvc3Bhbj5cbiAgICBcdCAgPGkgKm5nSWY9XCIhaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJmYSBmYS1hbmdsZS1sZWZ0IHB1bGwtcmlnaHRcIj48L2k+XG4gICAgXHQ8L3NwYW4+XG4gICAgPC9hPlxuICAgIDxhICpuZ0lmPVwiIWl0ZW0uc2VwYXJhdG9yICYmICFpdGVtLnJvdXRlXCIgaHJlZj1cIiNcIiBbbWtNZW51VG9nZ2xlXT1cIml0ZW1cIj5cbiAgICBcdDxpIFtjbGFzc109XCJnZXRJY29uQ2xhc3NlcyhpdGVtKVwiPjwvaT48c3Bhbj57e2l0ZW0ubGFiZWx9fTwvc3Bhbj5cbiAgICBcdDxzcGFuICpuZ0lmPVwiaXRlbS5jaGlsZHJlbiB8fCBpdGVtLnB1bGxSaWdodHNcIiBjbGFzcz1cInB1bGwtcmlnaHQtY29udGFpbmVyXCI+XG4gICAgXHRcdDxzcGFuICpuZ0Zvcj1cImxldCByaWdodEl0ZW0gb2YgaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJwdWxsLXJpZ2h0IHt7cmlnaHRJdGVtLmNsYXNzZXN9fVwiPnt7cmlnaHRJdGVtLnRleHR9fTwvc3Bhbj5cbiAgICBcdCAgPGkgKm5nSWY9XCIhaXRlbS5wdWxsUmlnaHRzXCIgY2xhc3M9XCJmYSBmYS1hbmdsZS1sZWZ0IHB1bGwtcmlnaHRcIj48L2k+XG4gICAgXHQ8L3NwYW4+XG4gICAgPC9hPlxuICAgIDx1bCAqbmdJZj1cIml0ZW0uY2hpbGRyZW5cIiBbY29sbGFwc2VBbmltYXRpb25dPVwiaXRlbS5pc0NvbGxhcHNlZFwiIChjb2xsYXBzZUFuaW1hdGlvbi5zdGFydCk9XCJ2aXNpYmlsaXR5U3RhdGVTdGFydCgkZXZlbnQpXCIgY2xhc3M9XCJ0cmVldmlldy1tZW51XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW0uY2hpbGRyZW5cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNpZGViYXJJbm5lcjsgY29udGV4dDoge2l0ZW06IGl0ZW19XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3VsPlxuICA8L2xpPlxuPC9uZy10ZW1wbGF0ZT5cbmAsXG4gIHN0eWxlczogW2AudHJlZXZpZXctbWVudS5jb2xsYXBzZXtkaXNwbGF5Om5vbmV9LnRyZWV2aWV3LW1lbnUsLnRyZWV2aWV3LW1lbnUuY29sbGFwc2UuaW57ZGlzcGxheTpibG9ja31gXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU2lkZWJhckxlZnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBtZW51OiBBcnJheTxhbnk+O1xuICBwdWJsaWMgc2lkZWJhckhlaWdodDogbnVtYmVyO1xuICBwdWJsaWMgc2lkZWJhck92ZXJmbG93OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBsYXlvdXQ6IHN0cmluZztcbiAgcHJpdmF0ZSBpc1NpZGViYXJMZWZ0Q29sbGFwc2VkOiBib29sZWFuO1xuICBwcml2YXRlIGlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXI6IGJvb2xlYW47XG4gIHByaXZhdGUgaXNTaWRlYmFyTGVmdE1vdXNlT3ZlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSB3aW5kb3dJbm5lcldpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgd2luZG93SW5uZXJIZWlnaHQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBjb2xsYXBzZWRJdGVtczogSXRlbXMgPSBbXTtcbiAgcHJpdmF0ZSBhY3RpdmF0ZWRJdGVtczogSXRlbXMgPSBbXTtcbiAgcHJpdmF0ZSB0b2dnbGVMaXN0ZW5lcnM6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xuICBwcml2YXRlIGxpc3RlbmVyczogQXJyYXk8RnVuY3Rpb24+ID0gW107XG4gIHByaXZhdGUgaXRlbXNCeUlkczoge1twcm9wS2V5OiBudW1iZXJdOiBJdGVtfSA9IHt9O1xuICBwcml2YXRlIHJ1bm5pbmdBbmltYXRpb25zID0gMDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gW107XG4gIHByaXZhdGUgYWN0aXZlVXJsOiBTdHJpbmc7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG5cbiAgQFZpZXdDaGlsZCgnc2lkZWJhckVsZW1lbnQnKSBwdWJsaWMgc2lkZWJhckVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZHJlbihTaWRlYmFyTGVmdFRvZ2dsZURpcmVjdGl2ZSkgcHVibGljIHNpZGViYXJMZWZ0VG9nZ2xlRGlyZWN0aXZlczogUXVlcnlMaXN0PFNpZGViYXJMZWZ0VG9nZ2xlRGlyZWN0aXZlPjtcblxuICAvKipcbiAgICogQG1ldGhvZCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gIGNoYW5nZURldGVjdG9yUmVmICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAgbGF5b3V0U3RvcmUgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtICBuZ1pvbmUgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0gIHJlbmRlcmVyMiAgICAgICAgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAgcm91dGVyICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtICByb3V0aW5nU2VydmljZSAgICAgW2Rlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0gIHdyYXBwZXJTZXJ2aWNlICAgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAgaGVhZGVyU2VydmljZSAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbGF5b3V0U3RvcmU6IExheW91dFN0b3JlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGluZ1NlcnZpY2U6IFJvdXRpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgd3JhcHBlclNlcnZpY2U6IFdyYXBwZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgaGVhZGVyU2VydmljZTogSGVhZGVyU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmdPbkluaXRcbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNZW51LnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLm1lbnUgPSB2YWx1ZTtcbiAgICAgIHRoaXMubW9ua2V5UGF0Y2hNZW51KHRoaXMubWVudSk7XG4gICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLnNldE1lbnVMaXN0ZW5lcnModGhpcy5hY3RpdmVVcmwpO1xuICAgICAgICB0aGlzLnNldFNpZGViYXJMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5zZXRNZW51VG9nZ2xlc0xpc3RlbmVycygpO1xuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNZW51QWN0aXZlVXJsLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLmFjdGl2ZVVybCA9IHZhbHVlO1xuICAgICAgdGhpcy5zZXRNZW51TGlzdGVuZXJzKHZhbHVlKTtcbiAgICB9KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5yb3V0aW5nU2VydmljZS5ldmVudHMuc3Vic2NyaWJlKChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVVcmwgPSBldmVudC51cmw7XG4gICAgICAgIHRoaXMuc2V0TWVudUxpc3RlbmVycyhldmVudC51cmwpO1xuICAgICAgfVxuICAgIH0pKTtcblxuICAgIHRoaXMuc2V0U2lkZWJhckxpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmdBZnRlclZpZXdJbml0XG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5zZXRNZW51VG9nZ2xlc0xpc3RlbmVycygpO1xuICAgIHRoaXMuY2hlY2tNZW51V2l0aG91dENoaWxkcmVuKCk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBuZ09uRGVzdHJveVxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gcmVtb3ZlU3Vic2NyaXB0aW9ucyh0aGlzLnN1YnNjcmlwdGlvbnMpO1xuICAgIHRoaXMubGlzdGVuZXJzID0gcmVtb3ZlTGlzdGVuZXJzKHRoaXMubGlzdGVuZXJzKTtcbiAgICB0aGlzLnRvZ2dsZUxpc3RlbmVycyA9IHJlbW92ZUxpc3RlbmVycyh0aGlzLnRvZ2dsZUxpc3RlbmVycyk7XG4gIH1cblxuICAvKipcbiAgICogW3NldFNpZGViYXJMaXN0ZW5lcnMgZGVzY3JpcHRpb25dXG4gICAqIEBtZXRob2Qgc2V0U2lkZWJhckxpc3RlbmVyc1xuICAgKi9cbiAgc2V0U2lkZWJhckxpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLmxheW91dC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMubGF5b3V0ID0gdmFsdWU7XG4gICAgICB0aGlzLnNldFNpZGViYXJIZWlnaHQoKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLndpbmRvd0lubmVySGVpZ2h0LnN1YnNjcmliZSgodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy53aW5kb3dJbm5lckhlaWdodCA9IHZhbHVlO1xuICAgICAgdGhpcy5zZXRTaWRlYmFySGVpZ2h0KCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdE1lbnUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pKTtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2godGhpcy5yZW5kZXJlcjIubGlzdGVuKHRoaXMuc2lkZWJhckVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgICAgIHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNb3VzZU92ZXIodHJ1ZSk7XG4gICAgICB9KSk7XG4gICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHRoaXMucmVuZGVyZXIyLmxpc3Rlbih0aGlzLnNpZGViYXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0TW91c2VPdmVyKGZhbHNlKTtcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUud2luZG93SW5uZXJXaWR0aC5zdWJzY3JpYmUoKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgIHRoaXMud2luZG93SW5uZXJXaWR0aCA9IHZhbHVlO1xuICAgICAgaWYgKCF0aGlzLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQgJiYgdGhpcy53aW5kb3dJbm5lcldpZHRoIDw9IDc2Nykge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0Q29sbGFwc2VkKHRydWUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLndpbmRvd0lubmVyV2lkdGggPiA3NjcgJiYgdGhpcy5pc1NpZGViYXJMZWZ0Q29sbGFwc2VkICYmICF0aGlzLmlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXIpIHtcbiAgICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdENvbGxhcHNlZChmYWxzZSk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5pc1NpZGViYXJMZWZ0TW91c2VPdmVyLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuaXNTaWRlYmFyTGVmdE1vdXNlT3ZlciA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3Zlcikge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0Q29sbGFwc2VkKCF2YWx1ZSk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5pc1NpZGViYXJMZWZ0RXhwYW5kT25PdmVyLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3ZlciA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMud2luZG93SW5uZXJXaWR0aCA+IDc2NyAmJiB0aGlzLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxheW91dFN0b3JlLnNpZGViYXJMZWZ0Q29sbGFwc2VkKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5pc1NpZGViYXJMZWZ0Q29sbGFwc2VkID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy53aW5kb3dJbm5lcldpZHRoIDw9IDc2Nykge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5yZW1vdmVDbGFzcyh0aGlzLndyYXBwZXJTZXJ2aWNlLndyYXBwZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzaWRlYmFyLW9wZW4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyh0aGlzLndyYXBwZXJTZXJ2aWNlLndyYXBwZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzaWRlYmFyLW9wZW4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3ZlciAmJiAhdGhpcy5pc1NpZGViYXJMZWZ0TW91c2VPdmVyICYmICF2YWx1ZSkge1xuICAgICAgICAgIHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRFeHBhbmRPbk92ZXIoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIyLmFkZENsYXNzKHRoaXMud3JhcHBlclNlcnZpY2Uud3JhcHBlckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NpZGViYXItY29sbGFwc2UnKTtcbiAgICAgICAgICBpZiAodGhpcy5pc1NpZGViYXJMZWZ0RXhwYW5kT25PdmVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5yZW1vdmVDbGFzcyh0aGlzLndyYXBwZXJTZXJ2aWNlLndyYXBwZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzaWRlYmFyLWV4cGFuZGVkLW9uLWhvdmVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIyLnJlbW92ZUNsYXNzKHRoaXMud3JhcHBlclNlcnZpY2Uud3JhcHBlckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NpZGViYXItY29sbGFwc2UnKTtcbiAgICAgICAgICBpZiAodGhpcy5pc1NpZGViYXJMZWZ0RXhwYW5kT25PdmVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyh0aGlzLndyYXBwZXJTZXJ2aWNlLndyYXBwZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzaWRlYmFyLWV4cGFuZGVkLW9uLWhvdmVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5pc1NpZGViYXJMZWZ0TWluaS5zdWJzY3JpYmUoKHZhbHVlOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlcjIuYWRkQ2xhc3ModGhpcy53cmFwcGVyU2VydmljZS53cmFwcGVyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2lkZWJhci1taW5pJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyMi5yZW1vdmVDbGFzcyh0aGlzLndyYXBwZXJTZXJ2aWNlLndyYXBwZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzaWRlYmFyLW1pbmknKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogW3NldE1lbnVMaXN0ZW5lcnMgZGVzY3JpcHRpb25dXG4gICAqIEBtZXRob2Qgc2V0TWVudUxpc3RlbmVyc1xuICAgKi9cbiAgc2V0TWVudUxpc3RlbmVycyh1cmwpOiB2b2lkIHtcbiAgICBpZiAodXJsID09PSAnLycpIHtcbiAgICAgIHRoaXMuYWN0aXZlSXRlbXModXJsKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmltYXJ5T3V0bGV0ID0gdGhpcy5yb3V0ZXIucGFyc2VVcmwodXJsKS5yb290LmNoaWxkcmVuW1BSSU1BUllfT1VUTEVUXTtcbiAgICAgIGlmIChwcmltYXJ5T3V0bGV0KSB7XG4gICAgICAgIHRoaXMuYWN0aXZlSXRlbXMocHJpbWFyeU91dGxldC50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLndpbmRvd0lubmVyV2lkdGggPD0gNzY3IHx8IHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3Zlcikge1xuICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdENvbGxhcHNlZCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW2dldEljb25DbGFzc2VzIGRlc2NyaXB0aW9uXVxuICAgKiBAbWV0aG9kIGdldEljb25DbGFzc2VzXG4gICAqIEBwYXJhbSBpdGVtIFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBwdWJsaWMgZ2V0SWNvbkNsYXNzZXMoaXRlbTogSXRlbSk6IHN0cmluZyB7XG4gICAgaWYgKGl0ZW0uaWNvbkNsYXNzZXMgfHwgaXRlbS5pY29uQ2xhc3NlcyA9PT0gJycpIHtcbiAgICAgIHJldHVybiBpdGVtLmljb25DbGFzc2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2ZhIGZhLWNpcmNsZS1vJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW3Zpc2liaWxpdHlTdGF0ZVN0YXJ0IGRlc2NyaXB0aW9uXVxuICAgKiBAbWV0aG9kIHZpc2liaWxpdHlTdGF0ZVN0YXJ0XG4gICAqIEBwYXJhbSBldmVudCBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBwdWJsaWMgdmlzaWJpbGl0eVN0YXRlU3RhcnQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5ydW5uaW5nQW5pbWF0aW9ucyArKztcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWx