UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

254 lines 45.6 kB
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=