occam-languages 0.0.128 → 0.0.129
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/lib/utilities/verification.js +111 -78
- package/package.json +2 -1
- package/src/utilities/verification.js +168 -99
|
@@ -9,83 +9,135 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
get
|
|
13
|
-
return
|
|
12
|
+
get createReleaseContexts () {
|
|
13
|
+
return createReleaseContexts;
|
|
14
14
|
},
|
|
15
15
|
get default () {
|
|
16
16
|
return _default;
|
|
17
17
|
},
|
|
18
|
-
get
|
|
19
|
-
return
|
|
18
|
+
get initialiseReleaseContexts () {
|
|
19
|
+
return initialiseReleaseContexts;
|
|
20
20
|
},
|
|
21
|
-
get
|
|
22
|
-
return
|
|
21
|
+
get verifyReleaseContexts () {
|
|
22
|
+
return verifyReleaseContexts;
|
|
23
23
|
}
|
|
24
24
|
});
|
|
25
|
+
const _occamdirectedgraphs = require("occam-directed-graphs");
|
|
25
26
|
const _necessary = require("necessary");
|
|
27
|
+
const _constants = require("../constants");
|
|
26
28
|
const _dependency = require("../utilities/dependency");
|
|
27
|
-
const { last } = _necessary.arrayUtilities;
|
|
28
|
-
function
|
|
29
|
-
|
|
29
|
+
const { first, last } = _necessary.arrayUtilities;
|
|
30
|
+
async function createReleaseContexts(dependency, context) {
|
|
31
|
+
let releaseContextsCreated = false;
|
|
32
|
+
const dependentNames = [], releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
|
|
33
|
+
if (releaseContextCreated) {
|
|
34
|
+
releaseContextsCreated = true;
|
|
35
|
+
}
|
|
36
|
+
return releaseContextsCreated;
|
|
37
|
+
}
|
|
38
|
+
function initialiseReleaseContexts(dependency, context) {
|
|
39
|
+
let releaseContextsInitialised = false;
|
|
40
|
+
const directedGraph = _occamdirectedgraphs.DirectedGraph.fromNothing(), visitedDependencyNames = [];
|
|
41
|
+
addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context);
|
|
42
|
+
const cyclicDependenciesPresent = checkCyclicDependenciesPresent(directedGraph, context);
|
|
43
|
+
if (!cyclicDependenciesPresent) {
|
|
44
|
+
const { releaseContextMap } = context, releaseNames = Object.keys(releaseContextMap), orderedVertexNames = directedGraph.getOrderedVertexNames(), orderedDependencyNames = orderedVertexNames; ///
|
|
45
|
+
releaseNames.forEach((releaseName)=>{
|
|
46
|
+
const releaseContext = releaseContextMap[releaseName];
|
|
47
|
+
initialiseReleaseContext(releaseContext, orderedDependencyNames, context);
|
|
48
|
+
});
|
|
49
|
+
releaseContextsInitialised = true;
|
|
50
|
+
}
|
|
51
|
+
return releaseContextsInitialised;
|
|
52
|
+
}
|
|
53
|
+
async function verifyReleaseContexts(dependency, context) {
|
|
54
|
+
let releaseContextsVerify = false;
|
|
55
|
+
const dependencyName = dependency.getName(), releaseName = dependencyName, dependentName = null, dependentReleased = false, releaseContextVerifies = await verifyReleaseContext(releaseName, dependentName, dependentReleased, context);
|
|
56
|
+
if (releaseContextVerifies) {
|
|
57
|
+
releaseContextsVerify = true;
|
|
58
|
+
}
|
|
59
|
+
return releaseContextsVerify;
|
|
60
|
+
}
|
|
61
|
+
const _default = {
|
|
62
|
+
createReleaseContexts,
|
|
63
|
+
initialiseReleaseContexts,
|
|
64
|
+
verifyReleaseContexts
|
|
65
|
+
};
|
|
66
|
+
function addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context) {
|
|
67
|
+
const dependencyName = dependency.getName(), visitedDependencyNameIncludesDependencyName = visitedDependencyNames.includes(dependencyName);
|
|
68
|
+
if (visitedDependencyNameIncludesDependencyName) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const visiteddependencyName = dependencyName; ///
|
|
72
|
+
visitedDependencyNames.push(visiteddependencyName);
|
|
73
|
+
const { log, releaseContextMap } = context, releaseName = dependencyName, releaseContext = releaseContextMap[releaseName] || null;
|
|
30
74
|
if (releaseContext === null) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (!releaseContextInitialised) {
|
|
35
|
-
initialiseDependencyReleaseContexts(dependency, releaseContext, context);
|
|
36
|
-
const releaseContexts = retrieveReleaseContexts(releaseContext, releaseContextMap);
|
|
37
|
-
log.info(`Initialising the '${dependencyName}' context...`);
|
|
38
|
-
const { FileContextFromFilePath } = context;
|
|
39
|
-
releaseContext.initialise(releaseContexts, FileContextFromFilePath);
|
|
40
|
-
log.debug(`...initialised the '${dependencyName}' context.`);
|
|
41
|
-
}
|
|
75
|
+
const dependencyString = dependency.getString();
|
|
76
|
+
log.warning(`No package context has been created for the '${dependencyString}' dependency. `);
|
|
77
|
+
return;
|
|
42
78
|
}
|
|
79
|
+
const dependencies = releaseContext.getDependencies(), targetVertexName = dependencyName; ///
|
|
80
|
+
dependencies.forEachDependency((dependency)=>{
|
|
81
|
+
const dependencyName = dependency.getName(), sourceVertexName = dependencyName; ///
|
|
82
|
+
directedGraph.addEdgeBySourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
|
|
83
|
+
addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function initialiseReleaseContext(releaseContext, orderedDependencyNames, context) {
|
|
87
|
+
const { log, releaseContextMap, FileContextFromFilePath } = context, releaseContexts = retrieveReleaseContexts(releaseContext, releaseContextMap), releaseContextName = releaseContext.getName();
|
|
88
|
+
releaseContexts.sort((releaseContextA, releaseContextB)=>{
|
|
89
|
+
const releaseContextAName = releaseContextA.getName(), releaseContextBName = releaseContextB.getName(), dependencyNameA = releaseContextAName, dependencyNameB = releaseContextBName, indexA = orderedDependencyNames.indexOf(dependencyNameA), indexB = orderedDependencyNames.indexOf(dependencyNameB);
|
|
90
|
+
return indexA - indexB;
|
|
91
|
+
});
|
|
92
|
+
log.info(`Initialising the '${releaseContextName}' package context...`);
|
|
93
|
+
releaseContext.initialise(releaseContexts, FileContextFromFilePath);
|
|
94
|
+
log.debug(`...initialised the '${releaseContextName}' package context.`);
|
|
43
95
|
}
|
|
44
96
|
async function createReleaseContext(dependency, dependentNames, context) {
|
|
45
97
|
let releaseContextCreated = false;
|
|
46
|
-
const { log, releaseContextMap } = context, dependencyName = dependency.getName(), releaseName = dependencyName, releaseContext = releaseContextMap[releaseName] || null;
|
|
98
|
+
const { log, releaseContextMap, releaseContextFromDependency } = context, dependencyName = dependency.getName(), releaseName = dependencyName, releaseContext = releaseContextMap[releaseName] || null;
|
|
47
99
|
if (releaseContext !== null) {
|
|
48
100
|
const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
|
|
49
101
|
if (releaseMatchesDependency) {
|
|
50
|
-
log.debug(`The '${releaseName}' context has already been created.`);
|
|
102
|
+
log.debug(`The '${releaseName}' package context has already been created.`);
|
|
51
103
|
releaseContextCreated = true;
|
|
52
104
|
}
|
|
53
105
|
} else {
|
|
54
106
|
const dependencyString = dependency.asString(), dependentNamesLength = dependentNames.length;
|
|
55
107
|
if (dependentNamesLength === 0) {
|
|
56
|
-
log.info(`Creating the '${releaseName}' context...`);
|
|
108
|
+
log.info(`Creating the '${releaseName}' package context...`);
|
|
57
109
|
} else {
|
|
58
110
|
const lastDependentName = last(dependentNames), dependentName = lastDependentName; ///
|
|
59
|
-
log.info(`Creating the '${releaseName}' context given the '${dependentName}' dependant's '${dependencyString}' dependency...`);
|
|
111
|
+
log.info(`Creating the '${releaseName}' package context given the '${dependentName}' dependant's '${dependencyString}' dependency...`);
|
|
60
112
|
}
|
|
61
|
-
const
|
|
113
|
+
const releaseContext = await releaseContextFromDependency(dependency, context);
|
|
62
114
|
if (releaseContext !== null) {
|
|
63
115
|
const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
|
|
64
116
|
if (releaseMatchesDependency) {
|
|
65
117
|
releaseContextMap[releaseName] = releaseContext;
|
|
66
|
-
const dependencyReleaseContextsCreated = await createDependencyReleaseContexts(
|
|
118
|
+
const dependencyReleaseContextsCreated = await createDependencyReleaseContexts(releaseContext, dependency, dependentNames, context);
|
|
67
119
|
if (dependencyReleaseContextsCreated) {
|
|
68
120
|
releaseContextCreated = true;
|
|
69
121
|
}
|
|
70
122
|
}
|
|
71
123
|
} else {
|
|
72
124
|
const dependencyName = dependency.getName(), releaseName = dependencyName; ///
|
|
73
|
-
log.warning(`The '${releaseName}' context could not be created. Perhaps the 'meta.json' file is missing or invalid. Or there could be a dependency mismatch.`);
|
|
125
|
+
log.warning(`The '${releaseName}' package context could not be created. Perhaps the 'meta.json' file is missing or invalid. Or there could be a dependency mismatch.`);
|
|
74
126
|
}
|
|
75
|
-
releaseContextCreated ? log.debug(`...created the '${releaseName}' context.`) : log.warning(`...unable to create the '${releaseName}' context.`);
|
|
127
|
+
releaseContextCreated ? log.debug(`...created the '${releaseName}' package context.`) : log.warning(`...unable to create the '${releaseName}' package context.`);
|
|
76
128
|
}
|
|
77
129
|
return releaseContextCreated;
|
|
78
130
|
}
|
|
79
131
|
async function verifyReleaseContext(releaseName, dependentName, dependentReleased, releaseContextMap) {
|
|
80
132
|
let releaseContextVerifies = false;
|
|
81
|
-
const releaseContext = releaseContextMap[releaseName];
|
|
133
|
+
const releaseContext = releaseContextMap[releaseName] || null;
|
|
82
134
|
if (releaseContext !== null) {
|
|
83
135
|
const released = releaseContext.isReleased();
|
|
84
136
|
if (released) {
|
|
85
137
|
releaseContextVerifies = true;
|
|
86
138
|
} else {
|
|
87
139
|
if (dependentReleased) {
|
|
88
|
-
releaseContext.warning(`The '${releaseName}' project cannot be
|
|
140
|
+
releaseContext.warning(`The '${releaseName}' project cannot be verified because its '${dependentName}' dependent is a package.`);
|
|
89
141
|
} else {
|
|
90
142
|
const dependentName = releaseName, dependentReleased = released, dependencyReleaseContextsVerify = await verifyDependencyReleaseContexts(releaseContext, dependentName, dependentReleased, releaseContextMap);
|
|
91
143
|
if (dependencyReleaseContextsVerify) {
|
|
@@ -106,25 +158,17 @@ async function verifyReleaseContext(releaseName, dependentName, dependentRelease
|
|
|
106
158
|
}
|
|
107
159
|
return releaseContextVerifies;
|
|
108
160
|
}
|
|
109
|
-
|
|
110
|
-
createReleaseContext,
|
|
111
|
-
verifyReleaseContext,
|
|
112
|
-
initialiseReleaseContext
|
|
113
|
-
};
|
|
114
|
-
async function createDependencyReleaseContexts(dependency, releaseContext, dependentNames, context) {
|
|
161
|
+
async function createDependencyReleaseContexts(releaseContext, dependency, dependentNames, context) {
|
|
115
162
|
let dependencyReleaseContextsCreated;
|
|
116
|
-
const
|
|
163
|
+
const name = releaseContext.getName(), dependencies = releaseContext.getDependencies(), dependencyName = name; ///
|
|
117
164
|
dependentNames = [
|
|
118
165
|
...dependentNames,
|
|
119
166
|
dependencyName
|
|
120
167
|
]; ///
|
|
121
168
|
dependencyReleaseContextsCreated = await (0, _dependency.asyncEveryDependency)(dependencies, async (dependency)=>{
|
|
122
|
-
const
|
|
123
|
-
if (
|
|
124
|
-
|
|
125
|
-
if (releaseContextCreated) {
|
|
126
|
-
return true;
|
|
127
|
-
}
|
|
169
|
+
const releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
|
|
170
|
+
if (releaseContextCreated) {
|
|
171
|
+
return true;
|
|
128
172
|
}
|
|
129
173
|
});
|
|
130
174
|
return dependencyReleaseContextsCreated;
|
|
@@ -138,40 +182,22 @@ async function verifyDependencyReleaseContexts(releaseContext, dependentName, de
|
|
|
138
182
|
});
|
|
139
183
|
return dependencyReleaseContextsVerify;
|
|
140
184
|
}
|
|
141
|
-
function retrieveReleaseContexts(releaseContext, releaseContextMap) {
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
let remainingReleaseContextsLength = remainingReleaseContexts.length;
|
|
146
|
-
while(remainingReleaseContextsLength > 0){
|
|
147
|
-
const remainingReleaseContext = remainingReleaseContexts.shift(), releaseContext = remainingReleaseContext; ///
|
|
148
|
-
releaseContexts.push(releaseContext);
|
|
149
|
-
const dependencies = releaseContext.getDependencies();
|
|
150
|
-
dependencies.forEachDependency((dependency)=>{
|
|
151
|
-
const dependencyName = dependency.getName(), releaseName = dependencyName, releaseContext = releaseContextMap[releaseName], releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext), remainingReleaseContextsIncludesReleaseContext = remainingReleaseContexts.includes(releaseContext);
|
|
152
|
-
if (!releaseContextsIncludesReleaseContext && !remainingReleaseContextsIncludesReleaseContext) {
|
|
153
|
-
const remainingReleaseContext = releaseContext; ///
|
|
154
|
-
remainingReleaseContexts.push(remainingReleaseContext);
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
remainingReleaseContextsLength = remainingReleaseContexts.length;
|
|
185
|
+
function retrieveReleaseContexts(releaseContext, releaseContextMap, releaseContexts = []) {
|
|
186
|
+
const releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext);
|
|
187
|
+
if (releaseContextsIncludesReleaseContext) {
|
|
188
|
+
return;
|
|
158
189
|
}
|
|
190
|
+
releaseContexts.push(releaseContext);
|
|
191
|
+
const dependencies = releaseContext.getDependencies();
|
|
192
|
+
dependencies.forEachDependency((dependency)=>{
|
|
193
|
+
const dependencyName = dependency.getName(), releaseName = dependencyName, releaseContext = releaseContextMap[releaseName];
|
|
194
|
+
retrieveReleaseContexts(releaseContext, releaseContextMap, releaseContexts);
|
|
195
|
+
});
|
|
159
196
|
return releaseContexts;
|
|
160
197
|
}
|
|
161
|
-
function checkCyclicDependencyExists(dependency, dependentNames, context) {
|
|
162
|
-
const dependencyName = dependency.getName(), dependentNamesIncludesDependencyName = dependentNames.includes(dependencyName), cyclicDependencyExists = dependentNamesIncludesDependencyName; ///
|
|
163
|
-
if (cyclicDependencyExists) {
|
|
164
|
-
const { log } = context, firstDependentName = first(dependentNames), dependencyNames = [
|
|
165
|
-
...dependentNames,
|
|
166
|
-
firstDependentName
|
|
167
|
-
], dependencyNamesString = dependencyNames.join(`' -> '`);
|
|
168
|
-
log.warning(`There is a cyclic dependency, '${dependencyNamesString}'.`);
|
|
169
|
-
}
|
|
170
|
-
return cyclicDependencyExists;
|
|
171
|
-
}
|
|
172
198
|
function checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context) {
|
|
173
199
|
let releaseMatchesDependency = true;
|
|
174
|
-
const shortenedVersion = dependency.
|
|
200
|
+
const shortenedVersion = dependency.getShortenedVersion();
|
|
175
201
|
if (shortenedVersion !== null) {
|
|
176
202
|
const entriesMatchShortenedVersion = releaseContext.matchShortenedVersion(shortenedVersion);
|
|
177
203
|
if (!entriesMatchShortenedVersion) {
|
|
@@ -182,11 +208,18 @@ function checkReleaseMatchesDependency(releaseContext, dependency, dependentName
|
|
|
182
208
|
}
|
|
183
209
|
return releaseMatchesDependency;
|
|
184
210
|
}
|
|
185
|
-
function
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
211
|
+
function checkCyclicDependenciesPresent(directedGraph, context) {
|
|
212
|
+
let cyclicDependenciesPresent = false;
|
|
213
|
+
const firstCycle = directedGraph.getFirstCycle();
|
|
214
|
+
if (firstCycle !== null) {
|
|
215
|
+
const { log } = context, vertexNames = firstCycle.getVertexNames(), dependencyNames = vertexNames, firstDependencyName = first(dependencyNames), cyclicDependencyNames = [
|
|
216
|
+
...dependencyNames,
|
|
217
|
+
firstDependencyName
|
|
218
|
+
], cycleString = cyclicDependencyNames.join(_constants.SINGLE_SPACE);
|
|
219
|
+
log.warning(`There is at least one '${cycleString}'. cyclic dependency`);
|
|
220
|
+
cyclicDependenciesPresent = true;
|
|
221
|
+
}
|
|
222
|
+
return cyclicDependenciesPresent;
|
|
190
223
|
}
|
|
191
224
|
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvdmVyaWZpY2F0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IHsgYXN5bmNFdmVyeURlcGVuZGVuY3kgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2RlcGVuZGVuY3lcIjtcblxuY29uc3QgeyBsYXN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpc2VSZWxlYXNlQ29udGV4dChkZXBlbmRlbmN5LCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgbG9nLCByZWxlYXNlQ29udGV4dE1hcCB9ID0gY29udGV4dCxcbiAgICAgICAgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgcmVsZWFzZU5hbWUgPSBkZXBlbmRlbmN5TmFtZSwgLy8vXG4gICAgICAgIHJlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHRNYXBbcmVsZWFzZU5hbWVdIHx8IG51bGw7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0ID09PSBudWxsKSB7XG4gICAgbG9nLndhcm5pbmcoYFVuYWJsZSB0byBpbml0aWFsaXNlIHRoZSAnJHtkZXBlbmRlbmN5TmFtZX0nIGNvbnRleHQgYmVjYXVzZSBpdCBoYXMgbm90IGJlZW4gY3JlYXRlZC5gKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCByZWxlYXNlQ29udGV4dEluaXRpYWxpc2VkID0gcmVsZWFzZUNvbnRleHQuaXNJbml0aWFsaXNlZCgpO1xuXG4gICAgaWYgKCFyZWxlYXNlQ29udGV4dEluaXRpYWxpc2VkKSB7XG4gICAgICBpbml0aWFsaXNlRGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyhkZXBlbmRlbmN5LCByZWxlYXNlQ29udGV4dCwgY29udGV4dCk7XG5cbiAgICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0cyA9IHJldHJpZXZlUmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCByZWxlYXNlQ29udGV4dE1hcCk7XG5cbiAgICAgIGxvZy5pbmZvKGBJbml0aWFsaXNpbmcgdGhlICcke2RlcGVuZGVuY3lOYW1lfScgY29udGV4dC4uLmApO1xuXG4gICAgICBjb25zdCB7IEZpbGVDb250ZXh0RnJvbUZpbGVQYXRoIH0gPSBjb250ZXh0O1xuXG4gICAgICByZWxlYXNlQ29udGV4dC5pbml0aWFsaXNlKHJlbGVhc2VDb250ZXh0cywgRmlsZUNvbnRleHRGcm9tRmlsZVBhdGgpO1xuXG4gICAgICBsb2cuZGVidWcoYC4uLmluaXRpYWxpc2VkIHRoZSAnJHtkZXBlbmRlbmN5TmFtZX0nIGNvbnRleHQuYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVSZWxlYXNlQ29udGV4dChkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCkge1xuICBsZXQgcmVsZWFzZUNvbnRleHRDcmVhdGVkID0gZmFsc2U7XG5cbiAgY29uc3QgeyBsb2csIHJlbGVhc2VDb250ZXh0TWFwIH0gPSBjb250ZXh0LFxuICAgICAgICBkZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVuY3kuZ2V0TmFtZSgpLFxuICAgICAgICByZWxlYXNlTmFtZSA9IGRlcGVuZGVuY3lOYW1lLCAvLy9cbiAgICAgICAgcmVsZWFzZUNvbnRleHQgPSByZWxlYXNlQ29udGV4dE1hcFtyZWxlYXNlTmFtZV0gfHwgbnVsbDtcblxuICBpZiAocmVsZWFzZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICBjb25zdCByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kgPSBjaGVja1JlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeShyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpO1xuXG4gICAgaWYgKHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgJyR7cmVsZWFzZU5hbWV9JyBjb250ZXh0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZC5gKTtcblxuICAgICAgcmVsZWFzZUNvbnRleHRDcmVhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeVN0cmluZyA9IGRlcGVuZGVuY3kuYXNTdHJpbmcoKSxcbiAgICAgICAgICBkZXBlbmRlbnROYW1lc0xlbmd0aCA9IGRlcGVuZGVudE5hbWVzLmxlbmd0aDtcblxuICAgIGlmIChkZXBlbmRlbnROYW1lc0xlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nLmluZm8oYENyZWF0aW5nIHRoZSAnJHtyZWxlYXNlTmFtZX0nIGNvbnRleHQuLi5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGFzdERlcGVuZGVudE5hbWUgPSBsYXN0KGRlcGVuZGVudE5hbWVzKSxcbiAgICAgICAgICAgIGRlcGVuZGVudE5hbWUgPSBsYXN0RGVwZW5kZW50TmFtZTsgIC8vL1xuXG4gICAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgdGhlICcke3JlbGVhc2VOYW1lfScgY29udGV4dCBnaXZlbiB0aGUgJyR7ZGVwZW5kZW50TmFtZX0nIGRlcGVuZGFudCdzICcke2RlcGVuZGVuY3lTdHJpbmd9JyBkZXBlbmRlbmN5Li4uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyByZWxlYXNlQ29udGV4dEZyb21EZXBlbmRlbmN5IH0gPSBjb250ZXh0LFxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0ID0gYXdhaXQgcmVsZWFzZUNvbnRleHRGcm9tRGVwZW5kZW5jeShkZXBlbmRlbmN5LCBjb250ZXh0KTtcblxuICAgIGlmIChyZWxlYXNlQ29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5ID0gY2hlY2tSZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kocmVsZWFzZUNvbnRleHQsIGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSkge1xuICAgICAgICByZWxlYXNlQ29udGV4dE1hcFtyZWxlYXNlTmFtZV0gPSByZWxlYXNlQ29udGV4dDtcblxuICAgICAgICBjb25zdCBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZCA9IGF3YWl0IGNyZWF0ZURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMoZGVwZW5kZW5jeSwgcmVsZWFzZUNvbnRleHQsIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQpIHtcbiAgICAgICAgICByZWxlYXNlQ29udGV4dENyZWF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeS5nZXROYW1lKCksXG4gICAgICAgICAgICByZWxlYXNlTmFtZSA9IGRlcGVuZGVuY3lOYW1lOyAvLy9cblxuICAgICAgbG9nLndhcm5pbmcoYFRoZSAnJHtyZWxlYXNlTmFtZX0nIGNvbnRleHQgY291bGQgbm90IGJlIGNyZWF0ZWQuIFBlcmhhcHMgdGhlICdtZXRhLmpzb24nIGZpbGUgaXMgbWlzc2luZyBvciBpbnZhbGlkLiBPciB0aGVyZSBjb3VsZCBiZSBhIGRlcGVuZGVuY3kgbWlzbWF0Y2guYCk7XG4gICAgfVxuXG4gICAgcmVsZWFzZUNvbnRleHRDcmVhdGVkID9cbiAgICAgIGxvZy5kZWJ1ZyhgLi4uY3JlYXRlZCB0aGUgJyR7cmVsZWFzZU5hbWV9JyBjb250ZXh0LmApIDpcbiAgICAgICAgbG9nLndhcm5pbmcoYC4uLnVuYWJsZSB0byBjcmVhdGUgdGhlICcke3JlbGVhc2VOYW1lfScgY29udGV4dC5gKTtcbiAgfVxuXG4gIHJldHVybiByZWxlYXNlQ29udGV4dENyZWF0ZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlSZWxlYXNlQ29udGV4dChyZWxlYXNlTmFtZSwgZGVwZW5kZW50TmFtZSwgZGVwZW5kZW50UmVsZWFzZWQsIHJlbGVhc2VDb250ZXh0TWFwKSB7XG4gIGxldCByZWxlYXNlQ29udGV4dFZlcmlmaWVzID0gZmFsc2U7XG5cbiAgY29uc3QgcmVsZWFzZUNvbnRleHQgPSByZWxlYXNlQ29udGV4dE1hcFtyZWxlYXNlTmFtZV07XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgY29uc3QgcmVsZWFzZWQgPSByZWxlYXNlQ29udGV4dC5pc1JlbGVhc2VkKCk7XG5cbiAgICBpZiAocmVsZWFzZWQpIHtcbiAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGVwZW5kZW50UmVsZWFzZWQpIHtcbiAgICAgICAgcmVsZWFzZUNvbnRleHQud2FybmluZyhgVGhlICcke3JlbGVhc2VOYW1lfScgcHJvamVjdCBjYW5ub3QgYmUgdmVyaWZpZXMgYmVjYXVzZSBpdHMgJyR7ZGVwZW5kZW50TmFtZX0nIGRlcGVuZGVudCBpcyBhIHBhY2thZ2UuYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZXBlbmRlbnROYW1lID0gcmVsZWFzZU5hbWUsICAvLy9cbiAgICAgICAgICAgICAgZGVwZW5kZW50UmVsZWFzZWQgPSByZWxlYXNlZCwgLy8vXG4gICAgICAgICAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnkgPSBhd2FpdCB2ZXJpZnlEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbnROYW1lLCBkZXBlbmRlbnRSZWxlYXNlZCwgcmVsZWFzZUNvbnRleHRNYXApO1xuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5KSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZUNvbnRleHRWZXJpZmllZCA9IHJlbGVhc2VDb250ZXh0Lmhhc1ZlcmlmaWVkKCk7XG5cbiAgICAgICAgICBpZiAocmVsZWFzZUNvbnRleHRWZXJpZmllZCkge1xuICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRWZXJpZmllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0LmluZm8oYFZlcmlmeWluZyB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwcm9qZWN0Li4uYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZlcmlmaWVzID0gYXdhaXQgcmVsZWFzZUNvbnRleHQudmVyaWZ5KCk7XG5cbiAgICAgICAgICAgIGlmICh2ZXJpZmllcykge1xuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dC5pbmZvKGAuLi52ZXJpZmllZCB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwcm9qZWN0LmApO1xuXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWxlYXNlQ29udGV4dFZlcmlmaWVzO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNyZWF0ZVJlbGVhc2VDb250ZXh0LFxuICB2ZXJpZnlSZWxlYXNlQ29udGV4dCxcbiAgaW5pdGlhbGlzZVJlbGVhc2VDb250ZXh0XG59O1xuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCkge1xuICBsZXQgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQ7XG5cbiAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgZGVwZW5kZW5jaWVzID0gcmVsZWFzZUNvbnRleHQuZ2V0RGVwZW5kZW5jaWVzKCk7XG5cbiAgZGVwZW5kZW50TmFtZXMgPSBbIC4uLmRlcGVuZGVudE5hbWVzLCBkZXBlbmRlbmN5TmFtZSBdOyAgLy8vXG5cbiAgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQgPSBhd2FpdCBhc3luY0V2ZXJ5RGVwZW5kZW5jeShkZXBlbmRlbmNpZXMsIGFzeW5jIChkZXBlbmRlbmN5KSA9PiB7XG4gICAgY29uc3QgY3ljbGljRGVwZW5kZW5jeUV4aXN0cyA9IGNoZWNrQ3ljbGljRGVwZW5kZW5jeUV4aXN0cyhkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCk7XG5cbiAgICBpZiAoIWN5Y2xpY0RlcGVuZGVuY3lFeGlzdHMpIHtcbiAgICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0Q3JlYXRlZCA9IGF3YWl0IGNyZWF0ZVJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHJlbGVhc2VDb250ZXh0Q3JlYXRlZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5RGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyhyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW50TmFtZSwgZGVwZW5kZW50UmVsZWFzZWQsIHJlbGVhc2VDb250ZXh0TWFwKSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHJlbGVhc2VDb250ZXh0LmdldERlcGVuZGVuY2llcygpLFxuICAgICAgICBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5ID0gYXdhaXQgYXN5bmNFdmVyeURlcGVuZGVuY3koZGVwZW5kZW5jaWVzLCBhc3luYyAoZGVwZW5kZW5jeSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICByZWxlYXNlTmFtZSA9IG5hbWUsIC8vL1xuICAgICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSBhd2FpdCB2ZXJpZnlSZWxlYXNlQ29udGV4dChyZWxlYXNlTmFtZSwgZGVwZW5kZW50TmFtZSwgZGVwZW5kZW50UmVsZWFzZWQsIHJlbGVhc2VDb250ZXh0TWFwKTtcblxuICAgICAgICAgIGlmIChyZWxlYXNlQ29udGV4dFZlcmlmaWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gIHJldHVybiBkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5O1xufVxuXG5mdW5jdGlvbiByZXRyaWV2ZVJlbGVhc2VDb250ZXh0cyhyZWxlYXNlQ29udGV4dCwgcmVsZWFzZUNvbnRleHRNYXApIHtcbiAgY29uc3QgcmVsZWFzZUNvbnRleHRzID0gW10sXG4gICAgICAgIHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHQsICAvLy9cbiAgICAgICAgcmVtYWluaW5nUmVsZWFzZUNvbnRleHRzID0gW1xuICAgICAgICAgIHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0XG4gICAgICAgIF07XG5cbiAgbGV0IHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0c0xlbmd0aCA9IHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0cy5sZW5ndGg7XG5cbiAgd2hpbGUgKHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0c0xlbmd0aCA+IDApIHtcbiAgICBjb25zdCByZW1haW5pbmdSZWxlYXNlQ29udGV4dCA9IHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0cy5zaGlmdCgpLFxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0ID0gcmVtYWluaW5nUmVsZWFzZUNvbnRleHQ7ICAvLy9cblxuICAgIHJlbGVhc2VDb250ZXh0cy5wdXNoKHJlbGVhc2VDb250ZXh0KTtcblxuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHJlbGVhc2VDb250ZXh0LmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgZGVwZW5kZW5jaWVzLmZvckVhY2hEZXBlbmRlbmN5KChkZXBlbmRlbmN5KSA9PiB7XG4gICAgICBjb25zdCBkZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVuY3kuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgcmVsZWFzZU5hbWUgPSBkZXBlbmRlbmN5TmFtZSwgLy8vXG4gICAgICAgICAgICByZWxlYXNlQ29udGV4dCA9IHJlbGVhc2VDb250ZXh0TWFwW3JlbGVhc2VOYW1lXSxcbiAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0c0luY2x1ZGVzUmVsZWFzZUNvbnRleHQgPSByZWxlYXNlQ29udGV4dHMuaW5jbHVkZXMocmVsZWFzZUNvbnRleHQpLFxuICAgICAgICAgICAgcmVtYWluaW5nUmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCA9IHJlbWFpbmluZ1JlbGVhc2VDb250ZXh0cy5pbmNsdWRlcyhyZWxlYXNlQ29udGV4dCk7XG5cbiAgICAgIGlmICghcmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCAmJiAhcmVtYWluaW5nUmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdSZWxlYXNlQ29udGV4dCA9IHJlbGVhc2VDb250ZXh0OyAvLy9cblxuICAgICAgICByZW1haW5pbmdSZWxlYXNlQ29udGV4dHMucHVzaChyZW1haW5pbmdSZWxlYXNlQ29udGV4dCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZW1haW5pbmdSZWxlYXNlQ29udGV4dHNMZW5ndGggPSByZW1haW5pbmdSZWxlYXNlQ29udGV4dHMubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0cztcbn1cblxuZnVuY3Rpb24gY2hlY2tDeWNsaWNEZXBlbmRlbmN5RXhpc3RzKGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KSB7XG4gIGNvbnN0IGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeS5nZXROYW1lKCksXG4gICAgICAgIGRlcGVuZGVudE5hbWVzSW5jbHVkZXNEZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVudE5hbWVzLmluY2x1ZGVzKGRlcGVuZGVuY3lOYW1lKSxcbiAgICAgICAgY3ljbGljRGVwZW5kZW5jeUV4aXN0cyA9IGRlcGVuZGVudE5hbWVzSW5jbHVkZXNEZXBlbmRlbmN5TmFtZTsgIC8vL1xuXG4gIGlmIChjeWNsaWNEZXBlbmRlbmN5RXhpc3RzKSB7XG4gICAgY29uc3QgeyBsb2cgfSA9IGNvbnRleHQsXG4gICAgICAgICAgZmlyc3REZXBlbmRlbnROYW1lID0gZmlyc3QoZGVwZW5kZW50TmFtZXMpLFxuICAgICAgICAgIGRlcGVuZGVuY3lOYW1lcyA9IFsgIC8vL1xuICAgICAgICAgICAgLi4uZGVwZW5kZW50TmFtZXMsXG4gICAgICAgICAgICBmaXJzdERlcGVuZGVudE5hbWVcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRlcGVuZGVuY3lOYW1lc1N0cmluZyA9IGRlcGVuZGVuY3lOYW1lcy5qb2luKGAnIC0+ICdgKTtcblxuICAgIGxvZy53YXJuaW5nKGBUaGVyZSBpcyBhIGN5Y2xpYyBkZXBlbmRlbmN5LCAnJHtkZXBlbmRlbmN5TmFtZXNTdHJpbmd9Jy5gKTtcbiAgfVxuXG4gIHJldHVybiBjeWNsaWNEZXBlbmRlbmN5RXhpc3RzO1xufVxuXG5mdW5jdGlvbiBjaGVja1JlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeShyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpIHtcbiAgbGV0IHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSA9IHRydWU7XG5cbiAgY29uc3Qgc2hvcnRlbmVkVmVyc2lvbiA9IGRlcGVuZGVuY3kuZ2V0U2hvcnRlZFZlcnNpb24oKTtcblxuICBpZiAoc2hvcnRlbmVkVmVyc2lvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGVudHJpZXNNYXRjaFNob3J0ZW5lZFZlcnNpb24gPSByZWxlYXNlQ29udGV4dC5tYXRjaFNob3J0ZW5lZFZlcnNpb24oc2hvcnRlbmVkVmVyc2lvbik7XG5cbiAgICBpZiAoIWVudHJpZXNNYXRjaFNob3J0ZW5lZFZlcnNpb24pIHtcbiAgICAgIGNvbnN0IHsgbG9nIH0gPSBjb250ZXh0LFxuICAgICAgICAgICAgdmVyc2lvbiA9IHJlbGVhc2VDb250ZXh0LmdldFZlcnNpb24oKSxcbiAgICAgICAgICAgIGxhc3REZXBlbmRlbnROYW1lID0gbGFzdChkZXBlbmRlbnROYW1lcyksXG4gICAgICAgICAgICBkZXBlbmRlbnROYW1lID0gbGFzdERlcGVuZGVudE5hbWUsICAvLy9cbiAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZXBlbmRlbmN5U3RyaW5nID0gZGVwZW5kZW5jeS5hc1N0cmluZygpO1xuXG4gICAgICBsb2cud2FybmluZyhgVGhlICcke2RlcGVuZGVudE5hbWV9JyBkZXBlbmRlbnQgcmVxdWlyZXMgdGhlICcke2RlcGVuZGVuY3lTdHJpbmd9JyBkZXBlbmRlbmN5IGJ1dCBhIGNvbnRleHQgd2l0aCB2ZXJzaW9uICcke3ZlcnNpb25TdHJpbmd9JyB3YXMgcHJvdmlkZWQuYCk7XG5cbiAgICAgIHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpc2VEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIHJlbGVhc2VDb250ZXh0LCBjb250ZXh0KSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHJlbGVhc2VDb250ZXh0LmdldERlcGVuZGVuY2llcygpO1xuXG4gIGRlcGVuZGVuY2llcy5mb3JFYWNoRGVwZW5kZW5jeSgoZGVwZW5kZW5jeSkgPT4geyAgLy8vXG4gICAgaW5pdGlhbGlzZVJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGNvbnRleHQpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVSZWxlYXNlQ29udGV4dCIsImluaXRpYWxpc2VSZWxlYXNlQ29udGV4dCIsInZlcmlmeVJlbGVhc2VDb250ZXh0IiwibGFzdCIsImFycmF5VXRpbGl0aWVzIiwiZGVwZW5kZW5jeSIsImNvbnRleHQiLCJsb2ciLCJyZWxlYXNlQ29udGV4dE1hcCIsImRlcGVuZGVuY3lOYW1lIiwiZ2V0TmFtZSIsInJlbGVhc2VOYW1lIiwicmVsZWFzZUNvbnRleHQiLCJ3YXJuaW5nIiwicmVsZWFzZUNvbnRleHRJbml0aWFsaXNlZCIsImlzSW5pdGlhbGlzZWQiLCJpbml0aWFsaXNlRGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyIsInJlbGVhc2VDb250ZXh0cyIsInJldHJpZXZlUmVsZWFzZUNvbnRleHRzIiwiaW5mbyIsIkZpbGVDb250ZXh0RnJvbUZpbGVQYXRoIiwiaW5pdGlhbGlzZSIsImRlYnVnIiwiZGVwZW5kZW50TmFtZXMiLCJyZWxlYXNlQ29udGV4dENyZWF0ZWQiLCJyZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kiLCJjaGVja1JlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSIsImRlcGVuZGVuY3lTdHJpbmciLCJhc1N0cmluZyIsImRlcGVuZGVudE5hbWVzTGVuZ3RoIiwibGVuZ3RoIiwibGFzdERlcGVuZGVudE5hbWUiLCJkZXBlbmRlbnROYW1lIiwicmVsZWFzZUNvbnRleHRGcm9tRGVwZW5kZW5jeSIsImRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNDcmVhdGVkIiwiY3JlYXRlRGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyIsImRlcGVuZGVudFJlbGVhc2VkIiwicmVsZWFzZUNvbnRleHRWZXJpZmllcyIsInJlbGVhc2VkIiwiaXNSZWxlYXNlZCIsImRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnkiLCJ2ZXJpZnlEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzIiwicmVsZWFzZUNvbnRleHRWZXJpZmllZCIsImhhc1ZlcmlmaWVkIiwidmVyaWZpZXMiLCJ2ZXJpZnkiLCJkZXBlbmRlbmNpZXMiLCJnZXREZXBlbmRlbmNpZXMiLCJhc3luY0V2ZXJ5RGVwZW5kZW5jeSIsImN5Y2xpY0RlcGVuZGVuY3lFeGlzdHMiLCJjaGVja0N5Y2xpY0RlcGVuZGVuY3lFeGlzdHMiLCJuYW1lIiwicmVtYWluaW5nUmVsZWFzZUNvbnRleHQiLCJyZW1haW5pbmdSZWxlYXNlQ29udGV4dHMiLCJyZW1haW5pbmdSZWxlYXNlQ29udGV4dHNMZW5ndGgiLCJzaGlmdCIsInB1c2giLCJmb3JFYWNoRGVwZW5kZW5jeSIsInJlbGVhc2VDb250ZXh0c0luY2x1ZGVzUmVsZWFzZUNvbnRleHQiLCJpbmNsdWRlcyIsInJlbWFpbmluZ1JlbGVhc2VDb250ZXh0c0luY2x1ZGVzUmVsZWFzZUNvbnRleHQiLCJkZXBlbmRlbnROYW1lc0luY2x1ZGVzRGVwZW5kZW5jeU5hbWUiLCJmaXJzdERlcGVuZGVudE5hbWUiLCJmaXJzdCIsImRlcGVuZGVuY3lOYW1lcyIsImRlcGVuZGVuY3lOYW1lc1N0cmluZyIsImpvaW4iLCJzaG9ydGVuZWRWZXJzaW9uIiwiZ2V0U2hvcnRlZFZlcnNpb24iLCJlbnRyaWVzTWF0Y2hTaG9ydGVuZWRWZXJzaW9uIiwibWF0Y2hTaG9ydGVuZWRWZXJzaW9uIiwidmVyc2lvbiIsImdldFZlcnNpb24iLCJ2ZXJzaW9uU3RyaW5nIiwidG9TdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQW1Dc0JBO2VBQUFBOztRQXFHdEI7ZUFBQTs7UUFoSWdCQztlQUFBQTs7UUFzRk1DO2VBQUFBOzs7MkJBNUZTOzRCQUVNO0FBRXJDLE1BQU0sRUFBRUMsSUFBSSxFQUFFLEdBQUdDLHlCQUFjO0FBRXhCLFNBQVNILHlCQUF5QkksVUFBVSxFQUFFQyxPQUFPO0lBQzFELE1BQU0sRUFBRUMsR0FBRyxFQUFFQyxpQkFBaUIsRUFBRSxHQUFHRixTQUM3QkcsaUJBQWlCSixXQUFXSyxPQUFPLElBQ25DQyxjQUFjRixnQkFDZEcsaUJBQWlCSixpQkFBaUIsQ0FBQ0csWUFBWSxJQUFJO0lBRXpELElBQUlDLG1CQUFtQixNQUFNO1FBQzNCTCxJQUFJTSxP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
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvdmVyaWZpY2F0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBEaXJlY3RlZEdyYXBoIH0gZnJvbSBcIm9jY2FtLWRpcmVjdGVkLWdyYXBoc1wiO1xuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCB7ICBTSU5HTEVfU1BBQ0V9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGFzeW5jRXZlcnlEZXBlbmRlbmN5IH0gZnJvbSBcIi4uL3V0aWxpdGllcy9kZXBlbmRlbmN5XCI7XG5cbmNvbnN0IHsgZmlyc3QsIGxhc3QgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIGNvbnRleHQpIHtcbiAgbGV0IHJlbGVhc2VDb250ZXh0c0NyZWF0ZWQgPSBmYWxzZTtcblxuICBjb25zdCBkZXBlbmRlbnROYW1lcyA9IFtdLFxuICAgICAgICByZWxlYXNlQ29udGV4dENyZWF0ZWQgPSBhd2FpdCBjcmVhdGVSZWxlYXNlQ29udGV4dChkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCk7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0Q3JlYXRlZCkge1xuICAgIHJlbGVhc2VDb250ZXh0c0NyZWF0ZWQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0c0NyZWF0ZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXNlUmVsZWFzZUNvbnRleHRzKGRlcGVuZGVuY3ksIGNvbnRleHQpIHtcbiAgbGV0IHJlbGVhc2VDb250ZXh0c0luaXRpYWxpc2VkID0gZmFsc2U7XG5cbiAgY29uc3QgZGlyZWN0ZWRHcmFwaCA9IERpcmVjdGVkR3JhcGguZnJvbU5vdGhpbmcoKSxcbiAgICAgICAgdmlzaXRlZERlcGVuZGVuY3lOYW1lcyA9IFtdO1xuXG4gIGFkZERlcGVuZGVuY3lSZWxhdGlvbnMoZGVwZW5kZW5jeSwgZGlyZWN0ZWRHcmFwaCwgdmlzaXRlZERlcGVuZGVuY3lOYW1lcywgY29udGV4dCk7XG5cbiAgY29uc3QgY3ljbGljRGVwZW5kZW5jaWVzUHJlc2VudCA9IGNoZWNrQ3ljbGljRGVwZW5kZW5jaWVzUHJlc2VudChkaXJlY3RlZEdyYXBoLCBjb250ZXh0KTtcblxuICBpZiAoIWN5Y2xpY0RlcGVuZGVuY2llc1ByZXNlbnQpIHtcbiAgICBjb25zdCB7IHJlbGVhc2VDb250ZXh0TWFwIH0gPSBjb250ZXh0LFxuICAgICAgICAgIHJlbGVhc2VOYW1lcyA9IE9iamVjdC5rZXlzKHJlbGVhc2VDb250ZXh0TWFwKSxcbiAgICAgICAgICBvcmRlcmVkVmVydGV4TmFtZXMgPSBkaXJlY3RlZEdyYXBoLmdldE9yZGVyZWRWZXJ0ZXhOYW1lcygpLFxuICAgICAgICAgIG9yZGVyZWREZXBlbmRlbmN5TmFtZXMgPSBvcmRlcmVkVmVydGV4TmFtZXM7ICAvLy9cblxuICAgIHJlbGVhc2VOYW1lcy5mb3JFYWNoKChyZWxlYXNlTmFtZSkgPT4ge1xuICAgICAgY29uc3QgcmVsZWFzZUNvbnRleHQgPSByZWxlYXNlQ29udGV4dE1hcFtyZWxlYXNlTmFtZV07XG5cbiAgICAgIGluaXRpYWxpc2VSZWxlYXNlQ29udGV4dChyZWxlYXNlQ29udGV4dCwgb3JkZXJlZERlcGVuZGVuY3lOYW1lcywgY29udGV4dCk7XG4gICAgfSk7XG5cbiAgICByZWxlYXNlQ29udGV4dHNJbml0aWFsaXNlZCA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVsZWFzZUNvbnRleHRzSW5pdGlhbGlzZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlSZWxlYXNlQ29udGV4dHMoZGVwZW5kZW5jeSwgY29udGV4dCkge1xuICBsZXQgcmVsZWFzZUNvbnRleHRzVmVyaWZ5ID0gZmFsc2U7XG5cbiAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgcmVsZWFzZU5hbWUgPSBkZXBlbmRlbmN5TmFtZSwgLy8vXG4gICAgICAgIGRlcGVuZGVudE5hbWUgPSBudWxsLFxuICAgICAgICBkZXBlbmRlbnRSZWxlYXNlZCA9IGZhbHNlLFxuICAgICAgICByZWxlYXNlQ29udGV4dFZlcmlmaWVzID0gYXdhaXQgdmVyaWZ5UmVsZWFzZUNvbnRleHQocmVsZWFzZU5hbWUsIGRlcGVuZGVudE5hbWUsIGRlcGVuZGVudFJlbGVhc2VkLCBjb250ZXh0KTtcblxuICBpZiAocmVsZWFzZUNvbnRleHRWZXJpZmllcykge1xuICAgIHJlbGVhc2VDb250ZXh0c1ZlcmlmeSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVsZWFzZUNvbnRleHRzVmVyaWZ5O1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNyZWF0ZVJlbGVhc2VDb250ZXh0cyxcbiAgaW5pdGlhbGlzZVJlbGVhc2VDb250ZXh0cyxcbiAgdmVyaWZ5UmVsZWFzZUNvbnRleHRzXG59O1xuXG5mdW5jdGlvbiBhZGREZXBlbmRlbmN5UmVsYXRpb25zKGRlcGVuZGVuY3ksIGRpcmVjdGVkR3JhcGgsIHZpc2l0ZWREZXBlbmRlbmN5TmFtZXMsIGNvbnRleHQpIHtcbiAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgdmlzaXRlZERlcGVuZGVuY3lOYW1lSW5jbHVkZXNEZXBlbmRlbmN5TmFtZSA9IHZpc2l0ZWREZXBlbmRlbmN5TmFtZXMuaW5jbHVkZXMoZGVwZW5kZW5jeU5hbWUpO1xuXG4gIGlmICh2aXNpdGVkRGVwZW5kZW5jeU5hbWVJbmNsdWRlc0RlcGVuZGVuY3lOYW1lKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdmlzaXRlZGRlcGVuZGVuY3lOYW1lID0gZGVwZW5kZW5jeU5hbWU7IC8vL1xuXG4gIHZpc2l0ZWREZXBlbmRlbmN5TmFtZXMucHVzaCh2aXNpdGVkZGVwZW5kZW5jeU5hbWUpO1xuXG4gIGNvbnN0IHsgbG9nLCByZWxlYXNlQ29udGV4dE1hcCB9ID0gY29udGV4dCxcbiAgICAgICAgcmVsZWFzZU5hbWUgPSBkZXBlbmRlbmN5TmFtZSwgLy8vXG4gICAgICAgIHJlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHRNYXBbcmVsZWFzZU5hbWVdIHx8IG51bGw7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0ID09PSBudWxsKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeVN0cmluZyA9IGRlcGVuZGVuY3kuZ2V0U3RyaW5nKCk7XG5cbiAgICBsb2cud2FybmluZyhgTm8gcGFja2FnZSBjb250ZXh0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSAnJHtkZXBlbmRlbmN5U3RyaW5nfScgZGVwZW5kZW5jeS4gYCk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXBlbmRlbmNpZXMgPSByZWxlYXNlQ29udGV4dC5nZXREZXBlbmRlbmNpZXMoKSxcbiAgICAgICAgdGFyZ2V0VmVydGV4TmFtZSA9IGRlcGVuZGVuY3lOYW1lOyAgLy8vXG5cbiAgZGVwZW5kZW5jaWVzLmZvckVhY2hEZXBlbmRlbmN5KChkZXBlbmRlbmN5KSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgIHNvdXJjZVZlcnRleE5hbWUgPSBkZXBlbmRlbmN5TmFtZTsgIC8vL1xuXG4gICAgZGlyZWN0ZWRHcmFwaC5hZGRFZGdlQnlTb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgIGFkZERlcGVuZGVuY3lSZWxhdGlvbnMoZGVwZW5kZW5jeSwgZGlyZWN0ZWRHcmFwaCwgdmlzaXRlZERlcGVuZGVuY3lOYW1lcywgY29udGV4dCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbml0aWFsaXNlUmVsZWFzZUNvbnRleHQocmVsZWFzZUNvbnRleHQsIG9yZGVyZWREZXBlbmRlbmN5TmFtZXMsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBsb2csIHJlbGVhc2VDb250ZXh0TWFwLCBGaWxlQ29udGV4dEZyb21GaWxlUGF0aCB9ID0gY29udGV4dCxcbiAgICAgICAgcmVsZWFzZUNvbnRleHRzID0gcmV0cmlldmVSZWxlYXNlQ29udGV4dHMocmVsZWFzZUNvbnRleHQsIHJlbGVhc2VDb250ZXh0TWFwKSxcbiAgICAgICAgcmVsZWFzZUNvbnRleHROYW1lID0gcmVsZWFzZUNvbnRleHQuZ2V0TmFtZSgpO1xuXG4gIHJlbGVhc2VDb250ZXh0cy5zb3J0KChyZWxlYXNlQ29udGV4dEEsIHJlbGVhc2VDb250ZXh0QikgPT4ge1xuICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0QU5hbWUgPSByZWxlYXNlQ29udGV4dEEuZ2V0TmFtZSgpLFxuICAgICAgICAgIHJlbGVhc2VDb250ZXh0Qk5hbWUgPSByZWxlYXNlQ29udGV4dEIuZ2V0TmFtZSgpLFxuICAgICAgICAgIGRlcGVuZGVuY3lOYW1lQSA9IHJlbGVhc2VDb250ZXh0QU5hbWUsICAvLy9cbiAgICAgICAgICBkZXBlbmRlbmN5TmFtZUIgPSByZWxlYXNlQ29udGV4dEJOYW1lLCAgLy8vXG4gICAgICAgICAgaW5kZXhBID0gb3JkZXJlZERlcGVuZGVuY3lOYW1lcy5pbmRleE9mKGRlcGVuZGVuY3lOYW1lQSksXG4gICAgICAgICAgaW5kZXhCID0gb3JkZXJlZERlcGVuZGVuY3lOYW1lcy5pbmRleE9mKGRlcGVuZGVuY3lOYW1lQik7XG5cbiAgICByZXR1cm4gKGluZGV4QSAtIGluZGV4Qik7XG4gIH0pO1xuXG4gIGxvZy5pbmZvKGBJbml0aWFsaXNpbmcgdGhlICcke3JlbGVhc2VDb250ZXh0TmFtZX0nIHBhY2thZ2UgY29udGV4dC4uLmApO1xuXG4gIHJlbGVhc2VDb250ZXh0LmluaXRpYWxpc2UocmVsZWFzZUNvbnRleHRzLCBGaWxlQ29udGV4dEZyb21GaWxlUGF0aCk7XG5cbiAgbG9nLmRlYnVnKGAuLi5pbml0aWFsaXNlZCB0aGUgJyR7cmVsZWFzZUNvbnRleHROYW1lfScgcGFja2FnZSBjb250ZXh0LmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVSZWxlYXNlQ29udGV4dChkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCkge1xuICBsZXQgcmVsZWFzZUNvbnRleHRDcmVhdGVkID0gZmFsc2U7XG5cbiAgY29uc3QgeyBsb2csIHJlbGVhc2VDb250ZXh0TWFwLCByZWxlYXNlQ29udGV4dEZyb21EZXBlbmRlbmN5IH0gPSBjb250ZXh0LFxuICAgICAgICBkZXBlbmRlbmN5TmFtZSA9IGRlcGVuZGVuY3kuZ2V0TmFtZSgpLFxuICAgICAgICByZWxlYXNlTmFtZSA9IGRlcGVuZGVuY3lOYW1lLCAvLy9cbiAgICAgICAgcmVsZWFzZUNvbnRleHQgPSByZWxlYXNlQ29udGV4dE1hcFtyZWxlYXNlTmFtZV0gfHwgbnVsbDtcblxuICBpZiAocmVsZWFzZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICBjb25zdCByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kgPSBjaGVja1JlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeShyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpO1xuXG4gICAgaWYgKHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgJyR7cmVsZWFzZU5hbWV9JyBwYWNrYWdlIGNvbnRleHQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLmApO1xuXG4gICAgICByZWxlYXNlQ29udGV4dENyZWF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5U3RyaW5nID0gZGVwZW5kZW5jeS5hc1N0cmluZygpLFxuICAgICAgICAgIGRlcGVuZGVudE5hbWVzTGVuZ3RoID0gZGVwZW5kZW50TmFtZXMubGVuZ3RoO1xuXG4gICAgaWYgKGRlcGVuZGVudE5hbWVzTGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2cuaW5mbyhgQ3JlYXRpbmcgdGhlICcke3JlbGVhc2VOYW1lfScgcGFja2FnZSBjb250ZXh0Li4uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxhc3REZXBlbmRlbnROYW1lID0gbGFzdChkZXBlbmRlbnROYW1lcyksXG4gICAgICAgICAgICBkZXBlbmRlbnROYW1lID0gbGFzdERlcGVuZGVudE5hbWU7ICAvLy9cblxuICAgICAgbG9nLmluZm8oYENyZWF0aW5nIHRoZSAnJHtyZWxlYXNlTmFtZX0nIHBhY2thZ2UgY29udGV4dCBnaXZlbiB0aGUgJyR7ZGVwZW5kZW50TmFtZX0nIGRlcGVuZGFudCdzICcke2RlcGVuZGVuY3lTdHJpbmd9JyBkZXBlbmRlbmN5Li4uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZUNvbnRleHQgPSBhd2FpdCByZWxlYXNlQ29udGV4dEZyb21EZXBlbmRlbmN5KGRlcGVuZGVuY3ksIGNvbnRleHQpO1xuXG4gICAgaWYgKHJlbGVhc2VDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kgPSBjaGVja1JlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeShyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpO1xuXG4gICAgICBpZiAocmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5KSB7XG4gICAgICAgIHJlbGVhc2VDb250ZXh0TWFwW3JlbGVhc2VOYW1lXSA9IHJlbGVhc2VDb250ZXh0O1xuXG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNDcmVhdGVkID0gYXdhaXQgY3JlYXRlRGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyhyZWxlYXNlQ29udGV4dCwgZGVwZW5kZW5jeSwgZGVwZW5kZW50TmFtZXMsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZCkge1xuICAgICAgICAgIHJlbGVhc2VDb250ZXh0Q3JlYXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgICAgIHJlbGVhc2VOYW1lID0gZGVwZW5kZW5jeU5hbWU7IC8vL1xuXG4gICAgICBsb2cud2FybmluZyhgVGhlICcke3JlbGVhc2VOYW1lfScgcGFja2FnZSBjb250ZXh0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiBQZXJoYXBzIHRoZSAnbWV0YS5qc29uJyBmaWxlIGlzIG1pc3Npbmcgb3IgaW52YWxpZC4gT3IgdGhlcmUgY291bGQgYmUgYSBkZXBlbmRlbmN5IG1pc21hdGNoLmApO1xuICAgIH1cblxuICAgIHJlbGVhc2VDb250ZXh0Q3JlYXRlZCA/XG4gICAgICBsb2cuZGVidWcoYC4uLmNyZWF0ZWQgdGhlICcke3JlbGVhc2VOYW1lfScgcGFja2FnZSBjb250ZXh0LmApIDpcbiAgICAgICAgbG9nLndhcm5pbmcoYC4uLnVuYWJsZSB0byBjcmVhdGUgdGhlICcke3JlbGVhc2VOYW1lfScgcGFja2FnZSBjb250ZXh0LmApO1xuICB9XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0Q3JlYXRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UmVsZWFzZUNvbnRleHQocmVsZWFzZU5hbWUsIGRlcGVuZGVudE5hbWUsIGRlcGVuZGVudFJlbGVhc2VkLCByZWxlYXNlQ29udGV4dE1hcCkge1xuICBsZXQgcmVsZWFzZUNvbnRleHRWZXJpZmllcyA9IGZhbHNlO1xuXG4gIGNvbnN0IHJlbGVhc2VDb250ZXh0ID0gcmVsZWFzZUNvbnRleHRNYXBbcmVsZWFzZU5hbWVdIHx8IG51bGw7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgY29uc3QgcmVsZWFzZWQgPSByZWxlYXNlQ29udGV4dC5pc1JlbGVhc2VkKCk7XG5cbiAgICBpZiAocmVsZWFzZWQpIHtcbiAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGVwZW5kZW50UmVsZWFzZWQpIHtcbiAgICAgICAgcmVsZWFzZUNvbnRleHQud2FybmluZyhgVGhlICcke3JlbGVhc2VOYW1lfScgcHJvamVjdCBjYW5ub3QgYmUgdmVyaWZpZWQgYmVjYXVzZSBpdHMgJyR7ZGVwZW5kZW50TmFtZX0nIGRlcGVuZGVudCBpcyBhIHBhY2thZ2UuYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZXBlbmRlbnROYW1lID0gcmVsZWFzZU5hbWUsICAvLy9cbiAgICAgICAgICAgICAgZGVwZW5kZW50UmVsZWFzZWQgPSByZWxlYXNlZCwgLy8vXG4gICAgICAgICAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnkgPSBhd2FpdCB2ZXJpZnlEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbnROYW1lLCBkZXBlbmRlbnRSZWxlYXNlZCwgcmVsZWFzZUNvbnRleHRNYXApO1xuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5KSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZUNvbnRleHRWZXJpZmllZCA9IHJlbGVhc2VDb250ZXh0Lmhhc1ZlcmlmaWVkKCk7XG5cbiAgICAgICAgICBpZiAocmVsZWFzZUNvbnRleHRWZXJpZmllZCkge1xuICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRWZXJpZmllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0LmluZm8oYFZlcmlmeWluZyB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwcm9qZWN0Li4uYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZlcmlmaWVzID0gYXdhaXQgcmVsZWFzZUNvbnRleHQudmVyaWZ5KCk7XG5cbiAgICAgICAgICAgIGlmICh2ZXJpZmllcykge1xuICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dC5pbmZvKGAuLi52ZXJpZmllZCB0aGUgJyR7cmVsZWFzZU5hbWV9JyBwcm9qZWN0LmApO1xuXG4gICAgICAgICAgICAgIHJlbGVhc2VDb250ZXh0VmVyaWZpZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWxlYXNlQ29udGV4dFZlcmlmaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbmN5LCBkZXBlbmRlbnROYW1lcywgY29udGV4dCkge1xuICBsZXQgZGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0c0NyZWF0ZWQ7XG5cbiAgY29uc3QgbmFtZSA9IHJlbGVhc2VDb250ZXh0LmdldE5hbWUoKSxcbiAgICAgICAgZGVwZW5kZW5jaWVzID0gcmVsZWFzZUNvbnRleHQuZ2V0RGVwZW5kZW5jaWVzKCksXG4gICAgICAgIGRlcGVuZGVuY3lOYW1lID0gbmFtZTsgIC8vL1xuXG4gIGRlcGVuZGVudE5hbWVzID0gWyAuLi5kZXBlbmRlbnROYW1lcywgZGVwZW5kZW5jeU5hbWUgXTsgIC8vL1xuXG4gIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNDcmVhdGVkID0gYXdhaXQgYXN5bmNFdmVyeURlcGVuZGVuY3koZGVwZW5kZW5jaWVzLCBhc3luYyAoZGVwZW5kZW5jeSkgPT4ge1xuICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0Q3JlYXRlZCA9IGF3YWl0IGNyZWF0ZVJlbGVhc2VDb250ZXh0KGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KTtcblxuICAgIGlmIChyZWxlYXNlQ29udGV4dENyZWF0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNDcmVhdGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlEZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCBkZXBlbmRlbnROYW1lLCBkZXBlbmRlbnRSZWxlYXNlZCwgcmVsZWFzZUNvbnRleHRNYXApIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gcmVsZWFzZUNvbnRleHQuZ2V0RGVwZW5kZW5jaWVzKCksXG4gICAgICAgIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnkgPSBhd2FpdCBhc3luY0V2ZXJ5RGVwZW5kZW5jeShkZXBlbmRlbmNpZXMsIGFzeW5jIChkZXBlbmRlbmN5KSA9PiB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGRlcGVuZGVuY3kuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VOYW1lID0gbmFtZSwgLy8vXG4gICAgICAgICAgICAgICAgcmVsZWFzZUNvbnRleHRWZXJpZmllcyA9IGF3YWl0IHZlcmlmeVJlbGVhc2VDb250ZXh0KHJlbGVhc2VOYW1lLCBkZXBlbmRlbnROYW1lLCBkZXBlbmRlbnRSZWxlYXNlZCwgcmVsZWFzZUNvbnRleHRNYXApO1xuXG4gICAgICAgICAgaWYgKHJlbGVhc2VDb250ZXh0VmVyaWZpZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgcmV0dXJuIGRlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHNWZXJpZnk7XG59XG5cbmZ1bmN0aW9uIHJldHJpZXZlUmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCByZWxlYXNlQ29udGV4dE1hcCwgcmVsZWFzZUNvbnRleHRzID0gW10pIHtcbiAgY29uc3QgcmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCA9IHJlbGVhc2VDb250ZXh0cy5pbmNsdWRlcyhyZWxlYXNlQ29udGV4dCk7XG5cbiAgaWYgKHJlbGVhc2VDb250ZXh0c0luY2x1ZGVzUmVsZWFzZUNvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZWxlYXNlQ29udGV4dHMucHVzaChyZWxlYXNlQ29udGV4dCk7XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gcmVsZWFzZUNvbnRleHQuZ2V0RGVwZW5kZW5jaWVzKCk7XG5cbiAgZGVwZW5kZW5jaWVzLmZvckVhY2hEZXBlbmRlbmN5KChkZXBlbmRlbmN5KSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jeU5hbWUgPSBkZXBlbmRlbmN5LmdldE5hbWUoKSxcbiAgICAgICAgICByZWxlYXNlTmFtZSA9IGRlcGVuZGVuY3lOYW1lLCAvLy9cbiAgICAgICAgICByZWxlYXNlQ29udGV4dCA9IHJlbGVhc2VDb250ZXh0TWFwW3JlbGVhc2VOYW1lXTtcblxuICAgIHJldHJpZXZlUmVsZWFzZUNvbnRleHRzKHJlbGVhc2VDb250ZXh0LCByZWxlYXNlQ29udGV4dE1hcCwgcmVsZWFzZUNvbnRleHRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlbGVhc2VDb250ZXh0cztcbn1cblxuZnVuY3Rpb24gY2hlY2tSZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kocmVsZWFzZUNvbnRleHQsIGRlcGVuZGVuY3ksIGRlcGVuZGVudE5hbWVzLCBjb250ZXh0KSB7XG4gIGxldCByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kgPSB0cnVlO1xuXG4gIGNvbnN0IHNob3J0ZW5lZFZlcnNpb24gPSBkZXBlbmRlbmN5LmdldFNob3J0ZW5lZFZlcnNpb24oKTtcblxuICBpZiAoc2hvcnRlbmVkVmVyc2lvbiAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGVudHJpZXNNYXRjaFNob3J0ZW5lZFZlcnNpb24gPSByZWxlYXNlQ29udGV4dC5tYXRjaFNob3J0ZW5lZFZlcnNpb24oc2hvcnRlbmVkVmVyc2lvbik7XG5cbiAgICBpZiAoIWVudHJpZXNNYXRjaFNob3J0ZW5lZFZlcnNpb24pIHtcbiAgICAgIGNvbnN0IHsgbG9nIH0gPSBjb250ZXh0LFxuICAgICAgICAgICAgdmVyc2lvbiA9IHJlbGVhc2VDb250ZXh0LmdldFZlcnNpb24oKSxcbiAgICAgICAgICAgIGxhc3REZXBlbmRlbnROYW1lID0gbGFzdChkZXBlbmRlbnROYW1lcyksXG4gICAgICAgICAgICBkZXBlbmRlbnROYW1lID0gbGFzdERlcGVuZGVudE5hbWUsICAvLy9cbiAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZXBlbmRlbmN5U3RyaW5nID0gZGVwZW5kZW5jeS5hc1N0cmluZygpO1xuXG4gICAgICBsb2cud2FybmluZyhgVGhlICcke2RlcGVuZGVudE5hbWV9JyBkZXBlbmRlbnQgcmVxdWlyZXMgdGhlICcke2RlcGVuZGVuY3lTdHJpbmd9JyBkZXBlbmRlbmN5IGJ1dCBhIGNvbnRleHQgd2l0aCB2ZXJzaW9uICcke3ZlcnNpb25TdHJpbmd9JyB3YXMgcHJvdmlkZWQuYCk7XG5cbiAgICAgIHJlbGVhc2VNYXRjaGVzRGVwZW5kZW5jeSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ3ljbGljRGVwZW5kZW5jaWVzUHJlc2VudChkaXJlY3RlZEdyYXBoLCBjb250ZXh0KSB7XG4gIGxldCBjeWNsaWNEZXBlbmRlbmNpZXNQcmVzZW50ID0gZmFsc2U7XG5cbiAgY29uc3QgZmlyc3RDeWNsZSA9IGRpcmVjdGVkR3JhcGguZ2V0Rmlyc3RDeWNsZSgpO1xuXG4gIGlmIChmaXJzdEN5Y2xlICE9PSBudWxsKSB7XG4gICAgY29uc3QgeyBsb2cgfSA9IGNvbnRleHQsXG4gICAgICAgICAgdmVydGV4TmFtZXMgPSBmaXJzdEN5Y2xlLmdldFZlcnRleE5hbWVzKCksXG4gICAgICAgICAgZGVwZW5kZW5jeU5hbWVzID0gdmVydGV4TmFtZXMsICAvLy9cbiAgICAgICAgICBmaXJzdERlcGVuZGVuY3lOYW1lID0gZmlyc3QoZGVwZW5kZW5jeU5hbWVzKSxcbiAgICAgICAgICBjeWNsaWNEZXBlbmRlbmN5TmFtZXMgPSBbXG4gICAgICAgICAgICAuLi5kZXBlbmRlbmN5TmFtZXMsXG4gICAgICAgICAgICBmaXJzdERlcGVuZGVuY3lOYW1lXG4gICAgICAgICAgXSxcbiAgICAgICAgICBjeWNsZVN0cmluZyA9IGN5Y2xpY0RlcGVuZGVuY3lOYW1lcy5qb2luKFNJTkdMRV9TUEFDRSk7XG5cbiAgICBsb2cud2FybmluZyhgVGhlcmUgaXMgYXQgbGVhc3Qgb25lICcke2N5Y2xlU3RyaW5nfScuIGN5Y2xpYyBkZXBlbmRlbmN5YCk7XG5cbiAgICBjeWNsaWNEZXBlbmRlbmNpZXNQcmVzZW50ID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBjeWNsaWNEZXBlbmRlbmNpZXNQcmVzZW50O1xufVxuIl0sIm5hbWVzIjpbImNyZWF0ZVJlbGVhc2VDb250ZXh0cyIsImluaXRpYWxpc2VSZWxlYXNlQ29udGV4dHMiLCJ2ZXJpZnlSZWxlYXNlQ29udGV4dHMiLCJmaXJzdCIsImxhc3QiLCJhcnJheVV0aWxpdGllcyIsImRlcGVuZGVuY3kiLCJjb250ZXh0IiwicmVsZWFzZUNvbnRleHRzQ3JlYXRlZCIsImRlcGVuZGVudE5hbWVzIiwicmVsZWFzZUNvbnRleHRDcmVhdGVkIiwiY3JlYXRlUmVsZWFzZUNvbnRleHQiLCJyZWxlYXNlQ29udGV4dHNJbml0aWFsaXNlZCIsImRpcmVjdGVkR3JhcGgiLCJEaXJlY3RlZEdyYXBoIiwiZnJvbU5vdGhpbmciLCJ2aXNpdGVkRGVwZW5kZW5jeU5hbWVzIiwiYWRkRGVwZW5kZW5jeVJlbGF0aW9ucyIsImN5Y2xpY0RlcGVuZGVuY2llc1ByZXNlbnQiLCJjaGVja0N5Y2xpY0RlcGVuZGVuY2llc1ByZXNlbnQiLCJyZWxlYXNlQ29udGV4dE1hcCIsInJlbGVhc2VOYW1lcyIsIk9iamVjdCIsImtleXMiLCJvcmRlcmVkVmVydGV4TmFtZXMiLCJnZXRPcmRlcmVkVmVydGV4TmFtZXMiLCJvcmRlcmVkRGVwZW5kZW5jeU5hbWVzIiwiZm9yRWFjaCIsInJlbGVhc2VOYW1lIiwicmVsZWFzZUNvbnRleHQiLCJpbml0aWFsaXNlUmVsZWFzZUNvbnRleHQiLCJyZWxlYXNlQ29udGV4dHNWZXJpZnkiLCJkZXBlbmRlbmN5TmFtZSIsImdldE5hbWUiLCJkZXBlbmRlbnROYW1lIiwiZGVwZW5kZW50UmVsZWFzZWQiLCJyZWxlYXNlQ29udGV4dFZlcmlmaWVzIiwidmVyaWZ5UmVsZWFzZUNvbnRleHQiLCJ2aXNpdGVkRGVwZW5kZW5jeU5hbWVJbmNsdWRlc0RlcGVuZGVuY3lOYW1lIiwiaW5jbHVkZXMiLCJ2aXNpdGVkZGVwZW5kZW5jeU5hbWUiLCJwdXNoIiwibG9nIiwiZGVwZW5kZW5jeVN0cmluZyIsImdldFN0cmluZyIsIndhcm5pbmciLCJkZXBlbmRlbmNpZXMiLCJnZXREZXBlbmRlbmNpZXMiLCJ0YXJnZXRWZXJ0ZXhOYW1lIiwiZm9yRWFjaERlcGVuZGVuY3kiLCJzb3VyY2VWZXJ0ZXhOYW1lIiwiYWRkRWRnZUJ5U291cmNlVmVydGV4TmFtZUFuZFRhcmdldFZlcnRleE5hbWUiLCJGaWxlQ29udGV4dEZyb21GaWxlUGF0aCIsInJlbGVhc2VDb250ZXh0cyIsInJldHJpZXZlUmVsZWFzZUNvbnRleHRzIiwicmVsZWFzZUNvbnRleHROYW1lIiwic29ydCIsInJlbGVhc2VDb250ZXh0QSIsInJlbGVhc2VDb250ZXh0QiIsInJlbGVhc2VDb250ZXh0QU5hbWUiLCJyZWxlYXNlQ29udGV4dEJOYW1lIiwiZGVwZW5kZW5jeU5hbWVBIiwiZGVwZW5kZW5jeU5hbWVCIiwiaW5kZXhBIiwiaW5kZXhPZiIsImluZGV4QiIsImluZm8iLCJpbml0aWFsaXNlIiwiZGVidWciLCJyZWxlYXNlQ29udGV4dEZyb21EZXBlbmRlbmN5IiwicmVsZWFzZU1hdGNoZXNEZXBlbmRlbmN5IiwiY2hlY2tSZWxlYXNlTWF0Y2hlc0RlcGVuZGVuY3kiLCJhc1N0cmluZyIsImRlcGVuZGVudE5hbWVzTGVuZ3RoIiwibGVuZ3RoIiwibGFzdERlcGVuZGVudE5hbWUiLCJkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzQ3JlYXRlZCIsImNyZWF0ZURlcGVuZGVuY3lSZWxlYXNlQ29udGV4dHMiLCJyZWxlYXNlZCIsImlzUmVsZWFzZWQiLCJkZXBlbmRlbmN5UmVsZWFzZUNvbnRleHRzVmVyaWZ5IiwidmVyaWZ5RGVwZW5kZW5jeVJlbGVhc2VDb250ZXh0cyIsInJlbGVhc2VDb250ZXh0VmVyaWZpZWQiLCJoYXNWZXJpZmllZCIsInZlcmlmaWVzIiwidmVyaWZ5IiwibmFtZSIsImFzeW5jRXZlcnlEZXBlbmRlbmN5IiwicmVsZWFzZUNvbnRleHRzSW5jbHVkZXNSZWxlYXNlQ29udGV4dCIsInNob3J0ZW5lZFZlcnNpb24iLCJnZXRTaG9ydGVuZWRWZXJzaW9uIiwiZW50cmllc01hdGNoU2hvcnRlbmVkVmVyc2lvbiIsIm1hdGNoU2hvcnRlbmVkVmVyc2lvbiIsInZlcnNpb24iLCJnZXRWZXJzaW9uIiwidmVyc2lvblN0cmluZyIsInRvU3RyaW5nIiwiZmlyc3RDeWNsZSIsImdldEZpcnN0Q3ljbGUiLCJ2ZXJ0ZXhOYW1lcyIsImdldFZlcnRleE5hbWVzIiwiZGVwZW5kZW5jeU5hbWVzIiwiZmlyc3REZXBlbmRlbmN5TmFtZSIsImN5Y2xpY0RlcGVuZGVuY3lOYW1lcyIsImN5Y2xlU3RyaW5nIiwiam9pbiIsIlNJTkdMRV9TUEFDRSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O1FBVXNCQTtlQUFBQTs7UUF5RHRCO2VBQUE7O1FBNUNnQkM7ZUFBQUE7O1FBNEJNQztlQUFBQTs7O3FDQWpEUTsyQkFDQzsyQkFFRjs0QkFDUTtBQUVyQyxNQUFNLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxFQUFFLEdBQUdDLHlCQUFjO0FBRS9CLGVBQWVMLHNCQUFzQk0sVUFBVSxFQUFFQyxPQUFPO0lBQzdELElBQUlDLHlCQUF5QjtJQUU3QixNQUFNQyxpQkFBaUIsRUFBRSxFQUNuQkMsd0JBQXdCLE1BQU1DLHFCQUFxQkwsWUFBWUcsZ0JBQWdCRjtJQUVyRixJQUFJRyx1QkFBdUI7UUFDekJGLHlCQUF5QjtJQUMzQjtJQUVBLE9BQU9BO0FBQ1Q7QUFFTyxTQUFTUCwwQkFBMEJL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
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "occam-languages",
|
|
3
3
|
"author": "James Smith",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.129",
|
|
5
5
|
"license": "MIT, Anti-996",
|
|
6
6
|
"homepage": "https://github.com/djalbat/occam-languages",
|
|
7
7
|
"description": "Occam's common language functionality.",
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"necessary": "^17.1.7",
|
|
14
14
|
"occam-custom-grammars": "^6.0.17",
|
|
15
|
+
"occam-directed-graphs": "^3.0.87",
|
|
15
16
|
"occam-parsers": "^23.1.50"
|
|
16
17
|
},
|
|
17
18
|
"devDependencies": {
|
|
@@ -1,42 +1,140 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { DirectedGraph } from "occam-directed-graphs";
|
|
3
4
|
import { arrayUtilities } from "necessary";
|
|
4
5
|
|
|
6
|
+
import { SINGLE_SPACE} from "../constants";
|
|
5
7
|
import { asyncEveryDependency } from "../utilities/dependency";
|
|
6
8
|
|
|
7
|
-
const { last } = arrayUtilities;
|
|
9
|
+
const { first, last } = arrayUtilities;
|
|
10
|
+
|
|
11
|
+
export async function createReleaseContexts(dependency, context) {
|
|
12
|
+
let releaseContextsCreated = false;
|
|
13
|
+
|
|
14
|
+
const dependentNames = [],
|
|
15
|
+
releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
|
|
16
|
+
|
|
17
|
+
if (releaseContextCreated) {
|
|
18
|
+
releaseContextsCreated = true;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return releaseContextsCreated;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function initialiseReleaseContexts(dependency, context) {
|
|
25
|
+
let releaseContextsInitialised = false;
|
|
26
|
+
|
|
27
|
+
const directedGraph = DirectedGraph.fromNothing(),
|
|
28
|
+
visitedDependencyNames = [];
|
|
29
|
+
|
|
30
|
+
addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context);
|
|
31
|
+
|
|
32
|
+
const cyclicDependenciesPresent = checkCyclicDependenciesPresent(directedGraph, context);
|
|
33
|
+
|
|
34
|
+
if (!cyclicDependenciesPresent) {
|
|
35
|
+
const { releaseContextMap } = context,
|
|
36
|
+
releaseNames = Object.keys(releaseContextMap),
|
|
37
|
+
orderedVertexNames = directedGraph.getOrderedVertexNames(),
|
|
38
|
+
orderedDependencyNames = orderedVertexNames; ///
|
|
39
|
+
|
|
40
|
+
releaseNames.forEach((releaseName) => {
|
|
41
|
+
const releaseContext = releaseContextMap[releaseName];
|
|
42
|
+
|
|
43
|
+
initialiseReleaseContext(releaseContext, orderedDependencyNames, context);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
releaseContextsInitialised = true;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return releaseContextsInitialised;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export async function verifyReleaseContexts(dependency, context) {
|
|
53
|
+
let releaseContextsVerify = false;
|
|
54
|
+
|
|
55
|
+
const dependencyName = dependency.getName(),
|
|
56
|
+
releaseName = dependencyName, ///
|
|
57
|
+
dependentName = null,
|
|
58
|
+
dependentReleased = false,
|
|
59
|
+
releaseContextVerifies = await verifyReleaseContext(releaseName, dependentName, dependentReleased, context);
|
|
60
|
+
|
|
61
|
+
if (releaseContextVerifies) {
|
|
62
|
+
releaseContextsVerify = true;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return releaseContextsVerify;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export default {
|
|
69
|
+
createReleaseContexts,
|
|
70
|
+
initialiseReleaseContexts,
|
|
71
|
+
verifyReleaseContexts
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
function addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context) {
|
|
75
|
+
const dependencyName = dependency.getName(),
|
|
76
|
+
visitedDependencyNameIncludesDependencyName = visitedDependencyNames.includes(dependencyName);
|
|
77
|
+
|
|
78
|
+
if (visitedDependencyNameIncludesDependencyName) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const visiteddependencyName = dependencyName; ///
|
|
83
|
+
|
|
84
|
+
visitedDependencyNames.push(visiteddependencyName);
|
|
8
85
|
|
|
9
|
-
export function initialiseReleaseContext(dependency, context) {
|
|
10
86
|
const { log, releaseContextMap } = context,
|
|
11
|
-
dependencyName = dependency.getName(),
|
|
12
87
|
releaseName = dependencyName, ///
|
|
13
88
|
releaseContext = releaseContextMap[releaseName] || null;
|
|
14
89
|
|
|
15
90
|
if (releaseContext === null) {
|
|
16
|
-
|
|
17
|
-
} else {
|
|
18
|
-
const releaseContextInitialised = releaseContext.isInitialised();
|
|
91
|
+
const dependencyString = dependency.getString();
|
|
19
92
|
|
|
20
|
-
|
|
21
|
-
initialiseDependencyReleaseContexts(dependency, releaseContext, context);
|
|
93
|
+
log.warning(`No package context has been created for the '${dependencyString}' dependency. `);
|
|
22
94
|
|
|
23
|
-
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
24
97
|
|
|
25
|
-
|
|
98
|
+
const dependencies = releaseContext.getDependencies(),
|
|
99
|
+
targetVertexName = dependencyName; ///
|
|
26
100
|
|
|
27
|
-
|
|
101
|
+
dependencies.forEachDependency((dependency) => {
|
|
102
|
+
const dependencyName = dependency.getName(),
|
|
103
|
+
sourceVertexName = dependencyName; ///
|
|
28
104
|
|
|
29
|
-
|
|
105
|
+
directedGraph.addEdgeBySourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
|
|
30
106
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
107
|
+
addDependencyRelations(dependency, directedGraph, visitedDependencyNames, context);
|
|
108
|
+
});
|
|
34
109
|
}
|
|
35
110
|
|
|
36
|
-
|
|
111
|
+
function initialiseReleaseContext(releaseContext, orderedDependencyNames, context) {
|
|
112
|
+
const { log, releaseContextMap, FileContextFromFilePath } = context,
|
|
113
|
+
releaseContexts = retrieveReleaseContexts(releaseContext, releaseContextMap),
|
|
114
|
+
releaseContextName = releaseContext.getName();
|
|
115
|
+
|
|
116
|
+
releaseContexts.sort((releaseContextA, releaseContextB) => {
|
|
117
|
+
const releaseContextAName = releaseContextA.getName(),
|
|
118
|
+
releaseContextBName = releaseContextB.getName(),
|
|
119
|
+
dependencyNameA = releaseContextAName, ///
|
|
120
|
+
dependencyNameB = releaseContextBName, ///
|
|
121
|
+
indexA = orderedDependencyNames.indexOf(dependencyNameA),
|
|
122
|
+
indexB = orderedDependencyNames.indexOf(dependencyNameB);
|
|
123
|
+
|
|
124
|
+
return (indexA - indexB);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
log.info(`Initialising the '${releaseContextName}' package context...`);
|
|
128
|
+
|
|
129
|
+
releaseContext.initialise(releaseContexts, FileContextFromFilePath);
|
|
130
|
+
|
|
131
|
+
log.debug(`...initialised the '${releaseContextName}' package context.`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function createReleaseContext(dependency, dependentNames, context) {
|
|
37
135
|
let releaseContextCreated = false;
|
|
38
136
|
|
|
39
|
-
const { log, releaseContextMap } = context,
|
|
137
|
+
const { log, releaseContextMap, releaseContextFromDependency } = context,
|
|
40
138
|
dependencyName = dependency.getName(),
|
|
41
139
|
releaseName = dependencyName, ///
|
|
42
140
|
releaseContext = releaseContextMap[releaseName] || null;
|
|
@@ -45,7 +143,7 @@ export async function createReleaseContext(dependency, dependentNames, context)
|
|
|
45
143
|
const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
|
|
46
144
|
|
|
47
145
|
if (releaseMatchesDependency) {
|
|
48
|
-
log.debug(`The '${releaseName}' context has already been created.`);
|
|
146
|
+
log.debug(`The '${releaseName}' package context has already been created.`);
|
|
49
147
|
|
|
50
148
|
releaseContextCreated = true;
|
|
51
149
|
}
|
|
@@ -54,16 +152,15 @@ export async function createReleaseContext(dependency, dependentNames, context)
|
|
|
54
152
|
dependentNamesLength = dependentNames.length;
|
|
55
153
|
|
|
56
154
|
if (dependentNamesLength === 0) {
|
|
57
|
-
log.info(`Creating the '${releaseName}' context...`);
|
|
155
|
+
log.info(`Creating the '${releaseName}' package context...`);
|
|
58
156
|
} else {
|
|
59
157
|
const lastDependentName = last(dependentNames),
|
|
60
158
|
dependentName = lastDependentName; ///
|
|
61
159
|
|
|
62
|
-
log.info(`Creating the '${releaseName}' context given the '${dependentName}' dependant's '${dependencyString}' dependency...`);
|
|
160
|
+
log.info(`Creating the '${releaseName}' package context given the '${dependentName}' dependant's '${dependencyString}' dependency...`);
|
|
63
161
|
}
|
|
64
162
|
|
|
65
|
-
const
|
|
66
|
-
releaseContext = await releaseContextFromDependency(dependency, context);
|
|
163
|
+
const releaseContext = await releaseContextFromDependency(dependency, context);
|
|
67
164
|
|
|
68
165
|
if (releaseContext !== null) {
|
|
69
166
|
const releaseMatchesDependency = checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context);
|
|
@@ -71,7 +168,7 @@ export async function createReleaseContext(dependency, dependentNames, context)
|
|
|
71
168
|
if (releaseMatchesDependency) {
|
|
72
169
|
releaseContextMap[releaseName] = releaseContext;
|
|
73
170
|
|
|
74
|
-
const dependencyReleaseContextsCreated = await createDependencyReleaseContexts(
|
|
171
|
+
const dependencyReleaseContextsCreated = await createDependencyReleaseContexts(releaseContext, dependency, dependentNames, context);
|
|
75
172
|
|
|
76
173
|
if (dependencyReleaseContextsCreated) {
|
|
77
174
|
releaseContextCreated = true;
|
|
@@ -81,21 +178,21 @@ export async function createReleaseContext(dependency, dependentNames, context)
|
|
|
81
178
|
const dependencyName = dependency.getName(),
|
|
82
179
|
releaseName = dependencyName; ///
|
|
83
180
|
|
|
84
|
-
log.warning(`The '${releaseName}' context could not be created. Perhaps the 'meta.json' file is missing or invalid. Or there could be a dependency mismatch.`);
|
|
181
|
+
log.warning(`The '${releaseName}' package context could not be created. Perhaps the 'meta.json' file is missing or invalid. Or there could be a dependency mismatch.`);
|
|
85
182
|
}
|
|
86
183
|
|
|
87
184
|
releaseContextCreated ?
|
|
88
|
-
log.debug(`...created the '${releaseName}' context.`) :
|
|
89
|
-
log.warning(`...unable to create the '${releaseName}' context.`);
|
|
185
|
+
log.debug(`...created the '${releaseName}' package context.`) :
|
|
186
|
+
log.warning(`...unable to create the '${releaseName}' package context.`);
|
|
90
187
|
}
|
|
91
188
|
|
|
92
189
|
return releaseContextCreated;
|
|
93
190
|
}
|
|
94
191
|
|
|
95
|
-
|
|
192
|
+
async function verifyReleaseContext(releaseName, dependentName, dependentReleased, releaseContextMap) {
|
|
96
193
|
let releaseContextVerifies = false;
|
|
97
194
|
|
|
98
|
-
const releaseContext = releaseContextMap[releaseName];
|
|
195
|
+
const releaseContext = releaseContextMap[releaseName] || null;
|
|
99
196
|
|
|
100
197
|
if (releaseContext !== null) {
|
|
101
198
|
const released = releaseContext.isReleased();
|
|
@@ -104,7 +201,7 @@ export async function verifyReleaseContext(releaseName, dependentName, dependent
|
|
|
104
201
|
releaseContextVerifies = true;
|
|
105
202
|
} else {
|
|
106
203
|
if (dependentReleased) {
|
|
107
|
-
releaseContext.warning(`The '${releaseName}' project cannot be
|
|
204
|
+
releaseContext.warning(`The '${releaseName}' project cannot be verified because its '${dependentName}' dependent is a package.`);
|
|
108
205
|
} else {
|
|
109
206
|
const dependentName = releaseName, ///
|
|
110
207
|
dependentReleased = released, ///
|
|
@@ -134,29 +231,20 @@ export async function verifyReleaseContext(releaseName, dependentName, dependent
|
|
|
134
231
|
return releaseContextVerifies;
|
|
135
232
|
}
|
|
136
233
|
|
|
137
|
-
|
|
138
|
-
createReleaseContext,
|
|
139
|
-
verifyReleaseContext,
|
|
140
|
-
initialiseReleaseContext
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
async function createDependencyReleaseContexts(dependency, releaseContext, dependentNames, context) {
|
|
234
|
+
async function createDependencyReleaseContexts(releaseContext, dependency, dependentNames, context) {
|
|
144
235
|
let dependencyReleaseContextsCreated;
|
|
145
236
|
|
|
146
|
-
const
|
|
147
|
-
dependencies = releaseContext.getDependencies()
|
|
237
|
+
const name = releaseContext.getName(),
|
|
238
|
+
dependencies = releaseContext.getDependencies(),
|
|
239
|
+
dependencyName = name; ///
|
|
148
240
|
|
|
149
241
|
dependentNames = [ ...dependentNames, dependencyName ]; ///
|
|
150
242
|
|
|
151
243
|
dependencyReleaseContextsCreated = await asyncEveryDependency(dependencies, async (dependency) => {
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
if (!cyclicDependencyExists) {
|
|
155
|
-
const releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
|
|
244
|
+
const releaseContextCreated = await createReleaseContext(dependency, dependentNames, context);
|
|
156
245
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
246
|
+
if (releaseContextCreated) {
|
|
247
|
+
return true;
|
|
160
248
|
}
|
|
161
249
|
});
|
|
162
250
|
|
|
@@ -178,67 +266,32 @@ async function verifyDependencyReleaseContexts(releaseContext, dependentName, de
|
|
|
178
266
|
return dependencyReleaseContextsVerify;
|
|
179
267
|
}
|
|
180
268
|
|
|
181
|
-
function retrieveReleaseContexts(releaseContext, releaseContextMap) {
|
|
182
|
-
const
|
|
183
|
-
remainingReleaseContext = releaseContext, ///
|
|
184
|
-
remainingReleaseContexts = [
|
|
185
|
-
remainingReleaseContext
|
|
186
|
-
];
|
|
187
|
-
|
|
188
|
-
let remainingReleaseContextsLength = remainingReleaseContexts.length;
|
|
189
|
-
|
|
190
|
-
while (remainingReleaseContextsLength > 0) {
|
|
191
|
-
const remainingReleaseContext = remainingReleaseContexts.shift(),
|
|
192
|
-
releaseContext = remainingReleaseContext; ///
|
|
193
|
-
|
|
194
|
-
releaseContexts.push(releaseContext);
|
|
195
|
-
|
|
196
|
-
const dependencies = releaseContext.getDependencies();
|
|
197
|
-
|
|
198
|
-
dependencies.forEachDependency((dependency) => {
|
|
199
|
-
const dependencyName = dependency.getName(),
|
|
200
|
-
releaseName = dependencyName, ///
|
|
201
|
-
releaseContext = releaseContextMap[releaseName],
|
|
202
|
-
releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext),
|
|
203
|
-
remainingReleaseContextsIncludesReleaseContext = remainingReleaseContexts.includes(releaseContext);
|
|
204
|
-
|
|
205
|
-
if (!releaseContextsIncludesReleaseContext && !remainingReleaseContextsIncludesReleaseContext) {
|
|
206
|
-
const remainingReleaseContext = releaseContext; ///
|
|
269
|
+
function retrieveReleaseContexts(releaseContext, releaseContextMap, releaseContexts = []) {
|
|
270
|
+
const releaseContextsIncludesReleaseContext = releaseContexts.includes(releaseContext);
|
|
207
271
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
remainingReleaseContextsLength = remainingReleaseContexts.length;
|
|
272
|
+
if (releaseContextsIncludesReleaseContext) {
|
|
273
|
+
return;
|
|
213
274
|
}
|
|
214
275
|
|
|
215
|
-
|
|
216
|
-
}
|
|
276
|
+
releaseContexts.push(releaseContext);
|
|
217
277
|
|
|
218
|
-
|
|
219
|
-
const dependencyName = dependency.getName(),
|
|
220
|
-
dependentNamesIncludesDependencyName = dependentNames.includes(dependencyName),
|
|
221
|
-
cyclicDependencyExists = dependentNamesIncludesDependencyName; ///
|
|
278
|
+
const dependencies = releaseContext.getDependencies();
|
|
222
279
|
|
|
223
|
-
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
...dependentNames,
|
|
228
|
-
firstDependentName
|
|
229
|
-
],
|
|
230
|
-
dependencyNamesString = dependencyNames.join(`' -> '`);
|
|
280
|
+
dependencies.forEachDependency((dependency) => {
|
|
281
|
+
const dependencyName = dependency.getName(),
|
|
282
|
+
releaseName = dependencyName, ///
|
|
283
|
+
releaseContext = releaseContextMap[releaseName];
|
|
231
284
|
|
|
232
|
-
|
|
233
|
-
}
|
|
285
|
+
retrieveReleaseContexts(releaseContext, releaseContextMap, releaseContexts);
|
|
286
|
+
});
|
|
234
287
|
|
|
235
|
-
return
|
|
288
|
+
return releaseContexts;
|
|
236
289
|
}
|
|
237
290
|
|
|
238
291
|
function checkReleaseMatchesDependency(releaseContext, dependency, dependentNames, context) {
|
|
239
292
|
let releaseMatchesDependency = true;
|
|
240
293
|
|
|
241
|
-
const shortenedVersion = dependency.
|
|
294
|
+
const shortenedVersion = dependency.getShortenedVersion();
|
|
242
295
|
|
|
243
296
|
if (shortenedVersion !== null) {
|
|
244
297
|
const entriesMatchShortenedVersion = releaseContext.matchShortenedVersion(shortenedVersion);
|
|
@@ -260,10 +313,26 @@ function checkReleaseMatchesDependency(releaseContext, dependency, dependentName
|
|
|
260
313
|
return releaseMatchesDependency;
|
|
261
314
|
}
|
|
262
315
|
|
|
263
|
-
function
|
|
264
|
-
|
|
316
|
+
function checkCyclicDependenciesPresent(directedGraph, context) {
|
|
317
|
+
let cyclicDependenciesPresent = false;
|
|
265
318
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
319
|
+
const firstCycle = directedGraph.getFirstCycle();
|
|
320
|
+
|
|
321
|
+
if (firstCycle !== null) {
|
|
322
|
+
const { log } = context,
|
|
323
|
+
vertexNames = firstCycle.getVertexNames(),
|
|
324
|
+
dependencyNames = vertexNames, ///
|
|
325
|
+
firstDependencyName = first(dependencyNames),
|
|
326
|
+
cyclicDependencyNames = [
|
|
327
|
+
...dependencyNames,
|
|
328
|
+
firstDependencyName
|
|
329
|
+
],
|
|
330
|
+
cycleString = cyclicDependencyNames.join(SINGLE_SPACE);
|
|
331
|
+
|
|
332
|
+
log.warning(`There is at least one '${cycleString}'. cyclic dependency`);
|
|
333
|
+
|
|
334
|
+
cyclicDependenciesPresent = true;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return cyclicDependenciesPresent;
|
|
269
338
|
}
|