occam-verify-cli 1.0.448 → 1.0.472

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 (222) hide show
  1. package/lib/constants.js +13 -5
  2. package/lib/context/ephemeral.js +270 -0
  3. package/lib/context/file.js +136 -128
  4. package/lib/context/liminal.js +120 -0
  5. package/lib/context/literal.js +92 -0
  6. package/lib/context/nominal.js +15 -1
  7. package/lib/context/release.js +68 -9
  8. package/lib/context/scoped.js +322 -0
  9. package/lib/context/synthetic.js +133 -0
  10. package/lib/element/assertion/contained.js +66 -66
  11. package/lib/element/assertion/defined.js +32 -32
  12. package/lib/element/assertion/property.js +39 -39
  13. package/lib/element/assertion/satisfies.js +22 -22
  14. package/lib/element/assumption.js +71 -87
  15. package/lib/element/combinator/bracketed.js +1 -10
  16. package/lib/element/conclusion.js +19 -15
  17. package/lib/element/constructor/bracketed.js +1 -10
  18. package/lib/element/constructor.js +2 -2
  19. package/lib/element/declaration/combinator.js +1 -2
  20. package/lib/element/declaration/metavariable.js +3 -3
  21. package/lib/element/declaration/variable.js +3 -3
  22. package/lib/element/deduction.js +26 -20
  23. package/lib/element/derivation.js +3 -3
  24. package/lib/element/equality.js +5 -5
  25. package/lib/element/equivalence.js +112 -107
  26. package/lib/element/equivalences.js +24 -10
  27. package/lib/element/error.js +3 -3
  28. package/lib/element/frame.js +73 -62
  29. package/lib/element/hypothesis.js +2 -2
  30. package/lib/element/judgement.js +40 -60
  31. package/lib/element/metaType.js +4 -4
  32. package/lib/element/metavariable.js +49 -38
  33. package/lib/element/parameter.js +13 -5
  34. package/lib/element/procedureCall.js +16 -16
  35. package/lib/element/proof.js +14 -13
  36. package/lib/element/proofAssertion/premise.js +319 -0
  37. package/lib/element/proofAssertion/step.js +309 -0
  38. package/lib/element/proofAssertion/supposition.js +333 -0
  39. package/lib/element/proofAssertion.js +20 -10
  40. package/lib/element/propertyRelation.js +2 -2
  41. package/lib/element/reference.js +72 -30
  42. package/lib/element/rule.js +26 -28
  43. package/lib/element/section.js +5 -5
  44. package/lib/element/signature.js +9 -6
  45. package/lib/element/statement.js +44 -36
  46. package/lib/element/subproof.js +18 -17
  47. package/lib/element/substitution/frame.js +86 -49
  48. package/lib/element/substitution/reference.js +101 -19
  49. package/lib/element/substitution/statement.js +128 -105
  50. package/lib/element/substitution/term.js +93 -57
  51. package/lib/element/substitution.js +20 -69
  52. package/lib/element/substitutions.js +49 -34
  53. package/lib/element/term.js +41 -30
  54. package/lib/element/topLevelAssertion/axiom.js +331 -0
  55. package/lib/element/{conjecture.js → topLevelAssertion/conjecture.js} +10 -10
  56. package/lib/element/{lemma.js → topLevelAssertion/lemma.js} +9 -9
  57. package/lib/element/{theorem.js → topLevelAssertion/theorem.js} +8 -8
  58. package/lib/element/topLevelAssertion.js +434 -0
  59. package/lib/element/{metaLemma.js → topLevelMetaAssertion/metaLemma.js} +8 -8
  60. package/lib/element/{metatheorem.js → topLevelMetaAssertion/metatheorem.js} +8 -8
  61. package/lib/element/topLevelMetaAssertion.js +293 -0
  62. package/lib/element/type.js +4 -4
  63. package/lib/element/variable.js +48 -40
  64. package/lib/index.js +3 -3
  65. package/lib/main.js +3 -3
  66. package/lib/metaTypes.js +18 -15
  67. package/lib/node/frame.js +2 -2
  68. package/lib/node/metavariable.js +4 -4
  69. package/lib/node/parameter.js +28 -7
  70. package/lib/node/proofAssertion/premise.js +116 -0
  71. package/lib/node/proofAssertion/step.js +152 -0
  72. package/lib/node/proofAssertion/supposition.js +116 -0
  73. package/lib/node/{premise.js → proofAssertion.js} +11 -18
  74. package/lib/node/statement.js +2 -2
  75. package/lib/node/substitution/frame.js +9 -31
  76. package/lib/node/substitution/reference.js +137 -0
  77. package/lib/node/substitution/statement.js +9 -31
  78. package/lib/node/substitution/term.js +9 -23
  79. package/lib/node/{axiom.js → topLevelAssertion/axiom.js} +7 -7
  80. package/lib/node/{conjecture.js → topLevelAssertion/conjecture.js} +7 -7
  81. package/lib/node/{lemma.js → topLevelAssertion/lemma.js} +7 -7
  82. package/lib/node/{theorem.js → topLevelAssertion/theorem.js} +7 -7
  83. package/lib/node/{axiomLemmaTheoremConjecture.js → topLevelAssertion.js} +9 -9
  84. package/lib/node/{metaLemma.js → topLevelMetaAssertion/metaLemma.js} +7 -7
  85. package/lib/node/{metatheorem.js → topLevelMetaAssertion/metatheorem.js} +7 -7
  86. package/lib/node/{metaLemmaMetaTheorem.js → topLevelMetaAssertion.js} +9 -9
  87. package/lib/nonTerminalNodeMap.js +15 -14
  88. package/lib/preamble.js +10 -10
  89. package/lib/process/instantiate.js +6 -21
  90. package/lib/process/unify.js +11 -10
  91. package/lib/tokenTypes.js +22 -0
  92. package/lib/types.js +3 -3
  93. package/lib/utilities/bnf.js +5 -5
  94. package/lib/utilities/context.js +63 -0
  95. package/lib/utilities/element.js +235 -408
  96. package/lib/utilities/instance.js +12 -34
  97. package/lib/utilities/json.js +3 -2
  98. package/lib/utilities/string.js +56 -21
  99. package/lib/utilities/unification.js +38 -32
  100. package/lib/utilities/validation.js +47 -50
  101. package/package.json +2 -2
  102. package/src/constants.js +12 -1
  103. package/src/context/ephemeral.js +257 -0
  104. package/src/context/file.js +108 -116
  105. package/src/context/liminal.js +67 -0
  106. package/src/context/literal.js +51 -0
  107. package/src/context/nominal.js +12 -0
  108. package/src/context/release.js +48 -8
  109. package/src/context/{local.js → scoped.js} +43 -125
  110. package/src/context/synthetic.js +60 -0
  111. package/src/element/assertion/contained.js +49 -47
  112. package/src/element/assertion/defined.js +29 -27
  113. package/src/element/assertion/property.js +35 -35
  114. package/src/element/assertion/satisfies.js +19 -18
  115. package/src/element/assumption.js +71 -93
  116. package/src/element/combinator/bracketed.js +0 -7
  117. package/src/element/conclusion.js +25 -24
  118. package/src/element/constructor/bracketed.js +0 -7
  119. package/src/element/constructor.js +1 -1
  120. package/src/element/declaration/combinator.js +0 -1
  121. package/src/element/declaration/metavariable.js +2 -2
  122. package/src/element/declaration/variable.js +5 -5
  123. package/src/element/deduction.js +33 -31
  124. package/src/element/derivation.js +2 -2
  125. package/src/element/equality.js +4 -4
  126. package/src/element/equivalence.js +115 -135
  127. package/src/element/equivalences.js +9 -7
  128. package/src/element/error.js +4 -2
  129. package/src/element/frame.js +80 -65
  130. package/src/element/hypothesis.js +1 -1
  131. package/src/element/judgement.js +42 -62
  132. package/src/element/metaType.js +3 -4
  133. package/src/element/metavariable.js +59 -56
  134. package/src/element/parameter.js +10 -5
  135. package/src/element/procedureCall.js +20 -18
  136. package/src/element/proof.js +14 -16
  137. package/src/element/{premise.js → proofAssertion/premise.js} +57 -53
  138. package/src/element/{step.js → proofAssertion/step.js} +59 -62
  139. package/src/element/{supposition.js → proofAssertion/supposition.js} +67 -56
  140. package/src/element/proofAssertion.js +24 -13
  141. package/src/element/propertyRelation.js +1 -1
  142. package/src/element/reference.js +87 -37
  143. package/src/element/rule.js +31 -37
  144. package/src/element/section.js +5 -5
  145. package/src/element/signature.js +8 -8
  146. package/src/element/statement.js +52 -48
  147. package/src/element/subproof.js +16 -18
  148. package/src/element/substitution/frame.js +104 -50
  149. package/src/element/substitution/reference.js +120 -20
  150. package/src/element/substitution/statement.js +169 -130
  151. package/src/element/substitution/term.js +104 -63
  152. package/src/element/substitution.js +16 -58
  153. package/src/element/substitutions.js +43 -41
  154. package/src/element/term.js +47 -41
  155. package/src/element/{axiom.js → topLevelAssertion/axiom.js} +22 -20
  156. package/src/element/{conjecture.js → topLevelAssertion/conjecture.js} +5 -6
  157. package/src/element/{lemma.js → topLevelAssertion/lemma.js} +5 -6
  158. package/src/element/{theorem.js → topLevelAssertion/theorem.js} +5 -5
  159. package/src/element/{axiomLemmaTheoremConjecture.js → topLevelAssertion.js} +37 -33
  160. package/src/element/{metaLemma.js → topLevelMetaAssertion/metaLemma.js} +5 -6
  161. package/src/element/{metatheorem.js → topLevelMetaAssertion/metatheorem.js} +5 -6
  162. package/src/element/{metaLemmaMetatheorem.js → topLevelMetaAssertion.js} +19 -17
  163. package/src/element/type.js +2 -4
  164. package/src/element/variable.js +47 -48
  165. package/src/index.js +2 -1
  166. package/src/main.js +2 -1
  167. package/src/metaTypes.js +25 -9
  168. package/src/node/frame.js +1 -1
  169. package/src/node/metavariable.js +3 -3
  170. package/src/node/parameter.js +32 -5
  171. package/src/node/proofAssertion/premise.js +16 -0
  172. package/src/node/{step.js → proofAssertion/step.js} +4 -18
  173. package/src/node/proofAssertion/supposition.js +16 -0
  174. package/src/node/proofAssertion.js +23 -0
  175. package/src/node/statement.js +1 -1
  176. package/src/node/substitution/frame.js +6 -32
  177. package/src/node/substitution/reference.js +38 -0
  178. package/src/node/substitution/statement.js +6 -32
  179. package/src/node/substitution/term.js +6 -22
  180. package/src/node/topLevelAssertion/axiom.js +13 -0
  181. package/src/node/topLevelAssertion/conjecture.js +13 -0
  182. package/src/node/topLevelAssertion/lemma.js +13 -0
  183. package/src/node/topLevelAssertion/theorem.js +13 -0
  184. package/src/node/{axiomLemmaTheoremConjecture.js → topLevelAssertion.js} +1 -1
  185. package/src/node/topLevelMetaAssertion/metaLemma.js +13 -0
  186. package/src/node/topLevelMetaAssertion/metatheorem.js +13 -0
  187. package/src/node/{metaLemmaMetaTheorem.js → topLevelMetaAssertion.js} +1 -1
  188. package/src/nonTerminalNodeMap.js +15 -12
  189. package/src/preamble.js +9 -9
  190. package/src/process/instantiate.js +27 -36
  191. package/src/process/unify.js +10 -9
  192. package/src/tokenTypes.js +4 -0
  193. package/src/types.js +4 -2
  194. package/src/utilities/bnf.js +3 -2
  195. package/src/utilities/context.js +46 -0
  196. package/src/utilities/element.js +302 -509
  197. package/src/utilities/instance.js +19 -42
  198. package/src/utilities/json.js +3 -1
  199. package/src/utilities/string.js +69 -28
  200. package/src/utilities/unification.js +41 -38
  201. package/src/utilities/validation.js +66 -75
  202. package/lib/context/local.js +0 -605
  203. package/lib/context/temporary.js +0 -752
  204. package/lib/element/axiom.js +0 -329
  205. package/lib/element/axiomLemmaTheoremConjecture.js +0 -427
  206. package/lib/element/metaLemmaMetatheorem.js +0 -289
  207. package/lib/element/premise.js +0 -307
  208. package/lib/element/step.js +0 -311
  209. package/lib/element/supposition.js +0 -320
  210. package/lib/log.js +0 -150
  211. package/lib/node/step.js +0 -166
  212. package/lib/node/supposition.js +0 -130
  213. package/src/context/temporary.js +0 -476
  214. package/src/log.js +0 -118
  215. package/src/node/axiom.js +0 -13
  216. package/src/node/conjecture.js +0 -13
  217. package/src/node/lemma.js +0 -13
  218. package/src/node/metaLemma.js +0 -13
  219. package/src/node/metatheorem.js +0 -13
  220. package/src/node/premise.js +0 -30
  221. package/src/node/supposition.js +0 -30
  222. package/src/node/theorem.js +0 -13
@@ -1,752 +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 TemporaryContext;
9
- }
10
- });
11
- var _necessary = require("necessary");
12
- function _array_like_to_array(arr, len) {
13
- if (len == null || len > arr.length) len = arr.length;
14
- for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
15
- return arr2;
16
- }
17
- function _array_without_holes(arr) {
18
- if (Array.isArray(arr)) return _array_like_to_array(arr);
19
- }
20
- function _class_call_check(instance, Constructor) {
21
- if (!(instance instanceof Constructor)) {
22
- throw new TypeError("Cannot call a class as a function");
23
- }
24
- }
25
- function _defineProperties(target, props) {
26
- for(var i = 0; i < props.length; i++){
27
- var descriptor = props[i];
28
- descriptor.enumerable = descriptor.enumerable || false;
29
- descriptor.configurable = true;
30
- if ("value" in descriptor) descriptor.writable = true;
31
- Object.defineProperty(target, descriptor.key, descriptor);
32
- }
33
- }
34
- function _create_class(Constructor, protoProps, staticProps) {
35
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
36
- if (staticProps) _defineProperties(Constructor, staticProps);
37
- return Constructor;
38
- }
39
- function _iterable_to_array(iter) {
40
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
41
- }
42
- function _non_iterable_spread() {
43
- throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
44
- }
45
- function _to_consumable_array(arr) {
46
- return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
47
- }
48
- function _unsupported_iterable_to_array(o, minLen) {
49
- if (!o) return;
50
- if (typeof o === "string") return _array_like_to_array(o, minLen);
51
- var n = Object.prototype.toString.call(o).slice(8, -1);
52
- if (n === "Object" && o.constructor) n = o.constructor.name;
53
- if (n === "Map" || n === "Set") return Array.from(n);
54
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
55
- }
56
- var extract = _necessary.arrayUtilities.extract, compress = _necessary.arrayUtilities.compress;
57
- var TemporaryContext = /*#__PURE__*/ function() {
58
- function TemporaryContext(context, terms, frames, statements, assertions, references, substitutions) {
59
- _class_call_check(this, TemporaryContext);
60
- this.context = context;
61
- this.terms = terms;
62
- this.frames = frames;
63
- this.statements = statements;
64
- this.assertions = assertions;
65
- this.references = references;
66
- this.substitutions = substitutions;
67
- }
68
- _create_class(TemporaryContext, [
69
- {
70
- key: "getContext",
71
- value: function getContext() {
72
- return this.context;
73
- }
74
- },
75
- {
76
- key: "getTerms",
77
- value: function getTerms() {
78
- return this.terms;
79
- }
80
- },
81
- {
82
- key: "getFrames",
83
- value: function getFrames() {
84
- return this.frames;
85
- }
86
- },
87
- {
88
- key: "getStatements",
89
- value: function getStatements() {
90
- return this.statements;
91
- }
92
- },
93
- {
94
- key: "getAssertions",
95
- value: function getAssertions() {
96
- return this.assertions;
97
- }
98
- },
99
- {
100
- key: "getReferences",
101
- value: function getReferences() {
102
- return this.references;
103
- }
104
- },
105
- {
106
- key: "getSubstitutions",
107
- value: function getSubstitutions() {
108
- return this.substitutions;
109
- }
110
- },
111
- {
112
- key: "addTerm",
113
- value: function addTerm(term) {
114
- var termA = term, context = this, termString = term.getString();
115
- extract(this.terms, function(term) {
116
- var termB = term, termAEqualToTermB = termA.isEqualTo(termB);
117
- if (termAEqualToTermB) {
118
- return true;
119
- }
120
- });
121
- context.trace("ADded the '".concat(termString, "' term to the context."));
122
- this.terms.push(term);
123
- }
124
- },
125
- {
126
- key: "addFrame",
127
- value: function addFrame(frame) {
128
- var frameA = frame, context = this, frameString = frame.getString();
129
- extract(this.frames, function(frame) {
130
- var frameB = frame, frameAEqualToFrameB = frameA.isEqualTo(frameB);
131
- if (frameAEqualToFrameB) {
132
- return true;
133
- }
134
- });
135
- context.trace("Added the '".concat(frameString, "' frame to the context."));
136
- this.frames.push(frame);
137
- }
138
- },
139
- {
140
- key: "addStatement",
141
- value: function addStatement(statement) {
142
- var context = this, statementA = statement, statementString = statement.getString();
143
- extract(this.statements, function(statement) {
144
- var statementB = statement, statementAEqualToFrameB = statementA.isEqualTo(statementB);
145
- if (statementAEqualToFrameB) {
146
- return true;
147
- }
148
- });
149
- context.trace("Added the '".concat(statementString, "' statement to the context."));
150
- this.statements.push(statement);
151
- }
152
- },
153
- {
154
- key: "addAssertion",
155
- value: function addAssertion(assertion) {
156
- var context = this, assertionA = assertion, assertionString = assertion.getString();
157
- extract(this.assertions, function(assertion) {
158
- var assertionB = assertion, assertionAEqualToAssertionB = assertionA.isEqualTo(assertionB);
159
- if (assertionAEqualToAssertionB) {
160
- return true;
161
- }
162
- });
163
- context.trace("Added the '".concat(assertionString, "' assertion to the context."));
164
- this.assertions.push(assertion);
165
- }
166
- },
167
- {
168
- key: "addReference",
169
- value: function addReference(reference) {
170
- var context = this, referenceA = reference, referenceString = reference.getString();
171
- extract(this.references, function(reference) {
172
- var referenceB = reference, referenceAEqualToReferenceB = referenceA.isEqualTo(referenceB);
173
- if (referenceAEqualToReferenceB) {
174
- return true;
175
- }
176
- });
177
- context.trace("Added the '".concat(referenceString, "' reference to the context."));
178
- this.references.push(reference);
179
- }
180
- },
181
- {
182
- key: "addSubstitution",
183
- value: function addSubstitution(substitution) {
184
- var context = this, substitutionA = substitution, substitutionString = substitution.getString();
185
- extract(this.substitutions, function(substitution) {
186
- var substitutionB = substitution, substituionAEqualToSubstitutionB = substitutionA.isEqualTo(substitutionB);
187
- if (substituionAEqualToSubstitutionB) {
188
- return true;
189
- }
190
- });
191
- context.trace("Added the '".concat(substitutionString, "' substitution to the context."));
192
- this.substitutions.push(substitution);
193
- }
194
- },
195
- {
196
- key: "findTermByTermNode",
197
- value: function findTermByTermNode(termNode) {
198
- var term = this.terms.find(function(term) {
199
- var termNodeMatches = term.matchNode(termNode);
200
- if (termNodeMatches) {
201
- return true;
202
- }
203
- }) || null;
204
- return term;
205
- }
206
- },
207
- {
208
- key: "findFrameByFrameNode",
209
- value: function findFrameByFrameNode(frameNode) {
210
- var frame = this.frames.find(function(frame) {
211
- var frameNodeMatches = frame.matchNode(frameNode);
212
- if (frameNodeMatches) {
213
- return true;
214
- }
215
- }) || null;
216
- return frame;
217
- }
218
- },
219
- {
220
- key: "findStatementByStatementNode",
221
- value: function findStatementByStatementNode(statementNode) {
222
- var statement = this.statements.find(function(statement) {
223
- var statementNodeMatches = statement.matchNode(statementNode);
224
- if (statementNodeMatches) {
225
- return true;
226
- }
227
- }) || null;
228
- return statement;
229
- }
230
- },
231
- {
232
- key: "findAssertionByAssertionNode",
233
- value: function findAssertionByAssertionNode(assertionNode) {
234
- var assertion = this.assertions.find(function(assertion) {
235
- var assertionNodeMatches = assertion.matchNode(assertionNode);
236
- if (assertionNodeMatches) {
237
- return true;
238
- }
239
- }) || null;
240
- return assertion;
241
- }
242
- },
243
- {
244
- key: "findReferenceByMetavariableNode",
245
- value: function findReferenceByMetavariableNode(metavariableNode) {
246
- var reference = this.references.find(function(reference) {
247
- var referenceMatcheMetavariableNode = reference.matchMetavariableNode(metavariableNode);
248
- if (referenceMatcheMetavariableNode) {
249
- return true;
250
- }
251
- }) || null;
252
- return reference;
253
- }
254
- },
255
- {
256
- key: "findSubstitutionBySubstitutionNode",
257
- value: function findSubstitutionBySubstitutionNode(substitutionNode) {
258
- var substitution = this.substitutions.find(function(substitution) {
259
- var substitutionNodeMatches = substitution.matchNode(substitutionNode);
260
- if (substitutionNodeMatches) {
261
- return true;
262
- }
263
- }) || null;
264
- return substitution;
265
- }
266
- },
267
- {
268
- key: "getVariables",
269
- value: function getVariables() {
270
- var nested = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
271
- return this.context.getVariables(nested);
272
- }
273
- },
274
- {
275
- key: "getJudgements",
276
- value: function getJudgements() {
277
- return this.context.getJudgements();
278
- }
279
- },
280
- {
281
- key: "getEquivalences",
282
- value: function getEquivalences() {
283
- return this.context.getEquivalences();
284
- }
285
- },
286
- {
287
- key: "getProofAssertions",
288
- value: function getProofAssertions() {
289
- return this.context.getProofAssertions();
290
- }
291
- },
292
- {
293
- key: "getLastProofAssertion",
294
- value: function getLastProofAssertion() {
295
- return this.context.getLastProofAssertion();
296
- }
297
- },
298
- {
299
- key: "getSubproofOrProofAssertions",
300
- value: function getSubproofOrProofAssertions() {
301
- return this.context.getSubproofOrProofAssertions();
302
- }
303
- },
304
- {
305
- key: "getFilePath",
306
- value: function getFilePath() {
307
- return this.context.getFilePath();
308
- }
309
- },
310
- {
311
- key: "getLexer",
312
- value: function getLexer() {
313
- return this.context.getLexer();
314
- }
315
- },
316
- {
317
- key: "getParser",
318
- value: function getParser() {
319
- return this.context.getParser();
320
- }
321
- },
322
- {
323
- key: "getAxioms",
324
- value: function getAxioms() {
325
- return this.context.getAxioms();
326
- }
327
- },
328
- {
329
- key: "getLemmas",
330
- value: function getLemmas() {
331
- return this.context.getLemmas();
332
- }
333
- },
334
- {
335
- key: "getTheorems",
336
- value: function getTheorems() {
337
- return this.context.getTheorems();
338
- }
339
- },
340
- {
341
- key: "getConjectures",
342
- value: function getConjectures() {
343
- return this.context.getConjectures();
344
- }
345
- },
346
- {
347
- key: "getCombinators",
348
- value: function getCombinators() {
349
- return this.context.getCombinators();
350
- }
351
- },
352
- {
353
- key: "getConstructors",
354
- value: function getConstructors() {
355
- return this.context.getConstructors();
356
- }
357
- },
358
- {
359
- key: "getTypePrefix",
360
- value: function getTypePrefix() {
361
- return this.context.getTypePrefix();
362
- }
363
- },
364
- {
365
- key: "addAxiom",
366
- value: function addAxiom(axiom) {
367
- this.context.addAxiom(axiom);
368
- }
369
- },
370
- {
371
- key: "addLemma",
372
- value: function addLemma(lemma) {
373
- this.context.addLemma(lemma);
374
- }
375
- },
376
- {
377
- key: "addTheorem",
378
- value: function addTheorem(theorem) {
379
- this.context.addTheorem(theorem);
380
- }
381
- },
382
- {
383
- key: "addEquality",
384
- value: function addEquality(equality) {
385
- return this.context.addEquality(equality);
386
- }
387
- },
388
- {
389
- key: "addVariable",
390
- value: function addVariable(variable) {
391
- var nested = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
392
- return this.context.addVariable(variable, nested);
393
- }
394
- },
395
- {
396
- key: "addJudgement",
397
- value: function addJudgement(judgement) {
398
- return this.context.addJudgement(judgement);
399
- }
400
- },
401
- {
402
- key: "addSubproofOrProofAssertion",
403
- value: function addSubproofOrProofAssertion(subproofOrProofAssertion) {
404
- this.context.addSubproofOrProofAssertion(subproofOrProofAssertion);
405
- }
406
- },
407
- {
408
- key: "findProcedureByName",
409
- value: function findProcedureByName(name) {
410
- return this.context.findProcedureByName(name);
411
- }
412
- },
413
- {
414
- key: "findLabelByReference",
415
- value: function findLabelByReference(reference, context) {
416
- return this.context.findLabelByReference(reference, context);
417
- }
418
- },
419
- {
420
- key: "findRuleByReference",
421
- value: function findRuleByReference(reference) {
422
- return this.context.findRuleByReference(reference);
423
- }
424
- },
425
- {
426
- key: "findAxiomByReference",
427
- value: function findAxiomByReference(reference) {
428
- return this.context.findAxiomByReference(reference);
429
- }
430
- },
431
- {
432
- key: "findLemmaByReference",
433
- value: function findLemmaByReference(reference) {
434
- return this.context.findLemmaByReference(reference);
435
- }
436
- },
437
- {
438
- key: "findTheoremByReference",
439
- value: function findTheoremByReference(reference) {
440
- return this.context.findTheoremByReference(reference);
441
- }
442
- },
443
- {
444
- key: "findConjectureByReference",
445
- value: function findConjectureByReference(reference) {
446
- return this.context.findConjectureByReference(reference);
447
- }
448
- },
449
- {
450
- key: "findMetaLemmasByReference",
451
- value: function findMetaLemmasByReference(reference) {
452
- return this.context.findMetaLemmasByReference(reference);
453
- }
454
- },
455
- {
456
- key: "findMetatheoremsByReference",
457
- value: function findMetatheoremsByReference(reference) {
458
- return this.context.findMetatheoremsByReference(reference);
459
- }
460
- },
461
- {
462
- key: "findMetaLemmaMetatheoremByReference",
463
- value: function findMetaLemmaMetatheoremByReference(reference) {
464
- return this.context.findMetaLemmaMetatheoremByReference(reference);
465
- }
466
- },
467
- {
468
- key: "findMetaLemmaMetatheoremsByReference",
469
- value: function findMetaLemmaMetatheoremsByReference(reference) {
470
- return this.context.findMetaLemmaMetatheoremsByReference(reference);
471
- }
472
- },
473
- {
474
- key: "findVariableByVariableIdentifier",
475
- value: function findVariableByVariableIdentifier(variableIdentifier) {
476
- var nested = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
477
- return this.context.findVariableByVariableIdentifier(variableIdentifier, nested);
478
- }
479
- },
480
- {
481
- key: "findJudgementByMetavariable",
482
- value: function findJudgementByMetavariable(metavariable) {
483
- return this.context.findJudgementByMetavariable(metavariable);
484
- }
485
- },
486
- {
487
- key: "findEquivalenceByTerm",
488
- value: function findEquivalenceByTerm(term) {
489
- return this.context.findEquivalenceByTerm(term);
490
- }
491
- },
492
- {
493
- key: "findMetavariable",
494
- value: function findMetavariable(metavariable) {
495
- return this.context.findMetavariable(metavariable);
496
- }
497
- },
498
- {
499
- key: "findLabelByMetavariable",
500
- value: function findLabelByMetavariable(metavariable) {
501
- return this.context.findLabelByMetavariable(metavariable);
502
- }
503
- },
504
- {
505
- key: "findTypeByNominalTypeName",
506
- value: function findTypeByNominalTypeName(nominalTypeName) {
507
- return this.context.findTypeByNominalTypeName(nominalTypeName);
508
- }
509
- },
510
- {
511
- key: "findMetaTypeByMetaTypeName",
512
- value: function findMetaTypeByMetaTypeName(metaTypeName) {
513
- return this.context.findMetaTypeByMetaTypeName(metaTypeName);
514
- }
515
- },
516
- {
517
- key: "findMetavariableByMetavariableName",
518
- value: function findMetavariableByMetavariableName(metavariableName) {
519
- return this.context.findMetavariableByMetavariableName(metavariableName);
520
- }
521
- },
522
- {
523
- key: "isProcedurePresentByName",
524
- value: function isProcedurePresentByName(name) {
525
- return this.context.isProcedurePresentByName(name);
526
- }
527
- },
528
- {
529
- key: "isLabelPresentByReference",
530
- value: function isLabelPresentByReference(reference) {
531
- return this.context.isLabelPresentByReference(reference);
532
- }
533
- },
534
- {
535
- key: "isMetavariablePresentByReference",
536
- value: function isMetavariablePresentByReference(reference) {
537
- return this.context.isMetavariablePresentByReference(reference);
538
- }
539
- },
540
- {
541
- key: "isMetaLemmaMetatheoremPresentByReference",
542
- value: function isMetaLemmaMetatheoremPresentByReference(reference) {
543
- return this.context.isMetaLemmaMetatheoremPresentByReference(reference);
544
- }
545
- },
546
- {
547
- key: "findAxiomLemmaTheoremOrConjectureByReference",
548
- value: function findAxiomLemmaTheoremOrConjectureByReference(reference) {
549
- return this.context.findAxiomLemmaTheoremOrConjectureByReference(reference);
550
- }
551
- },
552
- {
553
- key: "isMetavariablePresent",
554
- value: function isMetavariablePresent(metavariable) {
555
- return this.context.isMetavariablePresent(metavariable);
556
- }
557
- },
558
- {
559
- key: "isTypePresentByTypeName",
560
- value: function isTypePresentByTypeName(typeName) {
561
- var includeRelease = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true, includeDependencies = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
562
- return this.context.isTypePresentByTypeName(typeName, includeRelease, includeDependencies);
563
- }
564
- },
565
- {
566
- key: "isTypePresentByNominalTypeName",
567
- value: function isTypePresentByNominalTypeName(nominalTypeName) {
568
- return this.context.isTypePresentByNominalTypeName(nominalTypeName);
569
- }
570
- },
571
- {
572
- key: "isTypePresentByPrefixedTypeName",
573
- value: function isTypePresentByPrefixedTypeName(prefixedTypeName) {
574
- return this.context.isTypePresentByPrefixedTypeName(prefixedTypeName);
575
- }
576
- },
577
- {
578
- key: "isTypePrefixPresentByTypePrefixName",
579
- value: function isTypePrefixPresentByTypePrefixName(typePrefixName) {
580
- return this.context.isTypePrefixPresentByTypePrefixName(typePrefixName);
581
- }
582
- },
583
- {
584
- key: "isVariablePresentByVariableIdentifier",
585
- value: function isVariablePresentByVariableIdentifier(variableIdentifier) {
586
- var nested = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
587
- return this.context.findVariableByVariableIdentifier(variableIdentifier, nested);
588
- }
589
- },
590
- {
591
- key: "isLabelPresentByMetavariableName",
592
- value: function isLabelPresentByMetavariableName(metavariableName) {
593
- return this.context.isLabelPresentByMetavariableName(metavariableName);
594
- }
595
- },
596
- {
597
- key: "isLabelPresentByMetavariable",
598
- value: function isLabelPresentByMetavariable(metavariable) {
599
- return this.context.isLabelPresentByMetavariable(metavariable);
600
- }
601
- },
602
- {
603
- key: "isMetavariablePresentByMetavariableName",
604
- value: function isMetavariablePresentByMetavariableName(metavariableNode) {
605
- return this.context.isMetavariablePresentByMetavariableName(metavariableNode);
606
- }
607
- },
608
- {
609
- key: "isJudgementPresentByMetavariable",
610
- value: function isJudgementPresentByMetavariable(metavariable) {
611
- return this.context.isJudgementPresentByMetavariable(metavariable);
612
- }
613
- },
614
- {
615
- key: "isTermGrounded",
616
- value: function isTermGrounded(term) {
617
- return this.context.isTermGrounded(term);
618
- }
619
- },
620
- {
621
- key: "isVariableDefined",
622
- value: function isVariableDefined(variable) {
623
- return this.context.isVariableDefined(variable);
624
- }
625
- },
626
- {
627
- key: "isMetavariableDefined",
628
- value: function isMetavariableDefined(metavariable) {
629
- return this.context.isMetavariableDefined(metavariable);
630
- }
631
- },
632
- {
633
- key: "compareTermAndPropertyRelation",
634
- value: function compareTermAndPropertyRelation(term, propertyRelation) {
635
- return this.context.compareTermAndPropertyRelation(term, propertyRelation);
636
- }
637
- },
638
- {
639
- key: "nodeAsString",
640
- value: function nodeAsString(node) {
641
- return this.context.nodeAsString(node);
642
- }
643
- },
644
- {
645
- key: "nodesAsString",
646
- value: function nodesAsString(node) {
647
- return this.context.nodesAsString(node);
648
- }
649
- },
650
- {
651
- key: "trace",
652
- value: function trace(message) {
653
- var node = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
654
- this.context.trace(message, node);
655
- }
656
- },
657
- {
658
- key: "debug",
659
- value: function debug(message) {
660
- var node = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
661
- this.context.debug(message, node);
662
- }
663
- },
664
- {
665
- key: "info",
666
- value: function info(message) {
667
- var node = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
668
- this.context.info(message, node);
669
- }
670
- },
671
- {
672
- key: "warning",
673
- value: function warning(message) {
674
- var node = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
675
- this.context.warning(message, node);
676
- }
677
- },
678
- {
679
- key: "error",
680
- value: function error(message) {
681
- var node = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
682
- this.context.error(message, node);
683
- }
684
- },
685
- {
686
- key: "merge",
687
- value: function merge(context) {
688
- var terms = context.getTerms(), frames = context.getFrames(), statements = context.getStatements(), assertions = context.getAssertions(), references = context.getReferences(), substitutions = context.getSubstitutions();
689
- this.terms = _to_consumable_array(this.terms).concat(_to_consumable_array(terms));
690
- this.frames = _to_consumable_array(this.frames).concat(_to_consumable_array(frames));
691
- this.statements = _to_consumable_array(this.statements).concat(_to_consumable_array(statements));
692
- this.assertions = _to_consumable_array(this.assertions).concat(_to_consumable_array(assertions));
693
- this.references = _to_consumable_array(this.references).concat(_to_consumable_array(references));
694
- this.substitutions = _to_consumable_array(this.substitutions).concat(_to_consumable_array(substitutions));
695
- compress(this.terms, function(termA, termB) {
696
- var termAEqualToTermB = termA.isEqualTo(termB);
697
- if (!termAEqualToTermB) {
698
- return true;
699
- }
700
- });
701
- compress(this.frames, function(frameA, frameB) {
702
- var frameAEqualToFrameB = frameA.isEqualTo(frameB);
703
- if (!frameAEqualToFrameB) {
704
- return true;
705
- }
706
- });
707
- compress(this.statements, function(statementA, statementB) {
708
- var statementAEqualToStatementB = statementA.isEqualTo(statementB);
709
- if (!statementAEqualToStatementB) {
710
- return true;
711
- }
712
- });
713
- compress(this.assertions, function(assertionA, assertionB) {
714
- var assertionAEqualToAssertionB = assertionA.isEqualTo(assertionB);
715
- if (!assertionAEqualToAssertionB) {
716
- return true;
717
- }
718
- });
719
- compress(this.references, function(referenceA, referenceB) {
720
- var referenceAEqualToReferenceB = referenceA.isEqualTo(referenceB);
721
- if (!referenceAEqualToReferenceB) {
722
- return true;
723
- }
724
- });
725
- compress(this.substitutions, function(substitutionA, substitutionB) {
726
- var substitutionAEqualToSubstitutionB = substitutionA.isEqualTo(substitutionB);
727
- if (!substitutionAEqualToSubstitutionB) {
728
- return true;
729
- }
730
- });
731
- }
732
- }
733
- ], [
734
- {
735
- key: "fromNothing",
736
- value: function fromNothing(context) {
737
- var terms = [], frames = [], statements = [], assertions = [], references = [], substitutions = [], temporaryContext = new TemporaryContext(context, terms, frames, statements, assertions, references, substitutions);
738
- return temporaryContext;
739
- }
740
- },
741
- {
742
- key: "fromTermsAndFrames",
743
- value: function fromTermsAndFrames(terms, frames, context) {
744
- var statements = [], assertions = [], references = [], substitutions = [], temporaryContext = new TemporaryContext(context, terms, frames, statements, assertions, references, substitutions);
745
- return temporaryContext;
746
- }
747
- }
748
- ]);
749
- return TemporaryContext;
750
- }();
751
-
752
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L3RlbXBvcmFyeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmNvbnN0IHsgZXh0cmFjdCwgY29tcHJlc3MgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZW1wb3JhcnlDb250ZXh0IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgdGVybXMsIGZyYW1lcywgc3RhdGVtZW50cywgYXNzZXJ0aW9ucywgcmVmZXJlbmNlcywgc3Vic3RpdHV0aW9ucykge1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy50ZXJtcyA9IHRlcm1zO1xuICAgIHRoaXMuZnJhbWVzID0gZnJhbWVzO1xuICAgIHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7XG4gICAgdGhpcy5hc3NlcnRpb25zID0gYXNzZXJ0aW9ucztcbiAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzO1xuICAgIHRoaXMuc3Vic3RpdHV0aW9ucyA9IHN1YnN0aXR1dGlvbnM7XG4gIH1cblxuICBnZXRDb250ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQ7XG4gIH1cblxuICBnZXRUZXJtcygpIHtcbiAgICByZXR1cm4gdGhpcy50ZXJtcztcbiAgfVxuXG4gIGdldEZyYW1lcygpIHtcbiAgICByZXR1cm4gdGhpcy5mcmFtZXM7XG4gIH1cblxuICBnZXRTdGF0ZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudHM7XG4gIH1cblxuICBnZXRBc3NlcnRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmFzc2VydGlvbnM7XG4gIH1cblxuICBnZXRSZWZlcmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZXM7XG4gIH1cblxuICBnZXRTdWJzdGl0dXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnN1YnN0aXR1dGlvbnM7XG4gIH1cblxuICBhZGRUZXJtKHRlcm0pIHtcbiAgICBjb25zdCB0ZXJtQSA9IHRlcm0sIC8vL1xuICAgICAgICAgIGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKTtcblxuICAgIGV4dHJhY3QodGhpcy50ZXJtcywgKHRlcm0pID0+IHtcbiAgICAgIGNvbnN0IHRlcm1CID0gdGVybSwgLy8vXG4gICAgICAgICAgICB0ZXJtQUVxdWFsVG9UZXJtQiA9IHRlcm1BLmlzRXF1YWxUbyh0ZXJtQik7XG5cbiAgICAgIGlmICh0ZXJtQUVxdWFsVG9UZXJtQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFEZGVkIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSB0byB0aGUgY29udGV4dC5gKTtcblxuICAgIHRoaXMudGVybXMucHVzaCh0ZXJtKTtcbiAgfVxuXG4gIGFkZEZyYW1lKGZyYW1lKSB7XG4gICAgY29uc3QgZnJhbWVBID0gZnJhbWUsIC8vL1xuICAgICAgICAgIGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBmcmFtZVN0cmluZyA9IGZyYW1lLmdldFN0cmluZygpO1xuXG4gICAgZXh0cmFjdCh0aGlzLmZyYW1lcywgKGZyYW1lKSA9PiB7XG4gICAgICBjb25zdCBmcmFtZUIgPSBmcmFtZSwgLy8vXG4gICAgICAgICAgICBmcmFtZUFFcXVhbFRvRnJhbWVCID0gZnJhbWVBLmlzRXF1YWxUbyhmcmFtZUIpO1xuXG4gICAgICBpZiAoZnJhbWVBRXF1YWxUb0ZyYW1lQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGVkIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHRvIHRoZSBjb250ZXh0LmApO1xuXG4gICAgdGhpcy5mcmFtZXMucHVzaChmcmFtZSk7XG4gIH1cblxuICBhZGRTdGF0ZW1lbnQoc3RhdGVtZW50KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIHN0YXRlbWVudEEgPSBzdGF0ZW1lbnQsIC8vL1xuICAgICAgICAgIHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGV4dHJhY3QodGhpcy5zdGF0ZW1lbnRzLCAoc3RhdGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRCID0gc3RhdGVtZW50LCAvLy9cbiAgICAgICAgICAgIHN0YXRlbWVudEFFcXVhbFRvRnJhbWVCID0gc3RhdGVtZW50QS5pc0VxdWFsVG8oc3RhdGVtZW50Qik7XG5cbiAgICAgIGlmIChzdGF0ZW1lbnRBRXF1YWxUb0ZyYW1lQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgdG8gdGhlIGNvbnRleHQuYCk7XG5cbiAgICB0aGlzLnN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICB9XG5cbiAgYWRkQXNzZXJ0aW9uKGFzc2VydGlvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBhc3NlcnRpb25BID0gYXNzZXJ0aW9uLCAvLy9cbiAgICAgICAgICBhc3NlcnRpb25TdHJpbmcgPSBhc3NlcnRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBleHRyYWN0KHRoaXMuYXNzZXJ0aW9ucywgKGFzc2VydGlvbikgPT4ge1xuICAgICAgY29uc3QgYXNzZXJ0aW9uQiA9IGFzc2VydGlvbiwgLy8vXG4gICAgICAgICAgICBhc3NlcnRpb25BRXF1YWxUb0Fzc2VydGlvbkIgPSBhc3NlcnRpb25BLmlzRXF1YWxUbyhhc3NlcnRpb25CKTtcblxuICAgICAgaWYgKGFzc2VydGlvbkFFcXVhbFRvQXNzZXJ0aW9uQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGVkIHRoZSAnJHthc3NlcnRpb25TdHJpbmd9JyBhc3NlcnRpb24gdG8gdGhlIGNvbnRleHQuYCk7XG5cbiAgICB0aGlzLmFzc2VydGlvbnMucHVzaChhc3NlcnRpb24pO1xuICB9XG5cbiAgYWRkUmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICByZWZlcmVuY2VBID0gcmVmZXJlbmNlLCAvLy9cbiAgICAgICAgICByZWZlcmVuY2VTdHJpbmcgPSByZWZlcmVuY2UuZ2V0U3RyaW5nKCk7XG5cbiAgICBleHRyYWN0KHRoaXMucmVmZXJlbmNlcywgKHJlZmVyZW5jZSkgPT4ge1xuICAgICAgY29uc3QgcmVmZXJlbmNlQiA9IHJlZmVyZW5jZSwgLy8vXG4gICAgICAgICAgICByZWZlcmVuY2VBRXF1YWxUb1JlZmVyZW5jZUIgPSByZWZlcmVuY2VBLmlzRXF1YWxUbyhyZWZlcmVuY2VCKTtcblxuICAgICAgaWYgKHJlZmVyZW5jZUFFcXVhbFRvUmVmZXJlbmNlQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGVkIHRoZSAnJHtyZWZlcmVuY2VTdHJpbmd9JyByZWZlcmVuY2UgdG8gdGhlIGNvbnRleHQuYCk7XG5cbiAgICB0aGlzLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpO1xuICB9XG5cbiAgYWRkU3Vic3RpdHV0aW9uKHN1YnN0aXR1dGlvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBzdWJzdGl0dXRpb25BID0gc3Vic3RpdHV0aW9uLCAvLy9cbiAgICAgICAgICBzdWJzdGl0dXRpb25TdHJpbmcgPSBzdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBleHRyYWN0KHRoaXMuc3Vic3RpdHV0aW9ucywgKHN1YnN0aXR1dGlvbikgPT4ge1xuICAgICAgY29uc3Qgc3Vic3RpdHV0aW9uQiA9IHN1YnN0aXR1dGlvbiwgLy8vXG4gICAgICAgICAgICBzdWJzdGl0dWlvbkFFcXVhbFRvU3Vic3RpdHV0aW9uQiA9IHN1YnN0aXR1dGlvbkEuaXNFcXVhbFRvKHN1YnN0aXR1dGlvbkIpO1xuXG4gICAgICBpZiAoc3Vic3RpdHVpb25BRXF1YWxUb1N1YnN0aXR1dGlvbkIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRlZCB0aGUgJyR7c3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uIHRvIHRoZSBjb250ZXh0LmApO1xuXG4gICAgdGhpcy5zdWJzdGl0dXRpb25zLnB1c2goc3Vic3RpdHV0aW9uKTtcbiAgfVxuXG4gIGZpbmRUZXJtQnlUZXJtTm9kZSh0ZXJtTm9kZSkge1xuICAgIGNvbnN0IHRlcm0gPSB0aGlzLnRlcm1zLmZpbmQoKHRlcm0pID0+IHtcbiAgICAgIGNvbnN0IHRlcm1Ob2RlTWF0Y2hlcyA9IHRlcm0ubWF0Y2hOb2RlKHRlcm1Ob2RlKTtcblxuICAgICAgaWYgKHRlcm1Ob2RlTWF0Y2hlcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBmaW5kRnJhbWVCeUZyYW1lTm9kZShmcmFtZU5vZGUpIHtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWVzLmZpbmQoKGZyYW1lKSA9PiB7XG4gICAgICBjb25zdCBmcmFtZU5vZGVNYXRjaGVzID0gZnJhbWUubWF0Y2hOb2RlKGZyYW1lTm9kZSk7XG5cbiAgICAgIGlmIChmcmFtZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gZnJhbWU7XG4gIH1cblxuICBmaW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB0aGlzLnN0YXRlbWVudHMuZmluZCgoc3RhdGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnROb2RlTWF0Y2hlcyA9IHN0YXRlbWVudC5tYXRjaE5vZGUoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICAgIGlmIChzdGF0ZW1lbnROb2RlTWF0Y2hlcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgfVxuXG4gIGZpbmRBc3NlcnRpb25CeUFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSkge1xuICAgIGNvbnN0IGFzc2VydGlvbiA9IHRoaXMuYXNzZXJ0aW9ucy5maW5kKChhc3NlcnRpb24pID0+IHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbk5vZGVNYXRjaGVzID0gYXNzZXJ0aW9uLm1hdGNoTm9kZShhc3NlcnRpb25Ob2RlKTtcblxuICAgICAgaWYgKGFzc2VydGlvbk5vZGVNYXRjaGVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gYXNzZXJ0aW9uO1xuICB9XG5cbiAgZmluZFJlZmVyZW5jZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gdGhpcy5yZWZlcmVuY2VzLmZpbmQoKHJlZmVyZW5jZSkgPT4ge1xuICAgICAgY29uc3QgcmVmZXJlbmNlTWF0Y2hlTWV0YXZhcmlhYmxlTm9kZSA9IHJlZmVyZW5jZS5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgIGlmIChyZWZlcmVuY2VNYXRjaGVNZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlO1xuICB9XG5cbiAgZmluZFN1YnN0aXR1dGlvbkJ5U3Vic3RpdHV0aW9uTm9kZShzdWJzdGl0dXRpb25Ob2RlKSB7XG4gICAgY29uc3Qgc3Vic3RpdHV0aW9uID0gdGhpcy5zdWJzdGl0dXRpb25zLmZpbmQoKHN1YnN0aXR1dGlvbikgPT4ge1xuICAgICAgY29uc3Qgc3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMgPSBzdWJzdGl0dXRpb24ubWF0Y2hOb2RlKHN1YnN0aXR1dGlvbk5vZGUpO1xuXG4gICAgICBpZiAoc3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gIH1cblxuICBnZXRWYXJpYWJsZXMobmVzdGVkID0gdHJ1ZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldFZhcmlhYmxlcyhuZXN0ZWQpOyB9XG5cbiAgZ2V0SnVkZ2VtZW50cygpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRKdWRnZW1lbnRzKCk7IH1cblxuICBnZXRFcXVpdmFsZW5jZXMoKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZ2V0RXF1aXZhbGVuY2VzKCk7IH1cblxuICBnZXRQcm9vZkFzc2VydGlvbnMoKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZ2V0UHJvb2ZBc3NlcnRpb25zKCk7IH1cblxuICBnZXRMYXN0UHJvb2ZBc3NlcnRpb24oKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZ2V0TGFzdFByb29mQXNzZXJ0aW9uKCk7IH1cblxuICBnZXRTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKTsgfVxuXG4gIGdldEZpbGVQYXRoKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldEZpbGVQYXRoKCk7IH1cblxuICBnZXRMZXhlcigpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRMZXhlcigpOyB9XG5cbiAgZ2V0UGFyc2VyKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldFBhcnNlcigpOyB9XG5cbiAgZ2V0QXhpb21zKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldEF4aW9tcygpOyB9XG5cbiAgZ2V0TGVtbWFzKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldExlbW1hcygpOyB9XG5cbiAgZ2V0VGhlb3JlbXMoKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZ2V0VGhlb3JlbXMoKTsgfVxuXG4gIGdldENvbmplY3R1cmVzKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldENvbmplY3R1cmVzKCk7IH1cblxuICBnZXRDb21iaW5hdG9ycygpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRDb21iaW5hdG9ycygpOyB9XG5cbiAgZ2V0Q29uc3RydWN0b3JzKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldENvbnN0cnVjdG9ycygpOyB9XG5cbiAgZ2V0VHlwZVByZWZpeCgpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRUeXBlUHJlZml4KCk7IH1cblxuICBhZGRBeGlvbShheGlvbSkgeyB0aGlzLmNvbnRleHQuYWRkQXhpb20oYXhpb20pOyB9XG5cbiAgYWRkTGVtbWEobGVtbWEpIHsgdGhpcy5jb250ZXh0LmFkZExlbW1hKGxlbW1hKTsgfVxuXG4gIGFkZFRoZW9yZW0odGhlb3JlbSkgeyB0aGlzLmNvbnRleHQuYWRkVGhlb3JlbSh0aGVvcmVtKTsgfVxuXG4gIGFkZEVxdWFsaXR5KGVxdWFsaXR5KSB7IHJldHVybiB0aGlzLmNvbnRleHQuYWRkRXF1YWxpdHkoZXF1YWxpdHkpOyB9XG5cbiAgYWRkVmFyaWFibGUodmFyaWFibGUsIG5lc3RlZCA9IHRydWUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5hZGRWYXJpYWJsZSh2YXJpYWJsZSwgbmVzdGVkKTsgfVxuXG4gIGFkZEp1ZGdlbWVudChqdWRnZW1lbnQpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5hZGRKdWRnZW1lbnQoanVkZ2VtZW50KTsgfVxuXG4gIGFkZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbihzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb24pIHsgdGhpcy5jb250ZXh0LmFkZFN1YnByb29mT3JQcm9vZkFzc2VydGlvbihzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb24pOyB9XG5cbiAgZmluZFByb2NlZHVyZUJ5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZmluZFByb2NlZHVyZUJ5TmFtZShuYW1lKTsgfVxuXG4gIGZpbmRMYWJlbEJ5UmVmZXJlbmNlKHJlZmVyZW5jZSwgY29udGV4dCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmZpbmRMYWJlbEJ5UmVmZXJlbmNlKHJlZmVyZW5jZSwgY29udGV4dCk7IH1cblxuICBmaW5kUnVsZUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmZpbmRSdWxlQnlSZWZlcmVuY2UocmVmZXJlbmNlKTsgfVxuXG4gIGZpbmRBeGlvbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmZpbmRBeGlvbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7IH1cblxuICBmaW5kTGVtbWFCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kTGVtbWFCeVJlZmVyZW5jZShyZWZlcmVuY2UpOyB9XG5cbiAgZmluZFRoZW9yZW1CeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kVGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7IH1cblxuICBmaW5kQ29uamVjdHVyZUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmZpbmRDb25qZWN0dXJlQnlSZWZlcmVuY2UocmVmZXJlbmNlKTsgfVxuXG4gIGZpbmRNZXRhTGVtbWFzQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZmluZE1ldGFMZW1tYXNCeVJlZmVyZW5jZShyZWZlcmVuY2UpOyB9XG5cbiAgZmluZE1ldGF0aGVvcmVtc0J5UmVmZXJlbmNlKHJlZmVyZW5jZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmZpbmRNZXRhdGhlb3JlbXNCeVJlZmVyZW5jZShyZWZlcmVuY2UpOyB9XG5cbiAgZmluZE1ldGFMZW1tYU1ldGF0aGVvcmVtQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZmluZE1ldGFMZW1tYU1ldGF0aGVvcmVtQnlSZWZlcmVuY2UocmVmZXJlbmNlKTsgfVxuXG4gIGZpbmRNZXRhTGVtbWFNZXRhdGhlb3JlbXNCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kTWV0YUxlbW1hTWV0YXRoZW9yZW1zQnlSZWZlcmVuY2UocmVmZXJlbmNlKTsgfVxuXG4gIGZpbmRWYXJpYWJsZUJ5VmFyaWFibGVJZGVudGlmaWVyKHZhcmlhYmxlSWRlbnRpZmllciwgbmVzdGVkID0gdHJ1ZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmZpbmRWYXJpYWJsZUJ5VmFyaWFibGVJZGVudGlmaWVyKHZhcmlhYmxlSWRlbnRpZmllciwgbmVzdGVkKTsgfVxuXG4gIGZpbmRKdWRnZW1lbnRCeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kSnVkZ2VtZW50QnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKTsgfVxuXG4gIGZpbmRFcXVpdmFsZW5jZUJ5VGVybSh0ZXJtKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZmluZEVxdWl2YWxlbmNlQnlUZXJtKHRlcm0pOyB9XG5cbiAgZmluZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSk7IH1cblxuICBmaW5kTGFiZWxCeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kTGFiZWxCeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpOyB9XG5cbiAgZmluZFR5cGVCeU5vbWluYWxUeXBlTmFtZShub21pbmFsVHlwZU5hbWUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kVHlwZUJ5Tm9taW5hbFR5cGVOYW1lKG5vbWluYWxUeXBlTmFtZSk7IH1cblxuICBmaW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZShtZXRhVHlwZU5hbWUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZShtZXRhVHlwZU5hbWUpOyB9XG5cbiAgZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTsgfVxuXG4gIGlzUHJvY2VkdXJlUHJlc2VudEJ5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLmNvbnRleHQuaXNQcm9jZWR1cmVQcmVzZW50QnlOYW1lKG5hbWUpOyB9XG5cbiAgaXNMYWJlbFByZXNlbnRCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5pc0xhYmVsUHJlc2VudEJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7IH1cblxuICBpc01ldGF2YXJpYWJsZVByZXNlbnRCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5pc01ldGF2YXJpYWJsZVByZXNlbnRCeVJlZmVyZW5jZShyZWZlcmVuY2UpOyB9XG5cbiAgaXNNZXRhTGVtbWFNZXRhdGhlb3JlbVByZXNlbnRCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5pc01ldGFMZW1tYU1ldGF0aGVvcmVtUHJlc2VudEJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7IH1cblxuICBmaW5kQXhpb21MZW1tYVRoZW9yZW1PckNvbmplY3R1cmVCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kQXhpb21MZW1tYVRoZW9yZW1PckNvbmplY3R1cmVCeVJlZmVyZW5jZShyZWZlcmVuY2UpOyB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50KG1ldGF2YXJpYWJsZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmlzTWV0YXZhcmlhYmxlUHJlc2VudChtZXRhdmFyaWFibGUpOyB9XG5cbiAgaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUodHlwZU5hbWUsIGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSwgaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5pc1R5cGVQcmVzZW50QnlUeXBlTmFtZSh0eXBlTmFtZSwgaW5jbHVkZVJlbGVhc2UsIGluY2x1ZGVEZXBlbmRlbmNpZXMpOyB9XG5cbiAgaXNUeXBlUHJlc2VudEJ5Tm9taW5hbFR5cGVOYW1lKG5vbWluYWxUeXBlTmFtZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmlzVHlwZVByZXNlbnRCeU5vbWluYWxUeXBlTmFtZShub21pbmFsVHlwZU5hbWUpOyB9XG5cbiAgaXNUeXBlUHJlc2VudEJ5UHJlZml4ZWRUeXBlTmFtZShwcmVmaXhlZFR5cGVOYW1lKSB7IHJldHVybiB0aGlzLmNvbnRleHQuaXNUeXBlUHJlc2VudEJ5UHJlZml4ZWRUeXBlTmFtZShwcmVmaXhlZFR5cGVOYW1lKTsgfVxuXG4gIGlzVHlwZVByZWZpeFByZXNlbnRCeVR5cGVQcmVmaXhOYW1lKHR5cGVQcmVmaXhOYW1lKSB7IHJldHVybiB0aGlzLmNvbnRleHQuaXNUeXBlUHJlZml4UHJlc2VudEJ5VHlwZVByZWZpeE5hbWUodHlwZVByZWZpeE5hbWUpOyB9XG5cbiAgaXNWYXJpYWJsZVByZXNlbnRCeVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIsIG5lc3RlZCA9IHRydWUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kVmFyaWFibGVCeVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIsIG5lc3RlZCk7IH1cblxuICBpc0xhYmVsUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7IHJldHVybiB0aGlzLmNvbnRleHQuaXNMYWJlbFByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7IH1cblxuICBpc0xhYmVsUHJlc2VudEJ5TWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmlzTGFiZWxQcmVzZW50QnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKTsgfVxuXG4gIGlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOb2RlKSB7IHJldHVybiB0aGlzLmNvbnRleHQuaXNNZXRhdmFyaWFibGVQcmVzZW50QnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5vZGUpOyB9XG5cbiAgaXNKdWRnZW1lbnRQcmVzZW50QnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7IHJldHVybiB0aGlzLmNvbnRleHQuaXNKdWRnZW1lbnRQcmVzZW50QnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKTsgfVxuXG4gIGlzVGVybUdyb3VuZGVkKHRlcm0pIHsgcmV0dXJuIHRoaXMuY29udGV4dC5pc1Rlcm1Hcm91bmRlZCh0ZXJtKTsgfVxuXG4gIGlzVmFyaWFibGVEZWZpbmVkKHZhcmlhYmxlKSB7IHJldHVybiB0aGlzLmNvbnRleHQuaXNWYXJpYWJsZURlZmluZWQodmFyaWFibGUpOyB9XG5cbiAgaXNNZXRhdmFyaWFibGVEZWZpbmVkKG1ldGF2YXJpYWJsZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmlzTWV0YXZhcmlhYmxlRGVmaW5lZChtZXRhdmFyaWFibGUpOyB9XG5cbiAgY29tcGFyZVRlcm1BbmRQcm9wZXJ0eVJlbGF0aW9uKHRlcm0sIHByb3BlcnR5UmVsYXRpb24pIHsgcmV0dXJuIHRoaXMuY29udGV4dC5jb21wYXJlVGVybUFuZFByb3BlcnR5UmVsYXRpb24odGVybSwgcHJvcGVydHlSZWxhdGlvbik7IH1cblxuICBub2RlQXNTdHJpbmcobm9kZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0Lm5vZGVBc1N0cmluZyhub2RlKTsgfVxuXG4gIG5vZGVzQXNTdHJpbmcobm9kZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0Lm5vZGVzQXNTdHJpbmcobm9kZSk7IH1cblxuICB0cmFjZShtZXNzYWdlLCBub2RlID0gbnVsbCkgeyB0aGlzLmNvbnRleHQudHJhY2UobWVzc2FnZSwgbm9kZSk7IH1cblxuICBkZWJ1ZyhtZXNzYWdlLCBub2RlID0gbnVsbCkgeyB0aGlzLmNvbnRleHQuZGVidWcobWVzc2FnZSwgbm9kZSk7IH1cblxuICBpbmZvKG1lc3NhZ2UsIG5vZGUgPSBudWxsKSB7IHRoaXMuY29udGV4dC5pbmZvKG1lc3NhZ2UsIG5vZGUpOyB9XG5cbiAgd2FybmluZyhtZXNzYWdlLCBub2RlID0gbnVsbCkgeyB0aGlzLmNvbnRleHQud2FybmluZyhtZXNzYWdlLCBub2RlKTsgfVxuXG4gIGVycm9yKG1lc3NhZ2UsIG5vZGUgPSBudWxsKSB7IHRoaXMuY29udGV4dC5lcnJvcihtZXNzYWdlLCBub2RlKTsgfVxuXG4gIG1lcmdlKGNvbnRleHQpIHtcbiAgICBjb25zdCB0ZXJtcyA9IGNvbnRleHQuZ2V0VGVybXMoKSxcbiAgICAgICAgICBmcmFtZXMgPSBjb250ZXh0LmdldEZyYW1lcygpLFxuICAgICAgICAgIHN0YXRlbWVudHMgPSBjb250ZXh0LmdldFN0YXRlbWVudHMoKSxcbiAgICAgICAgICBhc3NlcnRpb25zID0gY29udGV4dC5nZXRBc3NlcnRpb25zKCksXG4gICAgICAgICAgcmVmZXJlbmNlcyA9IGNvbnRleHQuZ2V0UmVmZXJlbmNlcygpLFxuICAgICAgICAgIHN1YnN0aXR1dGlvbnMgPSBjb250ZXh0LmdldFN1YnN0aXR1dGlvbnMoKTtcblxuICAgIHRoaXMudGVybXMgPSBbXG4gICAgICAuLi50aGlzLnRlcm1zLFxuICAgICAgLi4udGVybXNcbiAgICBdO1xuXG4gICAgdGhpcy5mcmFtZXMgPSBbXG4gICAgICAuLi50aGlzLmZyYW1lcyxcbiAgICAgIC4uLmZyYW1lc1xuICAgIF07XG5cbiAgICB0aGlzLnN0YXRlbWVudHMgPSBbXG4gICAgICAuLi50aGlzLnN0YXRlbWVudHMsXG4gICAgICAuLi5zdGF0ZW1lbnRzXG4gICAgXTtcblxuICAgIHRoaXMuYXNzZXJ0aW9ucyA9IFtcbiAgICAgIC4uLnRoaXMuYXNzZXJ0aW9ucyxcbiAgICAgIC4uLmFzc2VydGlvbnNcbiAgICBdO1xuXG4gICAgdGhpcy5yZWZlcmVuY2VzID0gW1xuICAgICAgLi4udGhpcy5yZWZlcmVuY2VzLFxuICAgICAgLi4ucmVmZXJlbmNlc1xuICAgIF07XG5cbiAgICB0aGlzLnN1YnN0aXR1dGlvbnMgPSBbXG4gICAgICAuLi50aGlzLnN1YnN0aXR1dGlvbnMsXG4gICAgICAuLi5zdWJzdGl0dXRpb25zXG4gICAgXTtcblxuICAgIGNvbXByZXNzKHRoaXMudGVybXMsICh0ZXJtQSwgdGVybUIpID0+IHtcbiAgICAgIGNvbnN0IHRlcm1BRXF1YWxUb1Rlcm1CID0gdGVybUEuaXNFcXVhbFRvKHRlcm1CKTtcblxuICAgICAgaWYgKCF0ZXJtQUVxdWFsVG9UZXJtQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbXByZXNzKHRoaXMuZnJhbWVzLCAoZnJhbWVBLCBmcmFtZUIpID0+IHtcbiAgICAgIGNvbnN0IGZyYW1lQUVxdWFsVG9GcmFtZUIgPSBmcmFtZUEuaXNFcXVhbFRvKGZyYW1lQik7XG5cbiAgICAgIGlmICghZnJhbWVBRXF1YWxUb0ZyYW1lQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbXByZXNzKHRoaXMuc3RhdGVtZW50cywgKHN0YXRlbWVudEEsIHN0YXRlbWVudEIpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudEFFcXVhbFRvU3RhdGVtZW50QiA9IHN0YXRlbWVudEEuaXNFcXVhbFRvKHN0YXRlbWVudEIpO1xuXG4gICAgICBpZiAoIXN0YXRlbWVudEFFcXVhbFRvU3RhdGVtZW50Qikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbXByZXNzKHRoaXMuYXNzZXJ0aW9ucywgKGFzc2VydGlvbkEsIGFzc2VydGlvbkIpID0+IHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbkFFcXVhbFRvQXNzZXJ0aW9uQiA9IGFzc2VydGlvbkEuaXNFcXVhbFRvKGFzc2VydGlvbkIpO1xuXG4gICAgICBpZiAoIWFzc2VydGlvbkFFcXVhbFRvQXNzZXJ0aW9uQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbXByZXNzKHRoaXMucmVmZXJlbmNlcywgKHJlZmVyZW5jZUEsIHJlZmVyZW5jZUIpID0+IHtcbiAgICAgIGNvbnN0IHJlZmVyZW5jZUFFcXVhbFRvUmVmZXJlbmNlQiA9IHJlZmVyZW5jZUEuaXNFcXVhbFRvKHJlZmVyZW5jZUIpO1xuXG4gICAgICBpZiAoIXJlZmVyZW5jZUFFcXVhbFRvUmVmZXJlbmNlQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbXByZXNzKHRoaXMuc3Vic3RpdHV0aW9ucywgKHN1YnN0aXR1dGlvbkEsIHN1YnN0aXR1dGlvbkIpID0+IHtcbiAgICAgIGNvbnN0IHN1YnN0aXR1dGlvbkFFcXVhbFRvU3Vic3RpdHV0aW9uQiA9IHN1YnN0aXR1dGlvbkEuaXNFcXVhbFRvKHN1YnN0aXR1dGlvbkIpO1xuXG4gICAgICBpZiAoIXN1YnN0aXR1dGlvbkFFcXVhbFRvU3Vic3RpdHV0aW9uQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tTm90aGluZyhjb250ZXh0KSB7XG4gICAgY29uc3QgdGVybXMgPSBbXSxcbiAgICAgICAgICBmcmFtZXMgPSBbXSxcbiAgICAgICAgICBzdGF0ZW1lbnRzID0gW10sXG4gICAgICAgICAgYXNzZXJ0aW9ucyA9IFtdLFxuICAgICAgICAgIHJlZmVyZW5jZXMgPSBbXSxcbiAgICAgICAgICBzdWJzdGl0dXRpb25zID0gW10sXG4gICAgICAgICAgdGVtcG9yYXJ5Q29udGV4dCA9IG5ldyBUZW1wb3JhcnlDb250ZXh0KGNvbnRleHQsIHRlcm1zLCBmcmFtZXMsIHN0YXRlbWVudHMsIGFzc2VydGlvbnMsIHJlZmVyZW5jZXMsIHN1YnN0aXR1dGlvbnMpO1xuXG4gICAgcmV0dXJuIHRlbXBvcmFyeUNvbnRleHQ7XG4gIH1cblxuICBzdGF0aWMgZnJvbVRlcm1zQW5kRnJhbWVzKHRlcm1zLCBmcmFtZXMsIGNvbnRleHQpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gW10sXG4gICAgICAgICAgYXNzZXJ0aW9ucyA9IFtdLFxuICAgICAgICAgIHJlZmVyZW5jZXMgPSBbXSxcbiAgICAgICAgICBzdWJzdGl0dXRpb25zID0gW10sXG4gICAgICAgICAgdGVtcG9yYXJ5Q29udGV4dCA9IG5ldyBUZW1wb3JhcnlDb250ZXh0KGNvbnRleHQsIHRlcm1zLCBmcmFtZXMsIHN0YXRlbWVudHMsIGFzc2VydGlvbnMsIHJlZmVyZW5jZXMsIHN1YnN0aXR1dGlvbnMpO1xuXG4gICAgcmV0dXJuIHRlbXBvcmFyeUNvbnRleHQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJUZW1wb3JhcnlDb250ZXh0IiwiZXh0cmFjdCIsImFycmF5VXRpbGl0aWVzIiwiY29tcHJlc3MiLCJjb250ZXh0IiwidGVybXMiLCJmcmFtZXMiLCJzdGF0ZW1lbnRzIiwiYXNzZXJ0aW9ucyIsInJlZmVyZW5jZXMiLCJzdWJzdGl0dXRpb25zIiwiZ2V0Q29udGV4dCIsImdldFRlcm1zIiwiZ2V0RnJhbWVzIiwiZ2V0U3RhdGVtZW50cyIsImdldEFzc2VydGlvbnMiLCJnZXRSZWZlcmVuY2VzIiwiZ2V0U3Vic3RpdHV0aW9ucyIsImFkZFRlcm0iLCJ0ZXJtIiwidGVybUEiLCJ0ZXJtU3RyaW5nIiwiZ2V0U3RyaW5nIiwidGVybUIiLCJ0ZXJtQUVxdWFsVG9UZXJtQiIsImlzRXF1YWxUbyIsInRyYWNlIiwicHVzaCIsImFkZEZyYW1lIiwiZnJhbWUiLCJmcmFtZUEiLCJmcmFtZVN0cmluZyIsImZyYW1lQiIsImZyYW1lQUVxdWFsVG9GcmFtZUIiLCJhZGRTdGF0ZW1lbnQiLCJzdGF0ZW1lbnQiLCJzdGF0ZW1lbnRBIiwic3RhdGVtZW50U3RyaW5nIiwic3RhdGVtZW50QiIsInN0YXRlbWVudEFFcXVhbFRvRnJhbWVCIiwiYWRkQXNzZXJ0aW9uIiwiYXNzZXJ0aW9uIiwiYXNzZXJ0aW9uQSIsImFzc2VydGlvblN0cmluZyIsImFzc2VydGlvbkIiLCJhc3NlcnRpb25BRXF1YWxUb0Fzc2VydGlvbkIiLCJhZGRSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJyZWZlcmVuY2VBIiwicmVmZXJlbmNlU3RyaW5nIiwicmVmZXJlbmNlQiIsInJlZmVyZW5jZUFFcXVhbFRvUmVmZXJlbmNlQiIsImFkZFN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbkEiLCJzdWJzdGl0dXRpb25TdHJpbmciLCJzdWJzdGl0dXRpb25CIiwic3Vic3RpdHVpb25BRXF1YWxUb1N1YnN0aXR1dGlvbkIiLCJmaW5kVGVybUJ5VGVybU5vZGUiLCJ0ZXJtTm9kZSIsImZpbmQiLCJ0ZXJtTm9kZU1hdGNoZXMiLCJtYXRjaE5vZGUiLCJmaW5kRnJhbWVCeUZyYW1lTm9kZSIsImZyYW1lTm9kZSIsImZyYW1lTm9kZU1hdGNoZXMiLCJmaW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50Tm9kZSIsInN0YXRlbWVudE5vZGVNYXRjaGVzIiwiZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZSIsImFzc2VydGlvbk5vZGUiLCJhc3NlcnRpb25Ob2RlTWF0Y2hlcyIsImZpbmRSZWZlcmVuY2VCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwicmVmZXJlbmNlTWF0Y2hlTWV0YXZhcmlhYmxlTm9kZSIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsImZpbmRTdWJzdGl0dXRpb25CeVN1YnN0aXR1dGlvbk5vZGUiLCJzdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMiLCJnZXRWYXJpYWJsZXMiLCJuZXN0ZWQiLCJnZXRKdWRnZW1lbnRzIiwiZ2V0RXF1aXZhbGVuY2VzIiwiZ2V0UHJvb2ZBc3NlcnRpb25zIiwiZ2V0TGFzdFByb29mQXNzZXJ0aW9uIiwiZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyIsImdldEZpbGVQYXRoIiwiZ2V0TGV4ZXIiLCJnZXRQYXJzZXIiLCJnZXRBeGlvbXMiLCJnZXRMZW1tYXMiLCJnZXRUaGVvcmVtcyIsImdldENvbmplY3R1cmVzIiwiZ2V0Q29tYmluYXRvcnMiLCJnZXRDb25zdHJ1Y3RvcnMiLCJnZXRUeXBlUHJlZml4IiwiYWRkQXhpb20iLCJheGlvbSIsImFkZExlbW1hIiwibGVtbWEiLCJhZGRUaGVvcmVtIiwidGhlb3JlbSIsImFkZEVxdWFsaXR5IiwiZXF1YWxpdHkiLCJhZGRWYXJpYWJsZSIsInZhcmlhYmxlIiwiYWRkSnVkZ2VtZW50IiwianVkZ2VtZW50IiwiYWRkU3VicHJvb2ZPclByb29mQXNzZXJ0aW9uIiwic3VicHJvb2ZPclByb29mQXNzZXJ0aW9uIiwiZmluZFByb2NlZHVyZUJ5TmFtZSIsIm5hbWUiLCJmaW5kTGFiZWxCeVJlZmVyZW5jZSIsImZpbmRSdWxlQnlSZWZlcmVuY2UiLCJmaW5kQXhpb21CeVJlZmVyZW5jZSIsImZpbmRMZW1tYUJ5UmVmZXJlbmNlIiwiZmluZFRoZW9yZW1CeVJlZmVyZW5jZSIsImZpbmRDb25qZWN0dXJlQnlSZWZlcmVuY2UiLCJmaW5kTWV0YUxlbW1hc0J5UmVmZXJlbmNlIiwiZmluZE1ldGF0aGVvcmVtc0J5UmVmZXJlbmNlIiwiZmluZE1ldGFMZW1tYU1ldGF0aGVvcmVtQnlSZWZlcmVuY2UiLCJmaW5kTWV0YUxlbW1hTWV0YXRoZW9yZW1zQnlSZWZlcmVuY2UiLCJmaW5kVmFyaWFibGVCeVZhcmlhYmxlSWRlbnRpZmllciIsInZhcmlhYmxlSWRlbnRpZmllciIsImZpbmRKdWRnZW1lbnRCeU1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZSIsImZpbmRFcXVpdmFsZW5jZUJ5VGVybSIsImZpbmRNZXRhdmFyaWFibGUiLCJmaW5kTGFiZWxCeU1ldGF2YXJpYWJsZSIsImZpbmRUeXBlQnlOb21pbmFsVHlwZU5hbWUiLCJub21pbmFsVHlwZU5hbWUiLCJmaW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZSIsIm1ldGFUeXBlTmFtZSIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUiLCJtZXRhdmFyaWFibGVOYW1lIiwiaXNQcm9jZWR1cmVQcmVzZW50QnlOYW1lIiwiaXNMYWJlbFByZXNlbnRCeVJlZmVyZW5jZSIsImlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5UmVmZXJlbmNlIiwiaXNNZXRhTGVtbWFNZXRhdGhlb3JlbVByZXNlbnRCeVJlZmVyZW5jZSIsImZpbmRBeGlvbUxlbW1hVGhlb3JlbU9yQ29uamVjdHVyZUJ5UmVmZXJlbmNlIiwiaXNNZXRhdmFyaWFibGVQcmVzZW50IiwiaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUiLCJ0eXBlTmFtZSIsImluY2x1ZGVSZWxlYXNlIiwiaW5jbHVkZURlcGVuZGVuY2llcyIsImlzVHlwZVByZXNlbnRCeU5vbWluYWxUeXBlTmFtZSIsImlzVHlwZVByZXNlbnRCeVByZWZpeGVkVHlwZU5hbWUiLCJwcmVmaXhlZFR5cGVOYW1lIiwiaXNUeXBlUHJlZml4UHJlc2VudEJ5VHlwZVByZWZpeE5hbWUiLCJ0eXBlUHJlZml4TmFtZSIsImlzVmFyaWFibGVQcmVzZW50QnlWYXJpYWJsZUlkZW50aWZpZXIiLCJpc0xhYmVsUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZSIsImlzTGFiZWxQcmVzZW50QnlNZXRhdmFyaWFibGUiLCJpc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUiLCJpc0p1ZGdlbWVudFByZXNlbnRCeU1ldGF2YXJpYWJsZSIsImlzVGVybUdyb3VuZGVkIiwiaXNWYXJpYWJsZURlZmluZWQiLCJpc01ldGF2YXJpYWJsZURlZmluZWQiLCJjb21wYXJlVGVybUFuZFByb3BlcnR5UmVsYXRpb24iLCJwcm9wZXJ0eVJlbGF0aW9uIiwibm9kZUFzU3RyaW5nIiwibm9kZSIsIm5vZGVzQXNTdHJpbmciLCJtZXNzYWdlIiwiZGVidWciLCJpbmZvIiwid2FybmluZyIsImVycm9yIiwibWVyZ2UiLCJzdGF0ZW1lbnRBRXF1YWxUb1N0YXRlbWVudEIiLCJzdWJzdGl0dXRpb25BRXF1YWxUb1N1YnN0aXR1dGlvbkIiLCJmcm9tTm90aGluZyIsInRlbXBvcmFyeUNvbnRleHQiLCJmcm9tVGVybXNBbmRGcmFtZXMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O2VBTXFCQTs7O3lCQUpVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFL0IsSUFBUUMsVUFBc0JDLHlCQUFjLENBQXBDRCxTQUFTRSxXQUFhRCx5QkFBYyxDQUEzQkM7QUFFRixJQUFBLEFBQU1ILGlDQUFOO2FBQU1BLGlCQUNQSSxPQUFPLEVBQUVDLEtBQUssRUFBRUMsTUFBTSxFQUFFQyxVQUFVLEVBQUVDLFVBQVUsRUFBRUMsVUFBVSxFQUFFQyxhQUFhO2dDQURsRVY7UUFFakIsSUFBSSxDQUFDSSxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDQyxLQUFLLEdBQUdBO1FBQ2IsSUFBSSxDQUFDQyxNQUFNLEdBQUdBO1FBQ2QsSUFBSSxDQUFDQyxVQUFVLEdBQUdBO1FBQ2xCLElBQUksQ0FBQ0MsVUFBVSxHQUFHQTtRQUNsQixJQUFJLENBQUNDLFVBQVUsR0FBR0E7UUFDbEIsSUFBSSxDQUFDQyxhQUFhLEdBQUdBOztrQkFSSlY7O1lBV25CVyxLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsT0FBTyxJQUFJLENBQUNQLE9BQU87WUFDckI7OztZQUVB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