occam-directed-graphs 3.0.34 → 3.0.37

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.
package/lib/cycle.js CHANGED
@@ -10,7 +10,7 @@ Object.defineProperty(exports, "default", {
10
10
  });
11
11
  var _necessary = require("necessary");
12
12
  var _vertex = require("./utilities/vertex");
13
- function _classCallCheck(instance, Constructor) {
13
+ function _class_call_check(instance, Constructor) {
14
14
  if (!(instance instanceof Constructor)) {
15
15
  throw new TypeError("Cannot call a class as a function");
16
16
  }
@@ -24,7 +24,7 @@ function _defineProperties(target, props) {
24
24
  Object.defineProperty(target, descriptor.key, descriptor);
25
25
  }
26
26
  }
27
- function _createClass(Constructor, protoProps, staticProps) {
27
+ function _create_class(Constructor, protoProps, staticProps) {
28
28
  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
29
29
  if (staticProps) _defineProperties(Constructor, staticProps);
30
30
  return Constructor;
@@ -32,10 +32,10 @@ function _createClass(Constructor, protoProps, staticProps) {
32
32
  var first = _necessary.arrayUtilities.first;
33
33
  var Cycle = /*#__PURE__*/ function() {
34
34
  function Cycle(vertexNames) {
35
- _classCallCheck(this, Cycle);
35
+ _class_call_check(this, Cycle);
36
36
  this.vertexNames = vertexNames;
37
37
  }
38
- _createClass(Cycle, [
38
+ _create_class(Cycle, [
39
39
  {
40
40
  key: "getVertexNames",
41
41
  value: function getVertexNames() {
@@ -62,4 +62,4 @@ var Cycle = /*#__PURE__*/ function() {
62
62
  return Cycle;
63
63
  }();
64
64
 
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jeWNsZS5qcyIsIjw8anN4LWNvbmZpZy1wcmFnbWEuanM+PiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCB7IHZlcnRleE5hbWVzRnJvbVZlcnRpY2VzIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3ZlcnRleFwiO1xuXG5jb25zdCB7IGZpcnN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3ljbGUge1xuICBjb25zdHJ1Y3Rvcih2ZXJ0ZXhOYW1lcykge1xuICAgIHRoaXMudmVydGV4TmFtZXMgPSB2ZXJ0ZXhOYW1lcztcbiAgfVxuXG4gIGdldFZlcnRleE5hbWVzKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnRleE5hbWVzO1xuICB9XG5cbiAgc3RhdGljIGZyb21WZXJ0ZXhOYW1lUGFydGlhbEN5Y2xlQW5kU3VjY2Vzc29yVmVydGljZXModmVydGV4TmFtZSwgcGFydGlhbEN5Y2xlLCBzdWNjZXNzb3JWZXJ0aWNlcykge1xuICAgIHN1Y2Nlc3NvclZlcnRpY2VzID0gc3VjY2Vzc29yVmVydGljZXMuc2xpY2UoKTsgIC8vL1xuICAgIFxuICAgIGNvbnN0IHN1Y2Nlc3NvclZlcnRpY2VzTGVuZ3RoID0gc3VjY2Vzc29yVmVydGljZXMubGVuZ3RoO1xuICAgIFxuICAgIGlmIChzdWNjZXNzb3JWZXJ0aWNlc0xlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0U3VjY2Vzc29yVmVydGV4ID0gZmlyc3Qoc3VjY2Vzc29yVmVydGljZXMpLFxuICAgICAgICAgICAgZmlyc3RTdWNjZXNzb3JWZXJ0ZXhOYW1lID0gZmlyc3RTdWNjZXNzb3JWZXJ0ZXguZ2V0TmFtZSgpLFxuICAgICAgICAgICAgY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUgPSBwYXJ0aWFsQ3ljbGUuZ2V0VGFyZ2V0VmVydGV4TmFtZSgpO1xuICAgICAgXG4gICAgICBpZiAoZmlyc3RTdWNjZXNzb3JWZXJ0ZXhOYW1lID09PSBjeWNsaWNFZGdlVGFyZ2V0VmVydGV4TmFtZSkge1xuICAgICAgICBzdWNjZXNzb3JWZXJ0aWNlcy5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN5Y2xpY0VkZ2VTb3VyY2VWZXJ0ZXhOYW1lID0gcGFydGlhbEN5Y2xlLmdldEN5Y2xpY0VkZ2VTb3VyY2VWZXJ0ZXhOYW1lKCksXG4gICAgICAgICAgY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUgPSBwYXJ0aWFsQ3ljbGUuZ2V0Q3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUoKSxcbiAgICAgICAgICBwcmVkZWNlc3NvclZlcnRleE5hbWVzID0gcGFydGlhbEN5Y2xlLmdldFByZWRlY2Vzc29yVmVydGV4TmFtZXMoKSxcbiAgICAgICAgICBzdWNjZXNzb3JWZXJ0ZXhOYW1lcyA9IHZlcnRleE5hbWVzRnJvbVZlcnRpY2VzKHN1Y2Nlc3NvclZlcnRpY2VzKSxcbiAgICAgICAgICB2ZXJ0ZXhOYW1lcyA9ICh2ZXJ0ZXhOYW1lID09PSBjeWNsaWNFZGdlVGFyZ2V0VmVydGV4TmFtZSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICBbXS5jb25jYXQoY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUpLmNvbmNhdChwcmVkZWNlc3NvclZlcnRleE5hbWVzKS5jb25jYXQoY3ljbGljRWRnZVNvdXJjZVZlcnRleE5hbWUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXS5jb25jYXQocHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcykuY29uY2F0KGN5Y2xpY0VkZ2VTb3VyY2VWZXJ0ZXhOYW1lKS5jb25jYXQoY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUpLmNvbmNhdChzdWNjZXNzb3JWZXJ0ZXhOYW1lcyksXG4gICAgICAgICAgY3ljbGUgPSBuZXcgQ3ljbGUodmVydGV4TmFtZXMpO1xuICAgIFxuICAgIHJldHVybiBjeWNsZTtcbiAgfVxufVxuIiwiUmVhY3QuY3JlYXRlRWxlbWVudCJdLCJuYW1lcyI6WyJDeWNsZSIsImZpcnN0IiwiYXJyYXlVdGlsaXRpZXMiLCJ2ZXJ0ZXhOYW1lcyIsImdldFZlcnRleE5hbWVzIiwiZnJvbVZlcnRleE5hbWVQYXJ0aWFsQ3ljbGVBbmRTdWNjZXNzb3JWZXJ0aWNlcyIsInZlcnRleE5hbWUiLCJwYXJ0aWFsQ3ljbGUiLCJzdWNjZXNzb3JWZXJ0aWNlcyIsInNsaWNlIiwic3VjY2Vzc29yVmVydGljZXNMZW5ndGgiLCJsZW5ndGgiLCJmaXJzdFN1Y2Nlc3NvclZlcnRleCIsImZpcnN0U3VjY2Vzc29yVmVydGV4TmFtZSIsImdldE5hbWUiLCJjeWNsaWNFZGdlVGFyZ2V0VmVydGV4TmFtZSIsImdldFRhcmdldFZlcnRleE5hbWUiLCJzaGlmdCIsImN5Y2xpY0VkZ2VTb3VyY2VWZXJ0ZXhOYW1lIiwiZ2V0Q3ljbGljRWRnZVNvdXJjZVZlcnRleE5hbWUiLCJnZXRDeWNsaWNFZGdlVGFyZ2V0VmVydGV4TmFtZSIsInByZWRlY2Vzc29yVmVydGV4TmFtZXMiLCJnZXRQcmVkZWNlc3NvclZlcnRleE5hbWVzIiwic3VjY2Vzc29yVmVydGV4TmFtZXMiLCJ2ZXJ0ZXhOYW1lc0Zyb21WZXJ0aWNlcyIsImNvbmNhdCIsImN5Y2xlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztlQVFxQkE7Ozt5QkFOVTtzQkFFUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFeEMsSUFBTSxBQUFFQyxRQUFVQyx5QkFBYyxDQUF4QkQ7QUFFTyxJQUFBLEFBQU1ELHNCQUFOO2FBQU1BLE1BQ1BHLFdBQVc7OEJBREpIO1FBRWpCLElBQUksQ0FBQ0csV0FBVyxHQUFHQTs7aUJBRkZIOztZQUtuQkksS0FBQUE7bUJBQUFBLFNBQUFBLGlCQUFpQjtnQkFDZixPQUFPLElBQUksQ0FBQ0QsV0FBVztZQUN6Qjs7OztZQUVPRSxLQUFBQTttQkFBUCxTQUFPQSwrQ0FBK0NDLFVBQVUsRUFBRUMsWUFBWSxFQUFFQyxpQkFBaUIsRUFBRTtnQkFDakdBLG9CQUFvQkEsa0JBQWtCQyxLQUFLLElBQUssR0FBRztnQkFFbkQsSUFBTUMsMEJBQTBCRixrQkFBa0JHLE1BQU07Z0JBRXhELElBQUlELDBCQUEwQixHQUFHO29CQUMvQixJQUFNRSx1QkFBdUJYLE1BQU1PLG9CQUM3QkssMkJBQTJCRCxxQkFBcUJFLE9BQU8sSUFDdkRDLDZCQUE2QlIsYUFBYVMsbUJBQW1CO29CQUVuRSxJQUFJSCw2QkFBNkJFLDRCQUE0Qjt3QkFDM0RQLGtCQUFrQlMsS0FBSztvQkFDekIsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQU1DLDZCQUE2QlgsYUFBYVksNkJBQTZCLElBQ3ZFSiw4QkFBNkJSLGFBQWFhLDZCQUE2QixJQUN2RUMseUJBQXlCZCxhQUFhZSx5QkFBeUIsSUFDL0RDLHVCQUF1QkMsSUFBQUEsK0JBQXVCLEVBQUNoQixvQkFDL0NMLGNBQWMsQUFBQ0csZUFBZVMsOEJBQ2QsRUFBRSxDQUFDVSxNQUFNLENBQUNWLDZCQUE0QlUsTUFBTSxDQUFDSix3QkFBd0JJLE1BQU0sQ0FBQ1AsOEJBQzFFLEVBQUUsQ0FBQ08sTUFBTSxDQUFDSix3QkFBd0JJLE1BQU0sQ0FBQ1AsNEJBQTRCTyxNQUFNLENBQUNWLDZCQUE0QlUsTUFBTSxDQUFDRixxQkFBcUIsRUFDdEpHLFFBQVEsSUEvQkcxQixNQStCT0c7Z0JBRXhCLE9BQU91QjtZQUNUOzs7V0FsQ21CMUIifQ==
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jeWNsZS5qcyIsIjw8anN4LWNvbmZpZy1wcmFnbWEuanM+PiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCB7IHZlcnRleE5hbWVzRnJvbVZlcnRpY2VzIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3ZlcnRleFwiO1xuXG5jb25zdCB7IGZpcnN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3ljbGUge1xuICBjb25zdHJ1Y3Rvcih2ZXJ0ZXhOYW1lcykge1xuICAgIHRoaXMudmVydGV4TmFtZXMgPSB2ZXJ0ZXhOYW1lcztcbiAgfVxuXG4gIGdldFZlcnRleE5hbWVzKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnRleE5hbWVzO1xuICB9XG5cbiAgc3RhdGljIGZyb21WZXJ0ZXhOYW1lUGFydGlhbEN5Y2xlQW5kU3VjY2Vzc29yVmVydGljZXModmVydGV4TmFtZSwgcGFydGlhbEN5Y2xlLCBzdWNjZXNzb3JWZXJ0aWNlcykge1xuICAgIHN1Y2Nlc3NvclZlcnRpY2VzID0gc3VjY2Vzc29yVmVydGljZXMuc2xpY2UoKTsgIC8vL1xuICAgIFxuICAgIGNvbnN0IHN1Y2Nlc3NvclZlcnRpY2VzTGVuZ3RoID0gc3VjY2Vzc29yVmVydGljZXMubGVuZ3RoO1xuICAgIFxuICAgIGlmIChzdWNjZXNzb3JWZXJ0aWNlc0xlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0U3VjY2Vzc29yVmVydGV4ID0gZmlyc3Qoc3VjY2Vzc29yVmVydGljZXMpLFxuICAgICAgICAgICAgZmlyc3RTdWNjZXNzb3JWZXJ0ZXhOYW1lID0gZmlyc3RTdWNjZXNzb3JWZXJ0ZXguZ2V0TmFtZSgpLFxuICAgICAgICAgICAgY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUgPSBwYXJ0aWFsQ3ljbGUuZ2V0VGFyZ2V0VmVydGV4TmFtZSgpO1xuICAgICAgXG4gICAgICBpZiAoZmlyc3RTdWNjZXNzb3JWZXJ0ZXhOYW1lID09PSBjeWNsaWNFZGdlVGFyZ2V0VmVydGV4TmFtZSkge1xuICAgICAgICBzdWNjZXNzb3JWZXJ0aWNlcy5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN5Y2xpY0VkZ2VTb3VyY2VWZXJ0ZXhOYW1lID0gcGFydGlhbEN5Y2xlLmdldEN5Y2xpY0VkZ2VTb3VyY2VWZXJ0ZXhOYW1lKCksXG4gICAgICAgICAgY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUgPSBwYXJ0aWFsQ3ljbGUuZ2V0Q3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUoKSxcbiAgICAgICAgICBwcmVkZWNlc3NvclZlcnRleE5hbWVzID0gcGFydGlhbEN5Y2xlLmdldFByZWRlY2Vzc29yVmVydGV4TmFtZXMoKSxcbiAgICAgICAgICBzdWNjZXNzb3JWZXJ0ZXhOYW1lcyA9IHZlcnRleE5hbWVzRnJvbVZlcnRpY2VzKHN1Y2Nlc3NvclZlcnRpY2VzKSxcbiAgICAgICAgICB2ZXJ0ZXhOYW1lcyA9ICh2ZXJ0ZXhOYW1lID09PSBjeWNsaWNFZGdlVGFyZ2V0VmVydGV4TmFtZSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICBbXS5jb25jYXQoY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUpLmNvbmNhdChwcmVkZWNlc3NvclZlcnRleE5hbWVzKS5jb25jYXQoY3ljbGljRWRnZVNvdXJjZVZlcnRleE5hbWUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXS5jb25jYXQocHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcykuY29uY2F0KGN5Y2xpY0VkZ2VTb3VyY2VWZXJ0ZXhOYW1lKS5jb25jYXQoY3ljbGljRWRnZVRhcmdldFZlcnRleE5hbWUpLmNvbmNhdChzdWNjZXNzb3JWZXJ0ZXhOYW1lcyksXG4gICAgICAgICAgY3ljbGUgPSBuZXcgQ3ljbGUodmVydGV4TmFtZXMpO1xuICAgIFxuICAgIHJldHVybiBjeWNsZTtcbiAgfVxufVxuIiwiUmVhY3QuY3JlYXRlRWxlbWVudCJdLCJuYW1lcyI6WyJDeWNsZSIsImZpcnN0IiwiYXJyYXlVdGlsaXRpZXMiLCJ2ZXJ0ZXhOYW1lcyIsImdldFZlcnRleE5hbWVzIiwiZnJvbVZlcnRleE5hbWVQYXJ0aWFsQ3ljbGVBbmRTdWNjZXNzb3JWZXJ0aWNlcyIsInZlcnRleE5hbWUiLCJwYXJ0aWFsQ3ljbGUiLCJzdWNjZXNzb3JWZXJ0aWNlcyIsInNsaWNlIiwic3VjY2Vzc29yVmVydGljZXNMZW5ndGgiLCJsZW5ndGgiLCJmaXJzdFN1Y2Nlc3NvclZlcnRleCIsImZpcnN0U3VjY2Vzc29yVmVydGV4TmFtZSIsImdldE5hbWUiLCJjeWNsaWNFZGdlVGFyZ2V0VmVydGV4TmFtZSIsImdldFRhcmdldFZlcnRleE5hbWUiLCJzaGlmdCIsImN5Y2xpY0VkZ2VTb3VyY2VWZXJ0ZXhOYW1lIiwiZ2V0Q3ljbGljRWRnZVNvdXJjZVZlcnRleE5hbWUiLCJnZXRDeWNsaWNFZGdlVGFyZ2V0VmVydGV4TmFtZSIsInByZWRlY2Vzc29yVmVydGV4TmFtZXMiLCJnZXRQcmVkZWNlc3NvclZlcnRleE5hbWVzIiwic3VjY2Vzc29yVmVydGV4TmFtZXMiLCJ2ZXJ0ZXhOYW1lc0Zyb21WZXJ0aWNlcyIsImNvbmNhdCIsImN5Y2xlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztlQVFxQkE7Ozt5QkFOVTtzQkFFUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFeEMsSUFBTSxBQUFFQyxRQUFVQywwQkFBVkQ7QUFFTyxJQUFBLEFBQU1ELHNCQUFOO2FBQU1BLE1BQ1BHLFdBQVc7Z0NBREpIO1FBRWpCLElBQUksQ0FBQ0csY0FBY0E7O2tCQUZGSDs7WUFLbkJJLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ0Q7WUFDZDs7OztZQUVPRSxLQUFBQTttQkFBUCxTQUFPQSwrQ0FBK0NDLFVBQVUsRUFBRUMsWUFBWSxFQUFFQyxpQkFBaUI7Z0JBQy9GQSxvQkFBb0JBLGtCQUFrQkMsU0FBVSxHQUFHO2dCQUVuRCxJQUFNQywwQkFBMEJGLGtCQUFrQkc7Z0JBRWxELElBQUlELDBCQUEwQixHQUFHO29CQUMvQixJQUFNRSx1QkFBdUJYLE1BQU1PLG9CQUM3QkssMkJBQTJCRCxxQkFBcUJFLFdBQ2hEQyw2QkFBNkJSLGFBQWFTO29CQUVoRCxJQUFJSCw2QkFBNkJFLDRCQUE0Qjt3QkFDM0RQLGtCQUFrQlM7b0JBQ3BCO2dCQUNGO2dCQUVBLElBQU1DLDZCQUE2QlgsYUFBYVksaUNBQzFDSiw4QkFBNkJSLGFBQWFhLGlDQUMxQ0MseUJBQXlCZCxhQUFhZSw2QkFDdENDLHVCQUF1QkMsSUFBQUEsaUNBQXdCaEIsb0JBQy9DTCxjQUFjLEFBQUNHLGVBQWVTLDhCQUNkLEVBQUUsQ0FBQ1UsT0FBT1YsNkJBQTRCVSxPQUFPSix3QkFBd0JJLE9BQU9QLDhCQUMxRSxFQUFFLENBQUNPLE9BQU9KLHdCQUF3QkksT0FBT1AsNEJBQTRCTyxPQUFPViw2QkFBNEJVLE9BQU9GLHVCQUNqSUcsUUFBUSxJQS9CRzFCLE1BK0JPRztnQkFFeEIsT0FBT3VCO1lBQ1Q7OztXQWxDbUIxQiJ9
@@ -0,0 +1,364 @@
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 DirectedAcyclicGraph;
9
+ }
10
+ });
11
+ var _necessary = require("necessary");
12
+ var _edge = /*#__PURE__*/ _interop_require_default(require("./edge"));
13
+ var _vertex = /*#__PURE__*/ _interop_require_default(require("./vertex"));
14
+ var _vertex1 = require("./utilities/vertex");
15
+ function _class_call_check(instance, Constructor) {
16
+ if (!(instance instanceof Constructor)) {
17
+ throw new TypeError("Cannot call a class as a function");
18
+ }
19
+ }
20
+ function _defineProperties(target, props) {
21
+ for(var i = 0; i < props.length; i++){
22
+ var descriptor = props[i];
23
+ descriptor.enumerable = descriptor.enumerable || false;
24
+ descriptor.configurable = true;
25
+ if ("value" in descriptor) descriptor.writable = true;
26
+ Object.defineProperty(target, descriptor.key, descriptor);
27
+ }
28
+ }
29
+ function _create_class(Constructor, protoProps, staticProps) {
30
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
31
+ if (staticProps) _defineProperties(Constructor, staticProps);
32
+ return Constructor;
33
+ }
34
+ function _interop_require_default(obj) {
35
+ return obj && obj.__esModule ? obj : {
36
+ default: obj
37
+ };
38
+ }
39
+ var last = _necessary.arrayUtilities.last;
40
+ var DirectedAcyclicGraph = /*#__PURE__*/ function() {
41
+ function DirectedAcyclicGraph(vertexMap) {
42
+ _class_call_check(this, DirectedAcyclicGraph);
43
+ this.vertexMap = vertexMap;
44
+ }
45
+ _create_class(DirectedAcyclicGraph, [
46
+ {
47
+ key: "isEmpty",
48
+ value: function isEmpty() {
49
+ var vertices = this.getVertices(), verticesLength = vertices.length, empty = verticesLength === 0;
50
+ return empty;
51
+ }
52
+ },
53
+ {
54
+ key: "getVertices",
55
+ value: function getVertices() {
56
+ var vertexMapValues = Object.values(this.vertexMap), vertices = vertexMapValues; ///
57
+ return vertices;
58
+ }
59
+ },
60
+ {
61
+ key: "getVertexNames",
62
+ value: function getVertexNames() {
63
+ var vertexMapKeys = Object.keys(this.vertexMap), vertexNames = vertexMapKeys; ///
64
+ return vertexNames;
65
+ }
66
+ },
67
+ {
68
+ key: "getVertexByVertexName",
69
+ value: function getVertexByVertexName(vertexName) {
70
+ var vertexPresent = this.isVertexPresentByVertexName(vertexName), vertex = vertexPresent ? this.vertexMap[vertexName] : null;
71
+ return vertex;
72
+ }
73
+ },
74
+ {
75
+ key: "getImmediatePredecessorVertexNamesByVertexName",
76
+ value: function getImmediatePredecessorVertexNamesByVertexName(vertexName) {
77
+ var vertex = this.getVertexByVertexName(vertexName), immediatePredecessorVertexNames = vertex.getImmediatePredecessorVertexNames();
78
+ return immediatePredecessorVertexNames;
79
+ }
80
+ },
81
+ {
82
+ key: "getImmediateSuccessorVertexNamesByVertexName",
83
+ value: function getImmediateSuccessorVertexNamesByVertexName(vertexName) {
84
+ var vertex = this.getVertexByVertexName(vertexName), immediateSuccessorVertexNames = vertex.getImmediateSuccessorVertexNames();
85
+ return immediateSuccessorVertexNames;
86
+ }
87
+ },
88
+ {
89
+ key: "getPredecessorVertexNamesByVertexName",
90
+ value: function getPredecessorVertexNamesByVertexName(vertexName) {
91
+ var vertex = this.getVertexByVertexName(vertexName), predecessorVertexNames = vertex.getPredecessorVertexNames();
92
+ return predecessorVertexNames;
93
+ }
94
+ },
95
+ {
96
+ key: "getSuccessorVertexNamesByVertexName",
97
+ value: function getSuccessorVertexNamesByVertexName(vertexName) {
98
+ var vertex = this.getVertexByVertexName(vertexName), successorVertexNames = vertex.getSuccessorVertexNames();
99
+ return successorVertexNames;
100
+ }
101
+ },
102
+ {
103
+ key: "getEdgesByTargetVertexName",
104
+ value: function getEdgesByTargetVertexName(targetVertexName) {
105
+ var edges = [], targetVertex = this.getVertexByVertexName(targetVertexName);
106
+ if (targetVertex !== null) {
107
+ var immediatePredecessorVertexNames = targetVertex.getImmediatePredecessorVertexNames(), sourceVertexNames = immediatePredecessorVertexNames; ///
108
+ sourceVertexNames.forEach(function(sourceVertexName) {
109
+ var edge = _edge.default.fromSourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
110
+ edges.push(edge);
111
+ });
112
+ }
113
+ return edges;
114
+ }
115
+ },
116
+ {
117
+ key: "getEdgesBySourceVertexName",
118
+ value: function getEdgesBySourceVertexName(sourceVertexName) {
119
+ var edges = [], sourceVertex = this.getVertexByVertexName(sourceVertexName);
120
+ if (sourceVertex !== null) {
121
+ var immediateSuccessorVertexNames = sourceVertex.getImmediateSuccessorVertexNames(), targetVertexNames = immediateSuccessorVertexNames; ///
122
+ targetVertexNames.forEach(function(targetVertexName) {
123
+ var edge = _edge.default.fromSourceVertexNameAndTargetVertexName(sourceVertexName, targetVertexName);
124
+ edges.push(edge);
125
+ });
126
+ }
127
+ return edges;
128
+ }
129
+ },
130
+ {
131
+ key: "setVertexByVertexName",
132
+ value: function setVertexByVertexName(vertexName, vertex) {
133
+ this.vertexMap[vertexName] = vertex;
134
+ }
135
+ },
136
+ {
137
+ key: "deleteVertexByVertexName",
138
+ value: function deleteVertexByVertexName(vertexName) {
139
+ delete this.vertexMap[vertexName];
140
+ }
141
+ },
142
+ {
143
+ key: "isEdgePresent",
144
+ value: function isEdgePresent(edge) {
145
+ var sourceVertexName = edge.getSourceVertexName(), targetVertexName = edge.getTargetVertexName(), edgePresent = this.isEdgePresentByVertexNames(sourceVertexName, targetVertexName);
146
+ return edgePresent;
147
+ }
148
+ },
149
+ {
150
+ key: "isEdgePresentByVertexNames",
151
+ value: function isEdgePresentByVertexNames(sourceVertexName, targetVertexName) {
152
+ var edgePresent = false;
153
+ var sourceVertex = this.getVertexByVertexName(sourceVertexName), targetVertex = this.getVertexByVertexName(targetVertexName), sourceVertexAndTargetVertexPresent = sourceVertex !== null && targetVertex !== null;
154
+ if (sourceVertexAndTargetVertexPresent) {
155
+ edgePresent = sourceVertex.isEdgePresentByTargetVertex(targetVertex);
156
+ }
157
+ return edgePresent;
158
+ }
159
+ },
160
+ {
161
+ key: "isVertexPresentByVertexName",
162
+ value: function isVertexPresentByVertexName(vertexName) {
163
+ var vertexNames = this.getVertexNames(), vertexNamesIncludesVertexName = vertexNames.includes(vertexName), vertexPresent = vertexNamesIncludesVertexName; ///
164
+ return vertexPresent;
165
+ }
166
+ },
167
+ {
168
+ key: "getOrderedVertexNames",
169
+ value: function getOrderedVertexNames() {
170
+ var vertices = this.getVertices();
171
+ (0, _vertex1.orderVertices)(vertices);
172
+ var orderedVertices = vertices, orderedVertexNames = (0, _vertex1.vertexNamesFromVertices)(orderedVertices);
173
+ return orderedVertexNames;
174
+ }
175
+ },
176
+ {
177
+ key: "addEdge",
178
+ value: function addEdge(edge) {
179
+ var sourceVertexName = edge.getSourceVertexName(), targetVertexName = edge.getTargetVertexName(), success = this.addEdgeByVertexNames(sourceVertexName, targetVertexName);
180
+ return success;
181
+ }
182
+ },
183
+ {
184
+ key: "removeEdge",
185
+ value: function removeEdge(edge) {
186
+ var sourceVertexName = edge.getSourceVertexName(), targetVertexName = edge.getTargetVertexName();
187
+ this.removeEdgeByVertexNames(sourceVertexName, targetVertexName);
188
+ }
189
+ },
190
+ {
191
+ key: "addEdgeByVertexNames",
192
+ value: function addEdgeByVertexNames(sourceVertexName, targetVertexName) {
193
+ var success = false;
194
+ if (sourceVertexName !== targetVertexName) {
195
+ var sourceVertex = this.addVertexByVertexName(sourceVertexName), targetVertex = this.addVertexByVertexName(targetVertexName), edgePresent = sourceVertex.isEdgePresentByTargetVertex(targetVertex);
196
+ if (edgePresent) {
197
+ success = true;
198
+ } else {
199
+ var sourceVertexIndex = sourceVertex.getIndex(), targetVertexIndex = targetVertex.getIndex(), invalidatingEdge = sourceVertexIndex > targetVertexIndex;
200
+ success = invalidatingEdge ? addInvalidatingEdgeByVertices(sourceVertex, targetVertex) : true;
201
+ if (success) {
202
+ var immediatePredecessorVertex = sourceVertex, immediateSuccessorVertex = targetVertex; ///
203
+ immediatePredecessorVertex.addImmediateSuccessorVertex(immediateSuccessorVertex);
204
+ immediateSuccessorVertex.addImmediatePredecessorVertex(immediatePredecessorVertex);
205
+ }
206
+ }
207
+ }
208
+ return success;
209
+ }
210
+ },
211
+ {
212
+ key: "removeEdgeByVertexNames",
213
+ value: function removeEdgeByVertexNames(sourceVertexName, targetVertexName) {
214
+ var edgePresent = this.isEdgePresentByVertexNames(sourceVertexName, targetVertexName);
215
+ if (edgePresent) {
216
+ var sourceVertex = this.getVertexByVertexName(sourceVertexName), targetVertex = this.getVertexByVertexName(targetVertexName);
217
+ sourceVertex.removeImmediateSuccessorVertex(targetVertex);
218
+ targetVertex.removeImmediatePredecessorVertex(sourceVertex);
219
+ }
220
+ }
221
+ },
222
+ {
223
+ key: "removeEdgesBySourceVertexName",
224
+ value: function removeEdgesBySourceVertexName(sourceVertexName) {
225
+ var sourceVertexPresent = this.isVertexPresentByVertexName(sourceVertexName);
226
+ if (sourceVertexPresent) {
227
+ var sourceVertex = this.getVertexByVertexName(sourceVertexName);
228
+ sourceVertex.removeOutgoingEdges();
229
+ }
230
+ }
231
+ },
232
+ {
233
+ key: "removeEdgesByTargetVertexName",
234
+ value: function removeEdgesByTargetVertexName(targetVertexName) {
235
+ var targetVertexPresent = this.isVertexPresentByVertexName(targetVertexName);
236
+ if (targetVertexPresent) {
237
+ var targetVertex = this.getVertexByVertexName(targetVertexName);
238
+ targetVertex.removeIncomingEdges();
239
+ }
240
+ }
241
+ },
242
+ {
243
+ key: "addVertexByVertexName",
244
+ value: function addVertexByVertexName(vertexName) {
245
+ var vertexPresent = this.isVertexPresentByVertexName(vertexName);
246
+ if (!vertexPresent) {
247
+ var vertexNames = this.getVertexNames(), vertexNamesLength = vertexNames.length, name = vertexName, index = vertexNamesLength, vertex = _vertex.default.fromNameAndIndex(name, index);
248
+ this.setVertexByVertexName(vertexName, vertex);
249
+ }
250
+ var vertex1 = this.getVertexByVertexName(vertexName);
251
+ return vertex1;
252
+ }
253
+ },
254
+ {
255
+ key: "removeVertexByVertexName",
256
+ value: function removeVertexByVertexName(vertexName) {
257
+ var removedEdges = null;
258
+ var vertexPresent = this.isVertexPresentByVertexName(vertexName);
259
+ if (vertexPresent) {
260
+ removedEdges = [];
261
+ var vertex = this.getVertexByVertexName(vertexName);
262
+ vertex.forEachImmediateSuccessorVertex(function(immediateSuccessVertex) {
263
+ var immediatePredecessorVertex = vertex, immediatePredecessorVertexName = immediatePredecessorVertex.getName(), immediateSuccessVertexName = immediateSuccessVertex.getName(), removedEdgeSourceVertexName = immediatePredecessorVertexName, removedEdgeTargetVertexName = immediateSuccessVertexName, removedEdge = new _edge.default(removedEdgeSourceVertexName, removedEdgeTargetVertexName);
264
+ removedEdges.push(removedEdge);
265
+ immediateSuccessVertex.removeImmediatePredecessorVertex(immediatePredecessorVertex);
266
+ });
267
+ vertex.forEachImmediatePredecessorVertex(function(immediatePredecessorVertex) {
268
+ var immediateSuccessVertex = vertex, immediatePredecessorVertexName = immediatePredecessorVertex.getName(), immediateSuccessVertexName = immediateSuccessVertex.getName(), removedEdgeSourceVertexName = immediatePredecessorVertexName, removedEdgeTargetVertexName = immediateSuccessVertexName, removedEdge = new _edge.default(removedEdgeSourceVertexName, removedEdgeTargetVertexName);
269
+ removedEdges.push(removedEdge);
270
+ immediatePredecessorVertex.removeImmediateSuccessorVertex(immediateSuccessVertex);
271
+ });
272
+ this.deleteVertexByVertexName(vertexName);
273
+ var deletedVertex = vertex, deletedVertexIndex = deletedVertex.getIndex(), vertices = this.getVertices(), affectedVertices = vertices.reduce(function(affectedVertices, vertex) {
274
+ var vertexIndex = vertex.getIndex(), vertexAffected = vertexIndex > deletedVertexIndex;
275
+ if (vertexAffected) {
276
+ var affectedVertex = vertex; ///
277
+ affectedVertices.push(affectedVertex);
278
+ }
279
+ return affectedVertices;
280
+ }, []);
281
+ affectedVertices.forEach(function(affectedVertex) {
282
+ return affectedVertex.decrementIndex();
283
+ });
284
+ }
285
+ return removedEdges;
286
+ }
287
+ }
288
+ ], [
289
+ {
290
+ key: "fromNothing",
291
+ value: function fromNothing() {
292
+ var vertexMap = {}, directedAcyclicGraph = new DirectedAcyclicGraph(vertexMap);
293
+ return directedAcyclicGraph;
294
+ }
295
+ },
296
+ {
297
+ key: "fromVertexNames",
298
+ value: function fromVertexNames(vertexNames) {
299
+ var vertexMap = vertexMapFromVertexNames(vertexNames);
300
+ var directedAcyclicGraph = new DirectedAcyclicGraph(vertexMap);
301
+ return directedAcyclicGraph;
302
+ }
303
+ },
304
+ {
305
+ key: "fromOrderedVertices",
306
+ value: function fromOrderedVertices(orderedVertices) {
307
+ var vertexMap = vertexMapFromOrderedVertices(orderedVertices);
308
+ addEdgesToVertices(orderedVertices, vertexMap);
309
+ var directedAcyclicGraph = new DirectedAcyclicGraph(vertexMap);
310
+ return directedAcyclicGraph;
311
+ }
312
+ }
313
+ ]);
314
+ return DirectedAcyclicGraph;
315
+ }();
316
+ function addInvalidatingEdgeByVertices(sourceVertex, targetVertex) {
317
+ var success = false;
318
+ var forwardsAffectedVertices = targetVertex.retrieveForwardsAffectedVertices(sourceVertex), lastForwardsAffectedVertex = last(forwardsAffectedVertices), resultsInCycle = lastForwardsAffectedVertex === sourceVertex;
319
+ if (!resultsInCycle) {
320
+ var backwardsAffectedVertices = sourceVertex.retrieveBackwardsAffectedVertices();
321
+ (0, _vertex1.orderVertices)(backwardsAffectedVertices);
322
+ (0, _vertex1.orderVertices)(forwardsAffectedVertices);
323
+ var affectedVertices = [].concat(backwardsAffectedVertices).concat(forwardsAffectedVertices), affectedVertexIndices = affectedVertices.map(function(affectedVertex) {
324
+ var affectedVertexIndex = affectedVertex.getIndex();
325
+ return affectedVertexIndex;
326
+ });
327
+ affectedVertexIndices.sort(function(indexA, indexB) {
328
+ return indexA - indexB;
329
+ });
330
+ affectedVertices.forEach(function(affectedVertex, index) {
331
+ var affectedVertexIndex = affectedVertexIndices[index];
332
+ affectedVertex.setIndex(affectedVertexIndex);
333
+ });
334
+ success = true;
335
+ }
336
+ return success;
337
+ }
338
+ function vertexMapFromVertexNames(vertexNames) {
339
+ var vertexMap = {};
340
+ vertexNames.forEach(function(vertexName, index) {
341
+ var name = vertexName, vertex = _vertex.default.fromNameAndIndex(name, index);
342
+ vertexMap[vertexName] = vertex;
343
+ });
344
+ return vertexMap;
345
+ }
346
+ function vertexMapFromOrderedVertices(orderedVertices) {
347
+ var vertexMap = {};
348
+ orderedVertices.forEach(function(orderedVertex, index) {
349
+ var name = orderedVertex.getName(), vertex = _vertex.default.fromNameAndIndex(name, index), vertexName = name; ///
350
+ vertexMap[vertexName] = vertex;
351
+ });
352
+ return vertexMap;
353
+ }
354
+ function addEdgesToVertices(orderedVertices, vertexMap) {
355
+ orderedVertices.forEach(function(orderedVertex) {
356
+ orderedVertex.forEachOutgoingEdge(function(outgoingEdge) {
357
+ var sourceVertexName = outgoingEdge.getSourceVertexName(), targetVertexName = outgoingEdge.getTargetVertexName(), immediatePredecessorVertexName = sourceVertexName, immediateSuccessorVertexName = targetVertexName, immediatePredecessorVertex = vertexMap[immediatePredecessorVertexName], immediateSuccessorVertex = vertexMap[immediateSuccessorVertexName]; ///
358
+ immediatePredecessorVertex.addImmediateSuccessorVertex(immediateSuccessorVertex);
359
+ immediateSuccessorVertex.addImmediatePredecessorVertex(immediatePredecessorVertex);
360
+ });
361
+ });
362
+ }
363
+
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RlZEFjeWNsaWNHcmFwaC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBFZGdlIGZyb20gXCIuL2VkZ2VcIjtcbmltcG9ydCBWZXJ0ZXggZnJvbSBcIi4vdmVydGV4XCI7XG5cbmltcG9ydCB7IHZlcnRleE5hbWVzRnJvbVZlcnRpY2VzLCBvcmRlclZlcnRpY2VzIH0gZnJvbSBcIi4vdXRpbGl0aWVzL3ZlcnRleFwiO1xuXG5jb25zdCB7IGxhc3QgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaXJlY3RlZEFjeWNsaWNHcmFwaCB7XG4gIGNvbnN0cnVjdG9yKHZlcnRleE1hcCkge1xuICAgIHRoaXMudmVydGV4TWFwID0gdmVydGV4TWFwO1xuICB9XG5cbiAgaXNFbXB0eSgpIHtcbiAgICBjb25zdCB2ZXJ0aWNlcyA9IHRoaXMuZ2V0VmVydGljZXMoKSxcbiAgICAgICAgICB2ZXJ0aWNlc0xlbmd0aCA9IHZlcnRpY2VzLmxlbmd0aCxcbiAgICAgICAgICBlbXB0eSA9ICh2ZXJ0aWNlc0xlbmd0aCA9PT0gMCk7XG5cbiAgICByZXR1cm4gZW1wdHk7XG4gIH1cblxuICBnZXRWZXJ0aWNlcygpIHtcbiAgICBjb25zdCB2ZXJ0ZXhNYXBWYWx1ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMudmVydGV4TWFwKSxcbiAgICAgICAgICB2ZXJ0aWNlcyA9IHZlcnRleE1hcFZhbHVlczsgLy8vXG5cbiAgICByZXR1cm4gdmVydGljZXM7XG4gIH1cblxuICBnZXRWZXJ0ZXhOYW1lcygpIHtcbiAgICBjb25zdCB2ZXJ0ZXhNYXBLZXlzID0gT2JqZWN0LmtleXModGhpcy52ZXJ0ZXhNYXApLFxuICAgICAgICAgIHZlcnRleE5hbWVzID0gdmVydGV4TWFwS2V5czsgIC8vL1xuXG4gICAgcmV0dXJuIHZlcnRleE5hbWVzO1xuICB9XG5cbiAgZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBjb25zdCB2ZXJ0ZXhQcmVzZW50ID0gdGhpcy5pc1ZlcnRleFByZXNlbnRCeVZlcnRleE5hbWUodmVydGV4TmFtZSksXG4gICAgICAgICAgdmVydGV4ID0gdmVydGV4UHJlc2VudCA/XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLnZlcnRleE1hcFt2ZXJ0ZXhOYW1lXSA6XG4gICAgICAgICAgICAgICAgICAgICAgIG51bGw7XG5cbiAgICByZXR1cm4gdmVydGV4O1xuICB9XG5cbiAgZ2V0SW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKSB7XG4gICAgY29uc3QgdmVydGV4ID0gdGhpcy5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSksXG4gICAgICAgICAgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcyA9IHZlcnRleC5nZXRJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWVzKCk7XG5cbiAgICByZXR1cm4gaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcztcbiAgfVxuXG4gIGdldEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWVzQnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBjb25zdCB2ZXJ0ZXggPSB0aGlzLmdldFZlcnRleEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKSxcbiAgICAgICAgICBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcyA9IHZlcnRleC5nZXRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcygpO1xuXG4gICAgcmV0dXJuIGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWVzO1xuICB9XG5cbiAgZ2V0UHJlZGVjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKSB7XG4gICAgY29uc3QgdmVydGV4ID0gdGhpcy5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSksXG4gICAgICAgICAgcHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcyA9IHZlcnRleC5nZXRQcmVkZWNlc3NvclZlcnRleE5hbWVzKCk7XG5cbiAgICByZXR1cm4gcHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcztcbiAgfVxuXG4gIGdldFN1Y2Nlc3NvclZlcnRleE5hbWVzQnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBjb25zdCB2ZXJ0ZXggPSB0aGlzLmdldFZlcnRleEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKSxcbiAgICAgICAgICBzdWNjZXNzb3JWZXJ0ZXhOYW1lcyA9IHZlcnRleC5nZXRTdWNjZXNzb3JWZXJ0ZXhOYW1lcygpO1xuXG4gICAgcmV0dXJuIHN1Y2Nlc3NvclZlcnRleE5hbWVzO1xuICB9XG5cbiAgZ2V0RWRnZXNCeVRhcmdldFZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSkge1xuICAgIGNvbnN0IGVkZ2VzID0gW10sXG4gICAgICAgICAgdGFyZ2V0VmVydGV4ID0gdGhpcy5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSk7XG5cbiAgICBpZiAodGFyZ2V0VmVydGV4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWVzID0gdGFyZ2V0VmVydGV4LmdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMoKSxcbiAgICAgICAgICAgIHNvdXJjZVZlcnRleE5hbWVzID0gaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lczsgIC8vL1xuXG4gICAgICBzb3VyY2VWZXJ0ZXhOYW1lcy5mb3JFYWNoKChzb3VyY2VWZXJ0ZXhOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSBFZGdlLmZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgICAgICBlZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVkZ2VzO1xuICB9XG5cbiAgZ2V0RWRnZXNCeVNvdXJjZVZlcnRleE5hbWUoc291cmNlVmVydGV4TmFtZSkge1xuICAgIGNvbnN0IGVkZ2VzID0gW10sXG4gICAgICAgICAgc291cmNlVmVydGV4ID0gdGhpcy5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUoc291cmNlVmVydGV4TmFtZSk7XG5cbiAgICBpZiAoc291cmNlVmVydGV4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcyA9IHNvdXJjZVZlcnRleC5nZXRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lcygpLFxuICAgICAgICAgICAgdGFyZ2V0VmVydGV4TmFtZXMgPSBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lczsgIC8vL1xuXG4gICAgICB0YXJnZXRWZXJ0ZXhOYW1lcy5mb3JFYWNoKCh0YXJnZXRWZXJ0ZXhOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSBFZGdlLmZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgICAgICBlZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVkZ2VzO1xuICB9XG5cbiAgc2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUsIHZlcnRleCkge1xuICAgIHRoaXMudmVydGV4TWFwW3ZlcnRleE5hbWVdID0gdmVydGV4O1xuICB9XG5cbiAgZGVsZXRlVmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy52ZXJ0ZXhNYXBbdmVydGV4TmFtZV07XG4gIH1cblxuICBpc0VkZ2VQcmVzZW50KGVkZ2UpIHtcbiAgICBjb25zdCBzb3VyY2VWZXJ0ZXhOYW1lID0gZWRnZS5nZXRTb3VyY2VWZXJ0ZXhOYW1lKCksXG4gICAgICAgICAgdGFyZ2V0VmVydGV4TmFtZSA9IGVkZ2UuZ2V0VGFyZ2V0VmVydGV4TmFtZSgpLFxuICAgICAgICAgIGVkZ2VQcmVzZW50ID0gdGhpcy5pc0VkZ2VQcmVzZW50QnlWZXJ0ZXhOYW1lcyhzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKTtcbiAgICBcbiAgICByZXR1cm4gZWRnZVByZXNlbnQ7XG4gIH1cblxuICBpc0VkZ2VQcmVzZW50QnlWZXJ0ZXhOYW1lcyhzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKSB7XG4gICAgbGV0IGVkZ2VQcmVzZW50ID0gZmFsc2U7XG5cbiAgICBjb25zdCBzb3VyY2VWZXJ0ZXggPSB0aGlzLmdldFZlcnRleEJ5VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lKSxcbiAgICAgICAgICB0YXJnZXRWZXJ0ZXggPSB0aGlzLmdldFZlcnRleEJ5VmVydGV4TmFtZSh0YXJnZXRWZXJ0ZXhOYW1lKSxcbiAgICAgICAgICBzb3VyY2VWZXJ0ZXhBbmRUYXJnZXRWZXJ0ZXhQcmVzZW50ID0gKHNvdXJjZVZlcnRleCAhPT0gbnVsbCkgJiYgKHRhcmdldFZlcnRleCAhPT0gbnVsbCk7XG5cbiAgICBpZiAoc291cmNlVmVydGV4QW5kVGFyZ2V0VmVydGV4UHJlc2VudCkge1xuICAgICAgZWRnZVByZXNlbnQgPSBzb3VyY2VWZXJ0ZXguaXNFZGdlUHJlc2VudEJ5VGFyZ2V0VmVydGV4KHRhcmdldFZlcnRleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVkZ2VQcmVzZW50O1xuICB9XG5cbiAgaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBjb25zdCB2ZXJ0ZXhOYW1lcyA9IHRoaXMuZ2V0VmVydGV4TmFtZXMoKSxcbiAgICAgICAgICB2ZXJ0ZXhOYW1lc0luY2x1ZGVzVmVydGV4TmFtZSA9IHZlcnRleE5hbWVzLmluY2x1ZGVzKHZlcnRleE5hbWUpLFxuICAgICAgICAgIHZlcnRleFByZXNlbnQgPSB2ZXJ0ZXhOYW1lc0luY2x1ZGVzVmVydGV4TmFtZTsgIC8vL1xuXG4gICAgcmV0dXJuIHZlcnRleFByZXNlbnQ7XG4gIH1cblxuICBnZXRPcmRlcmVkVmVydGV4TmFtZXMoKSB7XG4gICAgY29uc3QgdmVydGljZXMgPSB0aGlzLmdldFZlcnRpY2VzKCk7XG5cbiAgICBvcmRlclZlcnRpY2VzKHZlcnRpY2VzKTtcblxuICAgIGNvbnN0IG9yZGVyZWRWZXJ0aWNlcyA9IHZlcnRpY2VzLCAvLy9cbiAgICAgICAgICBvcmRlcmVkVmVydGV4TmFtZXMgPSB2ZXJ0ZXhOYW1lc0Zyb21WZXJ0aWNlcyhvcmRlcmVkVmVydGljZXMpO1xuXG4gICAgcmV0dXJuIG9yZGVyZWRWZXJ0ZXhOYW1lcztcbiAgfVxuXG4gIGFkZEVkZ2UoZWRnZSkge1xuICAgIGNvbnN0IHNvdXJjZVZlcnRleE5hbWUgPSBlZGdlLmdldFNvdXJjZVZlcnRleE5hbWUoKSxcbiAgICAgICAgICB0YXJnZXRWZXJ0ZXhOYW1lID0gZWRnZS5nZXRUYXJnZXRWZXJ0ZXhOYW1lKCksXG4gICAgICAgICAgc3VjY2VzcyA9IHRoaXMuYWRkRWRnZUJ5VmVydGV4TmFtZXMoc291cmNlVmVydGV4TmFtZSwgdGFyZ2V0VmVydGV4TmFtZSk7XG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfVxuXG4gIHJlbW92ZUVkZ2UoZWRnZSkge1xuICAgIGNvbnN0IHNvdXJjZVZlcnRleE5hbWUgPSBlZGdlLmdldFNvdXJjZVZlcnRleE5hbWUoKSxcbiAgICAgICAgICB0YXJnZXRWZXJ0ZXhOYW1lID0gZWRnZS5nZXRUYXJnZXRWZXJ0ZXhOYW1lKCk7XG5cbiAgICB0aGlzLnJlbW92ZUVkZ2VCeVZlcnRleE5hbWVzKHNvdXJjZVZlcnRleE5hbWUsIHRhcmdldFZlcnRleE5hbWUpO1xuICB9XG5cbiAgYWRkRWRnZUJ5VmVydGV4TmFtZXMoc291cmNlVmVydGV4TmFtZSwgdGFyZ2V0VmVydGV4TmFtZSkge1xuICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICBpZiAoc291cmNlVmVydGV4TmFtZSAhPT0gdGFyZ2V0VmVydGV4TmFtZSkge1xuICAgICAgY29uc3Qgc291cmNlVmVydGV4ID0gdGhpcy5hZGRWZXJ0ZXhCeVZlcnRleE5hbWUoc291cmNlVmVydGV4TmFtZSksXG4gICAgICAgICAgICB0YXJnZXRWZXJ0ZXggPSB0aGlzLmFkZFZlcnRleEJ5VmVydGV4TmFtZSh0YXJnZXRWZXJ0ZXhOYW1lKSxcbiAgICAgICAgICAgIGVkZ2VQcmVzZW50ID0gc291cmNlVmVydGV4LmlzRWRnZVByZXNlbnRCeVRhcmdldFZlcnRleCh0YXJnZXRWZXJ0ZXgpO1xuICAgICAgXG4gICAgICBpZiAoZWRnZVByZXNlbnQpIHtcbiAgICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzb3VyY2VWZXJ0ZXhJbmRleCA9IHNvdXJjZVZlcnRleC5nZXRJbmRleCgpLFxuICAgICAgICAgICAgICB0YXJnZXRWZXJ0ZXhJbmRleCA9IHRhcmdldFZlcnRleC5nZXRJbmRleCgpLFxuICAgICAgICAgICAgICBpbnZhbGlkYXRpbmdFZGdlID0gKHNvdXJjZVZlcnRleEluZGV4ID4gdGFyZ2V0VmVydGV4SW5kZXgpO1xuXG4gICAgICAgIHN1Y2Nlc3MgPSBpbnZhbGlkYXRpbmdFZGdlID9cbiAgICAgICAgICAgICAgICAgICAgYWRkSW52YWxpZGF0aW5nRWRnZUJ5VmVydGljZXMoc291cmNlVmVydGV4LCB0YXJnZXRWZXJ0ZXgpIDpcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlO1xuXG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgY29uc3QgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXggPSBzb3VyY2VWZXJ0ZXgsIC8vL1xuICAgICAgICAgICAgICAgIGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCA9IHRhcmdldFZlcnRleDsgLy8vXG5cbiAgICAgICAgICBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleC5hZGRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgoaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KTtcblxuICAgICAgICAgIGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleC5hZGRJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleChpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICByZW1vdmVFZGdlQnlWZXJ0ZXhOYW1lcyhzb3VyY2VWZXJ0ZXhOYW1lLCB0YXJnZXRWZXJ0ZXhOYW1lKSB7XG4gICAgY29uc3QgZWRnZVByZXNlbnQgPSB0aGlzLmlzRWRnZVByZXNlbnRCeVZlcnRleE5hbWVzKHNvdXJjZVZlcnRleE5hbWUsIHRhcmdldFZlcnRleE5hbWUpO1xuXG4gICAgaWYgKGVkZ2VQcmVzZW50KSB7XG4gICAgICBjb25zdCBzb3VyY2VWZXJ0ZXggPSB0aGlzLmdldFZlcnRleEJ5VmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lKSxcbiAgICAgICAgICAgIHRhcmdldFZlcnRleCA9IHRoaXMuZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUpO1xuXG4gICAgICBzb3VyY2VWZXJ0ZXgucmVtb3ZlSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KHRhcmdldFZlcnRleCk7XG4gICAgICB0YXJnZXRWZXJ0ZXgucmVtb3ZlSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgoc291cmNlVmVydGV4KTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVFZGdlc0J5U291cmNlVmVydGV4TmFtZShzb3VyY2VWZXJ0ZXhOYW1lKSB7XG4gICAgY29uc3Qgc291cmNlVmVydGV4UHJlc2VudCA9IHRoaXMuaXNWZXJ0ZXhQcmVzZW50QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpO1xuXG4gICAgaWYgKHNvdXJjZVZlcnRleFByZXNlbnQpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVZlcnRleCA9IHRoaXMuZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHNvdXJjZVZlcnRleE5hbWUpO1xuXG4gICAgICBzb3VyY2VWZXJ0ZXgucmVtb3ZlT3V0Z29pbmdFZGdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUVkZ2VzQnlUYXJnZXRWZXJ0ZXhOYW1lKHRhcmdldFZlcnRleE5hbWUpIHtcbiAgICBjb25zdCB0YXJnZXRWZXJ0ZXhQcmVzZW50ID0gdGhpcy5pc1ZlcnRleFByZXNlbnRCeVZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSk7XG5cbiAgICBpZiAodGFyZ2V0VmVydGV4UHJlc2VudCkge1xuICAgICAgY29uc3QgdGFyZ2V0VmVydGV4ID0gdGhpcy5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodGFyZ2V0VmVydGV4TmFtZSk7XG5cbiAgICAgIHRhcmdldFZlcnRleC5yZW1vdmVJbmNvbWluZ0VkZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgYWRkVmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBjb25zdCB2ZXJ0ZXhQcmVzZW50ID0gdGhpcy5pc1ZlcnRleFByZXNlbnRCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICBpZiAoIXZlcnRleFByZXNlbnQpIHtcbiAgICAgIGNvbnN0IHZlcnRleE5hbWVzID0gdGhpcy5nZXRWZXJ0ZXhOYW1lcygpLFxuICAgICAgICAgICAgdmVydGV4TmFtZXNMZW5ndGggPSB2ZXJ0ZXhOYW1lcy5sZW5ndGgsXG4gICAgICAgICAgICBuYW1lID0gdmVydGV4TmFtZSwgIC8vL1xuICAgICAgICAgICAgaW5kZXggPSB2ZXJ0ZXhOYW1lc0xlbmd0aCwgLy8vXG4gICAgICAgICAgICB2ZXJ0ZXggPSBWZXJ0ZXguZnJvbU5hbWVBbmRJbmRleChuYW1lLCBpbmRleCk7XG5cbiAgICAgIHRoaXMuc2V0VmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUsIHZlcnRleCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmVydGV4ID0gdGhpcy5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICByZXR1cm4gdmVydGV4O1xuICB9XG5cbiAgcmVtb3ZlVmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpIHtcbiAgICBsZXQgcmVtb3ZlZEVkZ2VzID0gbnVsbDtcblxuICAgIGNvbnN0IHZlcnRleFByZXNlbnQgPSB0aGlzLmlzVmVydGV4UHJlc2VudEJ5VmVydGV4TmFtZSh2ZXJ0ZXhOYW1lKTtcblxuICAgIGlmICh2ZXJ0ZXhQcmVzZW50KSB7XG4gICAgICByZW1vdmVkRWRnZXMgPSBbXTtcblxuICAgICAgY29uc3QgdmVydGV4ID0gdGhpcy5nZXRWZXJ0ZXhCeVZlcnRleE5hbWUodmVydGV4TmFtZSk7XG5cbiAgICAgIHZlcnRleC5mb3JFYWNoSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KChpbW1lZGlhdGVTdWNjZXNzVmVydGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ID0gdmVydGV4LCAgLy8vXG4gICAgICAgICAgICAgIGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZSA9IGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4LmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgaW1tZWRpYXRlU3VjY2Vzc1ZlcnRleE5hbWUgPSBpbW1lZGlhdGVTdWNjZXNzVmVydGV4LmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgcmVtb3ZlZEVkZ2VTb3VyY2VWZXJ0ZXhOYW1lID0gaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lLCAvLy9cbiAgICAgICAgICAgICAgcmVtb3ZlZEVkZ2VUYXJnZXRWZXJ0ZXhOYW1lID0gaW1tZWRpYXRlU3VjY2Vzc1ZlcnRleE5hbWUsIC8vL1xuICAgICAgICAgICAgICByZW1vdmVkRWRnZSA9IG5ldyBFZGdlKHJlbW92ZWRFZGdlU291cmNlVmVydGV4TmFtZSwgcmVtb3ZlZEVkZ2VUYXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgICAgICByZW1vdmVkRWRnZXMucHVzaChyZW1vdmVkRWRnZSk7XG5cbiAgICAgICAgaW1tZWRpYXRlU3VjY2Vzc1ZlcnRleC5yZW1vdmVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleChpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCk7XG4gICAgICB9KTtcblxuICAgICAgdmVydGV4LmZvckVhY2hJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCgoaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgpID0+IHtcbiAgICAgICAgY29uc3QgaW1tZWRpYXRlU3VjY2Vzc1ZlcnRleCA9IHZlcnRleCwgIC8vL1xuICAgICAgICAgICAgICBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWUgPSBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleC5nZXROYW1lKCksXG4gICAgICAgICAgICAgIGltbWVkaWF0ZVN1Y2Nlc3NWZXJ0ZXhOYW1lID0gaW1tZWRpYXRlU3VjY2Vzc1ZlcnRleC5nZXROYW1lKCksICAvLy9cbiAgICAgICAgICAgICAgcmVtb3ZlZEVkZ2VTb3VyY2VWZXJ0ZXhOYW1lID0gaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lLCAvLy9cbiAgICAgICAgICAgICAgcmVtb3ZlZEVkZ2VUYXJnZXRWZXJ0ZXhOYW1lID0gaW1tZWRpYXRlU3VjY2Vzc1ZlcnRleE5hbWUsIC8vL1xuICAgICAgICAgICAgICByZW1vdmVkRWRnZSA9IG5ldyBFZGdlKHJlbW92ZWRFZGdlU291cmNlVmVydGV4TmFtZSwgcmVtb3ZlZEVkZ2VUYXJnZXRWZXJ0ZXhOYW1lKTtcblxuICAgICAgICByZW1vdmVkRWRnZXMucHVzaChyZW1vdmVkRWRnZSk7XG5cbiAgICAgICAgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgucmVtb3ZlSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KGltbWVkaWF0ZVN1Y2Nlc3NWZXJ0ZXgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZGVsZXRlVmVydGV4QnlWZXJ0ZXhOYW1lKHZlcnRleE5hbWUpO1xuXG4gICAgICBjb25zdCBkZWxldGVkVmVydGV4ID0gdmVydGV4LCAvLy9cbiAgICAgICAgICAgIGRlbGV0ZWRWZXJ0ZXhJbmRleCA9IGRlbGV0ZWRWZXJ0ZXguZ2V0SW5kZXgoKSxcbiAgICAgICAgICAgIHZlcnRpY2VzID0gdGhpcy5nZXRWZXJ0aWNlcygpLFxuICAgICAgICAgICAgYWZmZWN0ZWRWZXJ0aWNlcyA9IHZlcnRpY2VzLnJlZHVjZSgoYWZmZWN0ZWRWZXJ0aWNlcywgdmVydGV4KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZlcnRleEluZGV4ID0gdmVydGV4LmdldEluZGV4KCksXG4gICAgICAgICAgICAgICAgICAgIHZlcnRleEFmZmVjdGVkID0gKHZlcnRleEluZGV4ID4gZGVsZXRlZFZlcnRleEluZGV4KTtcblxuICAgICAgICAgICAgICBpZiAodmVydGV4QWZmZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZmZlY3RlZFZlcnRleCA9IHZlcnRleDsgIC8vL1xuXG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRWZXJ0aWNlcy5wdXNoKGFmZmVjdGVkVmVydGV4KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBhZmZlY3RlZFZlcnRpY2VzO1xuICAgICAgICAgICAgfSwgW10pO1xuXG4gICAgICBhZmZlY3RlZFZlcnRpY2VzLmZvckVhY2goKGFmZmVjdGVkVmVydGV4KSA9PiBhZmZlY3RlZFZlcnRleC5kZWNyZW1lbnRJbmRleCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3ZlZEVkZ2VzO1xuICB9XG5cbiAgc3RhdGljIGZyb21Ob3RoaW5nKCkge1xuICAgIGNvbnN0IHZlcnRleE1hcCA9IHt9LFxuICAgICAgICAgIGRpcmVjdGVkQWN5Y2xpY0dyYXBoID0gbmV3IERpcmVjdGVkQWN5Y2xpY0dyYXBoKHZlcnRleE1hcCk7XG5cbiAgICByZXR1cm4gZGlyZWN0ZWRBY3ljbGljR3JhcGg7XG4gIH1cbiAgXG4gIHN0YXRpYyBmcm9tVmVydGV4TmFtZXModmVydGV4TmFtZXMpIHtcbiAgICBjb25zdCB2ZXJ0ZXhNYXAgPSB2ZXJ0ZXhNYXBGcm9tVmVydGV4TmFtZXModmVydGV4TmFtZXMpO1xuXG4gICAgY29uc3QgZGlyZWN0ZWRBY3ljbGljR3JhcGggPSBuZXcgRGlyZWN0ZWRBY3ljbGljR3JhcGgodmVydGV4TWFwKTtcblxuICAgIHJldHVybiBkaXJlY3RlZEFjeWNsaWNHcmFwaDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tT3JkZXJlZFZlcnRpY2VzKG9yZGVyZWRWZXJ0aWNlcykge1xuICAgIGNvbnN0IHZlcnRleE1hcCA9IHZlcnRleE1hcEZyb21PcmRlcmVkVmVydGljZXMob3JkZXJlZFZlcnRpY2VzKTtcbiAgICBcbiAgICBhZGRFZGdlc1RvVmVydGljZXMob3JkZXJlZFZlcnRpY2VzLCB2ZXJ0ZXhNYXApO1xuICAgIFxuICAgIGNvbnN0IGRpcmVjdGVkQWN5Y2xpY0dyYXBoID0gbmV3IERpcmVjdGVkQWN5Y2xpY0dyYXBoKHZlcnRleE1hcCk7XG4gICAgXG4gICAgcmV0dXJuIGRpcmVjdGVkQWN5Y2xpY0dyYXBoO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEludmFsaWRhdGluZ0VkZ2VCeVZlcnRpY2VzKHNvdXJjZVZlcnRleCwgdGFyZ2V0VmVydGV4KSB7XG4gIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgY29uc3QgZm9yd2FyZHNBZmZlY3RlZFZlcnRpY2VzID0gdGFyZ2V0VmVydGV4LnJldHJpZXZlRm9yd2FyZHNBZmZlY3RlZFZlcnRpY2VzKHNvdXJjZVZlcnRleCksXG4gICAgICAgIGxhc3RGb3J3YXJkc0FmZmVjdGVkVmVydGV4ID0gbGFzdChmb3J3YXJkc0FmZmVjdGVkVmVydGljZXMpLFxuICAgICAgICByZXN1bHRzSW5DeWNsZSA9IChsYXN0Rm9yd2FyZHNBZmZlY3RlZFZlcnRleCA9PT0gc291cmNlVmVydGV4KTtcblxuICBpZiAoIXJlc3VsdHNJbkN5Y2xlKSB7XG4gICAgY29uc3QgYmFja3dhcmRzQWZmZWN0ZWRWZXJ0aWNlcyA9IHNvdXJjZVZlcnRleC5yZXRyaWV2ZUJhY2t3YXJkc0FmZmVjdGVkVmVydGljZXMoKTtcblxuICAgIG9yZGVyVmVydGljZXMoYmFja3dhcmRzQWZmZWN0ZWRWZXJ0aWNlcyk7XG5cbiAgICBvcmRlclZlcnRpY2VzKGZvcndhcmRzQWZmZWN0ZWRWZXJ0aWNlcyk7XG5cbiAgICBjb25zdCBhZmZlY3RlZFZlcnRpY2VzID0gW10uY29uY2F0KGJhY2t3YXJkc0FmZmVjdGVkVmVydGljZXMpLmNvbmNhdChmb3J3YXJkc0FmZmVjdGVkVmVydGljZXMpLFxuICAgICAgICAgIGFmZmVjdGVkVmVydGV4SW5kaWNlcyA9IGFmZmVjdGVkVmVydGljZXMubWFwKChhZmZlY3RlZFZlcnRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWZmZWN0ZWRWZXJ0ZXhJbmRleCA9IGFmZmVjdGVkVmVydGV4LmdldEluZGV4KCk7XG5cbiAgICAgICAgICAgIHJldHVybiBhZmZlY3RlZFZlcnRleEluZGV4O1xuICAgICAgICAgIH0pO1xuXG4gICAgYWZmZWN0ZWRWZXJ0ZXhJbmRpY2VzLnNvcnQoKGluZGV4QSwgaW5kZXhCKSA9PiAoaW5kZXhBIC0gaW5kZXhCKSk7XG5cbiAgICBhZmZlY3RlZFZlcnRpY2VzLmZvckVhY2goKGFmZmVjdGVkVmVydGV4LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgYWZmZWN0ZWRWZXJ0ZXhJbmRleCA9IGFmZmVjdGVkVmVydGV4SW5kaWNlc1tpbmRleF07XG5cbiAgICAgIGFmZmVjdGVkVmVydGV4LnNldEluZGV4KGFmZmVjdGVkVmVydGV4SW5kZXgpO1xuICAgIH0pO1xuXG4gICAgc3VjY2VzcyA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gc3VjY2Vzcztcbn1cblxuZnVuY3Rpb24gdmVydGV4TWFwRnJvbVZlcnRleE5hbWVzKHZlcnRleE5hbWVzKSB7XG4gIGNvbnN0IHZlcnRleE1hcCA9IHt9O1xuICBcbiAgdmVydGV4TmFtZXMuZm9yRWFjaCgodmVydGV4TmFtZSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBuYW1lID0gdmVydGV4TmFtZSwgIC8vL1xuICAgICAgICAgIHZlcnRleCA9IFZlcnRleC5mcm9tTmFtZUFuZEluZGV4KG5hbWUsIGluZGV4KTtcblxuICAgIHZlcnRleE1hcFt2ZXJ0ZXhOYW1lXSA9IHZlcnRleDtcbiAgfSk7XG4gIFxuICByZXR1cm4gdmVydGV4TWFwO1xufVxuXG5mdW5jdGlvbiB2ZXJ0ZXhNYXBGcm9tT3JkZXJlZFZlcnRpY2VzKG9yZGVyZWRWZXJ0aWNlcykge1xuICBjb25zdCB2ZXJ0ZXhNYXAgPSB7fTtcbiAgXG4gIG9yZGVyZWRWZXJ0aWNlcy5mb3JFYWNoKChvcmRlcmVkVmVydGV4LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBvcmRlcmVkVmVydGV4LmdldE5hbWUoKSxcbiAgICAgICAgICB2ZXJ0ZXggPSBWZXJ0ZXguZnJvbU5hbWVBbmRJbmRleChuYW1lLCBpbmRleCksXG4gICAgICAgICAgdmVydGV4TmFtZSA9IG5hbWU7ICAvLy9cblxuICAgIHZlcnRleE1hcFt2ZXJ0ZXhOYW1lXSA9IHZlcnRleDtcbiAgfSk7XG5cbiAgcmV0dXJuIHZlcnRleE1hcDtcbn1cblxuZnVuY3Rpb24gYWRkRWRnZXNUb1ZlcnRpY2VzKG9yZGVyZWRWZXJ0aWNlcywgdmVydGV4TWFwKSB7XG4gIG9yZGVyZWRWZXJ0aWNlcy5mb3JFYWNoKChvcmRlcmVkVmVydGV4KSA9PiB7XG4gICAgb3JkZXJlZFZlcnRleC5mb3JFYWNoT3V0Z29pbmdFZGdlKChvdXRnb2luZ0VkZ2UpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVZlcnRleE5hbWUgPSBvdXRnb2luZ0VkZ2UuZ2V0U291cmNlVmVydGV4TmFtZSgpLFxuICAgICAgICAgICAgdGFyZ2V0VmVydGV4TmFtZSA9IG91dGdvaW5nRWRnZS5nZXRUYXJnZXRWZXJ0ZXhOYW1lKCksXG4gICAgICAgICAgICBpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWUgPSBzb3VyY2VWZXJ0ZXhOYW1lLCAgLy8vXG4gICAgICAgICAgICBpbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lID0gdGFyZ2V0VmVydGV4TmFtZSxcbiAgICAgICAgICAgIGltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4ID0gdmVydGV4TWFwW2ltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZV0sIC8vL1xuICAgICAgICAgICAgaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4ID0gdmVydGV4TWFwW2ltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWVdOyAvLy9cblxuICAgICAgaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXguYWRkSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4KGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCk7XG5cbiAgICAgIGltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleC5hZGRJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleChpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbIkRpcmVjdGVkQWN5Y2xpY0dyYXBoIiwibGFzdCIsImFycmF5VXRpbGl0aWVzIiwidmVydGV4TWFwIiwiaXNFbXB0eSIsInZlcnRpY2VzIiwiZ2V0VmVydGljZXMiLCJ2ZXJ0aWNlc0xlbmd0aCIsImxlbmd0aCIsImVtcHR5IiwidmVydGV4TWFwVmFsdWVzIiwiT2JqZWN0IiwidmFsdWVzIiwiZ2V0VmVydGV4TmFtZXMiLCJ2ZXJ0ZXhNYXBLZXlzIiwia2V5cyIsInZlcnRleE5hbWVzIiwiZ2V0VmVydGV4QnlWZXJ0ZXhOYW1lIiwidmVydGV4TmFtZSIsInZlcnRleFByZXNlbnQiLCJpc1ZlcnRleFByZXNlbnRCeVZlcnRleE5hbWUiLCJ2ZXJ0ZXgiLCJnZXRJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWVzQnlWZXJ0ZXhOYW1lIiwiaW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcyIsImdldEltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4TmFtZXMiLCJnZXRJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSIsImltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleE5hbWVzIiwiZ2V0SW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZXMiLCJnZXRQcmVkZWNlc3NvclZlcnRleE5hbWVzQnlWZXJ0ZXhOYW1lIiwicHJlZGVjZXNzb3JWZXJ0ZXhOYW1lcyIsImdldFByZWRlY2Vzc29yVmVydGV4TmFtZXMiLCJnZXRTdWNjZXNzb3JWZXJ0ZXhOYW1lc0J5VmVydGV4TmFtZSIsInN1Y2Nlc3NvclZlcnRleE5hbWVzIiwiZ2V0U3VjY2Vzc29yVmVydGV4TmFtZXMiLCJnZXRFZGdlc0J5VGFyZ2V0VmVydGV4TmFtZSIsInRhcmdldFZlcnRleE5hbWUiLCJlZGdlcyIsInRhcmdldFZlcnRleCIsInNvdXJjZVZlcnRleE5hbWVzIiwiZm9yRWFjaCIsInNvdXJjZVZlcnRleE5hbWUiLCJlZGdlIiwiRWRnZSIsImZyb21Tb3VyY2VWZXJ0ZXhOYW1lQW5kVGFyZ2V0VmVydGV4TmFtZSIsInB1c2giLCJnZXRFZGdlc0J5U291cmNlVmVydGV4TmFtZSIsInNvdXJjZVZlcnRleCIsInRhcmdldFZlcnRleE5hbWVzIiwic2V0VmVydGV4QnlWZXJ0ZXhOYW1lIiwiZGVsZXRlVmVydGV4QnlWZXJ0ZXhOYW1lIiwiaXNFZGdlUHJlc2VudCIsImdldFNvdXJjZVZlcnRleE5hbWUiLCJnZXRUYXJnZXRWZXJ0ZXhOYW1lIiwiZWRnZVByZXNlbnQiLCJpc0VkZ2VQcmVzZW50QnlWZXJ0ZXhOYW1lcyIsInNvdXJjZVZlcnRleEFuZFRhcmdldFZlcnRleFByZXNlbnQiLCJpc0VkZ2VQcmVzZW50QnlUYXJnZXRWZXJ0ZXgiLCJ2ZXJ0ZXhOYW1lc0luY2x1ZGVzVmVydGV4TmFtZSIsImluY2x1ZGVzIiwiZ2V0T3JkZXJlZFZlcnRleE5hbWVzIiwib3JkZXJWZXJ0aWNlcyIsIm9yZGVyZWRWZXJ0aWNlcyIsIm9yZGVyZWRWZXJ0ZXhOYW1lcyIsInZlcnRleE5hbWVzRnJvbVZlcnRpY2VzIiwiYWRkRWRnZSIsInN1Y2Nlc3MiLCJhZGRFZGdlQnlWZXJ0ZXhOYW1lcyIsInJlbW92ZUVkZ2UiLCJyZW1vdmVFZGdlQnlWZXJ0ZXhOYW1lcyIsImFkZFZlcnRleEJ5VmVydGV4TmFtZSIsInNvdXJjZVZlcnRleEluZGV4IiwiZ2V0SW5kZXgiLCJ0YXJnZXRWZXJ0ZXhJbmRleCIsImludmFsaWRhdGluZ0VkZ2UiLCJhZGRJbnZhbGlkYXRpbmdFZGdlQnlWZXJ0aWNlcyIsImltbWVkaWF0ZVByZWRlY2Vzc29yVmVydGV4IiwiaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4IiwiYWRkSW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4IiwiYWRkSW1tZWRpYXRlUHJlZGVjZXNzb3JWZXJ0ZXgiLCJyZW1vdmVJbW1lZGlhdGVTdWNjZXNzb3JWZXJ0ZXgiLCJyZW1vdmVJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsInJlbW92ZUVkZ2VzQnlTb3VyY2VWZXJ0ZXhOYW1lIiwic291cmNlVmVydGV4UHJlc2VudCIsInJlbW92ZU91dGdvaW5nRWRnZXMiLCJyZW1vdmVFZGdlc0J5VGFyZ2V0VmVydGV4TmFtZSIsInRhcmdldFZlcnRleFByZXNlbnQiLCJyZW1vdmVJbmNvbWluZ0VkZ2VzIiwidmVydGV4TmFtZXNMZW5ndGgiLCJuYW1lIiwiaW5kZXgiLCJWZXJ0ZXgiLCJmcm9tTmFtZUFuZEluZGV4IiwicmVtb3ZlVmVydGV4QnlWZXJ0ZXhOYW1lIiwicmVtb3ZlZEVkZ2VzIiwiZm9yRWFjaEltbWVkaWF0ZVN1Y2Nlc3NvclZlcnRleCIsImltbWVkaWF0ZVN1Y2Nlc3NWZXJ0ZXgiLCJpbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleE5hbWUiLCJnZXROYW1lIiwiaW1tZWRpYXRlU3VjY2Vzc1ZlcnRleE5hbWUiLCJyZW1vdmVkRWRnZVNvdXJjZVZlcnRleE5hbWUiLCJyZW1vdmVkRWRnZVRhcmdldFZlcnRleE5hbWUiLCJyZW1vdmVkRWRnZSIsImZvckVhY2hJbW1lZGlhdGVQcmVkZWNlc3NvclZlcnRleCIsImRlbGV0ZWRWZXJ0ZXgiLCJkZWxldGVkVmVydGV4SW5kZXgiLCJhZmZlY3RlZFZlcnRpY2VzIiwicmVkdWNlIiwidmVydGV4SW5kZXgiLCJ2ZXJ0ZXhBZmZlY3RlZCIsImFmZmVjdGVkVmVydGV4IiwiZGVjcmVtZW50SW5kZXgiLCJmcm9tTm90aGluZyIsImRpcmVjdGVkQWN5Y2xpY0dyYXBoIiwiZnJvbVZlcnRleE5hbWVzIiwidmVydGV4TWFwRnJvbVZlcnRleE5hbWVzIiwiZnJvbU9yZGVyZWRWZXJ0aWNlcyIsInZlcnRleE1hcEZyb21PcmRlcmVkVmVydGljZXMiLCJhZGRFZGdlc1RvVmVydGljZXMiLCJmb3J3YXJkc0FmZmVjdGVkVmVydGljZXMiLCJyZXRyaWV2ZUZvcndhcmRzQWZmZWN0ZWRWZXJ0aWNlcyIsImxhc3RGb3J3YXJkc0FmZmVjdGVkVmVydGV4IiwicmVzdWx0c0luQ3ljbGUiLCJiYWNrd2FyZHNBZmZlY3RlZFZlcnRpY2VzIiwicmV0cmlldmVCYWNrd2FyZHNBZmZlY3RlZFZlcnRpY2VzIiwiY29uY2F0IiwiYWZmZWN0ZWRWZXJ0ZXhJbmRpY2VzIiwibWFwIiwiYWZmZWN0ZWRWZXJ0ZXhJbmRleCIsInNvcnQiLCJpbmRleEEiLCJpbmRleEIiLCJzZXRJbmRleCIsIm9yZGVyZWRWZXJ0ZXgiLCJmb3JFYWNoT3V0Z29pbmdFZGdlIiwib3V0Z29pbmdFZGdlIiwiaW1tZWRpYXRlU3VjY2Vzc29yVmVydGV4TmFtZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7ZUFXcUJBOzs7eUJBVFU7MkRBRWQ7NkRBQ0U7dUJBRW9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXZELElBQU0sQUFBRUMsT0FBU0MsMEJBQVREO0FBRU8sSUFBQSxBQUFNRCxxQ0E2VWxCLEFBN1VZO2FBQU1BLHFCQUNQRyxTQUFTO2dDQURGSDtRQUVqQixJQUFJLENBQUNHLFlBQVlBOztrQkFGQUg7O1lBS25CSSxLQUFBQTttQkFBQUEsU0FBQUE7Z0JBQ0UsSUFBTUMsV0FBVyxJQUFJLENBQUNDLGVBQ2hCQyxpQkFBaUJGLFNBQVNHLFFBQzFCQyxRQUFTRixtQkFBbUI7Z0JBRWxDLE9BQU9FO1lBQ1Q7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