@hestia-earth/ui-components 0.3.1 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/hestia-earth-ui-components.umd.js +151 -102
- package/bundles/hestia-earth-ui-components.umd.js.map +1 -1
- package/common/link-key-value/link-key-value.component.d.ts +1 -0
- package/esm2015/common/link-key-value/link-key-value.component.js +9 -3
- package/esm2015/files/files-error.model.js +5 -3
- package/esm2015/node/index.js +2 -1
- package/esm2015/node/node-link/node-link.component.js +6 -2
- package/esm2015/node/node-logs-models/node-logs-models.component.js +8 -5
- package/esm2015/node/node-logs-models/node-logs-models.model.js +386 -0
- package/esm2015/node/node-missing-lookup-factors/node-missing-lookup-factors.component.js +1 -1
- package/esm2015/node/node-value-details/node-value-details.component.js +8 -4
- package/esm2015/node/node.service.js +3 -3
- package/fesm2015/hestia-earth-ui-components.js +62 -28
- package/fesm2015/hestia-earth-ui-components.js.map +1 -1
- package/node/index.d.ts +1 -0
- package/node/node-logs-models/node-logs-models.component.d.ts +3 -1
- package/node/{node-logs.model.d.ts → node-logs-models/node-logs-models.model.d.ts} +3 -2
- package/node/node-missing-lookup-factors/node-missing-lookup-factors.component.d.ts +1 -1
- package/node/node-value-details/node-value-details.component.d.ts +2 -1
- package/node/node.service.d.ts +6 -2
- package/package.json +1 -1
- package/esm2015/node/node-logs.model.js +0 -370
package/node/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from './node-csv.service';
|
|
|
2
2
|
export * from './node.module';
|
|
3
3
|
export * from './node.service';
|
|
4
4
|
export * from './node-diffs/node-diffs.model';
|
|
5
|
+
export * from './node-logs-models/node-logs-models.model';
|
|
5
6
|
export { NodeCsvExportConfirmComponent } from './node-csv-export-confirm/node-csv-export-confirm.component';
|
|
6
7
|
export { NodeCsvSelectHeadersComponent } from './node-csv-select-headers/node-csv-select-headers.component';
|
|
7
8
|
export { NodeDiffsComponent } from './node-diffs/node-diffs.component';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
|
-
import { IBlankNodeLogSubValue, IBlankNodeLog, LogStatus, IConfigModel } from '
|
|
3
|
+
import { IBlankNodeLogSubValue, IBlankNodeLog, LogStatus, IConfigModel } from './node-logs-models.model';
|
|
4
4
|
import { HeNodeService } from '../node.service';
|
|
5
5
|
import { HeEngineService } from '../../engine/engine.service';
|
|
6
6
|
import { HeSearchService } from '../../search/search.service';
|
|
@@ -9,6 +9,7 @@ export declare class NodeLogsModelsComponent implements OnInit {
|
|
|
9
9
|
private nodeService;
|
|
10
10
|
private searchService;
|
|
11
11
|
private engineService;
|
|
12
|
+
private logs;
|
|
12
13
|
private allTerms;
|
|
13
14
|
private allBlankNodes;
|
|
14
15
|
private node?;
|
|
@@ -57,6 +58,7 @@ export declare class NodeLogsModelsComponent implements OnInit {
|
|
|
57
58
|
suggestTerm: (text$: Observable<string>) => Observable<string[]>;
|
|
58
59
|
constructor(nodeService: HeNodeService, searchService: HeSearchService, engineService: HeEngineService);
|
|
59
60
|
ngOnInit(): Promise<void>;
|
|
61
|
+
private getLogs;
|
|
60
62
|
private suggestByTerm;
|
|
61
63
|
trackByBlankNode(_index: number, node: IBlankNodeLog): string;
|
|
62
64
|
get filteredType(): string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Emission, ITermJSONLD, Product, Input as HestiaInput, NodeType, TermTermType, Property, SchemaType } from '@hestia-earth/schema';
|
|
2
|
-
import { IOrchestratorConfig, IModel } from '
|
|
2
|
+
import { IOrchestratorConfig, IModel } from '../../engine/engine.service';
|
|
3
3
|
export interface INodeMissingLookupLog {
|
|
4
4
|
filename: string;
|
|
5
5
|
termId: string;
|
|
@@ -26,7 +26,8 @@ export interface INodeTermLog {
|
|
|
26
26
|
export interface INodeTermLogs {
|
|
27
27
|
[modelKey: string]: any | INodeTermLog;
|
|
28
28
|
models: string[];
|
|
29
|
-
isKey
|
|
29
|
+
isKey?: boolean;
|
|
30
|
+
isProperty?: boolean;
|
|
30
31
|
}
|
|
31
32
|
export interface INodeLogs {
|
|
32
33
|
[term: string]: INodeTermLogs;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
2
|
import { JSONLD, NodeType } from '@hestia-earth/schema';
|
|
3
|
-
import { INodeMissingLookupLog } from '../node-logs.model';
|
|
3
|
+
import { INodeMissingLookupLog } from '../node-logs-models/node-logs-models.model';
|
|
4
4
|
import { HeNodeService } from '../node.service';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
export declare class NodeMissingLookupFactorsComponent implements OnInit {
|
|
@@ -10,8 +10,9 @@ export declare class NodeValueDetailsComponent<T> implements OnInit {
|
|
|
10
10
|
keys: string[];
|
|
11
11
|
additionalKeys: string[];
|
|
12
12
|
tableKeys: string[];
|
|
13
|
-
get type(): any;
|
|
14
13
|
ngOnInit(): void;
|
|
14
|
+
get type(): any;
|
|
15
|
+
get showInline(): boolean;
|
|
15
16
|
static ɵfac: i0.ɵɵFactoryDeclaration<NodeValueDetailsComponent<any>, never>;
|
|
16
17
|
static ɵcmp: i0.ɵɵComponentDeclaration<NodeValueDetailsComponent<any>, "he-node-value-details", never, { "data": "data"; "nodeType": "nodeType"; "dataKey": "dataKey"; }, {}, never, never>;
|
|
17
18
|
}
|
package/node/node.service.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
2
|
import { DataState } from '@hestia-earth/api';
|
|
3
3
|
import { ICycleJSONLD, IImpactAssessmentJSONLD, ISiteJSONLD, NodeType, TermTermType } from '@hestia-earth/schema';
|
|
4
|
-
import { INodeMissingLookupLog } from './node-logs.model';
|
|
4
|
+
import { INodeMissingLookupLog } from './node-logs-models/node-logs-models.model';
|
|
5
5
|
import { HeCommonService } from '../common/common.service';
|
|
6
6
|
import { HeAuthService } from '../auth/auth.service';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
@@ -33,6 +33,10 @@ export interface IJSONData {
|
|
|
33
33
|
[NodeType.Site]?: ISiteJSONLD[];
|
|
34
34
|
[NodeType.ImpactAssessment]?: IImpactAssessmentJSONLD[];
|
|
35
35
|
}
|
|
36
|
+
export interface INodeErrorLog {
|
|
37
|
+
error: string;
|
|
38
|
+
stack?: string;
|
|
39
|
+
}
|
|
36
40
|
export declare class HeNodeService {
|
|
37
41
|
protected http: HttpClient;
|
|
38
42
|
protected authService: HeAuthService;
|
|
@@ -42,7 +46,7 @@ export declare class HeNodeService {
|
|
|
42
46
|
get<T>(node: IJSONNode, defaultForState?: boolean): Promise<T>;
|
|
43
47
|
getLog({ dataState, ...node }: IJSONNode): import("rxjs").Observable<string>;
|
|
44
48
|
getMissingLookupsLog({ dataState, ...node }: IJSONNode): Promise<INodeMissingLookupLog[]>;
|
|
45
|
-
|
|
49
|
+
getErrorLog({ dataState, ...node }: IJSONNode): Promise<INodeErrorLog>;
|
|
46
50
|
triggerPipeline({ dataState, ...node }: IJSONNode): Promise<Object>;
|
|
47
51
|
downloadRaw<T = any>(url: string, responseType?: any): Promise<T>;
|
|
48
52
|
nodeTypeUrl(type: any): string;
|
package/package.json
CHANGED
|
@@ -1,370 +0,0 @@
|
|
|
1
|
-
import { __rest } from "tslib";
|
|
2
|
-
/* eslint-disable complexity */
|
|
3
|
-
import { from } from 'rxjs';
|
|
4
|
-
import { distinct, toArray, map } from 'rxjs/operators';
|
|
5
|
-
import { fileToExt, SupportedExtensions } from '@hestia-earth/api';
|
|
6
|
-
import { EmissionMethodTier, TermTermType, SchemaType, isTypeNode } from '@hestia-earth/schema';
|
|
7
|
-
import { unique, isUndefined } from '@hestia-earth/utils';
|
|
8
|
-
import { propertyValue } from '@hestia-earth/utils/dist/term';
|
|
9
|
-
const get = require('lodash.get');
|
|
10
|
-
const set = require('lodash.set');
|
|
11
|
-
const orderBy = require('lodash.orderby');
|
|
12
|
-
import { findConfigModels, findModels, findMatchingModel, modelParams, modelKeyParams } from '../engine/engine.service';
|
|
13
|
-
const termTypes = Object.values(TermTermType);
|
|
14
|
-
const blankNodeTypes = Object.values(SchemaType).filter(t => !isTypeNode(t));
|
|
15
|
-
const schemaTypesLowerCase = Object.values(SchemaType).map(v => v.toLowerCase());
|
|
16
|
-
const blankNodeTypesLowerCase = blankNodeTypes.map(v => v.toLowerCase());
|
|
17
|
-
const missingLookupPrefix = 'Missing lookup';
|
|
18
|
-
const parseFilename = (filepath) => {
|
|
19
|
-
const [filename] = filepath.split('.');
|
|
20
|
-
const ext = termTypes.includes(filename) ? SupportedExtensions.xlsx : SupportedExtensions.csv;
|
|
21
|
-
return fileToExt(filename, ext);
|
|
22
|
-
};
|
|
23
|
-
const parseLookup = ({ column, termid, [missingLookupPrefix]: missingLookup }) => ({
|
|
24
|
-
filename: parseFilename(missingLookup), termId: termid, column
|
|
25
|
-
});
|
|
26
|
-
const csvValue = (value) => (value || '').replace('[', '').replace(']', '');
|
|
27
|
-
const parseMessage = (message) => {
|
|
28
|
-
try {
|
|
29
|
-
const data = JSON.parse(message);
|
|
30
|
-
return data.message.split(',').reduce((prev, parts) => {
|
|
31
|
-
const [key, value] = parts.split('=');
|
|
32
|
-
const val = csvValue(value);
|
|
33
|
-
return Object.assign(Object.assign({}, prev), (key && val ? { [key.trim()]: val } : {}));
|
|
34
|
-
}, { logger: data.logger });
|
|
35
|
-
}
|
|
36
|
-
catch (err) {
|
|
37
|
-
// make sure it works even if one log is malformed
|
|
38
|
-
return {};
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
const omitLogKeys = (log) => Object.fromEntries(Object.entries(log).filter(([key]) => !schemaTypesLowerCase.includes(key)));
|
|
42
|
-
const includeBlankNodes = (logs, log) => Object
|
|
43
|
-
.keys(log)
|
|
44
|
-
.filter(key => blankNodeTypesLowerCase.includes(key))
|
|
45
|
-
.reduce((prev, key) => (Object.assign(Object.assign({}, prev), { [key]: unique([
|
|
46
|
-
...((typeof prev[key] === 'string' ? [prev[key]] : prev[key]) || []),
|
|
47
|
-
log[key]
|
|
48
|
-
]) })), logs);
|
|
49
|
-
const groupLog = (group, _a) => {
|
|
50
|
-
var { logger, term, model, key, should_run, run_required, property } = _a, log = __rest(_a, ["logger", "term", "model", "key", "should_run", "run_required", "property"]);
|
|
51
|
-
const isOrchestrator = logger.includes('orchestrator');
|
|
52
|
-
const isKey = !isOrchestrator && !!key;
|
|
53
|
-
const parentLogKey = [`["${term}"]`, !isOrchestrator && key || property].filter(Boolean).join('.');
|
|
54
|
-
const logModelKey = [parentLogKey, model].filter(Boolean).join('.');
|
|
55
|
-
set(group, `${parentLogKey}.models`, unique([
|
|
56
|
-
...get(group, `${parentLogKey}.models`, []),
|
|
57
|
-
model
|
|
58
|
-
]));
|
|
59
|
-
set(group, `${parentLogKey}.isKey`, isKey);
|
|
60
|
-
let data = get(group, logModelKey, {});
|
|
61
|
-
data = includeBlankNodes(data, log);
|
|
62
|
-
if (typeof should_run !== 'undefined') {
|
|
63
|
-
const shouldRun = should_run === 'True';
|
|
64
|
-
data = isOrchestrator ? Object.assign(Object.assign({}, data), { shouldRunOrchestrator: shouldRun }) : Object.assign(Object.assign(Object.assign({}, data), omitLogKeys(log)), { shouldRun });
|
|
65
|
-
}
|
|
66
|
-
else if (typeof run_required !== 'undefined') {
|
|
67
|
-
const runRequired = run_required === 'True';
|
|
68
|
-
data = Object.assign(Object.assign(Object.assign({}, data), (runRequired ? {} : omitLogKeys(log))), { // no need to save logs if we need to run the model
|
|
69
|
-
runRequired });
|
|
70
|
-
}
|
|
71
|
-
else if ('requirements' in log) {
|
|
72
|
-
const { requirements } = log, logData = __rest(log, ["requirements"]);
|
|
73
|
-
data.requirements = Object.assign(Object.assign({}, (data.requirements || {})), logData);
|
|
74
|
-
}
|
|
75
|
-
else if (missingLookupPrefix in log) {
|
|
76
|
-
data.missingLookups = unique([
|
|
77
|
-
...(data.missingLookups || []),
|
|
78
|
-
parseLookup(log)
|
|
79
|
-
]);
|
|
80
|
-
}
|
|
81
|
-
else if (!isOrchestrator) {
|
|
82
|
-
data.logs = Object.assign(Object.assign({}, (data.logs || {})), omitLogKeys(log));
|
|
83
|
-
}
|
|
84
|
-
set(group, logModelKey, data);
|
|
85
|
-
return group;
|
|
86
|
-
};
|
|
87
|
-
const groupLogSubValue = (group, log, key) => {
|
|
88
|
-
const id = log[key];
|
|
89
|
-
const data = groupLog(group[id] || {}, log);
|
|
90
|
-
group[id] = data;
|
|
91
|
-
if (key === 'transformation') {
|
|
92
|
-
// add value to the same term/model on parent group
|
|
93
|
-
Object.entries(group[id]).map(([term, models]) => Object.keys(models).map(model => {
|
|
94
|
-
var _a;
|
|
95
|
-
if ((_a = group === null || group === void 0 ? void 0 : group[term]) === null || _a === void 0 ? void 0 : _a[model]) {
|
|
96
|
-
group[term][model][key] = unique([
|
|
97
|
-
...(group[term][model][key] || []),
|
|
98
|
-
id
|
|
99
|
-
]);
|
|
100
|
-
}
|
|
101
|
-
}));
|
|
102
|
-
}
|
|
103
|
-
return group;
|
|
104
|
-
};
|
|
105
|
-
const subValueKeys = [
|
|
106
|
-
'transformation'
|
|
107
|
-
];
|
|
108
|
-
export const groupLogsByModel = (data) => data.split('\n')
|
|
109
|
-
.map(parseMessage)
|
|
110
|
-
.filter(v => !!(v === null || v === void 0 ? void 0 : v.term) && (v === null || v === void 0 ? void 0 : v.term) !== 'None' && !!(v === null || v === void 0 ? void 0 : v.model))
|
|
111
|
-
.reduce((group, log) => {
|
|
112
|
-
const subValue = subValueKeys.find(v => !!log[v]);
|
|
113
|
-
return subValue ?
|
|
114
|
-
subValue === 'transformation' ?
|
|
115
|
-
// for transformation, do not add to top-level model
|
|
116
|
-
groupLogSubValue(group, log, subValue) :
|
|
117
|
-
groupLog(groupLogSubValue(group, log, subValue), log)
|
|
118
|
-
: groupLog(group, log);
|
|
119
|
-
});
|
|
120
|
-
export const computeTerms = (originalValues, recalculatedValues, terms, filterTermTypes) => from((terms === null || terms === void 0 ? void 0 : terms.length) ?
|
|
121
|
-
terms :
|
|
122
|
-
[
|
|
123
|
-
...(originalValues || []).map(({ term }) => term),
|
|
124
|
-
...(recalculatedValues || []).map(({ term }) => term)
|
|
125
|
-
].filter(node => !(filterTermTypes === null || filterTermTypes === void 0 ? void 0 : filterTermTypes.length) || filterTermTypes.includes(node.termType))).pipe(distinct(v => v['@id']), toArray(), map(v => orderBy(v, ['name'], ['asc']))).toPromise();
|
|
126
|
-
export var LogStatus;
|
|
127
|
-
(function (LogStatus) {
|
|
128
|
-
LogStatus["success"] = "successful";
|
|
129
|
-
LogStatus["error"] = "failed";
|
|
130
|
-
LogStatus["skipHierarchy"] = "not run (model higher up hierarchy run instead)";
|
|
131
|
-
LogStatus["dataProvided"] = "not run (user provided data retained)";
|
|
132
|
-
LogStatus["notRequired"] = "not relevant";
|
|
133
|
-
})(LogStatus || (LogStatus = {}));
|
|
134
|
-
const hasLogDetails = (data, logs) => {
|
|
135
|
-
var _a;
|
|
136
|
-
return [
|
|
137
|
-
LogStatus.success,
|
|
138
|
-
LogStatus.error
|
|
139
|
-
].includes(logStatus(data, logs)) && ((logs === null || logs === void 0 ? void 0 : logs.requirements) || (logs === null || logs === void 0 ? void 0 : logs.logs) || ((_a = logs === null || logs === void 0 ? void 0 : logs.missingLookups) === null || _a === void 0 ? void 0 : _a.length));
|
|
140
|
-
};
|
|
141
|
-
const logStatus = (data, logs) => hasLog(logs)
|
|
142
|
-
? (!data.isRequired
|
|
143
|
-
? LogStatus.notRequired
|
|
144
|
-
: isRunOrchestrator(logs)
|
|
145
|
-
? ('shouldRun' in logs
|
|
146
|
-
? logs.shouldRun
|
|
147
|
-
? data.isRecalculated
|
|
148
|
-
? LogStatus.success
|
|
149
|
-
: LogStatus.dataProvided
|
|
150
|
-
: LogStatus.error
|
|
151
|
-
: LogStatus.dataProvided)
|
|
152
|
-
: data.isRecalculated
|
|
153
|
-
? LogStatus.skipHierarchy
|
|
154
|
-
: LogStatus.dataProvided)
|
|
155
|
-
: ([
|
|
156
|
-
typeof data.originalValue === 'undefined',
|
|
157
|
-
data.isRecalculated // is recalculated
|
|
158
|
-
].every(Boolean)
|
|
159
|
-
? LogStatus.skipHierarchy
|
|
160
|
-
: LogStatus.dataProvided);
|
|
161
|
-
const reduceValues = (values, termId) => {
|
|
162
|
-
const propertyValues = values
|
|
163
|
-
.map(({ value }) => propertyValue(value, termId))
|
|
164
|
-
// propertyValue may return null if the value is null or undefined, therefore remove them from total
|
|
165
|
-
.filter(v => v !== null);
|
|
166
|
-
return propertyValues.length ? propertyValues.reduce((p, v) => p + v, 0) : undefined;
|
|
167
|
-
};
|
|
168
|
-
const isRunOrchestrator = (log) => !('shouldRunOrchestrator' in log) || log.shouldRunOrchestrator;
|
|
169
|
-
const isBackground = (log) => (log === null || log === void 0 ? void 0 : log.methodTier) === EmissionMethodTier.background;
|
|
170
|
-
const hasLog = (log, withOrchestrator = true) => !!log && ('shouldRun' in log ||
|
|
171
|
-
'runRequired' in log ||
|
|
172
|
-
(withOrchestrator && 'shouldRunOrchestrator' in log));
|
|
173
|
-
const isRecalculated = (values, key = 'value') => values.some(v => ([
|
|
174
|
-
...(v.added || []),
|
|
175
|
-
...(v.updated || [])
|
|
176
|
-
]).includes(key));
|
|
177
|
-
const blankNodeValueByKey = {
|
|
178
|
-
property: (values, _k, id) => {
|
|
179
|
-
var _a;
|
|
180
|
-
return !!id && (values === null || values === void 0 ? void 0 : values.length)
|
|
181
|
-
? ((_a = (values[0].properties || []).find(p => p.term['@id'] === id)) === null || _a === void 0 ? void 0 : _a.value) || ''
|
|
182
|
-
: '';
|
|
183
|
-
},
|
|
184
|
-
input: (values, _k, id) => {
|
|
185
|
-
var _a;
|
|
186
|
-
return !!id && (values === null || values === void 0 ? void 0 : values.length)
|
|
187
|
-
? propertyValue((_a = values.find(({ inputs }) => (inputs || []).some(input => input['@id'] === id))) === null || _a === void 0 ? void 0 : _a.value, id)
|
|
188
|
-
: '';
|
|
189
|
-
},
|
|
190
|
-
default: (blankNodes, key) => {
|
|
191
|
-
const value = (blankNodes === null || blankNodes === void 0 ? void 0 : blankNodes.length) ? blankNodes[0][key] : null;
|
|
192
|
-
return ['string', 'number', 'boolean', 'undefined'].includes(typeof value)
|
|
193
|
-
? isUndefined(value)
|
|
194
|
-
? ''
|
|
195
|
-
: value
|
|
196
|
-
: null;
|
|
197
|
-
}
|
|
198
|
-
};
|
|
199
|
-
const blankNodeValue = (blankNodes, key, id) => blankNodeValueByKey[key in blankNodeValueByKey ? key : 'default'](blankNodes, key, id);
|
|
200
|
-
const logSubValue = (logs, key, prop) => logs[key][prop] ? (Array.isArray(logs[key][prop]) ?
|
|
201
|
-
logs[key][prop].map(id => ({ key: prop, id })) :
|
|
202
|
-
{ key: prop, id: logs[key][prop] }) : undefined;
|
|
203
|
-
const logProperties = (nodes, models) => nodes.flatMap(node => (node.properties || []).map(({ term }) => term['@id'])).map(id => ({ key: 'property', id, configModels: findModels(models, id).map(({ model }) => model) }));
|
|
204
|
-
const logSubValues = (allLogs, logs, original, recalculated, models, { nodeType, type, termId }) => unique([
|
|
205
|
-
...Object.keys(logs).flatMap(key => [
|
|
206
|
-
logSubValue(logs, key, 'input'),
|
|
207
|
-
logSubValue(logs, key, 'property')
|
|
208
|
-
]
|
|
209
|
-
.flat()
|
|
210
|
-
.filter(Boolean)
|
|
211
|
-
.map(v => (Object.assign(Object.assign({}, v), { configModels: [key] })))),
|
|
212
|
-
...logProperties(original, models),
|
|
213
|
-
...logProperties(recalculated, models)
|
|
214
|
-
])
|
|
215
|
-
.map(v => {
|
|
216
|
-
const originalValue = blankNodeValue(original, v.key, v.id);
|
|
217
|
-
const recalculatedValue = blankNodeValue(recalculated, v.key, v.id);
|
|
218
|
-
return Object.assign(Object.assign({}, v), { configModels: v.configModels.map(configModelWithDocs(models, { nodeType, type, termId }, v)), originalValue,
|
|
219
|
-
recalculatedValue, isRecalculated: !isUndefined(recalculatedValue) && recalculatedValue !== originalValue, isRequired: true });
|
|
220
|
-
})
|
|
221
|
-
.filter(v => v.configModels.length > 0)
|
|
222
|
-
.map(dataWithConfigModelLogs(allLogs));
|
|
223
|
-
// const hasKey = (blankNodes: blankNode[], key: string) => (blankNodes || []).some(n => key in n);
|
|
224
|
-
const logKeys = (logs, original, recalculated, models, { nodeType, type, termId }) => Object.keys(logs)
|
|
225
|
-
.filter(key => logs[key].isKey)
|
|
226
|
-
.map(key => ({
|
|
227
|
-
key,
|
|
228
|
-
configModels: (logs[key].models || [])
|
|
229
|
-
.map(configModelWithDocs(models, { nodeType, type, termId }, { key }))
|
|
230
|
-
// only take those we found a matching model (avoid matching key on wrong node type)
|
|
231
|
-
.filter(v => !!v.model),
|
|
232
|
-
originalValue: blankNodeValue(original, key),
|
|
233
|
-
recalculatedValue: blankNodeValue(recalculated, key),
|
|
234
|
-
isRecalculated: isRecalculated(recalculated, key),
|
|
235
|
-
isRequired: true
|
|
236
|
-
}))
|
|
237
|
-
.filter(v => v.configModels.length > 0)
|
|
238
|
-
.map(dataWithConfigModelLogs(logs));
|
|
239
|
-
const isBackgroundNoInput = (logs) => logs.methodTier === EmissionMethodTier.background && !logs.input;
|
|
240
|
-
const isModelLog = (logs) => [
|
|
241
|
-
!isBackgroundNoInput(logs),
|
|
242
|
-
!logs.isKey,
|
|
243
|
-
!logs.input,
|
|
244
|
-
!logs.property
|
|
245
|
-
].every(Boolean) && [
|
|
246
|
-
'shouldRun' in logs,
|
|
247
|
-
'shouldRunOrchestrator' in logs,
|
|
248
|
-
'runRequired' in logs
|
|
249
|
-
].some(Boolean);
|
|
250
|
-
const modelConfigOrder = (models, termId, modelKey, model) => {
|
|
251
|
-
const indexes = models.map((m, index) => {
|
|
252
|
-
const arrayIndex = Array.isArray(m) ? modelConfigOrder(m, termId, modelKey, model) : '';
|
|
253
|
-
return Array.isArray(m)
|
|
254
|
-
? arrayIndex
|
|
255
|
-
? [index, arrayIndex].join('.')
|
|
256
|
-
: ''
|
|
257
|
-
: [termId === m.value, modelKey === m.key, model === m.model].every(Boolean)
|
|
258
|
-
? `${index}`
|
|
259
|
-
: '';
|
|
260
|
-
}).filter(Boolean);
|
|
261
|
-
return indexes.length ? indexes[0] : '';
|
|
262
|
-
};
|
|
263
|
-
const configModelWithDocs = (models, { nodeType, type, termId }, subValue) => (methodId) => {
|
|
264
|
-
const node = {
|
|
265
|
-
'@type': nodeType,
|
|
266
|
-
term: { '@id': (subValue === null || subValue === void 0 ? void 0 : subValue.id) || termId },
|
|
267
|
-
methodModel: { '@id': methodId }
|
|
268
|
-
};
|
|
269
|
-
return {
|
|
270
|
-
methodId,
|
|
271
|
-
model: findMatchingModel(models, modelParams(node)) ||
|
|
272
|
-
findMatchingModel(models, modelKeyParams(node, `${subValue === null || subValue === void 0 ? void 0 : subValue.key}.${methodId}`)) ||
|
|
273
|
-
// handle "input.price"
|
|
274
|
-
findMatchingModel(models, modelKeyParams(node, `${type.toLowerCase()}.${subValue === null || subValue === void 0 ? void 0 : subValue.key}`)) ||
|
|
275
|
-
// handle "input.hestiaAggregatedData"
|
|
276
|
-
findMatchingModel(models, modelKeyParams(node, `${type.toLowerCase()}.${methodId}`))
|
|
277
|
-
};
|
|
278
|
-
};
|
|
279
|
-
const configModelWithLogs = (data, logs) => (model) => (Object.assign(Object.assign({}, model), { logs: logs === null || logs === void 0 ? void 0 : logs[model.methodId], status: logStatus(data, logs === null || logs === void 0 ? void 0 : logs[model.methodId]), showLogs: hasLogDetails(data, logs === null || logs === void 0 ? void 0 : logs[model.methodId]) }));
|
|
280
|
-
const dataWithConfigModelLogs = (logs) => (data) => {
|
|
281
|
-
const subLogKey = data.id || data.key ?
|
|
282
|
-
data.id || data.key : null;
|
|
283
|
-
const log = subLogKey ? logs[subLogKey] : logs;
|
|
284
|
-
return Object.assign(Object.assign({}, data), { configModels: data.configModels.map(model => Array.isArray(model) ? model.map(configModelWithLogs(data, log)) : configModelWithLogs(data, log)(model)) });
|
|
285
|
-
};
|
|
286
|
-
/**
|
|
287
|
-
* Group models running in parallel under the same array, as they should appear vertically.
|
|
288
|
-
*
|
|
289
|
-
* @param config The configuration.
|
|
290
|
-
* @param models The list of models
|
|
291
|
-
*/
|
|
292
|
-
const groupParallelModels = (config, termId, modelKey, models) => {
|
|
293
|
-
const modelsWithOrder = models.map(model => ({
|
|
294
|
-
model,
|
|
295
|
-
order: modelConfigOrder(config.models, termId, modelKey, model.methodId)
|
|
296
|
-
}));
|
|
297
|
-
return modelsWithOrder
|
|
298
|
-
.reduce((prev, { model, order }) => {
|
|
299
|
-
const isArray = order.includes('.');
|
|
300
|
-
const arrayIndex = isArray ? order.split('.')[0] : prev.length;
|
|
301
|
-
prev[arrayIndex] = isArray ? [...(prev[arrayIndex] || []), model] : model;
|
|
302
|
-
return prev;
|
|
303
|
-
}, [])
|
|
304
|
-
.filter(Boolean)
|
|
305
|
-
.map(v => v.length === 1 ? v[0] : v);
|
|
306
|
-
};
|
|
307
|
-
const allParallel = (models) => models.length === 1 && Array.isArray(models[0]) && models[0].length > 1;
|
|
308
|
-
const valueByMethodId = (values, methodId, termId) => { var _a; return propertyValue((_a = values.find(v => { var _a; return ((_a = v.methodModel) === null || _a === void 0 ? void 0 : _a['@id']) === methodId; })) === null || _a === void 0 ? void 0 : _a.value, termId); };
|
|
309
|
-
const groupParallelValues = (values, models, termId) => Array.isArray(models)
|
|
310
|
-
? Object.fromEntries(models.map(model => [model.methodId, valueByMethodId(values, model.methodId, termId)]))
|
|
311
|
-
: {};
|
|
312
|
-
export const groupLogsByTerm = (nodeType, logs, models, config, allOriginalValues, allRecalculatedValues, nodeKey) => {
|
|
313
|
-
const originalValues = (allOriginalValues || []).filter(value => !value.deleted);
|
|
314
|
-
const recalculatedValues = (allRecalculatedValues || []).filter(value => !value.deleted);
|
|
315
|
-
const type = originalValues.length ?
|
|
316
|
-
originalValues[0]['@type'] || originalValues[0].type :
|
|
317
|
-
recalculatedValues.length ?
|
|
318
|
-
recalculatedValues[0]['@type'] || recalculatedValues[0].type :
|
|
319
|
-
undefined;
|
|
320
|
-
return (term) => {
|
|
321
|
-
const termId = term['@id'];
|
|
322
|
-
const termLogs = get(logs, termId, {});
|
|
323
|
-
const original = originalValues.filter(v => termId === v.term['@id']);
|
|
324
|
-
const recalculated = recalculatedValues.filter(v => termId === v.term['@id']);
|
|
325
|
-
const hasData = !!original.length || !!recalculated.length || Object.keys(termLogs).length > 0;
|
|
326
|
-
const configModelsData = { nodeType, type, termId };
|
|
327
|
-
const configModels = groupParallelModels(config, termId, nodeKey, unique([
|
|
328
|
-
...(termLogs.models || []).filter(key => isModelLog(termLogs[key])),
|
|
329
|
-
...findConfigModels(config, termId, nodeKey, models).map(({ model }) => model)
|
|
330
|
-
]).map(configModelWithDocs(models, configModelsData)));
|
|
331
|
-
const keys = logKeys(termLogs, original, recalculated, models, configModelsData);
|
|
332
|
-
const subValues = logSubValues(logs, termLogs, original, recalculated, models, configModelsData);
|
|
333
|
-
const isRequired = !Object.values(termLogs)
|
|
334
|
-
.filter(v => typeof v === 'object' && !Array.isArray(v))
|
|
335
|
-
// ignore models that were never going to run
|
|
336
|
-
.filter(isRunOrchestrator)
|
|
337
|
-
.every(v => v.runRequired === false);
|
|
338
|
-
return dataWithConfigModelLogs(termLogs)({
|
|
339
|
-
isOpen: true,
|
|
340
|
-
canOpen: keys.length > 0 || subValues.length > 0,
|
|
341
|
-
termId,
|
|
342
|
-
term,
|
|
343
|
-
type,
|
|
344
|
-
configModels,
|
|
345
|
-
original,
|
|
346
|
-
originalValue: reduceValues(original, termId),
|
|
347
|
-
recalculated,
|
|
348
|
-
recalculatedValue: reduceValues(recalculated, termId),
|
|
349
|
-
isOriginal: !!original.length,
|
|
350
|
-
isRecalculated: isRecalculated(recalculated),
|
|
351
|
-
hasData,
|
|
352
|
-
isRequired,
|
|
353
|
-
logs: termLogs,
|
|
354
|
-
keys,
|
|
355
|
-
subValues,
|
|
356
|
-
allParallel: allParallel(configModels),
|
|
357
|
-
originalValueByMethodId: groupParallelValues(original, configModels[0], termId),
|
|
358
|
-
recalculatedValueByMethodId: groupParallelValues(recalculated, configModels[0], termId)
|
|
359
|
-
});
|
|
360
|
-
};
|
|
361
|
-
};
|
|
362
|
-
export const modelCount = (blankNodeLogs) => Math.max.apply(Math.max, [
|
|
363
|
-
0,
|
|
364
|
-
...blankNodeLogs.flatMap(v => [
|
|
365
|
-
v.configModels.length,
|
|
366
|
-
...v.subValues.map(s => { var _a, _b; return (_b = (_a = s.configModels) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0; }),
|
|
367
|
-
v.keys.length ? 1 : 0
|
|
368
|
-
])
|
|
369
|
-
]);
|
|
370
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkUsT0FBTyxFQUNLLGtCQUFrQixFQUNsQixZQUFZLEVBQVksVUFBVSxFQUFFLFVBQVUsRUFDekQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbEMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTFDLE9BQU8sRUFDMEMsZ0JBQWdCLEVBQUUsVUFBVSxFQUMzRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUMvQyxNQUFNLDBCQUEwQixDQUFDO0FBbUNsQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRTlDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUU3RSxNQUFNLG9CQUFv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QUUsTUFBTSxDQUFDO1NBQ3hGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLGFBQThCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDckYsQ0FBQztJQUNELEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTTtRQUNyQixHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQUMsT0FBQSxNQUFBLE1BQUEsQ0FBQyxDQUFDLFlBQVksMENBQUUsTUFBTSxtQ0FBSSxDQUFDLENBQUEsRUFBQSxDQUFDO1FBQ3BELENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdEIsQ0FBQztDQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cbmltcG9ydCB7IGZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0LCB0b0FycmF5LCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBmaWxlVG9FeHQsIFN1cHBvcnRlZEV4dGVuc2lvbnMgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQge1xuICBFbWlzc2lvbiwgRW1pc3Npb25NZXRob2RUaWVyLCBJVGVybUpTT05MRCwgUHJvZHVjdCwgSW5wdXQgYXMgSGVzdGlhSW5wdXQsXG4gIE5vZGVUeXBlLCBUZXJtVGVybVR5cGUsIFByb3BlcnR5LCBTY2hlbWFUeXBlLCBpc1R5cGVOb2RlXG59IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IHVuaXF1ZSwgaXNVbmRlZmluZWQgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcbmltcG9ydCB7IHByb3BlcnR5VmFsdWUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzL2Rpc3QvdGVybSc7XG5jb25zdCBnZXQgPSByZXF1aXJlKCdsb2Rhc2guZ2V0Jyk7XG5jb25zdCBzZXQgPSByZXF1aXJlKCdsb2Rhc2guc2V0Jyk7XG5jb25zdCBvcmRlckJ5ID0gcmVxdWlyZSgnbG9kYXNoLm9yZGVyYnknKTtcblxuaW1wb3J0IHtcbiAgSU9yY2hlc3RyYXRvckNvbmZpZywgSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnLCBmaW5kQ29uZmlnTW9kZWxzLCBmaW5kTW9kZWxzLCBJTW9kZWwsXG4gIGZpbmRNYXRjaGluZ01vZGVsLCBtb2RlbFBhcmFtcywgbW9kZWxLZXlQYXJhbXNcbn0gZnJvbSAnLi4vZW5naW5lL2VuZ2luZS5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBJTm9kZU1pc3NpbmdMb29rdXBMb2cge1xuICBmaWxlbmFtZTogc3RyaW5nO1xuICB0ZXJtSWQ6IHN0cmluZztcbiAgY29sdW1uOiBzdHJpbmc7XG4gIC8vIGF0dHJpYnV0ZXMgbGlua2VkIHRvIHRoZSBtb2RlbHNcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIHRlcm0/OiBzdHJpbmc7XG4gIGtleT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTm9kZVRlcm1Mb2cge1xuICBydW5SZXF1aXJlZD86IGJvb2xlYW47XG4gIHNob3VsZFJ1bj86IGJvb2xlYW47XG4gIHNob3VsZFJ1bk9yY2hlc3RyYXRvcj86IGJvb2xlYW47XG4gIG1pc3NpbmdMb29rdXBzPzogSU5vZGVNaXNzaW5nTG9va3VwTG9nW107XG4gIHJlcXVpcmVtZW50cz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIGxvZ3M/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIC8vIHBvc3NpYmxlIHN1YiB2YWx1ZXNcbiAgaW5wdXQ/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgcHJvcGVydHk/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTm9kZVRlcm1Mb2dzIHtcbiAgW21vZGVsS2V5OiBzdHJpbmddOiBhbnkgfCBJTm9kZVRlcm1Mb2c7XG4gIG1vZGVsczogc3RyaW5nW107XG4gIGlzS2V5OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOb2RlTG9ncyB7XG4gIFt0ZXJtOiBzdHJpbmddOiBJTm9kZVRlcm1Mb2dzO1xufVxuXG5jb25zdCB0ZXJtVHlwZXMgPSBPYmplY3QudmFsdWVzKFRlcm1UZXJtVHlwZSk7XG5cbmNvbnN0IGJsYW5rTm9kZVR5cGVzID0gT2JqZWN0LnZhbHVlcyhTY2hlbWFUeXBlKS5maWx0ZXIodCA9PiAhaXNUeXBlTm9kZSh0KSk7XG5cbmNvbnN0IHNjaGVtYVR5cGVzTG93ZXJDYXNlID0gT2JqZWN0LnZhbHVlcyhTY2hlbWFUeXBlKS5tYXAodiA9PiB2LnRvTG93ZXJDYXNlKCkpO1xuXG5jb25zdCBibGFua05vZGVUeXBlc0xvd2VyQ2FzZSA9IGJsYW5rTm9kZVR5cGVzLm1hcCh2ID0+IHYudG9Mb3dlckNhc2UoKSk7XG5cbmNvbnN0IG1pc3NpbmdMb29rdXBQcmVmaXggPSAnTWlzc2luZyBsb29rdXAnO1xuXG5jb25zdCBwYXJzZUZpbGVuYW1lID0gKGZpbGVwYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgW2ZpbGVuYW1lXSA9IGZpbGVwYXRoLnNwbGl0KCcuJyk7XG4gIGNvbnN0IGV4dCA9IHRlcm1UeXBlcy5pbmNsdWRlcyhmaWxlbmFtZSBhcyBhbnkpID8gU3VwcG9ydGVkRXh0ZW5zaW9ucy54bHN4IDogU3VwcG9ydGVkRXh0ZW5zaW9ucy5jc3Y7XG4gIHJldHVybiBmaWxlVG9FeHQoZmlsZW5hbWUsIGV4dCk7XG59O1xuXG5jb25zdCBwYXJzZUxvb2t1cCA9ICh7IGNvbHVtbiwgdGVybWlkLCBbbWlzc2luZ0xvb2t1cFByZWZpeF06IG1pc3NpbmdMb29rdXAgfSkgPT4gKHtcbiAgZmlsZW5hbWU6IHBhcnNlRmlsZW5hbWUobWlzc2luZ0xvb2t1cCksIHRlcm1JZDogdGVybWlkLCBjb2x1bW5cbn0pO1xuXG5jb25zdCBjc3ZWYWx1ZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiAodmFsdWUgfHwgJycpLnJlcGxhY2UoJ1snLCAnJykucmVwbGFjZSgnXScsICcnKTtcblxuY29uc3QgcGFyc2VNZXNzYWdlID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgIHJldHVybiBkYXRhLm1lc3NhZ2Uuc3BsaXQoJywnKS5yZWR1Y2UoKHByZXYsIHBhcnRzKSA9PiB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBwYXJ0cy5zcGxpdCgnPScpO1xuICAgICAgY29uc3QgdmFsID0gY3N2VmFsdWUodmFsdWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgLi4uKGtleSAmJiB2YWwgPyB7IFtrZXkudHJpbSgpXTogdmFsIH0gOiB7fSlcbiAgICAgIH07XG4gICAgfSwgeyBsb2dnZXI6IGRhdGEubG9nZ2VyIH0pO1xuICB9XG4gIGNhdGNoIChlcnIpIHtcbiAgICAvLyBtYWtlIHN1cmUgaXQgd29ya3MgZXZlbiBpZiBvbmUgbG9nIGlzIG1hbGZvcm1lZFxuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuY29uc3Qgb21pdExvZ0tleXMgPSAobG9nOiBhbnkpID0+XG4gIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhsb2cpLmZpbHRlcigoW2tleV0pID0+ICFzY2hlbWFUeXBlc0xvd2VyQ2FzZS5pbmNsdWRlcyhrZXkpKSk7XG5cbmNvbnN0IGluY2x1ZGVCbGFua05vZGVzID0gKGxvZ3MsIGxvZykgPT5cbiAgT2JqZWN0XG4gICAgLmtleXMobG9nKVxuICAgIC5maWx0ZXIoa2V5ID0+IGJsYW5rTm9kZVR5cGVzTG93ZXJDYXNlLmluY2x1ZGVzKGtleSkpXG4gICAgLnJlZHVjZSgocHJldiwga2V5KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtrZXldOiB1bmlxdWUoW1xuICAgICAgICAuLi4oKHR5cGVvZiBwcmV2W2tleV0gPT09ICdzdHJpbmcnID8gW3ByZXZba2V5XV0gOiBwcmV2W2tleV0pIHx8IFtdKSxcbiAgICAgICAgbG9nW2tleV1cbiAgICAgIF0pXG4gICAgfSksIGxvZ3MpO1xuXG5jb25zdCBncm91cExvZyA9IChncm91cCwgeyBsb2dnZXIsIHRlcm0sIG1vZGVsLCBrZXksIHNob3VsZF9ydW4sIHJ1bl9yZXF1aXJlZCwgcHJvcGVydHksIC4uLmxvZyB9OiBhbnkpID0+IHtcbiAgY29uc3QgaXNPcmNoZXN0cmF0b3IgPSBsb2dnZXIuaW5jbHVkZXMoJ29yY2hlc3RyYXRvcicpO1xuICBjb25zdCBpc0tleSA9ICFpc09yY2hlc3RyYXRvciAmJiAhIWtleTtcbiAgY29uc3QgcGFyZW50TG9nS2V5ID0gW2BbXCIke3Rlcm19XCJdYCwgIWlzT3JjaGVzdHJhdG9yICYmIGtleSB8fCBwcm9wZXJ0eV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy4nKTtcbiAgY29uc3QgbG9nTW9kZWxLZXkgPSBbcGFyZW50TG9nS2V5LCBtb2RlbF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy4nKTtcblxuICBzZXQoZ3JvdXAsIGAke3BhcmVudExvZ0tleX0ubW9kZWxzYCwgdW5pcXVlKFtcbiAgICAuLi5nZXQoZ3JvdXAsIGAke3BhcmVudExvZ0tleX0ubW9kZWxzYCwgW10pLFxuICAgIG1vZGVsXG4gIF0pKTtcbiAgc2V0KGdyb3VwLCBgJHtwYXJlbnRMb2dLZXl9LmlzS2V5YCwgaXNLZXkpO1xuXG4gIGxldCBkYXRhID0gZ2V0KGdyb3VwLCBsb2dNb2RlbEtleSwge30pO1xuXG4gIGRhdGEgPSBpbmNsdWRlQmxhbmtOb2RlcyhkYXRhLCBsb2cpO1xuXG4gIGlmICh0eXBlb2Ygc2hvdWxkX3J1biAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zdCBzaG91bGRSdW4gPSBzaG91bGRfcnVuID09PSAnVHJ1ZSc7XG5cbiAgICBkYXRhID0gaXNPcmNoZXN0cmF0b3IgP1xuICAgICAge1xuICAgICAgICAuLi5kYXRhLFxuICAgICAgICBzaG91bGRSdW5PcmNoZXN0cmF0b3I6IHNob3VsZFJ1blxuICAgICAgfSA6XG4gICAgICB7XG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIC4uLm9taXRMb2dLZXlzKGxvZyksXG4gICAgICAgIHNob3VsZFJ1blxuICAgICAgfTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgcnVuX3JlcXVpcmVkICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnN0IHJ1blJlcXVpcmVkID0gcnVuX3JlcXVpcmVkID09PSAnVHJ1ZSc7XG5cbiAgICBkYXRhID0gIHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICAuLi4ocnVuUmVxdWlyZWQgPyB7fSA6IG9taXRMb2dLZXlzKGxvZykpLCAvLyBubyBuZWVkIHRvIHNhdmUgbG9ncyBpZiB3ZSBuZWVkIHRvIHJ1biB0aGUgbW9kZWxcbiAgICAgIHJ1blJlcXVpcmVkXG4gICAgfTtcbiAgfVxuICBlbHNlIGlmICgncmVxdWlyZW1lbnRzJyBpbiBsb2cpIHtcbiAgICBjb25zdCB7IHJlcXVpcmVtZW50cywgLi4ubG9nRGF0YSB9ID0gbG9nO1xuXG4gICAgZGF0YS5yZXF1aXJlbWVudHMgPSB7XG4gICAgICAuLi4oZGF0YS5yZXF1aXJlbWVudHMgfHwge30pLFxuICAgICAgLi4ubG9nRGF0YVxuICAgIH07XG4gIH1cbiAgZWxzZSBpZiAobWlzc2luZ0xvb2t1cFByZWZpeCBpbiBsb2cpIHtcbiAgICBkYXRhLm1pc3NpbmdMb29rdXBzID0gdW5pcXVlKFtcbiAgICAgIC4uLihkYXRhLm1pc3NpbmdMb29rdXBzIHx8IFtdKSxcbiAgICAgIHBhcnNlTG9va3VwKGxvZylcbiAgICBdKTtcbiAgfVxuICBlbHNlIGlmICghaXNPcmNoZXN0cmF0b3IpIHtcbiAgICBkYXRhLmxvZ3MgPSB7XG4gICAgICAuLi4oZGF0YS5sb2dzIHx8IHt9KSxcbiAgICAgIC4uLm9taXRMb2dLZXlzKGxvZylcbiAgICB9O1xuICB9XG5cbiAgc2V0KGdyb3VwLCBsb2dNb2RlbEtleSwgZGF0YSk7XG4gIHJldHVybiBncm91cDtcbn07XG5cbmNvbnN0IGdyb3VwTG9nU3ViVmFsdWUgPSAoZ3JvdXAsIGxvZywga2V5OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgaWQgPSBsb2dba2V5XTtcbiAgY29uc3QgZGF0YSA9IGdyb3VwTG9nKGdyb3VwW2lkXSB8fCB7fSwgbG9nKTtcbiAgZ3JvdXBbaWRdID0gZGF0YTtcblxuICBpZiAoa2V5ID09PSAndHJhbnNmb3JtYXRpb24nKSB7XG4gICAgLy8gYWRkIHZhbHVlIHRvIHRoZSBzYW1lIHRlcm0vbW9kZWwgb24gcGFyZW50IGdyb3VwXG4gICAgT2JqZWN0LmVudHJpZXMoZ3JvdXBbaWRdKS5tYXAoKFt0ZXJtLCBtb2RlbHNdKSA9PlxuICAgICAgT2JqZWN0LmtleXMobW9kZWxzKS5tYXAobW9kZWwgPT4ge1xuICAgICAgICBpZiAoZ3JvdXA/Llt0ZXJtXT8uW21vZGVsXSkge1xuICAgICAgICAgIGdyb3VwW3Rlcm1dW21vZGVsXVtrZXldID0gdW5pcXVlKFtcbiAgICAgICAgICAgIC4uLihncm91cFt0ZXJtXVttb2RlbF1ba2V5XSB8fCBbXSksXG4gICAgICAgICAgICBpZFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZ3JvdXA7XG59O1xuXG5jb25zdCBzdWJWYWx1ZUtleXMgPSBbXG4gICd0cmFuc2Zvcm1hdGlvbidcbl07XG5cbmV4cG9ydCBjb25zdCBncm91cExvZ3NCeU1vZGVsID0gKGRhdGE6IHN0cmluZyk6IElOb2RlTG9ncyA9PlxuICBkYXRhLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAocGFyc2VNZXNzYWdlKVxuICAgIC5maWx0ZXIodiA9PiAhIXY/LnRlcm0gJiYgdj8udGVybSAhPT0gJ05vbmUnICYmICEhdj8ubW9kZWwpXG4gICAgLnJlZHVjZSgoZ3JvdXAsIGxvZykgPT4ge1xuICAgICAgY29uc3Qgc3ViVmFsdWUgPSBzdWJWYWx1ZUtleXMuZmluZCh2ID0+ICEhbG9nW3ZdKTtcbiAgICAgIHJldHVybiBzdWJWYWx1ZSA/XG4gICAgICAgIHN1YlZhbHVlID09PSAndHJhbnNmb3JtYXRpb24nID9cbiAgICAgICAgICAvLyBmb3IgdHJhbnNmb3JtYXRpb24sIGRvIG5vdCBhZGQgdG8gdG9wLWxldmVsIG1vZGVsXG4gICAgICAgICAgZ3JvdXBMb2dTdWJWYWx1ZShncm91cCwgbG9nLCBzdWJWYWx1ZSkgOlxuICAgICAgICAgIGdyb3VwTG9nKGdyb3VwTG9nU3ViVmFsdWUoZ3JvdXAsIGxvZywgc3ViVmFsdWUpLCBsb2cpXG4gICAgICAgIDogZ3JvdXBMb2coZ3JvdXAsIGxvZyk7XG4gICAgfSk7XG5cbmV4cG9ydCBjb25zdCBjb21wdXRlVGVybXMgPSAoXG4gIG9yaWdpbmFsVmFsdWVzOiBibGFua05vZGVbXSwgcmVjYWxjdWxhdGVkVmFsdWVzOiBibGFua05vZGVbXSwgdGVybXM/OiBJVGVybUpTT05MRFtdLCBmaWx0ZXJUZXJtVHlwZXM/OiBUZXJtVGVybVR5cGVbXVxuKSA9PiBmcm9tKFxuICAgIHRlcm1zPy5sZW5ndGggP1xuICAgICAgdGVybXMgOlxuICAgICAgW1xuICAgICAgICAuLi4ob3JpZ2luYWxWYWx1ZXMgfHwgW10pLm1hcCgoeyB0ZXJtIH0pID0+IHRlcm0pLFxuICAgICAgICAuLi4ocmVjYWxjdWxhdGVkVmFsdWVzIHx8IFtdKS5tYXAoKHsgdGVybSB9KSA9PiB0ZXJtKVxuICAgICAgXS5maWx0ZXIobm9kZSA9PiAhZmlsdGVyVGVybVR5cGVzPy5sZW5ndGggfHwgZmlsdGVyVGVybVR5cGVzLmluY2x1ZGVzKG5vZGUudGVybVR5cGUpKVxuICApLnBpcGUoXG4gICAgZGlzdGluY3QodiA9PiB2IVsnQGlkJ10pLFxuICAgIHRvQXJyYXkoKSxcbiAgICBtYXAodiA9PiBvcmRlckJ5KHYsIFsnbmFtZSddLCBbJ2FzYyddKSlcbiAgKS50b1Byb21pc2UoKTtcblxuZXhwb3J0IHR5cGUgYmxhbmtOb2RlID0gRW1pc3Npb24gfCBQcm9kdWN0IHwgSGVzdGlhSW5wdXQgfCBQcm9wZXJ0eTtcblxuZXhwb3J0IGVudW0gTG9nU3RhdHVzIHtcbiAgc3VjY2VzcyA9ICdzdWNjZXNzZnVsJyxcbiAgZXJyb3IgPSAnZmFpbGVkJyxcbiAgc2tpcEhpZXJhcmNoeSA9ICdub3QgcnVuIChtb2RlbCBoaWdoZXIgdXAgaGllcmFyY2h5IHJ1biBpbnN0ZWFkKScsXG4gIGRhdGFQcm92aWRlZCA9ICdub3QgcnVuICh1c2VyIHByb3ZpZGVkIGRhdGEgcmV0YWluZWQpJyxcbiAgbm90UmVxdWlyZWQgPSAnbm90IHJlbGV2YW50J1xufVxuXG5jb25zdCBoYXNMb2dEZXRhaWxzID0gKGRhdGE6IElCbGFua05vZGVMb2dTdWJWYWx1ZSB8IElCbGFua05vZGVMb2csIGxvZ3M/OiBJTm9kZVRlcm1Mb2cpID0+XG4gIFtcbiAgICBMb2dTdGF0dXMuc3VjY2VzcyxcbiAgICBMb2dTdGF0dXMuZXJyb3JcbiAgXS5pbmNsdWRlcyhsb2dTdGF0dXMoZGF0YSwgbG9ncykpICYmIChcbiAgICBsb2dzPy5yZXF1aXJlbWVudHMgfHwgbG9ncz8ubG9ncyB8fCBsb2dzPy5taXNzaW5nTG9va3Vwcz8ubGVuZ3RoXG4gICk7XG5cbmNvbnN0IGxvZ1N0YXR1cyA9IChkYXRhOiBJQmxhbmtOb2RlTG9nU3ViVmFsdWUgfCBJQmxhbmtOb2RlTG9nLCBsb2dzPzogSU5vZGVUZXJtTG9nKSA9PlxuICBoYXNMb2cobG9ncylcbiAgICA/IChcbiAgICAgICFkYXRhLmlzUmVxdWlyZWRcbiAgICAgICAgPyBMb2dTdGF0dXMubm90UmVxdWlyZWRcbiAgICAgICAgOiBpc1J1bk9yY2hlc3RyYXRvcihsb2dzKVxuICAgICAgICAgID8gKFxuICAgICAgICAgICAgJ3Nob3VsZFJ1bicgaW4gbG9nc1xuICAgICAgICAgICAgICA/IGxvZ3Muc2hvdWxkUnVuXG4gICAgICAgICAgICAgICAgPyBkYXRhLmlzUmVjYWxjdWxhdGVkXG4gICAgICAgICAgICAgICAgICA/IExvZ1N0YXR1cy5zdWNjZXNzXG4gICAgICAgICAgICAgICAgICA6IExvZ1N0YXR1cy5kYXRhUHJvdmlkZWRcbiAgICAgICAgICAgICAgICA6IExvZ1N0YXR1cy5lcnJvclxuICAgICAgICAgICAgICA6IExvZ1N0YXR1cy5kYXRhUHJvdmlkZWRcbiAgICAgICAgICApXG4gICAgICAgICAgOiBkYXRhLmlzUmVjYWxjdWxhdGVkXG4gICAgICAgICAgICA/IExvZ1N0YXR1cy5za2lwSGllcmFyY2h5XG4gICAgICAgICAgICA6IExvZ1N0YXR1cy5kYXRhUHJvdmlkZWRcbiAgICApXG4gICAgOiAoXG4gICAgICBbXG4gICAgICAgIHR5cGVvZiBkYXRhLm9yaWdpbmFsVmFsdWUgPT09ICd1bmRlZmluZWQnLCAvLyBubyBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICBkYXRhLmlzUmVjYWxjdWxhdGVkIC8vIGlzIHJlY2FsY3VsYXRlZFxuICAgICAgXS5ldmVyeShCb29sZWFuKVxuICAgICAgICA/IExvZ1N0YXR1cy5za2lwSGllcmFyY2h5XG4gICAgICAgIDogTG9nU3RhdHVzLmRhdGFQcm92aWRlZFxuICAgICk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbmZpZ01vZGVsIHtcbiAgbWV0aG9kSWQ6IHN0cmluZztcbiAgbG9ncz86IElOb2RlVGVybUxvZztcbiAgaGFzTG9ncz86IGJvb2xlYW47XG4gIHN0YXR1cz86IExvZ1N0YXR1cztcbiAgbW9kZWw/OiBJTW9kZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJsYW5rTm9kZUxvZ1N1YlZhbHVlIHtcbiAga2V5OiBzdHJpbmc7XG4gIG9yaWdpbmFsVmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW47XG4gIHJlY2FsY3VsYXRlZFZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuO1xuICBpc1JlY2FsY3VsYXRlZDogYm9vbGVhbjtcbiAgaXNSZXF1aXJlZD86IGJvb2xlYW47XG4gIGlkPzogYW55O1xuICBjb25maWdNb2RlbHM/OiBJQ29uZmlnTW9kZWxbXTtcbiAgbG9ncz86IElOb2RlVGVybUxvZ3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJsYW5rTm9kZUxvZyB7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgY2FuT3BlbjogYm9vbGVhbjtcbiAgdGVybTogSVRlcm1KU09OTEQ7XG4gIHRlcm1JZDogc3RyaW5nO1xuICB0eXBlPzogU2NoZW1hVHlwZTtcbiAgY29uZmlnTW9kZWxzOiAoSUNvbmZpZ01vZGVsIHwgSUNvbmZpZ01vZGVsW10pW107XG4gIG9yaWdpbmFsOiBibGFua05vZGVbXTtcbiAgb3JpZ2luYWxWYWx1ZTogbnVtYmVyO1xuICAvLyB3aGVuIG11bHRpcGxlIG1vZGVscyBhcmUgcnVubmluZyBpbiBwYXJhbGxlbFxuICBvcmlnaW5hbFZhbHVlQnlNZXRob2RJZD86IHtcbiAgICBbbWV0aG9kSWQ6IHN0cmluZ106IG51bWJlcjtcbiAgfTtcbiAgcmVjYWxjdWxhdGVkOiBibGFua05vZGVbXTtcbiAgcmVjYWxjdWxhdGVkVmFsdWU6IG51bWJlcjtcbiAgLy8gd2hlbiBtdWx0aXBsZSBtb2RlbHMgYXJlIHJ1bm5pbmcgaW4gcGFyYWxsZWxcbiAgcmVjYWxjdWxhdGVkVmFsdWVCeU1ldGhvZElkPzoge1xuICAgIFttZXRob2RJZDogc3RyaW5nXTogbnVtYmVyO1xuICB9O1xuICBpc09yaWdpbmFsOiBib29sZWFuO1xuICBpc1JlY2FsY3VsYXRlZDogYm9vbGVhbjtcbiAgaGFzRGF0YTogYm9vbGVhbjtcbiAgaXNSZXF1aXJlZDogYm9vbGVhbjtcbiAgbG9ncz86IElOb2RlVGVybUxvZ3M7XG4gIGtleXM6IElCbGFua05vZGVMb2dTdWJWYWx1ZVtdO1xuICBzdWJWYWx1ZXM6IElCbGFua05vZGVMb2dTdWJWYWx1ZVtdO1xuICAvLyBjb250YWlucyBtdWx0aXBsZSBtb2RlbHMgYWxsIHJ1bm5pbmcgaW4gcGFyYWxsZWxcbiAgYWxsUGFyYWxsZWw/OiBib29sZWFuO1xufVxuXG5jb25zdCByZWR1Y2VWYWx1ZXMgPSAodmFsdWVzOiBhbnlbXSwgdGVybUlkOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZXMgPSB2YWx1ZXNcbiAgICAubWFwKCh7IHZhbHVlIH0pID0+IHByb3BlcnR5VmFsdWUodmFsdWUsIHRlcm1JZCkpXG4gICAgLy8gcHJvcGVydHlWYWx1ZSBtYXkgcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkLCB0aGVyZWZvcmUgcmVtb3ZlIHRoZW0gZnJvbSB0b3RhbFxuICAgIC5maWx0ZXIodiA9PiB2ICE9PSBudWxsKTtcbiAgcmV0dXJuIHByb3BlcnR5VmFsdWVzLmxlbmd0aCA/IHByb3BlcnR5VmFsdWVzLnJlZHVjZSgocCwgdikgPT4gcCArIHYsIDApIDogdW5kZWZpbmVkO1xufTtcblxuY29uc3QgaXNSdW5PcmNoZXN0cmF0b3IgPSAobG9nOiBJTm9kZVRlcm1Mb2cpID0+ICEoJ3Nob3VsZFJ1bk9yY2hlc3RyYXRvcicgaW4gbG9nKSB8fCBsb2cuc2hvdWxkUnVuT3JjaGVzdHJhdG9yO1xuXG5jb25zdCBpc0JhY2tncm91bmQgPSAobG9nOiBJTm9kZVRlcm1Mb2cpID0+IGxvZz8ubWV0aG9kVGllciA9PT0gRW1pc3Npb25NZXRob2RUaWVyLmJhY2tncm91bmQ7XG5cbmNvbnN0IGhhc0xvZyA9IChsb2c6IElOb2RlVGVybUxvZywgd2l0aE9yY2hlc3RyYXRvciA9IHRydWUpID0+XG4gICEhbG9nICYmIChcbiAgICAnc2hvdWxkUnVuJyBpbiBsb2cgfHxcbiAgICAncnVuUmVxdWlyZWQnIGluIGxvZyB8fFxuICAgICh3aXRoT3JjaGVzdHJhdG9yICYmICdzaG91bGRSdW5PcmNoZXN0cmF0b3InIGluIGxvZylcbiAgKTtcblxuY29uc3QgaXNSZWNhbGN1bGF0ZWQgPSAodmFsdWVzOiBibGFua05vZGVbXSwga2V5ID0gJ3ZhbHVlJykgPT4gdmFsdWVzLnNvbWUodiA9PiAoW1xuICAuLi4odi5hZGRlZCB8fCBbXSksXG4gIC4uLih2LnVwZGF0ZWQgfHwgW10pXG5dKS5pbmNsdWRlcyhrZXkpKTtcblxuY29uc3QgYmxhbmtOb2RlVmFsdWVCeUtleToge1xuICBba2V5OiBzdHJpbmddOiAodmFsdWVzOiBibGFua05vZGVbXSwga2V5Pzogc3RyaW5nLCBpZD86IHN0cmluZykgPT4gbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbjtcbn0gPSB7XG4gIHByb3BlcnR5OiAodmFsdWVzOiAoRW1pc3Npb24gfCBQcm9kdWN0IHwgSGVzdGlhSW5wdXQpW10sIF9rLCBpZCkgPT4gISFpZCAmJiB2YWx1ZXM/Lmxlbmd0aFxuICAgID8gKHZhbHVlc1swXS5wcm9wZXJ0aWVzIHx8IFtdKS5maW5kKHAgPT4gcC50ZXJtWydAaWQnXSA9PT0gaWQpPy52YWx1ZSB8fCAnJ1xuICAgIDogJycsXG4gIGlucHV0OiAodmFsdWVzOiBFbWlzc2lvbltdLCBfaywgaWQpID0+ICEhaWQgJiYgdmFsdWVzPy5sZW5ndGhcbiAgICA/IHByb3BlcnR5VmFsdWUodmFsdWVzLmZpbmQoKHsgaW5wdXRzIH0pID0+IChpbnB1dHMgfHwgW10pLnNvbWUoaW5wdXQgPT4gaW5wdXRbJ0BpZCddID09PSBpZCkpPy52YWx1ZSwgaWQpXG4gICAgOiAnJyxcbiAgZGVmYXVsdDogKGJsYW5rTm9kZXMsIGtleSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYmxhbmtOb2Rlcz8ubGVuZ3RoID8gYmxhbmtOb2Rlc1swXVtrZXldIDogbnVsbDtcbiAgICByZXR1cm4gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nLCAndW5kZWZpbmVkJ10uaW5jbHVkZXModHlwZW9mIHZhbHVlKVxuICAgICAgPyBpc1VuZGVmaW5lZCh2YWx1ZSlcbiAgICAgID8gJydcbiAgICAgIDogdmFsdWVcbiAgICAgIDogbnVsbDtcbiAgfVxufTtcblxuY29uc3QgYmxhbmtOb2RlVmFsdWUgPSAoYmxhbmtOb2RlczogYmxhbmtOb2RlW10sIGtleTogc3RyaW5nLCBpZD86IHN0cmluZykgPT5cbiAgYmxhbmtOb2RlVmFsdWVCeUtleVtrZXkgaW4gYmxhbmtOb2RlVmFsdWVCeUtleSA/IGtleSA6ICdkZWZhdWx0J10oYmxhbmtOb2Rlcywga2V5LCBpZCk7XG5cbmNvbnN0IGxvZ1N1YlZhbHVlID0gKGxvZ3M6IElOb2RlVGVybUxvZ3MsIGtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpID0+XG4gIGxvZ3Nba2V5XVtwcm9wXSA/IChcbiAgICBBcnJheS5pc0FycmF5KGxvZ3Nba2V5XVtwcm9wXSkgP1xuICAgICAgKGxvZ3Nba2V5XVtwcm9wXSBhcyBzdHJpbmdbXSkubWFwKGlkID0+ICh7IGtleTogcHJvcCwgaWQgfSBhcyBJQmxhbmtOb2RlTG9nU3ViVmFsdWUpKSA6XG4gICAgICB7IGtleTogcHJvcCwgaWQ6IGxvZ3Nba2V5XVtwcm9wXSB9IGFzIElCbGFua05vZGVMb2dTdWJWYWx1ZVxuICApIDogdW5kZWZpbmVkO1xuXG5jb25zdCBsb2dQcm9wZXJ0aWVzID0gKG5vZGVzOiBibGFua05vZGVbXSwgbW9kZWxzOiBJTW9kZWxbXSkgPT5cbiAgbm9kZXMuZmxhdE1hcChub2RlID0+XG4gICAgKChub2RlIGFzIGFueSkucHJvcGVydGllcyB8fCBbXSkubWFwKCh7IHRlcm0gfSkgPT4gdGVybVsnQGlkJ10pXG4gICkubWFwKGlkID0+ICh7IGtleTogJ3Byb3BlcnR5JywgaWQsIGNvbmZpZ01vZGVsczogZmluZE1vZGVscyhtb2RlbHMsIGlkKS5tYXAoKHsgbW9kZWwgfSkgPT4gbW9kZWwpIH0pKTtcblxuY29uc3QgbG9nU3ViVmFsdWVzID0gKFxuICBhbGxMb2dzOiBJTm9kZUxvZ3MsIGxvZ3M6IElOb2RlVGVybUxvZ3MsIG9yaWdpbmFsOiBibGFua05vZGVbXSwgcmVjYWxjdWxhdGVkOiBibGFua05vZGVbXSwgbW9kZWxzOiBJTW9kZWxbXSwgeyBub2RlVHlwZSwgdHlwZSwgdGVybUlkIH1cbik6IElCbGFua05vZGVMb2dTdWJWYWx1ZVtdID0+XG4gIHVuaXF1ZShbXG4gICAgLi4uT2JqZWN0LmtleXMobG9ncykuZmxhdE1hcChrZXkgPT5cbiAgICAgIFtcbiAgICAgICAgbG9nU3ViVmFsdWUobG9ncywga2V5LCAnaW5wdXQnKSxcbiAgICAgICAgbG9nU3ViVmFsdWUobG9ncywga2V5LCAncHJvcGVydHknKVxuICAgICAgXVxuICAgICAgICAuZmxhdCgpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLm1hcCh2ID0+ICh7IC4uLnYsIGNvbmZpZ01vZGVsczogW2tleV0gfSkpXG4gICAgKSxcbiAgICAuLi5sb2dQcm9wZXJ0aWVzKG9yaWdpbmFsLCBtb2RlbHMpLFxuICAgIC4uLmxvZ1Byb3BlcnRpZXMocmVjYWxjdWxhdGVkLCBtb2RlbHMpXG4gIF0pXG4gICAgLm1hcCh2ID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSBibGFua05vZGVWYWx1ZShvcmlnaW5hbCwgdi5rZXksIHYuaWQpO1xuICAgICAgY29uc3QgcmVjYWxjdWxhdGVkVmFsdWUgPSBibGFua05vZGVWYWx1ZShyZWNhbGN1bGF0ZWQsIHYua2V5LCB2LmlkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnYsXG4gICAgICAgIGNvbmZpZ01vZGVsczogdi5jb25maWdNb2RlbHMubWFwKGNvbmZpZ01vZGVsV2l0aERvY3MobW9kZWxzLCB7IG5vZGVUeXBlLCB0eXBlLCB0ZXJtSWQgfSwgdiBhcyBhbnkpKSxcbiAgICAgICAgb3JpZ2luYWxWYWx1ZSxcbiAgICAgICAgcmVjYWxjdWxhdGVkVmFsdWUsXG4gICAgICAgIGlzUmVjYWxjdWxhdGVkOiAhaXNVbmRlZmluZWQocmVjYWxjdWxhdGVkVmFsdWUpICYmIHJlY2FsY3VsYXRlZFZhbHVlICE9PSBvcmlnaW5hbFZhbHVlLFxuICAgICAgICBpc1JlcXVpcmVkOiB0cnVlXG4gICAgICB9O1xuICAgIH0pXG4gICAgLmZpbHRlcih2ID0+IHYuY29uZmlnTW9kZWxzLmxlbmd0aCA+IDApXG4gICAgLm1hcChkYXRhV2l0aENvbmZpZ01vZGVsTG9ncyhhbGxMb2dzKSk7XG5cbi8vIGNvbnN0IGhhc0tleSA9IChibGFua05vZGVzOiBibGFua05vZGVbXSwga2V5OiBzdHJpbmcpID0+IChibGFua05vZGVzIHx8IFtdKS5zb21lKG4gPT4ga2V5IGluIG4pO1xuXG5jb25zdCBsb2dLZXlzID0gKFxuICBsb2dzOiBJTm9kZVRlcm1Mb2dzLCBvcmlnaW5hbDogYmxhbmtOb2RlW10sIHJlY2FsY3VsYXRlZDogYmxhbmtOb2RlW10sIG1vZGVsczogSU1vZGVsW10sIHsgbm9kZVR5cGUsIHR5cGUsIHRlcm1JZCB9XG4pOiBJQmxhbmtOb2RlTG9nU3ViVmFsdWVbXSA9PlxuICBPYmplY3Qua2V5cyhsb2dzKVxuICAgIC5maWx0ZXIoa2V5ID0+IGxvZ3Nba2V5XS5pc0tleSlcbiAgICAubWFwKGtleSA9PiAoe1xuICAgICAga2V5LFxuICAgICAgY29uZmlnTW9kZWxzOiAobG9nc1trZXldLm1vZGVscyB8fCBbXSlcbiAgICAgICAgLm1hcChjb25maWdNb2RlbFdpdGhEb2NzKG1vZGVscywgeyBub2RlVHlwZSwgdHlwZSwgdGVybUlkIH0sIHsga2V5IH0gYXMgYW55KSlcbiAgICAgICAgLy8gb25seSB0YWtlIHRob3NlIHdlIGZvdW5kIGEgbWF0Y2hpbmcgbW9kZWwgKGF2b2lkIG1hdGNoaW5nIGtleSBvbiB3cm9uZyBub2RlIHR5cGUpXG4gICAgICAgIC5maWx0ZXIodiA9PiAhIXYubW9kZWwpLFxuICAgICAgb3JpZ2luYWxWYWx1ZTogYmxhbmtOb2RlVmFsdWUob3JpZ2luYWwsIGtleSksXG4gICAgICByZWNhbGN1bGF0ZWRWYWx1ZTogYmxhbmtOb2RlVmFsdWUocmVjYWxjdWxhdGVkLCBrZXkpLFxuICAgICAgaXNSZWNhbGN1bGF0ZWQ6IGlzUmVjYWxjdWxhdGVkKHJlY2FsY3VsYXRlZCwga2V5KSxcbiAgICAgIGlzUmVxdWlyZWQ6IHRydWVcbiAgICB9KSlcbiAgICAuZmlsdGVyKHYgPT4gdi5jb25maWdNb2RlbHMubGVuZ3RoID4gMClcbiAgICAubWFwKGRhdGFXaXRoQ29uZmlnTW9kZWxMb2dzKGxvZ3MpKTtcblxuY29uc3QgaXNCYWNrZ3JvdW5kTm9JbnB1dCA9IChsb2dzOiBJTm9kZVRlcm1Mb2cpID0+IGxvZ3MubWV0aG9kVGllciA9PT0gRW1pc3Npb25NZXRob2RUaWVyLmJhY2tncm91bmQgJiYgIWxvZ3MuaW5wdXQ7XG5cbmNvbnN0IGlzTW9kZWxMb2cgPSAobG9nczogSU5vZGVUZXJtTG9nKSA9PlxuICBbXG4gICAgIWlzQmFja2dyb3VuZE5vSW5wdXQobG9ncyksXG4gICAgIWxvZ3MuaXNLZXksXG4gICAgIWxvZ3MuaW5wdXQsXG4gICAgIWxvZ3MucHJvcGVydHlcbiAgXS5ldmVyeShCb29sZWFuKSAmJiBbXG4gICAgJ3Nob3VsZFJ1bicgaW4gbG9ncyxcbiAgICAnc2hvdWxkUnVuT3JjaGVzdHJhdG9yJyBpbiBsb2dzLFxuICAgICdydW5SZXF1aXJlZCcgaW4gbG9nc1xuICBdLnNvbWUoQm9vbGVhbik7XG5cbmNvbnN0IG1vZGVsQ29uZmlnT3JkZXIgPSAoXG4gIG1vZGVsczogKElPcmNoZXN0cmF0b3JNb2RlbENvbmZpZyB8IElPcmNoZXN0cmF0b3JNb2RlbENvbmZpZ1tdKVtdLCB0ZXJtSWQ6IHN0cmluZywgbW9kZWxLZXk6IHN0cmluZywgbW9kZWw6IHN0cmluZ1xuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgaW5kZXhlcyA9IG1vZGVscy5tYXAoKG0sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgYXJyYXlJbmRleCA9IEFycmF5LmlzQXJyYXkobSkgPyBtb2RlbENvbmZpZ09yZGVyKG0sIHRlcm1JZCwgbW9kZWxLZXksIG1vZGVsKSA6ICcnO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KG0pXG4gICAgICA/IGFycmF5SW5kZXhcbiAgICAgICAgPyBbaW5kZXgsIGFycmF5SW5kZXhdLmpvaW4oJy4nKVxuICAgICAgICA6ICcnXG4gICAgICA6IFt0ZXJtSWQgPT09IG0udmFsdWUsIG1vZGVsS2V5ID09PSBtLmtleSwgbW9kZWwgPT09IG0ubW9kZWxdLmV2ZXJ5KEJvb2xlYW4pXG4gICAgICAgID8gYCR7aW5kZXh9YFxuICAgICAgICA6ICcnO1xuICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiBpbmRleGVzLmxlbmd0aCA/IGluZGV4ZXNbMF0gOiAnJztcbn07XG5cbmNvbnN0IGNvbmZpZ01vZGVsV2l0aERvY3MgPSAoXG4gIG1vZGVsczogSU1vZGVsW10sIHsgbm9kZVR5cGUsIHR5cGUsIHRlcm1JZCB9LCBzdWJWYWx1ZT86IElCbGFua05vZGVMb2dTdWJWYWx1ZVxuKSA9PiAobWV0aG9kSWQ6IHN0cmluZykgPT4ge1xuICBjb25zdCBub2RlID0ge1xuICAgICdAdHlwZSc6IG5vZGVUeXBlLFxuICAgIHRlcm06IHsgJ0BpZCc6IHN1YlZhbHVlPy5pZCB8fCB0ZXJtSWQgfSxcbiAgICBtZXRob2RNb2RlbDogeyAnQGlkJzogbWV0aG9kSWQgfVxuICB9IGFzIGFueTtcbiAgcmV0dXJuIHtcbiAgICBtZXRob2RJZCxcbiAgICBtb2RlbDogZmluZE1hdGNoaW5nTW9kZWwobW9kZWxzLCBtb2RlbFBhcmFtcyhub2RlKSkgfHxcbiAgICAgIGZpbmRNYXRjaGluZ01vZGVsKG1vZGVscywgbW9kZWxLZXlQYXJhbXMobm9kZSwgYCR7c3ViVmFsdWU/LmtleX0uJHttZXRob2RJZH1gKSkgfHxcbiAgICAgIC8vIGhhbmRsZSBcImlucHV0LnByaWNlXCJcbiAgICAgIGZpbmRNYXRjaGluZ01vZGVsKG1vZGVscywgbW9kZWxLZXlQYXJhbXMobm9kZSwgYCR7dHlwZS50b0xvd2VyQ2FzZSgpfS4ke3N1YlZhbHVlPy5rZXl9YCkpIHx8XG4gICAgICAvLyBoYW5kbGUgXCJpbnB1dC5oZXN0aWFBZ2dyZWdhdGVkRGF0YVwiXG4gICAgICBmaW5kTWF0Y2hpbmdNb2RlbChtb2RlbHMsIG1vZGVsS2V5UGFyYW1zKG5vZGUsIGAke3R5cGUudG9Mb3dlckNhc2UoKX0uJHttZXRob2RJZH1gKSlcbiAgfTtcbn07XG5cbmNvbnN0IGNvbmZpZ01vZGVsV2l0aExvZ3MgPSAoZGF0YTogSUJsYW5rTm9kZUxvZyB8IElCbGFua05vZGVMb2dTdWJWYWx1ZSwgbG9nczogSU5vZGVUZXJtTG9ncykgPT4gKG1vZGVsOiBJQ29uZmlnTW9kZWwpID0+ICh7XG4gIC4uLm1vZGVsLFxuICBsb2dzOiBsb2dzPy5bbW9kZWwubWV0aG9kSWRdLFxuICBzdGF0dXM6IGxvZ1N0YXR1cyhkYXRhLCBsb2dzPy5bbW9kZWwubWV0aG9kSWRdKSxcbiAgc2hvd0xvZ3M6IGhhc0xvZ0RldGFpbHMoZGF0YSwgbG9ncz8uW21vZGVsLm1ldGhvZElkXSlcbn0gYXMgSUNvbmZpZ01vZGVsKTtcblxuY29uc3QgZGF0YVdpdGhDb25maWdNb2RlbExvZ3MgPSAoXG4gIGxvZ3M6IElOb2RlTG9ncyB8IElOb2RlVGVybUxvZ3NcbikgPT4gPFQgZXh0ZW5kcyAoSUJsYW5rTm9kZUxvZyB8IElCbGFua05vZGVMb2dTdWJWYWx1ZSk+KGRhdGE6IFQpID0+IHtcbiAgY29uc3Qgc3ViTG9nS2V5ID0gKGRhdGEgYXMgSUJsYW5rTm9kZUxvZ1N1YlZhbHVlKS5pZCB8fCAoZGF0YSBhcyBJQmxhbmtOb2RlTG9nU3ViVmFsdWUpLmtleSA/XG4gICAgKGRhdGEgYXMgSUJsYW5rTm9kZUxvZ1N1YlZhbHVlKS5pZCB8fCAoZGF0YSBhcyBJQmxhbmtOb2RlTG9nU3ViVmFsdWUpLmtleSA6IG51bGw7XG4gIGNvbnN0IGxvZyA9IHN1YkxvZ0tleSA/IGxvZ3Nbc3ViTG9nS2V5XSA6IGxvZ3M7XG4gIHJldHVybiB7XG4gICAgLi4uZGF0YSxcbiAgICBjb25maWdNb2RlbHM6IGRhdGEuY29uZmlnTW9kZWxzLm1hcChtb2RlbCA9PlxuICAgICAgQXJyYXkuaXNBcnJheShtb2RlbCkgPyBtb2RlbC5tYXAoY29uZmlnTW9kZWxXaXRoTG9ncyhkYXRhLCBsb2cpKSA6IGNvbmZpZ01vZGVsV2l0aExvZ3MoZGF0YSwgbG9nKShtb2RlbClcbiAgICApXG4gIH0gYXMgVDtcbn07XG5cbi8qKlxuICogR3JvdXAgbW9kZWxzIHJ1bm5pbmcgaW4gcGFyYWxsZWwgdW5kZXIgdGhlIHNhbWUgYXJyYXksIGFzIHRoZXkgc2hvdWxkIGFwcGVhciB2ZXJ0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0gbW9kZWxzIFRoZSBsaXN0IG9mIG1vZGVsc1xuICovXG5jb25zdCBncm91cFBhcmFsbGVsTW9kZWxzID0gKGNvbmZpZzogSU9yY2hlc3RyYXRvckNvbmZpZywgdGVybUlkOiBzdHJpbmcsIG1vZGVsS2V5OiBzdHJpbmcsIG1vZGVsczogSUNvbmZpZ01vZGVsW10pID0+IHtcbiAgY29uc3QgbW9kZWxzV2l0aE9yZGVyID0gbW9kZWxzLm1hcChtb2RlbCA9PiAoe1xuICAgIG1vZGVsLFxuICAgIG9yZGVyOiBtb2RlbENvbmZpZ09yZGVyKGNvbmZpZy5tb2RlbHMsIHRlcm1JZCwgbW9kZWxLZXksIG1vZGVsLm1ldGhvZElkKVxuICB9KSk7XG4gIHJldHVybiBtb2RlbHNXaXRoT3JkZXJcbiAgICAucmVkdWNlKChwcmV2LCB7IG1vZGVsLCBvcmRlciB9KSA9PiB7XG4gICAgICBjb25zdCBpc0FycmF5ID0gb3JkZXIuaW5jbHVkZXMoJy4nKTtcbiAgICAgIGNvbnN0IGFycmF5SW5kZXggPSBpc0FycmF5ID8gb3JkZXIuc3BsaXQoJy4nKVswXSA6IHByZXYubGVuZ3RoO1xuICAgICAgcHJldlthcnJheUluZGV4XSA9IGlzQXJyYXkgPyBbLi4uKHByZXZbYXJyYXlJbmRleF0gfHwgW10pLCBtb2RlbF0gOiBtb2RlbDtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIFtdIGFzIElDb25maWdNb2RlbFtdW10pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5tYXAodiA9PiB2Lmxlbmd0aCA9PT0gMSA/IHZbMF0gOiB2KTtcbn07XG5cbmNvbnN0IGFsbFBhcmFsbGVsID0gKG1vZGVsczogKElDb25maWdNb2RlbCB8IElDb25maWdNb2RlbFtdKVtdKSA9PlxuICBtb2RlbHMubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkobW9kZWxzWzBdKSAmJiBtb2RlbHNbMF0ubGVuZ3RoID4gMTtcblxuY29uc3QgdmFsdWVCeU1ldGhvZElkID0gKHZhbHVlczogYmxhbmtOb2RlW10sIG1ldGhvZElkOiBzdHJpbmcsIHRlcm1JZDogc3RyaW5nKSA9PlxuICBwcm9wZXJ0eVZhbHVlKHZhbHVlcy5maW5kKHYgPT4gdi5tZXRob2RNb2RlbD8uWydAaWQnXSA9PT0gbWV0aG9kSWQpPy52YWx1ZSBhcyBudW1iZXJbXSwgdGVybUlkKTtcblxuY29uc3QgZ3JvdXBQYXJhbGxlbFZhbHVlcyA9ICh2YWx1ZXM6IGJsYW5rTm9kZVtdLCBtb2RlbHM6IElDb25maWdNb2RlbCB8IElDb25maWdNb2RlbFtdLCB0ZXJtSWQ6IHN0cmluZykgPT5cbiAgQXJyYXkuaXNBcnJheShtb2RlbHMpXG4gICAgPyBPYmplY3QuZnJvbUVudHJpZXMobW9kZWxzLm1hcChtb2RlbCA9PiBbbW9kZWwubWV0aG9kSWQsIHZhbHVlQnlNZXRob2RJZCh2YWx1ZXMsIG1vZGVsLm1ldGhvZElkLCB0ZXJtSWQpXSkpXG4gICAgOiB7fTtcblxuZXhwb3J0IGNvbnN0IGdyb3VwTG9nc0J5VGVybSA9IChcbiAgbm9kZVR5cGU6IE5vZGVUeXBlLCBsb2dzOiBJTm9kZUxvZ3MsIG1vZGVsczogSU1vZGVsW10sIGNvbmZpZzogSU9yY2hlc3RyYXRvckNvbmZpZyxcbiAgYWxsT3JpZ2luYWxWYWx1ZXM6IGJsYW5rTm9kZVtdLCBhbGxSZWNhbGN1bGF0ZWRWYWx1ZXM6IGJsYW5rTm9kZVtdLFxuICBub2RlS2V5Pzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxWYWx1ZXMgPSAoYWxsT3JpZ2luYWxWYWx1ZXMgfHwgW10pLmZpbHRlcih2YWx1ZSA9PiAhKHZhbHVlIGFzIGFueSkuZGVsZXRlZCk7XG4gIGNvbnN0IHJlY2FsY3VsYXRlZFZhbHVlcyA9IChhbGxSZWNhbGN1bGF0ZWRWYWx1ZXMgfHwgW10pLmZpbHRlcih2YWx1ZSA9PiAhKHZhbHVlIGFzIGFueSkuZGVsZXRlZCk7XG4gIGNvbnN0IHR5cGU6IFNjaGVtYVR5cGUgPSBvcmlnaW5hbFZhbHVlcy5sZW5ndGggP1xuICAgIG9yaWdpbmFsVmFsdWVzWzBdWydAdHlwZSddIHx8IG9yaWdpbmFsVmFsdWVzWzBdLnR5cGUgOlxuICAgIHJlY2FsY3VsYXRlZFZhbHVlcy5sZW5ndGggP1xuICAgICAgcmVjYWxjdWxhdGVkVmFsdWVzWzBdWydAdHlwZSddIHx8IHJlY2FsY3VsYXRlZFZhbHVlc1swXS50eXBlIDpcbiAgICAgIHVuZGVmaW5lZDtcblxuICByZXR1cm4gKHRlcm06IElUZXJtSlNPTkxEKTogSUJsYW5rTm9kZUxvZyA9PiB7XG4gICAgY29uc3QgdGVybUlkID0gdGVybVsnQGlkJ107XG4gICAgY29uc3QgdGVybUxvZ3MgPSBnZXQobG9ncywgdGVybUlkLCB7fSkgYXMgSU5vZGVUZXJtTG9ncztcbiAgICBjb25zdCBvcmlnaW5hbCA9IG9yaWdpbmFsVmFsdWVzLmZpbHRlcih2ID0+IHRlcm1JZCA9PT0gdi50ZXJtIVsnQGlkJ10pO1xuICAgIGNvbnN0IHJlY2FsY3VsYXRlZCA9IHJlY2FsY3VsYXRlZFZhbHVlcy5maWx0ZXIodiA9PiB0ZXJtSWQgPT09IHYudGVybSFbJ0BpZCddKTtcbiAgICBjb25zdCBoYXNEYXRhID0gISFvcmlnaW5hbC5sZW5ndGggfHwgISFyZWNhbGN1bGF0ZWQubGVuZ3RoIHx8IE9iamVjdC5rZXlzKHRlcm1Mb2dzKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGNvbmZpZ01vZGVsc0RhdGEgPSB7IG5vZGVUeXBlLCB0eXBlLCB0ZXJtSWQgfTtcbiAgICBjb25zdCBjb25maWdNb2RlbHMgPSBncm91cFBhcmFsbGVsTW9kZWxzKFxuICAgICAgY29uZmlnLCB0ZXJtSWQsIG5vZGVLZXkhLFxuICAgICAgdW5pcXVlKFtcbiAgICAgICAgLi4uKHRlcm1Mb2dzLm1vZGVscyB8fCBbXSkuZmlsdGVyKGtleSA9PiBpc01vZGVsTG9nKHRlcm1Mb2dzW2tleV0pKSxcbiAgICAgICAgLi4uZmluZENvbmZpZ01vZGVscyhjb25maWcsIHRlcm1JZCwgbm9kZUtleSEsIG1vZGVscykubWFwKCh7IG1vZGVsIH0pID0+IG1vZGVsIGFzIHN0cmluZylcbiAgICAgIF0pLm1hcChjb25maWdNb2RlbFdpdGhEb2NzKG1vZGVscywgY29uZmlnTW9kZWxzRGF0YSkpXG4gICAgKTtcbiAgICBjb25zdCBrZXlzID0gbG9nS2V5cyh0ZXJtTG9ncywgb3JpZ2luYWwsIHJlY2FsY3VsYXRlZCwgbW9kZWxzLCBjb25maWdNb2RlbHNEYXRhKTtcbiAgICBjb25zdCBzdWJWYWx1ZXMgPSBsb2dTdWJWYWx1ZXMobG9ncywgdGVybUxvZ3MsIG9yaWdpbmFsLCByZWNhbGN1bGF0ZWQsIG1vZGVscywgY29uZmlnTW9kZWxzRGF0YSk7XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICFPYmplY3QudmFsdWVzKHRlcm1Mb2dzKVxuICAgICAgLmZpbHRlcih2ID0+IHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2KSlcbiAgICAgIC8vIGlnbm9yZSBtb2RlbHMgdGhhdCB3ZXJlIG5ldmVyIGdvaW5nIHRvIHJ1blxuICAgICAgLmZpbHRlcihpc1J1bk9yY2hlc3RyYXRvcilcbiAgICAgIC5ldmVyeSh2ID0+IHYucnVuUmVxdWlyZWQgPT09IGZhbHNlKTtcblxuICAgIHJldHVybiBkYXRhV2l0aENvbmZpZ01vZGVsTG9ncyh0ZXJtTG9ncykoe1xuICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgY2FuT3Blbjoga2V5cy5sZW5ndGggPiAwIHx8IHN1YlZhbHVlcy5sZW5ndGggPiAwLFxuICAgICAgdGVybUlkLFxuICAgICAgdGVybSxcbiAgICAgIHR5cGUsXG4gICAgICBjb25maWdNb2RlbHMsXG4gICAgICBvcmlnaW5hbCxcbiAgICAgIG9yaWdpbmFsVmFsdWU6IHJlZHVjZVZhbHVlcyhvcmlnaW5hbCwgdGVybUlkKSxcbiAgICAgIHJlY2FsY3VsYXRlZCxcbiAgICAgIHJlY2FsY3VsYXRlZFZhbHVlOiByZWR1Y2VWYWx1ZXMocmVjYWxjdWxhdGVkLCB0ZXJtSWQpLFxuICAgICAgaXNPcmlnaW5hbDogISFvcmlnaW5hbC5sZW5ndGgsXG4gICAgICBpc1JlY2FsY3VsYXRlZDogaXNSZWNhbGN1bGF0ZWQocmVjYWxjdWxhdGVkKSxcbiAgICAgIGhhc0RhdGEsXG4gICAgICBpc1JlcXVpcmVkLFxuICAgICAgbG9nczogdGVybUxvZ3MsXG4gICAgICBrZXlzLFxuICAgICAgc3ViVmFsdWVzLFxuICAgICAgYWxsUGFyYWxsZWw6IGFsbFBhcmFsbGVsKGNvbmZpZ01vZGVscyksXG4gICAgICBvcmlnaW5hbFZhbHVlQnlNZXRob2RJZDogZ3JvdXBQYXJhbGxlbFZhbHVlcyhvcmlnaW5hbCwgY29uZmlnTW9kZWxzWzBdLCB0ZXJtSWQpLFxuICAgICAgcmVjYWxjdWxhdGVkVmFsdWVCeU1ldGhvZElkOiBncm91cFBhcmFsbGVsVmFsdWVzKHJlY2FsY3VsYXRlZCwgY29uZmlnTW9kZWxzWzBdLCB0ZXJtSWQpXG4gICAgfSk7XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbW9kZWxDb3VudCA9IChibGFua05vZGVMb2dzOiBJQmxhbmtOb2RlTG9nW10pID0+IE1hdGgubWF4LmFwcGx5KE1hdGgubWF4LCBbXG4gIDAsXG4gIC4uLmJsYW5rTm9kZUxvZ3MuZmxhdE1hcCh2ID0+IFtcbiAgICB2LmNvbmZpZ01vZGVscy5sZW5ndGgsXG4gICAgLi4udi5zdWJWYWx1ZXMubWFwKHMgPT4gcy5jb25maWdNb2RlbHM/Lmxlbmd0aCA/PyAwKSxcbiAgICB2LmtleXMubGVuZ3RoID8gMSA6IDBcbiAgXSlcbl0pO1xuIl19
|