@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
607 lines • 92.7 kB
JavaScript
import { EventEmitter, Injectable } from '@angular/core';
import { BehaviorSubject, of } from 'rxjs';
import { LoadingEmitter } from "../../../utility/loading-emitter";
import { filter, map, take } from "rxjs/operators";
import { DoubleDrawerUtils } from "../util/double-drawer-utils";
import { HttpParams } from "@angular/common/http";
import { PaginationParams } from "../../../utility/pagination/pagination-params";
import { SimpleFilter } from "../../../filter/models/simple-filter";
import { MENU_IDENTIFIERS, MenuOrder, RIGHT_SIDE_INIT_PAGE_SIZE, RIGHT_SIDE_NEW_PAGE_SIZE, SETTINGS_TRANSITION_ID } from '../../model/navigation-configs';
import { GroupNavigationConstants } from "../../model/group-navigation-constants";
import { PathService } from "../../service/path.service";
import * as i0 from "@angular/core";
import * as i1 from "../../../logger/services/logger.service";
import * as i2 from "../../../configuration/configuration.service";
import * as i3 from "@angular/router";
import * as i4 from "../../../resources/engine-endpoint/case-resource.service";
import * as i5 from "../../../authorization/permission/access.service";
import * as i6 from "@ngx-translate/core";
import * as i7 from "../../../routing/dynamic-navigation-route-provider/dynamic-navigation-route-provider.service";
import * as i8 from "../../../routing/redirect-service/redirect.service";
import * as i9 from "../../service/path.service";
import * as i10 from "../../../user/services/user.service";
/**
* Service for managing navigation in double-drawer
* */
export class DoubleDrawerNavigationService {
_log;
_config;
_activatedRoute;
_caseResourceService;
_accessService;
_translateService;
_dynamicRoutingService;
_redirectService;
_pathService;
_userService;
/**
* List of displayed items on the left side
* */
_leftItems$;
/**
* List of displayed items on the right side
* */
_rightItems$;
/**
* List of hidden items
* */
_moreItems$;
/**
* List of custom items in more menu
* */
_hiddenCustomItems$;
/**
* List of custom items
* */
_childCustomViews;
itemsOrder;
_leftLoading$;
_rightLoading$;
_nodeLoading$;
_currentPathSubscription;
_languageChangeSubscription;
/**
* Currently display uri
* Siblings of the node are on the left, children are on the right
*/
_currentPath;
_fromResolver;
/**
* Currently selected navigation item
*/
_currentNavigationItem;
defaultViewIcon = 'filter_alt';
customItemsInitialized;
hiddenCustomItemsInitialized;
itemClicked;
itemLoaded;
constructor(_log, _config, _activatedRoute, _caseResourceService, _accessService, _translateService, _dynamicRoutingService, _redirectService, _pathService, _userService) {
this._log = _log;
this._config = _config;
this._activatedRoute = _activatedRoute;
this._caseResourceService = _caseResourceService;
this._accessService = _accessService;
this._translateService = _translateService;
this._dynamicRoutingService = _dynamicRoutingService;
this._redirectService = _redirectService;
this._pathService = _pathService;
this._userService = _userService;
this._leftItems$ = new BehaviorSubject([]);
this._rightItems$ = new BehaviorSubject([]);
this._moreItems$ = new BehaviorSubject([]);
this._hiddenCustomItems$ = new BehaviorSubject([]);
this._childCustomViews = {};
this._leftLoading$ = new LoadingEmitter();
this._rightLoading$ = new LoadingEmitter();
this._nodeLoading$ = new LoadingEmitter();
this._currentNavigationItem = undefined;
this.itemsOrder = MenuOrder.Ascending;
this.customItemsInitialized = false;
this.hiddenCustomItemsInitialized = false;
this.itemClicked = new EventEmitter();
this.itemLoaded = new EventEmitter();
this._languageChangeSubscription = this._translateService.onLangChange.subscribe(() => {
this.refreshMenuItemTranslations();
});
}
ngOnDestroy() {
this._currentPathSubscription?.unsubscribe();
this._languageChangeSubscription?.unsubscribe();
this._leftLoading$.complete();
this._rightLoading$.complete();
this._nodeLoading$.complete();
this.itemClicked.complete();
this.itemLoaded.complete();
}
get canGoBackLoading$() {
return this._nodeLoading$;
}
get currentPath() {
return this._currentPath;
}
set currentPath(path) {
if (path === this._currentPath || this.leftLoading$.isActive || this.rightLoading$.isActive) {
return;
}
this._currentPath = path;
if (!path) {
return;
}
if (this.nodeLoading$.isActive) {
this.nodeLoading$.subscribe(() => {
this.resolveMenuItems(path);
});
}
else {
this.resolveMenuItems(path);
}
}
set currentNavigationItem(item) {
this._currentNavigationItem = item;
}
resolveMenuItems(path) {
if (path === PathService.SEPARATOR) {
this._leftItems$.next([]);
this.loadRightSide();
}
else {
if (!this.leftItems.find(item => item.resource?.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH)?.value === path)) {
this.loadLeftSide();
}
this.loadRightSide();
}
}
get itemClicked$() {
return this.itemClicked;
}
get itemLoaded$() {
return this.itemLoaded;
}
get rightItems$() {
return this._rightItems$;
}
get leftItems$() {
return this._leftItems$;
}
get moreItems$() {
return this._moreItems$;
}
get hiddenCustomItems$() {
return this._hiddenCustomItems$;
}
get rightItems() {
return this._rightItems$.getValue();
}
get leftItems() {
return this._leftItems$.getValue();
}
get moreItems() {
return this._moreItems$.getValue();
}
get hiddenCustomItems() {
return this._hiddenCustomItems$.getValue();
}
get leftLoading$() {
return this._leftLoading$;
}
get rightLoading$() {
return this._rightLoading$;
}
get nodeLoading$() {
return this._nodeLoading$;
}
set fromResolver(value) {
this._fromResolver = value;
}
loadNavigationItems(node) {
if (this.currentPath === PathService.SEPARATOR) {
this._leftItems$.next([]);
this.loadRightSide();
}
else {
if (!this._leftItems$.getValue().find(item => DoubleDrawerUtils.isNodeCorrespondingToItem(node, item))) {
this.loadLeftSide();
}
this.loadRightSide();
}
}
/**
* On home click, the current level is set to 0, and current parent is
* set to root node.
* */
onHomeClick() {
if (this.leftLoading$.isActive || this.rightLoading$.isActive) {
return;
}
this._pathService.activePath = PathService.SEPARATOR;
}
/**
* On back click, the parent is set to parent of left nodes, that will solve
* the right side menu (elements that were in left side, after backward
* navigation will be on the right side).
* Current level is set to a lower number in order to set the left side menu.
* */
onBackClick() {
if (this.leftLoading$.isActive || this.rightLoading$.isActive || this.currentPath === PathService.SEPARATOR) {
return;
}
this._pathService.activePath = this.extractParentPath(this.currentPath);
this.itemClicked.emit({ path: this._pathService.activePath, isHome: false });
}
/**
* On item click, the selected item's view is rendered (by routerLink). If the selected item has children items, the menu is updated
* and view, that is rendered is selected by the defined rule. The rule is: On first check for default view in children.
* On second check if the clicked item has a view. On third, pick any other children's view, else show nothing.
* */
onItemClick(item) {
this._currentNavigationItem = item;
if (item.resource === undefined) {
// custom view represented only in nae.json
if (item.processUri === this.currentPath) {
this._pathService.activePath = this.currentPath;
}
else {
this._pathService.activePath = this.extractParentPath(this.currentPath);
}
this.itemClicked.emit({ path: this._pathService.activePath, isHome: false });
}
else {
const path = item.resource.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH)?.value;
if (DoubleDrawerUtils.hasItemChildren(item) && !this.leftLoading$.isActive && !this.rightLoading$.isActive) {
this._pathService.activePath = path;
this.itemClicked.emit({ path: this._pathService.activePath, isHome: false });
this._rightLoading$.pipe(filter(isRightLoading => isRightLoading === false), take(1)).subscribe(() => {
this.openAvailableView();
});
}
else if (!path.includes(this.currentPath)) {
this._pathService.activePath = this.extractParentPath(this.currentPath);
this.itemClicked.emit({ path: this._pathService.activePath, isHome: false });
}
else {
this._pathService.activePath = this.currentPath;
this.itemClicked.emit({ path: this._pathService.activePath, isHome: false });
}
}
}
/**
* Opens a view of the current right items in the menu by defined rule. The rule is: First, it checks whether a navigation
* item was clicked. Second, check for default view in children.
* Third check if the clicked item has a view. Fourth, pick any other children's view, else
* show nothing.
* */
openAvailableView() {
let allItems = this.rightItems.concat(this.moreItems);
if (this._currentNavigationItem) {
let alreadyClickedItem = allItems.find(item => item.id === this._currentNavigationItem.id);
if (!!alreadyClickedItem) {
// when the folder has not changed and a menu item is clicked.
return;
}
}
if (this._fromResolver) {
this._fromResolver = false;
return;
}
let autoOpenItems = allItems.filter(item => DoubleDrawerUtils.hasItemAutoOpenView(item));
if (autoOpenItems.length > 0) {
this._redirectService.redirect(autoOpenItems[0].routing.path);
return;
}
if (DoubleDrawerUtils.hasItemView(this._currentNavigationItem)) {
// is routed by routerLink on item click
return;
}
let itemsWithView = allItems.filter(item => DoubleDrawerUtils.hasItemView(item));
if (itemsWithView.length > 0) {
this._redirectService.redirect(autoOpenItems[0].routing.path);
}
}
loadMoreItems() {
if (this.moreItems.length > RIGHT_SIDE_NEW_PAGE_SIZE) {
let currentRightItems = this.rightItems;
let currentMoreItems = this.moreItems;
currentRightItems.push(...currentMoreItems.splice(0, RIGHT_SIDE_NEW_PAGE_SIZE));
this.rightItems$.next(currentRightItems);
this.moreItems$.next(currentMoreItems);
}
else {
let currentRightItems = this.rightItems;
currentRightItems.push(...this.moreItems);
this.rightItems$.next(currentRightItems);
this.moreItems$.next([]);
}
}
initializeCustomViewsOfView(view, viewConfigPath) {
if (!view || this.customItemsInitialized || this.hiddenCustomItemsInitialized)
return;
Object.entries(view.children).forEach(([key, childView]) => {
const childViewConfigPath = viewConfigPath + '/' + key;
this.resolveUriForChildViews(childViewConfigPath, childView);
this.resolveHiddenMenuItemFromChildViews(childViewConfigPath, childView);
});
this.resolveCustomViewsInRightSide();
this.resolveCustomViewsInLeftSide();
this.customItemsInitialized = true;
this.hiddenCustomItemsInitialized = true;
}
switchOrder() {
this.itemsOrder = (this.itemsOrder + 1) % 2;
let multiplier = 1;
if (this.itemsOrder === MenuOrder.Descending) {
multiplier = -1;
}
const allRightItems = this.rightItems.concat(this.moreItems).sort((a, b) => multiplier * a?.navigation?.title.localeCompare(b?.navigation?.title));
const currentLeftItems = [...this.leftItems].sort((a, b) => multiplier * a?.navigation?.title.localeCompare(b?.navigation?.title));
this.rightItems$.next(allRightItems.slice(0, RIGHT_SIDE_INIT_PAGE_SIZE));
this.moreItems$.next(allRightItems.slice(RIGHT_SIDE_INIT_PAGE_SIZE));
this.leftItems$.next(currentLeftItems);
}
isAscending() {
return this.itemsOrder === MenuOrder.Ascending;
}
loadLeftSide() {
if (this.currentPath === PathService.SEPARATOR) {
this._leftItems$.next([]);
return;
}
this.leftLoading$.on();
this.getItemCaseByPath(this.extractParentPath(this.currentPath)).subscribe(page => {
let childCases$;
let targetItem;
let orderedChildCaseIds;
if (page?.pagination?.totalElements === 0) {
childCases$ = of([]);
}
else {
targetItem = page.content[0];
orderedChildCaseIds = DoubleDrawerUtils.extractChildCaseIds(targetItem);
if (orderedChildCaseIds == undefined || orderedChildCaseIds.length === 0) {
childCases$ = of([]);
}
else {
childCases$ = this.getItemCasesByIdsInOnePage(orderedChildCaseIds).pipe(map(p => p.content));
}
}
childCases$.subscribe(result => {
result = result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i);
this._leftItems$.next(result.sort((a, b) => orderedChildCaseIds.indexOf(a.resource.stringId) - orderedChildCaseIds.indexOf(b.resource.stringId)));
this.resolveCustomViewsInLeftSide();
this._leftLoading$.off();
this.itemLoaded.emit({ menu: 'left', items: this.leftItems });
}, error => {
this._log.error(error);
this._leftItems$.next([]);
this.resolveCustomViewsInLeftSide();
this._leftLoading$.off();
});
}, error => {
this._log.error(error);
this._leftItems$.next([]);
this.resolveCustomViewsInLeftSide();
this._leftLoading$.off();
});
}
loadRightSide() {
this._rightLoading$.on();
this._moreItems$.next([]);
this.getItemCaseByPath(this.currentPath).subscribe(page => {
let childCases$;
let targetItem;
let orderedChildCaseIds;
if (page?.pagination?.totalElements === 0) {
childCases$ = of([]);
}
else {
targetItem = page?.content[0];
orderedChildCaseIds = DoubleDrawerUtils.extractChildCaseIds(targetItem);
if (orderedChildCaseIds === undefined || orderedChildCaseIds.length === 0) {
childCases$ = of([]);
}
else {
childCases$ = this.getItemCasesByIdsInOnePage(orderedChildCaseIds).pipe(map(p => p.content));
}
}
childCases$.subscribe(result => {
result = result.sort((a, b) => orderedChildCaseIds.indexOf(a.stringId) - orderedChildCaseIds.indexOf(b.stringId));
if (result.length > RIGHT_SIDE_INIT_PAGE_SIZE) {
const rawRightItems = result.splice(0, RIGHT_SIDE_INIT_PAGE_SIZE);
this._rightItems$.next(rawRightItems.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i));
this._moreItems$.next(result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i));
}
else {
this._rightItems$.next(result.map(folder => this.resolveItemCaseToNavigationItem(folder)).filter(i => !!i));
}
this.resolveCustomViewsInRightSide();
this._rightLoading$.off();
this.itemLoaded.emit({ menu: 'right', items: this.rightItems });
this.openAvailableView();
}, error => {
this._log.error(error);
this._rightItems$.next([]);
this._moreItems$.next([]);
this.resolveCustomViewsInRightSide();
this._rightLoading$.off();
});
}, error => {
this._log.error(error);
this._rightItems$.next([]);
this._moreItems$.next([]);
this.resolveCustomViewsInRightSide();
this._rightLoading$.off();
});
}
getItemCasesByIdsInOnePage(caseIds) {
return this.getItemCasesByIds(caseIds, 0, caseIds.length);
}
getItemCasesByIds(caseIds, pageNumber, pageSize) {
const searchBody = {
id: caseIds,
process: MENU_IDENTIFIERS.map(id => ({ identifier: id })),
};
let httpParams = new HttpParams()
.set(PaginationParams.PAGE_SIZE, pageSize)
.set(PaginationParams.PAGE_NUMBER, pageNumber);
return this._caseResourceService.searchCases(SimpleFilter.fromCaseQuery(searchBody), httpParams);
}
resolveItemCaseToNavigationItem(itemCase) {
if (DoubleDrawerUtils.representsRootNode(itemCase)) {
return;
}
const item = {
access: {},
navigation: {
icon: itemCase.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_MENU_ICON)?.value || this.defaultViewIcon,
title: this.resolveMenuItemTitle(itemCase),
},
routing: {
path: this.getItemRoutingPath(itemCase),
},
id: itemCase.stringId,
resource: itemCase,
};
const resolvedRoles = DoubleDrawerUtils.resolveAccessRoles(itemCase, GroupNavigationConstants.ITEM_FIELD_ID_ALLOWED_ROLES);
const resolvedBannedRoles = DoubleDrawerUtils.resolveAccessRoles(itemCase, GroupNavigationConstants.ITEM_FIELD_ID_BANNED_ROLES);
if (!!resolvedRoles)
item.access['role'] = resolvedRoles;
if (!!resolvedBannedRoles)
item.access['bannedRole'] = resolvedBannedRoles;
if (!this._accessService.canAccessView(item, item.routing?.path))
return;
return item;
}
refreshMenuItemTranslations() {
this._leftItems$.next(this.refreshItemTranslations(this.leftItems));
this._rightItems$.next(this.refreshItemTranslations(this.rightItems));
this._moreItems$.next(this.refreshItemTranslations(this.moreItems));
if (this._currentNavigationItem?.resource) {
this._currentNavigationItem = this.refreshItemTranslation(this._currentNavigationItem);
}
}
refreshItemTranslations(items) {
return items.map(item => this.refreshItemTranslation(item));
}
refreshItemTranslation(item) {
if (!item.resource) {
return item;
}
const navigation = typeof item.navigation === 'object' ? item.navigation : {};
return {
...item,
navigation: {
...navigation,
title: this.resolveMenuItemTitle(item.resource),
},
};
}
resolveMenuItemTitle(itemCase) {
const menuName = itemCase.immediateData
.find(field => field.stringId === GroupNavigationConstants.ITEM_FIELD_ID_MENU_NAME)?.value;
return this.getTranslation(menuName) || itemCase.title;
}
resolveCustomViewsInLeftSide() {
let currentLeftItems = this._leftItems$.getValue().filter(item => item.resource !== undefined);
if (!!this.extractParentPath(this.currentPath) && !!this._childCustomViews[this.extractParentPath(this.currentPath)]) {
currentLeftItems.push(...Object.values(this._childCustomViews[this.extractParentPath(this.currentPath)]));
}
this._leftItems$.next(DoubleDrawerUtils.sortByOrder(currentLeftItems));
}
resolveCustomViewsInRightSide() {
const currentRightItems = this._rightItems$.getValue().filter(item => item.resource !== undefined);
const currentMoreItems = this._moreItems$.getValue().filter(item => item.resource !== undefined);
const customItems = !!this._currentPath && !!this._childCustomViews[this._currentPath]
? Object.values(this._childCustomViews[this._currentPath])
: [];
// childItemIds defines the process fallback order. Custom items follow in nae.json declaration order.
// Explicit order is applied to the complete list before it is split into visible and "more" pages.
const combinedItems = currentRightItems.concat(currentMoreItems, customItems);
const orderedItems = DoubleDrawerUtils.sortByOrder(combinedItems);
this._rightItems$.next(orderedItems.slice(0, RIGHT_SIDE_INIT_PAGE_SIZE));
this._moreItems$.next(orderedItems.slice(RIGHT_SIDE_INIT_PAGE_SIZE));
}
resolveUriForChildViews(configPath, childView) {
if (!childView.processUri)
return;
if (!this._accessService.canAccessView(childView, configPath))
return;
if (!this._childCustomViews[childView.processUri]) {
this._childCustomViews[childView.processUri] = {};
}
this._childCustomViews[childView.processUri][configPath] = {
id: configPath,
...childView,
};
}
resolveHiddenMenuItemFromChildViews(configPath, childView) {
if (!childView.navigation)
return;
if (!this._accessService.canAccessView(childView, configPath))
return;
if (!!(childView?.navigation?.hidden)) {
const hiddenItem = {
id: configPath,
...childView,
};
this._hiddenCustomItems$.next(DoubleDrawerUtils.sortByOrder([
...this._hiddenCustomItems$.getValue(),
hiddenItem
]));
}
}
getTranslation(value) {
if (!value) {
return undefined;
}
const locale = this._translateService.currentLang?.split('-')[0];
return locale && value.translations && locale in value.translations
? value.translations[locale]
: value.defaultValue;
}
getItemRoutingPath(itemCase) {
const taskId = DoubleDrawerUtils.findTaskIdInCase(itemCase, SETTINGS_TRANSITION_ID);
const url = this._dynamicRoutingService.route;
const prefix = url.startsWith('/') ? '' : '/';
return `${prefix}${url}/${taskId}`;
}
processLeftItems(cases, orderedChildCaseIds) {
const result = cases
.map(folder => this.resolveItemCaseToNavigationItem(folder))
.filter(i => !!i);
return result.sort((a, b) => orderedChildCaseIds.indexOf(a.resource.stringId) - orderedChildCaseIds.indexOf(b.resource.stringId));
}
/**
* Retrieves a case item based on the given path.
* @param {string} [path] - The identifier path to locate the specific case item. If undefined, it defaults to searching without a specific path.
* @return {Observable<Page<Case>>} An observable stream containing the page of case items which match the provided path.
*/
getItemCaseByPath(path) {
const searchBody = {
data: {
[GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH]: path
},
process: { identifier: "menu_item" }
};
let httpParams = new HttpParams()
.set(PaginationParams.PAGE_SIZE, 1)
.set(PaginationParams.PAGE_NUMBER, 0);
return this._caseResourceService.searchCases(SimpleFilter.fromCaseQuery(searchBody), httpParams);
}
extractParentPath(path) {
if (path === '/') {
return path;
}
if (path?.lastIndexOf('/') === 0) {
return '/';
}
return path?.substring(0, path?.lastIndexOf('/'));
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DoubleDrawerNavigationService, deps: [{ token: i1.LoggerService }, { token: i2.ConfigurationService }, { token: i3.ActivatedRoute }, { token: i4.CaseResourceService }, { token: i5.AccessService }, { token: i6.TranslateService }, { token: i7.DynamicNavigationRouteProviderService }, { token: i8.RedirectService }, { token: i9.PathService }, { token: i10.UserService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DoubleDrawerNavigationService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DoubleDrawerNavigationService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: () => [{ type: i1.LoggerService }, { type: i2.ConfigurationService }, { type: i3.ActivatedRoute }, { type: i4.CaseResourceService }, { type: i5.AccessService }, { type: i6.TranslateService }, { type: i7.DynamicNavigationRouteProviderService }, { type: i8.RedirectService }, { type: i9.PathService }, { type: i10.UserService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG91YmxlLWRyYXdlci1uYXZpZ2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL25hdmlnYXRpb24vbmF2aWdhdGlvbi1kb3VibGUtZHJhd2VyL3NlcnZpY2UvZG91YmxlLWRyYXdlci1uYXZpZ2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUFDLGVBQWUsRUFBYyxFQUFFLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRzlELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUMvRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFZbEUsT0FBTyxFQUNILGdCQUFnQixFQUNoQixTQUFTLEVBRVQseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDekIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUd4QyxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7OztBQUd2RDs7S0FFSztBQUlMLE1BQU0sT0FBTyw2QkFBNkI7SUE2Q3hCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNB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QUFpQixDQUFDLElBQVk7UUFDakMsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO1lBQ2QsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDOUIsT0FBTyxHQUFHLENBQUM7U0FDZDtRQUNELE9BQU8sSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7d0dBcG5CUSw2QkFBNkI7NEdBQTdCLDZCQUE2QixjQUYxQixNQUFNOzs0RkFFVCw2QkFBNkI7a0JBSHpDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0xvYWRpbmdFbWl0dGVyfSBmcm9tIFwiLi4vLi4vLi4vdXRpbGl0eS9sb2FkaW5nLWVtaXR0ZXJcIjtcbmltcG9ydCB7ZmlsdGVyLCBtYXAsIHRha2V9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHtDYXNlfSBmcm9tIFwiLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9jYXNlXCI7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7RG91YmxlRHJhd2VyVXRpbHN9IGZyb20gXCIuLi91dGlsL2RvdWJsZS1kcmF3ZXItdXRpbHNcIjtcbmltcG9ydCB7UGFnZX0gZnJvbSBcIi4uLy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvcGFnZVwiO1xuaW1wb3J0IHtDYXNlU2VhcmNoUmVxdWVzdEJvZHksIFBldHJpTmV0U2VhcmNoUmVxdWVzdH0gZnJvbSBcIi4uLy4uLy4uL2ZpbHRlci9tb2RlbHMvY2FzZS1zZWFyY2gtcmVxdWVzdC1ib2R5XCI7XG5pbXBvcnQge0h0dHBQYXJhbXN9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHtQYWdpbmF0aW9uUGFyYW1zfSBmcm9tIFwiLi4vLi4vLi4vdXRpbGl0eS9wYWdpbmF0aW9uL3BhZ2luYXRpb24tcGFyYW1zXCI7XG5pbXBvcnQge1NpbXBsZUZpbHRlcn0gZnJvbSBcIi4uLy4uLy4uL2ZpbHRlci9tb2RlbHMvc2ltcGxlLWZpbHRlclwiO1xuaW1wb3J0IHtDYXNlUmVzb3VyY2VTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vcmVzb3VyY2VzL2VuZ2luZS1lbmRwb2ludC9jYXNlLXJlc291cmNlLnNlcnZpY2VcIjtcbmltcG9ydCB7STE4bkZpZWxkVmFsdWV9IGZyb20gXCIuLi8uLi8uLi9kYXRhLWZpZWxkcy9pMThuLWZpZWxkL21vZGVscy9pMThuLWZpZWxkLXZhbHVlXCI7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge1xuICAgIER5bmFtaWNOYXZpZ2F0aW9uUm91dGVQcm92aWRlclNlcnZpY2Vcbn0gZnJvbSBcIi4uLy4uLy4uL3JvdXRpbmcvZHluYW1pYy1uYXZpZ2F0aW9uLXJvdXRlLXByb3ZpZGVyL2R5bmFtaWMtbmF2aWdhdGlvbi1yb3V0ZS1wcm92aWRlci5zZXJ2aWNlXCI7XG5pbXBvcnQge1JlZGlyZWN0U2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3JvdXRpbmcvcmVkaXJlY3Qtc2VydmljZS9yZWRpcmVjdC5zZXJ2aWNlXCI7XG5pbXBvcnQge0FjY2Vzc1NlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9hdXRob3JpemF0aW9uL3Blcm1pc3Npb24vYWNjZXNzLnNlcnZpY2VcIjtcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uc2VydmljZVwiO1xuaW1wb3J0IHtWaWV3fSBmcm9tIFwiLi4vLi4vLi4vLi4vY29tbW9ucy9zY2hlbWFcIjtcbmltcG9ydCB7XG4gICAgTUVOVV9JREVOVElGSUVSUyxcbiAgICBNZW51T3JkZXIsXG4gICAgTmF2aWdhdGlvbkl0ZW0sXG4gICAgUklHSFRfU0lERV9JTklUX1BBR0VfU0laRSxcbiAgICBSSUdIVF9TSURFX05FV19QQUdFX1NJWkUsXG4gICAgU0VUVElOR1NfVFJBTlNJVElPTl9JRFxufSBmcm9tICcuLi8uLi9tb2RlbC9uYXZpZ2F0aW9uLWNvbmZpZ3MnO1xuaW1wb3J0IHtVcmlOb2RlUmVzb3VyY2V9IGZyb20gJy4uLy4uL21vZGVsL3VyaS1yZXNvdXJjZSc7XG5pbXBvcnQge01lbnVJdGVtQ2xpY2tFdmVudCwgTWVudUl0ZW1Mb2FkZWRFdmVudH0gZnJvbSAnLi4vLi4vbW9kZWwvbmF2aWdhdGlvbi1tZW51LWV2ZW50cyc7XG5pbXBvcnQge0dyb3VwTmF2aWdhdGlvbkNvbnN0YW50c30gZnJvbSBcIi4uLy4uL21vZGVsL2dyb3VwLW5hdmlnYXRpb24tY29uc3RhbnRzXCI7XG5pbXBvcnQge1BhdGhTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZS9wYXRoLnNlcnZpY2VcIjtcbmltcG9ydCB7VXNlclNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi91c2VyL3NlcnZpY2VzL3VzZXIuc2VydmljZVwiO1xuXG4vKipcbiAqIFNlcnZpY2UgZm9yIG1hbmFnaW5nIG5hdmlnYXRpb24gaW4gZG91YmxlLWRyYXdlclxuICogKi9cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIERvdWJsZURyYXdlck5hdmlnYXRpb25TZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZGlzcGxheWVkIGl0ZW1zIG9uIHRoZSBsZWZ0IHNpZGVcbiAgICAgKiAqL1xuICAgIHByb3RlY3RlZCBfbGVmdEl0ZW1zJDogQmVoYXZpb3JTdWJqZWN0PEFycmF5PE5hdmlnYXRpb25JdGVtPj47XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBkaXNwbGF5ZWQgaXRlbXMgb24gdGhlIHJpZ2h0IHNpZGVcbiAgICAgKiAqL1xuICAgIHByb3RlY3RlZCBfcmlnaHRJdGVtcyQ6IEJlaGF2aW9yU3ViamVjdDxBcnJheTxOYXZpZ2F0aW9uSXRlbT4+O1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaGlkZGVuIGl0ZW1zXG4gICAgICogKi9cbiAgICBwcm90ZWN0ZWQgX21vcmVJdGVtcyQ6IEJlaGF2aW9yU3ViamVjdDxBcnJheTxOYXZpZ2F0aW9uSXRlbT4+O1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgY3VzdG9tIGl0ZW1zIGluIG1vcmUgbWVudVxuICAgICAqICovXG4gICAgcHJvdGVjdGVkIF9oaWRkZW5DdXN0b21JdGVtcyQ6IEJlaGF2aW9yU3ViamVjdDxBcnJheTxOYXZpZ2F0aW9uSXRlbT4+O1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgY3VzdG9tIGl0ZW1zXG4gICAgICogKi9cbiAgICBwcm90ZWN0ZWQgX2NoaWxkQ3VzdG9tVmlld3M6IHsgW3VyaTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBOYXZpZ2F0aW9uSXRlbSB9IH07XG4gICAgcHJvdGVjdGVkIGl0ZW1zT3JkZXI6IE1lbnVPcmRlcjtcbiAgICBwcm90ZWN0ZWQgX2xlZnRMb2FkaW5nJDogTG9hZGluZ0VtaXR0ZXI7XG4gICAgcHJvdGVjdGVkIF9yaWdodExvYWRpbmckOiBMb2FkaW5nRW1pdHRlcjtcbiAgICBwcm90ZWN0ZWQgX25vZGVMb2FkaW5nJDogTG9hZGluZ0VtaXR0ZXI7XG4gICAgcHJvdGVjdGVkIF9jdXJyZW50UGF0aFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgIHByb3RlY3RlZCBfbGFuZ3VhZ2VDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50bHkgZGlzcGxheSB1cmlcbiAgICAgKiBTaWJsaW5ncyBvZiB0aGUgbm9kZSBhcmUgb24gdGhlIGxlZnQsIGNoaWxkcmVuIGFyZSBvbiB0aGUgcmlnaHRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2N1cnJlbnRQYXRoOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZnJvbVJlc29sdmVyOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnRseSBzZWxlY3RlZCBuYXZpZ2F0aW9uIGl0ZW1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2N1cnJlbnROYXZpZ2F0aW9uSXRlbTogTmF2aWdhdGlvbkl0ZW0gfCB1bmRlZmluZWQ7XG4gICAgcHJvdGVjdGVkIGRlZmF1bHRWaWV3SWNvbjogc3RyaW5nID0gJ2ZpbHRlcl9hbHQnO1xuICAgIHByb3RlY3RlZCBjdXN0b21JdGVtc0luaXRpYWxpemVkOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBoaWRkZW5DdXN0b21JdGVtc0luaXRpYWxpemVkOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBpdGVtQ2xpY2tlZDogRXZlbnRFbWl0dGVyPE1lbnVJdGVtQ2xpY2tFdmVudD47XG4gICAgcHJvdGVjdGVkIGl0ZW1Mb2FkZWQ6IEV2ZW50RW1pdHRlcjxNZW51SXRlbUxvYWRlZEV2ZW50PjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF9jb25maWc6IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX2FjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJvdGVjdGVkIF9jYXNlUmVzb3VyY2VTZXJ2aWNlOiBDYXNlUmVzb3VyY2VTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX2FjY2Vzc1NlcnZpY2U6IEFjY2Vzc1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF9keW5hbWljUm91dGluZ1NlcnZpY2U6IER5bmFtaWNOYXZpZ2F0aW9uUm91dGVQcm92aWRlclNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfcmVkaXJlY3RTZXJ2aWNlOiBSZWRpcmVjdFNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfcGF0aFNlcnZpY2U6IFBhdGhTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5fbGVmdEl0ZW1zJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xuICAgICAgICB0aGlzLl9yaWdodEl0ZW1zJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xuICAgICAgICB0aGlzLl9tb3JlSXRlbXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gICAgICAgIHRoaXMuX2hpZGRlbkN1c3RvbUl0ZW1zJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xuICAgICAgICB0aGlzLl9jaGlsZEN1c3RvbVZpZXdzID0ge307XG4gICAgICAgIHRoaXMuX2xlZnRMb2FkaW5nJCA9IG5ldyBMb2FkaW5nRW1pdHRlcigpO1xuICAgICAgICB0aGlzLl9yaWdodExvYWRpbmckID0gbmV3IExvYWRpbmdFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX25vZGVMb2FkaW5nJCA9IG5ldyBMb2FkaW5nRW1pdHRlcigpO1xuICAgICAgICB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkl0ZW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaXRlbXNPcmRlciA9IE1lbnVPcmRlci5Bc2NlbmRpbmc7XG4gICAgICAgIHRoaXMuY3VzdG9tSXRlbXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhpZGRlbkN1c3RvbUl0ZW1zSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pdGVtQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TWVudUl0ZW1DbGlja0V2ZW50PigpO1xuICAgICAgICB0aGlzLml0ZW1Mb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVJdGVtTG9hZGVkRXZlbnQ+KCk7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE1lbnVJdGVtVHJhbnNsYXRpb25zKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFBhdGhTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlQ2hhbmdlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9sZWZ0TG9hZGluZyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fcmlnaHRMb2FkaW5nJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9ub2RlTG9hZGluZyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5pdGVtQ2xpY2tlZC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLml0ZW1Mb2FkZWQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNhbkdvQmFja0xvYWRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9kZUxvYWRpbmckO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudFBhdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRQYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY3VycmVudFBhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmIChwYXRoID09PSB0aGlzLl9jdXJyZW50UGF0aCB8fCB0aGlzLmxlZnRMb2FkaW5nJC5pc0FjdGl2ZSB8fCB0aGlzLnJpZ2h0TG9hZGluZyQuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jdXJyZW50UGF0aCA9IHBhdGg7XG4gICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm5vZGVMb2FkaW5nJC5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5ub2RlTG9hZGluZyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVNZW51SXRlbXMocGF0aClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlTWVudUl0ZW1zKHBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjdXJyZW50TmF2aWdhdGlvbkl0ZW0oaXRlbTogTmF2aWdhdGlvbkl0ZW0gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudE5hdmlnYXRpb25JdGVtID0gaXRlbTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZU1lbnVJdGVtcyhwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHBhdGggPT09IFBhdGhTZXJ2aWNlLlNFUEFSQVRPUikge1xuICAgICAgICAgICAgdGhpcy5fbGVmdEl0ZW1zJC5uZXh0KFtdKVxuICAgICAgICAgICAgdGhpcy5sb2FkUmlnaHRTaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubGVmdEl0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnJlc291cmNlPy5pbW1lZGlhdGVEYXRhLmZpbmQoZiA9PiBmLnN0cmluZ0lkID09PSBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9OT0RFX1BBVEgpPy52YWx1ZSA9PT0gcGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRMZWZ0U2lkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2FkUmlnaHRTaWRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGl0ZW1DbGlja2VkJCgpOiBFdmVudEVtaXR0ZXI8TWVudUl0ZW1DbGlja0V2ZW50PiB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1DbGlja2VkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXRlbUxvYWRlZCQoKTogRXZlbnRFbWl0dGVyPE1lbnVJdGVtTG9hZGVkRXZlbnQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbUxvYWRlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJpZ2h0SXRlbXMkKCk6IEJlaGF2aW9yU3ViamVjdDxBcnJheTxOYXZpZ2F0aW9uSXRlbT4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JpZ2h0SXRlbXMkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGVmdEl0ZW1zJCgpOiBCZWhhdmlvclN1YmplY3Q8QXJyYXk8TmF2aWdhdGlvbkl0ZW0+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZWZ0SXRlbXMkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbW9yZUl0ZW1zJCgpOiBCZWhhdmlvclN1YmplY3Q8QXJyYXk8TmF2aWdhdGlvbkl0ZW0+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb3JlSXRlbXMkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGlkZGVuQ3VzdG9tSXRlbXMkKCk6IEJlaGF2aW9yU3ViamVjdDxBcnJheTxOYXZpZ2F0aW9uSXRlbT4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGRlbkN1c3RvbUl0ZW1zJDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJpZ2h0SXRlbXMoKTogQXJyYXk8TmF2aWdhdGlvbkl0ZW0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JpZ2h0SXRlbXMkLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsZWZ0SXRlbXMoKTogQXJyYXk8TmF2aWdhdGlvbkl0ZW0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xlZnRJdGVtcyQuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vcmVJdGVtcygpOiBBcnJheTxOYXZpZ2F0aW9uSXRlbT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9yZUl0ZW1zJC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGlkZGVuQ3VzdG9tSXRlbXMoKTogQXJyYXk8TmF2aWdhdGlvbkl0ZW0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGRlbkN1c3RvbUl0ZW1zJC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGVmdExvYWRpbmckKCk6IExvYWRpbmdFbWl0dGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xlZnRMb2FkaW5nJDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJpZ2h0TG9hZGluZyQoKTogTG9hZGluZ0VtaXR0ZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmlnaHRMb2FkaW5nJDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5vZGVMb2FkaW5nJCgpOiBMb2FkaW5nRW1pdHRlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub2RlTG9hZGluZyQ7XG4gICAgfVxuXG4gICAgc2V0IGZyb21SZXNvbHZlcih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9mcm9tUmVzb2x2ZXIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZE5hdmlnYXRpb25JdGVtcyhub2RlOiBVcmlOb2RlUmVzb3VyY2UpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhdGggPT09IFBhdGhTZXJ2aWNlLlNFUEFSQVRPUikge1xuICAgICAgICAgICAgdGhpcy5fbGVmdEl0ZW1zJC5uZXh0KFtdKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFJpZ2h0U2lkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9sZWZ0SXRlbXMkLmdldFZhbHVlKCkuZmluZChpdGVtID0+IERvdWJsZURyYXdlclV0aWxzLmlzTm9kZUNvcnJlc3BvbmRpbmdUb0l0ZW0obm9kZSwgaXRlbSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkTGVmdFNpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9hZFJpZ2h0U2lkZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gaG9tZSBjbGljaywgdGhlIGN1cnJlbnQgbGV2ZWwgaXMgc2V0IHRvIDAsIGFuZCBjdXJyZW50IHBhcmVudCBpc1xuICAgICAqIHNldCB0byByb290IG5vZGUuXG4gICAgICogKi9cbiAgICBwdWJsaWMgb25Ib21lQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmxlZnRMb2FkaW5nJC5pc0FjdGl2ZSB8fCB0aGlzLnJpZ2h0TG9hZGluZyQuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BhdGhTZXJ2aWNlLmFjdGl2ZVBhdGggPSBQYXRoU2VydmljZS5TRVBBUkFUT1I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gYmFjayBjbGljaywgdGhlIHBhcmVudCBpcyBzZXQgdG8gcGFyZW50IG9mIGxlZnQgbm9kZXMsIHRoYXQgd2lsbCBzb2x2ZVxuICAgICAqIHRoZSByaWdodCBzaWRlIG1lbnUgKGVsZW1lbnRzIHRoYXQgd2VyZSBpbiBsZWZ0IHNpZGUsIGFmdGVyIGJhY2t3YXJkXG4gICAgICogbmF2aWdhdGlvbiB3aWxsIGJlIG9uIHRoZSByaWdodCBzaWRlKS5cbiAgICAgKiBDdXJyZW50IGxldmVsIGlzIHNldCB0byBhIGxvd2VyIG51bWJlciBpbiBvcmRlciB0byBzZXQgdGhlIGxlZnQgc2lkZSBtZW51LlxuICAgICAqICovXG4gICAgcHVibGljIG9uQmFja0NsaWNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5sZWZ0TG9hZGluZyQuaXNBY3RpdmUgfHwgdGhpcy5yaWdodExvYWRpbmckLmlzQWN0aXZlIHx8IHRoaXMuY3VycmVudFBhdGggPT09IFBhdGhTZXJ2aWNlLlNFUEFSQVRPUikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGF0aFNlcnZpY2UuYWN0aXZlUGF0aCA9IHRoaXMuZXh0cmFjdFBhcmVudFBhdGgodGhpcy5jdXJyZW50UGF0aCk7XG4gICAgICAgIHRoaXMuaXRlbUNsaWNrZWQuZW1pdCh7cGF0aDogdGhpcy5fcGF0aFNlcnZpY2UuYWN0aXZlUGF0aCwgaXNIb21lOiBmYWxzZX0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGl0ZW0gY2xpY2ssIHRoZSBzZWxlY3RlZCBpdGVtJ3MgdmlldyBpcyByZW5kZXJlZCAoYnkgcm91dGVyTGluaykuIElmIHRoZSBzZWxlY3RlZCBpdGVtIGhhcyBjaGlsZHJlbiBpdGVtcywgdGhlIG1lbnUgaXMgdXBkYXRlZFxuICAgICAqIGFuZCB2aWV3LCB0aGF0IGlzIHJlbmRlcmVkIGlzIHNlbGVjdGVkIGJ5IHRoZSBkZWZpbmVkIHJ1bGUuIFRoZSBydWxlIGlzOiBPbiBmaXJzdCBjaGVjayBmb3IgZGVmYXVsdCB2aWV3IGluIGNoaWxkcmVuLlxuICAgICAqIE9uIHNlY29uZCBjaGVjayBpZiB0aGUgY2xpY2tlZCBpdGVtIGhhcyBhIHZpZXcuIE9uIHRoaXJkLCBwaWNrIGFueSBvdGhlciBjaGlsZHJlbidzIHZpZXcsIGVsc2Ugc2hvdyBub3RoaW5nLlxuICAgICAqICovXG4gICAgcHVibGljIG9uSXRlbUNsaWNrKGl0ZW06IE5hdmlnYXRpb25JdGVtKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnROYXZpZ2F0aW9uSXRlbSA9IGl0ZW07XG4gICAgICAgIGlmIChpdGVtLnJlc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGN1c3RvbSB2aWV3IHJlcHJlc2VudGVkIG9ubHkgaW4gbmFlLmpzb25cbiAgICAgICAgICAgIGlmIChpdGVtLnByb2Nlc3NVcmkgPT09IHRoaXMuY3VycmVudFBhdGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXRoU2VydmljZS5hY3RpdmVQYXRoID0gdGhpcy5jdXJyZW50UGF0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGF0aFNlcnZpY2UuYWN0aXZlUGF0aCA9IHRoaXMuZXh0cmFjdFBhcmVudFBhdGgodGhpcy5jdXJyZW50UGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLml0ZW1DbGlja2VkLmVtaXQoe3BhdGg6IHRoaXMuX3BhdGhTZXJ2aWNlLmFjdGl2ZVBhdGgsIGlzSG9tZTogZmFsc2V9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBpdGVtLnJlc291cmNlLmltbWVkaWF0ZURhdGEuZmluZChmID0+IGYuc3RyaW5nSWQgPT09IEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cy5JVEVNX0ZJRUxEX0lEX05PREVfUEFUSCk/LnZhbHVlXG5cbiAgICAgICAgICAgIGlmIChEb3VibGVEcmF3ZXJVdGlscy5oYXNJdGVtQ2hpbGRyZW4oaXRlbSkgJiYgIXRoaXMubGVmdExvYWRpbmckLmlzQWN0aXZlICYmICF0aGlzLnJpZ2h0TG9hZGluZyQuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXRoU2VydmljZS5hY3RpdmVQYXRoID0gcGF0aDtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1DbGlja2VkLmVtaXQoe3BhdGg6IHRoaXMuX3BhdGhTZXJ2aWNlLmFjdGl2ZVBhdGgsIGlzSG9tZTogZmFsc2V9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yaWdodExvYWRpbmckLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcihpc1JpZ2h0TG9hZGluZyA9PiBpc1JpZ2h0TG9hZGluZyA9PT0gZmFsc2UpLFxuICAgICAgICAgICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5BdmFpbGFibGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXBhdGguaW5jbHVkZXModGhpcy5jdXJyZW50UGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXRoU2VydmljZS5hY3RpdmVQYXRoID0gdGhpcy5leHRyYWN0UGFyZW50UGF0aCh0aGlzLmN1cnJlbnRQYXRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1DbGlja2VkLmVtaXQoe3BhdGg6IHRoaXMuX3BhdGhTZXJ2aWNlLmFjdGl2ZVBhdGgsIGlzSG9tZTogZmFsc2V9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXRoU2VydmljZS5hY3RpdmVQYXRoID0gdGhpcy5jdXJyZW50UGF0aDtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1DbGlja2VkLmVtaXQoe3BhdGg6IHRoaXMuX3BhdGhTZXJ2aWNlLmFjdGl2ZVBhdGgsIGlzSG9tZTogZmFsc2V9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSB2aWV3IG9mIHRoZSBjdXJyZW50IHJpZ2h0IGl0ZW1zIGluIHRoZSBtZW51IGJ5IGRlZmluZWQgcnVsZS4gVGhlIHJ1bGUgaXM6IEZpcnN0LCBpdCBjaGVja3Mgd2hldGhlciBhIG5hdmlnYXRpb25cbiAgICAgKiBpdGVtIHdhcyBjbGlja2VkLiBTZWNvbmQsIGNoZWNrIGZvciBkZWZhdWx0IHZpZXcgaW4gY2hpbGRyZW4uXG4gICAgICogVGhpcmQgY2hlY2sgaWYgdGhlIGNsaWNrZWQgaXRlbSBoYXMgYSB2aWV3LiBGb3VydGgsIHBpY2sgYW55IG90aGVyIGNoaWxkcmVuJ3MgdmlldywgZWxzZVxuICAgICAqIHNob3cgbm90aGluZy5cbiAgICAgKiAqL1xuICAgIHB1YmxpYyBvcGVuQXZhaWxhYmxlVmlldygpIHtcbiAgICAgICAgbGV0IGFsbEl0ZW1zOiBBcnJheTxOYXZpZ2F0aW9uSXRlbT4gPSB0aGlzLnJpZ2h0SXRlbXMuY29uY2F0KHRoaXMubW9yZUl0ZW1zKTtcblxuICAgICAgICBpZiAodGhpcy5fY3VycmVudE5hdmlnYXRpb25JdGVtKSB7XG4gICAgICAgICAgICBsZXQgYWxyZWFkeUNsaWNrZWRJdGVtOiBOYXZpZ2F0aW9uSXRlbSA9IGFsbEl0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkl0ZW0uaWQpO1xuICAgICAgICAgICAgaWYgKCEhYWxyZWFkeUNsaWNrZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgZm9sZGVyIGhhcyBub3QgY2hhbmdlZCBhbmQgYSBtZW51IGl0ZW0gaXMgY2xpY2tlZC5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fZnJvbVJlc29sdmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9mcm9tUmVzb2x2ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhdXRvT3Blbkl0ZW1zOiBBcnJheTxOYXZpZ2F0aW9uSXRlbT4gPSBhbGxJdGVtcy5maWx0ZXIoaXRlbSA9PiBEb3VibGVEcmF3ZXJVdGlscy5oYXNJdGVtQXV0b09wZW5WaWV3KGl0ZW0pKTtcbiAgICAgICAgaWYgKGF1dG9PcGVuSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fcmVkaXJlY3RTZXJ2aWNlLnJlZGlyZWN0KGF1dG9PcGVuSXRlbXNbMF0ucm91dGluZy5wYXRoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEb3VibGVEcmF3ZXJVdGlscy5oYXNJdGVtVmlldyh0aGlzLl9jdXJyZW50TmF2aWdhdGlvbkl0ZW0pKSB7XG4gICAgICAgICAgICAvLyBpcyByb3V0ZWQgYnkgcm91dGVyTGluayBvbiBpdGVtIGNsaWNrXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXRlbXNXaXRoVmlldzogQXJyYXk8TmF2aWdhdGlvbkl0ZW0+ID0gYWxsSXRlbXMuZmlsdGVyKGl0ZW0gPT4gRG91YmxlRHJhd2VyVXRpbHMuaGFzSXRlbVZpZXcoaXRlbSkpO1xuICAgICAgICBpZiAoaXRlbXNXaXRoVmlldy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWRpcmVjdFNlcnZpY2UucmVkaXJlY3QoYXV0b09wZW5JdGVtc1swXS5yb3V0aW5nLnBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRNb3JlSXRlbXMoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vcmVJdGVtcy5sZW5ndGggPiBSSUdIVF9TSURFX05FV19QQUdFX1NJWkUpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50UmlnaHRJdGVtcyA9IHRoaXMucmlnaHRJdGVtcztcbiAgICAgICAgICAgIGxldCBjdXJyZW50TW9yZUl0ZW1zID0gdGhpcy5tb3JlSXRlbXM7XG4gICAgICAgICAgICBjdXJyZW50UmlnaHRJdGVtcy5wdXNoKC4uLmN1cnJlbnRNb3JlSXRlbXMuc3BsaWNlKDAsIFJJR0hUX1NJREVfTkVXX1BBR0VfU0laRSkpO1xuICAgICAgICAgICAgdGhpcy5yaWdodEl0ZW1zJC5uZXh0KGN1cnJlbnRSaWdodEl0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMubW9yZUl0ZW1zJC5uZXh0KGN1cnJlbnRNb3JlSXRlbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRSaWdodEl0ZW1zID0gdGhpcy5yaWdodEl0ZW1zO1xuICAgICAgICAgICAgY3VycmVudFJpZ2h0SXRlbXMucHVzaCguLi50aGlzLm1vcmVJdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0SXRlbXMkLm5leHQoY3VycmVudFJpZ2h0SXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5tb3JlSXRlbXMkLm5leHQoW10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGluaXRpYWxpemVDdXN0b21WaWV3c09mVmlldyh2aWV3OiBWaWV3LCB2aWV3Q29uZmlnUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdmlldyB8fCB0aGlzLmN1c3RvbUl0ZW1zSW5pdGlhbGl6ZWQgfHwgdGhpcy5oaWRkZW5DdXN0b21JdGVtc0luaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXModmlldy5jaGlsZHJlbikuZm9yRWFjaCgoW2tleSwgY2hpbGRWaWV3XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRWaWV3Q29uZmlnUGF0aDogc3RyaW5nID0gdmlld0NvbmZpZ1BhdGggKyAnLycgKyBrZXk7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVVcmlGb3JDaGlsZFZpZXdzKGNoaWxkVmlld0NvbmZpZ1BhdGgsIGNoaWxkVmlldyk7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVIaWRkZW5NZW51SXRlbUZyb21DaGlsZFZpZXdzKGNoaWxkVmlld0NvbmZpZ1BhdGgsIGNoaWxkVmlldyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVzb2x2ZUN1c3RvbVZpZXdzSW5SaWdodFNpZGUoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlQ3VzdG9tVmlld3NJbkxlZnRTaWRlKCk7XG5cbiAgICAgICAgdGhpcy5jdXN0b21JdGVtc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oaWRkZW5DdXN0b21JdGVtc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3dpdGNoT3JkZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXRlbXNPcmRlciA9ICh0aGlzLml0ZW1zT3JkZXIgKyAxKSAlIDI7XG4gICAgICAgIGxldCBtdWx0aXBsaWVyID0gMTtcbiAgICAgICAgaWYgKHRoaXMuaXRlbXNPcmRlciA9PT0gTWVudU9yZGVyLkRlc2NlbmRpbmcpIHtcbiAgICAgICAgICAgIG11bHRpcGxpZXIgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGxSaWdodEl0ZW1zID0gdGhpcy5yaWdodEl0ZW1zLmNvbmNhdCh0aGlzLm1vcmVJdGVtcykuc29ydCgoYSwgYikgPT5cbiAgICAgICAgICAgIG11bHRpcGxpZXIgKiAoYT8ubmF2aWdhdGlvbiBhcyBOYXZpZ2F0aW9uSXRlbSk/LnRpdGxlLmxvY2FsZUNvbXBhcmUoKGI/Lm5hdmlnYXRpb24gYXMgTmF2aWdhdGlvbkl0ZW0pPy50aXRsZSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY3VycmVudExlZnRJdGVtcyA9IFsuLi50aGlzLmxlZnRJdGVtc10uc29ydCgoYSwgYikgPT5cbiAgICAgICAgICAgIG11bHRpcGxpZXIgKiAoYT8ubmF2aWdhdGlvbiBhcyBOYXZpZ2F0aW9uSXRlbSk/LnRpdGxlLmxvY2FsZUNvbXBhcmUoKGI/Lm5hdmlnYXRpb24gYXMgTmF2aWdhdGlvbkl0ZW0pPy50aXRsZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yaWdodEl0ZW1zJC5uZXh0KGFsbFJpZ2h0SXRlbXMuc2xpY2UoMCwgUklHSFRfU0lERV9JTklUX1BBR0VfU0laRSkpO1xuICAgICAgICB0aGlzLm1vcmVJdGVtcyQubmV4dChhbGxSaWdodEl0ZW1zLnNsaWNlKFJJR0hUX1NJREVfSU5JVF9QQUdFX1NJWkUpKTtcbiAgICAgICAgdGhpcy5sZWZ0SXRlbXMkLm5leHQoY3VycmVudExlZnRJdGVtcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQXNjZW5kaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtc09yZGVyID09PSBNZW51T3JkZXIuQXNjZW5kaW5nO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBsb2FkTGVmdFNpZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoID09PSBQYXRoU2VydmljZS5TRVBBUkFUT1IpIHtcbiAgICAgICAgICAgIHRoaXMuX2xlZnRJdGVtcyQubmV4dChbXSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnRMb2FkaW5nJC5vbigpO1xuXG4gICAgICAgIHRoaXMuZ2V0SXRlbUNhc2VCeVBhdGgodGhpcy5leHRyYWN0UGFyZW50UGF0aCh0aGlzLmN1cnJlbnRQYXRoKSkuc3Vic2NyaWJlKHBhZ2UgPT4ge1xuICAgICAgICAgICAgbGV0IGNoaWxkQ2FzZXMkO1xuICAgICAgICAgICAgbGV0IHRhcmdldEl0ZW07XG4gICAgICAgICAgICBsZXQgb3JkZXJlZENoaWxkQ2FzZUlkcztcblxuICAgICAgICAgICAgaWYgKHBhZ2U/LnBhZ2luYXRpb24/LnRvdGFsRWxlbWVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjaGlsZENhc2VzJCA9IG9mKFtdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0SXRlbSA9IHBhZ2UuY29udGVudFswXTtcbiAgICAgICAgICAgICAgICBvcmRlcmVkQ2hpbGRDYXNlSWRzID0gRG91YmxlRHJhd2VyVXRpbHMuZXh0cmFjdENoaWxkQ2FzZUlkcyh0YXJnZXRJdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAob3JkZXJlZENoaWxkQ2FzZUlkcyA9PSB1bmRlZmluZWQgfHwgb3JkZXJlZENoaWxkQ2FzZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRDYXNlcyQgPSBvZihbXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRDYXNlcyQgPSB0aGlzLmdldEl0ZW1DYXNlc0J5SWRzSW5PbmVQYWdlKG9yZGVyZWRDaGlsZENhc2VJZHMpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAocCA9PiBwLmNvbnRlbnQpLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2hpbGRDYXNlcyQuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChmb2xkZXIgPT4gdGhpcy5yZXNvbHZlSXRlbUNhc2VUb05hdmlnYXRpb25JdGVtKGZvbGRlcikpLmZpbHRlcihpID0+ICEhaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGVmdEl0ZW1zJC5uZXh0KHJlc3VsdC5zb3J0KChhLCBiKSA9PiBvcmRlcmVkQ2hpbGRDYXNlSWRzLmluZGV4T2YoYS5yZXNvdXJjZS5zdHJpbmdJZCkgLSBvcmRlcmVkQ2hpbGRDYXNlSWRzLmluZGV4T2YoYi5yZXNvdXJjZS5zdHJpbmdJZCkpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVDdXN0b21WaWV3c0luTGVmdFNpZGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sZWZ0TG9hZGluZyQub2ZmKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtTG9hZGVkLmVtaXQoe21lbnU6ICdsZWZ0JywgaXRlbXM6IHRoaXMubGVmdEl0ZW1zfSk7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sZWZ0SXRlbXMkLm5leHQoW10pXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlQ3VzdG9tVmlld3NJbkxlZnRTaWRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGVmdExvYWRpbmckLm9mZigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aGlzLl9sZWZ0SXRlbXMkLm5leHQoW10pXG4gICAgICAgICAgICB0aGlzLnJlc29sdmVDdXN0b21WaWV3c0luTGVmdFNpZGUoKTtcbiAgICAgICAgICAgIHRoaXMuX2xlZnRMb2FkaW5nJC5vZmYoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGxvYWRSaWdodFNpZGUoKSB7XG4gICAgICAgIHRoaXMuX3JpZ2h0TG9hZGluZyQub24oKTtcbiAgICAgICAgdGhpcy5fbW9yZUl0ZW1zJC5uZXh0KFtdKVxuXG4gICAgICAgIHRoaXMuZ2V0SXRlbUNhc2VCeVBhdGgodGhpcy5jdXJyZW50UGF0aCkuc3Vic2NyaWJlKHBhZ2UgPT4ge1xuICAgICAgICAgICAgbGV0IGNoaWxkQ2FzZXMkO1xuICAgICAgICAgICAgbGV0IHRhcmdldEl0ZW07XG4gICAgICAgICAgICBsZXQgb3JkZXJlZENoaWxkQ2FzZUlkcztcblxuICAgICAgICAgICAgaWYgKHBhZ2U/LnBhZ2luYXRpb24/LnRvdGFsRWxlbWVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjaGlsZENhc2VzJCA9IG9mKFtdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0SXRlbSA9IHBhZ2U/LmNvbnRlbnRbMF07XG4gICAgICAgICAgICAgICAgb3JkZXJlZENoaWxkQ2FzZUlkcyA9IERvdWJsZURyYXdlclV0aWxzLmV4dHJhY3RDaGlsZENhc2VJZHModGFyZ2V0SXRlbSk7XG4gICAgICAgICAgICAgICAgaWYgKG9yZGVyZWRDaGlsZENhc2VJZHMgPT09IHVuZGVmaW5lZCB8fCBvcmRlcmVkQ2hpbGRDYXNlSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZENhc2VzJCA9IG9mKFtdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZENhc2VzJCA9IHRoaXMuZ2V0SXRlbUNhc2VzQnlJZHNJbk9uZVBhZ2Uob3JkZXJlZENoaWxkQ2FzZUlkcykucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcChwID0+IHAuY29udGVudCksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjaGlsZENhc2VzJC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IGFzIENhc2VbXSkuc29ydCgoYSwgYikgPT4gb3JkZXJlZENoaWxkQ2FzZUlkcy5pbmRleE9mKGEuc3RyaW5nSWQpIC0gb3JkZXJlZENoaWxkQ2FzZUlkcy5pbmRleE9mKGIuc3RyaW5nSWQpKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IFJJR0hUX1NJREVfSU5JVF9QQUdFX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3UmlnaHRJdGVtczogQ2FzZVtdID0gcmVzdWx0LnNwbGljZSgwLCBSSUdIVF9TSURFX0lOSVRfUEFHRV9TSVpFKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmlnaHRJdGVtcyQubmV4dChyYXdSaWdodEl0ZW1zLm1hcChmb2xkZXIgPT4gdGhpcy5yZXNvbHZlSXRlbUNhc2VUb05hdmlnYXRpb25JdGVtKGZvbGRlcikpLmZpbHRlcihpID0+ICEhaSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3JlSXRlbXMkLm5leHQocmVzdWx0Lm1hcChmb2xkZXIgPT4gdGhpcy5yZXNvbHZlSXRlbUNhc2VUb05hdmlnYXRpb25JdGVtKGZvbGRlcikpLmZpbHRlcihpID0+ICEhaSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0SXRlbXMkLm5leHQocmVzdWx0Lm1hcChmb2xkZXIgPT4gdGhpcy5yZXNvbHZlSXRlbUNhc2VUb05hdmlnYXRpb25JdGVtKGZvbGRlcikpLmZpbHRlcihpID0+ICEhaSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVDdXN0b21WaWV3c0luUmlnaHRTaWRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmlnaHRMb2FkaW5nJC5vZmYoKTtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1Mb2FkZWQuZW1pdCh7bWVudTogJ3JpZ2h0JywgaXRlbXM6IHRoaXMucmlnaHRJdGVtc30pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuQXZhaWxhYmxlVmlldygpO1xuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmlnaHRJdGVtcyQubmV4dChbXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9yZUl0ZW1zJC5uZXh0KFtdKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVDdXN0b21WaWV3c0luUmlnaHRTaWRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmlnaHRMb2FkaW5nJC5vZmYoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5fcmlnaHRJdGVtcyQubmV4dChbXSk7XG4gICAgICAgICAgICB0aGlzLl9tb3JlSXRlbXMkLm5leHQoW10pO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlQ3VzdG9tVmlld3NJblJpZ2h0U2lkZSgpO1xuICAgICAgICAgICAgdGhpcy5fcmlnaHRMb2FkaW5nJC5vZmYoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEl0ZW1DYXNlc0J5SWRzSW5PbmVQYWdlKGNhc2VJZHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxQYWdlPENhc2U+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEl0ZW1DYXNlc0J5SWRzKGNhc2VJZHMsIDAsIGNhc2VJZHMubGVuZ3RoKTtcbiAgICB9XG5cblxuICAgIHByb3RlY3RlZCBnZXRJdGVtQ2FzZXNCeUlkcyhjYXNlSWRzOiBzdHJpbmdbXSwgcGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxQYWdlPENhc2U+PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaEJvZHk6IENhc2VTZWFyY2hSZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgIGlkOiBjYXNlSWRzLFxuICAgICAgICAgICAgcHJvY2VzczogTUVOVV9JREVOVElGSUVSUy5tYXAoaWQgPT4gKHtpZGVudGlmaWVyOiBpZH0gYXMgUGV0cmlOZXRTZWFyY2hSZXF1ZXN0KSksXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAgICAgICAuc2V0KFBhZ2luYXRpb25QYXJhbXMuUEFHRV9TSVpFLCBwYWdlU2l6ZSlcbiAgICAgICAgICAgIC5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX05VTUJFUiwgcGFnZU51bWJlcik7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLnNlYXJjaENhc2VzKFNpbXBsZUZpbHRlci5mcm9tQ2FzZVF1ZXJ5KHNlYXJjaEJvZHkpLCBodHRwUGFyYW1zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzb2x2ZUl0ZW1DYXNlVG9OYXZpZ2F0aW9uSXRlbShpdGVtQ2FzZTogQ2FzZSk6IE5hdmlnYXRpb25JdGVtIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKERvdWJsZURyYXdlclV0aWxzLnJlcHJlc2VudHNSb290Tm9kZShpdGVtQ2FzZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtOiBOYXZpZ2F0aW9uSXRlbSA9IHtcbiAgICAgICAgICAgIGFjY2Vzczoge30sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uOiB7XG4gICAgICAgICAgICAgICAgaWNvbjogaXRlbUNhc2UuaW1tZWRpYXRlRGF0YS5maW5kKGYgPT4gZi5zdHJpbmdJZCA9PT0gR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfTUVOVV9JQ09OKT8udmFsdWUgfHwgdGhpcy5kZWZhdWx0Vmlld0ljb24sXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucmVzb2x2ZU1lbnVJdGVtVGl0bGUoaXRlbUNhc2UpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJvdXRpbmc6IHtcbiAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLmdldEl0ZW1Sb3V0aW5nUGF0aChpdGVtQ2FzZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaWQ6IGl0ZW1DYXNlLnN0cmluZ0lkLFxuICAgICAgICAgICAgcmVzb3VyY2U6IGl0ZW1DYXNlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXNvbHZlZFJvbGVzID0gRG91YmxlRHJhd2VyVXRpbHMucmVzb2x2ZUFjY2Vzc1JvbGVzKGl0ZW1DYXNlLCBHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9BTExPV0VEX1JPTEVTKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRCYW5uZWRSb2xlcyA9IERvdWJsZURyYXdlclV0aWxzLnJlc29sdmVBY2Nlc3NSb2xlcyhpdGVtQ2FzZSwgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfQkFOTkVEX1JPTEVTKTtcbiAgICAgICAgaWYgKCEhcmVzb2x2ZWRSb2xlcykgaXRlbS5hY2Nlc3NbJ3JvbGUnXSA9IHJlc29sdmVkUm9sZXM7XG4gICAgICAgIGlmICghIXJlc29sdmVkQmFubmVkUm9sZXMpIGl0ZW0uYWNjZXNzWydiYW5uZWRSb2xlJ10gPSByZXNvbHZlZEJhbm5lZFJvbGVzO1xuICAgICAgICBpZiAoIXRoaXMuX2FjY2Vzc1NlcnZpY2UuY2FuQWNjZXNzVmlldyhpdGVtLCBpdGVtLnJvdXRpbmc/LnBhdGgpKSByZXR1cm47XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWZyZXNoTWVudUl0ZW1UcmFuc2xhdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xlZnRJdGVtcyQubmV4dCh0aGlzLnJlZnJlc2hJdGVtVHJhbnNsYXRpb25zKHRoaXMubGVmdEl0ZW1zKSk7XG4gICAgICAgIHRoaXMuX3JpZ2h0SXRlbXMkLm5leHQodGhpcy5yZWZyZXNoSXRlbVRyYW5zbGF0aW9ucyh0aGlzLnJpZ2h0SXRlbXMpKTtcbiAgICAgICAgdGhpcy5fbW9yZUl0ZW1zJC5uZXh0KHRoaXMucmVmcmVzaEl0ZW1UcmFuc2xhdGlvbnModGhpcy5tb3JlSXRlbXMpKTtcblxuICAgICAgICBpZiAodGhpcy5fY3VycmVudE5hdmlnYXRpb25JdGVtPy5yZXNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudE5hdmlnYXRpb25JdGVtID0gdGhpcy5yZWZyZXNoSXRlbVRyYW5zbGF0aW9uKHRoaXMuX2N1cnJlbnROYXZpZ2F0aW9uSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVmcmVzaEl0ZW1UcmFuc2xhdGlvbnMoaXRlbXM6IEFycmF5PE5hdmlnYXRpb25JdGVtPik6IEFycmF5PE5hdmlnYXRpb25JdGVtPiB7XG4gICAgICAgIHJldHVybiBpdGVtcy5tYXAoaXRlbSA9PiB0aGlzLnJlZnJlc2hJdGVtVHJhbnNsYXRpb24oaXRlbSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWZyZXNoSXRlbVRyYW5zbGF0aW9uKGl0ZW06IE5hdmlnYXRpb25JdGVtKTogTmF2aWdhdGlvbkl0ZW0ge1xuICAgICAgICBpZiAoIWl0ZW0ucmVzb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbiA9IHR5cGVvZiBpdGVtLm5hdmlnYXRpb24gPT09ICdvYmplY3QnID8gaXRlbS5uYXZpZ2F0aW9uIDoge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgbmF2aWdhdGlvbjoge1xuICAgICAgICAgICAgICAgIC4uLm5hdmlnYXRpb24sXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucmVzb2x2ZU1lbnVJdGVtVGl0bGUoaXRlbS5yZXNvdXJjZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNvbHZlTWVudUl0ZW1UaXRsZShpdGVtQ2FzZTogQ2FzZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG1lbnVOYW1lID0gaXRlbUNhc2UuaW1tZWRpYXRlRGF0YVxuICAgICAgICAgICAgLmZpbmQoZmllbGQgPT4gZmllbGQuc3RyaW5nSWQgPT09IEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cy5JVEVNX0ZJRUxEX0lEX01FTlVfTkFNRSk/LnZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbihtZW51TmFtZSkgfHwgaXRlbUNhc2UudGl0bGU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVDdXN0b21WaWV3c0luTGVmdFNpZGUoKSB7XG4gICAgICAgIGxldCBjdXJyZW50TGVmdEl0ZW1zID0gdGhpcy5fbGVmdEl0ZW1zJC5nZXRWYWx1ZSgpLmZpbHRlcihpdGVtID0+IGl0ZW0ucmVzb3VyY2UgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICghIXRoaXMuZXh0cmFjdFBhcmVudFBhdGgodGhpcy5jdXJyZW50UGF0aCkgJiYgISF0aGlzLl9jaGlsZEN1c3RvbVZpZXdzW3RoaXMuZXh0cmFjdFBhcmVudFBhdGgodGhpcy5jdXJyZW50UGF0aCldKSB7XG4gICAgICAgICAgICBjdXJyZW50TGVmdEl0ZW1zLnB1c2goLi4uT2JqZWN0LnZhbHVlcyh0aGlzLl9jaGlsZEN1c3RvbVZpZXdzW3RoaXMuZXh0cmFjdFBhcmVudFBhdGgodGhpcy5jdXJyZW50UGF0aCldKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGVmdEl0ZW1zJC5uZXh0KERvdWJsZURyYXdlclV0aWxzLnNvcnRCeU9yZGVyKGN1cnJlbnRMZWZ0SXRlbXMpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZUN1c3RvbVZpZXdzSW5SaWdodFNpZGUoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSaWdodEl0ZW1zID0gdGhpcy5fcmlnaHRJdGVtcyQuZ2V0VmFsdWUoKS5maWx0ZXIoaXRlbSA9PiBpdGVtLnJlc291cmNlICE9PSB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCBjdXJyZW50TW9yZUl0ZW1zID0gdGhpcy5fbW9yZUl0ZW1zJC5nZXRWYWx1ZSgpLmZpbHRlcihpdGVtID0+IGl0ZW0ucmVzb3VyY2UgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGN1c3RvbUl0ZW1zID0gISF0aGlzLl9jdXJyZW50UGF0aCAmJiAhIXRoaXMuX2NoaWxkQ3VzdG9tVmlld3NbdGhpcy5fY3VycmVudFBhdGhdXG4gICAgICAgICAgICA/IE9iamVjdC52YWx1ZXModGhpcy5fY2hpbGRDdXN0b21WaWV3c1t0aGlzLl9jdXJyZW50UGF0aF0pXG4gICAgICAgICAgICA6IFtdO1xuXG4gICAgICAgIC8vIGNoaWxkSXRlbUlkcyBkZWZpbmVzIHRoZSBwcm9jZXNzIGZhbGxiYWNrIG9yZGVyLiBDdXN0b20gaXRlbXMgZm9sbG93IGluIG5hZS5qc29uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICAgICAgICAvLyBFeHBsaWNpdCBvcmRlciBpcyBhcHBsaWVkIHRvIHRoZSBjb21wbGV0ZSBsaXN0IGJlZm9yZSBpdCBpcyBzcGxpdCBpbnRvIHZpc2libGUgYW5kIFwibW9yZVwiIHBhZ2VzLlxuICAgICAgICBjb25zdCBjb21iaW5lZEl0ZW1zID0gY3VycmVudFJpZ2h0SXRlbXMuY29uY2F0KGN1cnJlbnRNb3JlSXRlbXMsIGN1c3RvbUl0ZW1zKTtcbiAgICAgICAgY29uc3Qgb3JkZXJlZEl0ZW1zID0gRG91YmxlRHJhd2VyVXRpbHMuc29ydEJ5T3JkZXIoY29tYmluZWRJdGVtcyk7XG4gICAgICAgIHRoaXMuX3JpZ2h0SXRlbXMkLm5leHQob3JkZXJlZEl0ZW1zLnNsaWNlKDAsIFJJR0hUX1NJREVfSU5JVF9QQUdFX1NJWkUpKTtcbiAgICAgICAgdGhpcy5fbW9yZUl0ZW1zJC5uZXh0KG9yZGVyZWRJdGVtcy5zbGljZShSSUdIVF9TSURFX0lOSVRfUEFHRV9TSVpFKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVVcmlGb3JDaGlsZFZpZXdzKGNvbmZpZ1BhdGg6IHN0cmluZywgY2hpbGRWaWV3OiBWaWV3KTogdm9pZCB7XG4gICAgICAgIGlmICghY2hpbGRWaWV3LnByb2Nlc3NVcmkpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLl9hY2Nlc3NTZXJ2aWNlLmNhbkFjY2Vzc1ZpZXcoY2hpbGRWaWV3LCBjb25maWdQYXRoKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuX2NoaWxkQ3VzdG9tVmlld3NbY2hpbGRWaWV3LnByb2Nlc3NVcmldKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGlsZEN1c3RvbVZpZXdzW2NoaWxkVmlldy5wcm9jZXNzVXJpXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NoaWxkQ3VzdG9tVmlld3NbY2hpbGRWaWV3LnByb2Nlc3NVcmldW2NvbmZpZ1BhdGhdID0ge1xuICAgICAgICAgICAgaWQ6IGNvbmZpZ1BhdGgsXG4gICAgICAgICAgICAuLi5jaGlsZFZpZXcsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVIaWRkZW5NZW51SXRlbUZyb21DaGlsZFZpZXdzKGNvbmZpZ1BhdGg6IHN0cmluZywgY2hpbGRWaWV3OiBWaWV3KTogdm9pZCB7XG4gICAgICAgIGlmICghY2hpbGRWaWV3Lm5hdmlnYXRpb24pIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLl9hY2Nlc3NTZXJ2aWNlLmNhbkFjY2Vzc1ZpZXcoY2hpbGRWaWV3LCBjb25maWdQYXRoKSkgcmV0dXJuO1xuICAgICAgICBpZiAoISEoKGNoaWxkVmlldz8ubmF2aWdhdGlvbiBhcyBhbnkpPy5oaWRkZW4pKSB7XG4gICAgICAgICAgICBjb25zdCBoaWRkZW5JdGVtID0ge1xuICAgICAgICAgICAgICAgIGlkOiBjb25maWdQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmNoaWxkVmlldyxcbiAgICAgICAgICAgIH0gYXMgTmF2aWdhdGlvbkl0ZW07XG4gICAgICAgICAgICB0aGlzLl9oaWRkZW5DdXN0b21JdGVtcyQubmV4dChEb3VibGVEcmF3ZXJVdGlscy5zb3J0QnlPcmRlcihbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5faGlkZGVuQ3VzdG9tSXRlbXMkLmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgaGlkZGVuSXRlbVxuICAgICAgICAgICAgXSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFRyYW5zbGF0aW9uKHZhbHVlOiBJMThuRmllbGRWYWx1ZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NhbGUgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nPy5zcGxpdCgnLScpWzBdO1xuICAgICAgICByZXR1cm4gbG9jYWxlICYmIHZhbHVlLnRyYW5zbGF0aW9ucyAmJiBsb2NhbGUgaW4gdmFsdWUudHJhbnNsYXRpb25zXG4gICAgICAgICAgICA/IHZhbHVlLnRyYW5zbGF0aW9uc1tsb2NhbGVdXG4gICAgICAgICAgICA6IHZhbHVlLmRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlbVJvdXRpbmdQYXRoKGl0ZW1DYXNlOiBDYXNlKSB7XG4gICAgICAgIGNvbnN0IHRhc2tJZCA9IERvdWJsZURyYXdlclV0aWxzLmZpbmRUYXNrSWRJbkNhc2UoaXRlbUNhc2UsIFNFVFRJTkdTX1RSQU5TSVRJT05fSUQpO1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl9keW5hbWljUm91dGluZ1NlcnZpY2Uucm91dGU7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHVybC5zdGFydHNXaXRoKCcvJykgPyAnJyA6ICcvJztcbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke3VybH0vJHt0YXNrSWR9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NMZWZ0SXRlbXMoY2FzZXM6IENhc2VbXSwgb3JkZXJlZENoaWxkQ2FzZUlkczogc3RyaW5nW10pOiBOYXZpZ2F0aW9uSXRlbVtdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FzZXNcbiAgICAgICAgICAgIC5tYXAoZm9sZGVyID0+IHRoaXMucmVzb2x2ZUl0ZW1DYXNlVG9OYXZpZ2F0aW9uSXRlbShmb2xkZXIpKVxuICAgICAgICAgICAgLmZpbHRlcihpID0+ICEhaSk7XG4gICAgICAgIHJldHVybiByZXN1bHQuc29ydCgoYSwgYikgPT5cbiAgICAgICAgICAgIG9yZGVyZWRDaGlsZENhc2VJZHMuaW5kZXhPZihhLnJlc291cmNlLnN0cmluZ0lkKSAtIG9yZGVyZWRDaGlsZENhc2VJZHMuaW5kZXhPZihiLnJlc291cmNlLnN0cmluZ0lkKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhIGNhc2UgaXRlbSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGF0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gVGhlIGlkZW50aWZpZXIgcGF0aCB0byBsb2NhdGUgdGhlIHNwZWNpZmljIGNhc2UgaXRlbS4gSWYgdW5kZWZpbmVkLCBpdCBkZWZhdWx0cyB0byBzZWFyY2hpbmcgd2l0aG91dCBhIHNwZWNpZmljIHBhdGguXG4gICAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxQYWdlPENhc2U+Pn0gQW4gb2JzZXJ2YWJsZSBzdHJlYW0gY29udGFpbmluZyB0aGUgcGFnZSBvZiBjYXNlIGl0ZW1zIHdoaWNoIG1hdGNoIHRoZSBwcm92aWRlZCBwYXRoLlxuICAgICAqL1xuICAgIGdldEl0ZW1DYXNlQnlQYXRoKHBhdGg/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFBhZ2U8Q2FzZT4+IHtcbiAgICAgICAgY29uc3Qgc2VhcmNoQm9keTogQ2FzZVNlYXJjaFJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIFtHcm91cE5hdmlnYXRpb25Db25zdGFudHMuSVRFTV9GSUVMRF9JRF9OT0RFX1BBVEhdOiBwYXRoXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvY2Vzczoge2lkZW50aWZpZXI6IFwibWVudV9pdGVtXCJ9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAgICAgICAuc2V0KFBhZ2luYXRpb25QYXJhbXMuUEFHRV9TSVpFLCAxKVxuICAgICAgICAgICAgLnNldChQYWdpbmF0aW9uUGFyYW1zLlBBR0VfTlVNQkVSLCAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nhc2VSZXNvdXJjZVNlcnZpY2Uuc2VhcmNoQ2FzZXMoU2ltcGxlRmlsdGVyLmZyb21DYXNlUXVlcnkoc2VhcmNoQm9keSksIGh0dHBQYXJhbXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBleHRyYWN0UGFyZW50UGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAocGF0aCA9PT0gJy8nKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aD8ubGFzdEluZGV4T2YoJy8nKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcvJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aD8uc3Vic3RyaW5nKDAsIHBhdGg/Lmxhc3RJbmRleE9mKCcvJykpO1xuICAgIH1cblxuXG59XG4iXX0=