@linid-dm/directory-manager-client-core
Version:
Core package by providing a set of angular components for the Directory Manager app.
311 lines • 40.8 kB
JavaScript
/**
* Copyright (C) 2020-2024 Linagora
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version, provided you comply with the Additional Terms applicable for
* LinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU
* Affero General Public License, subsections (b), (c), and (e), pursuant to
* which these Appropriate Legal Notices must notably (i) retain the display of
* the "LinID™" trademark/logo at the top of the interface window, the display
* of the “You are using the Open Source and free version of LinID™, powered by
* Linagora © 2009–2013. Contribute to LinID R&D by subscribing to an Enterprise
* offer!” infobox and in the e-mails sent with the Program, notice appended to
* any type of outbound messages (e.g. e-mail and meeting requests) as well as
* in the LinID Directory Manager user interface, (ii) retain all hypertext
* links between LinID Directory Manager and https://linid.org/, as well as
* between LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA
* intellectual property rights over its trademarks and commercial brands. Other
* Additional Terms apply, see <http://www.linagora.com/licenses/> for more
* details.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License and
* its applicable Additional Terms for LinID Directory Manager along with this
* program. If not, see <http://www.gnu.org/licenses/> for the GNU Affero
* General Public License version 3 and <http://www.linagora.com/licenses/> for
* the Additional Terms applicable to the LinID Directory Manager software.
*/
import { EEllipsisMenuActions, EUIComponent, } from '../interfaces/ui.interface';
import { setActionTitleVariables } from './configs.helper';
export function getEditedDataSourceRow(oldRow, valueColumnId, editFormValues) {
return {
...oldRow,
[valueColumnId]: editFormValues[oldRow.selectionIds.id],
};
}
export function getEditedDataSourceRows(selectedElementsUiIds, oldRows, valueColumnId, editFormValues) {
let editedRows = [];
editedRows = selectedElementsUiIds.map((ids) => {
const associatedRow = oldRows.find((row) => row.selectionIds.id === ids.id);
return {
...associatedRow,
[valueColumnId]: editFormValues[associatedRow.selectionIds.id],
};
});
return editedRows;
}
export function getLabels(uiComponent, actions, options, node, item) {
let ellipsisBtns = {};
if (!!uiComponent) {
switch (uiComponent) {
case EUIComponent.DATA_DETAIL:
if (!!options) {
ellipsisBtns = options.isForRow
? getEllipsisBtnsForDataDetailArrayRow(actions, options)
: getEllipsisBtnsForDataDetailArrayHeader(actions, options);
}
break;
case EUIComponent.ARRAY_DATA:
if (!!options) {
ellipsisBtns = options.isForRow
? getEllipsisBtnsForArrayDataTableRow(actions, options.canDelete)
: getEllipsisBtnsForArrayDataTableHeader(actions, options.canDelete);
}
break;
case EUIComponent.LIST_DATA:
ellipsisBtns = getEllipsisBtnsForListDataItem(actions, item);
break;
case EUIComponent.TREE_DATA:
if (!!options) {
ellipsisBtns = getEllipsisBtnsForTreeDataNode(actions, options.canCreateChild, node);
}
break;
}
}
return ellipsisBtns;
}
export function getEllipsisBtnsForDataDetailArrayRow(actions, options) {
let ellipsisBtns = {};
const actionsIds = Object.keys(actions);
if (options.canMove) {
if (actionsIds.includes(EEllipsisMenuActions.SINGLE_REASSIGN)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.SINGLE_REASSIGN]: {
...actions[EEllipsisMenuActions.SINGLE_REASSIGN],
canBeDisabled: false,
},
};
}
if (actionsIds.includes(EEllipsisMenuActions.SINGLE_UNASSIGN)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.SINGLE_UNASSIGN]: {
...actions[EEllipsisMenuActions.SINGLE_UNASSIGN],
canBeDisabled: false,
},
};
}
}
if (options.canDelete) {
if (actionsIds.includes(EEllipsisMenuActions.SINGLE_DELETE)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.SINGLE_DELETE]: {
...actions[EEllipsisMenuActions.SINGLE_DELETE],
canBeDisabled: false,
},
};
}
}
if (actionsIds.includes(EEllipsisMenuActions.SINGLE_EDIT)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.SINGLE_EDIT]: {
...actions[EEllipsisMenuActions.SINGLE_EDIT],
canBeDisabled: false,
},
};
}
return ellipsisBtns;
}
export function getEllipsisBtnsForDataDetailArrayHeader(actions, options) {
let ellipsisBtns = {};
const actionsIds = Object.keys(actions);
if (actionsIds.includes(EEllipsisMenuActions.EXPORT)) {
ellipsisBtns = {
[EEllipsisMenuActions.EXPORT]: {
...actions[EEllipsisMenuActions.EXPORT],
canBeDisabled: false,
},
};
}
if (actionsIds.includes(EEllipsisMenuActions.MULTIPLE_EDIT)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.MULTIPLE_EDIT]: {
...actions[EEllipsisMenuActions.MULTIPLE_EDIT],
canBeDisabled: true,
},
};
}
if (options.canMove) {
if (actionsIds.includes(EEllipsisMenuActions.MULTIPLE_REASSIGN)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.MULTIPLE_REASSIGN]: {
...actions[EEllipsisMenuActions.MULTIPLE_REASSIGN],
canBeDisabled: true,
},
};
}
if (actionsIds.includes(EEllipsisMenuActions.MULTIPLE_UNASSIGN)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.MULTIPLE_UNASSIGN]: {
...actions[EEllipsisMenuActions.MULTIPLE_UNASSIGN],
canBeDisabled: true,
},
};
}
}
if (options.canDelete) {
if (actionsIds.includes(EEllipsisMenuActions.MULTIPLE_DELETE)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.MULTIPLE_DELETE]: {
...actions[EEllipsisMenuActions.MULTIPLE_DELETE],
canBeDisabled: true,
},
};
}
}
return ellipsisBtns;
}
export function getEllipsisBtnsForArrayDataTableRow(actions, canDelete) {
let ellipsisBtns = {};
const actionsIds = Object.keys(actions);
if (canDelete && actionsIds.includes(EEllipsisMenuActions.SINGLE_DELETE)) {
ellipsisBtns = {
[EEllipsisMenuActions.SINGLE_DELETE]: {
...actions[EEllipsisMenuActions.SINGLE_DELETE],
canBeDisabled: false,
},
};
}
return ellipsisBtns;
}
export function getEllipsisBtnsForArrayDataTableHeader(actions, canDelete) {
let ellipsisBtns = {};
const actionsIds = Object.keys(actions);
if (actionsIds.includes(EEllipsisMenuActions.EXPORT)) {
ellipsisBtns = {
[EEllipsisMenuActions.EXPORT]: {
...actions[EEllipsisMenuActions.EXPORT],
canBeDisabled: false,
},
};
}
if (canDelete && actionsIds.includes(EEllipsisMenuActions.MULTIPLE_DELETE)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.MULTIPLE_DELETE]: {
...actions[EEllipsisMenuActions.MULTIPLE_DELETE],
canBeDisabled: true,
},
};
}
return ellipsisBtns;
}
export function getEllipsisBtnsForTreeDataNode(actions, canCreateChild, node) {
let ellipsisBtns = {};
const actionsIds = Object.keys(actions);
if (actionsIds.includes(EEllipsisMenuActions.MOVE_NODE)) {
const moveAction = setActionTitleVariables([node.name], actions[EEllipsisMenuActions.MOVE_NODE], EEllipsisMenuActions.MOVE_NODE);
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.MOVE_NODE]: {
...moveAction,
canBeDisabled: false,
},
};
}
if (!!node && node.canDelete) {
if (node.type === node.childrenType) {
if (node.children.length > 1 &&
actionsIds.includes(EEllipsisMenuActions.DELETE_CHILDREN)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.DELETE_CHILDREN]: {
...actions[EEllipsisMenuActions.DELETE_CHILDREN],
canBeDisabled: false,
},
};
}
else if (node.children.length === 1 &&
actionsIds.includes(EEllipsisMenuActions.DELETE_CHILD)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.DELETE_CHILD]: {
...actions[EEllipsisMenuActions.DELETE_CHILD],
canBeDisabled: false,
},
};
}
else if (actionsIds.includes(EEllipsisMenuActions.DELETE)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.DELETE]: {
...actions[EEllipsisMenuActions.DELETE],
canBeDisabled: false,
},
};
}
}
else if (actionsIds.includes(EEllipsisMenuActions.DELETE)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.DELETE]: {
...actions[EEllipsisMenuActions.DELETE],
canBeDisabled: false,
},
};
}
}
if (canCreateChild) {
if (actionsIds.includes(EEllipsisMenuActions.ADD_CHILDREN)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.ADD_CHILDREN]: {
...actions[EEllipsisMenuActions.ADD_CHILDREN],
canBeDisabled: false,
},
};
}
else if (actionsIds.includes(EEllipsisMenuActions.ADD)) {
ellipsisBtns = {
...ellipsisBtns,
[EEllipsisMenuActions.ADD]: {
...actions[EEllipsisMenuActions.ADD],
canBeDisabled: false,
},
};
}
}
return ellipsisBtns;
}
export function getEllipsisBtnsForListDataItem(actions, item) {
let ellipsisBtns = {};
const actionsIds = Object.keys(actions);
if (!!item && item.canDelete) {
if (actionsIds.includes(EEllipsisMenuActions.DELETE)) {
ellipsisBtns = {
[EEllipsisMenuActions.DELETE]: {
...actions[EEllipsisMenuActions.DELETE],
canBeDisabled: false,
},
};
}
}
return ellipsisBtns;
}
export function getMapIdValue(selectedElementsIds, rows, valueColumnId) {
return selectedElementsIds.reduce((acc, currIds) => acc.set(currIds.id, rows.find((row) => row.selectionIds.id === currIds.id)[valueColumnId]), new Map());
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxsaXBzaXMtbWVudS5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9saWJzL2NsaWVudC1jb3JlL3NyYy9saWIvc2hhcmVkL2hlbHBlcnMvZWxsaXBzaXMtbWVudS5oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBY0gsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixZQUFZLEdBR2IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUzRCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLE1BQXNCLEVBQ3RCLGFBQXFCLEVBQ3JCLGNBQTBEO0lBRTFELE9BQU87UUFDTCxHQUFHLE1BQU07UUFDVCxDQUFDLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztLQUN4RCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMscUJBQW9DLEVBQ3BDLE9BQXlCLEVBQ3pCLGFBQXFCLEVBQ3JCLGNBQTBEO0lBRTFELElBQUksVUFBVSxHQUFxQixFQUFFLENBQUM7SUFDdEMsVUFBVSxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQWdCLEVBQUUsRUFBRTtRQUMxRCxNQUFNLGFBQWEsR0FBbUIsT0FBTyxDQUFDLElBQUksQ0FDaEQsQ0FBQyxHQUFtQixFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUN4RCxDQUFDO1FBQ0YsT0FBTztZQUNMLEdBQUcsYUFBYTtZQUNoQixDQUFDLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztTQUMvRCxDQUFDO0lB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LEVBQUUsRUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBbUIsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUNwRSxhQUFhLENBQ2QsQ0FDRixFQUNILElBQUksR0FBRyxFQUFrQixDQUMxQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjQgTGluYWdvcmFcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlclxuICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlXG4gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueVxuICogbGF0ZXIgdmVyc2lvbiwgcHJvdmlkZWQgeW91IGNvbXBseSB3aXRoIHRoZSBBZGRpdGlvbmFsIFRlcm1zIGFwcGxpY2FibGUgZm9yXG4gKiBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBzb2Z0d2FyZSBieSBMSU5BR09SQSBwdXJzdWFudCB0byBTZWN0aW9uIDcgb2YgdGhlIEdOVVxuICogQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHN1YnNlY3Rpb25zIChiKSwgKGMpLCBhbmQgKGUpLCBwdXJzdWFudCB0b1xuICogd2hpY2ggdGhlc2UgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyBtdXN0IG5vdGFibHkgKGkpIHJldGFpbiB0aGUgZGlzcGxheSBvZlxuICogdGhlIFwiTGluSUTihKJcIiB0cmFkZW1hcmsvbG9nbyBhdCB0aGUgdG9wIG9mIHRoZSBpbnRlcmZhY2Ugd2luZG93LCB0aGUgZGlzcGxheVxuICogb2YgdGhlIOKAnFlvdSBhcmUgdXNpbmcgdGhlIE9wZW4gU291cmNlIGFuZCBmcmVlIHZlcnNpb24gb2YgTGluSUTihKIsIHBvd2VyZWQgYnlcbiAqIExpbmFnb3JhIMKpIDIwMDnigJMyMDEzLiBDb250cmlidXRlIHRvIExpbklEIFImRCBieSBzdWJzY3JpYmluZyB0byBhbiBFbnRlcnByaXNlXG4gKiBvZmZlciHigJ0gaW5mb2JveCBhbmQgaW4gdGhlIGUtbWFpbHMgc2VudCB3aXRoIHRoZSBQcm9ncmFtLCBub3RpY2UgYXBwZW5kZWQgdG9cbiAqIGFueSB0eXBlIG9mIG91dGJvdW5kIG1lc3NhZ2VzIChlLmcuIGUtbWFpbCBhbmQgbWVldGluZyByZXF1ZXN0cykgYXMgd2VsbCBhc1xuICogaW4gdGhlIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIHVzZXIgaW50ZXJmYWNlLCAoaWkpIHJldGFpbiBhbGwgaHlwZXJ0ZXh0XG4gKiBsaW5rcyBiZXR3ZWVuIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIGFuZCBodHRwczovL2xpbmlkLm9yZy8sIGFzIHdlbGwgYXNcbiAqIGJldHdlZW4gTElOQUdPUkEgYW5kIExJTkFHT1JBLmNvbSwgYW5kIChpaWkpIHJlZnJhaW4gZnJvbSBpbmZyaW5naW5nIExJTkFHT1JBXG4gKiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG92ZXIgaXRzIHRyYWRlbWFya3MgYW5kIGNvbW1lcmNpYWwgYnJhbmRzLiBPdGhlclxuICogQWRkaXRpb25hbCBUZXJtcyBhcHBseSwgc2VlIDxodHRwOi8vd3d3LmxpbmFnb3JhLmNvbS9saWNlbnNlcy8+IGZvciBtb3JlXG4gKiBkZXRhaWxzLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVFxuICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1NcbiAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmVcbiAqIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZFxuICogaXRzIGFwcGxpY2FibGUgQWRkaXRpb25hbCBUZXJtcyBmb3IgTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgYWxvbmcgd2l0aCB0aGlzXG4gKiBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4gZm9yIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBhbmQgPGh0dHA6Ly93d3cubGluYWdvcmEuY29tL2xpY2Vuc2VzLz4gZm9yXG4gKiB0aGUgQWRkaXRpb25hbCBUZXJtcyBhcHBsaWNhYmxlIHRvIHRoZSBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBzb2Z0d2FyZS5cbiAqL1xuXG5pbXBvcnQge1xuICBJQXR0cmlidXRlQWN0aW9ucyxcbiAgSUJ0bkxhYmVsLFxuICBJUHJpbWl0aXZlQWN0aW9ucyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWdzLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBJRGF0YUl0ZW0sXG4gIElEYXRhTm9kZSxcbiAgSURhdGFTb3VyY2VSb3csXG4gIElVaUVudHJ5SWRzLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2RhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZvcm1GaWVsZHNQcmltaXRpdmVUeXBlcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvZm9ybS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgRUVsbGlwc2lzTWVudUFjdGlvbnMsXG4gIEVVSUNvbXBvbmVudCxcbiAgSUVsbGlwc2lzTWVudSxcbiAgSUVsbGlwc2lzTWVudU9wdGlvbnMsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvdWkuaW50ZXJmYWNlJztcbmltcG9ydCB7IHNldEFjdGlvblRpdGxlVmFyaWFibGVzIH0gZnJvbSAnLi9jb25maWdzLmhlbHBlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGl0ZWREYXRhU291cmNlUm93KFxuICBvbGRSb3c6IElEYXRhU291cmNlUm93LFxuICB2YWx1ZUNvbHVtbklkOiBzdHJpbmcsXG4gIGVkaXRGb3JtVmFsdWVzOiB7IFtpZDogc3RyaW5nXTogRm9ybUZpZWxkc1ByaW1pdGl2ZVR5cGVzIH1cbik6IElEYXRhU291cmNlUm93IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5vbGRSb3csXG4gICAgW3ZhbHVlQ29sdW1uSWRdOiBlZGl0Rm9ybVZhbHVlc1tvbGRSb3cuc2VsZWN0aW9uSWRzLmlkXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVkaXRlZERhdGFTb3VyY2VSb3dzKFxuICBzZWxlY3RlZEVsZW1lbnRzVWlJZHM6IElVaUVudHJ5SWRzW10sXG4gIG9sZFJvd3M6IElEYXRhU291cmNlUm93W10sXG4gIHZhbHVlQ29sdW1uSWQ6IHN0cmluZyxcbiAgZWRpdEZvcm1WYWx1ZXM6IHsgW2lkOiBzdHJpbmddOiBGb3JtRmllbGRzUHJpbWl0aXZlVHlwZXMgfVxuKTogSURhdGFTb3VyY2VSb3dbXSB7XG4gIGxldCBlZGl0ZWRSb3dzOiBJRGF0YVNvdXJjZVJvd1tdID0gW107XG4gIGVkaXRlZFJvd3MgPSBzZWxlY3RlZEVsZW1lbnRzVWlJZHMubWFwKChpZHM6IElVaUVudHJ5SWRzKSA9PiB7XG4gICAgY29uc3QgYXNzb2NpYXRlZFJvdzogSURhdGFTb3VyY2VSb3cgPSBvbGRSb3dzLmZpbmQoXG4gICAgICAocm93OiBJRGF0YVNvdXJjZVJvdykgPT4gcm93LnNlbGVjdGlvbklkcy5pZCA9PT0gaWRzLmlkXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYXNzb2NpYXRlZFJvdyxcbiAgICAgIFt2YWx1ZUNvbHVtbklkXTogZWRpdEZvcm1WYWx1ZXNbYXNzb2NpYXRlZFJvdy5zZWxlY3Rpb25JZHMuaWRdLFxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gZWRpdGVkUm93cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhYmVscyhcbiAgdWlDb21wb25lbnQ6IEVVSUNvbXBvbmVudCxcbiAgYWN0aW9uczogSVByaW1pdGl2ZUFjdGlvbnMgfCBJQXR0cmlidXRlQWN0aW9ucyxcbiAgb3B0aW9uczogSUVsbGlwc2lzTWVudU9wdGlvbnMsXG4gIG5vZGU6IElEYXRhTm9kZSxcbiAgaXRlbTogSURhdGFJdGVtXG4pOiBJRWxsaXBzaXNNZW51IHtcbiAgbGV0IGVsbGlwc2lzQnRuczogSUVsbGlwc2lzTWVudSA9IHt9O1xuICBpZiAoISF1aUNvbXBvbmVudCkge1xuICAgIHN3aXRjaCAodWlDb21wb25lbnQpIHtcbiAgICAgIGNhc2UgRVVJQ29tcG9uZW50LkRBVEFfREVUQUlMOlxuICAgICAgICBpZiAoISFvcHRpb25zKSB7XG4gICAgICAgICAgZWxsaXBzaXNCdG5zID0gb3B0aW9ucy5pc0ZvclJvd1xuICAgICAgICAgICAgPyBnZXRFbGxpcHNpc0J0bnNGb3JEYXRhRGV0YWlsQXJyYXlSb3coYWN0aW9ucywgb3B0aW9ucylcbiAgICAgICAgICAgIDogZ2V0RWxsaXBzaXNCdG5zRm9yRGF0YURldGFpbEFycmF5SGVhZGVyKGFjdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFVUlDb21wb25lbnQuQVJSQVlfREFUQTpcbiAgICAgICAgaWYgKCEhb3B0aW9ucykge1xuICAgICAgICAgIGVsbGlwc2lzQnRucyA9IG9wdGlvbnMuaXNGb3JSb3dcbiAgICAgICAgICAgID8gZ2V0RWxsaXBzaXNCdG5zRm9yQXJyYXlEYXRhVGFibGVSb3coYWN0aW9ucywgb3B0aW9ucy5jYW5EZWxldGUpXG4gICAgICAgICAgICA6IGdldEVsbGlwc2lzQnRuc0ZvckFycmF5RGF0YVRhYmxlSGVhZGVyKFxuICAgICAgICAgICAgICAgIGFjdGlvbnMsXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jYW5EZWxldGVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRVVJQ29tcG9uZW50LkxJU1RfREFUQTpcbiAgICAgICAgZWxsaXBzaXNCdG5zID0gZ2V0RWxsaXBzaXNCdG5zRm9yTGlzdERhdGFJdGVtKGFjdGlvbnMsIGl0ZW0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRVVJQ29tcG9uZW50LlRSRUVfREFUQTpcbiAgICAgICAgaWYgKCEhb3B0aW9ucykge1xuICAgICAgICAgIGVsbGlwc2lzQnRucyA9IGdldEVsbGlwc2lzQnRuc0ZvclRyZWVEYXRhTm9kZShcbiAgICAgICAgICAgIGFjdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zLmNhbkNyZWF0ZUNoaWxkLFxuICAgICAgICAgICAgbm9kZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbGxpcHNpc0J0bnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGxpcHNpc0J0bnNGb3JEYXRhRGV0YWlsQXJyYXlSb3coXG4gIGFjdGlvbnM6IElQcmltaXRpdmVBY3Rpb25zIHwgSUF0dHJpYnV0ZUFjdGlvbnMsXG4gIG9wdGlvbnM6IElFbGxpcHNpc01lbnVPcHRpb25zXG4pOiBJRWxsaXBzaXNNZW51IHtcbiAgbGV0IGVsbGlwc2lzQnRuczogSUVsbGlwc2lzTWVudSA9IHt9O1xuICBjb25zdCBhY3Rpb25zSWRzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGFjdGlvbnMpO1xuICBpZiAob3B0aW9ucy5jYW5Nb3ZlKSB7XG4gICAgaWYgKGFjdGlvbnNJZHMuaW5jbHVkZXMoRUVsbGlwc2lzTWVudUFjdGlvbnMuU0lOR0xFX1JFQVNTSUdOKSkge1xuICAgICAgZWxsaXBzaXNCdG5zID0ge1xuICAgICAgICAuLi5lbGxpcHNpc0J0bnMsXG4gICAgICAgIFtFRWxsaXBzaXNNZW51QWN0aW9ucy5TSU5HTEVfUkVBU1NJR05dOiB7XG4gICAgICAgICAgLi4uYWN0aW9uc1tFRWxsaXBzaXNNZW51QWN0aW9ucy5TSU5HTEVfUkVBU1NJR05dLFxuICAgICAgICAgIGNhbkJlRGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGFjdGlvbnNJZHMuaW5jbHVkZXMoRUVsbGlwc2lzTWVudUFjdGlvbnMuU0lOR0xFX1VOQVNTSUdOKSkge1xuICAgICAgZWxsaXBzaXNCdG5zID0ge1xuICAgICAgICAuLi5lbGxpcHNpc0J0bnMsXG4gICAgICAgIFtFRWxsaXBzaXNNZW51QWN0aW9ucy5TSU5HTEVfVU5BU1NJR05dOiB7XG4gICAgICAgICAgLi4uYWN0aW9uc1tFRWxsaXBzaXNNZW51QWN0aW9ucy5TSU5HTEVfVU5BU1NJR05dLFxuICAgICAgICAgIGNhbkJlRGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgaWYgKG9wdGlvbnMuY2FuRGVsZXRlKSB7XG4gICAgaWYgKGFjdGlvbnNJZHMuaW5jbHVkZXMoRUVsbGlwc2lzTWVudUFjdGlvbnMuU0lOR0xFX0RFTEVURSkpIHtcbiAgICAgIGVsbGlwc2lzQnRucyA9IHtcbiAgICAgICAgLi4uZWxsaXBzaXNCdG5zLFxuICAgICAgICBbRUVsbGlwc2lzTWVudUFjdGlvbnMuU0lOR0xFX0RFTEVURV06IHtcbiAgICAgICAgICAuLi5hY3Rpb25zW0VFbGxpcHNpc01lbnVBY3Rpb25zLlNJTkdMRV9ERUxFVEVdLFxuICAgICAgICAgIGNhbkJlRGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgaWYgKGFjdGlvbnNJZHMuaW5jbHVkZXMoRUVsbGlwc2lzTWVudUFjdGlvbnMuU0lOR0xFX0VESVQpKSB7XG4gICAgZWxsaXBzaXNCdG5zID0ge1xuICAgICAgLi4uZWxsaXBzaXNCdG5zLFxuICAgICAgW0VFbGxpcHNpc01lbnVBY3Rpb25zLlNJTkdMRV9FRElUXToge1xuICAgICAgICAuLi5hY3Rpb25zW0VFbGxpcHNpc01lbnVBY3Rpb25zLlNJTkdMRV9FRElUXSxcbiAgICAgICAgY2FuQmVEaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGVsbGlwc2lzQnRucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsbGlwc2lzQnRuc0ZvckRhdGFEZXRhaWxBcnJheUhlYWRlcihcbiAgYWN0aW9uczogSVByaW1pdGl2ZUFjdGlvbnMgfCBJQXR0cmlidXRlQWN0aW9ucyxcbiAgb3B0aW9uczogSUVsbGlwc2lzTWVudU9wdGlvbnNcbik6IElFbGxpcHNpc01lbnUge1xuICBsZXQgZWxsaXBzaXNCdG5zOiBJRWxsaXBzaXNNZW51ID0ge307XG4gIGNvbnN0IGFjdGlvbnNJZHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoYWN0aW9ucyk7XG4gIGlmIChhY3Rpb25zSWRzLmluY2x1ZGVzKEVFbGxpcHNpc01lbnVBY3Rpb25zLkVYUE9SVCkpIHtcbiAgICBlbGxpcHNpc0J0bnMgPSB7XG4gICAgICBbRUVsbGlwc2lzTWVudUFjdGlvbnMuRVhQT1JUXToge1xuICAgICAgICAuLi5hY3Rpb25zW0VFbGxpcHNpc01lbnVBY3Rpb25zLkVYUE9SVF0sXG4gICAgICAgIGNhbkJlRGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIGlmIChhY3Rpb25zSWRzLmluY2x1ZGVzKEVFbGxpcHNpc01lbnVBY3Rpb25zLk1VTFRJUExFX0VESVQpKSB7XG4gICAgZWxsaXBzaXNCdG5zID0ge1xuICAgICAgLi4uZWxsaXBzaXNCdG5zLFxuICAgICAgW0VFbGxpcHNpc01lbnVBY3Rpb25zLk1VTFRJUExFX0VESVRdOiB7XG4gICAgICAgIC4uLmFjdGlvbnNbRUVsbGlwc2lzTWVudUFjdGlvbnMuTVVMVElQTEVfRURJVF0sXG4gICAgICAgIGNhbkJlRGlzYWJsZWQ6IHRydWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgaWYgKG9wdGlvbnMuY2FuTW92ZSkge1xuICAgIGlmIChhY3Rpb25zSWRzLmluY2x1ZGVzKEVFbGxpcHNpc01lbnVBY3Rpb25zLk1VTFRJUExFX1JFQVNTSUdOKSkge1xuICAgICAgZWxsaXBzaXNCdG5zID0ge1xuICAgICAgICAuLi5lbGxpcHNpc0J0bnMsXG4gICAgICAgIFtFRWxsaXBzaXNNZW51QWN0aW9ucy5NVUxUSVBMRV9SRUFTU0lHTl06IHtcbiAgICAgICAgICAuLi5hY3Rpb25zW0VFbGxpcHNpc01lbnVBY3Rpb25zLk1VTFRJUExFX1JFQVNTSUdOXSxcbiAgICAgICAgICBjYW5CZURpc2FibGVkOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGFjdGlvbnNJZHMuaW5jbHVkZXMoRUVsbGlwc2lzTWVudUFjdGlvbnMuTVVMVElQTEVfVU5BU1NJR04pKSB7XG4gICAgICBlbGxpcHNpc0J0bnMgPSB7XG4gICAgICAgIC4uLmVsbGlwc2lzQnRucyxcbiAgICAgICAgW0VFbGxpcHNpc01lbnVBY3Rpb25zLk1VTFRJUExFX1VOQVNTSUdOXToge1xuICAgICAgICAgIC4uLmFjdGlvbnNbRUVsbGlwc2lzTWVudUFjdGlvbnMuTVVMVElQTEVfVU5BU1NJR05dLFxuICAgICAgICAgIGNhbkJlRGlzYWJsZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBpZiAob3B0aW9ucy5jYW5EZWxldGUpIHtcbiAgICBpZiAoYWN0aW9uc0lkcy5pbmNsdWRlcyhFRWxsaXBzaXNNZW51QWN0aW9ucy5NVUxUSVBMRV9ERUxFVEUpKSB7XG4gICAgICBlbGxpcHNpc0J0bnMgPSB7XG4gICAgICAgIC4uLmVsbGlwc2lzQnRucyxcbiAgICAgICAgW0VFbGxpcHNpc01lbnVBY3Rpb25zLk1VTFRJUExFX0RFTEVURV06IHtcbiAgICAgICAgICAuLi5hY3Rpb25zW0VFbGxpcHNpc01lbnVBY3Rpb25zLk1VTFRJUExFX0RFTEVURV0sXG4gICAgICAgICAgY2FuQmVEaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBlbGxpcHNpc0J0bnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGxpcHNpc0J0bnNGb3JBcnJheURhdGFUYWJsZVJvdyhcbiAgYWN0aW9uczogSVByaW1pdGl2ZUFjdGlvbnMgfCBJQXR0cmlidXRlQWN0aW9ucyxcbiAgY2FuRGVsZXRlOiBib29sZWFuXG4pOiBJRWxsaXBzaXNNZW51IHtcbiAgbGV0IGVsbGlwc2lzQnRuczogSUVsbGlwc2lzTWVudSA9IHt9O1xuICBjb25zdCBhY3Rpb25zSWRzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGFjdGlvbnMpO1xuICBpZiAoY2FuRGVsZXRlICYmIGFjdGlvbnNJZHMuaW5jbHVkZXMoRUVsbGlwc2lzTWVudUFjdGlvbnMuU0lOR0xFX0RFTEVURSkpIHtcbiAgICBlbGxpcHNpc0J0bnMgPSB7XG4gICAgICBbRUVsbGlwc2lzTWVudUFjdGlvbnMuU0lOR0xFX0RFTEVURV06IHtcbiAgICAgICAgLi4uYWN0aW9uc1tFRWxsaXBzaXNNZW51QWN0aW9ucy5TSU5HTEVfREVMRVRFXSxcbiAgICAgICAgY2FuQmVEaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGVsbGlwc2lzQnRucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsbGlwc2lzQnRuc0ZvckFycmF5RGF0YVRhYmxlSGVhZGVyKFxuICBhY3Rpb25zOiBJUHJpbWl0aXZlQWN0aW9ucyB8IElBdHRyaWJ1dGVBY3Rpb25zLFxuICBjYW5EZWxldGU6IGJvb2xlYW5cbik6IElFbGxpcHNpc01lbnUge1xuICBsZXQgZWxsaXBzaXNCdG5zOiBJRWxsaXBzaXNNZW51ID0ge307XG4gIGNvbnN0IGFjdGlvbnNJZHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoYWN0aW9ucyk7XG5cbiAgaWYgKGFjdGlvbnNJZHMuaW5jbHVkZXMoRUVsbGlwc2lzTWVudUFjdGlvbnMuRVhQT1JUKSkge1xuICAgIGVsbGlwc2lzQnRucyA9IHtcbiAgICAgIFtFRWxsaXBzaXNNZW51QWN0aW9ucy5FWFBPUlRdOiB7XG4gICAgICAgIC4uLmFjdGlvbnNbRUVsbGlwc2lzTWVudUFjdGlvbnMuRVhQT1JUXSxcbiAgICAgICAgY2FuQmVEaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoY2FuRGVsZXRlICYmIGFjdGlvbnNJZHMuaW5jbHVkZXMoRUVsbGlwc2lzTWVudUFjdGlvbnMuTVVMVElQTEVfREVMRVRFKSkge1xuICAgIGVsbGlwc2lzQnRucyA9IHtcbiAgICAgIC4uLmVsbGlwc2lzQnRucyxcbiAgICAgIFtFRWxsaXBzaXNNZW51QWN0aW9ucy5NVUxUSVBMRV9ERUxFVEVdOiB7XG4gICAgICAgIC4uLmFjdGlvbnNbRUVsbGlwc2lzTWVudUFjdGlvbnMuTVVMVElQTEVfREVMRVRFXSxcbiAgICAgICAgY2FuQmVEaXNhYmxlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gZWxsaXBzaXNCdG5zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxsaXBzaXNCdG5zRm9yVHJlZURhdGFOb2RlKFxuICBhY3Rpb25zOiBJUHJpbWl0aXZlQWN0aW9ucyB8IElBdHRyaWJ1dGVBY3Rpb25zLFxuICBjYW5DcmVhdGVDaGlsZDogYm9vbGVhbixcbiAgbm9kZTogSURhdGFOb2RlXG4pOiBJRWxsaXBzaXNNZW51IHtcbiAgbGV0IGVsbGlwc2lzQnRuczogSUVsbGlwc2lzTWVudSA9IHt9O1xuICBjb25zdCBhY3Rpb25zSWRzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGFjdGlvbnMpO1xuICBpZiAoYWN0aW9uc0lkcy5pbmNsdWRlcyhFRWxsaXBzaXNNZW51QWN0aW9ucy5NT1ZFX05PREUpKSB7XG4gICAgY29uc3QgbW92ZUFjdGlvbjogSUJ0bkxhYmVsID0gc2V0QWN0aW9uVGl0bGVWYXJpYWJsZXMoXG4gICAgICBbbm9kZS5uYW1lXSxcbiAgICAgIGFjdGlvbnNbRUVsbGlwc2lzTWVudUFjdGlvbnMuTU9WRV9OT0RFXSxcbiAgICAgIEVFbGxpcHNpc01lbnVBY3Rpb25zLk1PVkVfTk9ERVxuICAgICk7XG4gICAgZWxsaXBzaXNCdG5zID0ge1xuICAgICAgLi4uZWxsaXBzaXNCdG5zLFxuICAgICAgW0VFbGxpcHNpc01lbnVBY3Rpb25zLk1PVkVfTk9ERV06IHtcbiAgICAgICAgLi4ubW92ZUFjdGlvbixcbiAgICAgICAgY2FuQmVEaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgaWYgKCEhbm9kZSAmJiBub2RlLmNhbkRlbGV0ZSkge1xuICAgIGlmIChub2RlLnR5cGUgPT09IG5vZGUuY2hpbGRyZW5UeXBlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBhY3Rpb25zSWRzLmluY2x1ZGVzKEVFbGxpcHNpc01lbnVBY3Rpb25zLkRFTEVURV9DSElMRFJFTilcbiAgICAgICkge1xuICAgICAgICBlbGxpcHNpc0J0bnMgPSB7XG4gICAgICAgICAgLi4uZWxsaXBzaXNCdG5zLFxuICAgICAgICAgIFtFRWxsaXBzaXNNZW51QWN0aW9ucy5ERUxFVEVfQ0hJTERSRU5dOiB7XG4gICAgICAgICAgICAuLi5hY3Rpb25zW0VFbGxpcHNpc01lbnVBY3Rpb25zLkRFTEVURV9DSElMRFJFTl0sXG4gICAgICAgICAgICBjYW5CZURpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgYWN0aW9uc0lkcy5pbmNsdWRlcyhFRWxsaXBzaXNNZW51QWN0aW9ucy5ERUxFVEVfQ0hJTEQpXG4gICAgICApIHtcbiAgICAgICAgZWxsaXBzaXNCdG5zID0ge1xuICAgICAgICAgIC4uLmVsbGlwc2lzQnRucyxcbiAgICAgICAgICBbRUVsbGlwc2lzTWVudUFjdGlvbnMuREVMRVRFX0NISUxEXToge1xuICAgICAgICAgICAgLi4uYWN0aW9uc1tFRWxsaXBzaXNNZW51QWN0aW9ucy5ERUxFVEVfQ0hJTERdLFxuICAgICAgICAgICAgY2FuQmVEaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aW9uc0lkcy5pbmNsdWRlcyhFRWxsaXBzaXNNZW51QWN0aW9ucy5ERUxFVEUpKSB7XG4gICAgICAgIGVsbGlwc2lzQnRucyA9IHtcbiAgICAgICAgICAuLi5lbGxpcHNpc0J0bnMsXG4gICAgICAgICAgW0VFbGxpcHNpc01lbnVBY3Rpb25zLkRFTEVURV06IHtcbiAgICAgICAgICAgIC4uLmFjdGlvbnNbRUVsbGlwc2lzTWVudUFjdGlvbnMuREVMRVRFXSxcbiAgICAgICAgICAgIGNhbkJlRGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhY3Rpb25zSWRzLmluY2x1ZGVzKEVFbGxpcHNpc01lbnVBY3Rpb25zLkRFTEVURSkpIHtcbiAgICAgIGVsbGlwc2lzQnRucyA9IHtcbiAgICAgICAgLi4uZWxsaXBzaXNCdG5zLFxuICAgICAgICBbRUVsbGlwc2lzTWVudUFjdGlvbnMuREVMRVRFXToge1xuICAgICAgICAgIC4uLmFjdGlvbnNbRUVsbGlwc2lzTWVudUFjdGlvbnMuREVMRVRFXSxcbiAgICAgICAgICBjYW5CZURpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGlmIChjYW5DcmVhdGVDaGlsZCkge1xuICAgIGlmIChhY3Rpb25zSWRzLmluY2x1ZGVzKEVFbGxpcHNpc01lbnVBY3Rpb25zLkFERF9DSElMRFJFTikpIHtcbiAgICAgIGVsbGlwc2lzQnRucyA9IHtcbiAgICAgICAgLi4uZWxsaXBzaXNCdG5zLFxuICAgICAgICBbRUVsbGlwc2lzTWVudUFjdGlvbnMuQUREX0NISUxEUkVOXToge1xuICAgICAgICAgIC4uLmFjdGlvbnNbRUVsbGlwc2lzTWVudUFjdGlvbnMuQUREX0NISUxEUkVOXSxcbiAgICAgICAgICBjYW5CZURpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChhY3Rpb25zSWRzLmluY2x1ZGVzKEVFbGxpcHNpc01lbnVBY3Rpb25zLkFERCkpIHtcbiAgICAgIGVsbGlwc2lzQnRucyA9IHtcbiAgICAgICAgLi4uZWxsaXBzaXNCdG5zLFxuICAgICAgICBbRUVsbGlwc2lzTWVudUFjdGlvbnMuQUREXToge1xuICAgICAgICAgIC4uLmFjdGlvbnNbRUVsbGlwc2lzTWVudUFjdGlvbnMuQUREXSxcbiAgICAgICAgICBjYW5CZURpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBlbGxpcHNpc0J0bnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGxpcHNpc0J0bnNGb3JMaXN0RGF0YUl0ZW0oXG4gIGFjdGlvbnM6IElQcmltaXRpdmVBY3Rpb25zIHwgSUF0dHJpYnV0ZUFjdGlvbnMsXG4gIGl0ZW06IElEYXRhSXRlbVxuKTogSUVsbGlwc2lzTWVudSB7XG4gIGxldCBlbGxpcHNpc0J0bnM6IElFbGxpcHNpc01lbnUgPSB7fTtcbiAgY29uc3QgYWN0aW9uc0lkczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhhY3Rpb25zKTtcbiAgaWYgKCEhaXRlbSAmJiBpdGVtLmNhbkRlbGV0ZSkge1xuICAgIGlmIChhY3Rpb25zSWRzLmluY2x1ZGVzKEVFbGxpcHNpc01lbnVBY3Rpb25zLkRFTEVURSkpIHtcbiAgICAgIGVsbGlwc2lzQnRucyA9IHtcbiAgICAgICAgW0VFbGxpcHNpc01lbnVBY3Rpb25zLkRFTEVURV06IHtcbiAgICAgICAgICAuLi5hY3Rpb25zW0VFbGxpcHNpc01lbnVBY3Rpb25zLkRFTEVURV0sXG4gICAgICAgICAgY2FuQmVEaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWxsaXBzaXNCdG5zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwSWRWYWx1ZShcbiAgc2VsZWN0ZWRFbGVtZW50c0lkczogSVVpRW50cnlJZHNbXSxcbiAgcm93czogSURhdGFTb3VyY2VSb3dbXSxcbiAgdmFsdWVDb2x1bW5JZDogc3RyaW5nXG4pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHNJZHMucmVkdWNlKFxuICAgIChhY2MsIGN1cnJJZHMpID0+XG4gICAgICBhY2Muc2V0KFxuICAgICAgICBjdXJySWRzLmlkLFxuICAgICAgICByb3dzLmZpbmQoKHJvdzogSURhdGFTb3VyY2VSb3cpID0+IHJvdy5zZWxlY3Rpb25JZHMuaWQgPT09IGN1cnJJZHMuaWQpW1xuICAgICAgICAgIHZhbHVlQ29sdW1uSWRcbiAgICAgICAgXVxuICAgICAgKSxcbiAgICBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICk7XG59XG4iXX0=