@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
254 lines • 45.6 kB
JavaScript
import { Component } from '@angular/core';
import { HttpParams } from '@angular/common/http';
import { PaginationParams } from '../../utility/pagination/pagination-params';
import { SimpleFilter } from '../../filter/models/simple-filter';
import { LoadingEmitter } from '../../utility/loading-emitter';
import { GroupNavigationConstants } from "../model/group-navigation-constants";
import * as i0 from "@angular/core";
import * as i1 from "../../resources/engine-endpoint/case-resource.service";
import * as i2 from "../../logger/services/logger.service";
import * as i3 from "../service/path.service";
import * as i4 from "@angular/router";
import * as i5 from "../../translate/language.service";
import * as i6 from "../navigation-double-drawer/service/double-drawer-navigation.service";
export class AbstractDashboardComponent {
_caseResource;
_log;
_pathService;
_router;
_languageService;
_doubleDrawerNavigationService;
static MAIN_DASHBOARD = 'main_dashboard';
static DASHBOARD_MANAGEMENT_IDENTIFIER = 'dashboard_management';
static DASHBOARD_MANAGEMENT_ID_DATAFIELD = 'dashboard_id';
static DASHBOARD_MANAGEMENT_ITEM_TO_MENU_ITEM_DATAFIELD = 'dashboard_item_to_menu_item';
static DASHBOARD_MANAGEMENT_SIMPLE_TOOLBAR_DATAFIELD = 'simple_dashboard_toolbar';
static DASHBOARD_MANAGEMENT_PROFILE_TOOLBAR_DATAFIELD = 'profile_dashboard_toolbar';
static DASHBOARD_MANAGEMENT_LANGUAGE_TOOLBAR_DATAFIELD = 'language_dashboard_toolbar';
static DASHBOARD_MANAGEMENT_LOGOUT_TOOLBAR_DATAFIELD = 'logout_dashboard_toolbar';
static DASHBOARD_MANAGEMENT_NAME_DATAFIELD = 'dashboard_name';
static DASHBOARD_MANAGEMENT_LOGO_DATAFIELD = 'dashboard_logo';
static DASHBOARD_MANAGEMENT_ITEMS_ORDER_DATAFIELD = "items_order";
static DASHBOARD_MANAGEMENT_PROFILE_URL_DATAFIELD = "profile_url";
static DASHBOARD_MANAGEMENT_LOGIN_URL_DATAFIELD = "login_url";
static DASHBOARD_ITEM_ICON_DATAFIELD = 'item_icon';
static DASHBOARD_ITEM_NAME_DATAFIELD = 'item_name';
static DASHBOARD_ITEM_URL_DATAFIELD = 'external_url';
static DASHBOARD_ITEM_INTERNAL_DATAFIELD = 'is_internal';
static DASHBOARD_ITEM_EXTERNAL_ICON_DATAFIELD = 'external_icon';
static DASHBOARD_ITEM_FONT_COLOR_DATAFIELD = 'font_color';
static DASHBOARD_ITEM_FONT_WEIGHT_DATAFIELD = 'font_weight';
static DASHBOARD_ITEM_ICON_COLOR_DATAFIELD = 'icon_color';
toolbarConfig = {
profileEnabled: false,
languageEnabled: false,
logoutEnabled: false,
simpleToolbar: true,
toolbarName: {
defaultValue: 'Netgrif',
translations: {}
},
toolbarLogo: 'assets/img/netgrif_full_white.svg',
profileUrl: 'profile',
loginUrl: ''
};
dashboardId = AbstractDashboardComponent.MAIN_DASHBOARD;
dashboardCase;
dashboardItems;
dashboardItemsMapping;
itemsLoaded = 0;
loading$ = new LoadingEmitter();
constructor(_caseResource, _log, _pathService, _router, _languageService, _doubleDrawerNavigationService) {
this._caseResource = _caseResource;
this._log = _log;
this._pathService = _pathService;
this._router = _router;
this._languageService = _languageService;
this._doubleDrawerNavigationService = _doubleDrawerNavigationService;
this.dashboardItemsMapping = {};
this.dashboardItems = [];
this.loading$.on();
const dashboardManagementSearchBody = {
process: { identifier: AbstractDashboardComponent.DASHBOARD_MANAGEMENT_IDENTIFIER },
data: {
[AbstractDashboardComponent.DASHBOARD_MANAGEMENT_ID_DATAFIELD]: this.dashboardId
}
};
let dashboardManagementParams = new HttpParams()
.set(PaginationParams.PAGE_SIZE, 1);
this._caseResource.searchCases(SimpleFilter.fromCaseQuery(dashboardManagementSearchBody), dashboardManagementParams).subscribe(resultDashboard => {
const dashboardContent = resultDashboard.content;
if (!dashboardContent || !dashboardContent.length || dashboardContent.length < 1) {
this.loading$.off();
this._log.error('Dashboard management case not found.');
return;
}
this.dashboardCase = dashboardContent[0];
this.toolbarConfig = {
profileEnabled: this.getManagementProfileToolbar(this.dashboardCase),
languageEnabled: this.getManagementLanguageToolbar(this.dashboardCase),
logoutEnabled: this.getManagementLogoutToolbar(this.dashboardCase),
simpleToolbar: this.getManagementSimpleToolbar(this.dashboardCase),
toolbarName: this.getManagementName(this.dashboardCase),
toolbarLogo: this.getManagementLogo(this.dashboardCase),
profileUrl: this.getManagementProfileUrl(this.dashboardCase),
loginUrl: this.getManagementLoginUrl(this.dashboardCase)
};
const dashboardItemsOptions = this.dashboardCase.immediateData
.find(immediateField => immediateField['importId'] === AbstractDashboardComponent.DASHBOARD_MANAGEMENT_ITEM_TO_MENU_ITEM_DATAFIELD).options;
if (!dashboardItemsOptions || Object.keys(dashboardItemsOptions).length === 0) {
this.loading$.off();
return;
}
const dashboardMenuToItems = Object.entries(dashboardItemsOptions)
.filter(([key, value]) => value.defaultValue != null)
.reduce((accum, [key, value]) => {
accum[value.defaultValue] = key;
return accum;
}, {});
let dashboardItemsParams = new HttpParams()
.set(PaginationParams.PAGE_SIZE, 100);
this.getDashboardItems(dashboardItemsOptions, dashboardItemsParams);
this.getMenuItems(dashboardMenuToItems, dashboardItemsParams);
});
}
getMenuItems(dashboardMenuToItems, dashboardItemsParams) {
let menuItemsSearchBody = {
id: Object.keys(dashboardMenuToItems)
};
this._caseResource.searchCases(SimpleFilter.fromCaseQuery(menuItemsSearchBody), dashboardItemsParams).subscribe(resultItems => {
const itemsContent = resultItems.content;
itemsContent.forEach(menuItemCase => {
const navigationItem = this._doubleDrawerNavigationService.resolveItemCaseToNavigationItem(menuItemCase);
const dashboardItemId = dashboardMenuToItems[menuItemCase.stringId];
if (!navigationItem) {
this.dashboardItems = this.dashboardItems.filter(dashItem => dashItem.stringId !== dashboardItemId);
return;
}
this.dashboardItemsMapping[dashboardItemId] = menuItemCase;
});
this.itemsLoaded += 1;
if (this.itemsLoaded == 2) {
this.loading$.off();
}
});
}
getDashboardItems(dashboardItemsOptions, dashboardItemsParams) {
const itemsOrder = this.getManagementItemsOrder(this.dashboardCase)?.split(",");
let dashboardItemsSearchBody = {
id: Object.keys(dashboardItemsOptions)
};
this._caseResource.searchCases(SimpleFilter.fromCaseQuery(dashboardItemsSearchBody), dashboardItemsParams).subscribe(resultItems => {
const itemsContent = resultItems.content;
if (!itemsContent || !itemsContent.length || itemsContent.length < 1) {
this.loading$.off();
this._log.error('No dashboard items found.');
}
itemsContent.forEach(item => {
const itemIndex = itemsOrder?.indexOf(item.stringId);
this.dashboardItems[itemIndex] = item;
});
this.itemsLoaded += 1;
if (this.itemsLoaded == 2) {
this.loading$.off();
}
});
}
// GET item fields
getItemName(itemCase) {
const i18nFieldValue = this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_ITEM_NAME_DATAFIELD);
return this._languageService.getLanguage() in i18nFieldValue.translations
? i18nFieldValue.translations[this._languageService.getLanguage()]
: i18nFieldValue.defaultValue;
}
getItemIcon(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_ITEM_ICON_DATAFIELD);
}
getItemInternal(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_ITEM_INTERNAL_DATAFIELD);
}
getItemExternalIcon(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_ITEM_EXTERNAL_ICON_DATAFIELD);
}
getItemURL(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_ITEM_URL_DATAFIELD);
}
getItemFontColor(itemCase) {
const fontColor = this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_ITEM_FONT_COLOR_DATAFIELD);
return !!fontColor && fontColor !== '' ? fontColor : 'black';
}
getItemFontWeight(itemCase) {
const fontWeight = this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_ITEM_FONT_WEIGHT_DATAFIELD);
return !!fontWeight && fontWeight !== '' ? fontWeight : 'normal';
}
getItemIconColor(itemCase) {
const iconColor = this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_ITEM_ICON_COLOR_DATAFIELD);
return !!iconColor && iconColor !== '' ? iconColor : 'black';
}
// GET management fields
getManagementSimpleToolbar(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_MANAGEMENT_SIMPLE_TOOLBAR_DATAFIELD);
}
getManagementProfileToolbar(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_MANAGEMENT_PROFILE_TOOLBAR_DATAFIELD);
}
getManagementLanguageToolbar(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_MANAGEMENT_LANGUAGE_TOOLBAR_DATAFIELD);
}
getManagementLogoutToolbar(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_MANAGEMENT_LOGOUT_TOOLBAR_DATAFIELD);
}
getManagementName(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_MANAGEMENT_NAME_DATAFIELD);
}
getManagementLogo(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_MANAGEMENT_LOGO_DATAFIELD);
}
getManagementItemsOrder(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_MANAGEMENT_ITEMS_ORDER_DATAFIELD);
}
getManagementProfileUrl(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_MANAGEMENT_PROFILE_URL_DATAFIELD);
}
getManagementLoginUrl(itemCase) {
return this.getFieldValue(itemCase, AbstractDashboardComponent.DASHBOARD_MANAGEMENT_LOGIN_URL_DATAFIELD);
}
getFieldValue(itemCase, fieldId) {
return itemCase.immediateData.find(immediateField => immediateField["importId"] === fieldId).value;
}
navigate(itemCase) {
if (this.getItemInternal(itemCase)) {
const menuItemCase = this.dashboardItemsMapping[itemCase.stringId];
if (!menuItemCase) {
this._log.warn(`No mapped menu item for dashboard item ${itemCase.stringId}`);
return;
}
const itemRoute = this._doubleDrawerNavigationService.getItemRoutingPath(menuItemCase);
const nodePath = this.getFieldValue(menuItemCase, GroupNavigationConstants.ITEM_FIELD_ID_NODE_PATH);
const menuItem = this._doubleDrawerNavigationService.resolveItemCaseToNavigationItem(menuItemCase);
if (menuItem) {
this._doubleDrawerNavigationService.currentNavigationItem = menuItem;
}
if (menuItemCase.immediateData.find(f => f.stringId === GroupNavigationConstants.ITEM_FIELD_ID_HAS_CHILDREN)?.value && nodePath) {
this._pathService.activePath = nodePath;
}
else if (nodePath) {
this._pathService.activePath = this._doubleDrawerNavigationService.extractParentPath(nodePath);
}
this._router.navigate([itemRoute]);
}
else {
window.open(this.getItemURL(itemCase), "_blank");
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractDashboardComponent, deps: [{ token: i1.CaseResourceService }, { token: i2.LoggerService }, { token: i3.PathService }, { token: i4.Router }, { token: i5.LanguageService }, { token: i6.DoubleDrawerNavigationService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AbstractDashboardComponent, selector: "ncc-dashboard", ngImport: i0, template: '', isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractDashboardComponent, decorators: [{
type: Component,
args: [{
selector: 'ncc-dashboard',
template: ''
}]
}], ctorParameters: () => [{ type: i1.CaseResourceService }, { type: i2.LoggerService }, { type: i3.PathService }, { type: i4.Router }, { type: i5.LanguageService }, { type: i6.DoubleDrawerNavigationService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvbmF2aWdhdGlvbi9kYXNoYm9hcmQvYWJzdHJhY3QtZGFzaGJvYXJkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXhDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQU81RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFHL0QsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBRTdELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7OztBQU83RSxNQUFNLE9BQWdCLDBCQUEwQjtJQW9EOUI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBdkRQLE1BQU0sQ0FBVSxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7SUFFbEQsTUFBTSxDQUFVLCtCQUErQixHQUFHLHNCQUFzQixDQUFDO0lBRXpFLE1BQU0sQ0FBVSxpQ0FBaUMsR0FBRyxjQUFjLENBQUM7SUFDbkUsTUFBTSxDQUFVLGdEQUFnRCxHQUFHLDZCQUE2QixDQUFDO0lBQ2pHLE1BQU0sQ0FBVSw2Q0FBNkMsR0FBRywwQkFBMEIsQ0FBQztJQUMzRixNQUFNLENBQVUsOENBQThDLEdBQUcsMkJBQTJCLENBQUM7SUFDN0YsTUFBTSxDQUFVLCtDQUErQyxHQUFHLDRCQUE0QixDQUFDO0lBQy9GLE1BQU0sQ0FBVSw2Q0FBNkMsR0FBRywwQkFBMEIsQ0FBQztJQUMzRixNQUFNLENBQVUsbUNBQW1DLEdBQUcsZ0JBQWdCLENBQUM7SUFD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QUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDbEc7WUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7U0FDdEM7YUFBTTtZQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNwRDtJQUNMLENBQUM7d0dBbFFpQiwwQkFBMEI7NEZBQTFCLDBCQUEwQixxREFGbEMsRUFBRTs7NEZBRU0sMEJBQTBCO2tCQUovQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxlQUFlO29CQUN6QixRQUFRLEVBQUUsRUFBRTtpQkFDZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1BhZ2luYXRpb25QYXJhbXN9IGZyb20gJy4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXBhcmFtcyc7XG5pbXBvcnQge1Rvb2xiYXJDb25maWd9IGZyb20gJy4uLy4uL3Rvb2xiYXIvdG9vbGJhci1jb25maWcnO1xuaW1wb3J0IHtDYXNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2Nhc2UnO1xuaW1wb3J0IHtDYXNlUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L2Nhc2UtcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge0RvdWJsZURyYXdlck5hdmlnYXRpb25TZXJ2aWNlfSBmcm9tICcuLi9uYXZpZ2F0aW9uLWRvdWJsZS1kcmF3ZXIvc2VydmljZS9kb3VibGUtZHJhd2VyLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQge0Nhc2VTZWFyY2hSZXF1ZXN0Qm9keX0gZnJvbSAnLi4vLi4vZmlsdGVyL21vZGVscy9jYXNlLXNlYXJjaC1yZXF1ZXN0LWJvZHknO1xuaW1wb3J0IHtTaW1wbGVGaWx0ZXJ9IGZyb20gJy4uLy4uL2ZpbHRlci9tb2RlbHMvc2ltcGxlLWZpbHRlcic7XG5pbXBvcnQge0kxOG5GaWVsZFZhbHVlfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9pMThuLWZpZWxkL21vZGVscy9pMThuLWZpZWxkLXZhbHVlJztcbmltcG9ydCB7TGFuZ3VhZ2VTZXJ2aWNlfSBmcm9tICcuLi8uLi90cmFuc2xhdGUvbGFuZ3VhZ2Uuc2VydmljZSc7XG5pbXBvcnQge0xvYWRpbmdFbWl0dGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2xvYWRpbmctZW1pdHRlcic7XG5pbXBvcnQge1BhdGhTZXJ2aWNlfSBmcm9tIFwiLi4vc2VydmljZS9wYXRoLnNlcnZpY2VcIjtcbmltcG9ydCB7R3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzfSBmcm9tIFwiLi4vbW9kZWwvZ3JvdXAtbmF2aWdhdGlvbi1jb25zdGFudHNcIjtcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25jYy1kYXNoYm9hcmQnLFxuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhc2hib2FyZENvbXBvbmVudCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1BSU5fREFTSEJPQVJEID0gJ21haW5fZGFzaGJvYXJkJztcblxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREFTSEJPQVJEX01BTkFHRU1FTlRfSURFTlRJRklFUiA9ICdkYXNoYm9hcmRfbWFuYWdlbWVudCc7XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBU0hCT0FSRF9NQU5BR0VNRU5UX0lEX0RBVEFGSUVMRCA9ICdkYXNoYm9hcmRfaWQnO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREFTSEJPQVJEX01BTkFHRU1FTlRfSVRFTV9UT19NRU5VX0lURU1fREFUQUZJRUxEID0gJ2Rhc2hib2FyZF9pdGVtX3RvX21lbnVfaXRlbSc7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBEQVNIQk9BUkRfTUFOQUdFTUVOVF9TSU1QTEVfVE9PTEJBUl9EQVRBRklFTEQgPSAnc2ltcGxlX2Rhc2hib2FyZF90b29sYmFyJztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBU0hCT0FSRF9NQU5BR0VNRU5UX1BST0ZJTEVfVE9PTEJBUl9EQVRBRklFTEQgPSAncHJvZmlsZV9kYXNoYm9hcmRfdG9vbGJhcic7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBEQVNIQk9BUkRfTUFOQUdFTUVOVF9MQU5HVUFHRV9UT09MQkFSX0RBVEFGSUVMRCA9ICdsYW5ndWFnZV9kYXNoYm9hcmRfdG9vbGJhcic7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBEQVNIQk9BUkRfTUFOQUdFTUVOVF9MT0dPVVRfVE9PTEJBUl9EQVRBRklFTEQgPSAnbG9nb3V0X2Rhc2hib2FyZF90b29sYmFyJztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBU0hCT0FSRF9NQU5BR0VNRU5UX05BTUVfREFUQUZJRUxEID0gJ2Rhc2hib2FyZF9uYW1lJztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBU0hCT0FSRF9NQU5BR0VNRU5UX0xPR09fREFUQUZJRUxEID0gJ2Rhc2hib2FyZF9sb2dvJztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBU0hCT0FSRF9NQU5BR0VNRU5UX0lURU1TX09SREVSX0RBVEFGSUVMRCA9IFwiaXRlbXNfb3JkZXJcIjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBU0hCT0FSRF9NQU5BR0VNRU5UX1BST0ZJTEVfVVJMX0RBVEFGSUVMRCA9IFwicHJvZmlsZV91cmxcIjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBU0hCT0FSRF9NQU5BR0VNRU5UX0xPR0lOX1VSTF9EQVRBRklFTEQgPSBcImxvZ2luX3VybFwiO1xuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBEQVNIQk9BUkRfSVRFTV9JQ09OX0RBVEFGSUVMRCA9ICdpdGVtX2ljb24nO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREFTSEJPQVJEX0lURU1fTkFNRV9EQVRBRklFTEQgPSAnaXRlbV9uYW1lJztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBU0hCT0FSRF9JVEVNX1VSTF9EQVRBRklFTEQgPSAnZXh0ZXJuYWxfdXJsJztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBU0hCT0FSRF9JVEVNX0lOVEVSTkFMX0RBVEFGSUVMRCA9ICdpc19pbnRlcm5hbCc7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBEQVNIQk9BUkRfSVRFTV9FWFRFUk5BTF9JQ09OX0RBVEFGSUVMRCA9ICdleHRlcm5hbF9pY29uJztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBU0hCT0FSRF9JVEVNX0ZPTlRfQ09MT1JfREFUQUZJRUxEID0gJ2ZvbnRfY29sb3InO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREFTSEJPQVJEX0lURU1fRk9OVF9XRUlHSFRfREFUQUZJRUxEID0gJ2ZvbnRfd2VpZ2h0JztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERBU0hCT0FSRF9JVEVNX0lDT05fQ09MT1JfREFUQUZJRUxEID0gJ2ljb25fY29sb3InO1xuXG4gICAgcHVibGljIHRvb2xiYXJDb25maWc6IFRvb2xiYXJDb25maWcgPSB7XG4gICAgICAgIHByb2ZpbGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbGFuZ3VhZ2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbG9nb3V0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHNpbXBsZVRvb2xiYXI6IHRydWUsXG4gICAgICAgIHRvb2xiYXJOYW1lOiB7XG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICdOZXRncmlmJyxcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uczoge31cbiAgICAgICAgfSxcbiAgICAgICAgdG9vbGJhckxvZ286ICdhc3NldHMvaW1nL25ldGdyaWZfZnVsbF93aGl0ZS5zdmcnLFxuICAgICAgICBwcm9maWxlVXJsOiAncHJvZmlsZScsXG4gICAgICAgIGxvZ2luVXJsOiAnJ1xuICAgIH07XG5cbiAgICBwdWJsaWMgZGFzaGJvYXJkSWQ6IHN0cmluZyA9IEFic3RyYWN0RGFzaGJvYXJkQ29tcG9uZW50Lk1BSU5fREFTSEJPQVJEO1xuICAgIHB1YmxpYyBkYXNoYm9hcmRDYXNlOiBDYXNlO1xuICAgIHB1YmxpYyBkYXNoYm9hcmRJdGVtczogQXJyYXk8Q2FzZT47XG4gICAgcHVibGljIGRhc2hib2FyZEl0ZW1zTWFwcGluZzoge1xuICAgICAgICBba2V5OiBzdHJpbmddOiBDYXNlXG4gICAgfTtcbiAgICBwcml2YXRlIGl0ZW1zTG9hZGVkOiBudW1iZXIgPSAwO1xuXG4gICAgcHVibGljIGxvYWRpbmckOiBMb2FkaW5nRW1pdHRlciA9IG5ldyBMb2FkaW5nRW1pdHRlcigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBfY2FzZVJlc291cmNlOiBDYXNlUmVzb3VyY2VTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF9wYXRoU2VydmljZTogUGF0aFNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByb3RlY3RlZCBfbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfZG91YmxlRHJhd2VyTmF2aWdhdGlvblNlcnZpY2U6IERvdWJsZURyYXdlck5hdmlnYXRpb25TZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkSXRlbXNNYXBwaW5nID0ge307XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkSXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5sb2FkaW5nJC5vbigpO1xuICAgICAgICBjb25zdCBkYXNoYm9hcmRNYW5hZ2VtZW50U2VhcmNoQm9keTogQ2FzZVNlYXJjaFJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgICAgcHJvY2Vzczoge2lkZW50aWZpZXI6IEFic3RyYWN0RGFzaGJvYXJkQ29tcG9uZW50LkRBU0hCT0FSRF9NQU5BR0VNRU5UX0lERU5USUZJRVJ9LFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIFtBYnN0cmFjdERhc2hib2FyZENvbXBvbmVudC5EQVNIQk9BUkRfTUFOQUdFTUVOVF9JRF9EQVRBRklFTERdOiB0aGlzLmRhc2hib2FyZElkXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxldCBkYXNoYm9hcmRNYW5hZ2VtZW50UGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgICAgICAgICAgLnNldChQYWdpbmF0aW9uUGFyYW1zLlBBR0VfU0laRSwgMSk7XG4gICAgICAgIHRoaXMuX2Nhc2VSZXNvdXJjZS5zZWFyY2hDYXNlcyhTaW1wbGVGaWx0ZXIuZnJvbUNhc2VRdWVyeShkYXNoYm9hcmRNYW5hZ2VtZW50U2VhcmNoQm9keSksIGRhc2hib2FyZE1hbmFnZW1lbnRQYXJhbXMpLnN1YnNjcmliZShyZXN1bHREYXNoYm9hcmQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGFzaGJvYXJkQ29udGVudCA9IHJlc3VsdERhc2hib2FyZC5jb250ZW50O1xuICAgICAgICAgICAgaWYgKCFkYXNoYm9hcmRDb250ZW50IHx8ICFkYXNoYm9hcmRDb250ZW50Lmxlbmd0aCB8fCBkYXNoYm9hcmRDb250ZW50Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm9mZigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcignRGFzaGJvYXJkIG1hbmFnZW1lbnQgY2FzZSBub3QgZm91bmQuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRDYXNlID0gZGFzaGJvYXJkQ29udGVudFswXTtcbiAgICAgICAgICAgIHRoaXMudG9vbGJhckNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBwcm9maWxlRW5hYmxlZDogdGhpcy5nZXRNYW5hZ2VtZW50UHJvZmlsZVRvb2xiYXIodGhpcy5kYXNoYm9hcmRDYXNlKSxcbiAgICAgICAgICAgICAgICBsYW5ndWFnZUVuYWJsZWQ6IHRoaXMuZ2V0TWFuYWdlbWVudExhbmd1YWdlVG9vbGJhcih0aGlzLmRhc2hib2FyZENhc2UpLFxuICAgICAgICAgICAgICAgIGxvZ291dEVuYWJsZWQ6IHRoaXMuZ2V0TWFuYWdlbWVudExvZ291dFRvb2xiYXIodGhpcy5kYXNoYm9hcmRDYXNlKSxcbiAgICAgICAgICAgICAgICBzaW1wbGVUb29sYmFyOiB0aGlzLmdldE1hbmFnZW1lbnRTaW1wbGVUb29sYmFyKHRoaXMuZGFzaGJvYXJkQ2FzZSksXG4gICAgICAgICAgICAgICAgdG9vbGJhck5hbWU6IHRoaXMuZ2V0TWFuYWdlbWVudE5hbWUodGhpcy5kYXNoYm9hcmRDYXNlKSxcbiAgICAgICAgICAgICAgICB0b29sYmFyTG9nbzogdGhpcy5nZXRNYW5hZ2VtZW50TG9nbyh0aGlzLmRhc2hib2FyZENhc2UpLFxuICAgICAgICAgICAgICAgIHByb2ZpbGVVcmw6IHRoaXMuZ2V0TWFuYWdlbWVudFByb2ZpbGVVcmwodGhpcy5kYXNoYm9hcmRDYXNlKSxcbiAgICAgICAgICAgICAgICBsb2dpblVybDogdGhpcy5nZXRNYW5hZ2VtZW50TG9naW5VcmwodGhpcy5kYXNoYm9hcmRDYXNlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXNoYm9hcmRJdGVtc09wdGlvbnMgPSB0aGlzLmRhc2hib2FyZENhc2UuaW1tZWRpYXRlRGF0YVxuICAgICAgICAgICAgICAgIC5maW5kKGltbWVkaWF0ZUZpZWxkID0+IGltbWVkaWF0ZUZpZWxkWydpbXBvcnRJZCddID09PSBBYnN0cmFjdERhc2hib2FyZENvbXBvbmVudC5EQVNIQk9BUkRfTUFOQUdFTUVOVF9JVEVNX1RPX01FTlVfSVRFTV9EQVRBRklFTEQpLm9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoIWRhc2hib2FyZEl0ZW1zT3B0aW9ucyB8fCBPYmplY3Qua2V5cyhkYXNoYm9hcmRJdGVtc09wdGlvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyQub2ZmKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXNoYm9hcmRNZW51VG9JdGVtcyA9IE9iamVjdC5lbnRyaWVzKGRhc2hib2FyZEl0ZW1zT3B0aW9ucylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+ICh2YWx1ZSBhcyBhbnkgYXMgSTE4bkZpZWxkVmFsdWUpLmRlZmF1bHRWYWx1ZSAhPSBudWxsKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGFjY3VtLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW1bKHZhbHVlIGFzIGFueSBhcyBJMThuRmllbGRWYWx1ZSkuZGVmYXVsdFZhbHVlXSA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgICAgICAgIH0sIHt9KTtcblxuICAgICAgICAgICAgbGV0IGRhc2hib2FyZEl0ZW1zUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgICAgICAgICAgICAgIC5zZXQoUGFnaW5hdGlvblBhcmFtcy5QQUdFX1NJWkUsIDEwMCk7XG4gICAgICAgICAgICB0aGlzLmdldERhc2hib2FyZEl0ZW1zKGRhc2hib2FyZEl0ZW1zT3B0aW9ucywgZGFzaGJvYXJkSXRlbXNQYXJhbXMpO1xuICAgICAgICAgICAgdGhpcy5nZXRNZW51SXRlbXMoZGFzaGJvYXJkTWVudVRvSXRlbXMsIGRhc2hib2FyZEl0ZW1zUGFyYW1zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNZW51SXRlbXMoZGFzaGJvYXJkTWVudVRvSXRlbXM6IHt9LCBkYXNoYm9hcmRJdGVtc1BhcmFtczogSHR0cFBhcmFtcykge1xuICAgICAgICBsZXQgbWVudUl0ZW1zU2VhcmNoQm9keSA9IHtcbiAgICAgICAgICAgIGlkOiBPYmplY3Qua2V5cyhkYXNoYm9hcmRNZW51VG9JdGVtcylcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlLnNlYXJjaENhc2VzKFNpbXBsZUZpbHRlci5mcm9tQ2FzZVF1ZXJ5KG1lbnVJdGVtc1NlYXJjaEJvZHkpLCBkYXNoYm9hcmRJdGVtc1BhcmFtcykuc3Vic2NyaWJlKHJlc3VsdEl0ZW1zID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zQ29udGVudCA9IHJlc3VsdEl0ZW1zLmNvbnRlbnQ7XG4gICAgICAgICAgICBpdGVtc0NvbnRlbnQuZm9yRWFjaChtZW51SXRlbUNhc2UgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25JdGVtID0gdGhpcy5fZG91YmxlRHJhd2VyTmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZUl0ZW1DYXNlVG9OYXZpZ2F0aW9uSXRlbShtZW51SXRlbUNhc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhc2hib2FyZEl0ZW1JZCA9IGRhc2hib2FyZE1lbnVUb0l0ZW1zW21lbnVJdGVtQ2FzZS5zdHJpbmdJZF07XG4gICAgICAgICAgICAgICAgaWYgKCFuYXZpZ2F0aW9uSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhc2hib2FyZEl0ZW1zID0gdGhpcy5kYXNoYm9hcmRJdGVtcy5maWx0ZXIoZGFzaEl0ZW0gPT4gZGFzaEl0ZW0uc3RyaW5nSWQgIT09IGRhc2hib2FyZEl0ZW1JZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRJdGVtc01hcHBpbmdbZGFzaGJvYXJkSXRlbUlkXSA9IG1lbnVJdGVtQ2FzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pdGVtc0xvYWRlZCArPSAxO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMb2FkZWQgPT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyQub2ZmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGFzaGJvYXJkSXRlbXMoZGFzaGJvYXJkSXRlbXNPcHRpb25zOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZ1xuICAgIH0sIGRhc2hib2FyZEl0ZW1zUGFyYW1zOiBIdHRwUGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zT3JkZXIgPSB0aGlzLmdldE1hbmFnZW1lbnRJdGVtc09yZGVyKHRoaXMuZGFzaGJvYXJkQ2FzZSk/LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgbGV0IGRhc2hib2FyZEl0ZW1zU2VhcmNoQm9keTogQ2FzZVNlYXJjaFJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgICAgaWQ6IE9iamVjdC5rZXlzKGRhc2hib2FyZEl0ZW1zT3B0aW9ucylcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlLnNlYXJjaENhc2VzKFNpbXBsZUZpbHRlci5mcm9tQ2FzZVF1ZXJ5KGRhc2hib2FyZEl0ZW1zU2VhcmNoQm9keSksIGRhc2hib2FyZEl0ZW1zUGFyYW1zKS5zdWJzY3JpYmUocmVzdWx0SXRlbXMgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbXNDb250ZW50ID0gcmVzdWx0SXRlbXMuY29udGVudDtcbiAgICAgICAgICAgIGlmICghaXRlbXNDb250ZW50IHx8ICFpdGVtc0NvbnRlbnQubGVuZ3RoIHx8IGl0ZW1zQ29udGVudC5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nJC5vZmYoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ05vIGRhc2hib2FyZCBpdGVtcyBmb3VuZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW1zQ29udGVudC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IGl0ZW1zT3JkZXI/LmluZGV4T2YoaXRlbS5zdHJpbmdJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRJdGVtc1tpdGVtSW5kZXhdID0gaXRlbTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pdGVtc0xvYWRlZCArPSAxO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMb2FkZWQgPT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyQub2ZmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEdFVCBpdGVtIGZpZWxkc1xuICAgIHB1YmxpYyBnZXRJdGVtTmFtZShpdGVtQ2FzZTogQ2FzZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGkxOG5GaWVsZFZhbHVlID0gdGhpcy5nZXRGaWVsZFZhbHVlKGl0ZW1DYXNlLCBBYnN0cmFjdERhc2hib2FyZENvbXBvbmVudC5EQVNIQk9BUkRfSVRFTV9OQU1FX0RBVEFGSUVMRCkgYXMgSTE4bkZpZWxkVmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZVNlcnZpY2UuZ2V0TGFuZ3VhZ2UoKSBpbiBpMThuRmllbGRWYWx1ZS50cmFuc2xhdGlvbnNcbiAgICAgICAgICAgID8gaTE4bkZpZWxkVmFsdWUudHJhbnNsYXRpb25zW3RoaXMuX2xhbmd1YWdlU2VydmljZS5nZXRMYW5ndWFnZSgpXVxuICAgICAgICAgICAgOiBpMThuRmllbGRWYWx1ZS5kZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEl0ZW1JY29uKGl0ZW1DYXNlOiBDYXNlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRWYWx1ZShpdGVtQ2FzZSwgQWJzdHJhY3REYXNoYm9hcmRDb21wb25lbnQuREFTSEJPQVJEX0lURU1fSUNPTl9EQVRBRklFTEQpIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlbUludGVybmFsKGl0ZW1DYXNlOiBDYXNlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkVmFsdWUoaXRlbUNhc2UsIEFic3RyYWN0RGFzaGJvYXJkQ29tcG9uZW50LkRBU0hCT0FSRF9JVEVNX0lOVEVSTkFMX0RBVEFGSUVMRCkgYXMgYm9vbGVhbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlbUV4dGVybmFsSWNvbihpdGVtQ2FzZTogQ2FzZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZFZhbHVlKGl0ZW1DYXNlLCBBYnN0cmFjdERhc2hib2FyZENvbXBvbmVudC5EQVNIQk9BUkRfSVRFTV9FWFRFUk5BTF9JQ09OX0RBVEFGSUVMRCkgYXMgYm9vbGVhbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlbVVSTChpdGVtQ2FzZTogQ2FzZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkVmFsdWUoaXRlbUNhc2UsIEFic3RyYWN0RGFzaGJvYXJkQ29tcG9uZW50LkRBU0hCT0FSRF9JVEVNX1VSTF9EQVRBRklFTEQpIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlbUZvbnRDb2xvcihpdGVtQ2FzZTogQ2FzZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGZvbnRDb2xvciA9IHRoaXMuZ2V0RmllbGRWYWx1ZShpdGVtQ2FzZSwgQWJzdHJhY3REYXNoYm9hcmRDb21wb25lbnQuREFTSEJPQVJEX0lURU1fRk9OVF9DT0xPUl9EQVRBRklFTEQpIGFzIHN0cmluZztcbiAgICAgICAgcmV0dXJuICEhZm9udENvbG9yICYmIGZvbnRDb2xvciAhPT0gJycgPyBmb250Q29sb3IgOiAnYmxhY2snO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVtRm9udFdlaWdodChpdGVtQ2FzZTogQ2FzZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGZvbnRXZWlnaHQgPSB0aGlzLmdldEZpZWxkVmFsdWUoaXRlbUNhc2UsIEFic3RyYWN0RGFzaGJvYXJkQ29tcG9uZW50LkRBU0hCT0FSRF9JVEVNX0ZPTlRfV0VJR0hUX0RBVEFGSUVMRCkgYXMgc3RyaW5nO1xuICAgICAgICByZXR1cm4gISFmb250V2VpZ2h0ICYmIGZvbnRXZWlnaHQgIT09ICcnID8gZm9udFdlaWdodCA6ICdub3JtYWwnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVtSWNvbkNvbG9yKGl0ZW1DYXNlOiBDYXNlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaWNvbkNvbG9yID0gdGhpcy5nZXRGaWVsZFZhbHVlKGl0ZW1DYXNlLCBBYnN0cmFjdERhc2hib2FyZENvbXBvbmVudC5EQVNIQk9BUkRfSVRFTV9JQ09OX0NPTE9SX0RBVEFGSUVMRCk7XG4gICAgICAgIHJldHVybiAhIWljb25Db2xvciAmJiBpY29uQ29sb3IgIT09ICcnID8gaWNvbkNvbG9yIDogJ2JsYWNrJztcbiAgICB9XG5cbiAgICAvLyBHRVQgbWFuYWdlbWVudCBmaWVsZHNcbiAgICBwcm90ZWN0ZWQgZ2V0TWFuYWdlbWVudFNpbXBsZVRvb2xiYXIoaXRlbUNhc2U6IENhc2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRWYWx1ZShpdGVtQ2FzZSwgQWJzdHJhY3REYXNoYm9hcmRDb21wb25lbnQuREFTSEJPQVJEX01BTkFHRU1FTlRfU0lNUExFX1RPT0xCQVJfREFUQUZJRUxEKSBhcyBib29sZWFuO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRNYW5hZ2VtZW50UHJvZmlsZVRvb2xiYXIoaXRlbUNhc2U6IENhc2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRWYWx1ZShpdGVtQ2FzZSwgQWJzdHJhY3REYXNoYm9hcmRDb21wb25lbnQuREFTSEJPQVJEX01BTkFHRU1FTlRfUFJPRklMRV9UT09MQkFSX0RBVEFGSUVMRCkgYXMgYm9vbGVhbjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0TWFuYWdlbWVudExhbmd1YWdlVG9vbGJhcihpdGVtQ2FzZTogQ2FzZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZFZhbHVlKGl0ZW1DYXNlLCBBYnN0cmFjdERhc2hib2FyZENvbXBvbmVudC5EQVNIQk9BUkRfTUFOQUdFTUVOVF9MQU5HVUFHRV9UT09MQkFSX0RBVEFGSUVMRCkgYXMgYm9vbGVhbjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0TWFuYWdlbWVudExvZ291dFRvb2xiYXIoaXRlbUNhc2U6IENhc2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRWYWx1ZShpdGVtQ2FzZSwgQWJzdHJhY3REYXNoYm9hcmRDb21wb25lbnQuREFTSEJPQVJEX01BTkFHRU1FTlRfTE9HT1VUX1RPT0xCQVJfREFUQUZJRUxEKSBhcyBib29sZWFuO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRNYW5hZ2VtZW50TmFtZShpdGVtQ2FzZTogQ2FzZSk6IEkxOG5GaWVsZFZhbHVlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRWYWx1ZShpdGVtQ2FzZSwgQWJzdHJhY3REYXNoYm9hcmRDb21wb25lbnQuREFTSEJPQVJEX01BTkFHRU1FTlRfTkFNRV9EQVRBRklFTEQpIGFzIEkxOG5GaWVsZFZhbHVlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRNYW5hZ2VtZW50TG9nbyhpdGVtQ2FzZTogQ2FzZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkVmFsdWUoaXRlbUNhc2UsIEFic3RyYWN0RGFzaGJvYXJkQ29tcG9uZW50LkRBU0hCT0FSRF9NQU5BR0VNRU5UX0xPR09fREFUQUZJRUxEKSBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldE1hbmFnZW1lbnRJdGVtc09yZGVyKGl0ZW1DYXNlOiBDYXNlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRWYWx1ZShpdGVtQ2FzZSwgQWJzdHJhY3REYXNoYm9hcmRDb21wb25lbnQuREFTSEJPQVJEX01BTkFHRU1FTlRfSVRFTVNfT1JERVJfREFUQUZJRUxEKSBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldE1hbmFnZW1lbnRQcm9maWxlVXJsKGl0ZW1DYXNlOiBDYXNlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRWYWx1ZShpdGVtQ2FzZSwgQWJzdHJhY3REYXNoYm9hcmRDb21wb25lbnQuREFTSEJPQVJEX01BTkFHRU1FTlRfUFJPRklMRV9VUkxfREFUQUZJRUxEKSBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldE1hbmFnZW1lbnRMb2dpblVybChpdGVtQ2FzZTogQ2FzZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkVmFsdWUoaXRlbUNhc2UsIEFic3RyYWN0RGFzaGJvYXJkQ29tcG9uZW50LkRBU0hCT0FSRF9NQU5BR0VNRU5UX0xPR0lOX1VSTF9EQVRBRklFTEQpIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0RmllbGRWYWx1ZShpdGVtQ2FzZTogQ2FzZSwgZmllbGRJZDogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIGl0ZW1DYXNlLmltbWVkaWF0ZURhdGEuZmluZChpbW1lZGlhdGVGaWVsZCA9PiBpbW1lZGlhdGVGaWVsZFtcImltcG9ydElkXCJdID09PSBmaWVsZElkKS52YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmF2aWdhdGUoaXRlbUNhc2U6IENhc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0SXRlbUludGVybmFsKGl0ZW1DYXNlKSkge1xuICAgICAgICAgICAgY29uc3QgbWVudUl0ZW1DYXNlID0gdGhpcy5kYXNoYm9hcmRJdGVtc01hcHBpbmdbaXRlbUNhc2Uuc3RyaW5nSWRdO1xuICAgICAgICAgICAgaWYgKCFtZW51SXRlbUNhc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cud2FybihgTm8gbWFwcGVkIG1lbnUgaXRlbSBmb3IgZGFzaGJvYXJkIGl0ZW0gJHtpdGVtQ2FzZS5zdHJpbmdJZH1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpdGVtUm91dGUgPSB0aGlzLl9kb3VibGVEcmF3ZXJOYXZpZ2F0aW9uU2VydmljZS5nZXRJdGVtUm91dGluZ1BhdGgobWVudUl0ZW1DYXNlKTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVQYXRoID0gdGhpcy5nZXRGaWVsZFZhbHVlKG1lbnVJdGVtQ2FzZSwgR3JvdXBOYXZpZ2F0aW9uQ29uc3RhbnRzLklURU1fRklFTERfSURfTk9ERV9QQVRIKTtcbiAgICAgICAgICAgIGNvbnN0IG1lbnVJdGVtID0gdGhpcy5fZG91YmxlRHJhd2VyTmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZUl0ZW1DYXNlVG9OYXZpZ2F0aW9uSXRlbShtZW51SXRlbUNhc2UpO1xuICAgICAgICAgICAgaWYgKG1lbnVJdGVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZG91YmxlRHJhd2VyTmF2aWdhdGlvblNlcnZpY2UuY3VycmVudE5hdmlnYXRpb25JdGVtID0gbWVudUl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVudUl0ZW1DYXNlLmltbWVkaWF0ZURhdGEuZmluZChmID0+IGYuc3RyaW5nSWQgPT09IEdyb3VwTmF2aWdhdGlvbkNvbnN0YW50cy5JVEVNX0ZJRUxEX0lEX0hBU19DSElMRFJFTik/LnZhbHVlICYmIG5vZGVQYXRoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGF0aFNlcnZpY2UuYWN0aXZlUGF0aCA9IG5vZGVQYXRoO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlUGF0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhdGhTZXJ2aWNlLmFjdGl2ZVBhdGggPSB0aGlzLl9kb3VibGVEcmF3ZXJOYXZpZ2F0aW9uU2VydmljZS5leHRyYWN0UGFyZW50UGF0aChub2RlUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW2l0ZW1Sb3V0ZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2luZG93Lm9wZW4odGhpcy5nZXRJdGVtVVJMKGl0ZW1DYXNlKSwgXCJfYmxhbmtcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=