occam-verify-cli 0.0.539 → 0.0.541

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 (62) hide show
  1. package/bin/utilities/releaseContext.js +30 -40
  2. package/lib/axiom.js +4 -4
  3. package/lib/axiomLemmaTheoremConjecture.js +6 -6
  4. package/lib/combinator.js +4 -4
  5. package/lib/conclusion.js +4 -4
  6. package/lib/conjecture.js +4 -4
  7. package/lib/constructor.js +6 -6
  8. package/lib/context/file.js +185 -78
  9. package/lib/context/metaproof.js +3 -3
  10. package/lib/context/release.js +222 -3
  11. package/lib/index.js +1 -9
  12. package/lib/kinds.js +9 -1
  13. package/lib/label.js +4 -4
  14. package/lib/lemma.js +4 -4
  15. package/lib/metaType.js +9 -7
  16. package/lib/metavariable.js +32 -1
  17. package/lib/premise.js +4 -4
  18. package/lib/rule.js +7 -7
  19. package/lib/ruleNames.js +16 -4
  20. package/lib/supposition.js +4 -4
  21. package/lib/theorem.js +4 -4
  22. package/lib/type.js +14 -14
  23. package/lib/utilities/node.js +31 -3
  24. package/lib/utilities/releaseContext.js +6 -5
  25. package/lib/variable.js +32 -1
  26. package/lib/verifier.js +1 -1
  27. package/lib/verify/file.js +2 -2
  28. package/lib/verify/metastatement.js +147 -3
  29. package/lib/verify/statement.js +2 -2
  30. package/package.json +3 -3
  31. package/src/axiom.js +1 -1
  32. package/src/axiomLemmaTheoremConjecture.js +4 -4
  33. package/src/combinator.js +3 -3
  34. package/src/conclusion.js +3 -3
  35. package/src/conjecture.js +1 -1
  36. package/src/constructor.js +5 -5
  37. package/src/context/file.js +161 -28
  38. package/src/context/metaproof.js +1 -1
  39. package/src/context/release.js +266 -3
  40. package/src/index.js +0 -2
  41. package/src/kinds.js +2 -0
  42. package/src/label.js +3 -3
  43. package/src/lemma.js +1 -1
  44. package/src/metaType.js +8 -5
  45. package/src/metavariable.js +36 -0
  46. package/src/premise.js +3 -3
  47. package/src/rule.js +5 -5
  48. package/src/ruleNames.js +4 -1
  49. package/src/supposition.js +3 -3
  50. package/src/theorem.js +1 -1
  51. package/src/type.js +13 -13
  52. package/src/utilities/node.js +57 -2
  53. package/src/utilities/releaseContext.js +4 -2
  54. package/src/variable.js +36 -0
  55. package/src/verifier.js +1 -1
  56. package/src/verify/file.js +1 -1
  57. package/src/verify/metastatement.js +65 -2
  58. package/src/verify/statement.js +2 -2
  59. package/lib/context/release/directory.js +0 -313
  60. package/lib/context/release/file.js +0 -387
  61. package/src/context/release/directory.js +0 -251
  62. package/src/context/release/file.js +0 -312
@@ -298,7 +298,7 @@ function verifyStatementAgainstCombinators(statementNode, context) {
298
298
  return statementVerifiedAgainstCombinators;
299
299
  }
300
300
  function verifyStatementAgainstCombinator(statementNode, combinator, context) {
301
- var combinatorStatementNode = combinator.getStatementNode(), nonTerminalNodeA = statementNode, nonTerminalNodeB = combinatorStatementNode, nodeVerified = statementVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context), statementVerifiedAgainstCombinator = nodeVerified; ///
301
+ var combinatorStatementNode = combinator.getStatementNode(), nonTerminalNodeA = statementNode, nonTerminalNodeB = combinatorStatementNode, nonTerminalNodeVerified = statementVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context), statementVerifiedAgainstCombinator = nonTerminalNodeVerified; ///
302
302
  return statementVerifiedAgainstCombinator;
303
303
  }
304
304
  function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context) {
@@ -382,4 +382,4 @@ function verifyStatementAsEquality(statementNode, assignments, derived, context)
382
382
  return statementVerifiedAsEquality;
383
383
  }
384
384
 
385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJpZnkvc3RhdGVtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgVmVyaWZpZXIgZnJvbSBcIi4uL3ZlcmlmaWVyXCI7XG5pbXBvcnQgVmFyaWFibGUgZnJvbSBcIi4uL3ZhcmlhYmxlXCI7XG5pbXBvcnQgRXF1YWxpdHkgZnJvbSBcIi4uL2VxdWFsaXR5XCI7XG5pbXBvcnQgQXNzaWdubWVudCBmcm9tIFwiLi4vYXNzaWdubWVudFwiO1xuaW1wb3J0IHZlcmlmeVRlcm0gZnJvbSBcIi4uL3ZlcmlmeS90ZXJtXCI7XG5pbXBvcnQgZXF1YWxpdHlDb21iaW5hdG9yIGZyb20gXCIuLi9vY21iaW5hdG9yL2VxdWFsaXR5XCI7XG5pbXBvcnQgYnJhY2tldGVkQ29tYmluYXRvciBmcm9tIFwiLi4vb2NtYmluYXRvci9icmFja2V0ZWRcIjtcbmltcG9ydCB2ZXJpZnlUeXBlQXNzZXJ0aW9uIGZyb20gXCIuLi92ZXJpZnkvYXNzZXJ0aW9uL3R5cGVcIjtcblxuaW1wb3J0IHsgb2JqZWN0VHlwZSB9IGZyb20gXCIuLi90eXBlXCI7XG5pbXBvcnQgeyBmaXJzdCwgc2Vjb25kIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9hcnJheVwiO1xuaW1wb3J0IHsgT0JKRUNUX1RZUEVfTkFNRSB9IGZyb20gXCIuLi90eXBlTmFtZXNcIjtcbmltcG9ydCB7IFNUQVRFTUVOVF9NRVRBX1RZUEUgfSBmcm9tIFwiLi4vbWV0YVR5cGVzXCI7XG5pbXBvcnQgeyB2ZXJpZnlUZXJtQXNWYXJpYWJsZSB9IGZyb20gXCIuLi92ZXJpZnkvdGVybVwiO1xuaW1wb3J0IHsgbm9kZVF1ZXJ5LCB0eXBlTmFtZUZyb21UeXBlTm9kZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvcXVlcnlcIjtcbmltcG9ydCB7IEFSR1VNRU5UX1JVTEVfTkFNRSwgTUVUQV9BUkdVTUVOVF9SVUxFX05BTUUgfSBmcm9tIFwiLi4vcnVsZU5hbWVzXCI7XG5cbmNvbnN0IHRlcm1Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvYXJndW1lbnQvdGVybSFcIiksXG4gICAgICB0eXBlTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL2FyZ3VtZW50L3R5cGUhXCIpLFxuICAgICAgbWV0YVR5cGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvbWV0YUFyZ3VtZW50L21ldGFUeXBlIVwiKSxcbiAgICAgIHN0YXRlbWVudE5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9tZXRhQXJndW1lbnQvc3RhdGVtZW50IVwiKSxcbiAgICAgIHR5cGVBc3NlcnRpb25Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvc3RhdGVtZW50L3R5cGVBc3NlcnRpb24hXCIpLFxuICAgICAgbWV0YVR5cGVUZXJtaW5hbE5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9tZXRhVHlwZS9AbWV0YS10eXBlXCIpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlTdGF0ZW1lbnQoc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFZlcmlmaWVkID0gZmFsc2U7XG5cbiAgaWYgKCFzdGF0ZW1lbnRWZXJpZmllZCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3JzID0gdmVyaWZ5U3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3JzKHN0YXRlbWVudE5vZGUsIGNvbnRleHQpO1xuXG4gICAgc3RhdGVtZW50VmVyaWZpZWQgPSBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9yczsgIC8vL1xuICB9XG5cbiAgaWYgKCFzdGF0ZW1lbnRWZXJpZmllZCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFZlcmlmaWVkQXNUeXBlQXNzZXJ0aW9uID0gdmVyaWZ5U3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uKHN0YXRlbWVudE5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBjb250ZXh0KTtcblxuICAgIHN0YXRlbWVudFZlcmlmaWVkID0gc3RhdGVtZW50VmVyaWZpZWRBc1R5cGVBc3NlcnRpb247IC8vL1xuICB9XG5cbiAgaWYgKCFzdGF0ZW1lbnRWZXJpZmllZCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSA9IHZlcmlmeVN0YXRlbWVudEFzRXF1YWxpdHkoc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGNvbnRleHQpO1xuXG4gICAgc3RhdGVtZW50VmVyaWZpZWQgPSBzdGF0ZW1lbnRWZXJpZmllZEFzRXF1YWxpdHk7ICAvL1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkO1xufVxuXG5jbGFzcyBTdGF0ZW1lbnRWZXJpZmllciBleHRlbmRzIFZlcmlmaWVyIHtcbiAgdmVyaWZ5Tm9uVGVybWluYWxOb2RlKG5vblRlcm1pbmFsTm9kZUEsIG5vblRlcm1pbmFsTm9kZUIsIGNvbnRleHQpIHtcbiAgICBsZXQgbm9uVGVybWluYWxOb2RlVmVyaWZpZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IG5vblRlcm1pbmFsTm9kZUEsIC8vL1xuICAgICAgICAgIGNvbWJpbmF0b3JOb25UZXJtaW5hbE5vZGUgPSBub25UZXJtaW5hbE5vZGVCOyAvLy9cblxuICAgIGNvbnN0IHJ1bGVOYW1lID0gbm9uVGVybWluYWxOb2RlLmdldFJ1bGVOYW1lKCksIC8vL1xuICAgICAgY29tYmluYXRvclJ1bGVOYW1lID0gY29tYmluYXRvck5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpOyAvLy9cblxuICAgIGlmIChydWxlTmFtZSA9PT0gY29tYmluYXRvclJ1bGVOYW1lKSB7XG4gICAgICBzd2l0Y2ggKHJ1bGVOYW1lKSB7XG4gICAgICAgIGNhc2UgQVJHVU1FTlRfUlVMRV9OQU1FOiB7XG4gICAgICAgICAgY29uc3QgYXJndW1lbnROb2RlID0gbm9uVGVybWluYWxOb2RlLCAvLy9cbiAgICAgICAgICAgICAgICBjb21iaW5hdG9yQXJndW1lbnROb2RlID0gY29tYmluYXRvck5vblRlcm1pbmFsTm9kZSwgLy8vXG4gICAgICAgICAgICAgICAgYXJndW1lbnROb2RlVmVyaWZpZWQgPSB0aGlzLnZlcmlmeUFyZ3VtZW50Tm9kZShhcmd1bWVudE5vZGUsIGNvbWJpbmF0b3JBcmd1bWVudE5vZGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgbm9uVGVybWluYWxOb2RlVmVyaWZpZWQgPSBhcmd1bWVudE5vZGVWZXJpZmllZDsgLy8vXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgTUVUQV9BUkdVTUVOVF9SVUxFX05BTUU6IHtcbiAgICAgICAgICBjb25zdCBtZXRhQXJndW1lbnROb2RlID0gbm9uVGVybWluYWxOb2RlLCAvLy9cbiAgICAgICAgICAgICAgICBjb21iaW5hdG9yTWV0YWFyZ3VtZW50Tm9kZSA9IGNvbWJpbmF0b3JOb25UZXJtaW5hbE5vZGUsIC8vL1xuICAgICAgICAgICAgICAgIG1ldGFBcmd1bWVudE5vZGVWZXJpZmllZCA9IHRoaXMudmVyaWZ5TWV0YWFyZ3VtZW50Tm9kZShtZXRhQXJndW1lbnROb2RlLCBjb21iaW5hdG9yTWV0YWFyZ3VtZW50Tm9kZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBub25UZXJtaW5hbE5vZGVWZXJpZmllZCA9IG1ldGFBcmd1bWVudE5vZGVWZXJpZmllZDsgLy8vXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gbm9uVGVybWluYWxOb2RlLmdldENoaWxkTm9kZXMoKSxcbiAgICAgICAgICAgICAgICBjb21iaW5hdG9yQ2hpbGROb2RlcyA9IGNvbWJpbmF0b3JOb25UZXJtaW5hbE5vZGUuZ2V0Q2hpbGROb2RlcygpLFxuICAgICAgICAgICAgICAgIG5vZGVzQSA9IGNoaWxkTm9kZXMsIC8vL1xuICAgICAgICAgICAgICAgIG5vZGVzQiA9IGNvbWJpbmF0b3JDaGlsZE5vZGVzLCAvLy9cbiAgICAgICAgICAgICAgICBub2Rlc1ZlcmlmaWVkID0gdGhpcy52ZXJpZnlOb2Rlcyhub2Rlc0EsIG5vZGVzQiwgY29udGV4dCk7XG5cbiAgICAgICAgICBub25UZXJtaW5hbE5vZGVWZXJpZmllZCA9IG5vZGVzVmVyaWZpZWQ7IC8vL1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9uVGVybWluYWxOb2RlVmVyaWZpZWQ7XG4gIH1cblxuICB2ZXJpZnlBcmd1bWVudE5vZGUoYXJndW1lbnROb2RlLCBjb21iaW5hdG9yQXJndW1lbnROb2RlLCBjb250ZXh0KSB7XG4gICAgbGV0IGFyZ3VtZW50Tm9kZVZlcmlmaWVkID0gZmFsc2U7XG5cbiAgICBjb25zdCB0ZXJtTm9kZSA9IHRlcm1Ob2RlUXVlcnkoYXJndW1lbnROb2RlKTtcblxuICAgIGlmICh0ZXJtTm9kZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgYXJndW1lbnRTdHJpbmcgPSBjb250ZXh0Lm5vZGVBc1N0cmluZyhhcmd1bWVudE5vZGUpO1xuXG4gICAgICBjb250ZXh0LmVycm9yKGBUaGUgJHthcmd1bWVudFN0cmluZ30gYXJndW1lbnQgc2hvdWxkIGJlIGEgdGVybSwgbm90IGEgdHlwZWAsIGFyZ3VtZW50Tm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGVzID0gW10sXG4gICAgICAgICAgICB0ZXJtVmVyaWZpZWQgPSB2ZXJpZnlUZXJtKHRlcm1Ob2RlLCB0eXBlcywgY29udGV4dCk7XG5cbiAgICAgIGlmICh0ZXJtVmVyaWZpZWQpIHtcbiAgICAgICAgY29uc3QgZmlyc3RUeXBlID0gZmlyc3QodHlwZXMpLFxuICAgICAgICAgICAgICB0ZXJtVHlwZSA9IGZpcnN0VHlwZSwgLy8vXG4gICAgICAgICAgICAgIHR5cGVOb2RlID0gdHlwZU5vZGVRdWVyeShjb21iaW5hdG9yQXJndW1lbnROb2RlKSxcbiAgICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZUZyb21UeXBlTm9kZSh0eXBlTm9kZSksXG4gICAgICAgICAgICAgIHR5cGUgPSAodHlwZU5hbWUgPT09IE9CSkVDVF9UWVBFX05BTUUpID9cbiAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA6ICAvLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmZpbmRUeXBlQnlUeXBlTmFtZSh0eXBlTmFtZSksXG4gICAgICAgICAgICAgIHN0YXRlbWVudFR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUeXBlID0gdGVybVR5cGUuaXNFcXVhbFRvT3JTdWJUeXBlT2YodHlwZSk7XG5cbiAgICAgICAgaWYgKHN0YXRlbWVudFR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUeXBlKSB7XG4gICAgICAgICAgYXJndW1lbnROb2RlVmVyaWZpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZ3VtZW50Tm9kZVZlcmlmaWVkO1xuICB9XG5cbiAgdmVyaWZ5TWV0YWFyZ3VtZW50Tm9kZShtZXRhQXJndW1lbnROb2RlLCBjb21iaW5hdG9yTWV0YWFyZ3VtZW50Tm9kZSwgY29udGV4dCkge1xuICAgIGxldCBtZXRhQXJndW1lbnROb2RlVmVyaWZpZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnROb2RlUXVlcnkobWV0YUFyZ3VtZW50Tm9kZSksXG4gICAgICAgICAgY29tYmluYXRvck1ldGFUWXBlTm9kZSA9IG1ldGFUeXBlTm9kZVF1ZXJ5KGNvbWJpbmF0b3JNZXRhYXJndW1lbnROb2RlKTtcblxuICAgIGlmIChzdGF0ZW1lbnROb2RlID09PSBudWxsKSB7XG4gICAgICBjb25zdCBtZXRhQXJndW1lbnRTdHJpbmcgPSBjb250ZXh0Lm5vZGVBc1N0cmluZyhtZXRhQXJndW1lbnROb2RlKTtcblxuICAgICAgY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYSBzdGF0ZW1lbnQgYnV0IGdvdCBhICcke21ldGFBcmd1bWVudFN0cmluZ30nIG1ldGEtdHlwZS5gLCBtZXRhQXJndW1lbnROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNvbWJpbmF0b3JNZXRhVFlwZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY29tYmluYXRvck1ldGFhcmd1bWVudFN0cmluZyA9IGNvbnRleHQubm9kZUFzU3RyaW5nKGNvbWJpbmF0b3JNZXRhYXJndW1lbnROb2RlKTtcblxuICAgICAgICBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhIG1ldGEtdHlwZSBidXQgZ290IGEgJyR7Y29tYmluYXRvck1ldGFhcmd1bWVudFN0cmluZ30nIHN0YXRlbWVudC5gLCBtZXRhQXJndW1lbnROb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbWJpbmF0b3JNZXRhVHlwZVRlcm1pbmFsTm9kZSA9IG1ldGFUeXBlVGVybWluYWxOb2RlUXVlcnkoY29tYmluYXRvck1ldGFUWXBlTm9kZSksXG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBjb21iaW5hdG9yTWV0YVR5cGVUZXJtaW5hbE5vZGUuZ2V0Q29udGVudCgpLFxuICAgICAgICAgICAgICBjb250ZW50U3RhdGVtZW50TWV0YVR5cGUgPSAoY29udGVudCA9PT0gU1RBVEVNRU5UX01FVEFfVFlQRSk7XG5cbiAgICAgICAgaWYgKCFjb250ZW50U3RhdGVtZW50TWV0YVR5cGUpIHtcbiAgICAgICAgICBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0aGUgbWV0YS10eXBlIHRvIGJlICdTdGF0ZW1lbnQnIGJ1dCBnb3QgJyR7Y29udGVudH0nLmAsIG1ldGFBcmd1bWVudE5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1ldGFBcmd1bWVudE5vZGVWZXJpZmllZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YUFyZ3VtZW50Tm9kZVZlcmlmaWVkO1xuICB9XG59XG5cbmNvbnN0IHN0YXRlbWVudFZlcmlmaWVyID0gbmV3IFN0YXRlbWVudFZlcmlmaWVyKCk7XG5cbmZ1bmN0aW9uIHZlcmlmeVN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9ycyhzdGF0ZW1lbnROb2RlLCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9ycyA9IGZhbHNlO1xuXG4gIGxldCBjb21iaW5hdG9ycyA9IGNvbnRleHQuZ2V0Q29tYmluYXRvcnMoKTtcblxuICBjb21iaW5hdG9ycyA9IFsgLy8vXG4gICAgYnJhY2tldGVkQ29tYmluYXRvcixcbiAgICAuLi5jb21iaW5hdG9yc1xuICBdO1xuXG4gIGNvbnN0IGNvbWJpbmF0b3IgPSBjb21iaW5hdG9ycy5maW5kKChjb21iaW5hdG9yKSA9PiB7XG4gICAgY29uc3Qgc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvciA9IHZlcmlmeVN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9yKHN0YXRlbWVudE5vZGUsIGNvbWJpbmF0b3IsIGNvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3IpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSkgfHwgbnVsbDtcblxuICBpZiAoY29tYmluYXRvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3JzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9ycztcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3Ioc3RhdGVtZW50Tm9kZSwgY29tYmluYXRvciwgY29udGV4dCkge1xuICBjb25zdCBjb21iaW5hdG9yU3RhdGVtZW50Tm9kZSA9IGNvbWJpbmF0b3IuZ2V0U3RhdGVtZW50Tm9kZSgpLFxuICAgICAgICBub25UZXJtaW5hbE5vZGVBID0gc3RhdGVtZW50Tm9kZSwgIC8vL1xuICAgICAgICBub25UZXJtaW5hbE5vZGVCID0gY29tYmluYXRvclN0YXRlbWVudE5vZGUsIC8vL1xuICAgICAgICBub2RlVmVyaWZpZWQgPSBzdGF0ZW1lbnRWZXJpZmllci52ZXJpZnlOb25UZXJtaW5hbE5vZGUobm9uVGVybWluYWxOb2RlQSwgbm9uVGVybWluYWxOb2RlQiwgY29udGV4dCksXG4gICAgICAgIHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3IgPSBub2RlVmVyaWZpZWQ7ICAvLy9cblxuICByZXR1cm4gc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvcjtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uKHN0YXRlbWVudE5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZEFzVHlwZUFzc2VydGlvbiA9IGZhbHNlO1xuXG4gIGNvbnN0IHR5cGVBc3NlcnRpb25Ob2RlID0gdHlwZUFzc2VydGlvbk5vZGVRdWVyeShzdGF0ZW1lbnROb2RlKTtcblxuICBpZiAodHlwZUFzc2VydGlvbk5vZGUgIT09IG51bGwpIHtcbiAgICBjb25zdCB0eXBlQXNzZXJ0aW9uVmVyaWZpZWQgPSB2ZXJpZnlUeXBlQXNzZXJ0aW9uKHR5cGVBc3NlcnRpb25Ob2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgY29udGV4dCk7XG5cbiAgICBzdGF0ZW1lbnRWZXJpZmllZEFzVHlwZUFzc2VydGlvbiA9IHR5cGVBc3NlcnRpb25WZXJpZmllZDsgLy8vXG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmVyaWZpZWRBc1R5cGVBc3NlcnRpb247XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVN0YXRlbWVudEFzRXF1YWxpdHkoc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSA9IGZhbHNlO1xuXG4gIGNvbnN0IGNvbWJpbmF0b3IgPSBlcXVhbGl0eUNvbWJpbmF0b3IsICAvLy9cbiAgICAgICAgc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvciA9IHZlcmlmeVN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9yKHN0YXRlbWVudE5vZGUsIGNvbWJpbmF0b3IsIGNvbnRleHQpO1xuXG4gIGlmIChzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9yKSB7XG4gICAgY29uc3QgZXF1YWxpdHkgPSBFcXVhbGl0eS5mcm9tU3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlKTtcblxuICAgIGlmIChkZXJpdmVkKSB7XG4gICAgICBjb25zdCBlcXVhbGl0aWVzID0gY29udGV4dC5nZXRFcXVhbGl0aWVzKCksXG4gICAgICAgICAgICBlcXVhbGl0eVZlcmlmaWVkID0gZXF1YWxpdHkudmVyaWZ5KGVxdWFsaXRpZXMsIGNvbnRleHQpO1xuXG4gICAgICBzdGF0ZW1lbnRWZXJpZmllZEFzRXF1YWxpdHkgPSBlcXVhbGl0eVZlcmlmaWVkOyAgLy8vXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IFtdLFxuICAgICAgICAgICAgbGVmdFRlcm1Ob2RlID0gZXF1YWxpdHkuZ2V0TGVmdFRlcm1Ob2RlKCksXG4gICAgICAgICAgICByaWdodFRlcm1Ob2RlID0gZXF1YWxpdHkuZ2V0UmlnaHRUZXJtTm9kZSgpLFxuICAgICAgICAgICAgbGVmdFRlcm1WZXJpZmllZEFzVmFyaWFibGUgPSB2ZXJpZnlUZXJtQXNWYXJpYWJsZShsZWZ0VGVybU5vZGUsIHZhcmlhYmxlcywgY29udGV4dCksXG4gICAgICAgICAgICByaWdodFRlcm1WZXJpZmllZEFzVmFyaWFibGUgPSB2ZXJpZnlUZXJtQXNWYXJpYWJsZShyaWdodFRlcm1Ob2RlLCB2YXJpYWJsZXMsIGNvbnRleHQpO1xuXG4gICAgICBpZiAobGVmdFRlcm1WZXJpZmllZEFzVmFyaWFibGUgJiYgcmlnaHRUZXJtVmVyaWZpZWRBc1ZhcmlhYmxlKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0VmFyaWFibGUgPSBmaXJzdCh2YXJpYWJsZXMpLFxuICAgICAgICAgICAgICBzZWNvbmRWYXJpYWJsZSA9IHNlY29uZCh2YXJpYWJsZXMpLFxuICAgICAgICAgICAgICBsZWZ0VmFyaWFibGUgPSBmaXJzdFZhcmlhYmxlLCAvLy9cbiAgICAgICAgICAgICAgcmlnaHRWYXJpYWJsZSA9IHNlY29uZFZhcmlhYmxlLCAvLy9cbiAgICAgICAgICAgICAgbGVmdFZhcmlhYmxlTmFtZSA9IGxlZnRWYXJpYWJsZS5nZXROYW1lKCksXG4gICAgICAgICAgICAgIGxlZnRWYXJpYWJsZVR5cGUgPSBsZWZ0VmFyaWFibGUuZ2V0VHlwZSgpLFxuICAgICAgICAgICAgICByaWdodFZhcmlhYmxlTmFtZSA9IHJpZ2h0VmFyaWFibGUuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICByaWdodFZhcmlhYmxlVHlwZSA9IHJpZ2h0VmFyaWFibGUuZ2V0VHlwZSgpLFxuICAgICAgICAgICAgICBsZWZ0VmFyaWFibGVUeXBlRXF1YWxUb09yU3ViVHlwZU9mT2ZTdXBlclR5cGVPZlJpZ2h0VmFyaWFibGVUeXBlID0gbGVmdFZhcmlhYmxlVHlwZS5pc0VxdWFsVG9PclN1YlR5cGVPZk9mU3VwZXJUeXBlT2YocmlnaHRWYXJpYWJsZVR5cGUpO1xuXG4gICAgICAgIGlmICghbGVmdFZhcmlhYmxlVHlwZUVxdWFsVG9PclN1YlR5cGVPZk9mU3VwZXJUeXBlT2ZSaWdodFZhcmlhYmxlVHlwZSkge1xuICAgICAgICAgIGNvbnN0IGxlZnRWYXJpYWJsZVR5cGVOYW1lID0gbGVmdFZhcmlhYmxlVHlwZS5nZXROYW1lKCksXG4gICAgICAgICAgICAgICAgcmlnaHRWYXJpYWJsZVR5cGVOYW1lID0gcmlnaHRWYXJpYWJsZVR5cGUuZ2V0TmFtZSgpO1xuXG4gICAgICAgICAgY29udGV4dC5lcnJvcihgVGhlIGxlZnQgJyR7bGVmdFZhcmlhYmxlTmFtZX0nIHZhcmlhYmxlJ3MgJyR7bGVmdFZhcmlhYmxlVHlwZU5hbWV9JyB0eXBlIGlzIG5vdCBlcXVhbCB0bywgYSBzdWItdHlwZSBvZiBvciBhIHN1cGVyLXR5cGUgb2YgdGhlIHJpZ2h0ICcke3JpZ2h0VmFyaWFibGVOYW1lfScgdmFyaWFibGUncyAnJHtyaWdodFZhcmlhYmxlVHlwZU5hbWV9JyB0eXBlLmAsIHN0YXRlbWVudE5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGxlZnRWYXJpYWJsZVR5cGVTdXBlclR5cGVPZlJpZ2h0VmFyaWFibGVUeXBlID0gbGVmdFZhcmlhYmxlVHlwZS5pc1N1cGVyVHlwZU9mKHJpZ2h0VmFyaWFibGVUeXBlKSxcbiAgICAgICAgICAgICAgICByaWdodFZhcmlhYmxlVHlwZVN1cGVyVHlwZU9mTGVmdFZhcmlhYmxlVHlwZSA9IHJpZ2h0VmFyaWFibGVUeXBlLmlzU3VwZXJUeXBlT2YobGVmdFZhcmlhYmxlVHlwZSk7XG5cbiAgICAgICAgICBpZiAobGVmdFZhcmlhYmxlVHlwZVN1cGVyVHlwZU9mUmlnaHRWYXJpYWJsZVR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBsZWZ0VmFyaWFibGVOYW1lLCAvLy9cbiAgICAgICAgICAgICAgICAgIHR5cGUgPSByaWdodFZhcmlhYmxlVHlwZSwgIC8vL1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUgPSBWYXJpYWJsZS5mcm9tTmFtZUFuZFR5cGUobmFtZSwgdHlwZSksXG4gICAgICAgICAgICAgICAgICBhc3NpZ25tZW50ID0gQXNzaWdubWVudC5mcm9tVmFyaWFibGUodmFyaWFibGUpO1xuXG4gICAgICAgICAgICBhc3NpZ25tZW50cy5wdXNoKGFzc2lnbm1lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyaWdodFZhcmlhYmxlVHlwZVN1cGVyVHlwZU9mTGVmdFZhcmlhYmxlVHlwZSkge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHJpZ2h0VmFyaWFibGVOYW1lLCAvLy9cbiAgICAgICAgICAgICAgICAgIHR5cGUgPSBsZWZ0VmFyaWFibGVUeXBlLCAgLy8vXG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZSA9IFZhcmlhYmxlLmZyb21OYW1lQW5kVHlwZShuYW1lLCB0eXBlKSxcbiAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnQgPSBBc3NpZ25tZW50LmZyb21WYXJpYWJsZSh2YXJpYWJsZSk7XG5cbiAgICAgICAgICAgIGFzc2lnbm1lbnRzLnB1c2goYXNzaWdubWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3RhdGVtZW50VmVyaWZpZWRBc0VxdWFsaXR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsZWZ0VGVybVZlcmlmaWVkQXNWYXJpYWJsZSkge1xuICAgICAgICBjb25zdCB0eXBlcyA9IFtdO1xuXG4gICAgICAgIHZlcmlmeVRlcm0ocmlnaHRUZXJtTm9kZSwgdHlwZXMsIGNvbnRleHQpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0VHlwZSA9IGZpcnN0KHR5cGVzKSxcbiAgICAgICAgICAgICAgZmlyc3RWYXJpYWJsZSA9IGZpcnN0KHZhcmlhYmxlcyksXG4gICAgICAgICAgICAgIGxlZnRWYXJpYWJsZSA9IGZpcnN0VmFyaWFibGUsIC8vL1xuICAgICAgICAgICAgICByaWdodFRlcm1UeXBlID0gZmlyc3RUeXBlLCAgLy8vXG4gICAgICAgICAgICAgIGxlZnRWYXJpYWJsZU5hbWUgPSBsZWZ0VmFyaWFibGUuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICBsZWZ0VmFyaWFibGVUeXBlID0gbGVmdFZhcmlhYmxlLmdldFR5cGUoKSxcbiAgICAgICAgICAgICAgbGVmdFZhcmlhYmxlVHlwZUVxdWFsVG9PclN1cGVyVHlwZU9mUmlnaHRUZXJtVHlwZSA9IGxlZnRWYXJpYWJsZVR5cGUuaXNFcXVhbFRvT3JTdXBlclR5cGVPZihyaWdodFRlcm1UeXBlKTtcblxuICAgICAgICBpZiAoIWxlZnRWYXJpYWJsZVR5cGVFcXVhbFRvT3JTdXBlclR5cGVPZlJpZ2h0VGVybVR5cGUpIHtcbiAgICAgICAgICBjb25zdCByaWdodFRlcm1TdHJpbmcgPSBjb250ZXh0Lm5vZGVBc1N0cmluZyhyaWdodFRlcm1Ob2RlKSxcbiAgICAgICAgICAgICAgICByaWdodFRlcm1UeXBlTmFtZSA9IHJpZ2h0VGVybVR5cGUuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICAgIGxlZnRWYXJpYWJsZVR5cGVOYW1lID0gbGVmdFZhcmlhYmxlVHlwZS5nZXROYW1lKCk7XG5cbiAgICAgICAgICBjb250ZXh0LmVycm9yKGBUaGUgbGVmdCAnJHtsZWZ0VmFyaWFibGVOYW1lfScgdmFyaWFibGUncyAnJHtsZWZ0VmFyaWFibGVUeXBlTmFtZX0nIHR5cGUgaXMgbm90IGVxdWFsIHRvIG9yIGEgc3VwZXItdHlwZSBvZiB0aGUgcmlnaHQgJyR7cmlnaHRUZXJtU3RyaW5nfScgdGVybSdzICcke3JpZ2h0VGVybVR5cGVOYW1lfScgdHlwZS5gLCBzdGF0ZW1lbnROb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gbGVmdFZhcmlhYmxlTmFtZSwgIC8vL1xuICAgICAgICAgICAgICAgIHR5cGUgPSByaWdodFRlcm1UeXBlLCAvLy9cbiAgICAgICAgICAgICAgICB2YXJpYWJsZSA9IFZhcmlhYmxlLmZyb21OYW1lQW5kVHlwZShuYW1lLCB0eXBlKSxcbiAgICAgICAgICAgICAgICBhc3NpZ25tZW50ID0gQXNzaWdubWVudC5mcm9tVmFyaWFibGUodmFyaWFibGUpO1xuXG4gICAgICAgICAgYXNzaWdubWVudHMucHVzaChhc3NpZ25tZW50KTtcblxuICAgICAgICAgIHN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmlnaHRUZXJtVmVyaWZpZWRBc1ZhcmlhYmxlKSB7XG4gICAgICAgIGNvbnN0IHR5cGVzID0gW107XG5cbiAgICAgICAgdmVyaWZ5VGVybShsZWZ0VGVybU5vZGUsIHR5cGVzLCBjb250ZXh0KTtcblxuICAgICAgICBjb25zdCBmaXJzdFR5cGUgPSBmaXJzdCh0eXBlcyksXG4gICAgICAgICAgICAgIGZpcnN0VmFyaWFibGUgPSBmaXJzdCh2YXJpYWJsZXMpLFxuICAgICAgICAgICAgICBsZWZ0VGVybVR5cGUgPSBmaXJzdFR5cGUsICAvLy9cbiAgICAgICAgICAgICAgcmlnaHRWYXJpYWJsZSA9IGZpcnN0VmFyaWFibGUsIC8vL1xuICAgICAgICAgICAgICByaWdodFZhcmlhYmxlTmFtZSA9IHJpZ2h0VmFyaWFibGUuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICByaWdodFZhcmlhYmxlVHlwZSA9IHJpZ2h0VmFyaWFibGUuZ2V0VHlwZSgpLFxuICAgICAgICAgICAgICByaWdodFZhcmlhYmxlVHlwZUVxdWFsVG9PclN1cGVyVHlwZU9mUmlnaHRUZXJtVHlwZSA9IHJpZ2h0VmFyaWFibGVUeXBlLmlzRXF1YWxUb09yU3VwZXJUeXBlT2YobGVmdFRlcm1UeXBlKTtcblxuICAgICAgICBpZiAoIXJpZ2h0VmFyaWFibGVUeXBlRXF1YWxUb09yU3VwZXJUeXBlT2ZSaWdodFRlcm1UeXBlKSB7XG4gICAgICAgICAgY29uc3QgbGVmdFRlcm1TdHJpbmcgPSBjb250ZXh0Lm5vZGVBc1N0cmluZyhsZWZ0VGVybU5vZGUpLFxuICAgICAgICAgICAgICAgIGxlZnRUZXJtVHlwZU5hbWUgPSBsZWZ0VGVybVR5cGUuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICAgIHJpZ2h0VmFyaWFibGVUeXBlTmFtZSA9IHJpZ2h0VmFyaWFibGVUeXBlLmdldE5hbWUoKTtcblxuICAgICAgICAgIGNvbnRleHQuZXJyb3IoYFRoZSByaWdodCAnJHtyaWdodFZhcmlhYmxlTmFtZX0nIHZhcmlhYmxlJ3MgJyR7cmlnaHRWYXJpYWJsZVR5cGVOYW1lfScgdHlwZSBpcyBub3QgZXF1YWwgdG8gb3IgYSBzdXBlci10eXBlIG9mIHRoZSBsZWZ0ICcke2xlZnRUZXJtU3RyaW5nfScgdGVybSdzICcke2xlZnRUZXJtVHlwZU5hbWV9JyB0eXBlLmAsIHN0YXRlbWVudE5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSByaWdodFZhcmlhYmxlTmFtZSwgIC8vL1xuICAgICAgICAgICAgICAgIHR5cGUgPSBsZWZ0VGVybVR5cGUsIC8vL1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlID0gVmFyaWFibGUuZnJvbU5hbWVBbmRUeXBlKG5hbWUsIHR5cGUpLFxuICAgICAgICAgICAgICAgIGFzc2lnbm1lbnQgPSBBc3NpZ25tZW50LmZyb21WYXJpYWJsZSh2YXJpYWJsZSk7XG5cbiAgICAgICAgICBhc3NpZ25tZW50cy5wdXNoKGFzc2lnbm1lbnQpO1xuXG4gICAgICAgICAgc3RhdGVtZW50VmVyaWZpZWRBc0VxdWFsaXR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBbXTtcblxuICAgICAgICB2ZXJpZnlUZXJtKGxlZnRUZXJtTm9kZSwgdHlwZXMsIGNvbnRleHQpO1xuXG4gICAgICAgIHZlcmlmeVRlcm0ocmlnaHRUZXJtTm9kZSwgdHlwZXMsIGNvbnRleHQpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0VHlwZSA9IGZpcnN0KHR5cGVzKSxcbiAgICAgICAgICAgICAgc2Vjb25kVHlwZSA9IHNlY29uZCh0eXBlcyksXG4gICAgICAgICAgICAgIGxlZnRUZXJtVHlwZSA9IGZpcnN0VHlwZSwgLy8vXG4gICAgICAgICAgICAgIHJpZ2h0VGVybVR5cGUgPSBzZWNvbmRUeXBlLCAvLy9cbiAgICAgICAgICAgICAgbGVmdFRlcm1UeXBlRXF1YWxUb09yU3ViVHlwZU9mT2ZTdXBlclR5cGVPZiA9IGxlZnRUZXJtVHlwZS5pc0VxdWFsVG9PclN1YlR5cGVPZk9mU3VwZXJUeXBlT2YocmlnaHRUZXJtVHlwZSk7XG5cbiAgICAgICAgaWYgKCFsZWZ0VGVybVR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZPZlN1cGVyVHlwZU9mKSB7XG4gICAgICAgICAgY29uc3QgbGVmdFRlcm1TdHJpbmcgPSBjb250ZXh0Lm5vZGVBc1N0cmluZyhsZWZ0VGVybU5vZGUpLFxuICAgICAgICAgICAgICAgIHJpZ2h0VGVybVN0cmluZyA9IGNvbnRleHQubm9kZUFzU3RyaW5nKHJpZ2h0VGVybU5vZGUpLFxuICAgICAgICAgICAgICAgIGxlZnRUZXJtVHlwZU5hbWUgPSBsZWZ0VGVybVR5cGUuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICAgIHJpZ2h0VGVybVR5cGVOYW1lID0gcmlnaHRUZXJtVHlwZS5nZXROYW1lKCk7XG5cbiAgICAgICAgICBjb250ZXh0LmVycm9yKGBUaGUgbGVmdCAnJHtsZWZ0VGVybVN0cmluZ30nIHRlcm0ncyAnJHtsZWZ0VGVybVR5cGVOYW1lfScgdHlwZSBpcyBub3QgZXF1YWwgdG8sIGEgc3ViLXR5cGUgb2Ygb3IgYSBzdXBlci10eXBlIG9mIHRoZSByaWdodCAnJHtyaWdodFRlcm1TdHJpbmd9JyB0ZXJtJ3MgJyR7cmlnaHRUZXJtVHlwZU5hbWV9JyB0eXBlLmAsIHN0YXRlbWVudE5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGVtZW50VmVyaWZpZWRBc0VxdWFsaXR5KSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gY29udGV4dC5ub2RlQXNTdHJpbmcoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICBjb250ZXh0LmluZm8oYFZlcmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgYXMgYW4gZXF1YWxpdHkuYCwgc3RhdGVtZW50Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGVtZW50VmVyaWZpZWRBc0VxdWFsaXR5O1xufVxuIl0sIm5hbWVzIjpbInZlcmlmeVN0YXRlbWVudCIsInRlcm1Ob2RlUXVlcnkiLCJub2RlUXVlcnkiLCJ0eXBlTm9kZVF1ZXJ5IiwibWV0YVR5cGVOb2RlUXVlcnkiLCJzdGF0ZW1lbnROb2RlUXVlcnkiLCJ0eXBlQXNzZXJ0aW9uTm9kZVF1ZXJ5IiwibWV0YVR5cGVUZXJtaW5hbE5vZGVRdWVyeSIsInN0YXRlbWVudE5vZGUiLCJhc3NpZ25tZW50cyIsImRlcml2ZWQiLCJjb250ZXh0Iiwic3RhdGVtZW50VmVyaWZpZWQiLCJzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9ycyIsInZlcmlmeVN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9ycyIsInN0YXRlbWVudFZlcmlmaWVkQXNUeXBlQXNzZXJ0aW9uIiwidmVyaWZ5U3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uIiwic3RhdGVtZW50VmVyaWZpZWRBc0VxdWFsaXR5IiwidmVyaWZ5U3RhdGVtZW50QXNFcXVhbGl0eSIsIlN0YXRlbWVudFZlcmlmaWVyIiwidmVyaWZ5Tm9uVGVybWluYWxOb2RlIiwibm9uVGVybWluYWxOb2RlQSIsIm5vblRlcm1pbmFsTm9kZUIiLCJub25UZXJtaW5hbE5vZGVWZXJpZmllZCIsIm5vblRlcm1pbmFsTm9kZSIsImNvbWJpbmF0b3JOb25UZXJtaW5hbE5vZGUiLCJydWxlTmFtZSIsImdldFJ1bGVOYW1lIiwiY29tYmluYXRvclJ1bGVOYW1lIiwiQVJHVU1FTlRfUlVMRV9OQU1FIiwiYXJndW1lbnROb2RlIiwiY29tYmluYXRvckFyZ3VtZW50Tm9kZSIsImFyZ3VtZW50Tm9kZVZlcmlmaWVkIiwidmVyaWZ5QXJndW1lbnROb2RlIiwiTUVUQV9BUkdVTUVOVF9SVUxFX05BTUUiLCJtZXRhQXJndW1lbnROb2RlIiwiY29tYmluYXRvck1ldGFhcmd1bWVudE5vZGUiLCJtZXRhQXJndW1lbnROb2RlVmVyaWZpZWQiLCJ2ZXJpZnlNZXRhYXJndW1lbnROb2RlIiwiY2hpbGROb2RlcyIsImdldENoaWxkTm9kZXMiLCJjb21iaW5hdG9yQ2hpbGROb2RlcyIsIm5vZGVzQSIsIm5vZGVzQiIsIm5vZGVzVmVyaWZpZWQiLCJ2ZXJpZnlOb2RlcyIsInRlcm1Ob2RlIiwiYXJndW1lbnRTdHJpbmciLCJub2RlQXNTdHJpbmciLCJlcnJvciIsInR5cGVzIiwidGVybVZlcmlmaWVkIiwidmVyaWZ5VGVybSIsImZpcnN0VHlwZSIsImZpcnN0IiwidGVybVR5cGUiLCJ0eXBlTm9kZSIsInR5cGVOYW1lIiwidHlwZU5hbWVGcm9tVHlwZU5vZGUiLCJ0eXBlIiwiT0JKRUNUX1RZUEVfTkFNRSIsIm9iamVjdFR5cGUiLCJmaW5kVHlwZUJ5VHlwZU5hbWUiLCJzdGF0ZW1lbnRUeXBlRXF1YWxUb09yU3ViVHlwZU9mVHlwZSIsImlzRXF1YWxUb09yU3ViVHlwZU9mIiwiY29tYmluYXRvck1ldGFUWXBlTm9kZSIsIm1ldGFBcmd1bWVudFN0cmluZyIsImNvbWJpbmF0b3JNZXRhYXJndW1lbnRTdHJpbmciLCJjb21iaW5hdG9yTWV0YVR5cGVUZXJtaW5hbE5vZGUiLCJjb250ZW50IiwiZ2V0Q29udGVudCIsImNvbnRlbnRTdGF0ZW1lbnRNZXRhVHlwZSIsIlNUQVRFTUVOVF9NRVRBX1RZUEUiLCJWZXJpZmllciIsInN0YXRlbWVudFZlcmlmaWVyIiwiY29tYmluYXRvcnMiLCJnZXRDb21iaW5hdG9ycyIsImJyYWNrZXRlZENvbWJpbmF0b3IiLCJjb21iaW5hdG9yIiwiZmluZCIsInN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3IiLCJ2ZXJpZnlTdGF0ZW1lbnRBZ2FpbnN0Q29tYmluYXRvciIsImNvbWJpbmF0b3JTdGF0ZW1lbnROb2RlIiwiZ2V0U3RhdGVtZW50Tm9kZSIsIm5vZGVWZXJpZmllZCIsInR5cGVBc3NlcnRpb25Ob2RlIiwidHlwZUFzc2VydGlvblZlcmlmaWVkIiwidmVyaWZ5VHlwZUFzc2VydGlvbiIsImVxdWFsaXR5Q29tYmluYXRvciIsImVxdWFsaXR5IiwiRXF1YWxpdHkiLCJmcm9tU3RhdGVtZW50Tm9kZSIsImVxdWFsaXRpZXMiLCJnZXRFcXVhbGl0aWVzIiwiZXF1YWxpdHlWZXJpZmllZCIsInZlcmlmeSIsInZhcmlhYmxlcyIsImxlZnRUZXJtTm9kZSIsImdldExlZnRUZXJtTm9kZSIsInJpZ2h0VGVybU5vZGUiLCJnZXRSaWdodFRlcm1Ob2RlIiwibGVmdFRlcm1WZXJpZmllZEFzVmFyaWFibGUiLCJ2ZXJpZnlUZXJtQXNWYXJpYWJsZSIsInJpZ2h0VGVybVZlcmlmaWVkQXNWYXJpYWJsZSIsImZpcnN0VmFyaWFibGUiLCJzZWNvbmRWYXJpYWJsZSIsInNlY29uZCIsImxlZnRWYXJpYWJsZSIsInJpZ2h0VmFyaWFibGUiLCJsZWZ0VmFyaWFibGVOYW1lIiwiZ2V0TmFtZSIsImxlZnRWYXJpYWJsZVR5cGUiLCJnZXRUeXBlIiwicmlnaHRWYXJpYWJsZU5hbWUiLCJyaWdodFZhcmlhYmxlVHlwZSIsImxlZnRWYXJpYWJsZVR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZPZlN1cGVyVHlwZU9mUmlnaHRWYXJpYWJsZVR5cGUiLCJpc0VxdWFsVG9PclN1YlR5cGVPZk9mU3VwZXJUeXBlT2YiLCJsZWZ0VmFyaWFibGVUeXBlTmFtZSIsInJpZ2h0VmFyaWFibGVUeXBlTmFtZSIsImxlZnRWYXJpYWJsZVR5cGVTdXBlclR5cGVPZlJpZ2h0VmFyaWFibGVUeXBlIiwiaXNTdXBlclR5cGVPZiIsInJpZ2h0VmFyaWFibGVUeXBlU3VwZXJUeXBlT2ZMZWZ0VmFyaWFibGVUeXBlIiwibmFtZSIsInZhcmlhYmxlIiwiVmFyaWFibGUiLCJmcm9tTmFtZUFuZFR5cGUiLCJhc3NpZ25tZW50IiwiQXNzaWdubWVudCIsImZyb21WYXJpYWJsZSIsInB1c2giLCJyaWdodFRlcm1UeXBlIiwibGVmdFZhcmlhYmxlVHlwZUVxdWFsVG9PclN1cGVyVHlwZU9mUmlnaHRUZXJtVHlwZSIsImlzRXF1YWxUb09yU3VwZXJUeXBlT2YiLCJyaWdodFRlcm1TdHJpbmciLCJyaWdodFRlcm1UeXBlTmFtZSIsImxlZnRUZXJtVHlwZSIsInJpZ2h0VmFyaWFibGVUeXBlRXF1YWxUb09yU3VwZXJUeXBlT2ZSaWdodFRlcm1UeXBlIiwibGVmdFRlcm1TdHJpbmciLCJsZWZ0VGVybVR5cGVOYW1lIiwic2Vjb25kVHlwZSIsImxlZnRUZXJtVHlwZUVxdWFsVG9PclN1YlR5cGVPZk9mU3VwZXJUeXBlT2YiLCJzdGF0ZW1lbnRTdHJpbmciLCJpbmZvIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkEwQkE7OztlQUF3QkE7Ozs2REF4Qkg7NkRBQ0E7NkRBQ0E7K0RBQ0U7MERBQ0E7OERBQ1E7OERBQ0M7eURBQ0E7cUJBRUw7cUJBQ0c7eUJBQ0c7eUJBQ0c7cUJBRVk7eUJBQ1k7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTVELElBQU1DLGdCQUFnQkMsSUFBQUEsZ0JBQVMsRUFBQyxvQkFDMUJDLGdCQUFnQkQsSUFBQUEsZ0JBQVMsRUFBQyxvQkFDMUJFLG9CQUFvQkYsSUFBQUEsZ0JBQVMsRUFBQyw0QkFDOUJHLHFCQUFxQkgsSUFBQUEsZ0JBQVMsRUFBQyw2QkFDL0JJLHlCQUF5QkosSUFBQUEsZ0JBQVMsRUFBQyw4QkFDbkNLLDRCQUE0QkwsSUFBQUEsZ0JBQVMsRUFBQztBQUU3QixTQUFTRixnQkFBZ0JRLGFBQWEsRUFBRUMsV0FBVyxFQUFFQyxPQUFPLEVBQUVDLE9BQU8sRUFBRTtJQUNwRixJQUFJQyxvQkFBb0IsS0FBSztJQUU3QixJQUFJLENBQUNBLG1CQUFtQjtRQUN0QixJQUFNQyxzQ0FBc0NDLGtDQUFrQ04sZUFBZUc7UUFFN0ZDLG9CQUFvQkMscUNBQXNDLEdBQUc7SUFDL0QsQ0FBQztJQUVELElBQUksQ0FBQ0QsbUJBQW1CO1FBQ3RCLElBQU1HLG1DQUFtQ0MsK0JBQStCUixlQUFlQyxhQUFhQyxTQUFTQztRQUU3R0Msb0JBQW9CRyxrQ0FBa0MsR0FBRztJQUMzRCxDQUFDO0lBRUQsSUFBSSxDQUFDSCxtQkFBbUI7UUFDdEIsSUFBTUssOEJBQThCQywwQkFBMEJW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
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJpZnkvc3RhdGVtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgVmVyaWZpZXIgZnJvbSBcIi4uL3ZlcmlmaWVyXCI7XG5pbXBvcnQgVmFyaWFibGUgZnJvbSBcIi4uL3ZhcmlhYmxlXCI7XG5pbXBvcnQgRXF1YWxpdHkgZnJvbSBcIi4uL2VxdWFsaXR5XCI7XG5pbXBvcnQgQXNzaWdubWVudCBmcm9tIFwiLi4vYXNzaWdubWVudFwiO1xuaW1wb3J0IHZlcmlmeVRlcm0gZnJvbSBcIi4uL3ZlcmlmeS90ZXJtXCI7XG5pbXBvcnQgZXF1YWxpdHlDb21iaW5hdG9yIGZyb20gXCIuLi9vY21iaW5hdG9yL2VxdWFsaXR5XCI7XG5pbXBvcnQgYnJhY2tldGVkQ29tYmluYXRvciBmcm9tIFwiLi4vb2NtYmluYXRvci9icmFja2V0ZWRcIjtcbmltcG9ydCB2ZXJpZnlUeXBlQXNzZXJ0aW9uIGZyb20gXCIuLi92ZXJpZnkvYXNzZXJ0aW9uL3R5cGVcIjtcblxuaW1wb3J0IHsgb2JqZWN0VHlwZSB9IGZyb20gXCIuLi90eXBlXCI7XG5pbXBvcnQgeyBmaXJzdCwgc2Vjb25kIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9hcnJheVwiO1xuaW1wb3J0IHsgT0JKRUNUX1RZUEVfTkFNRSB9IGZyb20gXCIuLi90eXBlTmFtZXNcIjtcbmltcG9ydCB7IFNUQVRFTUVOVF9NRVRBX1RZUEUgfSBmcm9tIFwiLi4vbWV0YVR5cGVzXCI7XG5pbXBvcnQgeyB2ZXJpZnlUZXJtQXNWYXJpYWJsZSB9IGZyb20gXCIuLi92ZXJpZnkvdGVybVwiO1xuaW1wb3J0IHsgbm9kZVF1ZXJ5LCB0eXBlTmFtZUZyb21UeXBlTm9kZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvcXVlcnlcIjtcbmltcG9ydCB7IEFSR1VNRU5UX1JVTEVfTkFNRSwgTUVUQV9BUkdVTUVOVF9SVUxFX05BTUUgfSBmcm9tIFwiLi4vcnVsZU5hbWVzXCI7XG5cbmNvbnN0IHRlcm1Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvYXJndW1lbnQvdGVybSFcIiksXG4gICAgICB0eXBlTm9kZVF1ZXJ5ID0gbm9kZVF1ZXJ5KFwiL2FyZ3VtZW50L3R5cGUhXCIpLFxuICAgICAgbWV0YVR5cGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvbWV0YUFyZ3VtZW50L21ldGFUeXBlIVwiKSxcbiAgICAgIHN0YXRlbWVudE5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9tZXRhQXJndW1lbnQvc3RhdGVtZW50IVwiKSxcbiAgICAgIHR5cGVBc3NlcnRpb25Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvc3RhdGVtZW50L3R5cGVBc3NlcnRpb24hXCIpLFxuICAgICAgbWV0YVR5cGVUZXJtaW5hbE5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi9tZXRhVHlwZS9AbWV0YS10eXBlXCIpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlTdGF0ZW1lbnQoc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGNvbnRleHQpIHtcbiAgbGV0IHN0YXRlbWVudFZlcmlmaWVkID0gZmFsc2U7XG5cbiAgaWYgKCFzdGF0ZW1lbnRWZXJpZmllZCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3JzID0gdmVyaWZ5U3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3JzKHN0YXRlbWVudE5vZGUsIGNvbnRleHQpO1xuXG4gICAgc3RhdGVtZW50VmVyaWZpZWQgPSBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9yczsgIC8vL1xuICB9XG5cbiAgaWYgKCFzdGF0ZW1lbnRWZXJpZmllZCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFZlcmlmaWVkQXNUeXBlQXNzZXJ0aW9uID0gdmVyaWZ5U3RhdGVtZW50QXNUeXBlQXNzZXJ0aW9uKHN0YXRlbWVudE5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBjb250ZXh0KTtcblxuICAgIHN0YXRlbWVudFZlcmlmaWVkID0gc3RhdGVtZW50VmVyaWZpZWRBc1R5cGVBc3NlcnRpb247IC8vL1xuICB9XG5cbiAgaWYgKCFzdGF0ZW1lbnRWZXJpZmllZCkge1xuICAgIGNvbnN0IHN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSA9IHZlcmlmeVN0YXRlbWVudEFzRXF1YWxpdHkoc3RhdGVtZW50Tm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGNvbnRleHQpO1xuXG4gICAgc3RhdGVtZW50VmVyaWZpZWQgPSBzdGF0ZW1lbnRWZXJpZmllZEFzRXF1YWxpdHk7ICAvL1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkO1xufVxuXG5jbGFzcyBTdGF0ZW1lbnRWZXJpZmllciBleHRlbmRzIFZlcmlmaWVyIHtcbiAgdmVyaWZ5Tm9uVGVybWluYWxOb2RlKG5vblRlcm1pbmFsTm9kZUEsIG5vblRlcm1pbmFsTm9kZUIsIGNvbnRleHQpIHtcbiAgICBsZXQgbm9uVGVybWluYWxOb2RlVmVyaWZpZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IG5vblRlcm1pbmFsTm9kZSA9IG5vblRlcm1pbmFsTm9kZUEsIC8vL1xuICAgICAgICAgIGNvbWJpbmF0b3JOb25UZXJtaW5hbE5vZGUgPSBub25UZXJtaW5hbE5vZGVCOyAvLy9cblxuICAgIGNvbnN0IHJ1bGVOYW1lID0gbm9uVGVybWluYWxOb2RlLmdldFJ1bGVOYW1lKCksIC8vL1xuICAgICAgY29tYmluYXRvclJ1bGVOYW1lID0gY29tYmluYXRvck5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpOyAvLy9cblxuICAgIGlmIChydWxlTmFtZSA9PT0gY29tYmluYXRvclJ1bGVOYW1lKSB7XG4gICAgICBzd2l0Y2ggKHJ1bGVOYW1lKSB7XG4gICAgICAgIGNhc2UgQVJHVU1FTlRfUlVMRV9OQU1FOiB7XG4gICAgICAgICAgY29uc3QgYXJndW1lbnROb2RlID0gbm9uVGVybWluYWxOb2RlLCAvLy9cbiAgICAgICAgICAgICAgICBjb21iaW5hdG9yQXJndW1lbnROb2RlID0gY29tYmluYXRvck5vblRlcm1pbmFsTm9kZSwgLy8vXG4gICAgICAgICAgICAgICAgYXJndW1lbnROb2RlVmVyaWZpZWQgPSB0aGlzLnZlcmlmeUFyZ3VtZW50Tm9kZShhcmd1bWVudE5vZGUsIGNvbWJpbmF0b3JBcmd1bWVudE5vZGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgbm9uVGVybWluYWxOb2RlVmVyaWZpZWQgPSBhcmd1bWVudE5vZGVWZXJpZmllZDsgLy8vXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgTUVUQV9BUkdVTUVOVF9SVUxFX05BTUU6IHtcbiAgICAgICAgICBjb25zdCBtZXRhQXJndW1lbnROb2RlID0gbm9uVGVybWluYWxOb2RlLCAvLy9cbiAgICAgICAgICAgICAgICBjb21iaW5hdG9yTWV0YWFyZ3VtZW50Tm9kZSA9IGNvbWJpbmF0b3JOb25UZXJtaW5hbE5vZGUsIC8vL1xuICAgICAgICAgICAgICAgIG1ldGFBcmd1bWVudE5vZGVWZXJpZmllZCA9IHRoaXMudmVyaWZ5TWV0YWFyZ3VtZW50Tm9kZShtZXRhQXJndW1lbnROb2RlLCBjb21iaW5hdG9yTWV0YWFyZ3VtZW50Tm9kZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBub25UZXJtaW5hbE5vZGVWZXJpZmllZCA9IG1ldGFBcmd1bWVudE5vZGVWZXJpZmllZDsgLy8vXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gbm9uVGVybWluYWxOb2RlLmdldENoaWxkTm9kZXMoKSxcbiAgICAgICAgICAgICAgICBjb21iaW5hdG9yQ2hpbGROb2RlcyA9IGNvbWJpbmF0b3JOb25UZXJtaW5hbE5vZGUuZ2V0Q2hpbGROb2RlcygpLFxuICAgICAgICAgICAgICAgIG5vZGVzQSA9IGNoaWxkTm9kZXMsIC8vL1xuICAgICAgICAgICAgICAgIG5vZGVzQiA9IGNvbWJpbmF0b3JDaGlsZE5vZGVzLCAvLy9cbiAgICAgICAgICAgICAgICBub2Rlc1ZlcmlmaWVkID0gdGhpcy52ZXJpZnlOb2Rlcyhub2Rlc0EsIG5vZGVzQiwgY29udGV4dCk7XG5cbiAgICAgICAgICBub25UZXJtaW5hbE5vZGVWZXJpZmllZCA9IG5vZGVzVmVyaWZpZWQ7IC8vL1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9uVGVybWluYWxOb2RlVmVyaWZpZWQ7XG4gIH1cblxuICB2ZXJpZnlBcmd1bWVudE5vZGUoYXJndW1lbnROb2RlLCBjb21iaW5hdG9yQXJndW1lbnROb2RlLCBjb250ZXh0KSB7XG4gICAgbGV0IGFyZ3VtZW50Tm9kZVZlcmlmaWVkID0gZmFsc2U7XG5cbiAgICBjb25zdCB0ZXJtTm9kZSA9IHRlcm1Ob2RlUXVlcnkoYXJndW1lbnROb2RlKTtcblxuICAgIGlmICh0ZXJtTm9kZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgYXJndW1lbnRTdHJpbmcgPSBjb250ZXh0Lm5vZGVBc1N0cmluZyhhcmd1bWVudE5vZGUpO1xuXG4gICAgICBjb250ZXh0LmVycm9yKGBUaGUgJHthcmd1bWVudFN0cmluZ30gYXJndW1lbnQgc2hvdWxkIGJlIGEgdGVybSwgbm90IGEgdHlwZWAsIGFyZ3VtZW50Tm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGVzID0gW10sXG4gICAgICAgICAgICB0ZXJtVmVyaWZpZWQgPSB2ZXJpZnlUZXJtKHRlcm1Ob2RlLCB0eXBlcywgY29udGV4dCk7XG5cbiAgICAgIGlmICh0ZXJtVmVyaWZpZWQpIHtcbiAgICAgICAgY29uc3QgZmlyc3RUeXBlID0gZmlyc3QodHlwZXMpLFxuICAgICAgICAgICAgICB0ZXJtVHlwZSA9IGZpcnN0VHlwZSwgLy8vXG4gICAgICAgICAgICAgIHR5cGVOb2RlID0gdHlwZU5vZGVRdWVyeShjb21iaW5hdG9yQXJndW1lbnROb2RlKSxcbiAgICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZUZyb21UeXBlTm9kZSh0eXBlTm9kZSksXG4gICAgICAgICAgICAgIHR5cGUgPSAodHlwZU5hbWUgPT09IE9CSkVDVF9UWVBFX05BTUUpID9cbiAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA6ICAvLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmZpbmRUeXBlQnlUeXBlTmFtZSh0eXBlTmFtZSksXG4gICAgICAgICAgICAgIHN0YXRlbWVudFR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUeXBlID0gdGVybVR5cGUuaXNFcXVhbFRvT3JTdWJUeXBlT2YodHlwZSk7XG5cbiAgICAgICAgaWYgKHN0YXRlbWVudFR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUeXBlKSB7XG4gICAgICAgICAgYXJndW1lbnROb2RlVmVyaWZpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZ3VtZW50Tm9kZVZlcmlmaWVkO1xuICB9XG5cbiAgdmVyaWZ5TWV0YWFyZ3VtZW50Tm9kZShtZXRhQXJndW1lbnROb2RlLCBjb21iaW5hdG9yTWV0YWFyZ3VtZW50Tm9kZSwgY29udGV4dCkge1xuICAgIGxldCBtZXRhQXJndW1lbnROb2RlVmVyaWZpZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnROb2RlUXVlcnkobWV0YUFyZ3VtZW50Tm9kZSksXG4gICAgICAgICAgY29tYmluYXRvck1ldGFUWXBlTm9kZSA9IG1ldGFUeXBlTm9kZVF1ZXJ5KGNvbWJpbmF0b3JNZXRhYXJndW1lbnROb2RlKTtcblxuICAgIGlmIChzdGF0ZW1lbnROb2RlID09PSBudWxsKSB7XG4gICAgICBjb25zdCBtZXRhQXJndW1lbnRTdHJpbmcgPSBjb250ZXh0Lm5vZGVBc1N0cmluZyhtZXRhQXJndW1lbnROb2RlKTtcblxuICAgICAgY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYSBzdGF0ZW1lbnQgYnV0IGdvdCBhICcke21ldGFBcmd1bWVudFN0cmluZ30nIG1ldGEtdHlwZS5gLCBtZXRhQXJndW1lbnROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNvbWJpbmF0b3JNZXRhVFlwZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY29tYmluYXRvck1ldGFhcmd1bWVudFN0cmluZyA9IGNvbnRleHQubm9kZUFzU3RyaW5nKGNvbWJpbmF0b3JNZXRhYXJndW1lbnROb2RlKTtcblxuICAgICAgICBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhIG1ldGEtdHlwZSBidXQgZ290IGEgJyR7Y29tYmluYXRvck1ldGFhcmd1bWVudFN0cmluZ30nIHN0YXRlbWVudC5gLCBtZXRhQXJndW1lbnROb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbWJpbmF0b3JNZXRhVHlwZVRlcm1pbmFsTm9kZSA9IG1ldGFUeXBlVGVybWluYWxOb2RlUXVlcnkoY29tYmluYXRvck1ldGFUWXBlTm9kZSksXG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBjb21iaW5hdG9yTWV0YVR5cGVUZXJtaW5hbE5vZGUuZ2V0Q29udGVudCgpLFxuICAgICAgICAgICAgICBjb250ZW50U3RhdGVtZW50TWV0YVR5cGUgPSAoY29udGVudCA9PT0gU1RBVEVNRU5UX01FVEFfVFlQRSk7XG5cbiAgICAgICAgaWYgKCFjb250ZW50U3RhdGVtZW50TWV0YVR5cGUpIHtcbiAgICAgICAgICBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0aGUgbWV0YS10eXBlIHRvIGJlICdTdGF0ZW1lbnQnIGJ1dCBnb3QgJyR7Y29udGVudH0nLmAsIG1ldGFBcmd1bWVudE5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1ldGFBcmd1bWVudE5vZGVWZXJpZmllZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YUFyZ3VtZW50Tm9kZVZlcmlmaWVkO1xuICB9XG59XG5cbmNvbnN0IHN0YXRlbWVudFZlcmlmaWVyID0gbmV3IFN0YXRlbWVudFZlcmlmaWVyKCk7XG5cbmZ1bmN0aW9uIHZlcmlmeVN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9ycyhzdGF0ZW1lbnROb2RlLCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9ycyA9IGZhbHNlO1xuXG4gIGxldCBjb21iaW5hdG9ycyA9IGNvbnRleHQuZ2V0Q29tYmluYXRvcnMoKTtcblxuICBjb21iaW5hdG9ycyA9IFsgLy8vXG4gICAgYnJhY2tldGVkQ29tYmluYXRvcixcbiAgICAuLi5jb21iaW5hdG9yc1xuICBdO1xuXG4gIGNvbnN0IGNvbWJpbmF0b3IgPSBjb21iaW5hdG9ycy5maW5kKChjb21iaW5hdG9yKSA9PiB7XG4gICAgY29uc3Qgc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvciA9IHZlcmlmeVN0YXRlbWVudEFnYWluc3RDb21iaW5hdG9yKHN0YXRlbWVudE5vZGUsIGNvbWJpbmF0b3IsIGNvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3IpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSkgfHwgbnVsbDtcblxuICBpZiAoY29tYmluYXRvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3JzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9ycztcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3Ioc3RhdGVtZW50Tm9kZSwgY29tYmluYXRvciwgY29udGV4dCkge1xuICBjb25zdCBjb21iaW5hdG9yU3RhdGVtZW50Tm9kZSA9IGNvbWJpbmF0b3IuZ2V0U3RhdGVtZW50Tm9kZSgpLFxuICAgICAgICBub25UZXJtaW5hbE5vZGVBID0gc3RhdGVtZW50Tm9kZSwgIC8vL1xuICAgICAgICBub25UZXJtaW5hbE5vZGVCID0gY29tYmluYXRvclN0YXRlbWVudE5vZGUsIC8vL1xuICAgICAgICBub25UZXJtaW5hbE5vZGVWZXJpZmllZCA9IHN0YXRlbWVudFZlcmlmaWVyLnZlcmlmeU5vblRlcm1pbmFsTm9kZShub25UZXJtaW5hbE5vZGVBLCBub25UZXJtaW5hbE5vZGVCLCBjb250ZXh0KSxcbiAgICAgICAgc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvciA9IG5vblRlcm1pbmFsTm9kZVZlcmlmaWVkOyAgLy8vXG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3I7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVN0YXRlbWVudEFzVHlwZUFzc2VydGlvbihzdGF0ZW1lbnROb2RlLCBhc3NpZ25tZW50cywgZGVyaXZlZCwgY29udGV4dCkge1xuICBsZXQgc3RhdGVtZW50VmVyaWZpZWRBc1R5cGVBc3NlcnRpb24gPSBmYWxzZTtcblxuICBjb25zdCB0eXBlQXNzZXJ0aW9uTm9kZSA9IHR5cGVBc3NlcnRpb25Ob2RlUXVlcnkoc3RhdGVtZW50Tm9kZSk7XG5cbiAgaWYgKHR5cGVBc3NlcnRpb25Ob2RlICE9PSBudWxsKSB7XG4gICAgY29uc3QgdHlwZUFzc2VydGlvblZlcmlmaWVkID0gdmVyaWZ5VHlwZUFzc2VydGlvbih0eXBlQXNzZXJ0aW9uTm9kZSwgYXNzaWdubWVudHMsIGRlcml2ZWQsIGNvbnRleHQpO1xuXG4gICAgc3RhdGVtZW50VmVyaWZpZWRBc1R5cGVBc3NlcnRpb24gPSB0eXBlQXNzZXJ0aW9uVmVyaWZpZWQ7IC8vL1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkQXNUeXBlQXNzZXJ0aW9uO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlTdGF0ZW1lbnRBc0VxdWFsaXR5KHN0YXRlbWVudE5vZGUsIGFzc2lnbm1lbnRzLCBkZXJpdmVkLCBjb250ZXh0KSB7XG4gIGxldCBzdGF0ZW1lbnRWZXJpZmllZEFzRXF1YWxpdHkgPSBmYWxzZTtcblxuICBjb25zdCBjb21iaW5hdG9yID0gZXF1YWxpdHlDb21iaW5hdG9yLCAgLy8vXG4gICAgICAgIHN0YXRlbWVudFZlcmlmaWVkQWdhaW5zdENvbWJpbmF0b3IgPSB2ZXJpZnlTdGF0ZW1lbnRBZ2FpbnN0Q29tYmluYXRvcihzdGF0ZW1lbnROb2RlLCBjb21iaW5hdG9yLCBjb250ZXh0KTtcblxuICBpZiAoc3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvcikge1xuICAgIGNvbnN0IGVxdWFsaXR5ID0gRXF1YWxpdHkuZnJvbVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICBpZiAoZGVyaXZlZCkge1xuICAgICAgY29uc3QgZXF1YWxpdGllcyA9IGNvbnRleHQuZ2V0RXF1YWxpdGllcygpLFxuICAgICAgICAgICAgZXF1YWxpdHlWZXJpZmllZCA9IGVxdWFsaXR5LnZlcmlmeShlcXVhbGl0aWVzLCBjb250ZXh0KTtcblxuICAgICAgc3RhdGVtZW50VmVyaWZpZWRBc0VxdWFsaXR5ID0gZXF1YWxpdHlWZXJpZmllZDsgIC8vL1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YXJpYWJsZXMgPSBbXSxcbiAgICAgICAgICAgIGxlZnRUZXJtTm9kZSA9IGVxdWFsaXR5LmdldExlZnRUZXJtTm9kZSgpLFxuICAgICAgICAgICAgcmlnaHRUZXJtTm9kZSA9IGVxdWFsaXR5LmdldFJpZ2h0VGVybU5vZGUoKSxcbiAgICAgICAgICAgIGxlZnRUZXJtVmVyaWZpZWRBc1ZhcmlhYmxlID0gdmVyaWZ5VGVybUFzVmFyaWFibGUobGVmdFRlcm1Ob2RlLCB2YXJpYWJsZXMsIGNvbnRleHQpLFxuICAgICAgICAgICAgcmlnaHRUZXJtVmVyaWZpZWRBc1ZhcmlhYmxlID0gdmVyaWZ5VGVybUFzVmFyaWFibGUocmlnaHRUZXJtTm9kZSwgdmFyaWFibGVzLCBjb250ZXh0KTtcblxuICAgICAgaWYgKGxlZnRUZXJtVmVyaWZpZWRBc1ZhcmlhYmxlICYmIHJpZ2h0VGVybVZlcmlmaWVkQXNWYXJpYWJsZSkge1xuICAgICAgICBjb25zdCBmaXJzdFZhcmlhYmxlID0gZmlyc3QodmFyaWFibGVzKSxcbiAgICAgICAgICAgICAgc2Vjb25kVmFyaWFibGUgPSBzZWNvbmQodmFyaWFibGVzKSxcbiAgICAgICAgICAgICAgbGVmdFZhcmlhYmxlID0gZmlyc3RWYXJpYWJsZSwgLy8vXG4gICAgICAgICAgICAgIHJpZ2h0VmFyaWFibGUgPSBzZWNvbmRWYXJpYWJsZSwgLy8vXG4gICAgICAgICAgICAgIGxlZnRWYXJpYWJsZU5hbWUgPSBsZWZ0VmFyaWFibGUuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICBsZWZ0VmFyaWFibGVUeXBlID0gbGVmdFZhcmlhYmxlLmdldFR5cGUoKSxcbiAgICAgICAgICAgICAgcmlnaHRWYXJpYWJsZU5hbWUgPSByaWdodFZhcmlhYmxlLmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgcmlnaHRWYXJpYWJsZVR5cGUgPSByaWdodFZhcmlhYmxlLmdldFR5cGUoKSxcbiAgICAgICAgICAgICAgbGVmdFZhcmlhYmxlVHlwZUVxdWFsVG9PclN1YlR5cGVPZk9mU3VwZXJUeXBlT2ZSaWdodFZhcmlhYmxlVHlwZSA9IGxlZnRWYXJpYWJsZVR5cGUuaXNFcXVhbFRvT3JTdWJUeXBlT2ZPZlN1cGVyVHlwZU9mKHJpZ2h0VmFyaWFibGVUeXBlKTtcblxuICAgICAgICBpZiAoIWxlZnRWYXJpYWJsZVR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZPZlN1cGVyVHlwZU9mUmlnaHRWYXJpYWJsZVR5cGUpIHtcbiAgICAgICAgICBjb25zdCBsZWZ0VmFyaWFibGVUeXBlTmFtZSA9IGxlZnRWYXJpYWJsZVR5cGUuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICAgIHJpZ2h0VmFyaWFibGVUeXBlTmFtZSA9IHJpZ2h0VmFyaWFibGVUeXBlLmdldE5hbWUoKTtcblxuICAgICAgICAgIGNvbnRleHQuZXJyb3IoYFRoZSBsZWZ0ICcke2xlZnRWYXJpYWJsZU5hbWV9JyB2YXJpYWJsZSdzICcke2xlZnRWYXJpYWJsZVR5cGVOYW1lfScgdHlwZSBpcyBub3QgZXF1YWwgdG8sIGEgc3ViLXR5cGUgb2Ygb3IgYSBzdXBlci10eXBlIG9mIHRoZSByaWdodCAnJHtyaWdodFZhcmlhYmxlTmFtZX0nIHZhcmlhYmxlJ3MgJyR7cmlnaHRWYXJpYWJsZVR5cGVOYW1lfScgdHlwZS5gLCBzdGF0ZW1lbnROb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsZWZ0VmFyaWFibGVUeXBlU3VwZXJUeXBlT2ZSaWdodFZhcmlhYmxlVHlwZSA9IGxlZnRWYXJpYWJsZVR5cGUuaXNTdXBlclR5cGVPZihyaWdodFZhcmlhYmxlVHlwZSksXG4gICAgICAgICAgICAgICAgcmlnaHRWYXJpYWJsZVR5cGVTdXBlclR5cGVPZkxlZnRWYXJpYWJsZVR5cGUgPSByaWdodFZhcmlhYmxlVHlwZS5pc1N1cGVyVHlwZU9mKGxlZnRWYXJpYWJsZVR5cGUpO1xuXG4gICAgICAgICAgaWYgKGxlZnRWYXJpYWJsZVR5cGVTdXBlclR5cGVPZlJpZ2h0VmFyaWFibGVUeXBlKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbGVmdFZhcmlhYmxlTmFtZSwgLy8vXG4gICAgICAgICAgICAgICAgICB0eXBlID0gcmlnaHRWYXJpYWJsZVR5cGUsICAvLy9cbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlID0gVmFyaWFibGUuZnJvbU5hbWVBbmRUeXBlKG5hbWUsIHR5cGUpLFxuICAgICAgICAgICAgICAgICAgYXNzaWdubWVudCA9IEFzc2lnbm1lbnQuZnJvbVZhcmlhYmxlKHZhcmlhYmxlKTtcblxuICAgICAgICAgICAgYXNzaWdubWVudHMucHVzaChhc3NpZ25tZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmlnaHRWYXJpYWJsZVR5cGVTdXBlclR5cGVPZkxlZnRWYXJpYWJsZVR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSByaWdodFZhcmlhYmxlTmFtZSwgLy8vXG4gICAgICAgICAgICAgICAgICB0eXBlID0gbGVmdFZhcmlhYmxlVHlwZSwgIC8vL1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUgPSBWYXJpYWJsZS5mcm9tTmFtZUFuZFR5cGUobmFtZSwgdHlwZSksXG4gICAgICAgICAgICAgICAgICBhc3NpZ25tZW50ID0gQXNzaWdubWVudC5mcm9tVmFyaWFibGUodmFyaWFibGUpO1xuXG4gICAgICAgICAgICBhc3NpZ25tZW50cy5wdXNoKGFzc2lnbm1lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobGVmdFRlcm1WZXJpZmllZEFzVmFyaWFibGUpIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBbXTtcblxuICAgICAgICB2ZXJpZnlUZXJtKHJpZ2h0VGVybU5vZGUsIHR5cGVzLCBjb250ZXh0KTtcblxuICAgICAgICBjb25zdCBmaXJzdFR5cGUgPSBmaXJzdCh0eXBlcyksXG4gICAgICAgICAgICAgIGZpcnN0VmFyaWFibGUgPSBmaXJzdCh2YXJpYWJsZXMpLFxuICAgICAgICAgICAgICBsZWZ0VmFyaWFibGUgPSBmaXJzdFZhcmlhYmxlLCAvLy9cbiAgICAgICAgICAgICAgcmlnaHRUZXJtVHlwZSA9IGZpcnN0VHlwZSwgIC8vL1xuICAgICAgICAgICAgICBsZWZ0VmFyaWFibGVOYW1lID0gbGVmdFZhcmlhYmxlLmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgbGVmdFZhcmlhYmxlVHlwZSA9IGxlZnRWYXJpYWJsZS5nZXRUeXBlKCksXG4gICAgICAgICAgICAgIGxlZnRWYXJpYWJsZVR5cGVFcXVhbFRvT3JTdXBlclR5cGVPZlJpZ2h0VGVybVR5cGUgPSBsZWZ0VmFyaWFibGVUeXBlLmlzRXF1YWxUb09yU3VwZXJUeXBlT2YocmlnaHRUZXJtVHlwZSk7XG5cbiAgICAgICAgaWYgKCFsZWZ0VmFyaWFibGVUeXBlRXF1YWxUb09yU3VwZXJUeXBlT2ZSaWdodFRlcm1UeXBlKSB7XG4gICAgICAgICAgY29uc3QgcmlnaHRUZXJtU3RyaW5nID0gY29udGV4dC5ub2RlQXNTdHJpbmcocmlnaHRUZXJtTm9kZSksXG4gICAgICAgICAgICAgICAgcmlnaHRUZXJtVHlwZU5hbWUgPSByaWdodFRlcm1UeXBlLmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICBsZWZ0VmFyaWFibGVUeXBlTmFtZSA9IGxlZnRWYXJpYWJsZVR5cGUuZ2V0TmFtZSgpO1xuXG4gICAgICAgICAgY29udGV4dC5lcnJvcihgVGhlIGxlZnQgJyR7bGVmdFZhcmlhYmxlTmFtZX0nIHZhcmlhYmxlJ3MgJyR7bGVmdFZhcmlhYmxlVHlwZU5hbWV9JyB0eXBlIGlzIG5vdCBlcXVhbCB0byBvciBhIHN1cGVyLXR5cGUgb2YgdGhlIHJpZ2h0ICcke3JpZ2h0VGVybVN0cmluZ30nIHRlcm0ncyAnJHtyaWdodFRlcm1UeXBlTmFtZX0nIHR5cGUuYCwgc3RhdGVtZW50Tm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGxlZnRWYXJpYWJsZU5hbWUsICAvLy9cbiAgICAgICAgICAgICAgICB0eXBlID0gcmlnaHRUZXJtVHlwZSwgLy8vXG4gICAgICAgICAgICAgICAgdmFyaWFibGUgPSBWYXJpYWJsZS5mcm9tTmFtZUFuZFR5cGUobmFtZSwgdHlwZSksXG4gICAgICAgICAgICAgICAgYXNzaWdubWVudCA9IEFzc2lnbm1lbnQuZnJvbVZhcmlhYmxlKHZhcmlhYmxlKTtcblxuICAgICAgICAgIGFzc2lnbm1lbnRzLnB1c2goYXNzaWdubWVudCk7XG5cbiAgICAgICAgICBzdGF0ZW1lbnRWZXJpZmllZEFzRXF1YWxpdHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJpZ2h0VGVybVZlcmlmaWVkQXNWYXJpYWJsZSkge1xuICAgICAgICBjb25zdCB0eXBlcyA9IFtdO1xuXG4gICAgICAgIHZlcmlmeVRlcm0obGVmdFRlcm1Ob2RlLCB0eXBlcywgY29udGV4dCk7XG5cbiAgICAgICAgY29uc3QgZmlyc3RUeXBlID0gZmlyc3QodHlwZXMpLFxuICAgICAgICAgICAgICBmaXJzdFZhcmlhYmxlID0gZmlyc3QodmFyaWFibGVzKSxcbiAgICAgICAgICAgICAgbGVmdFRlcm1UeXBlID0gZmlyc3RUeXBlLCAgLy8vXG4gICAgICAgICAgICAgIHJpZ2h0VmFyaWFibGUgPSBmaXJzdFZhcmlhYmxlLCAvLy9cbiAgICAgICAgICAgICAgcmlnaHRWYXJpYWJsZU5hbWUgPSByaWdodFZhcmlhYmxlLmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgcmlnaHRWYXJpYWJsZVR5cGUgPSByaWdodFZhcmlhYmxlLmdldFR5cGUoKSxcbiAgICAgICAgICAgICAgcmlnaHRWYXJpYWJsZVR5cGVFcXVhbFRvT3JTdXBlclR5cGVPZlJpZ2h0VGVybVR5cGUgPSByaWdodFZhcmlhYmxlVHlwZS5pc0VxdWFsVG9PclN1cGVyVHlwZU9mKGxlZnRUZXJtVHlwZSk7XG5cbiAgICAgICAgaWYgKCFyaWdodFZhcmlhYmxlVHlwZUVxdWFsVG9PclN1cGVyVHlwZU9mUmlnaHRUZXJtVHlwZSkge1xuICAgICAgICAgIGNvbnN0IGxlZnRUZXJtU3RyaW5nID0gY29udGV4dC5ub2RlQXNTdHJpbmcobGVmdFRlcm1Ob2RlKSxcbiAgICAgICAgICAgICAgICBsZWZ0VGVybVR5cGVOYW1lID0gbGVmdFRlcm1UeXBlLmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICByaWdodFZhcmlhYmxlVHlwZU5hbWUgPSByaWdodFZhcmlhYmxlVHlwZS5nZXROYW1lKCk7XG5cbiAgICAgICAgICBjb250ZXh0LmVycm9yKGBUaGUgcmlnaHQgJyR7cmlnaHRWYXJpYWJsZU5hbWV9JyB2YXJpYWJsZSdzICcke3JpZ2h0VmFyaWFibGVUeXBlTmFtZX0nIHR5cGUgaXMgbm90IGVxdWFsIHRvIG9yIGEgc3VwZXItdHlwZSBvZiB0aGUgbGVmdCAnJHtsZWZ0VGVybVN0cmluZ30nIHRlcm0ncyAnJHtsZWZ0VGVybVR5cGVOYW1lfScgdHlwZS5gLCBzdGF0ZW1lbnROb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gcmlnaHRWYXJpYWJsZU5hbWUsICAvLy9cbiAgICAgICAgICAgICAgICB0eXBlID0gbGVmdFRlcm1UeXBlLCAvLy9cbiAgICAgICAgICAgICAgICB2YXJpYWJsZSA9IFZhcmlhYmxlLmZyb21OYW1lQW5kVHlwZShuYW1lLCB0eXBlKSxcbiAgICAgICAgICAgICAgICBhc3NpZ25tZW50ID0gQXNzaWdubWVudC5mcm9tVmFyaWFibGUodmFyaWFibGUpO1xuXG4gICAgICAgICAgYXNzaWdubWVudHMucHVzaChhc3NpZ25tZW50KTtcblxuICAgICAgICAgIHN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHR5cGVzID0gW107XG5cbiAgICAgICAgdmVyaWZ5VGVybShsZWZ0VGVybU5vZGUsIHR5cGVzLCBjb250ZXh0KTtcblxuICAgICAgICB2ZXJpZnlUZXJtKHJpZ2h0VGVybU5vZGUsIHR5cGVzLCBjb250ZXh0KTtcblxuICAgICAgICBjb25zdCBmaXJzdFR5cGUgPSBmaXJzdCh0eXBlcyksXG4gICAgICAgICAgICAgIHNlY29uZFR5cGUgPSBzZWNvbmQodHlwZXMpLFxuICAgICAgICAgICAgICBsZWZ0VGVybVR5cGUgPSBmaXJzdFR5cGUsIC8vL1xuICAgICAgICAgICAgICByaWdodFRlcm1UeXBlID0gc2Vjb25kVHlwZSwgLy8vXG4gICAgICAgICAgICAgIGxlZnRUZXJtVHlwZUVxdWFsVG9PclN1YlR5cGVPZk9mU3VwZXJUeXBlT2YgPSBsZWZ0VGVybVR5cGUuaXNFcXVhbFRvT3JTdWJUeXBlT2ZPZlN1cGVyVHlwZU9mKHJpZ2h0VGVybVR5cGUpO1xuXG4gICAgICAgIGlmICghbGVmdFRlcm1UeXBlRXF1YWxUb09yU3ViVHlwZU9mT2ZTdXBlclR5cGVPZikge1xuICAgICAgICAgIGNvbnN0IGxlZnRUZXJtU3RyaW5nID0gY29udGV4dC5ub2RlQXNTdHJpbmcobGVmdFRlcm1Ob2RlKSxcbiAgICAgICAgICAgICAgICByaWdodFRlcm1TdHJpbmcgPSBjb250ZXh0Lm5vZGVBc1N0cmluZyhyaWdodFRlcm1Ob2RlKSxcbiAgICAgICAgICAgICAgICBsZWZ0VGVybVR5cGVOYW1lID0gbGVmdFRlcm1UeXBlLmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgICByaWdodFRlcm1UeXBlTmFtZSA9IHJpZ2h0VGVybVR5cGUuZ2V0TmFtZSgpO1xuXG4gICAgICAgICAgY29udGV4dC5lcnJvcihgVGhlIGxlZnQgJyR7bGVmdFRlcm1TdHJpbmd9JyB0ZXJtJ3MgJyR7bGVmdFRlcm1UeXBlTmFtZX0nIHR5cGUgaXMgbm90IGVxdWFsIHRvLCBhIHN1Yi10eXBlIG9mIG9yIGEgc3VwZXItdHlwZSBvZiB0aGUgcmlnaHQgJyR7cmlnaHRUZXJtU3RyaW5nfScgdGVybSdzICcke3JpZ2h0VGVybVR5cGVOYW1lfScgdHlwZS5gLCBzdGF0ZW1lbnROb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZW1lbnRWZXJpZmllZEFzRXF1YWxpdHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSkge1xuICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IGNvbnRleHQubm9kZUFzU3RyaW5nKHN0YXRlbWVudE5vZGUpO1xuXG4gICAgY29udGV4dC5pbmZvKGBWZXJpZmllZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGFzIGFuIGVxdWFsaXR5LmAsIHN0YXRlbWVudE5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eTtcbn1cbiJdLCJuYW1lcyI6WyJ2ZXJpZnlTdGF0ZW1lbnQiLCJ0ZXJtTm9kZVF1ZXJ5Iiwibm9kZVF1ZXJ5IiwidHlwZU5vZGVRdWVyeSIsIm1ldGFUeXBlTm9kZVF1ZXJ5Iiwic3RhdGVtZW50Tm9kZVF1ZXJ5IiwidHlwZUFzc2VydGlvbk5vZGVRdWVyeSIsIm1ldGFUeXBlVGVybWluYWxOb2RlUXVlcnkiLCJzdGF0ZW1lbnROb2RlIiwiYXNzaWdubWVudHMiLCJkZXJpdmVkIiwiY29udGV4dCIsInN0YXRlbWVudFZlcmlmaWVkIiwic3RhdGVtZW50VmVyaWZpZWRBZ2FpbnN0Q29tYmluYXRvcnMiLCJ2ZXJpZnlTdGF0ZW1lbnRBZ2FpbnN0Q29tYmluYXRvcnMiLCJzdGF0ZW1lbnRWZXJpZmllZEFzVHlwZUFzc2VydGlvbiIsInZlcmlmeVN0YXRlbWVudEFzVHlwZUFzc2VydGlvbiIsInN0YXRlbWVudFZlcmlmaWVkQXNFcXVhbGl0eSIsInZlcmlmeVN0YXRlbWVudEFzRXF1YWxpdHkiLCJTdGF0ZW1lbnRWZXJpZmllciIsInZlcmlmeU5vblRlcm1pbmFsTm9kZSIsIm5vblRlcm1pbmFsTm9kZUEiLCJub25UZXJtaW5hbE5vZGVCIiwibm9uVGVybWluYWxOb2RlVmVyaWZpZWQiLCJub25UZXJtaW5hbE5vZGUiLCJjb21iaW5hdG9yTm9uVGVybWluYWxOb2RlIiwicnVsZU5hbWUiLCJnZXRSdWxlTmFtZSIsImNvbWJpbmF0b3JSdWxlTmFtZSIsIkFSR1VNRU5UX1JVTEVfTkFNRSIsImFyZ3VtZW50Tm9kZSIsImNvbWJpbmF0b3JBcmd1bWVudE5vZGUiLCJhcmd1bWVudE5vZGVWZXJpZmllZCIsInZlcmlmeUFyZ3VtZW50Tm9kZSIsIk1FVEFfQVJHVU1FTlRfUlVMRV9OQU1FIiwibWV0YUFyZ3VtZW50Tm9kZSIsImNvbWJpbmF0b3JNZXRhYXJndW1lbnROb2RlIiwibWV0YUFyZ3VtZW50Tm9kZVZlcmlmaWVkIiwidmVyaWZ5TWV0YWFyZ3VtZW50Tm9kZSIsImNoaWxkTm9kZXMiLCJnZXRDaGlsZE5vZGVzIiwiY29tYmluYXRvckNoaWxkTm9kZXMiLCJub2Rlc0EiLCJub2Rlc0IiLCJub2Rlc1ZlcmlmaWVkIiwidmVyaWZ5Tm9kZXMiLCJ0ZXJtTm9kZSIsImFyZ3VtZW50U3RyaW5nIiwibm9kZUFzU3RyaW5nIiwiZXJyb3IiLCJ0eXBlcyIsInRlcm1WZXJpZmllZCIsInZlcmlmeVRlcm0iLCJmaXJzdFR5cGUiLCJmaXJzdCIsInRlcm1UeXBlIiwidHlwZU5vZGUiLCJ0eXBlTmFtZSIsInR5cGVOYW1lRnJvbVR5cGVOb2RlIiwidHlwZSIsIk9CSkVDVF9UWVBFX05BTUUiLCJvYmplY3RUeXBlIiwiZmluZFR5cGVCeVR5cGVOYW1lIiwic3RhdGVtZW50VHlwZUVxdWFsVG9PclN1YlR5cGVPZlR5cGUiLCJpc0VxdWFsVG9PclN1YlR5cGVPZiIsImNvbWJpbmF0b3JNZXRhVFlwZU5vZGUiLCJtZXRhQXJndW1lbnRTdHJpbmciLCJjb21iaW5hdG9yTWV0YWFyZ3VtZW50U3RyaW5nIiwiY29tYmluYXRvck1ldGFUeXBlVGVybWluYWxOb2RlIiwiY29udGVudCIsImdldENvbnRlbnQiLCJjb250ZW50U3RhdGVtZW50TWV0YVR5cGUiLCJTVEFURU1FTlRfTUVUQV9UWVBFIiwiVmVyaWZpZXIiLCJzdGF0ZW1lbnRWZXJpZmllciIsImNvbWJpbmF0b3JzIiwiZ2V0Q29tYmluYXRvcnMiLCJicmFja2V0ZWRDb21iaW5hdG9yIiwiY29tYmluYXRvciIsImZpbmQiLCJzdGF0ZW1lbnRWZXJpZmllZEFnYWluc3RDb21iaW5hdG9yIiwidmVyaWZ5U3RhdGVtZW50QWdhaW5zdENvbWJpbmF0b3IiLCJjb21iaW5hdG9yU3RhdGVtZW50Tm9kZSIsImdldFN0YXRlbWVudE5vZGUiLCJ0eXBlQXNzZXJ0aW9uTm9kZSIsInR5cGVBc3NlcnRpb25WZXJpZmllZCIsInZlcmlmeVR5cGVBc3NlcnRpb24iLCJlcXVhbGl0eUNvbWJpbmF0b3IiLCJlcXVhbGl0eSIsIkVxdWFsaXR5IiwiZnJvbVN0YXRlbWVudE5vZGUiLCJlcXVhbGl0aWVzIiwiZ2V0RXF1YWxpdGllcyIsImVxdWFsaXR5VmVyaWZpZWQiLCJ2ZXJpZnkiLCJ2YXJpYWJsZXMiLCJsZWZ0VGVybU5vZGUiLCJnZXRMZWZ0VGVybU5vZGUiLCJyaWdodFRlcm1Ob2RlIiwiZ2V0UmlnaHRUZXJtTm9kZSIsImxlZnRUZXJtVmVyaWZpZWRBc1ZhcmlhYmxlIiwidmVyaWZ5VGVybUFzVmFyaWFibGUiLCJyaWdodFRlcm1WZXJpZmllZEFzVmFyaWFibGUiLCJmaXJzdFZhcmlhYmxlIiwic2Vjb25kVmFyaWFibGUiLCJzZWNvbmQiLCJsZWZ0VmFyaWFibGUiLCJyaWdodFZhcmlhYmxlIiwibGVmdFZhcmlhYmxlTmFtZSIsImdldE5hbWUiLCJsZWZ0VmFyaWFibGVUeXBlIiwiZ2V0VHlwZSIsInJpZ2h0VmFyaWFibGVOYW1lIiwicmlnaHRWYXJpYWJsZVR5cGUiLCJsZWZ0VmFyaWFibGVUeXBlRXF1YWxUb09yU3ViVHlwZU9mT2ZTdXBlclR5cGVPZlJpZ2h0VmFyaWFibGVUeXBlIiwiaXNFcXVhbFRvT3JTdWJUeXBlT2ZPZlN1cGVyVHlwZU9mIiwibGVmdFZhcmlhYmxlVHlwZU5hbWUiLCJyaWdodFZhcmlhYmxlVHlwZU5hbWUiLCJsZWZ0VmFyaWFibGVUeXBlU3VwZXJUeXBlT2ZSaWdodFZhcmlhYmxlVHlwZSIsImlzU3VwZXJUeXBlT2YiLCJyaWdodFZhcmlhYmxlVHlwZVN1cGVyVHlwZU9mTGVmdFZhcmlhYmxlVHlwZSIsIm5hbWUiLCJ2YXJpYWJsZSIsIlZhcmlhYmxlIiwiZnJvbU5hbWVBbmRUeXBlIiwiYXNzaWdubWVudCIsIkFzc2lnbm1lbnQiLCJmcm9tVmFyaWFibGUiLCJwdXNoIiwicmlnaHRUZXJtVHlwZSIsImxlZnRWYXJpYWJsZVR5cGVFcXVhbFRvT3JTdXBlclR5cGVPZlJpZ2h0VGVybVR5cGUiLCJpc0VxdWFsVG9PclN1cGVyVHlwZU9mIiwicmlnaHRUZXJtU3RyaW5nIiwicmlnaHRUZXJtVHlwZU5hbWUiLCJsZWZ0VGVybVR5cGUiLCJyaWdodFZhcmlhYmxlVHlwZUVxdWFsVG9PclN1cGVyVHlwZU9mUmlnaHRUZXJtVHlwZSIsImxlZnRUZXJtU3RyaW5nIiwibGVmdFRlcm1UeXBlTmFtZSIsInNlY29uZFR5cGUiLCJsZWZ0VGVybVR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZPZlN1cGVyVHlwZU9mIiwic3RhdGVtZW50U3RyaW5nIiwiaW5mbyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBMEJBOzs7ZUFBd0JBOzs7NkRBeEJIOzZEQUNBOzZEQUNBOytEQUNFOzBEQUNBOzhEQUNROzhEQUNDO3lEQUNBO3FCQUVMO3FCQUNHO3lCQUNHO3lCQUNHO3FCQUVZO3lCQUNZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUU1RCxJQUFNQyxnQkFBZ0JDLElBQUFBLGdCQUFTLEVBQUMsb0JBQzFCQyxnQkFBZ0JELElBQUFBLGdCQUFTLEVBQUMsb0JBQzFCRSxvQkFBb0JGLElBQUFBLGdCQUFTLEVBQUMsNEJBQzlCRyxxQkFBcUJILElBQUFBLGdCQUFTLEVBQUMsNkJBQy9CSSx5QkFBeUJKLElBQUFBLGdCQUFTLEVBQUMsOEJBQ25DSyw0QkFBNEJMLElBQUFBLGdCQUFTLEVBQUM7QUFFN0IsU0FBU0YsZ0JBQWdCUSxhQUFhLEVBQUVDLFdBQVcsRUFBRUMsT0FBTyxFQUFFQyxPQUFPLEVBQUU7SUFDcEYsSUFBSUMsb0JBQW9CLEtBQUs7SUFFN0IsSUFBSSxDQUFDQSxtQkFBbUI7UUFDdEIsSUFBTUMsc0NBQXNDQyxrQ0FBa0NOLGVBQWVHO1FBRTdGQyxvQkFBb0JDLHFDQUFzQyxHQUFHO0lBQy9ELENBQUM7SUFFRCxJQUFJLENBQUNELG1CQUFtQjtRQUN0QixJQUFNRyxtQ0FBbUNDLCtCQUErQlIsZUFBZUMsYUFBYUMsU0FBU0M7UUFFN0dDLG9CQUFvQkcsa0NBQWtDLEdBQUc7SUFDM0QsQ0FBQztJQUVELElBQUksQ0FBQ0gsbUJBQW1CO1FBQ3RCLElBQU1LLDhCQUE4QkMs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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "occam-verify-cli",
3
3
  "author": "James Smith",
4
- "version": "0.0.539",
4
+ "version": "0.0.541",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/occam-verify-cli",
7
7
  "description": "Occam's Verifier",
@@ -12,9 +12,9 @@
12
12
  "dependencies": {
13
13
  "argumentative": "^2.0.21",
14
14
  "necessary": "^11.2.1",
15
- "occam-custom-grammars": "^5.0.397",
15
+ "occam-custom-grammars": "^5.0.398",
16
16
  "occam-dom": "^3.1.1",
17
- "occam-file-system": "^5.0.158",
17
+ "occam-file-system": "^5.0.159",
18
18
  "occam-grammar-utilities": "^7.0.66"
19
19
  },
20
20
  "devDependencies": {
package/src/axiom.js CHANGED
@@ -7,7 +7,7 @@ import { AXIOM_KIND } from "./kinds";
7
7
  export default class Axiom extends AxiomLemmaTheoremConjecture {
8
8
  static kind = AXIOM_KIND;
9
9
 
10
- static fromJSON(json, context) { return AxiomLemmaTheoremConjecture.fromJSON(Axiom, json, context); }
10
+ static fromJSONAndFileContext(json, fileContexct) { return AxiomLemmaTheoremConjecture.fromJSONAndFileContext(Axiom, json, fileContexct); }
11
11
 
12
12
  static fromLabelsSuppositionsConsequenceAndProofContext(labels, suppositions, consequence, proofContext) { return AxiomLemmaTheoremConjecture.fromLabelsSuppositionsConsequenceAndProofContext(Axiom, labels, suppositions, consequence, proofContext); }
13
13
  }
@@ -104,14 +104,14 @@ export default class AxiomLemmaTheoremConjecture {
104
104
  return json;
105
105
  }
106
106
 
107
- static fromJSON(Class, json, context) {
107
+ static fromJSONAndFileContext(Class, json, fileContext) {
108
108
  let { labels } = json;
109
109
 
110
110
  const labelsJSON = labels; ///
111
111
 
112
112
  labels = labelsJSON.map((labelJSON) => {
113
113
  const json = labelJSON, ///
114
- label = Label.fromJSON(json, context);
114
+ label = Label.fromJSONAndFileContext(json, fileContext);
115
115
 
116
116
  return label;
117
117
  });
@@ -122,7 +122,7 @@ export default class AxiomLemmaTheoremConjecture {
122
122
 
123
123
  suppositions = suppositionsJSON.map((suppositionJSON) => {
124
124
  const json = suppositionJSON, ///
125
- supposition = Supposition.fromJSON(json, context);
125
+ supposition = Supposition.fromJSONAndFileContext(json, fileContext);
126
126
 
127
127
  return supposition;
128
128
  });
@@ -133,7 +133,7 @@ export default class AxiomLemmaTheoremConjecture {
133
133
 
134
134
  json = consequenceJSON; ///
135
135
 
136
- consequence = Consequence.fromJSON(json, context);
136
+ consequence = Consequence.fromJSONAndFileContext(json, fileContext);
137
137
 
138
138
  return new Class(labels, suppositions, consequence); ///
139
139
  }
package/src/combinator.js CHANGED
@@ -35,11 +35,11 @@ export default class Combinator {
35
35
  return json;
36
36
  }
37
37
 
38
- static fromJSON(json, context) {
38
+ static fromJSONAndFileContext(json, fileContext) {
39
39
  const { statement } = json,
40
40
  statementString = statement, ///
41
- lexer = context.getLexer(),
42
- parser = context.getParser(),
41
+ lexer = fileContext.getLexer(),
42
+ parser = fileContext.getParser(),
43
43
  statementNode = statementNodeFromStatementString(statementString, lexer, parser),
44
44
  combinator = new Combinator(statementNode);
45
45
 
package/src/conclusion.js CHANGED
@@ -46,11 +46,11 @@ export default class Conclusion {
46
46
  return json;
47
47
  }
48
48
 
49
- static fromJSON(json, context) {
49
+ static fromJSONAndFileContext(json, fileContext) {
50
50
  const { metastatement } = json,
51
51
  metastatementString = metastatement, ///
52
- lexer = context.getLexer(),
53
- parser = context.getParser(),
52
+ lexer = fileContext.getLexer(),
53
+ parser = fileContext.getParser(),
54
54
  metastatementNode = metastatementNodeFromMetastatementString(metastatementString, lexer, parser),
55
55
  conclusion = new Conclusion(metastatementNode);
56
56
 
package/src/conjecture.js CHANGED
@@ -7,7 +7,7 @@ import { CONJECTURE_KIND } from "./kinds";
7
7
  export default class Conjecture extends AxiomLemmaTheoremConjecture {
8
8
  static kind = CONJECTURE_KIND;
9
9
 
10
- static fromJSON(json, context) { return AxiomLemmaTheoremConjecture.fromJSON(Conjecture, json, context); }
10
+ static fromJSONAndFileContext(json, fileContext) { return AxiomLemmaTheoremConjecture.fromJSONAndFileContext(Conjecture, json, fileContext); }
11
11
 
12
12
  static fromLabelsSuppositionsConsequenceAndProofContext(labels, suppositions, consequence, proofContext) { return AxiomLemmaTheoremConjecture.fromLabelsSuppositionsConsequenceAndProofContext(Conjecture, labels, suppositions, consequence, proofContext); }
13
13
  }
@@ -54,11 +54,11 @@ export default class Constructor {
54
54
  return json;
55
55
  }
56
56
 
57
- static fromJSON(json, context) {
57
+ static fromJSONAndFileContext(json, fileContext) {
58
58
  const { term } = json,
59
59
  termString = term, ///
60
- lexer = context.getLexer(),
61
- parser = context.getParser(),
60
+ lexer = fileContext.getLexer(),
61
+ parser = fileContext.getParser(),
62
62
  termNode = termNodeFromTermString(termString, lexer, parser);
63
63
 
64
64
  let { type } = json;
@@ -68,11 +68,11 @@ export default class Constructor {
68
68
 
69
69
  json = typeJSON; ///
70
70
 
71
- type = Type.fromJSON(json, context);
71
+ type = Type.fromJSONAndFileContext(json, fileContext);
72
72
 
73
73
  const typeName = type.getName();
74
74
 
75
- type = context.findTypeByTypeName(typeName); ///
75
+ type = fileContext.findTypeByTypeName(typeName); ///
76
76
  }
77
77
 
78
78
  const constructor = new Constructor(termNode, type);
@@ -2,16 +2,37 @@
2
2
 
3
3
  import { rewriteNodes } from "occam-grammar-utilities";
4
4
 
5
+ import Type from "../type";
6
+ import Rule from "../rule";
7
+ import Axiom from "../axiom";
8
+ import Lemma from "../lemma";
9
+ import Theorem from "../theorem";
10
+ import Variable from "../variable";
11
+ import Conjecture from "../conjecture";
12
+ import Combinator from "../combinator";
13
+ import Constructor from "../constructor";
14
+ import Metavariable from "../metavariable";
15
+
5
16
  import { push, filter } from "../utilities/array";
6
17
  import { statementMetaType } from "../metaType";
7
18
  import { nodeAsString, nodesAsString } from "../utilities/string";
19
+ import { TYPE_KIND,
20
+ RULE_KIND,
21
+ AXIOM_KIND,
22
+ LEMMA_KIND,
23
+ THEOREM_KIND,
24
+ VARIABLE_KIND,
25
+ CONJECTURE_KIND,
26
+ COMBINATOR_KIND,
27
+ CONSTRUCTOR_KIND,
28
+ METAVARIABLE_KIND } from "../kinds";
8
29
 
9
30
  const metaTypes = [
10
31
  statementMetaType
11
32
  ];
12
33
 
13
34
  export default class FileContext {
14
- constructor(releaseContext, filePath, tokens, node, types, rules, axioms, lemmas, theorems, conjectures, combinators, constructors, variables, metavariables) {
35
+ constructor(releaseContext, filePath, tokens, node, types, rules, axioms, lemmas, theorems, variables, conjectures, combinators, constructors, metavariables) {
15
36
  this.releaseContext = releaseContext;
16
37
  this.filePath = filePath;
17
38
  this.tokens = tokens;
@@ -21,10 +42,10 @@ export default class FileContext {
21
42
  this.axioms = axioms;
22
43
  this.lemmas = lemmas;
23
44
  this.theorems = theorems;
45
+ this.variables = variables;
24
46
  this.conjectures = conjectures;
25
47
  this.combinators = combinators;
26
48
  this.constructors = constructors;
27
- this.variables = variables;
28
49
  this.metavariables = metavariables;
29
50
  }
30
51
 
@@ -83,6 +104,12 @@ export default class FileContext {
83
104
  push(labels, theoremLabels);
84
105
  });
85
106
 
107
+ this.conjectures.forEach((conjecture) => {
108
+ const conjectureLabels = conjecture.getLabels();
109
+
110
+ push(labels, conjectureLabels);
111
+ });
112
+
86
113
  if (includeRelease) {
87
114
  const releaseContextLabels = this.releaseContext.getLabels();
88
115
 
@@ -162,6 +189,10 @@ export default class FileContext {
162
189
  return theorems;
163
190
  }
164
191
 
192
+ getVariables(includeRelease = true) {
193
+ return this.variables;
194
+ }
195
+
165
196
  getMetaTypes(includeRelease = true) {
166
197
  return metaTypes;
167
198
  }
@@ -208,39 +239,35 @@ export default class FileContext {
208
239
  return constructors;
209
240
  }
210
241
 
211
- getVariables() {
212
- return this.variables;
213
- }
214
-
215
- getMetavariables() {
242
+ getMetavariables(includeRelease = true) {
216
243
  return this.metavariables;
217
244
  }
218
245
 
219
- findTypeByTypeName(typeName) {
220
- const types = this.getTypes(),
221
- type = types.find((type) => {
222
- const matches = type.matchTypeName(typeName);
246
+ findLabelByLabelName(labelName) {
247
+ const name = labelName, ///
248
+ labels = this.getLabels(),
249
+ label = labels.find((label) => {
250
+ const matches = label.matchName(name);
223
251
 
224
252
  if (matches) {
225
253
  return true;
226
254
  }
227
255
  }) || null;
228
256
 
229
- return type;
257
+ return label;
230
258
  }
231
259
 
232
- findLabelByLabelName(labelName) {
233
- const name = labelName, ///
234
- labels = this.getLabels(),
235
- label = labels.find((label) => {
236
- const matches = label.matchName(name);
260
+ findTypeByTypeName(typeName) {
261
+ const types = this.getTypes(),
262
+ type = types.find((type) => {
263
+ const matches = type.matchTypeName(typeName);
237
264
 
238
265
  if (matches) {
239
266
  return true;
240
267
  }
241
268
  }) || null;
242
269
 
243
- return label;
270
+ return type;
244
271
  }
245
272
 
246
273
  findRuleByReferenceName(referenceName) {
@@ -354,13 +381,6 @@ export default class FileContext {
354
381
  return metavariable;
355
382
  }
356
383
 
357
- isTypePresentByTypeName(typeName) {
358
- const type = this.findTypeByTypeName(typeName),
359
- typePresent = (type !== null);
360
-
361
- return typePresent;
362
- }
363
-
364
384
  isLabelPresentByLabelName(labelName) {
365
385
  const label = this.findLabelByLabelName(labelName),
366
386
  labelPresent = (label !== null);
@@ -368,6 +388,13 @@ export default class FileContext {
368
388
  return labelPresent;
369
389
  }
370
390
 
391
+ isTypePresentByTypeName(typeName) {
392
+ const type = this.findTypeByTypeName(typeName),
393
+ typePresent = (type !== null);
394
+
395
+ return typePresent;
396
+ }
397
+
371
398
  isVariablePresentByVariableName(variableName) {
372
399
  const variable = this.findVariableByVariableName(variableName),
373
400
  variablePresent = (variable !== null);
@@ -435,6 +462,10 @@ export default class FileContext {
435
462
  this.variables.push(variable);
436
463
  }
437
464
 
465
+ addConjecture(conjecture) {
466
+ this.conjectures.push(conjecture);
467
+ }
468
+
438
469
  addCombinator(combinator) {
439
470
  this.combinators.push(combinator);
440
471
  }
@@ -503,6 +534,12 @@ export default class FileContext {
503
534
  json.push(theoremJSON);
504
535
  });
505
536
 
537
+ this.variables.forEach((variable) => {
538
+ const variableJSON = variable.toJSON(this.tokens);
539
+
540
+ json.push(variableJSON)
541
+ });
542
+
506
543
  this.conjectures.forEach((conjecture) => {
507
544
  const conjectureJSON = conjecture.toJSON(this.tokens);
508
545
 
@@ -521,10 +558,106 @@ export default class FileContext {
521
558
  json.push(constructorJSON)
522
559
  });
523
560
 
561
+ this.metavariables.forEach((metavariable) => {
562
+ const metavariableJSON = metavariable.toJSON(this.tokens);
563
+
564
+ json.push(metavariableJSON)
565
+ });
566
+
524
567
  return json;
525
568
  }
526
569
 
527
- static fromReleaseContextAndFilePath(releaseContext, filePath) {
570
+ initialise(json) {
571
+ const jsonArray = json; ///
572
+
573
+ jsonArray.forEach((json) => {
574
+ const { kind } = json;
575
+
576
+ switch (kind) {
577
+ case TYPE_KIND: {
578
+ const type = Type.fromJSONAndFileContext(json, fileContext);
579
+
580
+ types.push(type);
581
+
582
+ break;
583
+ }
584
+
585
+ case RULE_KIND: {
586
+ const rule = Rule.fromJSONAndFileContext(json, fileContext);
587
+
588
+ rules.push(rule);
589
+
590
+ break;
591
+ }
592
+
593
+ case AXIOM_KIND: {
594
+ const axiom = Axiom.fromJSONAndFileContext(json, fileContext);
595
+
596
+ axioms.push(axiom);
597
+
598
+ break;
599
+ }
600
+
601
+ case LEMMA_KIND: {
602
+ const lemma = Lemma.fromJSONAndFileContext(json, fileContext);
603
+
604
+ lemmas.push(lemma);
605
+
606
+ break;
607
+ }
608
+
609
+ case THEOREM_KIND: {
610
+ const theorem = Theorem.fromJSONAndFileContext(json, fileContext);
611
+
612
+ theorems.push(theorem);
613
+
614
+ break;
615
+ }
616
+
617
+ case VARIABLE_KIND: {
618
+ const variable = Variable.fromJSONAndFileContext(json, fileContext);
619
+
620
+ variables.push(variable);
621
+
622
+ break;
623
+ }
624
+
625
+ case CONJECTURE_KIND: {
626
+ const conjecture = Conjecture.fromJSONAndFileContext(json, fileContext);
627
+
628
+ conjectures.push(conjecture);
629
+
630
+ break;
631
+ }
632
+
633
+ case COMBINATOR_KIND: {
634
+ const combinator = Combinator.fromJSONAndFileContext(json, fileContext);
635
+
636
+ combinators.push(combinator);
637
+
638
+ break;
639
+ }
640
+
641
+ case CONSTRUCTOR_KIND: {
642
+ const constructor = Constructor.fromJSONAndFileContext(json, fileContext);
643
+
644
+ constructors.push(constructor);
645
+
646
+ break;
647
+ }
648
+
649
+ case METAVARIABLE_KIND: {
650
+ const metavariable = Metavariable.fromJSONAndFileContext(json, fileContext);
651
+
652
+ metavariables.push(metavariable);
653
+
654
+ break;
655
+ }
656
+ }
657
+ });
658
+ }
659
+
660
+ static fromFilePathAndReleaseContext(filePath, releaseContext) {
528
661
  const file = releaseContext.getFile(filePath),
529
662
  content = file.getContent(),
530
663
  tokens = releaseContext.tokenise(content),
@@ -541,12 +674,12 @@ export default class FileContext {
541
674
  axioms = [],
542
675
  lemmas = [],
543
676
  theorems = [],
677
+ variables = [],
544
678
  conjectures = [],
545
679
  combinators = [],
546
680
  constructors = [],
547
- variables = [],
548
681
  metavariables = [],
549
- fileContext = new FileContext(releaseContext, filePath, tokens, node, types, rules, axioms, lemmas, theorems, conjectures, combinators, constructors, variables, metavariables);
682
+ fileContext = new FileContext(releaseContext, filePath, tokens, node, types, rules, axioms, lemmas, variables, theorems, conjectures, combinators, constructors, metavariables);
550
683
 
551
684
  return fileContext;
552
685
  }
@@ -108,7 +108,7 @@ class MetaproofContext {
108
108
  return metavariable;
109
109
  }
110
110
 
111
- isMetavariablePresentByVariableName(metavariableName) {
111
+ isMetavariablePresentByMetavariableName(metavariableName) {
112
112
  const metavariable = this.findMetavariableByMetavariableName(metavariableName),
113
113
  metavariablePresent = (metavariable !== null);
114
114