occam-verify-cli 1.0.508 → 1.0.511

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