occam-nominal 1.0.508 → 1.0.514
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/context/cladic.js +175 -3
- package/lib/context/file/nominal.js +7 -2
- package/lib/context/liminal.js +2 -20
- package/lib/context/metexic.js +69 -1
- package/lib/context/mnemic.js +27 -2
- package/lib/context.js +6 -73
- package/lib/element/assertion/contained.js +12 -4
- package/lib/element/assertion/defined.js +12 -4
- package/lib/element/assertion/property.js +11 -4
- package/lib/element/assertion/schema.js +4 -6
- package/lib/element/assertion/signature.js +2 -13
- package/lib/element/assertion/subproof.js +12 -3
- package/lib/element/assertion/type.js +6 -10
- package/lib/element/assertion.js +1 -15
- package/lib/element/assumption/implicit.js +14 -3
- package/lib/element/assumption.js +3 -2
- package/lib/element/claim/axiom.js +28 -25
- package/lib/element/claim/conjecture.js +27 -24
- package/lib/element/claim/lemma.js +27 -24
- package/lib/element/claim/theorem.js +27 -24
- package/lib/element/claim.js +6 -4
- package/lib/element/combinator.js +13 -17
- package/lib/element/constraint.js +7 -23
- package/lib/element/constructor.js +13 -17
- package/lib/element/declaration/combinator.js +3 -4
- package/lib/element/declaration/constructor.js +3 -4
- package/lib/element/declaration/cotype.js +3 -4
- package/lib/element/declaration/generator.js +3 -4
- package/lib/element/declaration/metavariable.js +3 -4
- package/lib/element/declaration/property.js +3 -4
- package/lib/element/declaration/type.js +3 -4
- package/lib/element/declaration/typePrefix.js +3 -4
- package/lib/element/declaration/variable.js +3 -4
- package/lib/element/derivation.js +2 -2
- package/lib/element/equality.js +3 -2
- package/lib/element/fact/premise.js +10 -10
- package/lib/element/fact/step.js +1 -2
- package/lib/element/fact/supposition.js +8 -7
- package/lib/element/frame.js +3 -2
- package/lib/element/generator.js +11 -15
- package/lib/element/hypothesis.js +6 -6
- package/lib/element/label.js +15 -3
- package/lib/element/link.js +5 -4
- package/lib/element/metaType.js +3 -2
- package/lib/element/metavariable.js +21 -36
- package/lib/element/parameter.js +3 -2
- package/lib/element/procedureCall.js +3 -2
- package/lib/element/procedureReference.js +3 -2
- package/lib/element/proof.js +22 -16
- package/lib/element/property.js +11 -15
- package/lib/element/reference.js +5 -24
- package/lib/element/resolution/conclusion.js +5 -6
- package/lib/element/resolution/deduction.js +5 -6
- package/lib/element/resolution.js +5 -4
- package/lib/element/rule.js +36 -30
- package/lib/element/schema.js +32 -27
- package/lib/element/section.js +24 -21
- package/lib/element/signature.js +16 -20
- package/lib/element/statement.js +3 -2
- package/lib/element/subDerivation.js +2 -2
- package/lib/element/subproof.js +26 -22
- package/lib/element/substitution/frame.js +17 -4
- package/lib/element/substitution/statement.js +43 -30
- package/lib/element/substitution/term.js +17 -5
- package/lib/element/substitution.js +5 -4
- package/lib/element/term.js +4 -2
- package/lib/element/typePrefix.js +3 -2
- package/lib/element/variable.js +10 -14
- package/lib/process/unification.js +5 -8
- package/lib/process/validation.js +7 -12
- package/lib/utilities/element.js +2 -2
- package/lib/utilities/json.js +4 -4
- package/package.json +1 -1
- package/src/context/cladic.js +285 -10
- package/src/context/file/nominal.js +24 -17
- package/src/context/liminal.js +1 -29
- package/src/context/metexic.js +102 -0
- package/src/context/mnemic.js +33 -1
- package/src/context.js +8 -108
- package/src/element/assertion/contained.js +17 -5
- package/src/element/assertion/defined.js +17 -5
- package/src/element/assertion/property.js +15 -5
- package/src/element/assertion/schema.js +3 -6
- package/src/element/assertion/signature.js +3 -25
- package/src/element/assertion/subproof.js +16 -3
- package/src/element/assertion/type.js +12 -20
- package/src/element/assertion.js +1 -24
- package/src/element/assumption/implicit.js +19 -3
- package/src/element/assumption.js +3 -1
- package/src/element/claim/axiom.js +34 -33
- package/src/element/claim/conjecture.js +36 -35
- package/src/element/claim/lemma.js +36 -35
- package/src/element/claim/theorem.js +36 -35
- package/src/element/claim.js +15 -12
- package/src/element/combinator.js +16 -23
- package/src/element/constraint.js +7 -31
- package/src/element/constructor.js +24 -31
- package/src/element/declaration/combinator.js +2 -5
- package/src/element/declaration/constructor.js +2 -5
- package/src/element/declaration/cotype.js +2 -5
- package/src/element/declaration/generator.js +2 -5
- package/src/element/declaration/metavariable.js +2 -5
- package/src/element/declaration/property.js +2 -5
- package/src/element/declaration/type.js +2 -5
- package/src/element/declaration/typePrefix.js +2 -5
- package/src/element/declaration/variable.js +2 -5
- package/src/element/derivation.js +1 -2
- package/src/element/equality.js +3 -1
- package/src/element/fact/premise.js +12 -13
- package/src/element/fact/step.js +1 -3
- package/src/element/fact/supposition.js +10 -8
- package/src/element/frame.js +3 -1
- package/src/element/generator.js +22 -29
- package/src/element/hypothesis.js +7 -7
- package/src/element/label.js +20 -4
- package/src/element/link.js +14 -12
- package/src/element/metaType.js +3 -1
- package/src/element/metavariable.js +22 -42
- package/src/element/parameter.js +3 -1
- package/src/element/procedureCall.js +3 -1
- package/src/element/procedureReference.js +3 -1
- package/src/element/proof.js +31 -22
- package/src/element/property.js +20 -27
- package/src/element/reference.js +6 -34
- package/src/element/resolution/conclusion.js +5 -8
- package/src/element/resolution/deduction.js +5 -8
- package/src/element/resolution.js +6 -4
- package/src/element/rule.js +49 -45
- package/src/element/schema.js +44 -40
- package/src/element/section.js +26 -25
- package/src/element/signature.js +19 -26
- package/src/element/statement.js +3 -1
- package/src/element/subDerivation.js +1 -1
- package/src/element/subproof.js +26 -22
- package/src/element/substitution/frame.js +21 -4
- package/src/element/substitution/statement.js +64 -46
- package/src/element/substitution/term.js +22 -5
- package/src/element/substitution.js +6 -4
- package/src/element/term.js +10 -7
- package/src/element/typePrefix.js +3 -1
- package/src/element/variable.js +16 -19
- package/src/process/unification.js +4 -8
- package/src/process/validation.js +6 -11
- package/src/utilities/element.js +2 -3
- package/src/utilities/json.js +2 -3
package/lib/context/cladic.js
CHANGED
|
@@ -17,11 +17,15 @@ function _interop_require_default(obj) {
|
|
|
17
17
|
}
|
|
18
18
|
const { push, extract } = _necessary.arrayUtilities;
|
|
19
19
|
class CladicContext extends _context.default {
|
|
20
|
-
constructor(context, terms, links, assertions, metavariables){
|
|
20
|
+
constructor(context, terms, links, frames, equalities, assertions, statements, assumptions, metavariables){
|
|
21
21
|
super(context);
|
|
22
22
|
this.terms = terms;
|
|
23
23
|
this.links = links;
|
|
24
|
+
this.frames = frames;
|
|
25
|
+
this.equalities = equalities;
|
|
24
26
|
this.assertions = assertions;
|
|
27
|
+
this.statements = statements;
|
|
28
|
+
this.assumptions = assumptions;
|
|
25
29
|
this.metavariables = metavariables;
|
|
26
30
|
}
|
|
27
31
|
getTerms(terms = []) {
|
|
@@ -36,12 +40,36 @@ class CladicContext extends _context.default {
|
|
|
36
40
|
context.getLinks(links);
|
|
37
41
|
return links;
|
|
38
42
|
}
|
|
43
|
+
getFrames(frames = []) {
|
|
44
|
+
const context = this.getContext();
|
|
45
|
+
push(frames, this.frames);
|
|
46
|
+
context.getFrames(frames);
|
|
47
|
+
return frames;
|
|
48
|
+
}
|
|
49
|
+
getEqualities(equalities = []) {
|
|
50
|
+
const context = this.getContext();
|
|
51
|
+
push(equalities, this.equalities);
|
|
52
|
+
context.getEqualities(equalities);
|
|
53
|
+
return equalities;
|
|
54
|
+
}
|
|
55
|
+
getStatements(statements = []) {
|
|
56
|
+
const context = this.getContext();
|
|
57
|
+
push(statements, this.statements);
|
|
58
|
+
context.getStatements(statements);
|
|
59
|
+
return statements;
|
|
60
|
+
}
|
|
39
61
|
getAssertions(assertions = []) {
|
|
40
62
|
const context = this.getContext();
|
|
41
63
|
push(assertions, this.assertions);
|
|
42
64
|
context.getAssertions(assertions);
|
|
43
65
|
return assertions;
|
|
44
66
|
}
|
|
67
|
+
getAssumptions(assumptions = []) {
|
|
68
|
+
const context = this.getContext();
|
|
69
|
+
push(assumptions, this.assumptions);
|
|
70
|
+
context.getAssumptions(assumptions);
|
|
71
|
+
return assumptions;
|
|
72
|
+
}
|
|
45
73
|
getMetavariables(metavariables = []) {
|
|
46
74
|
const context = this.getContext();
|
|
47
75
|
push(metavariables, this.metavariables);
|
|
@@ -78,6 +106,36 @@ class CladicContext extends _context.default {
|
|
|
78
106
|
this.links.push(link);
|
|
79
107
|
context.debug(`...added the '${linkString}' link to the cladic context.`);
|
|
80
108
|
}
|
|
109
|
+
addFrame(frame) {
|
|
110
|
+
const context = this, frameString = frame.getString();
|
|
111
|
+
context.trace(`Adding the '${frameString}' frame to the cladic context...`);
|
|
112
|
+
const frameA = frame; ///
|
|
113
|
+
extract(this.frames, (frame)=>{
|
|
114
|
+
const frameB = frame, frameAEqualToFrameB = frameA.isEqualTo(frameB);
|
|
115
|
+
if (frameAEqualToFrameB) {
|
|
116
|
+
const frameString = frame.getString();
|
|
117
|
+
context.trace(`Removed the existing '${frameString}' frame from the cladic context...`);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
this.frames.push(frame);
|
|
122
|
+
context.debug(`...added the '${frameString}' frame to the cladic context.`);
|
|
123
|
+
}
|
|
124
|
+
addEquality(equality) {
|
|
125
|
+
const context = this, equalityString = equality.getString();
|
|
126
|
+
context.trace(`Adding the '${equalityString}' equality to the cladic context...`);
|
|
127
|
+
const equalityA = equality; ///
|
|
128
|
+
extract(this.equalities, (equality)=>{
|
|
129
|
+
const equalityB = equality, equalityAEqualToEqualityB = equalityA.isEqualTo(equalityB);
|
|
130
|
+
if (equalityAEqualToEqualityB) {
|
|
131
|
+
const equalityString = equality.getString();
|
|
132
|
+
context.trace(`Removed the existing '${equalityString}' equality from the cladic context...`);
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
this.equalities.push(equality);
|
|
137
|
+
context.debug(`...added the '${equalityString}' equality to the cladic context.`);
|
|
138
|
+
}
|
|
81
139
|
addAssertion(assertion) {
|
|
82
140
|
const context = this, assertionString = assertion.getString();
|
|
83
141
|
context.trace(`Adding the '${assertionString}' assertion to the cladic context...`);
|
|
@@ -93,6 +151,36 @@ class CladicContext extends _context.default {
|
|
|
93
151
|
this.assertions.push(assertion);
|
|
94
152
|
context.debug(`...added the '${assertionString}' assertion to the cladic context.`);
|
|
95
153
|
}
|
|
154
|
+
addStatement(statement) {
|
|
155
|
+
const context = this, statementString = statement.getString();
|
|
156
|
+
context.trace(`Adding the '${statementString}' statement to the cladic context...`);
|
|
157
|
+
const statementA = statement; ///
|
|
158
|
+
extract(this.statements, (statement)=>{
|
|
159
|
+
const statementB = statement, statementAEqualToStatementB = statementA.isEqualTo(statementB);
|
|
160
|
+
if (statementAEqualToStatementB) {
|
|
161
|
+
const statementString = statement.getString();
|
|
162
|
+
context.trace(`Removed the existing '${statementString}' statement from the cladic context...`);
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
this.statements.push(statement);
|
|
167
|
+
context.debug(`...added the '${statementString}' statement to the cladic context.`);
|
|
168
|
+
}
|
|
169
|
+
addAssumption(assumption) {
|
|
170
|
+
const context = this, assumptionString = assumption.getString();
|
|
171
|
+
context.trace(`Adding the '${assumptionString}' assumption to the cladic context...`);
|
|
172
|
+
const assumptionA = assumption; ///
|
|
173
|
+
extract(this.assumptions, (assumption)=>{
|
|
174
|
+
const assumptionB = assumption, assumptionAEqualToAssumptionB = assumptionA.isEqualTo(assumptionB);
|
|
175
|
+
if (assumptionAEqualToAssumptionB) {
|
|
176
|
+
const assumptionString = assumption.getString();
|
|
177
|
+
context.trace(`Removed the existing '${assumptionString}' assumption from the cladic context...`);
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
this.assumptions.push(assumption);
|
|
182
|
+
context.debug(`...added the '${assumptionString}' assumption to the cladic context.`);
|
|
183
|
+
}
|
|
96
184
|
addMetavariable(metavariable) {
|
|
97
185
|
const context = this, metavariableString = metavariable.getString();
|
|
98
186
|
context.trace(`Adding the '${metavariableString}' metavariable to the cladic context...`);
|
|
@@ -108,6 +196,14 @@ class CladicContext extends _context.default {
|
|
|
108
196
|
this.metavariables.push(metavariable);
|
|
109
197
|
context.debug(`...added the '${metavariableString}' metavariable to the cladic context.`);
|
|
110
198
|
}
|
|
199
|
+
addSubstitution(substitution) {
|
|
200
|
+
const context = this.getContext();
|
|
201
|
+
context.addSubstitution(substitution);
|
|
202
|
+
}
|
|
203
|
+
addAssignment(assignment) {
|
|
204
|
+
const context = this.getContext();
|
|
205
|
+
context.addAssignment(assignment);
|
|
206
|
+
}
|
|
111
207
|
addTerms(terms) {
|
|
112
208
|
terms.forEach((term)=>{
|
|
113
209
|
this.addTerm(term);
|
|
@@ -118,11 +214,31 @@ class CladicContext extends _context.default {
|
|
|
118
214
|
this.addLink(link);
|
|
119
215
|
});
|
|
120
216
|
}
|
|
217
|
+
addFrames(frames) {
|
|
218
|
+
frames.forEach((frame)=>{
|
|
219
|
+
this.addFrame(frame);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
addEqualities(equalities) {
|
|
223
|
+
equalities.forEach((equality)=>{
|
|
224
|
+
this.addEquality(equality);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
121
227
|
addAssertions(assertions) {
|
|
122
228
|
assertions.forEach((assertion)=>{
|
|
123
229
|
this.addAssertion(assertion);
|
|
124
230
|
});
|
|
125
231
|
}
|
|
232
|
+
addStatements(statements) {
|
|
233
|
+
statements.forEach((statement)=>{
|
|
234
|
+
this.addStatement(statement);
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
addAssumptions(assumptions) {
|
|
238
|
+
assumptions.forEach((assumption)=>{
|
|
239
|
+
this.addAssumption(assumption);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
126
242
|
addMetavariables(metavariables) {
|
|
127
243
|
metavariables.forEach((metavariable)=>{
|
|
128
244
|
this.addMetavariable(metavariable);
|
|
@@ -146,6 +262,24 @@ class CladicContext extends _context.default {
|
|
|
146
262
|
}) || null;
|
|
147
263
|
return link;
|
|
148
264
|
}
|
|
265
|
+
findFrameByFrameNode(frameNode) {
|
|
266
|
+
const frames = this.getFrames(), frame = frames.find((frame)=>{
|
|
267
|
+
const frameNodeMatches = frame.matchFrameNode(frameNode);
|
|
268
|
+
if (frameNodeMatches) {
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
}) || null;
|
|
272
|
+
return frame;
|
|
273
|
+
}
|
|
274
|
+
findEqualityByEqualityNode(equalityNode) {
|
|
275
|
+
const equalities = this.getEqualities(), equality = equalities.find((equality)=>{
|
|
276
|
+
const equalityNodeMatches = equality.matchEqualityNode(equalityNode);
|
|
277
|
+
if (equalityNodeMatches) {
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
}) || null;
|
|
281
|
+
return equality;
|
|
282
|
+
}
|
|
149
283
|
findAssertionByAssertionNode(assertionNode) {
|
|
150
284
|
const assertions = this.getAssertions(), assertion = assertions.find((assertion)=>{
|
|
151
285
|
const assertionNodeMatches = assertion.matchAssertionNode(assertionNode);
|
|
@@ -155,6 +289,24 @@ class CladicContext extends _context.default {
|
|
|
155
289
|
}) || null;
|
|
156
290
|
return assertion;
|
|
157
291
|
}
|
|
292
|
+
findStatementByStatementNode(statementNode) {
|
|
293
|
+
const statements = this.getStatements(), statement = statements.find((statement)=>{
|
|
294
|
+
const statementNodeMatches = statement.matchStatementNode(statementNode);
|
|
295
|
+
if (statementNodeMatches) {
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
}) || null;
|
|
299
|
+
return statement;
|
|
300
|
+
}
|
|
301
|
+
findAssumptionByAssumptionNode(assumptionNode) {
|
|
302
|
+
const assumptions = this.getAssumptions(), assumption = assumptions.find((assumption)=>{
|
|
303
|
+
const assumptionNodeMatches = assumption.matchAssumptionNode(assumptionNode);
|
|
304
|
+
if (assumptionNodeMatches) {
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
}) || null;
|
|
308
|
+
return assumption;
|
|
309
|
+
}
|
|
158
310
|
findMetavariableByMetavariableNode(metavariableNode) {
|
|
159
311
|
const metavariables = this.getMetavariables(), metavariable = metavariables.find((metavariable)=>{
|
|
160
312
|
const metavariableNodeMatches = metavariable.matchMetavariableNode(metavariableNode);
|
|
@@ -172,10 +324,26 @@ class CladicContext extends _context.default {
|
|
|
172
324
|
const link = this.findLinkByLinkNode(linkNode), linkPresent = link !== null;
|
|
173
325
|
return linkPresent;
|
|
174
326
|
}
|
|
327
|
+
isFramePresentByFrameNode(frameNode) {
|
|
328
|
+
const frame = this.findFrameByFrameNode(frameNode), framePresent = frame !== null;
|
|
329
|
+
return framePresent;
|
|
330
|
+
}
|
|
331
|
+
isEqualityPresentByEqualityNode(equalityNode) {
|
|
332
|
+
const equality = this.findEqualityByEqualityNode(equalityNode), equalityPresent = equality !== null;
|
|
333
|
+
return equalityPresent;
|
|
334
|
+
}
|
|
175
335
|
isAssertionPresentByAssertionNode(assertionNode) {
|
|
176
336
|
const assertion = this.findAssertionByAssertionNode(assertionNode), assertionPresent = assertion !== null;
|
|
177
337
|
return assertionPresent;
|
|
178
338
|
}
|
|
339
|
+
isStatementPresentByStatementNode(statementNode) {
|
|
340
|
+
const statement = this.findStatementByStatementNode(statementNode), statementPresent = statement !== null;
|
|
341
|
+
return statementPresent;
|
|
342
|
+
}
|
|
343
|
+
isAssumptionPresentByAssumptionNode(assumptionNode) {
|
|
344
|
+
const assumption = this.findAssumptionByAssumptionNode(assumptionNode), assumptionPresent = assumption !== null;
|
|
345
|
+
return assumptionPresent;
|
|
346
|
+
}
|
|
179
347
|
isMetavariablePresentByMetavariableNode(metavariableNode) {
|
|
180
348
|
const metavariablen = this.findMetavariableByMetavariableNode(metavariableNode), metavariablenPresent = metavariablen !== null;
|
|
181
349
|
return metavariablenPresent;
|
|
@@ -184,13 +352,17 @@ class CladicContext extends _context.default {
|
|
|
184
352
|
context.debug(`Merging the cladic context`);
|
|
185
353
|
context.addTerms(this.terms);
|
|
186
354
|
context.addLinks(this.links);
|
|
355
|
+
context.addFrames(this.frames);
|
|
356
|
+
context.addEqualities(this.equalities);
|
|
187
357
|
context.addAssertions(this.assertions);
|
|
358
|
+
context.addStatements(this.statements);
|
|
359
|
+
context.addAssumptions(this.assumptions);
|
|
188
360
|
context.addMetavariables(this.metavariables);
|
|
189
361
|
}
|
|
190
362
|
static fromNothing(context) {
|
|
191
|
-
const terms = [], links = [], assertions = [], metavariables = [], cladicContext = new CladicContext(context, links,
|
|
363
|
+
const terms = [], links = [], frames = [], equalities = [], statements = [], assertions = [], assumptions = [], metavariables = [], cladicContext = new CladicContext(context, terms, links, frames, equalities, assertions, statements, assumptions, metavariables);
|
|
192
364
|
return cladicContext;
|
|
193
365
|
}
|
|
194
366
|
}
|
|
195
367
|
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2NsYWRpYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5cbmNvbnN0IHsgcHVzaCwgZXh0cmFjdCB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsYWRpY0NvbnRleHQgZXh0ZW5kcyBDb250ZXh0IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgdGVybXMsIGxpbmtzLCBhc3NlcnRpb25zLCBtZXRhdmFyaWFibGVzKSB7XG4gICAgc3VwZXIoY29udGV4dCk7XG5cbiAgICB0aGlzLnRlcm1zID0gdGVybXM7XG4gICAgdGhpcy5saW5rcyA9IGxpbmtzO1xuICAgIHRoaXMuYXNzZXJ0aW9ucyA9IGFzc2VydGlvbnM7XG4gICAgdGhpcy5tZXRhdmFyaWFibGVzID0gbWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGdldFRlcm1zKHRlcm1zID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKHRlcm1zLCB0aGlzLnRlcm1zKTtcblxuICAgIGNvbnRleHQuZ2V0VGVybXModGVybXMpO1xuXG4gICAgcmV0dXJuIHRlcm1zO1xuICB9XG5cbiAgZ2V0TGlua3MobGlua3MgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2gobGlua3MsIHRoaXMubGlua3MpO1xuXG4gICAgY29udGV4dC5nZXRMaW5rcyhsaW5rcyk7XG5cbiAgICByZXR1cm4gbGlua3M7XG4gIH1cblxuICBnZXRBc3NlcnRpb25zKGFzc2VydGlvbnMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goYXNzZXJ0aW9ucywgdGhpcy5hc3NlcnRpb25zKTtcblxuICAgIGNvbnRleHQuZ2V0QXNzZXJ0aW9ucyhhc3NlcnRpb25zKTtcblxuICAgIHJldHVybiBhc3NlcnRpb25zO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlcyhtZXRhdmFyaWFibGVzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKG1ldGF2YXJpYWJsZXMsIHRoaXMubWV0YXZhcmlhYmxlcyk7XG5cbiAgICBjb250ZXh0LmdldE1ldGF2YXJpYWJsZXMobWV0YXZhcmlhYmxlcyk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGFkZFRlcm0odGVybSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gdG8gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCB0ZXJtQSA9IHRlcm07IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLnRlcm1zLCAodGVybSkgPT4ge1xuICAgICAgY29uc3QgdGVybUIgPSB0ZXJtLCAvLy9cbiAgICAgICAgdGVybUFFcXVhbFRvVGVybUIgPSB0ZXJtQS5pc0VxdWFsVG8odGVybUIpO1xuXG4gICAgICBpZiAodGVybUFFcXVhbFRvVGVybUIpIHtcbiAgICAgICAgY29uc3QgdGVybVN0cmluZyA9IHRlcm0uZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7dGVybVN0cmluZ30nIHRlcm0gZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudGVybXMucHVzaCh0ZXJtKTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRMaW5rKGxpbmspIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgbGlua1N0cmluZyA9IGxpbmsuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2xpbmtTdHJpbmd9JyBsaW5rIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgbGlua0EgPSBsaW5rOyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5saW5rcywgKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGxpbmtCID0gbGluaywgLy8vXG4gICAgICAgICAgICBsaW5rQUVxdWFsVG9MaW5rQiA9IGxpbmtBLmlzRXF1YWxUbyhsaW5rQik7XG5cbiAgICAgIGlmIChsaW5rQUVxdWFsVG9MaW5rQikge1xuICAgICAgICBjb25zdCBsaW5rU3RyaW5nID0gbGluay5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBSZW1vdmVkIHRoZSBleGlzdGluZyAnJHtsaW5rU3RyaW5nfScgbGluayBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5saW5rcy5wdXNoKGxpbmspO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2xpbmtTdHJpbmd9JyBsaW5rIHRvIHRoZSBjbGFkaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZEFzc2VydGlvbihhc3NlcnRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgYXNzZXJ0aW9uU3RyaW5nID0gYXNzZXJ0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHthc3NlcnRpb25TdHJpbmd9JyBhc3NlcnRpb24gdG8gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBhc3NlcnRpb25BID0gYXNzZXJ0aW9uOyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5hc3NlcnRpb25zLCAoYXNzZXJ0aW9uKSA9PiB7XG4gICAgICBjb25zdCBhc3NlcnRpb25CID0gYXNzZXJ0aW9uLCAvLy9cbiAgICAgICAgICAgIGFzc2VydGlvbkFFcXVhbFRvQXNzZXJ0aW9uQiA9IGFzc2VydGlvbkEuaXNFcXVhbFRvKGFzc2VydGlvbkIpO1xuXG4gICAgICBpZiAoYXNzZXJ0aW9uQUVxdWFsVG9Bc3NlcnRpb25CKSB7XG4gICAgICAgIGNvbnN0IGFzc2VydGlvblN0cmluZyA9IGFzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBSZW1vdmVkIHRoZSBleGlzdGluZyAnJHthc3NlcnRpb25TdHJpbmd9JyBhc3NlcnRpb24gZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYXNzZXJ0aW9ucy5wdXNoKGFzc2VydGlvbik7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7YXNzZXJ0aW9uU3RyaW5nfScgYXNzZXJ0aW9uIHRvIHRoZSBjbGFkaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbWV0YXZhcmlhYmxlLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgdG8gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVBID0gbWV0YXZhcmlhYmxlOyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5tZXRhdmFyaWFibGVzLCAobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGVCID0gbWV0YXZhcmlhYmxlLCAvLy9cbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZUFFcXVhbFRvTWV0YXZhcmlhYmxlQiA9IG1ldGF2YXJpYWJsZUEuaXNFcXVhbFRvKG1ldGF2YXJpYWJsZUIpO1xuXG4gICAgICBpZiAobWV0YXZhcmlhYmxlQUVxdWFsVG9NZXRhdmFyaWFibGVCKSB7XG4gICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZVN0cmluZyA9IG1ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBSZW1vdmVkIHRoZSBleGlzdGluZyAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubWV0YXZhcmlhYmxlcy5wdXNoKG1ldGF2YXJpYWJsZSk7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIHRvIHRoZSBjbGFkaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZFRlcm1zKHRlcm1zKSB7XG4gICAgdGVybXMuZm9yRWFjaCgodGVybSkgPT4ge1xuICAgICAgdGhpcy5hZGRUZXJtKHRlcm0pO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkTGlua3MobGlua3MpIHtcbiAgICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICB0aGlzLmFkZExpbmsobGluayk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRBc3NlcnRpb25zKGFzc2VydGlvbnMpIHtcbiAgICBhc3NlcnRpb25zLmZvckVhY2goKGFzc2VydGlvbikgPT4ge1xuICAgICAgdGhpcy5hZGRBc3NlcnRpb24oYXNzZXJ0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZE1ldGF2YXJpYWJsZXMobWV0YXZhcmlhYmxlcykge1xuICAgIG1ldGF2YXJpYWJsZXMuZm9yRWFjaCgobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICB0aGlzLmFkZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpO1xuICAgIH0pO1xuICB9XG5cbiAgZmluZFRlcm1CeVRlcm1Ob2RlKHRlcm1Ob2RlKSB7XG4gICAgY29uc3QgdGVybXMgPSB0aGlzLmdldFRlcm1zKCksXG4gICAgICB0ZXJtID0gdGVybXMuZmluZCgodGVybSkgPT4ge1xuICAgICAgICBjb25zdCB0ZXJtTm9kZU1hdGNoZXMgPSB0ZXJtLm1hdGNoVGVybU5vZGUodGVybU5vZGUpO1xuXG4gICAgICAgIGlmICh0ZXJtTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZmluZExpbmtCeUxpbmtOb2RlKGxpbmtOb2RlKSB7XG4gICAgY29uc3QgbGlua3MgPSB0aGlzLmdldExpbmtzKCksXG4gICAgICAgICAgbGluayA9IGxpbmtzLmZpbmQoKGxpbmspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtOb2RlTWF0Y2hlcyA9IGxpbmsubWF0Y2hMaW5rTm9kZShsaW5rTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChsaW5rTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBsaW5rO1xuICB9XG5cbiAgZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzZXJ0aW9ucyA9IHRoaXMuZ2V0QXNzZXJ0aW9ucygpLFxuICAgICAgICAgIGFzc2VydGlvbiA9IGFzc2VydGlvbnMuZmluZCgoYXNzZXJ0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3NlcnRpb25Ob2RlTWF0Y2hlcyA9IGFzc2VydGlvbi5tYXRjaEFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChhc3NlcnRpb25Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGFzc2VydGlvbjtcbiAgfVxuXG4gIGZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZXMgPSB0aGlzLmdldE1ldGF2YXJpYWJsZXMoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGUgPSBtZXRhdmFyaWFibGVzLmZpbmQoKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMgPSBtZXRhdmFyaWFibGUubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGU7XG4gIH1cblxuICBpc1Rlcm1QcmVzZW50QnlUZXJtTm9kZSh0ZXJtTm9kZSkge1xuICAgIGNvbnN0IHRlcm0gPSB0aGlzLmZpbmRUZXJtQnlUZXJtTm9kZSh0ZXJtTm9kZSksXG4gICAgICAgICAgdGVybVByZXNlbnQgPSAodGVybSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdGVybVByZXNlbnQ7XG4gIH1cblxuICBpc0xpbmtQcmVzZW50QnlMaW5rTm9kZShsaW5rTm9kZSkge1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmZpbmRMaW5rQnlMaW5rTm9kZShsaW5rTm9kZSksXG4gICAgICAgICAgbGlua1ByZXNlbnQgPSAobGluayAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbGlua1ByZXNlbnQ7XG4gIH1cblxuICBpc0Fzc2VydGlvblByZXNlbnRCeUFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSkge1xuICAgIGNvbnN0IGFzc2VydGlvbiA9IHRoaXMuZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSxcbiAgICAgICAgICBhc3NlcnRpb25QcmVzZW50ID0gKGFzc2VydGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gYXNzZXJ0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlbiA9IHRoaXMuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVuUHJlc2VudCA9IChtZXRhdmFyaWFibGVuICE9PSBudWxsKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVuUHJlc2VudDtcbiAgfVxuXG4gIG1lcmdlKGNvbnRleHQpIHtcbiAgICBjb250ZXh0LmRlYnVnKGBNZXJnaW5nIHRoZSBjbGFkaWMgY29udGV4dGApO1xuXG4gICAgY29udGV4dC5hZGRUZXJtcyh0aGlzLnRlcm1zKTtcblxuICAgIGNvbnRleHQuYWRkTGlua3ModGhpcy5saW5rcyk7XG5cbiAgICBjb250ZXh0LmFkZEFzc2VydGlvbnModGhpcy5hc3NlcnRpb25zKTtcblxuICAgIGNvbnRleHQuYWRkTWV0YXZhcmlhYmxlcyh0aGlzLm1ldGF2YXJpYWJsZXMpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Ob3RoaW5nKGNvbnRleHQpIHtcbiAgICBjb25zdCB0ZXJtcyA9IFtdLFxuICAgICAgICAgIGxpbmtzID0gW10sXG4gICAgICAgICAgYXNzZXJ0aW9ucyA9IFtdLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZXMgPSBbXSxcbiAgICAgICAgICBjbGFkaWNDb250ZXh0ID0gbmV3IENsYWRpY0NvbnRleHQoY29udGV4dCwgbGlua3MsIHRlcm1zLCBhc3NlcnRpb25zICxtZXRhdmFyaWFibGVzKTtcblxuICAgIHJldHVybiBjbGFkaWNDb250ZXh0O1xuICB9XG59XG4iXSwibmFtZXMiOlsiQ2xhZGljQ29udGV4dCIsInB1c2giLCJleHRyYWN0IiwiYXJyYXlVdGlsaXRpZXMiLCJDb250ZXh0IiwiY29udGV4dCIsInRlcm1zIiwibGlua3MiLCJhc3NlcnRpb25zIiwibWV0YXZhcmlhYmxlcyIsImdldFRlcm1zIiwiZ2V0Q29udGV4dCIsImdldExpbmtzIiwiZ2V0QXNzZXJ0aW9ucyIsImdldE1ldGF2YXJpYWJsZXMiLCJhZGRUZXJtIiwidGVybSIsInRlcm1TdHJpbmciLCJnZXRTdHJpbmciLCJ0cmFjZSIsInRlcm1BIiwidGVybUIiLCJ0ZXJtQUVxdWFsVG9UZXJtQiIsImlzRXF1YWxUbyIsImRlYnVnIiwiYWRkTGluayIsImxpbmsiLCJsaW5rU3RyaW5nIiwibGlua0EiLCJsaW5rQiIsImxpbmtBRXF1YWxUb0xpbmtCIiwiYWRkQXNzZXJ0aW9uIiwiYXNzZXJ0aW9uIiwiYXNzZXJ0aW9uU3RyaW5nIiwiYXNzZXJ0aW9uQSIsImFzc2VydGlvbkIiLCJhc3NlcnRpb25BRXF1YWxUb0Fzc2VydGlvbkIiLCJhZGRNZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVTdHJpbmciLCJtZXRhdmFyaWFibGVBIiwibWV0YXZhcmlhYmxlQiIsIm1ldGF2YXJpYWJsZUFFcXVhbFRvTWV0YXZhcmlhYmxlQiIsImFkZFRlcm1zIiwiZm9yRWFjaCIsImFkZExpbmtzIiwiYWRkQXNzZXJ0aW9ucyIsImFkZE1ldGF2YXJpYWJsZXMiLCJmaW5kVGVybUJ5VGVybU5vZGUiLCJ0ZXJtTm9kZSIsImZpbmQiLCJ0ZXJtTm9kZU1hdGNoZXMiLCJtYXRjaFRlcm1Ob2RlIiwiZmluZExpbmtCeUxpbmtOb2RlIiwibGlua05vZGUiLCJsaW5rTm9kZU1hdGNoZXMiLCJtYXRjaExpbmtOb2RlIiwiZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZSIsImFzc2VydGlvbk5vZGUiLCJhc3NlcnRpb25Ob2RlTWF0Y2hlcyIsIm1hdGNoQXNzZXJ0aW9uTm9kZSIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMiLCJtYXRjaE1ldGF2YXJpYWJsZU5vZGUiLCJpc1Rlcm1QcmVzZW50QnlUZXJtTm9kZSIsInRlcm1QcmVzZW50IiwiaXNMaW5rUHJlc2VudEJ5TGlua05vZGUiLCJsaW5rUHJlc2VudCIsImlzQXNzZXJ0aW9uUHJlc2VudEJ5QXNzZXJ0aW9uTm9kZSIsImFzc2VydGlvblByZXNlbnQiLCJpc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVuIiwibWV0YXZhcmlhYmxlblByZXNlbnQiLCJtZXJnZSIsImZyb21Ob3RoaW5nIiwiY2xhZGljQ29udGV4dCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBUUE7OztlQUFxQkE7OzsyQkFOVTtnRUFFWDs7Ozs7O0FBRXBCLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxPQUFPLEVBQUUsR0FBR0MseUJBQWM7QUFFekIsTUFBTUgsc0JBQXNCSSxnQkFBTztJQUNoRCxZQUFZQyxPQUFPLEVBQUVDLEtBQUssRUFBRUMsS0FBSyxFQUFFQyxVQUFVLEVBQUVDLGFBQWEsQ0FBRTtRQUM1RCxLQUFLLENBQUNKO1FBRU4sSUFBSSxDQUFDQyxLQUFLLEdBQUdBO1FBQ2IsSUFBSSxDQUFDQyxLQUFLLEdBQUdBO1FBQ2IsSUFBSSxDQUFDQyxVQUFVLEdBQUdBO1FBQ2xCLElBQUksQ0FBQ0MsYUFBYSxHQUFHQTtJQUN2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
|
|
368
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2NsYWRpYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5cbmNvbnN0IHsgcHVzaCwgZXh0cmFjdCB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsYWRpY0NvbnRleHQgZXh0ZW5kcyBDb250ZXh0IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgdGVybXMsIGxpbmtzLCBmcmFtZXMsIGVxdWFsaXRpZXMsIGFzc2VydGlvbnMsIHN0YXRlbWVudHMsIGFzc3VtcHRpb25zLCBtZXRhdmFyaWFibGVzKSB7XG4gICAgc3VwZXIoY29udGV4dCk7XG5cbiAgICB0aGlzLnRlcm1zID0gdGVybXM7XG4gICAgdGhpcy5saW5rcyA9IGxpbmtzO1xuICAgIHRoaXMuZnJhbWVzID0gZnJhbWVzO1xuICAgIHRoaXMuZXF1YWxpdGllcyA9IGVxdWFsaXRpZXM7XG4gICAgdGhpcy5hc3NlcnRpb25zID0gYXNzZXJ0aW9ucztcbiAgICB0aGlzLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzO1xuICAgIHRoaXMuYXNzdW1wdGlvbnMgPSBhc3N1bXB0aW9ucztcbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMgPSBtZXRhdmFyaWFibGVzO1xuICB9XG5cbiAgZ2V0VGVybXModGVybXMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2godGVybXMsIHRoaXMudGVybXMpO1xuXG4gICAgY29udGV4dC5nZXRUZXJtcyh0ZXJtcyk7XG5cbiAgICByZXR1cm4gdGVybXM7XG4gIH1cblxuICBnZXRMaW5rcyhsaW5rcyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChsaW5rcywgdGhpcy5saW5rcyk7XG5cbiAgICBjb250ZXh0LmdldExpbmtzKGxpbmtzKTtcblxuICAgIHJldHVybiBsaW5rcztcbiAgfVxuXG4gIGdldEZyYW1lcyhmcmFtZXMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goZnJhbWVzLCB0aGlzLmZyYW1lcyk7XG5cbiAgICBjb250ZXh0LmdldEZyYW1lcyhmcmFtZXMpO1xuXG4gICAgcmV0dXJuIGZyYW1lcztcbiAgfVxuXG4gIGdldEVxdWFsaXRpZXMoZXF1YWxpdGllcyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChlcXVhbGl0aWVzLCB0aGlzLmVxdWFsaXRpZXMpO1xuXG4gICAgY29udGV4dC5nZXRFcXVhbGl0aWVzKGVxdWFsaXRpZXMpO1xuXG4gICAgcmV0dXJuIGVxdWFsaXRpZXM7XG4gIH1cblxuICBnZXRTdGF0ZW1lbnRzKHN0YXRlbWVudHMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goc3RhdGVtZW50cywgdGhpcy5zdGF0ZW1lbnRzKTtcblxuICAgIGNvbnRleHQuZ2V0U3RhdGVtZW50cyhzdGF0ZW1lbnRzKTtcblxuICAgIHJldHVybiBzdGF0ZW1lbnRzO1xuICB9XG5cbiAgZ2V0QXNzZXJ0aW9ucyhhc3NlcnRpb25zID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKGFzc2VydGlvbnMsIHRoaXMuYXNzZXJ0aW9ucyk7XG5cbiAgICBjb250ZXh0LmdldEFzc2VydGlvbnMoYXNzZXJ0aW9ucyk7XG5cbiAgICByZXR1cm4gYXNzZXJ0aW9ucztcbiAgfVxuXG4gIGdldEFzc3VtcHRpb25zKGFzc3VtcHRpb25zID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKGFzc3VtcHRpb25zLCB0aGlzLmFzc3VtcHRpb25zKTtcblxuICAgIGNvbnRleHQuZ2V0QXNzdW1wdGlvbnMoYXNzdW1wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFzc3VtcHRpb25zO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlcyhtZXRhdmFyaWFibGVzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKG1ldGF2YXJpYWJsZXMsIHRoaXMubWV0YXZhcmlhYmxlcyk7XG5cbiAgICBjb250ZXh0LmdldE1ldGF2YXJpYWJsZXMobWV0YXZhcmlhYmxlcyk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGFkZFRlcm0odGVybSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gdG8gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCB0ZXJtQSA9IHRlcm07IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLnRlcm1zLCAodGVybSkgPT4ge1xuICAgICAgY29uc3QgdGVybUIgPSB0ZXJtLCAvLy9cbiAgICAgICAgICAgIHRlcm1BRXF1YWxUb1Rlcm1CID0gdGVybUEuaXNFcXVhbFRvKHRlcm1CKTtcblxuICAgICAgaWYgKHRlcm1BRXF1YWxUb1Rlcm1CKSB7XG4gICAgICAgIGNvbnN0IHRlcm1TdHJpbmcgPSB0ZXJtLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke3Rlcm1TdHJpbmd9JyB0ZXJtIGZyb20gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnRlcm1zLnB1c2godGVybSk7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkTGluayhsaW5rKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGxpbmtTdHJpbmcgPSBsaW5rLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtsaW5rU3RyaW5nfScgbGluayB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGxpbmtBID0gbGluazsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMubGlua3MsIChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rQiA9IGxpbmssIC8vL1xuICAgICAgICAgICAgbGlua0FFcXVhbFRvTGlua0IgPSBsaW5rQS5pc0VxdWFsVG8obGlua0IpO1xuXG4gICAgICBpZiAobGlua0FFcXVhbFRvTGlua0IpIHtcbiAgICAgICAgY29uc3QgbGlua1N0cmluZyA9IGxpbmsuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7bGlua1N0cmluZ30nIGxpbmsgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlua3MucHVzaChsaW5rKTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtsaW5rU3RyaW5nfScgbGluayB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRGcmFtZShmcmFtZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBmcmFtZVN0cmluZyA9IGZyYW1lLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgZnJhbWVBID0gZnJhbWU7IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLmZyYW1lcywgKGZyYW1lKSA9PiB7XG4gICAgICBjb25zdCBmcmFtZUIgPSBmcmFtZSwgLy8vXG4gICAgICAgICAgICBmcmFtZUFFcXVhbFRvRnJhbWVCID0gZnJhbWVBLmlzRXF1YWxUbyhmcmFtZUIpO1xuXG4gICAgICBpZiAoZnJhbWVBRXF1YWxUb0ZyYW1lQikge1xuICAgICAgICBjb25zdCBmcmFtZVN0cmluZyA9IGZyYW1lLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke2ZyYW1lU3RyaW5nfScgZnJhbWUgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZnJhbWVzLnB1c2goZnJhbWUpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUgdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkRXF1YWxpdHkoZXF1YWxpdHkpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgZXF1YWxpdHlTdHJpbmcgPSBlcXVhbGl0eS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7ZXF1YWxpdHlTdHJpbmd9JyBlcXVhbGl0eSB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGVxdWFsaXR5QSA9IGVxdWFsaXR5OyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5lcXVhbGl0aWVzLCAoZXF1YWxpdHkpID0+IHtcbiAgICAgIGNvbnN0IGVxdWFsaXR5QiA9IGVxdWFsaXR5LCAvLy9cbiAgICAgICAgICAgIGVxdWFsaXR5QUVxdWFsVG9FcXVhbGl0eUIgPSBlcXVhbGl0eUEuaXNFcXVhbFRvKGVxdWFsaXR5Qik7XG5cbiAgICAgIGlmIChlcXVhbGl0eUFFcXVhbFRvRXF1YWxpdHlCKSB7XG4gICAgICAgIGNvbnN0IGVxdWFsaXR5U3RyaW5nID0gZXF1YWxpdHkuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7ZXF1YWxpdHlTdHJpbmd9JyBlcXVhbGl0eSBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lcXVhbGl0aWVzLnB1c2goZXF1YWxpdHkpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2VxdWFsaXR5U3RyaW5nfScgZXF1YWxpdHkgdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkQXNzZXJ0aW9uKGFzc2VydGlvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBhc3NlcnRpb25TdHJpbmcgPSBhc3NlcnRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2Fzc2VydGlvblN0cmluZ30nIGFzc2VydGlvbiB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGFzc2VydGlvbkEgPSBhc3NlcnRpb247IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLmFzc2VydGlvbnMsIChhc3NlcnRpb24pID0+IHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbkIgPSBhc3NlcnRpb24sIC8vL1xuICAgICAgICAgICAgYXNzZXJ0aW9uQUVxdWFsVG9Bc3NlcnRpb25CID0gYXNzZXJ0aW9uQS5pc0VxdWFsVG8oYXNzZXJ0aW9uQik7XG5cbiAgICAgIGlmIChhc3NlcnRpb25BRXF1YWxUb0Fzc2VydGlvbkIpIHtcbiAgICAgICAgY29uc3QgYXNzZXJ0aW9uU3RyaW5nID0gYXNzZXJ0aW9uLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke2Fzc2VydGlvblN0cmluZ30nIGFzc2VydGlvbiBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hc3NlcnRpb25zLnB1c2goYXNzZXJ0aW9uKTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHthc3NlcnRpb25TdHJpbmd9JyBhc3NlcnRpb24gdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkU3RhdGVtZW50KHN0YXRlbWVudCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudEEgPSBzdGF0ZW1lbnQ7IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLnN0YXRlbWVudHMsIChzdGF0ZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudEIgPSBzdGF0ZW1lbnQsIC8vL1xuICAgICAgICAgICAgc3RhdGVtZW50QUVxdWFsVG9TdGF0ZW1lbnRCID0gc3RhdGVtZW50QS5pc0VxdWFsVG8oc3RhdGVtZW50Qik7XG5cbiAgICAgIGlmIChzdGF0ZW1lbnRBRXF1YWxUb1N0YXRlbWVudEIpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkQXNzdW1wdGlvbihhc3N1bXB0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGFzc3VtcHRpb25TdHJpbmcgPSBhc3N1bXB0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHthc3N1bXB0aW9uU3RyaW5nfScgYXNzdW1wdGlvbiB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGFzc3VtcHRpb25BID0gYXNzdW1wdGlvbjsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMuYXNzdW1wdGlvbnMsIChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICBjb25zdCBhc3N1bXB0aW9uQiA9IGFzc3VtcHRpb24sIC8vL1xuICAgICAgICAgICAgYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIgPSBhc3N1bXB0aW9uQS5pc0VxdWFsVG8oYXNzdW1wdGlvbkIpO1xuXG4gICAgICBpZiAoYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIpIHtcbiAgICAgICAgY29uc3QgYXNzdW1wdGlvblN0cmluZyA9IGFzc3VtcHRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7YXNzdW1wdGlvblN0cmluZ30nIGFzc3VtcHRpb24gZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYXNzdW1wdGlvbnMucHVzaChhc3N1bXB0aW9uKTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHthc3N1bXB0aW9uU3RyaW5nfScgYXNzdW1wdGlvbiB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IG1ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlQSA9IG1ldGF2YXJpYWJsZTsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMubWV0YXZhcmlhYmxlcywgKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlQiA9IG1ldGF2YXJpYWJsZSwgLy8vXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVBRXF1YWxUb01ldGF2YXJpYWJsZUIgPSBtZXRhdmFyaWFibGVBLmlzRXF1YWxUbyhtZXRhdmFyaWFibGVCKTtcblxuICAgICAgaWYgKG1ldGF2YXJpYWJsZUFFcXVhbFRvTWV0YXZhcmlhYmxlQikge1xuICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSBtZXRhdmFyaWFibGUuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIGZyb20gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMucHVzaChtZXRhdmFyaWFibGUpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgY29udGV4dC5hZGRTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uKTtcbiAgfVxuXG4gIGFkZEFzc2lnbm1lbnQoYXNzaWdubWVudCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIGNvbnRleHQuYWRkQXNzaWdubWVudChhc3NpZ25tZW50KTtcbiAgfVxuXG4gIGFkZFRlcm1zKHRlcm1zKSB7XG4gICAgdGVybXMuZm9yRWFjaCgodGVybSkgPT4ge1xuICAgICAgdGhpcy5hZGRUZXJtKHRlcm0pO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkTGlua3MobGlua3MpIHtcbiAgICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICB0aGlzLmFkZExpbmsobGluayk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRGcmFtZXMoZnJhbWVzKSB7XG4gICAgZnJhbWVzLmZvckVhY2goKGZyYW1lKSA9PiB7XG4gICAgICB0aGlzLmFkZEZyYW1lKGZyYW1lKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEVxdWFsaXRpZXMoZXF1YWxpdGllcykge1xuICAgIGVxdWFsaXRpZXMuZm9yRWFjaCgoZXF1YWxpdHkpID0+IHtcbiAgICAgIHRoaXMuYWRkRXF1YWxpdHkoZXF1YWxpdHkpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkQXNzZXJ0aW9ucyhhc3NlcnRpb25zKSB7XG4gICAgYXNzZXJ0aW9ucy5mb3JFYWNoKChhc3NlcnRpb24pID0+IHtcbiAgICAgIHRoaXMuYWRkQXNzZXJ0aW9uKGFzc2VydGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBhZGRTdGF0ZW1lbnRzKHN0YXRlbWVudHMpIHtcbiAgICBzdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCkgPT4ge1xuICAgICAgdGhpcy5hZGRTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEFzc3VtcHRpb25zKGFzc3VtcHRpb25zKSB7XG4gICAgYXNzdW1wdGlvbnMuZm9yRWFjaCgoYXNzdW1wdGlvbikgPT4ge1xuICAgICAgdGhpcy5hZGRBc3N1bXB0aW9uKGFzc3VtcHRpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkTWV0YXZhcmlhYmxlcyhtZXRhdmFyaWFibGVzKSB7XG4gICAgbWV0YXZhcmlhYmxlcy5mb3JFYWNoKChtZXRhdmFyaWFibGUpID0+IHtcbiAgICAgIHRoaXMuYWRkTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSk7XG4gICAgfSk7XG4gIH1cblxuICBmaW5kVGVybUJ5VGVybU5vZGUodGVybU5vZGUpIHtcbiAgICBjb25zdCB0ZXJtcyA9IHRoaXMuZ2V0VGVybXMoKSxcbiAgICAgICAgICB0ZXJtID0gdGVybXMuZmluZCgodGVybSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGVybU5vZGVNYXRjaGVzID0gdGVybS5tYXRjaFRlcm1Ob2RlKHRlcm1Ob2RlKTtcblxuICAgICAgICAgICAgaWYgKHRlcm1Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBmaW5kTGlua0J5TGlua05vZGUobGlua05vZGUpIHtcbiAgICBjb25zdCBsaW5rcyA9IHRoaXMuZ2V0TGlua3MoKSxcbiAgICAgICAgICBsaW5rID0gbGlua3MuZmluZCgobGluaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGlua05vZGVNYXRjaGVzID0gbGluay5tYXRjaExpbmtOb2RlKGxpbmtOb2RlKTtcblxuICAgICAgICAgICAgaWYgKGxpbmtOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGxpbms7XG4gIH1cblxuICBmaW5kRnJhbWVCeUZyYW1lTm9kZShmcmFtZU5vZGUpIHtcbiAgICBjb25zdCBmcmFtZXMgPSB0aGlzLmdldEZyYW1lcygpLFxuICAgICAgICAgIGZyYW1lID0gZnJhbWVzLmZpbmQoKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmcmFtZU5vZGVNYXRjaGVzID0gZnJhbWUubWF0Y2hGcmFtZU5vZGUoZnJhbWVOb2RlKTtcblxuICAgICAgICAgICAgaWYgKGZyYW1lTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBmcmFtZTtcbiAgfVxuXG4gIGZpbmRFcXVhbGl0eUJ5RXF1YWxpdHlOb2RlKGVxdWFsaXR5Tm9kZSkge1xuICAgIGNvbnN0IGVxdWFsaXRpZXMgPSB0aGlzLmdldEVxdWFsaXRpZXMoKSxcbiAgICAgICAgICBlcXVhbGl0eSA9IGVxdWFsaXRpZXMuZmluZCgoZXF1YWxpdHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVxdWFsaXR5Tm9kZU1hdGNoZXMgPSBlcXVhbGl0eS5tYXRjaEVxdWFsaXR5Tm9kZShlcXVhbGl0eU5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoZXF1YWxpdHlOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGVxdWFsaXR5O1xuICB9XG5cbiAgZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzZXJ0aW9ucyA9IHRoaXMuZ2V0QXNzZXJ0aW9ucygpLFxuICAgICAgICAgIGFzc2VydGlvbiA9IGFzc2VydGlvbnMuZmluZCgoYXNzZXJ0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3NlcnRpb25Ob2RlTWF0Y2hlcyA9IGFzc2VydGlvbi5tYXRjaEFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChhc3NlcnRpb25Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGFzc2VydGlvbjtcbiAgfVxuXG4gIGZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSkge1xuICAgIGNvbnN0IHN0YXRlbWVudHMgPSB0aGlzLmdldFN0YXRlbWVudHMoKSxcbiAgICAgICAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzLmZpbmQoKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVtZW50Tm9kZU1hdGNoZXMgPSBzdGF0ZW1lbnQubWF0Y2hTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoc3RhdGVtZW50Tm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBzdGF0ZW1lbnQ7XG4gIH1cblxuICBmaW5kQXNzdW1wdGlvbkJ5QXNzdW1wdGlvbk5vZGUoYXNzdW1wdGlvbk5vZGUpIHtcbiAgICBjb25zdCBhc3N1bXB0aW9ucyA9IHRoaXMuZ2V0QXNzdW1wdGlvbnMoKSxcbiAgICAgICAgICBhc3N1bXB0aW9uID0gYXNzdW1wdGlvbnMuZmluZCgoYXNzdW1wdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXNzdW1wdGlvbk5vZGVNYXRjaGVzID0gYXNzdW1wdGlvbi5tYXRjaEFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKTtcblxuICAgICAgICAgICAgaWYgKGFzc3VtcHRpb25Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGFzc3VtcHRpb247XG4gIH1cblxuICBmaW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVzID0gdGhpcy5nZXRNZXRhdmFyaWFibGVzKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlcy5maW5kKChtZXRhdmFyaWFibGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzID0gbWV0YXZhcmlhYmxlLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgICAgICAgaWYgKG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG5cbiAgaXNUZXJtUHJlc2VudEJ5VGVybU5vZGUodGVybU5vZGUpIHtcbiAgICBjb25zdCB0ZXJtID0gdGhpcy5maW5kVGVybUJ5VGVybU5vZGUodGVybU5vZGUpLFxuICAgICAgICAgIHRlcm1QcmVzZW50ID0gKHRlcm0gIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHRlcm1QcmVzZW50O1xuICB9XG5cbiAgaXNMaW5rUHJlc2VudEJ5TGlua05vZGUobGlua05vZGUpIHtcbiAgICBjb25zdCBsaW5rID0gdGhpcy5maW5kTGlua0J5TGlua05vZGUobGlua05vZGUpLFxuICAgICAgICAgIGxpbmtQcmVzZW50ID0gKGxpbmsgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGxpbmtQcmVzZW50O1xuICB9XG5cbiAgaXNGcmFtZVByZXNlbnRCeUZyYW1lTm9kZShmcmFtZU5vZGUpIHtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuZmluZEZyYW1lQnlGcmFtZU5vZGUoZnJhbWVOb2RlKSxcbiAgICAgICAgICBmcmFtZVByZXNlbnQgPSAoZnJhbWUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGZyYW1lUHJlc2VudDtcbiAgfVxuXG4gIGlzRXF1YWxpdHlQcmVzZW50QnlFcXVhbGl0eU5vZGUoZXF1YWxpdHlOb2RlKSB7XG4gICAgY29uc3QgZXF1YWxpdHkgPSB0aGlzLmZpbmRFcXVhbGl0eUJ5RXF1YWxpdHlOb2RlKGVxdWFsaXR5Tm9kZSksXG4gICAgICAgICAgZXF1YWxpdHlQcmVzZW50ID0gKGVxdWFsaXR5ICE9PSBudWxsKTtcblxuICAgIHJldHVybiBlcXVhbGl0eVByZXNlbnQ7XG4gIH1cblxuICBpc0Fzc2VydGlvblByZXNlbnRCeUFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSkge1xuICAgIGNvbnN0IGFzc2VydGlvbiA9IHRoaXMuZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSxcbiAgICAgICAgICBhc3NlcnRpb25QcmVzZW50ID0gKGFzc2VydGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gYXNzZXJ0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzU3RhdGVtZW50UHJlc2VudEJ5U3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5maW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIHN0YXRlbWVudFByZXNlbnQgPSAoc3RhdGVtZW50ICE9PSBudWxsKTtcblxuICAgIHJldHVybiBzdGF0ZW1lbnRQcmVzZW50O1xuICB9XG5cbiAgaXNBc3N1bXB0aW9uUHJlc2VudEJ5QXNzdW1wdGlvbk5vZGUoYXNzdW1wdGlvbk5vZGUpIHtcbiAgICBjb25zdCBhc3N1bXB0aW9uID0gdGhpcy5maW5kQXNzdW1wdGlvbkJ5QXNzdW1wdGlvbk5vZGUoYXNzdW1wdGlvbk5vZGUpLFxuICAgICAgICAgIGFzc3VtcHRpb25QcmVzZW50ID0gKGFzc3VtcHRpb24gIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGFzc3VtcHRpb25QcmVzZW50O1xuICB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVuID0gdGhpcy5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZW5QcmVzZW50ID0gKG1ldGF2YXJpYWJsZW4gIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZW5QcmVzZW50O1xuICB9XG5cbiAgbWVyZ2UoY29udGV4dCkge1xuICAgIGNvbnRleHQuZGVidWcoYE1lcmdpbmcgdGhlIGNsYWRpYyBjb250ZXh0YCk7XG5cbiAgICBjb250ZXh0LmFkZFRlcm1zKHRoaXMudGVybXMpO1xuXG4gICAgY29udGV4dC5hZGRMaW5rcyh0aGlzLmxpbmtzKTtcblxuICAgIGNvbnRleHQuYWRkRnJhbWVzKHRoaXMuZnJhbWVzKTtcblxuICAgIGNvbnRleHQuYWRkRXF1YWxpdGllcyh0aGlzLmVxdWFsaXRpZXMpO1xuXG4gICAgY29udGV4dC5hZGRBc3NlcnRpb25zKHRoaXMuYXNzZXJ0aW9ucyk7XG5cbiAgICBjb250ZXh0LmFkZFN0YXRlbWVudHModGhpcy5zdGF0ZW1lbnRzKTtcblxuICAgIGNvbnRleHQuYWRkQXNzdW1wdGlvbnModGhpcy5hc3N1bXB0aW9ucyk7XG5cbiAgICBjb250ZXh0LmFkZE1ldGF2YXJpYWJsZXModGhpcy5tZXRhdmFyaWFibGVzKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tTm90aGluZyhjb250ZXh0KSB7XG4gICAgY29uc3QgdGVybXMgPSBbXSxcbiAgICAgICAgICBsaW5rcyA9IFtdLFxuICAgICAgICAgIGZyYW1lcyA9IFtdLFxuICAgICAgICAgIGVxdWFsaXRpZXMgPSBbXSxcbiAgICAgICAgICBzdGF0ZW1lbnRzID0gW10sXG4gICAgICAgICAgYXNzZXJ0aW9ucyA9IFtdLFxuICAgICAgICAgIGFzc3VtcHRpb25zID0gW10sXG4gICAgICAgICAgbWV0YXZhcmlhYmxlcyA9IFtdLFxuICAgICAgICAgIGNsYWRpY0NvbnRleHQgPSBuZXcgQ2xhZGljQ29udGV4dChjb250ZXh0LCB0ZXJtcywgbGlua3MsIGZyYW1lcywgZXF1YWxpdGllcywgYXNzZXJ0aW9ucywgc3RhdGVtZW50cywgYXNzdW1wdGlvbnMsIG1ldGF2YXJpYWJsZXMpO1xuICAgIHJldHVybiBjbGFkaWNDb250ZXh0O1xuICB9XG59XG4iXSwibmFtZXMiOlsiQ2xhZGljQ29udGV4dCIsInB1c2giLCJleHRyYWN0IiwiYXJyYXlVdGlsaXRpZXMiLCJDb250ZXh0IiwiY29udGV4dCIsInRlcm1zIiwibGlua3MiLCJmcmFtZXMiLCJlcXVhbGl0aWVzIiwiYXNzZXJ0aW9ucyIsInN0YXRlbWVudHMiLCJhc3N1bXB0aW9ucyIsIm1ldGF2YXJpYWJsZXMiLCJnZXRUZXJtcyIsImdldENvbnRleHQiLCJnZXRMaW5rcyIsImdldEZyYW1lcyIsImdldEVxdWFsaXRpZXMiLCJnZXRTdGF0ZW1lbnRzIiwiZ2V0QXNzZXJ0aW9ucyIsImdldEFzc3VtcHRpb25zIiwiZ2V0TWV0YXZhcmlhYmxlcyIsImFkZFRlcm0iLCJ0ZXJtIiwidGVybVN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwidGVybUEiLCJ0ZXJtQiIsInRlcm1BRXF1YWxUb1Rlcm1CIiwiaXNFcXVhbFRvIiwiZGVidWciLCJhZGRMaW5rIiwibGluayIsImxpbmtTdHJpbmciLCJsaW5rQSIsImxpbmtCIiwibGlua0FFcXVhbFRvTGlua0IiLCJhZGRGcmFtZSIsImZyYW1lIiwiZnJhbWVTdHJpbmciLCJmcmFtZUEiLCJmcmFtZUIiLCJmcmFtZUFFcXVhbFRvRnJhbWVCIiwiYWRkRXF1YWxpdHkiLCJlcXVhbGl0eSIsImVxdWFsaXR5U3RyaW5nIiwiZXF1YWxpdHlBIiwiZXF1YWxpdHlCIiwiZXF1YWxpdHlBRXF1YWxUb0VxdWFsaXR5QiIsImFkZEFzc2VydGlvbiIsImFzc2VydGlvbiIsImFzc2VydGlvblN0cmluZyIsImFzc2VydGlvbkEiLCJhc3NlcnRpb25CIiwiYXNzZXJ0aW9uQUVxdWFsVG9Bc3NlcnRpb25CIiwiYWRkU3RhdGVtZW50Iiwic3RhdGVtZW50Iiwic3RhdGVtZW50U3RyaW5nIiwic3RhdGVtZW50QSIsInN0YXRlbWVudEIiLCJzdGF0ZW1lbnRBRXF1YWxUb1N0YXRlbWVudEIiLCJhZGRBc3N1bXB0aW9uIiwiYXNzdW1wdGlvbiIsImFzc3VtcHRpb25TdHJpbmciLCJhc3N1bXB0aW9uQSIsImFzc3VtcHRpb25CIiwiYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIiLCJhZGRNZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVTdHJpbmciLCJtZXRhdmFyaWFibGVBIiwibWV0YXZhcmlhYmxlQiIsIm1ldGF2YXJpYWJsZUFFcXVhbFRvTWV0YXZhcmlhYmxlQiIsImFkZFN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsImFkZEFzc2lnbm1lbnQiLCJhc3NpZ25tZW50IiwiYWRkVGVybXMiLCJmb3JFYWNoIiwiYWRkTGlua3MiLCJhZGRGcmFtZXMiLCJhZGRFcXVhbGl0aWVzIiwiYWRkQXNzZXJ0aW9ucyIsImFkZFN0YXRlbWVudHMiLCJhZGRBc3N1bXB0aW9ucyIsImFkZE1ldGF2YXJpYWJsZXMiLCJmaW5kVGVybUJ5VGVybU5vZGUiLCJ0ZXJtTm9kZSIsImZpbmQiLCJ0ZXJtTm9kZU1hdGNoZXMiLCJtYXRjaFRlcm1Ob2RlIiwiZmluZExpbmtCeUxpbmtOb2RlIiwibGlua05vZGUiLCJsaW5rTm9kZU1hdGNoZXMiLCJtYXRjaExpbmtOb2RlIiwiZmluZEZyYW1lQnlGcmFtZU5vZGUiLCJmcmFtZU5vZGUiLCJmcmFtZU5vZGVNYXRjaGVzIiwibWF0Y2hGcmFtZU5vZGUiLCJmaW5kRXF1YWxpdHlCeUVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5Tm9kZU1hdGNoZXMiLCJtYXRjaEVxdWFsaXR5Tm9kZSIsImZpbmRBc3NlcnRpb25CeUFzc2VydGlvbk5vZGUiLCJhc3NlcnRpb25Ob2RlIiwiYXNzZXJ0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaEFzc2VydGlvbk5vZGUiLCJmaW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50Tm9kZSIsInN0YXRlbWVudE5vZGVNYXRjaGVzIiwibWF0Y2hTdGF0ZW1lbnROb2RlIiwiZmluZEFzc3VtcHRpb25CeUFzc3VtcHRpb25Ob2RlIiwiYXNzdW1wdGlvbk5vZGUiLCJhc3N1bXB0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaEFzc3VtcHRpb25Ob2RlIiwiZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsImlzVGVybVByZXNlbnRCeVRlcm1Ob2RlIiwidGVybVByZXNlbnQiLCJpc0xpbmtQcmVzZW50QnlMaW5rTm9kZSIsImxpbmtQcmVzZW50IiwiaXNGcmFtZVByZXNlbnRCeUZyYW1lTm9kZSIsImZyYW1lUHJlc2VudCIsImlzRXF1YWxpdHlQcmVzZW50QnlFcXVhbGl0eU5vZGUiLCJlcXVhbGl0eVByZXNlbnQiLCJpc0Fzc2VydGlvblByZXNlbnRCeUFzc2VydGlvbk5vZGUiLCJhc3NlcnRpb25QcmVzZW50IiwiaXNTdGF0ZW1lbnRQcmVzZW50QnlTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50UHJlc2VudCIsImlzQXNzdW1wdGlvblByZXNlbnRCeUFzc3VtcHRpb25Ob2RlIiwiYXNzdW1wdGlvblByZXNlbnQiLCJpc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVuIiwibWV0YXZhcmlhYmxlblByZXNlbnQiLCJtZXJnZSIsImZyb21Ob3RoaW5nIiwiY2xhZGljQ29udGV4dCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBUUE7OztlQUFxQkE7OzsyQkFOVTtnRUFFWDs7Ozs7O0FBRXBCLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxPQUFPLEVBQUUsR0FBR0MseUJBQWM7QUFFekIsTUFBTUgsc0JBQXNCSSxnQkFBTztJQUNoRCxZQUFZQyxPQUFPLEVBQUVDLEtBQUssRUFBRUMsS0FBSyxFQUFFQyxNQUFNLEVBQUVDLFVBQVUsRUFBRUMsVUFBVSxFQUFFQyxVQUFVLEVBQUVDLFdBQVcsRUFBRUMsYUFBYSxDQUFFO1FBQ3pHLEtBQUssQ0FBQ1I7UUFFTixJQUFJLENBQUNDLEtBQUssR0FBR0E7UUFDYixJQUFJLENBQUNDLEtBQUssR0FBR0E7UUFDYixJQUFJLENBQUNDLE1BQU0sR0FBR0E7UUFDZCxJQUFJLENBQUNDLFVBQVUsR0FBR0E7UUFDbEIsSUFBSSxDQUFDQyxVQUFVLEdBQUdBO1FBQ2xCLElBQUksQ0FBQ0MsVUFBVSxHQUFHQTtRQUNsQixJQUFJLENBQUNDLFdBQVcsR0FBR0E7UUFDbkIsSUFBSSxDQUFDQyxhQUFhLEdBQUdBO0lBQ3ZCO0lBRUFDLFNBQVNSLFFBQVEsRUFBRSxFQUFFO1FBQ25CLE1BQU1ELFVBQVUsSUFBSSxDQUFDVSxVQUFVO1FBRS9CZCxLQUFLSyxPQUFPLElBQUksQ0FBQ0EsS0FBSztRQUV0QkQsUUFBUVMsUUFBUSxDQUFDUjtRQUVqQixPQUFPQTtJQUNUO0lBRUFVLFNBQVNULFFBQVEsRUFBRSxFQUFFO1FBQ25CLE1BQU1GLFVBQVUsSUFBSSxDQUFDVSxVQUFVO1FBRS9CZCxLQUFLTSxPQUFPLElBQUksQ0FBQ0EsS0FBSztRQUV0QkYsUUFBUVcsUUFBUSxDQUFDVDtRQUVqQixPQUFPQTtJ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
|