occam-verify-cli 1.0.662 → 1.0.664

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 (211) hide show
  1. package/.swcrc +3 -0
  2. package/lib/abbreviations.js +10 -10
  3. package/lib/action/help.js +27 -2
  4. package/lib/action/verify.js +33 -205
  5. package/lib/action/version.js +6 -6
  6. package/lib/commands.js +4 -4
  7. package/lib/constants.js +16 -16
  8. package/lib/context/ephemeral.js +337 -540
  9. package/lib/context/file/nominal.js +545 -1040
  10. package/lib/context/liminal.js +159 -325
  11. package/lib/context/literal.js +34 -138
  12. package/lib/context/nominal.js +29 -124
  13. package/lib/context/scoped.js +163 -325
  14. package/lib/context/synthetic.js +31 -126
  15. package/lib/context.js +230 -482
  16. package/lib/defaults.js +8 -8
  17. package/lib/element/assertion/contained.js +159 -299
  18. package/lib/element/assertion/defined.js +145 -279
  19. package/lib/element/assertion/property.js +132 -266
  20. package/lib/element/assertion/satisfies.js +108 -239
  21. package/lib/element/assertion/subproof.js +88 -207
  22. package/lib/element/assertion/type.js +132 -262
  23. package/lib/element/assertion.js +17 -156
  24. package/lib/element/assumption.js +187 -386
  25. package/lib/element/combinator/bracketed.js +19 -142
  26. package/lib/element/combinator.js +65 -228
  27. package/lib/element/conclusion.js +72 -370
  28. package/lib/element/constructor/bracketed.js +34 -157
  29. package/lib/element/constructor.js +81 -253
  30. package/lib/element/declaration/combinator.js +41 -286
  31. package/lib/element/declaration/complexType.js +184 -452
  32. package/lib/element/declaration/constructor.js +69 -323
  33. package/lib/element/declaration/metavariable.js +70 -317
  34. package/lib/element/declaration/simpleType.js +117 -378
  35. package/lib/element/declaration/typePrefix.js +54 -299
  36. package/lib/element/declaration/variable.js +74 -328
  37. package/lib/element/declaration.js +3 -114
  38. package/lib/element/deduction.js +76 -378
  39. package/lib/element/derivation.js +31 -340
  40. package/lib/element/equality.js +152 -347
  41. package/lib/element/equivalence.js +160 -385
  42. package/lib/element/equivalences.js +132 -356
  43. package/lib/element/error.js +16 -290
  44. package/lib/element/frame.js +210 -418
  45. package/lib/element/hypothesis.js +56 -354
  46. package/lib/element/judgement.js +120 -305
  47. package/lib/element/label.js +62 -236
  48. package/lib/element/metaType.js +35 -200
  49. package/lib/element/metavariable.js +249 -459
  50. package/lib/element/parameter.js +39 -202
  51. package/lib/element/procedureCall.js +74 -381
  52. package/lib/element/procedureReference.js +27 -186
  53. package/lib/element/proof.js +38 -349
  54. package/lib/element/proofAssertion/premise.js +174 -466
  55. package/lib/element/proofAssertion/step.js +144 -495
  56. package/lib/element/proofAssertion/supposition.js +170 -466
  57. package/lib/element/proofAssertion.js +47 -195
  58. package/lib/element/property.js +36 -201
  59. package/lib/element/propertyRelation.js +62 -223
  60. package/lib/element/reference.js +173 -378
  61. package/lib/element/rule.js +178 -673
  62. package/lib/element/section.js +47 -356
  63. package/lib/element/signature.js +96 -264
  64. package/lib/element/statement.js +195 -395
  65. package/lib/element/subDerivation.js +32 -341
  66. package/lib/element/subproof.js +73 -448
  67. package/lib/element/substitution/frame.js +114 -257
  68. package/lib/element/substitution/reference.js +108 -248
  69. package/lib/element/substitution/statement.js +223 -397
  70. package/lib/element/substitution/term.js +123 -266
  71. package/lib/element/substitution.js +97 -296
  72. package/lib/element/term.js +139 -339
  73. package/lib/element/topLevelAssertion/axiom.js +153 -459
  74. package/lib/element/topLevelAssertion/conjecture.js +24 -295
  75. package/lib/element/topLevelAssertion/lemma.js +22 -289
  76. package/lib/element/topLevelAssertion/theorem.js +24 -295
  77. package/lib/element/topLevelAssertion.js +218 -718
  78. package/lib/element/topLevelMetaAssertion/metaLemma.js +24 -290
  79. package/lib/element/topLevelMetaAssertion/metatheorem.js +24 -290
  80. package/lib/element/topLevelMetaAssertion.js +109 -509
  81. package/lib/element/type.js +198 -435
  82. package/lib/element/typePrefix.js +27 -186
  83. package/lib/element/variable.js +119 -308
  84. package/lib/elements.js +4 -4
  85. package/lib/index.js +4 -4
  86. package/lib/main.js +18 -18
  87. package/lib/messages.js +2 -2
  88. package/lib/metaTypeNames.js +4 -4
  89. package/lib/metaTypes.js +10 -10
  90. package/lib/node/argument.js +15 -109
  91. package/lib/node/assertion/contained.js +33 -130
  92. package/lib/node/assertion/defined.js +29 -123
  93. package/lib/node/assertion/property.js +18 -112
  94. package/lib/node/assertion/satisfies.js +14 -105
  95. package/lib/node/assertion/subproof.js +10 -98
  96. package/lib/node/assertion/type.js +14 -105
  97. package/lib/node/assertion.js +5 -89
  98. package/lib/node/assumption.js +12 -103
  99. package/lib/node/body/axiom.js +5 -89
  100. package/lib/node/body/conjecture.js +5 -89
  101. package/lib/node/body/lemma.js +5 -89
  102. package/lib/node/body/metaLemma.js +5 -89
  103. package/lib/node/body/metatheorem.js +5 -89
  104. package/lib/node/body/rule.js +26 -126
  105. package/lib/node/body/theorem.js +5 -89
  106. package/lib/node/body.js +15 -109
  107. package/lib/node/combinator.js +9 -97
  108. package/lib/node/conclusion.js +12 -103
  109. package/lib/node/constructor.js +9 -97
  110. package/lib/node/declaration/combinator.js +10 -98
  111. package/lib/node/declaration/complexType.js +53 -162
  112. package/lib/node/declaration/constructor.js +29 -123
  113. package/lib/node/declaration/metavariable.js +18 -112
  114. package/lib/node/declaration/property.js +26 -123
  115. package/lib/node/declaration/simpleType.js +52 -158
  116. package/lib/node/declaration/typePrefix.js +14 -105
  117. package/lib/node/declaration/variable.js +33 -130
  118. package/lib/node/declaration.js +5 -89
  119. package/lib/node/deduction.js +12 -103
  120. package/lib/node/derivation.js +12 -125
  121. package/lib/node/document.js +5 -89
  122. package/lib/node/equality.js +17 -111
  123. package/lib/node/equivalence.js +9 -97
  124. package/lib/node/equivalences.js +5 -89
  125. package/lib/node/error.js +5 -89
  126. package/lib/node/frame.js +26 -123
  127. package/lib/node/header/axiom.js +10 -98
  128. package/lib/node/header/conjecture.js +5 -89
  129. package/lib/node/header/lemma.js +5 -89
  130. package/lib/node/header/metaLemma.js +5 -89
  131. package/lib/node/header/metatheorem.js +5 -89
  132. package/lib/node/header/rule.js +5 -89
  133. package/lib/node/header/theorem.js +5 -89
  134. package/lib/node/header.js +30 -130
  135. package/lib/node/hypothesis.js +12 -103
  136. package/lib/node/judgement.js +15 -109
  137. package/lib/node/label.js +9 -97
  138. package/lib/node/labels.js +9 -97
  139. package/lib/node/metaArgument.js +9 -97
  140. package/lib/node/metaType.js +16 -104
  141. package/lib/node/metavariable.js +23 -117
  142. package/lib/node/parameter.js +32 -123
  143. package/lib/node/parenthesisedLabel.js +9 -97
  144. package/lib/node/parenthesisedLabels.js +12 -103
  145. package/lib/node/placeholder.js +5 -89
  146. package/lib/node/procedureCall.js +15 -109
  147. package/lib/node/procedureReference.js +16 -104
  148. package/lib/node/proof.js +9 -97
  149. package/lib/node/proofAssertion/premise.js +10 -98
  150. package/lib/node/proofAssertion/step.js +32 -132
  151. package/lib/node/proofAssertion/supposition.js +10 -98
  152. package/lib/node/proofAssertion.js +12 -103
  153. package/lib/node/property.js +15 -106
  154. package/lib/node/propertyRelation.js +15 -109
  155. package/lib/node/qualification.js +12 -103
  156. package/lib/node/reference.js +9 -97
  157. package/lib/node/rule.js +26 -129
  158. package/lib/node/section.js +22 -122
  159. package/lib/node/signature.js +9 -97
  160. package/lib/node/statement.js +93 -238
  161. package/lib/node/subDerivation.js +12 -125
  162. package/lib/node/subproof.js +18 -115
  163. package/lib/node/substitution/frame.js +22 -119
  164. package/lib/node/substitution/reference.js +22 -119
  165. package/lib/node/substitution/statement.js +42 -151
  166. package/lib/node/substitution/term.js +22 -119
  167. package/lib/node/substitution.js +5 -89
  168. package/lib/node/term.js +51 -160
  169. package/lib/node/topLevelAssertion/axiom.js +8 -105
  170. package/lib/node/topLevelAssertion/conjecture.js +8 -105
  171. package/lib/node/topLevelAssertion/lemma.js +8 -105
  172. package/lib/node/topLevelAssertion/theorem.js +8 -105
  173. package/lib/node/topLevelAssertion.js +29 -135
  174. package/lib/node/topLevelMetaAssertion/metaLemma.js +8 -105
  175. package/lib/node/topLevelMetaAssertion/metatheorem.js +8 -105
  176. package/lib/node/topLevelMetaAssertion.js +25 -128
  177. package/lib/node/type.js +43 -140
  178. package/lib/node/typePrefix.js +16 -104
  179. package/lib/node/types.js +9 -97
  180. package/lib/node/variable.js +16 -104
  181. package/lib/nominal/lexer.js +3 -68
  182. package/lib/nominal/parser.js +7 -85
  183. package/lib/nonTerminalNodeMap.js +171 -101
  184. package/lib/options.js +6 -6
  185. package/lib/preamble.js +62 -62
  186. package/lib/prepare.js +4 -4
  187. package/lib/process/assign.js +20 -20
  188. package/lib/process/equate.js +39 -117
  189. package/lib/process/instantiate.js +10 -9
  190. package/lib/process/unify.js +199 -325
  191. package/lib/process/validate.js +87 -195
  192. package/lib/process/verify.js +263 -786
  193. package/lib/ruleNames.js +84 -84
  194. package/lib/tokenTypes.js +3 -3
  195. package/lib/utilities/bnf.js +7 -7
  196. package/lib/utilities/brackets.js +18 -18
  197. package/lib/utilities/clock.js +8 -8
  198. package/lib/utilities/context.js +23 -191
  199. package/lib/utilities/element.js +276 -276
  200. package/lib/utilities/equivalence.js +7 -7
  201. package/lib/utilities/fileContext.js +9 -9
  202. package/lib/utilities/instance.js +14 -14
  203. package/lib/utilities/json.js +211 -211
  204. package/lib/utilities/releaseContext.js +19 -147
  205. package/lib/utilities/statement.js +10 -10
  206. package/lib/utilities/string.js +47 -47
  207. package/lib/utilities/substitutions.js +19 -19
  208. package/lib/utilities/type.js +5 -5
  209. package/lib/utilities/unification.js +196 -426
  210. package/lib/utilities/validation.js +72 -72
  211. package/package.json +1 -1
@@ -8,1058 +8,563 @@ Object.defineProperty(exports, "default", {
8
8
  return NominalFileContext;
9
9
  }
10
10
  });
11
- var _occamlanguages = require("occam-languages");
12
- var _necessary = require("necessary");
13
- var _occamnominal = require("occam-nominal");
14
- var _elements = /*#__PURE__*/ _interop_require_default(require("../../elements"));
15
- var _lexer = /*#__PURE__*/ _interop_require_default(require("../../nominal/lexer"));
16
- var _parser = /*#__PURE__*/ _interop_require_default(require("../../nominal/parser"));
17
- var _verify = require("../../process/verify");
18
- var _type = require("../../utilities/type");
19
- var _metaTypes = require("../../metaTypes");
20
- var _json = require("../../utilities/json");
21
- function _array_like_to_array(arr, len) {
22
- if (len == null || len > arr.length) len = arr.length;
23
- for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
24
- return arr2;
25
- }
26
- function _array_without_holes(arr) {
27
- if (Array.isArray(arr)) return _array_like_to_array(arr);
11
+ const _occamlanguages = require("occam-languages");
12
+ const _necessary = require("necessary");
13
+ const _occamnominal = require("occam-nominal");
14
+ const _elements = /*#__PURE__*/ _interop_require_default(require("../../elements"));
15
+ const _lexer = /*#__PURE__*/ _interop_require_default(require("../../nominal/lexer"));
16
+ const _parser = /*#__PURE__*/ _interop_require_default(require("../../nominal/parser"));
17
+ const _verify = require("../../process/verify");
18
+ const _type = require("../../utilities/type");
19
+ const _metaTypes = require("../../metaTypes");
20
+ const _json = require("../../utilities/json");
21
+ function _interop_require_default(obj) {
22
+ return obj && obj.__esModule ? obj : {
23
+ default: obj
24
+ };
28
25
  }
29
- function _assert_this_initialized(self) {
30
- if (self === void 0) {
31
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
26
+ const { push, filter } = _necessary.arrayUtilities, { nominalLexerFromCombinedCustomGrammar } = _occamnominal.lexersUtilities, { nominalParserFromCombinedCustomGrammar } = _occamnominal.parsersUtilities;
27
+ class NominalFileContext extends _occamlanguages.FileContext {
28
+ constructor(context, filePath, tokens, node, lexer, parser, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables){
29
+ super(context, filePath, tokens, node);
30
+ this.lexer = lexer;
31
+ this.parser = parser;
32
+ this.context = context;
33
+ this.filePath = filePath;
34
+ this.tokens = tokens;
35
+ this.node = node;
36
+ this.types = types;
37
+ this.rules = rules;
38
+ this.axioms = axioms;
39
+ this.lemmas = lemmas;
40
+ this.theorems = theorems;
41
+ this.variables = variables;
42
+ this.metaLemmas = metaLemmas;
43
+ this.conjectures = conjectures;
44
+ this.combinators = combinators;
45
+ this.typePrefixes = typePrefixes;
46
+ this.constructors = constructors;
47
+ this.metatheorems = metatheorems;
48
+ this.metavariables = metavariables;
32
49
  }
33
- return self;
34
- }
35
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
36
- try {
37
- var info = gen[key](arg);
38
- var value = info.value;
39
- } catch (error) {
40
- reject(error);
41
- return;
42
- }
43
- if (info.done) {
44
- resolve(value);
45
- } else {
46
- Promise.resolve(value).then(_next, _throw);
50
+ getLexer() {
51
+ return this.lexer;
47
52
  }
48
- }
49
- function _async_to_generator(fn) {
50
- return function() {
51
- var self = this, args = arguments;
52
- return new Promise(function(resolve, reject) {
53
- var gen = fn.apply(self, args);
54
- function _next(value) {
55
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
53
+ getParser() {
54
+ return this.parser;
55
+ }
56
+ getJudgements() {
57
+ const judgements = [];
58
+ return judgements;
59
+ }
60
+ getEquivalences() {
61
+ const { Equivalences } = _elements.default, context = this, equivalences = Equivalences.fromNothing(context);
62
+ return equivalences;
63
+ }
64
+ getSubproofOrProofAssertions() {
65
+ const subproofOrProofAssertions = [];
66
+ return subproofOrProofAssertions;
67
+ }
68
+ getLabels(includeRelease = true) {
69
+ const labels = [];
70
+ if (includeRelease) {
71
+ const releaseContextLabels = this.context.getLabels();
72
+ push(labels, releaseContextLabels);
73
+ } else {
74
+ this.rules.forEach((rule)=>{
75
+ const ruleLabels = rule.getLabels();
76
+ push(labels, ruleLabels);
77
+ });
78
+ this.axioms.forEach((axiom)=>{
79
+ const axiomLabels = axiom.getLabels();
80
+ push(labels, axiomLabels);
81
+ });
82
+ this.lemmas.forEach((lemma)=>{
83
+ const lemmaLabels = lemma.getLabels();
84
+ push(labels, lemmaLabels);
85
+ });
86
+ this.theorems.forEach((theorem)=>{
87
+ const theoremLabels = theorem.getLabels();
88
+ push(labels, theoremLabels);
89
+ });
90
+ this.conjectures.forEach((conjecture)=>{
91
+ const conjectureLabels = conjecture.getLabels();
92
+ push(labels, conjectureLabels);
93
+ });
94
+ this.metatheorems.forEach((metatheorem)=>{
95
+ const metatheoremLabel = metatheorem.getLabel();
96
+ labels.push(metatheoremLabel);
97
+ });
98
+ }
99
+ return labels;
100
+ }
101
+ getTypes(includeRelease = true, includeDependencies = true) {
102
+ const types = includeRelease ? this.context.getTypes(includeDependencies) : this.types;
103
+ return types;
104
+ }
105
+ getRules(includeRelease = true) {
106
+ const rules = includeRelease ? this.context.getRules() : this.rules;
107
+ return rules;
108
+ }
109
+ getAxioms(includeRelease = true) {
110
+ const axioms = includeRelease ? this.context.getAxioms() : this.axioms;
111
+ return axioms;
112
+ }
113
+ getLemmas(includeRelease = true) {
114
+ const lemmas = includeRelease ? this.context.getLemmas() : this.lemmas;
115
+ return lemmas;
116
+ }
117
+ getTheorems(includeRelease = true) {
118
+ const theorems = includeRelease ? this.context.getTheorems() : this.theorems;
119
+ return theorems;
120
+ }
121
+ getVariables(includeRelease = true) {
122
+ return this.variables;
123
+ }
124
+ getProcedures(includeRelease = true) {
125
+ const procedures = includeRelease ? this.context.getProcedures() : null; ///
126
+ return procedures;
127
+ }
128
+ getMetaLemmas(includeRelease = true) {
129
+ const metaLemmas = includeRelease ? this.context.getMetaLemmas() : this.metaLemmas;
130
+ return metaLemmas;
131
+ }
132
+ getConjectures(includeRelease = true) {
133
+ const conjectures = includeRelease ? this.context.getConjectures() : this.conjectures;
134
+ return conjectures;
135
+ }
136
+ getCombinators(includeRelease = true) {
137
+ const combinators = includeRelease ? this.context.getCombinators() : this.combinators;
138
+ return combinators;
139
+ }
140
+ getTypePrefixes(includeRelease = true) {
141
+ const typePrefixes = includeRelease ? this.context.getTypePrefixes() : this.typePrefixes;
142
+ return typePrefixes;
143
+ }
144
+ getConstructors(includeRelease = true) {
145
+ const constructors = includeRelease ? this.context.getConstructors() : this.constructors;
146
+ return constructors;
147
+ }
148
+ getMetatheorems(includeRelease = true) {
149
+ const metatheorems = includeRelease ? this.context.getMetatheorems() : this.metatheorems;
150
+ return metatheorems;
151
+ }
152
+ getMetavariables(includeRelease = true) {
153
+ return this.metavariables;
154
+ }
155
+ addType(type) {
156
+ this.types.push(type);
157
+ const filePath = this.getFilePath(), typeString = type.getString();
158
+ this.trace(`Added the '${typeString}' type to the '${filePath}' file context.`);
159
+ }
160
+ addRule(rule) {
161
+ this.rules.push(rule);
162
+ const filePath = this.getFilePath(), ruleString = rule.getString();
163
+ this.trace(`Added the '${ruleString}' rule to the '${filePath}' file context.`);
164
+ }
165
+ addAxiom(axiom) {
166
+ this.axioms.push(axiom);
167
+ const filePath = this.getFilePath(), axiomString = axiom.getString();
168
+ this.trace(`Added the '${axiomString}' axiom to the '${filePath}' file context.`);
169
+ }
170
+ addLemma(lemma) {
171
+ this.lemmas.push(lemma);
172
+ const filePath = this.getFilePath(), lemmaString = lemma.getString();
173
+ this.trace(`Added the '${lemmaString}' lemma to the '${filePath}' file context.`);
174
+ }
175
+ addTheorem(theorem) {
176
+ this.theorems.push(theorem);
177
+ const filePath = this.getFilePath(), theoremString = theorem.getString();
178
+ this.trace(`Added the '${theoremString}' theorem to the '${filePath}' file context.`);
179
+ }
180
+ addVariable(variable) {
181
+ this.variables.push(variable);
182
+ const filePath = this.getFilePath(), variableString = variable.getString();
183
+ this.trace(`Added the '${variableString}' variable to the '${filePath}' file context.`);
184
+ }
185
+ addMetaLemma(metaLemma) {
186
+ this.metaLemmas.push(metaLemma);
187
+ const filePath = this.getFilePath(), metaLemmaString = metaLemma.getString();
188
+ this.trace(`Added the '${metaLemmaString}' meta-lemma to the '${filePath}' file context.`);
189
+ }
190
+ addConjecture(conjecture) {
191
+ this.conjectures.push(conjecture);
192
+ const filePath = this.getFilePath(), ocnjectureString = ocnjecture.getString();
193
+ this.trace(`Added the '${ocnjectureString}' ocnjecture to the '${filePath}' file context.`);
194
+ }
195
+ addCombinator(combinator) {
196
+ this.combinators.push(combinator);
197
+ const filePath = this.getFilePath(), combinatorString = combinator.getString();
198
+ this.trace(`Added the '${combinatorString}' combinator to the '${filePath}' file context.`);
199
+ }
200
+ addTypePrefix(typePrefix) {
201
+ this.typePrefixes.push(typePrefix);
202
+ const filePath = this.getFilePath(), typePrefixString = typePrefix.getString();
203
+ this.trace(`Added the '${typePrefixString}' type-prefix to the '${filePath}' file context.`);
204
+ }
205
+ addConstructor(constructor) {
206
+ this.constructors.push(constructor);
207
+ const filePath = this.getFilePath(), constructorString = constructor.getString();
208
+ this.trace(`Added the '${constructorString}' constructor to the '${filePath}' file context.`);
209
+ }
210
+ addMetatheorem(metatheorem) {
211
+ this.metatheorems.push(metatheorem);
212
+ const filePath = this.getFilePath(), metatheoremString = metatheorem.getString();
213
+ this.trace(`Added the '${metatheoremString}' metatheorem to the '${filePath}' file context.`);
214
+ }
215
+ addMetavariable(metavariable) {
216
+ this.metavariables.push(metavariable);
217
+ const filePath = this.getFilePath(), metavariableString = metavariable.getString();
218
+ this.trace(`Added the '${metavariableString}' metavariable to the '${filePath}' file context.`);
219
+ }
220
+ findMetavariable(metavariable) {
221
+ const metavariables = this.getMetavariables(), specificMetavariable = metavariable; ///
222
+ metavariable = metavariables.find((metavariable)=>{
223
+ const context = this, generalMetavariable = metavariable, metavariableUnifies = generalMetavariable.unifyMetavariable(specificMetavariable, context);
224
+ if (metavariableUnifies) {
225
+ return true;
226
+ }
227
+ }) || null;
228
+ return metavariable;
229
+ }
230
+ findLabelByMetavariable(metavariable) {
231
+ const labels = this.getLabels(), label = labels.find((label)=>{
232
+ const labelMetavariableComparesToMetavariable = label.compareMetavariable(metavariable);
233
+ if (labelMetavariableComparesToMetavariable) {
234
+ return true;
235
+ }
236
+ }) || null;
237
+ return label;
238
+ }
239
+ findMetaTypeByMetaTypeName(metaTypeName) {
240
+ const metaType = (0, _metaTypes.findMetaTypeByMetaTypeName)(metaTypeName);
241
+ return metaType;
242
+ }
243
+ findRuleByReference(reference) {
244
+ const rules = this.getRules(), metavariableName = reference.getMetavariableName(), rule = rules.find((rule)=>{
245
+ const ruleComparesToMetavariableName = rule.compareMetavariableName(metavariableName);
246
+ if (ruleComparesToMetavariableName) {
247
+ return true;
248
+ }
249
+ }) || null;
250
+ return rule;
251
+ }
252
+ findAxiomByReference(reference) {
253
+ const axioms = this.getAxioms(), metavariableName = reference.getMetavariableName(), axiom = axioms.find((axiom)=>{
254
+ const axiomComparesToMetavariableName = axiom.compareMetavariableName(metavariableName);
255
+ if (axiomComparesToMetavariableName) {
256
+ return true;
257
+ }
258
+ }) || null;
259
+ return axiom;
260
+ }
261
+ findLemmaByReference(reference) {
262
+ const lemmas = this.getLemmas(), metavariableName = reference.getMetavariableName(), lemma = lemmas.find((lemma)=>{
263
+ const lemmaComparesToMetavariableName = lemma.compareMetavariableName(metavariableName);
264
+ if (lemmaComparesToMetavariableName) {
265
+ return true;
266
+ }
267
+ }) || null;
268
+ return lemma;
269
+ }
270
+ findTheoremByReference(reference) {
271
+ const theorems = this.getTheorems(), metavariableName = reference.getMetavariableName(), theorem = theorems.find((theorem)=>{
272
+ const theoremComparesToMetavariableName = theorem.compareMetavariableName(metavariableName);
273
+ if (theoremComparesToMetavariableName) {
274
+ return true;
275
+ }
276
+ }) || null;
277
+ return theorem;
278
+ }
279
+ findMetaLemmaByReference(reference) {
280
+ const metaLemmas = this.getMetaLemmas(), metaLemma = metaLemmas.find((metaLemma)=>{
281
+ const metaLemmaComparesToReference = metaLemma.compareReference(reference);
282
+ if (metaLemmaComparesToReference) {
283
+ return true;
284
+ }
285
+ }) || null;
286
+ return metaLemma;
287
+ }
288
+ findConjectureByReference(reference) {
289
+ const conjectures = this.getConjectures(), metavariableName = reference.getMetavariableName(), conjecture = conjectures.find((conjecture)=>{
290
+ const conjectureComparesToMetavariableName = conjecture.compareMetavariableName(metavariableName);
291
+ if (conjectureComparesToMetavariableName) {
292
+ return true;
293
+ }
294
+ }) || null;
295
+ return conjecture;
296
+ }
297
+ findMetaLemmasByReference(reference) {
298
+ const metaLemmas = this.getMetaLemmas();
299
+ filter(metaLemmas, (metaLemma)=>{
300
+ const context = this, topLevelMetaAssertion = metaLemma, topLevelMetaAssertionUnifies = reference.unifyTopLevelMetaAssertion(topLevelMetaAssertion, context);
301
+ if (topLevelMetaAssertionUnifies) {
302
+ return true;
56
303
  }
57
- function _throw(err) {
58
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
304
+ });
305
+ return metaLemmas;
306
+ }
307
+ findMetatheoremByReference(reference) {
308
+ const metatheorems = this.getMetatheorems(), metatheorem = metatheorems.find((metatheorem)=>{
309
+ const metatheoremComparesToReference = metatheorem.compareReference(reference);
310
+ if (metatheoremComparesToReference) {
311
+ return true;
312
+ }
313
+ }) || null;
314
+ return metatheorem;
315
+ }
316
+ findMetatheoremsByReference(reference) {
317
+ const metatheorems = this.getMetatheorems();
318
+ filter(metatheorems, (metatheorem)=>{
319
+ const context = this, topLevelMetaAssertion = metatheorem, topLevelMetaAssertionUnifies = reference.unifyTopLevelMetaAssertion(topLevelMetaAssertion, context);
320
+ if (topLevelMetaAssertionUnifies) {
321
+ return true;
59
322
  }
60
- _next(undefined);
61
323
  });
62
- };
63
- }
64
- function _call_super(_this, derived, args) {
65
- derived = _get_prototype_of(derived);
66
- return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
67
- }
68
- function _class_call_check(instance, Constructor) {
69
- if (!(instance instanceof Constructor)) {
70
- throw new TypeError("Cannot call a class as a function");
324
+ return metatheorems;
71
325
  }
72
- }
73
- function _defineProperties(target, props) {
74
- for(var i = 0; i < props.length; i++){
75
- var descriptor = props[i];
76
- descriptor.enumerable = descriptor.enumerable || false;
77
- descriptor.configurable = true;
78
- if ("value" in descriptor) descriptor.writable = true;
79
- Object.defineProperty(target, descriptor.key, descriptor);
326
+ findTopLevelAssertionByReference(reference) {
327
+ const axiom = this.findAxiomByReference(reference), lemma = this.findLemmaByReference(reference), theorem = this.findTheoremByReference(reference), conjecture = this.findConjectureByReference(reference), topLevelAssertion = axiom || lemma || theorem || conjecture;
328
+ return topLevelAssertion;
80
329
  }
81
- }
82
- function _create_class(Constructor, protoProps, staticProps) {
83
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
84
- if (staticProps) _defineProperties(Constructor, staticProps);
85
- return Constructor;
86
- }
87
- function _get_prototype_of(o) {
88
- _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {
89
- return o.__proto__ || Object.getPrototypeOf(o);
90
- };
91
- return _get_prototype_of(o);
92
- }
93
- function _inherits(subClass, superClass) {
94
- if (typeof superClass !== "function" && superClass !== null) {
95
- throw new TypeError("Super expression must either be null or a function");
96
- }
97
- subClass.prototype = Object.create(superClass && superClass.prototype, {
98
- constructor: {
99
- value: subClass,
100
- writable: true,
101
- configurable: true
102
- }
103
- });
104
- if (superClass) _set_prototype_of(subClass, superClass);
105
- }
106
- function _interop_require_default(obj) {
107
- return obj && obj.__esModule ? obj : {
108
- default: obj
109
- };
110
- }
111
- function _iterable_to_array(iter) {
112
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
113
- }
114
- function _non_iterable_spread() {
115
- throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
116
- }
117
- function _possible_constructor_return(self, call) {
118
- if (call && (_type_of(call) === "object" || typeof call === "function")) {
119
- return call;
330
+ findTopLevelMetaAssertionByReference(reference) {
331
+ const metaLemma = this.findMetaLemmaByReference(reference), metatheorem = this.findMetatheoremByReference(reference), topLevelMetaAssertion = metaLemma || metatheorem; ///
332
+ return topLevelMetaAssertion;
120
333
  }
121
- return _assert_this_initialized(self);
122
- }
123
- function _set_prototype_of(o, p) {
124
- _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {
125
- o.__proto__ = p;
126
- return o;
127
- };
128
- return _set_prototype_of(o, p);
129
- }
130
- function _to_consumable_array(arr) {
131
- return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
132
- }
133
- function _type_of(obj) {
134
- "@swc/helpers - typeof";
135
- return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
136
- }
137
- function _unsupported_iterable_to_array(o, minLen) {
138
- if (!o) return;
139
- if (typeof o === "string") return _array_like_to_array(o, minLen);
140
- var n = Object.prototype.toString.call(o).slice(8, -1);
141
- if (n === "Object" && o.constructor) n = o.constructor.name;
142
- if (n === "Map" || n === "Set") return Array.from(n);
143
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
144
- }
145
- function _is_native_reflect_construct() {
146
- try {
147
- var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
148
- } catch (_) {}
149
- return (_is_native_reflect_construct = function() {
150
- return !!result;
151
- })();
152
- }
153
- function _ts_generator(thisArg, body) {
154
- var f, y, t, _ = {
155
- label: 0,
156
- sent: function() {
157
- if (t[0] & 1) throw t[1];
158
- return t[1];
159
- },
160
- trys: [],
161
- ops: []
162
- }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
163
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
164
- return this;
165
- }), g;
166
- function verb(n) {
167
- return function(v) {
168
- return step([
169
- n,
170
- v
171
- ]);
172
- };
334
+ findTopLevelMetaAssertionsByReference(reference) {
335
+ const metaLemmas = this.findMetaLemmasByReference(reference), metatheorems = this.findMetatheoremsByReference(reference), topLevelMetaAssertions = [
336
+ ...metaLemmas,
337
+ ...metatheorems
338
+ ];
339
+ return topLevelMetaAssertions;
340
+ }
341
+ findTypeByTypeName(typeName, includeRelease = true, includeDependencies = true) {
342
+ let types = this.getTypes(includeRelease, includeDependencies);
343
+ const baseType = (0, _type.baseTypeFromNothing)();
344
+ types = [
345
+ ...types,
346
+ baseType
347
+ ];
348
+ const type = types.find((type)=>{
349
+ const typeComparesToTypeName = type.compareTypeName(typeName);
350
+ if (typeComparesToTypeName) {
351
+ return true;
352
+ }
353
+ }) || null;
354
+ return type;
355
+ }
356
+ findTypeByNominalTypeName(nominalTypeName) {
357
+ let types = this.getTypes();
358
+ const baseType = (0, _type.baseTypeFromNothing)();
359
+ types = [
360
+ ...types,
361
+ baseType
362
+ ];
363
+ const type = types.find((type)=>{
364
+ const typeComparesToNominalTypeName = type.compareNominalTypeName(nominalTypeName);
365
+ if (typeComparesToNominalTypeName) {
366
+ return true;
367
+ }
368
+ }) || null;
369
+ return type;
370
+ }
371
+ findTypeByPrefixedTypeName(prefixedTypeName) {
372
+ let types = this.getTypes();
373
+ const baseType = (0, _type.baseTypeFromNothing)();
374
+ types = [
375
+ ...types,
376
+ baseType
377
+ ];
378
+ const type = types.find((type)=>{
379
+ const typeComparesToPrefixedTypeName = type.comparePrefixedTypeName(prefixedTypeName);
380
+ if (typeComparesToPrefixedTypeName) {
381
+ return true;
382
+ }
383
+ }) || null;
384
+ return type;
385
+ }
386
+ findTypePrefixByTypePrefixName(typePrefixName) {
387
+ const typePrefixes = this.getTypePrefixes(), typePrefix = typePrefixes.find((typePrefix)=>{
388
+ const typePrefixComparesToTypePrefixName = typePrefix.compareTypePrefixName(typePrefixName);
389
+ if (typePrefixComparesToTypePrefixName) {
390
+ return true;
391
+ }
392
+ }) || null;
393
+ return typePrefix;
394
+ }
395
+ findLabelByMetavariableName(metavariableName) {
396
+ const labels = this.getLabels(), label = labels.find((label)=>{
397
+ const labelComparesToMetavariableName = label.compareMetavariableName(metavariableName);
398
+ if (labelComparesToMetavariableName) {
399
+ return true;
400
+ }
401
+ }) || null;
402
+ return label;
403
+ }
404
+ findJudgementByMetavariableName(metavariableName) {
405
+ const judgements = this.getJudgements(), judgement = judgements.find((judgement)=>{
406
+ const judgementMetavariableComparesToMetavariable = judgement.compareMetavariableName(metavariableName);
407
+ if (judgementMetavariableComparesToMetavariable) {
408
+ return true;
409
+ }
410
+ }) || null;
411
+ return judgement;
412
+ }
413
+ findVariableByVariableIdentifier(variableIdentifier) {
414
+ const variables = this.getVariables(), variable = variables.find((variable)=>{
415
+ const variableComparesToVariableIdentifier = variable.compareVariableIdentifier(variableIdentifier);
416
+ if (variableComparesToVariableIdentifier) {
417
+ return true;
418
+ }
419
+ }) || null;
420
+ return variable;
173
421
  }
174
- function step(op) {
175
- if (f) throw new TypeError("Generator is already executing.");
176
- while(g && (g = 0, op[0] && (_ = 0)), _)try {
177
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
178
- if (y = 0, t) op = [
179
- op[0] & 2,
180
- t.value
181
- ];
182
- switch(op[0]){
183
- case 0:
184
- case 1:
185
- t = op;
186
- break;
187
- case 4:
188
- _.label++;
189
- return {
190
- value: op[1],
191
- done: false
192
- };
193
- case 5:
194
- _.label++;
195
- y = op[1];
196
- op = [
197
- 0
198
- ];
199
- continue;
200
- case 7:
201
- op = _.ops.pop();
202
- _.trys.pop();
203
- continue;
204
- default:
205
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
206
- _ = 0;
207
- continue;
208
- }
209
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
210
- _.label = op[1];
211
- break;
212
- }
213
- if (op[0] === 6 && _.label < t[1]) {
214
- _.label = t[1];
215
- t = op;
216
- break;
217
- }
218
- if (t && _.label < t[2]) {
219
- _.label = t[2];
220
- _.ops.push(op);
221
- break;
222
- }
223
- if (t[2]) _.ops.pop();
224
- _.trys.pop();
225
- continue;
422
+ findMetavariableByMetavariableName(metavariableName) {
423
+ const metavariables = this.getMetavariables(), metavariable = metavariables.find((metavariable)=>{
424
+ const metavariableComparesToMetavariableName = metavariable.compareMetavariableName(metavariableName);
425
+ if (metavariableComparesToMetavariableName) {
426
+ return true;
427
+ }
428
+ }) || null;
429
+ return metavariable;
430
+ }
431
+ findProcedureByProcedureName(procedureName) {
432
+ const procedures = this.getProcedures(), procedure = procedures.find((procedure)=>{
433
+ const procedureComparesToProcedureName = procedure.compareProcedureName(procedureName);
434
+ if (procedureComparesToProcedureName) {
435
+ return true;
436
+ }
437
+ }) || null;
438
+ return procedure;
439
+ }
440
+ isMetavariablePresent(metavariable) {
441
+ metavariable = this.findMetavariable(metavariable);
442
+ const metavariablePresent = metavariable !== null;
443
+ return metavariablePresent;
444
+ }
445
+ isLabelPresentByMetavariable(metavariable) {
446
+ const label = this.findLabelByMetavariable(metavariable), labelPresent = label !== null;
447
+ return labelPresent;
448
+ }
449
+ isLabelPresentByReference(reference) {
450
+ const labels = this.getLabels(), labelPresent = labels.some((label)=>{
451
+ const context = this, labelUnifies = reference.unifyLabel(label, context);
452
+ if (labelUnifies) {
453
+ return true;
226
454
  }
227
- op = body.call(thisArg, _);
228
- } catch (e) {
229
- op = [
230
- 6,
231
- e
232
- ];
233
- y = 0;
234
- } finally{
235
- f = t = 0;
236
- }
237
- if (op[0] & 5) throw op[1];
238
- return {
239
- value: op[0] ? op[1] : void 0,
240
- done: true
455
+ });
456
+ return labelPresent;
457
+ }
458
+ isMetavariablePresentByReference(reference) {
459
+ const metavariables = this.getMetavariables(), metavariablePresent = metavariables.some((metavariable)=>{
460
+ const context = this, metavariableUnifies = reference.unifyMetavariable(metavariable, context);
461
+ if (metavariableUnifies) {
462
+ return true;
463
+ }
464
+ });
465
+ return metavariablePresent;
466
+ }
467
+ isTopLevelMetaAssertionPresentByReference(reference) {
468
+ const topLevelMetaAssertion = this.findTopLevelMetaAssertionByReference(reference), topLevelMetaAssertionPresent = topLevelMetaAssertion !== null;
469
+ return topLevelMetaAssertionPresent;
470
+ }
471
+ isTypePresentByTypeName(typeName, includeRelease = true, includeDependencies = true) {
472
+ const type = this.findTypeByTypeName(typeName, includeRelease, includeDependencies), typePresent = type !== null;
473
+ return typePresent;
474
+ }
475
+ isTypePresentByNominalTypeName(nominalTypeName) {
476
+ const type = this.findTypeByNominalTypeName(nominalTypeName), typePresent = type !== null;
477
+ return typePresent;
478
+ }
479
+ isTypePresentByPrefixedTypeName(prefixedTypeName) {
480
+ const type = this.findTypeByPrefixedTypeName(prefixedTypeName), typePresent = type !== null;
481
+ return typePresent;
482
+ }
483
+ isLabelPresentByMetavariableName(metavariableName) {
484
+ const label = this.findLabelByMetavariableName(metavariableName), labelPresent = label !== null;
485
+ return labelPresent;
486
+ }
487
+ isTypePrefixPresentByTypePrefixName(typePrefixName) {
488
+ const typePrefix = this.findTypePrefixByTypePrefixName(typePrefixName), typePrefixPresent = typePrefix !== null;
489
+ return typePrefixPresent;
490
+ }
491
+ isVariablePresentByVariableIdentifier(variableIdentifier) {
492
+ const variable = this.findVariableByVariableIdentifier(variableIdentifier), variablePresent = variable !== null;
493
+ return variablePresent;
494
+ }
495
+ isMetavariablePresentByMetavariableName(metavariableName) {
496
+ const metavariable = this.findMetavariableByMetavariableName(metavariableName), metavariablePresent = metavariable !== null;
497
+ return metavariablePresent;
498
+ }
499
+ isProcedurePresentByProcedureName(procedureName) {
500
+ const procedure = this.findProcedureByProcedureName(procedureName), procedurePresent = procedure !== null;
501
+ return procedurePresent;
502
+ }
503
+ clear() {
504
+ this.types = [];
505
+ this.rules = [];
506
+ this.axioms = [];
507
+ this.lemmas = [];
508
+ this.theorems = [];
509
+ this.variables = [];
510
+ this.metaLemmas = [];
511
+ this.conjectures = [];
512
+ this.combinators = [];
513
+ this.typePrefixes = [];
514
+ this.constructors = [];
515
+ this.metatheorems = [];
516
+ this.metavariables = [];
517
+ }
518
+ complete() {
519
+ ///
520
+ }
521
+ async verifyFile() {
522
+ const node = this.getNode(), context = this, fileNode = node, fileVerifies = await (0, _verify.verifyFile)(fileNode, context);
523
+ return fileVerifies;
524
+ }
525
+ initialise(json) {
526
+ const fileContext = this; ///
527
+ this.types = [];
528
+ (0, _json.typesFromJSON)(json, this.types, fileContext);
529
+ this.lemmas = (0, _json.lemmasFromNothing)();
530
+ this.metaLemmas = (0, _json.metaLemmasFromNothing)();
531
+ this.metavariables = (0, _json.metavariablesFromJSON)(json, fileContext);
532
+ this.variables = (0, _json.variablesFromJSON)(json, fileContext);
533
+ this.rules = (0, _json.rulesFromJSON)(json, fileContext);
534
+ this.axioms = (0, _json.axiomsFromJSON)(json, fileContext);
535
+ this.theorems = (0, _json.theoremsFromJSON)(json, fileContext);
536
+ this.conjectures = (0, _json.conjecturesFromJSON)(json, fileContext);
537
+ this.combinators = (0, _json.combinatorsFromJSON)(json, fileContext);
538
+ this.typePrefixes = (0, _json.typePrefixesFromJSON)(json, fileContext);
539
+ this.constructors = (0, _json.constructorsFromJSON)(json, fileContext);
540
+ this.metatheorems = (0, _json.metatheoremsFromJSON)(json, fileContext);
541
+ }
542
+ toJSON() {
543
+ const 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 = {
544
+ filePath,
545
+ types,
546
+ rules,
547
+ axioms,
548
+ theorems,
549
+ variables,
550
+ conjectures,
551
+ combinators,
552
+ typePrefixes,
553
+ constructors,
554
+ metatheorems,
555
+ metavariables
241
556
  };
557
+ return json;
558
+ }
559
+ static fromFile(file, context) {
560
+ const releaseContext = context, combinedCustomGrammar = releaseContext.getCombinedCustomGrammar(), nominalLexer = nominalLexerFromCombinedCustomGrammar(_lexer.default, combinedCustomGrammar), nominalParser = nominalParserFromCombinedCustomGrammar(_parser.default, combinedCustomGrammar), lexer = nominalLexer, parser = nominalParser, types = [], rules = [], axioms = [], lemmas = [], theorems = [], variables = [], metaLemmas = [], conjectures = [], combinators = [], typePrefixes = [], constructors = [], metatheorems = [], metavariables = [], nominalFileContext = _occamlanguages.FileContext.fromFile(NominalFileContext, file, lexer, parser, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables, context);
561
+ return nominalFileContext;
562
+ }
563
+ static fromJSON(json, context) {
564
+ const releaseContext = context, combinedCustomGrammar = releaseContext.getCombinedCustomGrammar(), nominalLexer = nominalLexerFromCombinedCustomGrammar(_lexer.default, combinedCustomGrammar), nominalParser = nominalParserFromCombinedCustomGrammar(_parser.default, combinedCustomGrammar), lexer = nominalLexer, parser = nominalParser, 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, nominalFileContext = _occamlanguages.FileContext.fromJSON(NominalFileContext, json, lexer, parser, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables, context);
565
+ nominalFileContext.initialise(json);
566
+ return nominalFileContext;
242
567
  }
243
568
  }
244
- var push = _necessary.arrayUtilities.push, filter = _necessary.arrayUtilities.filter, nominalLexerFromCombinedCustomGrammar = _occamnominal.lexersUtilities.nominalLexerFromCombinedCustomGrammar, nominalParserFromCombinedCustomGrammar = _occamnominal.parsersUtilities.nominalParserFromCombinedCustomGrammar;
245
- var NominalFileContext = /*#__PURE__*/ function(FileContext) {
246
- _inherits(NominalFileContext, FileContext);
247
- function NominalFileContext(context, filePath, tokens, node, lexer, parser, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables) {
248
- _class_call_check(this, NominalFileContext);
249
- var _this;
250
- _this = _call_super(this, NominalFileContext, [
251
- context,
252
- filePath,
253
- tokens,
254
- node
255
- ]);
256
- _this.lexer = lexer;
257
- _this.parser = parser;
258
- _this.context = context;
259
- _this.filePath = filePath;
260
- _this.tokens = tokens;
261
- _this.node = node;
262
- _this.types = types;
263
- _this.rules = rules;
264
- _this.axioms = axioms;
265
- _this.lemmas = lemmas;
266
- _this.theorems = theorems;
267
- _this.variables = variables;
268
- _this.metaLemmas = metaLemmas;
269
- _this.conjectures = conjectures;
270
- _this.combinators = combinators;
271
- _this.typePrefixes = typePrefixes;
272
- _this.constructors = constructors;
273
- _this.metatheorems = metatheorems;
274
- _this.metavariables = metavariables;
275
- return _this;
276
- }
277
- _create_class(NominalFileContext, [
278
- {
279
- key: "getLexer",
280
- value: function getLexer() {
281
- return this.lexer;
282
- }
283
- },
284
- {
285
- key: "getParser",
286
- value: function getParser() {
287
- return this.parser;
288
- }
289
- },
290
- {
291
- key: "getJudgements",
292
- value: function getJudgements() {
293
- var judgements = [];
294
- return judgements;
295
- }
296
- },
297
- {
298
- key: "getEquivalences",
299
- value: function getEquivalences() {
300
- var Equivalences = _elements.default.Equivalences, context = this, equivalences = Equivalences.fromNothing(context);
301
- return equivalences;
302
- }
303
- },
304
- {
305
- key: "getSubproofOrProofAssertions",
306
- value: function getSubproofOrProofAssertions() {
307
- var subproofOrProofAssertions = [];
308
- return subproofOrProofAssertions;
309
- }
310
- },
311
- {
312
- key: "getLabels",
313
- value: function getLabels() {
314
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
315
- var labels = [];
316
- if (includeRelease) {
317
- var releaseContextLabels = this.context.getLabels();
318
- push(labels, releaseContextLabels);
319
- } else {
320
- this.rules.forEach(function(rule) {
321
- var ruleLabels = rule.getLabels();
322
- push(labels, ruleLabels);
323
- });
324
- this.axioms.forEach(function(axiom) {
325
- var axiomLabels = axiom.getLabels();
326
- push(labels, axiomLabels);
327
- });
328
- this.lemmas.forEach(function(lemma) {
329
- var lemmaLabels = lemma.getLabels();
330
- push(labels, lemmaLabels);
331
- });
332
- this.theorems.forEach(function(theorem) {
333
- var theoremLabels = theorem.getLabels();
334
- push(labels, theoremLabels);
335
- });
336
- this.conjectures.forEach(function(conjecture) {
337
- var conjectureLabels = conjecture.getLabels();
338
- push(labels, conjectureLabels);
339
- });
340
- this.metatheorems.forEach(function(metatheorem) {
341
- var metatheoremLabel = metatheorem.getLabel();
342
- labels.push(metatheoremLabel);
343
- });
344
- }
345
- return labels;
346
- }
347
- },
348
- {
349
- key: "getTypes",
350
- value: function getTypes() {
351
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true, includeDependencies = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
352
- var types = includeRelease ? this.context.getTypes(includeDependencies) : this.types;
353
- return types;
354
- }
355
- },
356
- {
357
- key: "getRules",
358
- value: function getRules() {
359
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
360
- var rules = includeRelease ? this.context.getRules() : this.rules;
361
- return rules;
362
- }
363
- },
364
- {
365
- key: "getAxioms",
366
- value: function getAxioms() {
367
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
368
- var axioms = includeRelease ? this.context.getAxioms() : this.axioms;
369
- return axioms;
370
- }
371
- },
372
- {
373
- key: "getLemmas",
374
- value: function getLemmas() {
375
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
376
- var lemmas = includeRelease ? this.context.getLemmas() : this.lemmas;
377
- return lemmas;
378
- }
379
- },
380
- {
381
- key: "getTheorems",
382
- value: function getTheorems() {
383
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
384
- var theorems = includeRelease ? this.context.getTheorems() : this.theorems;
385
- return theorems;
386
- }
387
- },
388
- {
389
- key: "getVariables",
390
- value: function getVariables() {
391
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
392
- return this.variables;
393
- }
394
- },
395
- {
396
- key: "getProcedures",
397
- value: function getProcedures() {
398
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
399
- var procedures = includeRelease ? this.context.getProcedures() : null; ///
400
- return procedures;
401
- }
402
- },
403
- {
404
- key: "getMetaLemmas",
405
- value: function getMetaLemmas() {
406
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
407
- var metaLemmas = includeRelease ? this.context.getMetaLemmas() : this.metaLemmas;
408
- return metaLemmas;
409
- }
410
- },
411
- {
412
- key: "getConjectures",
413
- value: function getConjectures() {
414
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
415
- var conjectures = includeRelease ? this.context.getConjectures() : this.conjectures;
416
- return conjectures;
417
- }
418
- },
419
- {
420
- key: "getCombinators",
421
- value: function getCombinators() {
422
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
423
- var combinators = includeRelease ? this.context.getCombinators() : this.combinators;
424
- return combinators;
425
- }
426
- },
427
- {
428
- key: "getTypePrefixes",
429
- value: function getTypePrefixes() {
430
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
431
- var typePrefixes = includeRelease ? this.context.getTypePrefixes() : this.typePrefixes;
432
- return typePrefixes;
433
- }
434
- },
435
- {
436
- key: "getConstructors",
437
- value: function getConstructors() {
438
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
439
- var constructors = includeRelease ? this.context.getConstructors() : this.constructors;
440
- return constructors;
441
- }
442
- },
443
- {
444
- key: "getMetatheorems",
445
- value: function getMetatheorems() {
446
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
447
- var metatheorems = includeRelease ? this.context.getMetatheorems() : this.metatheorems;
448
- return metatheorems;
449
- }
450
- },
451
- {
452
- key: "getMetavariables",
453
- value: function getMetavariables() {
454
- var includeRelease = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
455
- return this.metavariables;
456
- }
457
- },
458
- {
459
- key: "addType",
460
- value: function addType(type) {
461
- this.types.push(type);
462
- var filePath = this.getFilePath(), typeString = type.getString();
463
- this.trace("Added the '".concat(typeString, "' type to the '").concat(filePath, "' file context."));
464
- }
465
- },
466
- {
467
- key: "addRule",
468
- value: function addRule(rule) {
469
- this.rules.push(rule);
470
- var filePath = this.getFilePath(), ruleString = rule.getString();
471
- this.trace("Added the '".concat(ruleString, "' rule to the '").concat(filePath, "' file context."));
472
- }
473
- },
474
- {
475
- key: "addAxiom",
476
- value: function addAxiom(axiom) {
477
- this.axioms.push(axiom);
478
- var filePath = this.getFilePath(), axiomString = axiom.getString();
479
- this.trace("Added the '".concat(axiomString, "' axiom to the '").concat(filePath, "' file context."));
480
- }
481
- },
482
- {
483
- key: "addLemma",
484
- value: function addLemma(lemma) {
485
- this.lemmas.push(lemma);
486
- var filePath = this.getFilePath(), lemmaString = lemma.getString();
487
- this.trace("Added the '".concat(lemmaString, "' lemma to the '").concat(filePath, "' file context."));
488
- }
489
- },
490
- {
491
- key: "addTheorem",
492
- value: function addTheorem(theorem) {
493
- this.theorems.push(theorem);
494
- var filePath = this.getFilePath(), theoremString = theorem.getString();
495
- this.trace("Added the '".concat(theoremString, "' theorem to the '").concat(filePath, "' file context."));
496
- }
497
- },
498
- {
499
- key: "addVariable",
500
- value: function addVariable(variable) {
501
- this.variables.push(variable);
502
- var filePath = this.getFilePath(), variableString = variable.getString();
503
- this.trace("Added the '".concat(variableString, "' variable to the '").concat(filePath, "' file context."));
504
- }
505
- },
506
- {
507
- key: "addMetaLemma",
508
- value: function addMetaLemma(metaLemma) {
509
- this.metaLemmas.push(metaLemma);
510
- var filePath = this.getFilePath(), metaLemmaString = metaLemma.getString();
511
- this.trace("Added the '".concat(metaLemmaString, "' meta-lemma to the '").concat(filePath, "' file context."));
512
- }
513
- },
514
- {
515
- key: "addConjecture",
516
- value: function addConjecture(conjecture) {
517
- this.conjectures.push(conjecture);
518
- var filePath = this.getFilePath(), ocnjectureString = ocnjecture.getString();
519
- this.trace("Added the '".concat(ocnjectureString, "' ocnjecture to the '").concat(filePath, "' file context."));
520
- }
521
- },
522
- {
523
- key: "addCombinator",
524
- value: function addCombinator(combinator) {
525
- this.combinators.push(combinator);
526
- var filePath = this.getFilePath(), combinatorString = combinator.getString();
527
- this.trace("Added the '".concat(combinatorString, "' combinator to the '").concat(filePath, "' file context."));
528
- }
529
- },
530
- {
531
- key: "addTypePrefix",
532
- value: function addTypePrefix(typePrefix) {
533
- this.typePrefixes.push(typePrefix);
534
- var filePath = this.getFilePath(), typePrefixString = typePrefix.getString();
535
- this.trace("Added the '".concat(typePrefixString, "' type-prefix to the '").concat(filePath, "' file context."));
536
- }
537
- },
538
- {
539
- key: "addConstructor",
540
- value: function addConstructor(constructor) {
541
- this.constructors.push(constructor);
542
- var filePath = this.getFilePath(), constructorString = constructor.getString();
543
- this.trace("Added the '".concat(constructorString, "' constructor to the '").concat(filePath, "' file context."));
544
- }
545
- },
546
- {
547
- key: "addMetatheorem",
548
- value: function addMetatheorem(metatheorem) {
549
- this.metatheorems.push(metatheorem);
550
- var filePath = this.getFilePath(), metatheoremString = metatheorem.getString();
551
- this.trace("Added the '".concat(metatheoremString, "' metatheorem to the '").concat(filePath, "' file context."));
552
- }
553
- },
554
- {
555
- key: "addMetavariable",
556
- value: function addMetavariable(metavariable) {
557
- this.metavariables.push(metavariable);
558
- var filePath = this.getFilePath(), metavariableString = metavariable.getString();
559
- this.trace("Added the '".concat(metavariableString, "' metavariable to the '").concat(filePath, "' file context."));
560
- }
561
- },
562
- {
563
- key: "findMetavariable",
564
- value: function findMetavariable(metavariable) {
565
- var _this = this;
566
- var metavariables = this.getMetavariables(), specificMetavariable = metavariable; ///
567
- metavariable = metavariables.find(function(metavariable) {
568
- var context = _this, generalMetavariable = metavariable, metavariableUnifies = generalMetavariable.unifyMetavariable(specificMetavariable, context);
569
- if (metavariableUnifies) {
570
- return true;
571
- }
572
- }) || null;
573
- return metavariable;
574
- }
575
- },
576
- {
577
- key: "findLabelByMetavariable",
578
- value: function findLabelByMetavariable(metavariable) {
579
- var labels = this.getLabels(), label = labels.find(function(label) {
580
- var labelMetavariableComparesToMetavariable = label.compareMetavariable(metavariable);
581
- if (labelMetavariableComparesToMetavariable) {
582
- return true;
583
- }
584
- }) || null;
585
- return label;
586
- }
587
- },
588
- {
589
- key: "findMetaTypeByMetaTypeName",
590
- value: function findMetaTypeByMetaTypeName(metaTypeName) {
591
- var metaType = (0, _metaTypes.findMetaTypeByMetaTypeName)(metaTypeName);
592
- return metaType;
593
- }
594
- },
595
- {
596
- key: "findRuleByReference",
597
- value: function findRuleByReference(reference) {
598
- var rules = this.getRules(), metavariableName = reference.getMetavariableName(), rule = rules.find(function(rule) {
599
- var ruleComparesToMetavariableName = rule.compareMetavariableName(metavariableName);
600
- if (ruleComparesToMetavariableName) {
601
- return true;
602
- }
603
- }) || null;
604
- return rule;
605
- }
606
- },
607
- {
608
- key: "findAxiomByReference",
609
- value: function findAxiomByReference(reference) {
610
- var axioms = this.getAxioms(), metavariableName = reference.getMetavariableName(), axiom = axioms.find(function(axiom) {
611
- var axiomComparesToMetavariableName = axiom.compareMetavariableName(metavariableName);
612
- if (axiomComparesToMetavariableName) {
613
- return true;
614
- }
615
- }) || null;
616
- return axiom;
617
- }
618
- },
619
- {
620
- key: "findLemmaByReference",
621
- value: function findLemmaByReference(reference) {
622
- var lemmas = this.getLemmas(), metavariableName = reference.getMetavariableName(), lemma = lemmas.find(function(lemma) {
623
- var lemmaComparesToMetavariableName = lemma.compareMetavariableName(metavariableName);
624
- if (lemmaComparesToMetavariableName) {
625
- return true;
626
- }
627
- }) || null;
628
- return lemma;
629
- }
630
- },
631
- {
632
- key: "findTheoremByReference",
633
- value: function findTheoremByReference(reference) {
634
- var theorems = this.getTheorems(), metavariableName = reference.getMetavariableName(), theorem = theorems.find(function(theorem) {
635
- var theoremComparesToMetavariableName = theorem.compareMetavariableName(metavariableName);
636
- if (theoremComparesToMetavariableName) {
637
- return true;
638
- }
639
- }) || null;
640
- return theorem;
641
- }
642
- },
643
- {
644
- key: "findMetaLemmaByReference",
645
- value: function findMetaLemmaByReference(reference) {
646
- var metaLemmas = this.getMetaLemmas(), metaLemma = metaLemmas.find(function(metaLemma) {
647
- var metaLemmaComparesToReference = metaLemma.compareReference(reference);
648
- if (metaLemmaComparesToReference) {
649
- return true;
650
- }
651
- }) || null;
652
- return metaLemma;
653
- }
654
- },
655
- {
656
- key: "findConjectureByReference",
657
- value: function findConjectureByReference(reference) {
658
- var conjectures = this.getConjectures(), metavariableName = reference.getMetavariableName(), conjecture = conjectures.find(function(conjecture) {
659
- var conjectureComparesToMetavariableName = conjecture.compareMetavariableName(metavariableName);
660
- if (conjectureComparesToMetavariableName) {
661
- return true;
662
- }
663
- }) || null;
664
- return conjecture;
665
- }
666
- },
667
- {
668
- key: "findMetaLemmasByReference",
669
- value: function findMetaLemmasByReference(reference) {
670
- var _this = this;
671
- var metaLemmas = this.getMetaLemmas();
672
- filter(metaLemmas, function(metaLemma) {
673
- var context = _this, topLevelMetaAssertion = metaLemma, topLevelMetaAssertionUnifies = reference.unifyTopLevelMetaAssertion(topLevelMetaAssertion, context);
674
- if (topLevelMetaAssertionUnifies) {
675
- return true;
676
- }
677
- });
678
- return metaLemmas;
679
- }
680
- },
681
- {
682
- key: "findMetatheoremByReference",
683
- value: function findMetatheoremByReference(reference) {
684
- var metatheorems = this.getMetatheorems(), metatheorem = metatheorems.find(function(metatheorem) {
685
- var metatheoremComparesToReference = metatheorem.compareReference(reference);
686
- if (metatheoremComparesToReference) {
687
- return true;
688
- }
689
- }) || null;
690
- return metatheorem;
691
- }
692
- },
693
- {
694
- key: "findMetatheoremsByReference",
695
- value: function findMetatheoremsByReference(reference) {
696
- var _this = this;
697
- var metatheorems = this.getMetatheorems();
698
- filter(metatheorems, function(metatheorem) {
699
- var context = _this, topLevelMetaAssertion = metatheorem, topLevelMetaAssertionUnifies = reference.unifyTopLevelMetaAssertion(topLevelMetaAssertion, context);
700
- if (topLevelMetaAssertionUnifies) {
701
- return true;
702
- }
703
- });
704
- return metatheorems;
705
- }
706
- },
707
- {
708
- key: "findTopLevelAssertionByReference",
709
- value: function findTopLevelAssertionByReference(reference) {
710
- var axiom = this.findAxiomByReference(reference), lemma = this.findLemmaByReference(reference), theorem = this.findTheoremByReference(reference), conjecture = this.findConjectureByReference(reference), topLevelAssertion = axiom || lemma || theorem || conjecture;
711
- return topLevelAssertion;
712
- }
713
- },
714
- {
715
- key: "findTopLevelMetaAssertionByReference",
716
- value: function findTopLevelMetaAssertionByReference(reference) {
717
- var metaLemma = this.findMetaLemmaByReference(reference), metatheorem = this.findMetatheoremByReference(reference), topLevelMetaAssertion = metaLemma || metatheorem; ///
718
- return topLevelMetaAssertion;
719
- }
720
- },
721
- {
722
- key: "findTopLevelMetaAssertionsByReference",
723
- value: function findTopLevelMetaAssertionsByReference(reference) {
724
- var metaLemmas = this.findMetaLemmasByReference(reference), metatheorems = this.findMetatheoremsByReference(reference), topLevelMetaAssertions = _to_consumable_array(metaLemmas).concat(_to_consumable_array(metatheorems));
725
- return topLevelMetaAssertions;
726
- }
727
- },
728
- {
729
- key: "findTypeByTypeName",
730
- value: function findTypeByTypeName(typeName) {
731
- var includeRelease = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true, includeDependencies = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
732
- var types = this.getTypes(includeRelease, includeDependencies);
733
- var baseType = (0, _type.baseTypeFromNothing)();
734
- types = _to_consumable_array(types).concat([
735
- baseType
736
- ]);
737
- var type = types.find(function(type) {
738
- var typeComparesToTypeName = type.compareTypeName(typeName);
739
- if (typeComparesToTypeName) {
740
- return true;
741
- }
742
- }) || null;
743
- return type;
744
- }
745
- },
746
- {
747
- key: "findTypeByNominalTypeName",
748
- value: function findTypeByNominalTypeName(nominalTypeName) {
749
- var types = this.getTypes();
750
- var baseType = (0, _type.baseTypeFromNothing)();
751
- types = _to_consumable_array(types).concat([
752
- baseType
753
- ]);
754
- var type = types.find(function(type) {
755
- var typeComparesToNominalTypeName = type.compareNominalTypeName(nominalTypeName);
756
- if (typeComparesToNominalTypeName) {
757
- return true;
758
- }
759
- }) || null;
760
- return type;
761
- }
762
- },
763
- {
764
- key: "findTypeByPrefixedTypeName",
765
- value: function findTypeByPrefixedTypeName(prefixedTypeName) {
766
- var types = this.getTypes();
767
- var baseType = (0, _type.baseTypeFromNothing)();
768
- types = _to_consumable_array(types).concat([
769
- baseType
770
- ]);
771
- var type = types.find(function(type) {
772
- var typeComparesToPrefixedTypeName = type.comparePrefixedTypeName(prefixedTypeName);
773
- if (typeComparesToPrefixedTypeName) {
774
- return true;
775
- }
776
- }) || null;
777
- return type;
778
- }
779
- },
780
- {
781
- key: "findTypePrefixByTypePrefixName",
782
- value: function findTypePrefixByTypePrefixName(typePrefixName) {
783
- var typePrefixes = this.getTypePrefixes(), typePrefix = typePrefixes.find(function(typePrefix) {
784
- var typePrefixComparesToTypePrefixName = typePrefix.compareTypePrefixName(typePrefixName);
785
- if (typePrefixComparesToTypePrefixName) {
786
- return true;
787
- }
788
- }) || null;
789
- return typePrefix;
790
- }
791
- },
792
- {
793
- key: "findLabelByMetavariableName",
794
- value: function findLabelByMetavariableName(metavariableName) {
795
- var labels = this.getLabels(), label = labels.find(function(label) {
796
- var labelComparesToMetavariableName = label.compareMetavariableName(metavariableName);
797
- if (labelComparesToMetavariableName) {
798
- return true;
799
- }
800
- }) || null;
801
- return label;
802
- }
803
- },
804
- {
805
- key: "findJudgementByMetavariableName",
806
- value: function findJudgementByMetavariableName(metavariableName) {
807
- var judgements = this.getJudgements(), judgement = judgements.find(function(judgement) {
808
- var judgementMetavariableComparesToMetavariable = judgement.compareMetavariableName(metavariableName);
809
- if (judgementMetavariableComparesToMetavariable) {
810
- return true;
811
- }
812
- }) || null;
813
- return judgement;
814
- }
815
- },
816
- {
817
- key: "findVariableByVariableIdentifier",
818
- value: function findVariableByVariableIdentifier(variableIdentifier) {
819
- var variables = this.getVariables(), variable = variables.find(function(variable) {
820
- var variableComparesToVariableIdentifier = variable.compareVariableIdentifier(variableIdentifier);
821
- if (variableComparesToVariableIdentifier) {
822
- return true;
823
- }
824
- }) || null;
825
- return variable;
826
- }
827
- },
828
- {
829
- key: "findMetavariableByMetavariableName",
830
- value: function findMetavariableByMetavariableName(metavariableName) {
831
- var metavariables = this.getMetavariables(), metavariable = metavariables.find(function(metavariable) {
832
- var metavariableComparesToMetavariableName = metavariable.compareMetavariableName(metavariableName);
833
- if (metavariableComparesToMetavariableName) {
834
- return true;
835
- }
836
- }) || null;
837
- return metavariable;
838
- }
839
- },
840
- {
841
- key: "findProcedureByProcedureName",
842
- value: function findProcedureByProcedureName(procedureName) {
843
- var procedures = this.getProcedures(), procedure = procedures.find(function(procedure) {
844
- var procedureComparesToProcedureName = procedure.compareProcedureName(procedureName);
845
- if (procedureComparesToProcedureName) {
846
- return true;
847
- }
848
- }) || null;
849
- return procedure;
850
- }
851
- },
852
- {
853
- key: "isMetavariablePresent",
854
- value: function isMetavariablePresent(metavariable) {
855
- metavariable = this.findMetavariable(metavariable);
856
- var metavariablePresent = metavariable !== null;
857
- return metavariablePresent;
858
- }
859
- },
860
- {
861
- key: "isLabelPresentByMetavariable",
862
- value: function isLabelPresentByMetavariable(metavariable) {
863
- var label = this.findLabelByMetavariable(metavariable), labelPresent = label !== null;
864
- return labelPresent;
865
- }
866
- },
867
- {
868
- key: "isLabelPresentByReference",
869
- value: function isLabelPresentByReference(reference) {
870
- var _this = this;
871
- var labels = this.getLabels(), labelPresent = labels.some(function(label) {
872
- var context = _this, labelUnifies = reference.unifyLabel(label, context);
873
- if (labelUnifies) {
874
- return true;
875
- }
876
- });
877
- return labelPresent;
878
- }
879
- },
880
- {
881
- key: "isMetavariablePresentByReference",
882
- value: function isMetavariablePresentByReference(reference) {
883
- var _this = this;
884
- var metavariables = this.getMetavariables(), metavariablePresent = metavariables.some(function(metavariable) {
885
- var context = _this, metavariableUnifies = reference.unifyMetavariable(metavariable, context);
886
- if (metavariableUnifies) {
887
- return true;
888
- }
889
- });
890
- return metavariablePresent;
891
- }
892
- },
893
- {
894
- key: "isTopLevelMetaAssertionPresentByReference",
895
- value: function isTopLevelMetaAssertionPresentByReference(reference) {
896
- var topLevelMetaAssertion = this.findTopLevelMetaAssertionByReference(reference), topLevelMetaAssertionPresent = topLevelMetaAssertion !== null;
897
- return topLevelMetaAssertionPresent;
898
- }
899
- },
900
- {
901
- key: "isTypePresentByTypeName",
902
- value: function isTypePresentByTypeName(typeName) {
903
- var includeRelease = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true, includeDependencies = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
904
- var type = this.findTypeByTypeName(typeName, includeRelease, includeDependencies), typePresent = type !== null;
905
- return typePresent;
906
- }
907
- },
908
- {
909
- key: "isTypePresentByNominalTypeName",
910
- value: function isTypePresentByNominalTypeName(nominalTypeName) {
911
- var type = this.findTypeByNominalTypeName(nominalTypeName), typePresent = type !== null;
912
- return typePresent;
913
- }
914
- },
915
- {
916
- key: "isTypePresentByPrefixedTypeName",
917
- value: function isTypePresentByPrefixedTypeName(prefixedTypeName) {
918
- var type = this.findTypeByPrefixedTypeName(prefixedTypeName), typePresent = type !== null;
919
- return typePresent;
920
- }
921
- },
922
- {
923
- key: "isLabelPresentByMetavariableName",
924
- value: function isLabelPresentByMetavariableName(metavariableName) {
925
- var label = this.findLabelByMetavariableName(metavariableName), labelPresent = label !== null;
926
- return labelPresent;
927
- }
928
- },
929
- {
930
- key: "isTypePrefixPresentByTypePrefixName",
931
- value: function isTypePrefixPresentByTypePrefixName(typePrefixName) {
932
- var typePrefix = this.findTypePrefixByTypePrefixName(typePrefixName), typePrefixPresent = typePrefix !== null;
933
- return typePrefixPresent;
934
- }
935
- },
936
- {
937
- key: "isVariablePresentByVariableIdentifier",
938
- value: function isVariablePresentByVariableIdentifier(variableIdentifier) {
939
- var variable = this.findVariableByVariableIdentifier(variableIdentifier), variablePresent = variable !== null;
940
- return variablePresent;
941
- }
942
- },
943
- {
944
- key: "isMetavariablePresentByMetavariableName",
945
- value: function isMetavariablePresentByMetavariableName(metavariableName) {
946
- var metavariable = this.findMetavariableByMetavariableName(metavariableName), metavariablePresent = metavariable !== null;
947
- return metavariablePresent;
948
- }
949
- },
950
- {
951
- key: "isProcedurePresentByProcedureName",
952
- value: function isProcedurePresentByProcedureName(procedureName) {
953
- var procedure = this.findProcedureByProcedureName(procedureName), procedurePresent = procedure !== null;
954
- return procedurePresent;
955
- }
956
- },
957
- {
958
- key: "clear",
959
- value: function clear() {
960
- this.types = [];
961
- this.rules = [];
962
- this.axioms = [];
963
- this.lemmas = [];
964
- this.theorems = [];
965
- this.variables = [];
966
- this.metaLemmas = [];
967
- this.conjectures = [];
968
- this.combinators = [];
969
- this.typePrefixes = [];
970
- this.constructors = [];
971
- this.metatheorems = [];
972
- this.metavariables = [];
973
- }
974
- },
975
- {
976
- key: "complete",
977
- value: function complete() {
978
- ///
979
- }
980
- },
981
- {
982
- key: "verifyFile",
983
- value: function verifyFile() {
984
- return _async_to_generator(function() {
985
- var node, context, fileNode, fileVerifies;
986
- return _ts_generator(this, function(_state) {
987
- switch(_state.label){
988
- case 0:
989
- node = this.getNode(), context = this, fileNode = node;
990
- return [
991
- 4,
992
- (0, _verify.verifyFile)(fileNode, context)
993
- ];
994
- case 1:
995
- fileVerifies = _state.sent();
996
- return [
997
- 2,
998
- fileVerifies
999
- ];
1000
- }
1001
- });
1002
- }).call(this);
1003
- }
1004
- },
1005
- {
1006
- key: "initialise",
1007
- value: function initialise(json) {
1008
- var fileContext = this; ///
1009
- this.types = [];
1010
- (0, _json.typesFromJSON)(json, this.types, fileContext);
1011
- this.lemmas = (0, _json.lemmasFromNothing)();
1012
- this.metaLemmas = (0, _json.metaLemmasFromNothing)();
1013
- this.metavariables = (0, _json.metavariablesFromJSON)(json, fileContext);
1014
- this.variables = (0, _json.variablesFromJSON)(json, fileContext);
1015
- this.rules = (0, _json.rulesFromJSON)(json, fileContext);
1016
- this.axioms = (0, _json.axiomsFromJSON)(json, fileContext);
1017
- this.theorems = (0, _json.theoremsFromJSON)(json, fileContext);
1018
- this.conjectures = (0, _json.conjecturesFromJSON)(json, fileContext);
1019
- this.combinators = (0, _json.combinatorsFromJSON)(json, fileContext);
1020
- this.typePrefixes = (0, _json.typePrefixesFromJSON)(json, fileContext);
1021
- this.constructors = (0, _json.constructorsFromJSON)(json, fileContext);
1022
- this.metatheorems = (0, _json.metatheoremsFromJSON)(json, fileContext);
1023
- }
1024
- },
1025
- {
1026
- key: "toJSON",
1027
- value: function toJSON() {
1028
- 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 = {
1029
- filePath: filePath,
1030
- types: types,
1031
- rules: rules,
1032
- axioms: axioms,
1033
- theorems: theorems,
1034
- variables: variables,
1035
- conjectures: conjectures,
1036
- combinators: combinators,
1037
- typePrefixes: typePrefixes,
1038
- constructors: constructors,
1039
- metatheorems: metatheorems,
1040
- metavariables: metavariables
1041
- };
1042
- return json;
1043
- }
1044
- }
1045
- ], [
1046
- {
1047
- key: "fromFile",
1048
- value: function fromFile(file, context) {
1049
- var releaseContext = context, combinedCustomGrammar = releaseContext.getCombinedCustomGrammar(), nominalLexer = nominalLexerFromCombinedCustomGrammar(_lexer.default, combinedCustomGrammar), nominalParser = nominalParserFromCombinedCustomGrammar(_parser.default, combinedCustomGrammar), lexer = nominalLexer, parser = nominalParser, types = [], rules = [], axioms = [], lemmas = [], theorems = [], variables = [], metaLemmas = [], conjectures = [], combinators = [], typePrefixes = [], constructors = [], metatheorems = [], metavariables = [], nominalFileContext = _occamlanguages.FileContext.fromFile(NominalFileContext, file, lexer, parser, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables, context);
1050
- return nominalFileContext;
1051
- }
1052
- },
1053
- {
1054
- key: "fromJSON",
1055
- value: function fromJSON(json, context) {
1056
- var releaseContext = context, combinedCustomGrammar = releaseContext.getCombinedCustomGrammar(), nominalLexer = nominalLexerFromCombinedCustomGrammar(_lexer.default, combinedCustomGrammar), nominalParser = nominalParserFromCombinedCustomGrammar(_parser.default, combinedCustomGrammar), lexer = nominalLexer, parser = nominalParser, 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, nominalFileContext = _occamlanguages.FileContext.fromJSON(NominalFileContext, json, lexer, parser, types, rules, axioms, lemmas, theorems, variables, metaLemmas, conjectures, combinators, typePrefixes, constructors, metatheorems, metavariables, context);
1057
- nominalFileContext.initialise(json);
1058
- return nominalFileContext;
1059
- }
1060
- }
1061
- ]);
1062
- return NominalFileContext;
1063
- }(_occamlanguages.FileContext);
1064
569
 
1065
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250ZXh0L2ZpbGUvbm9taW5hbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRmlsZUNvbnRleHQgfSBmcm9tIFwib2NjYW0tbGFuZ3VhZ2VzXCI7XG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcbmltcG9ydCB7IGxleGVyc1V0aWxpdGllcywgcGFyc2Vyc1V0aWxpdGllcyB9IGZyb20gXCJvY2NhbS1ub21pbmFsXCI7XG5cbmltcG9ydCBlbGVtZW50cyBmcm9tIFwiLi4vLi4vZWxlbWVudHNcIjtcbmltcG9ydCBOb21pbmFsTGV4ZXIgZnJvbSBcIi4uLy4uL25vbWluYWwvbGV4ZXJcIjtcbmltcG9ydCBOb21pbmFsUGFyc2VyIGZyb20gXCIuLi8uLi9ub21pbmFsL3BhcnNlclwiO1xuXG5pbXBvcnQgeyB2ZXJpZnlGaWxlIH0gZnJvbSBcIi4uLy4uL3Byb2Nlc3MvdmVyaWZ5XCI7XG5pbXBvcnQgeyBiYXNlVHlwZUZyb21Ob3RoaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy90eXBlXCI7XG5pbXBvcnQgeyBmaW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZSB9IGZyb20gXCIuLi8uLi9tZXRhVHlwZXNcIjtcbmltcG9ydCB7IHR5cGVzRnJvbUpTT04sXG4gICAgICAgICBydWxlc0Zyb21KU09OLFxuICAgICAgICAgYXhpb21zRnJvbUpTT04sXG4gICAgICAgICB0eXBlc1RvVHlwZXNKU09OLFxuICAgICAgICAgcnVsZXNUb1J1bGVzSlNPTixcbiAgICAgICAgIHRoZW9yZW1zRnJvbUpTT04sXG4gICAgICAgICB2YXJpYWJsZXNGcm9tSlNPTixcbiAgICAgICAgIGxlbW1hc0Zyb21Ob3RoaW5nLFxuICAgICAgICAgYXhpb21zVG9BeGlvbXNKU09OLFxuICAgICAgICAgY29uamVjdHVyZXNGcm9tSlNPTixcbiAgICAgICAgIGNvbWJpbmF0b3JzRnJvbUpTT04sXG4gICAgICAgICB0eXBlUHJlZml4ZXNGcm9tSlNPTixcbiAgICAgICAgIGNvbnN0cnVjdG9yc0Zyb21KU09OLFxuICAgICAgICAgbWV0YXRoZW9yZW1zRnJvbUpTT04sXG4gICAgICAgICBtZXRhdmFyaWFibGVzRnJvbUpTT04sXG4gICAgICAgICBtZXRhTGVtbWFzRnJvbU5vdGhpbmcsXG4gICAgICAgICB0aGVvcmVtc1RvVGhlb3JlbXNKU09OLFxuICAgICAgICAgdmFyaWFibGVzVG9WYXJpYWJsZXNKU09OLFxuICAgICAgICAgY29uamVjdHVyZXNUb0NvbmplY3R1cmVzSlNPTixcbiAgICAgICAgIGNvbWJpbmF0b3JzVG9Db21iaW5hdG9yc0pTT04sXG4gICAgICAgICB0eXBlUHJlZml4ZXNUb1R5cGVQcmVmaXhlc0pTT04sXG4gICAgICAgICBjb25zdHJ1Y3RvcnNUb0NvbnN0cnVjdG9yc0pTT04sXG4gICAgICAgICBtZXRhdGhlb3JlbXNUb01ldGF0aGVvcmVtc0pTT04sXG4gICAgICAgICBtZXRhdmFyaWFibGVzVG9NZXRhdmFyaWFibGVzSlNPTiB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvanNvblwiO1xuXG5jb25zdCB7IHB1c2gsIGZpbHRlciB9ID0gYXJyYXlVdGlsaXRpZXMsXG4gICAgICB7IG5vbWluYWxMZXhlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIgfSA9IGxleGVyc1V0aWxpdGllcyxcbiAgICAgIHsgbm9taW5hbFBhcnNlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIgfSA9IHBhcnNlcnNVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5vbWluYWxGaWxlQ29udGV4dCBleHRlbmRzIEZpbGVDb250ZXh0IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgZmlsZVBhdGgsIHRva2Vucywgbm9kZSwgbGV4ZXIsIHBhcnNlciwgdHlwZXMsIHJ1bGVzLCBheGlvbXMsIGxlbW1hcywgdGhlb3JlbXMsIHZhcmlhYmxlcywgbWV0YUxlbW1hcywgY29uamVjdHVyZXMsIGNvbWJpbmF0b3JzLCB0eXBlUHJlZml4ZXMsIGNvbnN0cnVjdG9ycywgbWV0YXRoZW9yZW1zLCBtZXRhdmFyaWFibGVzKSB7XG4gICAgc3VwZXIoY29udGV4dCwgZmlsZVBhdGgsIHRva2Vucywgbm9kZSk7XG5cbiAgICB0aGlzLmxleGVyID0gbGV4ZXI7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLmZpbGVQYXRoID0gZmlsZVBhdGg7XG4gICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB0aGlzLnR5cGVzID0gdHlwZXM7XG4gICAgdGhpcy5ydWxlcyA9IHJ1bGVzO1xuICAgIHRoaXMuYXhpb21zID0gYXhpb21zO1xuICAgIHRoaXMubGVtbWFzID0gbGVtbWFzO1xuICAgIHRoaXMudGhlb3JlbXMgPSB0aGVvcmVtcztcbiAgICB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlcztcbiAgICB0aGlzLm1ldGFMZW1tYXMgPSBtZXRhTGVtbWFzO1xuICAgIHRoaXMuY29uamVjdHVyZXMgPSBjb25qZWN0dXJlcztcbiAgICB0aGlzLmNvbWJpbmF0b3JzID0gY29tYmluYXRvcnM7XG4gICAgdGhpcy50eXBlUHJlZml4ZXMgPSB0eXBlUHJlZml4ZXM7XG4gICAgdGhpcy5jb25zdHJ1Y3RvcnMgPSBjb25zdHJ1Y3RvcnM7XG4gICAgdGhpcy5tZXRhdGhlb3JlbXMgPSBtZXRhdGhlb3JlbXM7XG4gICAgdGhpcy5tZXRhdmFyaWFibGVzID0gbWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGdldExleGVyKCkge1xuICAgIHJldHVybiB0aGlzLmxleGVyO1xuICB9XG5cbiAgZ2V0UGFyc2VyKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlcjtcbiAgfVxuXG4gIGdldEp1ZGdlbWVudHMoKSB7XG4gICAgY29uc3QganVkZ2VtZW50cyA9IFtdO1xuXG4gICAgcmV0dXJuIGp1ZGdlbWVudHM7XG4gIH1cblxuICBnZXRFcXVpdmFsZW5jZXMoKSB7XG4gICAgY29uc3QgeyBFcXVpdmFsZW5jZXMgfSA9IGVsZW1lbnRzLFxuICAgICAgICAgIGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBlcXVpdmFsZW5jZXMgPSBFcXVpdmFsZW5jZXMuZnJvbU5vdGhpbmcoY29udGV4dCk7XG5cbiAgICByZXR1cm4gZXF1aXZhbGVuY2VzO1xuICB9XG5cbiAgZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucygpIHtcbiAgICBjb25zdCBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zID0gW107XG5cbiAgICByZXR1cm4gc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucztcbiAgfVxuXG4gIGdldExhYmVscyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCBsYWJlbHMgPSBbXTtcblxuICAgIGlmIChpbmNsdWRlUmVsZWFzZSkge1xuICAgICAgY29uc3QgcmVsZWFzZUNvbnRleHRMYWJlbHMgPSB0aGlzLmNvbnRleHQuZ2V0TGFiZWxzKCk7XG5cbiAgICAgIHB1c2gobGFiZWxzLCByZWxlYXNlQ29udGV4dExhYmVscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucnVsZXMuZm9yRWFjaCgocnVsZSkgPT4ge1xuICAgICAgICBjb25zdCBydWxlTGFiZWxzID0gcnVsZS5nZXRMYWJlbHMoKTtcblxuICAgICAgICBwdXNoKGxhYmVscywgcnVsZUxhYmVscyk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5heGlvbXMuZm9yRWFjaCgoYXhpb20pID0+IHtcbiAgICAgICAgY29uc3QgYXhpb21MYWJlbHMgPSBheGlvbS5nZXRMYWJlbHMoKTtcblxuICAgICAgICBwdXNoKGxhYmVscywgYXhpb21MYWJlbHMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubGVtbWFzLmZvckVhY2goKGxlbW1hKSA9PiB7XG4gICAgICAgIGNvbnN0IGxlbW1hTGFiZWxzID0gbGVtbWEuZ2V0TGFiZWxzKCk7XG5cbiAgICAgICAgcHVzaChsYWJlbHMsIGxlbW1hTGFiZWxzKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnRoZW9yZW1zLmZvckVhY2goKHRoZW9yZW0pID0+IHtcbiAgICAgICAgY29uc3QgdGhlb3JlbUxhYmVscyA9IHRoZW9yZW0uZ2V0TGFiZWxzKCk7XG5cbiAgICAgICAgcHVzaChsYWJlbHMsIHRoZW9yZW1MYWJlbHMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY29uamVjdHVyZXMuZm9yRWFjaCgoY29uamVjdHVyZSkgPT4ge1xuICAgICAgICBjb25zdCBjb25qZWN0dXJlTGFiZWxzID0gY29uamVjdHVyZS5nZXRMYWJlbHMoKTtcblxuICAgICAgICBwdXNoKGxhYmVscywgY29uamVjdHVyZUxhYmVscyk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5tZXRhdGhlb3JlbXMuZm9yRWFjaCgobWV0YXRoZW9yZW0pID0+IHtcbiAgICAgICAgY29uc3QgbWV0YXRoZW9yZW1MYWJlbCA9IG1ldGF0aGVvcmVtLmdldExhYmVsKCk7XG5cbiAgICAgICAgbGFiZWxzLnB1c2gobWV0YXRoZW9yZW1MYWJlbCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG5cbiAgZ2V0VHlwZXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlLCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHR5cGVzID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0VHlwZXMoaW5jbHVkZURlcGVuZGVuY2llcykgOlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZXM7XG5cbiAgICByZXR1cm4gdHlwZXM7XG4gIH1cblxuICBnZXRSdWxlcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCBydWxlcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldFJ1bGVzKCkgOlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZXM7XG5cbiAgICByZXR1cm4gcnVsZXM7XG4gIH1cblxuICBnZXRBeGlvbXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgYXhpb21zID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldEF4aW9tcygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5heGlvbXM7XG5cbiAgICByZXR1cm4gYXhpb21zO1xuICB9XG5cbiAgZ2V0TGVtbWFzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IGxlbW1hcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRMZW1tYXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVtbWFzO1xuXG4gICAgcmV0dXJuIGxlbW1hcztcbiAgfVxuXG4gIGdldFRoZW9yZW1zKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHRoZW9yZW1zID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0VGhlb3JlbXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVvcmVtcztcblxuICAgIHJldHVybiB0aGVvcmVtcztcbiAgfVxuXG4gIGdldFZhcmlhYmxlcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy52YXJpYWJsZXM7XG4gIH1cblxuICBnZXRQcm9jZWR1cmVzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHByb2NlZHVyZXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldFByb2NlZHVyZXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsOyAgLy8vXG5cbiAgICByZXR1cm4gcHJvY2VkdXJlcztcbiAgfVxuXG4gIGdldE1ldGFMZW1tYXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgbWV0YUxlbW1hcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0TWV0YUxlbW1hcygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0YUxlbW1hcztcblxuICAgIHJldHVybiBtZXRhTGVtbWFzO1xuICB9XG5cbiAgZ2V0Q29uamVjdHVyZXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgY29uamVjdHVyZXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRDb25qZWN0dXJlcygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmplY3R1cmVzO1xuXG4gICAgcmV0dXJuIGNvbmplY3R1cmVzO1xuICB9XG5cbiAgZ2V0Q29tYmluYXRvcnMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgY29tYmluYXRvcnMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRDb21iaW5hdG9ycygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmF0b3JzO1xuXG4gICAgcmV0dXJuIGNvbWJpbmF0b3JzO1xuICB9XG5cbiAgZ2V0VHlwZVByZWZpeGVzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHR5cGVQcmVmaXhlcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRUeXBlUHJlZml4ZXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZVByZWZpeGVzO1xuXG4gICAgcmV0dXJuIHR5cGVQcmVmaXhlcztcbiAgfVxuXG4gIGdldENvbnN0cnVjdG9ycyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvcnMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0Q29uc3RydWN0b3JzKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9ycztcblxuICAgIHJldHVybiBjb25zdHJ1Y3RvcnM7XG4gIH1cblxuICBnZXRNZXRhdGhlb3JlbXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgbWV0YXRoZW9yZW1zID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldE1ldGF0aGVvcmVtcygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRhdGhlb3JlbXM7XG5cbiAgICByZXR1cm4gbWV0YXRoZW9yZW1zO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhdmFyaWFibGVzO1xuICB9XG5cbiAgYWRkVHlwZSh0eXBlKSB7XG4gICAgdGhpcy50eXBlcy5wdXNoKHR5cGUpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGUuZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7dHlwZVN0cmluZ30nIHR5cGUgdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBhZGRSdWxlKHJ1bGUpIHtcbiAgICB0aGlzLnJ1bGVzLnB1c2gocnVsZSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBydWxlU3RyaW5nID0gcnVsZS5nZXRTdHJpbmcoKTtcblxuICAgIHRoaXMudHJhY2UoYEFkZGVkIHRoZSAnJHtydWxlU3RyaW5nfScgcnVsZSB0byB0aGUgJyR7ZmlsZVBhdGh9JyBmaWxlIGNvbnRleHQuYClcbiAgfVxuXG4gIGFkZEF4aW9tKGF4aW9tKSB7XG4gICAgdGhpcy5heGlvbXMucHVzaChheGlvbSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBheGlvbVN0cmluZyA9IGF4aW9tLmdldFN0cmluZygpO1xuXG4gICAgdGhpcy50cmFjZShgQWRkZWQgdGhlICcke2F4aW9tU3RyaW5nfScgYXhpb20gdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBhZGRMZW1tYShsZW1tYSkge1xuICAgIHRoaXMubGVtbWFzLnB1c2gobGVtbWEpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgbGVtbWFTdHJpbmcgPSBsZW1tYS5nZXRTdHJpbmcoKTtcblxuICAgIHRoaXMudHJhY2UoYEFkZGVkIHRoZSAnJHtsZW1tYVN0cmluZ30nIGxlbW1hIHRvIHRoZSAnJHtmaWxlUGF0aH0nIGZpbGUgY29udGV4dC5gKVxuICB9XG5cbiAgYWRkVGhlb3JlbSh0aGVvcmVtKSB7XG4gICAgdGhpcy50aGVvcmVtcy5wdXNoKHRoZW9yZW0pO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgdGhlb3JlbVN0cmluZyA9IHRoZW9yZW0uZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7dGhlb3JlbVN0cmluZ30nIHRoZW9yZW0gdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBhZGRWYXJpYWJsZSh2YXJpYWJsZSkge1xuICAgIHRoaXMudmFyaWFibGVzLnB1c2godmFyaWFibGUpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgdmFyaWFibGVTdHJpbmcgPSB2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgIHRoaXMudHJhY2UoYEFkZGVkIHRoZSAnJHt2YXJpYWJsZVN0cmluZ30nIHZhcmlhYmxlIHRvIHRoZSAnJHtmaWxlUGF0aH0nIGZpbGUgY29udGV4dC5gKVxuICB9XG5cbiAgYWRkTWV0YUxlbW1hKG1ldGFMZW1tYSkge1xuICAgIHRoaXMubWV0YUxlbW1hcy5wdXNoKG1ldGFMZW1tYSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBtZXRhTGVtbWFTdHJpbmcgPSBtZXRhTGVtbWEuZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7bWV0YUxlbW1hU3RyaW5nfScgbWV0YS1sZW1tYSB0byB0aGUgJyR7ZmlsZVBhdGh9JyBmaWxlIGNvbnRleHQuYClcbiAgfVxuXG4gIGFkZENvbmplY3R1cmUoY29uamVjdHVyZSkge1xuICAgIHRoaXMuY29uamVjdHVyZXMucHVzaChjb25qZWN0dXJlKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gdGhpcy5nZXRGaWxlUGF0aCgpLFxuICAgICAgICAgIG9jbmplY3R1cmVTdHJpbmcgPSBvY25qZWN0dXJlLmdldFN0cmluZygpO1xuXG4gICAgdGhpcy50cmFjZShgQWRkZWQgdGhlICcke29jbmplY3R1cmVTdHJpbmd9JyBvY25qZWN0dXJlIHRvIHRoZSAnJHtmaWxlUGF0aH0nIGZpbGUgY29udGV4dC5gKVxuICB9XG5cbiAgYWRkQ29tYmluYXRvcihjb21iaW5hdG9yKSB7XG4gICAgdGhpcy5jb21iaW5hdG9ycy5wdXNoKGNvbWJpbmF0b3IpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgY29tYmluYXRvclN0cmluZyA9IGNvbWJpbmF0b3IuZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7Y29tYmluYXRvclN0cmluZ30nIGNvbWJpbmF0b3IgdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBhZGRUeXBlUHJlZml4KHR5cGVQcmVmaXgpIHtcbiAgICB0aGlzLnR5cGVQcmVmaXhlcy5wdXNoKHR5cGVQcmVmaXgpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgdHlwZVByZWZpeFN0cmluZyA9IHR5cGVQcmVmaXguZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7dHlwZVByZWZpeFN0cmluZ30nIHR5cGUtcHJlZml4IHRvIHRoZSAnJHtmaWxlUGF0aH0nIGZpbGUgY29udGV4dC5gKVxuICB9XG5cbiAgYWRkQ29uc3RydWN0b3IoY29uc3RydWN0b3IpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9ycy5wdXNoKGNvbnN0cnVjdG9yKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gdGhpcy5nZXRGaWxlUGF0aCgpLFxuICAgICAgICAgIGNvbnN0cnVjdG9yU3RyaW5nID0gY29uc3RydWN0b3IuZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7Y29uc3RydWN0b3JTdHJpbmd9JyBjb25zdHJ1Y3RvciB0byB0aGUgJyR7ZmlsZVBhdGh9JyBmaWxlIGNvbnRleHQuYClcbiAgfVxuXG4gIGFkZE1ldGF0aGVvcmVtKG1ldGF0aGVvcmVtKSB7XG4gICAgdGhpcy5tZXRhdGhlb3JlbXMucHVzaChtZXRhdGhlb3JlbSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBtZXRhdGhlb3JlbVN0cmluZyA9IG1ldGF0aGVvcmVtLmdldFN0cmluZygpO1xuXG4gICAgdGhpcy50cmFjZShgQWRkZWQgdGhlICcke21ldGF0aGVvcmVtU3RyaW5nfScgbWV0YXRoZW9yZW0gdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBhZGRNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7XG4gICAgdGhpcy5tZXRhdmFyaWFibGVzLnB1c2gobWV0YXZhcmlhYmxlKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gdGhpcy5nZXRGaWxlUGF0aCgpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IG1ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgIHRoaXMudHJhY2UoYEFkZGVkIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBmaW5kTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZXMgPSB0aGlzLmdldE1ldGF2YXJpYWJsZXMoKSxcbiAgICAgICAgICBzcGVjaWZpY01ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZTsgIC8vL1xuXG4gICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlcy5maW5kKChtZXRhdmFyaWFibGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGUgPSBtZXRhdmFyaWFibGUsIC8vL1xuICAgICAgICAgICAgbWV0YXZhcmlhYmxlVW5pZmllcyA9IGdlbmVyYWxNZXRhdmFyaWFibGUudW5pZnlNZXRhdmFyaWFibGUoc3BlY2lmaWNNZXRhdmFyaWFibGUsIGNvbnRleHQpO1xuXG4gICAgICBpZiAobWV0YXZhcmlhYmxlVW5pZmllcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCksXG4gICAgICAgICAgbGFiZWwgPSBsYWJlbHMuZmluZCgobGFiZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsTWV0YXZhcmlhYmxlQ29tcGFyZXNUb01ldGF2YXJpYWJsZSA9IGxhYmVsLmNvbXBhcmVNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKTtcblxuICAgICAgICAgICAgaWYgKGxhYmVsTWV0YXZhcmlhYmxlQ29tcGFyZXNUb01ldGF2YXJpYWJsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG5cbiAgZmluZE1ldGFUeXBlQnlNZXRhVHlwZU5hbWUobWV0YVR5cGVOYW1lKSB7XG4gICAgY29uc3QgbWV0YVR5cGUgPSBmaW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZShtZXRhVHlwZU5hbWUpO1xuXG4gICAgcmV0dXJuIG1ldGFUeXBlO1xuICB9XG5cbiAgZmluZFJ1bGVCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBydWxlcyA9IHRoaXMuZ2V0UnVsZXMoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOYW1lID0gcmVmZXJlbmNlLmdldE1ldGF2YXJpYWJsZU5hbWUoKSxcbiAgICAgICAgICBydWxlID0gcnVsZXMuZmluZCgocnVsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gcnVsZS5jb21wYXJlTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cblxuICBmaW5kQXhpb21CeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBheGlvbXMgPSB0aGlzLmdldEF4aW9tcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGF4aW9tID0gYXhpb21zLmZpbmQoKGF4aW9tKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBheGlvbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gYXhpb20uY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChheGlvbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gYXhpb207XG4gIH1cblxuICBmaW5kTGVtbWFCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBsZW1tYXMgPSB0aGlzLmdldExlbW1hcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGxlbW1hID0gbGVtbWFzLmZpbmQoKGxlbW1hKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZW1tYUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gbGVtbWEuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChsZW1tYUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbGVtbWE7XG4gIH1cblxuICBmaW5kVGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IHRoZW9yZW1zID0gdGhpcy5nZXRUaGVvcmVtcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIHRoZW9yZW0gPSB0aGVvcmVtcy5maW5kKCh0aGVvcmVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aGVvcmVtQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUgPSB0aGVvcmVtLmNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAodGhlb3JlbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdGhlb3JlbTtcbiAgfVxuXG4gIGZpbmRNZXRhTGVtbWFCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBtZXRhTGVtbWFzID0gdGhpcy5nZXRNZXRhTGVtbWFzKCksXG4gICAgICAgICAgbWV0YUxlbW1hID0gbWV0YUxlbW1hcy5maW5kKChtZXRhTGVtbWEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFMZW1tYUNvbXBhcmVzVG9SZWZlcmVuY2UgPSBtZXRhTGVtbWEuY29tcGFyZVJlZmVyZW5jZShyZWZlcmVuY2UpO1xuXG4gICAgICAgICAgICBpZiAobWV0YUxlbW1hQ29tcGFyZXNUb1JlZmVyZW5jZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGFMZW1tYTtcbiAgfVxuXG4gIGZpbmRDb25qZWN0dXJlQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgY29uamVjdHVyZXMgPSB0aGlzLmdldENvbmplY3R1cmVzKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTmFtZSA9IHJlZmVyZW5jZS5nZXRNZXRhdmFyaWFibGVOYW1lKCksXG4gICAgICAgICAgY29uamVjdHVyZSA9IGNvbmplY3R1cmVzLmZpbmQoKGNvbmplY3R1cmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmplY3R1cmVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSA9IGNvbmplY3R1cmUuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChjb25qZWN0dXJlQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBjb25qZWN0dXJlO1xuICB9XG5cbiAgZmluZE1ldGFMZW1tYXNCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBtZXRhTGVtbWFzID0gdGhpcy5nZXRNZXRhTGVtbWFzKCk7XG5cbiAgICBmaWx0ZXIobWV0YUxlbW1hcywgKG1ldGFMZW1tYSkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uID0gbWV0YUxlbW1hLCAvLy9cbiAgICAgICAgICAgIHRvcExldmVsTWV0YUFzc2VydGlvblVuaWZpZXMgPSByZWZlcmVuY2UudW5pZnlUb3BMZXZlbE1ldGFBc3NlcnRpb24odG9wTGV2ZWxNZXRhQXNzZXJ0aW9uLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHRvcExldmVsTWV0YUFzc2VydGlvblVuaWZpZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWV0YUxlbW1hcztcbiAgfVxuXG4gIGZpbmRNZXRhdGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IG1ldGF0aGVvcmVtcyA9IHRoaXMuZ2V0TWV0YXRoZW9yZW1zKCksXG4gICAgICBtZXRhdGhlb3JlbSA9IG1ldGF0aGVvcmVtcy5maW5kKChtZXRhdGhlb3JlbSkgPT4ge1xuICAgICAgICBjb25zdCBtZXRhdGhlb3JlbUNvbXBhcmVzVG9SZWZlcmVuY2UgPSBtZXRhdGhlb3JlbS5jb21wYXJlUmVmZXJlbmNlKHJlZmVyZW5jZSk7XG5cbiAgICAgICAgaWYgKG1ldGF0aGVvcmVtQ29tcGFyZXNUb1JlZmVyZW5jZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF0aGVvcmVtO1xuICB9XG5cbiAgZmluZE1ldGF0aGVvcmVtc0J5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IG1ldGF0aGVvcmVtcyA9IHRoaXMuZ2V0TWV0YXRoZW9yZW1zKCk7XG5cbiAgICBmaWx0ZXIobWV0YXRoZW9yZW1zLCAobWV0YXRoZW9yZW0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICAgIHRvcExldmVsTWV0YUFzc2VydGlvbiA9IG1ldGF0aGVvcmVtLCAvLy9cbiAgICAgICAgICAgIHRvcExldmVsTWV0YUFzc2VydGlvblVuaWZpZXMgPSByZWZlcmVuY2UudW5pZnlUb3BMZXZlbE1ldGFBc3NlcnRpb24odG9wTGV2ZWxNZXRhQXNzZXJ0aW9uLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHRvcExldmVsTWV0YUFzc2VydGlvblVuaWZpZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWV0YXRoZW9yZW1zO1xuICB9XG5cbiAgZmluZFRvcExldmVsQXNzZXJ0aW9uQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgYXhpb20gPSB0aGlzLmZpbmRBeGlvbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgbGVtbWEgPSB0aGlzLmZpbmRMZW1tYUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgdGhlb3JlbSA9IHRoaXMuZmluZFRoZW9yZW1CeVJlZmVyZW5jZShyZWZlcmVuY2UpLFxuICAgICAgICAgIGNvbmplY3R1cmUgPSB0aGlzLmZpbmRDb25qZWN0dXJlQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICB0b3BMZXZlbEFzc2VydGlvbiA9IChheGlvbSB8fCBsZW1tYSB8fCB0aGVvcmVtIHx8IGNvbmplY3R1cmUpO1xuXG4gICAgcmV0dXJuIHRvcExldmVsQXNzZXJ0aW9uO1xuICB9XG5cbiAgZmluZFRvcExldmVsTWV0YUFzc2VydGlvbkJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IG1ldGFMZW1tYSA9IHRoaXMuZmluZE1ldGFMZW1tYUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgbWV0YXRoZW9yZW0gPSB0aGlzLmZpbmRNZXRhdGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uID0gKG1ldGFMZW1tYSB8fCBtZXRhdGhlb3JlbSk7ICAvLy9cblxuICAgIHJldHVybiB0b3BMZXZlbE1ldGFBc3NlcnRpb247XG4gIH1cblxuICBmaW5kVG9wTGV2ZWxNZXRhQXNzZXJ0aW9uc0J5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IG1ldGFMZW1tYXMgPSB0aGlzLmZpbmRNZXRhTGVtbWFzQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICBtZXRhdGhlb3JlbXMgPSB0aGlzLmZpbmRNZXRhdGhlb3JlbXNCeVJlZmVyZW5jZShyZWZlcmVuY2UpLFxuICAgICAgICAgIHRvcExldmVsTWV0YUFzc2VydGlvbnMgPSBbXG4gICAgICAgICAgICAuLi5tZXRhTGVtbWFzLFxuICAgICAgICAgICAgLi4ubWV0YXRoZW9yZW1zXG4gICAgICAgICAgXTtcblxuICAgIHJldHVybiB0b3BMZXZlbE1ldGFBc3NlcnRpb25zO1xuICB9XG5cbiAgZmluZFR5cGVCeVR5cGVOYW1lKHR5cGVOYW1lLCBpbmNsdWRlUmVsZWFzZSA9IHRydWUsIGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgbGV0IHR5cGVzID0gdGhpcy5nZXRUeXBlcyhpbmNsdWRlUmVsZWFzZSwgaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICBjb25zdCBiYXNlVHlwZSA9IGJhc2VUeXBlRnJvbU5vdGhpbmcoKTtcblxuICAgIHR5cGVzID0gW1xuICAgICAgLi4udHlwZXMsXG4gICAgICBiYXNlVHlwZVxuICAgIF07XG5cbiAgICBjb25zdCB0eXBlID0gdHlwZXMuZmluZCgodHlwZSkgPT4ge1xuICAgICAgY29uc3QgdHlwZUNvbXBhcmVzVG9UeXBlTmFtZSA9IHR5cGUuY29tcGFyZVR5cGVOYW1lKHR5cGVOYW1lKTtcblxuICAgICAgaWYgKHR5cGVDb21wYXJlc1RvVHlwZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgZmluZFR5cGVCeU5vbWluYWxUeXBlTmFtZShub21pbmFsVHlwZU5hbWUpIHtcbiAgICBsZXQgdHlwZXMgPSB0aGlzLmdldFR5cGVzKCk7XG5cbiAgICBjb25zdCBiYXNlVHlwZSA9IGJhc2VUeXBlRnJvbU5vdGhpbmcoKTtcblxuICAgIHR5cGVzID0gW1xuICAgICAgLi4udHlwZXMsXG4gICAgICBiYXNlVHlwZVxuICAgIF07XG5cbiAgICBjb25zdCB0eXBlID0gdHlwZXMuZmluZCgodHlwZSkgPT4ge1xuICAgICAgY29uc3QgdHlwZUNvbXBhcmVzVG9Ob21pbmFsVHlwZU5hbWUgPSB0eXBlLmNvbXBhcmVOb21pbmFsVHlwZU5hbWUobm9taW5hbFR5cGVOYW1lKTtcblxuICAgICAgaWYgKHR5cGVDb21wYXJlc1RvTm9taW5hbFR5cGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIGZpbmRUeXBlQnlQcmVmaXhlZFR5cGVOYW1lKHByZWZpeGVkVHlwZU5hbWUpIHtcbiAgICBsZXQgdHlwZXMgPSB0aGlzLmdldFR5cGVzKCk7XG5cbiAgICBjb25zdCBiYXNlVHlwZSA9IGJhc2VUeXBlRnJvbU5vdGhpbmcoKTtcblxuICAgIHR5cGVzID0gW1xuICAgICAgLi4udHlwZXMsXG4gICAgICBiYXNlVHlwZVxuICAgIF07XG5cbiAgICBjb25zdCB0eXBlID0gdHlwZXMuZmluZCgodHlwZSkgPT4ge1xuICAgICAgY29uc3QgdHlwZUNvbXBhcmVzVG9QcmVmaXhlZFR5cGVOYW1lID0gdHlwZS5jb21wYXJlUHJlZml4ZWRUeXBlTmFtZShwcmVmaXhlZFR5cGVOYW1lKTtcblxuICAgICAgaWYgKHR5cGVDb21wYXJlc1RvUHJlZml4ZWRUeXBlTmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBmaW5kVHlwZVByZWZpeEJ5VHlwZVByZWZpeE5hbWUodHlwZVByZWZpeE5hbWUpIHtcbiAgICBjb25zdCB0eXBlUHJlZml4ZXMgPSB0aGlzLmdldFR5cGVQcmVmaXhlcygpLFxuICAgICAgICAgIHR5cGVQcmVmaXggPSB0eXBlUHJlZml4ZXMuZmluZCgodHlwZVByZWZpeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZVByZWZpeENvbXBhcmVzVG9UeXBlUHJlZml4TmFtZSA9IHR5cGVQcmVmaXguY29tcGFyZVR5cGVQcmVmaXhOYW1lKHR5cGVQcmVmaXhOYW1lKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVQcmVmaXhDb21wYXJlc1RvVHlwZVByZWZpeE5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB0eXBlUHJlZml4O1xuICB9XG5cbiAgZmluZExhYmVsQnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpLFxuICAgICAgICAgIGxhYmVsID0gbGFiZWxzLmZpbmQoKGxhYmVsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbENvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gbGFiZWwuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChsYWJlbENvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICBmaW5kSnVkZ2VtZW50QnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICBjb25zdCBqdWRnZW1lbnRzID0gdGhpcy5nZXRKdWRnZW1lbnRzKCksXG4gICAgICAgICAganVkZ2VtZW50ID0ganVkZ2VtZW50cy5maW5kKChqdWRnZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGp1ZGdlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGUgPSBqdWRnZW1lbnQuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChqdWRnZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4ganVkZ2VtZW50O1xuICB9XG5cbiAgZmluZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyKSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSxcbiAgICAgICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlcy5maW5kKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVDb21wYXJlc1RvVmFyaWFibGVJZGVudGlmaWVyID0gdmFyaWFibGUuY29tcGFyZVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgICBpZiAodmFyaWFibGVDb21wYXJlc1RvVmFyaWFibGVJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdmFyaWFibGU7XG4gIH1cblxuICBmaW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVzID0gdGhpcy5nZXRNZXRhdmFyaWFibGVzKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlcy5maW5kKChtZXRhdmFyaWFibGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gbWV0YXZhcmlhYmxlLmNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGU7XG4gIH1cblxuICBmaW5kUHJvY2VkdXJlQnlQcm9jZWR1cmVOYW1lKHByb2NlZHVyZU5hbWUpIHtcbiAgICBjb25zdCBwcm9jZWR1cmVzID0gdGhpcy5nZXRQcm9jZWR1cmVzKCksXG4gICAgICAgICAgcHJvY2VkdXJlID0gcHJvY2VkdXJlcy5maW5kKChwcm9jZWR1cmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2NlZHVyZUNvbXBhcmVzVG9Qcm9jZWR1cmVOYW1lID0gcHJvY2VkdXJlLmNvbXBhcmVQcm9jZWR1cmVOYW1lKHByb2NlZHVyZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAocHJvY2VkdXJlQ29tcGFyZXNUb1Byb2NlZHVyZU5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBwcm9jZWR1cmU7XG4gIH1cblxuICBpc01ldGF2YXJpYWJsZVByZXNlbnQobWV0YXZhcmlhYmxlKSB7XG4gICAgbWV0YXZhcmlhYmxlID0gdGhpcy5maW5kTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSk7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVQcmVzZW50ID0gKG1ldGF2YXJpYWJsZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlUHJlc2VudDtcbiAgfVxuXG4gIGlzTGFiZWxQcmVzZW50QnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSksXG4gICAgICAgICAgbGFiZWxQcmVzZW50ID0gKGxhYmVsICE9PSBudWxsKTtcblxuICAgIHJldHVybiBsYWJlbFByZXNlbnQ7XG4gIH1cblxuICBpc0xhYmVsUHJlc2VudEJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCksXG4gICAgICAgICAgbGFiZWxQcmVzZW50ID0gbGFiZWxzLnNvbWUoKGxhYmVsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgICAgICAgICBsYWJlbFVuaWZpZXMgPSByZWZlcmVuY2UudW5pZnlMYWJlbChsYWJlbCwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmIChsYWJlbFVuaWZpZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gbGFiZWxQcmVzZW50O1xuICB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50QnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlcyA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVByZXNlbnQgPSBtZXRhdmFyaWFibGVzLnNvbWUoKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgICAgICAgbWV0YXZhcmlhYmxlVW5pZmllcyA9IHJlZmVyZW5jZS51bmlmeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlVW5pZmllcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVQcmVzZW50O1xuICB9XG5cbiAgaXNUb3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50QnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uID0gdGhpcy5maW5kVG9wTGV2ZWxNZXRhQXNzZXJ0aW9uQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICB0b3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50ID0gKHRvcExldmVsTWV0YUFzc2VydGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzVHlwZVByZXNlbnRCeVR5cGVOYW1lKHR5cGVOYW1lLCBpbmNsdWRlUmVsZWFzZSA9IHRydWUsIGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZmluZFR5cGVCeVR5cGVOYW1lKHR5cGVOYW1lLCBpbmNsdWRlUmVsZWFzZSwgaW5jbHVkZURlcGVuZGVuY2llcyksXG4gICAgICAgICAgdHlwZVByZXNlbnQgPSAodHlwZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdHlwZVByZXNlbnQ7XG4gIH1cblxuICBpc1R5cGVQcmVzZW50QnlOb21pbmFsVHlwZU5hbWUobm9taW5hbFR5cGVOYW1lKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZmluZFR5cGVCeU5vbWluYWxUeXBlTmFtZShub21pbmFsVHlwZU5hbWUpLFxuICAgICAgICAgIHR5cGVQcmVzZW50ID0gKHR5cGUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHR5cGVQcmVzZW50O1xuICB9XG5cbiAgaXNUeXBlUHJlc2VudEJ5UHJlZml4ZWRUeXBlTmFtZShwcmVmaXhlZFR5cGVOYW1lKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZmluZFR5cGVCeVByZWZpeGVkVHlwZU5hbWUocHJlZml4ZWRUeXBlTmFtZSksXG4gICAgICAgICAgdHlwZVByZXNlbnQgPSAodHlwZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdHlwZVByZXNlbnQ7XG4gIH1cblxuICBpc0xhYmVsUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSxcbiAgICAgICAgICBsYWJlbFByZXNlbnQgPSAobGFiZWwgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGxhYmVsUHJlc2VudDtcbiAgfVxuXG4gIGlzVHlwZVByZWZpeFByZXNlbnRCeVR5cGVQcmVmaXhOYW1lKHR5cGVQcmVmaXhOYW1lKSB7XG4gICAgY29uc3QgdHlwZVByZWZpeCA9IHRoaXMuZmluZFR5cGVQcmVmaXhCeVR5cGVQcmVmaXhOYW1lKHR5cGVQcmVmaXhOYW1lKSxcbiAgICAgICAgICB0eXBlUHJlZml4UHJlc2VudCA9ICh0eXBlUHJlZml4ICE9PSBudWxsKTtcblxuICAgIHJldHVybiB0eXBlUHJlZml4UHJlc2VudDtcbiAgfVxuXG4gIGlzVmFyaWFibGVQcmVzZW50QnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyKSB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmZpbmRWYXJpYWJsZUJ5VmFyaWFibGVJZGVudGlmaWVyKHZhcmlhYmxlSWRlbnRpZmllciksXG4gICAgICAgICAgdmFyaWFibGVQcmVzZW50ID0gKHZhcmlhYmxlICE9PSBudWxsKTtcblxuICAgIHJldHVybiB2YXJpYWJsZVByZXNlbnQ7XG4gIH1cblxuICBpc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSkge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IHRoaXMuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVQcmVzZW50ID0gKG1ldGF2YXJpYWJsZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlUHJlc2VudDtcbiAgfVxuXG4gIGlzUHJvY2VkdXJlUHJlc2VudEJ5UHJvY2VkdXJlTmFtZShwcm9jZWR1cmVOYW1lKSB7XG4gICAgY29uc3QgcHJvY2VkdXJlID0gdGhpcy5maW5kUHJvY2VkdXJlQnlQcm9jZWR1cmVOYW1lKHByb2NlZHVyZU5hbWUpLFxuICAgICAgICAgIHByb2NlZHVyZVByZXNlbnQgPSAocHJvY2VkdXJlICE9PSBudWxsKTtcblxuICAgIHJldHVybiBwcm9jZWR1cmVQcmVzZW50O1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy50eXBlcyA9IFtdO1xuICAgIHRoaXMucnVsZXMgPSBbXTtcbiAgICB0aGlzLmF4aW9tcyA9IFtdO1xuICAgIHRoaXMubGVtbWFzID0gW107XG4gICAgdGhpcy50aGVvcmVtcyA9IFtdO1xuICAgIHRoaXMudmFyaWFibGVzID0gW107XG4gICAgdGhpcy5tZXRhTGVtbWFzID0gW107XG4gICAgdGhpcy5jb25qZWN0dXJlcyA9IFtdO1xuICAgIHRoaXMuY29tYmluYXRvcnMgPSBbXTtcbiAgICB0aGlzLnR5cGVQcmVmaXhlcyA9IFtdO1xuICAgIHRoaXMuY29uc3RydWN0b3JzID0gW107XG4gICAgdGhpcy5tZXRhdGhlb3JlbXMgPSBbXTtcbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMgPSBbXTtcbiAgfVxuXG4gIGNvbXBsZXRlKCkge1xuICAgIC8vL1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5RmlsZSgpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlKCksXG4gICAgICAgICAgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGZpbGVOb2RlID0gbm9kZSwgIC8vL1xuICAgICAgICAgIGZpbGVWZXJpZmllcyA9IGF3YWl0IHZlcmlmeUZpbGUoZmlsZU5vZGUsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGZpbGVWZXJpZmllcztcbiAgfVxuXG4gIGluaXRpYWxpc2UoanNvbikge1xuICAgIGNvbnN0IGZpbGVDb250ZXh0ID0gdGhpczsgLy8vXG5cbiAgICB0aGlzLnR5cGVzID0gW107XG5cbiAgICB0eXBlc0Zyb21KU09OKGpzb24sIHRoaXMudHlwZXMsIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMubGVtbWFzID0gbGVtbWFzRnJvbU5vdGhpbmcoKTtcbiAgICB0aGlzLm1ldGFMZW1tYXMgPSBtZXRhTGVtbWFzRnJvbU5vdGhpbmcoKTtcblxuICAgIHRoaXMubWV0YXZhcmlhYmxlcyA9IG1ldGF2YXJpYWJsZXNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG4gICAgdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG4gICAgdGhpcy5ydWxlcyA9IHJ1bGVzRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICAgIHRoaXMuYXhpb21zID0gYXhpb21zRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICAgIHRoaXMudGhlb3JlbXMgPSB0aGVvcmVtc0Zyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KTtcbiAgICB0aGlzLmNvbmplY3R1cmVzID0gY29uamVjdHVyZXNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG4gICAgdGhpcy5jb21iaW5hdG9ycyA9IGNvbWJpbmF0b3JzRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICAgIHRoaXMudHlwZVByZWZpeGVzID0gdHlwZVByZWZpeGVzRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICAgIHRoaXMuY29uc3RydWN0b3JzID0gY29uc3RydWN0b3JzRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICAgIHRoaXMubWV0YXRoZW9yZW1zID0gbWV0YXRoZW9yZW1zRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IHR5cGVzSlNPTiA9IHR5cGVzVG9UeXBlc0pTT04odGhpcy50eXBlcyksXG4gICAgICAgICAgcnVsZXNKU09OID0gcnVsZXNUb1J1bGVzSlNPTih0aGlzLnJ1bGVzKSxcbiAgICAgICAgICBheGlvbXNKU09OID0gYXhpb21zVG9BeGlvbXNKU09OKHRoaXMuYXhpb21zKSxcbiAgICAgICAgICB0aGVvcmVtc0pTT04gPSB0aGVvcmVtc1RvVGhlb3JlbXNKU09OKHRoaXMudGhlb3JlbXMpLFxuICAgICAgICAgIHZhcmlhYmxlc0pTT04gPSB2YXJpYWJsZXNUb1ZhcmlhYmxlc0pTT04odGhpcy52YXJpYWJsZXMpLFxuICAgICAgICAgIGNvbmplY3R1cmVzSlNPTiA9IGNvbmplY3R1cmVzVG9Db25qZWN0dXJlc0pTT04odGhpcy5jb25qZWN0dXJlcyksXG4gICAgICAgICAgY29tYmluYXRvcnNKU09OID0gY29tYmluYXRvcnNUb0NvbWJpbmF0b3JzSlNPTih0aGlzLmNvbWJpbmF0b3JzKSxcbiAgICAgICAgICB0eXBlUHJlZml4ZXNKU09OID0gdHlwZVByZWZpeGVzVG9UeXBlUHJlZml4ZXNKU09OKHRoaXMudHlwZVByZWZpeGVzKSxcbiAgICAgICAgICBjb25zdHJ1Y3RvcnNKU09OID0gY29uc3RydWN0b3JzVG9Db25zdHJ1Y3RvcnNKU09OKHRoaXMuY29uc3RydWN0b3JzKSxcbiAgICAgICAgICBtZXRhdGhlb3JlbXNKU09OID0gbWV0YXRoZW9yZW1zVG9NZXRhdGhlb3JlbXNKU09OKHRoaXMubWV0YXRoZW9yZW1zKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVzSlNPTiA9IG1ldGF2YXJpYWJsZXNUb01ldGF2YXJpYWJsZXNKU09OKHRoaXMubWV0YXZhcmlhYmxlcyksXG4gICAgICAgICAgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoLFxuICAgICAgICAgIHR5cGVzID0gdHlwZXNKU09OLCAgLy8vXG4gICAgICAgICAgcnVsZXMgPSBydWxlc0pTT04sICAvLy9cbiAgICAgICAgICBheGlvbXMgPSBheGlvbXNKU09OLCAgLy8vXG4gICAgICAgICAgdGhlb3JlbXMgPSB0aGVvcmVtc0pTT04sICAvLy9cbiAgICAgICAgICB2YXJpYWJsZXMgPSB2YXJpYWJsZXNKU09OLCAgLy8vXG4gICAgICAgICAgY29uamVjdHVyZXMgPSBjb25qZWN0dXJlc0pTT04sICAvLy9cbiAgICAgICAgICBjb21iaW5hdG9ycyA9IGNvbWJpbmF0b3JzSlNPTiwgIC8vL1xuICAgICAgICAgIHR5cGVQcmVmaXhlcyA9IHR5cGVQcmVmaXhlc0pTT04sICAvLy9cbiAgICAgICAgICBjb25zdHJ1Y3RvcnMgPSBjb25zdHJ1Y3RvcnNKU09OLCAgLy8vXG4gICAgICAgICAgbWV0YXRoZW9yZW1zID0gbWV0YXRoZW9yZW1zSlNPTiwgIC8vL1xuICAgICAgICAgIG1ldGF2YXJpYWJsZXMgPSBtZXRhdmFyaWFibGVzSlNPTiwgIC8vL1xuICAgICAgICAgIGpzb24gPSB7XG4gICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgIHR5cGVzLFxuICAgICAgICAgICAgcnVsZXMsXG4gICAgICAgICAgICBheGlvbXMsXG4gICAgICAgICAgICB0aGVvcmVtcyxcbiAgICAgICAgICAgIHZhcmlhYmxlcyxcbiAgICAgICAgICAgIGNvbmplY3R1cmVzLFxuICAgICAgICAgICAgY29tYmluYXRvcnMsXG4gICAgICAgICAgICB0eXBlUHJlZml4ZXMsXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcnMsXG4gICAgICAgICAgICBtZXRhdGhlb3JlbXMsXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVzXG4gICAgICAgICAgfTtcblxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgc3RhdGljIGZyb21GaWxlKGZpbGUsIGNvbnRleHQpIHtcbiAgICBjb25zdCByZWxlYXNlQ29udGV4dCA9IGNvbnRleHQsIC8vL1xuICAgICAgICAgIGNvbWJpbmVkQ3VzdG9tR3JhbW1hciA9IHJlbGVhc2VDb250ZXh0LmdldENvbWJpbmVkQ3VzdG9tR3JhbW1hcigpLFxuICAgICAgICAgIG5vbWluYWxMZXhlciA9IG5vbWluYWxMZXhlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIoTm9taW5hbExleGVyLCBjb21iaW5lZEN1c3RvbUdyYW1tYXIpLFxuICAgICAgICAgIG5vbWluYWxQYXJzZXIgPSBub21pbmFsUGFyc2VyRnJvbUNvbWJpbmVkQ3VzdG9tR3JhbW1hcihOb21pbmFsUGFyc2VyLCBjb21iaW5lZEN1c3RvbUdyYW1tYXIpLFxuICAgICAgICAgIGxleGVyID0gbm9taW5hbExleGVyLCAvLy9cbiAgICAgICAgICBwYXJzZXIgPSBub21pbmFsUGFyc2VyLCAvLy9cbiAgICAgICAgICB0eXBlcyA9IFtdLFxuICAgICAgICAgIHJ1bGVzID0gW10sXG4gICAgICAgICAgYXhpb21zID0gW10sXG4gICAgICAgICAgbGVtbWFzID0gW10sXG4gICAgICAgICAgdGhlb3JlbXMgPSBbXSxcbiAgICAgICAgICB2YXJpYWJsZXMgPSBbXSxcbiAgICAgICAgICBtZXRhTGVtbWFzID0gW10sXG4gICAgICAgICAgY29uamVjdHVyZXMgPSBbXSxcbiAgICAgICAgICBjb21iaW5hdG9ycyA9IFtdLFxuICAgICAgICAgIHR5cGVQcmVmaXhlcyA9IFtdLFxuICAgICAgICAgIGNvbnN0cnVjdG9ycyA9IFtdLFxuICAgICAgICAgIG1ldGF0aGVvcmVtcyA9IFtdLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZXMgPSBbXSxcbiAgICAgICAgICBub21pbmFsRmlsZUNvbnRleHQgPSBGaWxlQ29udGV4dC5mcm9tRmlsZShOb21pbmFsRmlsZUNvbnRleHQsIGZpbGUsIGxleGVyLCBwYXJzZXIsIHR5cGVzLCBydWxlcywgYXhpb21zLCBsZW1tYXMsIHRoZW9yZW1zLCB2YXJpYWJsZXMsIG1ldGFMZW1tYXMsIGNvbmplY3R1cmVzLCBjb21iaW5hdG9ycywgdHlwZVByZWZpeGVzLCBjb25zdHJ1Y3RvcnMsIG1ldGF0aGVvcmVtcywgbWV0YXZhcmlhYmxlcywgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbm9taW5hbEZpbGVDb250ZXh0O1xuICB9XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCByZWxlYXNlQ29udGV4dCA9IGNvbnRleHQsIC8vL1xuICAgICAgICAgIGNvbWJpbmVkQ3VzdG9tR3JhbW1hciA9IHJlbGVhc2VDb250ZXh0LmdldENvbWJpbmVkQ3VzdG9tR3JhbW1hcigpLFxuICAgICAgICAgIG5vbWluYWxMZXhlciA9IG5vbWluYWxMZXhlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIoTm9taW5hbExleGVyLCBjb21iaW5lZEN1c3RvbUdyYW1tYXIpLFxuICAgICAgICAgIG5vbWluYWxQYXJzZXIgPSBub21pbmFsUGFyc2VyRnJvbUNvbWJpbmVkQ3VzdG9tR3JhbW1hcihOb21pbmFsUGFyc2VyLCBjb21iaW5lZEN1c3RvbUdyYW1tYXIpLFxuICAgICAgICAgIGxleGVyID0gbm9taW5hbExleGVyLCAvLy9cbiAgICAgICAgICBwYXJzZXIgPSBub21pbmFsUGFyc2VyLCAvLy9cbiAgICAgICAgICB0eXBlcyA9IG51bGwsXG4gICAgICAgICAgcnVsZXMgPSBudWxsLFxuICAgICAgICAgIGF4aW9tcyA9IG51bGwsXG4gICAgICAgICAgbGVtbWFzID0gbnVsbCxcbiAgICAgICAgICB0aGVvcmVtcyA9IG51bGwsXG4gICAgICAgICAgdmFyaWFibGVzID0gbnVsbCxcbiAgICAgICAgICBtZXRhTGVtbWFzID0gbnVsbCxcbiAgICAgICAgICBjb25qZWN0dXJlcyA9IG51bGwsXG4gICAgICAgICAgY29tYmluYXRvcnMgPSBudWxsLFxuICAgICAgICAgIHR5cGVQcmVmaXhlcyA9IG51bGwsXG4gICAgICAgICAgY29uc3RydWN0b3JzID0gbnVsbCxcbiAgICAgICAgICBtZXRhdGhlb3JlbXMgPSBudWxsLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZXMgPSBudWxsLFxuICAgICAgICAgIG5vbWluYWxGaWxlQ29udGV4dCA9IEZpbGVDb250ZXh0LmZyb21KU09OKE5vbWluYWxGaWxlQ29udGV4dCwganNvbiwgbGV4ZXIsIHBhcnNlciwgdHlwZXMsIHJ1bGVzLCBheGlvbXMsIGxlbW1hcywgdGhlb3JlbXMsIHZhcmlhYmxlcywgbWV0YUxlbW1hcywgY29uamVjdHVyZXMsIGNvbWJpbmF0b3JzLCB0eXBlUHJlZml4ZXMsIGNvbnN0cnVjdG9ycywgbWV0YXRoZW9yZW1zLCBtZXRhdmFyaWFibGVzLCBjb250ZXh0KTtcblxuICAgIG5vbWluYWxGaWxlQ29udGV4dC5pbml0aWFsaXNlKGpzb24pO1xuXG4gICAgcmV0dXJuIG5vbWluYWxGaWxlQ29udGV4dDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIk5vbWluYWxGaWxlQ29udGV4dCIsInB1c2giLCJhcnJheVV0aWxpdGllcyIsImZpbHRlciIsIm5vbWluYWxMZXhlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIiLCJsZXhlcnNVdGlsaXRpZXMiLCJub21pbmFsUGFyc2VyRnJvbUNvbWJpbmVkQ3VzdG9tR3JhbW1hciIsInBhcnNlcnNVdGlsaXRpZXMiLCJjb250ZXh0IiwiZmlsZVBhdGgiLCJ0b2tlbnMiLCJub2RlIiwibGV4ZXIiLCJwYXJzZXIiLCJ0eXBlcyIsInJ1bGVzIiwiYXhpb21zIiwibGVtbWFzIiwidGhlb3JlbXMiLCJ2YXJpYWJsZXMiLCJtZXRhTGVtbWFzIiwiY29uamVjdHVyZXMiLCJjb21iaW5hdG9ycyIsInR5cGVQcmVmaXhlcyIsImNvbnN0cnVjdG9ycyIsIm1ldGF0aGVvcmVtcyIsIm1ldGF2YXJpYWJsZXMiLCJnZXRMZXhlciIsImdldFBhcnNlciIsImdldEp1ZGdlbWVudHMiLCJqdWRnZW1lbnRzIiwiZ2V0RXF1aXZhbGVuY2VzIiwiRXF1aXZhbGVuY2VzIiwiZWxlbWVudHMiLCJlcXVpdmFsZW5jZXMiLCJmcm9tTm90aGluZyIsImdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMiLCJzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zIiwiZ2V0TGFiZWxzIiwiaW5jbHVkZVJlbGVhc2UiLCJsYWJlbHMiLCJyZWxlYXNlQ29udGV4dExhYmVscyIsImZvckVhY2giLCJydWxlIiwicnVsZUxhYmVscyIsImF4aW9tIiwiYXhpb21MYWJlbHMiLCJsZW1tYSIsImxlbW1hTGFiZWxzIiwidGhlb3JlbSIsInRoZW9yZW1MYWJlbHMiLCJjb25qZWN0dXJlIiwiY29uamVjdHVyZUxhYmVscyIsIm1ldGF0aGVvcmVtIiwibWV0YXRoZW9yZW1MYWJlbCIsImdldExhYmVsIiwiZ2V0VHlwZXMiLCJpbmNsdWRlRGVwZW5kZW5jaWVzIiwiZ2V0UnVsZXMiLCJnZXRBeGlvbXMiLCJnZXRMZW1tYXMiLCJnZXRUaGVvcmVtcyIsImdldFZhcmlhYmxlcyIsImdldFByb2NlZHVyZXMiLCJwcm9jZWR1cmVzIiwiZ2V0TWV0YUxlbW1hcyIsImdldENvbmplY3R1cmVzIiwiZ2V0Q29tYmluYXRvcnMiLCJnZXRUeXBlUHJlZml4ZXMiLCJnZXRDb25zdHJ1Y3RvcnMiLCJnZXRNZXRhdGhlb3JlbXMiLCJnZXRNZXRhdmFyaWFibGVzIiwiYWRkVHlwZSIsInR5cGUiLCJnZXRGaWxlUGF0aCIsInR5cGVTdHJpbmciLCJnZXRTdHJpbmciLCJ0cmFjZSIsImFkZFJ1bGUiLCJydWxlU3RyaW5nIiwiYWRkQXhpb20iLCJheGlvbVN0cmluZyIsImFkZExlbW1hIiwibGVtbWFTdHJpbmciLCJhZGRUaGVvcmVtIiwidGhlb3JlbVN0cmluZyIsImFkZFZhcmlhYmxlIiwidmFyaWFibGUiLCJ2YXJpYWJsZVN0cmluZyIsImFkZE1ldGFMZW1tYSIsIm1ldGFMZW1tYSIsIm1ldGFMZW1tYVN0cmluZyIsImFkZENvbmplY3R1cmUiLCJvY25qZWN0dXJlU3RyaW5nIiwib2NuamVjdHVyZSIsImFkZENvbWJpbmF0b3IiLCJjb21iaW5hdG9yIiwiY29tYmluYXRvclN0cmluZyIsImFkZFR5cGVQcmVmaXgiLCJ0eXBlUHJlZml4IiwidHlwZVByZWZpeFN0cmluZyIsImFkZENvbnN0cnVjdG9yIiwiY29uc3RydWN0b3IiLCJjb25zdHJ1Y3RvclN0cmluZyIsImFkZE1ldGF0aGVvcmVtIiwibWV0YXRoZW9yZW1TdHJpbmciLCJhZGRNZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVTdHJpbmciLCJmaW5kTWV0YXZhcmlhYmxlIiwic3BlY2lmaWNNZXRhdmFyaWFibGUiLCJmaW5kIiwiZ2VuZXJhbE1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZVVuaWZpZXMiLCJ1bmlmeU1ldGF2YXJpYWJsZSIsImZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlIiwibGFiZWwiLCJsYWJlbE1ldGF2YXJpYWJsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGUiLCJjb21wYXJlTWV0YXZhcmlhYmxlIiwiZmluZE1ldGFUeXBlQnlNZXRhVHlwZU5hbWUiLCJtZXRhVHlwZU5hbWUiLCJtZXRhVHlwZSIsImZpbmRSdWxlQnlSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJtZXRhdmFyaWFibGVOYW1lIiwiZ2V0TWV0YXZhcmlhYmxlTmFtZSIsInJ1bGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImNvbXBhcmVNZXRhdmFyaWFibGVOYW1lIiwiZmluZEF4aW9tQnlSZWZlcmVuY2UiLCJheGlvbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiZmluZExlbW1hQnlSZWZlcmVuY2UiLCJsZW1tYUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiZmluZFRoZW9yZW1CeVJlZmVyZW5jZSIsInRoZW9yZW1Db21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImZpbmRNZXRhTGVtbWFCeVJlZmVyZW5jZSIsIm1ldGFMZW1tYUNvbXBhcmVzVG9SZWZlcmVuY2UiLCJjb21wYXJlUmVmZXJlbmNlIiwiZmluZENvbmplY3R1cmVCeVJlZmVyZW5jZSIsImNvbmplY3R1cmVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImZpbmRNZXRhTGVtbWFzQnlSZWZlcmVuY2UiLCJ0b3BMZXZlbE1ldGFBc3NlcnRpb24iLCJ0b3BMZXZlbE1ldGFBc3NlcnRpb25VbmlmaWVzIiwidW5pZnlUb3BMZXZlbE1ldGFBc3NlcnRpb24iLCJmaW5kTWV0YXRoZW9yZW1CeVJlZmVyZW5jZSIsIm1ldGF0aGVvcmVtQ29tcGFyZXNUb1JlZmVyZW5jZSIsImZpbmRNZXRhdGhlb3JlbXNCeVJlZmVyZW5jZSIsImZpbmRUb3BMZXZlbEFzc2VydGlvbkJ5UmVmZXJlbmNlIiwidG9wTGV2ZWxBc3NlcnRpb24iLCJmaW5kVG9wTGV2ZWxNZXRhQXNzZXJ0aW9uQnlSZWZlcmVuY2UiLCJmaW5kVG9wTGV2ZWxNZXRhQXNzZXJ0aW9uc0J5UmVmZXJlbmNlIiwidG9wTGV2ZWxNZXRhQXNzZXJ0aW9ucyIsImZpbmRUeXBlQnlUeXBlTmFtZSIsInR5cGVOYW1lIiwiYmFzZVR5cGUiLCJiYXNlVHlwZUZyb21Ob3RoaW5nIiwidHlwZUNvbXBhcmVzVG9UeXBlTmFtZSIsImNvbXBhcmVUeXBlTmFtZSIsImZpbmRUeXBlQnlOb21pbmFsVHlwZU5hbWUiLCJub21pbmFsVHlwZU5hbWUiLCJ0eXBlQ29tcGFyZXNUb05vbWluYWxUeXBlTmFtZSIsImNvbXBhcmVOb21pbmFsVHlwZU5hbWUiLCJmaW5kVHlwZUJ5UHJlZml4ZWRUeXBlTmFtZSIsInByZWZpeGVkVHlwZU5hbWUiLCJ0eXBlQ29tcGFyZXNUb1ByZWZpeGVkVHlwZU5hbWUiLCJjb21wYXJlUHJlZml4ZWRUeXBlTmFtZSIsImZpbmRUeXBlUHJlZml4QnlUeXBlUHJlZml4TmFtZSIsInR5cGVQcmVmaXhOYW1lIiwidHlwZVByZWZpeENvbXBhcmVzVG9UeXBlUHJlZml4TmFtZSIsImNvbXBhcmVUeXBlUHJlZml4TmFtZSIsImZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlTmFtZSIsImxhYmVsQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUiLCJmaW5kSnVkZ2VtZW50QnlNZXRhdmFyaWFibGVOYW1lIiwianVkZ2VtZW50IiwianVkZ2VtZW50TWV0YXZhcmlhYmxlQ29tcGFyZXNUb01ldGF2YXJpYWJsZSIsImZpbmRWYXJpYWJsZUJ5VmFyaWFibGVJZGVudGlmaWVyIiwidmFyaWFibGVJZGVudGlmaWVyIiwidmFyaWFibGVDb21wYXJlc1RvVmFyaWFibGVJZGVudGlmaWVyIiwiY29tcGFyZVZhcmlhYmxlSWRlbnRpZmllciIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUiLCJtZXRhdmFyaWFibGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImZpbmRQcm9jZWR1cmVCeVByb2NlZHVyZU5hbWUiLCJwcm9jZWR1cmVOYW1lIiwicHJvY2VkdXJlIiwicHJvY2VkdXJlQ29tcGFyZXNUb1Byb2NlZHVyZU5hbWUiLCJjb21wYXJlUHJvY2VkdXJlTmFtZSIsImlzTWV0YXZhcmlhYmxlUHJlc2VudCIsIm1ldGF2YXJpYWJsZVByZXNlbnQiLCJpc0xhYmVsUHJlc2VudEJ5TWV0YXZhcmlhYmxlIiwibGFiZWxQcmVzZW50IiwiaXNMYWJlbFByZXNlbnRCeVJlZmVyZW5jZSIsInNvbWUiLCJsYWJlbFVuaWZpZXMiLCJ1bmlmeUxhYmVsIiwiaXNNZXRhdmFyaWFibGVQcmVzZW50QnlSZWZlcmVuY2UiLCJpc1RvcExldmVsTWV0YUFzc2VydGlvblByZXNlbnRCeVJlZmVyZW5jZSIsInRvcExldmVsTWV0YUFzc2VydGlvblByZXNlbnQiLCJpc1R5cGVQcmVzZW50QnlUeXBlTmFtZSIsInR5cGVQcmVzZW50IiwiaXNUeXBlUHJlc2VudEJ5Tm9taW5hbFR5cGVOYW1lIiwiaXNUeXBlUHJlc2VudEJ5UHJlZml4ZWRUeXBlTmFtZSIsImlzTGFiZWxQcmVzZW50QnlNZXRhdmFyaWFibGVOYW1lIiwiaXNUeXBlUHJlZml4UHJlc2VudEJ5VHlwZVByZWZpeE5hbWUiLCJ0eXBlUHJlZml4UHJlc2VudCIsImlzVmFyaWFibGVQcmVzZW50QnlWYXJpYWJsZUlkZW50aWZpZXIiLCJ2YXJpYWJsZVByZXNlbnQiLCJpc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUiLCJpc1Byb2NlZHVyZVByZXNlbnRCeVByb2NlZHVyZU5hbWUiLCJwcm9jZWR1cmVQcmVzZW50IiwiY2xlYXIiLCJjb21wbGV0ZSIsInZlcmlmeUZpbGUiLCJmaWxlTm9kZSIsImZpbGVWZXJpZmllcyIsImdldE5vZGUiLCJpbml0aWFsaXNlIiwianNvbiIsImZpbGVDb250ZXh0IiwidHlwZXNGcm9tSlNPTiIsImxlbW1hc0Zyb21Ob3RoaW5nIiwibWV0YUxlbW1hc0Zyb21Ob3RoaW5nIiwibWV0YXZhcmlhYmxlc0Zyb21KU09OIiwidmFyaWFibGVzRnJvbUpTT04iLCJydWxlc0Zyb21KU09OIiwiYXhpb21zRnJvbUpTT04iLCJ0aGVvcmVtc0Zyb21KU09OIiwiY29uamVjdHVyZXNGcm9tSlNPTiIsImNvbWJpbmF0b3JzRnJvbUpTT04iLCJ0eXBlUHJlZml4ZXNGcm9tSlNPTiIsImNvbnN0cnVjdG9yc0Zyb21KU09OIiwibWV0YXRoZW9yZW1zRnJvbUpTT04iLCJ0b0pTT04iLCJ0eXBlc0pTT04iLCJ0eXBlc1RvVHlwZXNKU09OIiwicnVsZXNKU09OIiwicnVsZXNUb1J1bGVzSlNPTiIsImF4aW9tc0pTT04iLCJheGlvbXNUb0F4aW9tc0pTT04iLCJ0aGVvcmVtc0pTT04iLCJ0aGVvcmVtc1RvVGhlb3JlbXNKU09OIiwidmFyaWFibGVzSlNPTiIsInZhcmlhYmxlc1RvVmFyaWFibGVzSlNPTiIsImNvbmplY3R1cmVzSlNPTiIsImNvbmplY3R1cmVzVG9Db25qZWN0dXJlc0pTT04iLCJjb21iaW5hdG9yc0pTT04iLCJjb21iaW5hdG9yc1RvQ29tYmluYXRvcnNKU09OIiwidHlwZVByZWZpeGVzSlNPTiIsInR5cGVQcmVmaXhlc1RvVHlwZVByZWZpeGVzSlNPTiIsImNvbnN0cnVjdG9yc0pTT04iLCJjb25zdHJ1Y3RvcnNUb0NvbnN0cnVjdG9yc0pTT04iLCJtZXRhdGhlb3JlbXNKU09OIiwibWV0YXRoZW9yZW1zVG9NZXRhdGhlb3JlbXNKU09OIiwibWV0YXZhcmlhYmxlc0pTT04iLCJtZXRhdmFyaWFibGVzVG9NZXRhdmFyaWFibGVzSlNPTiIsImZyb21GaWxlIiwiZmlsZSIsInJlbGVhc2VDb250ZXh0IiwiY29tYmluZWRDdXN0b21HcmFtbWFyIiwiZ2V0Q29tYmluZWRDdXN0b21HcmFtbWFyIiwibm9taW5hbExleGVyIiwiTm9taW5hbExleGVyIiwibm9taW5hbFBhcnNlciIsIk5vbWluYWxQYXJzZXIiLCJub21pbmFsRmlsZUNvbnRleHQiLCJGaWxlQ29udGV4dCIsImZyb21KU09OIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztlQTBDcUJBOzs7OEJBeENPO3lCQUNHOzRCQUNtQjsrREFFN0I7NERBQ0k7NkRBQ0M7c0JBRUM7b0JBQ1M7eUJBQ087b0JBd0JNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVqRCxJQUFRQyxPQUFpQkMseUJBQWMsQ0FBL0JELE1BQU1FLFNBQVdELHlCQUFjLENBQXpCQyxRQUNSLEFBQUVDLHdDQUEwQ0MsNkJBQWUsQ0FBekRELHVDQUNGLEFBQUVFLHlDQUEyQ0MsOEJBQWdCLENBQTNERDtBQUVPLElBQUEsQUFBTU4sbUNBQU47Y0FBTUE7YUFBQUEsbUJBQ1BRLE9BQU8sRUFBRUMsUUFBUSxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFFQyxNQUFNLEVBQUVDLEtBQUssRUFBRUMsS0FBSyxFQUFFQyxNQUFNLEVBQUVDLE1BQU0sRUFBRUMsUUFBUSxFQUFFQyxTQUFTLEVBQUVDLFVBQVUsRUFBRUMsV0FBVyxFQUFFQyxXQUFXLEVBQUVDLFlBQVksRUFBRUMsWUFBWSxFQUFFQyxZQUFZLEVBQUVDLGFBQWE7Z0NBRHpMMUI7O2dCQUVqQixrQkFGaUJBO1lBRVhRO1lBQVNDO1lBQVVDO1lBQVFDOztRQUVqQyxNQUFLQyxLQUFLLEdBQUdBO1FBQ2IsTUFBS0MsTUFBTSxHQUFHQTtRQUNkLE1BQUtMLE9BQU8sR0FBR0E7UUFDZixNQUFLQyxRQUFRLEdBQUdBO1FBQ2hCLE1BQUtDLE1BQU0sR0FBR0E7UUFDZCxNQUFLQyxJQUFJLEdBQUdBO1FBQ1osTUFBS0csS0FBSyxHQUFHQTtRQUNiLE1BQUtDLEtBQUssR0FBR0E7UUFDYixNQUFLQyxNQUFNLEdBQUdBO1FBQ2QsTUFBS0MsTUFBTSxHQUFHQTtRQUNkLE1BQUtDLFFBQVEsR0FBR0E7UUFDaEIsTUFBS0MsU0FBUyxHQUFHQTtRQUNqQixNQUFLQyxVQUFVLEdBQUdBO1FBQ2xCLE1BQUtDLFdBQVcsR0FBR0E7UUFDbkIsTUFBS0MsV0FBVyxHQUFHQTtRQUNuQixNQUFLQyxZQUFZLEdBQUdBO1FBQ3BCLE1BQUtDLFlBQVksR0FBR0E7UUFDcEIsTUFBS0MsWUFBWSxHQUFHQTtRQUNwQixNQUFLQyxhQUFhLEdBQUdBOzs7a0JBdEJKMUI7O1lBeUJuQjJCLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ2YsS0FBSztZQUNuQjs7O1lBRUFnQixLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsT0FBTyxJQUFJLENBQUNmLE1BQU07WUFDcEI7OztZQUVBZ0IsS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNFLElBQU1DLGFBQWEsRUFBRTtnQkFFckIsT0FBT0E7WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxJQUFNLEFBQUVDLGVBQWlCQyxpQkFBUSxDQUF6QkQsY0FDRnhCLFVBQVUsSUFBSSxFQUNkMEIsZUFBZUYsYUFBYUcsV0FBVyxDQUFDM0I7Z0JBRTlDLE9BQU8wQjtZQUNUOzs7WUFFQUUsS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNFLElBQU1DLDRCQUE0QixFQUFFO2dCQUVwQyxPQUFPQTtZQUNUOzs7WUFFQUMsS0FBQUE7bUJBQUFBLFNBQUFBO29CQUFVQyxpQkFBQUEsaUVBQWlCO2dCQUN6QixJQUFNQyxTQUFTLEVBQUU7Z0JBRWpCLElBQUlELGdCQUFnQjtvQkFDbEIsSUFBTUUsdUJBQXVCLElBQUksQ0FBQ2pDLE9BQU8sQ0FBQzhCLFNBQVM7b0JBRW5EckMsS0FBS3VDLFFBQVFDO2dCQUNmLE9BQU87b0JBQ0wsSUFBSSxDQUFDMUIsS0FBSyxDQUFDMkIsT0FBTyxDQUFDLFNBQUNDO3dCQUNsQixJQUFNQyxhQUFhRCxLQUFLTCxTQUFTO3dCQUVqQ3JDLEtBQUt1QyxRQUFRSTtvQkFDZjtvQkFFQSxJQUFJLENBQUM1QixNQUFNLENBQUMwQixPQUFPLENBQUMsU0FBQ0c7d0JBQ25CLElBQU1DLGNBQWNELE1BQU1QLFNBQVM7d0JBRW5DckMsS0FBS3VDLFFBQVFNO29CQUNmO29CQUVBLElBQUksQ0FBQzdCLE1BQU0sQ0FBQ3lCLE9BQU8sQ0FBQyxTQUFDSzt3QkFDbkIsSUFBTUMsY0FBY0QsTUFBTVQsU0FBUzt3QkFFbkNyQyxLQUFLdUMsUUFBUVE7b0JBQ2Y7b0JBRUEsSUFBSSxDQUFDOUIsUUFBUSxDQUFDd0IsT0FBTyxDQUFDLFNBQUNPO3dCQUNyQixJQUFNQyxnQkFBZ0JELFFBQVFYLFNBQVM7d0JBRXZDckMsS0FBS3VDLFFBQVFVO29CQUNmO29CQUVBLElBQUksQ0FBQzdCLFdBQVcsQ0FBQ3FCLE9BQU8sQ0FBQyxTQUFDUzt3QkFDeEIsSUFBTUMsbUJBQW1CRCxXQUFXYixTQUFTO3dCQUU3Q3JDLEtBQUt1QyxRQUFRWTtvQkFDZjtvQkFFQSxJQUFJLENBQUMzQixZQUFZLENBQUNpQixPQUFPLENBQUMsU0FBQ1c7d0JBQ3pCLElBQU1DLG1CQUFtQkQsWUFBWUUsUUFBUTt3QkFFN0NmLE9BQU92QyxJQUFJLENBQUNxRDtvQkFDZDtnQkFDRjtnQkFFQSxPQUFPZDtZQUNUOzs7WUFFQWdCLEtBQUFBO21CQUFBQSxTQUFBQTtvQkFBU2pCLGlCQUFBQSxpRUFBaUIsTUFBTWtCLHNCQUFBQSxpRUFBc0I7Z0JBQ3BELElBQU0zQyxRQUFReUIsaUJBQ0UsSUFBSSxDQUFDL0IsT0FBTyxDQUFDZ0QsUUFBUSxDQUFDQyx1QkFDcEIsSUFBSSxDQUFDM0MsS0FBSztnQkFFNUIsT0FBT0E7WUFDVDs7O1lBRUE0QyxLQUFBQTttQkFBQUEsU0FBQUE7b0JBQVNuQixpQkFBQUEsaUVBQWlCO2dCQUN4QixJQUFNeEIsUUFBUXdCLGlCQUNFLElBQUksQ0FBQy9CLE9BQU8sQ0FBQ2tELFFBQVEsS0FDbkIsSUFBSSxDQUFDM0MsS0FBSztnQkFFNUIsT0FBT0E7WUFDVDs7O1lBRUE0QyxLQUFBQTttQkFBQUEsU0FBQUE7b0JBQVVwQixpQkFBQUEsaUVBQWlCO2dCQUN6QixJQUFNdkIsU0FBU3VCLGlCQUNFLElBQUksQ0FBQy9CLE9BQU8sQ0FBQ21ELFNBQVMsS0FDcEIsSUFBSSxDQUFDM0MsTUFBTTtnQkFFOUIsT0FBT0E7WUFDVDs7O1lBRUE0QyxLQUFBQTttQkFBQUEsU0FBQUE7b0JBQVVyQixpQkFBQUEsaUVBQWlCO2dCQUN6QixJQUFNdEIsU0FBU3NCLGlCQUNFLElBQUksQ0FBQy9CLE9BQU8sQ0FBQ29ELFNBQVMsS0FDcEIsSUFBSSxDQUFDM0MsTUFBTTtnQkFFOUIsT0FBT0E7WUFDVDs7O1lBRUE0QyxLQUFBQTttQkFBQUEsU0FBQUE7b0JBQVl0QixpQkFBQUEsaUVBQWlCO2dCQUMzQixJQUFNckIsV0FBV3FCLGlCQUNFLElBQUksQ0FBQy9CLE9BQU8sQ0FBQ3FELFdBQVcsS0FDdEIsSUFBSSxDQUFDM0MsUUFBUTtnQkFFbEMsT0FBT0E7WUFDVDs7O1lBRUE0QyxLQUFBQTttQkFBQUEsU0FBQUE7b0JBQWF2QixpQkFBQUEsaUVBQWlCO2dCQUM1QixPQUFPLElBQUksQ0FBQ3BCLFNBQVM7WUFDdkI7OztZQUVBNEMsS0FBQUE7bUJBQUFBLFNBQUFBO29CQUFjeEIsaUJBQUFBLGlFQUFpQjtnQkFDN0IsSUFBTXlCLGFBQWF6QixpQkFDRSxJQUFJLENBQUMvQixPQUFPLENBQUN1RCxhQUFhLEtBQ3hCLE1BQU8sR0FBRztnQkFFakMsT0FBT0M7WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQTtvQkFBYzFCLGlCQUFBQSxpRUFBaUI7Z0JBQzdCLElBQU1uQixhQUFhbUIsaUJBQ0UsSUFBSSxDQUFDL0IsT0FBTyxDQUFDeUQsYUFBYSxLQUN4QixJQUFJLENBQUM3QyxVQUFVO2dCQUV0QyxPQUFPQTtZQUNUOzs7WUFFQThDLEtBQUFBO21CQUFBQSxTQUFBQTtvQkFBZTNCLGlCQUFBQSxpRUFBaUI7Z0JBQzlCLElBQU1sQixjQUFja0IsaUJBQ0UsSUFBSSxDQUFDL0IsT0FBTyxDQUFDMEQsY0FBYyxLQUN6QixJQUFJLENBQUM3QyxXQUFXO2dCQUV4QyxPQUFPQTtZQUNUOzs7WUFFQThDLEtBQUFBO21CQUFBQSxTQUFBQTtvQkFBZTVCLGlCQUFBQSxpRUFBaUI7Z0JBQzlCLElBQU1qQixjQUFjaUIsaUJBQ0UsSUFBSSxDQUFDL0IsT0FBTyxDQUFDMkQsY0FBYyxLQUN6QixJQUFJLENBQUM3QyxXQUFXO2dCQUV4QyxPQUFPQTtZQUNUOzs7WUFFQThDLEtBQUFBO21CQUFBQSxTQUFBQTtvQkFBZ0I3QixpQkFBQUEsaUVBQWlCO2dCQUMvQixJQUFNaEIsZUFBZWdCLGlCQUNFLElBQUksQ0FBQy9CLE9BQU8sQ0FBQzRELGVBQWUsS0FDMUIsSUFBSSxDQUFDN0MsWUFBWTtnQkFFMUMsT0FBT0E7WUFDVDs7O1lBRUE4QyxLQUFBQTttQkFBQUEsU0FBQUE7b0JBQWdCOUIsaUJBQUFBLGlFQUFpQjtnQkFDL0IsSUFBTWYsZUFBZWUsaUJBQ0UsSUFBSSxDQUFDL0IsT0FBTyxDQUFDNkQsZUFBZSxLQUMxQixJQUFJLENBQUM3QyxZQUFZO2dCQUUxQyxPQUFPQTtZQUNUOzs7WUFFQThDLEtBQUFBO21CQUFBQSxTQUFBQTtvQkFBZ0IvQixpQkFBQUEsaUVBQWlCO2dCQUMvQixJQUFNZCxlQUFlYyxpQkFDRSxJQUFJLENBQUMvQixPQUFPLENBQUM4RCxlQUFlLEtBQzFCLElBQUksQ0FBQzdDLFlBQVk7Z0JBRTFDLE9BQU9BO1lBQ1Q7OztZQUVBOEMsS0FBQUE7bUJBQUFBLFNBQUFBO29CQUFpQmhDLGlCQUFBQSxpRUFBaUI7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDYixhQUFhO1lBQzNCOzs7WUFFQThDLEtBQUFBO21CQUFBQSxTQUFBQSxRQUFRQyxJQUFJO2dCQUNWLElBQUksQ0FBQzNELEtBQUssQ0FBQ2IsSUFBSSxDQUFDd0U7Z0JBRWhCLElBQU1oRSxXQUFXLElBQUksQ0FBQ2lFLFdBQVcsSUFDM0JDLGFBQWFGLEtBQUtHLFNBQVM7Z0JBRWpDLElBQUksQ0FBQ0MsS0FBSyxDQUFDLEFBQUMsY0FBeUNwRSxPQUE1QmtFLFlBQVcsbUJBQTBCLE9BQVRsRSxVQUFTO1lBQ2hFOzs7WUFFQXFFLEtBQUFBO21CQUFBQSxTQUFBQSxRQUFRbkMsSUFBSTtnQkFDVixJQUFJLENBQUM1QixLQUFLLENBQUNkLElBQUksQ0FBQzBDO2dCQUVoQixJQUFNbEMsV0FBVyxJQUFJLENBQUNpRSxXQUFXLElBQzNCSyxhQUFhcEMsS0FBS2lDLFNBQVM7Z0JBRWpDLElBQUksQ0FBQ0MsS0FBSyxDQUFDLEFBQUMsY0FBeUNwRSxPQUE1QnNFLFlBQVcsbUJBQTBCLE9BQVR0RSxVQUFTO1lBQ2hFOzs7WUFFQXVFLEtBQUFBO21CQUFBQSxTQUFBQSxTQUFTbkMsS0FBSztnQkFDWixJQUFJLENBQUM3QixNQUFNLENBQUNmLElBQUksQ0FBQzRDO2dCQUVqQixJQUFNcEMsV0FBVyxJQUFJLENBQUNpRSxXQUFXLElBQzNCTyxjQUFjcEMsTUFBTStCLFNBQVM7Z0JBRW5DLElBQUksQ0FBQ0MsS0FBSyxDQUFDLEFBQUMsY0FBMkNwRSxPQUE5QndFLGFBQVksb0JBQTJCLE9BQVR4RSxVQUFTO1lBQ2xFOzs7WUFFQXlFLEtBQUFBO21CQUFBQSxTQUFBQSxTQUFTbkMsS0FBSztnQkFDWixJQUFJLENBQUM5QixNQUFNLENBQUNoQixJQUFJLENBQUM4QztnQkFFakIsSUFBTXRDLFdBQVcsSUFBSSxDQUFDaUUsV0FBVyxJQUMzQlMsY0FBY3BDLE1BQU02QixTQUFTO2dCQUVuQyxJQUFJLENBQUNDLEtBQUssQ0FBQyxBQUFDLGNBQTJDcEUsT0FBOUIwRSxhQUFZLG9CQUEyQixPQUFUMUUsVUFBUztZQUNsRTs7O1lBRUEyRSxLQUFBQTttQkFBQUEsU0FBQUEsV0FBV25DLE9BQU87Z0JBQ2hCLElBQUksQ0FBQy9CLFFBQVEsQ0FBQ2pCLElBQUksQ0FBQ2dEO2dCQUVuQixJQUFNeEMsV0FBVyxJQUFJLENBQUNpRSxXQUFXLElBQzNCVyxnQkFBZ0JwQyxRQUFRMkIsU0FBUztnQkFFdkMsSUFBSSxDQUFDQyxLQUFLLENBQUMsQUFBQyxjQUErQ3BFLE9BQWxDNEUsZUFBYyxzQkFBNkIsT0FBVDVFLFVBQVM7WUFDdEU7OztZQUVBNkUsS0FBQUE7bUJBQUFBLFNBQUFBLFlBQVlDLFFBQVE7Z0JBQ2xCLElBQUksQ0FBQ3BFLFNBQVMsQ0FBQ2xCLElBQUksQ0FBQ3NGO2dCQUVwQixJQUFNOUUsV0FBVyxJQUFJLENBQUNpRSxXQUFXLElBQzNCYyxpQkFBaUJELFNBQVNYLFNBQVM7Z0JBRXpDLElBQUksQ0FBQ0MsS0FBSyxDQUFDLEFBQUMsY0FBaURwRSxPQUFwQytFLGdCQUFlLHVCQUE4QixPQUFUL0UsVUFBUztZQUN4RTs7O1lBRUFnRixLQUFBQTttQkFBQUEsU0FBQUEsYUFBYUMsU0FBUztnQkFDcEIsSUFBSSxDQUFDdEUsVUFBVSxDQUFDbkIsSUFBSSxDQUFDeUY7Z0JBRXJCLElBQU1qRixXQUFXLElBQUksQ0FBQ2lFLFdBQVcsSUFDM0JpQixrQkFBa0JELFVBQVVkLFNBQVM7Z0JBRTNDLElBQUksQ0FBQ0MsS0FBSyxDQUFDLEFBQUMsY0FBb0RwRSxPQUF2Q2tGLGlCQUFnQix5QkFBZ0MsT0FBVGxGLFVBQVM7WUFDM0U7OztZQUVBbUYsS0FBQUE7bUJBQUFBLFNBQUFBLGNBQWN6QyxVQUFVO2dCQUN0QixJQUFJLENBQUM5QixXQUFXLENBQUNwQixJQUFJLENBQUNrRDtnQkFFdEIsSUFBTTFDLFdBQVcsSUFBSSxDQUFDaUUsV0FBVyxJQUMzQm1CLG1CQUFtQkMsV0FBV2xCLFNBQVM7Z0JBRTdDLElBQUksQ0FBQ0MsS0FBSyxDQUFDLEFBQUMsY0FBcURwRSxPQUF4Q29GLGtCQUFpQix5QkFBZ0MsT0FBVHBGLFVBQVM7WUFDNUU7OztZQUVBc0YsS0FBQUE7bUJBQUFBLFNBQUFBLGNBQWNDLFVBQVU7Z0JBQ3RCLElBQUksQ0FBQzFFLFdBQVcsQ0FBQ3JCLElBQUksQ0FBQytGO2dCQUV0QixJQUFNdkYsV0FBVyxJQUFJLENBQUNpRSxXQUFXLElBQzNCdUIsbUJBQW1CRCxXQUFXcEIsU0FBUztnQkFFN0MsSUFBSSxDQUFDQyxLQUFLLENBQUMsQUFBQyxjQUFxRHBFLE9BQXhDd0Ysa0JBQWlCLHlCQUFnQyxPQUFUeEYsVUFBUztZQUM1RTs7O1lBRUF5RixLQUFBQTttQkFBQUEsU0FBQUEsY0FBY0MsVUFBVTtnQkFDdEIsSUFBSSxDQUFDNUUsWUFBWSxDQUFDdEIsSUFBSSxDQUFDa0c7Z0JBRXZCLElBQU0xRixXQUFXLElBQUksQ0FBQ2lFLFdBQVcsSUFDM0IwQixtQkFBbUJELFdBQVd2QixTQUFTO2dCQUU3QyxJQUFJLENBQUNDLEtBQUssQ0FBQyxBQUFDLGNBQXNEcEUsT0FBekMyRixrQkFBaUIsMEJBQWlDLE9BQVQzRixVQUFTO1lBQzdFOzs7WUFFQTRGLEtBQUFBO21CQUFBQSxTQUFBQSxlQUFlQyxXQUFXO2dCQUN4QixJQUFJLENBQUM5RSxZQUFZLENBQUN2QixJQUFJLENBQUNxRztnQkFFdkIsSUFBTTdGLFdBQVcsSUFBSSxDQUFDaUUsV0FBVyxJQUMzQjZCLG9CQUFvQkQsWUFBWTFCLFNBQVM7Z0JBRS9DLElBQUksQ0FBQ0MsS0FBSyxDQUFDLEFBQUMsY0FBdURwRSxPQUExQzhGLG1CQUFrQiwwQkFBaUMsT0FBVDlGLFVBQVM7WUFDOUU7OztZQUVBK0YsS0FBQUE7bUJBQUFBLFNBQUFBLGVBQWVuRCxXQUFXO2dCQUN4QixJQUFJLENBQUM1QixZQUFZLENBQUN4QixJQUFJLENBQUNvRDtnQkFFdkIsSUFBTTVDLFdBQVcsSUFBSSxDQUFDaUUsV0FBVyxJQUMzQitCLG9CQUFvQnBELFlBQVl1QixTQUFTO2dCQUUvQyxJQUFJLENBQUNDLEtBQUssQ0FBQyxBQUFDLGNBQXVEcEUsT0FBMUNnRyxtQkFBa0IsMEJBQWlDLE9BQVRoRyxVQUFTO1lBQzlFOzs7WUFFQWlHLEtBQUFBO21CQUFBQSxTQUFBQSxnQkFBZ0JDLFlBQVk7Z0JBQzFCLElBQUksQ0FBQ2pGLGFBQWEsQ0FBQ3pCLElBQUksQ0FBQzBHO2dCQUV4QixJQUFNbEcsV0FBVyxJQUFJLENBQUNpRSxXQUFXLElBQzNCa0MscUJBQXFCRCxhQUFhL0IsU0FBUztnQkFFakQsSUFBSSxDQUFDQyxLQUFLLENBQUMsQUFBQyxjQUF5RHBFLE9BQTVDbUcsb0JBQW1CLDJCQUFrQyxPQUFUbkcsVUFBUztZQUNoRjs7O1lBRUFvRyxLQUFBQTttQkFBQUEsU0FBQUEsaUJBQWlCRixZQUFZOztnQkFDM0IsSUFBTWpGLGdCQUFnQixJQUFJLENBQUM2QyxnQkFBZ0IsSUFDckN1Qyx1QkFBdUJILGNBQWUsR0FBRztnQkFFL0NBLGVBQWVqRixjQUFjcUYsSUFBSSxDQUFDLFNBQUNKO29CQUNqQyxJQUFNbkcsaUJBQ0F3RyxzQkFBc0JMLGNBQ3RCTSxzQkFBc0JELG9CQUFvQkUsaUJBQWlCLENBQUNKLHNCQUFzQnRHO29CQUV4RixJQUFJeUcscUJBQXFCO3dCQUN2QixPQUFPO29CQUNUO2dCQUNGLE1BQU07Z0JBRU4sT0FBT047WUFDVDs7O1lBRUFRLEtBQUFBO21CQUFBQSxTQUFBQSx3QkFBd0JSLFlBQVk7Z0JBQ2xDLElBQU1uRSxTQUFTLElBQUksQ0FBQ0YsU0FBUyxJQUN2QjhFLFFBQVE1RSxPQUFPdUUsSUFBSSxDQUFDLFNBQUNLO29CQUNuQixJQUFNQywwQ0FBMENELE1BQU1FLG1CQUFtQixDQUFDWDtvQkFFMUUsSUFBSVUseUNBQXlDO3dCQUMzQyxPQUFPO29CQUNUO2dCQUNGLE1BQU07Z0JBRVosT0FBT0Q7WUFDVDs7O1lBRUFHLEtBQUFBO21CQUFBQSxTQUFBQSwyQkFBMkJDLFlBQVk7Z0JBQ3JDLElBQU1DLFdBQVdGLElBQUFBLHFDQUEwQixFQUFDQztnQkFFNUMsT0FBT0M7WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSxvQkFBb0JDLFNBQVM7Z0JBQzNCLElBQU01RyxRQUFRLElBQUksQ0FBQzJDLFFBQVEsSUFDckJrRSxtQkFBbUJELFVBQVVFLG1CQUFtQixJQUNoRGxGLE9BQU81QixNQUFNZ0csSUFBSSxDQUFDLFNBQUNwRTtvQkFDakIsSUFBTW1GLGlDQUFpQ25GLEtBQUtvRix1QkFBdUIsQ0FBQ0g7b0JBRXBFLElBQUlFLGdDQUFnQzt3QkFDbEMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU9uRjtZQUNUOzs7WUFFQXFGLEtBQUFBO21CQUFBQSxTQUFBQSxxQkFBcUJMLFNBQVM7Z0JBQzVCLElBQU0zRyxTQUFTLElBQUksQ0FBQzJDLFNBQVMsSUFDdkJpRSxtQkFBbUJELFVBQVVFLG1CQUFtQixJQUNoRGhGLFFBQVE3QixPQUFPK0YsSUFBSSxDQUFDLFNBQUNsRTtvQkFDbkIsSUFBTW9GLGtDQUFrQ3BGLE1BQU1rRix1QkFBdUIsQ0FBQ0g7b0JBRXRFLElBQUlLLGlDQUFpQzt3QkFDbkMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU9wRjtZQUNUOzs7WUFFQXFGLEtBQUFBO21CQUFBQSxTQUFBQSxxQkFBcUJQLFNBQVM7Z0JBQzVCLElBQU0xRyxTQUFTLElBQUksQ0FBQzJDLFNBQVMsSUFDdkJnRSxtQkFBbUJELFVBQVVFLG1CQUFtQixJQUNoRDlFLFFBQVE5QixPQUFPOEYsSUFBSSxDQUFDLFNBQUNoRTtvQkFDbkIsSUFBTW9GLGtDQUFrQ3BGLE1BQU1nRix1QkFBdUIsQ0FBQ0g7b0JBRXRFLElBQUlPLGlDQUFpQzt3QkFDbkMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU9wRjtZQUNUOzs7WUFFQXFGLEtBQUFBO21CQUFBQSxTQUFBQSx1QkFBdUJULFNBQVM7Z0JBQzlCLElBQU16RyxXQUFXLElBQUksQ0FBQzJDLFdBQVcsSUFDM0IrRCxtQkFBbUJELFVBQVVFLG1CQUFtQixJQUNoRDVFLFVBQVUvQixTQUFTNkYsSUFBSSxDQUFDLFNBQUM5RDtvQkFDdkIsSUFBTW9GLG9DQUFvQ3BGLFFBQVE4RSx1QkFBdUIsQ0FBQ0g7b0JBRTFFLElBQUlTLG1DQUFtQzt3QkFDckMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU9wRjtZQUNUOzs7WUFFQXFGLEtBQUFBO21CQUFBQSxTQUFBQSx5QkFBeUJYLFNBQVM7Z0JBQ2hDLElBQU12RyxhQUFhLElBQUksQ0FBQzZDLGFBQWEsSUFDL0J5QixZQUFZdEUsV0FBVzJGLElBQUksQ0FBQyxTQUFDckI7b0JBQzNCLElBQU02QywrQkFBK0I3QyxVQUFVOEMsZ0JBQWdCLENBQUNiO29CQUVoRSxJQUFJWSw4QkFBOEI7d0JBQ2hDLE9BQU87b0JBQ1Q7Z0JBQ0YsTUFBTTtnQkFFWixPQUFPN0M7WUFDVDs7O1lBRUErQyxLQUFBQTttQkFBQUEsU0FBQUEsMEJBQTBCZCxTQUFTO2dCQUNqQyxJQUFNdEcsY0FBYyxJQUFJLENBQUM2QyxjQUFjLElBQ2pDMEQsbUJBQW1CRCxVQUFVRSxtQkFBbUIsSUFDaEQxRSxhQUFhOUIsWUFBWTBGLElBQUksQ0FBQyxTQUFDNUQ7b0JBQzdCLElBQU11Rix1Q0FBdUN2RixXQUFXNEUsdUJBQXVCLENBQUNIO29CQUVoRixJQUFJYyxzQ0FBc0M7d0JBQ3hDLE9BQU87b0JBQ1Q7Z0JBQ0YsTUFBTTtnQkFFWixPQUFPdkY7WUFDVDs7O1lBRUF3RixLQUFBQTttQkFBQUEsU0FBQUEsMEJBQTBCaEIsU0FBUzs7Z0JBQ2pDLElBQU12RyxhQUFhLElBQUksQ0FBQzZDLGFBQWE7Z0JBRXJDOUQsT0FBT2lCLFlBQVksU0FBQ3NFO29CQUNsQixJQUFNbEYsaUJBQ0FvSSx3QkFBd0JsRCxXQUN4Qm1ELCtCQUErQmxCLFVBQVVtQiwwQkFBMEIsQ0FBQ0YsdUJBQXVCcEk7b0JBRWpHLElBQUlxSSw4QkFBOEI7d0JBQ2hDLE9BQU87b0JBQ1Q7Z0JBQ0Y7Z0JBRUEsT0FBT3pIO1lBQ1Q7OztZQUVBMkgsS0FBQUE7bUJBQUFBLFNBQUFBLDJCQUEyQnBCLFNBQVM7Z0JBQ2xDLElBQU1sRyxlQUFlLElBQUksQ0FBQzZDLGVBQWUsSUFDdkNqQixjQUFjNUIsYUFBYXNGLElBQUksQ0FBQyxTQUFDMUQ7b0JBQy9CLElBQU0yRixpQ0FBaUMzRixZQUFZbUYsZ0JBQWdCLENBQUNiO29CQUVwRSxJQUFJcUIsZ0NBQWdDO3dCQUNsQyxPQUFPO29CQUNUO2dCQUNGLE1BQU07Z0JBRVIsT0FBTzNGO1lBQ1Q7OztZQUVBNEYsS0FBQUE7bUJBQUFBLFNBQUFBLDRCQUE0QnRCLFNBQVM7O2dCQUNuQyxJQUFNbEcsZUFBZSxJQUFJLENBQUM2QyxlQUFlO2dCQUV6Q25FLE9BQU9zQixjQUFjLFNBQUM0QjtvQkFDcEIsSUFBTTdDLGlCQUNBb0ksd0JBQXdCdkYsYUFDeEJ3RiwrQkFBK0JsQixVQUFVbUIsMEJBQTBCLENBQUNGLHVCQUF1QnBJO29CQUVqRyxJQUFJcUksOEJBQThCO3dCQUNoQyxPQUFPO29CQUNUO2dCQUNGO2dCQUVBLE9BQU9wSDtZQUNUOzs7WUFFQXlILEtBQUFBO21CQUFBQSxTQUFBQSxpQ0FBaUN2QixTQUFTO2dCQUN4QyxJQUFNOUUsUUFBUSxJQUFJLENBQUNtRixvQkFBb0IsQ0FBQ0wsWUFDbEM1RSxRQUFRLElBQUksQ0FBQ21GLG9CQUFvQixDQUFDUCxZQUNsQzFFLFVBQVUsSUFBSSxDQUFDbUYsc0JBQXNCLENBQUNULFlBQ3RDeEUsYUFBYSxJQUFJLENBQUNzRix5QkFBeUIsQ0FBQ2QsWUFDNUN3QixvQkFBcUJ0RyxTQUFTRSxTQUFTRSxXQUFXRTtnQkFFeEQsT0FBT2dHO1lBQ1Q7OztZQUVBQyxLQUFBQTttQkFBQUEsU0FBQUEscUNBQXFDekIsU0FBUztnQkFDNUMsSUFBTWpDLFlBQVksSUFBSSxDQUFDNEMsd0JBQXdCLENBQUNYLFlBQzFDdEUsY0FBYyxJQUFJLENBQUMwRiwwQkFBMEIsQ0FBQ3BCLFlBQzlDaUIsd0JBQXlCbEQsYUFBYXJDLGFBQWUsR0FBRztnQkFFOUQsT0FBT3VGO1lBQ1Q7OztZQUVBUyxLQUFBQTttQkFBQUEsU0FBQUEsc0NBQXNDMUIsU0FBUztnQkFDN0MsSUFBTXZHLGFBQWEsSUFBSSxDQUFDdUgseUJBQXlCLENBQUNoQixZQUM1Q2xHLGVBQWUsSUFBSSxDQUFDd0gsMkJBQTJCLENBQUN0QixZQUNoRDJCLHlCQUF5QixBQUN2QixxQkFBR2xJLG1CQUNILHFCQUFHSztnQkFHWCxPQUFPNkg7WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSxtQkFBbUJDLFFBQVE7b0JBQUVqSCxpQkFBQUEsaUVBQWlCLE1BQU1rQixzQkFBQUEsaUVBQXNCO2dCQUN4RSxJQUFJM0MsUUFBUSxJQUFJLENBQUMwQyxRQUFRLENBQUNqQixnQkFBZ0JrQjtnQkFFMUMsSUFBTWdHLFdBQVdDLElBQUFBLHlCQUFtQjtnQkFFcEM1SSxRQUFRLEFBQ04scUJBQUdBLGNBREc7b0JBRU4ySTtpQkFDRDtnQkFFRCxJQUFNaEYsT0FBTzNELE1BQU1pRyxJQUFJLENBQUMsU0FBQ3RDO29CQUN2QixJQUFNa0YseUJBQXlCbEYsS0FBS21GLGVBQWUsQ0FBQ0o7b0JBRXBELElBQUlHLHdCQUF3Qjt3QkFDMUIsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVOLE9BQU9sRjtZQUNUOzs7WUFFQW9GLEtBQUFBO21CQUFBQSxTQUFBQSwwQkFBMEJDLGVBQWU7Z0JBQ3ZDLElBQUloSixRQUFRLElBQUksQ0FBQzBDLFFBQVE7Z0JBRXpCLElBQU1pRyxXQUFXQyxJQUFBQSx5QkFBbUI7Z0JBRXBDNUksUUFBUSxBQUNOLHFCQUFHQSxjQURHO29CQUVOMkk7aUJBQ0Q7Z0JBRUQsSUFBTWhGLE9BQU8zRCxNQUFNaUcsSUFBSSxDQUFDLFNBQUN0QztvQkFDdkIsSUFBTXNGLGdDQUFnQ3RGLEtBQUt1RixzQkFBc0IsQ0FBQ0Y7b0JBRWxFLElBQUlDLCtCQUErQjt3QkFDakMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVOLE9BQU90RjtZQUNUOzs7WUFFQXdGLEtBQUFBO21CQUFBQSxTQUFBQSwyQkFBMkJDLGdCQUFnQjtnQkFDekMsSUFBSXBKLFFBQVEsSUFBSSxDQUFDMEMsUUFBUTtnQkFFekIsSUFBTWlHLFdBQVdDLElBQUFBLHlCQUFtQjtnQkFFcEM1SSxRQUFRLEFBQ04scUJBQUdBLGNBREc7b0JBRU4ySTtpQkFDRDtnQkFFRCxJQUFNaEYsT0FBTzNELE1BQU1pRyxJQUFJLENBQUMsU0FBQ3RDO29CQUN2QixJQUFNMEYsaUNBQWlDMUYsS0FBSzJGLHVCQUF1QixDQUFDRjtvQkFFcEUsSUFBSUMsZ0NBQWdDO3dCQUNsQyxPQUFPO29CQUNUO2dCQUNGLE1BQU07Z0JBRU4sT0FBTzFGO1lBQ1Q7OztZQUVBNEYsS0FBQUE7bUJBQUFBLFNBQUFBLCtCQUErQkMsY0FBYztnQkFDM0MsSUFBTS9JLGVBQWUsSUFBSSxDQUFDNkMsZUFBZSxJQUNuQytCLGFBQWE1RSxhQUFhd0YsSUFBSSxDQUFDLFNBQUNaO29CQUM5QixJQUFNb0UscUNBQXFDcEUsV0FBV3FFLHFCQUFxQixDQUFDRjtvQkFFNUUsSUFBSUMsb0NBQW9DO3dCQUN0QyxPQUFPO29CQUNUO2dCQUNGLE1BQU07Z0JBRVosT0FBT3BFO1lBQ1Q7OztZQUVBc0UsS0FBQUE7bUJBQUFBLFNBQUFBLDRCQUE0QjdDLGdCQUFnQjtnQkFDMUMsSUFBTXBGLFNBQVMsSUFBSSxDQUFDRixTQUFTLElBQ3ZCOEUsUUFBUTVFLE9BQU91RSxJQUFJLENBQUMsU0FBQ0s7b0JBQ25CLElBQU1zRCxrQ0FBa0N0RCxNQUFNVyx1QkFBdUIsQ0FBQ0g7b0JBRXRFLElBQUk4QyxpQ0FBaUM7d0JBQ25DLE9BQU87b0JBQ1Q7Z0JBQ0YsTUFBTTtnQkFFWixPQUFPdEQ7WUFDVDs7O1lBRUF1RCxLQUFBQTttQkFBQUEsU0FBQUEsZ0NBQWdDL0MsZ0JBQWdCO2dCQUM5QyxJQUFNOUYsYUFBYSxJQUFJLENBQUNELGFBQWEsSUFDL0IrSSxZQUFZOUksV0FBV2lGLElBQUksQ0FBQyxTQUFDNkQ7b0JBQzNCLElBQU1DLDhDQUE4Q0QsVUFBVTdDLHVCQUF1QixDQUFDSDtvQkFFdEYsSUFBSWlELDZDQUE2Qzt3QkFDL0MsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU9EO1lBQ1Q7OztZQUVBRSxLQUFBQTttQkFBQUEsU0FBQUEsaUNBQWlDQyxrQkFBa0I7Z0JBQ2pELElBQU01SixZQUFZLElBQUksQ0FBQzJDLFlBQVksSUFDN0J5QixXQUFXcEUsVUFBVTRGLElBQUksQ0FBQyxTQUFDeEI7b0JBQ3pCLElBQU15Rix1Q0FBdUN6RixTQUFTMEYseUJBQXlCLENBQUNGO29CQUVoRixJQUFJQyxzQ0FBc0M7d0JBQ3hDLE9BQU87b0JBQ1Q7Z0JBQ0YsTUFBTTtnQkFFWixPQUFPekY7WUFDVDs7O1lBRUEyRixLQUFBQTttQkFBQUEsU0FBQUEsbUNBQW1DdEQsZ0JBQWdCO2dCQUNqRCxJQUFNbEcsZ0JBQWdCLElBQUksQ0FBQzZDLGdCQUFnQixJQUNyQ29DLGVBQWVqRixjQUFjcUYsSUFBSSxDQUFDLFNBQUNKO29CQUNqQyxJQUFNd0UseUNBQXlDeEUsYUFBYW9CLHVCQUF1QixDQUFDSDtvQkFFcEYsSUFBSXVELHdDQUF3Qzt3QkFDMUMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU94RTtZQUNUOzs7WUFFQXlFLEtBQUFBO21CQUFBQSxTQUFBQSw2QkFBNkJDLGFBQWE7Z0JBQ3hDLElBQU1ySCxhQUFhLElBQUksQ0FBQ0QsYUFBYSxJQUMvQnVILFlBQVl0SCxXQUFXK0MsSUFBSSxDQUFDLFNBQUN1RTtvQkFDM0IsSUFBTUMsbUNBQW1DRCxVQUFVRSxvQkFBb0IsQ0FBQ0g7b0JBRXhFLElBQUlFLGtDQUFrQzt3QkFDcEMsT0FBTztvQkFDVDtnQkFDRixNQUFNO2dCQUVaLE9BQU9EO1lBQ1Q7OztZQUVBRyxLQUFBQTttQkFBQUEsU0FBQUEsc0JBQXNCOUUsWUFBWTtnQkFDaENBLGVBQWUsSUFBSSxDQUFDRSxnQkFBZ0IsQ0FBQ0Y7Z0JBRXJDLElBQU0rRSxzQkFBdUIvRSxpQkFBaUI7Z0JBRTlDLE9BQU8rRTtZQUNUOzs7WUFFQUMsS0FBQUE7bUJBQUFBLFNBQUFBLDZCQUE2QmhGLFlBQVk7Z0JBQ3ZDLElBQU1TLFFBQVEsSUFBSSxDQUFDRCx1QkFBdUIsQ0FBQ1IsZUFDckNpRixlQUFnQnhFLFVBQVU7Z0JBRWhDLE9BQU93RTtZQUNUOzs7WUFFQUMsS0FBQUE7bUJBQUFBLFNBQUFBLDBCQUEwQmxFLFNBQVM7O2dCQUNqQyxJQUFNbkYsU0FBUyxJQUFJLENBQUNGLFNBQVMsSUFDdkJzSixlQUFlcEosT0FBT3NKLElBQUksQ0FBQyxTQUFDMUU7b0JBQzFCLElBQU01RyxpQkFDQXVMLGVBQWVwRSxVQUFVcUUsVUFBVSxDQUFDNUUsT0FBTzVHO29CQUVqRCxJQUFJdUwsY0FBYzt3QkFDaEIsT0FBTztvQkFDVDtnQkFDRjtnQkFFTixPQUFPSDtZQUNUOzs7WUFFQUssS0FBQUE7bUJBQUFBLFNBQUFBLGlDQUFpQ3RFLFNBQVM7O2dCQUN4QyxJQUFNakcsZ0JBQWdCLElBQUksQ0FBQzZDLGdCQUFnQixJQUNyQ21ILHNCQUFzQmhLLGNBQWNvSyxJQUFJLENBQUMsU0FBQ25GO29CQUN4QyxJQUFNbkcsaUJBQ0F5RyxzQkFBc0JVLFVBQVVULGlCQUFpQixDQUFDUCxjQUFjbkc7b0JBRXRFLElBQUl5RyxxQkFBcUI7d0JBQ3ZCLE9BQU87b0JBQ1Q7Z0JBQ0Y7Z0JBRU4sT0FBT3lFO1lBQ1Q7OztZQUVBUSxLQUFBQTttQkFBQUEsU0FBQUEsMENBQTBDdkUsU0FBUztnQkFDakQsSUFBTWlCLHdCQUF3QixJQUFJLENBQUNRLG9DQUFvQyxDQUFDekIsWUFDbEV3RSwrQkFBZ0N2RCwwQkFBMEI7Z0JBRWhFLE9BQU91RDtZQUNUOzs7WUFFQUMsS0FBQUE7bUJBQUFBLFNBQUFBLHdCQUF3QjVDLFFBQVE7b0JBQUVqSCxpQkFBQUEsaUVBQWlCLE1BQU1rQixzQkFBQUEsaUVBQXNCO2dCQUM3RSxJQUFNZ0IsT0FBTyxJQUFJLENBQUM4RSxrQkFBa0IsQ0FBQ0MsVUFBVWpILGdCQUFnQmtCLHNCQUN6RDRJLGNBQWU1SCxTQUFTO2dCQUU5QixPQUFPNEg7WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSwrQkFBK0J4QyxlQUFlO2dCQUM1QyxJQUFNckYsT0FBTyxJQUFJLENBQUNvRix5QkFBeUIsQ0FBQ0Msa0JBQ3RDdUMsY0FBZTVILFNBQVM7Z0JBRTlCLE9BQU80SDtZQUNUOzs7WUFFQUUsS0FBQUE7bUJBQUFBLFNBQUFBLGdDQUFnQ3JDLGdCQUFnQjtnQkFDOUMsSUFBTXpGLE9BQU8sSUFBSSxDQUFDd0YsMEJBQTBCLENBQUNDLG1CQUN2Q21DLGNBQWU1SCxTQUFTO2dCQUU5QixPQUFPNEg7WUFDVDs7O1lBRUFHLEtBQUFBO21CQUFBQSxTQUFBQSxpQ0FBaUM1RSxnQkFBZ0I7Z0JBQy9DLElBQU1SLFFBQVEsSUFBSSxDQUFDcUQsMkJBQTJCLENBQUM3QyxtQkFDekNnRSxlQUFnQnhFLFVBQVU7Z0JBRWhDLE9BQU93RTtZQUNUOzs7WUFFQWEsS0FBQUE7bUJBQUFBLFNBQUFBLG9DQUFvQ25DLGNBQWM7Z0JBQ2hELElBQU1uRSxhQUFhLElBQUksQ0FBQ2tFLDhCQUE4QixDQUFDQyxpQkFDakRvQyxvQkFBcUJ2RyxlQUFlO2dCQUUxQyxPQUFPdUc7WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSxzQ0FBc0M1QixrQkFBa0I7Z0JBQ3RELElBQU14RixXQUFXLElBQUksQ0FBQ3VGLGdDQUFnQyxDQUFDQyxxQkFDakQ2QixrQkFBbUJySCxhQUFhO2dCQUV0QyxPQUFPcUg7WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQSx3Q0FBd0NqRixnQkFBZ0I7Z0JBQ3RELElBQU1qQixlQUFlLElBQUksQ0FBQ3VFLGtDQUFrQyxDQUFDdEQsbUJBQ3ZEOEQsc0JBQXVCL0UsaUJBQWlCO2dCQUU5QyxPQUFPK0U7WUFDVDs7O1lBRUFvQixLQUFBQTttQkFBQUEsU0FBQUEsa0NBQWtDekIsYUFBYTtnQkFDN0MsSUFBTUMsWUFBWSxJQUFJLENBQUNGLDRCQUE0QixDQUFDQyxnQkFDOUMwQixtQkFBb0J6QixjQUFjO2dCQUV4QyxPQUFPeUI7WUFDVDs7O1lBRUFDLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxJQUFJLENBQUNsTSxLQUFLLEdBQUcsRUFBRTtnQkFDZixJQUFJLENBQUNDLEtBQUssR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQ0MsTUFBTSxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQ0MsTUFBTSxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQ0MsU0FBUyxHQUFHLEVBQUU7Z0JBQ25CLElBQUksQ0FBQ0MsVUFBVSxHQUFHLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQ0MsV0FBVyxHQUFHLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQ0MsV0FBVyxHQUFHLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQ0MsWUFBWSxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQ0MsWUFBWSxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQ0MsWUFBWSxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQ0MsYUFBYSxHQUFHLEVBQUU7WUFDekI7OztZQUVBdUwsS0FBQUE7bUJBQUFBLFNBQUFBO1lBQ0UsR0FBRztZQUNMOzs7WUFFTUMsS0FBQUE7bUJBQU4sU0FBTUE7O3dCQUNFdk0sTUFDQUgsU0FDQTJNLFVBQ0FDOzs7O2dDQUhBek0sT0FBTyxJQUFJLENBQUMwTSxPQUFPLElBQ25CN00sVUFBVSxJQUFJLEVBQ2QyTSxXQUFXeE07Z0NBQ0k7O29DQUFNdU0sSUFBQUEsa0JBQVUsRUFBQ0MsVUFBVTNNOzs7Z0NBQTFDNE0sZUFBZTtnQ0FFckI7O29DQUFPQTs7OztnQkFDVDs7OztZQUVBRSxLQUFBQTttQkFBQUEsU0FBQUEsV0FBV0MsSUFBSTtnQkFDYixJQUFNQyxjQUFjLElBQUksRUFBRSxHQUFHO2dCQUU3QixJQUFJLENBQUMxTSxLQUFLLEdBQUcsRUFBRTtnQkFFZjJNLElBQUFBLG1CQUFhLEVBQUNGLE1BQU0sSUFBSSxDQUFDek0sS0FBSyxFQUFFME07Z0JBRWhDLElBQUksQ0FBQ3ZNLE1BQU0sR0FBR3lNLElBQUFBLHVCQUFpQjtnQkFDL0IsSUFBSSxDQUFDdE0sVUFBVSxHQUFHdU0sSUFBQUEsMkJBQXFCO2dCQUV2QyxJQUFJLENBQUNqTSxhQUFhLEdBQUdrTSxJQUFBQSwyQkFBcUIsRUFBQ0wsTUFBTUM7Z0JBQ2pELElBQUksQ0FBQ3JNLFNBQVMsR0FBRzBNLElBQUFBLHVCQUFpQixFQUFDTixNQUFNQztnQkFDekMsSUFBSSxDQUFDek0sS0FBSyxHQUFHK00sSUFBQUEsbUJBQWEsRUFBQ1AsTUFBTUM7Z0JBQ2pDLElBQUksQ0FBQ3hNLE1BQU0sR0FBRytNLElBQUFBLG9CQUFjLEVBQUNSLE1BQU1DO2dCQUNuQyxJQUFJLENBQUN0TSxRQUFRLEdBQUc4TSxJQUFBQSxzQkFBZ0IsRUFBQ1QsTUFBTUM7Z0JBQ3ZDLElBQUksQ0FBQ25NLFdBQVcsR0FBRzRNLElBQUFBLHlCQUFtQixFQUFDVixNQUFNQztnQkFDN0MsSUFBSSxDQUFDbE0sV0FBVyxHQUFHNE0sSUFBQUEseUJBQW1CLEVBQUNYLE1BQU1DO2dCQUM3QyxJQUFJLENBQUNqTSxZQUFZLEdBQUc0TSxJQUFBQSwwQkFBb0IsRUFBQ1osTUFBTUM7Z0JBQy9DLElBQUksQ0FBQ2hNLFlBQVksR0FBRzRNLElBQUFBLDBCQUFvQixFQUFDYixNQUFNQztnQkFDL0MsSUFBSSxDQUFDL0wsWUFBWSxHQUFHNE0sSUFBQUEsMEJBQW9CLEVBQUNkLE1BQU1DO1lBQ2pEOzs7WUFFQWMsS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNFLElBQU1DLFlBQVlDLElBQUFBLHNCQUFnQixFQUFDLElBQUksQ0FBQzFOLEtBQUssR0FDdkMyTixZQUFZQyxJQUFBQSxzQkFBZ0IsRUFBQyxJQUFJLENBQUMzTixLQUFLLEdBQ3ZDNE4sYUFBYUMsSUFBQUEsd0JBQWtCLEVBQUMsSUFBSSxDQUFDNU4sTUFBTSxHQUMzQzZOLGVBQWVDLElBQUFBLDRCQUFzQixFQUFDLElBQUksQ0FBQzVOLFFBQVEsR0FDbkQ2TixnQkFBZ0JDLElBQUFBLDhCQUF3QixFQUFDLElBQUksQ0FBQzdOLFNBQVMsR0FDdkQ4TixrQkFBa0JDLElBQUFBLGtDQUE0QixFQUFDLElBQUksQ0FBQzdOLFdBQVcsR0FDL0Q4TixrQkFBa0JDLElBQUFBLGtDQUE0QixFQUFDLElBQUksQ0FBQzlOLFdBQVcsR0FDL0QrTixtQkFBbUJDLElBQUFBLG9DQUE4QixFQUFDLElBQUksQ0FBQy9OLFlBQVksR0FDbkVnTyxtQkFBbUJDLElBQUFBLG9DQUE4QixFQUFDLElBQUksQ0FBQ2hPLFlBQVksR0FDbkVpTyxtQkFBbUJDLElBQUFBLG9DQUE4QixFQUFDLElBQUksQ0FBQ2pPLFlBQVksR0FDbkVrTyxvQkFBb0JDLElBQUFBLHNDQUFnQyxFQUFDLElBQUksQ0FBQ2xPLGFBQWEsR0FDdkVqQixXQUFXLElBQUksQ0FBQ0EsUUFBUSxFQUN4QkssUUFBUXlOLFdBQ1J4TixRQUFRME4sV0FDUnpOLFNBQVMyTixZQUNUek4sV0FBVzJOLGNBQ1gxTixZQUFZNE4sZUFDWjFOLGNBQWM0TixpQkFDZDNOLGNBQWM2TixpQkFDZDVOLGVBQWU4TixrQkFDZjdOLGVBQWUrTixrQkFDZjlOLGVBQWVnTyxrQkFDZi9OLGdCQUFnQmlPLG1CQUNoQnBDLE9BQU87b0JBQ0w5TSxVQUFBQTtvQkFDQUssT0FBQUE7b0JBQ0FDLE9BQUFBO29CQUNBQyxRQUFBQTtvQkFDQUUsVUFBQUE7b0JBQ0FDLFdBQUFBO29CQUNBRSxhQUFBQTtvQkFDQUMsYUFBQUE7b0JBQ0FDLGNBQUFBO29CQUNBQyxjQUFBQTtvQkFDQUMsY0FBQUE7b0JBQ0FDLGVBQUFBO2dCQUNGO2dCQUVOLE9BQU82TDtZQUNUOzs7O1lBRU9zQyxLQUFBQTttQkFBUCxTQUFPQSxTQUFTQyxJQUFJLEVBQUV0UCxPQUFPO2dCQUMzQixJQUFNdVAsaUJBQWlCdlAsU0FDakJ3UCx3QkFBd0JELGVBQWVFLHdCQUF3QixJQUMvREMsZUFBZTlQLHNDQUFzQytQLGNBQVksRUFBRUgsd0JBQ25FSSxnQkFBZ0I5UCx1Q0FBdUMrUCxlQUFhLEVBQUVMLHdCQUN0RXBQLFFBQVFzUCxjQUNSclAsU0FBU3VQLGVBQ1R0UCxRQUFRLEVBQUUsRUFDVkMsUUFBUSxFQUFFLEVBQ1ZDLFNBQVMsRUFBRSxFQUNYQyxTQUFTLEVBQUUsRUFDWEMsV0FBVyxFQUFFLEVBQ2JDLFlBQVksRUFBRSxFQUNkQyxhQUFhLEVBQUUsRUFDZkMsY0FBYyxFQUFFLEVBQ2hCQyxjQUFjLEVBQUUsRUFDaEJDLGVBQWUsRUFBRSxFQUNqQkMsZUFBZSxFQUFFLEVBQ2pCQyxlQUFlLEVBQUUsRUFDakJDLGdCQUFnQixFQUFFLEVBQ2xCNE8scUJBQXFCQywyQkFBVyxDQUFDVixRQUFRLENBMzJCOUI3UCxvQkEyMkJtRDhQLE1BQU1sUCxPQUFPQyxRQUFRQyxPQUFPQyxPQUFPQyxRQUFRQyxRQUFRQyxVQUFVQyxXQUFXQyxZQUFZQyxhQUFhQyxhQUFhQyxjQUFjQyxjQUFjQyxjQUFjQyxlQUFlbEI7Z0JBRTNPLE9BQU84UDtZQUNUOzs7WUFFT0UsS0FBQUE7bUJBQVAsU0FBT0EsU0FBU2pELElBQUksRUFBRS9NLE9BQU87Z0JBQzNCLElBQU11UCxpQkFBaUJ2UCxTQUNqQndQLHdCQUF3QkQsZUFBZUUsd0JBQXdCLElBQy9EQyxlQUFlOVAsc0NBQXNDK1AsY0FBWSxFQUFFSCx3QkFDbkVJLGdCQUFnQjlQLHVDQUF1QytQLGVBQWEsRUFBRUwsd0JBQ3RFcFAsUUFBUXNQLGNBQ1JyUCxTQUFTdVAsZUFDVHRQLFFBQVEsTUFDUkMsUUFBUSxNQUNSQyxTQUFTLE1BQ1RDLFNBQVMsTUFDVEMsV0FBVyxNQUNYQyxZQUFZLE1BQ1pDLGFBQWEsTUFDYkMsY0FBYyxNQUNkQyxjQUFjLE1BQ2RDLGVBQWUsTUFDZkMsZUFBZSxNQUNmQyxlQUFlLE1BQ2ZDLGdCQUFnQixNQUNoQjRPLHFCQUFxQkMsMkJBQVcsQ0FBQ0MsUUFBUSxDQXA0QjlCeFEsb0JBbzRCbUR1TixNQUFNM00sT0FBT0MsUUFBUUMsT0FBT0MsT0FBT0MsUUFBUUMsUUFBUUMsVUFBVUMsV0FBV0MsWUFBWUMsYUFBYUMsYUFBYUMsY0FBY0MsY0FBY0MsY0FBY0MsZUFBZWxCO2dCQUUzTzhQLG1CQUFtQmhELFVBQVUsQ0FBQ0M7Z0JBRTlCLE9BQU8rQztZQUNUOzs7V0F6NEJtQnRRO0VBQTJCdVEsMkJBQVcifQ==
570
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250ZXh0L2ZpbGUvbm9taW5hbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRmlsZUNvbnRleHQgfSBmcm9tIFwib2NjYW0tbGFuZ3VhZ2VzXCI7XG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcbmltcG9ydCB7IGxleGVyc1V0aWxpdGllcywgcGFyc2Vyc1V0aWxpdGllcyB9IGZyb20gXCJvY2NhbS1ub21pbmFsXCI7XG5cbmltcG9ydCBlbGVtZW50cyBmcm9tIFwiLi4vLi4vZWxlbWVudHNcIjtcbmltcG9ydCBOb21pbmFsTGV4ZXIgZnJvbSBcIi4uLy4uL25vbWluYWwvbGV4ZXJcIjtcbmltcG9ydCBOb21pbmFsUGFyc2VyIGZyb20gXCIuLi8uLi9ub21pbmFsL3BhcnNlclwiO1xuXG5pbXBvcnQgeyB2ZXJpZnlGaWxlIH0gZnJvbSBcIi4uLy4uL3Byb2Nlc3MvdmVyaWZ5XCI7XG5pbXBvcnQgeyBiYXNlVHlwZUZyb21Ob3RoaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy90eXBlXCI7XG5pbXBvcnQgeyBmaW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZSB9IGZyb20gXCIuLi8uLi9tZXRhVHlwZXNcIjtcbmltcG9ydCB7IHR5cGVzRnJvbUpTT04sXG4gICAgICAgICBydWxlc0Zyb21KU09OLFxuICAgICAgICAgYXhpb21zRnJvbUpTT04sXG4gICAgICAgICB0eXBlc1RvVHlwZXNKU09OLFxuICAgICAgICAgcnVsZXNUb1J1bGVzSlNPTixcbiAgICAgICAgIHRoZW9yZW1zRnJvbUpTT04sXG4gICAgICAgICB2YXJpYWJsZXNGcm9tSlNPTixcbiAgICAgICAgIGxlbW1hc0Zyb21Ob3RoaW5nLFxuICAgICAgICAgYXhpb21zVG9BeGlvbXNKU09OLFxuICAgICAgICAgY29uamVjdHVyZXNGcm9tSlNPTixcbiAgICAgICAgIGNvbWJpbmF0b3JzRnJvbUpTT04sXG4gICAgICAgICB0eXBlUHJlZml4ZXNGcm9tSlNPTixcbiAgICAgICAgIGNvbnN0cnVjdG9yc0Zyb21KU09OLFxuICAgICAgICAgbWV0YXRoZW9yZW1zRnJvbUpTT04sXG4gICAgICAgICBtZXRhdmFyaWFibGVzRnJvbUpTT04sXG4gICAgICAgICBtZXRhTGVtbWFzRnJvbU5vdGhpbmcsXG4gICAgICAgICB0aGVvcmVtc1RvVGhlb3JlbXNKU09OLFxuICAgICAgICAgdmFyaWFibGVzVG9WYXJpYWJsZXNKU09OLFxuICAgICAgICAgY29uamVjdHVyZXNUb0NvbmplY3R1cmVzSlNPTixcbiAgICAgICAgIGNvbWJpbmF0b3JzVG9Db21iaW5hdG9yc0pTT04sXG4gICAgICAgICB0eXBlUHJlZml4ZXNUb1R5cGVQcmVmaXhlc0pTT04sXG4gICAgICAgICBjb25zdHJ1Y3RvcnNUb0NvbnN0cnVjdG9yc0pTT04sXG4gICAgICAgICBtZXRhdGhlb3JlbXNUb01ldGF0aGVvcmVtc0pTT04sXG4gICAgICAgICBtZXRhdmFyaWFibGVzVG9NZXRhdmFyaWFibGVzSlNPTiB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvanNvblwiO1xuXG5jb25zdCB7IHB1c2gsIGZpbHRlciB9ID0gYXJyYXlVdGlsaXRpZXMsXG4gICAgICB7IG5vbWluYWxMZXhlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIgfSA9IGxleGVyc1V0aWxpdGllcyxcbiAgICAgIHsgbm9taW5hbFBhcnNlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIgfSA9IHBhcnNlcnNVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5vbWluYWxGaWxlQ29udGV4dCBleHRlbmRzIEZpbGVDb250ZXh0IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgZmlsZVBhdGgsIHRva2Vucywgbm9kZSwgbGV4ZXIsIHBhcnNlciwgdHlwZXMsIHJ1bGVzLCBheGlvbXMsIGxlbW1hcywgdGhlb3JlbXMsIHZhcmlhYmxlcywgbWV0YUxlbW1hcywgY29uamVjdHVyZXMsIGNvbWJpbmF0b3JzLCB0eXBlUHJlZml4ZXMsIGNvbnN0cnVjdG9ycywgbWV0YXRoZW9yZW1zLCBtZXRhdmFyaWFibGVzKSB7XG4gICAgc3VwZXIoY29udGV4dCwgZmlsZVBhdGgsIHRva2Vucywgbm9kZSk7XG5cbiAgICB0aGlzLmxleGVyID0gbGV4ZXI7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLmZpbGVQYXRoID0gZmlsZVBhdGg7XG4gICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB0aGlzLnR5cGVzID0gdHlwZXM7XG4gICAgdGhpcy5ydWxlcyA9IHJ1bGVzO1xuICAgIHRoaXMuYXhpb21zID0gYXhpb21zO1xuICAgIHRoaXMubGVtbWFzID0gbGVtbWFzO1xuICAgIHRoaXMudGhlb3JlbXMgPSB0aGVvcmVtcztcbiAgICB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlcztcbiAgICB0aGlzLm1ldGFMZW1tYXMgPSBtZXRhTGVtbWFzO1xuICAgIHRoaXMuY29uamVjdHVyZXMgPSBjb25qZWN0dXJlcztcbiAgICB0aGlzLmNvbWJpbmF0b3JzID0gY29tYmluYXRvcnM7XG4gICAgdGhpcy50eXBlUHJlZml4ZXMgPSB0eXBlUHJlZml4ZXM7XG4gICAgdGhpcy5jb25zdHJ1Y3RvcnMgPSBjb25zdHJ1Y3RvcnM7XG4gICAgdGhpcy5tZXRhdGhlb3JlbXMgPSBtZXRhdGhlb3JlbXM7XG4gICAgdGhpcy5tZXRhdmFyaWFibGVzID0gbWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGdldExleGVyKCkge1xuICAgIHJldHVybiB0aGlzLmxleGVyO1xuICB9XG5cbiAgZ2V0UGFyc2VyKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlcjtcbiAgfVxuXG4gIGdldEp1ZGdlbWVudHMoKSB7XG4gICAgY29uc3QganVkZ2VtZW50cyA9IFtdO1xuXG4gICAgcmV0dXJuIGp1ZGdlbWVudHM7XG4gIH1cblxuICBnZXRFcXVpdmFsZW5jZXMoKSB7XG4gICAgY29uc3QgeyBFcXVpdmFsZW5jZXMgfSA9IGVsZW1lbnRzLFxuICAgICAgICAgIGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBlcXVpdmFsZW5jZXMgPSBFcXVpdmFsZW5jZXMuZnJvbU5vdGhpbmcoY29udGV4dCk7XG5cbiAgICByZXR1cm4gZXF1aXZhbGVuY2VzO1xuICB9XG5cbiAgZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucygpIHtcbiAgICBjb25zdCBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zID0gW107XG5cbiAgICByZXR1cm4gc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucztcbiAgfVxuXG4gIGdldExhYmVscyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCBsYWJlbHMgPSBbXTtcblxuICAgIGlmIChpbmNsdWRlUmVsZWFzZSkge1xuICAgICAgY29uc3QgcmVsZWFzZUNvbnRleHRMYWJlbHMgPSB0aGlzLmNvbnRleHQuZ2V0TGFiZWxzKCk7XG5cbiAgICAgIHB1c2gobGFiZWxzLCByZWxlYXNlQ29udGV4dExhYmVscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucnVsZXMuZm9yRWFjaCgocnVsZSkgPT4ge1xuICAgICAgICBjb25zdCBydWxlTGFiZWxzID0gcnVsZS5nZXRMYWJlbHMoKTtcblxuICAgICAgICBwdXNoKGxhYmVscywgcnVsZUxhYmVscyk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5heGlvbXMuZm9yRWFjaCgoYXhpb20pID0+IHtcbiAgICAgICAgY29uc3QgYXhpb21MYWJlbHMgPSBheGlvbS5nZXRMYWJlbHMoKTtcblxuICAgICAgICBwdXNoKGxhYmVscywgYXhpb21MYWJlbHMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubGVtbWFzLmZvckVhY2goKGxlbW1hKSA9PiB7XG4gICAgICAgIGNvbnN0IGxlbW1hTGFiZWxzID0gbGVtbWEuZ2V0TGFiZWxzKCk7XG5cbiAgICAgICAgcHVzaChsYWJlbHMsIGxlbW1hTGFiZWxzKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnRoZW9yZW1zLmZvckVhY2goKHRoZW9yZW0pID0+IHtcbiAgICAgICAgY29uc3QgdGhlb3JlbUxhYmVscyA9IHRoZW9yZW0uZ2V0TGFiZWxzKCk7XG5cbiAgICAgICAgcHVzaChsYWJlbHMsIHRoZW9yZW1MYWJlbHMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY29uamVjdHVyZXMuZm9yRWFjaCgoY29uamVjdHVyZSkgPT4ge1xuICAgICAgICBjb25zdCBjb25qZWN0dXJlTGFiZWxzID0gY29uamVjdHVyZS5nZXRMYWJlbHMoKTtcblxuICAgICAgICBwdXNoKGxhYmVscywgY29uamVjdHVyZUxhYmVscyk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5tZXRhdGhlb3JlbXMuZm9yRWFjaCgobWV0YXRoZW9yZW0pID0+IHtcbiAgICAgICAgY29uc3QgbWV0YXRoZW9yZW1MYWJlbCA9IG1ldGF0aGVvcmVtLmdldExhYmVsKCk7XG5cbiAgICAgICAgbGFiZWxzLnB1c2gobWV0YXRoZW9yZW1MYWJlbCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG5cbiAgZ2V0VHlwZXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlLCBpbmNsdWRlRGVwZW5kZW5jaWVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHR5cGVzID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0VHlwZXMoaW5jbHVkZURlcGVuZGVuY2llcykgOlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZXM7XG5cbiAgICByZXR1cm4gdHlwZXM7XG4gIH1cblxuICBnZXRSdWxlcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCBydWxlcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldFJ1bGVzKCkgOlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZXM7XG5cbiAgICByZXR1cm4gcnVsZXM7XG4gIH1cblxuICBnZXRBeGlvbXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgYXhpb21zID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldEF4aW9tcygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5heGlvbXM7XG5cbiAgICByZXR1cm4gYXhpb21zO1xuICB9XG5cbiAgZ2V0TGVtbWFzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IGxlbW1hcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRMZW1tYXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVtbWFzO1xuXG4gICAgcmV0dXJuIGxlbW1hcztcbiAgfVxuXG4gIGdldFRoZW9yZW1zKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHRoZW9yZW1zID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0VGhlb3JlbXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVvcmVtcztcblxuICAgIHJldHVybiB0aGVvcmVtcztcbiAgfVxuXG4gIGdldFZhcmlhYmxlcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy52YXJpYWJsZXM7XG4gIH1cblxuICBnZXRQcm9jZWR1cmVzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHByb2NlZHVyZXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldFByb2NlZHVyZXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsOyAgLy8vXG5cbiAgICByZXR1cm4gcHJvY2VkdXJlcztcbiAgfVxuXG4gIGdldE1ldGFMZW1tYXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgbWV0YUxlbW1hcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0TWV0YUxlbW1hcygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0YUxlbW1hcztcblxuICAgIHJldHVybiBtZXRhTGVtbWFzO1xuICB9XG5cbiAgZ2V0Q29uamVjdHVyZXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgY29uamVjdHVyZXMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRDb25qZWN0dXJlcygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmplY3R1cmVzO1xuXG4gICAgcmV0dXJuIGNvbmplY3R1cmVzO1xuICB9XG5cbiAgZ2V0Q29tYmluYXRvcnMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgY29tYmluYXRvcnMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRDb21iaW5hdG9ycygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmF0b3JzO1xuXG4gICAgcmV0dXJuIGNvbWJpbmF0b3JzO1xuICB9XG5cbiAgZ2V0VHlwZVByZWZpeGVzKGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHR5cGVQcmVmaXhlcyA9IGluY2x1ZGVSZWxlYXNlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRUeXBlUHJlZml4ZXMoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZVByZWZpeGVzO1xuXG4gICAgcmV0dXJuIHR5cGVQcmVmaXhlcztcbiAgfVxuXG4gIGdldENvbnN0cnVjdG9ycyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvcnMgPSBpbmNsdWRlUmVsZWFzZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2V0Q29uc3RydWN0b3JzKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9ycztcblxuICAgIHJldHVybiBjb25zdHJ1Y3RvcnM7XG4gIH1cblxuICBnZXRNZXRhdGhlb3JlbXMoaW5jbHVkZVJlbGVhc2UgPSB0cnVlKSB7XG4gICAgY29uc3QgbWV0YXRoZW9yZW1zID0gaW5jbHVkZVJlbGVhc2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldE1ldGF0aGVvcmVtcygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRhdGhlb3JlbXM7XG5cbiAgICByZXR1cm4gbWV0YXRoZW9yZW1zO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlcyhpbmNsdWRlUmVsZWFzZSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhdmFyaWFibGVzO1xuICB9XG5cbiAgYWRkVHlwZSh0eXBlKSB7XG4gICAgdGhpcy50eXBlcy5wdXNoKHR5cGUpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGUuZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7dHlwZVN0cmluZ30nIHR5cGUgdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBhZGRSdWxlKHJ1bGUpIHtcbiAgICB0aGlzLnJ1bGVzLnB1c2gocnVsZSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBydWxlU3RyaW5nID0gcnVsZS5nZXRTdHJpbmcoKTtcblxuICAgIHRoaXMudHJhY2UoYEFkZGVkIHRoZSAnJHtydWxlU3RyaW5nfScgcnVsZSB0byB0aGUgJyR7ZmlsZVBhdGh9JyBmaWxlIGNvbnRleHQuYClcbiAgfVxuXG4gIGFkZEF4aW9tKGF4aW9tKSB7XG4gICAgdGhpcy5heGlvbXMucHVzaChheGlvbSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBheGlvbVN0cmluZyA9IGF4aW9tLmdldFN0cmluZygpO1xuXG4gICAgdGhpcy50cmFjZShgQWRkZWQgdGhlICcke2F4aW9tU3RyaW5nfScgYXhpb20gdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBhZGRMZW1tYShsZW1tYSkge1xuICAgIHRoaXMubGVtbWFzLnB1c2gobGVtbWEpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgbGVtbWFTdHJpbmcgPSBsZW1tYS5nZXRTdHJpbmcoKTtcblxuICAgIHRoaXMudHJhY2UoYEFkZGVkIHRoZSAnJHtsZW1tYVN0cmluZ30nIGxlbW1hIHRvIHRoZSAnJHtmaWxlUGF0aH0nIGZpbGUgY29udGV4dC5gKVxuICB9XG5cbiAgYWRkVGhlb3JlbSh0aGVvcmVtKSB7XG4gICAgdGhpcy50aGVvcmVtcy5wdXNoKHRoZW9yZW0pO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgdGhlb3JlbVN0cmluZyA9IHRoZW9yZW0uZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7dGhlb3JlbVN0cmluZ30nIHRoZW9yZW0gdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBhZGRWYXJpYWJsZSh2YXJpYWJsZSkge1xuICAgIHRoaXMudmFyaWFibGVzLnB1c2godmFyaWFibGUpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgdmFyaWFibGVTdHJpbmcgPSB2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgIHRoaXMudHJhY2UoYEFkZGVkIHRoZSAnJHt2YXJpYWJsZVN0cmluZ30nIHZhcmlhYmxlIHRvIHRoZSAnJHtmaWxlUGF0aH0nIGZpbGUgY29udGV4dC5gKVxuICB9XG5cbiAgYWRkTWV0YUxlbW1hKG1ldGFMZW1tYSkge1xuICAgIHRoaXMubWV0YUxlbW1hcy5wdXNoKG1ldGFMZW1tYSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBtZXRhTGVtbWFTdHJpbmcgPSBtZXRhTGVtbWEuZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7bWV0YUxlbW1hU3RyaW5nfScgbWV0YS1sZW1tYSB0byB0aGUgJyR7ZmlsZVBhdGh9JyBmaWxlIGNvbnRleHQuYClcbiAgfVxuXG4gIGFkZENvbmplY3R1cmUoY29uamVjdHVyZSkge1xuICAgIHRoaXMuY29uamVjdHVyZXMucHVzaChjb25qZWN0dXJlKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gdGhpcy5nZXRGaWxlUGF0aCgpLFxuICAgICAgICAgIG9jbmplY3R1cmVTdHJpbmcgPSBvY25qZWN0dXJlLmdldFN0cmluZygpO1xuXG4gICAgdGhpcy50cmFjZShgQWRkZWQgdGhlICcke29jbmplY3R1cmVTdHJpbmd9JyBvY25qZWN0dXJlIHRvIHRoZSAnJHtmaWxlUGF0aH0nIGZpbGUgY29udGV4dC5gKVxuICB9XG5cbiAgYWRkQ29tYmluYXRvcihjb21iaW5hdG9yKSB7XG4gICAgdGhpcy5jb21iaW5hdG9ycy5wdXNoKGNvbWJpbmF0b3IpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgY29tYmluYXRvclN0cmluZyA9IGNvbWJpbmF0b3IuZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7Y29tYmluYXRvclN0cmluZ30nIGNvbWJpbmF0b3IgdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBhZGRUeXBlUHJlZml4KHR5cGVQcmVmaXgpIHtcbiAgICB0aGlzLnR5cGVQcmVmaXhlcy5wdXNoKHR5cGVQcmVmaXgpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgdHlwZVByZWZpeFN0cmluZyA9IHR5cGVQcmVmaXguZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7dHlwZVByZWZpeFN0cmluZ30nIHR5cGUtcHJlZml4IHRvIHRoZSAnJHtmaWxlUGF0aH0nIGZpbGUgY29udGV4dC5gKVxuICB9XG5cbiAgYWRkQ29uc3RydWN0b3IoY29uc3RydWN0b3IpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9ycy5wdXNoKGNvbnN0cnVjdG9yKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gdGhpcy5nZXRGaWxlUGF0aCgpLFxuICAgICAgICAgIGNvbnN0cnVjdG9yU3RyaW5nID0gY29uc3RydWN0b3IuZ2V0U3RyaW5nKCk7XG5cbiAgICB0aGlzLnRyYWNlKGBBZGRlZCB0aGUgJyR7Y29uc3RydWN0b3JTdHJpbmd9JyBjb25zdHJ1Y3RvciB0byB0aGUgJyR7ZmlsZVBhdGh9JyBmaWxlIGNvbnRleHQuYClcbiAgfVxuXG4gIGFkZE1ldGF0aGVvcmVtKG1ldGF0aGVvcmVtKSB7XG4gICAgdGhpcy5tZXRhdGhlb3JlbXMucHVzaChtZXRhdGhlb3JlbSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBtZXRhdGhlb3JlbVN0cmluZyA9IG1ldGF0aGVvcmVtLmdldFN0cmluZygpO1xuXG4gICAgdGhpcy50cmFjZShgQWRkZWQgdGhlICcke21ldGF0aGVvcmVtU3RyaW5nfScgbWV0YXRoZW9yZW0gdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBhZGRNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7XG4gICAgdGhpcy5tZXRhdmFyaWFibGVzLnB1c2gobWV0YXZhcmlhYmxlKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gdGhpcy5nZXRGaWxlUGF0aCgpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IG1ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgIHRoaXMudHJhY2UoYEFkZGVkIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgdG8gdGhlICcke2ZpbGVQYXRofScgZmlsZSBjb250ZXh0LmApXG4gIH1cblxuICBmaW5kTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZXMgPSB0aGlzLmdldE1ldGF2YXJpYWJsZXMoKSxcbiAgICAgICAgICBzcGVjaWZpY01ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZTsgIC8vL1xuXG4gICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlcy5maW5kKChtZXRhdmFyaWFibGUpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGUgPSBtZXRhdmFyaWFibGUsIC8vL1xuICAgICAgICAgICAgbWV0YXZhcmlhYmxlVW5pZmllcyA9IGdlbmVyYWxNZXRhdmFyaWFibGUudW5pZnlNZXRhdmFyaWFibGUoc3BlY2lmaWNNZXRhdmFyaWFibGUsIGNvbnRleHQpO1xuXG4gICAgICBpZiAobWV0YXZhcmlhYmxlVW5pZmllcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCksXG4gICAgICAgICAgbGFiZWwgPSBsYWJlbHMuZmluZCgobGFiZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsTWV0YXZhcmlhYmxlQ29tcGFyZXNUb01ldGF2YXJpYWJsZSA9IGxhYmVsLmNvbXBhcmVNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKTtcblxuICAgICAgICAgICAgaWYgKGxhYmVsTWV0YXZhcmlhYmxlQ29tcGFyZXNUb01ldGF2YXJpYWJsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG5cbiAgZmluZE1ldGFUeXBlQnlNZXRhVHlwZU5hbWUobWV0YVR5cGVOYW1lKSB7XG4gICAgY29uc3QgbWV0YVR5cGUgPSBmaW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZShtZXRhVHlwZU5hbWUpO1xuXG4gICAgcmV0dXJuIG1ldGFUeXBlO1xuICB9XG5cbiAgZmluZFJ1bGVCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBydWxlcyA9IHRoaXMuZ2V0UnVsZXMoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOYW1lID0gcmVmZXJlbmNlLmdldE1ldGF2YXJpYWJsZU5hbWUoKSxcbiAgICAgICAgICBydWxlID0gcnVsZXMuZmluZCgocnVsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gcnVsZS5jb21wYXJlTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cblxuICBmaW5kQXhpb21CeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBheGlvbXMgPSB0aGlzLmdldEF4aW9tcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGF4aW9tID0gYXhpb21zLmZpbmQoKGF4aW9tKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBheGlvbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gYXhpb20uY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChheGlvbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gYXhpb207XG4gIH1cblxuICBmaW5kTGVtbWFCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBsZW1tYXMgPSB0aGlzLmdldExlbW1hcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGxlbW1hID0gbGVtbWFzLmZpbmQoKGxlbW1hKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZW1tYUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gbGVtbWEuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChsZW1tYUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbGVtbWE7XG4gIH1cblxuICBmaW5kVGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IHRoZW9yZW1zID0gdGhpcy5nZXRUaGVvcmVtcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSByZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIHRoZW9yZW0gPSB0aGVvcmVtcy5maW5kKCh0aGVvcmVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aGVvcmVtQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUgPSB0aGVvcmVtLmNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAodGhlb3JlbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdGhlb3JlbTtcbiAgfVxuXG4gIGZpbmRNZXRhTGVtbWFCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBtZXRhTGVtbWFzID0gdGhpcy5nZXRNZXRhTGVtbWFzKCksXG4gICAgICAgICAgbWV0YUxlbW1hID0gbWV0YUxlbW1hcy5maW5kKChtZXRhTGVtbWEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFMZW1tYUNvbXBhcmVzVG9SZWZlcmVuY2UgPSBtZXRhTGVtbWEuY29tcGFyZVJlZmVyZW5jZShyZWZlcmVuY2UpO1xuXG4gICAgICAgICAgICBpZiAobWV0YUxlbW1hQ29tcGFyZXNUb1JlZmVyZW5jZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGFMZW1tYTtcbiAgfVxuXG4gIGZpbmRDb25qZWN0dXJlQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgY29uamVjdHVyZXMgPSB0aGlzLmdldENvbmplY3R1cmVzKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTmFtZSA9IHJlZmVyZW5jZS5nZXRNZXRhdmFyaWFibGVOYW1lKCksXG4gICAgICAgICAgY29uamVjdHVyZSA9IGNvbmplY3R1cmVzLmZpbmQoKGNvbmplY3R1cmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmplY3R1cmVDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSA9IGNvbmplY3R1cmUuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChjb25qZWN0dXJlQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBjb25qZWN0dXJlO1xuICB9XG5cbiAgZmluZE1ldGFMZW1tYXNCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICBjb25zdCBtZXRhTGVtbWFzID0gdGhpcy5nZXRNZXRhTGVtbWFzKCk7XG5cbiAgICBmaWx0ZXIobWV0YUxlbW1hcywgKG1ldGFMZW1tYSkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uID0gbWV0YUxlbW1hLCAvLy9cbiAgICAgICAgICAgIHRvcExldmVsTWV0YUFzc2VydGlvblVuaWZpZXMgPSByZWZlcmVuY2UudW5pZnlUb3BMZXZlbE1ldGFBc3NlcnRpb24odG9wTGV2ZWxNZXRhQXNzZXJ0aW9uLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHRvcExldmVsTWV0YUFzc2VydGlvblVuaWZpZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWV0YUxlbW1hcztcbiAgfVxuXG4gIGZpbmRNZXRhdGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IG1ldGF0aGVvcmVtcyA9IHRoaXMuZ2V0TWV0YXRoZW9yZW1zKCksXG4gICAgICBtZXRhdGhlb3JlbSA9IG1ldGF0aGVvcmVtcy5maW5kKChtZXRhdGhlb3JlbSkgPT4ge1xuICAgICAgICBjb25zdCBtZXRhdGhlb3JlbUNvbXBhcmVzVG9SZWZlcmVuY2UgPSBtZXRhdGhlb3JlbS5jb21wYXJlUmVmZXJlbmNlKHJlZmVyZW5jZSk7XG5cbiAgICAgICAgaWYgKG1ldGF0aGVvcmVtQ29tcGFyZXNUb1JlZmVyZW5jZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF0aGVvcmVtO1xuICB9XG5cbiAgZmluZE1ldGF0aGVvcmVtc0J5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IG1ldGF0aGVvcmVtcyA9IHRoaXMuZ2V0TWV0YXRoZW9yZW1zKCk7XG5cbiAgICBmaWx0ZXIobWV0YXRoZW9yZW1zLCAobWV0YXRoZW9yZW0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICAgIHRvcExldmVsTWV0YUFzc2VydGlvbiA9IG1ldGF0aGVvcmVtLCAvLy9cbiAgICAgICAgICAgIHRvcExldmVsTWV0YUFzc2VydGlvblVuaWZpZXMgPSByZWZlcmVuY2UudW5pZnlUb3BMZXZlbE1ldGFBc3NlcnRpb24odG9wTGV2ZWxNZXRhQXNzZXJ0aW9uLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHRvcExldmVsTWV0YUFzc2VydGlvblVuaWZpZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWV0YXRoZW9yZW1zO1xuICB9XG5cbiAgZmluZFRvcExldmVsQXNzZXJ0aW9uQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgYXhpb20gPSB0aGlzLmZpbmRBeGlvbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgbGVtbWEgPSB0aGlzLmZpbmRMZW1tYUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgdGhlb3JlbSA9IHRoaXMuZmluZFRoZW9yZW1CeVJlZmVyZW5jZShyZWZlcmVuY2UpLFxuICAgICAgICAgIGNvbmplY3R1cmUgPSB0aGlzLmZpbmRDb25qZWN0dXJlQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICB0b3BMZXZlbEFzc2VydGlvbiA9IChheGlvbSB8fCBsZW1tYSB8fCB0aGVvcmVtIHx8IGNvbmplY3R1cmUpO1xuXG4gICAgcmV0dXJuIHRvcExldmVsQXNzZXJ0aW9uO1xuICB9XG5cbiAgZmluZFRvcExldmVsTWV0YUFzc2VydGlvbkJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IG1ldGFMZW1tYSA9IHRoaXMuZmluZE1ldGFMZW1tYUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgbWV0YXRoZW9yZW0gPSB0aGlzLmZpbmRNZXRhdGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uID0gKG1ldGFMZW1tYSB8fCBtZXRhdGhlb3JlbSk7ICAvLy9cblxuICAgIHJldHVybiB0b3BMZXZlbE1ldGFBc3NlcnRpb247XG4gIH1cblxuICBmaW5kVG9wTGV2ZWxNZXRhQXNzZXJ0aW9uc0J5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IG1ldGFMZW1tYXMgPSB0aGlzLmZpbmRNZXRhTGVtbWFzQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICBtZXRhdGhlb3JlbXMgPSB0aGlzLmZpbmRNZXRhdGhlb3JlbXNCeVJlZmVyZW5jZShyZWZlcmVuY2UpLFxuICAgICAgICAgIHRvcExldmVsTWV0YUFzc2VydGlvbnMgPSBbXG4gICAgICAgICAgICAuLi5tZXRhTGVtbWFzLFxuICAgICAgICAgICAgLi4ubWV0YXRoZW9yZW1zXG4gICAgICAgICAgXTtcblxuICAgIHJldHVybiB0b3BMZXZlbE1ldGFBc3NlcnRpb25zO1xuICB9XG5cbiAgZmluZFR5cGVCeVR5cGVOYW1lKHR5cGVOYW1lLCBpbmNsdWRlUmVsZWFzZSA9IHRydWUsIGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgbGV0IHR5cGVzID0gdGhpcy5nZXRUeXBlcyhpbmNsdWRlUmVsZWFzZSwgaW5jbHVkZURlcGVuZGVuY2llcyk7XG5cbiAgICBjb25zdCBiYXNlVHlwZSA9IGJhc2VUeXBlRnJvbU5vdGhpbmcoKTtcblxuICAgIHR5cGVzID0gW1xuICAgICAgLi4udHlwZXMsXG4gICAgICBiYXNlVHlwZVxuICAgIF07XG5cbiAgICBjb25zdCB0eXBlID0gdHlwZXMuZmluZCgodHlwZSkgPT4ge1xuICAgICAgY29uc3QgdHlwZUNvbXBhcmVzVG9UeXBlTmFtZSA9IHR5cGUuY29tcGFyZVR5cGVOYW1lKHR5cGVOYW1lKTtcblxuICAgICAgaWYgKHR5cGVDb21wYXJlc1RvVHlwZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgZmluZFR5cGVCeU5vbWluYWxUeXBlTmFtZShub21pbmFsVHlwZU5hbWUpIHtcbiAgICBsZXQgdHlwZXMgPSB0aGlzLmdldFR5cGVzKCk7XG5cbiAgICBjb25zdCBiYXNlVHlwZSA9IGJhc2VUeXBlRnJvbU5vdGhpbmcoKTtcblxuICAgIHR5cGVzID0gW1xuICAgICAgLi4udHlwZXMsXG4gICAgICBiYXNlVHlwZVxuICAgIF07XG5cbiAgICBjb25zdCB0eXBlID0gdHlwZXMuZmluZCgodHlwZSkgPT4ge1xuICAgICAgY29uc3QgdHlwZUNvbXBhcmVzVG9Ob21pbmFsVHlwZU5hbWUgPSB0eXBlLmNvbXBhcmVOb21pbmFsVHlwZU5hbWUobm9taW5hbFR5cGVOYW1lKTtcblxuICAgICAgaWYgKHR5cGVDb21wYXJlc1RvTm9taW5hbFR5cGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIGZpbmRUeXBlQnlQcmVmaXhlZFR5cGVOYW1lKHByZWZpeGVkVHlwZU5hbWUpIHtcbiAgICBsZXQgdHlwZXMgPSB0aGlzLmdldFR5cGVzKCk7XG5cbiAgICBjb25zdCBiYXNlVHlwZSA9IGJhc2VUeXBlRnJvbU5vdGhpbmcoKTtcblxuICAgIHR5cGVzID0gW1xuICAgICAgLi4udHlwZXMsXG4gICAgICBiYXNlVHlwZVxuICAgIF07XG5cbiAgICBjb25zdCB0eXBlID0gdHlwZXMuZmluZCgodHlwZSkgPT4ge1xuICAgICAgY29uc3QgdHlwZUNvbXBhcmVzVG9QcmVmaXhlZFR5cGVOYW1lID0gdHlwZS5jb21wYXJlUHJlZml4ZWRUeXBlTmFtZShwcmVmaXhlZFR5cGVOYW1lKTtcblxuICAgICAgaWYgKHR5cGVDb21wYXJlc1RvUHJlZml4ZWRUeXBlTmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBmaW5kVHlwZVByZWZpeEJ5VHlwZVByZWZpeE5hbWUodHlwZVByZWZpeE5hbWUpIHtcbiAgICBjb25zdCB0eXBlUHJlZml4ZXMgPSB0aGlzLmdldFR5cGVQcmVmaXhlcygpLFxuICAgICAgICAgIHR5cGVQcmVmaXggPSB0eXBlUHJlZml4ZXMuZmluZCgodHlwZVByZWZpeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZVByZWZpeENvbXBhcmVzVG9UeXBlUHJlZml4TmFtZSA9IHR5cGVQcmVmaXguY29tcGFyZVR5cGVQcmVmaXhOYW1lKHR5cGVQcmVmaXhOYW1lKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVQcmVmaXhDb21wYXJlc1RvVHlwZVByZWZpeE5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB0eXBlUHJlZml4O1xuICB9XG5cbiAgZmluZExhYmVsQnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmdldExhYmVscygpLFxuICAgICAgICAgIGxhYmVsID0gbGFiZWxzLmZpbmQoKGxhYmVsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbENvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gbGFiZWwuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChsYWJlbENvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICBmaW5kSnVkZ2VtZW50QnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICBjb25zdCBqdWRnZW1lbnRzID0gdGhpcy5nZXRKdWRnZW1lbnRzKCksXG4gICAgICAgICAganVkZ2VtZW50ID0ganVkZ2VtZW50cy5maW5kKChqdWRnZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGp1ZGdlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGUgPSBqdWRnZW1lbnQuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChqdWRnZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4ganVkZ2VtZW50O1xuICB9XG5cbiAgZmluZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyKSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSxcbiAgICAgICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlcy5maW5kKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVDb21wYXJlc1RvVmFyaWFibGVJZGVudGlmaWVyID0gdmFyaWFibGUuY29tcGFyZVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgICBpZiAodmFyaWFibGVDb21wYXJlc1RvVmFyaWFibGVJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdmFyaWFibGU7XG4gIH1cblxuICBmaW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVzID0gdGhpcy5nZXRNZXRhdmFyaWFibGVzKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlcy5maW5kKChtZXRhdmFyaWFibGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gbWV0YXZhcmlhYmxlLmNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGU7XG4gIH1cblxuICBmaW5kUHJvY2VkdXJlQnlQcm9jZWR1cmVOYW1lKHByb2NlZHVyZU5hbWUpIHtcbiAgICBjb25zdCBwcm9jZWR1cmVzID0gdGhpcy5nZXRQcm9jZWR1cmVzKCksXG4gICAgICAgICAgcHJvY2VkdXJlID0gcHJvY2VkdXJlcy5maW5kKChwcm9jZWR1cmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2NlZHVyZUNvbXBhcmVzVG9Qcm9jZWR1cmVOYW1lID0gcHJvY2VkdXJlLmNvbXBhcmVQcm9jZWR1cmVOYW1lKHByb2NlZHVyZU5hbWUpO1xuXG4gICAgICAgICAgICBpZiAocHJvY2VkdXJlQ29tcGFyZXNUb1Byb2NlZHVyZU5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBwcm9jZWR1cmU7XG4gIH1cblxuICBpc01ldGF2YXJpYWJsZVByZXNlbnQobWV0YXZhcmlhYmxlKSB7XG4gICAgbWV0YXZhcmlhYmxlID0gdGhpcy5maW5kTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSk7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVQcmVzZW50ID0gKG1ldGF2YXJpYWJsZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlUHJlc2VudDtcbiAgfVxuXG4gIGlzTGFiZWxQcmVzZW50QnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSksXG4gICAgICAgICAgbGFiZWxQcmVzZW50ID0gKGxhYmVsICE9PSBudWxsKTtcblxuICAgIHJldHVybiBsYWJlbFByZXNlbnQ7XG4gIH1cblxuICBpc0xhYmVsUHJlc2VudEJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCksXG4gICAgICAgICAgbGFiZWxQcmVzZW50ID0gbGFiZWxzLnNvbWUoKGxhYmVsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgICAgICAgICBsYWJlbFVuaWZpZXMgPSByZWZlcmVuY2UudW5pZnlMYWJlbChsYWJlbCwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmIChsYWJlbFVuaWZpZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gbGFiZWxQcmVzZW50O1xuICB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50QnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlcyA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVByZXNlbnQgPSBtZXRhdmFyaWFibGVzLnNvbWUoKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgICAgICAgbWV0YXZhcmlhYmxlVW5pZmllcyA9IHJlZmVyZW5jZS51bmlmeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlVW5pZmllcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVQcmVzZW50O1xuICB9XG5cbiAgaXNUb3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50QnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uID0gdGhpcy5maW5kVG9wTGV2ZWxNZXRhQXNzZXJ0aW9uQnlSZWZlcmVuY2UocmVmZXJlbmNlKSxcbiAgICAgICAgICB0b3BMZXZlbE1ldGFBc3NlcnRpb25QcmVzZW50ID0gKHRvcExldmVsTWV0YUFzc2VydGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdG9wTGV2ZWxNZXRhQXNzZXJ0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzVHlwZVByZXNlbnRCeVR5cGVOYW1lKHR5cGVOYW1lLCBpbmNsdWRlUmVsZWFzZSA9IHRydWUsIGluY2x1ZGVEZXBlbmRlbmNpZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZmluZFR5cGVCeVR5cGVOYW1lKHR5cGVOYW1lLCBpbmNsdWRlUmVsZWFzZSwgaW5jbHVkZURlcGVuZGVuY2llcyksXG4gICAgICAgICAgdHlwZVByZXNlbnQgPSAodHlwZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdHlwZVByZXNlbnQ7XG4gIH1cblxuICBpc1R5cGVQcmVzZW50QnlOb21pbmFsVHlwZU5hbWUobm9taW5hbFR5cGVOYW1lKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZmluZFR5cGVCeU5vbWluYWxUeXBlTmFtZShub21pbmFsVHlwZU5hbWUpLFxuICAgICAgICAgIHR5cGVQcmVzZW50ID0gKHR5cGUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHR5cGVQcmVzZW50O1xuICB9XG5cbiAgaXNUeXBlUHJlc2VudEJ5UHJlZml4ZWRUeXBlTmFtZShwcmVmaXhlZFR5cGVOYW1lKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZmluZFR5cGVCeVByZWZpeGVkVHlwZU5hbWUocHJlZml4ZWRUeXBlTmFtZSksXG4gICAgICAgICAgdHlwZVByZXNlbnQgPSAodHlwZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdHlwZVByZXNlbnQ7XG4gIH1cblxuICBpc0xhYmVsUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmZpbmRMYWJlbEJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSxcbiAgICAgICAgICBsYWJlbFByZXNlbnQgPSAobGFiZWwgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGxhYmVsUHJlc2VudDtcbiAgfVxuXG4gIGlzVHlwZVByZWZpeFByZXNlbnRCeVR5cGVQcmVmaXhOYW1lKHR5cGVQcmVmaXhOYW1lKSB7XG4gICAgY29uc3QgdHlwZVByZWZpeCA9IHRoaXMuZmluZFR5cGVQcmVmaXhCeVR5cGVQcmVmaXhOYW1lKHR5cGVQcmVmaXhOYW1lKSxcbiAgICAgICAgICB0eXBlUHJlZml4UHJlc2VudCA9ICh0eXBlUHJlZml4ICE9PSBudWxsKTtcblxuICAgIHJldHVybiB0eXBlUHJlZml4UHJlc2VudDtcbiAgfVxuXG4gIGlzVmFyaWFibGVQcmVzZW50QnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyKSB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmZpbmRWYXJpYWJsZUJ5VmFyaWFibGVJZGVudGlmaWVyKHZhcmlhYmxlSWRlbnRpZmllciksXG4gICAgICAgICAgdmFyaWFibGVQcmVzZW50ID0gKHZhcmlhYmxlICE9PSBudWxsKTtcblxuICAgIHJldHVybiB2YXJpYWJsZVByZXNlbnQ7XG4gIH1cblxuICBpc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSkge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IHRoaXMuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVQcmVzZW50ID0gKG1ldGF2YXJpYWJsZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlUHJlc2VudDtcbiAgfVxuXG4gIGlzUHJvY2VkdXJlUHJlc2VudEJ5UHJvY2VkdXJlTmFtZShwcm9jZWR1cmVOYW1lKSB7XG4gICAgY29uc3QgcHJvY2VkdXJlID0gdGhpcy5maW5kUHJvY2VkdXJlQnlQcm9jZWR1cmVOYW1lKHByb2NlZHVyZU5hbWUpLFxuICAgICAgICAgIHByb2NlZHVyZVByZXNlbnQgPSAocHJvY2VkdXJlICE9PSBudWxsKTtcblxuICAgIHJldHVybiBwcm9jZWR1cmVQcmVzZW50O1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy50eXBlcyA9IFtdO1xuICAgIHRoaXMucnVsZXMgPSBbXTtcbiAgICB0aGlzLmF4aW9tcyA9IFtdO1xuICAgIHRoaXMubGVtbWFzID0gW107XG4gICAgdGhpcy50aGVvcmVtcyA9IFtdO1xuICAgIHRoaXMudmFyaWFibGVzID0gW107XG4gICAgdGhpcy5tZXRhTGVtbWFzID0gW107XG4gICAgdGhpcy5jb25qZWN0dXJlcyA9IFtdO1xuICAgIHRoaXMuY29tYmluYXRvcnMgPSBbXTtcbiAgICB0aGlzLnR5cGVQcmVmaXhlcyA9IFtdO1xuICAgIHRoaXMuY29uc3RydWN0b3JzID0gW107XG4gICAgdGhpcy5tZXRhdGhlb3JlbXMgPSBbXTtcbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMgPSBbXTtcbiAgfVxuXG4gIGNvbXBsZXRlKCkge1xuICAgIC8vL1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5RmlsZSgpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlKCksXG4gICAgICAgICAgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGZpbGVOb2RlID0gbm9kZSwgIC8vL1xuICAgICAgICAgIGZpbGVWZXJpZmllcyA9IGF3YWl0IHZlcmlmeUZpbGUoZmlsZU5vZGUsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGZpbGVWZXJpZmllcztcbiAgfVxuXG4gIGluaXRpYWxpc2UoanNvbikge1xuICAgIGNvbnN0IGZpbGVDb250ZXh0ID0gdGhpczsgLy8vXG5cbiAgICB0aGlzLnR5cGVzID0gW107XG5cbiAgICB0eXBlc0Zyb21KU09OKGpzb24sIHRoaXMudHlwZXMsIGZpbGVDb250ZXh0KTtcblxuICAgIHRoaXMubGVtbWFzID0gbGVtbWFzRnJvbU5vdGhpbmcoKTtcbiAgICB0aGlzLm1ldGFMZW1tYXMgPSBtZXRhTGVtbWFzRnJvbU5vdGhpbmcoKTtcblxuICAgIHRoaXMubWV0YXZhcmlhYmxlcyA9IG1ldGF2YXJpYWJsZXNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG4gICAgdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG4gICAgdGhpcy5ydWxlcyA9IHJ1bGVzRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICAgIHRoaXMuYXhpb21zID0gYXhpb21zRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICAgIHRoaXMudGhlb3JlbXMgPSB0aGVvcmVtc0Zyb21KU09OKGpzb24sIGZpbGVDb250ZXh0KTtcbiAgICB0aGlzLmNvbmplY3R1cmVzID0gY29uamVjdHVyZXNGcm9tSlNPTihqc29uLCBmaWxlQ29udGV4dCk7XG4gICAgdGhpcy5jb21iaW5hdG9ycyA9IGNvbWJpbmF0b3JzRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICAgIHRoaXMudHlwZVByZWZpeGVzID0gdHlwZVByZWZpeGVzRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICAgIHRoaXMuY29uc3RydWN0b3JzID0gY29uc3RydWN0b3JzRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICAgIHRoaXMubWV0YXRoZW9yZW1zID0gbWV0YXRoZW9yZW1zRnJvbUpTT04oanNvbiwgZmlsZUNvbnRleHQpO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IHR5cGVzSlNPTiA9IHR5cGVzVG9UeXBlc0pTT04odGhpcy50eXBlcyksXG4gICAgICAgICAgcnVsZXNKU09OID0gcnVsZXNUb1J1bGVzSlNPTih0aGlzLnJ1bGVzKSxcbiAgICAgICAgICBheGlvbXNKU09OID0gYXhpb21zVG9BeGlvbXNKU09OKHRoaXMuYXhpb21zKSxcbiAgICAgICAgICB0aGVvcmVtc0pTT04gPSB0aGVvcmVtc1RvVGhlb3JlbXNKU09OKHRoaXMudGhlb3JlbXMpLFxuICAgICAgICAgIHZhcmlhYmxlc0pTT04gPSB2YXJpYWJsZXNUb1ZhcmlhYmxlc0pTT04odGhpcy52YXJpYWJsZXMpLFxuICAgICAgICAgIGNvbmplY3R1cmVzSlNPTiA9IGNvbmplY3R1cmVzVG9Db25qZWN0dXJlc0pTT04odGhpcy5jb25qZWN0dXJlcyksXG4gICAgICAgICAgY29tYmluYXRvcnNKU09OID0gY29tYmluYXRvcnNUb0NvbWJpbmF0b3JzSlNPTih0aGlzLmNvbWJpbmF0b3JzKSxcbiAgICAgICAgICB0eXBlUHJlZml4ZXNKU09OID0gdHlwZVByZWZpeGVzVG9UeXBlUHJlZml4ZXNKU09OKHRoaXMudHlwZVByZWZpeGVzKSxcbiAgICAgICAgICBjb25zdHJ1Y3RvcnNKU09OID0gY29uc3RydWN0b3JzVG9Db25zdHJ1Y3RvcnNKU09OKHRoaXMuY29uc3RydWN0b3JzKSxcbiAgICAgICAgICBtZXRhdGhlb3JlbXNKU09OID0gbWV0YXRoZW9yZW1zVG9NZXRhdGhlb3JlbXNKU09OKHRoaXMubWV0YXRoZW9yZW1zKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVzSlNPTiA9IG1ldGF2YXJpYWJsZXNUb01ldGF2YXJpYWJsZXNKU09OKHRoaXMubWV0YXZhcmlhYmxlcyksXG4gICAgICAgICAgZmlsZVBhdGggPSB0aGlzLmZpbGVQYXRoLFxuICAgICAgICAgIHR5cGVzID0gdHlwZXNKU09OLCAgLy8vXG4gICAgICAgICAgcnVsZXMgPSBydWxlc0pTT04sICAvLy9cbiAgICAgICAgICBheGlvbXMgPSBheGlvbXNKU09OLCAgLy8vXG4gICAgICAgICAgdGhlb3JlbXMgPSB0aGVvcmVtc0pTT04sICAvLy9cbiAgICAgICAgICB2YXJpYWJsZXMgPSB2YXJpYWJsZXNKU09OLCAgLy8vXG4gICAgICAgICAgY29uamVjdHVyZXMgPSBjb25qZWN0dXJlc0pTT04sICAvLy9cbiAgICAgICAgICBjb21iaW5hdG9ycyA9IGNvbWJpbmF0b3JzSlNPTiwgIC8vL1xuICAgICAgICAgIHR5cGVQcmVmaXhlcyA9IHR5cGVQcmVmaXhlc0pTT04sICAvLy9cbiAgICAgICAgICBjb25zdHJ1Y3RvcnMgPSBjb25zdHJ1Y3RvcnNKU09OLCAgLy8vXG4gICAgICAgICAgbWV0YXRoZW9yZW1zID0gbWV0YXRoZW9yZW1zSlNPTiwgIC8vL1xuICAgICAgICAgIG1ldGF2YXJpYWJsZXMgPSBtZXRhdmFyaWFibGVzSlNPTiwgIC8vL1xuICAgICAgICAgIGpzb24gPSB7XG4gICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgIHR5cGVzLFxuICAgICAgICAgICAgcnVsZXMsXG4gICAgICAgICAgICBheGlvbXMsXG4gICAgICAgICAgICB0aGVvcmVtcyxcbiAgICAgICAgICAgIHZhcmlhYmxlcyxcbiAgICAgICAgICAgIGNvbmplY3R1cmVzLFxuICAgICAgICAgICAgY29tYmluYXRvcnMsXG4gICAgICAgICAgICB0eXBlUHJlZml4ZXMsXG4gICAgICAgICAgICBjb25zdHJ1Y3RvcnMsXG4gICAgICAgICAgICBtZXRhdGhlb3JlbXMsXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVzXG4gICAgICAgICAgfTtcblxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgc3RhdGljIGZyb21GaWxlKGZpbGUsIGNvbnRleHQpIHtcbiAgICBjb25zdCByZWxlYXNlQ29udGV4dCA9IGNvbnRleHQsIC8vL1xuICAgICAgICAgIGNvbWJpbmVkQ3VzdG9tR3JhbW1hciA9IHJlbGVhc2VDb250ZXh0LmdldENvbWJpbmVkQ3VzdG9tR3JhbW1hcigpLFxuICAgICAgICAgIG5vbWluYWxMZXhlciA9IG5vbWluYWxMZXhlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIoTm9taW5hbExleGVyLCBjb21iaW5lZEN1c3RvbUdyYW1tYXIpLFxuICAgICAgICAgIG5vbWluYWxQYXJzZXIgPSBub21pbmFsUGFyc2VyRnJvbUNvbWJpbmVkQ3VzdG9tR3JhbW1hcihOb21pbmFsUGFyc2VyLCBjb21iaW5lZEN1c3RvbUdyYW1tYXIpLFxuICAgICAgICAgIGxleGVyID0gbm9taW5hbExleGVyLCAvLy9cbiAgICAgICAgICBwYXJzZXIgPSBub21pbmFsUGFyc2VyLCAvLy9cbiAgICAgICAgICB0eXBlcyA9IFtdLFxuICAgICAgICAgIHJ1bGVzID0gW10sXG4gICAgICAgICAgYXhpb21zID0gW10sXG4gICAgICAgICAgbGVtbWFzID0gW10sXG4gICAgICAgICAgdGhlb3JlbXMgPSBbXSxcbiAgICAgICAgICB2YXJpYWJsZXMgPSBbXSxcbiAgICAgICAgICBtZXRhTGVtbWFzID0gW10sXG4gICAgICAgICAgY29uamVjdHVyZXMgPSBbXSxcbiAgICAgICAgICBjb21iaW5hdG9ycyA9IFtdLFxuICAgICAgICAgIHR5cGVQcmVmaXhlcyA9IFtdLFxuICAgICAgICAgIGNvbnN0cnVjdG9ycyA9IFtdLFxuICAgICAgICAgIG1ldGF0aGVvcmVtcyA9IFtdLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZXMgPSBbXSxcbiAgICAgICAgICBub21pbmFsRmlsZUNvbnRleHQgPSBGaWxlQ29udGV4dC5mcm9tRmlsZShOb21pbmFsRmlsZUNvbnRleHQsIGZpbGUsIGxleGVyLCBwYXJzZXIsIHR5cGVzLCBydWxlcywgYXhpb21zLCBsZW1tYXMsIHRoZW9yZW1zLCB2YXJpYWJsZXMsIG1ldGFMZW1tYXMsIGNvbmplY3R1cmVzLCBjb21iaW5hdG9ycywgdHlwZVByZWZpeGVzLCBjb25zdHJ1Y3RvcnMsIG1ldGF0aGVvcmVtcywgbWV0YXZhcmlhYmxlcywgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbm9taW5hbEZpbGVDb250ZXh0O1xuICB9XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCByZWxlYXNlQ29udGV4dCA9IGNvbnRleHQsIC8vL1xuICAgICAgICAgIGNvbWJpbmVkQ3VzdG9tR3JhbW1hciA9IHJlbGVhc2VDb250ZXh0LmdldENvbWJpbmVkQ3VzdG9tR3JhbW1hcigpLFxuICAgICAgICAgIG5vbWluYWxMZXhlciA9IG5vbWluYWxMZXhlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIoTm9taW5hbExleGVyLCBjb21iaW5lZEN1c3RvbUdyYW1tYXIpLFxuICAgICAgICAgIG5vbWluYWxQYXJzZXIgPSBub21pbmFsUGFyc2VyRnJvbUNvbWJpbmVkQ3VzdG9tR3JhbW1hcihOb21pbmFsUGFyc2VyLCBjb21iaW5lZEN1c3RvbUdyYW1tYXIpLFxuICAgICAgICAgIGxleGVyID0gbm9taW5hbExleGVyLCAvLy9cbiAgICAgICAgICBwYXJzZXIgPSBub21pbmFsUGFyc2VyLCAvLy9cbiAgICAgICAgICB0eXBlcyA9IG51bGwsXG4gICAgICAgICAgcnVsZXMgPSBudWxsLFxuICAgICAgICAgIGF4aW9tcyA9IG51bGwsXG4gICAgICAgICAgbGVtbWFzID0gbnVsbCxcbiAgICAgICAgICB0aGVvcmVtcyA9IG51bGwsXG4gICAgICAgICAgdmFyaWFibGVzID0gbnVsbCxcbiAgICAgICAgICBtZXRhTGVtbWFzID0gbnVsbCxcbiAgICAgICAgICBjb25qZWN0dXJlcyA9IG51bGwsXG4gICAgICAgICAgY29tYmluYXRvcnMgPSBudWxsLFxuICAgICAgICAgIHR5cGVQcmVmaXhlcyA9IG51bGwsXG4gICAgICAgICAgY29uc3RydWN0b3JzID0gbnVsbCxcbiAgICAgICAgICBtZXRhdGhlb3JlbXMgPSBudWxsLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZXMgPSBudWxsLFxuICAgICAgICAgIG5vbWluYWxGaWxlQ29udGV4dCA9IEZpbGVDb250ZXh0LmZyb21KU09OKE5vbWluYWxGaWxlQ29udGV4dCwganNvbiwgbGV4ZXIsIHBhcnNlciwgdHlwZXMsIHJ1bGVzLCBheGlvbXMsIGxlbW1hcywgdGhlb3JlbXMsIHZhcmlhYmxlcywgbWV0YUxlbW1hcywgY29uamVjdHVyZXMsIGNvbWJpbmF0b3JzLCB0eXBlUHJlZml4ZXMsIGNvbnN0cnVjdG9ycywgbWV0YXRoZW9yZW1zLCBtZXRhdmFyaWFibGVzLCBjb250ZXh0KTtcblxuICAgIG5vbWluYWxGaWxlQ29udGV4dC5pbml0aWFsaXNlKGpzb24pO1xuXG4gICAgcmV0dXJuIG5vbWluYWxGaWxlQ29udGV4dDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIk5vbWluYWxGaWxlQ29udGV4dCIsInB1c2giLCJmaWx0ZXIiLCJhcnJheVV0aWxpdGllcyIsIm5vbWluYWxMZXhlckZyb21Db21iaW5lZEN1c3RvbUdyYW1tYXIiLCJsZXhlcnNVdGlsaXRpZXMiLCJub21pbmFsUGFyc2VyRnJvbUNvbWJpbmVkQ3VzdG9tR3JhbW1hciIsInBhcnNlcnNVdGlsaXRpZXMiLCJGaWxlQ29udGV4dCIsImNvbnRleHQiLCJmaWxlUGF0aCIsInRva2VucyIsIm5vZGUiLCJsZXhlciIsInBhcnNlciIsInR5cGVzIiwicnVsZXMiLCJheGlvbXMiLCJsZW1tYXMiLCJ0aGVvcmVtcyIsInZhcmlhYmxlcyIsIm1ldGFMZW1tYXMiLCJjb25qZWN0dXJlcyIsImNvbWJpbmF0b3JzIiwidHlwZVByZWZpeGVzIiwiY29uc3RydWN0b3JzIiwibWV0YXRoZW9yZW1zIiwibWV0YXZhcmlhYmxlcyIsImdldExleGVyIiwiZ2V0UGFyc2VyIiwiZ2V0SnVkZ2VtZW50cyIsImp1ZGdlbWVudHMiLCJnZXRFcXVpdmFsZW5jZXMiLCJFcXVpdmFsZW5jZXMiLCJlbGVtZW50cyIsImVxdWl2YWxlbmNlcyIsImZyb21Ob3RoaW5nIiwiZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyIsInN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMiLCJnZXRMYWJlbHMiLCJpbmNsdWRlUmVsZWFzZSIsImxhYmVscyIsInJlbGVhc2VDb250ZXh0TGFiZWxzIiwiZm9yRWFjaCIsInJ1bGUiLCJydWxlTGFiZWxzIiwiYXhpb20iLCJheGlvbUxhYmVscyIsImxlbW1hIiwibGVtbWFMYWJlbHMiLCJ0aGVvcmVtIiwidGhlb3JlbUxhYmVscyIsImNvbmplY3R1cmUiLCJjb25qZWN0dXJlTGFiZWxzIiwibWV0YXRoZW9yZW0iLCJtZXRhdGhlb3JlbUxhYmVsIiwiZ2V0TGFiZWwiLCJnZXRUeXBlcyIsImluY2x1ZGVEZXBlbmRlbmNpZXMiLCJnZXRSdWxlcyIsImdldEF4aW9tcyIsImdldExlbW1hcyIsImdldFRoZW9yZW1zIiwiZ2V0VmFyaWFibGVzIiwiZ2V0UHJvY2VkdXJlcyIsInByb2NlZHVyZXMiLCJnZXRNZXRhTGVtbWFzIiwiZ2V0Q29uamVjdHVyZXMiLCJnZXRDb21iaW5hdG9ycyIsImdldFR5cGVQcmVmaXhlcyIsImdldENvbnN0cnVjdG9ycyIsImdldE1ldGF0aGVvcmVtcyIsImdldE1ldGF2YXJpYWJsZXMiLCJhZGRUeXBlIiwidHlwZSIsImdldEZpbGVQYXRoIiwidHlwZVN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwiYWRkUnVsZSIsInJ1bGVTdHJpbmciLCJhZGRBeGlvbSIsImF4aW9tU3RyaW5nIiwiYWRkTGVtbWEiLCJsZW1tYVN0cmluZyIsImFkZFRoZW9yZW0iLCJ0aGVvcmVtU3RyaW5nIiwiYWRkVmFyaWFibGUiLCJ2YXJpYWJsZSIsInZhcmlhYmxlU3RyaW5nIiwiYWRkTWV0YUxlbW1hIiwibWV0YUxlbW1hIiwibWV0YUxlbW1hU3RyaW5nIiwiYWRkQ29uamVjdHVyZSIsIm9jbmplY3R1cmVTdHJpbmciLCJvY25qZWN0dXJlIiwiYWRkQ29tYmluYXRvciIsImNvbWJpbmF0b3IiLCJjb21iaW5hdG9yU3RyaW5nIiwiYWRkVHlwZVByZWZpeCIsInR5cGVQcmVmaXgiLCJ0eXBlUHJlZml4U3RyaW5nIiwiYWRkQ29uc3RydWN0b3IiLCJjb25zdHJ1Y3RvciIsImNvbnN0cnVjdG9yU3RyaW5nIiwiYWRkTWV0YXRoZW9yZW0iLCJtZXRhdGhlb3JlbVN0cmluZyIsImFkZE1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZVN0cmluZyIsImZpbmRNZXRhdmFyaWFibGUiLCJzcGVjaWZpY01ldGF2YXJpYWJsZSIsImZpbmQiLCJnZW5lcmFsTWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlVW5pZmllcyIsInVuaWZ5TWV0YXZhcmlhYmxlIiwiZmluZExhYmVsQnlNZXRhdmFyaWFibGUiLCJsYWJlbCIsImxhYmVsTWV0YXZhcmlhYmxlQ29tcGFyZXNUb01ldGF2YXJpYWJsZSIsImNvbXBhcmVNZXRhdmFyaWFibGUiLCJmaW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZSIsIm1ldGFUeXBlTmFtZSIsIm1ldGFUeXBlIiwiZmluZFJ1bGVCeVJlZmVyZW5jZSIsInJlZmVyZW5jZSIsIm1ldGF2YXJpYWJsZU5hbWUiLCJnZXRNZXRhdmFyaWFibGVOYW1lIiwicnVsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUiLCJmaW5kQXhpb21CeVJlZmVyZW5jZSIsImF4aW9tQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUiLCJmaW5kTGVtbWFCeVJlZmVyZW5jZSIsImxlbW1hQ29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUiLCJmaW5kVGhlb3JlbUJ5UmVmZXJlbmNlIiwidGhlb3JlbUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiZmluZE1ldGFMZW1tYUJ5UmVmZXJlbmNlIiwibWV0YUxlbW1hQ29tcGFyZXNUb1JlZmVyZW5jZSIsImNvbXBhcmVSZWZlcmVuY2UiLCJmaW5kQ29uamVjdHVyZUJ5UmVmZXJlbmNlIiwiY29uamVjdHVyZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiZmluZE1ldGFMZW1tYXNCeVJlZmVyZW5jZSIsInRvcExldmVsTWV0YUFzc2VydGlvbiIsInRvcExldmVsTWV0YUFzc2VydGlvblVuaWZpZXMiLCJ1bmlmeVRvcExldmVsTWV0YUFzc2VydGlvbiIsImZpbmRNZXRhdGhlb3JlbUJ5UmVmZXJlbmNlIiwibWV0YXRoZW9yZW1Db21wYXJlc1RvUmVmZXJlbmNlIiwiZmluZE1ldGF0aGVvcmVtc0J5UmVmZXJlbmNlIiwiZmluZFRvcExldmVsQXNzZXJ0aW9uQnlSZWZlcmVuY2UiLCJ0b3BMZXZlbEFzc2VydGlvbiIsImZpbmRUb3BMZXZlbE1ldGFBc3NlcnRpb25CeVJlZmVyZW5jZSIsImZpbmRUb3BMZXZlbE1ldGFBc3NlcnRpb25zQnlSZWZlcmVuY2UiLCJ0b3BMZXZlbE1ldGFBc3NlcnRpb25zIiwiZmluZFR5cGVCeVR5cGVOYW1lIiwidHlwZU5hbWUiLCJiYXNlVHlwZSIsImJhc2VUeXBlRnJvbU5vdGhpbmciLCJ0eXBlQ29tcGFyZXNUb1R5cGVOYW1lIiwiY29tcGFyZVR5cGVOYW1lIiwiZmluZFR5cGVCeU5vbWluYWxUeXBlTmFtZSIsIm5vbWluYWxUeXBlTmFtZSIsInR5cGVDb21wYXJlc1RvTm9taW5hbFR5cGVOYW1lIiwiY29tcGFyZU5vbWluYWxUeXBlTmFtZSIsImZpbmRUeXBlQnlQcmVmaXhlZFR5cGVOYW1lIiwicHJlZml4ZWRUeXBlTmFtZSIsInR5cGVDb21wYXJlc1RvUHJlZml4ZWRUeXBlTmFtZSIsImNvbXBhcmVQcmVmaXhlZFR5cGVOYW1lIiwiZmluZFR5cGVQcmVmaXhCeVR5cGVQcmVmaXhOYW1lIiwidHlwZVByZWZpeE5hbWUiLCJ0eXBlUHJlZml4Q29tcGFyZXNUb1R5cGVQcmVmaXhOYW1lIiwiY29tcGFyZVR5cGVQcmVmaXhOYW1lIiwiZmluZExhYmVsQnlNZXRhdmFyaWFibGVOYW1lIiwibGFiZWxDb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImZpbmRKdWRnZW1lbnRCeU1ldGF2YXJpYWJsZU5hbWUiLCJqdWRnZW1lbnQiLCJqdWRnZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlc1RvTWV0YXZhcmlhYmxlIiwiZmluZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIiLCJ2YXJpYWJsZUlkZW50aWZpZXIiLCJ2YXJpYWJsZUNvbXBhcmVzVG9WYXJpYWJsZUlkZW50aWZpZXIiLCJjb21wYXJlVmFyaWFibGVJZGVudGlmaWVyIiwiZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZSIsIm1ldGF2YXJpYWJsZUNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lIiwiZmluZFByb2NlZHVyZUJ5UHJvY2VkdXJlTmFtZSIsInByb2NlZHVyZU5hbWUiLCJwcm9jZWR1cmUiLCJwcm9jZWR1cmVDb21wYXJlc1RvUHJvY2VkdXJlTmFtZSIsImNvbXBhcmVQcm9jZWR1cmVOYW1lIiwiaXNNZXRhdmFyaWFibGVQcmVzZW50IiwibWV0YXZhcmlhYmxlUHJlc2VudCIsImlzTGFiZWxQcmVzZW50QnlNZXRhdmFyaWFibGUiLCJsYWJlbFByZXNlbnQiLCJpc0xhYmVsUHJlc2VudEJ5UmVmZXJlbmNlIiwic29tZSIsImxhYmVsVW5pZmllcyIsInVuaWZ5TGFiZWwiLCJpc01ldGF2YXJpYWJsZVByZXNlbnRCeVJlZmVyZW5jZSIsImlzVG9wTGV2ZWxNZXRhQXNzZXJ0aW9uUHJlc2VudEJ5UmVmZXJlbmNlIiwidG9wTGV2ZWxNZXRhQXNzZXJ0aW9uUHJlc2VudCIsImlzVHlwZVByZXNlbnRCeVR5cGVOYW1lIiwidHlwZVByZXNlbnQiLCJpc1R5cGVQcmVzZW50QnlOb21pbmFsVHlwZU5hbWUiLCJpc1R5cGVQcmVzZW50QnlQcmVmaXhlZFR5cGVOYW1lIiwiaXNMYWJlbFByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUiLCJpc1R5cGVQcmVmaXhQcmVzZW50QnlUeXBlUHJlZml4TmFtZSIsInR5cGVQcmVmaXhQcmVzZW50IiwiaXNWYXJpYWJsZVByZXNlbnRCeVZhcmlhYmxlSWRlbnRpZmllciIsInZhcmlhYmxlUHJlc2VudCIsImlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZSIsImlzUHJvY2VkdXJlUHJlc2VudEJ5UHJvY2VkdXJlTmFtZSIsInByb2NlZHVyZVByZXNlbnQiLCJjbGVhciIsImNvbXBsZXRlIiwidmVyaWZ5RmlsZSIsImdldE5vZGUiLCJmaWxlTm9kZSIsImZpbGVWZXJpZmllcyIsImluaXRpYWxpc2UiLCJqc29uIiwiZmlsZUNvbnRleHQiLCJ0eXBlc0Zyb21KU09OIiwibGVtbWFzRnJvbU5vdGhpbmciLCJtZXRhTGVtbWFzRnJvbU5vdGhpbmciLCJtZXRhdmFyaWFibGVzRnJvbUpTT04iLCJ2YXJpYWJsZXNGcm9tSlNPTiIsInJ1bGVzRnJvbUpTT04iLCJheGlvbXNGcm9tSlNPTiIsInRoZW9yZW1zRnJvbUpTT04iLCJjb25qZWN0dXJlc0Zyb21KU09OIiwiY29tYmluYXRvcnNGcm9tSlNPTiIsInR5cGVQcmVmaXhlc0Zyb21KU09OIiwiY29uc3RydWN0b3JzRnJvbUpTT04iLCJtZXRhdGhlb3JlbXNGcm9tSlNPTiIsInRvSlNPTiIsInR5cGVzSlNPTiIsInR5cGVzVG9UeXBlc0pTT04iLCJydWxlc0pTT04iLCJydWxlc1RvUnVsZXNKU09OIiwiYXhpb21zSlNPTiIsImF4aW9tc1RvQXhpb21zSlNPTiIsInRoZW9yZW1zSlNPTiIsInRoZW9yZW1zVG9UaGVvcmVtc0pTT04iLCJ2YXJpYWJsZXNKU09OIiwidmFyaWFibGVzVG9WYXJpYWJsZXNKU09OIiwiY29uamVjdHVyZXNKU09OIiwiY29uamVjdHVyZXNUb0NvbmplY3R1cmVzSlNPTiIsImNvbWJpbmF0b3JzSlNPTiIsImNvbWJpbmF0b3JzVG9Db21iaW5hdG9yc0pTT04iLCJ0eXBlUHJlZml4ZXNKU09OIiwidHlwZVByZWZpeGVzVG9UeXBlUHJlZml4ZXNKU09OIiwiY29uc3RydWN0b3JzSlNPTiIsImNvbnN0cnVjdG9yc1RvQ29uc3RydWN0b3JzSlNPTiIsIm1ldGF0aGVvcmVtc0pTT04iLCJtZXRhdGhlb3JlbXNUb01ldGF0aGVvcmVtc0pTT04iLCJtZXRhdmFyaWFibGVzSlNPTiIsIm1ldGF2YXJpYWJsZXNUb01ldGF2YXJpYWJsZXNKU09OIiwiZnJvbUZpbGUiLCJmaWxlIiwicmVsZWFzZUNvbnRleHQiLCJjb21iaW5lZEN1c3RvbUdyYW1tYXIiLCJnZXRDb21iaW5lZEN1c3RvbUdyYW1tYXIiLCJub21pbmFsTGV4ZXIiLCJOb21pbmFsTGV4ZXIiLCJub21pbmFsUGFyc2VyIiwiTm9taW5hbFBhcnNlciIsIm5vbWluYWxGaWxlQ29udGV4dCIsImZyb21KU09OIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkEwQ0E7OztlQUFxQkE7OztnQ0F4Q087MkJBQ0c7OEJBQ21CO2lFQUU3Qjs4REFDSTsrREFDQzt3QkFFQztzQkFDUzsyQkFDTztzQkF3Qk07Ozs7OztBQUVqRCxNQUFNLEVBQUVDLElBQUksRUFB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