occam-verify-cli 1.0.405 → 1.0.414

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 (122) hide show
  1. package/lib/context/file.js +3 -3
  2. package/lib/context/local.js +3 -3
  3. package/lib/context/release.js +2 -2
  4. package/lib/context/temporary.js +103 -54
  5. package/lib/mixins/statement/verify.js +2 -2
  6. package/lib/mixins/step/unify.js +2 -2
  7. package/lib/node/argument.js +2 -2
  8. package/lib/node/assumption.js +6 -6
  9. package/lib/node/frame.js +19 -7
  10. package/lib/node/judgement.js +8 -1
  11. package/lib/node/statement.js +34 -15
  12. package/lib/node/substitution/term.js +3 -11
  13. package/lib/node/term.js +20 -8
  14. package/lib/nonTerminalNode.js +3 -3
  15. package/lib/ontology/assertion/contained.js +7 -7
  16. package/lib/ontology/assertion/defined.js +8 -8
  17. package/lib/ontology/assertion/subproof.js +3 -3
  18. package/lib/ontology/assumption.js +49 -45
  19. package/lib/ontology/combinator.js +3 -3
  20. package/lib/ontology/constructor.js +3 -3
  21. package/lib/ontology/equality.js +4 -4
  22. package/lib/ontology/equivalence.js +2 -2
  23. package/lib/ontology/frame.js +37 -12
  24. package/lib/ontology/judgement.js +13 -6
  25. package/lib/ontology/metavariable.js +75 -76
  26. package/lib/ontology/propertyRelation.js +2 -2
  27. package/lib/ontology/reference.js +33 -4
  28. package/lib/ontology/signature.js +2 -2
  29. package/lib/ontology/statement.js +33 -8
  30. package/lib/ontology/step.js +4 -4
  31. package/lib/ontology/substitution/frame.js +13 -15
  32. package/lib/ontology/substitution/statement.js +31 -32
  33. package/lib/ontology/substitution/term.js +26 -25
  34. package/lib/ontology/substitution.js +2 -2
  35. package/lib/ontology/substitutions.js +4 -4
  36. package/lib/ontology/term.js +26 -12
  37. package/lib/ontology/variable.js +2 -2
  38. package/lib/process/equate.js +322 -0
  39. package/lib/process/unify.js +623 -0
  40. package/lib/process/verify.js +332 -0
  41. package/lib/utilities/brackets.js +3 -8
  42. package/lib/utilities/context.js +4 -14
  43. package/lib/utilities/json.js +18 -1
  44. package/lib/utilities/pass.js +68 -0
  45. package/lib/utilities/substitutions.js +11 -16
  46. package/package.json +2 -2
  47. package/src/context/file.js +2 -2
  48. package/src/context/local.js +2 -2
  49. package/src/context/release.js +1 -1
  50. package/src/context/temporary.js +124 -54
  51. package/src/mixins/statement/verify.js +3 -1
  52. package/src/mixins/step/unify.js +0 -1
  53. package/src/node/argument.js +1 -1
  54. package/src/node/assumption.js +4 -4
  55. package/src/node/frame.js +19 -5
  56. package/src/node/judgement.js +7 -0
  57. package/src/node/statement.js +35 -13
  58. package/src/node/substitution/term.js +4 -14
  59. package/src/node/term.js +20 -6
  60. package/src/nonTerminalNode.js +1 -1
  61. package/src/ontology/assertion/contained.js +6 -6
  62. package/src/ontology/assertion/defined.js +7 -7
  63. package/src/ontology/assertion/subproof.js +1 -1
  64. package/src/ontology/assumption.js +52 -57
  65. package/src/ontology/combinator.js +1 -1
  66. package/src/ontology/constructor.js +1 -1
  67. package/src/ontology/equality.js +3 -3
  68. package/src/ontology/equivalence.js +1 -1
  69. package/src/ontology/frame.js +44 -10
  70. package/src/ontology/judgement.js +8 -3
  71. package/src/ontology/metavariable.js +108 -102
  72. package/src/ontology/propertyRelation.js +3 -2
  73. package/src/ontology/reference.js +39 -1
  74. package/src/ontology/signature.js +3 -3
  75. package/src/ontology/statement.js +38 -4
  76. package/src/ontology/step.js +7 -7
  77. package/src/ontology/substitution/frame.js +13 -17
  78. package/src/ontology/substitution/statement.js +45 -48
  79. package/src/ontology/substitution/term.js +19 -19
  80. package/src/ontology/substitution.js +3 -2
  81. package/src/ontology/substitutions.js +3 -3
  82. package/src/ontology/term.js +26 -5
  83. package/src/ontology/variable.js +3 -2
  84. package/src/process/equate.js +212 -0
  85. package/src/process/unify.js +634 -0
  86. package/src/process/verify.js +204 -0
  87. package/src/utilities/brackets.js +2 -11
  88. package/src/utilities/context.js +1 -21
  89. package/src/utilities/json.js +19 -0
  90. package/src/utilities/{unifier.js → pass.js} +17 -1
  91. package/src/utilities/substitutions.js +10 -20
  92. package/lib/unifier/equantional.js +0 -170
  93. package/lib/unifier/intrinsicLevel.js +0 -144
  94. package/lib/unifier/metaLevel.js +0 -197
  95. package/lib/unifier/metavariable.js +0 -140
  96. package/lib/unifier/statementWithCombinator.js +0 -177
  97. package/lib/unifier/termWithConstructor.js +0 -145
  98. package/lib/unifier.js +0 -241
  99. package/lib/utilities/arguments.js +0 -28
  100. package/lib/utilities/frame.js +0 -18
  101. package/lib/utilities/metavariable.js +0 -18
  102. package/lib/utilities/statement.js +0 -18
  103. package/lib/utilities/unification.js +0 -109
  104. package/lib/utilities/unifier.js +0 -51
  105. package/lib/utilities/variable.js +0 -18
  106. package/lib/verifier/combinator.js +0 -158
  107. package/lib/verifier.js +0 -219
  108. package/src/unifier/equantional.js +0 -90
  109. package/src/unifier/intrinsicLevel.js +0 -52
  110. package/src/unifier/metaLevel.js +0 -151
  111. package/src/unifier/metavariable.js +0 -50
  112. package/src/unifier/statementWithCombinator.js +0 -114
  113. package/src/unifier/termWithConstructor.js +0 -56
  114. package/src/unifier.js +0 -183
  115. package/src/utilities/arguments.js +0 -21
  116. package/src/utilities/frame.js +0 -13
  117. package/src/utilities/metavariable.js +0 -13
  118. package/src/utilities/statement.js +0 -13
  119. package/src/utilities/unification.js +0 -136
  120. package/src/utilities/variable.js +0 -13
  121. package/src/verifier/combinator.js +0 -72
  122. package/src/verifier.js +0 -150
@@ -0,0 +1,623 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get unifyMetavariable () {
13
+ return unifyMetavariable;
14
+ },
15
+ get unifyMetavariableIntrinsically () {
16
+ return unifyMetavariableIntrinsically;
17
+ },
18
+ get unifyStatement () {
19
+ return unifyStatement;
20
+ },
21
+ get unifyStatementIntrinsically () {
22
+ return unifyStatementIntrinsically;
23
+ },
24
+ get unifyStatementWithCombinator () {
25
+ return unifyStatementWithCombinator;
26
+ },
27
+ get unifySubstitution () {
28
+ return unifySubstitution;
29
+ },
30
+ get unifyTermWithConstructor () {
31
+ return unifyTermWithConstructor;
32
+ }
33
+ });
34
+ var _ontology = /*#__PURE__*/ _interop_require_default(require("../ontology"));
35
+ var _query = require("../utilities/query");
36
+ var _pass = require("../utilities/pass");
37
+ function _array_like_to_array(arr, len) {
38
+ if (len == null || len > arr.length) len = arr.length;
39
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
40
+ return arr2;
41
+ }
42
+ function _array_without_holes(arr) {
43
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
44
+ }
45
+ function _assert_this_initialized(self) {
46
+ if (self === void 0) {
47
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
48
+ }
49
+ return self;
50
+ }
51
+ function _call_super(_this, derived, args) {
52
+ derived = _get_prototype_of(derived);
53
+ return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
54
+ }
55
+ function _class_call_check(instance, Constructor) {
56
+ if (!(instance instanceof Constructor)) {
57
+ throw new TypeError("Cannot call a class as a function");
58
+ }
59
+ }
60
+ function _defineProperties(target, props) {
61
+ for(var i = 0; i < props.length; i++){
62
+ var descriptor = props[i];
63
+ descriptor.enumerable = descriptor.enumerable || false;
64
+ descriptor.configurable = true;
65
+ if ("value" in descriptor) descriptor.writable = true;
66
+ Object.defineProperty(target, descriptor.key, descriptor);
67
+ }
68
+ }
69
+ function _create_class(Constructor, protoProps, staticProps) {
70
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
71
+ if (staticProps) _defineProperties(Constructor, staticProps);
72
+ return Constructor;
73
+ }
74
+ function _define_property(obj, key, value) {
75
+ if (key in obj) {
76
+ Object.defineProperty(obj, key, {
77
+ value: value,
78
+ enumerable: true,
79
+ configurable: true,
80
+ writable: true
81
+ });
82
+ } else {
83
+ obj[key] = value;
84
+ }
85
+ return obj;
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;
120
+ }
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
+ var nonTerminalNodeQuery = (0, _query.nodeQuery)("/*");
154
+ var typeNodeQuery = (0, _query.nodeQuery)("/type"), termNodeQuery = (0, _query.nodeQuery)("/term"), frameNodeQuery = (0, _query.nodeQuery)("/frame"), metaTypeNodeQuery = (0, _query.nodeQuery)("/metaType"), statementNodeQuery = (0, _query.nodeQuery)("/statement"), termVariableNodeQuery = (0, _query.nodeQuery)("/term/variable!"), statementMetavariableNodeQuery = (0, _query.nodeQuery)("/statement/metavariable!"), assumptionMetavariableNodeQuery = (0, _query.nodeQuery)("/assumption/metavariable!"), frameAssumptionMetavariableNodeQuery = (0, _query.nodeQuery)("/frame/assumption!/metavariable!");
155
+ var Pass = /*#__PURE__*/ function() {
156
+ function Pass() {
157
+ _class_call_check(this, Pass);
158
+ }
159
+ _create_class(Pass, [
160
+ {
161
+ key: "run",
162
+ value: function run(generalNode, specificNode) {
163
+ for(var _len = arguments.length, remainingArguments = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++){
164
+ remainingArguments[_key - 2] = arguments[_key];
165
+ }
166
+ var success;
167
+ var visited = this.visitNode.apply(this, [
168
+ generalNode,
169
+ specificNode
170
+ ].concat(_to_consumable_array(remainingArguments)));
171
+ success = visited; ///
172
+ return success;
173
+ }
174
+ },
175
+ {
176
+ key: "descend",
177
+ value: function descend(generalChildNodes, specificChildNodes) {
178
+ var _this = this;
179
+ for(var _len = arguments.length, remainingArguments = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++){
180
+ remainingArguments[_key - 2] = arguments[_key];
181
+ }
182
+ var descendedAhead = false;
183
+ var generalChildNodesLength = generalChildNodes.length, specificChildNodesLength = specificChildNodes.length;
184
+ if (generalChildNodesLength === specificChildNodesLength) {
185
+ var specificTerminalNodeMap = (0, _pass.terminalNodeMapFromNodes)(specificChildNodes), generalTerminalNodeMap = (0, _pass.terminalNodeMapFromNodes)(generalChildNodes), terminalNodeMapsEqual = (0, _pass.areTerminalNodeMapsEqual)(generalTerminalNodeMap, specificTerminalNodeMap);
186
+ if (terminalNodeMapsEqual) {
187
+ var lastRemainingArgumentFunction = (0, _pass.isLastRemainingArgumentFunction)(remainingArguments);
188
+ if (lastRemainingArgumentFunction) {
189
+ var index = 0;
190
+ descendedAhead = this.descendAhead.apply(this, [
191
+ index,
192
+ generalChildNodes,
193
+ specificChildNodes
194
+ ].concat(_to_consumable_array(remainingArguments)));
195
+ } else {
196
+ var visited = generalChildNodes.every(function(generalChildNode, index) {
197
+ var specificChildNode = specificChildNodes[index], specificNode = specificChildNode, generalNode = generalChildNode, visited = _this.visitNode.apply(_this, [
198
+ generalNode,
199
+ specificNode
200
+ ].concat(_to_consumable_array(remainingArguments)));
201
+ if (visited) {
202
+ return true;
203
+ }
204
+ });
205
+ if (visited) {
206
+ descendedAhead = true;
207
+ }
208
+ }
209
+ }
210
+ }
211
+ return descendedAhead;
212
+ }
213
+ },
214
+ {
215
+ key: "descendAhead",
216
+ value: function descendAhead(index, generalChildNodes, specificChildNodes) {
217
+ var _this = this;
218
+ for(var _len = arguments.length, remainingArguments = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++){
219
+ remainingArguments[_key - 3] = arguments[_key];
220
+ }
221
+ var descendedAhead = false;
222
+ var descendAhead = remainingArguments.pop(), generalChildNodesLength = generalChildNodes.length;
223
+ if (index === generalChildNodesLength) {
224
+ descendedAhead = descendAhead();
225
+ } else {
226
+ var generalChildNode = generalChildNodes[index], specificChildNode = specificChildNodes[index], generalNode = generalChildNode, specificNode = specificChildNode, visited = this.visitNode.apply(this, [
227
+ generalNode,
228
+ specificNode
229
+ ].concat(_to_consumable_array(remainingArguments), [
230
+ function() {
231
+ remainingArguments.push(descendAhead); ///
232
+ var aheadIndex = index + 1, descendedAhead = _this.descendAhead.apply(_this, [
233
+ aheadIndex,
234
+ generalChildNodes,
235
+ specificChildNodes
236
+ ].concat(_to_consumable_array(remainingArguments)));
237
+ return descendedAhead;
238
+ }
239
+ ]));
240
+ if (visited) {
241
+ descendedAhead = true;
242
+ }
243
+ }
244
+ return descendedAhead;
245
+ }
246
+ },
247
+ {
248
+ key: "visitNode",
249
+ value: function visitNode(generalNode, specificNode) {
250
+ for(var _len = arguments.length, remainingArguments = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++){
251
+ remainingArguments[_key - 2] = arguments[_key];
252
+ }
253
+ var visited = false;
254
+ var generalNodeTerminalNode = generalNode.isTerminalNode(), specificNodeTerminalNode = specificNode.isTerminalNode(), generalNodeNonTerminalNode = generalNode.isNonTerminalNode(), specificNodeNonTerminalNode = specificNode.isNonTerminalNode();
255
+ if (false) {
256
+ ///
257
+ } else if (generalNodeTerminalNode && specificNodeTerminalNode) {
258
+ var generalTerminalNode = generalNode, specificTerminalNode = specificNode; ///
259
+ visited = this.visitTerminalNode.apply(this, [
260
+ generalTerminalNode,
261
+ specificTerminalNode
262
+ ].concat(_to_consumable_array(remainingArguments)));
263
+ } else if (generalNodeNonTerminalNode && specificNodeNonTerminalNode) {
264
+ var generalNonTerminalNode = generalNode, specificNonTerminalNode = specificNode; ///
265
+ visited = this.visitNonTerminalNode.apply(this, [
266
+ generalNonTerminalNode,
267
+ specificNonTerminalNode
268
+ ].concat(_to_consumable_array(remainingArguments)));
269
+ }
270
+ return visited;
271
+ }
272
+ },
273
+ {
274
+ key: "visitTerminalNode",
275
+ value: function visitTerminalNode(generalTerminalNode, specificTerminalNode) {
276
+ for(var _len = arguments.length, remainingArguments = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++){
277
+ remainingArguments[_key - 2] = arguments[_key];
278
+ }
279
+ var visited = false;
280
+ var lastRemainingArgumentFunction = (0, _pass.isLastRemainingArgumentFunction)(remainingArguments);
281
+ if (lastRemainingArgumentFunction) {
282
+ var descendAhead = remainingArguments.pop(), descendedAhead = descendAhead();
283
+ if (descendAhead) {
284
+ visited = descendedAhead; ///
285
+ }
286
+ remainingArguments.push(descendAhead);
287
+ } else {
288
+ visited = true;
289
+ }
290
+ return visited;
291
+ }
292
+ },
293
+ {
294
+ key: "visitNonTerminalNode",
295
+ value: function visitNonTerminalNode(generalNonTerminalNode, specificNonTerminalNode) {
296
+ for(var _len = arguments.length, remainingArguments = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++){
297
+ remainingArguments[_key - 2] = arguments[_key];
298
+ }
299
+ var _this = this;
300
+ var visited = false;
301
+ var maps = this.constructor.maps;
302
+ maps = _to_consumable_array(maps).concat([
303
+ {
304
+ generalNodeQuery: nonTerminalNodeQuery,
305
+ specificNodeQuery: nonTerminalNodeQuery,
306
+ run: function(generalNode, specificNode) {
307
+ for(var _len = arguments.length, remainingArguments = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++){
308
+ remainingArguments[_key - 2] = arguments[_key];
309
+ }
310
+ var visited = false;
311
+ var generalNonTerminalNodeRuleName = generalNonTerminalNode.getRuleName(), specificNonTerminalNodeRuleName = specificNonTerminalNode.getRuleName(); ///
312
+ if (generalNonTerminalNodeRuleName === specificNonTerminalNodeRuleName) {
313
+ var generalNonTerminalNodeChildNodes = generalNonTerminalNode.getChildNodes(), specificNonTerminalNodeChildNodes = specificNonTerminalNode.getChildNodes(), generalChildNodes = generalNonTerminalNodeChildNodes, specificChildNodes = specificNonTerminalNodeChildNodes, descended = _this.descend.apply(_this, [
314
+ generalChildNodes,
315
+ specificChildNodes
316
+ ].concat(_to_consumable_array(remainingArguments)));
317
+ if (descended) {
318
+ visited = true;
319
+ }
320
+ }
321
+ return visited;
322
+ }
323
+ }
324
+ ]);
325
+ maps.some(function(map) {
326
+ var generalNodeQuery = map.generalNodeQuery, specificNodeQuery = map.specificNodeQuery, run = map.run;
327
+ var generalNode = generalNodeQuery(generalNonTerminalNode), specificNode = specificNodeQuery(specificNonTerminalNode); ///
328
+ if (generalNode !== null && specificNode !== null) {
329
+ var success = run.apply(void 0, [
330
+ generalNode,
331
+ specificNode
332
+ ].concat(_to_consumable_array(remainingArguments)));
333
+ visited = success; ///
334
+ return true;
335
+ }
336
+ });
337
+ return visited;
338
+ }
339
+ }
340
+ ]);
341
+ return Pass;
342
+ }();
343
+ var MetaLevelPass = /*#__PURE__*/ function(Pass) {
344
+ _inherits(MetaLevelPass, Pass);
345
+ function MetaLevelPass() {
346
+ _class_call_check(this, MetaLevelPass);
347
+ return _call_super(this, MetaLevelPass, arguments);
348
+ }
349
+ return MetaLevelPass;
350
+ }(Pass);
351
+ _define_property(MetaLevelPass, "maps", [
352
+ {
353
+ generalNodeQuery: assumptionMetavariableNodeQuery,
354
+ specificNodeQuery: assumptionMetavariableNodeQuery,
355
+ run: function(generalAssumptionMetavariableNode, specificAssumptionMetavariableNode, substitutions, generalContext, specificContext) {
356
+ var success = false;
357
+ var context, metavariableNode;
358
+ context = generalContext; ///
359
+ metavariableNode = generalAssumptionMetavariableNode; ///
360
+ var metavariableName = metavariableNode.getMetavariableName(), metavariable = context.findMetavariableByMetavariableName(metavariableName);
361
+ context = specificContext; ///
362
+ metavariableNode = specificAssumptionMetavariableNode; ///
363
+ var reference = context.findReferenceByMetavariableNode(metavariableNode), referenceUnifies = metavariable.unifyReference(reference, substitutions, generalContext, specificContext);
364
+ if (referenceUnifies) {
365
+ success = true;
366
+ }
367
+ return success;
368
+ }
369
+ },
370
+ {
371
+ generalNodeQuery: statementMetavariableNodeQuery,
372
+ specificNodeQuery: statementNodeQuery,
373
+ run: function(generalStatementMetavariableNode, specificStatementNode, substitutions, generalContext, specificContext) {
374
+ var success = false;
375
+ var context, statementNode;
376
+ context = generalContext; ///
377
+ var metavariableNode = generalStatementMetavariableNode, metavariableName = metavariableNode.getMetavariableName(), metavariable = context.findMetavariableByMetavariableName(metavariableName), metavariableNodeParentNode = metavariableNode.getParentNode();
378
+ statementNode = metavariableNodeParentNode; ///
379
+ var frameSubstitutionNode = statementNode.getFrameSubstitutionNode(), termSubstitutionNode = statementNode.getTermSubstitutionNode(), substitutionNode = frameSubstitutionNode || termSubstitutionNode, substitution = substitutionNode !== null ? context.findSubstitutionBySubstitutionNode(substitutionNode) : null;
380
+ context = specificContext; ///
381
+ statementNode = specificStatementNode; ///
382
+ var statement = context.findStatementByStatementNode(statementNode), statementUnifies = metavariable.unifyStatement(statement, substitution, substitutions, generalContext, specificContext);
383
+ if (statementUnifies) {
384
+ success = true;
385
+ }
386
+ return success;
387
+ }
388
+ },
389
+ {
390
+ generalNodeQuery: frameAssumptionMetavariableNodeQuery,
391
+ specificNodeQuery: frameNodeQuery,
392
+ run: function(generalFrameAssumptionMetavariableNode, specificFrameNode, substitutions, generalContext, specificContext) {
393
+ var success = false;
394
+ var frameNode = specificFrameNode, metavariableNode = generalFrameAssumptionMetavariableNode, metavariableName = metavariableNode.getMetavariableName();
395
+ var context;
396
+ context = generalContext; ///
397
+ var metavariable = context.findMetavariableByMetavariableName(metavariableName);
398
+ context = specificContext; ///
399
+ var frame = context.findFrameByFrameNode(frameNode), frameUnifies = metavariable.unifyFrame(frame, substitutions, generalContext, specificContext);
400
+ if (frameUnifies) {
401
+ success = true;
402
+ }
403
+ return success;
404
+ }
405
+ },
406
+ {
407
+ generalNodeQuery: termVariableNodeQuery,
408
+ specificNodeQuery: termNodeQuery,
409
+ run: function(generalTermVariableNode, specificTermNode, substitutions, generalContext, specificContext) {
410
+ var success = false;
411
+ var termNode = specificTermNode, variableNode = generalTermVariableNode, variableIdentifier = variableNode.getVariableIdentifier();
412
+ var context;
413
+ context = generalContext; ///
414
+ var variable = context.findVariableByVariableIdentifier(variableIdentifier);
415
+ context = specificContext; ///
416
+ var term = context.findTermByTermNode(termNode), termUnifies = variable.unifyTerm(term, substitutions, generalContext, specificContext);
417
+ if (termUnifies) {
418
+ success = true;
419
+ }
420
+ return success;
421
+ }
422
+ }
423
+ ]);
424
+ var CombinatorPass = /*#__PURE__*/ function(Pass) {
425
+ _inherits(CombinatorPass, Pass);
426
+ function CombinatorPass() {
427
+ _class_call_check(this, CombinatorPass);
428
+ return _call_super(this, CombinatorPass, arguments);
429
+ }
430
+ return CombinatorPass;
431
+ }(Pass);
432
+ _define_property(CombinatorPass, "maps", [
433
+ {
434
+ generalNodeQuery: metaTypeNodeQuery,
435
+ specificNodeQuery: statementNodeQuery,
436
+ run: function(generalMetaTypeNode, specificStatementNode, assignments, stated, generalContext, specificContext) {
437
+ var success = false;
438
+ var metaTypeNode = generalMetaTypeNode, statementNode = specificStatementNode; ///
439
+ var context;
440
+ context = generalContext; ///
441
+ var metaTypeName = metaTypeNode.getMetaTypeName(), metaType = context.findMetaTypeByMetaTypeName(metaTypeName);
442
+ context = specificContext; ///
443
+ var Statement = _ontology.default.Statement, statement = Statement.fromStatementNode(statementNode, context), statementVerifiesGivenType = statement.verifyGivenMetaType(metaType, assignments, stated, context);
444
+ if (statementVerifiesGivenType) {
445
+ success = true;
446
+ }
447
+ return success;
448
+ }
449
+ },
450
+ {
451
+ generalNodeQuery: metaTypeNodeQuery,
452
+ specificNodeQuery: frameNodeQuery,
453
+ run: function(generalMetaTypeNode, specificFrameNode, assignments, stated, generalContext, specificContext) {
454
+ var success = false;
455
+ var metaTypeNode = generalMetaTypeNode, frameNode = specificFrameNode; ///
456
+ var context;
457
+ context = generalContext; ///
458
+ var metaTypeName = metaTypeNode.getMetaTypeName(), metaType = context.findMetaTypeByMetaTypeName(metaTypeName);
459
+ context = specificContext; ///
460
+ var Frame = _ontology.default.Frame, frame = Frame.fromFrameNode(frameNode, context), frameVerifiesGivenType = frame.verifyGivenMetaType(metaType, assignments, stated, context);
461
+ if (frameVerifiesGivenType) {
462
+ success = true;
463
+ }
464
+ return success;
465
+ }
466
+ },
467
+ {
468
+ generalNodeQuery: typeNodeQuery,
469
+ specificNodeQuery: termNodeQuery,
470
+ run: function(generalTypeNode, specificTermNode, assignments, stated, generalContext, specificContext) {
471
+ var success = false;
472
+ var typeNode = generalTypeNode, termNode = specificTermNode, nominalTypeName = typeNode.getNominalTypeName();
473
+ var context;
474
+ context = generalContext; ///
475
+ var type = context.findTypeByNominalTypeName(nominalTypeName);
476
+ if (type !== null) {
477
+ context = specificContext; ///
478
+ var Term = _ontology.default.Term, term = Term.fromTermNode(termNode, context), termVerifiesGivenType = term.verifyGivenType(type, generalContext, specificContext);
479
+ if (termVerifiesGivenType) {
480
+ success = true;
481
+ }
482
+ }
483
+ return success;
484
+ }
485
+ }
486
+ ]);
487
+ var ConstructorPass = /*#__PURE__*/ function(Pass) {
488
+ _inherits(ConstructorPass, Pass);
489
+ function ConstructorPass() {
490
+ _class_call_check(this, ConstructorPass);
491
+ return _call_super(this, ConstructorPass, arguments);
492
+ }
493
+ return ConstructorPass;
494
+ }(Pass);
495
+ _define_property(ConstructorPass, "maps", [
496
+ {
497
+ generalNodeQuery: typeNodeQuery,
498
+ specificNodeQuery: termNodeQuery,
499
+ run: function(generalTypeNode, specificTermNode, generalContext, specificContext) {
500
+ var success = false;
501
+ var typeNode = generalTypeNode, termNode = specificTermNode, nominalTypeName = typeNode.getNominalTypeName();
502
+ var context;
503
+ context = generalContext; ///
504
+ var type = context.findTypeByNominalTypeName(nominalTypeName);
505
+ if (type !== null) {
506
+ context = specificContext; ///
507
+ var Term = _ontology.default.Term, term = Term.fromTermNode(termNode, context), termVerifiesGivenType = term.verifyGivenType(type, generalContext, specificContext);
508
+ if (termVerifiesGivenType) {
509
+ success = true;
510
+ }
511
+ }
512
+ return success;
513
+ }
514
+ }
515
+ ]);
516
+ var MetavariablePass = /*#__PURE__*/ function(Pass) {
517
+ _inherits(MetavariablePass, Pass);
518
+ function MetavariablePass() {
519
+ _class_call_check(this, MetavariablePass);
520
+ return _call_super(this, MetavariablePass, arguments);
521
+ }
522
+ return MetavariablePass;
523
+ }(Pass);
524
+ _define_property(MetavariablePass, "maps", [
525
+ {
526
+ generalNodeQuery: typeNodeQuery,
527
+ specificNodeQuery: termNodeQuery,
528
+ run: function(generalTypeNode, specificTermNode, generalContext, specificContext) {
529
+ var success = false;
530
+ var typeNode = generalTypeNode, termNode = specificTermNode, nominalTypeName = typeNode.getNominalTypeName(), type = generalContext.findTypeByNominalTypeName(nominalTypeName), context = specificContext, term = context.findTermByTermNode(termNode), termVerifiesGivenType = term.verifyGivenType(type, generalContext, specificContext);
531
+ if (termVerifiesGivenType) {
532
+ success = true;
533
+ }
534
+ return success;
535
+ }
536
+ }
537
+ ]);
538
+ var IntrinsicLevelPass = /*#__PURE__*/ function(Pass) {
539
+ _inherits(IntrinsicLevelPass, Pass);
540
+ function IntrinsicLevelPass() {
541
+ _class_call_check(this, IntrinsicLevelPass);
542
+ return _call_super(this, IntrinsicLevelPass, arguments);
543
+ }
544
+ return IntrinsicLevelPass;
545
+ }(Pass);
546
+ _define_property(IntrinsicLevelPass, "maps", [
547
+ {
548
+ generalNodeQuery: termVariableNodeQuery,
549
+ specificNodeQuery: termNodeQuery,
550
+ run: function(generalTermVariableNode, specificTermNode, substitutions, generalContext, specificContext) {
551
+ var success = false;
552
+ var termNode = specificTermNode, variableNode = generalTermVariableNode, variableIdentifier = variableNode.getVariableIdentifier();
553
+ var context;
554
+ context = generalContext; ///
555
+ var variable = context.findVariableByVariableIdentifier(variableIdentifier);
556
+ context = specificContext; ///
557
+ var term = context.findTermByTermNode(termNode), termUnifies = variable.unifyTerm(term, substitutions, generalContext, specificContext);
558
+ if (termUnifies) {
559
+ success = true;
560
+ }
561
+ return success;
562
+ }
563
+ }
564
+ ]);
565
+ var metaLevelPass = new MetaLevelPass(), combinatorPass = new CombinatorPass(), constructorPass = new ConstructorPass(), metavariablePass = new MetavariablePass(), intrinsicLevelPass = new IntrinsicLevelPass();
566
+ function unifyStatement(generalStatement, specificStatement, substitutions, generalContext, specificContext) {
567
+ var statementUnifies = false;
568
+ var generalStatementNode = generalStatement.getNode(), specificStatementNode = specificStatement.getNode(), generalNode = generalStatementNode, specificNode = specificStatementNode, success = metaLevelPass.run(generalNode, specificNode, substitutions, generalContext, specificContext);
569
+ if (success) {
570
+ statementUnifies = true;
571
+ }
572
+ return statementUnifies;
573
+ }
574
+ function unifySubstitution(generalSubstitution, specificSubstitution, substitutions, generalContext, specificContext) {
575
+ var substitutionUnifies = false;
576
+ var generalSubstitutionNode = generalSubstitution.getNode(), specificSubstitutionNode = specificSubstitution.getNode(), generalNode = generalSubstitutionNode, specificNode = specificSubstitutionNode, success = metaLevelPass.run(generalNode, specificNode, substitutions, generalContext, specificContext);
577
+ if (success) {
578
+ substitutionUnifies = true;
579
+ }
580
+ return substitutionUnifies;
581
+ }
582
+ function unifyMetavariable(generalMetavariable, specificMetavariable, generalContext, specificContext) {
583
+ var metavariableUnifies = false;
584
+ var generalMetavariableNode = generalMetavariable.getNode(), specificMetavariableNode = specificMetavariable.getNode(), success = metavariablePass.run(generalMetavariableNode, specificMetavariableNode, generalContext, specificContext);
585
+ if (success) {
586
+ metavariableUnifies = true;
587
+ }
588
+ return metavariableUnifies;
589
+ }
590
+ function unifyTermWithConstructor(term, constructor, context) {
591
+ var termUnifiesWithConstructor = false;
592
+ var termNode = term.getNode(), generalContext = context, specificContext = context, constructorTerm = constructor.getTerm(), constructorTermNode = constructorTerm.getNode(), success = constructorPass.run(constructorTermNode, termNode, generalContext, specificContext);
593
+ if (success) {
594
+ termUnifiesWithConstructor = true;
595
+ }
596
+ return termUnifiesWithConstructor;
597
+ }
598
+ function unifyStatementIntrinsically(generalStatement, specificStatement, substitutions, generalContext, specificContext) {
599
+ var statementUnifiesIntrinsically = false;
600
+ var generalStatementNode = generalStatement.getNode(), specificStatementNode = specificStatement.getNode(), generalNode = generalStatementNode, specificNode = specificStatementNode, success = intrinsicLevelPass.run(generalNode, specificNode, substitutions, generalContext, specificContext);
601
+ if (success) {
602
+ statementUnifiesIntrinsically = true;
603
+ }
604
+ return statementUnifiesIntrinsically;
605
+ }
606
+ function unifyStatementWithCombinator(statement, combinator, assignments, stated, context) {
607
+ var statementUnifiesWithCombinator = false;
608
+ var statementNode = statement.getNode(), generalContext = context, specificContext = context, combinatorStatement = combinator.getStatement(), combinatorStatementNode = combinatorStatement.getNode(), success = combinatorPass.run(combinatorStatementNode, statementNode, assignments, stated, generalContext, specificContext);
609
+ if (success) {
610
+ statementUnifiesWithCombinator = true;
611
+ }
612
+ return statementUnifiesWithCombinator;
613
+ }
614
+ function unifyMetavariableIntrinsically(generalMetavariable, specificMetavariable, substitutions, generalContext, specificContext) {
615
+ var metavariableUnifiesIntrinsically = false;
616
+ var generalMetavariableNode = generalMetavariable.getNode(), specificMetavariableNode = specificMetavariable.getNode(), generalNode = generalMetavariableNode, specificNode = specificMetavariableNode, success = intrinsicLevelPass.run(generalNode, specificNode, substitutions, generalContext, specificContext);
617
+ if (success) {
618
+ metavariableUnifiesIntrinsically = true;
619
+ }
620
+ return metavariableUnifiesIntrinsically;
621
+ }
622
+
623
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9jZXNzL3VuaWZ5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgb250b2xvZ3kgZnJvbSBcIi4uL29udG9sb2d5XCI7XG5cbmltcG9ydCB7IG5vZGVRdWVyeSB9IGZyb20gXCIuLi91dGlsaXRpZXMvcXVlcnlcIjtcbmltcG9ydCB7IHRlcm1pbmFsTm9kZU1hcEZyb21Ob2RlcywgYXJlVGVybWluYWxOb2RlTWFwc0VxdWFsLCBpc0xhc3RSZW1haW5pbmdBcmd1bWVudEZ1bmN0aW9uIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9wYXNzXCI7XG5cbmNvbnN0IG5vblRlcm1pbmFsTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiLypcIik7XG5cbmNvbnN0IHR5cGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvdHlwZVwiKSxcbiAgICAgIHRlcm1Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvdGVybVwiKSxcbiAgICAgIGZyYW1lTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL2ZyYW1lXCIpLFxuICAgICAgbWV0YVR5cGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvbWV0YVR5cGVcIiksXG4gICAgICBzdGF0ZW1lbnROb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvc3RhdGVtZW50XCIpLFxuICAgICAgdGVybVZhcmlhYmxlTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL3Rlcm0vdmFyaWFibGUhXCIpLFxuICAgICAgc3RhdGVtZW50TWV0YXZhcmlhYmxlTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL3N0YXRlbWVudC9tZXRhdmFyaWFibGUhXCIpLFxuICAgICAgYXNzdW1wdGlvbk1ldGF2YXJpYWJsZU5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9hc3N1bXB0aW9uL21ldGF2YXJpYWJsZSFcIiksXG4gICAgICBmcmFtZUFzc3VtcHRpb25NZXRhdmFyaWFibGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvZnJhbWUvYXNzdW1wdGlvbiEvbWV0YXZhcmlhYmxlIVwiKTtcblxuY2xhc3MgUGFzcyB7XG4gIHJ1bihnZW5lcmFsTm9kZSwgc3BlY2lmaWNOb2RlLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgICBsZXQgc3VjY2VzcztcblxuICAgIGNvbnN0IHZpc2l0ZWQgPSB0aGlzLnZpc2l0Tm9kZShnZW5lcmFsTm9kZSwgc3BlY2lmaWNOb2RlLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuXG4gICAgc3VjY2VzcyA9IHZpc2l0ZWQ7ICAvLy9cblxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9XG5cbiAgZGVzY2VuZChnZW5lcmFsQ2hpbGROb2Rlcywgc3BlY2lmaWNDaGlsZE5vZGVzLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgICBsZXQgZGVzY2VuZGVkQWhlYWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGdlbmVyYWxDaGlsZE5vZGVzTGVuZ3RoID0gZ2VuZXJhbENoaWxkTm9kZXMubGVuZ3RoLFxuICAgICAgICAgIHNwZWNpZmljQ2hpbGROb2Rlc0xlbmd0aCA9IHNwZWNpZmljQ2hpbGROb2Rlcy5sZW5ndGg7XG5cbiAgICBpZiAoZ2VuZXJhbENoaWxkTm9kZXNMZW5ndGggPT09IHNwZWNpZmljQ2hpbGROb2Rlc0xlbmd0aCkge1xuICAgICAgY29uc3Qgc3BlY2lmaWNUZXJtaW5hbE5vZGVNYXAgPSB0ZXJtaW5hbE5vZGVNYXBGcm9tTm9kZXMoc3BlY2lmaWNDaGlsZE5vZGVzKSxcbiAgICAgICAgICAgIGdlbmVyYWxUZXJtaW5hbE5vZGVNYXAgPSB0ZXJtaW5hbE5vZGVNYXBGcm9tTm9kZXMoZ2VuZXJhbENoaWxkTm9kZXMpLFxuICAgICAgICAgICAgdGVybWluYWxOb2RlTWFwc0VxdWFsID0gYXJlVGVybWluYWxOb2RlTWFwc0VxdWFsKGdlbmVyYWxUZXJtaW5hbE5vZGVNYXAsIHNwZWNpZmljVGVybWluYWxOb2RlTWFwKTtcblxuICAgICAgaWYgKHRlcm1pbmFsTm9kZU1hcHNFcXVhbCkge1xuICAgICAgICBjb25zdCBsYXN0UmVtYWluaW5nQXJndW1lbnRGdW5jdGlvbiA9IGlzTGFzdFJlbWFpbmluZ0FyZ3VtZW50RnVuY3Rpb24ocmVtYWluaW5nQXJndW1lbnRzKTtcblxuICAgICAgICBpZiAobGFzdFJlbWFpbmluZ0FyZ3VtZW50RnVuY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IDA7XG5cbiAgICAgICAgICBkZXNjZW5kZWRBaGVhZCA9IHRoaXMuZGVzY2VuZEFoZWFkKGluZGV4LCBnZW5lcmFsQ2hpbGROb2Rlcywgc3BlY2lmaWNDaGlsZE5vZGVzLC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdmlzaXRlZCA9IGdlbmVyYWxDaGlsZE5vZGVzLmV2ZXJ5KChnZW5lcmFsQ2hpbGROb2RlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3BlY2lmaWNDaGlsZE5vZGUgPSBzcGVjaWZpY0NoaWxkTm9kZXNbaW5kZXhdLFxuICAgICAgICAgICAgICAgICAgc3BlY2lmaWNOb2RlID0gc3BlY2lmaWNDaGlsZE5vZGUsIC8vL1xuICAgICAgICAgICAgICAgICAgZ2VuZXJhbE5vZGUgPSBnZW5lcmFsQ2hpbGROb2RlLCAvLy9cbiAgICAgICAgICAgICAgICAgIHZpc2l0ZWQgPSB0aGlzLnZpc2l0Tm9kZShnZW5lcmFsTm9kZSwgc3BlY2lmaWNOb2RlLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuXG4gICAgICAgICAgICBpZiAodmlzaXRlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICh2aXNpdGVkKSB7XG4gICAgICAgICAgICBkZXNjZW5kZWRBaGVhZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlc2NlbmRlZEFoZWFkO1xuICB9XG5cbiAgZGVzY2VuZEFoZWFkKGluZGV4LCBnZW5lcmFsQ2hpbGROb2Rlcywgc3BlY2lmaWNDaGlsZE5vZGVzLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgICBsZXQgZGVzY2VuZGVkQWhlYWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGRlc2NlbmRBaGVhZCA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKSwgLy8vXG4gICAgICAgICAgZ2VuZXJhbENoaWxkTm9kZXNMZW5ndGggPSBnZW5lcmFsQ2hpbGROb2Rlcy5sZW5ndGg7XG5cbiAgICBpZiAoaW5kZXggPT09IGdlbmVyYWxDaGlsZE5vZGVzTGVuZ3RoKSB7XG4gICAgICBkZXNjZW5kZWRBaGVhZCA9IGRlc2NlbmRBaGVhZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBnZW5lcmFsQ2hpbGROb2RlID0gZ2VuZXJhbENoaWxkTm9kZXNbaW5kZXhdLFxuICAgICAgICAgICAgc3BlY2lmaWNDaGlsZE5vZGUgPSBzcGVjaWZpY0NoaWxkTm9kZXNbaW5kZXhdLFxuICAgICAgICAgICAgZ2VuZXJhbE5vZGUgPSBnZW5lcmFsQ2hpbGROb2RlLCAvLy9cbiAgICAgICAgICAgIHNwZWNpZmljTm9kZSA9IHNwZWNpZmljQ2hpbGROb2RlLCAvLy9cbiAgICAgICAgICAgIHZpc2l0ZWQgPSB0aGlzLnZpc2l0Tm9kZShnZW5lcmFsTm9kZSwgc3BlY2lmaWNOb2RlLCAuLi5yZW1haW5pbmdBcmd1bWVudHMsICgpID0+IHtcbiAgICAgICAgICAgICAgcmVtYWluaW5nQXJndW1lbnRzLnB1c2goZGVzY2VuZEFoZWFkKTsgLy8vXG5cbiAgICAgICAgICAgICAgY29uc3QgYWhlYWRJbmRleCA9IGluZGV4ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGVkQWhlYWQgPSB0aGlzLmRlc2NlbmRBaGVhZChhaGVhZEluZGV4LCBnZW5lcmFsQ2hpbGROb2Rlcywgc3BlY2lmaWNDaGlsZE5vZGVzLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBkZXNjZW5kZWRBaGVhZDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICBpZiAodmlzaXRlZCkge1xuICAgICAgICBkZXNjZW5kZWRBaGVhZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlc2NlbmRlZEFoZWFkO1xuICB9XG5cbiAgdmlzaXROb2RlKGdlbmVyYWxOb2RlLCBzcGVjaWZpY05vZGUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICAgIGxldCB2aXNpdGVkID0gZmFsc2U7XG5cbiAgICBjb25zdCBnZW5lcmFsTm9kZVRlcm1pbmFsTm9kZSA9IGdlbmVyYWxOb2RlLmlzVGVybWluYWxOb2RlKCksXG4gICAgICAgICAgc3BlY2lmaWNOb2RlVGVybWluYWxOb2RlID0gc3BlY2lmaWNOb2RlLmlzVGVybWluYWxOb2RlKCksXG4gICAgICAgICAgZ2VuZXJhbE5vZGVOb25UZXJtaW5hbE5vZGUgPSBnZW5lcmFsTm9kZS5pc05vblRlcm1pbmFsTm9kZSgpLFxuICAgICAgICAgIHNwZWNpZmljTm9kZU5vblRlcm1pbmFsTm9kZSA9IHNwZWNpZmljTm9kZS5pc05vblRlcm1pbmFsTm9kZSgpO1xuXG4gICAgaWYgKGZhbHNlKSB7XG4gICAgICAvLy9cbiAgICB9IGVsc2UgaWYgKGdlbmVyYWxOb2RlVGVybWluYWxOb2RlICYmIHNwZWNpZmljTm9kZVRlcm1pbmFsTm9kZSkge1xuICAgICAgY29uc3QgZ2VuZXJhbFRlcm1pbmFsTm9kZSA9IGdlbmVyYWxOb2RlLCAgLy8vXG4gICAgICAgICAgICBzcGVjaWZpY1Rlcm1pbmFsTm9kZSA9IHNwZWNpZmljTm9kZTsgIC8vL1xuXG4gICAgICB2aXNpdGVkID0gdGhpcy52aXNpdFRlcm1pbmFsTm9kZShnZW5lcmFsVGVybWluYWxOb2RlLCBzcGVjaWZpY1Rlcm1pbmFsTm9kZSwgLi4ucmVtYWluaW5nQXJndW1lbnRzKTtcbiAgICB9IGVsc2UgaWYgKGdlbmVyYWxOb2RlTm9uVGVybWluYWxOb2RlICYmIHNwZWNpZmljTm9kZU5vblRlcm1pbmFsTm9kZSkge1xuICAgICAgY29uc3QgZ2VuZXJhbE5vblRlcm1pbmFsTm9kZSA9IGdlbmVyYWxOb2RlLCAgLy8vXG4gICAgICAgICAgICBzcGVjaWZpY05vblRlcm1pbmFsTm9kZSA9IHNwZWNpZmljTm9kZTsgLy8vXG5cbiAgICAgIHZpc2l0ZWQgPSB0aGlzLnZpc2l0Tm9uVGVybWluYWxOb2RlKGdlbmVyYWxOb25UZXJtaW5hbE5vZGUsIHNwZWNpZmljTm9uVGVybWluYWxOb2RlLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiB2aXNpdGVkO1xuICB9XG5cbiAgdmlzaXRUZXJtaW5hbE5vZGUoZ2VuZXJhbFRlcm1pbmFsTm9kZSwgc3BlY2lmaWNUZXJtaW5hbE5vZGUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykgeyAvLy9cbiAgICBsZXQgdmlzaXRlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgbGFzdFJlbWFpbmluZ0FyZ3VtZW50RnVuY3Rpb24gPSBpc0xhc3RSZW1haW5pbmdBcmd1bWVudEZ1bmN0aW9uKHJlbWFpbmluZ0FyZ3VtZW50cyk7XG5cbiAgICBpZiAobGFzdFJlbWFpbmluZ0FyZ3VtZW50RnVuY3Rpb24pIHtcbiAgICAgIGNvbnN0IGRlc2NlbmRBaGVhZCA9IHJlbWFpbmluZ0FyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgICAgIGRlc2NlbmRlZEFoZWFkID0gZGVzY2VuZEFoZWFkKCk7XG5cbiAgICAgIGlmIChkZXNjZW5kQWhlYWQpIHtcbiAgICAgICAgdmlzaXRlZCA9IGRlc2NlbmRlZEFoZWFkOyAgLy8vXG4gICAgICB9XG5cbiAgICAgIHJlbWFpbmluZ0FyZ3VtZW50cy5wdXNoKGRlc2NlbmRBaGVhZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2l0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB2aXNpdGVkO1xuICB9XG5cbiAgdmlzaXROb25UZXJtaW5hbE5vZGUoZ2VuZXJhbE5vblRlcm1pbmFsTm9kZSwgc3BlY2lmaWNOb25UZXJtaW5hbE5vZGUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICAgIGxldCB2aXNpdGVkID0gZmFsc2U7XG5cbiAgICBsZXQgeyBtYXBzIH0gPSB0aGlzLmNvbnN0cnVjdG9yO1xuXG4gICAgbWFwcyA9IFsgLy8vXG4gICAgICAuLi5tYXBzLFxuICAgICAge1xuICAgICAgICBnZW5lcmFsTm9kZVF1ZXJ5OiBub25UZXJtaW5hbE5vZGVRdWVyeSxcbiAgICAgICAgc3BlY2lmaWNOb2RlUXVlcnk6IG5vblRlcm1pbmFsTm9kZVF1ZXJ5LFxuICAgICAgICBydW46IChnZW5lcmFsTm9kZSwgc3BlY2lmaWNOb2RlLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpID0+IHtcbiAgICAgICAgICBsZXQgdmlzaXRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgY29uc3QgZ2VuZXJhbE5vblRlcm1pbmFsTm9kZVJ1bGVOYW1lID0gZ2VuZXJhbE5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpLCAvLy9cbiAgICAgICAgICAgICAgICBzcGVjaWZpY05vblRlcm1pbmFsTm9kZVJ1bGVOYW1lID0gc3BlY2lmaWNOb25UZXJtaW5hbE5vZGUuZ2V0UnVsZU5hbWUoKTsgLy8vXG5cbiAgICAgICAgICBpZiAoZ2VuZXJhbE5vblRlcm1pbmFsTm9kZVJ1bGVOYW1lID09PSBzcGVjaWZpY05vblRlcm1pbmFsTm9kZVJ1bGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBnZW5lcmFsTm9uVGVybWluYWxOb2RlQ2hpbGROb2RlcyA9IGdlbmVyYWxOb25UZXJtaW5hbE5vZGUuZ2V0Q2hpbGROb2RlcygpLFxuICAgICAgICAgICAgICAgICAgc3BlY2lmaWNOb25UZXJtaW5hbE5vZGVDaGlsZE5vZGVzID0gc3BlY2lmaWNOb25UZXJtaW5hbE5vZGUuZ2V0Q2hpbGROb2RlcygpLFxuICAgICAgICAgICAgICAgICAgZ2VuZXJhbENoaWxkTm9kZXMgPSBnZW5lcmFsTm9uVGVybWluYWxOb2RlQ2hpbGROb2RlcywgLy8vXG4gICAgICAgICAgICAgICAgICBzcGVjaWZpY0NoaWxkTm9kZXMgPSBzcGVjaWZpY05vblRlcm1pbmFsTm9kZUNoaWxkTm9kZXMsIC8vL1xuICAgICAgICAgICAgICAgICAgZGVzY2VuZGVkID0gdGhpcy5kZXNjZW5kKGdlbmVyYWxDaGlsZE5vZGVzLCBzcGVjaWZpY0NoaWxkTm9kZXMsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgIGlmIChkZXNjZW5kZWQpIHtcbiAgICAgICAgICAgICAgdmlzaXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZpc2l0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG5cbiAgICBtYXBzLnNvbWUoKG1hcCkgPT4ge1xuICAgICAgY29uc3QgeyBnZW5lcmFsTm9kZVF1ZXJ5LCBzcGVjaWZpY05vZGVRdWVyeSwgcnVuIH0gPSBtYXA7XG5cbiAgICAgIGNvbnN0IGdlbmVyYWxOb2RlID0gZ2VuZXJhbE5vZGVRdWVyeShnZW5lcmFsTm9uVGVybWluYWxOb2RlKSwgIC8vL1xuICAgICAgICAgICAgc3BlY2lmaWNOb2RlID0gc3BlY2lmaWNOb2RlUXVlcnkoc3BlY2lmaWNOb25UZXJtaW5hbE5vZGUpOyAgLy8vXG5cbiAgICAgIGlmICgoZ2VuZXJhbE5vZGUgIT09IG51bGwpICYmIChzcGVjaWZpY05vZGUgIT09IG51bGwpKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgID0gcnVuKGdlbmVyYWxOb2RlLCBzcGVjaWZpY05vZGUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG5cbiAgICAgICAgdmlzaXRlZCA9IHN1Y2Nlc3M7ICAvLy9cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB2aXNpdGVkO1xuICB9XG59XG5cbmNsYXNzIE1ldGFMZXZlbFBhc3MgZXh0ZW5kcyBQYXNzIHtcbiAgc3RhdGljIG1hcHMgPSBbXG4gICAge1xuICAgICAgZ2VuZXJhbE5vZGVRdWVyeTogYXNzdW1wdGlvbk1ldGF2YXJpYWJsZU5vZGVRdWVyeSxcbiAgICAgIHNwZWNpZmljTm9kZVF1ZXJ5OiBhc3N1bXB0aW9uTWV0YXZhcmlhYmxlTm9kZVF1ZXJ5LFxuICAgICAgcnVuOiAoZ2VuZXJhbEFzc3VtcHRpb25NZXRhdmFyaWFibGVOb2RlLCBzcGVjaWZpY0Fzc3VtcHRpb25NZXRhdmFyaWFibGVOb2RlLCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSA9PiB7XG4gICAgICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IGNvbnRleHQsXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlO1xuXG4gICAgICAgIGNvbnRleHQgPSBnZW5lcmFsQ29udGV4dDsgLy8vXG5cbiAgICAgICAgbWV0YXZhcmlhYmxlTm9kZSA9IGdlbmVyYWxBc3N1bXB0aW9uTWV0YXZhcmlhYmxlTm9kZTsgIC8vL1xuXG4gICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5hbWUgPSBtZXRhdmFyaWFibGVOb2RlLmdldE1ldGF2YXJpYWJsZU5hbWUoKSxcbiAgICAgICAgICAgICAgbWV0YXZhcmlhYmxlID0gY29udGV4dC5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgIGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQ7ICAvLy9cblxuICAgICAgICBtZXRhdmFyaWFibGVOb2RlID0gc3BlY2lmaWNBc3N1bXB0aW9uTWV0YXZhcmlhYmxlTm9kZTsgLy8vXG5cbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gY29udGV4dC5maW5kUmVmZXJlbmNlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgICAgICByZWZlcmVuY2VVbmlmaWVzID0gbWV0YXZhcmlhYmxlLnVuaWZ5UmVmZXJlbmNlKHJlZmVyZW5jZSwgc3Vic3RpdHV0aW9ucywgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgICAgaWYgKHJlZmVyZW5jZVVuaWZpZXMpIHtcbiAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgZ2VuZXJhbE5vZGVRdWVyeTogc3RhdGVtZW50TWV0YXZhcmlhYmxlTm9kZVF1ZXJ5LFxuICAgICAgc3BlY2lmaWNOb2RlUXVlcnk6IHN0YXRlbWVudE5vZGVRdWVyeSxcbiAgICAgIHJ1bjogKGdlbmVyYWxTdGF0ZW1lbnRNZXRhdmFyaWFibGVOb2RlLCBzcGVjaWZpY1N0YXRlbWVudE5vZGUsIHN1YnN0aXR1dGlvbnMsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgICAgICBsZXQgY29udGV4dCxcbiAgICAgICAgICAgIHN0YXRlbWVudE5vZGU7XG5cbiAgICAgICAgY29udGV4dCA9IGdlbmVyYWxDb250ZXh0OyAvLy9cblxuICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gZ2VuZXJhbFN0YXRlbWVudE1ldGF2YXJpYWJsZU5vZGUsICAvLy9cbiAgICAgICAgICAgICAgbWV0YXZhcmlhYmxlTmFtZSA9IG1ldGF2YXJpYWJsZU5vZGUuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgICAgICBtZXRhdmFyaWFibGUgPSBjb250ZXh0LmZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSksXG4gICAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGVQYXJlbnROb2RlID0gbWV0YXZhcmlhYmxlTm9kZS5nZXRQYXJlbnROb2RlKCk7XG5cbiAgICAgICAgc3RhdGVtZW50Tm9kZSA9IG1ldGF2YXJpYWJsZU5vZGVQYXJlbnROb2RlOyAvLy9cblxuICAgICAgICBjb25zdCBmcmFtZVN1YnN0aXR1dGlvbk5vZGUgPSBzdGF0ZW1lbnROb2RlLmdldEZyYW1lU3Vic3RpdHV0aW9uTm9kZSgpLFxuICAgICAgICAgICAgICB0ZXJtU3Vic3RpdHV0aW9uTm9kZSA9IHN0YXRlbWVudE5vZGUuZ2V0VGVybVN1YnN0aXR1dGlvbk5vZGUoKSxcbiAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uTm9kZSA9IChmcmFtZVN1YnN0aXR1dGlvbk5vZGUgfHwgdGVybVN1YnN0aXR1dGlvbk5vZGUpLFxuICAgICAgICAgICAgICBzdWJzdGl0dXRpb24gPSAoc3Vic3RpdHV0aW9uTm9kZSAhPT0gbnVsbCkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmluZFN1YnN0aXR1dGlvbkJ5U3Vic3RpdHV0aW9uTm9kZShzdWJzdGl0dXRpb25Ob2RlKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsO1xuXG4gICAgICAgIGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQ7IC8vL1xuXG4gICAgICAgIHN0YXRlbWVudE5vZGUgPSBzcGVjaWZpY1N0YXRlbWVudE5vZGU7ICAvLy9cblxuICAgICAgICBjb25zdCBzdGF0ZW1lbnQgPSBjb250ZXh0LmZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSksXG4gICAgICAgICAgICAgIHN0YXRlbWVudFVuaWZpZXMgPSBtZXRhdmFyaWFibGUudW5pZnlTdGF0ZW1lbnQoc3RhdGVtZW50LCBzdWJzdGl0dXRpb24sIHN1YnN0aXR1dGlvbnMsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGdlbmVyYWxOb2RlUXVlcnk6IGZyYW1lQXNzdW1wdGlvbk1ldGF2YXJpYWJsZU5vZGVRdWVyeSxcbiAgICAgIHNwZWNpZmljTm9kZVF1ZXJ5OiBmcmFtZU5vZGVRdWVyeSxcbiAgICAgIHJ1bjogKGdlbmVyYWxGcmFtZUFzc3VtcHRpb25NZXRhdmFyaWFibGVOb2RlLCBzcGVjaWZpY0ZyYW1lTm9kZSwgc3Vic3RpdHV0aW9ucywgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkgPT4ge1xuICAgICAgICBsZXQgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGZyYW1lTm9kZSA9IHNwZWNpZmljRnJhbWVOb2RlLCAvLy9cbiAgICAgICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZSA9IGdlbmVyYWxGcmFtZUFzc3VtcHRpb25NZXRhdmFyaWFibGVOb2RlLCAgLy8vXG4gICAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSBtZXRhdmFyaWFibGVOb2RlLmdldE1ldGF2YXJpYWJsZU5hbWUoKTtcblxuICAgICAgICBsZXQgY29udGV4dDtcblxuICAgICAgICBjb250ZXh0ID0gZ2VuZXJhbENvbnRleHQ7IC8vL1xuXG4gICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IGNvbnRleHQuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgICAgICBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0OyAgLy8vXG5cbiAgICAgICAgY29uc3QgZnJhbWUgPSBjb250ZXh0LmZpbmRGcmFtZUJ5RnJhbWVOb2RlKGZyYW1lTm9kZSksXG4gICAgICAgICAgICAgIGZyYW1lVW5pZmllcyA9IG1ldGF2YXJpYWJsZS51bmlmeUZyYW1lKGZyYW1lLCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgICBpZiAoZnJhbWVVbmlmaWVzKSB7XG4gICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGdlbmVyYWxOb2RlUXVlcnk6IHRlcm1WYXJpYWJsZU5vZGVRdWVyeSxcbiAgICAgIHNwZWNpZmljTm9kZVF1ZXJ5OiB0ZXJtTm9kZVF1ZXJ5LFxuICAgICAgcnVuOiAoZ2VuZXJhbFRlcm1WYXJpYWJsZU5vZGUsIHNwZWNpZmljVGVybU5vZGUsIHN1YnN0aXR1dGlvbnMsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCB0ZXJtTm9kZSA9IHNwZWNpZmljVGVybU5vZGUsIC8vL1xuICAgICAgICAgICAgICB2YXJpYWJsZU5vZGUgPSBnZW5lcmFsVGVybVZhcmlhYmxlTm9kZSwgLy8vXG4gICAgICAgICAgICAgIHZhcmlhYmxlSWRlbnRpZmllciA9IHZhcmlhYmxlTm9kZS5nZXRWYXJpYWJsZUlkZW50aWZpZXIoKTtcblxuICAgICAgICBsZXQgY29udGV4dDtcblxuICAgICAgICBjb250ZXh0ID0gZ2VuZXJhbENvbnRleHQ7IC8vL1xuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlID0gY29udGV4dC5maW5kVmFyaWFibGVCeVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIpO1xuXG4gICAgICAgIGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQ7ICAvLy9cblxuICAgICAgICBjb25zdCB0ZXJtID0gY29udGV4dC5maW5kVGVybUJ5VGVybU5vZGUodGVybU5vZGUpLFxuICAgICAgICAgICAgICB0ZXJtVW5pZmllcyA9IHZhcmlhYmxlLnVuaWZ5VGVybSh0ZXJtLCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgICBpZiAodGVybVVuaWZpZXMpIHtcbiAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgICAgfVxuICAgIH1cbiAgXTtcbn1cblxuY2xhc3MgQ29tYmluYXRvclBhc3MgZXh0ZW5kcyBQYXNzIHtcbiAgc3RhdGljIG1hcHMgPSBbXG4gICAge1xuICAgICAgZ2VuZXJhbE5vZGVRdWVyeTogbWV0YVR5cGVOb2RlUXVlcnksXG4gICAgICBzcGVjaWZpY05vZGVRdWVyeTogc3RhdGVtZW50Tm9kZVF1ZXJ5LFxuICAgICAgcnVuOiAoZ2VuZXJhbE1ldGFUeXBlTm9kZSwgc3BlY2lmaWNTdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgc3RhdGVkLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSA9PiB7XG4gICAgICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbWV0YVR5cGVOb2RlID0gZ2VuZXJhbE1ldGFUeXBlTm9kZSwgLy8vXG4gICAgICAgICAgICAgIHN0YXRlbWVudE5vZGUgPSBzcGVjaWZpY1N0YXRlbWVudE5vZGU7IC8vL1xuXG4gICAgICAgIGxldCBjb250ZXh0O1xuXG4gICAgICAgIGNvbnRleHQgPSBnZW5lcmFsQ29udGV4dDsgLy8vXG5cbiAgICAgICAgY29uc3QgbWV0YVR5cGVOYW1lID0gbWV0YVR5cGVOb2RlLmdldE1ldGFUeXBlTmFtZSgpLFxuICAgICAgICAgICAgICBtZXRhVHlwZSA9IGNvbnRleHQuZmluZE1ldGFUeXBlQnlNZXRhVHlwZU5hbWUobWV0YVR5cGVOYW1lKTtcblxuICAgICAgICBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0OyAgLy8vXG5cbiAgICAgICAgY29uc3QgeyBTdGF0ZW1lbnQgfSA9IG9udG9sb2d5LFxuICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBTdGF0ZW1lbnQuZnJvbVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICAgIHN0YXRlbWVudFZlcmlmaWVzR2l2ZW5UeXBlID0gc3RhdGVtZW50LnZlcmlmeUdpdmVuTWV0YVR5cGUobWV0YVR5cGUsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChzdGF0ZW1lbnRWZXJpZmllc0dpdmVuVHlwZSkge1xuICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBnZW5lcmFsTm9kZVF1ZXJ5OiBtZXRhVHlwZU5vZGVRdWVyeSxcbiAgICAgIHNwZWNpZmljTm9kZVF1ZXJ5OiBmcmFtZU5vZGVRdWVyeSxcbiAgICAgIHJ1bjogKGdlbmVyYWxNZXRhVHlwZU5vZGUsIHNwZWNpZmljRnJhbWVOb2RlLCBhc3NpZ25tZW50cywgc3RhdGVkLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSA9PiB7XG4gICAgICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbWV0YVR5cGVOb2RlID0gZ2VuZXJhbE1ldGFUeXBlTm9kZSwgLy8vXG4gICAgICAgICAgICAgIGZyYW1lTm9kZSA9IHNwZWNpZmljRnJhbWVOb2RlOyAvLy9cblxuICAgICAgICBsZXQgY29udGV4dDtcblxuICAgICAgICBjb250ZXh0ID0gZ2VuZXJhbENvbnRleHQ7IC8vL1xuXG4gICAgICAgIGNvbnN0IG1ldGFUeXBlTmFtZSA9IG1ldGFUeXBlTm9kZS5nZXRNZXRhVHlwZU5hbWUoKSxcbiAgICAgICAgICAgICAgbWV0YVR5cGUgPSBjb250ZXh0LmZpbmRNZXRhVHlwZUJ5TWV0YVR5cGVOYW1lKG1ldGFUeXBlTmFtZSk7XG5cbiAgICAgICAgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dDsgIC8vL1xuXG4gICAgICAgIGNvbnN0IHsgRnJhbWUgfSA9IG9udG9sb2d5LFxuICAgICAgICAgICAgICBmcmFtZSA9IEZyYW1lLmZyb21GcmFtZU5vZGUoZnJhbWVOb2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgICAgZnJhbWVWZXJpZmllc0dpdmVuVHlwZSA9IGZyYW1lLnZlcmlmeUdpdmVuTWV0YVR5cGUobWV0YVR5cGUsIGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChmcmFtZVZlcmlmaWVzR2l2ZW5UeXBlKSB7XG4gICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGdlbmVyYWxOb2RlUXVlcnk6IHR5cGVOb2RlUXVlcnksXG4gICAgICBzcGVjaWZpY05vZGVRdWVyeTogdGVybU5vZGVRdWVyeSxcbiAgICAgIHJ1bjogKGdlbmVyYWxUeXBlTm9kZSwgc3BlY2lmaWNUZXJtTm9kZSwgYXNzaWdubWVudHMsIHN0YXRlZCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkgPT4ge1xuICAgICAgICBsZXQgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHR5cGVOb2RlID0gZ2VuZXJhbFR5cGVOb2RlLCAvLy9cbiAgICAgICAgICAgICAgdGVybU5vZGUgPSBzcGVjaWZpY1Rlcm1Ob2RlLCAvLy9cbiAgICAgICAgICAgICAgbm9taW5hbFR5cGVOYW1lID0gdHlwZU5vZGUuZ2V0Tm9taW5hbFR5cGVOYW1lKCk7XG5cbiAgICAgICAgbGV0IGNvbnRleHQ7XG5cbiAgICAgICAgY29udGV4dCA9IGdlbmVyYWxDb250ZXh0OyAvLy9cblxuICAgICAgICBjb25zdCB0eXBlID0gY29udGV4dC5maW5kVHlwZUJ5Tm9taW5hbFR5cGVOYW1lKG5vbWluYWxUeXBlTmFtZSk7XG5cbiAgICAgICAgaWYgKHR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0OyAgLy8vXG5cbiAgICAgICAgICBjb25zdCB7IFRlcm0gfSA9IG9udG9sb2d5LFxuICAgICAgICAgICAgICAgIHRlcm0gPSBUZXJtLmZyb21UZXJtTm9kZSh0ZXJtTm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICAgICAgdGVybVZlcmlmaWVzR2l2ZW5UeXBlID0gdGVybS52ZXJpZnlHaXZlblR5cGUodHlwZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgICAgICBpZiAodGVybVZlcmlmaWVzR2l2ZW5UeXBlKSB7XG4gICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICAgIH1cbiAgICB9XG4gIF07XG59XG5cbmNsYXNzIENvbnN0cnVjdG9yUGFzcyBleHRlbmRzIFBhc3Mge1xuICBzdGF0aWMgbWFwcyA9IFtcbiAgICB7XG4gICAgICBnZW5lcmFsTm9kZVF1ZXJ5OiB0eXBlTm9kZVF1ZXJ5LFxuICAgICAgc3BlY2lmaWNOb2RlUXVlcnk6IHRlcm1Ob2RlUXVlcnksXG4gICAgICBydW46IChnZW5lcmFsVHlwZU5vZGUsIHNwZWNpZmljVGVybU5vZGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCB0eXBlTm9kZSA9IGdlbmVyYWxUeXBlTm9kZSwgLy8vXG4gICAgICAgICAgICAgIHRlcm1Ob2RlID0gc3BlY2lmaWNUZXJtTm9kZSwgLy8vXG4gICAgICAgICAgICAgIG5vbWluYWxUeXBlTmFtZSA9IHR5cGVOb2RlLmdldE5vbWluYWxUeXBlTmFtZSgpO1xuXG4gICAgICAgIGxldCBjb250ZXh0O1xuXG4gICAgICAgIGNvbnRleHQgPSBnZW5lcmFsQ29udGV4dDsgLy8vXG5cbiAgICAgICAgY29uc3QgdHlwZSA9IGNvbnRleHQuZmluZFR5cGVCeU5vbWluYWxUeXBlTmFtZShub21pbmFsVHlwZU5hbWUpO1xuXG4gICAgICAgIGlmICh0eXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dDsgIC8vL1xuXG4gICAgICAgICAgY29uc3QgeyBUZXJtIH0gPSBvbnRvbG9neSxcbiAgICAgICAgICAgICAgICB0ZXJtID0gVGVybS5mcm9tVGVybU5vZGUodGVybU5vZGUsIGNvbnRleHQpLFxuICAgICAgICAgICAgICAgIHRlcm1WZXJpZmllc0dpdmVuVHlwZSA9IHRlcm0udmVyaWZ5R2l2ZW5UeXBlKHR5cGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKHRlcm1WZXJpZmllc0dpdmVuVHlwZSkge1xuICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgICB9XG4gICAgfVxuICBdO1xufVxuXG5jbGFzcyBNZXRhdmFyaWFibGVQYXNzIGV4dGVuZHMgUGFzcyB7XG4gIHN0YXRpYyBtYXBzID0gW1xuICAgIHtcbiAgICAgIGdlbmVyYWxOb2RlUXVlcnk6IHR5cGVOb2RlUXVlcnksXG4gICAgICBzcGVjaWZpY05vZGVRdWVyeTogdGVybU5vZGVRdWVyeSxcbiAgICAgIHJ1bjogKGdlbmVyYWxUeXBlTm9kZSwgc3BlY2lmaWNUZXJtTm9kZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkgPT4ge1xuICAgICAgICBsZXQgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHR5cGVOb2RlID0gZ2VuZXJhbFR5cGVOb2RlLCAvLy9cbiAgICAgICAgICAgICAgdGVybU5vZGUgPSBzcGVjaWZpY1Rlcm1Ob2RlLCAvLy9cbiAgICAgICAgICAgICAgbm9taW5hbFR5cGVOYW1lID0gdHlwZU5vZGUuZ2V0Tm9taW5hbFR5cGVOYW1lKCksXG4gICAgICAgICAgICAgIHR5cGUgPSBnZW5lcmFsQ29udGV4dC5maW5kVHlwZUJ5Tm9taW5hbFR5cGVOYW1lKG5vbWluYWxUeXBlTmFtZSksXG4gICAgICAgICAgICAgIGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsIC8vL1xuICAgICAgICAgICAgICB0ZXJtID0gY29udGV4dC5maW5kVGVybUJ5VGVybU5vZGUodGVybU5vZGUpLFxuICAgICAgICAgICAgICB0ZXJtVmVyaWZpZXNHaXZlblR5cGUgPSB0ZXJtLnZlcmlmeUdpdmVuVHlwZSh0eXBlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgICBpZiAodGVybVZlcmlmaWVzR2l2ZW5UeXBlKSB7XG4gICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICAgIH1cbiAgICB9XG4gIF07XG59XG5cbmNsYXNzIEludHJpbnNpY0xldmVsUGFzcyBleHRlbmRzIFBhc3Mge1xuICBzdGF0aWMgbWFwcyA9IFtcbiAgICB7XG4gICAgICBnZW5lcmFsTm9kZVF1ZXJ5OiB0ZXJtVmFyaWFibGVOb2RlUXVlcnksXG4gICAgICBzcGVjaWZpY05vZGVRdWVyeTogdGVybU5vZGVRdWVyeSxcbiAgICAgIHJ1bjogKGdlbmVyYWxUZXJtVmFyaWFibGVOb2RlLCBzcGVjaWZpY1Rlcm1Ob2RlLCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSA9PiB7XG4gICAgICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdGVybU5vZGUgPSBzcGVjaWZpY1Rlcm1Ob2RlLCAvLy9cbiAgICAgICAgICAgICAgdmFyaWFibGVOb2RlID0gZ2VuZXJhbFRlcm1WYXJpYWJsZU5vZGUsIC8vL1xuICAgICAgICAgICAgICB2YXJpYWJsZUlkZW50aWZpZXIgPSB2YXJpYWJsZU5vZGUuZ2V0VmFyaWFibGVJZGVudGlmaWVyKCk7XG5cbiAgICAgICAgbGV0IGNvbnRleHQ7XG5cbiAgICAgICAgY29udGV4dCA9IGdlbmVyYWxDb250ZXh0OyAvLy9cblxuICAgICAgICBjb25zdCB2YXJpYWJsZSA9IGNvbnRleHQuZmluZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyKTtcblxuICAgICAgICBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0OyAgLy8vXG5cbiAgICAgICAgY29uc3QgdGVybSA9IGNvbnRleHQuZmluZFRlcm1CeVRlcm1Ob2RlKHRlcm1Ob2RlKSxcbiAgICAgICAgICAgICAgdGVybVVuaWZpZXMgPSB2YXJpYWJsZS51bmlmeVRlcm0odGVybSwgc3Vic3RpdHV0aW9ucywgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgICAgaWYgKHRlcm1VbmlmaWVzKSB7XG4gICAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICAgIH1cbiAgICB9XG4gIF07XG59XG5cbmNvbnN0IG1ldGFMZXZlbFBhc3MgPSBuZXcgTWV0YUxldmVsUGFzcygpLFxuICAgICAgY29tYmluYXRvclBhc3MgPSBuZXcgQ29tYmluYXRvclBhc3MoKSxcbiAgICAgIGNvbnN0cnVjdG9yUGFzcyA9IG5ldyBDb25zdHJ1Y3RvclBhc3MoKSxcbiAgICAgIG1ldGF2YXJpYWJsZVBhc3MgPSBuZXcgTWV0YXZhcmlhYmxlUGFzcygpLFxuICAgICAgaW50cmluc2ljTGV2ZWxQYXNzID0gbmV3IEludHJpbnNpY0xldmVsUGFzcygpO1xuXG5leHBvcnQgZnVuY3Rpb24gdW5pZnlTdGF0ZW1lbnQoZ2VuZXJhbFN0YXRlbWVudCwgc3BlY2lmaWNTdGF0ZW1lbnQsIHN1YnN0aXR1dGlvbnMsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFVuaWZpZXMgPSBmYWxzZTtcblxuICBjb25zdCBnZW5lcmFsU3RhdGVtZW50Tm9kZSA9IGdlbmVyYWxTdGF0ZW1lbnQuZ2V0Tm9kZSgpLFxuICAgICAgICBzcGVjaWZpY1N0YXRlbWVudE5vZGUgPSBzcGVjaWZpY1N0YXRlbWVudC5nZXROb2RlKCksXG4gICAgICAgIGdlbmVyYWxOb2RlID0gZ2VuZXJhbFN0YXRlbWVudE5vZGUsIC8vL1xuICAgICAgICBzcGVjaWZpY05vZGUgPSBzcGVjaWZpY1N0YXRlbWVudE5vZGUsICAvLy9cbiAgICAgICAgc3VjY2VzcyA9IG1ldGFMZXZlbFBhc3MucnVuKGdlbmVyYWxOb2RlLCBzcGVjaWZpY05vZGUsIHN1YnN0aXR1dGlvbnMsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gIGlmIChzdWNjZXNzKSB7XG4gICAgc3RhdGVtZW50VW5pZmllcyA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VW5pZmllcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaWZ5U3Vic3RpdHV0aW9uKGdlbmVyYWxTdWJzdGl0dXRpb24sIHNwZWNpZmljU3Vic3RpdHV0aW9uLCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSB7XG4gIGxldCBzdWJzdGl0dXRpb25VbmlmaWVzID0gZmFsc2U7XG5cbiAgY29uc3QgZ2VuZXJhbFN1YnN0aXR1dGlvbk5vZGUgPSBnZW5lcmFsU3Vic3RpdHV0aW9uLmdldE5vZGUoKSxcbiAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb25Ob2RlID0gc3BlY2lmaWNTdWJzdGl0dXRpb24uZ2V0Tm9kZSgpLFxuICAgICAgICBnZW5lcmFsTm9kZSA9IGdlbmVyYWxTdWJzdGl0dXRpb25Ob2RlLCAvLy9cbiAgICAgICAgc3BlY2lmaWNOb2RlID0gc3BlY2lmaWNTdWJzdGl0dXRpb25Ob2RlLCAgLy8vXG4gICAgICAgIHN1Y2Nlc3MgPSBtZXRhTGV2ZWxQYXNzLnJ1bihnZW5lcmFsTm9kZSwgc3BlY2lmaWNOb2RlLCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICBpZiAoc3VjY2Vzcykge1xuICAgIHN1YnN0aXR1dGlvblVuaWZpZXMgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHN1YnN0aXR1dGlvblVuaWZpZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmlmeU1ldGF2YXJpYWJsZShnZW5lcmFsTWV0YXZhcmlhYmxlLCBzcGVjaWZpY01ldGF2YXJpYWJsZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICBsZXQgbWV0YXZhcmlhYmxlVW5pZmllcyA9IGZhbHNlO1xuXG4gIGNvbnN0IGdlbmVyYWxNZXRhdmFyaWFibGVOb2RlID0gZ2VuZXJhbE1ldGF2YXJpYWJsZS5nZXROb2RlKCksXG4gICAgICAgIHNwZWNpZmljTWV0YXZhcmlhYmxlTm9kZSA9IHNwZWNpZmljTWV0YXZhcmlhYmxlLmdldE5vZGUoKSxcbiAgICAgICAgc3VjY2VzcyA9IG1ldGF2YXJpYWJsZVBhc3MucnVuKGdlbmVyYWxNZXRhdmFyaWFibGVOb2RlLCBzcGVjaWZpY01ldGF2YXJpYWJsZU5vZGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gIGlmIChzdWNjZXNzKSB7XG4gICAgbWV0YXZhcmlhYmxlVW5pZmllcyA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gbWV0YXZhcmlhYmxlVW5pZmllcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaWZ5VGVybVdpdGhDb25zdHJ1Y3Rvcih0ZXJtLCBjb25zdHJ1Y3RvciwgY29udGV4dCkge1xuICBsZXQgdGVybVVuaWZpZXNXaXRoQ29uc3RydWN0b3IgPSBmYWxzZTtcblxuICBjb25zdCB0ZXJtTm9kZSA9IHRlcm0uZ2V0Tm9kZSgpLFxuICAgICAgICBnZW5lcmFsQ29udGV4dCA9IGNvbnRleHQsIC8vL1xuICAgICAgICBzcGVjaWZpY0NvbnRleHQgPSBjb250ZXh0LCAgLy8vXG4gICAgICAgIGNvbnN0cnVjdG9yVGVybSA9IGNvbnN0cnVjdG9yLmdldFRlcm0oKSxcbiAgICAgICAgY29uc3RydWN0b3JUZXJtTm9kZSA9IGNvbnN0cnVjdG9yVGVybS5nZXROb2RlKCksXG4gICAgICAgIHN1Y2Nlc3MgPSBjb25zdHJ1Y3RvclBhc3MucnVuKGNvbnN0cnVjdG9yVGVybU5vZGUsIHRlcm1Ob2RlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICBpZiAoc3VjY2Vzcykge1xuICAgIHRlcm1VbmlmaWVzV2l0aENvbnN0cnVjdG9yID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaWZ5U3RhdGVtZW50SW50cmluc2ljYWxseShnZW5lcmFsU3RhdGVtZW50LCBzcGVjaWZpY1N0YXRlbWVudCwgc3Vic3RpdHV0aW9ucywgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VW5pZmllc0ludHJpbnNpY2FsbHkgPSBmYWxzZTtcblxuICBjb25zdCBnZW5lcmFsU3RhdGVtZW50Tm9kZSA9IGdlbmVyYWxTdGF0ZW1lbnQuZ2V0Tm9kZSgpLFxuICAgICAgICBzcGVjaWZpY1N0YXRlbWVudE5vZGUgPSBzcGVjaWZpY1N0YXRlbWVudC5nZXROb2RlKCksXG4gICAgICAgIGdlbmVyYWxOb2RlID0gZ2VuZXJhbFN0YXRlbWVudE5vZGUsIC8vL1xuICAgICAgICBzcGVjaWZpY05vZGUgPSBzcGVjaWZpY1N0YXRlbWVudE5vZGUsIC8vL1xuICAgICAgICBzdWNjZXNzID0gaW50cmluc2ljTGV2ZWxQYXNzLnJ1bihnZW5lcmFsTm9kZSwgc3BlY2lmaWNOb2RlLCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICBpZiAoc3VjY2Vzcykge1xuICAgIHN0YXRlbWVudFVuaWZpZXNJbnRyaW5zaWNhbGx5ID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRVbmlmaWVzSW50cmluc2ljYWxseTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaWZ5U3RhdGVtZW50V2l0aENvbWJpbmF0b3Ioc3RhdGVtZW50LCBjb21iaW5hdG9yLCBhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRVbmlmaWVzV2l0aENvbWJpbmF0b3IgPSBmYWxzZTtcblxuICBjb25zdCBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50LmdldE5vZGUoKSxcbiAgICAgICAgZ2VuZXJhbENvbnRleHQgPSBjb250ZXh0LCAvLy9cbiAgICAgICAgc3BlY2lmaWNDb250ZXh0ID0gY29udGV4dCwgIC8vL1xuICAgICAgICBjb21iaW5hdG9yU3RhdGVtZW50ID0gY29tYmluYXRvci5nZXRTdGF0ZW1lbnQoKSxcbiAgICAgICAgY29tYmluYXRvclN0YXRlbWVudE5vZGUgPSBjb21iaW5hdG9yU3RhdGVtZW50LmdldE5vZGUoKSxcbiAgICAgICAgc3VjY2VzcyA9IGNvbWJpbmF0b3JQYXNzLnJ1bihjb21iaW5hdG9yU3RhdGVtZW50Tm9kZSwgc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIHN0YXRlZCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgaWYgKHN1Y2Nlc3MpIHtcbiAgICBzdGF0ZW1lbnRVbmlmaWVzV2l0aENvbWJpbmF0b3IgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFVuaWZpZXNXaXRoQ29tYmluYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaWZ5TWV0YXZhcmlhYmxlSW50cmluc2ljYWxseShnZW5lcmFsTWV0YXZhcmlhYmxlLCBzcGVjaWZpY01ldGF2YXJpYWJsZSwgc3Vic3RpdHV0aW9ucywgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICBsZXQgbWV0YXZhcmlhYmxlVW5pZmllc0ludHJpbnNpY2FsbHkgPSBmYWxzZTtcblxuICBjb25zdCBnZW5lcmFsTWV0YXZhcmlhYmxlTm9kZSA9IGdlbmVyYWxNZXRhdmFyaWFibGUuZ2V0Tm9kZSgpLFxuICAgICAgICBzcGVjaWZpY01ldGF2YXJpYWJsZU5vZGUgPSBzcGVjaWZpY01ldGF2YXJpYWJsZS5nZXROb2RlKCksXG4gICAgICAgIGdlbmVyYWxOb2RlID0gZ2VuZXJhbE1ldGF2YXJpYWJsZU5vZGUsIC8vL1xuICAgICAgICBzcGVjaWZpY05vZGUgPSBzcGVjaWZpY01ldGF2YXJpYWJsZU5vZGUsIC8vL1xuICAgICAgICBzdWNjZXNzID0gaW50cmluc2ljTGV2ZWxQYXNzLnJ1bihnZW5lcmFsTm9kZSwgc3BlY2lmaWNOb2RlLCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICBpZiAoc3VjY2Vzcykge1xuICAgIG1ldGF2YXJpYWJsZVVuaWZpZXNJbnRyaW5zaWNhbGx5ID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBtZXRhdmFyaWFibGVVbmlmaWVzSW50cmluc2ljYWxseTtcbn1cbiJdLCJuYW1lcyI6WyJ1bmlmeU1ldGF2YXJpYWJsZSIsInVuaWZ5TWV0YXZhcmlhYmxlSW50cmluc2ljYWxseSIsInVuaWZ5U3RhdGVtZW50IiwidW5pZnlTdGF0ZW1lbnRJbnRyaW5zaWNhbGx5IiwidW5pZnlTdGF0ZW1lbnRXaXRoQ29tYmluYXRvciIsInVuaWZ5U3Vic3RpdHV0aW9uIiwidW5pZnlUZXJtV2l0aENvbnN0cnVjdG9yIiwibm9uVGVybWluYWxOb2RlUXVlcnkiLCJub2RlUXVlcnkiLCJ0eXBlTm9kZVF1ZXJ5IiwidGVybU5vZGVRdWVyeSIsImZyYW1lTm9kZVF1ZXJ5IiwibWV0YVR5cGVOb2RlUXVlcnkiLCJzdGF0ZW1lbnROb2RlUXVlcnkiLCJ0ZXJtVmFyaWFibGVOb2RlUXVlcnkiLCJzdGF0ZW1lbnRNZXRhdmFyaWFibGVOb2RlUXVlcnkiLCJhc3N1bXB0aW9uTWV0YXZhcmlhYmxlTm9kZVF1ZXJ5IiwiZnJhbWVBc3N1bXB0aW9uTWV0YXZhcmlhYmxlTm9kZVF1ZXJ5IiwiUGFzcyIsInJ1biIsImdlbmVyYWxOb2RlIiwic3BlY2lmaWNOb2RlIiwicmVtYWluaW5nQXJndW1lbnRzIiwic3VjY2VzcyIsInZpc2l0ZWQiLCJ2aXNpdE5vZGUiLCJkZXNjZW5kIiwiZ2VuZXJhbENoaWxkTm9kZXMiLCJzcGVjaWZpY0NoaWxkTm9kZXMiLCJkZXNjZW5kZWRBaGVhZCIsImdlbmVyYWxDaGlsZE5vZGVzTGVuZ3RoIiwibGVuZ3RoIiwic3BlY2lmaWNDaGlsZE5vZGVzTGVuZ3RoIiwic3BlY2lmaWNUZXJtaW5hbE5vZGVNYXAiLCJ0ZXJtaW5hbE5vZGVNYXBGcm9tTm9kZXMiLCJnZW5lcmFsVGVybWluYWxOb2RlTWFwIiwidGVybWluYWxOb2RlTWFwc0VxdWFsIiwiYXJlVGVybWluYWxOb2RlTWFwc0VxdWFsIiwibGFzdFJlbWFpbmluZ0FyZ3VtZW50RnVuY3Rpb24iLCJpc0xhc3RSZW1haW5pbmdBcmd1bWVudEZ1bmN0aW9uIiwiaW5kZXgiLCJkZXNjZW5kQWhlYWQiLCJldmVyeSIsImdlbmVyYWxDaGlsZE5vZGUiLCJzcGVjaWZpY0NoaWxkTm9kZSIsInBvcCIsInB1c2giLCJhaGVhZEluZGV4IiwiZ2VuZXJhbE5vZGVUZXJtaW5hbE5vZGUiLCJpc1Rlcm1pbmFsTm9kZSIsInNwZWNpZmljTm9kZVRlcm1pbmFsTm9kZSIsImdlbmVyYWxOb2RlTm9uVGVybWluYWxOb2RlIiwiaXNOb25UZXJtaW5hbE5vZGUiLCJzcGVjaWZpY05vZGVOb25UZXJtaW5hbE5vZGUiLCJnZW5lcmFsVGVybWluYWxOb2RlIiwic3BlY2lmaWNUZXJtaW5hbE5vZGUiLCJ2aXNpdFRlcm1pbmFsTm9kZSIsImdlbmVyYWxOb25UZXJtaW5hbE5vZGUiLCJzcGVjaWZpY05vblRlcm1pbmFsTm9kZSIsInZpc2l0Tm9uVGVybWluYWxOb2RlIiwibWFwcyIsImdlbmVyYWxOb2RlUXVlcnkiLCJzcGVjaWZpY05vZGVRdWVyeSIsImdlbmVyYWxOb25UZXJtaW5hbE5vZGVSdWxlTmFtZSIsImdldFJ1bGVOYW1lIiwic3BlY2lmaWNOb25UZXJtaW5hbE5vZGVSdWxlTmFtZSIsImdlbmVyYWxOb25UZXJtaW5hbE5vZGVDaGlsZE5vZGVzIiwiZ2V0Q2hpbGROb2RlcyIsInNwZWNpZmljTm9uVGVybWluYWxOb2RlQ2hpbGROb2RlcyIsImRlc2NlbmRlZCIsInNvbWUiLCJtYXAiLCJNZXRhTGV2ZWxQYXNzIiwiZ2VuZXJhbEFzc3VtcHRpb25NZXRhdmFyaWFibGVOb2RlIiwic3BlY2lmaWNBc3N1bXB0aW9uTWV0YXZhcmlhYmxlTm9kZSIsInN1YnN0aXR1dGlvbnMiLCJnZW5lcmFsQ29udGV4dCIsInNwZWNpZmljQ29udGV4dCIsImNvbnRleHQiLCJtZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlTmFtZSIsImdldE1ldGF2YXJpYWJsZU5hbWUiLCJtZXRhdmFyaWFibGUiLCJmaW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOYW1lIiwicmVmZXJlbmNlIiwiZmluZFJlZmVyZW5jZUJ5TWV0YXZhcmlhYmxlTm9kZSIsInJlZmVyZW5jZVVuaWZpZXMiLCJ1bmlmeVJlZmVyZW5jZSIsImdlbmVyYWxTdGF0ZW1lbnRNZXRhdmFyaWFibGVOb2RlIiwic3BlY2lmaWNTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50Tm9kZSIsIm1ldGF2YXJpYWJsZU5vZGVQYXJlbnROb2RlIiwiZ2V0UGFyZW50Tm9kZSIsImZyYW1lU3Vic3RpdHV0aW9uTm9kZSIsImdldEZyYW1lU3Vic3RpdHV0aW9uTm9kZSIsInRlcm1TdWJzdGl0dXRpb25Ob2RlIiwiZ2V0VGVybVN1YnN0aXR1dGlvbk5vZGUiLCJzdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uIiwiZmluZFN1YnN0aXR1dGlvbkJ5U3Vic3RpdHV0aW9uTm9kZSIsInN0YXRlbWVudCIsImZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUiLCJzdGF0ZW1lbnRVbmlmaWVzIiwiZ2VuZXJhbEZyYW1lQXNzdW1wdGlvbk1ldGF2YXJpYWJsZU5vZGUiLCJzcGVjaWZpY0ZyYW1lTm9kZSIsImZyYW1lTm9kZSIsImZyYW1lIiwiZmluZEZyYW1lQnlGcmFtZU5vZGUiLCJmcmFtZVVuaWZpZXMiLCJ1bmlmeUZyYW1lIiwiZ2VuZXJhbFRlcm1WYXJpYWJsZU5vZGUiLCJzcGVjaWZpY1Rlcm1Ob2RlIiwidGVybU5vZGUiLCJ2YXJpYWJsZU5vZGUiLCJ2YXJpYWJsZUlkZW50aWZpZXIiLCJnZXRWYXJpYWJsZUlkZW50aWZpZXIiLCJ2YXJpYWJsZSIsImZpbmRWYXJpYWJsZUJ5VmFyaWFibGVJZGVudGlmaWVyIiwidGVybSIsImZpbmRUZXJtQnlUZXJtTm9kZSIsInRlcm1VbmlmaWVzIiwidW5pZnlUZXJtIiwiQ29tYmluYXRvclBhc3MiLCJnZW5lcmFsTWV0YVR5cGVOb2RlIiwiYXNzaWdubWVudHMiLCJzdGF0ZWQiLCJtZXRhVHlwZU5vZGUiLCJtZXRhVHlwZU5hbWUiLCJnZXRNZXRhVHlwZU5hbWUiLCJtZXRhVHlwZSIsImZpbmRNZXRhVHlwZUJ5TWV0YVR5cGVOYW1lIiwiU3RhdGVtZW50Iiwib250b2xvZ3kiLCJmcm9tU3RhdGVtZW50Tm9kZSIsInN0YXRlbWVudFZlcmlmaWVzR2l2ZW5UeXBlIiwidmVyaWZ5R2l2ZW5NZXRhVHlwZSIsIkZyYW1lIiwiZnJvbUZyYW1lTm9kZSIsImZyYW1lVmVyaWZpZXNHaXZlblR5cGUiLCJnZW5lcmFsVHlwZU5vZGUiLCJ0eXBlTm9kZSIsIm5vbWluYWxUeXBlTmFtZSIsImdldE5vbWluYWxUeXBlTmFtZSIsInR5cGUiLCJmaW5kVHlwZUJ5Tm9taW5hbFR5cGVOYW1lIiwiVGVybSIsImZyb21UZXJtTm9kZSIsInRlcm1WZXJpZmllc0dpdmVuVHlwZSIsInZlcmlmeUdpdmVuVHlwZSIsIkNvbnN0cnVjdG9yUGFzcyIsIk1ldGF2YXJpYWJsZVBhc3MiLCJJbnRyaW5zaWNMZXZlbFBhc3MiLCJtZXRhTGV2ZWxQYXNzIiwiY29tYmluYXRvclBhc3MiLCJjb25zdHJ1Y3RvclBhc3MiLCJtZXRhdmFyaWFibGVQYXNzIiwiaW50cmluc2ljTGV2ZWxQYXNzIiwiZ2VuZXJhbFN0YXRlbWVudCIsInNwZWNpZmljU3RhdGVtZW50IiwiZ2VuZXJhbFN0YXRlbWVudE5vZGUiLCJnZXROb2RlIiwiZ2VuZXJhbFN1YnN0aXR1dGlvbiIsInNwZWNpZmljU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uVW5pZmllcyIsImdlbmVyYWxTdWJzdGl0dXRpb25Ob2RlIiwic3BlY2lmaWNTdWJzdGl0dXRpb25Ob2RlIiwiZ2VuZXJhbE1ldGF2YXJpYWJsZSIsInNwZWNpZmljTWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlVW5pZmllcyIsImdlbmVyYWxNZXRhdmFyaWFibGVOb2RlIiwic3BlY2lmaWNNZXRhdmFyaWFibGVOb2RlIiwiY29uc3RydWN0b3IiLCJ0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3RvciIsImNvbnN0cnVjdG9yVGVybSIsImdldFRlcm0iLCJjb25zdHJ1Y3RvclRlcm1Ob2RlIiwic3RhdGVtZW50VW5pZmllc0ludHJpbnNpY2FsbHkiLCJjb21iaW5hdG9yIiwic3RhdGVtZW50VW5pZmllc1dpdGhDb21iaW5hdG9yIiwiY29tYmluYXRvclN0YXRlbWVudCIsImdldFN0YXRlbWVudCIsImNvbWJpbmF0b3JTdGF0ZW1lbnROb2RlIiwibWV0YXZhcmlhYmxlVW5pZmllc0ludHJpbnNpY2FsbHkiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQTJpQmdCQTtlQUFBQTs7UUFnRUFDO2VBQUFBOztRQWhHQUM7ZUFBQUE7O1FBK0RBQztlQUFBQTs7UUFnQkFDO2VBQUFBOztRQS9EQUM7ZUFBQUE7O1FBOEJBQztlQUFBQTs7OytEQXZqQks7cUJBRUs7b0JBQzBFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFcEcsSUFBTUMsdUJBQXVCQyxJQUFBQSxnQkFBUyxFQUFDO0FBRXZDLElBQU1DLGdCQUFnQkQsSUFBQUEsZ0JBQVMsRUFBQyxVQUMxQkUsZ0JBQWdCRixJQUFBQSxnQkFBUyxFQUFDLFVBQzFCRyxpQkFBaUJILElBQUFBLGdCQUFTLEVBQUMsV0FDM0JJLG9CQUFvQkosSUFBQUEsZ0JBQVMsRUFBQyxjQUM5QksscUJBQXFCTCxJQUFBQSxnQkFBUyxFQUFDLGVBQy9CTSx3QkFBd0JOLElBQUFBLGdCQUFTLEVBQUMsb0JBQ2xDTyxpQ0FBaUNQLElBQUFBLGdCQUFTLEVBQUMsNkJBQzNDUSxrQ0FBa0NSLElBQUFBLGdCQUFTLEVBQUMsOEJBQzVDUyx1Q0FBdUNULElBQUFBLGdCQUFTLEVBQUM7QUFFdkQsSUFBQSxBQUFNVSxxQkFBTjthQUFNQTtnQ0FBQUE7O2tCQUFBQTs7WUFDSkMsS0FBQUE7bUJBQUFBLFNBQUFBLElBQUlDLFdBQVcsRUFBRUMsWUFBWTtnQkFBRSxJQUFBLElBQUEsT0FBQSxVQUFBLFFBQUEsQUFBR0MscUJBQUgsVUFBQSxPQUFBLElBQUEsT0FBQSxRQUFBLE9BQUEsR0FBQSxPQUFBLE1BQUE7b0JBQUdBLG1CQUFILE9BQUEsS0FBQSxTQUFBLENBQUEsS0FBcUI7O2dCQUNsRCxJQUFJQztnQkFFSixJQUFNQyxVQUFVLElBQUksQ0FBQ0MsU0FBUyxPQUFkLElBQUksRUFBSjtvQkFBZUw7b0JBQWFDO2lCQUFvQyxDQUFoRSxPQUEwQyxxQkFBR0M7Z0JBRTdEQyxVQUFVQyxTQUFVLEdBQUc7Z0JBRXZCLE9BQU9EO1lBQ1Q7OztZQUVBRyxLQUFBQTttQkFBQUEsU0FBQUEsUUFBUUMsaUJBQWlCLEVBQUVDLGtCQUFrQjs7Z0JBQUUsSUFBQSxJQUFBLE9BQUEsVUFBQSxRQUFBLEFBQUdOLHFCQUFILFVBQUEsT0FBQSxJQUFBLE9BQUEsUUFBQSxPQUFBLEdBQUEsT0FBQSxNQUFBO29CQUFHQSxtQkFBSCxPQUFBLEtBQUEsU0FBQSxDQUFBLEtBQXFCOztnQkFDbEUsSUFBSU8saUJBQWlCO2dCQUVyQixJQUFNQywwQkFBMEJILGtCQUFrQkksTUFBTSxFQUNsREMsMkJBQTJCSixtQkFBbUJHLE1BQU07Z0JBRTFELElBQUlELDRCQUE0QkUsMEJBQTBCO29CQUN4RCxJQUFNQywwQkFBMEJDLElBQUFBLDhCQUF3QixFQUFDTixxQkFDbkRPLHlCQUF5QkQsSUFBQUEsOEJBQXdCLEVBQUNQLG9CQUNsRFMsd0JBQXdCQyxJQUFBQSw4QkFBd0IsRUFBQ0Ysd0JBQXdCRjtvQkFFL0UsSUFBSUcsdUJBQXVCO3dCQUN6QixJQUFNRSxnQ0FBZ0NDLElBQUFBLHFDQUErQixFQUFDakI7d0JBRXRFLElBQUlnQiwrQkFBK0I7NEJBQ2pDLElBQU1FLFFBQVE7NEJBRWRYLGlCQUFpQixJQUFJLENBQUNZLFlBQVksT0FBakIsSUFBSSxFQUFKO2dDQUFrQkQ7Z0NBQU9iO2dDQUFtQkM7NkJBQXlDLENBQXJGLE9BQStELHFCQUFHTjt3QkFDckYsT0FBTzs0QkFDTCxJQUFNRSxVQUFVRyxrQkFBa0JlLEtBQUssQ0FBQyxTQUFDQyxrQkFBa0JIO2dDQUN6RCxJQUFNSSxvQkFBb0JoQixrQkFBa0IsQ0FBQ1ksTUFBTSxFQUM3Q25CLGVBQWV1QixtQkFDZnhCLGNBQWN1QixrQkFDZG5CLFVBQVUsTUFBS0MsU0FBUyxjQUFkO29DQUFlTDtvQ0FBYUM7aUNBQW9DLENBQWhFLE9BQTBDLHFCQUFHQztnQ0FFN0QsSUFBSUUsU0FBUztvQ0FDWCxPQUFPO2dDQUNUOzRCQUNGOzRCQUVBLElBQUlBLFNBQVM7Z0NBQ1hLLGlCQUFpQjs0QkFDbkI7d0JBQ0Y7b0JBQ0Y7Z0JBQ0Y7Z0JBRUEsT0FBT0E7WUFDVDs7O1lBRUFZLEtBQUFBO21CQUFBQSxTQUFBQSxhQUFhRCxLQUFLLEVBQUViLGlCQUFpQixFQUFFQyxrQkFBa0I7O2dCQUFFLElBQUEsSUFBQSxPQUFBLFVBQUEsUUFBQSxBQUFHTixxQkFBSCxVQUFBLE9BQUEsSUFBQSxPQUFBLFFBQUEsT0FBQSxHQUFBLE9BQUEsTUFBQTtvQkFBR0EsbUJBQUgsT0FBQSxLQUFBLFNBQUEsQ0FBQSxLQUFxQjs7Z0JBQzlFLElBQUlPLGlCQUFpQjtnQkFFckIsSUFBTVksZUFBZW5CLG1CQUFtQnVCLEdBQUcsSUFDckNmLDBCQUEwQkgsa0JBQWtCSSxNQUFNO2dCQUV4RCxJQUFJUyxVQUFVVix5QkFBeUI7b0JBQ3JDRCxpQkFBaUJZO2dCQUNuQixPQUFPO29CQUNMLElBQU1FLG1CQUFtQmhCLGlCQUFpQixDQUFDYSxNQUFNLEVBQzNDSSxvQkFBb0JoQixrQkFBa0IsQ0FBQ1ksTUFBTSxFQUM3Q3BCLGNBQWN1QixrQkFDZHRCLGVBQWV1QixtQkFDZnBCLFVBQVUsSUFBSSxDQUFDQyxTQUFTLE9BQWQsSUFBSSxFQUFKO3dCQUFlTDt3QkFBYUM7cUJBT3BDLENBUFEsT0FBMEMscUJBQUdDLHFCQUE3Qzt3QkFBaUU7NEJBQ3pFQSxtQkFBbUJ3QixJQUFJLENBQUNMLGVBQWUsR0FBRzs0QkFFMUMsSUFBTU0sYUFBYVAsUUFBUSxHQUNyQlgsaUJBQWlCLE1BQUtZLFlBQVksY0FBakI7Z0NBQWtCTTtnQ0FBWXBCO2dDQUFtQkM7NkJBQTBDLENBQTNGLE9BQXFFLHFCQUFHTjs0QkFFL0YsT0FBT087d0JBQ1Q7cUJBQUU7b0JBRVIsSUFBSUwsU0FBUzt3QkFDWEssaUJBQWlCO29CQUNuQjtnQkFDRjtnQkFFQSxPQUFPQTtZQUNUOzs7WUFFQUosS0FBQUE7bUJBQUFBLFNBQUFBLFVBQVVMLFdBQVcsRUFBRUMsWUFBWTtnQkFBRSxJQUFBLElBQUEsT0FBQSxVQUFBLFFBQUEsQUFBR0MscUJBQUgsVUFBQSxPQUFBLElBQUEsT0FBQSxRQUFBLE9BQUEsR0FBQSxPQUFBLE1BQUE7b0JBQUdBLG1CQUFILE9BQUEsS0FBQSxTQUFBLENBQUEsS0FBcUI7O2dCQUN4RCxJQUFJRSxVQUFVO2dCQUVkLElBQU13QiwwQkFBMEI1QixZQUFZNkIsY0FBYyxJQUNwREMsMkJBQTJCN0IsYUFBYTRCLGNBQWMsSUFDdERFLDZCQUE2Qi9CLFlBQVlnQyxpQkFBaUIsSUFDMURDLDhCQUE4QmhDLGFBQWErQixpQkFBaUI7Z0JBRWxFLElBQUksT0FBTztnQkFDVCxHQUFHO2dCQUNMLE9BQU8sSUFBSUosMkJBQTJCRSwwQkFBMEI7b0JBQzlELElBQU1JLHNCQUFzQmxDLGFBQ3RCbUMsdUJBQXVCbEMsY0FBZSxHQUFHO29CQUUvQ0csVUFBVSxJQUFJLENBQUNnQyxpQkFBaUIsT0FBdEIsSUFBSSxFQUFKO3dCQUF1QkY7d0JBQXFCQztxQkFBNEMsQ0FBeEYsT0FBa0UscUJBQUdqQztnQkFDakYsT0FBTyxJQUFJNkIsOEJBQThCRSw2QkFBNkI7b0JBQ3BFLElBQU1JLHlCQUF5QnJDLGFBQ3pCc0MsMEJBQTBCckMsY0FBYyxHQUFHO29CQUVqREcsVUFBVSxJQUFJLENBQUNtQyxvQkFBb0IsT0FBekIsSUFBSSxFQUFKO3dCQUEwQkY7d0JBQXdCQztxQkFBK0MsQ0FBakcsT0FBMkUscUJBQUdwQztnQkFDMUY7Z0JBRUEsT0FBT0U7WUFDVDs7O1lBRUFnQyxLQUFBQTttQkFBQUEsU0FBQUEsa0JBQWtCRixtQkFBbUIsRUFBRUMsb0JBQW9CO2dCQUFFLElBQUEsSUFBQSxPQUFBLFVBQUEsUUFBQSxBQUFHakMscUJBQUgsVUFBQSxPQUFBLElBQUEsT0FBQSxRQUFBLE9BQUEsR0FBQSxPQUFBLE1BQUE7b0JBQUdBLG1CQUFILE9BQUEsS0FBQSxTQUFBLENBQUEsS0FBcUI7O2dCQUNoRixJQUFJRSxVQUFVO2dCQUVkLElBQU1jLGdDQUFnQ0MsSUFBQUEscUNBQStCLEVBQUNqQjtnQkFFdEUsSUFBSWdCLCtCQUErQjtvQkFDakMsSUFBTUcsZUFBZW5CLG1CQUFtQnVCLEdBQUcsSUFDckNoQixpQkFBaUJZO29CQUV2QixJQUFJQSxjQUFjO3dCQUNoQmpCLFVBQVVLLGdCQUFpQixHQUFHO29CQUNoQztvQkFFQVAsbUJBQW1Cd0IsSUFBSSxDQUFDTDtnQkFDMUIsT0FBTztvQkFDTGpCLFVBQVU7Z0JBQ1o7Z0JBRUEsT0FBT0E7WUFDVDs7O1lBRUFtQyxLQUFBQTttQkFBQUEsU0FBQUEscUJBQXFCRixzQkFBc0IsRUFBRUMsdUJBQXVCO2dCQUFFLElBQUEsSUFBQSxPQUFBLFVBQUEsUUFBQSxBQUFHcEMscUJBQUgsVUFBQSxPQUFBLElBQUEsT0FBQSxRQUFBLE9BQUEsR0FBQSxPQUFBLE1BQUE7b0JBQUdBLG1CQUFILE9BQUEsS0FBQSxTQUFBLENBQUEsS0FBcUI7OztnQkFDekYsSUFBSUUsVUFBVTtnQkFFZCxJQUFJLEFBQUVvQyxPQUFTLElBQUksQ0FBQyxXQUFXLENBQXpCQTtnQkFFTkEsT0FBTyxBQUNMLHFCQUFHQSxhQURFO29CQUVMO3dCQUNFQyxrQkFBa0J0RDt3QkFDbEJ1RCxtQkFBbUJ2RDt3QkFDbkJZLEtBQUssU0FBQ0MsYUFBYUM7NkRBQWlCQztnQ0FBQUE7OzRCQUNsQyxJQUFJRSxVQUFVOzRCQUVkLElBQU11QyxpQ0FBaUNOLHVCQUF1Qk8sV0FBVyxJQUNuRUMsa0NBQWtDUCx3QkFBd0JNLFdBQVcsSUFBSSxHQUFHOzRCQUVsRixJQUFJRCxtQ0FBbUNFLGlDQUFpQztnQ0FDdEUsSUFBTUMsbUNBQW1DVCx1QkFBdUJVLGFBQWEsSUFDdkVDLG9DQUFvQ1Ysd0JBQXdCUyxhQUFhLElBQ3pFeEMsb0JBQW9CdUMsa0NBQ3BCdEMscUJBQXFCd0MsbUNBQ3JCQyxZQUFZLE1BQUszQyxPQUFPLGNBQVo7b0NBQWFDO29DQUFtQkM7aUNBQTBDLENBQTFFLE9BQW9ELHFCQUFHTjtnQ0FFekUsSUFBSStDLFdBQVc7b0NBQ2I3QyxVQUFVO2dDQUNaOzRCQUNGOzRCQUVBLE9BQU9BO3dCQUNUO29CQUNGO2lCQUNEO2dCQUVEb0MsS0FBS1UsSUFBSSxDQUFDLFNBQUNDO29CQUNULElBQVFWLG1CQUE2Q1UsSUFBN0NWLGtCQUFrQkMsb0JBQTJCUyxJQUEzQlQsbUJBQW1CM0MsTUFBUW9ELElBQVJwRDtvQkFFN0MsSUFBTUMsY0FBY3lDLGlCQUFpQkoseUJBQy9CcEMsZUFBZXlDLGtCQUFrQkosMEJBQTJCLEdBQUc7b0JBRXJFLElBQUksQUFBQ3RDLGdCQUFnQixRQUFVQyxpQkFBaUIsTUFBTzt3QkFDckQsSUFBTUUsVUFBV0osVUFBQUEsS0FBQUEsR0FBQUE7NEJBQUlDOzRCQUFhQzt5QkFBb0MsQ0FBckRGLE9BQStCLHFCQUFHRzt3QkFFbkRFLFVBQVVELFNBQVUsR0FBRzt3QkFFdkIsT0FBTztvQkFDVDtnQkFDRjtnQkFFQSxPQUFPQztZQUNUOzs7V0FoTElOOztBQW1MTixJQUFBLEFBQU1zRCw4QkFBTjtjQUFNQTthQUFBQTtnQ0FBQUE7UUFBTixPQUFBLGtCQUFNQTs7V0FBQUE7RUFBc0J0RDtBQUMxQixpQkFESXNELGVBQ0daLFFBQU87SUFDWjtRQUNFQyxrQkFBa0I3QztRQUNsQjhDLG1CQUFtQjlDO1FBQ25CRyxLQUFLLFNBQUNzRCxtQ0FBbUNDLG9DQUFvQ0MsZUFBZUMsZ0JBQWdCQztZQUMxRyxJQUFJdEQsVUFBVTtZQUVkLElBQUl1RCxTQUNBQztZQUVKRCxVQUFVRixnQkFBZ0IsR0FBRztZQUU3QkcsbUJBQW1CTixtQ0FBb0MsR0FBRztZQUUxRCxJQUFNTyxtQkFBbUJELGlCQUFpQkUsbUJBQW1CLElBQ3ZEQyxlQUFlSixRQUFRSyxrQ0FBa0MsQ0FBQ0g7WUFFaEVGLFVBQVVELGlCQUFrQixHQUFHO1lBRS9CRSxtQkFBbUJMLG9DQUFvQyxHQUFHO1lBRTFELElBQU1VLFlBQVlOLFFBQVFPLCtCQUErQixDQUFDTixtQkFDcERPLG1CQUFtQkosYUFBYUssY0FBYyxDQUFDSCxXQUFXVCxlQUFlQyxnQkFBZ0JDO1lBRS9GLElBQUlTLGtCQUFrQjtnQkFDcEIvRCxVQUFVO1lBQ1o7WUFFQSxPQUFPQTtRQUNUO0lBQ0Y7SUFDQTtRQUNFc0Msa0JBQWtCOUM7UUFDbEIrQyxtQkFBbUJqRDtRQUNuQk0sS0FBSyxTQUFDcUUsa0NBQWtDQyx1QkFBdUJkLGVBQWVDLGdCQUFnQkM7WUFDNUYsSUFBSXRELFVBQVU7WUFFZCxJQUFJdUQsU0FDQVk7WUFFSlosVUFBVUYsZ0JBQWdCLEdBQUc7WUFFN0IsSUFBTUcsbUJBQW1CUyxrQ0FDbkJSLG1CQUFtQkQsaUJBQWlCRSxtQkFBbUIsSUFDdkRDLGVBQWVKLFFBQVFLLGtDQUFrQyxDQUFDSCxtQkFDMURXLDZCQUE2QlosaUJBQWlCYSxhQUFhO1lBRWpFRixnQkFBZ0JDLDRCQUE0QixHQUFHO1lBRS9DLElBQU1FLHdCQUF3QkgsY0FBY0ksd0JBQXdCLElBQzlEQyx1QkFBdUJMLGNBQWNNLHVCQUF1QixJQUM1REMsbUJBQW9CSix5QkFBeUJFLHNCQUM3Q0csZUFBZSxBQUFDRCxxQkFBcUIsT0FDcEJuQixRQUFRcUIsa0NBQWtDLENBQUNGLG9CQUN6QztZQUV6Qm5CLFVBQVVELGlCQUFpQixHQUFHO1lBRTlCYSxnQkFBZ0JELHVCQUF3QixHQUFHO1lBRTNDLElBQU1XLFlBQVl0QixRQUFRdUIsNEJBQTRCLENBQUNYLGdCQUNqRFksbUJBQW1CcEIsYUFBYWhGLGNBQWMsQ0FBQ2tHLFdBQVdGLGNBQWN2QixlQUFlQyxnQkFBZ0JDO1lBRTdHLElBQUl5QixrQkFBa0I7Z0JBQ3BCL0UsVUFBVTtZQUNaO1lBRUEsT0FBT0E7UUFDVDtJQUNGO0lBQ0E7UUFDRXNDLGtCQUFrQjVDO1FBQ2xCNkMsbUJBQW1CbkQ7UUFDbkJRLEtBQUssU0FBQ29GLHdDQUF3Q0MsbUJBQW1CN0IsZUFBZUMsZ0JBQWdCQztZQUM5RixJQUFJdEQsVUFBVTtZQUVkLElBQU1rRixZQUFZRCxtQkFDWnpCLG1CQUFtQndCLHdDQUNuQnZCLG1CQUFtQkQsaUJBQWlCRSxtQkFBbUI7WUFFN0QsSUFBSUg7WUFFSkEsVUFBVUYsZ0JBQWdCLEdBQUc7WUFFN0IsSUFBTU0sZUFBZUosUUFBUUssa0NBQWtDLENBQUNIO1lBRWhFRixVQUFVRCxpQkFBa0IsR0FBRztZQUUvQixJQUFNNkIsUUFBUTVCLFFBQVE2QixvQkFBb0IsQ0FBQ0YsWUFDckNHLGVBQWUxQixhQUFhMkIsVUFBVSxDQUFDSCxPQUFPL0IsZUFBZUMsZ0JBQWdCQztZQUVuRixJQUFJK0IsY0FBYztnQkFDaEJyRixVQUFVO1lBQ1o7WUFFQSxPQUFPQTtRQUNUO0lBQ0Y7SUFDQTtRQUNFc0Msa0JBQWtCL0M7UUFDbEJnRCxtQkFBbUJwRDtRQUNuQlMsS0FBSyxTQUFDMkYseUJBQXlCQyxrQkFBa0JwQyxlQUFlQyxnQkFBZ0JDO1lBQzlFLElBQUl0RCxVQUFVO1lBRWQsSUFBTXlGLFdBQVdELGtCQUNYRSxlQUFlSCx5QkFDZkkscUJBQXFCRCxhQUFhRSxxQkFBcUI7WUFFN0QsSUFBSXJDO1lBRUpBLFVBQVVGLGdCQUFnQixHQUFHO1lBRTdCLElBQU13QyxXQUFXdEMsUUFBUXVDLGdDQUFnQyxDQUFDSDtZQUUxRHBDLFVBQVVELGlCQUFrQixHQUFHO1lBRS9CLElBQU15QyxPQUFPeEMsUUFBUXlDLGtCQUFrQixDQUFDUCxXQUNsQ1EsY0FBY0osU0FBU0ssU0FBUyxDQUFDSCxNQUFNM0MsZUFBZUMsZ0JBQWdCQztZQUU1RSxJQUFJMkMsYUFBYTtnQkFDZmpHLFVBQVU7WUFDWjtZQUVBLE9BQU9BO1FBQ1Q7SUFDRjtDQUNEO0FBR0gsSUFBQSxBQUFNbUcsK0JBQU47Y0FBTUE7YUFBQUE7Z0NBQUFBO1FBQU4sT0FBQSxrQkFBTUE7O1dBQUFBO0VBQXVCeEc7QUFDM0IsaUJBREl3RyxnQkFDRzlELFFBQU87SUFDWjtRQUNFQyxrQkFBa0JqRDtRQUNsQmtELG1CQUFtQmpEO1FBQ25CTSxLQUFLLFNBQUN3RyxxQkFBcUJsQyx1QkFBdUJtQyxhQUFhQyxRQUFRakQsZ0JBQWdCQztZQUNyRixJQUFJdEQsVUFBVTtZQUVkLElBQU11RyxlQUFlSCxxQkFDZmpDLGdCQUFnQkQsdUJBQXVCLEdBQUc7WUFFaEQsSUFBSVg7WUFFSkEsVUFBVUYsZ0JBQWdCLEdBQUc7WUFFN0IsSUFBTW1ELGVBQWVELGFBQWFFLGVBQWUsSUFDM0NDLFdBQVduRCxRQUFRb0QsMEJBQTBCLENBQUNIO1lBRXBEakQsVUFBVUQsaUJBQWtCLEdBQUc7WUFFL0IsSUFBTSxBQUFFc0QsWUFBY0MsaUJBQVEsQ0FBdEJELFdBQ0YvQixZQUFZK0IsVUFBVUUsaUJBQWlCLENBQUMzQyxlQUFlWixVQUN2RHdELDZCQUE2QmxDLFVBQVVtQyxtQkFBbUIsQ0FBQ04sVUFBVUwsYUFBYUMsUUFBUS9DO1lBRWhHLElBQUl3RCw0QkFBNEI7Z0JBQzlCL0csVUFBVTtZQUNaO1lBRUEsT0FBT0E7UUFDVDtJQUNGO0lBQ0E7UUFDRXNDLGtCQUFrQmpEO1FBQ2xCa0QsbUJBQW1CbkQ7UUFDbkJRLEtBQUssU0FBQ3dHLHFCQUFxQm5CLG1CQUFtQm9CLGFBQWFDLFFBQVFqRCxnQkFBZ0JDO1lBQ2pGLElBQUl0RCxVQUFVO1lBRWQsSUFBTXVHLGVBQWVILHFCQUNmbEIsWUFBWUQsbUJBQW1CLEdBQUc7WUFFeEMsSUFBSTFCO1lBRUpBLFVBQVVGLGdCQUFnQixHQUFHO1lBRTdCLElBQU1tRCxlQUFlRCxhQUFhRSxlQUFlLElBQzNDQyxXQUFXbkQsUUFBUW9ELDBCQUEwQixDQUFDSDtZQUVwRGpELFVBQVVELGlCQUFrQixHQUFHO1lBRS9CLElBQU0sQUFBRTJELFFBQVVKLGlCQUFRLENBQWxCSSxPQUNGOUIsUUFBUThCLE1BQU1DLGFBQWEsQ0FBQ2hDLFdBQVczQixVQUN2QzRELHlCQUF5QmhDLE1BQU02QixtQkFBbUIsQ0FBQ04sVUFBVUwsYUFBYUMsUUFBUS9DO1lBRXhGLElBQUk0RCx3QkFBd0I7Z0JBQzFCbkgsVUFBVTtZQUNaO1lBRUEsT0FBT0E7UUFDVDtJQUNGO0lBQ0E7UUFDRXNDLGtCQUFrQnBEO1FBQ2xCcUQsbUJBQW1CcEQ7UUFDbkJTLEtBQUssU0FBQ3dILGlCQUFpQjVCLGtCQUFrQmEsYUFBYUMsUUFBUWpELGdCQUFnQkM7WUFDNUUsSUFBSXRELFVBQVU7WUFFZCxJQUFNcUgsV0FBV0QsaUJBQ1gzQixXQUFXRCxrQkFDWDhCLGtCQUFrQkQsU0FBU0Usa0JBQWtCO1lBRW5ELElBQUloRTtZQUVKQSxVQUFVRixnQkFBZ0IsR0FBRztZQUU3QixJQUFNbUUsT0FBT2pFLFFBQVFrRSx5QkFBeUIsQ0FBQ0g7WUFFL0MsSUFBSUUsU0FBUyxNQUFNO2dCQUNqQmpFLFVBQVVELGlCQUFrQixHQUFHO2dCQUUvQixJQUFNLEFBQUVvRSxPQUFTYixpQkFBUSxDQUFqQmEsTUFDRjNCLE9BQU8yQixLQUFLQyxZQUFZLENBQUNsQyxVQUFVbEMsVUFDbkNxRSx3QkFBd0I3QixLQUFLOEIsZUFBZSxDQUFDTCxNQUFNbkUsZ0JBQWdCQztnQkFFekUsSUFBSXNFLHVCQUF1QjtvQkFDekI1SCxVQUFVO2dCQUNaO1lBQ0Y7WUFFQSxPQUFPQTtRQUNUO0lBQ0Y7Q0FDRDtBQUdILElBQUEsQUFBTThILGdDQUFOO2NBQU1BO2FBQUFBO2dDQUFBQTtRQUFOLE9BQUEsa0JBQU1BOztXQUFBQTtFQUF3Qm5JO0FBQzVCLGlCQURJbUksaUJBQ0d6RixRQUFPO0lBQ1o7UUFDRUMsa0JBQWtCcEQ7UUFDbEJxRCxtQkFBbUJwRDtRQUNuQlMsS0FBSyxTQUFDd0gsaUJBQWlCNUIsa0JBQWtCbkMsZ0JBQWdCQztZQUN2RCxJQUFJdEQsVUFBVTtZQUVkLElBQU1xSCxXQUFXRCxpQkFDWDNCLFdBQVdELGtCQUNYOEIsa0JBQWtCRCxTQUFTRSxrQkFBa0I7WUFFbkQsSUFBSWhFO1lBRUpBLFVBQVVGLGdCQUFnQixHQUFHO1lBRTdCLElBQU1tRSxPQUFPakUsUUFBUWtFLHlCQUF5QixDQUFDSDtZQUUvQyxJQUFJRSxTQUFTLE1BQU07Z0JBQ2pCakUsVUFBVUQsaUJBQWtCLEdBQUc7Z0JBRS9CLElBQU0sQUFBRW9FLE9BQVNiLGlCQUFRLENBQWpCYSxNQUNGM0IsT0FBTzJCLEtBQUtDLFlBQVksQ0FBQ2xDLFVBQVVsQyxVQUNuQ3FFLHdCQUF3QjdCLEtBQUs4QixlQUFlLENBQUNMLE1BQU1uRSxnQkFBZ0JDO2dCQUV6RSxJQUFJc0UsdUJBQXVCO29CQUN6QjVILFVBQVU7Z0JBQ1o7WUFDRjtZQUVBLE9BQU9BO1FBQ1Q7SUFDRjtDQUNEO0FBR0gsSUFBQSxBQUFNK0gsaUNBQU47Y0FBTUE7YUFBQUE7Z0NBQUFBO1FBQU4sT0FBQSxrQkFBTUE7O1dBQUFBO0VBQXlCcEk7QUFDN0IsaUJBRElvSSxrQkFDRzFGLFFBQU87SUFDWjtRQUNFQyxrQkFBa0JwRDtRQUNsQnFELG1CQUFtQnBEO1FBQ25CUyxLQUFLLFNBQUN3SCxpQkFBaUI1QixrQkFBa0JuQyxnQkFBZ0JDO1lBQ3ZELElBQUl0RCxVQUFVO1lBRWQsSUFBTXFILFdBQVdELGlCQUNYM0IsV0FBV0Qsa0JBQ1g4QixrQkFBa0JELFNBQVNFLGtCQUFrQixJQUM3Q0MsT0FBT25FLGVBQWVvRSx5QkFBeUIsQ0FBQ0gsa0JBQ2hEL0QsVUFBVUQsaUJBQ1Z5QyxPQUFPeEMsUUFBUXlDLGtCQUFrQixDQUFDUCxXQUNsQ21DLHdCQUF3QjdCLEtBQUs4QixlQUFlLENBQUNMLE1BQU1uRSxnQkFBZ0JDO1lBRXpFLElBQUlzRSx1QkFBdUI7Z0JBQ3pCNUgsVUFBVTtZQUNaO1lBRUEsT0FBT0E7UUFDVDtJQUNGO0NBQ0Q7QUFHSCxJQUFBLEFBQU1nSSxtQ0FBTjtjQUFNQTthQUFBQTtnQ0FBQUE7UUFBTixPQUFBLGtCQUFNQTs7V0FBQUE7RUFBMkJySTtBQUMvQixpQkFESXFJLG9CQUNHM0YsUUFBTztJQUNaO1FBQ0VDLGtCQUFrQi9DO1FBQ2xCZ0QsbUJBQW1CcEQ7UUFDbkJTLEtBQUssU0FBQzJGLHlCQUF5QkMsa0JBQWtCcEMsZUFBZUMsZ0JBQWdCQztZQUM5RSxJQUFJdEQsVUFBVTtZQUVkLElBQU15RixXQUFXRCxrQkFDWEUsZUFBZUgseUJBQ2ZJLHFCQUFxQkQsYUFBYUUscUJBQXFCO1lBRTdELElBQUlyQztZQUVKQSxVQUFVRixnQkFBZ0IsR0FBRztZQUU3QixJQUFNd0MsV0FBV3RDLFFBQVF1QyxnQ0FBZ0MsQ0FBQ0g7WUFFMURwQyxVQUFVRCxpQkFBa0IsR0FBRztZQUUvQixJQUFNeUMsT0FBT3hDLFFBQVF5QyxrQkFBa0IsQ0FBQ1AsV0FDbENRLGNBQWNKLFNBQVNLLFNBQVMsQ0FBQ0gsTUFBTTNDLGVBQWVDLGdCQUFnQkM7WUFFNUUsSUFBSTJDLGFBQWE7Z0JBQ2ZqRyxVQUFVO1lBQ1o7WUFFQSxPQUFPQTtRQUNUO0lBQ0Y7Q0FDRDtBQUdILElBQU1pSSxnQkFBZ0IsSUFBSWhGLGlCQUNwQmlGLGlCQUFpQixJQUFJL0Isa0JBQ3JCZ0Msa0JBQWtCLElBQUlMLG1CQUN0Qk0sbUJBQW1CLElBQUlMLG9CQUN2Qk0scUJBQXFCLElBQUlMO0FBRXhCLFNBQVNySixlQUFlMkosZ0JBQWdCLEVBQUVDLGlCQUFpQixFQUFFbkYsYUFBYSxFQUFFQyxjQUFjLEVBQUVDLGVBQWU7SUFDaEgsSUFBSXlCLG1CQUFtQjtJQUV2QixJQUFNeUQsdUJBQXVCRixpQkFBaUJHLE9BQU8sSUFDL0N2RSx3QkFBd0JxRSxrQkFBa0JFLE9BQU8sSUFDakQ1SSxjQUFjMkksc0JBQ2QxSSxlQUFlb0UsdUJBQ2ZsRSxVQUFVaUksY0FBY3JJLEdBQUcsQ0FBQ0MsYUFBYUMsY0FBY3NELGVBQWVDLGdCQUFnQkM7SUFFNUYsSUFBSXRELFNBQVM7UUFDWCtFLG1CQUFtQjtJQUNyQjtJQUVBLE9BQU9BO0FBQ1Q7QUFFTyxTQUFTakcsa0JBQWtCNEosbUJBQW1CLEVBQUVDLG9CQUFvQixFQUFFdkYsYUFBYSxFQUFFQyxjQUFjLEVBQUVDLGVBQWU7SUFDekgsSUFBSXNGLHNCQUFzQjtJQUUxQixJQUFNQywwQkFBMEJILG9CQUFvQkQsT0FBTyxJQUNyREssMkJBQTJCSCxxQkFBcUJGLE9BQU8sSUFDdkQ1SSxjQUFjZ0oseUJBQ2QvSSxlQUFlZ0osMEJBQ2Y5SSxVQUFVaUksY0FBY3JJLEdBQUcsQ0FBQ0MsYUFBYUMsY0FBY3NELGVBQWVDLGdCQUFnQkM7SUFFNUYsSUFBSXRELFNBQVM7UUFDWDRJLHNCQUFzQjtJQUN4QjtJQUVBLE9BQU9BO0FBQ1Q7QUFFTyxTQUFTbkssa0JBQWtCc0ssbUJBQW1CLEVBQUVDLG9CQUFvQixFQUFFM0YsY0FBYyxFQUFFQyxlQUFlO0lBQzFHLElBQUkyRixzQkFBc0I7SUFFMUIsSUFBTUMsMEJBQTBCSCxvQkFBb0JOLE9BQU8sSUFDckRVLDJCQUEyQkgscUJBQXFCUCxPQUFPLElBQ3ZEekksVUFBVW9JLGlCQUFpQnhJLEdBQUcsQ0FBQ3NKLHlCQUF5QkMsMEJBQTBCOUYsZ0JBQWdCQztJQUV4RyxJQUFJdEQsU0FBUztRQUNYaUosc0JBQXNCO0lBQ3hCO0lBRUEsT0FBT0E7QUFDVDtBQUVPLFNBQVNsSyx5QkFBeUJnSCxJQUFJLEVBQUVxRCxXQUFXLEVBQUU3RixPQUFPO0lBQ2pFLElBQUk4Riw2QkFBNkI7SUFFakMsSUFBTTVELFdBQVdNLEtBQUswQyxPQUFPLElBQ3ZCcEYsaUJBQWlCRSxTQUNqQkQsa0JBQWtCQyxTQUNsQitGLGtCQUFrQkYsWUFBWUcsT0FBTyxJQUNyQ0Msc0JBQXNCRixnQkFBZ0JiLE9BQU8sSUFDN0N6SSxVQUFVbUksZ0JBQWdCdkksR0FBRyxDQUFDNEoscUJBQXFCL0QsVUFBVXBDLGdCQUFnQkM7SUFFbkYsSUFBSXRELFNBQVM7UUFDWHFKLDZCQUE2QjtJQUMvQjtJQUVBLE9BQU9BO0FBQ1Q7QUFFTyxTQUFTekssNEJBQTRCMEosZ0JBQWdCLEVBQUVDLGlCQUFpQixFQUFFbkYsYUFBYSxFQUFFQyxjQUFjLEVBQUVDLGVBQWU7SUFDN0gsSUFBSW1HLGdDQUFnQztJQUVwQyxJQUFNakIsdUJBQXVCRixpQkFBaUJHLE9BQU8sSUFDL0N2RSx3QkFBd0JxRSxrQkFBa0JFLE9BQU8sSUFDakQ1SSxjQUFjMkksc0JBQ2QxSSxlQUFlb0UsdUJBQ2ZsRSxVQUFVcUksbUJBQW1CekksR0FBRyxDQUFDQyxhQUFhQyxjQUFjc0QsZUFBZUMsZ0JBQWdCQztJQUVqRyxJQUFJdEQsU0FBUztRQUNYeUosZ0NBQWdDO0lBQ2xDO0lBRUEsT0FBT0E7QUFDVDtBQUVPLFNBQVM1Syw2QkFBNkJnRyxTQUFTLEVBQUU2RSxVQUFVLEVBQUVyRCxXQUFXLEVBQUVDLE1BQU0sRUFBRS9DLE9BQU87SUFDOUYsSUFBSW9HLGlDQUFpQztJQUVyQyxJQUFNeEYsZ0JBQWdCVSxVQUFVNEQsT0FBTyxJQUNqQ3BGLGlCQUFpQkUsU0FDakJELGtCQUFrQkMsU0FDbEJxRyxzQkFBc0JGLFdBQVdHLFlBQVksSUFDN0NDLDBCQUEwQkYsb0JBQW9CbkIsT0FBTyxJQUNyRHpJLFVBQVVrSSxlQUFldEksR0FBRyxDQUFDa0sseUJBQXlCM0YsZUFBZWtDLGFBQWFDLFFBQVFqRCxnQkFBZ0JDO0lBRWhILElBQUl0RCxTQUFTO1FBQ1gySixpQ0FBaUM7SUFDbkM7SUFFQSxPQUFPQTtBQUNUO0FBRU8sU0FBU2pMLCtCQUErQnFLLG1CQUFtQixFQUFFQyxvQkFBb0IsRUFBRTVGLGFBQWEsRUFBRUMsY0FBYyxFQUFFQyxlQUFlO0lBQ3RJLElBQUl5RyxtQ0FBbUM7SUFFdkMsSUFBTWIsMEJBQTBCSCxvQkFBb0JOLE9BQU8sSUFDckRVLDJCQUEyQkgscUJBQXFCUCxPQUFPLElBQ3ZENUksY0FBY3FKLHlCQUNkcEosZUFBZXFKLDBCQUNmbkosVUFBVXFJLG1CQUFtQnpJLEdBQUcsQ0FBQ0MsYUFBYUMsY0FBY3NELGVBQWVDLGdCQUFnQkM7SUFFakcsSUFBSXRELFNBQVM7UUFDWCtKLG1DQUFtQztJQUNyQztJQUVBLE9BQU9BO0FBQ1QifQ==