occam-furtle 2.0.279 → 2.0.282
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/README.md +0 -11
- package/lib/constants.js +29 -1
- package/lib/context/block.js +15 -1
- package/lib/context/file.js +127 -50
- package/lib/element/assignment/array.js +186 -0
- package/lib/element/assignment/object.js +244 -0
- package/lib/element/assignment/variable.js +144 -0
- package/lib/element/assignments/variable.js +158 -0
- package/lib/element/block/return.js +198 -0
- package/lib/element/comparison.js +179 -0
- package/lib/element/declaration/procedure.js +139 -0
- package/lib/{dom → element}/error.js +12 -4
- package/lib/element/every.js +179 -0
- package/lib/element/expression/bitwise.js +186 -0
- package/lib/element/expression/bracketed.js +149 -0
- package/lib/element/expression/negated.js +166 -0
- package/lib/element/expression.js +578 -0
- package/lib/element/expressions.js +210 -0
- package/lib/{dom → element}/label.js +4 -4
- package/lib/element/parameter/named.js +198 -0
- package/lib/element/parameter.js +165 -0
- package/lib/element/parameters/named.js +220 -0
- package/lib/element/parameters.js +198 -0
- package/lib/element/procedure/anonymous.js +181 -0
- package/lib/element/procedure.js +212 -0
- package/lib/element/procedureCall.js +166 -0
- package/lib/element/query/node.js +186 -0
- package/lib/element/query/nodes.js +179 -0
- package/lib/element/reduce.js +181 -0
- package/lib/element/reference.js +138 -0
- package/lib/element/some.js +179 -0
- package/lib/element/statement/return.js +138 -0
- package/lib/element/step.js +154 -0
- package/lib/element/ternary.js +171 -0
- package/lib/element/variable.js +279 -0
- package/lib/elements.js +27 -0
- package/lib/index.js +10 -2
- package/lib/log.js +202 -0
- package/lib/preamble.js +32 -32
- package/lib/process/verify.js +289 -0
- package/lib/utilities/context.js +46 -5
- package/package.json +3 -1
- package/src/constants.js +16 -0
- package/src/context/block.js +10 -0
- package/src/context/file.js +96 -54
- package/src/{dom → element}/assignment/array.js +6 -6
- package/src/{dom → element}/assignment/object.js +8 -8
- package/src/{dom → element}/assignment/variable.js +4 -4
- package/src/{dom → element}/assignments/variable.js +5 -5
- package/src/{dom → element}/block/return.js +5 -5
- package/src/{dom → element}/comparison.js +5 -5
- package/src/{dom → element}/declaration/procedure.js +22 -4
- package/src/{dom → element}/error.js +13 -4
- package/src/{dom → element}/every.js +6 -6
- package/src/{dom → element}/expression/bitwise.js +5 -5
- package/src/{dom → element}/expression/bracketed.js +4 -4
- package/src/{dom → element}/expression/negated.js +5 -5
- package/src/{dom → element}/expression.js +4 -4
- package/src/{dom → element}/expressions.js +6 -6
- package/src/{dom → element}/label.js +4 -4
- package/src/{dom → element}/parameter/named.js +4 -4
- package/src/{dom → element}/parameter.js +4 -4
- package/src/{dom → element}/parameters/named.js +5 -5
- package/src/{dom → element}/parameters.js +5 -5
- package/src/{dom → element}/procedure/anonymous.js +4 -4
- package/src/{dom → element}/procedure.js +5 -5
- package/src/{dom → element}/procedureCall.js +4 -4
- package/src/{dom → element}/query/node.js +5 -5
- package/src/{dom → element}/query/nodes.js +5 -5
- package/src/{dom → element}/reduce.js +5 -5
- package/src/{dom → element}/reference.js +4 -4
- package/src/{dom → element}/some.js +6 -6
- package/src/{dom → element}/statement/return.js +4 -4
- package/src/{dom → element}/step.js +4 -4
- package/src/{dom → element}/ternary.js +4 -4
- package/src/{dom → element}/variable.js +5 -5
- package/src/elements.js +13 -0
- package/src/index.js +5 -1
- package/src/log.js +139 -0
- package/src/preamble.js +31 -31
- package/src/process/verify.js +157 -0
- package/src/utilities/context.js +45 -2
- package/test/Free and bound variables.ftl +112 -0
- package/test/context/file.js +127 -0
- package/{src/example → test}/context/release.js +60 -12
- package/test/helpers/constants.js +17 -0
- package/{src/example/utilities → test/helpers}/expressions.js +8 -4
- package/{src/example/utilities → test/helpers}/furtle.js +8 -4
- package/{src/example/utilities → test/helpers}/grammar.js +8 -4
- package/{src/example/utilities → test/helpers}/nominal.js +10 -5
- package/{src/example/utilities → test/helpers}/procedure.js +6 -2
- package/test/main.js +55 -0
- package/example/Free and bound variables.ftl +0 -75
- package/lib/dom/assignment/array.js +0 -186
- package/lib/dom/assignment/object.js +0 -244
- package/lib/dom/assignment/variable.js +0 -144
- package/lib/dom/assignments/variable.js +0 -158
- package/lib/dom/block/return.js +0 -198
- package/lib/dom/comparison.js +0 -179
- package/lib/dom/declaration/procedure.js +0 -125
- package/lib/dom/every.js +0 -179
- package/lib/dom/expression/bitwise.js +0 -186
- package/lib/dom/expression/bracketed.js +0 -149
- package/lib/dom/expression/negated.js +0 -166
- package/lib/dom/expression.js +0 -578
- package/lib/dom/expressions.js +0 -210
- package/lib/dom/parameter/named.js +0 -198
- package/lib/dom/parameter.js +0 -165
- package/lib/dom/parameters/named.js +0 -220
- package/lib/dom/parameters.js +0 -198
- package/lib/dom/procedure/anonymous.js +0 -181
- package/lib/dom/procedure.js +0 -212
- package/lib/dom/procedureCall.js +0 -166
- package/lib/dom/query/node.js +0 -186
- package/lib/dom/query/nodes.js +0 -179
- package/lib/dom/reduce.js +0 -181
- package/lib/dom/reference.js +0 -138
- package/lib/dom/some.js +0 -179
- package/lib/dom/statement/return.js +0 -138
- package/lib/dom/step.js +0 -154
- package/lib/dom/ternary.js +0 -171
- package/lib/dom/variable.js +0 -279
- package/lib/dom.js +0 -27
- package/lib/example/context/file.js +0 -130
- package/lib/example/context/release.js +0 -160
- package/lib/example/utilities/expressions.js +0 -29
- package/lib/example/utilities/furtle.js +0 -19
- package/lib/example/utilities/grammar.js +0 -26
- package/lib/example/utilities/nominal.js +0 -25
- package/lib/example/utilities/procedure.js +0 -18
- package/src/dom.js +0 -13
- package/src/example/context/file.js +0 -69
- /package/{example → test}/customGrammars.json +0 -0
package/lib/dom/expression.js
DELETED
|
@@ -1,578 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "default", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return _default;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
var _necessary = require("necessary");
|
|
12
|
-
var _dom = /*#__PURE__*/ _interop_require_wildcard(require("../dom"));
|
|
13
|
-
var _nullNode = /*#__PURE__*/ _interop_require_default(require("../nullNode"));
|
|
14
|
-
var _query = require("../utilities/query");
|
|
15
|
-
var _constants = require("../constants");
|
|
16
|
-
var _types = require("../types");
|
|
17
|
-
function _class_call_check(instance, Constructor) {
|
|
18
|
-
if (!(instance instanceof Constructor)) {
|
|
19
|
-
throw new TypeError("Cannot call a class as a function");
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
function _defineProperties(target, props) {
|
|
23
|
-
for(var i = 0; i < props.length; i++){
|
|
24
|
-
var descriptor = props[i];
|
|
25
|
-
descriptor.enumerable = descriptor.enumerable || false;
|
|
26
|
-
descriptor.configurable = true;
|
|
27
|
-
if ("value" in descriptor) descriptor.writable = true;
|
|
28
|
-
Object.defineProperty(target, descriptor.key, descriptor);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function _create_class(Constructor, protoProps, staticProps) {
|
|
32
|
-
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
33
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
34
|
-
return Constructor;
|
|
35
|
-
}
|
|
36
|
-
function _define_property(obj, key, value) {
|
|
37
|
-
if (key in obj) {
|
|
38
|
-
Object.defineProperty(obj, key, {
|
|
39
|
-
value: value,
|
|
40
|
-
enumerable: true,
|
|
41
|
-
configurable: true,
|
|
42
|
-
writable: true
|
|
43
|
-
});
|
|
44
|
-
} else {
|
|
45
|
-
obj[key] = value;
|
|
46
|
-
}
|
|
47
|
-
return obj;
|
|
48
|
-
}
|
|
49
|
-
function _interop_require_default(obj) {
|
|
50
|
-
return obj && obj.__esModule ? obj : {
|
|
51
|
-
default: obj
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
55
|
-
if (typeof WeakMap !== "function") return null;
|
|
56
|
-
var cacheBabelInterop = new WeakMap();
|
|
57
|
-
var cacheNodeInterop = new WeakMap();
|
|
58
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
59
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
60
|
-
})(nodeInterop);
|
|
61
|
-
}
|
|
62
|
-
function _interop_require_wildcard(obj, nodeInterop) {
|
|
63
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
64
|
-
return obj;
|
|
65
|
-
}
|
|
66
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
67
|
-
return {
|
|
68
|
-
default: obj
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
72
|
-
if (cache && cache.has(obj)) {
|
|
73
|
-
return cache.get(obj);
|
|
74
|
-
}
|
|
75
|
-
var newObj = {
|
|
76
|
-
__proto__: null
|
|
77
|
-
};
|
|
78
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
79
|
-
for(var key in obj){
|
|
80
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
81
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
82
|
-
if (desc && (desc.get || desc.set)) {
|
|
83
|
-
Object.defineProperty(newObj, key, desc);
|
|
84
|
-
} else {
|
|
85
|
-
newObj[key] = obj[key];
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
newObj.default = obj;
|
|
90
|
-
if (cache) {
|
|
91
|
-
cache.set(obj, newObj);
|
|
92
|
-
}
|
|
93
|
-
return newObj;
|
|
94
|
-
}
|
|
95
|
-
var _Expression;
|
|
96
|
-
var match = _necessary.arrayUtilities.match;
|
|
97
|
-
var numberTerminalNodeQuery = (0, _query.nodeQuery)("/expression/@number"), reduceExpressionNodeQuery = (0, _query.nodeQuery)("/reduce/expression"), primitiveTerminalNodeQuery = (0, _query.nodeQuery)("/expression/@primitive"), ternaryExpressionNodeQuery = (0, _query.nodeQuery)("/ternary/expression"), stringLiteralTerminalNodeQuery = (0, _query.nodeQuery)("/expression/@string-literal"), returnStatementExpressionNodeQuery = (0, _query.nodeQuery)("/returnStatement/expression"), variableAssignmentExpressionNodeQuery = (0, _query.nodeQuery)("/variableAssignment/expression");
|
|
98
|
-
var _default = (0, _dom.domAssigned)((_Expression = /*#__PURE__*/ function() {
|
|
99
|
-
function Expression(node, nodes, number, string, boolean, some, every, reduce, ternary, variable, nodeQuery, nodesQuery, comparison, returnBlock, procedureCall, negatedExpression, bitwiseExpression, bracketedExpression) {
|
|
100
|
-
_class_call_check(this, Expression);
|
|
101
|
-
this.node = node;
|
|
102
|
-
this.nodes = nodes;
|
|
103
|
-
this.number = number;
|
|
104
|
-
this.string = string;
|
|
105
|
-
this.boolean = boolean;
|
|
106
|
-
this.some = some;
|
|
107
|
-
this.every = every;
|
|
108
|
-
this.reduce = reduce;
|
|
109
|
-
this.ternary = ternary;
|
|
110
|
-
this.variable = variable;
|
|
111
|
-
this.nodeQuery = nodeQuery;
|
|
112
|
-
this.nodesQuery = nodesQuery;
|
|
113
|
-
this.comparison = comparison;
|
|
114
|
-
this.returnBlock = returnBlock;
|
|
115
|
-
this.procedureCall = procedureCall;
|
|
116
|
-
this.negatedExpression = negatedExpression;
|
|
117
|
-
this.bitwiseExpression = bitwiseExpression;
|
|
118
|
-
this.bracketedExpression = bracketedExpression;
|
|
119
|
-
}
|
|
120
|
-
_create_class(Expression, [
|
|
121
|
-
{
|
|
122
|
-
key: "getNode",
|
|
123
|
-
value: function getNode() {
|
|
124
|
-
return this.node;
|
|
125
|
-
}
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
key: "getNodes",
|
|
129
|
-
value: function getNodes() {
|
|
130
|
-
return this.nodes;
|
|
131
|
-
}
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
key: "getNumber",
|
|
135
|
-
value: function getNumber() {
|
|
136
|
-
return this.number;
|
|
137
|
-
}
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
key: "getString",
|
|
141
|
-
value: function getString() {
|
|
142
|
-
return this.string;
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
key: "getBoolean",
|
|
147
|
-
value: function getBoolean() {
|
|
148
|
-
return this.boolean;
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
key: "getSome",
|
|
153
|
-
value: function getSome() {
|
|
154
|
-
return this.some;
|
|
155
|
-
}
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
key: "getEvery",
|
|
159
|
-
value: function getEvery() {
|
|
160
|
-
return this.every;
|
|
161
|
-
}
|
|
162
|
-
},
|
|
163
|
-
{
|
|
164
|
-
key: "getReduce",
|
|
165
|
-
value: function getReduce() {
|
|
166
|
-
return this.reduce;
|
|
167
|
-
}
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
key: "getTernary",
|
|
171
|
-
value: function getTernary() {
|
|
172
|
-
return this.ternay;
|
|
173
|
-
}
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
key: "getVariable",
|
|
177
|
-
value: function getVariable() {
|
|
178
|
-
return this.variable;
|
|
179
|
-
}
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
key: "getNodeQuery",
|
|
183
|
-
value: function getNodeQuery() {
|
|
184
|
-
return this.nodeQuery;
|
|
185
|
-
}
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
key: "getNodesQuery",
|
|
189
|
-
value: function getNodesQuery() {
|
|
190
|
-
return this.nodesQuery;
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
key: "getComparison",
|
|
195
|
-
value: function getComparison() {
|
|
196
|
-
return this.comparison;
|
|
197
|
-
}
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
key: "getReturnBlock",
|
|
201
|
-
value: function getReturnBlock() {
|
|
202
|
-
return this.returnBlock;
|
|
203
|
-
}
|
|
204
|
-
},
|
|
205
|
-
{
|
|
206
|
-
key: "getProcedureCall",
|
|
207
|
-
value: function getProcedureCall() {
|
|
208
|
-
return this.procedureCall;
|
|
209
|
-
}
|
|
210
|
-
},
|
|
211
|
-
{
|
|
212
|
-
key: "getNegatedExpression",
|
|
213
|
-
value: function getNegatedExpression() {
|
|
214
|
-
return this.negatedExpression;
|
|
215
|
-
}
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
key: "getBitwiseExpression",
|
|
219
|
-
value: function getBitwiseExpression() {
|
|
220
|
-
return this.bitwiseExpression;
|
|
221
|
-
}
|
|
222
|
-
},
|
|
223
|
-
{
|
|
224
|
-
key: "getBracketedExpression",
|
|
225
|
-
value: function getBracketedExpression() {
|
|
226
|
-
return this.bracketedExpression;
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
key: "getType",
|
|
231
|
-
value: function getType() {
|
|
232
|
-
var type;
|
|
233
|
-
if (false) {
|
|
234
|
-
///
|
|
235
|
-
} else if (this.node !== null) {
|
|
236
|
-
type = _types.NODE_TYPE;
|
|
237
|
-
} else if (this.nodes !== null) {
|
|
238
|
-
type = _types.NODES_TYPE;
|
|
239
|
-
} else if (this.number !== null) {
|
|
240
|
-
type = _types.NUMBER_TYPE;
|
|
241
|
-
} else if (this.string !== null) {
|
|
242
|
-
type = _types.STRING_TYPE;
|
|
243
|
-
} else if (this.boolean !== null) {
|
|
244
|
-
type = _types.BOOLEAN_TYPE;
|
|
245
|
-
} else if (this.some !== null) {
|
|
246
|
-
type = this.some.getType();
|
|
247
|
-
} else if (this.every !== null) {
|
|
248
|
-
type = this.every.getType();
|
|
249
|
-
} else if (this.reduce !== null) {
|
|
250
|
-
type = this.reduce.getType();
|
|
251
|
-
} else if (this.ternary !== null) {
|
|
252
|
-
type = this.ternary.getType();
|
|
253
|
-
} else if (this.variable !== null) {
|
|
254
|
-
type = this.variable.getType();
|
|
255
|
-
} else if (this.nodeQuery !== null) {
|
|
256
|
-
type = this.nodeQuery.getType();
|
|
257
|
-
} else if (this.nodesQuery !== null) {
|
|
258
|
-
type = this.nodesQuery.getType();
|
|
259
|
-
} else if (this.comparison !== null) {
|
|
260
|
-
type = this.comparison.getType();
|
|
261
|
-
} else if (this.returnBlock !== null) {
|
|
262
|
-
type = this.returnBlock.getType();
|
|
263
|
-
} else if (this.procedureCall !== null) {
|
|
264
|
-
type = this.procedureCall.getType();
|
|
265
|
-
} else if (this.negatedExpression !== null) {
|
|
266
|
-
type = this.negatedExpression.getType();
|
|
267
|
-
} else if (this.bitwiseExpression !== null) {
|
|
268
|
-
type = this.bitwiseExpression.getType();
|
|
269
|
-
} else if (this.bracketedExpression !== null) {
|
|
270
|
-
type = this.bracketedExpression.getType();
|
|
271
|
-
}
|
|
272
|
-
return type;
|
|
273
|
-
}
|
|
274
|
-
},
|
|
275
|
-
{
|
|
276
|
-
key: "asString",
|
|
277
|
-
value: function asString(context) {
|
|
278
|
-
var string;
|
|
279
|
-
if (false) {
|
|
280
|
-
///
|
|
281
|
-
} else if (this.node !== null) {
|
|
282
|
-
string = nodeAsString(this.node, context);
|
|
283
|
-
} else if (this.nodes !== null) {
|
|
284
|
-
string = nodesAsString(this.nodes, context);
|
|
285
|
-
} else if (this.number !== null) {
|
|
286
|
-
string = numberAsString(this.number);
|
|
287
|
-
} else if (this.string !== null) {
|
|
288
|
-
string = stringAsString(this.string);
|
|
289
|
-
} else if (this.boolean !== null) {
|
|
290
|
-
string = booleanAsString(this.boolean);
|
|
291
|
-
} else if (this.some !== null) {
|
|
292
|
-
string = this.some.getString();
|
|
293
|
-
} else if (this.every !== null) {
|
|
294
|
-
string = this.every.getString();
|
|
295
|
-
} else if (this.reduce !== null) {
|
|
296
|
-
string = this.reduce.getString();
|
|
297
|
-
} else if (this.ternary !== null) {
|
|
298
|
-
string = this.ternary.getString();
|
|
299
|
-
} else if (this.variable !== null) {
|
|
300
|
-
string = this.variable.getString();
|
|
301
|
-
} else if (this.nodeQuery !== null) {
|
|
302
|
-
string = this.nodeQuery.getString();
|
|
303
|
-
} else if (this.nodesQuery !== null) {
|
|
304
|
-
string = this.nodesQuery.getString();
|
|
305
|
-
} else if (this.comparison !== null) {
|
|
306
|
-
string = this.comparison.getString();
|
|
307
|
-
} else if (this.returnBlock !== null) {
|
|
308
|
-
string = this.returnBlock.getString();
|
|
309
|
-
} else if (this.procedureCall !== null) {
|
|
310
|
-
string = this.procedureCall.getString();
|
|
311
|
-
} else if (this.negatedExpression !== null) {
|
|
312
|
-
string = this.negatedExpression.getString();
|
|
313
|
-
} else if (this.bitwiseExpression !== null) {
|
|
314
|
-
string = this.bitwiseExpression.getString();
|
|
315
|
-
} else if (this.bracketedExpression !== null) {
|
|
316
|
-
string = this.bracketedExpression.getString();
|
|
317
|
-
}
|
|
318
|
-
return string;
|
|
319
|
-
}
|
|
320
|
-
},
|
|
321
|
-
{
|
|
322
|
-
key: "evaluate",
|
|
323
|
-
value: function evaluate(context) {
|
|
324
|
-
var expression;
|
|
325
|
-
if (false) {
|
|
326
|
-
///
|
|
327
|
-
} else if (this.node !== null || this.nodes !== null || this.number !== null || this.string !== null || this.boolean !== null) {
|
|
328
|
-
expression = this;
|
|
329
|
-
} else if (this.some !== null) {
|
|
330
|
-
expression = this.some.evaluate(context);
|
|
331
|
-
} else if (this.every !== null) {
|
|
332
|
-
expression = this.every.evaluate(context);
|
|
333
|
-
} else if (this.reduce !== null) {
|
|
334
|
-
expression = this.reduce.evaluate(context);
|
|
335
|
-
} else if (this.ternary !== null) {
|
|
336
|
-
expression = this.ternary.evaluate(context);
|
|
337
|
-
} else if (this.variable !== null) {
|
|
338
|
-
expression = this.variable.evaluate(context);
|
|
339
|
-
} else if (this.nodeQuery !== null) {
|
|
340
|
-
expression = this.nodeQuery.evaluate(context);
|
|
341
|
-
} else if (this.nodesQuery !== null) {
|
|
342
|
-
expression = this.nodesQuery.evaluate(context);
|
|
343
|
-
} else if (this.comparison !== null) {
|
|
344
|
-
expression = this.comparison.evaluate(context);
|
|
345
|
-
} else if (this.returnBlock !== null) {
|
|
346
|
-
expression = this.returnBlock.evaluate(context);
|
|
347
|
-
} else if (this.procedureCall !== null) {
|
|
348
|
-
expression = this.procedureCall.evaluate(context);
|
|
349
|
-
} else if (this.negatedExpression !== null) {
|
|
350
|
-
expression = this.negatedExpression.evaluate(context);
|
|
351
|
-
} else if (this.bitwiseExpression !== null) {
|
|
352
|
-
expression = this.bitwiseExpression.evaluate(context);
|
|
353
|
-
} else if (this.bracketedExpression !== null) {
|
|
354
|
-
expression = this.bracketedExpression.evaluate(context);
|
|
355
|
-
}
|
|
356
|
-
return expression;
|
|
357
|
-
}
|
|
358
|
-
},
|
|
359
|
-
{
|
|
360
|
-
key: "isEqualTo",
|
|
361
|
-
value: function isEqualTo(expression) {
|
|
362
|
-
var equalTo;
|
|
363
|
-
if (false) {
|
|
364
|
-
///
|
|
365
|
-
} else if (this.node !== null) {
|
|
366
|
-
var node = expression.getNode();
|
|
367
|
-
if (node === null) {
|
|
368
|
-
equalTo = false;
|
|
369
|
-
} else {
|
|
370
|
-
var nodeA = this.node, nodeB = node, nodeMatches = matchNode(nodeA, nodeB);
|
|
371
|
-
equalTo = nodeMatches; ///
|
|
372
|
-
}
|
|
373
|
-
} else if (this.nodes !== null) {
|
|
374
|
-
var nodes = expression.getNode();
|
|
375
|
-
if (nodes === null) {
|
|
376
|
-
equalTo = false;
|
|
377
|
-
} else {
|
|
378
|
-
var nodesA = this.nodes, nodesB = nodes, nodesMatch = matchNodes(nodesA, nodesB);
|
|
379
|
-
equalTo = nodesMatch; ///
|
|
380
|
-
}
|
|
381
|
-
} else if (this.number !== null) {
|
|
382
|
-
var number = expression.getNumber();
|
|
383
|
-
equalTo = this.number === number;
|
|
384
|
-
} else if (this.string !== null) {
|
|
385
|
-
var string = expression.getString();
|
|
386
|
-
equalTo = this.string === string;
|
|
387
|
-
} else if (this.boolean !== null) {
|
|
388
|
-
var boolean = expression.getBoolean();
|
|
389
|
-
equalTo = this.boolean === boolean;
|
|
390
|
-
} else {
|
|
391
|
-
debugger;
|
|
392
|
-
}
|
|
393
|
-
return equalTo;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
], [
|
|
397
|
-
{
|
|
398
|
-
key: "fromNode",
|
|
399
|
-
value: function fromNode(node, context) {
|
|
400
|
-
if (node === null) {
|
|
401
|
-
node = _nullNode.default;
|
|
402
|
-
}
|
|
403
|
-
var nodes = null, number = null, string = null, boolean = null, some = null, every = null, reduce = null, ternary = null, variable = null, _$nodeQuery = null, nodesQuery = null, comparison = null, returnBlock = null, procedureCall = null, negatedExpression = null, bitwiseExpression = null, bracketedExpression = null, expression = new Expression(node, nodes, number, string, boolean, some, every, reduce, ternary, variable, _$nodeQuery, nodesQuery, comparison, returnBlock, procedureCall, negatedExpression, bitwiseExpression, bracketedExpression);
|
|
404
|
-
return expression;
|
|
405
|
-
}
|
|
406
|
-
},
|
|
407
|
-
{
|
|
408
|
-
key: "fromNodes",
|
|
409
|
-
value: function fromNodes(nodes, context) {
|
|
410
|
-
var node = null, number = null, string = null, boolean = null, ternary = null, some = null, every = null, reduce = null, variable = null, _$nodeQuery = null, nodesQuery = null, comparison = null, returnBlock = null, procedureCall = null, negatedExpression = null, bitwiseExpression = null, bracketedExpression = null, expression = new Expression(node, nodes, number, string, boolean, some, every, reduce, ternary, variable, _$nodeQuery, nodesQuery, comparison, returnBlock, procedureCall, negatedExpression, bitwiseExpression, bracketedExpression);
|
|
411
|
-
return expression;
|
|
412
|
-
}
|
|
413
|
-
},
|
|
414
|
-
{
|
|
415
|
-
key: "fromString",
|
|
416
|
-
value: function fromString(string, context) {
|
|
417
|
-
var node = null, nodes = null, number = null, boolean = null, some = null, every = null, reduce = null, ternary = null, variable = null, _$nodeQuery = null, nodesQuery = null, comparison = null, returnBlock = null, procedureCall = null, negatedExpression = null, bitwiseExpression = null, bracketedExpression = null, expression = new Expression(node, nodes, number, string, boolean, some, every, reduce, ternary, variable, _$nodeQuery, nodesQuery, comparison, returnBlock, procedureCall, negatedExpression, bitwiseExpression, bracketedExpression);
|
|
418
|
-
return expression;
|
|
419
|
-
}
|
|
420
|
-
},
|
|
421
|
-
{
|
|
422
|
-
key: "fromBoolean",
|
|
423
|
-
value: function fromBoolean(boolean, context) {
|
|
424
|
-
var node = null, nodes = null, number = null, string = null, some = null, every = null, reduce = null, ternary = null, variable = null, _$nodeQuery = null, nodesQuery = null, comparison = null, returnBlock = null, procedureCall = null, negatedExpression = null, bitwiseExpression = null, bracketedExpression = null, expression = new Expression(node, nodes, number, string, boolean, some, every, reduce, ternary, variable, _$nodeQuery, nodesQuery, comparison, returnBlock, procedureCall, negatedExpression, bitwiseExpression, bracketedExpression);
|
|
425
|
-
return expression;
|
|
426
|
-
}
|
|
427
|
-
},
|
|
428
|
-
{
|
|
429
|
-
key: "fromExpressionNode",
|
|
430
|
-
value: function fromExpressionNode(expressionNode, context) {
|
|
431
|
-
var expression = expressionFromExpressionNode(expressionNode, context);
|
|
432
|
-
return expression;
|
|
433
|
-
}
|
|
434
|
-
},
|
|
435
|
-
{
|
|
436
|
-
key: "fromReduceNode",
|
|
437
|
-
value: function fromReduceNode(reduceNode, context) {
|
|
438
|
-
var reduceExpressionNode = reduceExpressionNodeQuery(reduceNode), expressionNode = reduceExpressionNode, expression = expressionFromExpressionNode(expressionNode, context);
|
|
439
|
-
return expression;
|
|
440
|
-
}
|
|
441
|
-
},
|
|
442
|
-
{
|
|
443
|
-
key: "fromTernaryNode",
|
|
444
|
-
value: function fromTernaryNode(ternaryNode, context) {
|
|
445
|
-
var ternaryExpressionNode = ternaryExpressionNodeQuery(ternaryNode), expressionNode = ternaryExpressionNode, expression = expressionFromExpressionNode(expressionNode, context);
|
|
446
|
-
return expression;
|
|
447
|
-
}
|
|
448
|
-
},
|
|
449
|
-
{
|
|
450
|
-
key: "fromReturnStatementNode",
|
|
451
|
-
value: function fromReturnStatementNode(returnStatementNode, context) {
|
|
452
|
-
var returnStatementExpressionNode = returnStatementExpressionNodeQuery(returnStatementNode), expressionNode = returnStatementExpressionNode, expression = expressionFromExpressionNode(expressionNode, context);
|
|
453
|
-
return expression;
|
|
454
|
-
}
|
|
455
|
-
},
|
|
456
|
-
{
|
|
457
|
-
key: "fromVariableAssignmentNode",
|
|
458
|
-
value: function fromVariableAssignmentNode(variableAssigmentNode, context) {
|
|
459
|
-
var variableAssignmentExpressionNode = variableAssignmentExpressionNodeQuery(variableAssigmentNode), expressionNode = variableAssignmentExpressionNode, expression = expressionFromExpressionNode(expressionNode, context);
|
|
460
|
-
return expression;
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
]);
|
|
464
|
-
return Expression;
|
|
465
|
-
}(), _define_property(_Expression, "name", "Expression"), _Expression));
|
|
466
|
-
function matchNode(nodeA, nodeB) {
|
|
467
|
-
var nodeMatches;
|
|
468
|
-
if (nodeA === _nullNode.default || nodeB === _nullNode.default) {
|
|
469
|
-
nodeMatches = nodeA === nodeB;
|
|
470
|
-
} else {
|
|
471
|
-
var nodeAEqualToNodeA = nodeA.isEqualTo(nodeB);
|
|
472
|
-
nodeMatches = nodeAEqualToNodeA; ///
|
|
473
|
-
}
|
|
474
|
-
return nodeMatches;
|
|
475
|
-
}
|
|
476
|
-
function matchNodes(nodesA, nodesB) {
|
|
477
|
-
var nodesMatch;
|
|
478
|
-
nodesMatch = match(nodesA, nodesB, function(nodeA, nodeB) {
|
|
479
|
-
var nodeMatches = matchNode(nodeA, nodeB);
|
|
480
|
-
if (nodeMatches) {
|
|
481
|
-
return true;
|
|
482
|
-
}
|
|
483
|
-
});
|
|
484
|
-
return nodesMatch;
|
|
485
|
-
}
|
|
486
|
-
function nodeAsString(node, context) {
|
|
487
|
-
var string;
|
|
488
|
-
var nodeString = node === _nullNode.default ? _constants.NULL : context.nodeAsString(node);
|
|
489
|
-
string = "'".concat(nodeString, "'");
|
|
490
|
-
return string;
|
|
491
|
-
}
|
|
492
|
-
function nodesAsString(nodes, context) {
|
|
493
|
-
var string;
|
|
494
|
-
var nodesString = context.nodesAsString(nodes);
|
|
495
|
-
string = "'".concat(nodesString, "'");
|
|
496
|
-
return string;
|
|
497
|
-
}
|
|
498
|
-
function numberAsString(number) {
|
|
499
|
-
var string;
|
|
500
|
-
string = "".concat(number);
|
|
501
|
-
return string;
|
|
502
|
-
}
|
|
503
|
-
function stringAsString(string) {
|
|
504
|
-
string = '"'.concat(string, '"'); ///
|
|
505
|
-
return string;
|
|
506
|
-
}
|
|
507
|
-
function booleanAsString(boolean) {
|
|
508
|
-
var string;
|
|
509
|
-
string = "'".concat(boolean, "'");
|
|
510
|
-
return string;
|
|
511
|
-
}
|
|
512
|
-
function expressionFromExpressionNode(expressionNode, context) {
|
|
513
|
-
var Some = _dom.default.Some, Every = _dom.default.Every, Reduce = _dom.default.Reduce, Expression = _dom.default.Expression, Ternary = _dom.default.Ternary, Variable = _dom.default.Variable, NodeQuery = _dom.default.NodeQuery, NodesQuery = _dom.default.NodesQuery, Comparison = _dom.default.Comparison, ReturnBlock = _dom.default.ReturnBlock, ProcedureCall = _dom.default.ProcedureCall, NegatedExpression = _dom.default.NegatedExpression, BitwiseExpression = _dom.default.BitwiseExpression, BracketedExpression = _dom.default.BracketedExpression, node = nodeFromExpressionNode(expressionNode, context), nodes = nodesFromExpressionNode(expressionNode, context), number = numberFromExpressionNode(expressionNode, context), string = stringFromExpressionNode(expressionNode, context), boolean = booleanFromExpressionNode(expressionNode, context), some = Some.fromExpressionNode(expressionNode, context), every = Every.fromExpressionNode(expressionNode, context), reduce = Reduce.fromExpressionNode(expressionNode, context), ternary = Ternary.fromExpressionNode(expressionNode, context), variable = Variable.fromExpressionNode(expressionNode, context), _$nodeQuery = NodeQuery.fromExpressionNode(expressionNode, context), nodesQuery = NodesQuery.fromExpressionNode(expressionNode, context), comparison = Comparison.fromExpressionNode(expressionNode, context), returnBlock = ReturnBlock.fromExpressionNode(expressionNode, context), procedureCall = ProcedureCall.fromExpressionNode(expressionNode, context), negatedExpression = NegatedExpression.fromExpressionNode(expressionNode, context), bitwiseExpression = BitwiseExpression.fromExpressionNode(expressionNode, context), bracketedExpression = BracketedExpression.fromExpressionNode(expressionNode, context), expression = new Expression(node, nodes, number, string, boolean, some, every, reduce, ternary, variable, _$nodeQuery, nodesQuery, comparison, returnBlock, procedureCall, negatedExpression, bitwiseExpression, bracketedExpression);
|
|
514
|
-
return expression;
|
|
515
|
-
}
|
|
516
|
-
function nodeFromExpressionNode(expressionNode, context) {
|
|
517
|
-
var node = null;
|
|
518
|
-
var primitiveTerminalNode = primitiveTerminalNodeQuery(expressionNode);
|
|
519
|
-
if (primitiveTerminalNode !== null) {
|
|
520
|
-
var primitiveTerminalNodeContent = primitiveTerminalNode.getContent();
|
|
521
|
-
switch(primitiveTerminalNodeContent){
|
|
522
|
-
case _constants.NULL:
|
|
523
|
-
{
|
|
524
|
-
node = _nullNode.default;
|
|
525
|
-
break;
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
return node;
|
|
530
|
-
}
|
|
531
|
-
function nodesFromExpressionNode(expressionNode, context) {
|
|
532
|
-
var nodes = null; ///
|
|
533
|
-
return nodes;
|
|
534
|
-
}
|
|
535
|
-
function numberFromExpressionNode(expressionNode, context) {
|
|
536
|
-
var number = null;
|
|
537
|
-
var numberTerminalNode = numberTerminalNodeQuery(expressionNode);
|
|
538
|
-
if (numberTerminalNode !== null) {
|
|
539
|
-
var numberTerminalNodeContent = numberTerminalNode.getContent();
|
|
540
|
-
number = Number(numberTerminalNodeContent);
|
|
541
|
-
}
|
|
542
|
-
return number;
|
|
543
|
-
}
|
|
544
|
-
function stringFromExpressionNode(expressionNode, context) {
|
|
545
|
-
var string = null;
|
|
546
|
-
var stringLiteralTerminalNode = stringLiteralTerminalNodeQuery(expressionNode);
|
|
547
|
-
if (stringLiteralTerminalNode !== null) {
|
|
548
|
-
var stringLiteralTerminalNodeContent = stringLiteralTerminalNode.getContent(), stringLiteral = stringLiteralTerminalNodeContent; ///
|
|
549
|
-
string = stringFromStringLiteral(stringLiteral, context);
|
|
550
|
-
}
|
|
551
|
-
return string;
|
|
552
|
-
}
|
|
553
|
-
function booleanFromExpressionNode(expressionNode, context) {
|
|
554
|
-
var boolean = null;
|
|
555
|
-
var primitiveTerminalNode = primitiveTerminalNodeQuery(expressionNode);
|
|
556
|
-
if (primitiveTerminalNode !== null) {
|
|
557
|
-
var primitiveTerminalNodeContent = primitiveTerminalNode.getContent();
|
|
558
|
-
switch(primitiveTerminalNodeContent){
|
|
559
|
-
case _constants.TRUE:
|
|
560
|
-
{
|
|
561
|
-
boolean = true;
|
|
562
|
-
break;
|
|
563
|
-
}
|
|
564
|
-
case _constants.FALSE:
|
|
565
|
-
{
|
|
566
|
-
boolean = false;
|
|
567
|
-
break;
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
return boolean;
|
|
572
|
-
}
|
|
573
|
-
function stringFromStringLiteral(stringLiteral, context) {
|
|
574
|
-
var string = stringLiteral.replace(/(^"|"$)/g, _constants.EMPTY_STRING);
|
|
575
|
-
return string;
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kb20vZXhwcmVzc2lvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBkb20gZnJvbSBcIi4uL2RvbVwiO1xuaW1wb3J0IG51bGxOb2RlIGZyb20gXCIuLi9udWxsTm9kZVwiO1xuXG5pbXBvcnQgeyBub2RlUXVlcnkgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3F1ZXJ5XCI7XG5pbXBvcnQgeyBkb21Bc3NpZ25lZCB9IGZyb20gXCIuLi9kb21cIjtcbmltcG9ydCB7IE5VTEwsIFRSVUUsIEZBTFNFLCBFTVBUWV9TVFJJTkcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBOT0RFX1RZUEUsIE5PREVTX1RZUEUsIE5VTUJFUl9UWVBFLCBTVFJJTkdfVFlQRSwgQk9PTEVBTl9UWVBFIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmNvbnN0IHsgbWF0Y2ggfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5jb25zdCBudW1iZXJUZXJtaW5hbE5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9leHByZXNzaW9uL0BudW1iZXJcIiksXG4gICAgICByZWR1Y2VFeHByZXNzaW9uTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL3JlZHVjZS9leHByZXNzaW9uXCIpLFxuICAgICAgcHJpbWl0aXZlVGVybWluYWxOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvZXhwcmVzc2lvbi9AcHJpbWl0aXZlXCIpLFxuICAgICAgdGVybmFyeUV4cHJlc3Npb25Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvdGVybmFyeS9leHByZXNzaW9uXCIpLFxuICAgICAgc3RyaW5nTGl0ZXJhbFRlcm1pbmFsTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL2V4cHJlc3Npb24vQHN0cmluZy1saXRlcmFsXCIpLFxuICAgICAgcmV0dXJuU3RhdGVtZW50RXhwcmVzc2lvbk5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9yZXR1cm5TdGF0ZW1lbnQvZXhwcmVzc2lvblwiKSxcbiAgICAgIHZhcmlhYmxlQXNzaWdubWVudEV4cHJlc3Npb25Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvdmFyaWFibGVBc3NpZ25tZW50L2V4cHJlc3Npb25cIik7XG5cbmV4cG9ydCBkZWZhdWx0IGRvbUFzc2lnbmVkKGNsYXNzIEV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3Rvcihub2RlLCBub2RlcywgbnVtYmVyLCBzdHJpbmcsIGJvb2xlYW4sIHNvbWUsIGV2ZXJ5LCByZWR1Y2UsIHRlcm5hcnksIHZhcmlhYmxlLCBub2RlUXVlcnksIG5vZGVzUXVlcnksIGNvbXBhcmlzb24sIHJldHVybkJsb2NrLCBwcm9jZWR1cmVDYWxsLCBuZWdhdGVkRXhwcmVzc2lvbiwgYml0d2lzZUV4cHJlc3Npb24sIGJyYWNrZXRlZEV4cHJlc3Npb24pIHtcbiAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIHRoaXMubm9kZXMgPSBub2RlcztcbiAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICB0aGlzLnN0cmluZyA9IHN0cmluZztcbiAgICB0aGlzLmJvb2xlYW4gPSBib29sZWFuO1xuICAgIHRoaXMuc29tZSA9IHNvbWU7XG4gICAgdGhpcy5ldmVyeSA9IGV2ZXJ5O1xuICAgIHRoaXMucmVkdWNlID0gcmVkdWNlO1xuICAgIHRoaXMudGVybmFyeSA9IHRlcm5hcnk7XG4gICAgdGhpcy52YXJpYWJsZSA9IHZhcmlhYmxlO1xuICAgIHRoaXMubm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5O1xuICAgIHRoaXMubm9kZXNRdWVyeSA9IG5vZGVzUXVlcnk7XG4gICAgdGhpcy5jb21wYXJpc29uID0gY29tcGFyaXNvbjtcbiAgICB0aGlzLnJldHVybkJsb2NrID0gcmV0dXJuQmxvY2s7XG4gICAgdGhpcy5wcm9jZWR1cmVDYWxsID0gcHJvY2VkdXJlQ2FsbDtcbiAgICB0aGlzLm5lZ2F0ZWRFeHByZXNzaW9uID0gbmVnYXRlZEV4cHJlc3Npb247XG4gICAgdGhpcy5iaXR3aXNlRXhwcmVzc2lvbiA9IGJpdHdpc2VFeHByZXNzaW9uO1xuICAgIHRoaXMuYnJhY2tldGVkRXhwcmVzc2lvbiA9IGJyYWNrZXRlZEV4cHJlc3Npb247XG4gIH1cblxuICBnZXROb2RlKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGU7XG4gIH1cblxuICBnZXROb2RlcygpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlcztcbiAgfVxuXG4gIGdldE51bWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5udW1iZXI7XG4gIH1cblxuICBnZXRTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyaW5nO1xuICB9XG5cbiAgZ2V0Qm9vbGVhbigpIHtcbiAgICByZXR1cm4gdGhpcy5ib29sZWFuO1xuICB9XG5cbiAgZ2V0U29tZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zb21lO1xuICB9XG5cbiAgZ2V0RXZlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXZlcnk7XG4gIH1cblxuICBnZXRSZWR1Y2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVkdWNlO1xuICB9XG5cbiAgZ2V0VGVybmFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXJuYXk7XG4gIH1cblxuICBnZXRWYXJpYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy52YXJpYWJsZTtcbiAgfVxuXG4gIGdldE5vZGVRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlUXVlcnk7XG4gIH1cblxuICBnZXROb2Rlc1F1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzUXVlcnk7XG4gIH1cblxuICBnZXRDb21wYXJpc29uKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXBhcmlzb247XG4gIH1cblxuICBnZXRSZXR1cm5CbG9jaygpIHtcbiAgICByZXR1cm4gdGhpcy5yZXR1cm5CbG9jaztcbiAgfVxuXG4gIGdldFByb2NlZHVyZUNhbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvY2VkdXJlQ2FsbDtcbiAgfVxuXG4gIGdldE5lZ2F0ZWRFeHByZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLm5lZ2F0ZWRFeHByZXNzaW9uO1xuICB9XG5cbiAgZ2V0Qml0d2lzZUV4cHJlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYml0d2lzZUV4cHJlc3Npb247XG4gIH1cblxuICBnZXRCcmFja2V0ZWRFeHByZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmJyYWNrZXRlZEV4cHJlc3Npb247XG4gIH1cblxuICBnZXRUeXBlKCkge1xuICAgIGxldCB0eXBlO1xuXG4gICAgaWYgKGZhbHNlKSB7XG4gICAgICAvLy9cbiAgICB9IGVsc2UgaWYgKHRoaXMubm9kZSAhPT0gbnVsbCkge1xuICAgICAgdHlwZSA9IE5PREVfVFlQRTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubm9kZXMgIT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSBOT0RFU19UWVBFO1xuICAgIH0gZWxzZSBpZiAodGhpcy5udW1iZXIgIT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSBOVU1CRVJfVFlQRTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RyaW5nICE9PSBudWxsKSB7XG4gICAgICB0eXBlID0gU1RSSU5HX1RZUEU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmJvb2xlYW4gIT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSBCT09MRUFOX1RZUEU7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNvbWUgIT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSB0aGlzLnNvbWUuZ2V0VHlwZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ldmVyeSAhPT0gbnVsbCkge1xuICAgICAgdHlwZSA9IHRoaXMuZXZlcnkuZ2V0VHlwZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yZWR1Y2UgIT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSB0aGlzLnJlZHVjZS5nZXRUeXBlKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnRlcm5hcnkgIT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSB0aGlzLnRlcm5hcnkuZ2V0VHlwZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy52YXJpYWJsZSAhPT0gbnVsbCkge1xuICAgICAgdHlwZSA9IHRoaXMudmFyaWFibGUuZ2V0VHlwZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlUXVlcnkgIT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSB0aGlzLm5vZGVRdWVyeS5nZXRUeXBlKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm5vZGVzUXVlcnkgIT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSB0aGlzLm5vZGVzUXVlcnkuZ2V0VHlwZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb21wYXJpc29uICE9PSBudWxsKSB7XG4gICAgICB0eXBlID0gdGhpcy5jb21wYXJpc29uLmdldFR5cGUoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucmV0dXJuQmxvY2sgIT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSB0aGlzLnJldHVybkJsb2NrLmdldFR5cGUoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvY2VkdXJlQ2FsbCAhPT0gbnVsbCkge1xuICAgICAgdHlwZSA9IHRoaXMucHJvY2VkdXJlQ2FsbC5nZXRUeXBlKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0ZWRFeHByZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICB0eXBlID0gdGhpcy5uZWdhdGVkRXhwcmVzc2lvbi5nZXRUeXBlKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmJpdHdpc2VFeHByZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICB0eXBlID0gdGhpcy5iaXR3aXNlRXhwcmVzc2lvbi5nZXRUeXBlKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmJyYWNrZXRlZEV4cHJlc3Npb24gIT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSB0aGlzLmJyYWNrZXRlZEV4cHJlc3Npb24uZ2V0VHlwZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgYXNTdHJpbmcoY29udGV4dCkge1xuICAgIGxldCBzdHJpbmc7XG5cbiAgICBpZiAoZmFsc2UpIHtcbiAgICAgIC8vL1xuICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlICE9PSBudWxsKSB7XG4gICAgICBzdHJpbmcgPSBub2RlQXNTdHJpbmcodGhpcy5ub2RlLCBjb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubm9kZXMgIT09IG51bGwpIHtcbiAgICAgIHN0cmluZyA9IG5vZGVzQXNTdHJpbmcodGhpcy5ub2RlcywgY29udGV4dCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm51bWJlciAhPT0gbnVsbCkge1xuICAgICAgc3RyaW5nID0gbnVtYmVyQXNTdHJpbmcodGhpcy5udW1iZXIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdHJpbmcgIT09IG51bGwpIHtcbiAgICAgIHN0cmluZyA9IHN0cmluZ0FzU3RyaW5nKHRoaXMuc3RyaW5nKVxuICAgIH0gZWxzZSBpZiAodGhpcy5ib29sZWFuICE9PSBudWxsKSB7XG4gICAgICBzdHJpbmcgPSBib29sZWFuQXNTdHJpbmcodGhpcy5ib29sZWFuKVxuICAgIH0gZWxzZSBpZiAodGhpcy5zb21lICE9PSBudWxsKSB7XG4gICAgICBzdHJpbmcgPSB0aGlzLnNvbWUuZ2V0U3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmV2ZXJ5ICE9PSBudWxsKSB7XG4gICAgICBzdHJpbmcgPSB0aGlzLmV2ZXJ5LmdldFN0cmluZygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yZWR1Y2UgIT09IG51bGwpIHtcbiAgICAgIHN0cmluZyA9IHRoaXMucmVkdWNlLmdldFN0cmluZygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50ZXJuYXJ5ICE9PSBudWxsKSB7XG4gICAgICBzdHJpbmcgPSB0aGlzLnRlcm5hcnkuZ2V0U3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnZhcmlhYmxlICE9PSBudWxsKSB7XG4gICAgICBzdHJpbmcgPSB0aGlzLnZhcmlhYmxlLmdldFN0cmluZygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlUXVlcnkgIT09IG51bGwpIHtcbiAgICAgIHN0cmluZyA9IHRoaXMubm9kZVF1ZXJ5LmdldFN0cmluZygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ub2Rlc1F1ZXJ5ICE9PSBudWxsKSB7XG4gICAgICBzdHJpbmcgPSB0aGlzLm5vZGVzUXVlcnkuZ2V0U3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbXBhcmlzb24gIT09IG51bGwpIHtcbiAgICAgIHN0cmluZyA9IHRoaXMuY29tcGFyaXNvbi5nZXRTdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucmV0dXJuQmxvY2sgIT09IG51bGwpIHtcbiAgICAgIHN0cmluZyA9IHRoaXMucmV0dXJuQmxvY2suZ2V0U3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb2NlZHVyZUNhbGwgIT09IG51bGwpIHtcbiAgICAgIHN0cmluZyA9IHRoaXMucHJvY2VkdXJlQ2FsbC5nZXRTdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRlZEV4cHJlc3Npb24gIT09IG51bGwpIHtcbiAgICAgIHN0cmluZyA9IHRoaXMubmVnYXRlZEV4cHJlc3Npb24uZ2V0U3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmJpdHdpc2VFeHByZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICBzdHJpbmcgPSB0aGlzLmJpdHdpc2VFeHByZXNzaW9uLmdldFN0cmluZygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5icmFja2V0ZWRFeHByZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICBzdHJpbmcgPSB0aGlzLmJyYWNrZXRlZEV4cHJlc3Npb24uZ2V0U3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZztcbiAgfVxuXG4gIGV2YWx1YXRlKGNvbnRleHQpIHtcbiAgICBsZXQgZXhwcmVzc2lvbjtcblxuICAgIGlmIChmYWxzZSkge1xuICAgICAgLy8vXG4gICAgfSBlbHNlIGlmICgodGhpcy5ub2RlICE9PSBudWxsKSAgfHxcbiAgICAgICAgICAgICAgICh0aGlzLm5vZGVzICE9PSBudWxsKSB8fFxuICAgICAgICAgICAgICAgKHRoaXMubnVtYmVyICE9PSBudWxsKSB8fFxuICAgICAgICAgICAgICAgKHRoaXMuc3RyaW5nICE9PSBudWxsKSB8fFxuICAgICAgICAgICAgICAgKHRoaXMuYm9vbGVhbiAhPT0gbnVsbCkpIHtcbiAgICAgIGV4cHJlc3Npb24gPSB0aGlzO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zb21lICE9PSBudWxsKSB7XG4gICAgICBleHByZXNzaW9uID0gdGhpcy5zb21lLmV2YWx1YXRlKGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ldmVyeSAhPT0gbnVsbCkge1xuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMuZXZlcnkuZXZhbHVhdGUoY29udGV4dCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJlZHVjZSAhPT0gbnVsbCkge1xuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMucmVkdWNlLmV2YWx1YXRlKGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50ZXJuYXJ5ICE9PSBudWxsKSB7XG4gICAgICBleHByZXNzaW9uID0gdGhpcy50ZXJuYXJ5LmV2YWx1YXRlKGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy52YXJpYWJsZSAhPT0gbnVsbCkge1xuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMudmFyaWFibGUuZXZhbHVhdGUoY29udGV4dCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm5vZGVRdWVyeSAhPT0gbnVsbCkge1xuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMubm9kZVF1ZXJ5LmV2YWx1YXRlKGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ub2Rlc1F1ZXJ5ICE9PSBudWxsKSB7XG4gICAgICBleHByZXNzaW9uID0gdGhpcy5ub2Rlc1F1ZXJ5LmV2YWx1YXRlKGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb21wYXJpc29uICE9PSBudWxsKSB7XG4gICAgICBleHByZXNzaW9uID0gdGhpcy5jb21wYXJpc29uLmV2YWx1YXRlKGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yZXR1cm5CbG9jayAhPT0gbnVsbCkge1xuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMucmV0dXJuQmxvY2suZXZhbHVhdGUoY29udGV4dCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb2NlZHVyZUNhbGwgIT09IG51bGwpIHtcbiAgICAgIGV4cHJlc3Npb24gPSB0aGlzLnByb2NlZHVyZUNhbGwuZXZhbHVhdGUoY29udGV4dCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0ZWRFeHByZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICBleHByZXNzaW9uID0gdGhpcy5uZWdhdGVkRXhwcmVzc2lvbi5ldmFsdWF0ZShjb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYml0d2lzZUV4cHJlc3Npb24gIT09IG51bGwpIHtcbiAgICAgIGV4cHJlc3Npb24gPSB0aGlzLmJpdHdpc2VFeHByZXNzaW9uLmV2YWx1YXRlKGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5icmFja2V0ZWRFeHByZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICBleHByZXNzaW9uID0gdGhpcy5icmFja2V0ZWRFeHByZXNzaW9uLmV2YWx1YXRlKGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBleHByZXNzaW9uO1xuICB9XG5cbiAgaXNFcXVhbFRvKGV4cHJlc3Npb24pIHtcbiAgICBsZXQgZXF1YWxUbztcblxuICAgIGlmIChmYWxzZSkge1xuICAgICAgLy8vXG4gICAgfSBlbHNlIGlmICh0aGlzLm5vZGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBleHByZXNzaW9uLmdldE5vZGUoKTtcblxuICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgZXF1YWxUbyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgbm9kZUEgPSB0aGlzLm5vZGUsICAvLy9cbiAgICAgICAgICAgICAgbm9kZUIgPSBub2RlLCAvLy9cbiAgICAgICAgICAgICAgbm9kZU1hdGNoZXMgPSBtYXRjaE5vZGUobm9kZUEsIG5vZGVCKTtcblxuICAgICAgICBlcXVhbFRvID0gbm9kZU1hdGNoZXM7ICAvLy9cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMubm9kZXMgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vZGVzID0gZXhwcmVzc2lvbi5nZXROb2RlKCk7XG5cbiAgICAgIGlmIChub2RlcyA9PT0gbnVsbCkge1xuICAgICAgICBlcXVhbFRvID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBub2Rlc0EgPSB0aGlzLm5vZGVzLCAgLy8vXG4gICAgICAgICAgICAgIG5vZGVzQiA9IG5vZGVzLCAvLy9cbiAgICAgICAgICAgICAgbm9kZXNNYXRjaCA9IG1hdGNoTm9kZXMobm9kZXNBLCBub2Rlc0IpO1xuXG4gICAgICAgIGVxdWFsVG8gPSBub2Rlc01hdGNoOyAvLy9cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMubnVtYmVyICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBudW1iZXIgPSBleHByZXNzaW9uLmdldE51bWJlcigpO1xuXG4gICAgICBlcXVhbFRvID0gKHRoaXMubnVtYmVyID09PSBudW1iZXIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdHJpbmcgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHN0cmluZyA9IGV4cHJlc3Npb24uZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGVxdWFsVG8gPSAodGhpcy5zdHJpbmcgPT09IHN0cmluZyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmJvb2xlYW4gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGJvb2xlYW4gPSBleHByZXNzaW9uLmdldEJvb2xlYW4oKTtcblxuICAgICAgZXF1YWxUbyA9ICh0aGlzLmJvb2xlYW4gPT09IGJvb2xlYW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z2dlclxuICAgIH1cblxuICAgIHJldHVybiBlcXVhbFRvO1xuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIkV4cHJlc3Npb25cIjtcblxuICBzdGF0aWMgZnJvbU5vZGUobm9kZSwgY29udGV4dCkge1xuICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICBub2RlID0gbnVsbE5vZGU7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZXMgPSBudWxsLFxuICAgICAgICAgIG51bWJlciA9IG51bGwsXG4gICAgICAgICAgc3RyaW5nID0gbnVsbCxcbiAgICAgICAgICBib29sZWFuID0gbnVsbCxcbiAgICAgICAgICBzb21lID0gbnVsbCxcbiAgICAgICAgICBldmVyeSA9IG51bGwsXG4gICAgICAgICAgcmVkdWNlID0gbnVsbCxcbiAgICAgICAgICB0ZXJuYXJ5ID0gbnVsbCxcbiAgICAgICAgICB2YXJpYWJsZSA9IG51bGwsXG4gICAgICAgICAgbm9kZVF1ZXJ5ID0gbnVsbCxcbiAgICAgICAgICBub2Rlc1F1ZXJ5ID0gbnVsbCxcbiAgICAgICAgICBjb21wYXJpc29uID0gbnVsbCxcbiAgICAgICAgICByZXR1cm5CbG9jayA9IG51bGwsXG4gICAgICAgICAgcHJvY2VkdXJlQ2FsbCA9IG51bGwsXG4gICAgICAgICAgbmVnYXRlZEV4cHJlc3Npb24gPSBudWxsLFxuICAgICAgICAgIGJpdHdpc2VFeHByZXNzaW9uID0gbnVsbCxcbiAgICAgICAgICBicmFja2V0ZWRFeHByZXNzaW9uID0gbnVsbCxcbiAgICAgICAgICBleHByZXNzaW9uID0gbmV3IEV4cHJlc3Npb24obm9kZSwgbm9kZXMsIG51bWJlciwgc3RyaW5nLCBib29sZWFuLCBzb21lLCBldmVyeSwgcmVkdWNlLCB0ZXJuYXJ5LCB2YXJpYWJsZSwgbm9kZVF1ZXJ5LCBub2Rlc1F1ZXJ5LCBjb21wYXJpc29uLCByZXR1cm5CbG9jaywgcHJvY2VkdXJlQ2FsbCwgbmVnYXRlZEV4cHJlc3Npb24sIGJpdHdpc2VFeHByZXNzaW9uLCBicmFja2V0ZWRFeHByZXNzaW9uKTtcblxuICAgIHJldHVybiBleHByZXNzaW9uO1xuICB9XG5cbiAgc3RhdGljIGZyb21Ob2Rlcyhub2RlcywgY29udGV4dCkge1xuICAgIGNvbnN0IG5vZGUgPSBudWxsLFxuICAgICAgICAgIG51bWJlciA9IG51bGwsXG4gICAgICAgICAgc3RyaW5nID0gbnVsbCxcbiAgICAgICAgICBib29sZWFuID0gbnVsbCxcbiAgICAgICAgICB0ZXJuYXJ5ID0gbnVsbCxcbiAgICAgICAgICBzb21lID0gbnVsbCxcbiAgICAgICAgICBldmVyeSA9IG51bGwsXG4gICAgICAgICAgcmVkdWNlID0gbnVsbCxcbiAgICAgICAgICB2YXJpYWJsZSA9IG51bGwsXG4gICAgICAgICAgbm9kZVF1ZXJ5ID0gbnVsbCxcbiAgICAgICAgICBub2Rlc1F1ZXJ5ID0gbnVsbCxcbiAgICAgICAgICBjb21wYXJpc29uID0gbnVsbCxcbiAgICAgICAgICByZXR1cm5CbG9jayA9IG51bGwsXG4gICAgICAgICAgcHJvY2VkdXJlQ2FsbCA9IG51bGwsXG4gICAgICAgICAgbmVnYXRlZEV4cHJlc3Npb24gPSBudWxsLFxuICAgICAgICAgIGJpdHdpc2VFeHByZXNzaW9uID0gbnVsbCxcbiAgICAgICAgICBicmFja2V0ZWRFeHByZXNzaW9uID0gbnVsbCxcbiAgICAgICAgICBleHByZXNzaW9uID0gbmV3IEV4cHJlc3Npb24obm9kZSwgbm9kZXMsIG51bWJlciwgc3RyaW5nLCBib29sZWFuLCBzb21lLCBldmVyeSwgcmVkdWNlLCB0ZXJuYXJ5LCB2YXJpYWJsZSwgbm9kZVF1ZXJ5LCBub2Rlc1F1ZXJ5LCBjb21wYXJpc29uLCByZXR1cm5CbG9jaywgcHJvY2VkdXJlQ2FsbCwgbmVnYXRlZEV4cHJlc3Npb24sIGJpdHdpc2VFeHByZXNzaW9uLCBicmFja2V0ZWRFeHByZXNzaW9uKTtcblxuICAgIHJldHVybiBleHByZXNzaW9uO1xuICB9XG5cbiAgc3RhdGljIGZyb21TdHJpbmcoc3RyaW5nLCBjb250ZXh0KSB7XG4gICAgY29uc3Qgbm9kZSA9IG51bGwsXG4gICAgICAgICAgbm9kZXMgPSBudWxsLFxuICAgICAgICAgIG51bWJlciA9IG51bGwsXG4gICAgICAgICAgYm9vbGVhbiA9IG51bGwsXG4gICAgICAgICAgc29tZSA9IG51bGwsXG4gICAgICAgICAgZXZlcnkgPSBudWxsLFxuICAgICAgICAgIHJlZHVjZSA9IG51bGwsXG4gICAgICAgICAgdGVybmFyeSA9IG51bGwsXG4gICAgICAgICAgdmFyaWFibGUgPSBudWxsLFxuICAgICAgICAgIG5vZGVRdWVyeSA9IG51bGwsXG4gICAgICAgICAgbm9kZXNRdWVyeSA9IG51bGwsXG4gICAgICAgICAgY29tcGFyaXNvbiA9IG51bGwsXG4gICAgICAgICAgcmV0dXJuQmxvY2sgPSBudWxsLFxuICAgICAgICAgIHByb2NlZHVyZUNhbGwgPSBudWxsLFxuICAgICAgICAgIG5lZ2F0ZWRFeHByZXNzaW9uID0gbnVsbCxcbiAgICAgICAgICBiaXR3aXNlRXhwcmVzc2lvbiA9IG51bGwsXG4gICAgICAgICAgYnJhY2tldGVkRXhwcmVzc2lvbiA9IG51bGwsXG4gICAgICAgICAgZXhwcmVzc2lvbiA9IG5ldyBFeHByZXNzaW9uKG5vZGUsIG5vZGVzLCBudW1iZXIsIHN0cmluZywgYm9vbGVhbiwgc29tZSwgZXZlcnksIHJlZHVjZSwgdGVybmFyeSwgdmFyaWFibGUsIG5vZGVRdWVyeSwgbm9kZXNRdWVyeSwgY29tcGFyaXNvbiwgcmV0dXJuQmxvY2ssIHByb2NlZHVyZUNhbGwsIG5lZ2F0ZWRFeHByZXNzaW9uLCBiaXR3aXNlRXhwcmVzc2lvbiwgYnJhY2tldGVkRXhwcmVzc2lvbik7XG5cbiAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQm9vbGVhbihib29sZWFuLCBjb250ZXh0KSB7XG4gICAgY29uc3Qgbm9kZSA9IG51bGwsXG4gICAgICAgICAgbm9kZXMgPSBudWxsLFxuICAgICAgICAgIG51bWJlciA9IG51bGwsXG4gICAgICAgICAgc3RyaW5nID0gbnVsbCxcbiAgICAgICAgICBzb21lID0gbnVsbCxcbiAgICAgICAgICBldmVyeSA9IG51bGwsXG4gICAgICAgICAgcmVkdWNlID0gbnVsbCxcbiAgICAgICAgICB0ZXJuYXJ5ID0gbnVsbCxcbiAgICAgICAgICB2YXJpYWJsZSA9IG51bGwsXG4gICAgICAgICAgbm9kZVF1ZXJ5ID0gbnVsbCxcbiAgICAgICAgICBub2Rlc1F1ZXJ5ID0gbnVsbCxcbiAgICAgICAgICBjb21wYXJpc29uID0gbnVsbCxcbiAgICAgICAgICByZXR1cm5CbG9jayA9IG51bGwsXG4gICAgICAgICAgcHJvY2VkdXJlQ2FsbCA9IG51bGwsXG4gICAgICAgICAgbmVnYXRlZEV4cHJlc3Npb24gPSBudWxsLFxuICAgICAgICAgIGJpdHdpc2VFeHByZXNzaW9uID0gbnVsbCxcbiAgICAgICAgICBicmFja2V0ZWRFeHByZXNzaW9uID0gbnVsbCxcbiAgICAgICAgICBleHByZXNzaW9uID0gbmV3IEV4cHJlc3Npb24obm9kZSwgbm9kZXMsIG51bWJlciwgc3RyaW5nLCBib29sZWFuLCBzb21lLCBldmVyeSwgcmVkdWNlLCB0ZXJuYXJ5LCB2YXJpYWJsZSwgbm9kZVF1ZXJ5LCBub2Rlc1F1ZXJ5LCBjb21wYXJpc29uLCByZXR1cm5CbG9jaywgcHJvY2VkdXJlQ2FsbCwgbmVnYXRlZEV4cHJlc3Npb24sIGJpdHdpc2VFeHByZXNzaW9uLCBicmFja2V0ZWRFeHByZXNzaW9uKTtcblxuICAgIHJldHVybiBleHByZXNzaW9uO1xuICB9XG5cbiAgc3RhdGljIGZyb21FeHByZXNzaW9uTm9kZShleHByZXNzaW9uTm9kZSwgY29udGV4dCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBleHByZXNzaW9uRnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBleHByZXNzaW9uO1xuICB9XG5cbiAgc3RhdGljIGZyb21SZWR1Y2VOb2RlKHJlZHVjZU5vZGUsIGNvbnRleHQpIHtcbiAgICBjb25zdCByZWR1Y2VFeHByZXNzaW9uTm9kZSA9IHJlZHVjZUV4cHJlc3Npb25Ob2RlUXVlcnkocmVkdWNlTm9kZSksXG4gICAgICAgICAgZXhwcmVzc2lvbk5vZGUgPSByZWR1Y2VFeHByZXNzaW9uTm9kZSwgLy8vXG4gICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25Gcm9tRXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbk5vZGUsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGV4cHJlc3Npb247XG4gIH1cblxuICBzdGF0aWMgZnJvbVRlcm5hcnlOb2RlKHRlcm5hcnlOb2RlLCBjb250ZXh0KSB7XG4gICAgY29uc3QgdGVybmFyeUV4cHJlc3Npb25Ob2RlID0gdGVybmFyeUV4cHJlc3Npb25Ob2RlUXVlcnkodGVybmFyeU5vZGUpLFxuICAgICAgICAgIGV4cHJlc3Npb25Ob2RlID0gdGVybmFyeUV4cHJlc3Npb25Ob2RlLCAvLy9cbiAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbkZyb21FeHByZXNzaW9uTm9kZShleHByZXNzaW9uTm9kZSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUmV0dXJuU3RhdGVtZW50Tm9kZShyZXR1cm5TdGF0ZW1lbnROb2RlLCBjb250ZXh0KSB7XG4gICAgY29uc3QgcmV0dXJuU3RhdGVtZW50RXhwcmVzc2lvbk5vZGUgPSByZXR1cm5TdGF0ZW1lbnRFeHByZXNzaW9uTm9kZVF1ZXJ5KHJldHVyblN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIGV4cHJlc3Npb25Ob2RlID0gcmV0dXJuU3RhdGVtZW50RXhwcmVzc2lvbk5vZGUsIC8vL1xuICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uRnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBleHByZXNzaW9uO1xuICB9XG5cbiAgc3RhdGljIGZyb21WYXJpYWJsZUFzc2lnbm1lbnROb2RlKHZhcmlhYmxlQXNzaWdtZW50Tm9kZSwgY29udGV4dCkge1xuICAgIGNvbnN0IHZhcmlhYmxlQXNzaWdubWVudEV4cHJlc3Npb25Ob2RlID0gdmFyaWFibGVBc3NpZ25tZW50RXhwcmVzc2lvbk5vZGVRdWVyeSh2YXJpYWJsZUFzc2lnbWVudE5vZGUpLFxuICAgICAgICAgIGV4cHJlc3Npb25Ob2RlID0gdmFyaWFibGVBc3NpZ25tZW50RXhwcmVzc2lvbk5vZGUsICAvLy9cbiAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbkZyb21FeHByZXNzaW9uTm9kZShleHByZXNzaW9uTm9kZSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIG1hdGNoTm9kZShub2RlQSwgbm9kZUIpIHtcbiAgbGV0IG5vZGVNYXRjaGVzO1xuXG4gIGlmICgobm9kZUEgPT09IG51bGxOb2RlKSB8fCAobm9kZUIgPT09IG51bGxOb2RlKSkge1xuICAgIG5vZGVNYXRjaGVzID0gKG5vZGVBID09PSBub2RlQik7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgbm9kZUFFcXVhbFRvTm9kZUEgPSBub2RlQS5pc0VxdWFsVG8obm9kZUIpO1xuXG4gICAgbm9kZU1hdGNoZXMgPSBub2RlQUVxdWFsVG9Ob2RlQTsgIC8vL1xuICB9XG5cbiAgcmV0dXJuIG5vZGVNYXRjaGVzO1xufVxuXG5mdW5jdGlvbiBtYXRjaE5vZGVzKG5vZGVzQSwgbm9kZXNCKSB7XG4gIGxldCBub2Rlc01hdGNoO1xuXG4gIG5vZGVzTWF0Y2ggPSBtYXRjaChub2Rlc0EsIG5vZGVzQiwgKG5vZGVBLCBub2RlQikgPT4ge1xuICAgIGNvbnN0IG5vZGVNYXRjaGVzID0gbWF0Y2hOb2RlKG5vZGVBLCBub2RlQik7XG5cbiAgICBpZiAobm9kZU1hdGNoZXMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG5vZGVzTWF0Y2g7XG59XG5cbmZ1bmN0aW9uIG5vZGVBc1N0cmluZyhub2RlLCBjb250ZXh0KSB7XG4gIGxldCBzdHJpbmc7XG5cbiAgY29uc3Qgbm9kZVN0cmluZyAgPSAobm9kZSA9PT0gbnVsbE5vZGUpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm5vZGVBc1N0cmluZyhub2RlKTtcblxuICBzdHJpbmcgPSBgJyR7bm9kZVN0cmluZ30nYDtcblxuICByZXR1cm4gc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBub2Rlc0FzU3RyaW5nKG5vZGVzLCBjb250ZXh0KSB7XG4gIGxldCBzdHJpbmc7XG5cbiAgY29uc3Qgbm9kZXNTdHJpbmcgPSBjb250ZXh0Lm5vZGVzQXNTdHJpbmcobm9kZXMpO1xuXG4gIHN0cmluZyA9IGAnJHtub2Rlc1N0cmluZ30nYDtcblxuICByZXR1cm4gc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBudW1iZXJBc1N0cmluZyhudW1iZXIpIHtcbiAgbGV0IHN0cmluZztcblxuICBzdHJpbmcgPSBgJHtudW1iZXJ9YDtcblxuICByZXR1cm4gc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdBc1N0cmluZyhzdHJpbmcpIHtcbiAgc3RyaW5nID0gYFwiJHtzdHJpbmd9XCJgOyAvLy9cblxuICByZXR1cm4gc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBib29sZWFuQXNTdHJpbmcoYm9vbGVhbikge1xuICBsZXQgc3RyaW5nO1xuXG4gIHN0cmluZyA9IGAnJHtib29sZWFufSdgO1xuXG4gIHJldHVybiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGV4cHJlc3Npb25Gcm9tRXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbk5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBTb21lLCBFdmVyeSwgUmVkdWNlLCBFeHByZXNzaW9uLCBUZXJuYXJ5LCBWYXJpYWJsZSwgTm9kZVF1ZXJ5LCBOb2Rlc1F1ZXJ5LCBDb21wYXJpc29uLCBSZXR1cm5CbG9jaywgUHJvY2VkdXJlQ2FsbCwgTmVnYXRlZEV4cHJlc3Npb24sIEJpdHdpc2VFeHByZXNzaW9uLCBCcmFja2V0ZWRFeHByZXNzaW9uIH0gPSBkb20sXG4gICAgICAgIG5vZGUgPSBub2RlRnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgbm9kZXMgPSBub2Rlc0Zyb21FeHByZXNzaW9uTm9kZShleHByZXNzaW9uTm9kZSwgY29udGV4dCksXG4gICAgICAgIG51bWJlciA9IG51bWJlckZyb21FeHByZXNzaW9uTm9kZShleHByZXNzaW9uTm9kZSwgY29udGV4dCksXG4gICAgICAgIHN0cmluZyA9IHN0cmluZ0Zyb21FeHByZXNzaW9uTm9kZShleHByZXNzaW9uTm9kZSwgY29udGV4dCksXG4gICAgICAgIGJvb2xlYW4gPSBib29sZWFuRnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgc29tZSA9IFNvbWUuZnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgZXZlcnkgPSBFdmVyeS5mcm9tRXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbk5vZGUsIGNvbnRleHQpLFxuICAgICAgICByZWR1Y2UgPSBSZWR1Y2UuZnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgdGVybmFyeSA9IFRlcm5hcnkuZnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgdmFyaWFibGUgPSBWYXJpYWJsZS5mcm9tRXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbk5vZGUsIGNvbnRleHQpLFxuICAgICAgICBub2RlUXVlcnkgPSBOb2RlUXVlcnkuZnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgbm9kZXNRdWVyeSA9IE5vZGVzUXVlcnkuZnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgY29tcGFyaXNvbiA9IENvbXBhcmlzb24uZnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgcmV0dXJuQmxvY2sgPSBSZXR1cm5CbG9jay5mcm9tRXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbk5vZGUsIGNvbnRleHQpLFxuICAgICAgICBwcm9jZWR1cmVDYWxsID0gUHJvY2VkdXJlQ2FsbC5mcm9tRXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbk5vZGUsIGNvbnRleHQpLFxuICAgICAgICBuZWdhdGVkRXhwcmVzc2lvbiA9IE5lZ2F0ZWRFeHByZXNzaW9uLmZyb21FeHByZXNzaW9uTm9kZShleHByZXNzaW9uTm9kZSwgY29udGV4dCksXG4gICAgICAgIGJpdHdpc2VFeHByZXNzaW9uID0gQml0d2lzZUV4cHJlc3Npb24uZnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgYnJhY2tldGVkRXhwcmVzc2lvbiA9IEJyYWNrZXRlZEV4cHJlc3Npb24uZnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgZXhwcmVzc2lvbiA9IG5ldyBFeHByZXNzaW9uKG5vZGUsIG5vZGVzLCBudW1iZXIsIHN0cmluZywgYm9vbGVhbiwgc29tZSwgZXZlcnksIHJlZHVjZSwgdGVybmFyeSwgdmFyaWFibGUsIG5vZGVRdWVyeSwgbm9kZXNRdWVyeSwgY29tcGFyaXNvbiwgcmV0dXJuQmxvY2ssIHByb2NlZHVyZUNhbGwsIG5lZ2F0ZWRFeHByZXNzaW9uLCBiaXR3aXNlRXhwcmVzc2lvbiwgYnJhY2tldGVkRXhwcmVzc2lvbik7XG5cbiAgcmV0dXJuIGV4cHJlc3Npb247XG59XG5cbmZ1bmN0aW9uIG5vZGVGcm9tRXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbk5vZGUsIGNvbnRleHQpIHtcbiAgbGV0IG5vZGUgPSBudWxsO1xuXG4gIGNvbnN0IHByaW1pdGl2ZVRlcm1pbmFsTm9kZSA9IHByaW1pdGl2ZVRlcm1pbmFsTm9kZVF1ZXJ5KGV4cHJlc3Npb25Ob2RlKTtcblxuICBpZiAocHJpbWl0aXZlVGVybWluYWxOb2RlICE9PSBudWxsKSB7XG4gICAgY29uc3QgcHJpbWl0aXZlVGVybWluYWxOb2RlQ29udGVudCA9IHByaW1pdGl2ZVRlcm1pbmFsTm9kZS5nZXRDb250ZW50KCk7XG5cbiAgICBzd2l0Y2ggKHByaW1pdGl2ZVRlcm1pbmFsTm9kZUNvbnRlbnQpIHtcbiAgICAgIGNhc2UgTlVMTDoge1xuICAgICAgICBub2RlID0gbnVsbE5vZGU7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIG5vZGVzRnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IG5vZGVzID0gbnVsbDsgIC8vL1xuXG4gIHJldHVybiBub2Rlcztcbn1cblxuZnVuY3Rpb24gbnVtYmVyRnJvbUV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb25Ob2RlLCBjb250ZXh0KSB7XG4gIGxldCBudW1iZXIgPSBudWxsO1xuXG4gIGNvbnN0IG51bWJlclRlcm1pbmFsTm9kZSA9IG51bWJlclRlcm1pbmFsTm9kZVF1ZXJ5KGV4cHJlc3Npb25Ob2RlKTtcblxuICBpZiAobnVtYmVyVGVybWluYWxOb2RlICE9PSBudWxsKSB7XG4gICAgY29uc3QgbnVtYmVyVGVybWluYWxOb2RlQ29udGVudCA9IG51bWJlclRlcm1pbmFsTm9kZS5nZXRDb250ZW50KCk7XG5cbiAgICBudW1iZXIgPSBOdW1iZXIobnVtYmVyVGVybWluYWxOb2RlQ29udGVudCk7XG4gIH1cblxuICByZXR1cm4gbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdGcm9tRXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbk5vZGUsIGNvbnRleHQpIHtcbiAgbGV0IHN0cmluZyA9IG51bGw7XG5cbiAgY29uc3Qgc3RyaW5nTGl0ZXJhbFRlcm1pbmFsTm9kZSA9IHN0cmluZ0xpdGVyYWxUZXJtaW5hbE5vZGVRdWVyeShleHByZXNzaW9uTm9kZSk7XG5cbiAgaWYgKHN0cmluZ0xpdGVyYWxUZXJtaW5hbE5vZGUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzdHJpbmdMaXRlcmFsVGVybWluYWxOb2RlQ29udGVudCA9IHN0cmluZ0xpdGVyYWxUZXJtaW5hbE5vZGUuZ2V0Q29udGVudCgpLFxuICAgICAgICAgIHN0cmluZ0xpdGVyYWwgPSBzdHJpbmdMaXRlcmFsVGVybWluYWxOb2RlQ29udGVudDsgLy8vXG5cbiAgICBzdHJpbmcgPSBzdHJpbmdGcm9tU3RyaW5nTGl0ZXJhbChzdHJpbmdMaXRlcmFsLCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGJvb2xlYW5Gcm9tRXhwcmVzc2lvbk5vZGUoZXhwcmVzc2lvbk5vZGUsIGNvbnRleHQpIHtcbiAgbGV0IGJvb2xlYW4gPSBudWxsO1xuXG4gIGNvbnN0IHByaW1pdGl2ZVRlcm1pbmFsTm9kZSA9IHByaW1pdGl2ZVRlcm1pbmFsTm9kZVF1ZXJ5KGV4cHJlc3Npb25Ob2RlKTtcblxuICBpZiAocHJpbWl0aXZlVGVybWluYWxOb2RlICE9PSBudWxsKSB7XG4gICAgY29uc3QgcHJpbWl0aXZlVGVybWluYWxOb2RlQ29udGVudCA9IHByaW1pdGl2ZVRlcm1pbmFsTm9kZS5nZXRDb250ZW50KCk7XG5cbiAgICBzd2l0Y2ggKHByaW1pdGl2ZVRlcm1pbmFsTm9kZUNvbnRlbnQpIHtcbiAgICAgIGNhc2UgVFJVRToge1xuICAgICAgICBib29sZWFuID0gdHJ1ZTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBGQUxTRToge1xuICAgICAgICBib29sZWFuID0gZmFsc2U7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIHN0cmluZ0Zyb21TdHJpbmdMaXRlcmFsKHN0cmluZ0xpdGVyYWwsIGNvbnRleHQpIHtcbiAgY29uc3Qgc3RyaW5nID0gc3RyaW5nTGl0ZXJhbC5yZXBsYWNlKC8oXlwifFwiJCkvZywgRU1QVFlfU1RSSU5HKTtcblxuICByZXR1cm4gc3RyaW5nO1xufVxuIl0sIm5hbWVzIjpbIm1hdGNoIiwiYXJyYXlVdGlsaXRpZXMiLCJudW1iZXJUZXJtaW5hbE5vZGVRdWVyeSIsIm5vZGVRdWVyeSIsInJlZHVjZUV4cHJlc3Npb25Ob2RlUXVlcnkiLCJwcmltaXRpdmVUZXJtaW5hbE5vZGVRdWVyeSIsInRlcm5hcnlFeHByZXNzaW9uTm9kZVF1ZXJ5Iiwic3RyaW5nTGl0ZXJhbFRlcm1pbmFsTm9kZVF1ZXJ5IiwicmV0dXJuU3RhdGVtZW50RXhwcmVzc2lvbk5vZGVRdWVyeSIsInZhcmlhYmxlQXNzaWdubWVudEV4cHJlc3Npb25Ob2RlUXVlcnkiLCJkb21Bc3NpZ25lZCIsIkV4cHJlc3Npb24iLCJub2RlIiwibm9kZXMiLCJudW1iZXIiLCJzdHJpbmciLCJib29sZWFuIiwic29tZSIsImV2ZXJ5IiwicmVkdWNlIiwidGVybmFyeSIsInZhcmlhYmxlIiwibm9kZXNRdWVyeSIsImNvbXBhcmlzb24iLCJyZXR1cm5CbG9jayIsInByb2NlZHVyZUNhbGwiLCJuZWdhdGVkRXhwcmVzc2lvbiIsImJpdHdpc2VFeHByZXNzaW9uIiwiYnJhY2tldGVkRXhwcmVzc2lvbiIsImdldE5vZGUiLCJnZXROb2RlcyIsImdldE51bWJlciIsImdldFN0cmluZyIsImdldEJvb2xlYW4iLCJnZXRTb21lIiwiZ2V0RXZlcnkiLCJnZXRSZWR1Y2UiLCJnZXRUZXJuYXJ5IiwidGVybmF5IiwiZ2V0VmFyaWFibGUiLCJnZXROb2RlUXVlcnkiLCJnZXROb2Rlc1F1ZXJ5IiwiZ2V0Q29tcGFyaXNvbiIsImdldFJldHVybkJsb2NrIiwiZ2V0UHJvY2VkdXJlQ2FsbCIsImdldE5lZ2F0ZWRFeHByZXNzaW9uIiwiZ2V0Qml0d2lzZUV4cHJlc3Npb24iLCJnZXRCcmFja2V0ZWRFeHByZXNzaW9uIiwiZ2V0VHlwZSIsInR5cGUiLCJOT0RFX1RZUEUiLCJOT0RFU19UWVBFIiwiTlVNQkVSX1RZUEUiLCJTVFJJTkdfVFlQRSIsIkJPT0xFQU5fVFlQRSIsImFzU3RyaW5nIiwiY29udGV4dCIsIm5vZGVBc1N0cmluZyIsIm5vZGVzQXNTdHJpbmciLCJudW1iZXJBc1N0cmluZyIsInN0cmluZ0FzU3RyaW5nIiwiYm9vbGVhbkFzU3RyaW5nIiwiZXZhbHVhdGUiLCJleHByZXNzaW9uIiwiaXNFcXVhbFRvIiwiZXF1YWxUbyIsIm5vZGVBIiwibm9kZUIiLCJub2RlTWF0Y2hlcyIsIm1hdGNoTm9kZSIsIm5vZGVzQSIsIm5vZGVzQiIsIm5vZGVzTWF0Y2giLCJtYXRjaE5vZGVzIiwiZnJvbU5vZGUiLCJudWxsTm9kZSIsImZyb21Ob2RlcyIsImZyb21TdHJpbmciLCJmcm9tQm9vbGVhbiIsImZyb21FeHByZXNzaW9uTm9kZSIsImV4cHJlc3Npb25Ob2RlIiwiZXhwcmVzc2lvbkZyb21FeHByZXNzaW9uTm9kZSIsImZyb21SZWR1Y2VOb2RlIiwicmVkdWNlTm9kZSIsInJlZHVjZUV4cHJlc3Npb25Ob2RlIiwiZnJvbVRlcm5hcnlOb2RlIiwidGVybmFyeU5vZGUiLCJ0ZXJuYXJ5RXhwcmVzc2lvbk5vZGUiLCJmcm9tUmV0dXJuU3RhdGVtZW50Tm9kZSIsInJldHVyblN0YXRlbWVudE5vZGUiLCJyZXR1cm5TdGF0ZW1lbnRFeHByZXNzaW9uTm9kZSIsImZyb21WYXJpYWJsZUFzc2lnbm1lbnROb2RlIiwidmFyaWFibGVBc3NpZ21lbnROb2RlIiwidmFyaWFibGVBc3NpZ25tZW50RXhwcmVzc2lvbk5vZGUiLCJuYW1lIiwibm9kZUFFcXVhbFRvTm9kZUEiLCJub2RlU3RyaW5nIiwiTlVMTCIsIm5vZGVzU3RyaW5nIiwiU29tZSIsImRvbSIsIkV2ZXJ5IiwiUmVkdWNlIiwiVGVybmFyeSIsIlZhcmlhYmxlIiwiTm9kZVF1ZXJ5IiwiTm9kZXNRdWVyeSIsIkNvbXBhcmlzb24iLCJSZXR1cm5CbG9jayIsIlByb2NlZHVyZUNhbGwiLCJOZWdhdGVkRXhwcmVzc2lvbiIsIkJpdHdpc2VFeHByZXNzaW9uIiwiQnJhY2tldGVkRXhwcmVzc2lvbiIsIm5vZGVGcm9tRXhwcmVzc2lvbk5vZGUiLCJub2Rlc0Zyb21FeHByZXNzaW9uTm9kZSIsIm51bWJlckZyb21FeHByZXNzaW9uTm9kZSIsInN0cmluZ0Zyb21FeHByZXNzaW9uTm9kZSIsImJvb2xlYW5Gcm9tRXhwcmVzc2lvbk5vZGUiLCJwcmltaXRpdmVUZXJtaW5hbE5vZGUiLCJwcmltaXRpdmVUZXJtaW5hbE5vZGVDb250ZW50IiwiZ2V0Q29udGVudCIsIm51bWJlclRlcm1pbmFsTm9kZSIsIm51bWJlclRlcm1pbmFsTm9kZUNvbnRlbnQiLCJOdW1iZXIiLCJzdHJpbmdMaXRlcmFsVGVybWluYWxOb2RlIiwic3RyaW5nTGl0ZXJhbFRlcm1pbmFsTm9kZUNvbnRlbnQiLCJzdHJpbmdMaXRlcmFsIiwic3RyaW5nRnJvbVN0cmluZ0xpdGVyYWwiLCJUUlVFIiwiRkFMU0UiLCJyZXBsYWNlIiwiRU1QVFlfU1RSSU5HIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFzQkE7OztlQUFBOzs7eUJBcEIrQjsyREFFZjsrREFDSztxQkFFSzt5QkFFc0I7cUJBQzhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUU5RSxJQUFNLEFBQUVBLFFBQVVDLHlCQUFjLENBQXhCRDtBQUVSLElBQU1FLDBCQUEwQkMsSUFBQUEsZ0JBQVMsRUFBQyx3QkFDcENDLDRCQUE0QkQsSUFBQUEsZ0JBQVMsRUFBQyx1QkFDdENFLDZCQUE2QkYsSUFBQUEsZ0JBQVMsRUFBQywyQkFDdkNHLDZCQUE2QkgsSUFBQUEsZ0JBQVMsRUFBQyx3QkFDdkNJLGlDQUFpQ0osSUFBQUEsZ0JBQVMsRUFBQyxnQ0FDM0NLLHFDQUFxQ0wsSUFBQUEsZ0JBQVMsRUFBQyxnQ0FDL0NNLHdDQUF3Q04sSUFBQUEsZ0JBQVMsRUFBQztJQUV4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
|