occam-nominal 1.0.336 → 1.0.340
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.js +5 -1
- package/lib/element/assumption.js +134 -111
- package/lib/element/constraint.js +114 -102
- package/lib/element/goal.js +65 -55
- package/lib/element/hypothesis.js +2 -2
- package/lib/element/judgement.js +13 -14
- package/lib/element/label.js +24 -21
- package/lib/element/metaType.js +2 -2
- package/lib/element/metavariable.js +25 -26
- package/lib/element/parameter.js +2 -2
- package/lib/element/procedureCall.js +2 -2
- package/lib/element/procedureReference.js +2 -2
- package/lib/element/reference.js +25 -22
- package/lib/element/schema.js +165 -154
- package/lib/element/signature.js +2 -2
- package/lib/element/statement.js +4 -2
- package/lib/element/substitution/reference.js +22 -29
- package/lib/element/typePrefix.js +2 -2
- package/lib/process/unification.js +36 -42
- package/package.json +3 -3
- package/src/context.js +6 -0
- package/src/element/assumption.js +158 -132
- package/src/element/constraint.js +134 -125
- package/src/element/goal.js +79 -72
- package/src/element/hypothesis.js +2 -2
- package/src/element/judgement.js +18 -20
- package/src/element/label.js +25 -24
- package/src/element/metaType.js +2 -2
- package/src/element/metavariable.js +32 -31
- package/src/element/parameter.js +2 -2
- package/src/element/procedureCall.js +2 -2
- package/src/element/procedureReference.js +2 -2
- package/src/element/reference.js +26 -25
- package/src/element/schema.js +193 -195
- package/src/element/signature.js +2 -2
- package/src/element/statement.js +6 -2
- package/src/element/substitution/reference.js +22 -35
- package/src/element/typePrefix.js +2 -2
- package/src/process/unification.js +39 -54
|
@@ -10,13 +10,14 @@ Object.defineProperty(exports, "default", {
|
|
|
10
10
|
});
|
|
11
11
|
const _occamlanguages = require("occam-languages");
|
|
12
12
|
const _elements = require("../elements");
|
|
13
|
+
const _continuation = require("../utilities/continuation");
|
|
13
14
|
const _unify = require("../process/unify");
|
|
14
15
|
const _instantiate = require("../process/instantiate");
|
|
15
16
|
const _brackets = require("../utilities/brackets");
|
|
16
17
|
const _element = require("../utilities/element");
|
|
17
18
|
const _string = require("../utilities/string");
|
|
18
19
|
const _context = require("../utilities/context");
|
|
19
|
-
const { breakPointFromJSON, breakPointToBreakPointJSON } = _occamlanguages.breakPointUtilities;
|
|
20
|
+
const { some } = _occamlanguages.continuationUtilities, { breakPointFromJSON, breakPointToBreakPointJSON } = _occamlanguages.breakPointUtilities;
|
|
20
21
|
const _default = (0, _elements.define)(class Constraint extends _occamlanguages.Element {
|
|
21
22
|
constructor(context, string, node, breakPoint, reference, statement){
|
|
22
23
|
super(context, string, node, breakPoint);
|
|
@@ -48,84 +49,88 @@ const _default = (0, _elements.define)(class Constraint extends _occamlanguages.
|
|
|
48
49
|
const constraintNode = this.getConstraintNode(), constraint = context.findConstraintByConstraintNode(constraintNode), validConstraint = constraint; ///
|
|
49
50
|
return validConstraint;
|
|
50
51
|
}
|
|
51
|
-
|
|
52
|
-
let constraint = null;
|
|
52
|
+
validate(context, continuation) {
|
|
53
53
|
const constraintString = this.getString(); ///
|
|
54
54
|
context.trace(`Validating the '${constraintString}' constraint...`);
|
|
55
|
-
let validates = false;
|
|
56
55
|
const validConstraint = this.findValidConstraint(context);
|
|
57
56
|
if (validConstraint !== null) {
|
|
58
|
-
|
|
59
|
-
constraint = validConstraint; ///
|
|
57
|
+
const constraint = validConstraint; ///
|
|
60
58
|
context.debug(`...the '${constraintString}' constraint is already valid.`);
|
|
59
|
+
return continuation(constraint);
|
|
61
60
|
} else {
|
|
62
|
-
const temporaryContext = context; ///
|
|
63
61
|
context = this.getContext();
|
|
64
62
|
(0, _context.attempt)((context)=>{
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
63
|
+
const validateStatement = this.validateStatement.bind(this), validateReference = this.validateReference.bind(this);
|
|
64
|
+
return (0, _continuation.all)([
|
|
65
|
+
validateStatement,
|
|
66
|
+
validateReference
|
|
67
|
+
], context, (validates)=>{
|
|
68
|
+
if (!validates) {
|
|
69
|
+
const constraint = null;
|
|
70
|
+
return continuation(constraint);
|
|
71
|
+
}
|
|
72
|
+
const validateWhenStated = this.validateWhenStated.bind(this), validateWhenDerived = this.validateWhenDerived.bind(this);
|
|
73
|
+
return (0, _continuation.exists)([
|
|
74
|
+
validateWhenStated,
|
|
75
|
+
validateWhenDerived
|
|
76
|
+
], context, (validates)=>{
|
|
77
|
+
let constraint = null;
|
|
78
|
+
if (validates) {
|
|
79
|
+
constraint = this; ///
|
|
80
|
+
context.addConstraint(constraint);
|
|
75
81
|
}
|
|
76
|
-
if (
|
|
77
|
-
|
|
82
|
+
if (validates) {
|
|
83
|
+
this.commit(context);
|
|
78
84
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
85
|
+
if (validates) {
|
|
86
|
+
context.debug(`...validated the '${constraintString}' constraint.`);
|
|
87
|
+
}
|
|
88
|
+
return continuation(constraint);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
84
91
|
}, context);
|
|
85
|
-
context = temporaryContext; ///
|
|
86
|
-
if (validates) {
|
|
87
|
-
constraint = this; ///
|
|
88
|
-
context.addConstraint(constraint);
|
|
89
|
-
}
|
|
90
92
|
}
|
|
91
|
-
if (validates) {
|
|
92
|
-
context.debug(`...validated the '${constraintString}' constraint.`);
|
|
93
|
-
}
|
|
94
|
-
return constraint;
|
|
95
93
|
}
|
|
96
|
-
validateReference(context) {
|
|
94
|
+
validateReference(context, continuation) {
|
|
97
95
|
let referenceValidates = false;
|
|
98
96
|
const constraintString = this.getString(); ///
|
|
99
97
|
context.trace(`Validating the '${constraintString}' constraint's reference...`);
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
98
|
+
this.reference.validate(context, (reference)=>{
|
|
99
|
+
if (reference !== null) {
|
|
100
|
+
const metavariable = this.reference.getMetavariable(), metavariableDeclared = metavariable.isDeclared();
|
|
101
|
+
if (metavariableDeclared) {
|
|
102
|
+
this.reference = reference;
|
|
103
|
+
referenceValidates = true;
|
|
104
|
+
}
|
|
106
105
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
106
|
+
if (referenceValidates) {
|
|
107
|
+
context.debug(`...validated the '${constraintString}' constraint's reference.`);
|
|
108
|
+
}
|
|
109
|
+
return continuation(referenceValidates);
|
|
110
|
+
});
|
|
112
111
|
}
|
|
113
|
-
|
|
114
|
-
let statementValidates = false;
|
|
112
|
+
validateStatement(context, continuation) {
|
|
115
113
|
const constraintString = this.getString(); ///
|
|
116
114
|
context.trace(`Validating the '${constraintString}' constraint's statement...`);
|
|
117
|
-
(0, _context.descend)(
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
115
|
+
(0, _context.descend)((context)=>{
|
|
116
|
+
this.statement.validate(context, (statement)=>{
|
|
117
|
+
let statementValidates = false;
|
|
118
|
+
if (statement !== null) {
|
|
119
|
+
statementValidates = true;
|
|
120
|
+
}
|
|
121
|
+
if (statementValidates) {
|
|
122
|
+
context.debug(`...validated the '${constraintString}' constraint's statement.`);
|
|
123
|
+
}
|
|
124
|
+
return continuation(statementValidates);
|
|
125
|
+
});
|
|
122
126
|
}, context);
|
|
123
|
-
if (statementValidates) {
|
|
124
|
-
context.debug(`...validated the '${constraintString}' constraint's statement.`);
|
|
125
|
-
}
|
|
126
|
-
return statementValidates;
|
|
127
127
|
}
|
|
128
|
-
validateWhenStated(context) {
|
|
128
|
+
validateWhenStated(context, continuation) {
|
|
129
|
+
const stated = context.isStated();
|
|
130
|
+
if (!stated) {
|
|
131
|
+
const validatesWhenStated = false;
|
|
132
|
+
return continuation(validatesWhenStated);
|
|
133
|
+
}
|
|
129
134
|
let validatesWhenStated;
|
|
130
135
|
const constraintString = this.getString(); ///
|
|
131
136
|
context.trace(`Validating the '${constraintString}' stated constraint...`);
|
|
@@ -133,9 +138,14 @@ const _default = (0, _elements.define)(class Constraint extends _occamlanguages.
|
|
|
133
138
|
if (validatesWhenStated) {
|
|
134
139
|
context.debug(`...validated the '${constraintString}' stated constraint.`);
|
|
135
140
|
}
|
|
136
|
-
return validatesWhenStated;
|
|
141
|
+
return continuation(validatesWhenStated);
|
|
137
142
|
}
|
|
138
|
-
validateWhenDerived(context) {
|
|
143
|
+
validateWhenDerived(context, continuation) {
|
|
144
|
+
const stated = context.isStated();
|
|
145
|
+
if (stated) {
|
|
146
|
+
const validatesWhenDerived = false;
|
|
147
|
+
return continuation(validatesWhenDerived);
|
|
148
|
+
}
|
|
139
149
|
let validatesWhenDerived;
|
|
140
150
|
const constraintString = this.getString(); ///
|
|
141
151
|
context.trace(`Validating the '${constraintString}' derived constraint...`);
|
|
@@ -143,62 +153,64 @@ const _default = (0, _elements.define)(class Constraint extends _occamlanguages.
|
|
|
143
153
|
if (validatesWhenDerived) {
|
|
144
154
|
context.debug(`...validated the '${constraintString}' derived constraint.`);
|
|
145
155
|
}
|
|
146
|
-
return validatesWhenDerived;
|
|
147
|
-
}
|
|
148
|
-
unifyReference(reference, generalContext, specificContext) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
156
|
+
return continuation(validatesWhenDerived);
|
|
157
|
+
}
|
|
158
|
+
unifyReference(reference, generalContext, specificContext, continuation) {
|
|
159
|
+
if (reference === null) {
|
|
160
|
+
const referenceUnifies = true; ///
|
|
161
|
+
return continuation(referenceUnifies);
|
|
162
|
+
}
|
|
163
|
+
const context = specificContext, referenceString = reference.getString(), constraintString = this.getString(); ///
|
|
164
|
+
context.trace(`Unifying the '${referenceString}' reference with the '${constraintString}' constraint's reference...`);
|
|
165
|
+
const metavariable = this.getMetavariable();
|
|
166
|
+
return metavariable.unifyReference(reference, generalContext, specificContext, (referenceUnifies)=>{
|
|
155
167
|
if (referenceUnifies) {
|
|
156
168
|
context.debug(`..unified the '${referenceString}' with the '${constraintString}' constraint's reference.`);
|
|
157
169
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
return referenceUnifies;
|
|
170
|
+
return continuation(referenceUnifies);
|
|
171
|
+
});
|
|
162
172
|
}
|
|
163
|
-
|
|
164
|
-
let statementUnifies;
|
|
173
|
+
unifyStatement(statement, generalContext, specificContext, continuation) {
|
|
165
174
|
const context = specificContext, statementString = statement.getString(), constraintString = this.getString(); ///
|
|
166
175
|
context.trace(`Unifying the '${statementString}' statement with the '${constraintString}' constraint's statement...`);
|
|
167
176
|
const generalStatement = this.statement, specificStatement = (0, _brackets.stripBracketsFromStatement)(statement, context); ///
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
177
|
+
return (0, _unify.unifyStatement)(generalStatement, specificStatement, generalContext, specificContext, (statementUnifies)=>{
|
|
178
|
+
if (statementUnifies) {
|
|
179
|
+
context.debug(`...unified the '${statementString}' statement with the '${constraintString}' constraint's statement.`);
|
|
180
|
+
}
|
|
181
|
+
return continuation(statementUnifies);
|
|
182
|
+
});
|
|
173
183
|
}
|
|
174
|
-
|
|
175
|
-
let assumptionUnifies = false;
|
|
184
|
+
unifyAssumption(assumption, context, continuation) {
|
|
176
185
|
const assumptionString = assumption.getString(), constraintString = this.getString();
|
|
177
186
|
context.trace(`Unifying the '${assumptionString}' assumption with the '${constraintString}' constraint...`);
|
|
178
187
|
const constraintContext = this.getContext(), generalContext = constraintContext; ///
|
|
179
|
-
(0, _context.reconcile)(
|
|
180
|
-
const reference = assumption.getReference(), specificContext = context
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
assumptionUnifies = true;
|
|
188
|
+
(0, _context.reconcile)((context)=>{
|
|
189
|
+
const reference = assumption.getReference(), specificContext = context; ///
|
|
190
|
+
return this.unifyReference(reference, generalContext, specificContext, (referneceUnifies)=>{
|
|
191
|
+
if (!referneceUnifies) {
|
|
192
|
+
const assumptionUnifies = false;
|
|
193
|
+
return continuation(assumptionUnifies);
|
|
186
194
|
}
|
|
187
|
-
|
|
195
|
+
const statement = assumption.getStatement();
|
|
196
|
+
return this.unifyStatement(statement, generalContext, specificContext, (statementUnifies)=>{
|
|
197
|
+
let assumptionUnifies = false;
|
|
198
|
+
if (statementUnifies) {
|
|
199
|
+
context.commit();
|
|
200
|
+
assumptionUnifies = true;
|
|
201
|
+
}
|
|
202
|
+
if (assumptionUnifies) {
|
|
203
|
+
context.debug(`...unified the '${assumptionString}' assumption with the '${constraintString}' constraint...`);
|
|
204
|
+
}
|
|
205
|
+
return continuation(assumptionUnifies);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
188
208
|
}, context);
|
|
189
|
-
if (assumptionUnifies) {
|
|
190
|
-
context.debug(`...unified the '${assumptionString}' assumption with the '${constraintString}' constraint...`);
|
|
191
|
-
}
|
|
192
|
-
return assumptionUnifies;
|
|
193
209
|
}
|
|
194
|
-
unifyAssumptions(assumptions, context) {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
return true;
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
return assumptionsUnify;
|
|
210
|
+
unifyAssumptions(assumptions, context, continuation) {
|
|
211
|
+
some(assumptions, (assumption, continuation)=>{
|
|
212
|
+
this.unifyAssumption(assumption, context, continuation);
|
|
213
|
+
}, continuation);
|
|
202
214
|
}
|
|
203
215
|
toJSON() {
|
|
204
216
|
const context = this.getContext();
|
|
@@ -251,4 +263,4 @@ function statementFromConstraintNode(constraintNode, context) {
|
|
|
251
263
|
return statement;
|
|
252
264
|
}
|
|
253
265
|
|
|
254
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L2NvbnN0cmFpbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IEVsZW1lbnQsIGJyZWFrUG9pbnRVdGlsaXRpZXMgfSBmcm9tIFwib2NjYW0tbGFuZ3VhZ2VzXCI7XG5cbmltcG9ydCB7IGRlZmluZSB9IGZyb20gXCIuLi9lbGVtZW50c1wiO1xuaW1wb3J0IHsgdW5pZnlTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vcHJvY2Vzcy91bmlmeVwiO1xuaW1wb3J0IHsgaW5zdGFudGlhdGVDb25zdHJhaW50IH0gZnJvbSBcIi4uL3Byb2Nlc3MvaW5zdGFudGlhdGVcIjtcbmltcG9ydCB7IHN0cmlwQnJhY2tldHNGcm9tU3RhdGVtZW50IH0gZnJvbSBcIi4uL3V0aWxpdGllcy9icmFja2V0c1wiO1xuaW1wb3J0IHsgY29uc3RyYWludEZyb21Db25zdHJhaW50Tm9kZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvZWxlbWVudFwiO1xuaW1wb3J0IHsgY29uc3RyYWludFN0cmluZ0Zyb21SZWZlcmVuY2VBbmRTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3N0cmluZ1wiO1xuaW1wb3J0IHsgYWJsYXRlLCBhdHRlbXB0LCBkZXNjZW5kLCByZWNvbmNpbGUsIHNlcmlhbGlzZSwgdW5zZXJpYWxpc2UsIGluc3RhbnRpYXRlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jb250ZXh0XCI7XG5cbmNvbnN0IHsgYnJlYWtQb2ludEZyb21KU09OLCBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiB9ID0gYnJlYWtQb2ludFV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIENvbnN0cmFpbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCByZWZlcmVuY2UsIHN0YXRlbWVudCkge1xuICAgIHN1cGVyKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCk7XG5cbiAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICB0aGlzLnN0YXRlbWVudCA9IHN0YXRlbWVudDtcbiAgfVxuXG4gIGdldFJlZmVyZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2U7XG4gIH1cblxuICBnZXRTdGF0ZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50O1xuICB9XG5cbiAgZ2V0Q29uc3RyYWludE5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGNvbnN0cmFpbnROb2RlID0gbm9kZTsgIC8vL1xuXG4gICAgcmV0dXJuIGNvbnN0cmFpbnROb2RlO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlKCkgeyByZXR1cm4gdGhpcy5yZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlKCk7IH1cblxuICBpc0VxdWFsVG8oY29uc3RyYWludCkge1xuICAgIGNvbnN0IGNvbnN0cmFpbnROb2RlID0gY29uc3RyYWludC5nZXROb2RlKCksXG4gICAgICAgICAgY29uc3RyYWludE5vZGVNYXRjaGVzID0gdGhpcy5tYXRjaENvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlKSxcbiAgICAgICAgICBlcXVhbFRvID0gY29uc3RyYWludE5vZGVNYXRjaGVzOyAgLy8vXG5cbiAgICByZXR1cm4gZXF1YWxUbztcbiAgfVxuXG4gIG1hdGNoQ29uc3RyYWludE5vZGUoY29uc3RyYWludE5vZGUpIHtcbiAgICBjb25zdCBub2RlID0gY29uc3RyYWludE5vZGUsIC8vL1xuICAgICAgICAgIG5vZGVNYXRjaGVzID0gdGhpcy5tYXRjaE5vZGUobm9kZSksXG4gICAgICAgICAgY29uc3RyYWludE5vZGVNYXRjaGVzID0gbm9kZU1hdGNoZXM7IC8vL1xuXG4gICAgcmV0dXJuIGNvbnN0cmFpbnROb2RlTWF0Y2hlcztcbiAgfVxuXG4gIGZpbmRWYWxpZENvbnN0cmFpbnQoY29udGV4dCkge1xuICAgIGNvbnN0IGNvbnN0cmFpbnROb2RlID0gdGhpcy5nZXRDb25zdHJhaW50Tm9kZSgpLFxuICAgICAgICAgIGNvbnN0cmFpbnQgPSBjb250ZXh0LmZpbmRDb25zdHJhaW50QnlDb25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSksXG4gICAgICAgICAgdmFsaWRDb25zdHJhaW50ID0gY29uc3RyYWludDsgIC8vL1xuXG4gICAgcmV0dXJuIHZhbGlkQ29uc3RyYWludDtcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlKGNvbnRleHQpIHtcbiAgICBsZXQgY29uc3RyYWludCA9IG51bGw7XG5cbiAgICBjb25zdCBjb25zdHJhaW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQuLi5gKTtcblxuICAgIGxldCB2YWxpZGF0ZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHZhbGlkQ29uc3RyYWludCA9IHRoaXMuZmluZFZhbGlkQ29uc3RyYWludChjb250ZXh0KTtcblxuICAgIGlmICh2YWxpZENvbnN0cmFpbnQgIT09IG51bGwpIHtcbiAgICAgIHZhbGlkYXRlcyA9IHRydWU7XG5cbiAgICAgIGNvbnN0cmFpbnQgPSB2YWxpZENvbnN0cmFpbnQ7IC8vL1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi50aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQgaXMgYWxyZWFkeSB2YWxpZC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGVtcG9yYXJ5Q29udGV4dCA9IGNvbnRleHQ7IC8vL1xuXG4gICAgICBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICAgIGF0dGVtcHQoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdGVtZW50VmFsaWRhdGVzID0gdGhpcy52YWxpZGF0ZVN0YXRlbWVudChjb250ZXh0KTtcblxuICAgICAgICBpZiAoc3RhdGVtZW50VmFsaWRhdGVzKSB7XG4gICAgICAgICAgY29uc3QgcmVmZXJlbmNlVmFsaWRhdGVzID0gdGhpcy52YWxpZGF0ZVJlZmVyZW5jZShjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChyZWZlcmVuY2VWYWxpZGF0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlZCA9IGNvbnRleHQuaXNTdGF0ZWQoKTtcblxuICAgICAgICAgICAgbGV0IHZhbGlkYXRlc1doZW5TdGF0ZWQgPSBmYWxzZSxcbiAgICAgICAgICAgICAgdmFsaWRhdGVzV2hlbkRlcml2ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKHN0YXRlZCkge1xuICAgICAgICAgICAgICB2YWxpZGF0ZXNXaGVuU3RhdGVkID0gdGhpcy52YWxpZGF0ZVdoZW5TdGF0ZWQoY29udGV4dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IHRoaXMudmFsaWRhdGVXaGVuRGVyaXZlZChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbGlkYXRlc1doZW5TdGF0ZWQgfHwgdmFsaWRhdGVzV2hlbkRlcml2ZWQpIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgdGhpcy5jb21taXQoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQpO1xuXG4gICAgICBjb250ZXh0ID0gdGVtcG9yYXJ5Q29udGV4dDsgLy8vXG5cbiAgICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgICAgY29uc3RyYWludCA9IHRoaXM7ICAvLy9cblxuICAgICAgICBjb250ZXh0LmFkZENvbnN0cmFpbnQoY29uc3RyYWludCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uc3RyYWludDtcbiAgfVxuXG4gIHZhbGlkYXRlUmVmZXJlbmNlKGNvbnRleHQpIHtcbiAgICBsZXQgcmVmZXJlbmNlVmFsaWRhdGVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb25zdHJhaW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQncyByZWZlcmVuY2UuLi5gKTtcblxuICAgIGNvbnN0IHJlZmVyZW5jZSA9IHRoaXMucmVmZXJlbmNlLnZhbGlkYXRlKGNvbnRleHQpO1xuXG4gICAgaWYgKHJlZmVyZW5jZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlID0gdGhpcy5yZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlKCksXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVEZWNsYXJlZCA9IG1ldGF2YXJpYWJsZS5pc0RlY2xhcmVkKCk7XG5cbiAgICAgIGlmIChtZXRhdmFyaWFibGVEZWNsYXJlZCkge1xuICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcblxuICAgICAgICByZWZlcmVuY2VWYWxpZGF0ZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWZlcmVuY2VWYWxpZGF0ZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQncyByZWZlcmVuY2UuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVZhbGlkYXRlcztcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlU3RhdGVtZW50KGNvbnRleHQpIHtcbiAgICBsZXQgc3RhdGVtZW50VmFsaWRhdGVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb25zdHJhaW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQncyBzdGF0ZW1lbnQuLi5gKTtcblxuICAgIGRlc2NlbmQoYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudCA9IHRoaXMuc3RhdGVtZW50LnZhbGlkYXRlKGNvbnRleHQpO1xuXG4gICAgICBpZiAoc3RhdGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXRlbWVudFZhbGlkYXRlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICBpZiAoc3RhdGVtZW50VmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50J3Mgc3RhdGVtZW50LmApO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZW1lbnRWYWxpZGF0ZXM7XG4gIH1cblxuICB2YWxpZGF0ZVdoZW5TdGF0ZWQoY29udGV4dCkge1xuICAgIGxldCB2YWxpZGF0ZXNXaGVuU3RhdGVkO1xuXG4gICAgY29uc3QgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBzdGF0ZWQgY29uc3RyYWludC4uLmApO1xuXG4gICAgdmFsaWRhdGVzV2hlblN0YXRlZCA9IHRydWVcblxuICAgIGlmICh2YWxpZGF0ZXNXaGVuU3RhdGVkKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBzdGF0ZWQgY29uc3RyYWludC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVzV2hlblN0YXRlZDtcbiAgfVxuXG4gIHZhbGlkYXRlV2hlbkRlcml2ZWQoY29udGV4dCkge1xuICAgIGxldCB2YWxpZGF0ZXNXaGVuRGVyaXZlZDtcblxuICAgIGNvbnN0IGNvbnN0cmFpbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgZGVyaXZlZCBjb25zdHJhaW50Li4uYCk7XG5cbiAgICB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IHRydWU7XG5cbiAgICBpZiAodmFsaWRhdGVzV2hlbkRlcml2ZWQpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGRlcml2ZWQgY29uc3RyYWludC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVzV2hlbkRlcml2ZWQ7XG4gIH1cblxuICB1bmlmeVJlZmVyZW5jZShyZWZlcmVuY2UsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBsZXQgcmVmZXJlbmNlVW5pZmllcztcblxuICAgIGlmIChyZWZlcmVuY2UgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICAgIHJlZmVyZW5jZVN0cmluZyA9IHJlZmVyZW5jZS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAvLy9cblxuICAgICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZSB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHJlZmVyZW5jZS4uLmApO1xuXG4gICAgICBjb25zdCBtZXRhdmFyaWFibGUgPSB0aGlzLmdldE1ldGF2YXJpYWJsZSgpO1xuXG4gICAgICByZWZlcmVuY2VVbmlmaWVzID0gbWV0YXZhcmlhYmxlLnVuaWZ5UmVmZXJlbmNlKHJlZmVyZW5jZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgIGlmIChyZWZlcmVuY2VVbmlmaWVzKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4udW5pZmllZCB0aGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgd2l0aCB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQncyByZWZlcmVuY2UuYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZmVyZW5jZVVuaWZpZXMgPSB0cnVlOyAgLy8vXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVVuaWZpZXM7XG4gIH1cblxuICBhc3luYyB1bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBsZXQgc3RhdGVtZW50VW5pZmllcztcblxuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHN0YXRlbWVudC4uLmApO1xuXG4gICAgY29uc3QgZ2VuZXJhbFN0YXRlbWVudCA9IHRoaXMuc3RhdGVtZW50LCAgLy8vXG4gICAgICAgICAgc3BlY2lmaWNTdGF0ZW1lbnQgPSBzdHJpcEJyYWNrZXRzRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpOyAgLy8vXG5cbiAgICBzdGF0ZW1lbnRVbmlmaWVzID0gdW5pZnlTdGF0ZW1lbnQoZ2VuZXJhbFN0YXRlbWVudCwgc3BlY2lmaWNTdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHN0YXRlbWVudC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50VW5pZmllcztcbiAgfVxuXG4gIGFzeW5jIHVuaWZ5QXNzdW1wdGlvbihhc3N1bXB0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGFzc3VtcHRpb25VbmlmaWVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBhc3N1bXB0aW9uU3RyaW5nID0gYXNzdW1wdGlvbi5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIGNvbnN0cmFpbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHdpdGggdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50Li4uYCk7XG5cbiAgICBjb25zdCBjb25zdHJhaW50Q29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpLCAvLy9cbiAgICAgICAgICBnZW5lcmFsQ29udGV4dCA9IGNvbnN0cmFpbnRDb250ZXh0OyAvLy9cblxuICAgIHJlY29uY2lsZShhc3luYyAoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVmZXJlbmNlID0gYXNzdW1wdGlvbi5nZXRSZWZlcmVuY2UoKSxcbiAgICAgICAgICAgIHNwZWNpZmljQ29udGV4dCA9IGNvbnRleHQsICAvLy9cbiAgICAgICAgICAgIHJlZmVybmVjZVVuaWZpZXMgPSB0aGlzLnVuaWZ5UmVmZXJlbmNlKHJlZmVyZW5jZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgIGlmIChyZWZlcm5lY2VVbmlmaWVzKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IGFzc3VtcHRpb24uZ2V0U3RhdGVtZW50KCksXG4gICAgICAgICAgICAgIHN0YXRlbWVudFVuaWZpZWQgPSB0aGlzLnVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZWQpIHtcbiAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgICAgICAgYXNzdW1wdGlvblVuaWZpZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICBpZiAoYXNzdW1wdGlvblVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHdpdGggdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50Li4uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc3VtcHRpb25VbmlmaWVzO1xuICB9XG5cbiAgdW5pZnlBc3N1bXB0aW9ucyhhc3N1bXB0aW9ucywgY29udGV4dCkge1xuICAgIGNvbnN0IGFzc3VtcHRpb25zVW5pZnkgPSBhc3N1bXB0aW9ucy5zb21lKChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICBjb25zdCBhc3N1bXB0aW9uVW5pZmllcyA9IHRoaXMudW5pZnlBc3N1bXB0aW9uKGFzc3VtcHRpb24sIGNvbnRleHQpO1xuXG4gICAgICBpZiAoYXNzdW1wdGlvblVuaWZpZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbnNVbmlmeTtcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICByZXR1cm4gc2VyaWFsaXNlKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgICBsZXQgYnJlYWtQb2ludDtcblxuICAgICAgYnJlYWtQb2ludCA9IHRoaXMuZ2V0QnJlYWtQb2ludCgpO1xuXG4gICAgICBjb25zdCBicmVha1BvaW50SlNPTiA9IGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OKGJyZWFrUG9pbnQpO1xuXG4gICAgICBicmVha1BvaW50ID0gYnJlYWtQb2ludEpTT047ICAvLy9cblxuICAgICAgY29uc3QganNvbiA9IHtcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBicmVha1BvaW50XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJDb25zdHJhaW50XCI7XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbnRleHQpIHtcbiAgICBsZXQgY29uc3RyYWludDtcblxuICAgIGluc3RhbnRpYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICB1bnNlcmlhbGlzZSgoanNvbiwgY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCB7IHN0cmluZyB9ID0ganNvbixcbiAgICAgICAgICAgICAgY29uc3RyYWludE5vZGUgPSBpbnN0YW50aWF0ZUNvbnN0cmFpbnQoc3RyaW5nLCBjb250ZXh0KSxcbiAgICAgICAgICAgICAgbm9kZSA9IGNvbnN0cmFpbnROb2RlLCAgLy8vXG4gICAgICAgICAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50RnJvbUpTT04oanNvbiksXG4gICAgICAgICAgICAgIHJlZmVyZW5jZSA9IHJlZmVyZW5jZUZyb21Db25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudEZyb21Db25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSwgY29udGV4dCk7XG5cbiAgICAgICAgY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgcmVmZXJlbmNlLCBzdGF0ZW1lbnQpO1xuICAgICAgfSwganNvbiwgY29udGV4dCk7XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gY29uc3RyYWludDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tU3RlcChzdGVwLCBjb250ZXh0KSB7XG4gICAgbGV0IGNvbnN0cmFpbnQ7XG5cbiAgICBsZXQgc3RhdGVtZW50O1xuXG4gICAgc3RhdGVtZW50ID0gc3RlcC5nZXRTdGF0ZW1lbnQoKTtcblxuICAgIHN0YXRlbWVudCA9IHN0cmlwQnJhY2tldHNGcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7IC8vL1xuXG4gICAgY29uc3QgcmVmZXJlbmNlID0gc3RlcC5nZXRSZWZlcmVuY2UoKTtcblxuICAgIGFibGF0ZSgoY29udGV4dCkgPT4ge1xuICAgICAgaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludFN0cmluZyA9IGNvbnN0cmFpbnRTdHJpbmdGcm9tUmVmZXJlbmNlQW5kU3RhdGVtZW50KHJlZmVyZW5jZSwgc3RhdGVtZW50KSxcbiAgICAgICAgICAgICAgc3RyaW5nID0gY29uc3RyYWludFN0cmluZywgIC8vL1xuICAgICAgICAgICAgICBjb25zdHJhaW50Tm9kZSA9IGluc3RhbnRpYXRlQ29uc3RyYWludChzdHJpbmcsIGNvbnRleHQpO1xuXG4gICAgICAgIGNvbnN0cmFpbnQgPSBjb25zdHJhaW50RnJvbUNvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlLCBjb250ZXh0KTtcbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH0sIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGNvbnN0cmFpbnQ7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiByZWZlcmVuY2VGcm9tQ29uc3RyYWludE5vZGUoY29uc3RyYWludE5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgcmVmZXJlbmNlTm9kZSA9IGNvbnN0cmFpbnROb2RlLmdldFJlZmVyZW5jZU5vZGUoKSxcbiAgICAgICAgcmVmZXJuZWNlID0gY29udGV4dC5maW5kUmVmZXJlbmNlQnlSZWZlcmVuY2VOb2RlKHJlZmVyZW5jZU5vZGUpO1xuXG4gIHJldHVybiByZWZlcm5lY2U7XG59XG5cbmZ1bmN0aW9uIHN0YXRlbWVudEZyb21Db25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSwgY29udGV4dCkge1xuICBjb25zdCBzdGF0ZW1lbnROb2RlID0gY29uc3RyYWludE5vZGUuZ2V0U3RhdGVtZW50Tm9kZSgpLFxuICAgICAgICBzdGF0ZW1lbnQgPSBjb250ZXh0LmZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSk7XG5cbiAgcmV0dXJuIHN0YXRlbWVudDtcbn1cbiJdLCJuYW1lcyI6WyJicmVha1BvaW50RnJvbUpTT04iLCJicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiIsImJyZWFrUG9pbnRVdGlsaXRpZXMiLCJkZWZpbmUiLCJDb25zdHJhaW50IiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsInJlZmVyZW5jZSIsInN0YXRlbWVudCIsImdldFJlZmVyZW5jZSIsImdldFN0YXRlbWVudCIsImdldENvbnN0cmFpbnROb2RlIiwiZ2V0Tm9kZSIsImNvbnN0cmFpbnROb2RlIiwiZ2V0TWV0YXZhcmlhYmxlIiwiaXNFcXVhbFRvIiwiY29uc3RyYWludCIsImNvbnN0cmFpbnROb2RlTWF0Y2hlcyIsIm1hdGNoQ29uc3RyYWludE5vZGUiLCJlcXVhbFRvIiwibm9kZU1hdGNoZXMiLCJtYXRjaE5vZGUiLCJmaW5kVmFsaWRDb25zdHJhaW50IiwiZmluZENvbnN0cmFpbnRCeUNvbnN0cmFpbnROb2RlIiwidmFsaWRDb25zdHJhaW50IiwidmFsaWRhdGUiLCJjb25zdHJhaW50U3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJ2YWxpZGF0ZXMiLCJkZWJ1ZyIsInRlbXBvcmFyeUNvbnRleHQiLCJnZXRDb250ZXh0IiwiYXR0ZW1wdCIsInN0YXRlbWVudFZhbGlkYXRlcyIsInZhbGlkYXRlU3RhdGVtZW50IiwicmVmZXJlbmNlVmFsaWRhdGVzIiwidmFsaWRhdGVSZWZlcmVuY2UiLCJzdGF0ZWQiLCJpc1N0YXRlZCIsInZhbGlkYXRlc1doZW5TdGF0ZWQiLCJ2YWxpZGF0ZXNXaGVuRGVyaXZlZCIsInZhbGlkYXRlV2hlblN0YXRlZCIsInZhbGlkYXRlV2hlbkRlcml2ZWQiLCJjb21taXQiLCJhZGRDb25zdHJhaW50IiwibWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlRGVjbGFyZWQiLCJpc0RlY2xhcmVkIiwiZGVzY2VuZCIsInVuaWZ5UmVmZXJlbmNlIiwiZ2VuZXJhbENvbnRleHQiLCJzcGVjaWZpY0NvbnRleHQiLCJyZWZlcmVuY2VVbmlmaWVzIiwicmVmZXJlbmNlU3RyaW5nIiwidW5pZnlTdGF0ZW1lbnQiLCJzdGF0ZW1lbnRVbmlmaWVzIiwic3RhdGVtZW50U3RyaW5nIiwiZ2VuZXJhbFN0YXRlbWVudCIsInNwZWNpZmljU3RhdGVtZW50Iiwic3RyaXBCcmFja2V0c0Zyb21TdGF0ZW1lbnQiLCJ1bmlmeUFzc3VtcHRpb24iLCJhc3N1bXB0aW9uIiwiYXNzdW1wdGlvblVuaWZpZXMiLCJhc3N1bXB0aW9uU3RyaW5nIiwiY29uc3RyYWludENvbnRleHQiLCJyZWNvbmNpbGUiLCJyZWZlcm5lY2VVbmlmaWVzIiwic3RhdGVtZW50VW5pZmllZCIsInVuaWZ5QXNzdW1wdGlvbnMiLCJhc3N1bXB0aW9ucyIsImFzc3VtcHRpb25zVW5pZnkiLCJzb21lIiwidG9KU09OIiwic2VyaWFsaXNlIiwiZ2V0QnJlYWtQb2ludCIsImJyZWFrUG9pbnRKU09OIiwianNvbiIsIm5hbWUiLCJmcm9tSlNPTiIsImluc3RhbnRpYXRlIiwidW5zZXJpYWxpc2UiLCJpbnN0YW50aWF0ZUNvbnN0cmFpbnQiLCJyZWZlcmVuY2VGcm9tQ29uc3RyYWludE5vZGUiLCJzdGF0ZW1lbnRGcm9tQ29uc3RyYWludE5vZGUiLCJmcm9tU3RlcCIsInN0ZXAiLCJhYmxhdGUiLCJjb25zdHJhaW50U3RyaW5nRnJvbVJlZmVyZW5jZUFuZFN0YXRlbWVudCIsImNvbnN0cmFpbnRGcm9tQ29uc3RyYWludE5vZGUiLCJyZWZlcmVuY2VOb2RlIiwiZ2V0UmVmZXJlbmNlTm9kZSIsInJlZmVybmVjZSIsImZpbmRSZWZlcmVuY2VCeVJlZmVyZW5jZU5vZGUiLCJzdGF0ZW1lbnROb2RlIiwiZ2V0U3RhdGVtZW50Tm9kZSIsImZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQWNBOzs7ZUFBQTs7O2dDQVo2QzswQkFFdEI7dUJBQ1E7NkJBQ087MEJBQ0s7eUJBQ0U7d0JBQ2E7eUJBQytCO0FBRXpGLE1BQU0sRUFBRUEsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUU5RSxXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLG1CQUFtQkMsdUJBQU87SUFDcEQsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsVUFBVSxFQUFFQyxTQUFTLEVBQUVDLFNBQVMsQ0FBRTtRQUNuRSxLQUFLLENBQUNMLFNBQVNDLFFBQVFDLE1BQU1DO1FBRTdCLElBQUksQ0FBQ0MsU0FBUyxHQUFHQTtRQUNqQixJQUFJLENBQUNDLFNBQVMsR0FBR0E7SUFDbkI7SUFFQUMsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDRixTQUFTO0lBQ3ZCO0lBRUFHLGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQ0YsU0FBUztJQUN2QjtJQUVBRyxvQkFBb0I7UUFDbEIsTUFBTU4sT0FBTyxJQUFJLENBQUNPLE9BQU8sSUFDbkJDLGlCQUFpQlIsTUFBTyxHQUFHO1FBRWpDLE9BQU9RO0lBQ1Q7SUFFQUMsa0JBQWtCO1FBQUUsT0FBTyxJQUFJLENB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
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L2NvbnN0cmFpbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IEVsZW1lbnQsIGJyZWFrUG9pbnRVdGlsaXRpZXMsIGNvbnRpbnVhdGlvblV0aWxpdGllcyB9IGZyb20gXCJvY2NhbS1sYW5ndWFnZXNcIjtcblxuaW1wb3J0IHsgZGVmaW5lIH0gZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5pbXBvcnQgeyBhbGwsIGV4aXN0cyB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGludWF0aW9uXCI7XG5pbXBvcnQgeyB1bmlmeVN0YXRlbWVudCB9IGZyb20gXCIuLi9wcm9jZXNzL3VuaWZ5XCI7XG5pbXBvcnQgeyBpbnN0YW50aWF0ZUNvbnN0cmFpbnQgfSBmcm9tIFwiLi4vcHJvY2Vzcy9pbnN0YW50aWF0ZVwiO1xuaW1wb3J0IHsgc3RyaXBCcmFja2V0c0Zyb21TdGF0ZW1lbnQgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2JyYWNrZXRzXCI7XG5pbXBvcnQgeyBjb25zdHJhaW50RnJvbUNvbnN0cmFpbnROb2RlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9lbGVtZW50XCI7XG5pbXBvcnQgeyBjb25zdHJhaW50U3RyaW5nRnJvbVJlZmVyZW5jZUFuZFN0YXRlbWVudCB9IGZyb20gXCIuLi91dGlsaXRpZXMvc3RyaW5nXCI7XG5pbXBvcnQgeyBhYmxhdGUsIGF0dGVtcHQsIGRlc2NlbmQsIHJlY29uY2lsZSwgc2VyaWFsaXNlLCB1bnNlcmlhbGlzZSwgaW5zdGFudGlhdGUgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcblxuY29uc3QgeyBzb21lIH0gPSBjb250aW51YXRpb25VdGlsaXRpZXMsXG4gICAgICB7IGJyZWFrUG9pbnRGcm9tSlNPTiwgYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04gfSA9IGJyZWFrUG9pbnRVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBDb25zdHJhaW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgcmVmZXJlbmNlLCBzdGF0ZW1lbnQpIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQpO1xuXG4gICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG4gICAgdGhpcy5zdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7XG4gIH1cblxuICBnZXRSZWZlcmVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlO1xuICB9XG5cbiAgZ2V0U3RhdGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudDtcbiAgfVxuXG4gIGdldENvbnN0cmFpbnROb2RlKCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGUoKSxcbiAgICAgICAgICBjb25zdHJhaW50Tm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHJldHVybiBjb25zdHJhaW50Tm9kZTtcbiAgfVxuXG4gIGdldE1ldGF2YXJpYWJsZSgpIHsgcmV0dXJuIHRoaXMucmVmZXJlbmNlLmdldE1ldGF2YXJpYWJsZSgpOyB9XG5cbiAgaXNFcXVhbFRvKGNvbnN0cmFpbnQpIHtcbiAgICBjb25zdCBjb25zdHJhaW50Tm9kZSA9IGNvbnN0cmFpbnQuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGNvbnN0cmFpbnROb2RlTWF0Y2hlcyA9IHRoaXMubWF0Y2hDb25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSksXG4gICAgICAgICAgZXF1YWxUbyA9IGNvbnN0cmFpbnROb2RlTWF0Y2hlczsgIC8vL1xuXG4gICAgcmV0dXJuIGVxdWFsVG87XG4gIH1cblxuICBtYXRjaENvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlKSB7XG4gICAgY29uc3Qgbm9kZSA9IGNvbnN0cmFpbnROb2RlLCAvLy9cbiAgICAgICAgICBub2RlTWF0Y2hlcyA9IHRoaXMubWF0Y2hOb2RlKG5vZGUpLFxuICAgICAgICAgIGNvbnN0cmFpbnROb2RlTWF0Y2hlcyA9IG5vZGVNYXRjaGVzOyAvLy9cblxuICAgIHJldHVybiBjb25zdHJhaW50Tm9kZU1hdGNoZXM7XG4gIH1cblxuICBmaW5kVmFsaWRDb25zdHJhaW50KGNvbnRleHQpIHtcbiAgICBjb25zdCBjb25zdHJhaW50Tm9kZSA9IHRoaXMuZ2V0Q29uc3RyYWludE5vZGUoKSxcbiAgICAgICAgICBjb25zdHJhaW50ID0gY29udGV4dC5maW5kQ29uc3RyYWludEJ5Q29uc3RyYWludE5vZGUoY29uc3RyYWludE5vZGUpLFxuICAgICAgICAgIHZhbGlkQ29uc3RyYWludCA9IGNvbnN0cmFpbnQ7ICAvLy9cblxuICAgIHJldHVybiB2YWxpZENvbnN0cmFpbnQ7XG4gIH1cblxuICB2YWxpZGF0ZShjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBjb25zdHJhaW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQuLi5gKTtcblxuICAgIGNvbnN0IHZhbGlkQ29uc3RyYWludCA9IHRoaXMuZmluZFZhbGlkQ29uc3RyYWludChjb250ZXh0KTtcblxuICAgIGlmICh2YWxpZENvbnN0cmFpbnQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnQgPSB2YWxpZENvbnN0cmFpbnQ7IC8vL1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi50aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQgaXMgYWxyZWFkeSB2YWxpZC5gKTtcblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb25zdHJhaW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgICBhdHRlbXB0KChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlU3RhdGVtZW50ID0gdGhpcy52YWxpZGF0ZVN0YXRlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICB2YWxpZGF0ZVJlZmVyZW5jZSA9IHRoaXMudmFsaWRhdGVSZWZlcmVuY2UuYmluZCh0aGlzKTtcblxuICAgICAgICByZXR1cm4gYWxsKFtcbiAgICAgICAgICB2YWxpZGF0ZVN0YXRlbWVudCxcbiAgICAgICAgICB2YWxpZGF0ZVJlZmVyZW5jZVxuICAgICAgICBdLCBjb250ZXh0LCAodmFsaWRhdGVzKSA9PiB7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0cmFpbnQgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKGNvbnN0cmFpbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbGlkYXRlV2hlblN0YXRlZCA9IHRoaXMudmFsaWRhdGVXaGVuU3RhdGVkLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVXaGVuRGVyaXZlZCA9IHRoaXMudmFsaWRhdGVXaGVuRGVyaXZlZC5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgcmV0dXJuIGV4aXN0cyhbXG4gICAgICAgICAgICB2YWxpZGF0ZVdoZW5TdGF0ZWQsXG4gICAgICAgICAgICB2YWxpZGF0ZVdoZW5EZXJpdmVkXG4gICAgICAgICAgXSwgY29udGV4dCwgKHZhbGlkYXRlcykgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbnN0cmFpbnQgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnQgPSB0aGlzOyAgLy8vXG5cbiAgICAgICAgICAgICAgY29udGV4dC5hZGRDb25zdHJhaW50KGNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29tbWl0KGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oY29uc3RyYWludCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVSZWZlcmVuY2UoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgbGV0IHJlZmVyZW5jZVZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50J3MgcmVmZXJlbmNlLi4uYCk7XG5cbiAgICB0aGlzLnJlZmVyZW5jZS52YWxpZGF0ZShjb250ZXh0LCAocmVmZXJlbmNlKSA9PiB7XG4gICAgICBpZiAocmVmZXJlbmNlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IHRoaXMucmVmZXJlbmNlLmdldE1ldGF2YXJpYWJsZSgpLFxuICAgICAgICAgICAgICBtZXRhdmFyaWFibGVEZWNsYXJlZCA9IG1ldGF2YXJpYWJsZS5pc0RlY2xhcmVkKCk7XG5cbiAgICAgICAgaWYgKG1ldGF2YXJpYWJsZURlY2xhcmVkKSB7XG4gICAgICAgICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG5cbiAgICAgICAgICByZWZlcmVuY2VWYWxpZGF0ZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWZlcmVuY2VWYWxpZGF0ZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHJlZmVyZW5jZS5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihyZWZlcmVuY2VWYWxpZGF0ZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVTdGF0ZW1lbnQoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50J3Mgc3RhdGVtZW50Li4uYCk7XG5cbiAgICBkZXNjZW5kKChjb250ZXh0KSA9PiB7XG4gICAgICB0aGlzLnN0YXRlbWVudC52YWxpZGF0ZShjb250ZXh0LCAoc3RhdGVtZW50KSA9PiB7XG4gICAgICAgIGxldCBzdGF0ZW1lbnRWYWxpZGF0ZXMgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhdGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGVtZW50VmFsaWRhdGVzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZW1lbnRWYWxpZGF0ZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50J3Mgc3RhdGVtZW50LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdGF0ZW1lbnRWYWxpZGF0ZXMpO1xuICAgICAgfSk7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICB2YWxpZGF0ZVdoZW5TdGF0ZWQoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3Qgc3RhdGVkID0gY29udGV4dC5pc1N0YXRlZCgpO1xuXG4gICAgaWYgKCFzdGF0ZWQpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlc1doZW5TdGF0ZWQgPSBmYWxzZTtcblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbih2YWxpZGF0ZXNXaGVuU3RhdGVkKTtcbiAgICB9XG5cbiAgICBsZXQgdmFsaWRhdGVzV2hlblN0YXRlZDtcblxuICAgIGNvbnN0IGNvbnN0cmFpbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgc3RhdGVkIGNvbnN0cmFpbnQuLi5gKTtcblxuICAgIHZhbGlkYXRlc1doZW5TdGF0ZWQgPSB0cnVlXG5cbiAgICBpZiAodmFsaWRhdGVzV2hlblN0YXRlZCkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgc3RhdGVkIGNvbnN0cmFpbnQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbih2YWxpZGF0ZXNXaGVuU3RhdGVkKTtcbiAgfVxuXG4gIHZhbGlkYXRlV2hlbkRlcml2ZWQoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3Qgc3RhdGVkID0gY29udGV4dC5pc1N0YXRlZCgpO1xuXG4gICAgaWYgKHN0YXRlZCkge1xuICAgICAgY29uc3QgdmFsaWRhdGVzV2hlbkRlcml2ZWQgPSBmYWxzZTtcblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbih2YWxpZGF0ZXNXaGVuRGVyaXZlZCk7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkYXRlc1doZW5EZXJpdmVkO1xuXG4gICAgY29uc3QgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBkZXJpdmVkIGNvbnN0cmFpbnQuLi5gKTtcblxuICAgIHZhbGlkYXRlc1doZW5EZXJpdmVkID0gdHJ1ZTtcblxuICAgIGlmICh2YWxpZGF0ZXNXaGVuRGVyaXZlZCkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgZGVyaXZlZCBjb25zdHJhaW50LmApO1xuICAgIH1cblxuICAgIHJldHVybiBjb250aW51YXRpb24odmFsaWRhdGVzV2hlbkRlcml2ZWQpO1xuICB9XG5cbiAgdW5pZnlSZWZlcmVuY2UocmVmZXJlbmNlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBpZiAocmVmZXJlbmNlID09PSBudWxsKSB7XG4gICAgICBjb25zdCByZWZlcmVuY2VVbmlmaWVzID0gdHJ1ZTsgIC8vL1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHJlZmVyZW5jZVVuaWZpZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICByZWZlcmVuY2VTdHJpbmcgPSByZWZlcmVuY2UuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZSB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHJlZmVyZW5jZS4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlID0gdGhpcy5nZXRNZXRhdmFyaWFibGUoKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGUudW5pZnlSZWZlcmVuY2UocmVmZXJlbmNlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCAocmVmZXJlbmNlVW5pZmllcykgPT4ge1xuICAgICAgaWYgKHJlZmVyZW5jZVVuaWZpZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi51bmlmaWVkIHRoZSAnJHtyZWZlcmVuY2VTdHJpbmd9JyB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHJlZmVyZW5jZS5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihyZWZlcmVuY2VVbmlmaWVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBjb25zdHJhaW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHdpdGggdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50J3Mgc3RhdGVtZW50Li4uYCk7XG5cbiAgICBjb25zdCBnZW5lcmFsU3RhdGVtZW50ID0gdGhpcy5zdGF0ZW1lbnQsICAvLy9cbiAgICAgICAgICBzcGVjaWZpY1N0YXRlbWVudCA9IHN0cmlwQnJhY2tldHNGcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7ICAvLy9cblxuICAgIHJldHVybiB1bmlmeVN0YXRlbWVudChnZW5lcmFsU3RhdGVtZW50LCBzcGVjaWZpY1N0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgKHN0YXRlbWVudFVuaWZpZXMpID0+IHtcbiAgICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHN0YXRlbWVudC5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdGF0ZW1lbnRVbmlmaWVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuaWZ5QXNzdW1wdGlvbihhc3N1bXB0aW9uLCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBhc3N1bXB0aW9uU3RyaW5nID0gYXNzdW1wdGlvbi5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIGNvbnN0cmFpbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHdpdGggdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50Li4uYCk7XG5cbiAgICBjb25zdCBjb25zdHJhaW50Q29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpLCAvLy9cbiAgICAgICAgICBnZW5lcmFsQ29udGV4dCA9IGNvbnN0cmFpbnRDb250ZXh0OyAvLy9cblxuICAgIHJlY29uY2lsZSgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVmZXJlbmNlID0gYXNzdW1wdGlvbi5nZXRSZWZlcmVuY2UoKSxcbiAgICAgICAgICAgIHNwZWNpZmljQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICAgICAgcmV0dXJuIHRoaXMudW5pZnlSZWZlcmVuY2UocmVmZXJlbmNlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCAocmVmZXJuZWNlVW5pZmllcykgPT4ge1xuICAgICAgICBpZiAoIXJlZmVybmVjZVVuaWZpZXMpIHtcbiAgICAgICAgICBjb25zdCBhc3N1bXB0aW9uVW5pZmllcyA9IGZhbHNlO1xuXG4gICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihhc3N1bXB0aW9uVW5pZmllcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0ZW1lbnQgPSBhc3N1bXB0aW9uLmdldFN0YXRlbWVudCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgKHN0YXRlbWVudFVuaWZpZXMpID0+IHtcbiAgICAgICAgICBsZXQgYXNzdW1wdGlvblVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgICAgICAgICBhc3N1bXB0aW9uVW5pZmllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFzc3VtcHRpb25VbmlmaWVzKSB7XG4gICAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHthc3N1bXB0aW9uU3RyaW5nfScgYXNzdW1wdGlvbiB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludC4uLmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oYXNzdW1wdGlvblVuaWZpZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgdW5pZnlBc3N1bXB0aW9ucyhhc3N1bXB0aW9ucywgY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgc29tZShhc3N1bXB0aW9ucywgKGFzc3VtcHRpb24sIGNvbnRpbnVhdGlvbikgPT4ge1xuICAgICAgdGhpcy51bmlmeUFzc3VtcHRpb24oYXNzdW1wdGlvbiwgY29udGV4dCwgY29udGludWF0aW9uKTtcbiAgICB9LCBjb250aW51YXRpb24pO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHJldHVybiBzZXJpYWxpc2UoKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGxldCBicmVha1BvaW50O1xuXG4gICAgICBicmVha1BvaW50ID0gdGhpcy5nZXRCcmVha1BvaW50KCk7XG5cbiAgICAgIGNvbnN0IGJyZWFrUG9pbnRKU09OID0gYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04oYnJlYWtQb2ludCk7XG5cbiAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50SlNPTjsgIC8vL1xuXG4gICAgICBjb25zdCBqc29uID0ge1xuICAgICAgICBjb250ZXh0LFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIGJyZWFrUG9pbnRcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBqc29uO1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIkNvbnN0cmFpbnRcIjtcblxuICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29udGV4dCkge1xuICAgIGxldCBjb25zdHJhaW50O1xuXG4gICAgaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgIHVuc2VyaWFsaXNlKChqc29uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RyaW5nIH0gPSBqc29uLFxuICAgICAgICAgICAgICBjb25zdHJhaW50Tm9kZSA9IGluc3RhbnRpYXRlQ29uc3RyYWludChzdHJpbmcsIGNvbnRleHQpLFxuICAgICAgICAgICAgICBub2RlID0gY29uc3RyYWludE5vZGUsICAvLy9cbiAgICAgICAgICAgICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRGcm9tSlNPTihqc29uKSxcbiAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcmVmZXJlbmNlRnJvbUNvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgICAgc3RhdGVtZW50ID0gc3RhdGVtZW50RnJvbUNvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlLCBjb250ZXh0KTtcblxuICAgICAgICBjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCByZWZlcmVuY2UsIHN0YXRlbWVudCk7XG4gICAgICB9LCBqc29uLCBjb250ZXh0KTtcbiAgICB9LCBjb250ZXh0KTtcblxuICAgIHJldHVybiBjb25zdHJhaW50O1xuICB9XG5cbiAgc3RhdGljIGZyb21TdGVwKHN0ZXAsIGNvbnRleHQpIHtcbiAgICBsZXQgY29uc3RyYWludDtcblxuICAgIGxldCBzdGF0ZW1lbnQ7XG5cbiAgICBzdGF0ZW1lbnQgPSBzdGVwLmdldFN0YXRlbWVudCgpO1xuXG4gICAgc3RhdGVtZW50ID0gc3RyaXBCcmFja2V0c0Zyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTsgLy8vXG5cbiAgICBjb25zdCByZWZlcmVuY2UgPSBzdGVwLmdldFJlZmVyZW5jZSgpO1xuXG4gICAgYWJsYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICBpbnN0YW50aWF0ZSgoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBjb25zdHJhaW50U3RyaW5nID0gY29uc3RyYWludFN0cmluZ0Zyb21SZWZlcmVuY2VBbmRTdGF0ZW1lbnQocmVmZXJlbmNlLCBzdGF0ZW1lbnQpLFxuICAgICAgICAgICAgICBzdHJpbmcgPSBjb25zdHJhaW50U3RyaW5nLCAgLy8vXG4gICAgICAgICAgICAgIGNvbnN0cmFpbnROb2RlID0gaW5zdGFudGlhdGVDb25zdHJhaW50KHN0cmluZywgY29udGV4dCk7XG5cbiAgICAgICAgY29uc3RyYWludCA9IGNvbnN0cmFpbnRGcm9tQ29uc3RyYWludE5vZGUoY29uc3RyYWludE5vZGUsIGNvbnRleHQpO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gY29uc3RyYWludDtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHJlZmVyZW5jZUZyb21Db25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSwgY29udGV4dCkge1xuICBjb25zdCByZWZlcmVuY2VOb2RlID0gY29uc3RyYWludE5vZGUuZ2V0UmVmZXJlbmNlTm9kZSgpLFxuICAgICAgICByZWZlcm5lY2UgPSBjb250ZXh0LmZpbmRSZWZlcmVuY2VCeVJlZmVyZW5jZU5vZGUocmVmZXJlbmNlTm9kZSk7XG5cbiAgcmV0dXJuIHJlZmVybmVjZTtcbn1cblxuZnVuY3Rpb24gc3RhdGVtZW50RnJvbUNvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBjb25zdHJhaW50Tm9kZS5nZXRTdGF0ZW1lbnROb2RlKCksXG4gICAgICAgIHN0YXRlbWVudCA9IGNvbnRleHQuZmluZFN0YXRlbWVudEJ5U3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlKTtcblxuICByZXR1cm4gc3RhdGVtZW50O1xufVxuIl0sIm5hbWVzIjpbInNvbWUiLCJjb250aW51YXRpb25VdGlsaXRpZXMiLCJicmVha1BvaW50RnJvbUpTT04iLCJicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiIsImJyZWFrUG9pbnRVdGlsaXRpZXMiLCJkZWZpbmUiLCJDb25zdHJhaW50IiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsInJlZmVyZW5jZSIsInN0YXRlbWVudCIsImdldFJlZmVyZW5jZSIsImdldFN0YXRlbWVudCIsImdldENvbnN0cmFpbnROb2RlIiwiZ2V0Tm9kZSIsImNvbnN0cmFpbnROb2RlIiwiZ2V0TWV0YXZhcmlhYmxlIiwiaXNFcXVhbFRvIiwiY29uc3RyYWludCIsImNvbnN0cmFpbnROb2RlTWF0Y2hlcyIsIm1hdGNoQ29uc3RyYWludE5vZGUiLCJlcXVhbFRvIiwibm9kZU1hdGNoZXMiLCJtYXRjaE5vZGUiLCJmaW5kVmFsaWRDb25zdHJhaW50IiwiZmluZENvbnN0cmFpbnRCeUNvbnN0cmFpbnROb2RlIiwidmFsaWRDb25zdHJhaW50IiwidmFsaWRhdGUiLCJjb250aW51YXRpb24iLCJjb25zdHJhaW50U3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJkZWJ1ZyIsImdldENvbnRleHQiLCJhdHRlbXB0IiwidmFsaWRhdGVTdGF0ZW1lbnQiLCJiaW5kIiwidmFsaWRhdGVSZWZlcmVuY2UiLCJhbGwiLCJ2YWxpZGF0ZXMiLCJ2YWxpZGF0ZVdoZW5TdGF0ZWQiLCJ2YWxpZGF0ZVdoZW5EZXJpdmVkIiwiZXhpc3RzIiwiYWRkQ29uc3RyYWludCIsImNvbW1pdCIsInJlZmVyZW5jZVZhbGlkYXRlcyIsIm1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZURlY2xhcmVkIiwiaXNEZWNsYXJlZCIsImRlc2NlbmQiLCJzdGF0ZW1lbnRWYWxpZGF0ZXMiLCJzdGF0ZWQiLCJpc1N0YXRlZCIsInZhbGlkYXRlc1doZW5TdGF0ZWQiLCJ2YWxpZGF0ZXNXaGVuRGVyaXZlZCIsInVuaWZ5UmVmZXJlbmNlIiwiZ2VuZXJhbENvbnRleHQiLCJzcGVjaWZpY0NvbnRleHQiLCJyZWZlcmVuY2VVbmlmaWVzIiwicmVmZXJlbmNlU3RyaW5nIiwidW5pZnlTdGF0ZW1lbnQiLCJzdGF0ZW1lbnRTdHJpbmciLCJnZW5lcmFsU3RhdGVtZW50Iiwic3BlY2lmaWNTdGF0ZW1lbnQiLCJzdHJpcEJyYWNrZXRzRnJvbVN0YXRlbWVudCIsInN0YXRlbWVudFVuaWZpZXMiLCJ1bmlmeUFzc3VtcHRpb24iLCJhc3N1bXB0aW9uIiwiYXNzdW1wdGlvblN0cmluZyIsImNvbnN0cmFpbnRDb250ZXh0IiwicmVjb25jaWxlIiwicmVmZXJuZWNlVW5pZmllcyIsImFzc3VtcHRpb25VbmlmaWVzIiwidW5pZnlBc3N1bXB0aW9ucyIsImFzc3VtcHRpb25zIiwidG9KU09OIiwic2VyaWFsaXNlIiwiZ2V0QnJlYWtQb2ludCIsImJyZWFrUG9pbnRKU09OIiwianNvbiIsIm5hbWUiLCJmcm9tSlNPTiIsImluc3RhbnRpYXRlIiwidW5zZXJpYWxpc2UiLCJpbnN0YW50aWF0ZUNvbnN0cmFpbnQiLCJyZWZlcmVuY2VGcm9tQ29uc3RyYWludE5vZGUiLCJzdGF0ZW1lbnRGcm9tQ29uc3RyYWludE5vZGUiLCJmcm9tU3RlcCIsInN0ZXAiLCJhYmxhdGUiLCJjb25zdHJhaW50U3RyaW5nRnJvbVJlZmVyZW5jZUFuZFN0YXRlbWVudCIsImNvbnN0cmFpbnRGcm9tQ29uc3RyYWludE5vZGUiLCJyZWZlcmVuY2VOb2RlIiwiZ2V0UmVmZXJlbmNlTm9kZSIsInJlZmVybmVjZSIsImZpbmRSZWZlcmVuY2VCeVJlZmVyZW5jZU5vZGUiLCJzdGF0ZW1lbnROb2RlIiwiZ2V0U3RhdGVtZW50Tm9kZSIsImZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQWdCQTs7O2VBQUE7OztnQ0Fkb0U7MEJBRTdDOzhCQUNLO3VCQUNHOzZCQUNPOzBCQUNLO3lCQUNFO3dCQUNhO3lCQUMrQjtBQUV6RixNQUFNLEVBQUVBLElBQUksRUFBRSxHQUFHQyxxQ0FBcUIsRUFDaEMsRUFBRUMsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUU5RSxXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLG1CQUFtQkMsdUJBQU87SUFDcEQsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsVUFBVSxFQUFFQyxTQUFTLEVBQUVDLFNBQVMsQ0FBRTtRQUNuRSxLQUFLLENBQUNMLFNBQVNDLFFBQVFDLE1BQU1DO1FBRTdCLElBQUksQ0FBQ0MsU0FBUyxHQUFHQTtRQUNqQixJQUFJLENBQUNDLFNBQVMsR0FBR0E7SUFDbkI7SUFFQUMsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDRixTQUFTO0lBQ3ZCO0lBRUFHLGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQ0YsU0FBUztJQUN2QjtJQUVBRyxvQkFBb0I7UUFDbEIsTUFBTU4sT0FBTyxJQUFJLENBQUNPLE9BQU8sSUFDbkJDLGlCQUFpQlIsTUFBTyxHQUFHO1FBRWpDLE9BQU9RO0lBQ1Q7SUFFQUMsa0JBQWtCO1FBQUUsT0FBTyxJQUFJLENBQUNQLFNBQVMsQ0FBQ08sZUFBZTtJQUFJO0lBRTdEQyxVQUFVQyxVQUFVLEVBQUU7UUFDcEIsTUFBTUgsaUJBQWlCRyxXQUFX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
|