occam-furtle 2.0.342 → 3.0.2

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.
Files changed (116) hide show
  1. package/example.js +5905 -1786
  2. package/lib/context/block.js +81 -41
  3. package/lib/context/file/furtle.js +260 -0
  4. package/lib/context/file/nominal.js +956 -0
  5. package/lib/context/file.js +146 -271
  6. package/lib/context.js +210 -0
  7. package/lib/element/assignment/array.js +116 -14
  8. package/lib/element/assignment/object.js +116 -14
  9. package/lib/element/assignment/variable.js +121 -14
  10. package/lib/element/assignments/variable.js +120 -13
  11. package/lib/element/declaration/procedure.js +120 -12
  12. package/lib/element/error.js +118 -13
  13. package/lib/element/every.js +116 -13
  14. package/lib/element/expression.js +127 -20
  15. package/lib/element/label.js +119 -12
  16. package/lib/element/nodeQuery.js +116 -14
  17. package/lib/element/nodesQuery.js +116 -14
  18. package/lib/element/parameter/named.js +117 -15
  19. package/lib/element/parameter.js +116 -14
  20. package/lib/element/parameters/named.js +116 -14
  21. package/lib/element/parameters.js +115 -13
  22. package/lib/element/primitive.js +115 -13
  23. package/lib/element/procedure/anonymous.js +118 -16
  24. package/lib/element/procedure.js +118 -16
  25. package/lib/element/procedureCall.js +116 -14
  26. package/lib/element/reduce.js +116 -14
  27. package/lib/element/reference.js +119 -12
  28. package/lib/element/returnBlock.js +116 -14
  29. package/lib/element/some.js +115 -13
  30. package/lib/element/statement/return.js +120 -13
  31. package/lib/element/step.js +121 -14
  32. package/lib/element/term/bracketed.js +120 -13
  33. package/lib/element/term/comparison.js +117 -15
  34. package/lib/element/term/logical.js +118 -16
  35. package/lib/element/term/negated.js +116 -14
  36. package/lib/element/term.js +127 -18
  37. package/lib/element/terms.js +125 -14
  38. package/lib/element/ternary.js +117 -15
  39. package/lib/element/variable.js +127 -19
  40. package/lib/element.js +1 -8
  41. package/lib/index.js +5 -5
  42. package/lib/log.js +13 -12
  43. package/lib/metaTypeNames.js +26 -0
  44. package/lib/metaTypes.js +66 -0
  45. package/lib/nodeProperties.js +17 -21
  46. package/lib/nodeProperty.js +4 -7
  47. package/lib/utilities/context.js +8 -37
  48. package/lib/utilities/customGrammar.js +49 -0
  49. package/lib/utilities/element.js +91 -37
  50. package/lib/utilities/lineIndex.js +26 -0
  51. package/lib/utilities/node.js +1 -8
  52. package/lib/utilities/primitive.js +14 -5
  53. package/lib/utilities/string.js +30 -19
  54. package/lib/utilities/term.js +14 -5
  55. package/lib/utilities/terms.js +7 -3
  56. package/package.json +2 -2
  57. package/src/context/block.js +20 -32
  58. package/src/context/file/furtle.js +141 -0
  59. package/src/context/file/nominal.js +946 -0
  60. package/src/context/file.js +32 -209
  61. package/src/context.js +74 -0
  62. package/src/element/assignment/array.js +6 -8
  63. package/src/element/assignment/object.js +6 -8
  64. package/src/element/assignment/variable.js +7 -8
  65. package/src/element/assignments/variable.js +7 -8
  66. package/src/element/declaration/procedure.js +6 -6
  67. package/src/element/error.js +4 -6
  68. package/src/element/every.js +5 -6
  69. package/src/element/expression.js +6 -7
  70. package/src/element/label.js +6 -7
  71. package/src/element/nodeQuery.js +6 -8
  72. package/src/element/nodesQuery.js +6 -8
  73. package/src/element/parameter/named.js +7 -8
  74. package/src/element/parameter.js +6 -8
  75. package/src/element/parameters/named.js +8 -9
  76. package/src/element/parameters.js +6 -8
  77. package/src/element/primitive.js +5 -7
  78. package/src/element/procedure/anonymous.js +7 -9
  79. package/src/element/procedure.js +6 -8
  80. package/src/element/procedureCall.js +6 -8
  81. package/src/element/reduce.js +5 -7
  82. package/src/element/reference.js +6 -7
  83. package/src/element/returnBlock.js +5 -7
  84. package/src/element/some.js +5 -7
  85. package/src/element/statement/return.js +7 -8
  86. package/src/element/step.js +6 -7
  87. package/src/element/term/bracketed.js +7 -8
  88. package/src/element/term/comparison.js +6 -8
  89. package/src/element/term/logical.js +6 -8
  90. package/src/element/term/negated.js +6 -8
  91. package/src/element/term.js +12 -9
  92. package/src/element/terms.js +16 -9
  93. package/src/element/ternary.js +6 -8
  94. package/src/element/variable.js +24 -14
  95. package/src/element.js +0 -8
  96. package/src/index.js +1 -1
  97. package/src/log.js +11 -11
  98. package/src/metaTypeNames.js +5 -0
  99. package/src/metaTypes.js +71 -0
  100. package/src/nodeProperties.js +23 -32
  101. package/src/nodeProperty.js +5 -10
  102. package/src/utilities/context.js +7 -45
  103. package/src/utilities/customGrammar.js +40 -0
  104. package/src/utilities/element.js +158 -64
  105. package/src/utilities/lineIndex.js +21 -0
  106. package/src/utilities/node.js +0 -5
  107. package/src/utilities/primitive.js +22 -5
  108. package/src/utilities/string.js +33 -19
  109. package/src/utilities/term.js +22 -5
  110. package/src/utilities/terms.js +12 -4
  111. package/test/context/release.js +477 -46
  112. package/test/helpers/furtle.js +1 -1
  113. package/test/helpers/nominal.js +2 -3
  114. package/test/main.js +1 -1
  115. package/test/context/file.js +0 -127
  116. package/test/helpers/constants.js +0 -17
@@ -0,0 +1,956 @@
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 NominalFileContext;
9
+ }
10
+ });
11
+ var _necessary = require("necessary");
12
+ var _file = /*#__PURE__*/ _interop_require_default(require("../../context/file"));
13
+ var _verify = require("../process/verify");
14
+ var _context = require("../../utilities/context");
15
+ var _types = require("../types");
16
+ var _json = require("../utilities/json");
17
+ function _array_like_to_array(arr, len) {
18
+ if (len == null || len > arr.length) len = arr.length;
19
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
20
+ return arr2;
21
+ }
22
+ function _array_without_holes(arr) {
23
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
24
+ }
25
+ function _assert_this_initialized(self) {
26
+ if (self === void 0) {
27
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
28
+ }
29
+ return self;
30
+ }
31
+ function _call_super(_this, derived, args) {
32
+ derived = _get_prototype_of(derived);
33
+ return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
34
+ }
35
+ function _class_call_check(instance, Constructor) {
36
+ if (!(instance instanceof Constructor)) {
37
+ throw new TypeError("Cannot call a class as a function");
38
+ }
39
+ }
40
+ function _defineProperties(target, props) {
41
+ for(var i = 0; i < props.length; i++){
42
+ var descriptor = props[i];
43
+ descriptor.enumerable = descriptor.enumerable || false;
44
+ descriptor.configurable = true;
45
+ if ("value" in descriptor) descriptor.writable = true;
46
+ Object.defineProperty(target, descriptor.key, descriptor);
47
+ }
48
+ }
49
+ function _create_class(Constructor, protoProps, staticProps) {
50
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
51
+ if (staticProps) _defineProperties(Constructor, staticProps);
52
+ return Constructor;
53
+ }
54
+ function _get_prototype_of(o) {
55
+ _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {
56
+ return o.__proto__ || Object.getPrototypeOf(o);
57
+ };
58
+ return _get_prototype_of(o);
59
+ }
60
+ function _inherits(subClass, superClass) {
61
+ if (typeof superClass !== "function" && superClass !== null) {
62
+ throw new TypeError("Super expression must either be null or a function");
63
+ }
64
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
65
+ constructor: {
66
+ value: subClass,
67
+ writable: true,
68
+ configurable: true
69
+ }
70
+ });
71
+ if (superClass) _set_prototype_of(subClass, superClass);
72
+ }
73
+ function _interop_require_default(obj) {
74
+ return obj && obj.__esModule ? obj : {
75
+ default: obj
76
+ };
77
+ }
78
+ function _iterable_to_array(iter) {
79
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
80
+ }
81
+ function _non_iterable_spread() {
82
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
83
+ }
84
+ function _possible_constructor_return(self, call) {
85
+ if (call && (_type_of(call) === "object" || typeof call === "function")) {
86
+ return call;
87
+ }
88
+ return _assert_this_initialized(self);
89
+ }
90
+ function _set_prototype_of(o, p) {
91
+ _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {
92
+ o.__proto__ = p;
93
+ return o;
94
+ };
95
+ return _set_prototype_of(o, p);
96
+ }
97
+ function _to_consumable_array(arr) {
98
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
99
+ }
100
+ function _type_of(obj) {
101
+ "@swc/helpers - typeof";
102
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
103
+ }
104
+ function _unsupported_iterable_to_array(o, minLen) {
105
+ if (!o) return;
106
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
107
+ var n = Object.prototype.toString.call(o).slice(8, -1);
108
+ if (n === "Object" && o.constructor) n = o.constructor.name;
109
+ if (n === "Map" || n === "Set") return Array.from(n);
110
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
111
+ }
112
+ function _is_native_reflect_construct() {
113
+ try {
114
+ var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
115
+ } catch (_) {}
116
+ return (_is_native_reflect_construct = function() {
117
+ return !!result;
118
+ })();
119
+ }
120
+ var push = _necessary.arrayUtilities.push, filter = _necessary.arrayUtilities.filter;
121
+ var NominalFileContext = /*#__PURE__*/ function(FileContext) {
122
+ _inherits(NominalFileContext, FileContext);
123
+ function NominalFileContext(context, filePath, tokens, node, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables) {
124
+ _class_call_check(this, NominalFileContext);
125
+ var _this;
126
+ _this = _call_super(this, NominalFileContext, [
127
+ context,
128
+ filePath,
129
+ node,
130
+ tokens
131
+ ]);
132
+ _this.context = context;
133
+ _this.filePath = filePath;
134
+ _this.tokens = tokens;
135
+ _this.node = node;
136
+ _this.types = types;
137
+ _this.rules = rules;
138
+ _this.axioms = axioms;
139
+ _this.lemmas = lemmas;
140
+ _this.theorems = theorems;
141
+ _this.variables = variables;
142
+ _this.metaLemmas = metaLemmas;
143
+ _this.conjectures = conjectures;
144
+ _this.combinators = combinators;
145
+ _this.typePrefixes = typePrefixes;
146
+ _this.constructors = constructors;
147
+ _this.metatheorems = metatheorems;
148
+ _this.metavariables = metavariables;
149
+ return _possible_constructor_return(_this, (0, _context.chainContext)(_this));
150
+ }
151
+ _create_class(NominalFileContext, [
152
+ {
153
+ key: "getContext",
154
+ value: function getContext() {
155
+ return this.context;
156
+ }
157
+ },
158
+ {
159
+ key: "getFilePath",
160
+ value: function getFilePath() {
161
+ return this.filePath;
162
+ }
163
+ },
164
+ {
165
+ key: "getLineIndex",
166
+ value: function getLineIndex() {
167
+ return this.lineIndex;
168
+ }
169
+ },
170
+ {
171
+ key: "getTokens",
172
+ value: function getTokens() {
173
+ return this.tokens;
174
+ }
175
+ },
176
+ {
177
+ key: "getNode",
178
+ value: function getNode() {
179
+ return this.node;
180
+ }
181
+ },
182
+ {
183
+ key: "getJudgements",
184
+ value: function getJudgements() {
185
+ var judgements = [];
186
+ return judgements;
187
+ }
188
+ },
189
+ {
190
+ key: "getEquivalences",
191
+ value: function getEquivalences() {
192
+ debugger;
193
+ }
194
+ },
195
+ {
196
+ key: "getSubproofOrProofAssertions",
197
+ value: function getSubproofOrProofAssertions() {
198
+ var subproofOrProofAssertions = [];
199
+ return subproofOrProofAssertions;
200
+ }
201
+ },
202
+ {
203
+ key: "getLabels",
204
+ value: function getLabels() {
205
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
206
+ var labels = [];
207
+ if (includeRelease) {
208
+ var releaseContextLabels = this.context.getLabels();
209
+ push(labels, releaseContextLabels);
210
+ } else {
211
+ this.rules.forEach(function(rule) {
212
+ var ruleLabels = rule.getLabels();
213
+ push(labels, ruleLabels);
214
+ });
215
+ this.axioms.forEach(function(axiom) {
216
+ var axiomLabels = axiom.getLabels();
217
+ push(labels, axiomLabels);
218
+ });
219
+ this.lemmas.forEach(function(lemma) {
220
+ var lemmaLabels = lemma.getLabels();
221
+ push(labels, lemmaLabels);
222
+ });
223
+ this.theorems.forEach(function(theorem) {
224
+ var theoremLabels = theorem.getLabels();
225
+ push(labels, theoremLabels);
226
+ });
227
+ this.conjectures.forEach(function(conjecture) {
228
+ var conjectureLabels = conjecture.getLabels();
229
+ push(labels, conjectureLabels);
230
+ });
231
+ this.metatheorems.forEach(function(metatheorem) {
232
+ var metatheoremLabel = metatheorem.getLabel();
233
+ labels.push(metatheoremLabel);
234
+ });
235
+ }
236
+ return labels;
237
+ }
238
+ },
239
+ {
240
+ key: "getTypes",
241
+ value: function getTypes() {
242
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true, includeDependencies = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
243
+ var types = includeRelease ? this.context.getTypes(includeDependencies) : this.types;
244
+ return types;
245
+ }
246
+ },
247
+ {
248
+ key: "getRules",
249
+ value: function getRules() {
250
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
251
+ var rules = includeRelease ? this.context.getRules() : this.rules;
252
+ return rules;
253
+ }
254
+ },
255
+ {
256
+ key: "getAxioms",
257
+ value: function getAxioms() {
258
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
259
+ var axioms = includeRelease ? this.context.getAxioms() : this.axioms;
260
+ return axioms;
261
+ }
262
+ },
263
+ {
264
+ key: "getLemmas",
265
+ value: function getLemmas() {
266
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
267
+ var lemmas = includeRelease ? this.context.getLemmas() : this.lemmas;
268
+ return lemmas;
269
+ }
270
+ },
271
+ {
272
+ key: "getTheorems",
273
+ value: function getTheorems() {
274
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
275
+ var theorems = includeRelease ? this.context.getTheorems() : this.theorems;
276
+ return theorems;
277
+ }
278
+ },
279
+ {
280
+ key: "getVariables",
281
+ value: function getVariables() {
282
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
283
+ return this.variables;
284
+ }
285
+ },
286
+ {
287
+ key: "getProcedures",
288
+ value: function getProcedures() {
289
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
290
+ var procedures = includeRelease ? this.context.getProcedures() : null; ///
291
+ return procedures;
292
+ }
293
+ },
294
+ {
295
+ key: "getMetaLemmas",
296
+ value: function getMetaLemmas() {
297
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
298
+ var metaLemmas = includeRelease ? this.context.getMetaLemmas() : this.metaLemmas;
299
+ return metaLemmas;
300
+ }
301
+ },
302
+ {
303
+ key: "getConjectures",
304
+ value: function getConjectures() {
305
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
306
+ var conjectures = includeRelease ? this.context.getConjectures() : this.conjectures;
307
+ return conjectures;
308
+ }
309
+ },
310
+ {
311
+ key: "getCombinators",
312
+ value: function getCombinators() {
313
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
314
+ var combinators = includeRelease ? this.context.getCombinators() : this.combinators;
315
+ return combinators;
316
+ }
317
+ },
318
+ {
319
+ key: "getTypePrefixes",
320
+ value: function getTypePrefixes() {
321
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
322
+ var typePrefixes = includeRelease ? this.context.getTypePrefixes() : this.typePrefixes;
323
+ return typePrefixes;
324
+ }
325
+ },
326
+ {
327
+ key: "getConstructors",
328
+ value: function getConstructors() {
329
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
330
+ var constructors = includeRelease ? this.context.getConstructors() : this.constructors;
331
+ return constructors;
332
+ }
333
+ },
334
+ {
335
+ key: "getMetatheorems",
336
+ value: function getMetatheorems() {
337
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
338
+ var metatheorems = includeRelease ? this.context.getMetatheorems() : this.metatheorems;
339
+ return metatheorems;
340
+ }
341
+ },
342
+ {
343
+ key: "getMetavariables",
344
+ value: function getMetavariables() {
345
+ var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
346
+ return this.metavariables;
347
+ }
348
+ },
349
+ {
350
+ key: "addType",
351
+ value: function addType(type) {
352
+ this.types.push(type);
353
+ }
354
+ },
355
+ {
356
+ key: "addRule",
357
+ value: function addRule(rule) {
358
+ this.rules.push(rule);
359
+ }
360
+ },
361
+ {
362
+ key: "addAxiom",
363
+ value: function addAxiom(axiom) {
364
+ this.axioms.push(axiom);
365
+ }
366
+ },
367
+ {
368
+ key: "addLemma",
369
+ value: function addLemma(lemma) {
370
+ this.lemmas.push(lemma);
371
+ }
372
+ },
373
+ {
374
+ key: "addTheorem",
375
+ value: function addTheorem(theorem) {
376
+ this.theorems.push(theorem);
377
+ }
378
+ },
379
+ {
380
+ key: "addVariable",
381
+ value: function addVariable(variable) {
382
+ this.variables.push(variable);
383
+ }
384
+ },
385
+ {
386
+ key: "addMetaLemma",
387
+ value: function addMetaLemma(metaLemma) {
388
+ this.metaLemmas.push(metaLemma);
389
+ }
390
+ },
391
+ {
392
+ key: "addConjecture",
393
+ value: function addConjecture(conjecture) {
394
+ this.conjectures.push(conjecture);
395
+ }
396
+ },
397
+ {
398
+ key: "addCombinator",
399
+ value: function addCombinator(combinator) {
400
+ this.combinators.push(combinator);
401
+ }
402
+ },
403
+ {
404
+ key: "addTypePrefix",
405
+ value: function addTypePrefix(typePrefix) {
406
+ this.typePrefixes.push(typePrefix);
407
+ }
408
+ },
409
+ {
410
+ key: "addConstructor",
411
+ value: function addConstructor(constructor) {
412
+ this.constructors.push(constructor);
413
+ }
414
+ },
415
+ {
416
+ key: "addMetatheorem",
417
+ value: function addMetatheorem(metatheorem) {
418
+ this.metatheorems.push(metatheorem);
419
+ }
420
+ },
421
+ {
422
+ key: "addMetavariable",
423
+ value: function addMetavariable(metavariable) {
424
+ this.metavariables.push(metavariable);
425
+ }
426
+ },
427
+ {
428
+ key: "findLabelByReference",
429
+ value: function findLabelByReference(reference, context) {
430
+ var labels = this.getLabels(), label = labels.find(function(label) {
431
+ var metavariableUnifies = label.unifyReference(reference, context);
432
+ if (metavariableUnifies) {
433
+ return true;
434
+ }
435
+ }) || null;
436
+ return label;
437
+ }
438
+ },
439
+ {
440
+ key: "findMetaLemmaByReference",
441
+ value: function findMetaLemmaByReference(reference) {
442
+ var metaLemmas = this.getMetaLemmas(), metaLemma = metaLemmas.find(function(metaLemma) {
443
+ var metaLemmaComparesToReference = metaLemma.compareReference(reference);
444
+ if (metaLemmaComparesToReference) {
445
+ return true;
446
+ }
447
+ }) || null;
448
+ return metaLemma;
449
+ }
450
+ },
451
+ {
452
+ key: "findMetatheoremByReference",
453
+ value: function findMetatheoremByReference(reference) {
454
+ var metatheorems = this.getMetatheorems(), metatheorem = metatheorems.find(function(metatheorem) {
455
+ var metatheoremComparesToReference = metatheorem.compareReference(reference);
456
+ if (metatheoremComparesToReference) {
457
+ return true;
458
+ }
459
+ }) || null;
460
+ return metatheorem;
461
+ }
462
+ },
463
+ {
464
+ key: "findRuleByReference",
465
+ value: function findRuleByReference(reference) {
466
+ var rules = this.getRules(), metavariableName = reference.getMetavariableName(), rule = rules.find(function(rule) {
467
+ var ruleComparesToMetavariableName = rule.compareMetavariableName(metavariableName);
468
+ if (ruleComparesToMetavariableName) {
469
+ return true;
470
+ }
471
+ }) || null;
472
+ return rule;
473
+ }
474
+ },
475
+ {
476
+ key: "findAxiomByReference",
477
+ value: function findAxiomByReference(reference) {
478
+ var axioms = this.getAxioms(), metavariableName = reference.getMetavariableName(), axiom = axioms.find(function(axiom) {
479
+ var axiomComparesToMetavariableName = axiom.compareMetavariableName(metavariableName);
480
+ if (axiomComparesToMetavariableName) {
481
+ return true;
482
+ }
483
+ }) || null;
484
+ return axiom;
485
+ }
486
+ },
487
+ {
488
+ key: "findLemmaByReference",
489
+ value: function findLemmaByReference(reference) {
490
+ var lemmas = this.getLemmas(), metavariableName = reference.getMetavariableName(), lemma = lemmas.find(function(lemma) {
491
+ var lemmaComparesToMetavariableName = lemma.compareMetavariableName(metavariableName);
492
+ if (lemmaComparesToMetavariableName) {
493
+ return true;
494
+ }
495
+ }) || null;
496
+ return lemma;
497
+ }
498
+ },
499
+ {
500
+ key: "findTheoremByReference",
501
+ value: function findTheoremByReference(reference) {
502
+ var theorems = this.getTheorems(), metavariableName = reference.getMetavariableName(), theorem = theorems.find(function(theorem) {
503
+ var theoremComparesToMetavariableName = theorem.compareMetavariableName(metavariableName);
504
+ if (theoremComparesToMetavariableName) {
505
+ return true;
506
+ }
507
+ }) || null;
508
+ return theorem;
509
+ }
510
+ },
511
+ {
512
+ key: "findProcedureByName",
513
+ value: function findProcedureByName(name) {
514
+ var procedures = this.getProcedures(), procedure = procedures.find(function(procedure) {
515
+ var nameMatches = procedure.matchName(name);
516
+ if (nameMatches) {
517
+ return true;
518
+ }
519
+ }) || null;
520
+ return procedure;
521
+ }
522
+ },
523
+ {
524
+ key: "findConjectureByReference",
525
+ value: function findConjectureByReference(reference) {
526
+ var conjectures = this.getConjectures(), metavariableName = reference.getMetavariableName(), conjecture = conjectures.find(function(conjecture) {
527
+ var conjectureComparesToMetavariableName = conjecture.compareMetavariableName(metavariableName);
528
+ if (conjectureComparesToMetavariableName) {
529
+ return true;
530
+ }
531
+ }) || null;
532
+ return conjecture;
533
+ }
534
+ },
535
+ {
536
+ key: "findMetaLemmasByReference",
537
+ value: function findMetaLemmasByReference(reference) {
538
+ var _this = this;
539
+ var metaLemmas = this.getMetaLemmas();
540
+ filter(metaLemmas, function(metaLemma) {
541
+ var context = _this, topLevelMetaAssertion = metaLemma, topLevelMetaAssertionUnifies = reference.unifyTopLevelMetaAssertion(topLevelMetaAssertion, context);
542
+ if (topLevelMetaAssertionUnifies) {
543
+ return true;
544
+ }
545
+ });
546
+ return metaLemmas;
547
+ }
548
+ },
549
+ {
550
+ key: "findMetatheoremsByReference",
551
+ value: function findMetatheoremsByReference(reference) {
552
+ var _this = this;
553
+ var metatheorems = this.getMetatheorems();
554
+ filter(metatheorems, function(metatheorem) {
555
+ var context = _this, topLevelMetaAssertion = metatheorem, topLevelMetaAssertionUnifies = reference.unifyTopLevelMetaAssertion(topLevelMetaAssertion, context);
556
+ if (topLevelMetaAssertionUnifies) {
557
+ return true;
558
+ }
559
+ });
560
+ return metatheorems;
561
+ }
562
+ },
563
+ {
564
+ key: "findTopLevelMetaAssertionByReference",
565
+ value: function findTopLevelMetaAssertionByReference(reference) {
566
+ var metaLemma = this.findMetaLemmaByReference(reference), metatheorem = this.findMetatheoremByReference(reference), topLevelMetaAssertion = metaLemma || metatheorem; ///
567
+ return topLevelMetaAssertion;
568
+ }
569
+ },
570
+ {
571
+ key: "findTopLevelMetaAssertionsByReference",
572
+ value: function findTopLevelMetaAssertionsByReference(reference) {
573
+ var metaLemmas = this.findMetaLemmasByReference(reference), metatheorems = this.findMetatheoremsByReference(reference), topLevelMetaAssertions = _to_consumable_array(metaLemmas).concat(_to_consumable_array(metatheorems));
574
+ return topLevelMetaAssertions;
575
+ }
576
+ },
577
+ {
578
+ key: "findTopLevelAssertionByReference",
579
+ value: function findTopLevelAssertionByReference(reference) {
580
+ var axiom = this.findAxiomByReference(reference), lemma = this.findLemmaByReference(reference), theorem = this.findTheoremByReference(reference), conjecture = this.findConjectureByReference(reference), topLevelAssertion = axiom || lemma || theorem || conjecture;
581
+ return topLevelAssertion;
582
+ }
583
+ },
584
+ {
585
+ key: "findMetavariable",
586
+ value: function findMetavariable(metavariable) {
587
+ var _this = this;
588
+ var metavariables = this.getMetavariables(), specificMetavariable = metavariable; ///
589
+ metavariable = metavariables.find(function(metavariable) {
590
+ var context = _this, generalMetavariable = metavariable, metavariableUnifies = generalMetavariable.unifyMetavariable(specificMetavariable, context);
591
+ if (metavariableUnifies) {
592
+ return true;
593
+ }
594
+ }) || null;
595
+ return metavariable;
596
+ }
597
+ },
598
+ {
599
+ key: "findTypeByTypeName",
600
+ value: function findTypeByTypeName(typeName) {
601
+ var includeRelease = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true, includeDependencies = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
602
+ var types = this.getTypes(includeRelease, includeDependencies);
603
+ var baseType = (0, _types.baseTypeFromNothing)();
604
+ types = _to_consumable_array(types).concat([
605
+ baseType
606
+ ]);
607
+ var type = types.find(function(type) {
608
+ var typeComparesToTypeName = type.compareTypeName(typeName);
609
+ if (typeComparesToTypeName) {
610
+ return true;
611
+ }
612
+ }) || null;
613
+ return type;
614
+ }
615
+ },
616
+ {
617
+ key: "findTypeByNominalTypeName",
618
+ value: function findTypeByNominalTypeName(nominalTypeName) {
619
+ var types = this.getTypes();
620
+ var baseType = (0, _types.baseTypeFromNothing)();
621
+ types = _to_consumable_array(types).concat([
622
+ baseType
623
+ ]);
624
+ var type = types.find(function(type) {
625
+ var typeComparesToNominalTypeName = type.compareNominalTypeName(nominalTypeName);
626
+ if (typeComparesToNominalTypeName) {
627
+ return true;
628
+ }
629
+ }) || null;
630
+ return type;
631
+ }
632
+ },
633
+ {
634
+ key: "findTypeByPrefixedTypeName",
635
+ value: function findTypeByPrefixedTypeName(prefixedTypeName) {
636
+ var types = this.getTypes();
637
+ var baseType = (0, _types.baseTypeFromNothing)();
638
+ types = _to_consumable_array(types).concat([
639
+ baseType
640
+ ]);
641
+ var type = types.find(function(type) {
642
+ var typeComparesToPrefixedTypeName = type.comparePrefixedTypeName(prefixedTypeName);
643
+ if (typeComparesToPrefixedTypeName) {
644
+ return true;
645
+ }
646
+ }) || null;
647
+ return type;
648
+ }
649
+ },
650
+ {
651
+ key: "findMetaTypeByMetaTypeName",
652
+ value: function findMetaTypeByMetaTypeName(metaTypeName) {
653
+ var metaTypes = this.getMetaTypes(), metaType = metaTypes.find(function(metaType) {
654
+ var metaTypeComparesToMetaTypeName = metaType.compareMetaTypeName(metaTypeName);
655
+ if (metaTypeComparesToMetaTypeName) {
656
+ return true;
657
+ }
658
+ }) || null;
659
+ return metaType;
660
+ }
661
+ },
662
+ {
663
+ key: "findTypePrefixByTypePrefixName",
664
+ value: function findTypePrefixByTypePrefixName(typePrefixName) {
665
+ var typePrefixes = this.getTypePrefixes(), typePrefix = typePrefixes.find(function(typePrefix) {
666
+ var typePrefixComparesToTypePrefixName = typePrefix.compareTypePrefixName(typePrefixName);
667
+ if (typePrefixComparesToTypePrefixName) {
668
+ return true;
669
+ }
670
+ }) || null;
671
+ return typePrefix;
672
+ }
673
+ },
674
+ {
675
+ key: "findVariableByVariableIdentifier",
676
+ value: function findVariableByVariableIdentifier(variableIdentifier) {
677
+ var variables = this.getVariables(), variable = variables.find(function(variable) {
678
+ var variableComparesToVariableIdentifier = variable.compareVariableIdentifier(variableIdentifier);
679
+ if (variableComparesToVariableIdentifier) {
680
+ return true;
681
+ }
682
+ }) || null;
683
+ return variable;
684
+ }
685
+ },
686
+ {
687
+ key: "findLabelByMetavariableName",
688
+ value: function findLabelByMetavariableName(metavariableName) {
689
+ var labels = this.getLabels(), label = labels.find(function(label) {
690
+ var labelComparesToMetavariableName = label.compareMetavariableName(metavariableName);
691
+ if (labelComparesToMetavariableName) {
692
+ return true;
693
+ }
694
+ }) || null;
695
+ return label;
696
+ }
697
+ },
698
+ {
699
+ key: "findLabelByMetavariable",
700
+ value: function findLabelByMetavariable(metavariable) {
701
+ var labels = this.getLabels(), label = labels.find(function(label) {
702
+ var metavariableEqualToLabelMetavariable = label.isMetavariableEqualToMetavariable(metavariable);
703
+ if (metavariableEqualToLabelMetavariable) {
704
+ return true;
705
+ }
706
+ }) || null;
707
+ return label;
708
+ }
709
+ },
710
+ {
711
+ key: "findJudgementByMetavariable",
712
+ value: function findJudgementByMetavariable(metavariable) {
713
+ var judgements = this.getJudgements(), judgement = judgements.find(function(judgement) {
714
+ var judgementSingular = judgement.isSingular();
715
+ if (judgementSingular) {
716
+ var judgementMetavariable = judgement.getMetavariable(), judgementMetavariableEqualToMetavariable = judgementMetavariable.isEqualTo(metavariable);
717
+ if (judgementMetavariableEqualToMetavariable) {
718
+ return true;
719
+ }
720
+ }
721
+ }) || null;
722
+ return judgement;
723
+ }
724
+ },
725
+ {
726
+ key: "findMetavariableByMetavariableName",
727
+ value: function findMetavariableByMetavariableName(metavariableName) {
728
+ var metavariables = this.getMetavariables(), metavariable = metavariables.find(function(metavariable) {
729
+ var metavariableComparesToMetavariableName = metavariable.compareMetavariableName(metavariableName);
730
+ if (metavariableComparesToMetavariableName) {
731
+ return true;
732
+ }
733
+ }) || null;
734
+ return metavariable;
735
+ }
736
+ },
737
+ {
738
+ key: "isMetavariablePresent",
739
+ value: function isMetavariablePresent(metavariable) {
740
+ metavariable = this.findMetavariable(metavariable);
741
+ var metavariablePresent = metavariable !== null;
742
+ return metavariablePresent;
743
+ }
744
+ },
745
+ {
746
+ key: "isTypePresentByTypeName",
747
+ value: function isTypePresentByTypeName(typeName) {
748
+ var includeRelease = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true, includeDependencies = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
749
+ var type = this.findTypeByTypeName(typeName, includeRelease, includeDependencies), typePresent = type !== null;
750
+ return typePresent;
751
+ }
752
+ },
753
+ {
754
+ key: "isTypePresentByNominalTypeName",
755
+ value: function isTypePresentByNominalTypeName(nominalTypeName) {
756
+ var type = this.findTypeByNominalTypeName(nominalTypeName), typePresent = type !== null;
757
+ return typePresent;
758
+ }
759
+ },
760
+ {
761
+ key: "isTypePresentByPrefixedTypeName",
762
+ value: function isTypePresentByPrefixedTypeName(prefixedTypeName) {
763
+ var type = this.findTypeByPrefixedTypeName(prefixedTypeName), typePresent = type !== null;
764
+ return typePresent;
765
+ }
766
+ },
767
+ {
768
+ key: "isTypePrefixPresentByTypePrefixName",
769
+ value: function isTypePrefixPresentByTypePrefixName(typePrefixName) {
770
+ var typePrefix = this.findTypePrefixByTypePrefixName(typePrefixName), typePrefixPresent = typePrefix !== null;
771
+ return typePrefixPresent;
772
+ }
773
+ },
774
+ {
775
+ key: "isVariablePresentByVariableIdentifier",
776
+ value: function isVariablePresentByVariableIdentifier(variableIdentifier) {
777
+ var variable = this.findVariableByVariableIdentifier(variableIdentifier), variablePresent = variable !== null;
778
+ return variablePresent;
779
+ }
780
+ },
781
+ {
782
+ key: "isLabelPresentByMetavariableName",
783
+ value: function isLabelPresentByMetavariableName(metavariableName) {
784
+ var label = this.findLabelByMetavariableName(metavariableName), labelPresent = label !== null;
785
+ return labelPresent;
786
+ }
787
+ },
788
+ {
789
+ key: "isLabelPresentByMetavariable",
790
+ value: function isLabelPresentByMetavariable(metavariable) {
791
+ var label = this.findLabelByMetavariable(metavariable), labelPresent = label !== null;
792
+ return labelPresent;
793
+ }
794
+ },
795
+ {
796
+ key: "isMetavariablePresentByMetavariableName",
797
+ value: function isMetavariablePresentByMetavariableName(metavariableName) {
798
+ var metavariable = this.findMetavariableByMetavariableName(metavariableName), metavariablePresent = metavariable !== null;
799
+ return metavariablePresent;
800
+ }
801
+ },
802
+ {
803
+ key: "isLabelPresentByReference",
804
+ value: function isLabelPresentByReference(reference) {
805
+ var _this = this;
806
+ var labels = this.getLabels(), labelPresent = labels.some(function(label) {
807
+ var context = _this, labelUnifies = reference.unifyLabel(label, context);
808
+ if (labelUnifies) {
809
+ return true;
810
+ }
811
+ });
812
+ return labelPresent;
813
+ }
814
+ },
815
+ {
816
+ key: "isProcedurePresentByName",
817
+ value: function isProcedurePresentByName(name) {
818
+ var procedure = this.findProcedureByName(name), procedurePresent = procedure !== null;
819
+ return procedurePresent;
820
+ }
821
+ },
822
+ {
823
+ key: "isMetavariablePresentByReference",
824
+ value: function isMetavariablePresentByReference(reference) {
825
+ var _this = this;
826
+ var metavariables = this.getMetavariables(), metavariablePresent = metavariables.some(function(metavariable) {
827
+ var context = _this, metavariableUnifies = reference.unifyMetavariable(metavariable, context);
828
+ if (metavariableUnifies) {
829
+ return true;
830
+ }
831
+ });
832
+ return metavariablePresent;
833
+ }
834
+ },
835
+ {
836
+ key: "isTopLevelMetaAssertionPresentByReference",
837
+ value: function isTopLevelMetaAssertionPresentByReference(reference) {
838
+ var topLevelMetaAssertion = this.findTopLevelMetaAssertionByReference(reference), topLevelMetaAssertionPresent = topLevelMetaAssertion !== null;
839
+ return topLevelMetaAssertionPresent;
840
+ }
841
+ },
842
+ {
843
+ key: "verify",
844
+ value: function verify() {
845
+ var verifies = false;
846
+ this.prepare();
847
+ if (this.node === null) {
848
+ this.warning("Unable to verify the '".concat(this.filePath, "' file because it cannot be parsed."));
849
+ } else {
850
+ this.debug("Verifying the '".concat(this.filePath, "' file..."));
851
+ var context = this, fileNode = this.node; ///
852
+ verifies = (0, _verify.verifyFile)(fileNode, context);
853
+ verifies ? this.complete() : this.clear();
854
+ if (verifies) {
855
+ this.info("...verified the '".concat(this.filePath, "' file."));
856
+ }
857
+ }
858
+ return verifies;
859
+ }
860
+ },
861
+ {
862
+ key: "prepare",
863
+ value: function prepare() {
864
+ if (this.tokens !== null) {
865
+ return;
866
+ }
867
+ var file = this.findFile(this.filePath), lexer = this.getLexer(), parser = this.getParser(), content = file.getContent();
868
+ this.tokens = lexer.tokenise(content);
869
+ this.node = parser.parse(this.tokens);
870
+ }
871
+ },
872
+ {
873
+ key: "clear",
874
+ value: function clear() {
875
+ this.lineIndex = null;
876
+ this.types = [];
877
+ this.rules = [];
878
+ this.axioms = [];
879
+ this.lemmas = [];
880
+ this.theorems = [];
881
+ this.variables = [];
882
+ this.metaLemmas = [];
883
+ this.conjectures = [];
884
+ this.combinators = [];
885
+ this.typePrefixes = [];
886
+ this.constructors = [];
887
+ this.metatheorems = [];
888
+ this.metavariables = [];
889
+ }
890
+ },
891
+ {
892
+ key: "complete",
893
+ value: function complete() {
894
+ this.lineIndex = null;
895
+ }
896
+ },
897
+ {
898
+ key: "initialise",
899
+ value: function initialise(json) {
900
+ var fileContext = this; ///
901
+ this.types = [];
902
+ (0, _json.typesFromJSON)(json, this.types, fileContext);
903
+ this.rules = (0, _json.rulesFromJSON)(json, fileContext);
904
+ this.axioms = (0, _json.axiomsFromJSON)(json, fileContext);
905
+ this.lemmas = (0, _json.lemmasFromNothing)();
906
+ this.theorems = (0, _json.theoremsFromJSON)(json, fileContext);
907
+ this.variables = (0, _json.variablesFromJSON)(json, fileContext);
908
+ this.metaLemmas = (0, _json.metaLemmasFromNothing)();
909
+ this.conjectures = (0, _json.conjecturesFromJSON)(json, fileContext);
910
+ this.combinators = (0, _json.combinatorsFromJSON)(json, fileContext);
911
+ this.typePrefixes = (0, _json.typePrefixesFromJSON)(json, fileContext);
912
+ this.constructors = (0, _json.constructorsFromJSON)(json, fileContext);
913
+ this.metatheorems = (0, _json.metatheoremsFromJSON)(json, fileContext);
914
+ this.metavariables = (0, _json.metavariablesFromJSON)(json, fileContext);
915
+ }
916
+ },
917
+ {
918
+ key: "toJSON",
919
+ value: function toJSON() {
920
+ var typesJSON = (0, _json.typesToTypesJSON)(this.types), rulesJSON = (0, _json.rulesToRulesJSON)(this.rules), axiomsJSON = (0, _json.axiomsToAxiomsJSON)(this.axioms), theoremsJSON = (0, _json.theoremsToTheoremsJSON)(this.theorems), variablesJSON = (0, _json.variablesToVariablesJSON)(this.variables), conjecturesJSON = (0, _json.conjecturesToConjecturesJSON)(this.conjectures), combinatorsJSON = (0, _json.combinatorsToCombinatorsJSON)(this.combinators), typePrefixesJSON = (0, _json.typePrefixesToTypePrefixesJSON)(this.typePrefixes), constructorsJSON = (0, _json.constructorsToConstructorsJSON)(this.constructors), metatheoremsJSON = (0, _json.metatheoremsToMetatheoremsJSON)(this.metatheorems), metavariablesJSON = (0, _json.metavariablesToMetavariablesJSON)(this.metavariables), filePath = this.filePath, types = typesJSON, rules = rulesJSON, axioms = axiomsJSON, theorems = theoremsJSON, variables = variablesJSON, conjectures = conjecturesJSON, combinators = combinatorsJSON, typePrefixes = typePrefixesJSON, constructors = constructorsJSON, metatheorems = metatheoremsJSON, metavariables = metavariablesJSON, json = {
921
+ filePath: filePath,
922
+ types: types,
923
+ rules: rules,
924
+ axioms: axioms,
925
+ theorems: theorems,
926
+ variables: variables,
927
+ conjectures: conjectures,
928
+ combinators: combinators,
929
+ typePrefixes: typePrefixes,
930
+ constructors: constructors,
931
+ metatheorems: metatheorems,
932
+ metavariables: metavariables
933
+ };
934
+ return json;
935
+ }
936
+ }
937
+ ], [
938
+ {
939
+ key: "fromFile",
940
+ value: function fromFile(file, context) {
941
+ var filePath = file.getPath(), tokens = null, node = null, types = [], rules = [], axioms = [], lemmas = [], theorems = [], variables = [], metaLemmas = [], conjectures = [], combinators = [], typePrefixes = [], constructors = [], metatheorems = [], metavariables = [], fileContext = new NominalFileContext(context, filePath, tokens, node, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables);
942
+ return fileContext;
943
+ }
944
+ },
945
+ {
946
+ key: "fromFilePath",
947
+ value: function fromFilePath(filePath, context) {
948
+ var tokens = null, node = null, types = null, rules = null, axioms = null, lemmas = null, theorems = null, variables = null, metaLemmas = null, conjectures = null, combinators = null, typePrefixes = null, constructors = null, metatheorems = null, metavariables = null, fileContext = new NominalFileContext(context, filePath, tokens, node, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables);
949
+ return fileContext;
950
+ }
951
+ }
952
+ ]);
953
+ return NominalFileContext;
954
+ }(_file.default);
955
+
956
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250ZXh0L2ZpbGUvbm9taW5hbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBGaWxlQ29udGV4dCBmcm9tIFwiLi4vLi4vY29udGV4dC9maWxlXCI7XG5cbmltcG9ydCB7IHZlcmlmeUZpbGUgfSBmcm9tIFwiLi4vcHJvY2Vzcy92ZXJpZnlcIjtcbmltcG9ydCB7IGNoYWluQ29udGV4dCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvY29udGV4dFwiO1xuaW1wb3J0IHsgYmFzZVR5cGVGcm9tTm90aGluZyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZXNGcm9tSlNPTixcbiAgICAgICAgIHJ1bGVzRnJvbUpTT04sXG4gICAgICAgICBheGlvbXNGcm9tSlNPTixcbiAgICAgICAgIHR5cGVzVG9UeXBlc0pTT04sXG4gICAgICAgICBydWxlc1RvUnVsZXNKU09OLFxuICAgICAgICAgdGhlb3JlbXNGcm9tSlNPTixcbiAgICAgICAgIHZhcmlhYmxlc0Zyb21KU09OLFxuICAgICAgICAgbGVtbWFzRnJvbU5vdGhpbmcsXG4gICAgICAgICBheGlvbXNUb0F4aW9tc0pTT04sXG4gICAgICAgICBjb25qZWN0dXJlc0Zyb21KU09OLFxuICAgICAgICAgY29tYmluYXRvcnNGcm9tSlNPTixcbiAgICAgICAgIHR5cGVQcmVmaXhlc0Zyb21KU09OLFxuICAgICAgICAgY29uc3RydWN0b3JzRnJvbUpTT04sXG4gICAgICAgICBtZXRhdGhlb3JlbXNGcm9tSlNPTixcbiAgICAgICAgIG1ldGF2YXJpYWJsZXNGcm9tSlNPTixcbiAgICAgICAgIG1ldGFMZW1tYXNGcm9tTm90aGluZyxcbiAgICAgICAgIHRoZW9yZW1zVG9UaGVvcmVtc0pTT04sXG4gICAgICAgICB2YXJpYWJsZXNUb1ZhcmlhYmxlc0pTT04sXG4gICAgICAgICBjb25qZWN0dXJlc1RvQ29uamVjdHVyZXNKU09OLFxuICAgICAgICAgY29tYmluYXRvcnNUb0NvbWJpbmF0b3JzSlNPTixcbiAgICAgICAgIHR5cGVQcmVmaXhlc1RvVHlwZVByZWZpeGVzSlNPTixcbiAgICAgICAgIGNvbnN0cnVjdG9yc1RvQ29uc3RydWN0b3JzSlNPTixcbiAgICAgICAgIG1ldGF0aGVvcmVtc1RvTWV0YXRoZW9yZW1zSlNPTixcbiAgICAgICAgIG1ldGF2YXJpYWJsZXNUb01ldGF2YXJpYWJsZXNKU09OIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9qc29uXCI7XG5cbmNvbnN0IHsgcHVzaCwgZmlsdGVyIH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTm9taW5hbEZpbGVDb250ZXh0IGV4dGVuZHMgRmlsZUNvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBmaWxlUGF0aCwgdG9rZW5zLCBub2RlLCB0eXBlcywgcnVsZXMsIGF4aW9tcywgbGVtbWFzLCB0aGVvcmVtcywgdmFyaWFibGVzLCBtZXRhTGVtbWFzLCBjb25qZWN0dXJlcywgY29tYmluYXRvcnMsIHR5cGVQcmVmaXhlcywgY29uc3RydWN0b3JzLCBtZXRhdGhlb3JlbXMsIG1ldGF2YXJpYWJsZXMpIHtcbiAgICBzdXBlcihjb250ZXh0LCBmaWxlUGF0aCwgbm9kZSwgdG9rZW5zKVxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoO1xuICAgIHRoaXMudG9rZW5zID0gdG9rZW5zO1xuICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgdGhpcy50eXBlcyA9IHR5cGVzO1xuICAgIHRoaXMucnVsZXMgPSBydWxlcztcbiAgICB0aGlzLmF4aW9tcyA9IGF4aW9tcztcbiAgICB0aGlzLmxlbW1hcyA9IGxlbW1hcztcbiAgICB0aGlzLnRoZW9yZW1zID0gdGhlb3JlbXM7XG4gICAgdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7XG4gICAgdGhpcy5tZXRhTGVtbWFzID0gbWV0YUxlbW1hcztcbiAgICB0aGlzLmNvbmplY3R1cmVzID0gY29uamVjdHVyZXM7XG4gICAgdGhpcy5jb21iaW5hdG9ycyA9IGNvbWJpbmF0b3JzO1xuICAgIHRoaXMudHlwZVByZWZpeGVzID0gdHlwZVByZWZpeGVzO1xuICAgIHRoaXMuY29uc3RydWN0b3JzID0gY29uc3RydWN0b3JzO1xuICAgIHRoaXMubWV0YXRoZW9yZW1zID0gbWV0YXRoZW9yZW1zO1xuICAgIHRoaXMubWV0YXZhcmlhYmxlcyA9IG1ldGF2YXJpYWJsZXM7XG5cbiAgICByZXR1cm4gY2hhaW5Db250ZXh0KHRoaXMpO1xuICB9XG5cbiAgZ2V0Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0O1xuICB9XG5cbiAgZ2V0RmlsZVBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZVBhdGg7XG4gIH1cblxuICBnZXRMaW5lSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMubGluZUluZGV4O1xuICB9XG5cbiAgZ2V0VG9rZW5zKCkge1xuICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgfVxuXG4gIGdldE5vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZTtcbiAgfVxuXG4gIGdldEp1ZGdlbWVudHMoKSB7XG4gICAgY29uc3QganVkZ2VtZW50cyA9IFtdO1xuXG4gICAgcmV0dXJuIGp1ZGdlbWVudHM7XG4gIH1cblxuICBnZXRFcXVpdmFsZW5jZXMoKSB7XG4gICAgZGVidWdnZXJcbiAgfVxuXG4gIGdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKSB7XG4gICAgY29uc3Qgc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyA9IFtdO1xuXG4gICAgcmV0dXJuIHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnM7XG4gIH1cblxuICBnZXRMYWJlbHMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgbGFiZWxzID0gW107XG5cbiAgICBpZiAoaW5jbHVkZVJlbGVhc2UpIHtcbiAgICAgIGNvbnN0IHJlbGVhc2VDb250ZXh0TGFiZWxzID0gdGhpcy5jb250ZXh0LmdldExhYmVscygpO1xuXG4gICAgICBwdXNoKGxhYmVscywgcmVsZWFzZUNvbnRleHRMYWJlbHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJ1bGVzLmZvckVhY2goKHJ1bGUpID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUxhYmVscyA9IHJ1bGUuZ2V0TGFiZWxzKCk7XG5cbiAgICAgICAgcHVzaChsYWJlbHMsIHJ1bGVMYWJlbHMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYXhpb21zLmZvckVhY2goKGF4aW9tKSA9PiB7XG4gICAgICAgIGNvbnN0IGF4aW9tTGFiZWxzID0gYXhpb20uZ2V0TGFiZWxzKCk7XG5cbiAgICAgICAgcHVzaChsYWJlbHMsIGF4aW9tTGFiZWxzKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxlbW1hcy5mb3JFYWNoKChsZW1tYSkgPT4ge1xuICAgICAgICBjb25zdCBsZW1tYUxhYmVscyA9IGxlbW1hLmdldExhYmVscygpO1xuXG4gICAgICAgIHB1c2gobGFiZWxzLCBsZW1tYUxhYmVscyk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy50aGVvcmVtcy5mb3JFYWNoKCh0aGVvcmVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHRoZW9yZW1MYWJlbHMgPSB0aGVvcmVtLmdldExhYmVscygpO1xuXG4gICAgICAgIHB1c2gobGFiZWxzLCB0aGVvcmVtTGFiZWxzKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNvbmplY3R1cmVzLmZvckVhY2goKGNvbmplY3R1cmUpID0+IHtcbiAgICAgICAgY29uc3QgY29uamVjdHVyZUxhYmVscyA9IGNvbmplY3R1cmUuZ2V0TGFiZWxzKCk7XG5cbiAgICAgICAgcHVzaChsYWJlbHMsIGNvbmplY3R1cmVMYWJlbHMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubWV0YXRoZW9yZW1zLmZvckVhY2goKG1ldGF0aGVvcmVtKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGF0aGVvcmVtTGFiZWwgPSBtZXRhdGhlb3JlbS5nZXRMYWJlbCgpO1xuXG4gICAgICAgIGxhYmVscy5wdXNoKG1ldGF0aGVvcmVtTGFiZWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhYmVscztcbiAgfVxuXG4gIGdldFR5cGVzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSwgaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHtcbiAgICBjb25zdCB0eXBlcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldFR5cGVzKGluY2x1ZGVEZXBlbmRlbmNpZXMpIDpcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVzO1xuXG4gICAgcmV0dXJuIHR5cGVzO1xuICB9XG5cbiAgZ2V0UnVsZXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgcnVsZXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRSdWxlcygpIDpcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVzO1xuXG4gICAgcmV0dXJuIHJ1bGVzO1xuICB9XG5cbiAgZ2V0QXhpb21zKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IGF4aW9tcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRBeGlvbXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXhpb21zO1xuXG4gICAgcmV0dXJuIGF4aW9tcztcbiAgfVxuXG4gIGdldExlbW1hcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCBsZW1tYXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0TGVtbWFzKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlbW1hcztcblxuICAgIHJldHVybiBsZW1tYXM7XG4gIH1cblxuICBnZXRUaGVvcmVtcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCB0aGVvcmVtcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldFRoZW9yZW1zKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhlb3JlbXM7XG5cbiAgICByZXR1cm4gdGhlb3JlbXM7XG4gIH1cblxuICBnZXRWYXJpYWJsZXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMudmFyaWFibGVzO1xuICB9XG5cbiAgZ2V0UHJvY2VkdXJlcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCBwcm9jZWR1cmVzID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRQcm9jZWR1cmVzKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDsgIC8vL1xuXG4gICAgcmV0dXJuIHByb2NlZHVyZXM7XG4gIH1cblxuICBnZXRNZXRhTGVtbWFzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1ldGFMZW1tYXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldE1ldGFMZW1tYXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldGFMZW1tYXM7XG5cbiAgICByZXR1cm4gbWV0YUxlbW1hcztcbiAgfVxuXG4gIGdldENvbmplY3R1cmVzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNvbmplY3R1cmVzID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0Q29uamVjdHVyZXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25qZWN0dXJlcztcblxuICAgIHJldHVybiBjb25qZWN0dXJlcztcbiAgfVxuXG4gIGdldENvbWJpbmF0b3JzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNvbWJpbmF0b3JzID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0Q29tYmluYXRvcnMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21iaW5hdG9ycztcblxuICAgIHJldHVybiBjb21iaW5hdG9ycztcbiAgfVxuXG4gIGdldFR5cGVQcmVmaXhlcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCB0eXBlUHJlZml4ZXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0VHlwZVByZWZpeGVzKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVQcmVmaXhlcztcblxuICAgIHJldHVybiB0eXBlUHJlZml4ZXM7XG4gIH1cblxuICBnZXRDb25zdHJ1Y3RvcnMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgY29uc3RydWN0b3JzID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldENvbnN0cnVjdG9ycygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvcnM7XG5cbiAgICByZXR1cm4gY29uc3RydWN0b3JzO1xuICB9XG5cbiAgZ2V0TWV0YXRoZW9yZW1zKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1ldGF0aGVvcmVtcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRNZXRhdGhlb3JlbXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0YXRoZW9yZW1zO1xuXG4gICAgcmV0dXJuIG1ldGF0aGVvcmVtcztcbiAgfVxuXG4gIGdldE1ldGF2YXJpYWJsZXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGFkZFR5cGUodHlwZSkge1xuICAgIHRoaXMudHlwZXMucHVzaCh0eXBlKTtcbiAgfVxuXG4gIGFkZFJ1bGUocnVsZSkge1xuICAgIHRoaXMucnVsZXMucHVzaChydWxlKTtcbiAgfVxuXG4gIGFkZEF4aW9tKGF4aW9tKSB7XG4gICAgdGhpcy5heGlvbXMucHVzaChheGlvbSk7XG4gIH1cblxuICBhZGRMZW1tYShsZW1tYSkge1xuICAgIHRoaXMubGVtbWFzLnB1c2gobGVtbWEpO1xuICB9XG5cbiAgYWRkVGhlb3JlbSh0aGVvcmVtKSB7XG4gICAgdGhpcy50aGVvcmVtcy5wdXNoKHRoZW9yZW0pO1xuICB9XG5cbiAgYWRkVmFyaWFibGUodmFyaWFibGUpIHtcbiAgICB0aGlzLnZhcmlhYmxlcy5wdXNoKHZhcmlhYmxlKTtcbiAgfVxuXG4gIGFkZE1ldGFMZW1tYShtZXRhTGVtbWEpIHtcbiAgICB0aGlzLm1ldGFMZW1tYXMucHVzaChtZXRhTGVtbWEpO1xuICB9XG5cbiAgYWRkQ29uamVjdHVyZShjb25qZWN0dXJlKSB7XG4gICAgdGhpcy5jb25qZWN0dXJlcy5wdXNoKGNvbmplY3R1cmUpO1xuICB9XG5cbiAgYWRkQ29tYmluYXRvcihjb21iaW5hdG9yKSB7XG4gICAgdGhpcy5jb21iaW5hdG9ycy5wdXNoKGNvbWJpbmF0b3IpO1xuICB9XG5cbiAgYWRkVHlwZVByZWZpeCh0eXBlUHJlZml4KSB7XG4gICAgdGhpcy50eXBlUHJlZml4ZXMucHVzaCh0eXBlUHJlZml4KTtcbiAgfVxuXG4gIGFkZENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvcnMucHVzaChjb25zdHJ1Y3Rvcik7XG4gIH1cblxuICBhZGRNZXRhdGhlb3JlbShtZXRhdGhlb3JlbSkge1xuICAgIHRoaXMubWV0YXRoZW9yZW1zLnB1c2gobWV0YXRoZW9yZW0pO1xuICB9XG5cbiAgYWRkTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkge1xuICAgIHRoaXMubWV0YXZhcmlhYmxlcy5wdXNoKG1ldGF2YXJpYWJsZSk7XG4gIH1cblxuICBmaW5kTGFiZWxCeVJlZmVyZW5jZShyZWZlcmVuY2UsIGNvbnRleHQpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpLFxuICAgICAgICAgIGxhYmVsID0gbGFiZWxzLmZpbmQoKGxhYmVsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVVbmlmaWVzID0gbGFiZWwudW5pZnlSZWZlcmVuY2UocmVmZXJlbmNlLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgaWYgKG1ldGF2YXJpYWJsZVVuaWZpZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIGZpbmRNZXRhTGVtbWFCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBtZXRhTGVtbWFzID0gdGhpcy5nZXRNZXRhTGVtbWFzKCksXG4gICAgICAgICAgbWV0YUxlbW1hID0gbWV0YUxlbW1hcy5maW5kKChtZXRhTGVtbWEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFMZW1tYUNvbXBhcmVzVG9SZWZlcmVuY2UgPSBtZXRhTGVtbWEuY29tcGFyZVJlZmVyZW5jZShyZWZlcmVuY2UpO1xuXG4gICAgICAgICAgICBpZiAobWV0YUxlbW1hQ29tcGFyZXNUb1JlZmVyZW5jZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGFMZW1tYTtcbiAgfVxuXG4gIGZpbmRNZXRhdGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IG1ldGF0aGVvcmVtcyA9IHRoaXMuZ2V0TWV0YXRoZW9yZW1zKCksXG4gICAgICAgICAgbWV0YXRoZW9yZW0gPSBtZXRhdGhlb3JlbXMuZmluZCgobWV0YXRoZW9yZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGF0aGVvcmVtQ29tcGFyZXNUb1JlZmVyZW5jZSA9IG1ldGF0aGVvcmVtLmNvbXBhcmVSZWZlcmVuY2UocmVmZXJlbmNlKTtcblxuICAgICAgICAgICAgaWYgKG1ldGF0aGVvcmVtQ29tcGFyZXNUb1JlZmVyZW5jZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF0aGVvcmVtO1xuICB9XG5cbiAgZmluZFJ1bGVCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBydWxlcyA9IHRoaXMuZ2V0UnVsZXMoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOYW1lID0gcmVmZXJlbmNlLmdldE1ldGF2YXJpYWJsZU5hbWUoKSxcbiAgICAgICAgICBydWxlID0gcnVsZXMuZmluZCgocnVsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gcnVsZS5jb21wYXJlTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cblxuICBmaW5kQXhpb21CeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBheGlvbXMgPSB0aGlzLmdldEF4aW9tcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGF4aW9tID0gYXhpb21zLmZpbmQoKGF4aW9tKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBheGlvbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gYXhpb20uY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChheGlvbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gYXhpb207XG4gIH1cblxuICBmaW5kTGVtbWFCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBsZW1tYXMgPSB0aGlzLmdldExlbW1hcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGxlbW1hID0gbGVtbWFzLmZpbmQoKGxlbW1hKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZW1tYUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gbGVtbWEuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChsZW1tYUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbGVtbWE7XG4gIH1cblxuICBmaW5kVGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IHRoZW9yZW1zID0gdGhpcy5nZXRUaGVvcmVtcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIHRoZW9yZW0gPSB0aGVvcmVtcy5maW5kKCh0aGVvcmVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aGVvcmVtQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUgPSB0aGVvcmVtLmNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAodGhlb3JlbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdGhlb3JlbTtcbiAgfVxuXG4gIGZpbmRQcm9jZWR1cmVCeU5hbWUobmFtZSkge1xuICAgIGNvbnN0IHByb2NlZHVyZXMgPSB0aGlzLmdldFByb2NlZHVyZXMoKSxcbiAgICAgICAgICBwcm9jZWR1cmUgPSBwcm9jZWR1cmVzLmZpbmQoKHByb2NlZHVyZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmFtZU1hdGNoZXMgPSBwcm9jZWR1cmUubWF0Y2hOYW1lKG5hbWUpO1xuXG4gICAgICAgICAgICBpZiAobmFtZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBwcm9jZWR1cmU7XG4gIH1cblxuICBmaW5kQ29uamVjdHVyZUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IGNvbmplY3R1cmVzID0gdGhpcy5nZXRDb25qZWN0dXJlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGNvbmplY3R1cmUgPSBjb25qZWN0dXJlcy5maW5kKChjb25qZWN0dXJlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb25qZWN0dXJlQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUgPSBjb25qZWN0dXJlLmNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoY29uamVjdHVyZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gY29uamVjdHVyZTtcbiAgfVxuXG4gIGZpbmRNZXRhTGVtbWFzQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YUxlbW1hcyA9IHRoaXMuZ2V0TWV0YUxlbW1hcygpO1xuXG4gICAgZmlsdGVyKG1ldGFMZW1tYXMsIChtZXRhTGVtbWEpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICAgIHRvcExldmVsTWV0YUFzc2VydGlvbiA9IG1ldGFMZW1tYSwgLy8vXG4gICAgICAgICAgICB0b3BMZXZlbE1ldGFBc3NlcnRpb25VbmlmaWVzID0gcmVmZXJlbmNlLnVuaWZ5VG9wTGV2ZWxNZXRhQXNzZXJ0aW9uKHRvcExldmVsTWV0YUFzc2VydGlvbiwgY29udGV4dCk7XG5cbiAgICAgIGlmICh0b3BMZXZlbE1ldGFBc3NlcnRpb25VbmlmaWVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1ldGFMZW1tYXM7XG4gIH1cblxuICBmaW5kTWV0YXRoZW9yZW1zQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YXRoZW9yZW1zID0gdGhpcy5nZXRNZXRhdGhlb3JlbXMoKTtcblxuICAgIGZpbHRlcihtZXRhdGhlb3JlbXMsIChtZXRhdGhlb3JlbSkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uID0gbWV0YXRoZW9yZW0sIC8vL1xuICAgICAgICAgICAgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uVW5pZmllcyA9IHJlZmVyZW5jZS51bmlmeVRvcExldmVsTWV0YUFzc2VydGlvbih0b3BMZXZlbE1ldGFBc3NlcnRpb24sIGNvbnRleHQpO1xuXG4gICAgICBpZiAodG9wTGV2ZWxNZXRhQXNzZXJ0aW9uVW5pZmllcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBtZXRhdGhlb3JlbXM7XG4gIH1cblxuICBmaW5kVG9wTGV2ZWxNZXRhQXNzZXJ0aW9uQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YUxlbW1hID0gdGhpcy5maW5kTWV0YUxlbW1hQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICBtZXRhdGhlb3JlbSA9IHRoaXMuZmluZE1ldGF0aGVvcmVtQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICB0b3BMZXZlbE1ldGFBc3NlcnRpb24gPSAobWV0YUxlbW1hIHx8IG1ldGF0aGVvcmVtKTsgIC8vL1xuXG4gICAgcmV0dXJuIHRvcExldmVsTWV0YUFzc2VydGlvbjtcbiAgfVxuXG4gIGZpbmRUb3BMZXZlbE1ldGFBc3NlcnRpb25zQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YUxlbW1hcyA9IHRoaXMuZmluZE1ldGFMZW1tYXNCeVJlZmVyZW5jZShyZWZlcmVuY2UpLFxuICAgICAgICAgIG1ldGF0aGVvcmVtcyA9IHRoaXMuZmluZE1ldGF0aGVvcmVtc0J5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9ucyA9IFtcbiAgICAgICAgICAgIC4uLm1ldGFMZW1tYXMsXG4gICAgICAgICAgICAuLi5tZXRhdGhlb3JlbXNcbiAgICAgICAgICBdO1xuXG4gICAgcmV0dXJuIHRvcExldmVsTWV0YUFzc2VydGlvbnM7XG4gIH1cblxuICBmaW5kVG9wTGV2ZWxBc3NlcnRpb25CeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBheGlvbSA9IHRoaXMuZmluZEF4aW9tQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICBsZW1tYSA9IHRoaXMuZmluZExlbW1hQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICB0aGVvcmVtID0gdGhpcy5maW5kVGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgY29uamVjdHVyZSA9IHRoaXMuZmluZENvbmplY3R1cmVCeVJlZmVyZW5jZShyZWZlcmVuY2UpLFxuICAgICAgICAgIHRvcExldmVsQXNzZXJ0aW9uID0gKGF4aW9tIHx8IGxlbW1hIHx8IHRoZW9yZW0gfHwgY29uamVjdHVyZSk7XG5cbiAgICByZXR1cm4gdG9wTGV2ZWxBc3NlcnRpb247XG4gIH1cblxuICBmaW5kTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZXMgPSB0aGlzLmdldE1ldGF2YXJpYWJsZXMoKSxcbiAgICAgICAgICBzcGVjaWZpY01ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZTsgIC8vL1xuXG4gICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlcy5maW5kKChtZXRhdmFyaWFibGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGUgPSBtZXRhdmFyaWFibGUsIC8vL1xuICAgICAgICAgICAgbWV0YXZhcmlhYmxlVW5pZmllcyA9IGdlbmVyYWxNZXRhdmFyaWFibGUudW5pZnlNZXRhdmFyaWFibGUoc3BlY2lmaWNNZXRhdmFyaWFibGUsIGNvbnRleHQpO1xuXG4gICAgICBpZiAobWV0YXZhcmlhYmxlVW5pZmllcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGZpbmRUeXBlQnlUeXBlTmFtZSh0eXBlTmFtZSwgaW5jbHVkZVJlbGVhc2UgPSB0cnVlLCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGxldCB0eXBlcyA9IHRoaXMuZ2V0VHlwZXMoaW5jbHVkZVJlbGVhc2UsIGluY2x1ZGVEZXBlbmRlbmNpZXMpO1xuXG4gICAgY29uc3QgYmFzZVR5cGUgPSBiYXNlVHlwZUZyb21Ob3RoaW5nKCk7XG5cbiAgICB0eXBlcyA9IFtcbiAgICAgIC4uLnR5cGVzLFxuICAgICAgYmFzZVR5cGVcbiAgICBdO1xuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVzLmZpbmQoKHR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVDb21wYXJlc1RvVHlwZU5hbWUgPSB0eXBlLmNvbXBhcmVUeXBlTmFtZSh0eXBlTmFtZSk7XG5cbiAgICAgIGlmICh0eXBlQ29tcGFyZXNUb1R5cGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIGZpbmRUeXBlQnlOb21pbmFsVHlwZU5hbWUobm9taW5hbFR5cGVOYW1lKSB7XG4gICAgbGV0IHR5cGVzID0gdGhpcy5nZXRUeXBlcygpO1xuXG4gICAgY29uc3QgYmFzZVR5cGUgPSBiYXNlVHlwZUZyb21Ob3RoaW5nKCk7XG5cbiAgICB0eXBlcyA9IFtcbiAgICAgIC4uLnR5cGVzLFxuICAgICAgYmFzZVR5cGVcbiAgICBdO1xuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVzLmZpbmQoKHR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVDb21wYXJlc1RvTm9taW5hbFR5cGVOYW1lID0gdHlwZS5jb21wYXJlTm9taW5hbFR5cGVOYW1lKG5vbWluYWxUeXBlTmFtZSk7XG5cbiAgICAgIGlmICh0eXBlQ29tcGFyZXNUb05vbWluYWxUeXBlTmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBmaW5kVHlwZUJ5UHJlZml4ZWRUeXBlTmFtZShwcmVmaXhlZFR5cGVOYW1lKSB7XG4gICAgbGV0IHR5cGVzID0gdGhpcy5nZXRUeXBlcygpO1xuXG4gICAgY29uc3QgYmFzZVR5cGUgPSBiYXNlVHlwZUZyb21Ob3RoaW5nKCk7XG5cbiAgICB0eXBlcyA9IFtcbiAgICAgIC4uLnR5cGVzLFxuICAgICAgYmFzZVR5cGVcbiAgICBdO1xuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVzLmZpbmQoKHR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVDb21wYXJlc1RvUHJlZml4ZWRUeXBlTmFtZSA9IHR5cGUuY29tcGFyZVByZWZpeGVkVHlwZU5hbWUocHJlZml4ZWRUeXBlTmFtZSk7XG5cbiAgICAgIGlmICh0eXBlQ29tcGFyZXNUb1ByZWZpeGVkVHlwZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgZmluZE1ldGFUeXBlQnlNZXRhVHlwZU5hbWUobWV0YVR5cGVOYW1lKSB7XG4gICAgY29uc3QgbWV0YVR5cGVzID0gdGhpcy5nZXRNZXRhVHlwZXMoKSxcbiAgICAgICAgICBtZXRhVHlwZSA9IG1ldGFUeXBlcy5maW5kKChtZXRhVHlwZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWV0YVR5cGVDb21wYXJlc1RvTWV0YVR5cGVOYW1lID0gbWV0YVR5cGUuY29tcGFyZU1ldGFUeXBlTmFtZShtZXRhVHlwZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAobWV0YVR5cGVDb21wYXJlc1RvTWV0YVR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbWV0YVR5cGU7XG4gIH1cblxuICBmaW5kVHlwZVByZWZpeEJ5VHlwZVByZWZpeE5hbWUodHlwZVByZWZpeE5hbWUpIHtcbiAgICBjb25zdCB0eXBlUHJlZml4ZXMgPSB0aGlzLmdldFR5cGVQcmVmaXhlcygpLFxuICAgICAgICAgIHR5cGVQcmVmaXggPSB0eXBlUHJlZml4ZXMuZmluZCgodHlwZVByZWZpeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZVByZWZpeENvbXBhcmVzVG9UeXBlUHJlZml4TmFtZSA9IHR5cGVQcmVmaXguY29tcGFyZVR5cGVQcmVmaXhOYW1lKHR5cGVQcmVmaXhOYW1lKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVQcmVmaXhDb21wYXJlc1RvVHlwZVByZWZpeE5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB0eXBlUHJlZml4O1xuICB9XG5cbiAgZmluZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyKSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSxcbiAgICAgICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlcy5maW5kKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVDb21wYXJlc1RvVmFyaWFibGVJZGVudGlmaWVyID0gdmFyaWFibGUuY29tcGFyZVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgICBpZiAodmFyaWFibGVDb21wYXJlc1RvVmFyaWFibGVJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdmFyaWFibGU7XG4gIH1cblxuICBmaW5kTGFiZWxCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSkge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCksXG4gICAgICAgICAgbGFiZWwgPSBsYWJlbHMuZmluZCgobGFiZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUgPSBsYWJlbC5jb21wYXJlTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGxhYmVsQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIGZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCksXG4gICAgICAgICAgbGFiZWwgPSBsYWJlbHMuZmluZCgobGFiZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZUVxdWFsVG9MYWJlbE1ldGF2YXJpYWJsZSA9IGxhYmVsLmlzTWV0YXZhcmlhYmxlRXF1YWxUb01ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpO1xuXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlRXF1YWxUb0xhYmVsTWV0YXZhcmlhYmxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICBmaW5kSnVkZ2VtZW50QnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QganVkZ2VtZW50cyA9IHRoaXMuZ2V0SnVkZ2VtZW50cygpLFxuICAgICAgICAgIGp1ZGdlbWVudCA9IGp1ZGdlbWVudHMuZmluZCgoanVkZ2VtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBqdWRnZW1lbnRTaW5ndWxhciA9IGp1ZGdlbWVudC5pc1Npbmd1bGFyKCk7XG5cbiAgICAgICAgICAgIGlmIChqdWRnZW1lbnRTaW5ndWxhcikge1xuICAgICAgICAgICAgICBjb25zdCBqdWRnZW1lbnRNZXRhdmFyaWFibGUgPSBqdWRnZW1lbnQuZ2V0TWV0YXZhcmlhYmxlKCksXG4gICAgICAgICAgICAgICAgICAgIGp1ZGdlbWVudE1ldGF2YXJpYWJsZUVxdWFsVG9NZXRhdmFyaWFibGUgPSBqdWRnZW1lbnRNZXRhdmFyaWFibGUuaXNFcXVhbFRvKG1ldGF2YXJpYWJsZSk7XG5cbiAgICAgICAgICAgICAgaWYgKGp1ZGdlbWVudE1ldGF2YXJpYWJsZUVxdWFsVG9NZXRhdmFyaWFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4ganVkZ2VtZW50O1xuICB9XG5cbiAgZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlcyA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZXMuZmluZCgobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSA9IG1ldGF2YXJpYWJsZS5jb21wYXJlTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgICAgICAgICAgaWYgKG1ldGF2YXJpYWJsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50KG1ldGF2YXJpYWJsZSkge1xuICAgIG1ldGF2YXJpYWJsZSA9IHRoaXMuZmluZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlUHJlc2VudCA9IChtZXRhdmFyaWFibGUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZVByZXNlbnQ7XG4gIH1cblxuICBpc1R5cGVQcmVzZW50QnlUeXBlTmFtZSh0eXBlTmFtZSwgaW5jbHVkZVJlbGVhc2UgPSB0cnVlLCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRUeXBlQnlUeXBlTmFtZSh0eXBlTmFtZSwgaW5jbHVkZVJlbGVhc2UsIGluY2x1ZGVEZXBlbmRlbmNpZXMpLFxuICAgICAgICAgIHR5cGVQcmVzZW50ID0gKHR5cGUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHR5cGVQcmVzZW50O1xuICB9XG5cbiAgaXNUeXBlUHJlc2VudEJ5Tm9taW5hbFR5cGVOYW1lKG5vbWluYWxUeXBlTmFtZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRUeXBlQnlOb21pbmFsVHlwZU5hbWUobm9taW5hbFR5cGVOYW1lKSxcbiAgICAgICAgICB0eXBlUHJlc2VudCA9ICh0eXBlICE9PSBudWxsKTtcblxuICAgIHJldHVybiB0eXBlUHJlc2VudDtcbiAgfVxuXG4gIGlzVHlwZVByZXNlbnRCeVByZWZpeGVkVHlwZU5hbWUocHJlZml4ZWRUeXBlTmFtZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpbmRUeXBlQnlQcmVmaXhlZFR5cGVOYW1lKHByZWZpeGVkVHlwZU5hbWUpLFxuICAgICAgICAgIHR5cGVQcmVzZW50ID0gKHR5cGUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHR5cGVQcmVzZW50O1xuICB9XG5cbiAgaXNUeXBlUHJlZml4UHJlc2VudEJ5VHlwZVByZWZpeE5hbWUodHlwZVByZWZpeE5hbWUpIHtcbiAgICBjb25zdCB0eXBlUHJlZml4ID0gdGhpcy5maW5kVHlwZVByZWZpeEJ5VHlwZVByZWZpeE5hbWUodHlwZVByZWZpeE5hbWUpLFxuICAgICAgICAgIHR5cGVQcmVmaXhQcmVzZW50ID0gKHR5cGVQcmVmaXggIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHR5cGVQcmVmaXhQcmVzZW50O1xuICB9XG5cbiAgaXNWYXJpYWJsZVByZXNlbnRCeVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuZmluZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgICAgICB2YXJpYWJsZVByZXNlbnQgPSAodmFyaWFibGUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHZhcmlhYmxlUHJlc2VudDtcbiAgfVxuXG4gIGlzTGFiZWxQcmVzZW50QnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZmluZExhYmVsQnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpLFxuICAgICAgICAgIGxhYmVsUHJlc2VudCA9IChsYWJlbCAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbGFiZWxQcmVzZW50O1xuICB9XG5cbiAgaXNMYWJlbFByZXNlbnRCeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZmluZExhYmVsQnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSxcbiAgICAgICAgICBsYWJlbFByZXNlbnQgPSAobGFiZWwgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGxhYmVsUHJlc2VudDtcbiAgfVxuXG4gIGlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlID0gdGhpcy5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVByZXNlbnQgPSAobWV0YXZhcmlhYmxlICE9PSBudWxsKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVQcmVzZW50O1xuICB9XG5cbiAgaXNMYWJlbFByZXNlbnRCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpLFxuICAgICAgICAgIGxhYmVsUHJlc2VudCA9IGxhYmVscy5zb21lKChsYWJlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgICAgICAgbGFiZWxVbmlmaWVzID0gcmVmZXJlbmNlLnVuaWZ5TGFiZWwobGFiZWwsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAobGFiZWxVbmlmaWVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhYmVsUHJlc2VudDtcbiAgfVxuXG4gIGlzUHJvY2VkdXJlUHJlc2VudEJ5TmFtZShuYW1lKSB7XG4gICAgY29uc3QgcHJvY2VkdXJlID0gdGhpcy5maW5kUHJvY2VkdXJlQnlOYW1lKG5hbWUpLFxuICAgICAgICAgIHByb2NlZHVyZVByZXNlbnQgPSAocHJvY2VkdXJlICE9PSBudWxsKTtcblxuICAgIHJldHVybiBwcm9jZWR1cmVQcmVzZW50O1xuICB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50QnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlcyA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVByZXNlbnQgPSBtZXRhdmFyaWFibGVzLnNvbWUoKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgICAgICAgbWV0YXZhcmlhYmxlVW5pZmllcyA9IHJlZmVyZW5jZS51bmlmeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlVW5pZmllcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVQcmVzZW50O1xuICB9XG5cbiAgaXNUb3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50QnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uID0gdGhpcy5maW5kVG9wTGV2ZWxNZXRhQXNzZXJ0aW9uQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICB0b3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50ID0gKHRvcExldmVsTWV0YUFzc2VydGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uUHJlc2VudDtcbiAgfVxuXG4gIHZlcmlmeSgpIHtcbiAgICBsZXQgdmVyaWZpZXMgPSBmYWxzZTtcblxuICAgIHRoaXMucHJlcGFyZSgpO1xuXG4gICAgaWYgKHRoaXMubm9kZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy53YXJuaW5nKGBVbmFibGUgdG8gdmVyaWZ5IHRoZSAnJHt0aGlzLmZpbGVQYXRofScgZmlsZSBiZWNhdXNlIGl0IGNhbm5vdCBiZSBwYXJzZWQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVidWcoYFZlcmlmeWluZyB0aGUgJyR7dGhpcy5maWxlUGF0aH0nIGZpbGUuLi5gKTtcblxuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgZmlsZU5vZGUgPSB0aGlzLm5vZGU7IC8vL1xuXG4gICAgICB2ZXJpZmllcyA9IHZlcmlmeUZpbGUoZmlsZU5vZGUsIGNvbnRleHQpO1xuXG4gICAgICB2ZXJpZmllcyA/XG4gICAgICAgIHRoaXMuY29tcGxldGUoKSA6XG4gICAgICAgICAgdGhpcy5jbGVhcigpO1xuXG4gICAgICBpZiAodmVyaWZpZXMpIHtcbiAgICAgICAgdGhpcy5pbmZvKGAuLi52ZXJpZmllZCB0aGUgJyR7dGhpcy5maWxlUGF0aH0nIGZpbGUuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcmlmaWVzO1xuICB9XG5cbiAgcHJlcGFyZSgpIHtcbiAgICBpZiAodGhpcy50b2tlbnMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlID0gdGhpcy5maW5kRmlsZSh0aGlzLmZpbGVQYXRoKSxcbiAgICAgICAgICBsZXhlciA9IHRoaXMuZ2V0TGV4ZXIoKSxcbiAgICAgICAgICBwYXJzZXIgPSB0aGlzLmdldFBhcnNlcigpLFxuICAgICAgICAgIGNvbnRlbnQgPSBmaWxlLmdldENvbnRlbnQoKTtcblxuICAgIHRoaXMudG9rZW5zID0gbGV4ZXIudG9rZW5pc2UoY29udGVudCk7XG5cbiAgICB0aGlzLm5vZGUgPSBwYXJzZXIucGFyc2UodGhpcy50b2tlbnMpO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5saW5lSW5kZXggPSBudWxsO1xuXG4gICAgdGhpcy50eXBlcyA9IFtdO1xuICAgIHRoaXMucnVsZXMgPSBbXTtcbiAgICB0aGlzLmF4aW9tcyA9IFtdO1xuICAgIHRoaXMubGVtbWFzID0gW107XG4gICAgdGhpcy50aGVvcmVtcyA9IFtdO1xuICAgIHRoaXMudmFyaWFibGVzID0gW107XG4gICAgdGhpcy5tZXRhTGVtbWFzID0gW107XG4gICAgdGhpcy5jb25qZWN0dXJlcyA9IFtdO1xuICAgIHRoaXMuY29tYmluYXRvcnMgPSBbXTtcbiAgICB0aGlzLnR5cGVQcmVmaXhlcyA9IFtdO1xuICAgIHRoaXMuY29uc3RydWN0b3JzID0gW107XG4gICAgdGhpcy5tZXRhdGhlb3JlbXMgPSBbXTtcbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMgPSBbXTtcbiAgfVxuXG4gIGNvbXBsZXRlKCkge1xuICAgIHRoaXMubGluZUluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIGluaXRpYWxpc2UoanNvbikge1xuICAgIGNvbnN0IGZpbGVDb250ZXh0ID0gdGhpczsgLy8vXG5cbiAgICB0aGlzLnR5cGVzID0gW107XG5cbiAgICB0eXBlc0Zyb21KU09OKGpzb24sIHRoaXMudHlwZXMsIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMucnVsZXMgPSBydWxlc0Zyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMuYXhpb21zID0gYXhpb21zRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuXG4gICAgdGhpcy5sZW1tYXMgPSBsZW1tYXNGcm9tTm90aGluZygpO1xuXG4gICAgdGhpcy50aGVvcmVtcyA9IHRoZW9yZW1zRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuXG4gICAgdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG5cbiAgICB0aGlzLm1ldGFMZW1tYXMgPSBtZXRhTGVtbWFzRnJvbU5vdGhpbmcoKTtcblxuICAgIHRoaXMuY29uamVjdHVyZXMgPSBjb25qZWN0dXJlc0Zyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMuY29tYmluYXRvcnMgPSBjb21iaW5hdG9yc0Zyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMudHlwZVByZWZpeGVzID0gdHlwZVByZWZpeGVzRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuXG4gICAgdGhpcy5jb25zdHJ1Y3RvcnMgPSBjb25zdHJ1Y3RvcnNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG5cbiAgICB0aGlzLm1ldGF0aGVvcmVtcyA9IG1ldGF0aGVvcmVtc0Zyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMubWV0YXZhcmlhYmxlcyA9IG1ldGF2YXJpYWJsZXNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgdHlwZXNKU09OID0gdHlwZXNUb1R5cGVzSlNPTih0aGlzLnR5cGVzKSxcbiAgICAgICAgICBydWxlc0pTT04gPSBydWxlc1RvUnVsZXNKU09OKHRoaXMucnVsZXMpLFxuICAgICAgICAgIGF4aW9tc0pTT04gPSBheGlvbXNUb0F4aW9tc0pTT04odGhpcy5heGlvbXMpLFxuICAgICAgICAgIHRoZW9yZW1zSlNPTiA9IHRoZW9yZW1zVG9UaGVvcmVtc0pTT04odGhpcy50aGVvcmVtcyksXG4gICAgICAgICAgdmFyaWFibGVzSlNPTiA9IHZhcmlhYmxlc1RvVmFyaWFibGVzSlNPTih0aGlzLnZhcmlhYmxlcyksXG4gICAgICAgICAgY29uamVjdHVyZXNKU09OID0gY29uamVjdHVyZXNUb0NvbmplY3R1cmVzSlNPTih0aGlzLmNvbmplY3R1cmVzKSxcbiAgICAgICAgICBjb21iaW5hdG9yc0pTT04gPSBjb21iaW5hdG9yc1RvQ29tYmluYXRvcnNKU09OKHRoaXMuY29tYmluYXRvcnMpLFxuICAgICAgICAgIHR5cGVQcmVmaXhlc0pTT04gPSB0eXBlUHJlZml4ZXNUb1R5cGVQcmVmaXhlc0pTT04odGhpcy50eXBlUHJlZml4ZXMpLFxuICAgICAgICAgIGNvbnN0cnVjdG9yc0pTT04gPSBjb25zdHJ1Y3RvcnNUb0NvbnN0cnVjdG9yc0pTT04odGhpcy5jb25zdHJ1Y3RvcnMpLFxuICAgICAgICAgIG1ldGF0aGVvcmVtc0pTT04gPSBtZXRhdGhlb3JlbXNUb01ldGF0aGVvcmVtc0pTT04odGhpcy5tZXRhdGhlb3JlbXMpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZXNKU09OID0gbWV0YXZhcmlhYmxlc1RvTWV0YXZhcmlhYmxlc0pTT04odGhpcy5tZXRhdmFyaWFibGVzKSxcbiAgICAgICAgICBmaWxlUGF0aCA9IHRoaXMuZmlsZVBhdGgsXG4gICAgICAgICAgdHlwZXMgPSB0eXBlc0pTT04sICAvLy9cbiAgICAgICAgICBydWxlcyA9IHJ1bGVzSlNPTiwgIC8vL1xuICAgICAgICAgIGF4aW9tcyA9IGF4aW9tc0pTT04sICAvLy9cbiAgICAgICAgICB0aGVvcmVtcyA9IHRoZW9yZW1zSlNPTiwgIC8vL1xuICAgICAgICAgIHZhcmlhYmxlcyA9IHZhcmlhYmxlc0pTT04sICAvLy9cbiAgICAgICAgICBjb25qZWN0dXJlcyA9IGNvbmplY3R1cmVzSlNPTiwgIC8vL1xuICAgICAgICAgIGNvbWJpbmF0b3JzID0gY29tYmluYXRvcnNKU09OLCAgLy8vXG4gICAgICAgICAgdHlwZVByZWZpeGVzID0gdHlwZVByZWZpeGVzSlNPTiwgIC8vL1xuICAgICAgICAgIGNvbnN0cnVjdG9ycyA9IGNvbnN0cnVjdG9yc0pTT04sICAvLy9cbiAgICAgICAgICBtZXRhdGhlb3JlbXMgPSBtZXRhdGhlb3JlbXNKU09OLCAgLy8vXG4gICAgICAgICAgbWV0YXZhcmlhYmxlcyA9IG1ldGF2YXJpYWJsZXNKU09OLCAgLy8vXG4gICAgICAgICAganNvbiA9IHtcbiAgICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgICAgdHlwZXMsXG4gICAgICAgICAgICBydWxlcyxcbiAgICAgICAgICAgIGF4aW9tcyxcbiAgICAgICAgICAgIHRoZW9yZW1zLFxuICAgICAgICAgICAgdmFyaWFibGVzLFxuICAgICAgICAgICAgY29uamVjdHVyZXMsXG4gICAgICAgICAgICBjb21iaW5hdG9ycyxcbiAgICAgICAgICAgIHR5cGVQcmVmaXhlcyxcbiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyxcbiAgICAgICAgICAgIG1ldGF0aGVvcmVtcyxcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZXNcbiAgICAgICAgICB9O1xuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICBzdGF0aWMgZnJvbUZpbGUoZmlsZSwgY29udGV4dCkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5nZXRQYXRoKCksXG4gICAgICAgICAgdG9rZW5zID0gbnVsbCxcbiAgICAgICAgICBub2RlID0gbnVsbCxcbiAgICAgICAgICB0eXBlcyA9IFtdLFxuICAgICAgICAgIHJ1bGVzID0gW10sXG4gICAgICAgICAgYXhpb21zID0gW10sXG4gICAgICAgICAgbGVtbWFzID0gW10sXG4gICAgICAgICAgdGhlb3JlbXMgPSBbXSxcbiAgICAgICAgICB2YXJpYWJsZXMgPSBbXSxcbiAgICAgICAgICBtZXRhTGVtbWFzID0gW10sXG4gICAgICAgICAgY29uamVjdHVyZXMgPSBbXSxcbiAgICAgICAgICBjb21iaW5hdG9ycyA9IFtdLFxuICAgICAgICAgIHR5cGVQcmVmaXhlcyA9IFtdLFxuICAgICAgICAgIGNvbnN0cnVjdG9ycyA9IFtdLFxuICAgICAgICAgIG1ldGF0aGVvcmVtcyA9IFtdLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZXMgPSBbXSxcbiAgICAgICAgICBmaWxlQ29udGV4dCA9IG5ldyBOb21pbmFsRmlsZUNvbnRleHQoY29udGV4dCwgZmlsZVBhdGgsIHRva2Vucywgbm9kZSwgdHlwZXMsIHJ1bGVzLCBheGlvbXMsIGxlbW1hcywgdGhlb3JlbXMsIHZhcmlhYmxlcywgbWV0YUxlbW1hcywgY29uamVjdHVyZXMsIGNvbWJpbmF0b3JzLCB0eXBlUHJlZml4ZXMsIGNvbnN0cnVjdG9ycywgbWV0YXRoZW9yZW1zLCBtZXRhdmFyaWFibGVzKTtcblxuICAgIHJldHVybiBmaWxlQ29udGV4dDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmlsZVBhdGgoZmlsZVBhdGgsIGNvbnRleHQpIHtcbiAgICBjb25zdCB0b2tlbnMgPSBudWxsLFxuICAgICAgICAgIG5vZGUgPSBudWxsLFxuICAgICAgICAgIHR5cGVzID0gbnVsbCxcbiAgICAgICAgICBydWxlcyA9IG51bGwsXG4gICAgICAgICAgYXhpb21zID0gbnVsbCxcbiAgICAgICAgICBsZW1tYXMgPSBudWxsLFxuICAgICAgICAgIHRoZW9yZW1zID0gbnVsbCxcbiAgICAgICAgICB2YXJpYWJsZXMgPSBudWxsLFxuICAgICAgICAgIG1ldGFMZW1tYXMgPSBudWxsLFxuICAgICAgICAgIGNvbmplY3R1cmVzID0gbnVsbCxcbiAgICAgICAgICBjb21iaW5hdG9ycyA9IG51bGwsXG4gICAgICAgICAgdHlwZVByZWZpeGVzID0gbnVsbCxcbiAgICAgICAgICBjb25zdHJ1Y3RvcnMgPSBudWxsLFxuICAgICAgICAgIG1ldGF0aGVvcmVtcyA9IG51bGwsXG4gICAgICAgICAgbWV0YXZhcmlhYmxlcyA9IG51bGwsXG4gICAgICAgICAgZmlsZUNvbnRleHQgPSBuZXcgTm9taW5hbEZpbGVDb250ZXh0KGNvbnRleHQsIGZpbGVQYXRoLCB0b2tlbnMsIG5vZGUsIHR5cGVzLCBydWxlcywgYXhpb21zLCBsZW1tYXMsIHRoZW9yZW1zLCB2YXJpYWJsZXMsIG1ldGFMZW1tYXMsIGNvbmplY3R1cmVzLCBjb21iaW5hdG9ycywgdHlwZVByZWZpeGVzLCBjb25zdHJ1Y3RvcnMsIG1ldGF0aGVvcmVtcywgbWV0YXZhcmlhYmxlcyk7XG5cbiAgICByZXR1cm4gZmlsZUNvbnRleHQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJOb21pbmFsRmlsZUNvbnRleHQiLCJwdXNoIiwiYXJyYXlVdGlsaXRpZXMiLCJmaWx0ZXIiLCJjb250ZXh0IiwiZmlsZVBhdGgiLCJ0b2tlbnMiLCJub2RlIiwidHlwZXMiLCJydWxlcyIsImF4aW9tcyIsImxlbW1hcyIsInRoZW9yZW1zIiwidmFyaWFibGVzIiwibWV0YUxlbW1hcyIsImNvbmplY3R1cmVzIiwiY29tYmluYXRvcnMiLCJ0eXBlUHJlZml4ZXMiLCJjb25zdHJ1Y3RvcnMiLCJtZXRhdGhlb3JlbXMiLCJtZXRhdmFyaWFibGVzIiwiY2hhaW5Db250ZXh0IiwiZ2V0Q29udGV4dCIsImdldEZpbGVQYXRoIiwiZ2V0TGluZUluZGV4IiwibGluZUluZGV4IiwiZ2V0VG9rZW5zIiwiZ2V0Tm9kZSIsImdldEp1ZGdlbWVudHMiLCJqdWRnZW1lbnRzIiwiZ2V0RXF1aXZhbGVuY2VzIiwiZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyIsInN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMiLCJnZXRMYWJlbHMiLCJpbmNsdWRlUmVsZWFzZSIsImxhYmVscyIsInJlbGVhc2VDb250ZXh0TGFiZWxzIiwiZm9yRWFjaCIsInJ1bGUiLCJydWxlTGFiZWxzIiwiYXhpb20iLCJheGlvbUxhYmVscyIsImxlbW1hIiwibGVtbWFMYWJlbHMiLCJ0aGVvcmVtIiwidGhlb3JlbUxhYmVscyIsImNvbmplY3R1cmUiLCJjb25qZWN0dXJlTGFiZWxzIiwibWV0YXRoZW9yZW0iLCJtZXRhdGhlb3JlbUxhYmVsIiwiZ2V0TGFiZWwiLCJnZXRUeXBlcyIsImluY2x1ZGVEZXBlbmRlbmNpZXMiLCJnZXRSdWxlcyIsImdldEF4aW9tcyIsImdldExlbW1hcyIsImdldFRoZW9yZW1zIiwiZ2V0VmFyaWFibGVzIiwiZ2V0UHJvY2VkdXJlcyIsInByb2NlZHVyZXMiLCJnZXRNZXRhTGVtbWFzIiwiZ2V0Q29uamVjdHVyZXMiLCJnZXRDb21iaW5hdG9ycyIsImdldFR5cGVQcmVmaXhlcyIsImdldENvbnN0cnVjdG9ycyIsImdldE1ldGF0aGVvcmVtcyIsImdldE1ldGF2YXJpYWJsZXMiLCJhZGRUeXBlIiwidHlwZSIsImFkZFJ1bGUiLCJhZGRBeGlvbSIsImFkZExlbW1hIiwiYWRkVGhlb3JlbSIsImFkZFZhcmlhYmxlIiwidmFyaWFibGUiLCJhZGRNZXRhTGVtbWEiLCJtZXRhTGVtbWEiLCJhZGRDb25qZWN0dXJlIiwiYWRkQ29tYmluYXRvciIsImNvbWJpbmF0b3IiLCJhZGRUeXBlUHJlZml4IiwidHlwZVByZWZpeCIsImFkZENvbnN0cnVjdG9yIiwiY29uc3RydWN0b3IiLCJhZGRNZXRhdGhlb3JlbSIsImFkZE1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZSIsImZpbmRMYWJlbEJ5UmVmZXJlbmNlIiwicmVmZXJlbmNlIiwibGFiZWwiLCJmaW5kIiwibWV0YXZhcmlhYmxlVW5pZmllcyIsInVuaWZ5UmVmZXJlbmNlIiwiZmluZE1ldGFMZW1tYUJ5UmVmZXJlbmNlIiwibWV0YUxlbW1hQ29tcGFyZXNUb1JlZmVyZW5jZSIsImNvbXBhcmVSZWZlcmVuY2UiLCJmaW5kTWV0YXRoZW9yZW1CeVJlZmVyZW5jZSIsIm1ldGF0aGVvcmVtQ29tcGFyZXNUb1JlZmVyZW5jZSIsImZpbmRSdWxlQnlSZWZlcmVuY2UiLCJtZXRhdmFyaWFibGVOYW1lIiwiZ2V0TWV0YXZhcmlhYmxlTmFtZSIsInJ1bGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImNvbXBhcmVNZXRhdmFyaWFibGVOYW1lIiwiZmluZEF4aW9tQnlSZWZlcmVuY2UiLCJheGlvbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiZmluZExlbW1hQnlSZWZlcmVuY2UiLCJsZW1tYUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiZmluZFRoZW9yZW1CeVJlZmVyZW5jZSIsInRoZW9yZW1Db21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImZpbmRQcm9jZWR1cmVCeU5hbWUiLCJuYW1lIiwicHJvY2VkdXJlIiwibmFtZU1hdGNoZXMiLCJtYXRjaE5hbWUiLCJmaW5kQ29uamVjdHVyZUJ5UmVmZXJlbmNlIiwiY29uamVjdHVyZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiZmluZE1ldGFMZW1tYXNCeVJlZmVyZW5jZSIsInRvcExldmVsTWV0YUFzc2VydGlvbiIsInRvcExldmVsTWV0YUFzc2VydGlvblVuaWZpZXMiLCJ1bmlmeVRvcExldmVsTWV0YUFzc2VydGlvbiIsImZpbmRNZXRhdGhlb3JlbXNCeVJlZmVyZW5jZSIsImZpbmRUb3BMZXZlbE1ldGFBc3NlcnRpb25CeVJlZmVyZW5jZSIsImZpbmRUb3BMZXZlbE1ldGFBc3NlcnRpb25zQnlSZWZlcmVuY2UiLCJ0b3BMZXZlbE1ldGFBc3NlcnRpb25zIiwiZmluZFRvcExldmVsQXNzZXJ0aW9uQnlSZWZlcmVuY2UiLCJ0b3BMZXZlbEFzc2VydGlvbiIsImZpbmRNZXRhdmFyaWFibGUiLCJzcGVjaWZpY01ldGF2YXJpYWJsZSIsImdlbmVyYWxNZXRhdmFyaWFibGUiLCJ1bmlmeU1ldGF2YXJpYWJsZSIsImZpbmRUeXBlQnlUeXBlTmFtZSIsInR5cGVOYW1lIiwiYmFzZVR5cGUiLCJiYXNlVHlwZUZyb21Ob3RoaW5nIiwidHlwZUNvbXBhcmVzVG9UeXBlTmFtZSIsImNvbXBhcmVUeXBlTmFtZSIsImZpbmRUeXBlQnlOb21pbmFsVHlwZU5hbWUiLCJub21pbmFsVHlwZU5hbWUiLCJ0eXBlQ29tcGFyZXNUb05vbWluYWxUeXBlTmFtZSIsImNvbXBhcmVOb21pbmFsVHlwZU5hbWUiLCJmaW5kVHlwZUJ5UHJlZml4ZWRUeXBlTmFtZSIsInByZWZpeGVkVHlwZU5hbWUiLCJ0eXBlQ29tcGFyZXNUb1ByZWZpeGVkVHlwZU5hbWUiLCJjb21wYXJlUHJlZml4ZWRUeXBlTmFtZSIsImZpbmRNZXRhVHlwZUJ5TWV0YVR5cGVOYW1lIiwibWV0YVR5cGVOYW1lIiwibWV0YVR5cGVzIiwiZ2V0TWV0YVR5cGVzIiwibWV0YVR5cGUiLCJtZXRhVHlwZUNvbXBhcmVzVG9NZXRhVHlwZU5hbWUiLCJjb21wYXJlTWV0YVR5cGVOYW1lIiwiZmluZFR5cGVQcmVmaXhCeVR5cGVQcmVmaXhOYW1lIiwidHlwZVByZWZpeE5hbWUiLCJ0eXBlUHJlZml4Q29tcGFyZXNUb1R5cGVQcmVmaXhOYW1lIiwiY29tcGFyZVR5cGVQcmVmaXhOYW1lIiwiZmluZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIiLCJ2YXJpYWJsZUlkZW50aWZpZXIiLCJ2YXJpYWJsZUNvbXBhcmVzVG9WYXJpYWJsZUlkZW50aWZpZXIiLCJjb21wYXJlVmFyaWFibGVJZGVudGlmaWVyIiwiZmluZExhYmVsQnlNZXRhdmFyaWFibGVOYW1lIiwibGFiZWxDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlRXF1YWxUb0xhYmVsTWV0YXZhcmlhYmxlIiwiaXNNZXRhdmFyaWFibGVFcXVhbFRvTWV0YXZhcmlhYmxlIiwiZmluZEp1ZGdlbWVudEJ5TWV0YXZhcmlhYmxlIiwianVkZ2VtZW50IiwianVkZ2VtZW50U2luZ3VsYXIiLCJpc1Npbmd1bGFyIiwianVkZ2VtZW50TWV0YXZhcmlhYmxlIiwiZ2V0TWV0YXZhcmlhYmxlIiwianVkZ2VtZW50TWV0YXZhcmlhYmxlRXF1YWxUb01ldGF2YXJpYWJsZSIsImlzRXF1YWxUbyIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUiLCJtZXRhdmFyaWFibGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImlzTWV0YXZhcmlhYmxlUHJlc2VudCIsIm1ldGF2YXJpYWJsZVByZXNlbnQiLCJpc1R5cGVQcmVzZW50QnlUeXBlTmFtZSIsInR5cGVQcmVzZW50IiwiaXNUeXBlUHJlc2VudEJ5Tm9taW5hbFR5cGVOYW1lIiwiaXNUeXBlUHJlc2VudEJ5UHJlZml4ZWRUeXBlTmFtZSIsImlzVHlwZVByZWZpeFByZXNlbnRCeVR5cGVQcmVmaXhOYW1lIiwidHlwZVByZWZpeFByZXNlbnQiLCJpc1ZhcmlhYmxlUHJlc2VudEJ5VmFyaWFibGVJZGVudGlmaWVyIiwidmFyaWFibGVQcmVzZW50IiwiaXNMYWJlbFByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUiLCJsYWJlbFByZXNlbnQiLCJpc0xhYmVsUHJlc2VudEJ5TWV0YXZhcmlhYmxlIiwiaXNNZXRhdmFyaWFibGVQcmVzZW50QnlNZXRhdmFyaWFibGVOYW1lIiwiaXNMYWJlbFByZXNlbnRCeVJlZmVyZW5jZSIsInNvbWUiLCJsYWJlbFVuaWZpZXMiLCJ1bmlmeUxhYmVsIiwiaXNQcm9jZWR1cmVQcmVzZW50QnlOYW1lIiwicHJvY2VkdXJlUHJlc2VudCIsImlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5UmVmZXJlbmNlIiwiaXNUb3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50QnlSZWZlcmVuY2UiLCJ0b3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50IiwidmVyaWZ5IiwidmVyaWZpZXMiLCJwcmVwYXJlIiwid2FybmluZyIsImRlYnVnIiwiZmlsZU5vZGUiLCJ2ZXJpZnlGaWxlIiwiY29tcGxldGUiLCJjbGVhciIsImluZm8iLCJmaWxlIiwiZmluZEZpbGUiLCJsZXhlciIsImdldExleGVyIiwicGFyc2VyIiwiZ2V0UGFyc2VyIiwiY29udGVudCIsImdldENvbnRlbnQiLCJ0b2tlbmlzZSIsInBhcnNlIiwiaW5pdGlhbGlzZSIsImpzb24iLCJmaWxlQ29udGV4dCIsInR5cGVzRnJvbUpTT04iLCJydWxlc0Zyb21KU09OIiwiYXhpb21zRnJvbUpTT04iLCJsZW1tYXNGcm9tTm90aGluZyIsInRoZW9yZW1zRnJvbUpTT04iLCJ2YXJpYWJsZXNGcm9tSlNPTiIsIm1ldGFMZW1tYXNGcm9tTm90aGluZyIsImNvbmplY3R1cmVzRnJvbUpTT04iLCJjb21iaW5hdG9yc0Zyb21KU09OIiwidHlwZVByZWZpeGVzRnJvbUpTT04iLCJjb25zdHJ1Y3RvcnNGcm9tSlNPTiIsIm1ldGF0aGVvcmVtc0Zyb21KU09OIiwibWV0YXZhcmlhYmxlc0Zyb21KU09OIiwidG9KU09OIiwidHlwZXNKU09OIiwidHlwZXNUb1R5cGVzSlNPTiIsInJ1bGVzSlNPTiIsInJ1bGVzVG9SdWxlc0pTT04iLCJheGlvbXNKU09OIiwiYXhpb21zVG9BeGlvbXNKU09OIiwidGhlb3JlbXNKU09OIiwidGhlb3JlbXNUb1RoZW9yZW1zSlNPTiIsInZhcmlhYmxlc0pTT04iLCJ2YXJpYWJsZXNUb1ZhcmlhYmxlc0pTT04iLCJjb25qZWN0dXJlc0pTT04iLCJjb25qZWN0dXJlc1RvQ29uamVjdHVyZXNKU09OIiwiY29tYmluYXRvcnNKU09OIiwiY29tYmluYXRvcnNUb0NvbWJpbmF0b3JzSlNPTiIsInR5cGVQcmVmaXhlc0pTT04iLCJ0eXBlUHJlZml4ZXNUb1R5cGVQcmVmaXhlc0pTT04iLCJjb25zdHJ1Y3RvcnNKU09OIiwiY29uc3RydWN0b3JzVG9Db25zdHJ1Y3RvcnNKU09OIiwibWV0YXRoZW9yZW1zSlNPTiIsIm1ldGF0aGVvcmVtc1RvTWV0YXRoZW9yZW1zSlNPTiIsIm1ldGF2YXJpYWJsZXNKU09OIiwibWV0YXZhcmlhYmxlc1RvTWV0YXZhcmlhYmxlc0pTT04iLCJmcm9tRmlsZSIsImdldFBhdGgiLCJmcm9tRmlsZVBhdGgiLCJGaWxlQ29udGV4dCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7ZUFvQ3FCQTs7O3lCQWxDVTsyREFFUDtzQkFFRzt1QkFDRTtxQkFDTztvQkF3QmE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWpELElBQVFDLE9BQWlCQyx5QkFBYyxDQUEvQkQsTUFBTUUsU0FBV0QseUJBQWMsQ0FBekJDO0FBRUMsSUFBQSxBQUFNSCxtQ0FBTjtjQUFNQTthQUFBQSxtQkFDUEksT0FBTyxFQUFFQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLEtBQUssRUFBRUMsTUFBTSxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsRUFBRUMsU0FBUyxFQUFFQyxVQUFVLEVBQUVDLFdBQVcsRUFBRUMsV0FBVyxFQUFFQyxZQUFZLEVBQUVDLFlBQVksRUFBRUMsWUFBWSxFQUFFQyxhQUFhO2dDQUQxS3BCOztnQkFFakIsa0JBRmlCQTtZQUVYSTtZQUFTQztZQUFVRTtZQUFNRDs7UUFDL0IsTUFBS0YsT0FBTyxHQUFHQTtRQUNmLE1BQUtDLFFBQVEsR0FBR0E7UUFDaEIsTUFBS0MsTUFBTSxHQUFHQTtRQUNkLE1BQUtDLElBQUksR0FBR0E7UUFDWixNQUFLQyxLQUFLLEdBQUdBO1FBQ2IsTUFBS0MsS0FBSyxHQUFHQTtRQUNiLE1BQUtDLE1BQU0sR0FBR0E7UUFDZCxNQUFLQyxNQUFNLEdBQUdBO1FBQ2QsTUFBS0MsUUFBUSxHQUFHQTtRQUNoQixNQUFLQyxTQUFTLEdBQUdBO1FBQ2pCLE1BQUtD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