occam-grammar-utilities 8.0.430 → 8.0.431

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 (57) hide show
  1. package/lib/constants.js +13 -0
  2. package/lib/createDirectlyRepeatedRules.js +26 -0
  3. package/lib/createIndirectlyRepeatedRules.js +35 -0
  4. package/lib/createReducedRules.js +29 -0
  5. package/lib/cycle.js +79 -0
  6. package/lib/definition/epsilon.js +22 -0
  7. package/lib/definition/repeated/directly.js +56 -0
  8. package/lib/definition/rewritten.js +63 -0
  9. package/lib/directedGraph.js +190 -0
  10. package/lib/edge.js +56 -0
  11. package/lib/eliminateLeftRecursion.js +68 -0
  12. package/lib/example/constants.js +13 -0
  13. package/lib/example/lexer/example.js +28 -0
  14. package/lib/example/parser/example.js +22 -0
  15. package/lib/example/parser/nonTerminalNodeMap.js +76 -0
  16. package/lib/example/view/div/sizeable.js +25 -0
  17. package/lib/example/view/heading.js +27 -0
  18. package/lib/example/view/input/startRuleName.js +39 -0
  19. package/lib/example/view/input.js +28 -0
  20. package/lib/example/view/subHeading.js +29 -0
  21. package/lib/example/view/textarea/adjustedBNF.js +46 -0
  22. package/lib/example/view/textarea/bnf.js +45 -0
  23. package/lib/example/view/textarea/content.js +45 -0
  24. package/lib/example/view/textarea/lexicalEntries.js +51 -0
  25. package/lib/example/view/textarea/parseTree.js +52 -0
  26. package/lib/example/view/textarea.js +30 -0
  27. package/lib/example/view.js +118 -0
  28. package/lib/example.js +19 -0
  29. package/lib/index.js +31 -0
  30. package/lib/labels.js +22 -0
  31. package/lib/node/reduced.js +18 -0
  32. package/lib/node/repeated/directly.js +24 -0
  33. package/lib/node/repeated/indirectly.js +30 -0
  34. package/lib/node/rewritten.js +38 -0
  35. package/lib/rewriteLeftRecursiveRules.js +61 -0
  36. package/lib/rule/reduced.js +64 -0
  37. package/lib/rule/repeated/directly.js +39 -0
  38. package/lib/rule/repeated/indirectly.js +108 -0
  39. package/lib/rule/rewritten.js +39 -0
  40. package/lib/utilities/callAhead.js +30 -0
  41. package/lib/utilities/complex.js +58 -0
  42. package/lib/utilities/cycle.js +66 -0
  43. package/lib/utilities/directedGraph.js +70 -0
  44. package/lib/utilities/leftRecursive.js +107 -0
  45. package/lib/utilities/nonConsuming.js +136 -0
  46. package/lib/utilities/nonProducing.js +112 -0
  47. package/lib/utilities/occluded.js +19 -0
  48. package/lib/utilities/part.js +30 -0
  49. package/lib/utilities/parts.js +23 -0
  50. package/lib/utilities/path.js +112 -0
  51. package/lib/utilities/precedence.js +39 -0
  52. package/lib/utilities/qualified.js +45 -0
  53. package/lib/utilities/recursive.js +83 -0
  54. package/lib/utilities/rewrite.js +154 -0
  55. package/lib/utilities/ruleName.js +57 -0
  56. package/lib/utilities/ruleNames.js +40 -0
  57. package/package.json +2 -2
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "EMPTY_STRING", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return EMPTY_STRING;
9
+ }
10
+ });
11
+ const EMPTY_STRING = "";
12
+
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBjb25zdCBFTVBUWV9TVFJJTkcgPSBcIlwiO1xuIl0sIm5hbWVzIjpbIkVNUFRZX1NUUklORyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBRWFBOzs7ZUFBQUE7OztBQUFOLE1BQU1BLGVBQWUifQ==
@@ -0,0 +1,26 @@
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 createDirectlyRepeatedRules;
9
+ }
10
+ });
11
+ const _directly = /*#__PURE__*/ _interop_require_default(require("./rule/repeated/directly"));
12
+ const _cycle = require("./utilities/cycle");
13
+ function _interop_require_default(obj) {
14
+ return obj && obj.__esModule ? obj : {
15
+ default: obj
16
+ };
17
+ }
18
+ function createDirectlyRepeatedRules(cycles, ruleMap) {
19
+ const ruleNames = (0, _cycle.ruleNamesFromCycles)(cycles);
20
+ ruleNames.forEach((ruleName)=>{
21
+ const rule = ruleMap[ruleName], directlyRepeatedRule = _directly.default.fromRuleAndCycles(rule, cycles, ruleMap), directlyRepeatedRuleName = directlyRepeatedRule.getName();
22
+ ruleMap[directlyRepeatedRuleName] = directlyRepeatedRule;
23
+ });
24
+ }
25
+
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jcmVhdGVEaXJlY3RseVJlcGVhdGVkUnVsZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBEaXJlY3RseVJlcGVhdGVkUnVsZSBmcm9tIFwiLi9ydWxlL3JlcGVhdGVkL2RpcmVjdGx5XCI7XG5cbmltcG9ydCB7IHJ1bGVOYW1lc0Zyb21DeWNsZXMgfSBmcm9tIFwiLi91dGlsaXRpZXMvY3ljbGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlRGlyZWN0bHlSZXBlYXRlZFJ1bGVzKGN5Y2xlcywgcnVsZU1hcCkge1xuICBjb25zdCBydWxlTmFtZXMgPSBydWxlTmFtZXNGcm9tQ3ljbGVzKGN5Y2xlcyk7XG5cbiAgcnVsZU5hbWVzLmZvckVhY2goKHJ1bGVOYW1lKSA9PiB7XG4gICAgY29uc3QgcnVsZSA9IHJ1bGVNYXBbcnVsZU5hbWVdLFxuICAgICAgICAgIGRpcmVjdGx5UmVwZWF0ZWRSdWxlID0gRGlyZWN0bHlSZXBlYXRlZFJ1bGUuZnJvbVJ1bGVBbmRDeWNsZXMocnVsZSwgY3ljbGVzLCBydWxlTWFwKSxcbiAgICAgICAgICBkaXJlY3RseVJlcGVhdGVkUnVsZU5hbWUgPSBkaXJlY3RseVJlcGVhdGVkUnVsZS5nZXROYW1lKCk7XG5cbiAgICBydWxlTWFwW2RpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZV0gPSBkaXJlY3RseVJlcGVhdGVkUnVsZTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlRGlyZWN0bHlSZXBlYXRlZFJ1bGVzIiwiY3ljbGVzIiwicnVsZU1hcCIsInJ1bGVOYW1lcyIsInJ1bGVOYW1lc0Zyb21DeWNsZXMiLCJmb3JFYWNoIiwicnVsZU5hbWUiLCJydWxlIiwiZGlyZWN0bHlSZXBlYXRlZFJ1bGUiLCJEaXJlY3RseVJlcGVhdGVkUnVsZSIsImZyb21SdWxlQW5kQ3ljbGVzIiwiZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lIiwiZ2V0TmFtZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBTUE7OztlQUF3QkE7OztpRUFKUzt1QkFFRzs7Ozs7O0FBRXJCLFNBQVNBLDRCQUE0QkMsTUFBTSxFQUFFQyxPQUFPO0lBQ2pFLE1BQU1DLFlBQVlDLElBQUFBLDBCQUFtQixFQUFDSDtJQUV0Q0UsVUFBVUUsT0FBTyxDQUFDLENBQUNDO1FBQ2pCLE1BQU1DLE9BQU9MLE9BQU8sQ0FBQ0ksU0FBUyxFQUN4QkUsdUJBQXVCQyxpQkFBb0IsQ0FBQ0MsaUJBQWlCLENBQUNILE1BQU1OLFFBQVFDLFVBQzVFUywyQkFBMkJILHFCQUFxQkksT0FBTztRQUU3RFYsT0FBTyxDQUFDUyx5QkFBeUIsR0FBR0g7SUFDdEM7QUFDRiJ9
@@ -0,0 +1,35 @@
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 createIndirectlyRepeatedRules;
9
+ }
10
+ });
11
+ const _indirectly = /*#__PURE__*/ _interop_require_default(require("./rule/repeated/indirectly"));
12
+ const _cycle = require("./utilities/cycle");
13
+ const _ruleNames = require("./utilities/ruleNames");
14
+ const _ruleName = require("./utilities/ruleName");
15
+ function _interop_require_default(obj) {
16
+ return obj && obj.__esModule ? obj : {
17
+ default: obj
18
+ };
19
+ }
20
+ function createIndirectlyRepeatedRules(cycles, ruleMap) {
21
+ cycles.forEach((cycle)=>{
22
+ const ruleNames = (0, _cycle.ruleNamesFromCycle)(cycle);
23
+ (0, _ruleNames.forEachRuleNameAndLeftRecursiveRuleName)(ruleNames, (ruleName, leftRecursiveRuleName)=>{
24
+ const indirectlyRepeatedRuleName = (0, _ruleName.indirectlyRepeatedRuleNameFromRuleNameAndLeftRecursiveRuleName)(ruleName, leftRecursiveRuleName);
25
+ let indirectlyRepeatedRule = ruleMap[indirectlyRepeatedRuleName] || null;
26
+ if (indirectlyRepeatedRule === null) {
27
+ const rule = ruleMap[ruleName], leftRecursiveRule = ruleMap[leftRecursiveRuleName];
28
+ indirectlyRepeatedRule = _indirectly.default.fromRuleAndLeftRecursiveRule(rule, leftRecursiveRule, ruleMap);
29
+ ruleMap[indirectlyRepeatedRuleName] = indirectlyRepeatedRule;
30
+ }
31
+ });
32
+ });
33
+ }
34
+
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jcmVhdGVJbmRpcmVjdGx5UmVwZWF0ZWRSdWxlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IEluZGlyZWN0bHlSZXBlYXRlZFJ1bGUgZnJvbSBcIi4vcnVsZS9yZXBlYXRlZC9pbmRpcmVjdGx5XCI7XG5cbmltcG9ydCB7IHJ1bGVOYW1lc0Zyb21DeWNsZSB9IGZyb20gXCIuL3V0aWxpdGllcy9jeWNsZVwiO1xuaW1wb3J0IHsgZm9yRWFjaFJ1bGVOYW1lQW5kTGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3J1bGVOYW1lc1wiO1xuaW1wb3J0IHsgaW5kaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVGcm9tUnVsZU5hbWVBbmRMZWZ0UmVjdXJzaXZlUnVsZU5hbWUgfSBmcm9tIFwiLi91dGlsaXRpZXMvcnVsZU5hbWVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlSW5kaXJlY3RseVJlcGVhdGVkUnVsZXMoY3ljbGVzLCBydWxlTWFwKSB7XG4gIGN5Y2xlcy5mb3JFYWNoKChjeWNsZSkgPT4ge1xuICAgIGNvbnN0IHJ1bGVOYW1lcyA9IHJ1bGVOYW1lc0Zyb21DeWNsZShjeWNsZSk7XG5cbiAgICBmb3JFYWNoUnVsZU5hbWVBbmRMZWZ0UmVjdXJzaXZlUnVsZU5hbWUocnVsZU5hbWVzLCAocnVsZU5hbWUsIGxlZnRSZWN1cnNpdmVSdWxlTmFtZSkgPT4ge1xuICAgICAgY29uc3QgaW5kaXJlY3RseVJlcGVhdGVkUnVsZU5hbWUgPSBpbmRpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZUZyb21SdWxlTmFtZUFuZExlZnRSZWN1cnNpdmVSdWxlTmFtZShydWxlTmFtZSwgbGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lKTtcblxuICAgICAgbGV0IGluZGlyZWN0bHlSZXBlYXRlZFJ1bGUgPSBydWxlTWFwW2luZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lXSB8fCBudWxsO1xuXG4gICAgICBpZiAoaW5kaXJlY3RseVJlcGVhdGVkUnVsZSA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBydWxlID0gcnVsZU1hcFtydWxlTmFtZV0sXG4gICAgICAgICAgICAgIGxlZnRSZWN1cnNpdmVSdWxlID0gcnVsZU1hcFtsZWZ0UmVjdXJzaXZlUnVsZU5hbWVdO1xuXG4gICAgICAgIGluZGlyZWN0bHlSZXBlYXRlZFJ1bGUgPSBJbmRpcmVjdGx5UmVwZWF0ZWRSdWxlLmZyb21SdWxlQW5kTGVmdFJlY3Vyc2l2ZVJ1bGUocnVsZSwgbGVmdFJlY3Vyc2l2ZVJ1bGUsIHJ1bGVNYXApO1xuXG4gICAgICAgIHJ1bGVNYXBbaW5kaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVdID0gaW5kaXJlY3RseVJlcGVhdGVkUnVsZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlSW5kaXJlY3RseVJlcGVhdGVkUnVsZXMiLCJjeWNsZXMiLCJydWxlTWFwIiwiZm9yRWFjaCIsImN5Y2xlIiwicnVsZU5hbWVzIiwicnVsZU5hbWVzRnJvbUN5Y2xlIiwiZm9yRWFjaFJ1bGVOYW1lQW5kTGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lIiwicnVsZU5hbWUiLCJsZWZ0UmVjdXJzaXZlUnVsZU5hbWUiLCJpbmRpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZSIsImluZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lRnJvbVJ1bGVOYW1lQW5kTGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lIiwiaW5kaXJlY3RseVJlcGVhdGVkUnVsZSIsInJ1bGUiLCJsZWZ0UmVjdXJzaXZlUnVsZSIsIkluZGlyZWN0bHlSZXBlYXRlZFJ1bGUiLCJmcm9tUnVsZUFuZExlZnRSZWN1cnNpdmVSdWxlIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFRQTs7O2VBQXdCQTs7O21FQU5XO3VCQUVBOzJCQUNxQjswQkFDdUI7Ozs7OztBQUVoRSxTQUFTQSw4QkFBOEJDLE1BQU0sRUFBRUMsT0FBTztJQUNuRUQsT0FBT0UsT0FBTyxDQUFDLENBQUNDO1FBQ2QsTUFBTUMsWUFBWUMsSUFBQUEseUJBQWtCLEVBQUNGO1FBRXJDRyxJQUFBQSxrREFBdUMsRUFBQ0YsV0FBVyxDQUFDRyxVQUFVQztZQUM1RCxNQUFNQyw2QkFBNkJDLElBQUFBLHdFQUE4RCxFQUFDSCxVQUFVQztZQUU1RyxJQUFJRyx5QkFBeUJWLE9BQU8sQ0FBQ1EsMkJBQTJCLElBQUk7WUFFcEUsSUFBSUUsMkJBQTJCLE1BQU07Z0JBQ25DLE1BQU1DLE9BQU9YLE9BQU8sQ0FBQ00sU0FBUyxFQUN4Qk0sb0JBQW9CWixPQUFPLENBQUNPLHNCQUFzQjtnQkFFeERHLHlCQUF5QkcsbUJBQXNCLENBQUNDLDRCQUE0QixDQUFDSCxNQUFNQyxtQkFBbUJaO2dCQUV0R0EsT0FBTyxDQUFDUSwyQkFBMkIsR0FBR0U7WUFDeEM7UUFDRjtJQUNGO0FBQ0YifQ==
@@ -0,0 +1,29 @@
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 createReducedRules;
9
+ }
10
+ });
11
+ const _reduced = /*#__PURE__*/ _interop_require_default(require("./rule/reduced"));
12
+ const _cycle = require("./utilities/cycle");
13
+ function _interop_require_default(obj) {
14
+ return obj && obj.__esModule ? obj : {
15
+ default: obj
16
+ };
17
+ }
18
+ function createReducedRules(cycles, ruleMap) {
19
+ const ruleNames = (0, _cycle.ruleNamesFromCycles)(cycles);
20
+ ruleNames.forEach((ruleName)=>{
21
+ const rule = ruleMap[ruleName], reducedRule = _reduced.default.fromRuleAndCycles(rule, cycles, ruleMap);
22
+ if (reducedRule !== null) {
23
+ const reducedRuleName = reducedRule.getName();
24
+ ruleMap[reducedRuleName] = reducedRule;
25
+ }
26
+ });
27
+ }
28
+
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jcmVhdGVSZWR1Y2VkUnVsZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBSZWR1Y2VkUnVsZSBmcm9tIFwiLi9ydWxlL3JlZHVjZWRcIjtcblxuaW1wb3J0IHsgcnVsZU5hbWVzRnJvbUN5Y2xlcyB9IGZyb20gXCIuL3V0aWxpdGllcy9jeWNsZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVSZWR1Y2VkUnVsZXMoY3ljbGVzLCBydWxlTWFwKSB7XG4gIGNvbnN0IHJ1bGVOYW1lcyA9IHJ1bGVOYW1lc0Zyb21DeWNsZXMoY3ljbGVzKTtcblxuICBydWxlTmFtZXMuZm9yRWFjaCgocnVsZU5hbWUpID0+IHtcbiAgICBjb25zdCBydWxlID0gcnVsZU1hcFtydWxlTmFtZV0sXG4gICAgICAgICAgcmVkdWNlZFJ1bGUgPSBSZWR1Y2VkUnVsZS5mcm9tUnVsZUFuZEN5Y2xlcyhydWxlLCBjeWNsZXMsIHJ1bGVNYXApO1xuXG4gICAgaWYgKHJlZHVjZWRSdWxlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCByZWR1Y2VkUnVsZU5hbWUgPSByZWR1Y2VkUnVsZS5nZXROYW1lKCk7XG5cbiAgICAgIHJ1bGVNYXBbcmVkdWNlZFJ1bGVOYW1lXSA9IHJlZHVjZWRSdWxlO1xuICAgIH1cbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlUmVkdWNlZFJ1bGVzIiwiY3ljbGVzIiwicnVsZU1hcCIsInJ1bGVOYW1lcyIsInJ1bGVOYW1lc0Zyb21DeWNsZXMiLCJmb3JFYWNoIiwicnVsZU5hbWUiLCJydWxlIiwicmVkdWNlZFJ1bGUiLCJSZWR1Y2VkUnVsZSIsImZyb21SdWxlQW5kQ3ljbGVzIiwicmVkdWNlZFJ1bGVOYW1lIiwiZ2V0TmFtZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBTUE7OztlQUF3QkE7OztnRUFKQTt1QkFFWTs7Ozs7O0FBRXJCLFNBQVNBLG1CQUFtQkMsTUFBTSxFQUFFQyxPQUFPO0lBQ3hELE1BQU1DLFlBQVlDLElBQUFBLDBCQUFtQixFQUFDSDtJQUV0Q0UsVUFBVUUsT0FBTyxDQUFDLENBQUNDO1FBQ2pCLE1BQU1DLE9BQU9MLE9BQU8sQ0FBQ0ksU0FBUyxFQUN4QkUsY0FBY0MsZ0JBQVcsQ0FBQ0MsaUJBQWlCLENBQUNILE1BQU1OLFFBQVFDO1FBRWhFLElBQUlNLGdCQUFnQixNQUFNO1lBQ3hCLE1BQU1HLGtCQUFrQkgsWUFBWUksT0FBTztZQUUzQ1YsT0FBTyxDQUFDUyxnQkFBZ0IsR0FBR0g7UUFDN0I7SUFDRjtBQUNGIn0=
package/lib/cycle.js ADDED
@@ -0,0 +1,79 @@
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 Cycle;
9
+ }
10
+ });
11
+ const _necessary = require("necessary");
12
+ const { COMMA_CHARACTER } = _necessary.characters;
13
+ class Cycle {
14
+ constructor(edges){
15
+ this.edges = edges;
16
+ }
17
+ getEdges() {
18
+ return this.edges;
19
+ }
20
+ getLength() {
21
+ const length = this.edges.length;
22
+ return length;
23
+ }
24
+ getEdge(index) {
25
+ const edge = this.edges[index];
26
+ return edge;
27
+ }
28
+ getVertexes() {
29
+ const vertexes = this.mapEdge((edge)=>{
30
+ const sourceVertex = edge.getSourceVertex(), vertex = sourceVertex; ///
31
+ return vertex;
32
+ });
33
+ return vertexes;
34
+ }
35
+ mapEdge(callback) {
36
+ return this.edges.map(callback);
37
+ }
38
+ everyEdge(callback) {
39
+ return this.edges.every(callback);
40
+ }
41
+ forEachEdge(callback) {
42
+ return this.edges.forEach(callback);
43
+ }
44
+ isEqualTo(cycle) {
45
+ let equalTo = false;
46
+ const cycleA = this, cycleB = cycle, cycleALength = cycleA.getLength(), cycleBLength = cycleB.getLength();
47
+ if (cycleALength === cycleBLength) {
48
+ equalTo = cycleA.everyEdge((edgeA, index)=>{
49
+ const edgeB = cycleB.getEdge(index), matches = edgeA.match(edgeB);
50
+ if (matches) {
51
+ return true;
52
+ }
53
+ });
54
+ }
55
+ return equalTo;
56
+ }
57
+ permuted() {
58
+ const edges = this.edges.slice(), edge = edges.pop();
59
+ edges.unshift(edge);
60
+ const cycle = new Cycle(edges);
61
+ return cycle;
62
+ }
63
+ asString() {
64
+ const vertexes = this.getVertexes(), string = vertexes.join(COMMA_CHARACTER);
65
+ return string;
66
+ }
67
+ static fromEdge(edge) {
68
+ const edges = [
69
+ edge
70
+ ], cycle = new Cycle(edges);
71
+ return cycle;
72
+ }
73
+ static fromEdges(edges) {
74
+ const cycle = new Cycle(edges);
75
+ return cycle;
76
+ }
77
+ }
78
+
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jeWNsZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgY2hhcmFjdGVycyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuY29uc3QgeyBDT01NQV9DSEFSQUNURVIgfSA9IGNoYXJhY3RlcnM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN5Y2xlIHtcbiAgY29uc3RydWN0b3IoZWRnZXMpIHtcbiAgICB0aGlzLmVkZ2VzID0gZWRnZXM7XG4gIH1cblxuICBnZXRFZGdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5lZGdlcztcbiAgfVxuXG4gIGdldExlbmd0aCgpIHtcbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLmVkZ2VzLmxlbmd0aDtcblxuICAgIHJldHVybiBsZW5ndGg7XG4gIH1cblxuICBnZXRFZGdlKGluZGV4KSB7XG4gICAgY29uc3QgZWRnZSA9IHRoaXMuZWRnZXNbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGVkZ2U7XG4gIH1cblxuICBnZXRWZXJ0ZXhlcygpIHtcbiAgICBjb25zdCB2ZXJ0ZXhlcyA9IHRoaXMubWFwRWRnZSgoZWRnZSkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlVmVydGV4ID0gZWRnZS5nZXRTb3VyY2VWZXJ0ZXgoKSxcbiAgICAgICAgICAgIHZlcnRleCA9IHNvdXJjZVZlcnRleDsgIC8vL1xuXG4gICAgICByZXR1cm4gdmVydGV4O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHZlcnRleGVzO1xuICB9XG5cbiAgbWFwRWRnZShjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5lZGdlcy5tYXAoY2FsbGJhY2spOyB9XG5cbiAgZXZlcnlFZGdlKGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLmVkZ2VzLmV2ZXJ5KGNhbGxiYWNrKTsgfVxuXG4gIGZvckVhY2hFZGdlKGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLmVkZ2VzLmZvckVhY2goY2FsbGJhY2spOyB9XG5cbiAgaXNFcXVhbFRvKGN5Y2xlKSB7XG4gICAgbGV0IGVxdWFsVG8gPSBmYWxzZTtcblxuICAgIGNvbnN0IGN5Y2xlQSA9IHRoaXMsICAvLy9cbiAgICAgICAgICBjeWNsZUIgPSBjeWNsZSwgIC8vL1xuICAgICAgICAgIGN5Y2xlQUxlbmd0aCA9IGN5Y2xlQS5nZXRMZW5ndGgoKSxcbiAgICAgICAgICBjeWNsZUJMZW5ndGggPSBjeWNsZUIuZ2V0TGVuZ3RoKCk7XG5cbiAgICBpZiAoY3ljbGVBTGVuZ3RoID09PSBjeWNsZUJMZW5ndGgpIHtcbiAgICAgIGVxdWFsVG8gPSBjeWNsZUEuZXZlcnlFZGdlKChlZGdlQSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZWRnZUIgPSBjeWNsZUIuZ2V0RWRnZShpbmRleCksXG4gICAgICAgICAgICAgIG1hdGNoZXMgPSBlZGdlQS5tYXRjaChlZGdlQik7XG5cbiAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVxdWFsVG87XG4gIH1cblxuICBwZXJtdXRlZCgpIHtcbiAgICBjb25zdCBlZGdlcyA9IHRoaXMuZWRnZXMuc2xpY2UoKSwgLy8vXG4gICAgICAgICAgZWRnZSA9IGVkZ2VzLnBvcCgpO1xuXG4gICAgZWRnZXMudW5zaGlmdChlZGdlKTtcblxuICAgIGNvbnN0IGN5Y2xlID0gbmV3IEN5Y2xlKGVkZ2VzKTtcblxuICAgIHJldHVybiBjeWNsZTtcbiAgfVxuXG4gIGFzU3RyaW5nKCkge1xuICAgIGNvbnN0IHZlcnRleGVzID0gdGhpcy5nZXRWZXJ0ZXhlcygpLFxuICAgICAgICAgIHN0cmluZyA9IHZlcnRleGVzLmpvaW4oQ09NTUFfQ0hBUkFDVEVSKTtcblxuICAgIHJldHVybiBzdHJpbmc7XG4gIH1cblxuICBzdGF0aWMgZnJvbUVkZ2UoZWRnZSkge1xuICAgIGNvbnN0IGVkZ2VzID0gW1xuICAgICAgICAgICAgZWRnZVxuICAgICAgICAgIF0sXG4gICAgICAgICAgY3ljbGUgPSBuZXcgQ3ljbGUoZWRnZXMpO1xuXG4gICAgcmV0dXJuIGN5Y2xlO1xuICB9XG5cbiAgc3RhdGljIGZyb21FZGdlcyhlZGdlcykge1xuICAgIGNvbnN0IGN5Y2xlID0gbmV3IEN5Y2xlKGVkZ2VzKTtcblxuICAgIHJldHVybiBjeWNsZTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkN5Y2xlIiwiQ09NTUFfQ0hBUkFDVEVSIiwiY2hhcmFjdGVycyIsImVkZ2VzIiwiZ2V0RWRnZXMiLCJnZXRMZW5ndGgiLCJsZW5ndGgiLCJnZXRFZGdlIiwiaW5kZXgiLCJlZGdlIiwiZ2V0VmVydGV4ZXMiLCJ2ZXJ0ZXhlcyIsIm1hcEVkZ2UiLCJzb3VyY2VWZXJ0ZXgiLCJnZXRTb3VyY2VWZXJ0ZXgiLCJ2ZXJ0ZXgiLCJjYWxsYmFjayIsIm1hcCIsImV2ZXJ5RWRnZSIsImV2ZXJ5IiwiZm9yRWFjaEVkZ2UiLCJmb3JFYWNoIiwiaXNFcXVhbFRvIiwiY3ljbGUiLCJlcXVhbFRvIiwiY3ljbGVBIiwiY3ljbGVCIiwiY3ljbGVBTGVuZ3RoIiwiY3ljbGVCTGVuZ3RoIiwiZWRnZUEiLCJlZGdlQiIsIm1hdGNoZXMiLCJtYXRjaCIsInBlcm11dGVkIiwic2xpY2UiLCJwb3AiLCJ1bnNoaWZ0IiwiYXNTdHJpbmciLCJzdHJpbmciLCJqb2luIiwiZnJvbUVkZ2UiLCJmcm9tRWRnZXMiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQU1BOzs7ZUFBcUJBOzs7MkJBSk07QUFFM0IsTUFBTSxFQUFFQyxlQUFlLEVBQUUsR0FBR0MscUJBQVU7QUFFdkIsTUFBTUY7SUFDbkIsWUFBWUcsS0FBSyxDQUFFO1FBQ2pCLElBQUksQ0FBQ0EsS0FBSyxHQUFHQTtJQUNmO0lBRUFDLFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQ0QsS0FBSztJQUNuQjtJQUVBRSxZQUFZO1FBQ1YsTUFBTUMsU0FBUyxJQUFJLENBQUNILEtBQUssQ0FBQ0csTUFBTTtRQUVoQyxPQUFPQTtJQUNUO0lBRUFDLFFBQVFDLEtBQUssRUFBRTtRQUNiLE1BQU1DLE9BQU8sSUFBSSxDQUFDTixLQUFLLENBQUNLLE1BQU07UUFFOUIsT0FBT0M7SUFDVDtJQUVBQyxjQUFjO1FBQ1osTUFBTUMsV0FBVyxJQUFJLENBQUNDLE9BQU8sQ0FBQyxDQUFDSDtZQUM3QixNQUFNSSxlQUFlSixLQUFLSyxlQUFlLElBQ25DQyxTQUFTRixjQUFlLEdBQUc7WUFFakMsT0FBT0U7UUFDVDtRQUVBLE9BQU9KO0lBQ1Q7SUFFQUMsUUFBUUksUUFBUSxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUNiLEtBQUssQ0FBQ2MsR0FBRyxDQUFDRDtJQUFXO0lBRXJERSxVQUFVRixRQUFRLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQ2IsS0FBSyxDQUFDZ0IsS0FBSyxDQUFDSDtJQUFXO0lBRXpESSxZQUFZSixRQUFRLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQ2IsS0FBSyxDQUFDa0IsT0FBTyxDQUFDTDtJQUFXO0lBRTdETSxVQUFVQyxLQUFLLEVBQUU7UUFDZixJQUFJQyxVQUFVO1FBRWQsTUFBTUMsU0FBUyxJQUFJLEVBQ2JDLFNBQVNILE9BQ1RJLGVBQWVGLE9BQU9wQixTQUFTLElBQy9CdUIsZUFBZUYsT0FBT3JCLFNBQVM7UUFFckMsSUFBSXNCLGlCQUFpQkMsY0FBYztZQUNqQ0osVUFBVUMsT0FBT1AsU0FBUyxDQUFDLENBQUNXLE9BQU9yQjtnQkFDakMsTUFBTXNCLFFBQVFKLE9BQU9uQixPQUFPLENBQUNDLFFBQ3ZCdUIsVUFBVUYsTUFBTUcsS0FBSyxDQUFDRjtnQkFFNUIsSUFBSUMsU0FBUztvQkFDWCxPQUFPO2dCQUNUO1lBQ0Y7UUFDRjtRQUVBLE9BQU9QO0lBQ1Q7SUFFQVMsV0FBVztRQUNULE1BQU05QixRQUFRLElBQUksQ0FBQ0EsS0FBSyxDQUFDK0IsS0FBSyxJQUN4QnpCLE9BQU9OLE1BQU1nQyxHQUFHO1FBRXRCaEMsTUFBTWlDLE9BQU8sQ0FBQzNCO1FBRWQsTUFBTWMsUUFBUSxJQUFJdkIsTUFBTUc7UUFFeEIsT0FBT29CO0lBQ1Q7SUFFQWMsV0FBVztRQUNULE1BQU0xQixXQUFXLElBQUksQ0FBQ0QsV0FBVyxJQUMzQjRCLFNBQVMzQixTQUFTNEIsSUFBSSxDQUFDdEM7UUFFN0IsT0FBT3FDO0lBQ1Q7SUFFQSxPQUFPRSxTQUFTL0IsSUFBSSxFQUFFO1FBQ3BCLE1BQU1OLFFBQVE7WUFDTk07U0FDRCxFQUNEYyxRQUFRLElBQUl2QixNQUFNRztRQUV4QixPQUFPb0I7SUFDVDtJQUVBLE9BQU9rQixVQUFVdEMsS0FBSyxFQUFFO1FBQ3RCLE1BQU1vQixRQUFRLElBQUl2QixNQUFNRztRQUV4QixPQUFPb0I7SUFDVDtBQUNGIn0=
@@ -0,0 +1,22 @@
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 EpsilonDefinition;
9
+ }
10
+ });
11
+ const _occamparsers = require("occam-parsers");
12
+ const { EpsilonPart } = _occamparsers.Parts;
13
+ class EpsilonDefinition extends _occamparsers.Definition {
14
+ static fromPrecedence(precedence) {
15
+ const epsilonPart = EpsilonPart.fromNothing(), parts = [
16
+ epsilonPart
17
+ ], epsilonDefinition = EpsilonDefinition.fromPartsAndPrecedence(parts, precedence);
18
+ return epsilonDefinition;
19
+ }
20
+ }
21
+
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWZpbml0aW9uL2Vwc2lsb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IFBhcnRzLCBEZWZpbml0aW9uIH0gZnJvbSBcIm9jY2FtLXBhcnNlcnNcIjtcblxuY29uc3QgeyBFcHNpbG9uUGFydCB9ID0gUGFydHM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVwc2lsb25EZWZpbml0aW9uIGV4dGVuZHMgRGVmaW5pdGlvbiB7XG4gIHN0YXRpYyBmcm9tUHJlY2VkZW5jZShwcmVjZWRlbmNlKSB7XG4gICAgY29uc3QgZXBzaWxvblBhcnQgPSBFcHNpbG9uUGFydC5mcm9tTm90aGluZygpLFxuICAgICAgICAgIHBhcnRzID0gW1xuICAgICAgICAgICAgZXBzaWxvblBhcnRcbiAgICAgICAgICBdLFxuICAgICAgICAgIGVwc2lsb25EZWZpbml0aW9uID0gRXBzaWxvbkRlZmluaXRpb24uZnJvbVBhcnRzQW5kUHJlY2VkZW5jZShwYXJ0cywgcHJlY2VkZW5jZSk7XG5cbiAgICByZXR1cm4gZXBzaWxvbkRlZmluaXRpb247XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJFcHNpbG9uRGVmaW5pdGlvbiIsIkVwc2lsb25QYXJ0IiwiUGFydHMiLCJEZWZpbml0aW9uIiwiZnJvbVByZWNlZGVuY2UiLCJwcmVjZWRlbmNlIiwiZXBzaWxvblBhcnQiLCJmcm9tTm90aGluZyIsInBhcnRzIiwiZXBzaWxvbkRlZmluaXRpb24iLCJmcm9tUGFydHNBbmRQcmVjZWRlbmNlIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFNQTs7O2VBQXFCQTs7OzhCQUphO0FBRWxDLE1BQU0sRUFBRUMsV0FBVyxFQUFFLEdBQUdDLG1CQUFLO0FBRWQsTUFBTUYsMEJBQTBCRyx3QkFBVTtJQUN2RCxPQUFPQyxlQUFlQyxVQUFVLEVBQUU7UUFDaEMsTUFBTUMsY0FBY0wsWUFBWU0sV0FBVyxJQUNyQ0MsUUFBUTtZQUNORjtTQUNELEVBQ0RHLG9CQUFvQlQsa0JBQWtCVSxzQkFBc0IsQ0FBQ0YsT0FBT0g7UUFFMUUsT0FBT0k7SUFDVDtBQUNGIn0=
@@ -0,0 +1,56 @@
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 DirectlyRepeatedDefinition;
9
+ }
10
+ });
11
+ const _occamparsers = require("occam-parsers");
12
+ const _cycle = require("../../utilities/cycle");
13
+ const _ruleNames = require("../../utilities/ruleNames");
14
+ const _part = require("../../utilities/part");
15
+ const _ruleName = require("../../utilities/ruleName");
16
+ class DirectlyRepeatedDefinition extends _occamparsers.Definition {
17
+ static fromRuleAndCycle(rule, cycle) {
18
+ let directlyRepeatedDefinition = null;
19
+ const ruleName = rule.getName(), ruleNames = (0, _cycle.ruleNamesFromCycle)(cycle), ruleNameIncludesRuleName = ruleNames.includes(ruleName);
20
+ if (ruleNameIncludesRuleName) {
21
+ const permutedRuleNames = (0, _ruleNames.permuteRuleNames)(ruleNames, ruleName), path = permutedRuleNames, parts = partsFromPath(path), precedence = null;
22
+ directlyRepeatedDefinition = new DirectlyRepeatedDefinition(parts, precedence);
23
+ }
24
+ return directlyRepeatedDefinition;
25
+ }
26
+ }
27
+ function permutePath(path) {
28
+ const permutedPath = path.slice(); ///
29
+ permutedPath.reverse();
30
+ const ruleName = permutedPath.pop();
31
+ permutedPath.unshift(ruleName);
32
+ return permutedPath;
33
+ }
34
+ function partsFromPath(path) {
35
+ const permutedPath = permutePath(path), ruleNames = permutedPath, parts = [];
36
+ (0, _ruleNames.forEachRuleNameAndLeftRecursiveRuleName)(ruleNames, (ruleName, leftRecursiveRuleName)=>{
37
+ const temporaryRuleName = leftRecursiveRuleName; ///
38
+ leftRecursiveRuleName = ruleName; ///
39
+ ruleName = temporaryRuleName; ///
40
+ const indirectlyRepeatedPart = indirectlyRepeatedPartFromRuleNameAndLeftReucrsiveRuleName(ruleName, leftRecursiveRuleName), directlyRepeatedPart = directlyRepeatedPartFromRuleName(ruleName);
41
+ parts.push(indirectlyRepeatedPart);
42
+ parts.push(directlyRepeatedPart);
43
+ });
44
+ parts.pop();
45
+ return parts;
46
+ }
47
+ function directlyRepeatedPartFromRuleName(ruleName) {
48
+ const directlyRepeatedRuleName = (0, _ruleName.directlyRepeatedRuleNameFromRuleName)(ruleName), directlyRepeatedRuleNamePart = (0, _part.ruleNamePartFromRuleName)(directlyRepeatedRuleName), zeroOrMoreDirectlyRepeatedRuleNamePartsPart = (0, _part.zeroOrMorePartsPartFromPart)(directlyRepeatedRuleNamePart), directlyRepeatedPart = zeroOrMoreDirectlyRepeatedRuleNamePartsPart; ///
49
+ return directlyRepeatedPart;
50
+ }
51
+ function indirectlyRepeatedPartFromRuleNameAndLeftReucrsiveRuleName(ruleName, leftRecursiveRuleName) {
52
+ const indirectlyRepeatedRuleName = (0, _ruleName.indirectlyRepeatedRuleNameFromRuleNameAndLeftRecursiveRuleName)(ruleName, leftRecursiveRuleName), indirectlyRepeatedRuleNamePart = (0, _part.ruleNamePartFromRuleName)(indirectlyRepeatedRuleName), indirectlyRepeatedPart = indirectlyRepeatedRuleNamePart; ///
53
+ return indirectlyRepeatedPart;
54
+ }
55
+
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWZpbml0aW9uL3JlcGVhdGVkL2RpcmVjdGx5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBEZWZpbml0aW9uIH0gZnJvbSBcIm9jY2FtLXBhcnNlcnNcIjtcbmltcG9ydCB7IHJ1bGVOYW1lc0Zyb21DeWNsZSB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvY3ljbGVcIjtcbmltcG9ydCB7IHBlcm11dGVSdWxlTmFtZXMsIGZvckVhY2hSdWxlTmFtZUFuZExlZnRSZWN1cnNpdmVSdWxlTmFtZSB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvcnVsZU5hbWVzXCI7XG5pbXBvcnQgeyBydWxlTmFtZVBhcnRGcm9tUnVsZU5hbWUsIHplcm9Pck1vcmVQYXJ0c1BhcnRGcm9tUGFydCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvcGFydFwiO1xuaW1wb3J0IHsgZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lRnJvbVJ1bGVOYW1lLCBpbmRpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZUZyb21SdWxlTmFtZUFuZExlZnRSZWN1cnNpdmVSdWxlTmFtZSB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvcnVsZU5hbWVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlyZWN0bHlSZXBlYXRlZERlZmluaXRpb24gZXh0ZW5kcyBEZWZpbml0aW9uIHtcbiAgc3RhdGljIGZyb21SdWxlQW5kQ3ljbGUocnVsZSwgY3ljbGUpIHtcbiAgICBsZXQgZGlyZWN0bHlSZXBlYXRlZERlZmluaXRpb24gPSBudWxsO1xuXG4gICAgY29uc3QgcnVsZU5hbWUgPSBydWxlLmdldE5hbWUoKSxcbiAgICAgICAgICBydWxlTmFtZXMgPSBydWxlTmFtZXNGcm9tQ3ljbGUoY3ljbGUpLFxuICAgICAgICAgIHJ1bGVOYW1lSW5jbHVkZXNSdWxlTmFtZSA9IHJ1bGVOYW1lcy5pbmNsdWRlcyhydWxlTmFtZSk7XG5cbiAgICBpZiAocnVsZU5hbWVJbmNsdWRlc1J1bGVOYW1lKSB7XG4gICAgICBjb25zdCBwZXJtdXRlZFJ1bGVOYW1lcyA9IHBlcm11dGVSdWxlTmFtZXMocnVsZU5hbWVzLCBydWxlTmFtZSksXG4gICAgICAgICAgICBwYXRoID0gcGVybXV0ZWRSdWxlTmFtZXMsIC8vL1xuICAgICAgICAgICAgcGFydHMgPSBwYXJ0c0Zyb21QYXRoKHBhdGgpLFxuICAgICAgICAgICAgcHJlY2VkZW5jZSA9IG51bGw7XG5cbiAgICAgIGRpcmVjdGx5UmVwZWF0ZWREZWZpbml0aW9uID0gbmV3IERpcmVjdGx5UmVwZWF0ZWREZWZpbml0aW9uKHBhcnRzLCBwcmVjZWRlbmNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyZWN0bHlSZXBlYXRlZERlZmluaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVybXV0ZVBhdGgocGF0aCkge1xuICBjb25zdCBwZXJtdXRlZFBhdGggPSBwYXRoLnNsaWNlKCk7ICAvLy9cblxuICBwZXJtdXRlZFBhdGgucmV2ZXJzZSgpO1xuXG4gIGNvbnN0IHJ1bGVOYW1lID0gcGVybXV0ZWRQYXRoLnBvcCgpO1xuXG4gIHBlcm11dGVkUGF0aC51bnNoaWZ0KHJ1bGVOYW1lKTtcblxuICByZXR1cm4gcGVybXV0ZWRQYXRoO1xufVxuXG5mdW5jdGlvbiBwYXJ0c0Zyb21QYXRoKHBhdGgpIHtcbiAgY29uc3QgcGVybXV0ZWRQYXRoID0gcGVybXV0ZVBhdGgocGF0aCksXG4gICAgICAgIHJ1bGVOYW1lcyA9IHBlcm11dGVkUGF0aCwgLy8vXG4gICAgICAgIHBhcnRzID0gW107XG5cbiAgZm9yRWFjaFJ1bGVOYW1lQW5kTGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lKHJ1bGVOYW1lcywgKHJ1bGVOYW1lLCBsZWZ0UmVjdXJzaXZlUnVsZU5hbWUpID0+IHtcbiAgICBjb25zdCB0ZW1wb3JhcnlSdWxlTmFtZSA9IGxlZnRSZWN1cnNpdmVSdWxlTmFtZTsgLy8vXG5cbiAgICBsZWZ0UmVjdXJzaXZlUnVsZU5hbWUgPSBydWxlTmFtZTsgLy8vXG5cbiAgICBydWxlTmFtZSA9IHRlbXBvcmFyeVJ1bGVOYW1lOyAgLy8vXG5cbiAgICBjb25zdCBpbmRpcmVjdGx5UmVwZWF0ZWRQYXJ0ID0gaW5kaXJlY3RseVJlcGVhdGVkUGFydEZyb21SdWxlTmFtZUFuZExlZnRSZXVjcnNpdmVSdWxlTmFtZShydWxlTmFtZSwgbGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lKSxcbiAgICAgICAgICBkaXJlY3RseVJlcGVhdGVkUGFydCA9IGRpcmVjdGx5UmVwZWF0ZWRQYXJ0RnJvbVJ1bGVOYW1lKHJ1bGVOYW1lKTtcblxuICAgIHBhcnRzLnB1c2goaW5kaXJlY3RseVJlcGVhdGVkUGFydCk7XG5cbiAgICBwYXJ0cy5wdXNoKGRpcmVjdGx5UmVwZWF0ZWRQYXJ0KTtcbiAgfSk7XG5cbiAgcGFydHMucG9wKCk7XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG5mdW5jdGlvbiBkaXJlY3RseVJlcGVhdGVkUGFydEZyb21SdWxlTmFtZShydWxlTmFtZSkge1xuICBjb25zdCBkaXJlY3RseVJlcGVhdGVkUnVsZU5hbWUgPSBkaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVGcm9tUnVsZU5hbWUocnVsZU5hbWUpLFxuICAgICAgICBkaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVQYXJ0ID0gcnVsZU5hbWVQYXJ0RnJvbVJ1bGVOYW1lKGRpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZSksXG4gICAgICAgIHplcm9Pck1vcmVEaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVQYXJ0c1BhcnQgPSB6ZXJvT3JNb3JlUGFydHNQYXJ0RnJvbVBhcnQoZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lUGFydCksXG4gICAgICAgIGRpcmVjdGx5UmVwZWF0ZWRQYXJ0ID0gemVyb09yTW9yZURpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZVBhcnRzUGFydDsgLy8vXG5cbiAgcmV0dXJuIGRpcmVjdGx5UmVwZWF0ZWRQYXJ0O1xufVxuXG5mdW5jdGlvbiBpbmRpcmVjdGx5UmVwZWF0ZWRQYXJ0RnJvbVJ1bGVOYW1lQW5kTGVmdFJldWNyc2l2ZVJ1bGVOYW1lKHJ1bGVOYW1lLCBsZWZ0UmVjdXJzaXZlUnVsZU5hbWUpIHtcbiAgY29uc3QgaW5kaXJlY3RseVJlcGVhdGVkUnVsZU5hbWUgPSBpbmRpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZUZyb21SdWxlTmFtZUFuZExlZnRSZWN1cnNpdmVSdWxlTmFtZShydWxlTmFtZSwgbGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lKSxcbiAgICAgICAgaW5kaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVQYXJ0ID0gcnVsZU5hbWVQYXJ0RnJvbVJ1bGVOYW1lKGluZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lKSxcbiAgICAgICAgaW5kaXJlY3RseVJlcGVhdGVkUGFydCA9IGluZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lUGFydDsgIC8vL1xuXG4gIHJldHVybiBpbmRpcmVjdGx5UmVwZWF0ZWRQYXJ0O1xufVxuIl0sIm5hbWVzIjpbIkRpcmVjdGx5UmVwZWF0ZWREZWZpbml0aW9uIiwiRGVmaW5pdGlvbiIsImZyb21SdWxlQW5kQ3ljbGUiLCJydWxlIiwiY3ljbGUiLCJkaXJlY3RseVJlcGVhdGVkRGVmaW5pdGlvbiIsInJ1bGVOYW1lIiwiZ2V0TmFtZSIsInJ1bGVOYW1lcyIsInJ1bGVOYW1lc0Zyb21DeWNsZSIsInJ1bGVOYW1lSW5jbHVkZXNSdWxlTmFtZSIsImluY2x1ZGVzIiwicGVybXV0ZWRSdWxlTmFtZXMiLCJwZXJtdXRlUnVsZU5hbWVzIiwicGF0aCIsInBhcnRzIiwicGFydHNGcm9tUGF0aCIsInByZWNlZGVuY2UiLCJwZXJtdXRlUGF0aCIsInBlcm11dGVkUGF0aCIsInNsaWNlIiwicmV2ZXJzZSIsInBvcCIsInVuc2hpZnQiLCJmb3JFYWNoUnVsZU5hbWVBbmRMZWZ0UmVjdXJzaXZlUnVsZU5hbWUiLCJsZWZ0UmVjdXJzaXZlUnVsZU5hbWUiLCJ0ZW1wb3JhcnlSdWxlTmFtZSIsImluZGlyZWN0bHlSZXBlYXRlZFBhcnQiLCJpbmRpcmVjdGx5UmVwZWF0ZWRQYXJ0RnJvbVJ1bGVOYW1lQW5kTGVmdFJldWNyc2l2ZVJ1bGVOYW1lIiwiZGlyZWN0bHlSZXBlYXRlZFBhcnQiLCJkaXJlY3RseVJlcGVhdGVkUGFydEZyb21SdWxlTmFtZSIsInB1c2giLCJkaXJlY3RseVJlcGVhdGVkUnVsZU5hbWUiLCJkaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVGcm9tUnVsZU5hbWUiLCJkaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVQYXJ0IiwicnVsZU5hbWVQYXJ0RnJvbVJ1bGVOYW1lIiwiemVyb09yTW9yZURpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZVBhcnRzUGFydCIsInplcm9Pck1vcmVQYXJ0c1BhcnRGcm9tUGFydCIsImluZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lIiwiaW5kaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVGcm9tUnVsZU5hbWVBbmRMZWZ0UmVjdXJzaXZlUnVsZU5hbWUiLCJpbmRpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZVBhcnQiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQVFBOzs7ZUFBcUJBOzs7OEJBTk07dUJBQ1E7MkJBQ3VDO3NCQUNKOzBCQUMrQztBQUV0RyxNQUFNQSxtQ0FBbUNDLHdCQUFVO0lBQ2hFLE9BQU9DLGlCQUFpQkMsSUFBSSxFQUFFQyxLQUFLLEVBQUU7UUFDbkMsSUFBSUMsNkJBQTZCO1FBRWpDLE1BQU1DLFdBQVdILEtBQUtJLE9BQU8sSUFDdkJDLFlBQVlDLElBQUFBLHlCQUFrQixFQUFDTCxRQUMvQk0sMkJBQTJCRixVQUFVRyxRQUFRLENBQUNMO1FBRXBELElBQUlJLDBCQUEwQjtZQUM1QixNQUFNRSxvQkFBb0JDLElBQUFBLDJCQUFnQixFQUFDTCxXQUFXRixXQUNoRFEsT0FBT0YsbUJBQ1BHLFFBQVFDLGNBQWNGLE9BQ3RCRyxhQUFhO1lBRW5CWiw2QkFBNkIsSUFBSUwsMkJBQTJCZSxPQUFPRTtRQUNyRTtRQUVBLE9BQU9aO0lBQ1Q7QUFDRjtBQUVBLFNBQVNhLFlBQVlKLElBQUk7SUFDdkIsTUFBTUssZUFBZUwsS0FBS00sS0FBSyxJQUFLLEdBQUc7SUFFdkNELGFBQWFFLE9BQU87SUFFcEIsTUFBTWYsV0FBV2EsYUFBYUcsR0FBRztJQUVqQ0gsYUFBYUksT0FBTyxDQUFDakI7SUFFckIsT0FBT2E7QUFDVDtBQUVBLFNBQVNILGNBQWNGLElBQUk7SUFDekIsTUFBTUssZUFBZUQsWUFBWUosT0FDM0JOLFlBQVlXLGNBQ1pKLFFBQVEsRUFBRTtJQUVoQlMsSUFBQUEsa0RBQXVDLEVBQUNoQixXQUFXLENBQUNGLFVBQVVtQjtRQUM1RCxNQUFNQyxvQkFBb0JELHVCQUF1QixHQUFHO1FBRXBEQSx3QkFBd0JuQixVQUFVLEdBQUc7UUFFckNBLFdBQVdvQixtQkFBb0IsR0FBRztRQUVsQyxNQUFNQyx5QkFBeUJDLDJEQUEyRHRCLFVBQVVtQix3QkFDOUZJLHVCQUF1QkMsaUNBQWlDeEI7UUFFOURTLE1BQU1nQixJQUFJLENBQUNKO1FBRVhaLE1BQU1nQixJQUFJLENBQUNGO0lBQ2I7SUFFQWQsTUFBTU8sR0FBRztJQUVULE9BQU9QO0FBQ1Q7QUFFQSxTQUFTZSxpQ0FBaUN4QixRQUFRO0lBQ2hELE1BQU0wQiwyQkFBMkJDLElBQUFBLDhDQUFvQyxFQUFDM0IsV0FDaEU0QiwrQkFBK0JDLElBQUFBLDhCQUF3QixFQUFDSCwyQkFDeERJLDhDQUE4Q0MsSUFBQUEsaUNBQTJCLEVBQUNILCtCQUMxRUwsdUJBQXVCTyw2Q0FBNkMsR0FBRztJQUU3RSxPQUFPUDtBQUNUO0FBRUEsU0FBU0QsMkRBQTJEdEIsUUFBUSxFQUFFbUIscUJBQXFCO0lBQ2pHLE1BQU1hLDZCQUE2QkMsSUFBQUEsd0VBQThELEVBQUNqQyxVQUFVbUIsd0JBQ3RHZSxpQ0FBaUNMLElBQUFBLDhCQUF3QixFQUFDRyw2QkFDMURYLHlCQUF5QmEsZ0NBQWlDLEdBQUc7SUFFbkUsT0FBT2I7QUFDVCJ9
@@ -0,0 +1,63 @@
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 RewrittenDefinition;
9
+ }
10
+ });
11
+ const _occamparsers = require("occam-parsers");
12
+ const _necessary = require("necessary");
13
+ const _ruleNames = require("../utilities/ruleNames");
14
+ const _path = require("../utilities/path");
15
+ const _part = require("../utilities/part");
16
+ const _ruleName = require("../utilities/ruleName");
17
+ const { first } = _necessary.arrayUtilities;
18
+ class RewrittenDefinition extends _occamparsers.Definition {
19
+ static fromPath(path, ruleMap) {
20
+ let rewrittenDefinition = null;
21
+ const reducedRuleName = (0, _path.reducedRuleNameFromPath)(path), reducedRule = ruleMap[reducedRuleName] || null;
22
+ if (reducedRule !== null) {
23
+ rewrittenDefinition = rewrittenDefinitionFromPath(path);
24
+ }
25
+ return rewrittenDefinition;
26
+ }
27
+ }
28
+ function reversePath(path) {
29
+ const reversedPath = path.slice();
30
+ reversedPath.reverse();
31
+ return reversedPath;
32
+ }
33
+ function rewrittenDefinitionFromPath(path) {
34
+ const reducedRuleNamePart = (0, _path.reducedRuleNamePartFromPath)(path), reversedPath = reversePath(path), ruleNames = reversedPath, ruleNamesLength = ruleNames.length, lastIndex = ruleNamesLength - 1, parts = []; ///
35
+ parts.push(reducedRuleNamePart);
36
+ (0, _ruleNames.forEachRuleNameAndLeftRecursiveRuleName)(ruleNames, (ruleName, leftRecursiveRuleName, index)=>{
37
+ if (index < lastIndex) {
38
+ const directlyRepeatedPart = directlyRepeatedPartFromRuleName(ruleName);
39
+ parts.push(directlyRepeatedPart);
40
+ const temporaryRuleName = leftRecursiveRuleName; ///
41
+ leftRecursiveRuleName = ruleName; ///
42
+ ruleName = temporaryRuleName; ///
43
+ const indirectlyRepeatedPart = indirectlyRepeatedPartFromRuleNameAndLeftRecursiveRuleName(ruleName, leftRecursiveRuleName);
44
+ parts.push(indirectlyRepeatedPart);
45
+ }
46
+ });
47
+ if (ruleNamesLength === 1) {
48
+ const firstRuleName = first(ruleNames), ruleName = firstRuleName, directlyRepeatedPart = directlyRepeatedPartFromRuleName(ruleName);
49
+ parts.push(directlyRepeatedPart);
50
+ }
51
+ const precedence = null, rewrittenDefinition = new RewrittenDefinition(parts, precedence);
52
+ return rewrittenDefinition;
53
+ }
54
+ function directlyRepeatedPartFromRuleName(ruleName) {
55
+ const directlyRepeatedRuleName = (0, _ruleName.directlyRepeatedRuleNameFromRuleName)(ruleName), directlyRepeatedRuleNamePart = (0, _part.ruleNamePartFromRuleName)(directlyRepeatedRuleName), zeroOrMoreDirectlyRepeatedRuleNamePartsPart = (0, _part.zeroOrMorePartsPartFromPart)(directlyRepeatedRuleNamePart), directlyRepeatedPart = zeroOrMoreDirectlyRepeatedRuleNamePartsPart; ///
56
+ return directlyRepeatedPart;
57
+ }
58
+ function indirectlyRepeatedPartFromRuleNameAndLeftRecursiveRuleName(ruleName, leftRecursiveRuleName) {
59
+ const indirectlyRepeatedRuleName = (0, _ruleName.indirectlyRepeatedRuleNameFromRuleNameAndLeftRecursiveRuleName)(ruleName, leftRecursiveRuleName), indirectlyRepeatedRuleNamePart = (0, _part.ruleNamePartFromRuleName)(indirectlyRepeatedRuleName), indirectlyRepeatedPart = indirectlyRepeatedRuleNamePart; ///
60
+ return indirectlyRepeatedPart;
61
+ }
62
+
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWZpbml0aW9uL3Jld3JpdHRlbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRGVmaW5pdGlvbiB9IGZyb20gXCJvY2NhbS1wYXJzZXJzXCI7XG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IHsgZm9yRWFjaFJ1bGVOYW1lQW5kTGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9ydWxlTmFtZXNcIjtcbmltcG9ydCB7IHJlZHVjZWRSdWxlTmFtZUZyb21QYXRoLCByZWR1Y2VkUnVsZU5hbWVQYXJ0RnJvbVBhdGggfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3BhdGhcIjtcbmltcG9ydCB7IHJ1bGVOYW1lUGFydEZyb21SdWxlTmFtZSwgemVyb09yTW9yZVBhcnRzUGFydEZyb21QYXJ0IH0gZnJvbSBcIi4uL3V0aWxpdGllcy9wYXJ0XCI7XG5pbXBvcnQgeyBkaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVGcm9tUnVsZU5hbWUsIGluZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lRnJvbVJ1bGVOYW1lQW5kTGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9ydWxlTmFtZVwiO1xuXG5jb25zdCB7IGZpcnN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmV3cml0dGVuRGVmaW5pdGlvbiBleHRlbmRzIERlZmluaXRpb24ge1xuICBzdGF0aWMgZnJvbVBhdGgocGF0aCwgcnVsZU1hcCkge1xuICAgIGxldCByZXdyaXR0ZW5EZWZpbml0aW9uID0gbnVsbDtcblxuICAgIGNvbnN0IHJlZHVjZWRSdWxlTmFtZSA9IHJlZHVjZWRSdWxlTmFtZUZyb21QYXRoKHBhdGgpLFxuICAgICAgICAgIHJlZHVjZWRSdWxlID0gcnVsZU1hcFtyZWR1Y2VkUnVsZU5hbWVdIHx8IG51bGw7XG5cbiAgICBpZiAocmVkdWNlZFJ1bGUgIT09IG51bGwpIHtcbiAgICAgIHJld3JpdHRlbkRlZmluaXRpb24gPSByZXdyaXR0ZW5EZWZpbml0aW9uRnJvbVBhdGgocGF0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJld3JpdHRlbkRlZmluaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBhdGgocGF0aCkge1xuICBjb25zdCByZXZlcnNlZFBhdGggPSBwYXRoLnNsaWNlKCk7XG5cbiAgcmV2ZXJzZWRQYXRoLnJldmVyc2UoKTtcblxuICByZXR1cm4gcmV2ZXJzZWRQYXRoO1xufVxuXG5mdW5jdGlvbiByZXdyaXR0ZW5EZWZpbml0aW9uRnJvbVBhdGgocGF0aCkge1xuICBjb25zdCByZWR1Y2VkUnVsZU5hbWVQYXJ0ID0gcmVkdWNlZFJ1bGVOYW1lUGFydEZyb21QYXRoKHBhdGgpLFxuICAgICAgICByZXZlcnNlZFBhdGggPSByZXZlcnNlUGF0aChwYXRoKSxcbiAgICAgICAgcnVsZU5hbWVzID0gcmV2ZXJzZWRQYXRoLCAvLy9cbiAgICAgICAgcnVsZU5hbWVzTGVuZ3RoID0gcnVsZU5hbWVzLmxlbmd0aCxcbiAgICAgICAgbGFzdEluZGV4ID0gcnVsZU5hbWVzTGVuZ3RoIC0gMSxcbiAgICAgICAgcGFydHMgPSBbXTsgLy8vXG5cbiAgcGFydHMucHVzaChyZWR1Y2VkUnVsZU5hbWVQYXJ0KTtcblxuICBmb3JFYWNoUnVsZU5hbWVBbmRMZWZ0UmVjdXJzaXZlUnVsZU5hbWUocnVsZU5hbWVzLCAocnVsZU5hbWUsIGxlZnRSZWN1cnNpdmVSdWxlTmFtZSwgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXggPCBsYXN0SW5kZXgpIHtcbiAgICAgIGNvbnN0IGRpcmVjdGx5UmVwZWF0ZWRQYXJ0ID0gZGlyZWN0bHlSZXBlYXRlZFBhcnRGcm9tUnVsZU5hbWUocnVsZU5hbWUpO1xuXG4gICAgICBwYXJ0cy5wdXNoKGRpcmVjdGx5UmVwZWF0ZWRQYXJ0KTtcblxuICAgICAgY29uc3QgdGVtcG9yYXJ5UnVsZU5hbWUgPSBsZWZ0UmVjdXJzaXZlUnVsZU5hbWU7IC8vL1xuXG4gICAgICBsZWZ0UmVjdXJzaXZlUnVsZU5hbWUgPSBydWxlTmFtZTsgLy8vXG5cbiAgICAgIHJ1bGVOYW1lID0gdGVtcG9yYXJ5UnVsZU5hbWU7ICAvLy9cblxuICAgICAgY29uc3QgaW5kaXJlY3RseVJlcGVhdGVkUGFydCA9IGluZGlyZWN0bHlSZXBlYXRlZFBhcnRGcm9tUnVsZU5hbWVBbmRMZWZ0UmVjdXJzaXZlUnVsZU5hbWUocnVsZU5hbWUsIGxlZnRSZWN1cnNpdmVSdWxlTmFtZSk7XG5cbiAgICAgIHBhcnRzLnB1c2goaW5kaXJlY3RseVJlcGVhdGVkUGFydCk7XG4gICAgfVxuICB9KTtcblxuICBpZiAocnVsZU5hbWVzTGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3QgZmlyc3RSdWxlTmFtZSA9IGZpcnN0KHJ1bGVOYW1lcyksXG4gICAgICAgICAgcnVsZU5hbWUgPSBmaXJzdFJ1bGVOYW1lLFxuICAgICAgICAgIGRpcmVjdGx5UmVwZWF0ZWRQYXJ0ID0gZGlyZWN0bHlSZXBlYXRlZFBhcnRGcm9tUnVsZU5hbWUocnVsZU5hbWUpO1xuXG4gICAgcGFydHMucHVzaChkaXJlY3RseVJlcGVhdGVkUGFydCk7XG4gIH1cblxuICBjb25zdCBwcmVjZWRlbmNlID0gbnVsbCxcbiAgICAgICAgcmV3cml0dGVuRGVmaW5pdGlvbiA9IG5ldyBSZXdyaXR0ZW5EZWZpbml0aW9uKHBhcnRzLCBwcmVjZWRlbmNlKTtcblxuICByZXR1cm4gcmV3cml0dGVuRGVmaW5pdGlvbjtcbn1cblxuZnVuY3Rpb24gZGlyZWN0bHlSZXBlYXRlZFBhcnRGcm9tUnVsZU5hbWUocnVsZU5hbWUpIHtcbiAgY29uc3QgZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lID0gZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lRnJvbVJ1bGVOYW1lKHJ1bGVOYW1lKSxcbiAgICAgICAgZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lUGFydCA9IHJ1bGVOYW1lUGFydEZyb21SdWxlTmFtZShkaXJlY3RseVJlcGVhdGVkUnVsZU5hbWUpLFxuICAgICAgICB6ZXJvT3JNb3JlRGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lUGFydHNQYXJ0ID0gemVyb09yTW9yZVBhcnRzUGFydEZyb21QYXJ0KGRpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZVBhcnQpLFxuICAgICAgICBkaXJlY3RseVJlcGVhdGVkUGFydCA9IHplcm9Pck1vcmVEaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVQYXJ0c1BhcnQ7IC8vL1xuXG4gIHJldHVybiBkaXJlY3RseVJlcGVhdGVkUGFydDtcbn1cblxuZnVuY3Rpb24gaW5kaXJlY3RseVJlcGVhdGVkUGFydEZyb21SdWxlTmFtZUFuZExlZnRSZWN1cnNpdmVSdWxlTmFtZShydWxlTmFtZSwgbGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lKSB7XG4gIGNvbnN0IGluZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lID0gaW5kaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVGcm9tUnVsZU5hbWVBbmRMZWZ0UmVjdXJzaXZlUnVsZU5hbWUocnVsZU5hbWUsIGxlZnRSZWN1cnNpdmVSdWxlTmFtZSksXG4gICAgICAgIGluZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lUGFydCA9IHJ1bGVOYW1lUGFydEZyb21SdWxlTmFtZShpbmRpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZSksXG4gICAgICAgIGluZGlyZWN0bHlSZXBlYXRlZFBhcnQgPSBpbmRpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZVBhcnQ7ICAvLy9cblxuICByZXR1cm4gaW5kaXJlY3RseVJlcGVhdGVkUGFydDtcbn1cblxuIl0sIm5hbWVzIjpbIlJld3JpdHRlbkRlZmluaXRpb24iLCJmaXJzdCIsImFycmF5VXRpbGl0aWVzIiwiRGVmaW5pdGlvbiIsImZyb21QYXRoIiwicGF0aCIsInJ1bGVNYXAiLCJyZXdyaXR0ZW5EZWZpbml0aW9uIiwicmVkdWNlZFJ1bGVOYW1lIiwicmVkdWNlZFJ1bGVOYW1lRnJvbVBhdGgiLCJyZWR1Y2VkUnVsZSIsInJld3JpdHRlbkRlZmluaXRpb25Gcm9tUGF0aCIsInJldmVyc2VQYXRoIiwicmV2ZXJzZWRQYXRoIiwic2xpY2UiLCJyZXZlcnNlIiwicmVkdWNlZFJ1bGVOYW1lUGFydCIsInJlZHVjZWRSdWxlTmFtZVBhcnRGcm9tUGF0aCIsInJ1bGVOYW1lcyIsInJ1bGVOYW1lc0xlbmd0aCIsImxlbmd0aCIsImxhc3RJbmRleCIsInBhcnRzIiwicHVzaCIsImZvckVhY2hSdWxlTmFtZUFuZExlZnRSZWN1cnNpdmVSdWxlTmFtZSIsInJ1bGVOYW1lIiwibGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lIiwiaW5kZXgiLCJkaXJlY3RseVJlcGVhdGVkUGFydCIsImRpcmVjdGx5UmVwZWF0ZWRQYXJ0RnJvbVJ1bGVOYW1lIiwidGVtcG9yYXJ5UnVsZU5hbWUiLCJpbmRpcmVjdGx5UmVwZWF0ZWRQYXJ0IiwiaW5kaXJlY3RseVJlcGVhdGVkUGFydEZyb21SdWxlTmFtZUFuZExlZnRSZWN1cnNpdmVSdWxlTmFtZSIsImZpcnN0UnVsZU5hbWUiLCJwcmVjZWRlbmNlIiwiZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lIiwiZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lRnJvbVJ1bGVOYW1lIiwiZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lUGFydCIsInJ1bGVOYW1lUGFydEZyb21SdWxlTmFtZSIsInplcm9Pck1vcmVEaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVQYXJ0c1BhcnQiLCJ6ZXJvT3JNb3JlUGFydHNQYXJ0RnJvbVBhcnQiLCJpbmRpcmVjdGx5UmVwZWF0ZWRSdWxlTmFtZSIsImluZGlyZWN0bHlSZXBlYXRlZFJ1bGVOYW1lRnJvbVJ1bGVOYW1lQW5kTGVmdFJlY3Vyc2l2ZVJ1bGVOYW1lIiwiaW5kaXJlY3RseVJlcGVhdGVkUnVsZU5hbWVQYXJ0Il0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFZQTs7O2VBQXFCQTs7OzhCQVZNOzJCQUNJOzJCQUV5QjtzQkFDYTtzQkFDQzswQkFDK0M7QUFFckgsTUFBTSxFQUFFQyxLQUFLLEVBQUUsR0FBR0MseUJBQWM7QUFFakIsTUFBTUYsNEJBQTRCRyx3QkFBVTtJQUN6RCxPQUFPQyxTQUFTQyxJQUFJLEVBQUVDLE9BQU8sRUFBRTtRQUM3QixJQUFJQyxzQkFBc0I7UUFFMUIsTUFBTUMsa0JBQWtCQyxJQUFBQSw2QkFBdUIsRUFBQ0osT0FDMUNLLGNBQWNKLE9BQU8sQ0FBQ0UsZ0JBQWdCLElBQUk7UUFFaEQsSUFBSUUsZ0JBQWdCLE1BQU07WUFDeEJILHNCQUFzQkksNEJBQTRCTjtRQUNwRDtRQUVBLE9BQU9FO0lBQ1Q7QUFDRjtBQUVBLFNBQVNLLFlBQVlQLElBQUk7SUFDdkIsTUFBTVEsZUFBZVIsS0FBS1MsS0FBSztJQUUvQkQsYUFBYUUsT0FBTztJQUVwQixPQUFPRjtBQUNUO0FBRUEsU0FBU0YsNEJBQTRCTixJQUFJO0lBQ3ZDLE1BQU1XLHNCQUFzQkMsSUFBQUEsaUNBQTJCLEVBQUNaLE9BQ2xEUSxlQUFlRCxZQUFZUCxPQUMzQmEsWUFBWUwsY0FDWk0sa0JBQWtCRCxVQUFVRSxNQUFNLEVBQ2xDQyxZQUFZRixrQkFBa0IsR0FDOUJHLFFBQVEsRUFBRSxFQUFFLEdBQUc7SUFFckJBLE1BQU1DLElBQUksQ0FBQ1A7SUFFWFEsSUFBQUEsa0RBQXVDLEVBQUNOLFdBQVcsQ0FBQ08sVUFBVUMsdUJBQXVCQztRQUNuRixJQUFJQSxRQUFRTixXQUFXO1lBQ3JCLE1BQU1PLHVCQUF1QkMsaUNBQWlDSjtZQUU5REgsTUFBTUMsSUFBSSxDQUFDSztZQUVYLE1BQU1FLG9CQUFvQkosdUJBQXVCLEdBQUc7WUFFcERBLHdCQUF3QkQsVUFBVSxHQUFHO1lBRXJDQSxXQUFXSyxtQkFBb0IsR0FBRztZQUVsQyxNQUFNQyx5QkFBeUJDLDJEQUEyRFAsVUFBVUM7WUFFcEdKLE1BQU1DLElBQUksQ0FBQ1E7UUFDYjtJQUNGO0lBRUEsSUFBSVosb0JBQW9CLEdBQUc7UUFDekIsTUFBTWMsZ0JBQWdCaEMsTUFBTWlCLFlBQ3RCTyxXQUFXUSxlQUNYTCx1QkFBdUJDLGlDQUFpQ0o7UUFFOURILE1BQU1DLElBQUksQ0FBQ0s7SUFDYjtJQUVBLE1BQU1NLGFBQWEsTUFDYjNCLHNCQUFzQixJQUFJUCxvQkFBb0JzQixPQUFPWTtJQUUzRCxPQUFPM0I7QUFDVDtBQUVBLFNBQVNzQixpQ0FBaUNKLFFBQVE7SUFDaEQsTUFBTVUsMkJBQTJCQyxJQUFBQSw4Q0FBb0MsRUFBQ1gsV0FDaEVZLCtCQUErQkMsSUFBQUEsOEJBQXdCLEVBQUNILDJCQUN4REksOENBQThDQyxJQUFBQSxpQ0FBMkIsRUFBQ0gsK0JBQzFFVCx1QkFBdUJXLDZDQUE2QyxHQUFHO0lBRTdFLE9BQU9YO0FBQ1Q7QUFFQSxTQUFTSSwyREFBMkRQLFFBQVEsRUFBRUMscUJBQXFCO0lBQ2pHLE1BQU1lLDZCQUE2QkMsSUFBQUEsd0VBQThELEVBQUNqQixVQUFVQyx3QkFDdEdpQixpQ0FBaUNMLElBQUFBLDhCQUF3QixFQUFDRyw2QkFDMURWLHlCQUF5QlksZ0NBQWlDLEdBQUc7SUFFbkUsT0FBT1o7QUFDVCJ9
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get default () {
13
+ return DirectedGraph;
14
+ },
15
+ get edgesMatchEdge () {
16
+ return edgesMatchEdge;
17
+ }
18
+ });
19
+ const _necessary = require("necessary");
20
+ const _cycle = /*#__PURE__*/ _interop_require_default(require("./cycle"));
21
+ function _interop_require_default(obj) {
22
+ return obj && obj.__esModule ? obj : {
23
+ default: obj
24
+ };
25
+ }
26
+ const { last, find, compress } = _necessary.arrayUtilities;
27
+ class DirectedGraph {
28
+ constructor(edges, startVertex){
29
+ this.edges = edges;
30
+ this.startVertex = startVertex;
31
+ }
32
+ getEdges() {
33
+ return this.edges;
34
+ }
35
+ getStartVertex() {
36
+ return this.startVertex;
37
+ }
38
+ addEdge(edge) {
39
+ const matches = edgesMatchEdge(this.edges, edge);
40
+ if (!matches) {
41
+ this.edges.push(edge);
42
+ }
43
+ }
44
+ addEdges(edges) {
45
+ edges.forEach((edge)=>{
46
+ this.addEdge(edge);
47
+ });
48
+ }
49
+ removeEdge(edge) {
50
+ const index = this.edges.indexOf(edge), start = index, deleteCount = 1;
51
+ this.edges.splice(start, deleteCount);
52
+ }
53
+ depthFirstSearch(vertex, vertexes, callback) {
54
+ const previousVertexes = vertexes, successorVertexes = this.findSuccessorVertexes(vertex);
55
+ successorVertexes.forEach((successorVertex)=>{
56
+ const previousVertexesIncludesSuccessorVertex = previousVertexes.includes(successorVertex), vertexes = [
57
+ ...previousVertexes,
58
+ successorVertex
59
+ ], vertex = successorVertex; ///
60
+ if (previousVertexesIncludesSuccessorVertex) {
61
+ callback(vertexes);
62
+ } else {
63
+ this.depthFirstSearch(vertex, vertexes, callback);
64
+ }
65
+ });
66
+ }
67
+ findCycles() {
68
+ const trivialCycles = this.findTrivialCycles(), nonTrivialCycles = this.findNonTrivialCycles(), cycles = [
69
+ ...trivialCycles,
70
+ ...nonTrivialCycles
71
+ ];
72
+ compress(cycles, (cycleA, cycleB)=>{
73
+ const cyclesCoincident = areCyclesCoincident(cycleA, cycleB);
74
+ if (!cyclesCoincident) {
75
+ return true;
76
+ }
77
+ });
78
+ return cycles;
79
+ }
80
+ findTrivialCycles() {
81
+ const triviallyCyclicEdges = this.findTriviallyCyclicEdges(), trivialCycles = triviallyCyclicEdges.map((triviallyCyclicEdge)=>{
82
+ const edge = triviallyCyclicEdge, cycle = _cycle.default.fromEdge(edge), trivialCycle = cycle; ///
83
+ return trivialCycle;
84
+ });
85
+ return trivialCycles;
86
+ }
87
+ findNonTrivialCycles() {
88
+ const nonTrivialCycles = [], directedGraph = this, vertex = this.startVertex, vertexes = [
89
+ vertex
90
+ ];
91
+ this.depthFirstSearch(vertex, vertexes, (vertexes)=>{
92
+ const nonTrivialCycle = nonTrivialCycleFromVertexes(vertexes, directedGraph);
93
+ nonTrivialCycles.push(nonTrivialCycle);
94
+ });
95
+ return nonTrivialCycles;
96
+ }
97
+ findSuccessorEdges(vertex) {
98
+ const sourceVertex = vertex, edges = this.findEdgesBySourceVertex(sourceVertex), successorEdges = edges.filter((edge)=>{
99
+ const targetVertex = edge.getTargetVertex();
100
+ if (targetVertex !== sourceVertex) {
101
+ return true;
102
+ }
103
+ });
104
+ return successorEdges;
105
+ }
106
+ findSuccessorVertexes(vertex) {
107
+ const successorEdges = this.findSuccessorEdges(vertex), successorVertexes = successorEdges.map((successorEdge)=>{
108
+ const successorEdgeTargetVertex = successorEdge.getTargetVertex(), successorVertex = successorEdgeTargetVertex; ///
109
+ return successorVertex;
110
+ });
111
+ return successorVertexes;
112
+ }
113
+ findEdgesBySourceVertex(sourceVertex) {
114
+ const edges = find(this.edges, (edge)=>{
115
+ const edgeMatchesSourceVertex = edge.matchSourceVertex(sourceVertex);
116
+ if (edgeMatchesSourceVertex) {
117
+ return true;
118
+ }
119
+ });
120
+ return edges;
121
+ }
122
+ findTriviallyCyclicEdges() {
123
+ const triviallyCyclicEdges = find(this.edges, (edge)=>{
124
+ const edgeTriviallyCyclic = edge.isTriviallyCyclic();
125
+ if (edgeTriviallyCyclic) {
126
+ return true;
127
+ }
128
+ });
129
+ return triviallyCyclicEdges;
130
+ }
131
+ findEdgeBySourceVertexAndTargetVertex(sourceVertex, targetVertex) {
132
+ const edge = this.edges.find((edge)=>{
133
+ const matches = edge.matchSourceVertexAndTargetVertex(sourceVertex, targetVertex);
134
+ if (matches) {
135
+ return true;
136
+ }
137
+ }) || null;
138
+ return edge;
139
+ }
140
+ static fromEdgesAndStartVertex(edges, startVertex) {
141
+ const directedGraph = new DirectedGraph(edges, startVertex);
142
+ return directedGraph;
143
+ }
144
+ }
145
+ function edgesMatchEdge(edges, edge) {
146
+ const edgeA = edge, matches = edges.some((edge)=>{
147
+ const edgeB = edge, edgeAMatchesEdgeB = edgeA.match(edgeB);
148
+ if (edgeAMatchesEdgeB) {
149
+ return true;
150
+ }
151
+ });
152
+ return matches;
153
+ }
154
+ function nonTrivialCycleFromVertexes(vertexes, directedGraph) {
155
+ const lastVertex = last(vertexes), index = vertexes.indexOf(lastVertex), start = index; ///
156
+ vertexes = vertexes.slice(start); ///
157
+ vertexes.pop();
158
+ const length = vertexes.length, edges = vertexes.map((vertex, index)=>{
159
+ const nextIndex = (index + 1) % length, nextVertex = vertexes[nextIndex], sourceVertex = vertex, targetVertex = nextVertex, edge = directedGraph.findEdgeBySourceVertexAndTargetVertex(sourceVertex, targetVertex);
160
+ return edge;
161
+ }), cycle = _cycle.default.fromEdges(edges);
162
+ return cycle;
163
+ }
164
+ function someCyclePermutation(cycle, callback) {
165
+ let result = false;
166
+ const length = cycle.getLength();
167
+ for(let offset = 0; offset < length; offset++){
168
+ result = callback(cycle);
169
+ if (result) {
170
+ break;
171
+ }
172
+ cycle = cycle.permuted();
173
+ }
174
+ return result;
175
+ }
176
+ function areCyclesCoincident(cycleA, cycleB) {
177
+ let cyclesCoincident = false;
178
+ const cycleALength = cycleA.getLength(), cycleBLength = cycleB.getLength();
179
+ if (cycleALength === cycleBLength) {
180
+ cyclesCoincident = someCyclePermutation(cycleA, (cycleA)=>{
181
+ const cycleAEqualTo = cycleA.isEqualTo(cycleB);
182
+ if (cycleAEqualTo) {
183
+ return true;
184
+ }
185
+ });
186
+ }
187
+ return cyclesCoincident;
188
+ }
189
+
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RlZEdyYXBoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IEN5Y2xlIGZyb20gXCIuL2N5Y2xlXCI7XG5cbmNvbnN0IHsgbGFzdCwgZmluZCwgY29tcHJlc3MgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaXJlY3RlZEdyYXBoIHtcbiAgY29uc3RydWN0b3IoZWRnZXMsIHN0YXJ0VmVydGV4KSB7XG4gICAgdGhpcy5lZGdlcyA9IGVkZ2VzO1xuICAgIHRoaXMuc3RhcnRWZXJ0ZXggPSBzdGFydFZlcnRleDtcbiAgfVxuXG4gIGdldEVkZ2VzKCkge1xuICAgIHJldHVybiB0aGlzLmVkZ2VzO1xuICB9XG5cbiAgZ2V0U3RhcnRWZXJ0ZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRWZXJ0ZXg7XG4gIH1cblxuICBhZGRFZGdlKGVkZ2UpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gZWRnZXNNYXRjaEVkZ2UodGhpcy5lZGdlcywgZWRnZSk7XG5cbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHRoaXMuZWRnZXMucHVzaChlZGdlKTtcbiAgICB9XG4gIH1cblxuICBhZGRFZGdlcyhlZGdlcykge1xuICAgIGVkZ2VzLmZvckVhY2goKGVkZ2UpID0+IHtcbiAgICAgIHRoaXMuYWRkRWRnZShlZGdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUVkZ2UoZWRnZSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5lZGdlcy5pbmRleE9mKGVkZ2UpLFxuICAgICAgICAgIHN0YXJ0ID0gaW5kZXgsICAvLy9cbiAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG5cbiAgICB0aGlzLmVkZ2VzLnNwbGljZShzdGFydCwgZGVsZXRlQ291bnQpO1xuICB9XG5cbiAgZGVwdGhGaXJzdFNlYXJjaCh2ZXJ0ZXgsIHZlcnRleGVzLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHByZXZpb3VzVmVydGV4ZXMgPSB2ZXJ0ZXhlcywgIC8vL1xuICAgICAgICAgIHN1Y2Nlc3NvclZlcnRleGVzID0gdGhpcy5maW5kU3VjY2Vzc29yVmVydGV4ZXModmVydGV4KTtcblxuICAgIHN1Y2Nlc3NvclZlcnRleGVzLmZvckVhY2goKHN1Y2Nlc3NvclZlcnRleCkgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXNWZXJ0ZXhlc0luY2x1ZGVzU3VjY2Vzc29yVmVydGV4ID0gcHJldmlvdXNWZXJ0ZXhlcy5pbmNsdWRlcyhzdWNjZXNzb3JWZXJ0ZXgpLFxuICAgICAgICAgICAgdmVydGV4ZXMgPSBbXG4gICAgICAgICAgICAgIC4uLnByZXZpb3VzVmVydGV4ZXMsXG4gICAgICAgICAgICAgIHN1Y2Nlc3NvclZlcnRleFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHZlcnRleCA9IHN1Y2Nlc3NvclZlcnRleDsgIC8vL1xuXG4gICAgICBpZiAocHJldmlvdXNWZXJ0ZXhlc0luY2x1ZGVzU3VjY2Vzc29yVmVydGV4KSB7XG4gICAgICAgIGNhbGxiYWNrKHZlcnRleGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVwdGhGaXJzdFNlYXJjaCh2ZXJ0ZXgsIHZlcnRleGVzLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmaW5kQ3ljbGVzKCkge1xuICAgIGNvbnN0IHRyaXZpYWxDeWNsZXMgPSB0aGlzLmZpbmRUcml2aWFsQ3ljbGVzKCksXG4gICAgICAgICAgbm9uVHJpdmlhbEN5Y2xlcyA9IHRoaXMuZmluZE5vblRyaXZpYWxDeWNsZXMoKSxcbiAgICAgICAgICBjeWNsZXMgPSBbXG4gICAgICAgICAgICAuLi50cml2aWFsQ3ljbGVzLFxuICAgICAgICAgICAgLi4ubm9uVHJpdmlhbEN5Y2xlc1xuICAgICAgICAgIF07XG5cbiAgICBjb21wcmVzcyhjeWNsZXMsIChjeWNsZUEsIGN5Y2xlQikgPT4ge1xuICAgICAgY29uc3QgY3ljbGVzQ29pbmNpZGVudCA9IGFyZUN5Y2xlc0NvaW5jaWRlbnQoY3ljbGVBLCBjeWNsZUIpO1xuXG4gICAgICBpZiAoIWN5Y2xlc0NvaW5jaWRlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3ljbGVzO1xuICB9XG5cbiAgZmluZFRyaXZpYWxDeWNsZXMoKSB7XG4gICAgY29uc3QgdHJpdmlhbGx5Q3ljbGljRWRnZXMgPSB0aGlzLmZpbmRUcml2aWFsbHlDeWNsaWNFZGdlcygpLFxuICAgICAgICAgIHRyaXZpYWxDeWNsZXMgPSB0cml2aWFsbHlDeWNsaWNFZGdlcy5tYXAoKHRyaXZpYWxseUN5Y2xpY0VkZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVkZ2UgPSB0cml2aWFsbHlDeWNsaWNFZGdlLCAgLy8vXG4gICAgICAgICAgICAgICAgICBjeWNsZSA9IEN5Y2xlLmZyb21FZGdlKGVkZ2UpLFxuICAgICAgICAgICAgICAgICAgdHJpdmlhbEN5Y2xlID0gY3ljbGU7IC8vL1xuXG4gICAgICAgICAgICByZXR1cm4gdHJpdmlhbEN5Y2xlO1xuICAgICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyaXZpYWxDeWNsZXM7XG4gIH1cblxuICBmaW5kTm9uVHJpdmlhbEN5Y2xlcygpIHtcbiAgICBjb25zdCBub25Ucml2aWFsQ3ljbGVzID0gW10sXG4gICAgICAgICAgZGlyZWN0ZWRHcmFwaCA9IHRoaXMsIC8vL1xuICAgICAgICAgIHZlcnRleCA9IHRoaXMuc3RhcnRWZXJ0ZXgsIC8vL1xuICAgICAgICAgIHZlcnRleGVzID0gW1xuICAgICAgICAgICAgdmVydGV4XG4gICAgICAgICAgXTtcblxuICAgIHRoaXMuZGVwdGhGaXJzdFNlYXJjaCh2ZXJ0ZXgsIHZlcnRleGVzLCAodmVydGV4ZXMpID0+IHtcbiAgICAgIGNvbnN0IG5vblRyaXZpYWxDeWNsZSA9IG5vblRyaXZpYWxDeWNsZUZyb21WZXJ0ZXhlcyh2ZXJ0ZXhlcywgZGlyZWN0ZWRHcmFwaCk7XG5cbiAgICAgIG5vblRyaXZpYWxDeWNsZXMucHVzaChub25Ucml2aWFsQ3ljbGUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5vblRyaXZpYWxDeWNsZXM7XG4gIH1cblxuICBmaW5kU3VjY2Vzc29yRWRnZXModmVydGV4KSB7XG4gICAgY29uc3Qgc291cmNlVmVydGV4ID0gdmVydGV4LCAgLy8vXG4gICAgICAgICAgZWRnZXMgPSB0aGlzLmZpbmRFZGdlc0J5U291cmNlVmVydGV4KHNvdXJjZVZlcnRleCksXG4gICAgICAgICAgc3VjY2Vzc29yRWRnZXMgPSBlZGdlcy5maWx0ZXIoKGVkZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFZlcnRleCA9IGVkZ2UuZ2V0VGFyZ2V0VmVydGV4KCk7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXRWZXJ0ZXggIT09IHNvdXJjZVZlcnRleCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiBzdWNjZXNzb3JFZGdlcztcbiAgfVxuXG4gIGZpbmRTdWNjZXNzb3JWZXJ0ZXhlcyh2ZXJ0ZXgpIHtcbiAgICBjb25zdCBzdWNjZXNzb3JFZGdlcyA9IHRoaXMuZmluZFN1Y2Nlc3NvckVkZ2VzKHZlcnRleCksXG4gICAgICAgICAgc3VjY2Vzc29yVmVydGV4ZXMgPSBzdWNjZXNzb3JFZGdlcy5tYXAoKHN1Y2Nlc3NvckVkZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3NvckVkZ2VUYXJnZXRWZXJ0ZXggPSBzdWNjZXNzb3JFZGdlLmdldFRhcmdldFZlcnRleCgpLFxuICAgICAgICAgICAgICAgICAgc3VjY2Vzc29yVmVydGV4ID0gc3VjY2Vzc29yRWRnZVRhcmdldFZlcnRleDsgIC8vL1xuXG4gICAgICAgICAgICByZXR1cm4gc3VjY2Vzc29yVmVydGV4O1xuICAgICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHN1Y2Nlc3NvclZlcnRleGVzO1xuICB9XG5cbiAgZmluZEVkZ2VzQnlTb3VyY2VWZXJ0ZXgoc291cmNlVmVydGV4KSB7XG4gICAgY29uc3QgZWRnZXMgPSBmaW5kKHRoaXMuZWRnZXMsIChlZGdlKSA9PiB7IC8vL1xuICAgICAgY29uc3QgZWRnZU1hdGNoZXNTb3VyY2VWZXJ0ZXggPSBlZGdlLm1hdGNoU291cmNlVmVydGV4KHNvdXJjZVZlcnRleCk7XG5cbiAgICAgIGlmIChlZGdlTWF0Y2hlc1NvdXJjZVZlcnRleCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlZGdlcztcbiAgfVxuXG4gIGZpbmRUcml2aWFsbHlDeWNsaWNFZGdlcygpIHtcbiAgICBjb25zdCB0cml2aWFsbHlDeWNsaWNFZGdlcyA9IGZpbmQodGhpcy5lZGdlcywgKGVkZ2UpID0+IHtcbiAgICAgIGNvbnN0IGVkZ2VUcml2aWFsbHlDeWNsaWMgPSBlZGdlLmlzVHJpdmlhbGx5Q3ljbGljKCk7XG5cbiAgICAgIGlmIChlZGdlVHJpdmlhbGx5Q3ljbGljKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyaXZpYWxseUN5Y2xpY0VkZ2VzO1xuICB9XG5cbiAgZmluZEVkZ2VCeVNvdXJjZVZlcnRleEFuZFRhcmdldFZlcnRleChzb3VyY2VWZXJ0ZXgsIHRhcmdldFZlcnRleCkge1xuICAgIGNvbnN0IGVkZ2UgPSB0aGlzLmVkZ2VzLmZpbmQoKGVkZ2UpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBlZGdlLm1hdGNoU291cmNlVmVydGV4QW5kVGFyZ2V0VmVydGV4KHNvdXJjZVZlcnRleCwgdGFyZ2V0VmVydGV4KTtcblxuICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBlZGdlO1xuICB9XG5cbiAgc3RhdGljIGZyb21FZGdlc0FuZFN0YXJ0VmVydGV4KGVkZ2VzLCBzdGFydFZlcnRleCkge1xuICAgIGNvbnN0IGRpcmVjdGVkR3JhcGggPSBuZXcgRGlyZWN0ZWRHcmFwaChlZGdlcywgc3RhcnRWZXJ0ZXgpO1xuXG4gICAgcmV0dXJuIGRpcmVjdGVkR3JhcGg7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVkZ2VzTWF0Y2hFZGdlKGVkZ2VzLCBlZGdlKSB7XG4gIGNvbnN0IGVkZ2VBID0gZWRnZSwgLy8vXG4gICAgICAgIG1hdGNoZXMgPSBlZGdlcy5zb21lKChlZGdlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWRnZUIgPSBlZGdlLCAvLy9cbiAgICAgICAgICAgICAgICBlZGdlQU1hdGNoZXNFZGdlQiA9IGVkZ2VBLm1hdGNoKGVkZ2VCKTtcblxuICAgICAgICAgIGlmIChlZGdlQU1hdGNoZXNFZGdlQikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICByZXR1cm4gbWF0Y2hlcztcbn1cblxuZnVuY3Rpb24gbm9uVHJpdmlhbEN5Y2xlRnJvbVZlcnRleGVzKHZlcnRleGVzLCBkaXJlY3RlZEdyYXBoKSB7XG4gIGNvbnN0IGxhc3RWZXJ0ZXggPSBsYXN0KHZlcnRleGVzKSxcbiAgICAgICAgaW5kZXggPSB2ZXJ0ZXhlcy5pbmRleE9mKGxhc3RWZXJ0ZXgpLFxuICAgICAgICBzdGFydCA9IGluZGV4OyAgLy8vXG5cbiAgdmVydGV4ZXMgPSB2ZXJ0ZXhlcy5zbGljZShzdGFydCk7IC8vL1xuXG4gIHZlcnRleGVzLnBvcCgpO1xuXG4gIGNvbnN0IGxlbmd0aCA9IHZlcnRleGVzLmxlbmd0aCxcbiAgICAgICAgZWRnZXMgPSB2ZXJ0ZXhlcy5tYXAoKHZlcnRleCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSAoaW5kZXggKyAxKSAlIGxlbmd0aCxcbiAgICAgICAgICAgICAgICBuZXh0VmVydGV4ID0gdmVydGV4ZXNbbmV4dEluZGV4XSxcbiAgICAgICAgICAgICAgICBzb3VyY2VWZXJ0ZXggPSB2ZXJ0ZXgsICAvLy9cbiAgICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXggPSBuZXh0VmVydGV4LCAvLy9cbiAgICAgICAgICAgICAgICBlZGdlID0gZGlyZWN0ZWRHcmFwaC5maW5kRWRnZUJ5U291cmNlVmVydGV4QW5kVGFyZ2V0VmVydGV4KHNvdXJjZVZlcnRleCwgdGFyZ2V0VmVydGV4KTtcblxuICAgICAgICAgIHJldHVybiBlZGdlO1xuICAgICAgICB9KSxcbiAgICAgICAgY3ljbGUgPSBDeWNsZS5mcm9tRWRnZXMoZWRnZXMpO1xuXG4gIHJldHVybiBjeWNsZTtcbn1cblxuZnVuY3Rpb24gc29tZUN5Y2xlUGVybXV0YXRpb24oY3ljbGUsIGNhbGxiYWNrKSB7XG4gIGxldCByZXN1bHQgPSBmYWxzZTtcblxuICBjb25zdCBsZW5ndGggPSBjeWNsZS5nZXRMZW5ndGgoKTtcblxuICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBsZW5ndGg7IG9mZnNldCsrKSB7XG4gICAgcmVzdWx0ID0gY2FsbGJhY2soY3ljbGUpO1xuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY3ljbGUgPSBjeWNsZS5wZXJtdXRlZCgpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYXJlQ3ljbGVzQ29pbmNpZGVudChjeWNsZUEsIGN5Y2xlQikge1xuICBsZXQgY3ljbGVzQ29pbmNpZGVudCA9IGZhbHNlO1xuXG4gIGNvbnN0IGN5Y2xlQUxlbmd0aCA9IGN5Y2xlQS5nZXRMZW5ndGgoKSxcbiAgICAgICAgY3ljbGVCTGVuZ3RoID0gY3ljbGVCLmdldExlbmd0aCgpO1xuXG4gIGlmIChjeWNsZUFMZW5ndGggPT09IGN5Y2xlQkxlbmd0aCkge1xuICAgIGN5Y2xlc0NvaW5jaWRlbnQgPSBzb21lQ3ljbGVQZXJtdXRhdGlvbihjeWNsZUEsIChjeWNsZUEpID0+IHtcbiAgICAgIGNvbnN0IGN5Y2xlQUVxdWFsVG8gPSBjeWNsZUEuaXNFcXVhbFRvKGN5Y2xlQik7XG5cbiAgICAgIGlmIChjeWNsZUFFcXVhbFRvKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGN5Y2xlc0NvaW5jaWRlbnQ7XG59XG4iXSwibmFtZXMiOlsiRGlyZWN0ZWRHcmFwaCIsImVkZ2VzTWF0Y2hFZGdlIiwibGFzdCIsImZpbmQiLCJjb21wcmVzcyIsImFycmF5VXRpbGl0aWVzIiwiZWRnZXMiLCJzdGFydFZlcnRleCIsImdldEVkZ2VzIiwiZ2V0U3RhcnRWZXJ0ZXgiLCJhZGRFZGdlIiwiZWRnZSIsIm1hdGNoZXMiLCJwdXNoIiwiYWRkRWRnZXMiLCJmb3JFYWNoIiwicmVtb3ZlRWRnZSIsImluZGV4IiwiaW5kZXhPZiIsInN0YXJ0IiwiZGVsZXRlQ291bnQiLCJzcGxpY2UiLCJkZXB0aEZpcnN0U2VhcmNoIiwidmVydGV4IiwidmVydGV4ZXMiLCJjYWxsYmFjayIsInByZXZpb3VzVmVydGV4ZXMiLCJzdWNjZXNzb3JWZXJ0ZXhlcyIsImZpbmRTdWNjZXNzb3JWZXJ0ZXhlcyIsInN1Y2Nlc3NvclZlcnRleCIsInByZXZpb3VzVmVydGV4ZXNJbmNsdWRlc1N1Y2Nlc3NvclZlcnRleCIsImluY2x1ZGVzIiwiZmluZEN5Y2xlcyIsInRyaXZpYWxDeWNsZXMiLCJmaW5kVHJpdmlhbEN5Y2xlcyIsIm5vblRyaXZpYWxDeWNsZXMiLCJmaW5kTm9uVHJpdmlhbEN5Y2xlcyIsImN5Y2xlcyIsImN5Y2xlQSIsImN5Y2xlQiIsImN5Y2xlc0NvaW5jaWRlbnQiLCJhcmVDeWNsZXNDb2luY2lkZW50IiwidHJpdmlhbGx5Q3ljbGljRWRnZXMiLCJmaW5kVHJpdmlhbGx5Q3ljbGljRWRnZXMiLCJtYXAiLCJ0cml2aWFsbHlDeWNsaWNFZGdlIiwiY3ljbGUiLCJDeWNsZSIsImZyb21FZGdlIiwidHJpdmlhbEN5Y2xlIiwiZGlyZWN0ZWRHcmFwaCIsIm5vblRyaXZpYWxDeWNsZSIsIm5vblRyaXZpYWxDeWNsZUZyb21WZXJ0ZXhlcyIsImZpbmRTdWNjZXNzb3JFZGdlcyIsInNvdXJjZVZlcnRleCIsImZpbmRFZGdlc0J5U291cmNlVmVydGV4Iiwic3VjY2Vzc29yRWRnZXMiLCJmaWx0ZXIiLCJ0YXJnZXRWZXJ0ZXgiLCJnZXRUYXJnZXRWZXJ0ZXgiLCJzdWNjZXNzb3JFZGdlIiwic3VjY2Vzc29yRWRnZVRhcmdldFZlcnRleCIsImVkZ2VNYXRjaGVzU291cmNlVmVydGV4IiwibWF0Y2hTb3VyY2VWZXJ0ZXgiLCJlZGdlVHJpdmlhbGx5Q3ljbGljIiwiaXNUcml2aWFsbHlDeWNsaWMiLCJmaW5kRWRnZUJ5U291cmNlVmVydGV4QW5kVGFyZ2V0VmVydGV4IiwibWF0Y2hTb3VyY2VWZXJ0ZXhBbmRUYXJnZXRWZXJ0ZXgiLCJmcm9tRWRnZXNBbmRTdGFydFZlcnRleCIsImVkZ2VBIiwic29tZSIsImVkZ2VCIiwiZWRnZUFNYXRjaGVzRWRnZUIiLCJtYXRjaCIsImxhc3RWZXJ0ZXgiLCJzbGljZSIsInBvcCIsImxlbmd0aCIsIm5leHRJbmRleCIsIm5leHRWZXJ0ZXgiLCJmcm9tRWRnZXMiLCJzb21lQ3ljbGVQZXJtdXRhdGlvbiIsInJlc3VsdCIsImdldExlbmd0aCIsIm9mZnNldCIsInBlcm11dGVkIiwiY3ljbGVBTGVuZ3RoIiwiY3ljbGVCTGVuZ3RoIiwiY3ljbGVBRXF1YWxUbyIsImlzRXF1YWxUbyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O1FBUUE7ZUFBcUJBOztRQThLTEM7ZUFBQUE7OzsyQkFwTGU7OERBRWI7Ozs7OztBQUVsQixNQUFNLEVBQUVDLElBQUksRUFBRUMsSUFBSSxFQUFFQyxRQUFRLEVBQUUsR0FBR0MseUJBQWM7QUFFaEMsTUFBTUw7SUFDbkIsWUFBWU0sS0FBSyxFQUFFQyxXQUFXLENBQUU7UUFDOUIsSUFBSSxDQUFDRCxLQUFLLEdBQUdBO1FBQ2IsSUFBSSxDQUFDQyxXQUFXLEdBQUdBO0lBQ3JCO0lBRUFDLFdB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